@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,33 +1,59 @@
1
1
  export function toProcessResult(result, label) {
2
+ const cause = processCause(result);
3
+ const error = processErrorFor(result, label, cause);
2
4
  return {
3
- error: processErrorFor(result, label),
5
+ ...(error === undefined ? {} : { error }),
6
+ ...(cause === "cancellation" ? { isCanceled: true } : {}),
7
+ ...(cause === "max-buffer" ? { isMaxBuffer: true } : {}),
4
8
  signal: result.signal ?? null,
5
9
  status: result.exitCode ?? null,
6
10
  stderr: outputString(result.stderr),
11
+ ...(cause === "timeout" ? { timedOut: true } : {}),
7
12
  stdout: outputString(result.stdout)
8
13
  };
9
14
  }
10
15
  function outputString(output) {
11
16
  return typeof output === "string" ? output : "";
12
17
  }
13
- function processErrorFor(result, label = "process") {
14
- if (!isExecutionError(result)) {
18
+ function processCause(result) {
19
+ if (typeof result.exitCode === "number" && result.exitCode !== 0)
20
+ return "exit";
21
+ if (result.isCanceled === true)
22
+ return "cancellation";
23
+ if (result.timedOut === true)
24
+ return "timeout";
25
+ if (result.isMaxBuffer === true)
26
+ return "max-buffer";
27
+ if (result.signal !== undefined)
28
+ return "signal";
29
+ if (result.exitCode === 0)
30
+ return "exit";
31
+ return "startup-failure";
32
+ }
33
+ function processErrorFor(result, label, cause) {
34
+ if (!requiresProcessError(cause, result))
15
35
  return undefined;
16
- }
17
- const message = result.originalMessage ?? result.shortMessage ?? result.message ?? `${label} failed`;
18
- const error = new Error(message);
19
- if (result.code) {
20
- error.code = result.code;
21
- }
36
+ const error = new Error(processErrorMessage(result, label));
37
+ const code = processErrorCode(result);
38
+ if (code !== undefined)
39
+ error.code = code;
22
40
  return error;
23
41
  }
24
- function isExecutionError(result) {
25
- if (!result.failed) {
26
- return false;
27
- }
28
- if (typeof result.exitCode === "number") {
29
- return false;
30
- }
31
- return Boolean(result.code || result.timedOut || result.isMaxBuffer || result.signal);
42
+ function requiresProcessError(cause, result) {
43
+ return cause !== "exit" && result.failed === true;
44
+ }
45
+ function processErrorMessage(result, label) {
46
+ if (result.originalMessage !== undefined)
47
+ return result.originalMessage;
48
+ if (result.shortMessage !== undefined)
49
+ return result.shortMessage;
50
+ if (result.message !== undefined)
51
+ return result.message;
52
+ return `${label} failed`;
53
+ }
54
+ function processErrorCode(result) {
55
+ if (result.code === undefined || result.code.length === 0)
56
+ return undefined;
57
+ return result.code;
32
58
  }
33
59
  //# sourceMappingURL=result.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"result.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/host-environment/process/result.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAuB,EAAE,KAAa;IACpE,OAAO;QACL,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;QAC7B,MAAM,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QAC/B,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;QACnC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAe;IACnC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,MAAuB,EAAE,KAAK,GAAG,SAAS;IACjE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GACX,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,IAAI,GAAG,KAAK,SAAS,CAAC;IACvF,MAAM,KAAK,GAA0B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuB;IAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;AACxF,CAAC","sourcesContent":["import type { ExecaResultLike, ProcessResult } from \"./contract.ts\";\n\nexport function toProcessResult(result: ExecaResultLike, label: string): ProcessResult {\n return {\n error: processErrorFor(result, label),\n signal: result.signal ?? null,\n status: result.exitCode ?? null,\n stderr: outputString(result.stderr),\n stdout: outputString(result.stdout)\n };\n}\n\nfunction outputString(output: unknown): string {\n return typeof output === \"string\" ? output : \"\";\n}\n\nfunction processErrorFor(result: ExecaResultLike, label = \"process\"): Error | undefined {\n if (!isExecutionError(result)) {\n return undefined;\n }\n\n const message =\n result.originalMessage ?? result.shortMessage ?? result.message ?? `${label} failed`;\n const error: NodeJS.ErrnoException = new Error(message);\n if (result.code) {\n error.code = result.code;\n }\n return error;\n}\n\nfunction isExecutionError(result: ExecaResultLike): boolean {\n if (!result.failed) {\n return false;\n }\n if (typeof result.exitCode === \"number\") {\n return false;\n }\n return Boolean(result.code || result.timedOut || result.isMaxBuffer || result.signal);\n}\n"]}
1
+ {"version":3,"file":"result.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/host-environment/process/result.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExecaResultLike, ProcessResult } from \"./contract.ts\";\n\nexport function toProcessResult(result: ExecaResultLike, label: string): ProcessResult {\n const cause = processCause(result);\n const error = processErrorFor(result, label, cause);\n return {\n ...(error === undefined ? {} : { error }),\n ...(cause === \"cancellation\" ? { isCanceled: true as const } : {}),\n ...(cause === \"max-buffer\" ? { isMaxBuffer: true as const } : {}),\n signal: result.signal ?? null,\n status: result.exitCode ?? null,\n stderr: outputString(result.stderr),\n ...(cause === \"timeout\" ? { timedOut: true as const } : {}),\n stdout: outputString(result.stdout)\n };\n}\n\nfunction outputString(output: unknown): string {\n return typeof output === \"string\" ? output : \"\";\n}\n\ntype ProcessCause =\n | \"cancellation\"\n | \"exit\"\n | \"max-buffer\"\n | \"signal\"\n | \"startup-failure\"\n | \"timeout\";\n\nfunction processCause(result: ExecaResultLike): ProcessCause {\n if (typeof result.exitCode === \"number\" && result.exitCode !== 0) return \"exit\";\n if (result.isCanceled === true) return \"cancellation\";\n if (result.timedOut === true) return \"timeout\";\n if (result.isMaxBuffer === true) return \"max-buffer\";\n if (result.signal !== undefined) return \"signal\";\n if (result.exitCode === 0) return \"exit\";\n return \"startup-failure\";\n}\n\nfunction processErrorFor(\n result: ExecaResultLike,\n label: string,\n cause: ProcessCause\n): Error | undefined {\n if (!requiresProcessError(cause, result)) return undefined;\n\n const error: NodeJS.ErrnoException = new Error(processErrorMessage(result, label));\n const code = processErrorCode(result);\n if (code !== undefined) error.code = code;\n return error;\n}\n\nfunction requiresProcessError(cause: ProcessCause, result: ExecaResultLike): boolean {\n return cause !== \"exit\" && result.failed === true;\n}\n\nfunction processErrorMessage(result: ExecaResultLike, label: string): string {\n if (result.originalMessage !== undefined) return result.originalMessage;\n if (result.shortMessage !== undefined) return result.shortMessage;\n if (result.message !== undefined) return result.message;\n return `${label} failed`;\n}\n\nfunction processErrorCode(result: ExecaResultLike): string | undefined {\n if (result.code === undefined || result.code.length === 0) return undefined;\n return result.code;\n}\n"]}
@@ -7,7 +7,7 @@ export function runProcessSync(options) {
7
7
  const result = execaSync(command, args, {
8
8
  ...processOptions,
9
9
  encoding: processOptions.encoding ?? "utf8",
10
- env: plainTextProcessEnv({ env: processOptions.env }),
10
+ env: plainTextProcessEnv(processOptions.env === undefined ? {} : { env: processOptions.env }),
11
11
  maxBuffer: processOptions.maxBuffer ?? DEFAULT_PROCESS_MAX_BUFFER_BYTES,
12
12
  reject: false,
13
13
  stripFinalNewline: false,
@@ -16,14 +16,16 @@ export function runProcessSync(options) {
16
16
  return toProcessResult(result, command);
17
17
  }
18
18
  export function runProcess(options) {
19
- const { args = [], command, cwd, env, label = command, maxBuffer = DEFAULT_PROCESS_MAX_BUFFER_BYTES, timeout, windowsHide = true } = options;
19
+ const { args = [], cancelSignal, command, cwd, env, extendEnv, label = command, maxBuffer = DEFAULT_PROCESS_MAX_BUFFER_BYTES, timeout, windowsHide = true } = options;
20
20
  return execa(command, args, {
21
- cwd,
22
- env: plainTextProcessEnv({ env }),
21
+ ...(cancelSignal === undefined ? {} : { cancelSignal }),
22
+ ...(cwd === undefined ? {} : { cwd }),
23
+ ...(extendEnv === undefined ? {} : { extendEnv }),
24
+ env: plainTextProcessEnv(env === undefined ? {} : { env }),
23
25
  maxBuffer,
24
26
  reject: false,
25
27
  stripFinalNewline: false,
26
- timeout,
28
+ ...(timeout === undefined ? {} : { timeout }),
27
29
  windowsHide
28
30
  }).then((result) => toProcessResult(result, label));
29
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runner.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/host-environment/process/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,gCAAgC,EAIjC,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,CAAC;IACrD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;QACtC,GAAG,cAAc;QACjB,QAAQ,EAAE,cAAc,CAAC,QAAQ,IAAI,MAAM;QAC3C,GAAG,EAAE,mBAAmB,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC;QACrD,SAAS,EAAE,cAAc,CAAC,SAAS,IAAI,gCAAgC;QACvE,MAAM,EAAE,KAAK;QACb,iBAAiB,EAAE,KAAK;QACxB,WAAW,EAAE,cAAc,CAAC,WAAW,IAAI,IAAI;KAChD,CAAC,CAAC;IACH,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAA0B;IACnD,MAAM,EACJ,IAAI,GAAG,EAAE,EACT,OAAO,EACP,GAAG,EACH,GAAG,EACH,KAAK,GAAG,OAAO,EACf,SAAS,GAAG,gCAAgC,EAC5C,OAAO,EACP,WAAW,GAAG,IAAI,EACnB,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QAC1B,GAAG;QACH,GAAG,EAAE,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC;QACjC,SAAS;QACT,MAAM,EAAE,KAAK;QACb,iBAAiB,EAAE,KAAK;QACxB,OAAO;QACP,WAAW;KACZ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC","sourcesContent":["import { execa, execaSync } from \"execa\";\n\nimport { plainTextProcessEnv } from \"./env.ts\";\nimport { toProcessResult } from \"./result.ts\";\nimport {\n DEFAULT_PROCESS_MAX_BUFFER_BYTES,\n type ProcessResult,\n type RunProcessOptions,\n type RunProcessSyncOptions\n} from \"./contract.ts\";\n\nexport function runProcessSync(options: RunProcessSyncOptions): ProcessResult {\n const { args, command, ...processOptions } = options;\n const result = execaSync(command, args, {\n ...processOptions,\n encoding: processOptions.encoding ?? \"utf8\",\n env: plainTextProcessEnv({ env: processOptions.env }),\n maxBuffer: processOptions.maxBuffer ?? DEFAULT_PROCESS_MAX_BUFFER_BYTES,\n reject: false,\n stripFinalNewline: false,\n windowsHide: processOptions.windowsHide ?? true\n });\n return toProcessResult(result, command);\n}\n\nexport function runProcess(options: RunProcessOptions): Promise<ProcessResult> {\n const {\n args = [],\n command,\n cwd,\n env,\n label = command,\n maxBuffer = DEFAULT_PROCESS_MAX_BUFFER_BYTES,\n timeout,\n windowsHide = true\n } = options;\n\n return execa(command, args, {\n cwd,\n env: plainTextProcessEnv({ env }),\n maxBuffer,\n reject: false,\n stripFinalNewline: false,\n timeout,\n windowsHide\n }).then((result) => toProcessResult(result, label));\n}\n"]}
1
+ {"version":3,"file":"runner.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/host-environment/process/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,gCAAgC,EAIjC,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,CAAC;IACrD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;QACtC,GAAG,cAAc;QACjB,QAAQ,EAAE,cAAc,CAAC,QAAQ,IAAI,MAAM;QAC3C,GAAG,EAAE,mBAAmB,CAAC,cAAc,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC;QAC7F,SAAS,EAAE,cAAc,CAAC,SAAS,IAAI,gCAAgC;QACvE,MAAM,EAAE,KAAK;QACb,iBAAiB,EAAE,KAAK;QACxB,WAAW,EAAE,cAAc,CAAC,WAAW,IAAI,IAAI;KAChD,CAAC,CAAC;IACH,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAA0B;IACnD,MAAM,EACJ,IAAI,GAAG,EAAE,EACT,YAAY,EACZ,OAAO,EACP,GAAG,EACH,GAAG,EACH,SAAS,EACT,KAAK,GAAG,OAAO,EACf,SAAS,GAAG,gCAAgC,EAC5C,OAAO,EACP,WAAW,GAAG,IAAI,EACnB,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QAC1B,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QACvD,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACrC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,EAAE,mBAAmB,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QAC1D,SAAS;QACT,MAAM,EAAE,KAAK;QACb,iBAAiB,EAAE,KAAK;QACxB,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7C,WAAW;KACZ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC","sourcesContent":["import { execa, execaSync } from \"execa\";\n\nimport { plainTextProcessEnv } from \"./env.ts\";\nimport { toProcessResult } from \"./result.ts\";\nimport {\n DEFAULT_PROCESS_MAX_BUFFER_BYTES,\n type ProcessResult,\n type RunProcessOptions,\n type RunProcessSyncOptions\n} from \"./contract.ts\";\n\nexport function runProcessSync(options: RunProcessSyncOptions): ProcessResult {\n const { args, command, ...processOptions } = options;\n const result = execaSync(command, args, {\n ...processOptions,\n encoding: processOptions.encoding ?? \"utf8\",\n env: plainTextProcessEnv(processOptions.env === undefined ? {} : { env: processOptions.env }),\n maxBuffer: processOptions.maxBuffer ?? DEFAULT_PROCESS_MAX_BUFFER_BYTES,\n reject: false,\n stripFinalNewline: false,\n windowsHide: processOptions.windowsHide ?? true\n });\n return toProcessResult(result, command);\n}\n\nexport function runProcess(options: RunProcessOptions): Promise<ProcessResult> {\n const {\n args = [],\n cancelSignal,\n command,\n cwd,\n env,\n extendEnv,\n label = command,\n maxBuffer = DEFAULT_PROCESS_MAX_BUFFER_BYTES,\n timeout,\n windowsHide = true\n } = options;\n\n return execa(command, args, {\n ...(cancelSignal === undefined ? {} : { cancelSignal }),\n ...(cwd === undefined ? {} : { cwd }),\n ...(extendEnv === undefined ? {} : { extendEnv }),\n env: plainTextProcessEnv(env === undefined ? {} : { env }),\n maxBuffer,\n reject: false,\n stripFinalNewline: false,\n ...(timeout === undefined ? {} : { timeout }),\n windowsHide\n }).then((result) => toProcessResult(result, label));\n}\n"]}
@@ -1,25 +1,23 @@
1
1
  import { defineCheck } from "../../check/check.mjs";
2
+ import { resolvePackageCheckAuthoringInput } from "../check-authoring.mjs";
2
3
  import { JSON_SCHEMA_VALIDATION_CHECK_DEFINITION, executeJsonSchemaValidation } from "./json-schema-validation.mjs";
3
4
  import { parseJsonSchemaValidationData } from "./final-data.mjs";
4
5
  import { resolveJsonSchemaValidationOptions } from "./options-resolution.mjs";
5
6
  import { validJsonSchemaValidationOptions } from "./options-validation.mjs";
6
- /**
7
- * 使用可省略的 file、identity、reference、schema 与 binding policy 构造 Check。
8
- *
9
- * @param options - 省略顶层字段和 file fields 使用 package defaults;显式数组是完整替换值。
10
- * @returns 固定 `json-schema-validation` identity、完整冻结 options、parser 与执行逻辑。
11
- * @throws {TypeError} input 不符合 closed authoring policy、identity 或 binding 不变量时抛出。
12
- */
13
7
  export function jsonSchemaValidation(options = {}) {
14
- const resolvedOptions = resolveJsonSchemaValidationOptions(options);
8
+ const input = resolvePackageCheckAuthoringInput(options, ["files", "maximumBytes", "schemaIdentity", "referenceResolution", "schemas", "bindings"], JSON_SCHEMA_VALIDATION_CHECK_DEFINITION);
9
+ if (input === undefined) {
10
+ throw new TypeError("jsonSchemaValidation options must match the documented closed policy");
11
+ }
12
+ const resolvedOptions = resolveJsonSchemaValidationOptions(input.domainOptions);
15
13
  if (resolvedOptions === undefined) {
16
14
  throw new TypeError("jsonSchemaValidation options must match the documented closed policy");
17
15
  }
18
16
  return defineCheck({
19
- ...JSON_SCHEMA_VALIDATION_CHECK_DEFINITION,
20
- execution: executeJsonSchemaValidation,
17
+ ...input.definition,
18
+ execute: executeJsonSchemaValidation,
21
19
  parseData: parseJsonSchemaValidationData,
22
- preflight: (preparedOptions) => validJsonSchemaValidationOptions(preparedOptions)
20
+ prepare: (preparedOptions) => validJsonSchemaValidationOptions(preparedOptions)
23
21
  ? { status: "success", preparedOptions }
24
22
  : {
25
23
  status: "failure",
@@ -1 +1 @@
1
- {"version":3,"file":"default-check.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-schema-validation/default-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,uCAAuC,EACvC,2BAA2B,EAC5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAKhE,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAE3E;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAO,GAAgC,EAAE;IAMzC,MAAM,eAAe,GAAG,kCAAkC,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,sEAAsE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,uCAAuC;QAC1C,SAAS,EAAE,2BAA2B;QACtC,SAAS,EAAE,6BAA6B;QACxC,SAAS,EAAE,CAAC,eAAe,EAAE,EAAE,CAC7B,gCAAgC,CAAC,eAAe,CAAC;YAC/C,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,2IAA2I;qBAC9I;iBACF;aACF;QACP,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { defineCheck, type TypedCheckWithOptions } from \"../../check/check.ts\";\nimport {\n JSON_SCHEMA_VALIDATION_CHECK_DEFINITION,\n executeJsonSchemaValidation\n} from \"./json-schema-validation.ts\";\nimport { parseJsonSchemaValidationData } from \"./final-data.ts\";\nimport type {\n JsonSchemaValidationOptions,\n ResolvedJsonSchemaValidationOptions\n} from \"./options.ts\";\nimport { resolveJsonSchemaValidationOptions } from \"./options-resolution.ts\";\nimport { validJsonSchemaValidationOptions } from \"./options-validation.ts\";\n\n/**\n * 使用可省略的 file、identity、reference、schema 与 binding policy 构造 Check。\n *\n * @param options - 省略顶层字段和 file fields 使用 package defaults;显式数组是完整替换值。\n * @returns 固定 `json-schema-validation` identity、完整冻结 options、parser 与执行逻辑。\n * @throws {TypeError} input 不符合 closed authoring policy、identity 或 binding 不变量时抛出。\n */\nexport function jsonSchemaValidation(\n options: JsonSchemaValidationOptions = {}\n): TypedCheckWithOptions<\n \"json-schema-validation\",\n ResolvedJsonSchemaValidationOptions,\n typeof parseJsonSchemaValidationData\n> {\n const resolvedOptions = resolveJsonSchemaValidationOptions(options);\n if (resolvedOptions === undefined) {\n throw new TypeError(\"jsonSchemaValidation options must match the documented closed policy\");\n }\n return defineCheck({\n ...JSON_SCHEMA_VALIDATION_CHECK_DEFINITION,\n execution: executeJsonSchemaValidation,\n parseData: parseJsonSchemaValidationData,\n preflight: (preparedOptions) =>\n validJsonSchemaValidationOptions(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 \"jsonSchemaValidation options are invalid; recreate the Check with jsonSchemaValidation(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
1
+ {"version":3,"file":"default-check.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-schema-validation/default-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,iCAAiC,EAElC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uCAAuC,EACvC,2BAA2B,EAC5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAKhE,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AA8B3E,MAAM,UAAU,oBAAoB,CAClC,OAAO,GAAgC,EAAE;IAMzC,MAAM,KAAK,GAAG,iCAAiC,CAC7C,OAAO,EACP,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,SAAS,EAAE,UAAU,CAAC,EACzF,uCAAuC,CACxC,CAAC;IACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,sEAAsE,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,eAAe,GAAG,kCAAkC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChF,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,sEAAsE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,KAAK,CAAC,UAAU;QACnB,OAAO,EAAE,2BAA2B;QACpC,SAAS,EAAE,6BAA6B;QACxC,OAAO,EAAE,CAAC,eAAe,EAAE,EAAE,CAC3B,gCAAgC,CAAC,eAAe,CAAC;YAC/C,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,2IAA2I;qBAC9I;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 {\n JSON_SCHEMA_VALIDATION_CHECK_DEFINITION,\n executeJsonSchemaValidation\n} from \"./json-schema-validation.ts\";\nimport { parseJsonSchemaValidationData } from \"./final-data.ts\";\nimport type {\n JsonSchemaValidationOptions,\n ResolvedJsonSchemaValidationOptions\n} from \"./options.ts\";\nimport { resolveJsonSchemaValidationOptions } from \"./options-resolution.ts\";\nimport { validJsonSchemaValidationOptions } from \"./options-validation.ts\";\n\n/**\n * 使用可省略的 file、identity、reference、schema 与 binding policy 构造 Check。\n *\n * @param options - 省略顶层字段和 file fields 使用 package defaults;显式数组是完整替换值。\n * @returns 固定 `json-schema-validation` identity、完整冻结 options、parser 与执行逻辑。\n * @throws {TypeError} input 不符合 closed authoring policy、identity 或 binding 不变量时抛出。\n */\nexport function jsonSchemaValidation(\n options?: JsonSchemaValidationOptions<\"json-schema-validation\">\n): TypedCheckWithOptions<\n \"json-schema-validation\",\n ResolvedJsonSchemaValidationOptions,\n typeof parseJsonSchemaValidationData\n>;\nexport function jsonSchemaValidation<const Id extends string>(\n options: JsonSchemaValidationOptions<Id> & PackageCheckIdentityInput<Id>\n): TypedCheckWithOptions<\n Id,\n ResolvedJsonSchemaValidationOptions,\n typeof parseJsonSchemaValidationData\n>;\nexport function jsonSchemaValidation(\n options: JsonSchemaValidationOptions\n): TypedCheckWithOptions<\n string,\n ResolvedJsonSchemaValidationOptions,\n typeof parseJsonSchemaValidationData\n>;\nexport function jsonSchemaValidation(\n options: JsonSchemaValidationOptions = {}\n): TypedCheckWithOptions<\n string,\n ResolvedJsonSchemaValidationOptions,\n typeof parseJsonSchemaValidationData\n> {\n const input = resolvePackageCheckAuthoringInput(\n options,\n [\"files\", \"maximumBytes\", \"schemaIdentity\", \"referenceResolution\", \"schemas\", \"bindings\"],\n JSON_SCHEMA_VALIDATION_CHECK_DEFINITION\n );\n if (input === undefined) {\n throw new TypeError(\"jsonSchemaValidation options must match the documented closed policy\");\n }\n const resolvedOptions = resolveJsonSchemaValidationOptions(input.domainOptions);\n if (resolvedOptions === undefined) {\n throw new TypeError(\"jsonSchemaValidation options must match the documented closed policy\");\n }\n return defineCheck({\n ...input.definition,\n execute: executeJsonSchemaValidation,\n parseData: parseJsonSchemaValidationData,\n prepare: (preparedOptions) =>\n validJsonSchemaValidationOptions(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 \"jsonSchemaValidation options are invalid; recreate the Check with jsonSchemaValidation(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-schema-validation/options.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\n\n/** 已注册 schema 的 root `$id` 与配置 identity 之间的全 Check 统一规则。 */\nexport type JsonSchemaIdentityMode =\n /** root `$id` 必须等于 `schemas[].id`,该配置 ID 也是 engine identity。 */\n | \"require-match\"\n /** 配置 ID 是 engine identity;object schema 的 invocation-local compile copy 使用该 `$id`。 */\n | \"configuration-authoritative\"\n /** 安全的 root `$id` 是 engine identity;配置 ID 仍是 binding 与公开事实的标签。 */\n | \"document-authoritative\";\n\n/** 整个 Check 共用、不能按单个 schema 混用的 root schema identity policy。 */\nexport interface JsonSchemaIdentity {\n /** root `$id` 与配置 `schemas[].id` 的关系。 */\n readonly mode: JsonSchemaIdentityMode;\n}\n\n/** allowlisted 引用解析可读取的单一 Schema 来源及其固定边界。 */\nexport type JsonSchemaReferenceSource =\n /** Package 固定的 JSON Schema catalog;它不授权网络请求。 */\n | Readonly<{ readonly kind: \"bundled\"; readonly catalog: \"json-schema-2020-12\" }>\n | Readonly<{\n /** 只允许本 source 明确限定的 HTTPS reference scope。 */\n readonly kind: \"https\";\n /** 调用方为本 source 选择的安全稳定 identity,不是请求 URL。 */\n readonly id: string;\n /** 精确 HTTPS origin;不含 path、credentials、query 或 fragment。 */\n readonly origin: string;\n /** 已授权 URL path 的边界;从 `/` 开始,非 root prefix 必须以 `/` 结束。 */\n readonly pathPrefix: string;\n }>;\n\n/** 本次 Check 解析 local、bundled 与 allowlisted Schema 引用的封闭策略。 */\nexport type JsonSchemaReferenceResolution =\n /** 只使用 local schemas 和允许的 bundled catalog,不读取额外 HTTPS schema。 */\n | Readonly<{ readonly mode: \"offline\" }>\n | Readonly<{\n /** 只从 `sources` 的精确 scope 读取额外 schema;没有 implicit registry、headers 或 redirects。 */\n readonly mode: \"allowlisted\";\n /** 完整替换的明确 source 集合;每项决定自身可读取的 reference scope。 */\n readonly sources: readonly JsonSchemaReferenceSource[];\n }>;\n\n/** 调用方注册的一份 local schema resource;注册表不自动发现 schema。 */\nexport interface RegisteredJsonSchema {\n /** binding 与公开 facts 使用的安全 schema identity。 */\n readonly id: string;\n /** 已由 `files` selection 批准的 normalized project-relative `.json` path。 */\n readonly path: string;\n}\n\n/** 调用方将一个已批准 local JSON instance 明确绑定到已注册 schema 的关系。 */\nexport interface JsonSchemaInstanceBinding {\n /** 本次 Check 内唯一、用于公开 facts 的 binding identity。 */\n readonly id: string;\n /** 已由 `files` selection 批准的 normalized project-relative `.json` instance path。 */\n readonly instancePath: string;\n /** 必须引用 `schemas` 中已注册 schema 的 identity。 */\n readonly schemaId: string;\n}\n\n/** `jsonSchemaValidation(options?)` 接受的可省略 authoring policy。 */\nexport interface JsonSchemaValidationOptions {\n /** schema/instance declarations 必须属于的 repository-file selection。 */\n readonly files?: ProjectFileSelectionOptions;\n /** 每个 local schema/instance document 允许的最大 raw byte 数;省略时为 1 MiB。 */\n readonly maximumBytes?: number;\n /** 整个 Check 共用的 schema root identity 规则;不得按 schema 混用。 */\n readonly schemaIdentity?: JsonSchemaIdentity;\n /** 默认离线;额外 schema source 必须显式 allowlist。 */\n readonly referenceResolution?: JsonSchemaReferenceResolution;\n /** 显式注册的 schema resources;ID 是 binding 和 public fact 使用的安全 authoring identity。 */\n readonly schemas?: readonly RegisteredJsonSchema[];\n /** 明确把一个由本 Check file selection 批准的 instance path 绑定到已声明 schema。 */\n readonly bindings?: readonly JsonSchemaInstanceBinding[];\n}\n\n/** `json-schema-validation` execution 消费的完整、冻结 options。 */\nexport interface ResolvedJsonSchemaValidationOptions {\n readonly files: ProjectFileSelection;\n readonly maximumBytes: number;\n readonly schemaIdentity: JsonSchemaIdentity;\n readonly referenceResolution: JsonSchemaReferenceResolution;\n readonly schemas: readonly RegisteredJsonSchema[];\n readonly bindings: readonly JsonSchemaInstanceBinding[];\n}\n"]}
1
+ {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-schema-validation/options.ts"],"names":[],"mappings":"","sourcesContent":["import type { PackageCheckAuthoringOptions } from \"../check-authoring.ts\";\nimport type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\n\n/** 已注册 schema 的 root `$id` 与配置 identity 之间的全 Check 统一规则。 */\nexport type JsonSchemaIdentityMode =\n /** root `$id` 必须等于 `schemas[].id`,该配置 ID 也是 engine identity。 */\n | \"require-match\"\n /** 配置 ID 是 engine identity;object schema 的 invocation-local compile copy 使用该 `$id`。 */\n | \"configuration-authoritative\"\n /** 安全的 root `$id` 是 engine identity;配置 ID 仍是 binding 与公开事实的标签。 */\n | \"document-authoritative\";\n\n/** 整个 Check 共用、不能按单个 schema 混用的 root schema identity policy。 */\nexport interface JsonSchemaIdentity {\n /** root `$id` 与配置 `schemas[].id` 的关系。 */\n readonly mode: JsonSchemaIdentityMode;\n}\n\n/** allowlisted 引用解析可读取的单一 Schema 来源及其固定边界。 */\nexport type JsonSchemaReferenceSource =\n /** Package 固定的 JSON Schema catalog;它不授权网络请求。 */\n | Readonly<{ readonly kind: \"bundled\"; readonly catalog: \"json-schema-2020-12\" }>\n | Readonly<{\n /** 只允许本 source 明确限定的 HTTPS reference scope。 */\n readonly kind: \"https\";\n /** 调用方为本 source 选择的安全稳定 identity,不是请求 URL。 */\n readonly id: string;\n /** 精确 HTTPS origin;不含 path、credentials、query 或 fragment。 */\n readonly origin: string;\n /** 已授权 URL path 的边界;从 `/` 开始,非 root prefix 必须以 `/` 结束。 */\n readonly pathPrefix: string;\n }>;\n\n/** 本次 Check 解析 local、bundled 与 allowlisted Schema 引用的封闭策略。 */\nexport type JsonSchemaReferenceResolution =\n /** 只使用 local schemas 和允许的 bundled catalog,不读取额外 HTTPS schema。 */\n | Readonly<{ readonly mode: \"offline\" }>\n | Readonly<{\n /** 只从 `sources` 的精确 scope 读取额外 schema;没有 implicit registry、headers 或 redirects。 */\n readonly mode: \"allowlisted\";\n /** 完整替换的明确 source 集合;每项决定自身可读取的 reference scope。 */\n readonly sources: readonly JsonSchemaReferenceSource[];\n }>;\n\n/** 调用方注册的一份 local schema resource;注册表不自动发现 schema。 */\nexport interface RegisteredJsonSchema {\n /** binding 与公开 facts 使用的安全 schema identity。 */\n readonly id: string;\n /** 已由 `files` selection 批准的 normalized project-relative `.json` path。 */\n readonly path: string;\n}\n\n/** 调用方将一个已批准 local JSON instance 明确绑定到已注册 schema 的关系。 */\nexport interface JsonSchemaInstanceBinding {\n /** 本次 Check 内唯一、用于公开 facts 的 binding identity。 */\n readonly id: string;\n /** 已由 `files` selection 批准的 normalized project-relative `.json` instance path。 */\n readonly instancePath: string;\n /** 必须引用 `schemas` 中已注册 schema 的 identity。 */\n readonly schemaId: string;\n}\n\n/** `jsonSchemaValidation(options?)` 接受的可省略 authoring policy。 */\nexport interface JsonSchemaValidationOptions<\n Id extends string = string\n> extends PackageCheckAuthoringOptions<Id> {\n /** schema/instance declarations 必须属于的 repository-file selection。 */\n readonly files?: ProjectFileSelectionOptions;\n /** 每个 local schema/instance document 允许的最大 raw byte 数;省略时为 1 MiB。 */\n readonly maximumBytes?: number;\n /** 整个 Check 共用的 schema root identity 规则;不得按 schema 混用。 */\n readonly schemaIdentity?: JsonSchemaIdentity;\n /** 默认离线;额外 schema source 必须显式 allowlist。 */\n readonly referenceResolution?: JsonSchemaReferenceResolution;\n /** 显式注册的 schema resources;ID 是 binding 和 public fact 使用的安全 authoring identity。 */\n readonly schemas?: readonly RegisteredJsonSchema[];\n /** 明确把一个由本 Check file selection 批准的 instance path 绑定到已声明 schema。 */\n readonly bindings?: readonly JsonSchemaInstanceBinding[];\n}\n\n/** `json-schema-validation` execution 消费的完整、冻结 options。 */\nexport interface ResolvedJsonSchemaValidationOptions {\n readonly files: ProjectFileSelection;\n readonly maximumBytes: number;\n readonly schemaIdentity: JsonSchemaIdentity;\n readonly referenceResolution: JsonSchemaReferenceResolution;\n readonly schemas: readonly RegisteredJsonSchema[];\n readonly bindings: readonly JsonSchemaInstanceBinding[];\n}\n"]}
@@ -43,9 +43,13 @@ export class ControlledReferenceResolver {
43
43
  if (this.#resolverInput.signal.aborted)
44
44
  throw new ReferenceTransportFailure();
45
45
  const controller = new AbortController();
46
- const abortForCaller = () => controller.abort();
46
+ const abortForCaller = () => {
47
+ controller.abort();
48
+ };
47
49
  this.#resolverInput.signal.addEventListener("abort", abortForCaller, { once: true });
48
- const timeout = setTimeout(() => controller.abort(), REMOTE_TIMEOUT_MS);
50
+ const timeout = setTimeout(() => {
51
+ controller.abort();
52
+ }, REMOTE_TIMEOUT_MS);
49
53
  try {
50
54
  return await this.loadWithController(referenceUri, controller);
51
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reference-resolver.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-schema-validation/reference-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnySchemaObject } from \"ajv\";\n\nimport type { ResolvedJsonSchemaValidationOptions } from \"./options.ts\";\nimport type { SchemaCompileReason } from \"./schema-engine.ts\";\nimport { inspectSchemaPolicy, isJsonObject } from \"./schema-policy.ts\";\nimport { inspectStrictJsonBytes } from \"../json-document/strict-document.ts\";\nimport { normalizeRemoteReference, readBoundedResponse } from \"./remote-response.ts\";\n\ninterface ControlledResolverInput {\n readonly referenceResolution: ResolvedJsonSchemaValidationOptions[\"referenceResolution\"];\n readonly signal: AbortSignal;\n}\n\nconst MAX_REMOTE_RESPONSE_BYTES = 1_048_576;\nconst REMOTE_TIMEOUT_MS = 5_000;\n\nexport class ControlledReferenceResolver {\n readonly #cache = new Map<string, Promise<AnySchemaObject>>();\n #loadQueue: Promise<void> = Promise.resolve();\n readonly #allowedHttpsSources: readonly Readonly<{\n readonly origin: string;\n readonly pathPrefix: string;\n }>[];\n readonly #resolverInput: ControlledResolverInput;\n\n constructor(input: ControlledResolverInput) {\n this.#resolverInput = input;\n this.#allowedHttpsSources =\n input.referenceResolution.mode === \"allowlisted\"\n ? Object.freeze(\n input.referenceResolution.sources.flatMap((source) =>\n source.kind === \"https\"\n ? [Object.freeze({ origin: source.origin, pathPrefix: source.pathPrefix })]\n : []\n )\n )\n : Object.freeze([]);\n }\n\n load(referenceUri: string): Promise<AnySchemaObject> {\n let normalizedReferenceUri: string;\n try {\n normalizedReferenceUri = normalizeRemoteReference(referenceUri);\n } catch {\n return Promise.reject(new ReferenceResolutionFailure(\"unapproved-reference\"));\n }\n const cached = this.#cache.get(normalizedReferenceUri);\n if (cached !== undefined) return cached;\n const loading = this.queueLoad(normalizedReferenceUri);\n this.#cache.set(normalizedReferenceUri, loading);\n return loading;\n }\n\n private queueLoad(referenceUri: string): Promise<AnySchemaObject> {\n const loading = this.#loadQueue.then(\n () => this.loadUncached(referenceUri),\n () => this.loadUncached(referenceUri)\n );\n this.#loadQueue = loading.then(\n () => undefined,\n () => undefined\n );\n return loading;\n }\n\n private async loadUncached(referenceUri: string): Promise<AnySchemaObject> {\n if (!this.isAllowedReference(referenceUri))\n throw new ReferenceResolutionFailure(\"unapproved-reference\");\n if (this.#resolverInput.signal.aborted) throw new ReferenceTransportFailure();\n const controller = new AbortController();\n const abortForCaller = (): void => controller.abort();\n this.#resolverInput.signal.addEventListener(\"abort\", abortForCaller, { once: true });\n const timeout = setTimeout(() => controller.abort(), REMOTE_TIMEOUT_MS);\n try {\n return await this.loadWithController(referenceUri, controller);\n } catch (error) {\n if (\n error instanceof ReferenceResolutionFailure ||\n error instanceof ReferenceTransportFailure\n ) {\n throw error;\n }\n throw new ReferenceTransportFailure();\n } finally {\n clearTimeout(timeout);\n this.#resolverInput.signal.removeEventListener(\"abort\", abortForCaller);\n }\n }\n\n private async loadWithController(\n referenceUri: string,\n controller: AbortController\n ): Promise<AnySchemaObject> {\n const response = await fetchSchemaResponse(referenceUri, controller.signal);\n assertAllowedResponse(response);\n if (this.#resolverInput.signal.aborted) throw new ReferenceTransportFailure();\n const bytes = await readBoundedResponse(\n response,\n MAX_REMOTE_RESPONSE_BYTES,\n this.#resolverInput.signal\n );\n return schemaFromRemoteBytes(bytes, referenceUri);\n }\n\n private isAllowedReference(referenceUri: string): boolean {\n let url: URL;\n try {\n url = new URL(referenceUri);\n } catch {\n return false;\n }\n return this.#allowedHttpsSources.some(\n (source) =>\n url.origin === source.origin &&\n (source.pathPrefix === \"/\" || url.pathname.startsWith(source.pathPrefix))\n );\n }\n}\n\nasync function fetchSchemaResponse(referenceUri: string, signal: AbortSignal): Promise<Response> {\n if (typeof globalThis.fetch !== \"function\") throw new ReferenceTransportFailure();\n return globalThis.fetch(referenceUri, {\n credentials: \"omit\",\n method: \"GET\",\n redirect: \"manual\",\n signal\n });\n}\n\nfunction assertAllowedResponse(response: Response): void {\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw new ReferenceResolutionFailure(\"unapproved-reference\");\n }\n if (response.ok) return;\n if (response.status >= 500) throw new ReferenceTransportFailure();\n throw new ReferenceResolutionFailure(\"unapproved-reference\");\n}\n\nfunction schemaFromRemoteBytes(\n bytes: Uint8Array | \"too-large\",\n referenceUri: string\n): AnySchemaObject {\n if (bytes === \"too-large\") throw new ReferenceResolutionFailure(\"remote-document-invalid\");\n const document = inspectStrictJsonBytes(bytes);\n if (document.kind !== \"valid\" || !isJsonObject(document.jsonValue)) {\n throw new ReferenceResolutionFailure(\"remote-document-invalid\");\n }\n if (document.jsonValue.$id !== referenceUri) {\n throw new ReferenceResolutionFailure(\"remote-schema-id-mismatch\");\n }\n const referenceReason = inspectSchemaPolicy(document.jsonValue);\n if (referenceReason !== undefined) throw new ReferenceResolutionFailure(referenceReason);\n return document.jsonValue;\n}\n\nexport class ReferenceResolutionFailure extends Error {\n readonly reason: SchemaCompileReason;\n\n constructor(reason: SchemaCompileReason) {\n super(reason);\n this.reason = reason;\n }\n}\n\nexport class ReferenceTransportFailure extends Error {}\n"]}
1
+ {"version":3,"file":"reference-resolver.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-schema-validation/reference-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAOrF,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAC5C,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEhC,MAAM,OAAO,2BAA2B;IAC7B,MAAM,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC9D,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IACrC,oBAAoB,CAGxB;IACI,cAAc,CAA0B;IAEjD,YAAY,KAA8B;QACxC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,oBAAoB;YACvB,KAAK,CAAC,mBAAmB,CAAC,IAAI,KAAK,aAAa;gBAC9C,CAAC,CAAC,MAAM,CAAC,MAAM,CACX,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACnD,MAAM,CAAC,IAAI,KAAK,OAAO;oBACrB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;oBAC3E,CAAC,CAAC,EAAE,CACP,CACF;gBACH,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,YAAoB;QACvB,IAAI,sBAA8B,CAAC;QACnC,IAAI,CAAC;YACH,sBAAsB,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,0BAA0B,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACvD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,SAAS,CAAC,YAAoB;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAClC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EACrC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CACtC,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAC5B,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,YAAoB;QAC7C,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACxC,MAAM,IAAI,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;QAC9E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,cAAc,GAAG,GAAS,EAAE;YAChC,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,KAAK,YAAY,0BAA0B;gBAC3C,KAAK,YAAY,yBAAyB,EAC1C,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,yBAAyB,EAAE,CAAC;QACxC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,YAAoB,EACpB,UAA2B;QAE3B,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5E,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;QAC9E,MAAM,KAAK,GAAG,MAAM,mBAAmB,CACrC,QAAQ,EACR,yBAAyB,EACzB,IAAI,CAAC,cAAc,CAAC,MAAM,CAC3B,CAAC;QACF,OAAO,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;IAEO,kBAAkB,CAAC,YAAoB;QAC7C,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,CACnC,CAAC,MAAM,EAAE,EAAE,CACT,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAC5B,CAAC,MAAM,CAAC,UAAU,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;CACF;AAED,KAAK,UAAU,mBAAmB,CAAC,YAAoB,EAAE,MAAmB;IAC1E,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU;QAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;IAClF,OAAO,UAAU,CAAC,KAAK,CAAC,YAAY,EAAE;QACpC,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,QAAQ;QAClB,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAkB;IAC/C,IAAI,QAAQ,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,QAAQ,CAAC,EAAE;QAAE,OAAO;IACxB,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;QAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;IAClE,MAAM,IAAI,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAA+B,EAC/B,YAAoB;IAEpB,IAAI,KAAK,KAAK,WAAW;QAAE,MAAM,IAAI,0BAA0B,CAAC,yBAAyB,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,0BAA0B,CAAC,yBAAyB,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;QAC5C,MAAM,IAAI,0BAA0B,CAAC,2BAA2B,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,eAAe,GAAG,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAChE,IAAI,eAAe,KAAK,SAAS;QAAE,MAAM,IAAI,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACzF,OAAO,QAAQ,CAAC,SAAS,CAAC;AAC5B,CAAC;AAED,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC1C,MAAM,CAAsB;IAErC,YAAY,MAA2B;QACrC,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;CAAG","sourcesContent":["import type { AnySchemaObject } from \"ajv\";\n\nimport type { ResolvedJsonSchemaValidationOptions } from \"./options.ts\";\nimport type { SchemaCompileReason } from \"./schema-engine.ts\";\nimport { inspectSchemaPolicy, isJsonObject } from \"./schema-policy.ts\";\nimport { inspectStrictJsonBytes } from \"../json-document/strict-document.ts\";\nimport { normalizeRemoteReference, readBoundedResponse } from \"./remote-response.ts\";\n\ninterface ControlledResolverInput {\n readonly referenceResolution: ResolvedJsonSchemaValidationOptions[\"referenceResolution\"];\n readonly signal: AbortSignal;\n}\n\nconst MAX_REMOTE_RESPONSE_BYTES = 1_048_576;\nconst REMOTE_TIMEOUT_MS = 5_000;\n\nexport class ControlledReferenceResolver {\n readonly #cache = new Map<string, Promise<AnySchemaObject>>();\n #loadQueue: Promise<void> = Promise.resolve();\n readonly #allowedHttpsSources: readonly Readonly<{\n readonly origin: string;\n readonly pathPrefix: string;\n }>[];\n readonly #resolverInput: ControlledResolverInput;\n\n constructor(input: ControlledResolverInput) {\n this.#resolverInput = input;\n this.#allowedHttpsSources =\n input.referenceResolution.mode === \"allowlisted\"\n ? Object.freeze(\n input.referenceResolution.sources.flatMap((source) =>\n source.kind === \"https\"\n ? [Object.freeze({ origin: source.origin, pathPrefix: source.pathPrefix })]\n : []\n )\n )\n : Object.freeze([]);\n }\n\n load(referenceUri: string): Promise<AnySchemaObject> {\n let normalizedReferenceUri: string;\n try {\n normalizedReferenceUri = normalizeRemoteReference(referenceUri);\n } catch {\n return Promise.reject(new ReferenceResolutionFailure(\"unapproved-reference\"));\n }\n const cached = this.#cache.get(normalizedReferenceUri);\n if (cached !== undefined) return cached;\n const loading = this.queueLoad(normalizedReferenceUri);\n this.#cache.set(normalizedReferenceUri, loading);\n return loading;\n }\n\n private queueLoad(referenceUri: string): Promise<AnySchemaObject> {\n const loading = this.#loadQueue.then(\n () => this.loadUncached(referenceUri),\n () => this.loadUncached(referenceUri)\n );\n this.#loadQueue = loading.then(\n () => undefined,\n () => undefined\n );\n return loading;\n }\n\n private async loadUncached(referenceUri: string): Promise<AnySchemaObject> {\n if (!this.isAllowedReference(referenceUri))\n throw new ReferenceResolutionFailure(\"unapproved-reference\");\n if (this.#resolverInput.signal.aborted) throw new ReferenceTransportFailure();\n const controller = new AbortController();\n const abortForCaller = (): void => {\n controller.abort();\n };\n this.#resolverInput.signal.addEventListener(\"abort\", abortForCaller, { once: true });\n const timeout = setTimeout(() => {\n controller.abort();\n }, REMOTE_TIMEOUT_MS);\n try {\n return await this.loadWithController(referenceUri, controller);\n } catch (error) {\n if (\n error instanceof ReferenceResolutionFailure ||\n error instanceof ReferenceTransportFailure\n ) {\n throw error;\n }\n throw new ReferenceTransportFailure();\n } finally {\n clearTimeout(timeout);\n this.#resolverInput.signal.removeEventListener(\"abort\", abortForCaller);\n }\n }\n\n private async loadWithController(\n referenceUri: string,\n controller: AbortController\n ): Promise<AnySchemaObject> {\n const response = await fetchSchemaResponse(referenceUri, controller.signal);\n assertAllowedResponse(response);\n if (this.#resolverInput.signal.aborted) throw new ReferenceTransportFailure();\n const bytes = await readBoundedResponse(\n response,\n MAX_REMOTE_RESPONSE_BYTES,\n this.#resolverInput.signal\n );\n return schemaFromRemoteBytes(bytes, referenceUri);\n }\n\n private isAllowedReference(referenceUri: string): boolean {\n let url: URL;\n try {\n url = new URL(referenceUri);\n } catch {\n return false;\n }\n return this.#allowedHttpsSources.some(\n (source) =>\n url.origin === source.origin &&\n (source.pathPrefix === \"/\" || url.pathname.startsWith(source.pathPrefix))\n );\n }\n}\n\nasync function fetchSchemaResponse(referenceUri: string, signal: AbortSignal): Promise<Response> {\n if (typeof globalThis.fetch !== \"function\") throw new ReferenceTransportFailure();\n return globalThis.fetch(referenceUri, {\n credentials: \"omit\",\n method: \"GET\",\n redirect: \"manual\",\n signal\n });\n}\n\nfunction assertAllowedResponse(response: Response): void {\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw new ReferenceResolutionFailure(\"unapproved-reference\");\n }\n if (response.ok) return;\n if (response.status >= 500) throw new ReferenceTransportFailure();\n throw new ReferenceResolutionFailure(\"unapproved-reference\");\n}\n\nfunction schemaFromRemoteBytes(\n bytes: Uint8Array | \"too-large\",\n referenceUri: string\n): AnySchemaObject {\n if (bytes === \"too-large\") throw new ReferenceResolutionFailure(\"remote-document-invalid\");\n const document = inspectStrictJsonBytes(bytes);\n if (document.kind !== \"valid\" || !isJsonObject(document.jsonValue)) {\n throw new ReferenceResolutionFailure(\"remote-document-invalid\");\n }\n if (document.jsonValue.$id !== referenceUri) {\n throw new ReferenceResolutionFailure(\"remote-schema-id-mismatch\");\n }\n const referenceReason = inspectSchemaPolicy(document.jsonValue);\n if (referenceReason !== undefined) throw new ReferenceResolutionFailure(referenceReason);\n return document.jsonValue;\n}\n\nexport class ReferenceResolutionFailure extends Error {\n readonly reason: SchemaCompileReason;\n\n constructor(reason: SchemaCompileReason) {\n super(reason);\n this.reason = reason;\n }\n}\n\nexport class ReferenceTransportFailure extends Error {}\n"]}
@@ -90,8 +90,11 @@ function inspectDirectSchemaPolicy(schemaObject) {
90
90
  return "invalid-schema";
91
91
  if (hasUnsupportedReferenceKeyword(schemaObject))
92
92
  return "unsupported-reference";
93
- if (Object.hasOwn(schemaObject, "$id") && !permittedNestedIdentifier(schemaObject.$id)) {
94
- return "unsupported-reference";
93
+ if (Object.hasOwn(schemaObject, "$id")) {
94
+ const identifier = schemaObject.$id;
95
+ if (identifier === undefined || !permittedNestedIdentifier(identifier)) {
96
+ return "unsupported-reference";
97
+ }
95
98
  }
96
99
  return hasInvalidReferenceValue(schemaObject) ? "unsupported-reference" : undefined;
97
100
  }
@@ -99,7 +102,12 @@ function hasUnsupportedReferenceKeyword(schemaObject) {
99
102
  return Object.hasOwn(schemaObject, "$dynamicRef") || Object.hasOwn(schemaObject, "$recursiveRef");
100
103
  }
101
104
  function hasInvalidReferenceValue(schemaObject) {
102
- return ["$ref", "$schema"].some((key) => Object.hasOwn(schemaObject, key) && !permittedReference(schemaObject[key]));
105
+ return ["$ref", "$schema"].some((key) => {
106
+ if (!Object.hasOwn(schemaObject, key))
107
+ return false;
108
+ const reference = schemaObject[key];
109
+ return reference === undefined || !permittedReference(reference);
110
+ });
103
111
  }
104
112
  function inspectNestedSchemaPolicies(schemaObject) {
105
113
  for (const [keyword, keywordValue] of Object.entries(schemaObject)) {
@@ -1 +1 @@
1
- {"version":3,"file":"schema-policy.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-schema-validation/schema-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnySchema } from \"ajv\";\n\nimport type { ResolvedJsonSchemaValidationOptions } from \"./options.ts\";\nimport type { LoadedSchema, SchemaCompileReason } from \"./schema-engine.ts\";\nimport type { StrictJsonValue } from \"../json-document/strict-document.ts\";\n\nexport interface PreparedSchema {\n readonly authoringId: string;\n readonly engineId: string;\n readonly engineSchema: AnySchema;\n}\n\nexport function prepareSchema(\n loadedSchema: LoadedSchema,\n mode: ResolvedJsonSchemaValidationOptions[\"schemaIdentity\"][\"mode\"]\n): PreparedSchema | SchemaCompileReason {\n if (mode === \"configuration-authoritative\") {\n const documentValue = withConfigurationIdentity(loadedSchema.documentValue, loadedSchema.id);\n const engineSchema = toAjvSchema(documentValue);\n if (engineSchema === undefined) return \"invalid-schema\";\n const referenceReason = inspectSchemaPolicy(documentValue);\n if (referenceReason !== undefined) return referenceReason;\n return Object.freeze({\n authoringId: loadedSchema.id,\n engineId: loadedSchema.id,\n engineSchema\n });\n }\n\n if (!isJsonObject(loadedSchema.documentValue)) return \"missing-schema-id\";\n const documentId = loadedSchema.documentValue.$id;\n if (typeof documentId !== \"string\") return \"missing-schema-id\";\n if (!safeSchemaIdentifier(documentId)) return \"invalid-document-id\";\n if (mode === \"require-match\" && documentId !== loadedSchema.id) return \"schema-id-mismatch\";\n const referenceReason = inspectSchemaPolicy(loadedSchema.documentValue);\n if (referenceReason !== undefined) return referenceReason;\n return Object.freeze({\n authoringId: loadedSchema.id,\n engineId: documentId,\n engineSchema: loadedSchema.documentValue\n });\n}\n\nexport function rejectDuplicateEngineIds(\n preparedSchemas: Map<string, PreparedSchema>,\n failures: Map<string, SchemaCompileReason>\n): void {\n const byEngineId = new Map<string, string[]>();\n for (const preparedSchema of preparedSchemas.values()) {\n const authoringIds = byEngineId.get(preparedSchema.engineId) ?? [];\n authoringIds.push(preparedSchema.authoringId);\n byEngineId.set(preparedSchema.engineId, authoringIds);\n }\n for (const authoringIds of byEngineId.values()) {\n if (authoringIds.length < 2) continue;\n for (const authoringId of authoringIds) {\n preparedSchemas.delete(authoringId);\n failures.set(authoringId, \"duplicate-engine-id\");\n }\n }\n}\n\nfunction withConfigurationIdentity(\n documentValue: StrictJsonValue,\n configuredSchemaId: string\n): StrictJsonValue {\n if (!isJsonObject(documentValue)) return documentValue;\n const copy: Record<string, StrictJsonValue> = {};\n Object.setPrototypeOf(copy, null);\n for (const [key, nested] of Object.entries(documentValue)) {\n Object.defineProperty(copy, key, {\n configurable: false,\n enumerable: true,\n value: key === \"$id\" ? configuredSchemaId : nested,\n writable: false\n });\n }\n if (!Object.hasOwn(copy, \"$id\")) {\n Object.defineProperty(copy, \"$id\", {\n configurable: false,\n enumerable: true,\n value: configuredSchemaId,\n writable: false\n });\n }\n return Object.freeze(copy);\n}\n\n/**\n * Inspects only JSON Schema-bearing locations. Annotation payloads and property names are data, not keywords,\n * so they must not be mistaken for `$ref`, `$dynamicRef`, or an Ajv extension.\n */\nexport function inspectSchemaPolicy(schemaValue: StrictJsonValue): SchemaCompileReason | undefined {\n if (!isJsonObject(schemaValue)) return undefined;\n return inspectSchemaObject(schemaValue);\n}\n\nfunction inspectSchemaObject(\n schemaObject: Readonly<Record<string, StrictJsonValue>>\n): SchemaCompileReason | undefined {\n const directReason = inspectDirectSchemaPolicy(schemaObject);\n if (directReason !== undefined) return directReason;\n return inspectNestedSchemaPolicies(schemaObject);\n}\n\nfunction inspectDirectSchemaPolicy(\n schemaObject: Readonly<Record<string, StrictJsonValue>>\n): SchemaCompileReason | undefined {\n if (Object.hasOwn(schemaObject, \"$async\")) return \"invalid-schema\";\n if (hasUnsupportedReferenceKeyword(schemaObject)) return \"unsupported-reference\";\n if (Object.hasOwn(schemaObject, \"$id\") && !permittedNestedIdentifier(schemaObject.$id)) {\n return \"unsupported-reference\";\n }\n return hasInvalidReferenceValue(schemaObject) ? \"unsupported-reference\" : undefined;\n}\n\nfunction hasUnsupportedReferenceKeyword(\n schemaObject: Readonly<Record<string, StrictJsonValue>>\n): boolean {\n return Object.hasOwn(schemaObject, \"$dynamicRef\") || Object.hasOwn(schemaObject, \"$recursiveRef\");\n}\n\nfunction hasInvalidReferenceValue(\n schemaObject: Readonly<Record<string, StrictJsonValue>>\n): boolean {\n return [\"$ref\", \"$schema\"].some(\n (key) => Object.hasOwn(schemaObject, key) && !permittedReference(schemaObject[key])\n );\n}\n\nfunction inspectNestedSchemaPolicies(\n schemaObject: Readonly<Record<string, StrictJsonValue>>\n): SchemaCompileReason | undefined {\n for (const [keyword, keywordValue] of Object.entries(schemaObject)) {\n const reason = inspectNestedSchemaPolicy(keyword, keywordValue);\n if (reason !== undefined) return reason;\n }\n return undefined;\n}\n\nfunction inspectNestedSchemaPolicy(\n keyword: string,\n keywordValue: StrictJsonValue\n): SchemaCompileReason | undefined {\n if (SCHEMA_MAP_KEYWORDS.has(keyword)) return inspectSchemaMap(keywordValue);\n if (SCHEMA_VALUE_KEYWORDS.has(keyword)) return inspectSchemaValue(keywordValue);\n if (SCHEMA_ARRAY_KEYWORDS.has(keyword)) return inspectSchemaArray(keywordValue);\n if (keyword === \"dependencies\") return inspectLegacyDependencies(keywordValue);\n return undefined;\n}\n\nfunction inspectSchemaMap(schemaMap: StrictJsonValue): SchemaCompileReason | undefined {\n if (!isJsonObject(schemaMap)) return undefined;\n for (const nestedSchema of Object.values(schemaMap)) {\n const reason = inspectSchemaValue(nestedSchema);\n if (reason !== undefined) return reason;\n }\n return undefined;\n}\n\nfunction inspectSchemaValue(candidateSchema: StrictJsonValue): SchemaCompileReason | undefined {\n if (!isJsonObject(candidateSchema)) return undefined;\n return inspectSchemaObject(candidateSchema);\n}\n\nfunction inspectSchemaArray(schemaArray: StrictJsonValue): SchemaCompileReason | undefined {\n if (!isStrictJsonArray(schemaArray)) return undefined;\n for (const nestedSchema of schemaArray) {\n const reason = inspectSchemaValue(nestedSchema);\n if (reason !== undefined) return reason;\n }\n return undefined;\n}\n\nfunction inspectLegacyDependencies(\n dependencyMap: StrictJsonValue\n): SchemaCompileReason | undefined {\n if (!isJsonObject(dependencyMap)) return undefined;\n for (const dependencySchema of Object.values(dependencyMap)) {\n const reason = inspectSchemaValue(dependencySchema);\n if (reason !== undefined) return reason;\n }\n return undefined;\n}\n\nconst SCHEMA_MAP_KEYWORDS: ReadonlySet<string> = new Set([\n \"$defs\",\n \"definitions\",\n \"dependentSchemas\",\n \"patternProperties\",\n \"properties\"\n]);\n\nconst SCHEMA_VALUE_KEYWORDS: ReadonlySet<string> = new Set([\n \"additionalItems\",\n \"additionalProperties\",\n \"contains\",\n \"contentSchema\",\n \"else\",\n \"if\",\n \"items\",\n \"not\",\n \"propertyNames\",\n \"then\",\n \"unevaluatedItems\",\n \"unevaluatedProperties\"\n]);\n\nconst SCHEMA_ARRAY_KEYWORDS: ReadonlySet<string> = new Set([\n \"allOf\",\n \"anyOf\",\n \"oneOf\",\n \"prefixItems\"\n]);\n\nfunction permittedReference(referenceValue: StrictJsonValue): boolean {\n if (typeof referenceValue !== \"string\") return false;\n if (referenceValue.startsWith(\"#\")) return true;\n try {\n const url = new URL(referenceValue);\n return (\n (url.protocol === \"https:\" || url.protocol === \"urn:\") &&\n url.username.length === 0 &&\n url.password.length === 0 &&\n url.search.length === 0\n );\n } catch {\n return false;\n }\n}\n\nfunction permittedNestedIdentifier(identifierValue: StrictJsonValue): boolean {\n return (\n typeof identifierValue === \"string\" &&\n (identifierValue.startsWith(\"#\") || safeSchemaIdentifier(identifierValue))\n );\n}\n\nfunction safeSchemaIdentifier(identifier: string): boolean {\n try {\n const url = new URL(identifier);\n return (\n (url.protocol === \"https:\" || url.protocol === \"urn:\") &&\n url.username.length === 0 &&\n url.password.length === 0 &&\n url.search.length === 0 &&\n url.hash.length === 0 &&\n url.href === identifier\n );\n } catch {\n return false;\n }\n}\n\nexport function isJsonObject(\n candidateValue: StrictJsonValue\n): candidateValue is Readonly<Record<string, StrictJsonValue>> {\n return (\n typeof candidateValue === \"object\" &&\n candidateValue !== null &&\n !isStrictJsonArray(candidateValue)\n );\n}\n\nfunction isStrictJsonArray(\n candidateValue: StrictJsonValue\n): candidateValue is readonly StrictJsonValue[] {\n return Array.isArray(candidateValue);\n}\n\nfunction toAjvSchema(documentValue: StrictJsonValue): AnySchema | undefined {\n if (typeof documentValue === \"boolean\") return documentValue;\n if (!isJsonObject(documentValue)) return undefined;\n return documentValue;\n}\n"]}
1
+ {"version":3,"file":"schema-policy.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-schema-validation/schema-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnySchema } from \"ajv\";\n\nimport type { ResolvedJsonSchemaValidationOptions } from \"./options.ts\";\nimport type { LoadedSchema, SchemaCompileReason } from \"./schema-engine.ts\";\nimport type { StrictJsonValue } from \"../json-document/strict-document.ts\";\n\nexport interface PreparedSchema {\n readonly authoringId: string;\n readonly engineId: string;\n readonly engineSchema: AnySchema;\n}\n\nexport function prepareSchema(\n loadedSchema: LoadedSchema,\n mode: ResolvedJsonSchemaValidationOptions[\"schemaIdentity\"][\"mode\"]\n): PreparedSchema | SchemaCompileReason {\n if (mode === \"configuration-authoritative\") {\n const documentValue = withConfigurationIdentity(loadedSchema.documentValue, loadedSchema.id);\n const engineSchema = toAjvSchema(documentValue);\n if (engineSchema === undefined) return \"invalid-schema\";\n const referenceReason = inspectSchemaPolicy(documentValue);\n if (referenceReason !== undefined) return referenceReason;\n return Object.freeze({\n authoringId: loadedSchema.id,\n engineId: loadedSchema.id,\n engineSchema\n });\n }\n\n if (!isJsonObject(loadedSchema.documentValue)) return \"missing-schema-id\";\n const documentId = loadedSchema.documentValue.$id;\n if (typeof documentId !== \"string\") return \"missing-schema-id\";\n if (!safeSchemaIdentifier(documentId)) return \"invalid-document-id\";\n if (mode === \"require-match\" && documentId !== loadedSchema.id) return \"schema-id-mismatch\";\n const referenceReason = inspectSchemaPolicy(loadedSchema.documentValue);\n if (referenceReason !== undefined) return referenceReason;\n return Object.freeze({\n authoringId: loadedSchema.id,\n engineId: documentId,\n engineSchema: loadedSchema.documentValue\n });\n}\n\nexport function rejectDuplicateEngineIds(\n preparedSchemas: Map<string, PreparedSchema>,\n failures: Map<string, SchemaCompileReason>\n): void {\n const byEngineId = new Map<string, string[]>();\n for (const preparedSchema of preparedSchemas.values()) {\n const authoringIds = byEngineId.get(preparedSchema.engineId) ?? [];\n authoringIds.push(preparedSchema.authoringId);\n byEngineId.set(preparedSchema.engineId, authoringIds);\n }\n for (const authoringIds of byEngineId.values()) {\n if (authoringIds.length < 2) continue;\n for (const authoringId of authoringIds) {\n preparedSchemas.delete(authoringId);\n failures.set(authoringId, \"duplicate-engine-id\");\n }\n }\n}\n\nfunction withConfigurationIdentity(\n documentValue: StrictJsonValue,\n configuredSchemaId: string\n): StrictJsonValue {\n if (!isJsonObject(documentValue)) return documentValue;\n const copy: Record<string, StrictJsonValue> = {};\n Object.setPrototypeOf(copy, null);\n for (const [key, nested] of Object.entries(documentValue)) {\n Object.defineProperty(copy, key, {\n configurable: false,\n enumerable: true,\n value: key === \"$id\" ? configuredSchemaId : nested,\n writable: false\n });\n }\n if (!Object.hasOwn(copy, \"$id\")) {\n Object.defineProperty(copy, \"$id\", {\n configurable: false,\n enumerable: true,\n value: configuredSchemaId,\n writable: false\n });\n }\n return Object.freeze(copy);\n}\n\n/**\n * Inspects only JSON Schema-bearing locations. Annotation payloads and property names are data, not keywords,\n * so they must not be mistaken for `$ref`, `$dynamicRef`, or an Ajv extension.\n */\nexport function inspectSchemaPolicy(schemaValue: StrictJsonValue): SchemaCompileReason | undefined {\n if (!isJsonObject(schemaValue)) return undefined;\n return inspectSchemaObject(schemaValue);\n}\n\nfunction inspectSchemaObject(\n schemaObject: Readonly<Record<string, StrictJsonValue>>\n): SchemaCompileReason | undefined {\n const directReason = inspectDirectSchemaPolicy(schemaObject);\n if (directReason !== undefined) return directReason;\n return inspectNestedSchemaPolicies(schemaObject);\n}\n\nfunction inspectDirectSchemaPolicy(\n schemaObject: Readonly<Record<string, StrictJsonValue>>\n): SchemaCompileReason | undefined {\n if (Object.hasOwn(schemaObject, \"$async\")) return \"invalid-schema\";\n if (hasUnsupportedReferenceKeyword(schemaObject)) return \"unsupported-reference\";\n if (Object.hasOwn(schemaObject, \"$id\")) {\n const identifier = schemaObject.$id;\n if (identifier === undefined || !permittedNestedIdentifier(identifier)) {\n return \"unsupported-reference\";\n }\n }\n return hasInvalidReferenceValue(schemaObject) ? \"unsupported-reference\" : undefined;\n}\n\nfunction hasUnsupportedReferenceKeyword(\n schemaObject: Readonly<Record<string, StrictJsonValue>>\n): boolean {\n return Object.hasOwn(schemaObject, \"$dynamicRef\") || Object.hasOwn(schemaObject, \"$recursiveRef\");\n}\n\nfunction hasInvalidReferenceValue(\n schemaObject: Readonly<Record<string, StrictJsonValue>>\n): boolean {\n return [\"$ref\", \"$schema\"].some((key) => {\n if (!Object.hasOwn(schemaObject, key)) return false;\n const reference = schemaObject[key];\n return reference === undefined || !permittedReference(reference);\n });\n}\n\nfunction inspectNestedSchemaPolicies(\n schemaObject: Readonly<Record<string, StrictJsonValue>>\n): SchemaCompileReason | undefined {\n for (const [keyword, keywordValue] of Object.entries(schemaObject)) {\n const reason = inspectNestedSchemaPolicy(keyword, keywordValue);\n if (reason !== undefined) return reason;\n }\n return undefined;\n}\n\nfunction inspectNestedSchemaPolicy(\n keyword: string,\n keywordValue: StrictJsonValue\n): SchemaCompileReason | undefined {\n if (SCHEMA_MAP_KEYWORDS.has(keyword)) return inspectSchemaMap(keywordValue);\n if (SCHEMA_VALUE_KEYWORDS.has(keyword)) return inspectSchemaValue(keywordValue);\n if (SCHEMA_ARRAY_KEYWORDS.has(keyword)) return inspectSchemaArray(keywordValue);\n if (keyword === \"dependencies\") return inspectLegacyDependencies(keywordValue);\n return undefined;\n}\n\nfunction inspectSchemaMap(schemaMap: StrictJsonValue): SchemaCompileReason | undefined {\n if (!isJsonObject(schemaMap)) return undefined;\n for (const nestedSchema of Object.values(schemaMap)) {\n const reason = inspectSchemaValue(nestedSchema);\n if (reason !== undefined) return reason;\n }\n return undefined;\n}\n\nfunction inspectSchemaValue(candidateSchema: StrictJsonValue): SchemaCompileReason | undefined {\n if (!isJsonObject(candidateSchema)) return undefined;\n return inspectSchemaObject(candidateSchema);\n}\n\nfunction inspectSchemaArray(schemaArray: StrictJsonValue): SchemaCompileReason | undefined {\n if (!isStrictJsonArray(schemaArray)) return undefined;\n for (const nestedSchema of schemaArray) {\n const reason = inspectSchemaValue(nestedSchema);\n if (reason !== undefined) return reason;\n }\n return undefined;\n}\n\nfunction inspectLegacyDependencies(\n dependencyMap: StrictJsonValue\n): SchemaCompileReason | undefined {\n if (!isJsonObject(dependencyMap)) return undefined;\n for (const dependencySchema of Object.values(dependencyMap)) {\n const reason = inspectSchemaValue(dependencySchema);\n if (reason !== undefined) return reason;\n }\n return undefined;\n}\n\nconst SCHEMA_MAP_KEYWORDS: ReadonlySet<string> = new Set([\n \"$defs\",\n \"definitions\",\n \"dependentSchemas\",\n \"patternProperties\",\n \"properties\"\n]);\n\nconst SCHEMA_VALUE_KEYWORDS: ReadonlySet<string> = new Set([\n \"additionalItems\",\n \"additionalProperties\",\n \"contains\",\n \"contentSchema\",\n \"else\",\n \"if\",\n \"items\",\n \"not\",\n \"propertyNames\",\n \"then\",\n \"unevaluatedItems\",\n \"unevaluatedProperties\"\n]);\n\nconst SCHEMA_ARRAY_KEYWORDS: ReadonlySet<string> = new Set([\n \"allOf\",\n \"anyOf\",\n \"oneOf\",\n \"prefixItems\"\n]);\n\nfunction permittedReference(referenceValue: StrictJsonValue): boolean {\n if (typeof referenceValue !== \"string\") return false;\n if (referenceValue.startsWith(\"#\")) return true;\n try {\n const url = new URL(referenceValue);\n return (\n (url.protocol === \"https:\" || url.protocol === \"urn:\") &&\n url.username.length === 0 &&\n url.password.length === 0 &&\n url.search.length === 0\n );\n } catch {\n return false;\n }\n}\n\nfunction permittedNestedIdentifier(identifierValue: StrictJsonValue): boolean {\n return (\n typeof identifierValue === \"string\" &&\n (identifierValue.startsWith(\"#\") || safeSchemaIdentifier(identifierValue))\n );\n}\n\nfunction safeSchemaIdentifier(identifier: string): boolean {\n try {\n const url = new URL(identifier);\n return (\n (url.protocol === \"https:\" || url.protocol === \"urn:\") &&\n url.username.length === 0 &&\n url.password.length === 0 &&\n url.search.length === 0 &&\n url.hash.length === 0 &&\n url.href === identifier\n );\n } catch {\n return false;\n }\n}\n\nexport function isJsonObject(\n candidateValue: StrictJsonValue\n): candidateValue is Readonly<Record<string, StrictJsonValue>> {\n return (\n typeof candidateValue === \"object\" &&\n candidateValue !== null &&\n !isStrictJsonArray(candidateValue)\n );\n}\n\nfunction isStrictJsonArray(\n candidateValue: StrictJsonValue\n): candidateValue is readonly StrictJsonValue[] {\n return Array.isArray(candidateValue);\n}\n\nfunction toAjvSchema(documentValue: StrictJsonValue): AnySchema | undefined {\n if (typeof documentValue === \"boolean\") return documentValue;\n if (!isJsonObject(documentValue)) return undefined;\n return documentValue;\n}\n"]}
@@ -1,25 +1,23 @@
1
1
  import { defineCheck } from "../../check/check.mjs";
2
+ import { resolvePackageCheckAuthoringInput } from "../check-authoring.mjs";
2
3
  import { JSON_VALIDATION_CHECK_DEFINITION, executeJsonValidation } from "./json-validation.mjs";
3
4
  import { parseJsonValidationData } from "./final-data.mjs";
4
5
  import { resolveJsonValidationOptions } from "./options-resolution.mjs";
5
6
  import { validJsonValidationOptions } from "./options-validation.mjs";
6
- /**
7
- * 使用可省略的文件范围与 byte limit 构造严格 JSON document Check。
8
- *
9
- * @param options - 省略字段由 package 补齐;显式 files 数组作为对应字段的完整替换值。
10
- * @returns 固定 `json-validation` identity、完整冻结 options、final-data parser 与执行逻辑。
11
- * @throws {TypeError} input 含未知字段、非法文件选择或非法 byte limit 时抛出。
12
- */
13
7
  export function jsonValidation(options = {}) {
14
- const resolvedOptions = resolveJsonValidationOptions(options);
8
+ const input = resolvePackageCheckAuthoringInput(options, ["files", "maximumBytes"], JSON_VALIDATION_CHECK_DEFINITION);
9
+ if (input === undefined) {
10
+ throw new TypeError("jsonValidation options must match the documented closed policy");
11
+ }
12
+ const resolvedOptions = resolveJsonValidationOptions(input.domainOptions);
15
13
  if (resolvedOptions === undefined) {
16
14
  throw new TypeError("jsonValidation options must match the documented closed policy");
17
15
  }
18
16
  return defineCheck({
19
- ...JSON_VALIDATION_CHECK_DEFINITION,
20
- execution: executeJsonValidation,
17
+ ...input.definition,
18
+ execute: executeJsonValidation,
21
19
  parseData: parseJsonValidationData,
22
- preflight: (preparedOptions) => validJsonValidationOptions(preparedOptions)
20
+ prepare: (preparedOptions) => validJsonValidationOptions(preparedOptions)
23
21
  ? { status: "success", preparedOptions }
24
22
  : {
25
23
  status: "failure",
@@ -1 +1 @@
1
- {"version":3,"file":"default-check.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-validation/default-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,gCAAgC,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAO,GAA0B,EAAE;IAMnC,MAAM,eAAe,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAC9D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,gCAAgC;QACnC,SAAS,EAAE,qBAAqB;QAChC,SAAS,EAAE,uBAAuB;QAClC,SAAS,EAAE,CAAC,eAAe,EAAE,EAAE,CAC7B,0BAA0B,CAAC,eAAe,CAAC;YACzC,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,+HAA+H;qBAClI;iBACF;aACF;QACP,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { defineCheck, type TypedCheckWithOptions } from \"../../check/check.ts\";\nimport { JSON_VALIDATION_CHECK_DEFINITION, executeJsonValidation } from \"./json-validation.ts\";\nimport { parseJsonValidationData } from \"./final-data.ts\";\nimport type { JsonValidationOptions, ResolvedJsonValidationOptions } from \"./options.ts\";\nimport { resolveJsonValidationOptions } from \"./options-resolution.ts\";\nimport { validJsonValidationOptions } from \"./options-validation.ts\";\n\n/**\n * 使用可省略的文件范围与 byte limit 构造严格 JSON document Check。\n *\n * @param options - 省略字段由 package 补齐;显式 files 数组作为对应字段的完整替换值。\n * @returns 固定 `json-validation` identity、完整冻结 options、final-data parser 与执行逻辑。\n * @throws {TypeError} input 含未知字段、非法文件选择或非法 byte limit 时抛出。\n */\nexport function jsonValidation(\n options: JsonValidationOptions = {}\n): TypedCheckWithOptions<\n \"json-validation\",\n ResolvedJsonValidationOptions,\n typeof parseJsonValidationData\n> {\n const resolvedOptions = resolveJsonValidationOptions(options);\n if (resolvedOptions === undefined) {\n throw new TypeError(\"jsonValidation options must match the documented closed policy\");\n }\n return defineCheck({\n ...JSON_VALIDATION_CHECK_DEFINITION,\n execution: executeJsonValidation,\n parseData: parseJsonValidationData,\n preflight: (preparedOptions) =>\n validJsonValidationOptions(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 \"jsonValidation options are invalid; recreate the Check with jsonValidation(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
1
+ {"version":3,"file":"default-check.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-validation/default-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,iCAAiC,EAElC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gCAAgC,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAsBrE,MAAM,UAAU,cAAc,CAC5B,OAAO,GAA0B,EAAE;IAEnC,MAAM,KAAK,GAAG,iCAAiC,CAC7C,OAAO,EACP,CAAC,OAAO,EAAE,cAAc,CAAC,EACzB,gCAAgC,CACjC,CAAC;IACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,eAAe,GAAG,4BAA4B,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1E,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,KAAK,CAAC,UAAU;QACnB,OAAO,EAAE,qBAAqB;QAC9B,SAAS,EAAE,uBAAuB;QAClC,OAAO,EAAE,CAAC,eAAe,EAAE,EAAE,CAC3B,0BAA0B,CAAC,eAAe,CAAC;YACzC,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,+HAA+H;qBAClI;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 { JSON_VALIDATION_CHECK_DEFINITION, executeJsonValidation } from \"./json-validation.ts\";\nimport { parseJsonValidationData } from \"./final-data.ts\";\nimport type { JsonValidationOptions, ResolvedJsonValidationOptions } from \"./options.ts\";\nimport { resolveJsonValidationOptions } from \"./options-resolution.ts\";\nimport { validJsonValidationOptions } from \"./options-validation.ts\";\n\n/**\n * 使用可省略的文件范围与 byte limit 构造严格 JSON document Check。\n *\n * @param options - 省略字段由 package 补齐;显式 files 数组作为对应字段的完整替换值。\n * @returns 固定 `json-validation` identity、完整冻结 options、final-data parser 与执行逻辑。\n * @throws {TypeError} input 含未知字段、非法文件选择或非法 byte limit 时抛出。\n */\nexport function jsonValidation(\n options?: JsonValidationOptions<\"json-validation\">\n): TypedCheckWithOptions<\n \"json-validation\",\n ResolvedJsonValidationOptions,\n typeof parseJsonValidationData\n>;\nexport function jsonValidation<const Id extends string>(\n options: JsonValidationOptions<Id> & PackageCheckIdentityInput<Id>\n): TypedCheckWithOptions<Id, ResolvedJsonValidationOptions, typeof parseJsonValidationData>;\nexport function jsonValidation(\n options: JsonValidationOptions\n): TypedCheckWithOptions<string, ResolvedJsonValidationOptions, typeof parseJsonValidationData>;\nexport function jsonValidation(\n options: JsonValidationOptions = {}\n): TypedCheckWithOptions<string, ResolvedJsonValidationOptions, typeof parseJsonValidationData> {\n const input = resolvePackageCheckAuthoringInput(\n options,\n [\"files\", \"maximumBytes\"],\n JSON_VALIDATION_CHECK_DEFINITION\n );\n if (input === undefined) {\n throw new TypeError(\"jsonValidation options must match the documented closed policy\");\n }\n const resolvedOptions = resolveJsonValidationOptions(input.domainOptions);\n if (resolvedOptions === undefined) {\n throw new TypeError(\"jsonValidation options must match the documented closed policy\");\n }\n return defineCheck({\n ...input.definition,\n execute: executeJsonValidation,\n parseData: parseJsonValidationData,\n prepare: (preparedOptions) =>\n validJsonValidationOptions(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 \"jsonValidation options are invalid; recreate the Check with jsonValidation(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-validation/options.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\n\n/** `jsonValidation(options?)` 接受的可省略 authoring policy。 */\nexport interface JsonValidationOptions {\n /** 参与本 Check 的 repository-file selection;省略字段使用 package defaults。 */\n readonly files?: ProjectFileSelectionOptions;\n /** 单个 JSON document 允许的最大 raw byte 数;省略时为 1 MiB。 */\n readonly maximumBytes?: number;\n}\n\n/** `json-validation` execution 消费的完整、冻结 options。 */\nexport interface ResolvedJsonValidationOptions {\n readonly files: ProjectFileSelection;\n readonly maximumBytes: number;\n}\n"]}
1
+ {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-validation/options.ts"],"names":[],"mappings":"","sourcesContent":["import type { PackageCheckAuthoringOptions } from \"../check-authoring.ts\";\nimport type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\n\n/** `jsonValidation(options?)` 接受的可省略 authoring policy。 */\nexport interface JsonValidationOptions<\n Id extends string = string\n> extends PackageCheckAuthoringOptions<Id> {\n /** 参与本 Check 的 repository-file selection;省略字段使用 package defaults。 */\n readonly files?: ProjectFileSelectionOptions;\n /** 单个 JSON document 允许的最大 raw byte 数;省略时为 1 MiB。 */\n readonly maximumBytes?: number;\n}\n\n/** `json-validation` execution 消费的完整、冻结 options。 */\nexport interface ResolvedJsonValidationOptions {\n readonly files: ProjectFileSelection;\n readonly maximumBytes: number;\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { isAbsolute } from "node:path";
2
+ import { hasExactPlainRecordKeys, snapshotClosedRecord, snapshotExactClosedRecord } from "../data-boundary/closed-values.mjs";
3
+ export function resolveOptionalLocalCacheOptions(value) {
4
+ if (value === undefined)
5
+ return Object.freeze({ enabled: false });
6
+ const cache = snapshotClosedRecord(value);
7
+ if (cache === undefined)
8
+ return undefined;
9
+ if (hasExactPlainRecordKeys(cache, ["enabled"]) && cache.enabled === false)
10
+ return Object.freeze({ enabled: false });
11
+ if (hasExactPlainRecordKeys(cache, ["enabled", "directory"]) &&
12
+ cache.enabled === true &&
13
+ typeof cache.directory === "string")
14
+ return Object.freeze({ enabled: true, directory: cache.directory });
15
+ return undefined;
16
+ }
17
+ export function validLocalCacheOptions(value) {
18
+ const disabled = snapshotExactClosedRecord(value, ["enabled"]);
19
+ if (disabled?.enabled === false)
20
+ return true;
21
+ const enabled = snapshotExactClosedRecord(value, ["enabled", "directory"]);
22
+ return (enabled?.enabled === true &&
23
+ typeof enabled.directory === "string" &&
24
+ enabled.directory.length > 0 &&
25
+ !enabled.directory.includes("\0") &&
26
+ isAbsolute(enabled.directory));
27
+ }
28
+ //# sourceMappingURL=local-cache-options.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-cache-options.mjs","sourceRoot":"","sources":["../../../src/package-checks/local-cache-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,mCAAmC,CAAC;AAO3C,MAAM,UAAU,gCAAgC,CAAC,KAAc;IAC7D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAc,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,uBAAuB,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK;QACxE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAc,EAAE,CAAC,CAAC;IACpD,IACE,uBAAuB,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACxD,KAAK,CAAC,OAAO,KAAK,IAAI;QACtB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QAEnC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/D,IAAI,QAAQ,EAAE,OAAO,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3E,OAAO,CACL,OAAO,EAAE,OAAO,KAAK,IAAI;QACzB,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;QACrC,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAC5B,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAC9B,CAAC;AACJ,CAAC","sourcesContent":["import { isAbsolute } from \"node:path\";\n\nimport {\n hasExactPlainRecordKeys,\n snapshotClosedRecord,\n snapshotExactClosedRecord\n} from \"../data-boundary/closed-values.ts\";\n\n/** Shared closed grammar for an explicitly owned, deletable local cache directory. */\nexport type LocalCacheOptions =\n | Readonly<{ readonly enabled: false }>\n | Readonly<{ readonly enabled: true; readonly directory: string }>;\n\nexport function resolveOptionalLocalCacheOptions(value: unknown): LocalCacheOptions | undefined {\n if (value === undefined) return Object.freeze({ enabled: false as const });\n const cache = snapshotClosedRecord(value);\n if (cache === undefined) return undefined;\n if (hasExactPlainRecordKeys(cache, [\"enabled\"]) && cache.enabled === false)\n return Object.freeze({ enabled: false as const });\n if (\n hasExactPlainRecordKeys(cache, [\"enabled\", \"directory\"]) &&\n cache.enabled === true &&\n typeof cache.directory === \"string\"\n )\n return Object.freeze({ enabled: true as const, directory: cache.directory });\n return undefined;\n}\n\nexport function validLocalCacheOptions(value: unknown): value is LocalCacheOptions {\n const disabled = snapshotExactClosedRecord(value, [\"enabled\"]);\n if (disabled?.enabled === false) return true;\n const enabled = snapshotExactClosedRecord(value, [\"enabled\", \"directory\"]);\n return (\n enabled?.enabled === true &&\n typeof enabled.directory === \"string\" &&\n enabled.directory.length > 0 &&\n !enabled.directory.includes(\"\\0\") &&\n isAbsolute(enabled.directory)\n );\n}\n"]}