@zxyycom/vibe-check 0.0.2 → 0.0.3

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 (670) hide show
  1. package/README.md +36 -5
  2. package/dist/esm/check/check.mjs +4 -0
  3. package/dist/esm/check/check.mjs.map +1 -1
  4. package/dist/esm/check/flag-enablement.mjs +32 -0
  5. package/dist/esm/check/flag-enablement.mjs.map +1 -0
  6. package/dist/esm/check/handoff-provider-identity.mjs +18 -0
  7. package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
  8. package/dist/esm/check/inherited-collection.mjs +1 -1
  9. package/dist/esm/check/inherited-collection.mjs.map +1 -1
  10. package/dist/esm/check/project-changes.mjs +2 -0
  11. package/dist/esm/check/project-changes.mjs.map +1 -0
  12. package/dist/esm/check/project-context.mjs +2 -0
  13. package/dist/esm/check/project-context.mjs.map +1 -0
  14. package/dist/esm/check-settlement/facts.mjs.map +1 -1
  15. package/dist/esm/check-settlement/record-store.mjs +1 -1
  16. package/dist/esm/check-settlement/record-store.mjs.map +1 -1
  17. package/dist/esm/data-boundary/canonical-data.mjs +36 -7
  18. package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
  19. package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
  20. package/dist/esm/data-boundary/closed-values.mjs +28 -4
  21. package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
  22. package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
  23. package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
  24. package/dist/esm/data-boundary/project-path.mjs +19 -0
  25. package/dist/esm/data-boundary/project-path.mjs.map +1 -0
  26. package/dist/esm/index.mjs +12 -5
  27. package/dist/esm/index.mjs.map +1 -1
  28. package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
  29. package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
  30. package/dist/esm/package-checks/check-authoring.mjs +69 -0
  31. package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
  32. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
  33. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
  34. package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
  35. package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
  36. package/dist/esm/package-checks/command-check/contract.mjs +2 -0
  37. package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
  38. package/dist/esm/package-checks/command-check/execution.mjs +134 -0
  39. package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
  40. package/dist/esm/package-checks/command-check/options.mjs +284 -0
  41. package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
  42. package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
  43. package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
  44. package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
  45. package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
  46. package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
  47. package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
  48. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
  49. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
  50. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
  51. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
  52. package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
  53. package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
  54. package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
  55. package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
  56. package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
  57. package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
  58. package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
  59. package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
  60. package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
  61. package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
  62. package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
  63. package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
  64. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
  65. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
  66. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
  67. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
  68. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
  69. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
  70. package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
  71. package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
  72. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
  73. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
  74. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
  75. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
  76. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
  77. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
  78. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
  79. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
  80. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
  81. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
  82. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
  83. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
  84. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
  85. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
  86. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
  87. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
  88. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
  89. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
  90. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
  91. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
  92. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
  93. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
  94. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
  95. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
  96. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
  97. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
  98. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
  99. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
  100. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
  101. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
  102. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
  103. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
  104. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
  105. package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
  106. package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
  107. package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
  108. package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
  109. package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
  110. package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
  111. package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
  112. package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
  113. package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
  114. package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
  115. package/dist/esm/package-checks/host-environment/git.mjs +11 -0
  116. package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
  117. package/dist/esm/package-checks/host-environment/path.mjs +1 -17
  118. package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
  119. package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
  120. package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
  121. package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
  122. package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
  123. package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
  124. package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
  125. package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
  126. package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
  127. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
  128. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
  129. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
  130. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
  131. package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
  132. package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
  133. package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
  134. package/dist/esm/package-checks/local-cache-options.mjs +28 -0
  135. package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
  136. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
  137. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
  138. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
  139. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
  140. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
  141. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
  142. package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
  143. package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
  144. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
  145. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
  146. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
  147. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
  148. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
  149. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
  150. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
  151. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
  152. package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
  153. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
  154. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
  155. package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
  156. package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
  157. package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
  158. package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
  159. package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
  160. package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
  161. package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
  162. package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
  163. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
  164. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
  165. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
  166. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
  167. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
  168. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
  169. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
  170. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
  171. package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
  172. package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
  173. package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
  174. package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
  175. package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
  176. package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
  177. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
  178. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
  179. package/dist/esm/package-checks/project-files/collection.mjs +23 -19
  180. package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
  181. package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
  182. package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
  183. package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
  184. package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
  185. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
  186. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
  187. package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
  188. package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
  189. package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
  190. package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
  191. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
  192. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
  193. package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
  194. package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
  195. package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
  196. package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
  197. package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
  198. package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
  199. package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
  200. package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
  201. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
  202. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
  203. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
  204. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
  205. package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
  206. package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
  207. package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
  208. package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
  209. package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
  210. package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
  211. package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
  212. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
  213. package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
  214. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
  215. package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
  216. package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
  217. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
  218. package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
  219. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
  220. package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
  221. package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
  222. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
  223. package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
  224. package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
  225. package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
  226. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
  227. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
  228. package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
  229. package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
  230. package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
  231. package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
  232. package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
  233. package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
  234. package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
  235. package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
  236. package/dist/esm/project-definition/project-changes.mjs +70 -0
  237. package/dist/esm/project-definition/project-changes.mjs.map +1 -0
  238. package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
  239. package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
  240. package/dist/esm/project-definition/project-definition.mjs +22 -15
  241. package/dist/esm/project-definition/project-definition.mjs.map +1 -1
  242. package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
  243. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
  244. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
  245. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
  246. package/dist/esm/project-run/aggregation.mjs +42 -59
  247. package/dist/esm/project-run/aggregation.mjs.map +1 -1
  248. package/dist/esm/project-run/changes/git.mjs +161 -0
  249. package/dist/esm/project-run/changes/git.mjs.map +1 -0
  250. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
  251. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
  252. package/dist/esm/project-run/check-execution/callback.mjs +3 -2
  253. package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
  254. package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
  255. package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
  256. package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
  257. package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
  258. package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
  259. package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
  260. package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
  261. package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
  262. package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
  263. package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
  264. package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
  265. package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
  266. package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
  267. package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
  268. package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
  269. package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
  270. package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
  271. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
  272. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
  273. package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
  274. package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
  275. package/dist/esm/project-run/completion/completion.mjs +18 -1
  276. package/dist/esm/project-run/completion/completion.mjs.map +1 -1
  277. package/dist/esm/project-run/controls/contract.mjs.map +1 -1
  278. package/dist/esm/project-run/controls/validation.mjs +7 -54
  279. package/dist/esm/project-run/controls/validation.mjs.map +1 -1
  280. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
  281. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
  282. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
  283. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
  284. package/dist/esm/project-run/invocation/candidate.mjs +17 -13
  285. package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
  286. package/dist/esm/project-run/invocation/candidates.mjs +26 -0
  287. package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
  288. package/dist/esm/project-run/invocation/creation.mjs +7 -3
  289. package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
  290. package/dist/esm/project-run/invocation/execution.mjs +98 -0
  291. package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
  292. package/dist/esm/project-run/invocation/run.mjs +13 -112
  293. package/dist/esm/project-run/invocation/run.mjs.map +1 -1
  294. package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
  295. package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
  296. package/dist/esm/project-run/outputs/status.mjs +12 -12
  297. package/dist/esm/project-run/outputs/status.mjs.map +1 -1
  298. package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
  299. package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
  300. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
  301. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
  302. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
  303. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
  304. package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
  305. package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
  306. package/dist/esm/project-run/project-context.mjs +2 -1
  307. package/dist/esm/project-run/project-context.mjs.map +1 -1
  308. package/dist/esm/project-run/result.mjs +2 -2
  309. package/dist/esm/project-run/result.mjs.map +1 -1
  310. package/dist/esm/project-run/run.mjs.map +1 -1
  311. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
  312. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
  313. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
  314. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
  315. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
  316. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
  317. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
  318. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
  319. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
  320. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
  321. package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
  322. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
  323. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
  324. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
  325. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
  326. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
  327. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
  328. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
  329. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
  330. package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
  331. package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
  332. package/docs/api-mechanics.md +147 -28
  333. package/docs/changelog.md +145 -2
  334. package/docs/checks/duplicate-detection.md +22 -3
  335. package/docs/checks/file-metrics.md +25 -6
  336. package/docs/checks/function-metrics.md +21 -2
  337. package/docs/checks/json-schema-validation.md +25 -4
  338. package/docs/checks/json-validation.md +24 -5
  339. package/docs/checks/maintenance-reminders.md +30 -6
  340. package/docs/checks/markdown-link-validation.md +24 -4
  341. package/docs/checks/markdown-lint.md +167 -0
  342. package/docs/checks/secret-detection.md +31 -7
  343. package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
  344. package/docs/guides/building-project-gate.md +706 -0
  345. package/docs/guides/callbacks.md +81 -22
  346. package/docs/guides/check-dependencies.md +41 -10
  347. package/docs/guides/collecting-project-files.md +7 -7
  348. package/docs/guides/command-check.md +155 -0
  349. package/docs/guides/data-boundaries.md +140 -0
  350. package/docs/guides/extending-check-lifecycle.md +77 -25
  351. package/docs/guides/finding-waivers.md +43 -1
  352. package/docs/guides/learned-scheduling.md +1 -1
  353. package/docs/guides/run-outputs.md +35 -9
  354. package/docs/guides/scheduling.md +15 -15
  355. package/docs/output.md +6 -5
  356. package/package.json +2 -1
  357. package/src/check/check.ts +332 -92
  358. package/src/check/flag-enablement.ts +76 -0
  359. package/src/check/handoff-provider-identity.ts +34 -0
  360. package/src/check/inherited-collection.ts +1 -1
  361. package/src/check/project-changes.ts +14 -0
  362. package/src/check/project-context.ts +11 -0
  363. package/src/check-settlement/facts.ts +1 -1
  364. package/src/check-settlement/record-store.ts +1 -1
  365. package/src/data-boundary/canonical-data.ts +36 -9
  366. package/src/data-boundary/canonical-json.ts +18 -1
  367. package/src/data-boundary/closed-values.ts +26 -6
  368. package/src/data-boundary/config-glob.ts +17 -0
  369. package/src/data-boundary/project-path.ts +21 -0
  370. package/src/index.ts +72 -11
  371. package/src/machine-output/v4/atomic-publication.ts +3 -1
  372. package/src/package-checks/check-authoring.ts +136 -0
  373. package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
  374. package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
  375. package/src/package-checks/command-check/command-check.ts +152 -0
  376. package/src/package-checks/command-check/contract.ts +168 -0
  377. package/src/package-checks/command-check/execution.ts +211 -0
  378. package/src/package-checks/command-check/options.ts +331 -0
  379. package/src/package-checks/command-check/transcript.ts +35 -0
  380. package/src/package-checks/duplicate-detection/default-check.ts +37 -6
  381. package/src/package-checks/duplicate-detection/execution.ts +2 -4
  382. package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
  383. package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
  384. package/src/package-checks/duplicate-detection/options.ts +6 -3
  385. package/src/package-checks/duplicate-detection/records.ts +1 -1
  386. package/src/package-checks/file-metrics/constructor.ts +29 -6
  387. package/src/package-checks/file-metrics/execution.ts +2 -4
  388. package/src/package-checks/file-metrics/finding-messages.ts +1 -1
  389. package/src/package-checks/file-metrics/options.ts +6 -3
  390. package/src/package-checks/file-metrics/records.ts +1 -1
  391. package/src/package-checks/file-metrics/scc/availability.ts +1 -1
  392. package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
  393. package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
  394. package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
  395. package/src/package-checks/function-metrics/analysis.ts +7 -2
  396. package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
  397. package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
  398. package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
  399. package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
  400. package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
  401. package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
  402. package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
  403. package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
  404. package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
  405. package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
  406. package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
  407. package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
  408. package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
  409. package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
  410. package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
  411. package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
  412. package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
  413. package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
  414. package/src/package-checks/function-metrics/constructor.ts +30 -7
  415. package/src/package-checks/function-metrics/execution.ts +2 -4
  416. package/src/package-checks/function-metrics/finding-messages.ts +2 -2
  417. package/src/package-checks/function-metrics/measurement.ts +3 -1
  418. package/src/package-checks/function-metrics/options.ts +6 -3
  419. package/src/package-checks/function-metrics/records.ts +1 -1
  420. package/src/package-checks/host-environment/git.ts +11 -0
  421. package/src/package-checks/host-environment/path.ts +1 -20
  422. package/src/package-checks/host-environment/process/contract.ts +17 -9
  423. package/src/package-checks/host-environment/process/result.ts +48 -20
  424. package/src/package-checks/host-environment/process/runner.ts +8 -4
  425. package/src/package-checks/json-schema-validation/default-check.ts +38 -5
  426. package/src/package-checks/json-schema-validation/options.ts +4 -1
  427. package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
  428. package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
  429. package/src/package-checks/json-validation/default-check.ts +27 -6
  430. package/src/package-checks/json-validation/options.ts +4 -1
  431. package/src/package-checks/local-cache-options.ts +40 -0
  432. package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
  433. package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
  434. package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
  435. package/src/package-checks/markdown-link-validation/execution.ts +1 -1
  436. package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
  437. package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
  438. package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
  439. package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
  440. package/src/package-checks/markdown-link-validation/options.ts +6 -7
  441. package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
  442. package/src/package-checks/markdown-lint/adapter.ts +167 -0
  443. package/src/package-checks/markdown-lint/default-check.ts +92 -0
  444. package/src/package-checks/markdown-lint/execution.ts +266 -0
  445. package/src/package-checks/markdown-lint/final-data.ts +33 -0
  446. package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
  447. package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
  448. package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
  449. package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
  450. package/src/package-checks/markdown-lint/options-validation.ts +50 -0
  451. package/src/package-checks/markdown-lint/options.ts +82 -0
  452. package/src/package-checks/markdown-lint/records.ts +132 -0
  453. package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
  454. package/src/package-checks/project-files/collection.ts +38 -22
  455. package/src/package-checks/project-files/config-glob.ts +1 -17
  456. package/src/package-checks/project-files/configuration.ts +1 -1
  457. package/src/package-checks/project-files/gitlink-revision.ts +4 -6
  458. package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
  459. package/src/package-checks/project-files/public-collection.ts +1 -1
  460. package/src/package-checks/project-files/revision-paths.ts +3 -3
  461. package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
  462. package/src/package-checks/secret-detection/default-check.ts +29 -6
  463. package/src/package-checks/secret-detection/execution.ts +2 -2
  464. package/src/package-checks/secret-detection/input-preparation.ts +64 -7
  465. package/src/package-checks/secret-detection/options.ts +5 -2
  466. package/src/package-checks/secret-detection/records.ts +1 -1
  467. package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
  468. package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
  469. package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
  470. package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
  471. package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
  472. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
  473. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
  474. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
  475. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
  476. package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
  477. package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
  478. package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
  479. package/src/project-definition/check-tree/authoring.ts +15 -8
  480. package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
  481. package/src/project-definition/check-tree/flag-conditions.ts +99 -0
  482. package/src/project-definition/check-tree/materialization.ts +12 -8
  483. package/src/project-definition/check-tree/resolution.ts +13 -15
  484. package/src/project-definition/declarative-snapshot.ts +9 -2
  485. package/src/project-definition/project-changes.ts +112 -0
  486. package/src/project-definition/project-definition-validation.ts +58 -10
  487. package/src/project-definition/project-definition.ts +41 -68
  488. package/src/project-definition/scheduler-policy.ts +6 -3
  489. package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
  490. package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
  491. package/src/project-run/aggregation.ts +51 -74
  492. package/src/project-run/changes/git.ts +206 -0
  493. package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
  494. package/src/project-run/check-execution/callback.ts +3 -2
  495. package/src/project-run/check-execution/dependencies.ts +120 -6
  496. package/src/project-run/check-execution/execution-finalization.ts +6 -4
  497. package/src/project-run/check-execution/execution-settlement.ts +88 -29
  498. package/src/project-run/check-execution/flag-controls.ts +22 -8
  499. package/src/project-run/check-execution/lifecycle.ts +14 -6
  500. package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
  501. package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
  502. package/src/project-run/check-execution/ready-check-execution.ts +97 -0
  503. package/src/project-run/check-execution/resolved-checks.ts +40 -219
  504. package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
  505. package/src/project-run/check-execution/terminal-result.ts +108 -29
  506. package/src/project-run/completion/completion.ts +17 -3
  507. package/src/project-run/controls/contract.ts +6 -16
  508. package/src/project-run/controls/validation.ts +7 -60
  509. package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
  510. package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
  511. package/src/project-run/invocation/candidate.ts +28 -15
  512. package/src/project-run/invocation/candidates.ts +56 -0
  513. package/src/project-run/invocation/creation.ts +7 -3
  514. package/src/project-run/invocation/execution.ts +136 -0
  515. package/src/project-run/invocation/run.ts +15 -179
  516. package/src/project-run/invocation/scheduler.ts +13 -6
  517. package/src/project-run/outputs/status.ts +15 -15
  518. package/src/project-run/progress-rendering/presentation.ts +35 -13
  519. package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
  520. package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
  521. package/src/project-run/progress-rendering/renderer.ts +10 -4
  522. package/src/project-run/project-context.ts +8 -4
  523. package/src/project-run/result.ts +5 -5
  524. package/src/project-run/run.ts +1 -1
  525. package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
  526. package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
  527. package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
  528. package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
  529. package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
  530. package/src/project-run/task-scheduler/execution-state.ts +4 -4
  531. package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
  532. package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
  533. package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
  534. package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
  535. package/src/project-run/task-scheduler/scheduler.ts +23 -6
  536. package/types/check/check.d.ts +178 -67
  537. package/types/check/flag-enablement.d.ts +42 -0
  538. package/types/check/handoff-provider-identity.d.ts +12 -0
  539. package/types/check/project-changes.d.ts +13 -0
  540. package/types/check/project-context.d.ts +10 -0
  541. package/types/check-settlement/facts.d.ts +1 -1
  542. package/types/data-boundary/canonical-data.d.ts +28 -5
  543. package/types/data-boundary/canonical-json.d.ts +18 -1
  544. package/types/data-boundary/closed-values.d.ts +17 -1
  545. package/types/data-boundary/config-glob.d.ts +5 -0
  546. package/types/data-boundary/project-path.d.ts +4 -0
  547. package/types/index.d.ts +27 -11
  548. package/types/package-checks/check-authoring.d.ts +45 -0
  549. package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
  550. package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
  551. package/types/package-checks/command-check/command-check.d.ts +48 -0
  552. package/types/package-checks/command-check/contract.d.ts +108 -0
  553. package/types/package-checks/command-check/execution.d.ts +7 -0
  554. package/types/package-checks/command-check/options.d.ts +11 -0
  555. package/types/package-checks/command-check/transcript.d.ts +8 -0
  556. package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
  557. package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
  558. package/types/package-checks/duplicate-detection/options.d.ts +4 -3
  559. package/types/package-checks/duplicate-detection/records.d.ts +1 -1
  560. package/types/package-checks/file-metrics/constructor.d.ts +5 -2
  561. package/types/package-checks/file-metrics/options.d.ts +4 -3
  562. package/types/package-checks/file-metrics/records.d.ts +1 -1
  563. package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
  564. package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
  565. package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
  566. package/types/package-checks/function-metrics/constructor.d.ts +5 -2
  567. package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
  568. package/types/package-checks/function-metrics/options.d.ts +4 -3
  569. package/types/package-checks/function-metrics/records.d.ts +1 -1
  570. package/types/package-checks/host-environment/git.d.ts +2 -0
  571. package/types/package-checks/host-environment/path.d.ts +1 -3
  572. package/types/package-checks/host-environment/process/contract.d.ts +17 -9
  573. package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
  574. package/types/package-checks/json-schema-validation/options.d.ts +2 -1
  575. package/types/package-checks/json-validation/default-check.d.ts +4 -1
  576. package/types/package-checks/json-validation/options.d.ts +2 -1
  577. package/types/package-checks/local-cache-options.d.ts +9 -0
  578. package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
  579. package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
  580. package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
  581. package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
  582. package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
  583. package/types/package-checks/markdown-lint/execution.d.ts +24 -0
  584. package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
  585. package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
  586. package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
  587. package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
  588. package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
  589. package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
  590. package/types/package-checks/markdown-lint/options.d.ts +65 -0
  591. package/types/package-checks/markdown-lint/records.d.ts +39 -0
  592. package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
  593. package/types/package-checks/secret-detection/default-check.d.ts +4 -1
  594. package/types/package-checks/secret-detection/options.d.ts +3 -2
  595. package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
  596. package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
  597. package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
  598. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
  599. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
  600. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
  601. package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
  602. package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
  603. package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
  604. package/types/project-definition/check-tree/authoring.d.ts +5 -3
  605. package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
  606. package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
  607. package/types/project-definition/check-tree/resolution.d.ts +6 -4
  608. package/types/project-definition/declarative-snapshot.d.ts +4 -1
  609. package/types/project-definition/project-changes.d.ts +30 -0
  610. package/types/project-definition/project-definition.d.ts +15 -30
  611. package/types/project-definition/scheduler-policy.d.ts +3 -3
  612. package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
  613. package/types/project-run/aggregation.d.ts +8 -6
  614. package/types/project-run/changes/git.d.ts +14 -0
  615. package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
  616. package/types/project-run/check-execution/dependencies.d.ts +3 -0
  617. package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
  618. package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
  619. package/types/project-run/check-execution/flag-controls.d.ts +1 -1
  620. package/types/project-run/check-execution/lifecycle.d.ts +9 -5
  621. package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
  622. package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
  623. package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
  624. package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
  625. package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
  626. package/types/project-run/check-execution/terminal-result.d.ts +13 -1
  627. package/types/project-run/completion/completion.d.ts +3 -1
  628. package/types/project-run/controls/contract.d.ts +6 -16
  629. package/types/project-run/invocation/candidates.d.ts +8 -0
  630. package/types/project-run/invocation/execution.d.ts +5 -0
  631. package/types/project-run/invocation/run.d.ts +2 -2
  632. package/types/project-run/outputs/status.d.ts +4 -4
  633. package/types/project-run/progress-rendering/presentation.d.ts +4 -3
  634. package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
  635. package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
  636. package/types/project-run/progress-rendering/renderer.d.ts +4 -2
  637. package/types/project-run/project-context.d.ts +3 -3
  638. package/types/project-run/result.d.ts +3 -3
  639. package/types/project-run/run.d.ts +1 -1
  640. package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
  641. package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
  642. package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
  643. package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
  644. package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
  645. package/dist/esm/check/finding-presentation.mjs.map +0 -1
  646. package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
  647. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
  648. package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
  649. package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
  650. package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
  651. package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
  652. package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
  653. package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
  654. package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
  655. package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
  656. package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
  657. package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
  658. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
  659. package/types/package-checks/project-files/config-glob.d.ts +0 -5
  660. /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
  661. /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
  662. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
  663. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
  664. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
  665. /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
  666. /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
  667. /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
  668. /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
  669. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
  670. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
@@ -1,4 +1,5 @@
1
1
  import { defineCheck } from "../../check/check.mjs";
2
+ import { resolvePackageCheckAuthoringInput } from "../check-authoring.mjs";
2
3
  import { executeFunctionMetrics } from "./execution.mjs";
3
4
  import { parseFunctionMetricsData } from "./final-data.mjs";
4
5
  import { resolveFunctionMetricsOptions } from "./options-resolution.mjs";
@@ -7,23 +8,20 @@ const FUNCTION_METRICS_CHECK_DEFINITION = {
7
8
  checkId: "function-metrics",
8
9
  displayName: "Function metrics"
9
10
  };
10
- /**
11
- * 使用可省略的区域、阈值与 finding policy 构造一个完整 function-metrics Check。
12
- *
13
- * @param options - 省略字段由 package 补齐;显式 files 数组完整替换对应字段的默认数组。
14
- * @returns 固定 `function-metrics` identity、完整冻结 options、preflight 与 execution。
15
- * @throws {TypeError} input 含未知字段、空 area、非法 finding policy/waiver 或非法 limit 时抛出。
16
- */
17
11
  export function functionMetrics(options = {}) {
18
- const resolvedOptions = resolveFunctionMetricsOptions(options);
12
+ const input = resolvePackageCheckAuthoringInput(options, ["codeAreas", "findingPolicy", "findingWaivers"], FUNCTION_METRICS_CHECK_DEFINITION);
13
+ if (input === undefined) {
14
+ throw new TypeError("functionMetrics options must use the documented closed policy: a non-empty area map, recognized finding policies and waivers, and positive safe-integer limits");
15
+ }
16
+ const resolvedOptions = resolveFunctionMetricsOptions(input.domainOptions);
19
17
  if (resolvedOptions === undefined) {
20
18
  throw new TypeError("functionMetrics options must use the documented closed policy: a non-empty area map, recognized finding policies and waivers, and positive safe-integer limits");
21
19
  }
22
20
  return defineCheck({
23
- ...FUNCTION_METRICS_CHECK_DEFINITION,
24
- execution: executeFunctionMetrics,
21
+ ...input.definition,
22
+ execute: executeFunctionMetrics,
25
23
  parseData: parseFunctionMetricsData,
26
- preflight: (preparedOptions) => validResolvedFunctionMetricsOptions(preparedOptions)
24
+ prepare: (preparedOptions) => validResolvedFunctionMetricsOptions(preparedOptions)
27
25
  ? { status: "success", preparedOptions }
28
26
  : {
29
27
  status: "failure",
@@ -1 +1 @@
1
- {"version":3,"file":"constructor.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/constructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,yBAAyB,CAAC;AAE9E,MAAM,iCAAiC,GAAG;IACxC,OAAO,EAAE,kBAAkB;IAC3B,WAAW,EAAE,kBAAkB;CACvB,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAO,GAA2B,EAAE;IAMpC,MAAM,eAAe,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CACjB,gKAAgK,CACjK,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,iCAAiC;QACpC,SAAS,EAAE,sBAAsB;QACjC,SAAS,EAAE,wBAAwB;QACnC,SAAS,EAAE,CAAC,eAAe,EAAE,EAAE,CAC7B,mCAAmC,CAAC,eAAe,CAAC;YAClD,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE;YACxC,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBACnC,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,iBAAiB;wBACvB,KAAK,EAAE,OAAO;wBACd,OAAO,EACL,iIAAiI;qBACpI;iBACF;aACF;QACP,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { defineCheck, type TypedCheckWithOptions } from \"../../check/check.ts\";\nimport { executeFunctionMetrics } from \"./execution.ts\";\nimport { parseFunctionMetricsData } from \"./final-data.ts\";\nimport type { FunctionMetricsOptions, ResolvedFunctionMetricsOptions } from \"./options.ts\";\nimport { resolveFunctionMetricsOptions } from \"./options-resolution.ts\";\nimport { validResolvedFunctionMetricsOptions } from \"./options-validation.ts\";\n\nconst FUNCTION_METRICS_CHECK_DEFINITION = {\n checkId: \"function-metrics\",\n displayName: \"Function metrics\"\n} as const;\n\n/**\n * 使用可省略的区域、阈值与 finding policy 构造一个完整 function-metrics Check。\n *\n * @param options - 省略字段由 package 补齐;显式 files 数组完整替换对应字段的默认数组。\n * @returns 固定 `function-metrics` identity、完整冻结 options、preflight 与 execution。\n * @throws {TypeError} input 含未知字段、空 area、非法 finding policy/waiver 或非法 limit 时抛出。\n */\nexport function functionMetrics(\n options: FunctionMetricsOptions = {}\n): TypedCheckWithOptions<\n \"function-metrics\",\n ResolvedFunctionMetricsOptions,\n typeof parseFunctionMetricsData\n> {\n const resolvedOptions = resolveFunctionMetricsOptions(options);\n if (resolvedOptions === undefined) {\n throw new TypeError(\n \"functionMetrics options must use the documented closed policy: a non-empty area map, recognized finding policies and waivers, and positive safe-integer limits\"\n );\n }\n return defineCheck({\n ...FUNCTION_METRICS_CHECK_DEFINITION,\n execution: executeFunctionMetrics,\n parseData: parseFunctionMetricsData,\n preflight: (preparedOptions) =>\n validResolvedFunctionMetricsOptions(preparedOptions)\n ? { status: \"success\", preparedOptions }\n : {\n status: \"failure\",\n action: \"block\",\n reason: { code: \"invalid-options\" },\n messages: [\n {\n code: \"invalid-options\",\n level: \"error\",\n message:\n \"functionMetrics options are invalid; recreate the Check with functionMetrics(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
1
+ {"version":3,"file":"constructor.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/constructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,iCAAiC,EAElC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,yBAAyB,CAAC;AAE9E,MAAM,iCAAiC,GAAG;IACxC,OAAO,EAAE,kBAAkB;IAC3B,WAAW,EAAE,kBAAkB;CACvB,CAAC;AAsBX,MAAM,UAAU,eAAe,CAC7B,OAAO,GAA2B,EAAE;IAEpC,MAAM,KAAK,GAAG,iCAAiC,CAC7C,OAAO,EACP,CAAC,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAChD,iCAAiC,CAClC,CAAC;IACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CACjB,gKAAgK,CACjK,CAAC;IACJ,CAAC;IACD,MAAM,eAAe,GAAG,6BAA6B,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC3E,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CACjB,gKAAgK,CACjK,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,KAAK,CAAC,UAAU;QACnB,OAAO,EAAE,sBAAsB;QAC/B,SAAS,EAAE,wBAAwB;QACnC,OAAO,EAAE,CAAC,eAAe,EAAE,EAAE,CAC3B,mCAAmC,CAAC,eAAe,CAAC;YAClD,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE;YACxC,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBACnC,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,iBAAiB;wBACvB,KAAK,EAAE,OAAO;wBACd,OAAO,EACL,iIAAiI;qBACpI;iBACF;aACF;QACP,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { defineCheck, type TypedCheckWithOptions } from \"../../check/check.ts\";\nimport {\n resolvePackageCheckAuthoringInput,\n type PackageCheckIdentityInput\n} from \"../check-authoring.ts\";\nimport { executeFunctionMetrics } from \"./execution.ts\";\nimport { parseFunctionMetricsData } from \"./final-data.ts\";\nimport type { FunctionMetricsOptions, ResolvedFunctionMetricsOptions } from \"./options.ts\";\nimport { resolveFunctionMetricsOptions } from \"./options-resolution.ts\";\nimport { validResolvedFunctionMetricsOptions } from \"./options-validation.ts\";\n\nconst FUNCTION_METRICS_CHECK_DEFINITION = {\n checkId: \"function-metrics\",\n displayName: \"Function metrics\"\n} as const;\n\n/**\n * 使用可省略的区域、阈值与 finding policy 构造一个完整 function-metrics Check。\n *\n * @param options - 省略字段由 package 补齐;显式 files 数组完整替换对应字段的默认数组。\n * @returns 固定 `function-metrics` identity、完整冻结 options、preparation 与 execution。\n * @throws {TypeError} input 含未知字段、空 area、非法 finding policy/waiver 或非法 limit 时抛出。\n */\nexport function functionMetrics(\n options?: FunctionMetricsOptions<\"function-metrics\">\n): TypedCheckWithOptions<\n \"function-metrics\",\n ResolvedFunctionMetricsOptions,\n typeof parseFunctionMetricsData\n>;\nexport function functionMetrics<const Id extends string>(\n options: FunctionMetricsOptions<Id> & PackageCheckIdentityInput<Id>\n): TypedCheckWithOptions<Id, ResolvedFunctionMetricsOptions, typeof parseFunctionMetricsData>;\nexport function functionMetrics(\n options: FunctionMetricsOptions\n): TypedCheckWithOptions<string, ResolvedFunctionMetricsOptions, typeof parseFunctionMetricsData>;\nexport function functionMetrics(\n options: FunctionMetricsOptions = {}\n): TypedCheckWithOptions<string, ResolvedFunctionMetricsOptions, typeof parseFunctionMetricsData> {\n const input = resolvePackageCheckAuthoringInput(\n options,\n [\"codeAreas\", \"findingPolicy\", \"findingWaivers\"],\n FUNCTION_METRICS_CHECK_DEFINITION\n );\n if (input === undefined) {\n throw new TypeError(\n \"functionMetrics options must use the documented closed policy: a non-empty area map, recognized finding policies and waivers, and positive safe-integer limits\"\n );\n }\n const resolvedOptions = resolveFunctionMetricsOptions(input.domainOptions);\n if (resolvedOptions === undefined) {\n throw new TypeError(\n \"functionMetrics options must use the documented closed policy: a non-empty area map, recognized finding policies and waivers, and positive safe-integer limits\"\n );\n }\n return defineCheck({\n ...input.definition,\n execute: executeFunctionMetrics,\n parseData: parseFunctionMetricsData,\n prepare: (preparedOptions) =>\n validResolvedFunctionMetricsOptions(preparedOptions)\n ? { status: \"success\", preparedOptions }\n : {\n status: \"failure\",\n action: \"block\",\n reason: { code: \"invalid-options\" },\n messages: [\n {\n code: \"invalid-options\",\n level: \"error\",\n message:\n \"functionMetrics options are invalid; recreate the Check with functionMetrics(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
@@ -1,9 +1,9 @@
1
- import { reconcileFindingWaivers } from "../../finding-waivers/reconciliation.mjs";
1
+ import { reconcileFindingWaivers } from "../../package-tools/finding-waivers/reconciliation.mjs";
2
2
  import { collectProjectFileSets, requireProjectFileSet } from "../project-files/collection.mjs";
3
3
  import { partitionProjectFilesByEligibility } from "../project-files/input-eligibility.mjs";
4
4
  import { settleFindings } from "../code-quality-findings/policy.mjs";
5
5
  import { reportFindingWaiverAudits, reportReconciledCodeQualityFindingRecords } from "../code-quality-findings/finding-waiver-evidence.mjs";
6
- import { appendCheckMessages } from "../../check/finding-presentation.mjs";
6
+ import { appendCheckMessages } from "../../package-tools/finding-presentation/finding-presentation.mjs";
7
7
  import { functionFindingMessages, functionWaiverMessages } from "./finding-messages.mjs";
8
8
  import { analyzeFunctionMetrics } from "./analysis.mjs";
9
9
  import { measureFunctionMetrics } from "./measurement.mjs";
@@ -157,8 +157,6 @@ function directMeasurementFailure(measurement) {
157
157
  case "source-unavailable":
158
158
  return unavailable("source-unavailable");
159
159
  }
160
- const exhaustiveMeasurement = measurement;
161
- return exhaustiveMeasurement;
162
160
  }
163
161
  function unavailable(code) {
164
162
  return Object.freeze({
@@ -1 +1 @@
1
- {"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckExecutionContext, CheckMessage, CheckResult } from \"../../check/check.ts\";\nimport {\n reconcileFindingWaivers,\n type FindingWaiverReconciliation\n} from \"../../finding-waivers/reconciliation.ts\";\nimport { collectProjectFileSets, requireProjectFileSet } from \"../project-files/collection.ts\";\nimport { partitionProjectFilesByEligibility } from \"../project-files/input-eligibility.ts\";\nimport { settleFindings } from \"../code-quality-findings/policy.ts\";\nimport {\n reportFindingWaiverAudits,\n reportReconciledCodeQualityFindingRecords\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { appendCheckMessages } from \"../../check/finding-presentation.ts\";\nimport { functionFindingMessages, functionWaiverMessages } from \"./finding-messages.ts\";\nimport { analyzeFunctionMetrics } from \"./analysis.ts\";\nimport {\n measureFunctionMetrics,\n type FunctionMeasurementDependencies,\n type FunctionMeasurementResult\n} from \"./measurement.ts\";\nimport type {\n FunctionMetricsAreaInput,\n FunctionMetricsExactInputSet\n} from \"./measurement-model.ts\";\nimport type {\n FunctionMetricsFindingWaiver,\n ResolvedFunctionMetricsCodeAreaOptions,\n ResolvedFunctionMetricsOptions\n} from \"./options.ts\";\nimport { validResolvedFunctionMetricsOptions } from \"./options-validation.ts\";\nimport {\n buildFunctionInputRejectedCandidates,\n buildFunctionRecordCandidates,\n functionMetricsFindingIdentity,\n functionMetricsWaiverAuditRecord,\n type FunctionInputRejectedCandidate,\n type FunctionRecordCandidate\n} from \"./records.ts\";\nimport { isFunctionMetricsTarget } from \"./target-files.ts\";\nimport type { FunctionMetricsFinalData } from \"./final-data.ts\";\n\n/** `function-metrics` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type FunctionMetricsUnavailableReasonCode =\n | \"analysis-failed\"\n | \"cancelled\"\n | \"invalid-options\"\n | \"resource-limit-exceeded\"\n | \"source-unavailable\";\n\n/** Default Check callback;一次扫描完整 area exact-input union。 */\nexport async function executeFunctionMetrics(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>,\n dependencies: Readonly<{\n readonly measurement?: Partial<FunctionMeasurementDependencies>;\n }> = {}\n): Promise<CheckResult<FunctionMetricsFinalData>> {\n if (!validResolvedFunctionMetricsOptions(context.options)) return unavailable(\"invalid-options\");\n if (context.signal.aborted) return unavailable(\"cancelled\");\n\n let prepared: PreparedFunctionInputs;\n try {\n prepared = prepareFunctionInputs(context.project.root, context.options.codeAreas);\n } catch {\n return unavailable(\"source-unavailable\");\n }\n if (context.signal.aborted) return unavailable(\"cancelled\");\n return executePreparedFunctionMetrics(context, prepared, dependencies);\n}\n\nasync function executePreparedFunctionMetrics(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>,\n prepared: PreparedFunctionInputs,\n dependencies: Readonly<{\n readonly measurement?: Partial<FunctionMeasurementDependencies>;\n }>\n): Promise<CheckResult<FunctionMetricsFinalData>> {\n if (prepared.selectedPathCount === 0) {\n return noEligibleFunctionInputResult(context);\n }\n reportInputRejections(context, prepared.rejectedCandidates);\n if (prepared.exactInput.approvedExactPaths.length === 0) {\n const reconciliation = reconcileFunctionMetricWaivers([], context.options.findingWaivers);\n reportFindingWaiverAudits(context, reconciliation, functionMetricsWaiverAuditRecord);\n return settleFunctionFindings(reconciliation, prepared.rejectedCandidates);\n }\n const measurement = await measureFunctionMetrics(\n {\n input: prepared.exactInput,\n signal: context.signal\n },\n dependencies.measurement\n );\n if (measurement.kind !== \"complete\") {\n return appendInputRejectedMessage(\n directMeasurementFailure(measurement),\n prepared.rejectedCandidates.length\n );\n }\n const analysis = analyzeFunctionMetrics(measurement.metrics);\n if (analysis === undefined) {\n return appendInputRejectedMessage(\n unavailable(\"analysis-failed\"),\n prepared.rejectedCandidates.length\n );\n }\n const candidates = buildFunctionRecordCandidates(analysis, prepared.exactInput.areas);\n if (candidates === undefined) {\n return appendInputRejectedMessage(\n unavailable(\"analysis-failed\"),\n prepared.rejectedCandidates.length\n );\n }\n const reconciliation = reconcileFunctionMetricWaivers(candidates, context.options.findingWaivers);\n reportReconciledCodeQualityFindingRecords(context, reconciliation);\n reportFindingWaiverAudits(context, reconciliation, functionMetricsWaiverAuditRecord);\n return settleFunctionFindings(reconciliation, prepared.rejectedCandidates);\n}\n\nfunction noEligibleFunctionInputResult(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>\n): CheckResult<FunctionMetricsFinalData> {\n const reconciliation = reconcileFunctionMetricWaivers([], context.options.findingWaivers);\n reportFindingWaiverAudits(context, reconciliation, functionMetricsWaiverAuditRecord);\n return appendCheckMessages(\n Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } }),\n functionWaiverMessages(reconciliation)\n );\n}\n\nfunction reconcileFunctionMetricWaivers(\n candidates: readonly FunctionRecordCandidate[],\n waivers: readonly FunctionMetricsFindingWaiver[]\n): FindingWaiverReconciliation<FunctionRecordCandidate> {\n return reconcileFindingWaivers({\n findings: candidates,\n identify: functionMetricsFindingIdentity,\n waivers\n });\n}\n\ninterface PreparedFunctionInputs {\n readonly exactInput: FunctionMetricsExactInputSet;\n readonly rejectedCandidates: readonly FunctionInputRejectedCandidate[];\n readonly selectedPathCount: number;\n}\n\nfunction prepareFunctionInputs(\n rootDir: string,\n codeAreas: ResolvedFunctionMetricsOptions[\"codeAreas\"]\n): PreparedFunctionInputs {\n const collected = collectAreaInputs(rootDir, codeAreas);\n return Object.freeze({\n exactInput: Object.freeze({\n approvedExactPaths: Object.freeze(\n uniqueSorted(collected.areas.flatMap((area) => area.approvedExactPaths))\n ),\n areas: collected.areas,\n rootDir\n }),\n rejectedCandidates: buildFunctionInputRejectedCandidates(\n new Map(\n [...collected.rejectedCodeAreasByPath].map(([path, matchingAreas]) => [\n path,\n Object.freeze(matchingAreas)\n ])\n )\n ),\n selectedPathCount: collected.selectedPaths.size\n });\n}\n\ninterface CollectedFunctionAreaInputs {\n readonly areas: readonly FunctionMetricsAreaInput[];\n readonly rejectedCodeAreasByPath: ReadonlyMap<string, readonly string[]>;\n readonly selectedPaths: ReadonlySet<string>;\n}\n\nfunction collectAreaInputs(\n rootDir: string,\n codeAreas: Readonly<Record<string, ResolvedFunctionMetricsCodeAreaOptions>>\n): CollectedFunctionAreaInputs {\n const areas: FunctionMetricsAreaInput[] = [];\n const rejectedCodeAreasByPath = new Map<string, string[]>();\n const selectedPaths = new Set<string>();\n const orderedPolicies = Object.entries(codeAreas).sort(([left], [right]) =>\n compareText(left, right)\n );\n const filesByArea = collectProjectFileSets(\n rootDir,\n Object.fromEntries(orderedPolicies.map(([areaId, policy]) => [areaId, policy.files]))\n );\n for (const [codeArea, policy] of orderedPolicies) {\n const selectedForArea = requireProjectFileSet(filesByArea, codeArea);\n for (const path of selectedForArea) selectedPaths.add(path);\n const partition = partitionProjectFilesByEligibility(selectedForArea, isFunctionMetricsTarget);\n for (const path of partition.rejectedPaths) {\n const matchingAreas = rejectedCodeAreasByPath.get(path) ?? [];\n matchingAreas.push(codeArea);\n rejectedCodeAreasByPath.set(path, matchingAreas);\n }\n if (partition.acceptedPaths.length === 0) continue;\n areas.push(\n Object.freeze({\n approvedExactPaths: partition.acceptedPaths,\n codeArea,\n findingPolicy: policy.findingPolicy,\n limits: policy.limits\n })\n );\n }\n return Object.freeze({\n areas: Object.freeze(areas),\n rejectedCodeAreasByPath,\n selectedPaths\n });\n}\n\nfunction reportInputRejections(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>,\n candidates: readonly FunctionInputRejectedCandidate[]\n): void {\n for (const candidate of candidates) {\n context.records.report({ id: candidate.id }, candidate.data);\n }\n}\n\nfunction settleFunctionFindings(\n reconciliation: FindingWaiverReconciliation<FunctionRecordCandidate>,\n rejectedCandidates: readonly FunctionInputRejectedCandidate[]\n): CheckResult<FunctionMetricsFinalData> {\n const settlement = settleFindings([\n ...reconciliation.findings.map((finding) => ({\n actionable: finding.disposition !== \"waived\",\n blocking: finding.finding.data.blocking\n })),\n ...rejectedCandidates.map(() => ({ actionable: false, blocking: false }))\n ]);\n const actionableMetricCandidates = reconciliation.findings\n .filter(({ disposition }) => disposition !== \"waived\")\n .map(({ finding }) => finding);\n return appendCheckMessages(\n appendCheckMessages(\n appendInputRejectedMessage(settlement, rejectedCandidates.length),\n functionFindingMessages([...actionableMetricCandidates, ...rejectedCandidates])\n ),\n functionWaiverMessages(reconciliation)\n );\n}\n\nfunction appendInputRejectedMessage(\n result: CheckResult<FunctionMetricsFinalData>,\n rejectedInputCount: number\n): CheckResult<FunctionMetricsFinalData> {\n if (rejectedInputCount === 0) return result;\n const message: CheckMessage = Object.freeze({\n code: \"input-rejected\",\n level: \"warning\",\n message: `${rejectedInputCount} selected functionMetrics input file(s) were rejected because their file type is unsupported; inspect this Check's Records and narrow files.include/exclude.`\n });\n return Object.freeze({\n ...result,\n messages: Object.freeze([...(result.messages ?? []), message])\n });\n}\n\nfunction directMeasurementFailure(\n measurement: Exclude<FunctionMeasurementResult, { kind: \"complete\" }>\n): CheckResult<FunctionMetricsFinalData> {\n switch (measurement.kind) {\n case \"cancelled\":\n return unavailable(\"cancelled\");\n case \"analysis-failed\":\n return unavailable(\"analysis-failed\");\n case \"resource-limit-exceeded\":\n return unavailable(\"resource-limit-exceeded\");\n case \"source-unavailable\":\n return unavailable(\"source-unavailable\");\n }\n const exhaustiveMeasurement: never = measurement;\n return exhaustiveMeasurement;\n}\n\nfunction unavailable(\n code: FunctionMetricsUnavailableReasonCode\n): CheckResult<FunctionMetricsFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code },\n messages: Object.freeze([\n Object.freeze({ code, level: \"error\" as const, message: unavailableMessage(code) })\n ])\n });\n}\n\nfunction unavailableMessage(code: FunctionMetricsUnavailableReasonCode): string {\n switch (code) {\n case \"invalid-options\":\n return \"functionMetrics options are invalid; recreate the Check with functionMetrics(options) or restore its complete resolved options.\";\n case \"cancelled\":\n return \"Function metrics was cancelled before it could form a complete result; inspect the caller's cancellation reason and retry if appropriate.\";\n case \"source-unavailable\":\n return \"Function metrics could not collect its configured project files; check the project root, file permissions, and selected file source.\";\n case \"analysis-failed\":\n return \"Function metrics analysis did not produce a complete trusted result; inspect the selected source and retry after correcting it.\";\n case \"resource-limit-exceeded\":\n return \"Function metrics input exceeds the per-file or aggregate analysis resource limit; narrow the selected files or reduce their size.\";\n }\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
1
+ {"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckExecutionContext, CheckMessage, CheckResult } from \"../../check/check.ts\";\nimport {\n reconcileFindingWaivers,\n type FindingWaiverReconciliation\n} from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport { collectProjectFileSets, requireProjectFileSet } from \"../project-files/collection.ts\";\nimport { partitionProjectFilesByEligibility } from \"../project-files/input-eligibility.ts\";\nimport { settleFindings } from \"../code-quality-findings/policy.ts\";\nimport {\n reportFindingWaiverAudits,\n reportReconciledCodeQualityFindingRecords\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { appendCheckMessages } from \"../../package-tools/finding-presentation/finding-presentation.ts\";\nimport { functionFindingMessages, functionWaiverMessages } from \"./finding-messages.ts\";\nimport { analyzeFunctionMetrics } from \"./analysis.ts\";\nimport {\n measureFunctionMetrics,\n type FunctionMeasurementDependencies,\n type FunctionMeasurementResult\n} from \"./measurement.ts\";\nimport type {\n FunctionMetricsAreaInput,\n FunctionMetricsExactInputSet\n} from \"./measurement-model.ts\";\nimport type {\n FunctionMetricsFindingWaiver,\n ResolvedFunctionMetricsCodeAreaOptions,\n ResolvedFunctionMetricsOptions\n} from \"./options.ts\";\nimport { validResolvedFunctionMetricsOptions } from \"./options-validation.ts\";\nimport {\n buildFunctionInputRejectedCandidates,\n buildFunctionRecordCandidates,\n functionMetricsFindingIdentity,\n functionMetricsWaiverAuditRecord,\n type FunctionInputRejectedCandidate,\n type FunctionRecordCandidate\n} from \"./records.ts\";\nimport { isFunctionMetricsTarget } from \"./target-files.ts\";\nimport type { FunctionMetricsFinalData } from \"./final-data.ts\";\n\n/** `function-metrics` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type FunctionMetricsUnavailableReasonCode =\n | \"analysis-failed\"\n | \"cancelled\"\n | \"invalid-options\"\n | \"resource-limit-exceeded\"\n | \"source-unavailable\";\n\n/** Default Check callback;一次扫描完整 area exact-input union。 */\nexport async function executeFunctionMetrics(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>,\n dependencies: Readonly<{\n readonly measurement?: Partial<FunctionMeasurementDependencies>;\n }> = {}\n): Promise<CheckResult<FunctionMetricsFinalData>> {\n if (!validResolvedFunctionMetricsOptions(context.options)) return unavailable(\"invalid-options\");\n if (context.signal.aborted) return unavailable(\"cancelled\");\n\n let prepared: PreparedFunctionInputs;\n try {\n prepared = prepareFunctionInputs(context.project.root, context.options.codeAreas);\n } catch {\n return unavailable(\"source-unavailable\");\n }\n if (context.signal.aborted) return unavailable(\"cancelled\");\n return executePreparedFunctionMetrics(context, prepared, dependencies);\n}\n\nasync function executePreparedFunctionMetrics(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>,\n prepared: PreparedFunctionInputs,\n dependencies: Readonly<{\n readonly measurement?: Partial<FunctionMeasurementDependencies>;\n }>\n): Promise<CheckResult<FunctionMetricsFinalData>> {\n if (prepared.selectedPathCount === 0) {\n return noEligibleFunctionInputResult(context);\n }\n reportInputRejections(context, prepared.rejectedCandidates);\n if (prepared.exactInput.approvedExactPaths.length === 0) {\n const reconciliation = reconcileFunctionMetricWaivers([], context.options.findingWaivers);\n reportFindingWaiverAudits(context, reconciliation, functionMetricsWaiverAuditRecord);\n return settleFunctionFindings(reconciliation, prepared.rejectedCandidates);\n }\n const measurement = await measureFunctionMetrics(\n {\n input: prepared.exactInput,\n signal: context.signal\n },\n dependencies.measurement\n );\n if (measurement.kind !== \"complete\") {\n return appendInputRejectedMessage(\n directMeasurementFailure(measurement),\n prepared.rejectedCandidates.length\n );\n }\n const analysis = analyzeFunctionMetrics(measurement.metrics);\n if (analysis === undefined) {\n return appendInputRejectedMessage(\n unavailable(\"analysis-failed\"),\n prepared.rejectedCandidates.length\n );\n }\n const candidates = buildFunctionRecordCandidates(analysis, prepared.exactInput.areas);\n if (candidates === undefined) {\n return appendInputRejectedMessage(\n unavailable(\"analysis-failed\"),\n prepared.rejectedCandidates.length\n );\n }\n const reconciliation = reconcileFunctionMetricWaivers(candidates, context.options.findingWaivers);\n reportReconciledCodeQualityFindingRecords(context, reconciliation);\n reportFindingWaiverAudits(context, reconciliation, functionMetricsWaiverAuditRecord);\n return settleFunctionFindings(reconciliation, prepared.rejectedCandidates);\n}\n\nfunction noEligibleFunctionInputResult(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>\n): CheckResult<FunctionMetricsFinalData> {\n const reconciliation = reconcileFunctionMetricWaivers([], context.options.findingWaivers);\n reportFindingWaiverAudits(context, reconciliation, functionMetricsWaiverAuditRecord);\n return appendCheckMessages(\n Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } }),\n functionWaiverMessages(reconciliation)\n );\n}\n\nfunction reconcileFunctionMetricWaivers(\n candidates: readonly FunctionRecordCandidate[],\n waivers: readonly FunctionMetricsFindingWaiver[]\n): FindingWaiverReconciliation<FunctionRecordCandidate> {\n return reconcileFindingWaivers({\n findings: candidates,\n identify: functionMetricsFindingIdentity,\n waivers\n });\n}\n\ninterface PreparedFunctionInputs {\n readonly exactInput: FunctionMetricsExactInputSet;\n readonly rejectedCandidates: readonly FunctionInputRejectedCandidate[];\n readonly selectedPathCount: number;\n}\n\nfunction prepareFunctionInputs(\n rootDir: string,\n codeAreas: ResolvedFunctionMetricsOptions[\"codeAreas\"]\n): PreparedFunctionInputs {\n const collected = collectAreaInputs(rootDir, codeAreas);\n return Object.freeze({\n exactInput: Object.freeze({\n approvedExactPaths: Object.freeze(\n uniqueSorted(collected.areas.flatMap((area) => area.approvedExactPaths))\n ),\n areas: collected.areas,\n rootDir\n }),\n rejectedCandidates: buildFunctionInputRejectedCandidates(\n new Map(\n [...collected.rejectedCodeAreasByPath].map(([path, matchingAreas]) => [\n path,\n Object.freeze(matchingAreas)\n ])\n )\n ),\n selectedPathCount: collected.selectedPaths.size\n });\n}\n\ninterface CollectedFunctionAreaInputs {\n readonly areas: readonly FunctionMetricsAreaInput[];\n readonly rejectedCodeAreasByPath: ReadonlyMap<string, readonly string[]>;\n readonly selectedPaths: ReadonlySet<string>;\n}\n\nfunction collectAreaInputs(\n rootDir: string,\n codeAreas: Readonly<Record<string, ResolvedFunctionMetricsCodeAreaOptions>>\n): CollectedFunctionAreaInputs {\n const areas: FunctionMetricsAreaInput[] = [];\n const rejectedCodeAreasByPath = new Map<string, string[]>();\n const selectedPaths = new Set<string>();\n const orderedPolicies = Object.entries(codeAreas).sort(([left], [right]) =>\n compareText(left, right)\n );\n const filesByArea = collectProjectFileSets(\n rootDir,\n Object.fromEntries(orderedPolicies.map(([areaId, policy]) => [areaId, policy.files]))\n );\n for (const [codeArea, policy] of orderedPolicies) {\n const selectedForArea = requireProjectFileSet(filesByArea, codeArea);\n for (const path of selectedForArea) selectedPaths.add(path);\n const partition = partitionProjectFilesByEligibility(selectedForArea, isFunctionMetricsTarget);\n for (const path of partition.rejectedPaths) {\n const matchingAreas = rejectedCodeAreasByPath.get(path) ?? [];\n matchingAreas.push(codeArea);\n rejectedCodeAreasByPath.set(path, matchingAreas);\n }\n if (partition.acceptedPaths.length === 0) continue;\n areas.push(\n Object.freeze({\n approvedExactPaths: partition.acceptedPaths,\n codeArea,\n findingPolicy: policy.findingPolicy,\n limits: policy.limits\n })\n );\n }\n return Object.freeze({\n areas: Object.freeze(areas),\n rejectedCodeAreasByPath,\n selectedPaths\n });\n}\n\nfunction reportInputRejections(\n context: CheckExecutionContext<ResolvedFunctionMetricsOptions>,\n candidates: readonly FunctionInputRejectedCandidate[]\n): void {\n for (const candidate of candidates) {\n context.records.report({ id: candidate.id }, candidate.data);\n }\n}\n\nfunction settleFunctionFindings(\n reconciliation: FindingWaiverReconciliation<FunctionRecordCandidate>,\n rejectedCandidates: readonly FunctionInputRejectedCandidate[]\n): CheckResult<FunctionMetricsFinalData> {\n const settlement = settleFindings([\n ...reconciliation.findings.map((finding) => ({\n actionable: finding.disposition !== \"waived\",\n blocking: finding.finding.data.blocking\n })),\n ...rejectedCandidates.map(() => ({ actionable: false, blocking: false }))\n ]);\n const actionableMetricCandidates = reconciliation.findings\n .filter(({ disposition }) => disposition !== \"waived\")\n .map(({ finding }) => finding);\n return appendCheckMessages(\n appendCheckMessages(\n appendInputRejectedMessage(settlement, rejectedCandidates.length),\n functionFindingMessages([...actionableMetricCandidates, ...rejectedCandidates])\n ),\n functionWaiverMessages(reconciliation)\n );\n}\n\nfunction appendInputRejectedMessage(\n result: CheckResult<FunctionMetricsFinalData>,\n rejectedInputCount: number\n): CheckResult<FunctionMetricsFinalData> {\n if (rejectedInputCount === 0) return result;\n const message: CheckMessage = Object.freeze({\n code: \"input-rejected\",\n level: \"warning\",\n message: `${rejectedInputCount} selected functionMetrics input file(s) were rejected because their file type is unsupported; inspect this Check's Records and narrow files.include/exclude.`\n });\n return Object.freeze({\n ...result,\n messages: Object.freeze([...(result.messages ?? []), message])\n });\n}\n\nfunction directMeasurementFailure(\n measurement: Exclude<FunctionMeasurementResult, { kind: \"complete\" }>\n): CheckResult<FunctionMetricsFinalData> {\n switch (measurement.kind) {\n case \"cancelled\":\n return unavailable(\"cancelled\");\n case \"analysis-failed\":\n return unavailable(\"analysis-failed\");\n case \"resource-limit-exceeded\":\n return unavailable(\"resource-limit-exceeded\");\n case \"source-unavailable\":\n return unavailable(\"source-unavailable\");\n }\n}\n\nfunction unavailable(\n code: FunctionMetricsUnavailableReasonCode\n): CheckResult<FunctionMetricsFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code },\n messages: Object.freeze([\n Object.freeze({ code, level: \"error\" as const, message: unavailableMessage(code) })\n ])\n });\n}\n\nfunction unavailableMessage(code: FunctionMetricsUnavailableReasonCode): string {\n switch (code) {\n case \"invalid-options\":\n return \"functionMetrics options are invalid; recreate the Check with functionMetrics(options) or restore its complete resolved options.\";\n case \"cancelled\":\n return \"Function metrics was cancelled before it could form a complete result; inspect the caller's cancellation reason and retry if appropriate.\";\n case \"source-unavailable\":\n return \"Function metrics could not collect its configured project files; check the project root, file permissions, and selected file source.\";\n case \"analysis-failed\":\n return \"Function metrics analysis did not produce a complete trusted result; inspect the selected source and retry after correcting it.\";\n case \"resource-limit-exceeded\":\n return \"Function metrics input exceeds the per-file or aggregate analysis resource limit; narrow the selected files or reduce their size.\";\n }\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { presentCheckFindings } from "../../check/finding-presentation.mjs";
1
+ import { presentCheckFindings } from "../../package-tools/finding-presentation/finding-presentation.mjs";
2
2
  import { functionMetricsWaiverIdentity } from "./records.mjs";
3
3
  const PRESENTED_FINDING_LIMIT = 10;
4
4
  const PRESENTED_COMPLEXITY_CONTRIBUTOR_LIMIT = 8;
@@ -1 +1 @@
1
- {"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/finding-messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAK3E,OAAO,EACL,6BAA6B,EAI9B,MAAM,cAAc,CAAC;AAEtB,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,sCAAsC,GAAG,CAAC,CAAC;AAIjD,kFAAkF;AAClF,MAAM,UAAU,uBAAuB,CACrC,QAA6C;IAE7C,OAAO,oBAAoB,CAAC;QAC1B,QAAQ;QACR,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YACpB,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,OAAO,MAAM,CAAC,MAAM,CAAC;oBACnB,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAkB;oBACzB,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,iEAAiE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;iBACpH,CAAC,CAAC;YACL,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,OAAiB,CAAC,CAAC,CAAE,SAAmB;gBAChE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,gBAAgB,IAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,4BAA4B,CAAC,IAAI,CAAC,EAAE;aACzM,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,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;gBAC3E,CAAC,CAAE,OAAiB;gBACpB,CAAC,CAAE,SAAmB;YACxB,OAAO,EAAE,GAAG,YAAY,2GAA2G;SACpI,CAAC;KACL,CAAC,CAAC;AACL,CAAC;AAED,SAAS,4BAA4B,CAAC,IAAsC;IAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,uBAAuB,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS;QACtF,OAAO,EAAE,CAAC;IACZ,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC;IAC3F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,qBAAqB,GAAG,KAAK;SAChC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,KAAK,YAAY,WAAW,CAAC,IAAI,EAAE,CAAC;SACxE,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACvE,OAAO,YAAY,KAAK,CAAC;QACvB,CAAC,CAAC,6BAA6B,qBAAqB,GAAG;QACvD,CAAC,CAAC,6BAA6B,qBAAqB,KAAK,YAAY,wDAAwD,CAAC;AAClI,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,sBAAsB,CACpC,cAAoE;IAEpE,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAyB;IACtD,MAAM,QAAQ,GAAG,6BAA6B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrG,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,+BAA+B,OAAO,gBAAgB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;aACrF,CAAC,CAAC;QACL,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,kDAAkD,OAAO,kEAAkE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;aAC1J,CAAC,CAAC;QACL,KAAK,aAAa;YAChB,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,4BAA4B;gBAClC,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,kDAAkD,OAAO,YAAY,KAAK,CAAC,UAAU,+DAA+D,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;aACnL,CAAC,CAAC;IACP,CAAC;AACH,CAAC","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../check/finding-presentation.ts\";\nimport type {\n FindingWaiverAudit,\n FindingWaiverReconciliation\n} from \"../../finding-waivers/reconciliation.ts\";\nimport {\n functionMetricsWaiverIdentity,\n type FunctionInputRejectedCandidate,\n type FunctionMetricsFindingRecordData,\n type FunctionRecordCandidate\n} from \"./records.ts\";\n\nconst PRESENTED_FINDING_LIMIT = 10;\nconst PRESENTED_COMPLEXITY_CONTRIBUTOR_LIMIT = 8;\n\ntype FunctionFindingCandidate = FunctionRecordCandidate | FunctionInputRejectedCandidate;\n\n/** Projects metric and rejected-input Records into bounded terminal summaries. */\nexport function functionFindingMessages(\n findings: readonly FunctionFindingCandidate[]\n): readonly CheckMessage[] {\n return presentCheckFindings({\n findings,\n limit: PRESENTED_FINDING_LIMIT,\n message: ({ data }) => {\n if (\"kind\" in data) {\n return Object.freeze({\n code: \"finding-detail\",\n level: \"warning\" as const,\n message: `${data.path}: selected input is not supported by function metrics (areas: ${data.codeAreas.join(\", \")}).`\n });\n }\n return Object.freeze({\n code: \"finding-detail\",\n level: data.blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `${data.path}:${data.startLine} ${data.functionName}: ${data.metric} ${data.value} exceeds the ${data.limit} limit (areas: ${data.codeAreas.join(\", \")}).${complexityContributorMessage(data)}`\n });\n },\n omittedMessage: ({ omittedCount, omittedFindings }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: omittedFindings.some(({ data }) => !(\"kind\" in data) && data.blocking)\n ? (\"error\" as const)\n : (\"warning\" as const),\n message: `${omittedCount} additional function metric finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n\nfunction complexityContributorMessage(data: FunctionMetricsFindingRecordData): string {\n if (data.metric !== \"cyclomatic-complexity\" || data.complexityContributors === undefined)\n return \"\";\n const shown = data.complexityContributors.slice(0, PRESENTED_COMPLEXITY_CONTRIBUTOR_LIMIT);\n if (shown.length === 0) return \"\";\n const displayedContributors = shown\n .map((contributor) => `${contributor.token} at line ${contributor.line}`)\n .join(\", \");\n const omittedCount = data.complexityContributors.length - shown.length;\n return omittedCount === 0\n ? ` Complexity contributors: ${displayedContributors}.`\n : ` Complexity contributors: ${displayedContributors}; ${omittedCount} additional contributor(s) are in this finding Record.`;\n}\n\n/** 将每项 function-metrics waiver audit 投影为可行动的 terminal message。 */\nexport function functionWaiverMessages(\n reconciliation: FindingWaiverReconciliation<FunctionRecordCandidate>\n): readonly CheckMessage[] {\n return Object.freeze(reconciliation.waiverAudits.map(functionWaiverMessage));\n}\n\nfunction functionWaiverMessage(audit: FindingWaiverAudit): CheckMessage {\n const identity = functionMetricsWaiverIdentity(audit.waiver);\n const subject = `${identity.path}:${identity.startLine} ${identity.functionName} ${identity.metric}`;\n switch (audit.status) {\n case \"applied\":\n return Object.freeze({\n code: \"finding-waived\",\n level: \"info\",\n message: `Function metric finding for ${subject} was waived: ${audit.waiver.reason}`\n });\n case \"unused\":\n return Object.freeze({\n code: \"unused-finding-waiver\",\n level: \"warning\",\n message: `Configured function-metrics finding waiver for ${subject} matched no finding; remove it or update its identity. Reason: ${audit.waiver.reason}`\n });\n case \"overmatched\":\n return Object.freeze({\n code: \"overmatched-finding-waiver\",\n level: \"warning\",\n message: `Configured function-metrics finding waiver for ${subject} matched ${audit.matchCount} findings and was not applied; narrow its identity. Reason: ${audit.waiver.reason}`\n });\n }\n}\n"]}
1
+ {"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/finding-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../package-tools/finding-presentation/finding-presentation.ts\";\nimport type {\n FindingWaiverAudit,\n FindingWaiverReconciliation\n} from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport {\n functionMetricsWaiverIdentity,\n type FunctionInputRejectedCandidate,\n type FunctionMetricsFindingRecordData,\n type FunctionRecordCandidate\n} from \"./records.ts\";\n\nconst PRESENTED_FINDING_LIMIT = 10;\nconst PRESENTED_COMPLEXITY_CONTRIBUTOR_LIMIT = 8;\n\ntype FunctionFindingCandidate = FunctionRecordCandidate | FunctionInputRejectedCandidate;\n\n/** Projects metric and rejected-input Records into bounded terminal summaries. */\nexport function functionFindingMessages(\n findings: readonly FunctionFindingCandidate[]\n): readonly CheckMessage[] {\n return presentCheckFindings({\n findings,\n limit: PRESENTED_FINDING_LIMIT,\n message: ({ data }) => {\n if (\"kind\" in data) {\n return Object.freeze({\n code: \"finding-detail\",\n level: \"warning\" as const,\n message: `${data.path}: selected input is not supported by function metrics (areas: ${data.codeAreas.join(\", \")}).`\n });\n }\n return Object.freeze({\n code: \"finding-detail\",\n level: data.blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `${data.path}:${data.startLine} ${data.functionName}: ${data.metric} ${data.value} exceeds the ${data.limit} limit (areas: ${data.codeAreas.join(\", \")}).${complexityContributorMessage(data)}`\n });\n },\n omittedMessage: ({ omittedCount, omittedFindings }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: omittedFindings.some(({ data }) => !(\"kind\" in data) && data.blocking)\n ? (\"error\" as const)\n : (\"warning\" as const),\n message: `${omittedCount} additional function metric finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n\nfunction complexityContributorMessage(data: FunctionMetricsFindingRecordData): string {\n if (data.metric !== \"cyclomatic-complexity\" || data.complexityContributors === undefined)\n return \"\";\n const shown = data.complexityContributors.slice(0, PRESENTED_COMPLEXITY_CONTRIBUTOR_LIMIT);\n if (shown.length === 0) return \"\";\n const displayedContributors = shown\n .map((contributor) => `${contributor.token} at line ${contributor.line}`)\n .join(\", \");\n const omittedCount = data.complexityContributors.length - shown.length;\n return omittedCount === 0\n ? ` Complexity contributors: ${displayedContributors}.`\n : ` Complexity contributors: ${displayedContributors}; ${omittedCount} additional contributor(s) are in this finding Record.`;\n}\n\n/** 将每项 function-metrics waiver audit 投影为可行动的 terminal message。 */\nexport function functionWaiverMessages(\n reconciliation: FindingWaiverReconciliation<FunctionRecordCandidate>\n): readonly CheckMessage[] {\n return Object.freeze(reconciliation.waiverAudits.map(functionWaiverMessage));\n}\n\nfunction functionWaiverMessage(audit: FindingWaiverAudit): CheckMessage {\n const identity = functionMetricsWaiverIdentity(audit.waiver);\n const subject = `${identity.path}:${identity.startLine} ${identity.functionName} ${identity.metric}`;\n switch (audit.status) {\n case \"applied\":\n return Object.freeze({\n code: \"finding-waived\",\n level: \"info\",\n message: `Function metric finding for ${subject} was waived: ${audit.waiver.reason}`\n });\n case \"unused\":\n return Object.freeze({\n code: \"unused-finding-waiver\",\n level: \"warning\",\n message: `Configured function-metrics finding waiver for ${subject} matched no finding; remove it or update its identity. Reason: ${audit.waiver.reason}`\n });\n case \"overmatched\":\n return Object.freeze({\n code: \"overmatched-finding-waiver\",\n level: \"warning\",\n message: `Configured function-metrics finding waiver for ${subject} matched ${audit.matchCount} findings and was not applied; narrow its identity. Reason: ${audit.waiver.reason}`\n });\n }\n}\n"]}
@@ -80,7 +80,9 @@ async function readBoundedSource(absolutePath, aggregateBytes, signal, yieldAdmi
80
80
  }
81
81
  }
82
82
  function yieldAdmissionToTimer() {
83
- return new Promise((resolveYield) => setTimeout(resolveYield, 0));
83
+ return new Promise((resolveYield) => {
84
+ setTimeout(resolveYield, 0);
85
+ });
84
86
  }
85
87
  /**
86
88
  * Product-owned replacement for Lizard 1.24 `auto_open.auto_read` at the
@@ -1 +1 @@
1
- {"version":3,"file":"measurement.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/measurement.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, openSync, readSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport type { FunctionMetricsAnalysisWorkerRequest } from \"./analyzer-worker-contract.ts\";\nimport {\n analyzeAdmittedSources,\n createNodeFunctionMetricsWorker,\n type FunctionMetricsWorkerPort\n} from \"./analyzer-worker-port.ts\";\nimport type { FunctionMetric, FunctionMetricsExactInputSet } from \"./measurement-model.ts\";\n\nconst MAXIMUM_FILE_BYTES = 8 * 1024 * 1024;\nconst MAXIMUM_AGGREGATE_BYTES = 64 * 1024 * 1024;\nconst READ_CHUNK_BYTES = 32 * 1024;\n\nexport type FunctionMeasurementResult = Readonly<\n | { kind: \"analysis-failed\" }\n | { kind: \"cancelled\" }\n | { kind: \"complete\"; metrics: readonly FunctionMetric[] }\n | { kind: \"resource-limit-exceeded\" }\n | { kind: \"source-unavailable\" }\n>;\n\ninterface FunctionMeasurementInput {\n readonly input: FunctionMetricsExactInputSet;\n readonly signal: AbortSignal;\n}\n\nexport interface FunctionMeasurementDependencies {\n readonly createWorker: () => FunctionMetricsWorkerPort;\n readonly yieldAdmission: () => Promise<void>;\n}\n\nconst DEFAULT_FUNCTION_MEASUREMENT_DEPENDENCIES: FunctionMeasurementDependencies = Object.freeze({\n createWorker: createNodeFunctionMetricsWorker,\n yieldAdmission: yieldAdmissionToTimer\n});\n\n/**\n * The Check parent admits exactly its selected sources and bounds their bytes;\n * one Worker only analyzes those source texts and never discovers or reads paths.\n */\nexport async function measureFunctionMetrics(\n { input, signal }: FunctionMeasurementInput,\n dependencies: Partial<FunctionMeasurementDependencies> = {}\n): Promise<FunctionMeasurementResult> {\n const createWorker =\n dependencies.createWorker ?? DEFAULT_FUNCTION_MEASUREMENT_DEPENDENCIES.createWorker;\n const yieldAdmission =\n dependencies.yieldAdmission ?? DEFAULT_FUNCTION_MEASUREMENT_DEPENDENCIES.yieldAdmission;\n const admitted = await readExactFunctionSources(input, signal, yieldAdmission);\n if (admitted.kind !== \"complete\") return admitted;\n if (signal.aborted) return Object.freeze({ kind: \"cancelled\" });\n return analyzeAdmittedSources(admitted.request, input.approvedExactPaths, signal, createWorker);\n}\n\nasync function readExactFunctionSources(\n input: FunctionMetricsExactInputSet,\n signal: AbortSignal,\n yieldAdmission: () => Promise<void>\n): Promise<\n | Readonly<{ readonly kind: \"cancelled\" }>\n | Readonly<{ readonly kind: \"complete\"; readonly request: FunctionMetricsAnalysisWorkerRequest }>\n | Readonly<{ readonly kind: \"resource-limit-exceeded\" }>\n | Readonly<{ readonly kind: \"source-unavailable\" }>\n> {\n let aggregateBytes = 0;\n const files: FunctionMetricsAnalysisWorkerRequest[\"files\"][number][] = [];\n for (const path of input.approvedExactPaths) {\n if (signal.aborted) return Object.freeze({ kind: \"cancelled\" });\n const source = await readBoundedSource(\n resolve(input.rootDir, path),\n aggregateBytes,\n signal,\n yieldAdmission\n );\n if (source.kind !== \"complete\") return source;\n aggregateBytes += source.byteLength;\n files.push(Object.freeze({ path, source: source.source }));\n }\n return Object.freeze({\n kind: \"complete\",\n request: Object.freeze({ files: Object.freeze(files) })\n });\n}\n\nasync function readBoundedSource(\n absolutePath: string,\n aggregateBytes: number,\n signal: AbortSignal,\n yieldAdmission: () => Promise<void>\n): Promise<\n | Readonly<{ readonly kind: \"cancelled\" }>\n | Readonly<{ readonly kind: \"complete\"; readonly byteLength: number; readonly source: string }>\n | Readonly<{ readonly kind: \"resource-limit-exceeded\" }>\n | Readonly<{ readonly kind: \"source-unavailable\" }>\n> {\n let descriptor: number;\n try {\n descriptor = openSync(absolutePath, \"r\");\n } catch {\n return Object.freeze({ kind: \"source-unavailable\" });\n }\n try {\n const chunks: Buffer[] = [];\n const chunk = Buffer.allocUnsafe(READ_CHUNK_BYTES);\n let fileBytes = 0;\n while (true) {\n if (signal.aborted) return Object.freeze({ kind: \"cancelled\" });\n const bytesRead = readSync(descriptor, chunk, 0, chunk.length, null);\n if (bytesRead === 0) break;\n fileBytes += bytesRead;\n if (fileBytes > MAXIMUM_FILE_BYTES || aggregateBytes + fileBytes > MAXIMUM_AGGREGATE_BYTES) {\n return Object.freeze({ kind: \"resource-limit-exceeded\" });\n }\n chunks.push(Buffer.from(chunk.subarray(0, bytesRead)));\n if (signal.aborted) return Object.freeze({ kind: \"cancelled\" });\n await yieldAdmission();\n }\n return Object.freeze({\n kind: \"complete\",\n byteLength: fileBytes,\n source: decodeLizardAutoRead(Buffer.concat(chunks, fileBytes))\n });\n } catch {\n return Object.freeze({ kind: \"source-unavailable\" });\n } finally {\n closeSync(descriptor);\n }\n}\n\nfunction yieldAdmissionToTimer(): Promise<void> {\n return new Promise<void>((resolveYield) => setTimeout(resolveYield, 0));\n}\n\n/**\n * Product-owned replacement for Lizard 1.24 `auto_open.auto_read` at the\n * admitted-source boundary. A valid initial UTF-8 BOM is `utf-8-sig` and text\n * newlines are universal; a decoding failure retries the complete byte sequence\n * with Python's `errors=\"ignore\"`, which deliberately retains an initial BOM\n * and raw newlines on that retry.\n */\nexport function decodeLizardAutoRead(bytes: Uint8Array): string {\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes).replace(/\\r\\n?/gu, \"\\n\");\n } catch {\n return decodeUtf8IgnoringInvalidBytes(bytes);\n }\n}\n\nfunction decodeUtf8IgnoringInvalidBytes(bytes: Uint8Array): string {\n let decoded = \"\";\n for (let index = 0; index < bytes.length;) {\n const codePoint = decodeUtf8CodePoint(bytes, index);\n if (codePoint === undefined) {\n index += 1;\n continue;\n }\n decoded += String.fromCodePoint(codePoint);\n index += utf8SequenceByteLength(codePoint);\n }\n return decoded;\n}\n\nfunction decodeUtf8CodePoint(bytes: Uint8Array, index: number): number | undefined {\n const first = bytes[index];\n if (first === undefined) return undefined;\n if (first <= 0x7f) return first;\n if (first >= 0xc2 && first <= 0xdf) return decodeTwoByteUtf8Sequence(first, bytes[index + 1]);\n if (first >= 0xe0 && first <= 0xef) {\n return decodeThreeByteUtf8Sequence(first, bytes[index + 1], bytes[index + 2]);\n }\n if (first >= 0xf0 && first <= 0xf4) {\n return decodeFourByteUtf8Sequence(first, bytes[index + 1], bytes[index + 2], bytes[index + 3]);\n }\n return undefined;\n}\n\nfunction decodeTwoByteUtf8Sequence(first: number, second: number | undefined): number | undefined {\n if (!isUtf8Continuation(second)) return undefined;\n return ((first & 0x1f) << 6) | (second & 0x3f);\n}\n\nfunction decodeThreeByteUtf8Sequence(\n first: number,\n second: number | undefined,\n third: number | undefined\n): number | undefined {\n if (!isUtf8SecondByteForThreeByteSequence(first, second) || !isUtf8Continuation(third)) {\n return undefined;\n }\n return ((first & 0x0f) << 12) | ((second & 0x3f) << 6) | (third & 0x3f);\n}\n\nfunction decodeFourByteUtf8Sequence(\n first: number,\n second: number | undefined,\n third: number | undefined,\n fourth: number | undefined\n): number | undefined {\n if (\n !isUtf8SecondByteForFourByteSequence(first, second) ||\n !isUtf8Continuation(third) ||\n !isUtf8Continuation(fourth)\n ) {\n return undefined;\n }\n return ((first & 0x07) << 18) | ((second & 0x3f) << 12) | ((third & 0x3f) << 6) | (fourth & 0x3f);\n}\n\nfunction utf8SequenceByteLength(codePoint: number): number {\n if (codePoint <= 0x7f) return 1;\n if (codePoint <= 0x7ff) return 2;\n if (codePoint <= 0xffff) return 3;\n return 4;\n}\n\nfunction isUtf8Continuation(value: number | undefined): value is number {\n return value !== undefined && value >= 0x80 && value <= 0xbf;\n}\n\nfunction isUtf8SecondByteForThreeByteSequence(\n first: number,\n second: number | undefined\n): second is number {\n return (\n isUtf8Continuation(second) &&\n !(first === 0xe0 && second < 0xa0) &&\n !(first === 0xed && second > 0x9f)\n );\n}\n\nfunction isUtf8SecondByteForFourByteSequence(\n first: number,\n second: number | undefined\n): second is number {\n return (\n isUtf8Continuation(second) &&\n !(first === 0xf0 && second < 0x90) &&\n !(first === 0xf4 && second > 0x8f)\n );\n}\n"]}
1
+ {"version":3,"file":"measurement.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/measurement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EACL,sBAAsB,EACtB,+BAA+B,EAEhC,MAAM,2BAA2B,CAAC;AAGnC,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC3C,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACjD,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC;AAoBnC,MAAM,yCAAyC,GAAoC,MAAM,CAAC,MAAM,CAAC;IAC/F,YAAY,EAAE,+BAA+B;IAC7C,cAAc,EAAE,qBAAqB;CACtC,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAE,KAAK,EAAE,MAAM,EAA4B,EAC3C,YAAY,GAA6C,EAAE;IAE3D,MAAM,YAAY,GAChB,YAAY,CAAC,YAAY,IAAI,yCAAyC,CAAC,YAAY,CAAC;IACtF,MAAM,cAAc,GAClB,YAAY,CAAC,cAAc,IAAI,yCAAyC,CAAC,cAAc,CAAC;IAC1F,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/E,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAChE,OAAO,sBAAsB,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAClG,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,KAAmC,EACnC,MAAmB,EACnB,cAAmC;IAOnC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,KAAK,GAA4D,EAAE,CAAC;IAC1E,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,EAC5B,cAAc,EACd,MAAM,EACN,cAAc,CACf,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,MAAM,CAAC;QAC9C,cAAc,IAAI,MAAM,CAAC,UAAU,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;KACxD,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,YAAoB,EACpB,cAAsB,EACtB,MAAmB,EACnB,cAAmC;IAOnC,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QACnD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACrE,IAAI,SAAS,KAAK,CAAC;gBAAE,MAAM;YAC3B,SAAS,IAAI,SAAS,CAAC;YACvB,IAAI,SAAS,GAAG,kBAAkB,IAAI,cAAc,GAAG,SAAS,GAAG,uBAAuB,EAAE,CAAC;gBAC3F,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YAChE,MAAM,cAAc,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACvD,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,IAAI,OAAO,CAAO,CAAC,YAAY,EAAE,EAAE;QACxC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAiB;IACpD,IAAI,CAAC;QACH,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,8BAA8B,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAiB;IACvD,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC1C,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACpD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,OAAO,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC3C,KAAK,IAAI,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAiB,EAAE,KAAa;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9F,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QACnC,OAAO,2BAA2B,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QACnC,OAAO,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAa,EAAE,MAA0B;IAC1E,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,OAAO,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,2BAA2B,CAClC,KAAa,EACb,MAA0B,EAC1B,KAAyB;IAEzB,IAAI,CAAC,oCAAoC,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QACvF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAa,EACb,MAA0B,EAC1B,KAAyB,EACzB,MAA0B;IAE1B,IACE,CAAC,mCAAmC,CAAC,KAAK,EAAE,MAAM,CAAC;QACnD,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAC1B,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAC3B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAiB;IAC/C,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,SAAS,IAAI,KAAK;QAAE,OAAO,CAAC,CAAC;IACjC,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAyB;IACnD,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AAC/D,CAAC;AAED,SAAS,oCAAoC,CAC3C,KAAa,EACb,MAA0B;IAE1B,OAAO,CACL,kBAAkB,CAAC,MAAM,CAAC;QAC1B,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;QAClC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,mCAAmC,CAC1C,KAAa,EACb,MAA0B;IAE1B,OAAO,CACL,kBAAkB,CAAC,MAAM,CAAC;QAC1B,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;QAClC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,CACnC,CAAC;AACJ,CAAC","sourcesContent":["import { closeSync, openSync, readSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport type { FunctionMetricsAnalysisWorkerRequest } from \"./analyzer-worker-contract.ts\";\nimport {\n analyzeAdmittedSources,\n createNodeFunctionMetricsWorker,\n type FunctionMetricsWorkerPort\n} from \"./analyzer-worker-port.ts\";\nimport type { FunctionMetric, FunctionMetricsExactInputSet } from \"./measurement-model.ts\";\n\nconst MAXIMUM_FILE_BYTES = 8 * 1024 * 1024;\nconst MAXIMUM_AGGREGATE_BYTES = 64 * 1024 * 1024;\nconst READ_CHUNK_BYTES = 32 * 1024;\n\nexport type FunctionMeasurementResult = Readonly<\n | { kind: \"analysis-failed\" }\n | { kind: \"cancelled\" }\n | { kind: \"complete\"; metrics: readonly FunctionMetric[] }\n | { kind: \"resource-limit-exceeded\" }\n | { kind: \"source-unavailable\" }\n>;\n\ninterface FunctionMeasurementInput {\n readonly input: FunctionMetricsExactInputSet;\n readonly signal: AbortSignal;\n}\n\nexport interface FunctionMeasurementDependencies {\n readonly createWorker: () => FunctionMetricsWorkerPort;\n readonly yieldAdmission: () => Promise<void>;\n}\n\nconst DEFAULT_FUNCTION_MEASUREMENT_DEPENDENCIES: FunctionMeasurementDependencies = Object.freeze({\n createWorker: createNodeFunctionMetricsWorker,\n yieldAdmission: yieldAdmissionToTimer\n});\n\n/**\n * The Check parent admits exactly its selected sources and bounds their bytes;\n * one Worker only analyzes those source texts and never discovers or reads paths.\n */\nexport async function measureFunctionMetrics(\n { input, signal }: FunctionMeasurementInput,\n dependencies: Partial<FunctionMeasurementDependencies> = {}\n): Promise<FunctionMeasurementResult> {\n const createWorker =\n dependencies.createWorker ?? DEFAULT_FUNCTION_MEASUREMENT_DEPENDENCIES.createWorker;\n const yieldAdmission =\n dependencies.yieldAdmission ?? DEFAULT_FUNCTION_MEASUREMENT_DEPENDENCIES.yieldAdmission;\n const admitted = await readExactFunctionSources(input, signal, yieldAdmission);\n if (admitted.kind !== \"complete\") return admitted;\n if (signal.aborted) return Object.freeze({ kind: \"cancelled\" });\n return analyzeAdmittedSources(admitted.request, input.approvedExactPaths, signal, createWorker);\n}\n\nasync function readExactFunctionSources(\n input: FunctionMetricsExactInputSet,\n signal: AbortSignal,\n yieldAdmission: () => Promise<void>\n): Promise<\n | Readonly<{ readonly kind: \"cancelled\" }>\n | Readonly<{ readonly kind: \"complete\"; readonly request: FunctionMetricsAnalysisWorkerRequest }>\n | Readonly<{ readonly kind: \"resource-limit-exceeded\" }>\n | Readonly<{ readonly kind: \"source-unavailable\" }>\n> {\n let aggregateBytes = 0;\n const files: FunctionMetricsAnalysisWorkerRequest[\"files\"][number][] = [];\n for (const path of input.approvedExactPaths) {\n if (signal.aborted) return Object.freeze({ kind: \"cancelled\" });\n const source = await readBoundedSource(\n resolve(input.rootDir, path),\n aggregateBytes,\n signal,\n yieldAdmission\n );\n if (source.kind !== \"complete\") return source;\n aggregateBytes += source.byteLength;\n files.push(Object.freeze({ path, source: source.source }));\n }\n return Object.freeze({\n kind: \"complete\",\n request: Object.freeze({ files: Object.freeze(files) })\n });\n}\n\nasync function readBoundedSource(\n absolutePath: string,\n aggregateBytes: number,\n signal: AbortSignal,\n yieldAdmission: () => Promise<void>\n): Promise<\n | Readonly<{ readonly kind: \"cancelled\" }>\n | Readonly<{ readonly kind: \"complete\"; readonly byteLength: number; readonly source: string }>\n | Readonly<{ readonly kind: \"resource-limit-exceeded\" }>\n | Readonly<{ readonly kind: \"source-unavailable\" }>\n> {\n let descriptor: number;\n try {\n descriptor = openSync(absolutePath, \"r\");\n } catch {\n return Object.freeze({ kind: \"source-unavailable\" });\n }\n try {\n const chunks: Buffer[] = [];\n const chunk = Buffer.allocUnsafe(READ_CHUNK_BYTES);\n let fileBytes = 0;\n while (true) {\n if (signal.aborted) return Object.freeze({ kind: \"cancelled\" });\n const bytesRead = readSync(descriptor, chunk, 0, chunk.length, null);\n if (bytesRead === 0) break;\n fileBytes += bytesRead;\n if (fileBytes > MAXIMUM_FILE_BYTES || aggregateBytes + fileBytes > MAXIMUM_AGGREGATE_BYTES) {\n return Object.freeze({ kind: \"resource-limit-exceeded\" });\n }\n chunks.push(Buffer.from(chunk.subarray(0, bytesRead)));\n if (signal.aborted) return Object.freeze({ kind: \"cancelled\" });\n await yieldAdmission();\n }\n return Object.freeze({\n kind: \"complete\",\n byteLength: fileBytes,\n source: decodeLizardAutoRead(Buffer.concat(chunks, fileBytes))\n });\n } catch {\n return Object.freeze({ kind: \"source-unavailable\" });\n } finally {\n closeSync(descriptor);\n }\n}\n\nfunction yieldAdmissionToTimer(): Promise<void> {\n return new Promise<void>((resolveYield) => {\n setTimeout(resolveYield, 0);\n });\n}\n\n/**\n * Product-owned replacement for Lizard 1.24 `auto_open.auto_read` at the\n * admitted-source boundary. A valid initial UTF-8 BOM is `utf-8-sig` and text\n * newlines are universal; a decoding failure retries the complete byte sequence\n * with Python's `errors=\"ignore\"`, which deliberately retains an initial BOM\n * and raw newlines on that retry.\n */\nexport function decodeLizardAutoRead(bytes: Uint8Array): string {\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes).replace(/\\r\\n?/gu, \"\\n\");\n } catch {\n return decodeUtf8IgnoringInvalidBytes(bytes);\n }\n}\n\nfunction decodeUtf8IgnoringInvalidBytes(bytes: Uint8Array): string {\n let decoded = \"\";\n for (let index = 0; index < bytes.length;) {\n const codePoint = decodeUtf8CodePoint(bytes, index);\n if (codePoint === undefined) {\n index += 1;\n continue;\n }\n decoded += String.fromCodePoint(codePoint);\n index += utf8SequenceByteLength(codePoint);\n }\n return decoded;\n}\n\nfunction decodeUtf8CodePoint(bytes: Uint8Array, index: number): number | undefined {\n const first = bytes[index];\n if (first === undefined) return undefined;\n if (first <= 0x7f) return first;\n if (first >= 0xc2 && first <= 0xdf) return decodeTwoByteUtf8Sequence(first, bytes[index + 1]);\n if (first >= 0xe0 && first <= 0xef) {\n return decodeThreeByteUtf8Sequence(first, bytes[index + 1], bytes[index + 2]);\n }\n if (first >= 0xf0 && first <= 0xf4) {\n return decodeFourByteUtf8Sequence(first, bytes[index + 1], bytes[index + 2], bytes[index + 3]);\n }\n return undefined;\n}\n\nfunction decodeTwoByteUtf8Sequence(first: number, second: number | undefined): number | undefined {\n if (!isUtf8Continuation(second)) return undefined;\n return ((first & 0x1f) << 6) | (second & 0x3f);\n}\n\nfunction decodeThreeByteUtf8Sequence(\n first: number,\n second: number | undefined,\n third: number | undefined\n): number | undefined {\n if (!isUtf8SecondByteForThreeByteSequence(first, second) || !isUtf8Continuation(third)) {\n return undefined;\n }\n return ((first & 0x0f) << 12) | ((second & 0x3f) << 6) | (third & 0x3f);\n}\n\nfunction decodeFourByteUtf8Sequence(\n first: number,\n second: number | undefined,\n third: number | undefined,\n fourth: number | undefined\n): number | undefined {\n if (\n !isUtf8SecondByteForFourByteSequence(first, second) ||\n !isUtf8Continuation(third) ||\n !isUtf8Continuation(fourth)\n ) {\n return undefined;\n }\n return ((first & 0x07) << 18) | ((second & 0x3f) << 12) | ((third & 0x3f) << 6) | (fourth & 0x3f);\n}\n\nfunction utf8SequenceByteLength(codePoint: number): number {\n if (codePoint <= 0x7f) return 1;\n if (codePoint <= 0x7ff) return 2;\n if (codePoint <= 0xffff) return 3;\n return 4;\n}\n\nfunction isUtf8Continuation(value: number | undefined): value is number {\n return value !== undefined && value >= 0x80 && value <= 0xbf;\n}\n\nfunction isUtf8SecondByteForThreeByteSequence(\n first: number,\n second: number | undefined\n): second is number {\n return (\n isUtf8Continuation(second) &&\n !(first === 0xe0 && second < 0xa0) &&\n !(first === 0xed && second > 0x9f)\n );\n}\n\nfunction isUtf8SecondByteForFourByteSequence(\n first: number,\n second: number | undefined\n): second is number {\n return (\n isUtf8Continuation(second) &&\n !(first === 0xf0 && second < 0x90) &&\n !(first === 0xf4 && second > 0x8f)\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/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\";\nimport type { FindingWaiver } from \"../../finding-waivers/reconciliation.ts\";\n\n/** `functionMetrics` 构造函数可省略的文件选择策略。 */\nexport type FunctionMetricsFileOptions = ProjectFileSelectionOptions;\n\n/** `functionMetrics` 构造函数可省略的函数指标上限。 */\nexport interface FunctionMetricsLimitOptions {\n readonly codeLines?: Readonly<{\n /** 省略时为 `60`;函数 NLOC 超过此值时产生 finding。 */\n readonly maximum?: number;\n readonly lowComplexityAllowance?: Readonly<{\n /** 省略时为 `6`;复杂度小于此值时可使用较高 NLOC 上限。 */\n readonly cyclomaticComplexityBelow?: number;\n /** 省略时为 `180`;不得小于普通代码行上限。 */\n readonly maximum?: number;\n }>;\n }>;\n readonly cyclomaticComplexity?: Readonly<{\n /** 省略时为 `12`。 */\n readonly maximum?: number;\n }>;\n readonly nestingDepth?: Readonly<{\n /** 省略时为 `7`。 */\n readonly maximum?: number;\n }>;\n readonly parameters?: Readonly<{\n /** 省略时为 `6`。 */\n readonly maximum?: number;\n }>;\n}\n\n/** 可独立选择文件、指标上限和 finding policy 的 function-metrics 区域。 */\nexport interface FunctionMetricsCodeAreaOptions {\n /** 显式区域必须声明本字段;其中各子字段可省略并使用 package 默认值。 */\n readonly files: FunctionMetricsFileOptions;\n /** 省略时继承顶层 `findingPolicy`。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略的嵌套上限使用 package 默认值。 */\n readonly limits?: FunctionMetricsLimitOptions;\n}\n\n/** function-metrics 可形成 Finding 的封闭 metric 名称。 */\nexport type FunctionMetricsFindingMetric =\n | \"cyclomatic-complexity\"\n | \"function-code-density\"\n | \"nesting-depth\"\n | \"parameter-count\";\n\n/** function-metrics 用于精确识别一条可豁免 metric finding 的稳定字段。 */\nexport interface FunctionMetricsFindingIdentity {\n readonly functionName: string;\n readonly metric: FunctionMetricsFindingMetric;\n /** 已 normalized 的 project-root-relative slash path。 */\n readonly path: string;\n /** 该次 finding 中函数起始位置的一基行号;位置变化会让旧 waiver 进入 unused audit。 */\n readonly startLine: number;\n}\n\n/** 一项 function-metrics metric finding 的声明式豁免。 */\nexport type FunctionMetricsFindingWaiver = FindingWaiver<FunctionMetricsFindingIdentity>;\n\n/** `functionMetrics(options?)` 接受并补齐默认值的公开策略。 */\nexport interface FunctionMetricsOptions {\n /** 省略时建立默认 `project` 区域;显式映射必须非空,且每个区域必须声明 `files`。 */\n readonly codeAreas?: Readonly<Record<string, FunctionMetricsCodeAreaOptions>>;\n /** 省略时为 `non-blocking`;区域可局部覆盖。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时没有豁免;只匹配 normal metric finding,不匹配 input rejection。 */\n readonly findingWaivers?: readonly FunctionMetricsFindingWaiver[];\n}\n\n/** 构造函数生成并由 Check preflight/execution 消费的完整 options。 */\nexport interface ResolvedFunctionMetricsOptions {\n readonly codeAreas: Readonly<Record<string, ResolvedFunctionMetricsCodeAreaOptions>>;\n readonly findingWaivers: readonly FunctionMetricsFindingWaiver[];\n}\n\nexport interface ResolvedFunctionMetricsCodeAreaOptions {\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n readonly limits: ResolvedFunctionMetricsLimits;\n}\n\nexport interface ResolvedFunctionMetricsLimits {\n readonly codeLines: Readonly<{\n readonly maximum: number;\n readonly lowComplexityAllowance: Readonly<{\n readonly cyclomaticComplexityBelow: number;\n readonly maximum: number;\n }>;\n }>;\n readonly cyclomaticComplexity: Readonly<{ readonly maximum: number }>;\n readonly nestingDepth: Readonly<{ readonly maximum: number }>;\n readonly parameters: Readonly<{ readonly maximum: number }>;\n}\n"]}
1
+ {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/options.ts"],"names":[],"mappings":"","sourcesContent":["import type { PackageCheckAuthoringOptions } from \"../check-authoring.ts\";\nimport type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { FindingWaiver } from \"../../package-tools/finding-waivers/reconciliation.ts\";\n\n/** `functionMetrics` 构造函数可省略的文件选择策略。 */\nexport type FunctionMetricsFileOptions = ProjectFileSelectionOptions;\n\n/** `functionMetrics` 构造函数可省略的函数指标上限。 */\nexport interface FunctionMetricsLimitOptions {\n readonly codeLines?: Readonly<{\n /** 省略时为 `60`;函数 NLOC 超过此值时产生 finding。 */\n readonly maximum?: number;\n readonly lowComplexityAllowance?: Readonly<{\n /** 省略时为 `6`;复杂度小于此值时可使用较高 NLOC 上限。 */\n readonly cyclomaticComplexityBelow?: number;\n /** 省略时为 `180`;不得小于普通代码行上限。 */\n readonly maximum?: number;\n }>;\n }>;\n readonly cyclomaticComplexity?: Readonly<{\n /** 省略时为 `12`。 */\n readonly maximum?: number;\n }>;\n readonly nestingDepth?: Readonly<{\n /** 省略时为 `7`。 */\n readonly maximum?: number;\n }>;\n readonly parameters?: Readonly<{\n /** 省略时为 `6`。 */\n readonly maximum?: number;\n }>;\n}\n\n/** 可独立选择文件、指标上限和 finding policy 的 function-metrics 区域。 */\nexport interface FunctionMetricsCodeAreaOptions {\n /** 显式区域必须声明本字段;其中各子字段可省略并使用 package 默认值。 */\n readonly files: FunctionMetricsFileOptions;\n /** 省略时继承顶层 `findingPolicy`。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略的嵌套上限使用 package 默认值。 */\n readonly limits?: FunctionMetricsLimitOptions;\n}\n\n/** function-metrics 可形成 Finding 的封闭 metric 名称。 */\nexport type FunctionMetricsFindingMetric =\n | \"cyclomatic-complexity\"\n | \"function-code-density\"\n | \"nesting-depth\"\n | \"parameter-count\";\n\n/** function-metrics 用于精确识别一条可豁免 metric finding 的稳定字段。 */\nexport interface FunctionMetricsFindingIdentity {\n readonly functionName: string;\n readonly metric: FunctionMetricsFindingMetric;\n /** 已 normalized 的 project-root-relative slash path。 */\n readonly path: string;\n /** 该次 finding 中函数起始位置的一基行号;位置变化会让旧 waiver 进入 unused audit。 */\n readonly startLine: number;\n}\n\n/** 一项 function-metrics metric finding 的声明式豁免。 */\nexport type FunctionMetricsFindingWaiver = FindingWaiver<FunctionMetricsFindingIdentity>;\n\n/** `functionMetrics(options?)` 接受并补齐默认值的公开策略。 */\nexport interface FunctionMetricsOptions<\n Id extends string = string\n> extends PackageCheckAuthoringOptions<Id> {\n /** 省略时建立默认 `project` 区域;显式映射必须非空,且每个区域必须声明 `files`。 */\n readonly codeAreas?: Readonly<Record<string, FunctionMetricsCodeAreaOptions>>;\n /** 省略时为 `non-blocking`;区域可局部覆盖。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时没有豁免;只匹配 normal metric finding,不匹配 input rejection。 */\n readonly findingWaivers?: readonly FunctionMetricsFindingWaiver[];\n}\n\n/** 构造函数生成并由 Check preparation/execution 消费的完整 options。 */\nexport interface ResolvedFunctionMetricsOptions {\n readonly codeAreas: Readonly<Record<string, ResolvedFunctionMetricsCodeAreaOptions>>;\n readonly findingWaivers: readonly FunctionMetricsFindingWaiver[];\n}\n\nexport interface ResolvedFunctionMetricsCodeAreaOptions {\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n readonly limits: ResolvedFunctionMetricsLimits;\n}\n\nexport interface ResolvedFunctionMetricsLimits {\n readonly codeLines: Readonly<{\n readonly maximum: number;\n readonly lowComplexityAllowance: Readonly<{\n readonly cyclomaticComplexityBelow: number;\n readonly maximum: number;\n }>;\n }>;\n readonly cyclomaticComplexity: Readonly<{ readonly maximum: number }>;\n readonly nestingDepth: Readonly<{ readonly maximum: number }>;\n readonly parameters: Readonly<{ readonly maximum: number }>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"records.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/records.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isStableFunctionName,\n type FunctionMetricAnalysis,\n type FunctionMetricInstance\n} from \"./analysis.ts\";\nimport type { MaterializedFindingWaiver } from \"../../finding-waivers/reconciliation.ts\";\nimport { isBlockingFinding } from \"../code-quality-findings/policy.ts\";\nimport {\n buildHashedFindingWaiverAuditRecord,\n type FindingWaiverAuditRecordData,\n type FindingWaiverRecordAudit\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport type { FunctionMetric, FunctionMetricsAreaInput } from \"./measurement-model.ts\";\nimport type {\n FunctionMetricsFindingIdentity,\n FunctionMetricsFindingMetric,\n ResolvedFunctionMetricsLimits\n} from \"./options.ts\";\nimport { resolveFunctionMetricsFindingIdentity } from \"./finding-waiver-identity.ts\";\n\nconst INPUT_REJECTED_RECORD_ID_PREFIX = \"/input-rejected/\";\n/** 一条超出函数 metric 上限的 supplemental Record data。 */\nexport type FunctionMetricsFindingRecordData = Readonly<{\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n /** Complete source-ordered CCN contributors; present only for CCN findings. */\n readonly complexityContributors?: readonly Readonly<{\n readonly line: number;\n readonly token: string;\n }>[];\n readonly functionName: string;\n readonly limit: number;\n readonly metric: FunctionMetricsFindingMetric;\n readonly path: string;\n readonly startLine: number;\n readonly value: number;\n /** 精确匹配 waiver 时保留理由,并令该 finding 不再参与 actionable settlement。 */\n readonly waiver?: Readonly<{ readonly reason: string }>;\n}>;\n\n/** 未使用或过宽 function-metrics waiver 的 supplemental audit Record data。 */\nexport type FunctionMetricsFindingWaiverAuditRecordData =\n FindingWaiverAuditRecordData<FunctionMetricsFindingIdentity>;\n\n/** 一条已被 files policy 选中、但不受 functionMetrics 支持的输入 Finding。 */\nexport type FunctionMetricsInputRejectedRecordData = Readonly<{\n readonly blocking: false;\n readonly codeAreas: readonly string[];\n readonly kind: \"input-rejected\";\n readonly path: string;\n readonly reason: \"unsupported-file-type\";\n}>;\n\n/** functionMetrics 发布的 metric、input-rejection 或 finding-waiver audit Record data。 */\nexport type FunctionMetricsRecordData =\n | FunctionMetricsFindingRecordData\n | FunctionMetricsInputRejectedRecordData\n | FunctionMetricsFindingWaiverAuditRecordData;\n\nexport interface FunctionRecordCandidate {\n readonly data: FunctionMetricsFindingRecordData;\n readonly id: string;\n}\n\nexport interface FunctionInputRejectedCandidate {\n readonly data: FunctionMetricsInputRejectedRecordData;\n readonly id: string;\n}\n\n/** 为每个 rejected path 构造一条 area-aware、固定 non-blocking 的 Finding。 */\nexport function buildFunctionInputRejectedCandidates(\n codeAreasByPath: ReadonlyMap<string, readonly string[]>\n): readonly FunctionInputRejectedCandidate[] {\n return Object.freeze(\n [...codeAreasByPath]\n .sort(([left], [right]) => compareText(left, right))\n .map(([path, codeAreas]) =>\n Object.freeze({\n data: Object.freeze({\n blocking: false as const,\n codeAreas: Object.freeze(uniqueSorted(codeAreas)),\n kind: \"input-rejected\" as const,\n path,\n reason: \"unsupported-file-type\" as const\n }),\n id: `${INPUT_REJECTED_RECORD_ID_PREFIX}${path}`\n })\n )\n );\n}\n\ntype MatchingFunctionMetricAreas = readonly [\n FunctionMetricsAreaInput,\n ...FunctionMetricsAreaInput[]\n];\n\ninterface FunctionPolicyContext {\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n readonly functionName: string;\n}\n\ninterface FunctionMetricEvaluation {\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n readonly complexityContributors?: FunctionMetric[\"complexityContributors\"];\n readonly functionName: string;\n readonly limit: number;\n readonly metric: FunctionMetricsFindingMetric;\n readonly path: string;\n readonly startLine: number;\n readonly subject: string;\n readonly value: number;\n}\n\nexport function functionMetricsFindingIdentity(\n candidate: FunctionRecordCandidate\n): FunctionMetricsFindingIdentity {\n const { functionName, metric, path, startLine } = candidate.data;\n return Object.freeze({ functionName, metric, path, startLine });\n}\n\nexport function functionMetricsWaiverIdentity(\n waiver: MaterializedFindingWaiver\n): FunctionMetricsFindingIdentity {\n const identity = resolveFunctionMetricsFindingIdentity(waiver.identity);\n if (identity === undefined) {\n throw new TypeError(\"functionMetrics waiver identity must retain a valid metric subject\");\n }\n return identity;\n}\n\n/** 为一项未使用或过宽 waiver 构造 Check-owned audit Record。 */\nexport function functionMetricsWaiverAuditRecord(audit: FindingWaiverRecordAudit): Readonly<{\n readonly data: FunctionMetricsFindingWaiverAuditRecordData;\n readonly id: string;\n}> {\n const identity = functionMetricsWaiverIdentity(audit.waiver);\n return buildHashedFindingWaiverAuditRecord(identity, audit);\n}\n\n/** 为每个超过 matching-area 最严格阈值的 metric 构造 supplemental fact。 */\nexport function buildFunctionRecordCandidates(\n analysis: FunctionMetricAnalysis,\n areas: readonly FunctionMetricsAreaInput[]\n): readonly FunctionRecordCandidate[] | undefined {\n const areasByPath = indexAreasByPath(areas);\n const candidates: FunctionRecordCandidate[] = [];\n for (const instance of analysis.instances) {\n const [firstArea, ...remainingAreas] = areasByPath.get(instance.metric.file) ?? [];\n if (firstArea === undefined) return undefined;\n const matchingAreas = [firstArea, ...remainingAreas] as const;\n const policyContext = resolveFunctionPolicyContext(instance, matchingAreas);\n for (const evaluation of metricEvaluations(instance, policyContext, matchingAreas)) {\n appendFindingCandidate(candidates, evaluation);\n }\n }\n candidates.sort((left, right) => compareText(left.id, right.id));\n return Object.freeze(candidates);\n}\n\nfunction indexAreasByPath(\n areas: readonly FunctionMetricsAreaInput[]\n): ReadonlyMap<string, readonly FunctionMetricsAreaInput[]> {\n const mutableAreas = new Map<string, FunctionMetricsAreaInput[]>();\n for (const area of areas) {\n for (const path of area.approvedExactPaths) {\n const matchingAreas = mutableAreas.get(path) ?? [];\n matchingAreas.push(area);\n mutableAreas.set(path, matchingAreas);\n }\n }\n return new Map(\n Array.from(mutableAreas, ([path, matchingAreas]) => [path, Object.freeze(matchingAreas)])\n );\n}\n\nfunction resolveFunctionPolicyContext(\n instance: FunctionMetricInstance,\n matchingAreas: MatchingFunctionMetricAreas\n): Readonly<FunctionPolicyContext> {\n return Object.freeze({\n blocking: isBlockingFinding(matchingAreas.map((area) => area.findingPolicy)),\n codeAreas: Object.freeze(uniqueSorted(matchingAreas.map((area) => area.codeArea))),\n functionName: isStableFunctionName(instance.metric.name) ? instance.metric.name : \"<anonymous>\"\n });\n}\n\nfunction metricEvaluations(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext,\n matchingAreas: MatchingFunctionMetricAreas\n): FunctionMetricEvaluation[] {\n const evaluations: FunctionMetricEvaluation[] = [];\n const complexityEvaluation = complexityMetricEvaluation(instance, policyContext, matchingAreas);\n if (complexityEvaluation !== null) evaluations.push(complexityEvaluation);\n evaluations.push(\n codeLinesMetricEvaluation(instance, policyContext, matchingAreas),\n nestingDepthMetricEvaluation(instance, policyContext, matchingAreas),\n parameterMetricEvaluation(instance, policyContext, matchingAreas)\n );\n return evaluations;\n}\n\nfunction sharedMetricEvaluation(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext\n) {\n return {\n blocking: policyContext.blocking,\n codeAreas: policyContext.codeAreas,\n functionName: policyContext.functionName,\n path: instance.metric.file,\n startLine: instance.metric.startLine,\n subject: instance.semanticSubject\n } as const;\n}\n\nfunction complexityMetricEvaluation(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext,\n matchingAreas: MatchingFunctionMetricAreas\n): FunctionMetricEvaluation | null {\n const value = instance.metric.cyclomaticComplexity.value;\n if (value === null) return null;\n return {\n ...sharedMetricEvaluation(instance, policyContext),\n complexityContributors: instance.metric.complexityContributors,\n limit: Math.min(...matchingAreas.map((area) => area.limits.cyclomaticComplexity.maximum)),\n metric: \"cyclomatic-complexity\",\n value\n };\n}\n\nfunction nestingDepthMetricEvaluation(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext,\n matchingAreas: MatchingFunctionMetricAreas\n): FunctionMetricEvaluation {\n return {\n ...sharedMetricEvaluation(instance, policyContext),\n limit: Math.min(...matchingAreas.map((area) => area.limits.nestingDepth.maximum)),\n metric: \"nesting-depth\",\n value: instance.metric.nestingDepth.value\n };\n}\n\nfunction codeLinesMetricEvaluation(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext,\n matchingAreas: MatchingFunctionMetricAreas\n): FunctionMetricEvaluation {\n return {\n ...sharedMetricEvaluation(instance, policyContext),\n limit: Math.min(\n ...matchingAreas.map((area) => functionCodeLineMaximum(instance.metric, area.limits))\n ),\n metric: \"function-code-density\",\n value: instance.metric.lines\n };\n}\n\nfunction parameterMetricEvaluation(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext,\n matchingAreas: MatchingFunctionMetricAreas\n): FunctionMetricEvaluation {\n return {\n ...sharedMetricEvaluation(instance, policyContext),\n limit: Math.min(...matchingAreas.map((area) => area.limits.parameters.maximum)),\n metric: \"parameter-count\",\n value: instance.metric.parameterCount\n };\n}\n\nfunction appendFindingCandidate(\n candidates: FunctionRecordCandidate[],\n evaluation: FunctionMetricEvaluation\n): void {\n if (evaluation.value <= evaluation.limit) return;\n candidates.push(\n Object.freeze({\n id: `${evaluation.subject}:${evaluation.metric}`,\n data: Object.freeze({\n blocking: evaluation.blocking,\n codeAreas: evaluation.codeAreas,\n ...(evaluation.complexityContributors === undefined\n ? {}\n : { complexityContributors: evaluation.complexityContributors }),\n functionName: evaluation.functionName,\n limit: evaluation.limit,\n metric: evaluation.metric,\n path: evaluation.path,\n startLine: evaluation.startLine,\n value: evaluation.value\n })\n })\n );\n}\n\nfunction functionCodeLineMaximum(\n metric: FunctionMetric,\n limits: ResolvedFunctionMetricsLimits\n): number {\n const allowance = limits.codeLines.lowComplexityAllowance;\n const complexity = metric.cyclomaticComplexity.value;\n return complexity !== null && complexity < allowance.cyclomaticComplexityBelow\n ? allowance.maximum\n : limits.codeLines.maximum;\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
1
+ {"version":3,"file":"records.mjs","sourceRoot":"","sources":["../../../../src/package-checks/function-metrics/records.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isStableFunctionName,\n type FunctionMetricAnalysis,\n type FunctionMetricInstance\n} from \"./analysis.ts\";\nimport type { MaterializedFindingWaiver } from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport { isBlockingFinding } from \"../code-quality-findings/policy.ts\";\nimport {\n buildHashedFindingWaiverAuditRecord,\n type FindingWaiverAuditRecordData,\n type FindingWaiverRecordAudit\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport type { FunctionMetric, FunctionMetricsAreaInput } from \"./measurement-model.ts\";\nimport type {\n FunctionMetricsFindingIdentity,\n FunctionMetricsFindingMetric,\n ResolvedFunctionMetricsLimits\n} from \"./options.ts\";\nimport { resolveFunctionMetricsFindingIdentity } from \"./finding-waiver-identity.ts\";\n\nconst INPUT_REJECTED_RECORD_ID_PREFIX = \"/input-rejected/\";\n/** 一条超出函数 metric 上限的 supplemental Record data。 */\nexport type FunctionMetricsFindingRecordData = Readonly<{\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n /** Complete source-ordered CCN contributors; present only for CCN findings. */\n readonly complexityContributors?: readonly Readonly<{\n readonly line: number;\n readonly token: string;\n }>[];\n readonly functionName: string;\n readonly limit: number;\n readonly metric: FunctionMetricsFindingMetric;\n readonly path: string;\n readonly startLine: number;\n readonly value: number;\n /** 精确匹配 waiver 时保留理由,并令该 finding 不再参与 actionable settlement。 */\n readonly waiver?: Readonly<{ readonly reason: string }>;\n}>;\n\n/** 未使用或过宽 function-metrics waiver 的 supplemental audit Record data。 */\nexport type FunctionMetricsFindingWaiverAuditRecordData =\n FindingWaiverAuditRecordData<FunctionMetricsFindingIdentity>;\n\n/** 一条已被 files policy 选中、但不受 functionMetrics 支持的输入 Finding。 */\nexport type FunctionMetricsInputRejectedRecordData = Readonly<{\n readonly blocking: false;\n readonly codeAreas: readonly string[];\n readonly kind: \"input-rejected\";\n readonly path: string;\n readonly reason: \"unsupported-file-type\";\n}>;\n\n/** functionMetrics 发布的 metric、input-rejection 或 finding-waiver audit Record data。 */\nexport type FunctionMetricsRecordData =\n | FunctionMetricsFindingRecordData\n | FunctionMetricsInputRejectedRecordData\n | FunctionMetricsFindingWaiverAuditRecordData;\n\nexport interface FunctionRecordCandidate {\n readonly data: FunctionMetricsFindingRecordData;\n readonly id: string;\n}\n\nexport interface FunctionInputRejectedCandidate {\n readonly data: FunctionMetricsInputRejectedRecordData;\n readonly id: string;\n}\n\n/** 为每个 rejected path 构造一条 area-aware、固定 non-blocking 的 Finding。 */\nexport function buildFunctionInputRejectedCandidates(\n codeAreasByPath: ReadonlyMap<string, readonly string[]>\n): readonly FunctionInputRejectedCandidate[] {\n return Object.freeze(\n [...codeAreasByPath]\n .sort(([left], [right]) => compareText(left, right))\n .map(([path, codeAreas]) =>\n Object.freeze({\n data: Object.freeze({\n blocking: false as const,\n codeAreas: Object.freeze(uniqueSorted(codeAreas)),\n kind: \"input-rejected\" as const,\n path,\n reason: \"unsupported-file-type\" as const\n }),\n id: `${INPUT_REJECTED_RECORD_ID_PREFIX}${path}`\n })\n )\n );\n}\n\ntype MatchingFunctionMetricAreas = readonly [\n FunctionMetricsAreaInput,\n ...FunctionMetricsAreaInput[]\n];\n\ninterface FunctionPolicyContext {\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n readonly functionName: string;\n}\n\ninterface FunctionMetricEvaluation {\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n readonly complexityContributors?: FunctionMetric[\"complexityContributors\"];\n readonly functionName: string;\n readonly limit: number;\n readonly metric: FunctionMetricsFindingMetric;\n readonly path: string;\n readonly startLine: number;\n readonly subject: string;\n readonly value: number;\n}\n\nexport function functionMetricsFindingIdentity(\n candidate: FunctionRecordCandidate\n): FunctionMetricsFindingIdentity {\n const { functionName, metric, path, startLine } = candidate.data;\n return Object.freeze({ functionName, metric, path, startLine });\n}\n\nexport function functionMetricsWaiverIdentity(\n waiver: MaterializedFindingWaiver\n): FunctionMetricsFindingIdentity {\n const identity = resolveFunctionMetricsFindingIdentity(waiver.identity);\n if (identity === undefined) {\n throw new TypeError(\"functionMetrics waiver identity must retain a valid metric subject\");\n }\n return identity;\n}\n\n/** 为一项未使用或过宽 waiver 构造 Check-owned audit Record。 */\nexport function functionMetricsWaiverAuditRecord(audit: FindingWaiverRecordAudit): Readonly<{\n readonly data: FunctionMetricsFindingWaiverAuditRecordData;\n readonly id: string;\n}> {\n const identity = functionMetricsWaiverIdentity(audit.waiver);\n return buildHashedFindingWaiverAuditRecord(identity, audit);\n}\n\n/** 为每个超过 matching-area 最严格阈值的 metric 构造 supplemental fact。 */\nexport function buildFunctionRecordCandidates(\n analysis: FunctionMetricAnalysis,\n areas: readonly FunctionMetricsAreaInput[]\n): readonly FunctionRecordCandidate[] | undefined {\n const areasByPath = indexAreasByPath(areas);\n const candidates: FunctionRecordCandidate[] = [];\n for (const instance of analysis.instances) {\n const [firstArea, ...remainingAreas] = areasByPath.get(instance.metric.file) ?? [];\n if (firstArea === undefined) return undefined;\n const matchingAreas = [firstArea, ...remainingAreas] as const;\n const policyContext = resolveFunctionPolicyContext(instance, matchingAreas);\n for (const evaluation of metricEvaluations(instance, policyContext, matchingAreas)) {\n appendFindingCandidate(candidates, evaluation);\n }\n }\n candidates.sort((left, right) => compareText(left.id, right.id));\n return Object.freeze(candidates);\n}\n\nfunction indexAreasByPath(\n areas: readonly FunctionMetricsAreaInput[]\n): ReadonlyMap<string, readonly FunctionMetricsAreaInput[]> {\n const mutableAreas = new Map<string, FunctionMetricsAreaInput[]>();\n for (const area of areas) {\n for (const path of area.approvedExactPaths) {\n const matchingAreas = mutableAreas.get(path) ?? [];\n matchingAreas.push(area);\n mutableAreas.set(path, matchingAreas);\n }\n }\n return new Map(\n Array.from(mutableAreas, ([path, matchingAreas]) => [path, Object.freeze(matchingAreas)])\n );\n}\n\nfunction resolveFunctionPolicyContext(\n instance: FunctionMetricInstance,\n matchingAreas: MatchingFunctionMetricAreas\n): Readonly<FunctionPolicyContext> {\n return Object.freeze({\n blocking: isBlockingFinding(matchingAreas.map((area) => area.findingPolicy)),\n codeAreas: Object.freeze(uniqueSorted(matchingAreas.map((area) => area.codeArea))),\n functionName: isStableFunctionName(instance.metric.name) ? instance.metric.name : \"<anonymous>\"\n });\n}\n\nfunction metricEvaluations(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext,\n matchingAreas: MatchingFunctionMetricAreas\n): FunctionMetricEvaluation[] {\n const evaluations: FunctionMetricEvaluation[] = [];\n const complexityEvaluation = complexityMetricEvaluation(instance, policyContext, matchingAreas);\n if (complexityEvaluation !== null) evaluations.push(complexityEvaluation);\n evaluations.push(\n codeLinesMetricEvaluation(instance, policyContext, matchingAreas),\n nestingDepthMetricEvaluation(instance, policyContext, matchingAreas),\n parameterMetricEvaluation(instance, policyContext, matchingAreas)\n );\n return evaluations;\n}\n\nfunction sharedMetricEvaluation(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext\n) {\n return {\n blocking: policyContext.blocking,\n codeAreas: policyContext.codeAreas,\n functionName: policyContext.functionName,\n path: instance.metric.file,\n startLine: instance.metric.startLine,\n subject: instance.semanticSubject\n } as const;\n}\n\nfunction complexityMetricEvaluation(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext,\n matchingAreas: MatchingFunctionMetricAreas\n): FunctionMetricEvaluation | null {\n const value = instance.metric.cyclomaticComplexity.value;\n if (value === null) return null;\n return {\n ...sharedMetricEvaluation(instance, policyContext),\n complexityContributors: instance.metric.complexityContributors,\n limit: Math.min(...matchingAreas.map((area) => area.limits.cyclomaticComplexity.maximum)),\n metric: \"cyclomatic-complexity\",\n value\n };\n}\n\nfunction nestingDepthMetricEvaluation(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext,\n matchingAreas: MatchingFunctionMetricAreas\n): FunctionMetricEvaluation {\n return {\n ...sharedMetricEvaluation(instance, policyContext),\n limit: Math.min(...matchingAreas.map((area) => area.limits.nestingDepth.maximum)),\n metric: \"nesting-depth\",\n value: instance.metric.nestingDepth.value\n };\n}\n\nfunction codeLinesMetricEvaluation(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext,\n matchingAreas: MatchingFunctionMetricAreas\n): FunctionMetricEvaluation {\n return {\n ...sharedMetricEvaluation(instance, policyContext),\n limit: Math.min(\n ...matchingAreas.map((area) => functionCodeLineMaximum(instance.metric, area.limits))\n ),\n metric: \"function-code-density\",\n value: instance.metric.lines\n };\n}\n\nfunction parameterMetricEvaluation(\n instance: FunctionMetricInstance,\n policyContext: FunctionPolicyContext,\n matchingAreas: MatchingFunctionMetricAreas\n): FunctionMetricEvaluation {\n return {\n ...sharedMetricEvaluation(instance, policyContext),\n limit: Math.min(...matchingAreas.map((area) => area.limits.parameters.maximum)),\n metric: \"parameter-count\",\n value: instance.metric.parameterCount\n };\n}\n\nfunction appendFindingCandidate(\n candidates: FunctionRecordCandidate[],\n evaluation: FunctionMetricEvaluation\n): void {\n if (evaluation.value <= evaluation.limit) return;\n candidates.push(\n Object.freeze({\n id: `${evaluation.subject}:${evaluation.metric}`,\n data: Object.freeze({\n blocking: evaluation.blocking,\n codeAreas: evaluation.codeAreas,\n ...(evaluation.complexityContributors === undefined\n ? {}\n : { complexityContributors: evaluation.complexityContributors }),\n functionName: evaluation.functionName,\n limit: evaluation.limit,\n metric: evaluation.metric,\n path: evaluation.path,\n startLine: evaluation.startLine,\n value: evaluation.value\n })\n })\n );\n}\n\nfunction functionCodeLineMaximum(\n metric: FunctionMetric,\n limits: ResolvedFunctionMetricsLimits\n): number {\n const allowance = limits.codeLines.lowComplexityAllowance;\n const complexity = metric.cyclomaticComplexity.value;\n return complexity !== null && complexity < allowance.cyclomaticComplexityBelow\n ? allowance.maximum\n : limits.codeLines.maximum;\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
@@ -3,6 +3,17 @@ import { toSlashPath } from "./path.mjs";
3
3
  export function runGit(options) {
4
4
  return runProcessSync({ command: "git", ...options });
5
5
  }
6
+ /** Renders the actionable failure evidence shared by Git operation boundaries. */
7
+ export function gitFailureDetail(result) {
8
+ const stderr = result.stderr.trim();
9
+ if (stderr.length > 0)
10
+ return stderr;
11
+ const processErrorMessage = result.error?.message;
12
+ if (processErrorMessage !== undefined && processErrorMessage.length > 0) {
13
+ return processErrorMessage;
14
+ }
15
+ return result.signal === null ? `exit status ${result.status}` : `signal ${result.signal}`;
16
+ }
6
17
  export function gitHeadSha(cwd) {
7
18
  const result = runGit({ args: ["rev-parse", "HEAD"], cwd });
8
19
  if (processFailed(result))
@@ -1 +1 @@
1
- {"version":3,"file":"git.mjs","sourceRoot":"","sources":["../../../../src/package-checks/host-environment/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAaxC,MAAM,UAAU,MAAM,CAAC,OAAsB;IAC3C,OAAO,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5D,IAAI,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAyB;IACrD,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAyB;IACtD,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAc;IACzD,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;SACzC,GAAG,CAAC,WAAW,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,MAAM;SACV,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;SAC7B,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,MAAM,CAAC;QAC5B,OAAO,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;YACnC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;YACpE,CAAC,CAAC,OAAO,CAAC;IACd,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,WAAW,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,EAAsB;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC;QACpB,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,MAAM,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC;QACjE,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,IAAI,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;AACtC,CAAC","sourcesContent":["import { processFailed, runProcessSync } from \"./process.ts\";\nimport type { ProcessResult, RunProcessSyncOptions } from \"./process.ts\";\nimport { toSlashPath } from \"./path.ts\";\n\nexport type RunGitOptions = Omit<RunProcessSyncOptions, \"command\">;\n\nexport type GitCommitOptions = {\n readonly cwd: string;\n readonly sha: string;\n};\n\ntype GitLogFieldOptions = GitCommitOptions & {\n readonly format: string;\n};\n\nexport function runGit(options: RunGitOptions): ProcessResult {\n return runProcessSync({ command: \"git\", ...options });\n}\n\nexport function gitHeadSha(cwd: string): string | null {\n const result = runGit({ args: [\"rev-parse\", \"HEAD\"], cwd });\n if (processFailed(result)) return null;\n return result.stdout.trim() || null;\n}\n\nexport function gitCommitDate(options: GitCommitOptions): string | null {\n return gitLogField({ format: \"%aI\", ...options });\n}\n\nexport function gitCommitTitle(options: GitCommitOptions): string | null {\n return gitLogField({ format: \"%s\", ...options });\n}\n\nexport function splitGitFileList(stdout: string): string[] {\n return stdout.trim().split(/\\r?\\n/).filter(Boolean).map(toSlashPath);\n}\n\nexport function splitNulDelimitedGitFileList(stdout: string): string[] {\n return stdout\n .split(\"\\0\")\n .filter((filePath) => filePath.length > 0)\n .map(toSlashPath);\n}\n\nexport function parseGitStatusPaths(stdout: string): string[] {\n return stdout\n .split(/\\r?\\n/)\n .map((line) => line.trimEnd())\n .filter(Boolean)\n .map((line) => {\n const rawPath = line.slice(3).trim();\n const renameMarker = \" -> \";\n return rawPath.includes(renameMarker)\n ? rawPath.slice(rawPath.indexOf(renameMarker) + renameMarker.length)\n : rawPath;\n })\n .filter(Boolean)\n .map(toSlashPath);\n}\n\nfunction gitLogField({ format, ...options }: GitLogFieldOptions): string | null {\n const result = runGit({\n args: [\"log\", `--format=${format}`, \"--max-count=1\", options.sha],\n cwd: options.cwd\n });\n if (processFailed(result)) return null;\n return result.stdout.trim() || null;\n}\n"]}
1
+ {"version":3,"file":"git.mjs","sourceRoot":"","sources":["../../../../src/package-checks/host-environment/git.ts"],"names":[],"mappings":"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","sourcesContent":["import { processFailed, runProcessSync } from \"./process.ts\";\nimport type { ProcessResult, RunProcessSyncOptions } from \"./process.ts\";\nimport { toSlashPath } from \"./path.ts\";\n\nexport type RunGitOptions = Omit<RunProcessSyncOptions, \"command\">;\n\nexport type GitCommitOptions = {\n readonly cwd: string;\n readonly sha: string;\n};\n\ntype GitLogFieldOptions = GitCommitOptions & {\n readonly format: string;\n};\n\nexport function runGit(options: RunGitOptions): ProcessResult {\n return runProcessSync({ command: \"git\", ...options });\n}\n\n/** Renders the actionable failure evidence shared by Git operation boundaries. */\nexport function gitFailureDetail(result: ProcessResult): string {\n const stderr = result.stderr.trim();\n if (stderr.length > 0) return stderr;\n const processErrorMessage = result.error?.message;\n if (processErrorMessage !== undefined && processErrorMessage.length > 0) {\n return processErrorMessage;\n }\n return result.signal === null ? `exit status ${result.status}` : `signal ${result.signal}`;\n}\n\nexport function gitHeadSha(cwd: string): string | null {\n const result = runGit({ args: [\"rev-parse\", \"HEAD\"], cwd });\n if (processFailed(result)) return null;\n return result.stdout.trim() || null;\n}\n\nexport function gitCommitDate(options: GitCommitOptions): string | null {\n return gitLogField({ format: \"%aI\", ...options });\n}\n\nexport function gitCommitTitle(options: GitCommitOptions): string | null {\n return gitLogField({ format: \"%s\", ...options });\n}\n\nexport function splitGitFileList(stdout: string): string[] {\n return stdout.trim().split(/\\r?\\n/).filter(Boolean).map(toSlashPath);\n}\n\nexport function splitNulDelimitedGitFileList(stdout: string): string[] {\n return stdout\n .split(\"\\0\")\n .filter((filePath) => filePath.length > 0)\n .map(toSlashPath);\n}\n\nexport function parseGitStatusPaths(stdout: string): string[] {\n return stdout\n .split(/\\r?\\n/)\n .map((line) => line.trimEnd())\n .filter(Boolean)\n .map((line) => {\n const rawPath = line.slice(3).trim();\n const renameMarker = \" -> \";\n return rawPath.includes(renameMarker)\n ? rawPath.slice(rawPath.indexOf(renameMarker) + renameMarker.length)\n : rawPath;\n })\n .filter(Boolean)\n .map(toSlashPath);\n}\n\nfunction gitLogField({ format, ...options }: GitLogFieldOptions): string | null {\n const result = runGit({\n args: [\"log\", `--format=${format}`, \"--max-count=1\", options.sha],\n cwd: options.cwd\n });\n if (processFailed(result)) return null;\n return result.stdout.trim() || null;\n}\n"]}
@@ -1,18 +1,2 @@
1
- export function toSlashPath(filePath) {
2
- return filePath.replace(/\\/g, "/");
3
- }
4
- /** 判断值是否已是跨平台可稳定发布的 project-root-relative slash path。 */
5
- export function isNormalizedProjectRelativePath(value) {
6
- if (typeof value !== "string" ||
7
- value.length === 0 ||
8
- value.startsWith("/") ||
9
- value.includes("\\") ||
10
- value.includes("\u0000") ||
11
- /^[A-Za-z]:/u.test(value)) {
12
- return false;
13
- }
14
- return value
15
- .split("/")
16
- .every((segment) => segment.length > 0 && segment !== "." && segment !== "..");
17
- }
1
+ export { isNormalizedProjectRelativePath, toSlashPath } from "../../data-boundary/project-path.mjs";
18
2
  //# sourceMappingURL=path.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"path.mjs","sourceRoot":"","sources":["../../../../src/package-checks/host-environment/path.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,+BAA+B,CAAC,KAAc;IAC5D,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EACzB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;AACnF,CAAC","sourcesContent":["export function toSlashPath(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\n/** 判断值是否已是跨平台可稳定发布的 project-root-relative slash path。 */\nexport function isNormalizedProjectRelativePath(value: unknown): value is string {\n if (\n typeof value !== \"string\" ||\n value.length === 0 ||\n value.startsWith(\"/\") ||\n value.includes(\"\\\\\") ||\n value.includes(\"\\u0000\") ||\n /^[A-Za-z]:/u.test(value)\n ) {\n return false;\n }\n return value\n .split(\"/\")\n .every((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\");\n}\n"]}
1
+ {"version":3,"file":"path.mjs","sourceRoot":"","sources":["../../../../src/package-checks/host-environment/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC","sourcesContent":["export { isNormalizedProjectRelativePath, toSlashPath } from \"../../data-boundary/project-path.ts\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"contract.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/host-environment/process/contract.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC","sourcesContent":["import type { SyncOptions } from \"execa\";\n\nexport const DEFAULT_PROCESS_MAX_BUFFER_BYTES = 64 * 1024 * 1024;\n\nexport interface ProcessFailure extends Error {\n code?: number | string | null;\n signal?: NodeJS.Signals | null;\n status?: number | null;\n stderr?: Buffer | string;\n stdout?: Buffer | string;\n}\n\nexport type ProcessResult = {\n readonly error?: Error;\n readonly signal: NodeJS.Signals | null;\n readonly status: number | null;\n readonly stderr: string;\n readonly stdout: string;\n};\n\nexport type RunProcessSyncOptions = {\n readonly args: readonly string[];\n readonly command: string;\n readonly cwd?: string | URL;\n readonly encoding?: SyncOptions[\"encoding\"];\n readonly env?: NodeJS.ProcessEnv;\n readonly maxBuffer?: number;\n readonly stdio?: SyncOptions[\"stdio\"];\n readonly timeout?: number;\n readonly windowsHide?: boolean;\n};\n\nexport type RunProcessOptions = {\n readonly args?: readonly string[];\n readonly command: string;\n readonly cwd?: string | URL;\n readonly env?: NodeJS.ProcessEnv;\n readonly label?: string;\n readonly maxBuffer?: number;\n readonly timeout?: number;\n readonly windowsHide?: boolean;\n};\n\nexport type ExecaResultLike = {\n readonly code?: string;\n readonly exitCode?: number;\n readonly failed?: boolean;\n readonly isMaxBuffer?: boolean;\n readonly message?: string;\n readonly originalMessage?: string;\n readonly shortMessage?: string;\n readonly signal?: NodeJS.Signals;\n readonly stderr?: unknown;\n readonly stdout?: unknown;\n readonly timedOut?: boolean;\n};\n"]}
1
+ {"version":3,"file":"contract.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/host-environment/process/contract.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC","sourcesContent":["import type { SyncOptions } from \"execa\";\n\nexport const DEFAULT_PROCESS_MAX_BUFFER_BYTES = 64 * 1024 * 1024;\n\nexport interface ProcessFailure extends Error {\n code?: number | string | null;\n signal?: NodeJS.Signals | null;\n status?: number | null;\n stderr?: Buffer | string;\n stdout?: Buffer | string;\n}\n\nexport type ProcessResult = {\n readonly error?: Error;\n readonly isCanceled?: true;\n readonly isMaxBuffer?: true;\n readonly signal: NodeJS.Signals | null;\n readonly status: number | null;\n readonly stderr: string;\n readonly timedOut?: true;\n readonly stdout: string;\n};\n\nexport type RunProcessSyncOptions = {\n readonly args: readonly string[];\n readonly command: string;\n readonly cwd?: string | URL;\n readonly encoding?: SyncOptions[\"encoding\"];\n readonly env?: NodeJS.ProcessEnv;\n readonly maxBuffer?: number;\n readonly stdio?: SyncOptions[\"stdio\"];\n readonly timeout?: number;\n readonly windowsHide?: boolean;\n};\n\nexport type RunProcessOptions = {\n readonly args?: readonly string[];\n readonly cancelSignal?: AbortSignal;\n readonly command: string;\n readonly cwd?: string | URL;\n /** `false` uses only the supplied `env`; omission preserves Execa's inherited default. */\n readonly extendEnv?: boolean;\n readonly env?: NodeJS.ProcessEnv;\n readonly label?: string;\n readonly maxBuffer?: number;\n readonly timeout?: number;\n readonly windowsHide?: boolean;\n};\n\nexport type ExecaResultLike = {\n /** Execa's imported result types permit explicitly present `undefined` values. */\n readonly code?: string | undefined;\n readonly exitCode?: number | undefined;\n readonly failed?: boolean | undefined;\n readonly isCanceled?: boolean | undefined;\n readonly isMaxBuffer?: boolean | undefined;\n readonly message?: string | undefined;\n readonly originalMessage?: string | undefined;\n readonly shortMessage?: string | undefined;\n readonly signal?: NodeJS.Signals | undefined;\n readonly stderr?: unknown;\n readonly stdout?: unknown;\n readonly timedOut?: boolean | undefined;\n};\n"]}