@hawkeyexl/manni 4.11.0 → 4.12.1

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 (238) hide show
  1. package/README.md +1 -1
  2. package/dist/{batch-UAULUMGH.js → batch-KMGZMIAQ.js} +20 -19
  3. package/dist/build-NO4AWCYG.js +36 -0
  4. package/dist/calibrate-XQUG5XAK.js +41 -0
  5. package/dist/capture-5XE3ZMXK.js +38 -0
  6. package/dist/{check-YEOYBFST.js → check-HTNPLWOV.js} +19 -18
  7. package/dist/check-RJ45IBA6.js +34 -0
  8. package/dist/{check-VELUQAUW.js → check-W24BQNCT.js} +35 -34
  9. package/dist/{check-VELUQAUW.js.map → check-W24BQNCT.js.map} +1 -1
  10. package/dist/check-WFXSXICD.js +30 -0
  11. package/dist/{chunk-IGSHYP74.js → chunk-23P7KMJM.js} +4 -4
  12. package/dist/{chunk-HA6MQMOY.js → chunk-24J7TYPU.js} +6 -6
  13. package/dist/{chunk-PCS4VJBV.js → chunk-37QJLVS3.js} +9 -9
  14. package/dist/{chunk-4CK6ZSOK.js → chunk-3P6KCU36.js} +3 -3
  15. package/dist/{chunk-54F74XR3.js → chunk-5JBVFWVP.js} +19 -19
  16. package/dist/{chunk-B7XYNRJQ.js → chunk-6KIYVVKL.js} +2 -2
  17. package/dist/{chunk-J6IDQGJL.js → chunk-6TVH4FI7.js} +469 -85
  18. package/dist/chunk-6TVH4FI7.js.map +1 -0
  19. package/dist/{chunk-GDVZ5VII.js → chunk-7A452BPZ.js} +4 -4
  20. package/dist/{chunk-M42DZCOU.js → chunk-7FCLXEAQ.js} +2 -2
  21. package/dist/{chunk-2MJ62AYQ.js → chunk-7MCQHTQ5.js} +4 -3
  22. package/dist/chunk-7MCQHTQ5.js.map +1 -0
  23. package/dist/{chunk-LBSCW232.js → chunk-7NXPQKSB.js} +7 -7
  24. package/dist/{chunk-OPXWPJDA.js → chunk-A3TEDWBZ.js} +14 -14
  25. package/dist/{chunk-BBT6AVUG.js → chunk-BHHXU2D2.js} +2 -2
  26. package/dist/{chunk-D4N2V43Z.js → chunk-CEI2J42X.js} +13 -7
  27. package/dist/chunk-CEI2J42X.js.map +1 -0
  28. package/dist/{chunk-FQXWVS6J.js → chunk-CMMBWHT2.js} +9 -9
  29. package/dist/{chunk-EIFCP6CZ.js → chunk-CO47QJKZ.js} +2 -2
  30. package/dist/{chunk-2DRHT73U.js → chunk-CVZMKWZ5.js} +913 -1398
  31. package/dist/chunk-CVZMKWZ5.js.map +1 -0
  32. package/dist/{chunk-ADMEPUBT.js → chunk-CXWTNT2O.js} +3 -3
  33. package/dist/{chunk-LKP7QDFN.js → chunk-DAQTRAP5.js} +4 -4
  34. package/dist/chunk-DSWKBZWW.js +16 -0
  35. package/dist/chunk-DSWKBZWW.js.map +1 -0
  36. package/dist/{chunk-PWBH7DCQ.js → chunk-EESH6COU.js} +4 -4
  37. package/dist/{chunk-JPQDNYXH.js → chunk-EM67O2ET.js} +8 -2
  38. package/dist/chunk-EM67O2ET.js.map +1 -0
  39. package/dist/{chunk-HQR2ZBHW.js → chunk-I2XQRRP7.js} +36 -7
  40. package/dist/chunk-I2XQRRP7.js.map +1 -0
  41. package/dist/{chunk-NCPWXHDO.js → chunk-JEUFYSFQ.js} +4 -4
  42. package/dist/{chunk-2IR4T5PO.js → chunk-JJ4RSDSY.js} +2 -2
  43. package/dist/chunk-KCB5JCK4.js +2272 -0
  44. package/dist/chunk-KCB5JCK4.js.map +1 -0
  45. package/dist/{chunk-VSEBFHAY.js → chunk-KFKL4VTL.js} +11369 -10218
  46. package/dist/chunk-KFKL4VTL.js.map +1 -0
  47. package/dist/{chunk-PCQ7ELJH.js → chunk-L2TD7DZB.js} +109 -5
  48. package/dist/chunk-L2TD7DZB.js.map +1 -0
  49. package/dist/{chunk-WDWXAYVH.js → chunk-L3RLGGRK.js} +4 -4
  50. package/dist/{chunk-T7JAOYE5.js → chunk-L75CAZG4.js} +6 -6
  51. package/dist/{chunk-U7CTFN2J.js → chunk-MYRPMSOX.js} +7 -7
  52. package/dist/{chunk-Y6DOMTQD.js → chunk-NCF5NQV5.js} +27 -27
  53. package/dist/chunk-NCF5NQV5.js.map +1 -0
  54. package/dist/{chunk-WQWKYAAK.js → chunk-NUQF5F5J.js} +2 -2
  55. package/dist/{chunk-FUCPZVRY.js → chunk-OEN6FBUW.js} +2 -2
  56. package/dist/{chunk-FBMZJEB3.js → chunk-OKMTUAWO.js} +4 -4
  57. package/dist/{chunk-QLWC7MKD.js → chunk-OTJOBZJ5.js} +135 -135
  58. package/dist/chunk-OTJOBZJ5.js.map +1 -0
  59. package/dist/{chunk-R4WXQIOZ.js → chunk-PCEM5FOZ.js} +3 -3
  60. package/dist/{chunk-4D5IZSXM.js → chunk-PXNCRGUL.js} +3 -3
  61. package/dist/chunk-Q2QC5AZB.js +1868 -0
  62. package/dist/chunk-Q2QC5AZB.js.map +1 -0
  63. package/dist/{chunk-ODRPL3WB.js → chunk-Q3ODX5PF.js} +2 -2
  64. package/dist/{chunk-KGEQJ5CC.js → chunk-RRFFUWDL.js} +8 -8
  65. package/dist/{chunk-NSBXVPZL.js → chunk-S3XUYW5K.js} +17 -17
  66. package/dist/{chunk-LPIF5LIE.js → chunk-SAU2WQFC.js} +2 -2
  67. package/dist/{chunk-MSRU4D4P.js → chunk-SFLICIQV.js} +2 -2
  68. package/dist/{chunk-NGTVREIH.js → chunk-U6IHLEWT.js} +2 -2
  69. package/dist/{chunk-QCHVR4ZM.js → chunk-VM7VAFJW.js} +33 -7
  70. package/dist/chunk-VM7VAFJW.js.map +1 -0
  71. package/dist/{chunk-6HWBRZIN.js → chunk-VQYGLU4C.js} +252 -193
  72. package/dist/chunk-VQYGLU4C.js.map +1 -0
  73. package/dist/{chunk-2IAZEB45.js → chunk-WGMFDG6U.js} +229 -821
  74. package/dist/chunk-WGMFDG6U.js.map +1 -0
  75. package/dist/{chunk-GV56WGL2.js → chunk-WO4JYWZK.js} +1036 -883
  76. package/dist/chunk-WO4JYWZK.js.map +1 -0
  77. package/dist/chunk-XYRUDFKS.js +685 -0
  78. package/dist/chunk-XYRUDFKS.js.map +1 -0
  79. package/dist/{chunk-VQK4VHLF.js → chunk-YQV75FIL.js} +2 -2
  80. package/dist/chunk-YUTVAMWW.js +2 -0
  81. package/dist/{chunk-RLT5SEML.js → chunk-Z5MZCCTT.js} +6 -6
  82. package/dist/{chunk-BKVHX6FU.js → chunk-ZIRBFXDW.js} +5 -10
  83. package/dist/chunk-ZIRBFXDW.js.map +1 -0
  84. package/dist/{cli-O4ABTN4Z.js → cli-236TGVJG.js} +31 -30
  85. package/dist/{cli-O4ABTN4Z.js.map → cli-236TGVJG.js.map} +1 -1
  86. package/dist/{cli-3BTCK4AB.js → cli-3FAPJBEY.js} +27 -26
  87. package/dist/{cli-3BTCK4AB.js.map → cli-3FAPJBEY.js.map} +1 -1
  88. package/dist/{cli-JJMOVIKS.js → cli-BS43EVCD.js} +14 -14
  89. package/dist/{cli-RORDPAPE.js → cli-CMR4FYF6.js} +59 -38
  90. package/dist/cli-CMR4FYF6.js.map +1 -0
  91. package/dist/{cli-ONTC5PKT.js → cli-FX53PBQ3.js} +9 -9
  92. package/dist/{cli-6KZTHWGP.js → cli-IQNJLKSN.js} +37 -36
  93. package/dist/{cli-6KZTHWGP.js.map → cli-IQNJLKSN.js.map} +1 -1
  94. package/dist/{cli-4MF37HAQ.js → cli-KOMXVPXX.js} +26 -25
  95. package/dist/{cli-4MF37HAQ.js.map → cli-KOMXVPXX.js.map} +1 -1
  96. package/dist/{cli-I62SRH3R.js → cli-NGL63E53.js} +14 -13
  97. package/dist/{cli-DRMZBZLB.js → cli-QPGS2MR5.js} +43 -42
  98. package/dist/{cli-DRMZBZLB.js.map → cli-QPGS2MR5.js.map} +1 -1
  99. package/dist/{cli-VID7PJS3.js → cli-RKQX4TI3.js} +23 -22
  100. package/dist/{cli-VID7PJS3.js.map → cli-RKQX4TI3.js.map} +1 -1
  101. package/dist/{cli-VUKMWSSF.js → cli-WNEI5L7P.js} +4 -4
  102. package/dist/cli.js +19 -13
  103. package/dist/cli.js.map +1 -1
  104. package/dist/{config-XDA42RJL.js → config-JJW75SBX.js} +5 -5
  105. package/dist/docmeta.js +13 -12
  106. package/dist/docmeta.js.map +1 -1
  107. package/dist/github-4UR67MEN.js +35 -0
  108. package/dist/github-UPGKMVVF.js +30 -0
  109. package/dist/graph/runtime.d.ts +4 -1
  110. package/dist/graph/runtime.js +20 -9
  111. package/dist/graph/runtime.js.map +1 -1
  112. package/dist/{host-6GURH5HE.js → host-YSTYO5DX.js} +3 -3
  113. package/dist/index.d.ts +192 -26
  114. package/dist/index.js +129 -124
  115. package/dist/index.js.map +1 -1
  116. package/dist/{json-BXY44ED7.js → json-DQIELR36.js} +18 -17
  117. package/dist/labels-XSTJJMSG.js +73 -0
  118. package/dist/labels-XSTJJMSG.js.map +1 -0
  119. package/dist/lint-BLBGGOYM.js +34 -0
  120. package/dist/list-B3RRRWFQ.js +32 -0
  121. package/dist/list-ZFRT3JQH.js +35 -0
  122. package/dist/{page-EV7OUBAU.js → page-5ISEVJR5.js} +18 -16
  123. package/dist/{prepare-JHJDJB6I.js → prepare-KFXXG2CJ.js} +22 -21
  124. package/dist/{prepare-JHJDJB6I.js.map → prepare-KFXXG2CJ.js.map} +1 -1
  125. package/dist/{pretty-Q5Y2PA64.js → pretty-Y7CGQLAF.js} +18 -17
  126. package/dist/{pretty-SCRK66M5.js → pretty-ZISH3Q4F.js} +18 -17
  127. package/dist/{provider-527CO4DM.js → provider-LBX4IXGX.js} +3 -3
  128. package/dist/{release-3D5PK6M7.js → release-VV3UTKE5.js} +3 -3
  129. package/dist/{reporters-M6LJ2IYU.js → reporters-26H3N2KW.js} +3 -3
  130. package/dist/{reporters-A5ADKDYR.js → reporters-4STXJJE2.js} +16 -15
  131. package/dist/{reporters-RBYTASMI.js → reporters-74B4U2GZ.js} +7 -7
  132. package/dist/run-DVGTKM52.js +37 -0
  133. package/dist/{term-CQAGNG3Q.js → term-PLJEYJQV.js} +981 -141
  134. package/dist/term-PLJEYJQV.js.map +1 -0
  135. package/dist/validate-CJNFQHMD.js +19 -0
  136. package/package.json +3 -2
  137. package/plugin/manni/.claude-plugin/plugin.json +1 -1
  138. package/shapes/graph/shapes-1.1.0.ttl +785 -0
  139. package/dist/build-QSPNK5AL.js +0 -35
  140. package/dist/calibrate-KXN4URPM.js +0 -40
  141. package/dist/capture-JHTSUPUC.js +0 -37
  142. package/dist/check-MDGXEUWL.js +0 -20
  143. package/dist/check-WOQRKNZK.js +0 -29
  144. package/dist/chunk-2DRHT73U.js.map +0 -1
  145. package/dist/chunk-2IAZEB45.js.map +0 -1
  146. package/dist/chunk-2MJ62AYQ.js.map +0 -1
  147. package/dist/chunk-4VBSTXN6.js +0 -392
  148. package/dist/chunk-4VBSTXN6.js.map +0 -1
  149. package/dist/chunk-6HWBRZIN.js.map +0 -1
  150. package/dist/chunk-BKVHX6FU.js.map +0 -1
  151. package/dist/chunk-D4N2V43Z.js.map +0 -1
  152. package/dist/chunk-EFW7CAG4.js +0 -387
  153. package/dist/chunk-EFW7CAG4.js.map +0 -1
  154. package/dist/chunk-GV56WGL2.js.map +0 -1
  155. package/dist/chunk-HQR2ZBHW.js.map +0 -1
  156. package/dist/chunk-J6IDQGJL.js.map +0 -1
  157. package/dist/chunk-JPQDNYXH.js.map +0 -1
  158. package/dist/chunk-JROBZ7JA.js +0 -818
  159. package/dist/chunk-JROBZ7JA.js.map +0 -1
  160. package/dist/chunk-PCQ7ELJH.js.map +0 -1
  161. package/dist/chunk-QCHVR4ZM.js.map +0 -1
  162. package/dist/chunk-QLWC7MKD.js.map +0 -1
  163. package/dist/chunk-TU2WUBVZ.js +0 -2
  164. package/dist/chunk-VSEBFHAY.js.map +0 -1
  165. package/dist/chunk-Y6DOMTQD.js.map +0 -1
  166. package/dist/cli-RORDPAPE.js.map +0 -1
  167. package/dist/github-RY3FRA6P.js +0 -29
  168. package/dist/github-YKQSH7FS.js +0 -34
  169. package/dist/lint-YJ2L22BW.js +0 -33
  170. package/dist/list-NSG24VVX.js +0 -31
  171. package/dist/list-V6EGCSHX.js +0 -34
  172. package/dist/run-BUE2DDXN.js +0 -36
  173. package/dist/term-CQAGNG3Q.js.map +0 -1
  174. package/dist/validate-ZBW44RHT.js +0 -18
  175. /package/dist/{batch-UAULUMGH.js.map → batch-KMGZMIAQ.js.map} +0 -0
  176. /package/dist/{build-QSPNK5AL.js.map → build-NO4AWCYG.js.map} +0 -0
  177. /package/dist/{calibrate-KXN4URPM.js.map → calibrate-XQUG5XAK.js.map} +0 -0
  178. /package/dist/{capture-JHTSUPUC.js.map → capture-5XE3ZMXK.js.map} +0 -0
  179. /package/dist/{check-MDGXEUWL.js.map → check-HTNPLWOV.js.map} +0 -0
  180. /package/dist/{check-WOQRKNZK.js.map → check-RJ45IBA6.js.map} +0 -0
  181. /package/dist/{check-YEOYBFST.js.map → check-WFXSXICD.js.map} +0 -0
  182. /package/dist/{chunk-IGSHYP74.js.map → chunk-23P7KMJM.js.map} +0 -0
  183. /package/dist/{chunk-HA6MQMOY.js.map → chunk-24J7TYPU.js.map} +0 -0
  184. /package/dist/{chunk-PCS4VJBV.js.map → chunk-37QJLVS3.js.map} +0 -0
  185. /package/dist/{chunk-4CK6ZSOK.js.map → chunk-3P6KCU36.js.map} +0 -0
  186. /package/dist/{chunk-54F74XR3.js.map → chunk-5JBVFWVP.js.map} +0 -0
  187. /package/dist/{chunk-B7XYNRJQ.js.map → chunk-6KIYVVKL.js.map} +0 -0
  188. /package/dist/{chunk-GDVZ5VII.js.map → chunk-7A452BPZ.js.map} +0 -0
  189. /package/dist/{chunk-M42DZCOU.js.map → chunk-7FCLXEAQ.js.map} +0 -0
  190. /package/dist/{chunk-LBSCW232.js.map → chunk-7NXPQKSB.js.map} +0 -0
  191. /package/dist/{chunk-OPXWPJDA.js.map → chunk-A3TEDWBZ.js.map} +0 -0
  192. /package/dist/{chunk-BBT6AVUG.js.map → chunk-BHHXU2D2.js.map} +0 -0
  193. /package/dist/{chunk-FQXWVS6J.js.map → chunk-CMMBWHT2.js.map} +0 -0
  194. /package/dist/{chunk-EIFCP6CZ.js.map → chunk-CO47QJKZ.js.map} +0 -0
  195. /package/dist/{chunk-ADMEPUBT.js.map → chunk-CXWTNT2O.js.map} +0 -0
  196. /package/dist/{chunk-LKP7QDFN.js.map → chunk-DAQTRAP5.js.map} +0 -0
  197. /package/dist/{chunk-PWBH7DCQ.js.map → chunk-EESH6COU.js.map} +0 -0
  198. /package/dist/{chunk-NCPWXHDO.js.map → chunk-JEUFYSFQ.js.map} +0 -0
  199. /package/dist/{chunk-2IR4T5PO.js.map → chunk-JJ4RSDSY.js.map} +0 -0
  200. /package/dist/{chunk-WDWXAYVH.js.map → chunk-L3RLGGRK.js.map} +0 -0
  201. /package/dist/{chunk-T7JAOYE5.js.map → chunk-L75CAZG4.js.map} +0 -0
  202. /package/dist/{chunk-U7CTFN2J.js.map → chunk-MYRPMSOX.js.map} +0 -0
  203. /package/dist/{chunk-WQWKYAAK.js.map → chunk-NUQF5F5J.js.map} +0 -0
  204. /package/dist/{chunk-FUCPZVRY.js.map → chunk-OEN6FBUW.js.map} +0 -0
  205. /package/dist/{chunk-FBMZJEB3.js.map → chunk-OKMTUAWO.js.map} +0 -0
  206. /package/dist/{chunk-R4WXQIOZ.js.map → chunk-PCEM5FOZ.js.map} +0 -0
  207. /package/dist/{chunk-4D5IZSXM.js.map → chunk-PXNCRGUL.js.map} +0 -0
  208. /package/dist/{chunk-ODRPL3WB.js.map → chunk-Q3ODX5PF.js.map} +0 -0
  209. /package/dist/{chunk-KGEQJ5CC.js.map → chunk-RRFFUWDL.js.map} +0 -0
  210. /package/dist/{chunk-NSBXVPZL.js.map → chunk-S3XUYW5K.js.map} +0 -0
  211. /package/dist/{chunk-LPIF5LIE.js.map → chunk-SAU2WQFC.js.map} +0 -0
  212. /package/dist/{chunk-MSRU4D4P.js.map → chunk-SFLICIQV.js.map} +0 -0
  213. /package/dist/{chunk-NGTVREIH.js.map → chunk-U6IHLEWT.js.map} +0 -0
  214. /package/dist/{chunk-VQK4VHLF.js.map → chunk-YQV75FIL.js.map} +0 -0
  215. /package/dist/{chunk-TU2WUBVZ.js.map → chunk-YUTVAMWW.js.map} +0 -0
  216. /package/dist/{chunk-RLT5SEML.js.map → chunk-Z5MZCCTT.js.map} +0 -0
  217. /package/dist/{cli-JJMOVIKS.js.map → cli-BS43EVCD.js.map} +0 -0
  218. /package/dist/{cli-ONTC5PKT.js.map → cli-FX53PBQ3.js.map} +0 -0
  219. /package/dist/{cli-I62SRH3R.js.map → cli-NGL63E53.js.map} +0 -0
  220. /package/dist/{cli-VUKMWSSF.js.map → cli-WNEI5L7P.js.map} +0 -0
  221. /package/dist/{config-XDA42RJL.js.map → config-JJW75SBX.js.map} +0 -0
  222. /package/dist/{github-RY3FRA6P.js.map → github-4UR67MEN.js.map} +0 -0
  223. /package/dist/{github-YKQSH7FS.js.map → github-UPGKMVVF.js.map} +0 -0
  224. /package/dist/{host-6GURH5HE.js.map → host-YSTYO5DX.js.map} +0 -0
  225. /package/dist/{json-BXY44ED7.js.map → json-DQIELR36.js.map} +0 -0
  226. /package/dist/{lint-YJ2L22BW.js.map → lint-BLBGGOYM.js.map} +0 -0
  227. /package/dist/{list-NSG24VVX.js.map → list-B3RRRWFQ.js.map} +0 -0
  228. /package/dist/{list-V6EGCSHX.js.map → list-ZFRT3JQH.js.map} +0 -0
  229. /package/dist/{page-EV7OUBAU.js.map → page-5ISEVJR5.js.map} +0 -0
  230. /package/dist/{pretty-Q5Y2PA64.js.map → pretty-Y7CGQLAF.js.map} +0 -0
  231. /package/dist/{pretty-SCRK66M5.js.map → pretty-ZISH3Q4F.js.map} +0 -0
  232. /package/dist/{provider-527CO4DM.js.map → provider-LBX4IXGX.js.map} +0 -0
  233. /package/dist/{release-3D5PK6M7.js.map → release-VV3UTKE5.js.map} +0 -0
  234. /package/dist/{reporters-A5ADKDYR.js.map → reporters-26H3N2KW.js.map} +0 -0
  235. /package/dist/{reporters-M6LJ2IYU.js.map → reporters-4STXJJE2.js.map} +0 -0
  236. /package/dist/{reporters-RBYTASMI.js.map → reporters-74B4U2GZ.js.map} +0 -0
  237. /package/dist/{run-BUE2DDXN.js.map → run-DVGTKM52.js.map} +0 -0
  238. /package/dist/{validate-ZBW44RHT.js.map → validate-CJNFQHMD.js.map} +0 -0
@@ -1,387 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- GraphError,
4
- NS,
5
- PREFIXES,
6
- byCodeUnit
7
- } from "./chunk-JROBZ7JA.js";
8
- import {
9
- packageRoot
10
- } from "./chunk-TIUTIOFB.js";
11
- import {
12
- errorMessage
13
- } from "./chunk-G3T47CFV.js";
14
-
15
- // src/graph/core/load.ts
16
- import { existsSync, readFileSync } from "node:fs";
17
- import { Parser, Store } from "n3";
18
- var XSD_STRING = `${NS.xsd}string`;
19
- function loadGraph(ttlPath) {
20
- if (!existsSync(ttlPath)) {
21
- throw new GraphError(
22
- `Graph not found: ${ttlPath} \u2014 run \`manni graph build\` first.`
23
- );
24
- }
25
- return parseGraph(readFileSync(ttlPath, "utf8"), ttlPath);
26
- }
27
- function parseGraph(turtle, label) {
28
- const parser = new Parser({ format: "text/turtle" });
29
- let quads;
30
- try {
31
- quads = parser.parse(turtle);
32
- } catch (e) {
33
- throw new GraphError(
34
- `Failed to parse ${label}: ${errorMessage(e)}`
35
- );
36
- }
37
- return new Store(quads);
38
- }
39
- function storeToQuads(store) {
40
- return store.getQuads(null, null, null, null).map((q) => {
41
- const o = q.object;
42
- let term;
43
- if (o.termType === "Literal") {
44
- const dt = o.datatype.value;
45
- term = dt && dt !== XSD_STRING ? { kind: "literal", value: o.value, datatype: dt } : { kind: "literal", value: o.value };
46
- } else {
47
- term = { kind: "iri", value: o.value };
48
- }
49
- return { s: q.subject.value, p: q.predicate.value, o: term };
50
- });
51
- }
52
- function expandTerm(input) {
53
- const colon = input.indexOf(":");
54
- if (colon > 0) {
55
- const prefix = input.slice(0, colon);
56
- const ns = NS[prefix];
57
- if (ns) return `${ns}${input.slice(colon + 1)}`;
58
- }
59
- return input;
60
- }
61
- function compactIri(iri) {
62
- for (const [prefix, ns] of PREFIXES) {
63
- if (iri.startsWith(ns) && iri.length > ns.length) {
64
- return `${prefix}:${iri.slice(ns.length)}`;
65
- }
66
- }
67
- return iri;
68
- }
69
-
70
- // src/graph/core/pkg.ts
71
- import { join } from "node:path";
72
- function bundledShapesPath(moduleUrl) {
73
- return join(packageRoot(moduleUrl), "shapes", "graph", "shapes-1.0.0.ttl");
74
- }
75
-
76
- // src/graph/core/shacl.ts
77
- import { readFileSync as readFileSync2 } from "node:fs";
78
- import { DataFactory, Parser as Parser2, Store as Store2 } from "n3";
79
- import SHACLValidator from "rdf-validate-shacl";
80
- var FAMILY_SEVERITY = {
81
- violation: "error",
82
- warning: "warning",
83
- info: "notice"
84
- };
85
- function finding(shaclSeverity, rest) {
86
- return { severity: FAMILY_SEVERITY[shaclSeverity], shaclSeverity, ...rest };
87
- }
88
- var SEVERITY_RANK = {
89
- violation: 0,
90
- warning: 1,
91
- info: 2
92
- };
93
- function loadShapes(paths) {
94
- const store = new Store2();
95
- for (const path of paths) {
96
- let text;
97
- try {
98
- text = readFileSync2(path, "utf8");
99
- } catch {
100
- throw new GraphError(`Shapes file not found: ${path}`);
101
- }
102
- try {
103
- store.addQuads(new Parser2({ format: "text/turtle" }).parse(text));
104
- } catch (e) {
105
- throw new GraphError(
106
- `Failed to parse shapes ${path}: ${errorMessage(e)}`
107
- );
108
- }
109
- }
110
- return store;
111
- }
112
- function blameDocs(store, focus) {
113
- const pathPred = DataFactory.namedNode(`${NS.graph}path`);
114
- const pathOf = (iri) => store.getQuads(DataFactory.namedNode(iri), pathPred, null, null)[0]?.object.value;
115
- const found = /* @__PURE__ */ new Set();
116
- const visited = /* @__PURE__ */ new Set();
117
- const walk = (iri, depth) => {
118
- if (visited.has(iri)) return;
119
- visited.add(iri);
120
- const own = pathOf(iri);
121
- if (own !== void 0) {
122
- found.add(own);
123
- return;
124
- }
125
- const hash = iri.indexOf("#");
126
- if (hash !== -1) {
127
- const base = pathOf(iri.slice(0, hash));
128
- if (base !== void 0) {
129
- found.add(base);
130
- return;
131
- }
132
- }
133
- if (depth === 0) return;
134
- for (const quad of store.getQuads(null, null, DataFactory.namedNode(iri), null)) {
135
- if (quad.subject.termType === "NamedNode") {
136
- walk(quad.subject.value, depth - 1);
137
- }
138
- }
139
- };
140
- walk(focus, 2);
141
- return [...found].sort();
142
- }
143
- function broaderEdges(store) {
144
- const edges = [];
145
- for (const q of store.getQuads(
146
- null,
147
- DataFactory.namedNode(`${NS.skos}broader`),
148
- null,
149
- null
150
- )) {
151
- if (q.object.termType === "NamedNode") {
152
- edges.push({ s: q.subject.value, o: q.object.value });
153
- }
154
- }
155
- for (const q of store.getQuads(
156
- null,
157
- DataFactory.namedNode(`${NS.skos}narrower`),
158
- null,
159
- null
160
- )) {
161
- if (q.object.termType === "NamedNode") {
162
- edges.push({ s: q.object.value, o: q.subject.value });
163
- }
164
- }
165
- return edges;
166
- }
167
- function broaderCycles(store) {
168
- const adjacency = /* @__PURE__ */ new Map();
169
- const selfLoops = /* @__PURE__ */ new Set();
170
- for (const { s, o } of broaderEdges(store)) {
171
- if (s === o) selfLoops.add(s);
172
- const list = adjacency.get(s);
173
- if (list) list.push(o);
174
- else adjacency.set(s, [o]);
175
- if (!adjacency.has(o)) adjacency.set(o, []);
176
- }
177
- for (const list of adjacency.values()) list.sort();
178
- const index = /* @__PURE__ */ new Map();
179
- const lowlink = /* @__PURE__ */ new Map();
180
- const onStack = /* @__PURE__ */ new Set();
181
- const stack = [];
182
- const components = [];
183
- let counter = 0;
184
- const numberOf = (map, node) => {
185
- const value = map.get(node);
186
- if (value === void 0) {
187
- throw new GraphError(
188
- `internal: ${node} was visited before it was numbered`
189
- );
190
- }
191
- return value;
192
- };
193
- const nodes = [...adjacency.keys()].sort();
194
- for (const root of nodes) {
195
- if (index.has(root)) continue;
196
- const frames = [[root, 0]];
197
- for (let frame = frames.at(-1); frame !== void 0; frame = frames.at(-1)) {
198
- const [node, childIdx] = frame;
199
- if (childIdx === 0) {
200
- index.set(node, counter);
201
- lowlink.set(node, counter);
202
- counter += 1;
203
- stack.push(node);
204
- onStack.add(node);
205
- }
206
- const children = adjacency.get(node) ?? [];
207
- const child = children[childIdx];
208
- if (child !== void 0) {
209
- frame[1] += 1;
210
- if (!index.has(child)) {
211
- frames.push([child, 0]);
212
- } else if (onStack.has(child)) {
213
- lowlink.set(
214
- node,
215
- Math.min(numberOf(lowlink, node), numberOf(index, child))
216
- );
217
- }
218
- } else {
219
- if (lowlink.get(node) === index.get(node)) {
220
- const component = [];
221
- let member;
222
- do {
223
- member = stack.pop();
224
- if (member === void 0) break;
225
- onStack.delete(member);
226
- component.push(member);
227
- } while (member !== node);
228
- if (component.length > 1 || selfLoops.has(node)) {
229
- components.push(component.sort());
230
- }
231
- }
232
- frames.pop();
233
- const parent = frames.at(-1);
234
- if (parent) {
235
- lowlink.set(
236
- parent[0],
237
- Math.min(numberOf(lowlink, parent[0]), numberOf(lowlink, node))
238
- );
239
- }
240
- }
241
- }
242
- }
243
- return components.sort((a, b) => (a[0] ?? "") < (b[0] ?? "") ? -1 : 1);
244
- }
245
- function broaderClosure(edges, start) {
246
- const adjacency = /* @__PURE__ */ new Map();
247
- for (const { s, o } of edges) {
248
- const list = adjacency.get(s);
249
- if (list) list.push(o);
250
- else adjacency.set(s, [o]);
251
- }
252
- const seen = /* @__PURE__ */ new Set();
253
- const queue = [...adjacency.get(start) ?? []];
254
- for (let node = queue.shift(); node !== void 0; node = queue.shift()) {
255
- if (seen.has(node)) continue;
256
- seen.add(node);
257
- queue.push(...adjacency.get(node) ?? []);
258
- }
259
- return seen;
260
- }
261
- function relatedConflicts(store) {
262
- const edges = broaderEdges(store);
263
- const direct = /* @__PURE__ */ new Map();
264
- for (const e of edges) {
265
- const targets = direct.get(e.s);
266
- if (targets) targets.add(e.o);
267
- else direct.set(e.s, /* @__PURE__ */ new Set([e.o]));
268
- }
269
- const findings = [];
270
- for (const q of store.getQuads(
271
- null,
272
- DataFactory.namedNode(`${NS.skos}related`),
273
- null,
274
- null
275
- )) {
276
- if (q.object.termType !== "NamedNode") continue;
277
- const s = q.subject.value;
278
- const o = q.object.value;
279
- if (direct.get(s)?.has(o)) continue;
280
- const conflict = broaderClosure(edges, s).has(o) || broaderClosure(edges, o).has(s);
281
- if (!conflict) continue;
282
- findings.push(
283
- finding("violation", {
284
- message: `skos:related conflicts with skos:broaderTransitive between ${compactIri(s)} and ${compactIri(o)} \u2014 a concept cannot be both related to and an ancestor/descendant of another`,
285
- focusNode: s,
286
- path: `${NS.skos}related`,
287
- docs: blameDocs(store, s)
288
- })
289
- );
290
- }
291
- return findings;
292
- }
293
- function cycleFindings(store) {
294
- return broaderCycles(store).map(
295
- (members) => finding("violation", {
296
- message: `skos:broader cycle through ${members.map((m) => compactIri(m)).join(
297
- ", "
298
- )} (${members.map((m) => m).join(" \u2192 ")}) \u2014 a concept cannot be its own ancestor`,
299
- // `broaderCycles` returns only components of at least one member, so
300
- // the first is there; `?? ""` says that without asserting it.
301
- focusNode: members[0] ?? "",
302
- path: `${NS.skos}broader`,
303
- docs: [...new Set(members.flatMap((m) => blameDocs(store, m)))].sort()
304
- })
305
- );
306
- }
307
- var CURATED_FIELDS = /* @__PURE__ */ new Set(["sections", "revision-of", "derived-from"]);
308
- var GRAPH_FILL_FRAGMENT = "#prov.graph-fill.";
309
- function curatedFieldFindings(store) {
310
- const filledField = `${NS.graph}filledField`;
311
- const pathPred = DataFactory.namedNode(`${NS.graph}path`);
312
- const findings = [];
313
- for (const q of store.getQuads(null, DataFactory.namedNode(filledField), null, null)) {
314
- if (q.object.termType !== "Literal") continue;
315
- const field = q.object.value;
316
- if (!CURATED_FIELDS.has(field)) continue;
317
- const node = q.subject.value;
318
- const at = node.indexOf(GRAPH_FILL_FRAGMENT);
319
- const fieldAt = node.lastIndexOf(".field.");
320
- if (at === -1 || fieldAt <= at) continue;
321
- const activity = node.slice(0, fieldAt);
322
- const model = node.slice(at + GRAPH_FILL_FRAGMENT.length, fieldAt);
323
- const docIri = activity.slice(0, activity.indexOf("#"));
324
- const path = store.getQuads(DataFactory.namedNode(docIri), pathPred, null, null)[0]?.object.value;
325
- findings.push(
326
- finding("violation", {
327
- message: `meta-provenance attributes /graph/${field} to ${model} \u2014 ${field} is curated by hand, never filled by a machine`,
328
- focusNode: activity,
329
- path: filledField,
330
- docs: path === void 0 ? blameDocs(store, activity) : [path]
331
- })
332
- );
333
- }
334
- return findings;
335
- }
336
- function severityOf(iri) {
337
- if (iri === "http://www.w3.org/ns/shacl#Warning") return "warning";
338
- if (iri === "http://www.w3.org/ns/shacl#Info") return "info";
339
- return "violation";
340
- }
341
- async function validateGraph(store, shapesPaths) {
342
- const shapes = loadShapes(shapesPaths);
343
- const validator = new SHACLValidator(shapes);
344
- let report;
345
- try {
346
- report = await validator.validate(store);
347
- } catch (e) {
348
- throw new GraphError(
349
- `SHACL validation failed: ${errorMessage(e)}`
350
- );
351
- }
352
- const findings = [];
353
- for (const result of report.results) {
354
- const focus = result.focusNode?.value ?? "";
355
- const path = result.path?.value;
356
- const messages = result.message.map((m) => m.value).filter((m) => m.length > 0);
357
- const message = messages.length > 0 ? messages.join("; ") : `constraint violated${path ? ` on ${compactIri(path)}` : ""}`;
358
- findings.push(
359
- finding(severityOf(result.severity?.value), {
360
- message,
361
- focusNode: focus,
362
- ...path !== void 0 ? { path } : {},
363
- docs: blameDocs(store, focus)
364
- })
365
- );
366
- }
367
- findings.push(
368
- ...cycleFindings(store),
369
- ...relatedConflicts(store),
370
- ...curatedFieldFindings(store)
371
- );
372
- findings.sort(
373
- (a, b) => SEVERITY_RANK[a.shaclSeverity] - SEVERITY_RANK[b.shaclSeverity] || byCodeUnit(a.focusNode, b.focusNode) || byCodeUnit(a.path ?? "", b.path ?? "") || byCodeUnit(a.message, b.message)
374
- );
375
- return findings;
376
- }
377
-
378
- export {
379
- loadGraph,
380
- parseGraph,
381
- storeToQuads,
382
- expandTerm,
383
- compactIri,
384
- bundledShapesPath,
385
- validateGraph
386
- };
387
- //# sourceMappingURL=chunk-EFW7CAG4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graph/core/load.ts","../src/graph/core/pkg.ts","../src/graph/core/shacl.ts"],"sourcesContent":["/** Load a built .ttl into an in-memory N3 store for query/stats. */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { Parser, Store } from \"n3\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { GraphError } from \"../types.js\";\nimport type { Quad, Term } from \"./derive.js\";\nimport { NS, PREFIXES } from \"./vocab.js\";\n\nconst XSD_STRING = `${NS.xsd}string`;\n\nexport function loadGraph(ttlPath: string): Store {\n if (!existsSync(ttlPath)) {\n throw new GraphError(\n `Graph not found: ${ttlPath} — run \\`manni graph build\\` first.`,\n );\n }\n return parseGraph(readFileSync(ttlPath, \"utf8\"), ttlPath);\n}\n\n/** Turtle already in memory into a store; `label` names it in an error. */\nexport function parseGraph(turtle: string, label: string): Store {\n const parser = new Parser({ format: \"text/turtle\" });\n let quads;\n try {\n quads = parser.parse(turtle);\n } catch (e) {\n throw new GraphError(\n `Failed to parse ${label}: ${errorMessage(e)}`,\n );\n }\n return new Store(quads);\n}\n\n/**\n * Convert an in-memory N3 store back to dockg's internal quad shape — the\n * bridge from the Turtle-reading Node side to the platform-neutral emitters and\n * runtime. A redundant `xsd:string` datatype is dropped so the result matches\n * what the JSON-LD path produces.\n */\nexport function storeToQuads(store: Store): Quad[] {\n return store.getQuads(null, null, null, null).map((q) => {\n const o = q.object;\n let term: Term;\n if (o.termType === \"Literal\") {\n const dt = o.datatype.value;\n term =\n dt && dt !== XSD_STRING\n ? { kind: \"literal\", value: o.value, datatype: dt }\n : { kind: \"literal\", value: o.value };\n } else {\n term = { kind: \"iri\", value: o.value };\n }\n return { s: q.subject.value, p: q.predicate.value, o: term };\n });\n}\n\n/** Expand `dcterms:references`-style prefixed names to full IRIs; pass through the rest. */\nexport function expandTerm(input: string): string {\n const colon = input.indexOf(\":\");\n if (colon > 0) {\n const prefix = input.slice(0, colon);\n const ns = (NS as Record<string, string>)[prefix];\n if (ns) return `${ns}${input.slice(colon + 1)}`;\n }\n return input;\n}\n\n/** Compact a full IRI back to a prefixed name when a known namespace matches. */\nexport function compactIri(iri: string): string {\n for (const [prefix, ns] of PREFIXES) {\n if (iri.startsWith(ns) && iri.length > ns.length) {\n return `${prefix}:${iri.slice(ns.length)}`;\n }\n }\n return iri;\n}\n","/**\n * The one asset that ships with the package and is read by path at runtime: the\n * SHACL shapes. They live under `shapes/graph/` at the package root, listed in\n * `files`, and are reached through the shared package-root walk, which holds\n * both in the source tree (`src/graph/core/`) and in the bundle (`dist/`).\n *\n * The frontmatter schema is no longer one of them. The `graph` page vocabulary\n * is proposal 0023's draft, imported by `src/graph/schema.ts` and inlined by the\n * build, so nothing under `schemas/` is read at run time and nothing under it\n * is published (proposal 0051 §4).\n */\nimport { join } from \"node:path\";\nimport { packageRoot } from \"../../shared/package-root.js\";\n\n/** Absolute path of the bundled SHACL shapes `manni graph check` defaults to. */\nexport function bundledShapesPath(moduleUrl: string): string {\n return join(packageRoot(moduleUrl), \"shapes\", \"graph\", \"shapes-1.0.0.ttl\");\n}\n","/**\n * Graph-level validation: run the published SHACL shapes over a built graph,\n * plus the two SKOS integrity checks core SHACL cannot express (broader\n * cycles, related⨯broaderTransitive disjointness). Every finding carries the\n * doc paths responsible, so writers get file names instead of bare IRIs.\n */\nimport { readFileSync } from \"node:fs\";\nimport { DataFactory, Parser, Store } from \"n3\";\nimport SHACLValidator from \"rdf-validate-shacl\";\nimport type { Term } from \"@rdfjs/types\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport type { Severity } from \"../../shared/severity.js\";\nimport { GraphError } from \"../types.js\";\nimport { compactIri } from \"./load.js\";\nimport { byCodeUnit } from \"./sort.js\";\nimport { NS } from \"./vocab.js\";\n\n/** SHACL's own scale, as `sh:severity` spells it. */\nexport type ShaclSeverity = \"violation\" | \"warning\" | \"info\";\n\nexport interface CheckFinding {\n /**\n * The family's scale (`src/shared/severity.ts`). SHACL's three levels map\n * onto it one for one — violation to error, warning to warning, info to\n * notice — and the source value stays in {@link shaclSeverity}, the way\n * a11y keeps axe's `impact` (proposal 0035, stress test 10).\n */\n severity: Severity;\n /** SHACL's own word for the same finding, kept for lookup. */\n shaclSeverity: ShaclSeverity;\n /** Human-readable description (IRIs compacted to prefixed names). */\n message: string;\n /** IRI of the node the finding is about. */\n focusNode: string;\n /** Predicate IRI involved, when the finding concerns one. */\n path?: string;\n /** graph:path of the docs responsible, sorted (empty when untraceable). */\n docs: string[];\n}\n\n/**\n * SHACL's scale onto the family's. The one place the translation happens, so\n * no caller re-derives it: a finding is built through {@link finding} and\n * carries both words from there on.\n */\nconst FAMILY_SEVERITY: Record<ShaclSeverity, Severity> = {\n violation: \"error\",\n warning: \"warning\",\n info: \"notice\",\n};\n\n/** A finding at `shaclSeverity`, carrying the family severity it maps to. */\nfunction finding(\n shaclSeverity: ShaclSeverity,\n rest: Omit<CheckFinding, \"severity\" | \"shaclSeverity\">,\n): CheckFinding {\n return { severity: FAMILY_SEVERITY[shaclSeverity], shaclSeverity, ...rest };\n}\n\nconst SEVERITY_RANK: Record<ShaclSeverity, number> = {\n violation: 0,\n warning: 1,\n info: 2,\n};\n\n/** Parse one or more shapes .ttl files into a single store. */\nexport function loadShapes(paths: string[]): Store {\n const store = new Store();\n for (const path of paths) {\n let text: string;\n try {\n text = readFileSync(path, \"utf8\");\n } catch {\n throw new GraphError(`Shapes file not found: ${path}`);\n }\n try {\n store.addQuads(new Parser({ format: \"text/turtle\" }).parse(text));\n } catch (e) {\n throw new GraphError(\n `Failed to parse shapes ${path}: ${errorMessage(e)}`,\n );\n }\n }\n return store;\n}\n\n/**\n * Trace a focus node back to the doc(s) responsible: its own graph:path,\n * the path of its fragment-stripped base (sections, provenance fragments),\n * or — for shared nodes like concepts and agents — the paths of docs that\n * point at it, up to two hops back. Sorted and deduplicated.\n */\nexport function blameDocs(store: Store, focus: string): string[] {\n const pathPred = DataFactory.namedNode(`${NS.graph}path`);\n const pathOf = (iri: string): string | undefined =>\n store.getQuads(DataFactory.namedNode(iri), pathPred, null, null)[0]?.object.value;\n\n const found = new Set<string>();\n const visited = new Set<string>();\n\n const walk = (iri: string, depth: number): void => {\n if (visited.has(iri)) return;\n visited.add(iri);\n\n const own = pathOf(iri);\n if (own !== undefined) {\n found.add(own);\n return;\n }\n const hash = iri.indexOf(\"#\");\n if (hash !== -1) {\n const base = pathOf(iri.slice(0, hash));\n if (base !== undefined) {\n found.add(base);\n return;\n }\n }\n if (depth === 0) return;\n for (const quad of store.getQuads(null, null, DataFactory.namedNode(iri), null)) {\n if (quad.subject.termType === \"NamedNode\") {\n walk(quad.subject.value, depth - 1);\n }\n }\n };\n\n walk(focus, 2);\n return [...found].sort();\n}\n\ninterface Edge {\n s: string;\n o: string;\n}\n\n/** skos:broader edges, folding narrower in as its inverse. */\nfunction broaderEdges(store: Store): Edge[] {\n const edges: Edge[] = [];\n for (const q of store.getQuads(\n null,\n DataFactory.namedNode(`${NS.skos}broader`),\n null,\n null,\n )) {\n if (q.object.termType === \"NamedNode\") {\n edges.push({ s: q.subject.value, o: q.object.value });\n }\n }\n for (const q of store.getQuads(\n null,\n DataFactory.namedNode(`${NS.skos}narrower`),\n null,\n null,\n )) {\n if (q.object.termType === \"NamedNode\") {\n edges.push({ s: q.object.value, o: q.subject.value });\n }\n }\n return edges;\n}\n\n/**\n * Strongly connected components of the broader graph (iterative Tarjan —\n * no recursion, taxonomy depth can't blow the stack). Returns only real\n * cycles: components of 2+ nodes, or single nodes with a self-loop.\n */\nexport function broaderCycles(store: Store): string[][] {\n const adjacency = new Map<string, string[]>();\n const selfLoops = new Set<string>();\n for (const { s, o } of broaderEdges(store)) {\n if (s === o) selfLoops.add(s);\n const list = adjacency.get(s);\n if (list) list.push(o);\n else adjacency.set(s, [o]);\n if (!adjacency.has(o)) adjacency.set(o, []);\n }\n for (const list of adjacency.values()) list.sort();\n\n const index = new Map<string, number>();\n const lowlink = new Map<string, number>();\n const onStack = new Set<string>();\n const stack: string[] = [];\n const components: string[][] = [];\n let counter = 0;\n\n /**\n * A node's Tarjan number. Every node is stamped into both maps on the frame\n * where `childIdx === 0`, before any edge out of it is followed, so a miss\n * here is not a missing value but a broken traversal — which is worth\n * saying rather than reading as `NaN` three lines later.\n */\n const numberOf = (map: Map<string, number>, node: string): number => {\n const value = map.get(node);\n if (value === undefined) {\n throw new GraphError(\n `internal: ${node} was visited before it was numbered`,\n );\n }\n return value;\n };\n\n const nodes = [...adjacency.keys()].sort();\n for (const root of nodes) {\n if (index.has(root)) continue;\n // Explicit work stack of [node, next-child-index] frames. The loop reads\n // the top frame as its condition, so the frame is proven present by the\n // same test that keeps the loop running.\n const frames: Array<[string, number]> = [[root, 0]];\n for (let frame = frames.at(-1); frame !== undefined; frame = frames.at(-1)) {\n const [node, childIdx] = frame;\n if (childIdx === 0) {\n index.set(node, counter);\n lowlink.set(node, counter);\n counter += 1;\n stack.push(node);\n onStack.add(node);\n }\n const children = adjacency.get(node) ?? [];\n // Reading the child *is* the bounds check: `adjacency` holds dense\n // arrays of strings, so a hit is a child and a miss is the end of them.\n const child = children[childIdx];\n if (child !== undefined) {\n frame[1] += 1;\n if (!index.has(child)) {\n frames.push([child, 0]);\n } else if (onStack.has(child)) {\n lowlink.set(\n node,\n Math.min(numberOf(lowlink, node), numberOf(index, child)),\n );\n }\n } else {\n if (lowlink.get(node) === index.get(node)) {\n const component: string[] = [];\n let member: string | undefined;\n do {\n member = stack.pop();\n if (member === undefined) break;\n onStack.delete(member);\n component.push(member);\n } while (member !== node);\n if (component.length > 1 || selfLoops.has(node)) {\n components.push(component.sort());\n }\n }\n frames.pop();\n const parent = frames.at(-1);\n if (parent) {\n lowlink.set(\n parent[0],\n Math.min(numberOf(lowlink, parent[0]), numberOf(lowlink, node)),\n );\n }\n }\n }\n }\n // A component always has a member — it is built by popping at least one —\n // so `?? \"\"` is a spelling of that, not a fallback anyone can reach.\n return components.sort((a, b) => ((a[0] ?? \"\") < (b[0] ?? \"\") ? -1 : 1));\n}\n\n/** Forward reachability over broader edges from each given start node. */\nfunction broaderClosure(edges: Edge[], start: string): Set<string> {\n const adjacency = new Map<string, string[]>();\n for (const { s, o } of edges) {\n const list = adjacency.get(s);\n if (list) list.push(o);\n else adjacency.set(s, [o]);\n }\n const seen = new Set<string>();\n const queue = [...(adjacency.get(start) ?? [])];\n // Shifting *is* the emptiness test, so the queue is never read past its end.\n for (let node = queue.shift(); node !== undefined; node = queue.shift()) {\n if (seen.has(node)) continue;\n seen.add(node);\n queue.push(...(adjacency.get(node) ?? []));\n }\n return seen;\n}\n\n/**\n * SKOS S27: skos:related is disjoint with skos:broaderTransitive. The\n * one-hop case is already a SHACL sh:disjoint violation — skip it here so\n * one mistake doesn't produce two findings.\n */\nfunction relatedConflicts(store: Store): CheckFinding[] {\n const edges = broaderEdges(store);\n // Direct edges indexed by subject — no composite string keys (a joined\n // key would need a separator character, and IRIs make any choice fragile).\n const direct = new Map<string, Set<string>>();\n for (const e of edges) {\n const targets = direct.get(e.s);\n if (targets) targets.add(e.o);\n else direct.set(e.s, new Set([e.o]));\n }\n const findings: CheckFinding[] = [];\n for (const q of store.getQuads(\n null,\n DataFactory.namedNode(`${NS.skos}related`),\n null,\n null,\n )) {\n if (q.object.termType !== \"NamedNode\") continue;\n const s = q.subject.value;\n const o = q.object.value;\n if (direct.get(s)?.has(o)) continue; // covered by sh:disjoint\n const conflict =\n broaderClosure(edges, s).has(o) || broaderClosure(edges, o).has(s);\n if (!conflict) continue;\n findings.push(\n finding(\"violation\", {\n message: `skos:related conflicts with skos:broaderTransitive between ${compactIri(s)} and ${compactIri(o)} — a concept cannot be both related to and an ancestor/descendant of another`,\n focusNode: s,\n path: `${NS.skos}related`,\n docs: blameDocs(store, s),\n }),\n );\n }\n return findings;\n}\n\nfunction cycleFindings(store: Store): CheckFinding[] {\n return broaderCycles(store).map((members) =>\n finding(\"violation\", {\n message: `skos:broader cycle through ${members\n .map((m) => compactIri(m))\n .join(\n \", \",\n )} (${members.map((m) => m).join(\" → \")}) — a concept cannot be its own ancestor`,\n // `broaderCycles` returns only components of at least one member, so\n // the first is there; `?? \"\"` says that without asserting it.\n focusNode: members[0] ?? \"\",\n path: `${NS.skos}broader`,\n docs: [...new Set(members.flatMap((m) => blameDocs(store, m)))].sort(),\n }),\n );\n}\n\n/**\n * The three `graph` fields a machine may never be attributed for. The old\n * `kg.provenance` schema enumerated the twelve *fillable* fields, which kept\n * these out; a free JSON Pointer cannot express that, so proposal 0046 stress\n * test 13 moved the guard into graph's harvest and, from there, to here.\n */\nconst CURATED_FIELDS = new Set([\"sections\", \"revision-of\", \"derived-from\"]);\n\n/** The fragment a `graph fill` activity's IRI carries, before its model slug. */\nconst GRAPH_FILL_FRAGMENT = \"#prov.graph-fill.\";\n\n/**\n * A machine attribution on a hand-curated field. `check` reads only the built\n * graph and `build` has no findings channel, so the store is where the fact is\n * read: the harvest has already put `graph:filledField \"sections\"` on a field\n * node under a `#prov.graph-fill.` activity.\n */\nfunction curatedFieldFindings(store: Store): CheckFinding[] {\n const filledField = `${NS.graph}filledField`;\n const pathPred = DataFactory.namedNode(`${NS.graph}path`);\n const findings: CheckFinding[] = [];\n for (const q of store.getQuads(null, DataFactory.namedNode(filledField), null, null)) {\n if (q.object.termType !== \"Literal\") continue;\n const field = q.object.value;\n if (!CURATED_FIELDS.has(field)) continue;\n const node = q.subject.value;\n const at = node.indexOf(GRAPH_FILL_FRAGMENT);\n const fieldAt = node.lastIndexOf(\".field.\");\n if (at === -1 || fieldAt <= at) continue;\n const activity = node.slice(0, fieldAt);\n // The model the activity is for, from its own fragment. Naming it beats\n // repeating the activity IRI, which the reporter already prints as the\n // focus node ahead of this message.\n const model = node.slice(at + GRAPH_FILL_FRAGMENT.length, fieldAt);\n // These activities hang off no document edge, so `blameDocs` cannot walk\n // back to one. The doc IRI is the activity's own, minus its fragment.\n const docIri = activity.slice(0, activity.indexOf(\"#\"));\n const path = store.getQuads(DataFactory.namedNode(docIri), pathPred, null, null)[0]\n ?.object.value;\n findings.push(\n finding(\"violation\", {\n message: `meta-provenance attributes /graph/${field} to ${model} — ${field} is curated by hand, never filled by a machine`,\n focusNode: activity,\n path: filledField,\n docs: path === undefined ? blameDocs(store, activity) : [path],\n }),\n );\n }\n return findings;\n}\n\n/**\n * One validation result, with the nullability its library documents in code\n * rather than in its `.d.ts`.\n *\n * `rdf-validate-shacl` declares `path`, `focusNode` and `severity` as `Term`,\n * and every one of them is `…out(ns.sh.resultPath).term || null` at runtime. A\n * result with no path is ordinary — a node-shape constraint has none — so the\n * guards at the read site are the real contract and the declaration is the\n * optimistic one. Saying so once here is what keeps them from reading as\n * checks that cannot fail.\n */\ninterface ShaclResult {\n message: Term[];\n path: Term | null;\n focusNode: Term | null;\n severity: Term | null;\n}\n\nfunction severityOf(iri: string | undefined): ShaclSeverity {\n if (iri === \"http://www.w3.org/ns/shacl#Warning\") return \"warning\";\n if (iri === \"http://www.w3.org/ns/shacl#Info\") return \"info\";\n return \"violation\";\n}\n\n/**\n * Validate a built graph against SHACL shapes files, merge in the TS-side\n * SKOS checks, and return deterministic, doc-blamed findings.\n */\nexport async function validateGraph(\n store: Store,\n shapesPaths: string[],\n): Promise<CheckFinding[]> {\n const shapes = loadShapes(shapesPaths);\n const validator = new SHACLValidator(shapes);\n let report;\n try {\n report = await validator.validate(store);\n } catch (e) {\n throw new GraphError(\n `SHACL validation failed: ${errorMessage(e)}`,\n );\n }\n\n const findings: CheckFinding[] = [];\n for (const result of report.results as ShaclResult[]) {\n const focus = result.focusNode?.value ?? \"\";\n const path = result.path?.value;\n const messages = result.message\n .map((m) => m.value)\n .filter((m) => m.length > 0);\n const message =\n messages.length > 0\n ? messages.join(\"; \")\n : `constraint violated${path ? ` on ${compactIri(path)}` : \"\"}`;\n findings.push(\n finding(severityOf(result.severity?.value), {\n message,\n focusNode: focus,\n ...(path !== undefined ? { path } : {}),\n docs: blameDocs(store, focus),\n }),\n );\n }\n\n findings.push(\n ...cycleFindings(store),\n ...relatedConflicts(store),\n ...curatedFieldFindings(store),\n );\n\n findings.sort(\n (a, b) =>\n SEVERITY_RANK[a.shaclSeverity] - SEVERITY_RANK[b.shaclSeverity] ||\n byCodeUnit(a.focusNode, b.focusNode) ||\n byCodeUnit(a.path ?? \"\", b.path ?? \"\") ||\n byCodeUnit(a.message, b.message),\n );\n return findings;\n}\n"],"mappings":"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","names":["readFileSync","Parser","Store","Store","readFileSync","Parser"]}