@thomasfosterau/effect-rdf 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (776) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2251 -2
  3. package/dist/Algebra-CGG4oae3.mjs +433 -0
  4. package/dist/Algebra-CGG4oae3.mjs.map +1 -0
  5. package/dist/Algebra-uGsIEOUA.d.mts +446 -0
  6. package/dist/Ast-CPRZmBvk.mjs +552 -0
  7. package/dist/Ast-CPRZmBvk.mjs.map +1 -0
  8. package/dist/Ast-vcw2W-lf.d.mts +827 -0
  9. package/dist/Bindings-Ck3m7JRC.mjs +249 -0
  10. package/dist/Bindings-Ck3m7JRC.mjs.map +1 -0
  11. package/dist/Bindings-DiKpBd7f.d.mts +153 -0
  12. package/dist/ClientErrors-CpXdFX5u.mjs +128 -0
  13. package/dist/ClientErrors-CpXdFX5u.mjs.map +1 -0
  14. package/dist/ClientErrors-D4IZHUM-.d.mts +101 -0
  15. package/dist/ClientFormats-CXomkXLV.mjs +73 -0
  16. package/dist/ClientFormats-CXomkXLV.mjs.map +1 -0
  17. package/dist/ClientFormats-Dm57ZPwR.d.mts +36 -0
  18. package/dist/Csv2Json-DynEcwCh.mjs +194 -0
  19. package/dist/Csv2Json-DynEcwCh.mjs.map +1 -0
  20. package/dist/Csv2Json-aXNVDoXQ.d.mts +40 -0
  21. package/dist/Csv2Rdf-8maXP6mt.d.mts +41 -0
  22. package/dist/Csv2Rdf-DuSEkaKE.mjs +161 -0
  23. package/dist/Csv2Rdf-DuSEkaKE.mjs.map +1 -0
  24. package/dist/Dataset-BlmlcI7J.mjs +782 -0
  25. package/dist/Dataset-BlmlcI7J.mjs.map +1 -0
  26. package/dist/Dataset-DS3ESOcO.d.mts +426 -0
  27. package/dist/Dataset.d.mts +2 -0
  28. package/dist/Dataset.mjs +1 -0
  29. package/dist/Datatype-CxMpamHC.d.mts +212 -0
  30. package/dist/Datatype-DQvkNkiH.mjs +1001 -0
  31. package/dist/Datatype-DQvkNkiH.mjs.map +1 -0
  32. package/dist/Dialect-8ChFj5EX.d.mts +113 -0
  33. package/dist/Dialect-CzVH38uo.mjs +165 -0
  34. package/dist/Dialect-CzVH38uo.mjs.map +1 -0
  35. package/dist/DocumentLoader-D3lZREnB.mjs +346 -0
  36. package/dist/DocumentLoader-D3lZREnB.mjs.map +1 -0
  37. package/dist/DocumentLoader-ZUCEVrW5.d.mts +178 -0
  38. package/dist/DublinCore-AnwqxRx6.mjs +137 -0
  39. package/dist/DublinCore-AnwqxRx6.mjs.map +1 -0
  40. package/dist/DublinCore-Dq-tVA5d.d.mts +119 -0
  41. package/dist/Engine-CYPB3g4h.d.mts +144 -0
  42. package/dist/Engine-DF8PN7g-.mjs +872 -0
  43. package/dist/Engine-DF8PN7g-.mjs.map +1 -0
  44. package/dist/Errors-CMdV1RhU.mjs +37 -0
  45. package/dist/Errors-CMdV1RhU.mjs.map +1 -0
  46. package/dist/Errors-u2bDjUeM.d.mts +30 -0
  47. package/dist/Evaluator-DEsU4d1o.d.mts +50 -0
  48. package/dist/Evaluator-DOY2-guC.mjs +281 -0
  49. package/dist/Evaluator-DOY2-guC.mjs.map +1 -0
  50. package/dist/Exif-CpqniYQd.d.mts +78 -0
  51. package/dist/Exif-DjkCfEB-.mjs +89 -0
  52. package/dist/Exif-DjkCfEB-.mjs.map +1 -0
  53. package/dist/Expression-BIMMvduQ.mjs +230 -0
  54. package/dist/Expression-BIMMvduQ.mjs.map +1 -0
  55. package/dist/Expression-W8A9cyX7.d.mts +89 -0
  56. package/dist/Extract-Bop85jES.mjs +220 -0
  57. package/dist/Extract-Bop85jES.mjs.map +1 -0
  58. package/dist/Extract-C_pCvuTC.d.mts +88 -0
  59. package/dist/Federation-BcNrozc1.d.mts +52 -0
  60. package/dist/Federation-CHScBkaK.mjs +130 -0
  61. package/dist/Federation-CHScBkaK.mjs.map +1 -0
  62. package/dist/Functions-AvjNcId_.mjs +1346 -0
  63. package/dist/Functions-AvjNcId_.mjs.map +1 -0
  64. package/dist/Functions-OQJZP-F6.d.mts +111 -0
  65. package/dist/Generator-C52mmq01.d.mts +50 -0
  66. package/dist/Generator-D3utCJC7.mjs +205 -0
  67. package/dist/Generator-D3utCJC7.mjs.map +1 -0
  68. package/dist/Grammar-CPlSxGH6.mjs +200 -0
  69. package/dist/Grammar-CPlSxGH6.mjs.map +1 -0
  70. package/dist/Grammar-CRhnRoCu.d.mts +148 -0
  71. package/dist/Grammar-D6jZdJQ3.d.mts +169 -0
  72. package/dist/Grammar-mQ8CgE1M.mjs +258 -0
  73. package/dist/Grammar-mQ8CgE1M.mjs.map +1 -0
  74. package/dist/GraphStore-DhUa4nFO.d.mts +45 -0
  75. package/dist/GraphStore-DvbqwKy1.mjs +212 -0
  76. package/dist/GraphStore-DvbqwKy1.mjs.map +1 -0
  77. package/dist/Iri-BB8Ks-BF.d.mts +84 -0
  78. package/dist/Iri-Cr92gsQV.mjs +232 -0
  79. package/dist/Iri-Cr92gsQV.mjs.map +1 -0
  80. package/dist/Iri.d.mts +2 -0
  81. package/dist/Iri.mjs +1 -0
  82. package/dist/Isomorphism-B6qTY-xy.d.mts +28 -0
  83. package/dist/Isomorphism-BmqxhKyJ.mjs +232 -0
  84. package/dist/Isomorphism-BmqxhKyJ.mjs.map +1 -0
  85. package/dist/Isomorphism-DInKnWIy.mjs +390 -0
  86. package/dist/Isomorphism-DInKnWIy.mjs.map +1 -0
  87. package/dist/Isomorphism-DvSfZXLR.d.mts +37 -0
  88. package/dist/Isomorphism.d.mts +2 -0
  89. package/dist/Isomorphism.mjs +1 -0
  90. package/dist/JsonLd-DOwS2FHg.mjs +2836 -0
  91. package/dist/JsonLd-DOwS2FHg.mjs.map +1 -0
  92. package/dist/JsonLd-DobFrQNa.d.mts +242 -0
  93. package/dist/JsonLdError-C9J-BxfG.mjs +106 -0
  94. package/dist/JsonLdError-C9J-BxfG.mjs.map +1 -0
  95. package/dist/JsonLdError-DSOfHkOy.d.mts +43 -0
  96. package/dist/LanguageTag-BCu8rcmX.d.mts +38 -0
  97. package/dist/LanguageTag-BcOpMGZ4.mjs +89 -0
  98. package/dist/LanguageTag-BcOpMGZ4.mjs.map +1 -0
  99. package/dist/LanguageTag.d.mts +2 -0
  100. package/dist/LanguageTag.mjs +1 -0
  101. package/dist/Lexical-Cg0JHrf6.mjs +243 -0
  102. package/dist/Lexical-Cg0JHrf6.mjs.map +1 -0
  103. package/dist/Lexical-D3zySYVS.d.mts +163 -0
  104. package/dist/Manifest-B6xf6mUc.mjs +148 -0
  105. package/dist/Manifest-B6xf6mUc.mjs.map +1 -0
  106. package/dist/Manifest-DQUMRBFr.d.mts +98 -0
  107. package/dist/Mapping-BgG74x3U.d.mts +63 -0
  108. package/dist/Mapping-Dc1ZGirk.mjs +259 -0
  109. package/dist/Mapping-Dc1ZGirk.mjs.map +1 -0
  110. package/dist/Mcp-1DwTTKOK.mjs +48 -0
  111. package/dist/Mcp-1DwTTKOK.mjs.map +1 -0
  112. package/dist/Mcp-d-pX9erx.d.mts +25 -0
  113. package/dist/Message-CK_DGQuu.mjs +95 -0
  114. package/dist/Message-CK_DGQuu.mjs.map +1 -0
  115. package/dist/Message-fIvTJSXM.d.mts +49 -0
  116. package/dist/Metadata-BbffwGDZ.mjs +445 -0
  117. package/dist/Metadata-BbffwGDZ.mjs.map +1 -0
  118. package/dist/Metadata-CEt3yc1-.d.mts +901 -0
  119. package/dist/Metadata-D4HsQNXr.mjs +1273 -0
  120. package/dist/Metadata-D4HsQNXr.mjs.map +1 -0
  121. package/dist/Metadata-nzS7QKRj.d.mts +350 -0
  122. package/dist/Model-DaMmxurZ.d.mts +293 -0
  123. package/dist/Model-DlPzRYhF.mjs +528 -0
  124. package/dist/Model-DlPzRYhF.mjs.map +1 -0
  125. package/dist/N3-BzyV-KIH.mjs +974 -0
  126. package/dist/N3-BzyV-KIH.mjs.map +1 -0
  127. package/dist/N3-DSLnonDn.d.mts +100 -0
  128. package/dist/NQuads-C1VBOJ3-.mjs +117 -0
  129. package/dist/NQuads-C1VBOJ3-.mjs.map +1 -0
  130. package/dist/NQuads-FjFZikFg.d.mts +76 -0
  131. package/dist/NTriples-D-kLSEAf.mjs +120 -0
  132. package/dist/NTriples-D-kLSEAf.mjs.map +1 -0
  133. package/dist/NTriples-D34OspfW.d.mts +76 -0
  134. package/dist/Namespace-ClTUO_ya.d.mts +42 -0
  135. package/dist/Namespace-DHFIsORd.mjs +75 -0
  136. package/dist/Namespace-DHFIsORd.mjs.map +1 -0
  137. package/dist/Namespace.d.mts +2 -0
  138. package/dist/Namespace.mjs +1 -0
  139. package/dist/Namespaces-Bz85vpjW.mjs +235 -0
  140. package/dist/Namespaces-Bz85vpjW.mjs.map +1 -0
  141. package/dist/Namespaces-C1jW6EDo.d.mts +178 -0
  142. package/dist/Optimizer-BWWQRQPY.mjs +168 -0
  143. package/dist/Optimizer-BWWQRQPY.mjs.map +1 -0
  144. package/dist/Optimizer-DUpUow6k.d.mts +26 -0
  145. package/dist/Options-BLBGL4HE.mjs +72 -0
  146. package/dist/Options-BLBGL4HE.mjs.map +1 -0
  147. package/dist/Options-BommQwP9.d.mts +127 -0
  148. package/dist/Packet-CA76wVX3.mjs +197 -0
  149. package/dist/Packet-CA76wVX3.mjs.map +1 -0
  150. package/dist/Packet-Cy5g6XuW.d.mts +130 -0
  151. package/dist/Parser-p1Gyr0QN.d.mts +85 -0
  152. package/dist/Parser-xARsOWXk.mjs +1317 -0
  153. package/dist/Parser-xARsOWXk.mjs.map +1 -0
  154. package/dist/Path-B20Yp8KE.mjs +284 -0
  155. package/dist/Path-B20Yp8KE.mjs.map +1 -0
  156. package/dist/Path-DRB8e-Zn.d.mts +181 -0
  157. package/dist/Pdf-B9RZn--8.d.mts +77 -0
  158. package/dist/Pdf-CKK6dkZn.mjs +89 -0
  159. package/dist/Pdf-CKK6dkZn.mjs.map +1 -0
  160. package/dist/PdfA-CUjSuntT.d.mts +109 -0
  161. package/dist/PdfA-CleOhuL6.mjs +124 -0
  162. package/dist/PdfA-CleOhuL6.mjs.map +1 -0
  163. package/dist/Photoshop-CiHo80qV.mjs +233 -0
  164. package/dist/Photoshop-CiHo80qV.mjs.map +1 -0
  165. package/dist/Photoshop-udKZ0I3N.d.mts +204 -0
  166. package/dist/PrefixMap-BHFPDLO-.mjs +103 -0
  167. package/dist/PrefixMap-BHFPDLO-.mjs.map +1 -0
  168. package/dist/PrefixMap-BMlXrWNd.d.mts +64 -0
  169. package/dist/PrefixMap.d.mts +2 -0
  170. package/dist/PrefixMap.mjs +1 -0
  171. package/dist/Processor-CMmecFsb.mjs +198 -0
  172. package/dist/Processor-CMmecFsb.mjs.map +1 -0
  173. package/dist/Processor-FJPvO0CB.d.mts +435 -0
  174. package/dist/Protocol-BA7OkNgp.mjs +202 -0
  175. package/dist/Protocol-BA7OkNgp.mjs.map +1 -0
  176. package/dist/Protocol-DlSoiIKB.d.mts +108 -0
  177. package/dist/ProtocolErrors-Ckfejnl6.d.mts +84 -0
  178. package/dist/ProtocolErrors-czDPVcX5.mjs +129 -0
  179. package/dist/ProtocolErrors-czDPVcX5.mjs.map +1 -0
  180. package/dist/Query-D9A6LOpP.mjs +364 -0
  181. package/dist/Query-D9A6LOpP.mjs.map +1 -0
  182. package/dist/Query-KqSkTYyG.d.mts +96 -0
  183. package/dist/QueryBuilder-BLK9Vfbz.mjs +674 -0
  184. package/dist/QueryBuilder-BLK9Vfbz.mjs.map +1 -0
  185. package/dist/QueryBuilder-DUqh4ECe.d.mts +529 -0
  186. package/dist/RdfJs-D6-49XB5.mjs +86 -0
  187. package/dist/RdfJs-D6-49XB5.mjs.map +1 -0
  188. package/dist/RdfJs-DXFqdWrd.d.mts +76 -0
  189. package/dist/RdfJs.d.mts +2 -0
  190. package/dist/RdfJs.mjs +1 -0
  191. package/dist/RdfJson-5aKPDlPS.d.mts +297 -0
  192. package/dist/RdfJson-BNocgW4f.mjs +548 -0
  193. package/dist/RdfJson-BNocgW4f.mjs.map +1 -0
  194. package/dist/RdfXml-DJ9G4gOq.mjs +1014 -0
  195. package/dist/RdfXml-DJ9G4gOq.mjs.map +1 -0
  196. package/dist/RdfXml-_N7yxWEp.d.mts +149 -0
  197. package/dist/Rdfs-BRVPsAjc.d.mts +84 -0
  198. package/dist/Rdfs-CyY2wVHI.mjs +167 -0
  199. package/dist/Rdfs-CyY2wVHI.mjs.map +1 -0
  200. package/dist/Rdfs.d.mts +2 -0
  201. package/dist/Rdfs.mjs +1 -0
  202. package/dist/Reasoner-BxYhx9s7.d.mts +94 -0
  203. package/dist/Reasoner-Cw90zrjv.mjs +798 -0
  204. package/dist/Reasoner-Cw90zrjv.mjs.map +1 -0
  205. package/dist/Reification-BmN4EfnM.d.mts +40 -0
  206. package/dist/Reification-dpqQvjDE.mjs +82 -0
  207. package/dist/Reification-dpqQvjDE.mjs.map +1 -0
  208. package/dist/Reification.d.mts +2 -0
  209. package/dist/Reification.mjs +1 -0
  210. package/dist/Report-XHs8htzK.mjs +121 -0
  211. package/dist/Report-XHs8htzK.mjs.map +1 -0
  212. package/dist/Report-hcXsc_19.d.mts +115 -0
  213. package/dist/Resource-B1cI8FyJ.d.mts +218 -0
  214. package/dist/Resource-sIEeNh15.mjs +374 -0
  215. package/dist/Resource-sIEeNh15.mjs.map +1 -0
  216. package/dist/Resource.d.mts +2 -0
  217. package/dist/Resource.mjs +1 -0
  218. package/dist/Results-BVNEC-Wt.d.mts +277 -0
  219. package/dist/Results-peJjGA2V.mjs +621 -0
  220. package/dist/Results-peJjGA2V.mjs.map +1 -0
  221. package/dist/ResultsStream-BhF0OcNn.mjs +639 -0
  222. package/dist/ResultsStream-BhF0OcNn.mjs.map +1 -0
  223. package/dist/ResultsStream-toYMXrOe.d.mts +100 -0
  224. package/dist/SemAct-CDchtk49.d.mts +96 -0
  225. package/dist/SemAct-CmyT4yI8.mjs +118 -0
  226. package/dist/SemAct-CmyT4yI8.mjs.map +1 -0
  227. package/dist/Serialization-DP9H5bYQ.mjs +514 -0
  228. package/dist/Serialization-DP9H5bYQ.mjs.map +1 -0
  229. package/dist/Serialization-Df8iVauT.d.mts +392 -0
  230. package/dist/Serialization.d.mts +2 -0
  231. package/dist/Serialization.mjs +1 -0
  232. package/dist/ServerFormats-CrRnjjf6.mjs +64 -0
  233. package/dist/ServerFormats-CrRnjjf6.mjs.map +1 -0
  234. package/dist/ServerFormats-DjC9NsO_.d.mts +36 -0
  235. package/dist/ServiceDescription-BERsvg-k.d.mts +54 -0
  236. package/dist/ServiceDescription-Dq5hxeGy.mjs +97 -0
  237. package/dist/ServiceDescription-Dq5hxeGy.mjs.map +1 -0
  238. package/dist/ShExC-Ctf-06CL.d.mts +67 -0
  239. package/dist/ShExC-DJbB19i3.mjs +1181 -0
  240. package/dist/ShExC-DJbB19i3.mjs.map +1 -0
  241. package/dist/ShExError-BeYFD9rv.d.mts +61 -0
  242. package/dist/ShExError-CVtq2NnM.mjs +64 -0
  243. package/dist/ShExError-CVtq2NnM.mjs.map +1 -0
  244. package/dist/ShExJ-C1u_wgyD.d.mts +531 -0
  245. package/dist/ShExJ-COiPd9Xw.mjs +532 -0
  246. package/dist/ShExJ-COiPd9Xw.mjs.map +1 -0
  247. package/dist/ShExR-ByR4mCh-.mjs +480 -0
  248. package/dist/ShExR-ByR4mCh-.mjs.map +1 -0
  249. package/dist/ShExR-CqONNNBz.d.mts +40 -0
  250. package/dist/ShapeMap-C422pxKl.d.mts +140 -0
  251. package/dist/ShapeMap-CsgKxB2G.mjs +181 -0
  252. package/dist/ShapeMap-CsgKxB2G.mjs.map +1 -0
  253. package/dist/Shapes-18GjfyBV.mjs +597 -0
  254. package/dist/Shapes-18GjfyBV.mjs.map +1 -0
  255. package/dist/Shapes-BQFDFc4Q.d.mts +306 -0
  256. package/dist/Sparql-BiYFMSpl.mjs +29 -0
  257. package/dist/Sparql-BiYFMSpl.mjs.map +1 -0
  258. package/dist/Sparql-DecpWTPh.d.mts +97 -0
  259. package/dist/SparqlClient-C_CjXbwj.mjs +333 -0
  260. package/dist/SparqlClient-C_CjXbwj.mjs.map +1 -0
  261. package/dist/SparqlClient-UPc88SHy.d.mts +290 -0
  262. package/dist/SparqlServer-CbUW-pVj.d.mts +71 -0
  263. package/dist/SparqlServer-Db7w7Cll.mjs +308 -0
  264. package/dist/SparqlServer-Db7w7Cll.mjs.map +1 -0
  265. package/dist/SqlStore-BBqFx-Wl.mjs +684 -0
  266. package/dist/SqlStore-BBqFx-Wl.mjs.map +1 -0
  267. package/dist/SqlStore-CCJo5I-e.d.mts +117 -0
  268. package/dist/Store-D0jmVfb3.d.mts +166 -0
  269. package/dist/Store-DH3Ow1GO.mjs +162 -0
  270. package/dist/Store-DH3Ow1GO.mjs.map +1 -0
  271. package/dist/Structure-BjMo4Bkc.mjs +334 -0
  272. package/dist/Structure-BjMo4Bkc.mjs.map +1 -0
  273. package/dist/Structure-n4CmDiab.d.mts +63 -0
  274. package/dist/Table-BGgm9nbM.mjs +538 -0
  275. package/dist/Table-BGgm9nbM.mjs.map +1 -0
  276. package/dist/Table-C3reiVrb.d.mts +261 -0
  277. package/dist/Term-B_4ezyXq.d.mts +619 -0
  278. package/dist/Term-CFLG1qu4.mjs +991 -0
  279. package/dist/Term-CFLG1qu4.mjs.map +1 -0
  280. package/dist/Term.d.mts +2 -0
  281. package/dist/Term.mjs +1 -0
  282. package/dist/TermCodec-CDZiEztW.mjs +397 -0
  283. package/dist/TermCodec-CDZiEztW.mjs.map +1 -0
  284. package/dist/TermCodec-_03bDXr0.d.mts +209 -0
  285. package/dist/TermCodec.d.mts +2 -0
  286. package/dist/TermCodec.mjs +1 -0
  287. package/dist/TermJson-BOPe0yve.d.mts +232 -0
  288. package/dist/TermJson-FAg3lvjl.mjs +142 -0
  289. package/dist/TermJson-FAg3lvjl.mjs.map +1 -0
  290. package/dist/TermJson.d.mts +2 -0
  291. package/dist/TermJson.mjs +1 -0
  292. package/dist/TermSchema-Bn9CoaYA.mjs +30 -0
  293. package/dist/TermSchema-Bn9CoaYA.mjs.map +1 -0
  294. package/dist/TermSchema-DBO6MroX.d.mts +6 -0
  295. package/dist/Testing-B-aPCpmu.mjs +63 -0
  296. package/dist/Testing-B-aPCpmu.mjs.map +1 -0
  297. package/dist/Testing-CF6s8P3O.d.mts +53 -0
  298. package/dist/Tiff-CR-2QeSI.d.mts +148 -0
  299. package/dist/Tiff-DlsOlZPM.mjs +169 -0
  300. package/dist/Tiff-DlsOlZPM.mjs.map +1 -0
  301. package/dist/Tools-7MdRKccr.d.mts +583 -0
  302. package/dist/Tools-ryxphZbI.mjs +329 -0
  303. package/dist/Tools-ryxphZbI.mjs.map +1 -0
  304. package/dist/Translate-B0YKKANS.d.mts +37 -0
  305. package/dist/Translate-gzWPq0Ia.mjs +308 -0
  306. package/dist/Translate-gzWPq0Ia.mjs.map +1 -0
  307. package/dist/Translation-DC9rLm2y.mjs +1535 -0
  308. package/dist/Translation-DC9rLm2y.mjs.map +1 -0
  309. package/dist/Translation-K4L9XBqX.d.mts +103 -0
  310. package/dist/TriG-BkqtqZ6Y.mjs +125 -0
  311. package/dist/TriG-BkqtqZ6Y.mjs.map +1 -0
  312. package/dist/TriG-xDjdDatp.d.mts +86 -0
  313. package/dist/Turtle-Bv1_bisW.d.mts +85 -0
  314. package/dist/Turtle-CZVUOtwl.mjs +133 -0
  315. package/dist/Turtle-CZVUOtwl.mjs.map +1 -0
  316. package/dist/ValidationReport-DBdJshW5.mjs +285 -0
  317. package/dist/ValidationReport-DBdJshW5.mjs.map +1 -0
  318. package/dist/ValidationReport-Dx3WxY0h.d.mts +192 -0
  319. package/dist/Validator-227ff9Rn.d.mts +179 -0
  320. package/dist/Validator-BzXMKDeJ.mjs +1162 -0
  321. package/dist/Validator-BzXMKDeJ.mjs.map +1 -0
  322. package/dist/Validator-Dl8cih5V.d.mts +207 -0
  323. package/dist/Validator-DmUfMbpL.mjs +568 -0
  324. package/dist/Validator-DmUfMbpL.mjs.map +1 -0
  325. package/dist/Vocab-DceKywpq.mjs +168 -0
  326. package/dist/Vocab-DceKywpq.mjs.map +1 -0
  327. package/dist/Vocab-Df-L-IwZ.d.mts +46 -0
  328. package/dist/Vocab-Do56UgBX.d.mts +81 -0
  329. package/dist/Vocab-TfpWG1Ne.mjs +118 -0
  330. package/dist/Vocab-TfpWG1Ne.mjs.map +1 -0
  331. package/dist/Vocab.d.mts +2 -0
  332. package/dist/Vocab.mjs +1 -0
  333. package/dist/Vocabulary-C6-GPOy4.d.mts +22 -0
  334. package/dist/Vocabulary-CnQl-_Z4.mjs +179 -0
  335. package/dist/Vocabulary-CnQl-_Z4.mjs.map +1 -0
  336. package/dist/Xml-B7iihYCS.mjs +976 -0
  337. package/dist/Xml-B7iihYCS.mjs.map +1 -0
  338. package/dist/Xml-CmfHS7SW.d.mts +267 -0
  339. package/dist/Xmp-D7CKA7MZ.d.mts +111 -0
  340. package/dist/Xmp-DCGN9pOD.mjs +307 -0
  341. package/dist/Xmp-DCGN9pOD.mjs.map +1 -0
  342. package/dist/XmpBasic-CP38jpR_.mjs +73 -0
  343. package/dist/XmpBasic-CP38jpR_.mjs.map +1 -0
  344. package/dist/XmpBasic-Cmbe53rQ.d.mts +64 -0
  345. package/dist/XmpMM-BfL_TgJF.mjs +73 -0
  346. package/dist/XmpMM-BfL_TgJF.mjs.map +1 -0
  347. package/dist/XmpMM-Dqm3IX8p.d.mts +63 -0
  348. package/dist/XmpRights-BKPtoI5L.mjs +73 -0
  349. package/dist/XmpRights-BKPtoI5L.mjs.map +1 -0
  350. package/dist/XmpRights-CaALZQz2.d.mts +63 -0
  351. package/dist/Xsd-Cdgx5zRB.mjs +405 -0
  352. package/dist/Xsd-Cdgx5zRB.mjs.map +1 -0
  353. package/dist/Xsd-D2elNhSm.d.mts +187 -0
  354. package/dist/Xsd.d.mts +2 -0
  355. package/dist/Xsd.mjs +1 -0
  356. package/dist/accessors-CEjaojuQ.mjs +28 -0
  357. package/dist/accessors-CEjaojuQ.mjs.map +1 -0
  358. package/dist/codec-Lb2T96rv.d.mts +20 -0
  359. package/dist/codec-QNo7IdJF.mjs +389 -0
  360. package/dist/codec-QNo7IdJF.mjs.map +1 -0
  361. package/dist/csvw/Csv2Json.d.mts +2 -0
  362. package/dist/csvw/Csv2Json.mjs +1 -0
  363. package/dist/csvw/Csv2Rdf.d.mts +2 -0
  364. package/dist/csvw/Csv2Rdf.mjs +1 -0
  365. package/dist/csvw/Datatype.d.mts +2 -0
  366. package/dist/csvw/Datatype.mjs +1 -0
  367. package/dist/csvw/Metadata.d.mts +2 -0
  368. package/dist/csvw/Metadata.mjs +1 -0
  369. package/dist/csvw/Processor.d.mts +2 -0
  370. package/dist/csvw/Processor.mjs +1 -0
  371. package/dist/csvw/Report.d.mts +2 -0
  372. package/dist/csvw/Report.mjs +1 -0
  373. package/dist/csvw/Table.d.mts +2 -0
  374. package/dist/csvw/Table.mjs +1 -0
  375. package/dist/csvw/index.d.mts +8 -0
  376. package/dist/csvw/index.mjs +8 -0
  377. package/dist/index-Cms2TYfC.d.mts +16 -0
  378. package/dist/index-Ct8xFmRs.d.mts +7 -0
  379. package/dist/index-D4QFwOjm.d.mts +28 -0
  380. package/dist/index.d.mts +18 -0
  381. package/dist/index.mjs +17 -0
  382. package/dist/jsonld/DocumentLoader.d.mts +2 -0
  383. package/dist/jsonld/DocumentLoader.mjs +1 -0
  384. package/dist/jsonld/JsonLd.d.mts +2 -0
  385. package/dist/jsonld/JsonLd.mjs +1 -0
  386. package/dist/jsonld/JsonLdError.d.mts +2 -0
  387. package/dist/jsonld/JsonLdError.mjs +1 -0
  388. package/dist/jsonld/index.d.mts +4 -0
  389. package/dist/jsonld/index.mjs +4 -0
  390. package/dist/lists-D-OpQ0Ir.mjs +77 -0
  391. package/dist/lists-D-OpQ0Ir.mjs.map +1 -0
  392. package/dist/loop-D5-gNx9K.mjs +21 -0
  393. package/dist/loop-D5-gNx9K.mjs.map +1 -0
  394. package/dist/loop-DZ2hXlr_.mjs +21 -0
  395. package/dist/loop-DZ2hXlr_.mjs.map +1 -0
  396. package/dist/n3/Isomorphism.d.mts +2 -0
  397. package/dist/n3/Isomorphism.mjs +1 -0
  398. package/dist/n3/Mapping.d.mts +2 -0
  399. package/dist/n3/Mapping.mjs +1 -0
  400. package/dist/n3/Model.d.mts +2 -0
  401. package/dist/n3/Model.mjs +1 -0
  402. package/dist/n3/N3.d.mts +2 -0
  403. package/dist/n3/N3.mjs +1 -0
  404. package/dist/n3/Reasoner.d.mts +2 -0
  405. package/dist/n3/Reasoner.mjs +2 -0
  406. package/dist/n3/Vocab.d.mts +2 -0
  407. package/dist/n3/Vocab.mjs +1 -0
  408. package/dist/n3/index.d.mts +7 -0
  409. package/dist/n3/index.mjs +7 -0
  410. package/dist/ntriples/Grammar.d.mts +2 -0
  411. package/dist/ntriples/Grammar.mjs +1 -0
  412. package/dist/ntriples/Lexical.d.mts +2 -0
  413. package/dist/ntriples/Lexical.mjs +1 -0
  414. package/dist/ntriples/NQuads.d.mts +2 -0
  415. package/dist/ntriples/NQuads.mjs +1 -0
  416. package/dist/ntriples/NTriples.d.mts +2 -0
  417. package/dist/ntriples/NTriples.mjs +1 -0
  418. package/dist/ntriples/index.d.mts +5 -0
  419. package/dist/ntriples/index.mjs +5 -0
  420. package/dist/rdfjson/RdfJson.d.mts +2 -0
  421. package/dist/rdfjson/RdfJson.mjs +1 -0
  422. package/dist/rdfjson/index.d.mts +2 -0
  423. package/dist/rdfjson/index.mjs +1 -0
  424. package/dist/rdfxml/RdfXml.d.mts +2 -0
  425. package/dist/rdfxml/RdfXml.mjs +1 -0
  426. package/dist/rdfxml/Xml.d.mts +2 -0
  427. package/dist/rdfxml/Xml.mjs +1 -0
  428. package/dist/rdfxml/index.d.mts +3 -0
  429. package/dist/rdfxml/index.mjs +3 -0
  430. package/dist/rolldown-runtime-D8jQpDG7.mjs +12 -0
  431. package/dist/serialize-96KBvKaf.mjs +1463 -0
  432. package/dist/serialize-96KBvKaf.mjs.map +1 -0
  433. package/dist/serialize-DsoXdM6n.d.mts +37 -0
  434. package/dist/shacl/Message.d.mts +2 -0
  435. package/dist/shacl/Message.mjs +1 -0
  436. package/dist/shacl/Path.d.mts +2 -0
  437. package/dist/shacl/Path.mjs +1 -0
  438. package/dist/shacl/Shapes.d.mts +2 -0
  439. package/dist/shacl/Shapes.mjs +1 -0
  440. package/dist/shacl/Sparql.d.mts +2 -0
  441. package/dist/shacl/Sparql.mjs +1 -0
  442. package/dist/shacl/ValidationReport.d.mts +2 -0
  443. package/dist/shacl/ValidationReport.mjs +1 -0
  444. package/dist/shacl/Validator.d.mts +2 -0
  445. package/dist/shacl/Validator.mjs +1 -0
  446. package/dist/shacl/Vocabulary.d.mts +2 -0
  447. package/dist/shacl/Vocabulary.mjs +1 -0
  448. package/dist/shacl/index.d.mts +9 -0
  449. package/dist/shacl/index.mjs +8 -0
  450. package/dist/shex/SemAct.d.mts +2 -0
  451. package/dist/shex/SemAct.mjs +1 -0
  452. package/dist/shex/ShExC.d.mts +2 -0
  453. package/dist/shex/ShExC.mjs +1 -0
  454. package/dist/shex/ShExError.d.mts +2 -0
  455. package/dist/shex/ShExError.mjs +1 -0
  456. package/dist/shex/ShExJ.d.mts +2 -0
  457. package/dist/shex/ShExJ.mjs +2 -0
  458. package/dist/shex/ShExR.d.mts +2 -0
  459. package/dist/shex/ShExR.mjs +1 -0
  460. package/dist/shex/ShapeMap.d.mts +2 -0
  461. package/dist/shex/ShapeMap.mjs +1 -0
  462. package/dist/shex/Structure.d.mts +2 -0
  463. package/dist/shex/Structure.mjs +2 -0
  464. package/dist/shex/Validator.d.mts +2 -0
  465. package/dist/shex/Validator.mjs +4 -0
  466. package/dist/shex/index.d.mts +9 -0
  467. package/dist/shex/index.mjs +9 -0
  468. package/dist/sparql/Algebra.d.mts +2 -0
  469. package/dist/sparql/Algebra.mjs +1 -0
  470. package/dist/sparql/Ast.d.mts +2 -0
  471. package/dist/sparql/Ast.mjs +1 -0
  472. package/dist/sparql/Bindings.d.mts +2 -0
  473. package/dist/sparql/Bindings.mjs +1 -0
  474. package/dist/sparql/ClientErrors.d.mts +2 -0
  475. package/dist/sparql/ClientErrors.mjs +1 -0
  476. package/dist/sparql/ClientFormats.d.mts +2 -0
  477. package/dist/sparql/ClientFormats.mjs +1 -0
  478. package/dist/sparql/Engine.d.mts +2 -0
  479. package/dist/sparql/Engine.mjs +1 -0
  480. package/dist/sparql/Errors.d.mts +2 -0
  481. package/dist/sparql/Errors.mjs +1 -0
  482. package/dist/sparql/Expression.d.mts +2 -0
  483. package/dist/sparql/Expression.mjs +1 -0
  484. package/dist/sparql/Federation.d.mts +2 -0
  485. package/dist/sparql/Federation.mjs +1 -0
  486. package/dist/sparql/Functions.d.mts +2 -0
  487. package/dist/sparql/Functions.mjs +1 -0
  488. package/dist/sparql/Generator.d.mts +2 -0
  489. package/dist/sparql/Generator.mjs +1 -0
  490. package/dist/sparql/GraphStore.d.mts +2 -0
  491. package/dist/sparql/GraphStore.mjs +1 -0
  492. package/dist/sparql/Optimizer.d.mts +2 -0
  493. package/dist/sparql/Optimizer.mjs +1 -0
  494. package/dist/sparql/Options.d.mts +2 -0
  495. package/dist/sparql/Options.mjs +1 -0
  496. package/dist/sparql/Parser.d.mts +2 -0
  497. package/dist/sparql/Parser.mjs +1 -0
  498. package/dist/sparql/Protocol.d.mts +2 -0
  499. package/dist/sparql/Protocol.mjs +1 -0
  500. package/dist/sparql/ProtocolErrors.d.mts +2 -0
  501. package/dist/sparql/ProtocolErrors.mjs +1 -0
  502. package/dist/sparql/QueryBuilder.d.mts +2 -0
  503. package/dist/sparql/QueryBuilder.mjs +1 -0
  504. package/dist/sparql/Results.d.mts +2 -0
  505. package/dist/sparql/Results.mjs +1 -0
  506. package/dist/sparql/ResultsStream.d.mts +2 -0
  507. package/dist/sparql/ResultsStream.mjs +1 -0
  508. package/dist/sparql/ServerFormats.d.mts +2 -0
  509. package/dist/sparql/ServerFormats.mjs +1 -0
  510. package/dist/sparql/ServiceDescription.d.mts +2 -0
  511. package/dist/sparql/ServiceDescription.mjs +1 -0
  512. package/dist/sparql/SparqlClient.d.mts +2 -0
  513. package/dist/sparql/SparqlClient.mjs +1 -0
  514. package/dist/sparql/SparqlServer.d.mts +2 -0
  515. package/dist/sparql/SparqlServer.mjs +1 -0
  516. package/dist/sparql/Store.d.mts +2 -0
  517. package/dist/sparql/Store.mjs +1 -0
  518. package/dist/sparql/TermSchema.d.mts +3 -0
  519. package/dist/sparql/TermSchema.mjs +2 -0
  520. package/dist/sparql/Testing.d.mts +2 -0
  521. package/dist/sparql/Testing.mjs +1 -0
  522. package/dist/sparql/Translate.d.mts +2 -0
  523. package/dist/sparql/Translate.mjs +1 -0
  524. package/dist/sparql/ai/Mcp.d.mts +2 -0
  525. package/dist/sparql/ai/Mcp.mjs +1 -0
  526. package/dist/sparql/ai/Tools.d.mts +2 -0
  527. package/dist/sparql/ai/Tools.mjs +1 -0
  528. package/dist/sparql/ai/index.d.mts +3 -0
  529. package/dist/sparql/ai/index.mjs +3 -0
  530. package/dist/sparql/index.d.mts +30 -0
  531. package/dist/sparql/index.mjs +29 -0
  532. package/dist/sparql/shacl/Evaluator.d.mts +2 -0
  533. package/dist/sparql/shacl/Evaluator.mjs +1 -0
  534. package/dist/sparql/shacl/Query.d.mts +2 -0
  535. package/dist/sparql/shacl/Query.mjs +1 -0
  536. package/dist/sparql/shacl/index.d.mts +3 -0
  537. package/dist/sparql/shacl/index.mjs +3 -0
  538. package/dist/sparql/sql/Dialect.d.mts +2 -0
  539. package/dist/sparql/sql/Dialect.mjs +1 -0
  540. package/dist/sparql/sql/SqlStore.d.mts +2 -0
  541. package/dist/sparql/sql/SqlStore.mjs +1 -0
  542. package/dist/sparql/sql/Translation.d.mts +2 -0
  543. package/dist/sparql/sql/Translation.mjs +1 -0
  544. package/dist/sparql/sql/index.d.mts +4 -0
  545. package/dist/sparql/sql/index.mjs +4 -0
  546. package/dist/stringMap-D5YIpYtR.mjs +38 -0
  547. package/dist/stringMap-D5YIpYtR.mjs.map +1 -0
  548. package/dist/tokens-C6BzeodQ.mjs +24 -0
  549. package/dist/tokens-C6BzeodQ.mjs.map +1 -0
  550. package/dist/turtle/Grammar.d.mts +3 -0
  551. package/dist/turtle/Grammar.mjs +3 -0
  552. package/dist/turtle/Manifest.d.mts +2 -0
  553. package/dist/turtle/Manifest.mjs +1 -0
  554. package/dist/turtle/TriG.d.mts +2 -0
  555. package/dist/turtle/TriG.mjs +1 -0
  556. package/dist/turtle/Turtle.d.mts +2 -0
  557. package/dist/turtle/Turtle.mjs +1 -0
  558. package/dist/turtle/index.d.mts +5 -0
  559. package/dist/turtle/index.mjs +5 -0
  560. package/dist/xmp/DublinCore.d.mts +2 -0
  561. package/dist/xmp/DublinCore.mjs +1 -0
  562. package/dist/xmp/Exif.d.mts +2 -0
  563. package/dist/xmp/Exif.mjs +1 -0
  564. package/dist/xmp/Extract.d.mts +2 -0
  565. package/dist/xmp/Extract.mjs +1 -0
  566. package/dist/xmp/Metadata.d.mts +2 -0
  567. package/dist/xmp/Metadata.mjs +1 -0
  568. package/dist/xmp/Namespaces.d.mts +2 -0
  569. package/dist/xmp/Namespaces.mjs +1 -0
  570. package/dist/xmp/Packet.d.mts +2 -0
  571. package/dist/xmp/Packet.mjs +1 -0
  572. package/dist/xmp/Pdf.d.mts +2 -0
  573. package/dist/xmp/Pdf.mjs +1 -0
  574. package/dist/xmp/PdfA.d.mts +2 -0
  575. package/dist/xmp/PdfA.mjs +1 -0
  576. package/dist/xmp/Photoshop.d.mts +2 -0
  577. package/dist/xmp/Photoshop.mjs +1 -0
  578. package/dist/xmp/Tiff.d.mts +2 -0
  579. package/dist/xmp/Tiff.mjs +1 -0
  580. package/dist/xmp/Xmp.d.mts +2 -0
  581. package/dist/xmp/Xmp.mjs +3 -0
  582. package/dist/xmp/XmpBasic.d.mts +2 -0
  583. package/dist/xmp/XmpBasic.mjs +1 -0
  584. package/dist/xmp/XmpMM.d.mts +2 -0
  585. package/dist/xmp/XmpMM.mjs +1 -0
  586. package/dist/xmp/XmpRights.d.mts +2 -0
  587. package/dist/xmp/XmpRights.mjs +1 -0
  588. package/dist/xmp/index.d.mts +15 -0
  589. package/dist/xmp/index.mjs +15 -0
  590. package/package.json +195 -3
  591. package/src/Dataset.ts +1085 -0
  592. package/src/Iri.ts +322 -0
  593. package/src/Isomorphism.ts +319 -0
  594. package/src/LanguageTag.ts +98 -0
  595. package/src/Namespace.ts +100 -0
  596. package/src/PrefixMap.ts +117 -0
  597. package/src/RdfJs.ts +146 -0
  598. package/src/Rdfs.ts +241 -0
  599. package/src/Reification.ts +103 -0
  600. package/src/Resource.ts +873 -0
  601. package/src/Serialization.ts +775 -0
  602. package/src/Term.ts +1300 -0
  603. package/src/TermCodec.ts +505 -0
  604. package/src/TermJson.ts +313 -0
  605. package/src/Vocab.ts +161 -0
  606. package/src/Xsd.ts +573 -0
  607. package/src/csvw/Csv2Json.ts +265 -0
  608. package/src/csvw/Csv2Rdf.ts +268 -0
  609. package/src/csvw/Datatype.ts +589 -0
  610. package/src/csvw/Metadata.ts +1523 -0
  611. package/src/csvw/Processor.ts +276 -0
  612. package/src/csvw/Report.ts +135 -0
  613. package/src/csvw/Table.ts +759 -0
  614. package/src/csvw/index.ts +22 -0
  615. package/src/csvw/internal/dateFormat.ts +202 -0
  616. package/src/csvw/internal/json.ts +104 -0
  617. package/src/csvw/internal/numberFormat.ts +369 -0
  618. package/src/csvw/internal/object.ts +23 -0
  619. package/src/csvw/internal/uriTemplate.ts +130 -0
  620. package/src/csvw/internal/url.ts +93 -0
  621. package/src/csvw/internal/vocab.ts +282 -0
  622. package/src/index.ts +40 -0
  623. package/src/internal/arbitrary.ts +148 -0
  624. package/src/internal/loop.ts +24 -0
  625. package/src/internal/pending.ts +20 -0
  626. package/src/internal/textDecoder.ts +183 -0
  627. package/src/jsonld/DocumentLoader.ts +512 -0
  628. package/src/jsonld/JsonLd.ts +847 -0
  629. package/src/jsonld/JsonLdError.ts +105 -0
  630. package/src/jsonld/index.ts +13 -0
  631. package/src/jsonld/internal/compact.ts +852 -0
  632. package/src/jsonld/internal/context.ts +781 -0
  633. package/src/jsonld/internal/expand.ts +614 -0
  634. package/src/jsonld/internal/flatten.ts +243 -0
  635. package/src/jsonld/internal/frame.ts +559 -0
  636. package/src/jsonld/internal/iri.ts +52 -0
  637. package/src/jsonld/internal/json.ts +19 -0
  638. package/src/jsonld/internal/linkHeader.ts +60 -0
  639. package/src/jsonld/internal/rdf.ts +481 -0
  640. package/src/jsonld/internal/util.ts +367 -0
  641. package/src/n3/Isomorphism.ts +476 -0
  642. package/src/n3/Mapping.ts +332 -0
  643. package/src/n3/Model.ts +696 -0
  644. package/src/n3/N3.ts +237 -0
  645. package/src/n3/Reasoner.ts +568 -0
  646. package/src/n3/Vocab.ts +111 -0
  647. package/src/n3/index.ts +21 -0
  648. package/src/n3/internal/builtins.ts +668 -0
  649. package/src/n3/internal/guards.ts +23 -0
  650. package/src/n3/internal/lists.ts +106 -0
  651. package/src/n3/internal/loop.ts +28 -0
  652. package/src/n3/internal/parser.ts +1032 -0
  653. package/src/n3/internal/writer.ts +344 -0
  654. package/src/ntriples/Grammar.ts +317 -0
  655. package/src/ntriples/Lexical.ts +321 -0
  656. package/src/ntriples/NQuads.ts +140 -0
  657. package/src/ntriples/NTriples.ts +143 -0
  658. package/src/ntriples/index.ts +14 -0
  659. package/src/ntriples/internal/codec.ts +229 -0
  660. package/src/ntriples/internal/lineParser.ts +326 -0
  661. package/src/ntriples/internal/loop.ts +14 -0
  662. package/src/rdfjson/RdfJson.ts +806 -0
  663. package/src/rdfjson/index.ts +9 -0
  664. package/src/rdfjson/internal/json.ts +19 -0
  665. package/src/rdfxml/RdfXml.ts +1408 -0
  666. package/src/rdfxml/Xml.ts +419 -0
  667. package/src/rdfxml/index.ts +11 -0
  668. package/src/rdfxml/internal/chars.ts +73 -0
  669. package/src/rdfxml/internal/loop.ts +24 -0
  670. package/src/rdfxml/internal/parser.ts +1265 -0
  671. package/src/shacl/Message.ts +102 -0
  672. package/src/shacl/Path.ts +483 -0
  673. package/src/shacl/Shapes.ts +913 -0
  674. package/src/shacl/Sparql.ts +128 -0
  675. package/src/shacl/ValidationReport.ts +438 -0
  676. package/src/shacl/Validator.ts +1156 -0
  677. package/src/shacl/Vocabulary.ts +180 -0
  678. package/src/shacl/index.ts +22 -0
  679. package/src/shacl/internal/compare.ts +128 -0
  680. package/src/shacl/internal/regex.ts +56 -0
  681. package/src/shex/SemAct.ts +197 -0
  682. package/src/shex/ShExC.ts +415 -0
  683. package/src/shex/ShExError.ts +71 -0
  684. package/src/shex/ShExJ.ts +893 -0
  685. package/src/shex/ShExR.ts +640 -0
  686. package/src/shex/ShapeMap.ts +385 -0
  687. package/src/shex/Structure.ts +467 -0
  688. package/src/shex/Validator.ts +395 -0
  689. package/src/shex/index.ts +24 -0
  690. package/src/shex/internal/engine.ts +682 -0
  691. package/src/shex/internal/iterate.ts +14 -0
  692. package/src/shex/internal/json.ts +12 -0
  693. package/src/shex/internal/lexer.ts +56 -0
  694. package/src/shex/internal/nodeConstraint.ts +368 -0
  695. package/src/shex/internal/shexcLexer.ts +387 -0
  696. package/src/shex/internal/shexcParser.ts +1312 -0
  697. package/src/shex/internal/tokens.ts +41 -0
  698. package/src/shex/internal/xpathRegex.ts +290 -0
  699. package/src/sparql/Algebra.ts +914 -0
  700. package/src/sparql/Ast.ts +1344 -0
  701. package/src/sparql/Bindings.ts +272 -0
  702. package/src/sparql/ClientErrors.ts +156 -0
  703. package/src/sparql/ClientFormats.ts +70 -0
  704. package/src/sparql/Engine.ts +699 -0
  705. package/src/sparql/Errors.ts +30 -0
  706. package/src/sparql/Expression.ts +360 -0
  707. package/src/sparql/Federation.ts +187 -0
  708. package/src/sparql/Functions.ts +689 -0
  709. package/src/sparql/Generator.ts +426 -0
  710. package/src/sparql/GraphStore.ts +341 -0
  711. package/src/sparql/Optimizer.ts +230 -0
  712. package/src/sparql/Options.ts +191 -0
  713. package/src/sparql/Parser.ts +173 -0
  714. package/src/sparql/Protocol.ts +342 -0
  715. package/src/sparql/ProtocolErrors.ts +113 -0
  716. package/src/sparql/QueryBuilder.ts +953 -0
  717. package/src/sparql/Results.ts +844 -0
  718. package/src/sparql/ResultsStream.ts +771 -0
  719. package/src/sparql/ServerFormats.ts +75 -0
  720. package/src/sparql/ServiceDescription.ts +130 -0
  721. package/src/sparql/SparqlClient.ts +947 -0
  722. package/src/sparql/SparqlServer.ts +528 -0
  723. package/src/sparql/Store.ts +311 -0
  724. package/src/sparql/TermSchema.ts +20 -0
  725. package/src/sparql/Testing.ts +114 -0
  726. package/src/sparql/Translate.ts +407 -0
  727. package/src/sparql/ai/Mcp.ts +43 -0
  728. package/src/sparql/ai/Tools.ts +481 -0
  729. package/src/sparql/ai/index.ts +11 -0
  730. package/src/sparql/index.ts +64 -0
  731. package/src/sparql/internal/evaluator.ts +947 -0
  732. package/src/sparql/internal/hash.ts +418 -0
  733. package/src/sparql/internal/json.ts +12 -0
  734. package/src/sparql/internal/lexer.ts +488 -0
  735. package/src/sparql/internal/loop.ts +24 -0
  736. package/src/sparql/internal/parser.ts +2215 -0
  737. package/src/sparql/internal/prefetch.ts +46 -0
  738. package/src/sparql/internal/stringMap.ts +39 -0
  739. package/src/sparql/internal/textResults.ts +226 -0
  740. package/src/sparql/internal/values.ts +550 -0
  741. package/src/sparql/shacl/Evaluator.ts +478 -0
  742. package/src/sparql/shacl/Query.ts +574 -0
  743. package/src/sparql/shacl/index.ts +12 -0
  744. package/src/sparql/sql/Dialect.ts +246 -0
  745. package/src/sparql/sql/SqlStore.ts +1080 -0
  746. package/src/sparql/sql/Translation.ts +1898 -0
  747. package/src/sparql/sql/index.ts +17 -0
  748. package/src/sparql/sql/internal/encoding.ts +313 -0
  749. package/src/turtle/Grammar.ts +286 -0
  750. package/src/turtle/Manifest.ts +215 -0
  751. package/src/turtle/TriG.ts +158 -0
  752. package/src/turtle/Turtle.ts +166 -0
  753. package/src/turtle/index.ts +14 -0
  754. package/src/turtle/internal/loop.ts +23 -0
  755. package/src/turtle/internal/parse.ts +112 -0
  756. package/src/turtle/internal/parser.ts +1303 -0
  757. package/src/turtle/internal/serialize.ts +79 -0
  758. package/src/turtle/internal/streamWriter.ts +128 -0
  759. package/src/turtle/internal/writer.ts +898 -0
  760. package/src/xmp/DublinCore.ts +147 -0
  761. package/src/xmp/Exif.ts +109 -0
  762. package/src/xmp/Extract.ts +351 -0
  763. package/src/xmp/Metadata.ts +703 -0
  764. package/src/xmp/Namespaces.ts +228 -0
  765. package/src/xmp/Packet.ts +297 -0
  766. package/src/xmp/Pdf.ts +99 -0
  767. package/src/xmp/PdfA.ts +280 -0
  768. package/src/xmp/Photoshop.ts +275 -0
  769. package/src/xmp/Tiff.ts +196 -0
  770. package/src/xmp/Xmp.ts +430 -0
  771. package/src/xmp/XmpBasic.ts +90 -0
  772. package/src/xmp/XmpMM.ts +82 -0
  773. package/src/xmp/XmpRights.ts +83 -0
  774. package/src/xmp/index.ts +36 -0
  775. package/src/xmp/internal/accessors.ts +72 -0
  776. package/src/xmp/internal/xml.ts +63 -0
@@ -0,0 +1,1303 @@
1
+ /**
2
+ * The Turtle and TriG (RDF 1.2) parser: a compiled
3
+ * `@thomasfosterau/effect-parse` grammar over the input string, built on the
4
+ * terminals of `Grammar.ts`, that emits quads as it reads.
5
+ *
6
+ * What depends on the document so far (prefixes, the base IRI, blank node
7
+ * labels and counters, the current graph) lives in a per-parser `Builder`
8
+ * that the grammar's callbacks update, as the hand-written parser it replaces
9
+ * did. Errors are thrown out of the grammar (as a `Stop` at an offset) at the
10
+ * points, and with the messages, of that parser.
11
+ *
12
+ * Input can be fed incrementally. Each run parses as many statements as the
13
+ * buffered text holds; a statement that ends too close to the end of the
14
+ * buffer to be sure of (or fails there) is rolled back and retried with more
15
+ * text, and a statement that fails before the input is complete is re-read in
16
+ * partial mode to tell a real error from a statement that is merely cut off.
17
+ *
18
+ * @internal
19
+ */
20
+ import * as Ascii from '@thomasfosterau/effect-parse/Ascii';
21
+ import * as Compiler from '@thomasfosterau/effect-parse/Compiler';
22
+ import * as Parser from '@thomasfosterau/effect-parse/Parser';
23
+ import * as Token from '@thomasfosterau/effect-parse/Token';
24
+ import * as Iri from '../../Iri.ts';
25
+ import * as Term from '../../Term.ts';
26
+ import { rdf, xsd } from '../../Vocab.ts';
27
+ import * as Lexical from '../../ntriples/Lexical.ts';
28
+ import * as Arr from 'effect/Array';
29
+ import * as MutableHashMap from 'effect/MutableHashMap';
30
+ import * as Option from 'effect/Option';
31
+ import * as Predicate from 'effect/Predicate';
32
+ import * as Result from 'effect/Result';
33
+ import * as Str from 'effect/String';
34
+ import * as Grammar from '../Grammar.ts';
35
+ import { loop } from './loop.ts';
36
+
37
+ /** @internal */
38
+ export class SyntaxFailure extends Error {
39
+ readonly line: number;
40
+ readonly column: number;
41
+ constructor(message: string, line: number, column: number) {
42
+ super(message);
43
+ this.line = line;
44
+ this.column = column;
45
+ }
46
+ }
47
+
48
+ /** @internal */
49
+ export interface ParserOptions {
50
+ readonly trig: boolean;
51
+ readonly baseIri: Option.Option<string>;
52
+ readonly blankNodePrefix: string;
53
+ /** The graph for triples outside graph blocks. */
54
+ readonly graph: Term.Graph;
55
+ }
56
+
57
+ /** An error at an offset of the text being parsed, thrown out of the grammar. */
58
+ class Stop {
59
+ readonly message: string;
60
+ readonly pos: number;
61
+ constructor(message: string, pos: number) {
62
+ this.message = message;
63
+ this.pos = pos;
64
+ }
65
+ }
66
+
67
+ /**
68
+ * How far past the end of a statement, and past any dots there, the grammar
69
+ * may look (`.%41`, `1.e+5`): a statement ending closer than this to the end
70
+ * of incomplete input is retried once more text has arrived. (A run of dots
71
+ * may continue a name, as in `ex:a...b`, however long it is.)
72
+ */
73
+ const MARGIN = 3;
74
+
75
+ const C_DOT = 0x2e;
76
+ const C_BACKSLASH = 0x5c;
77
+ const C_PERCENT = 0x25;
78
+ const C_GT = 0x3e;
79
+
80
+ /** A run of dots, matched where it starts. */
81
+ const DOTS = /\.*/y;
82
+
83
+ /** The offset after any dots at `pos`. */
84
+ const skipDots = (input: string, pos: number): number => {
85
+ if (input.charCodeAt(pos) !== C_DOT) return pos;
86
+ DOTS.lastIndex = pos;
87
+ DOTS.test(input);
88
+ return DOTS.lastIndex;
89
+ };
90
+
91
+ type P<A> = Parser.Parser<A>;
92
+
93
+ // -----------------------------------------------------------------------------
94
+ // The builder
95
+ // -----------------------------------------------------------------------------
96
+
97
+ /** The subject being described, with the predicate, object and reifier in progress. */
98
+ class Frame {
99
+ subject: Term.Subject = rdf.nil;
100
+ predicate: Term.Predicate = rdf.nil;
101
+ object: Term.Object = rdf.nil;
102
+ reifier: Option.Option<Term.NamedNode | Term.BlankNode> = Option.none();
103
+ /** The triple of the current object, once built for a reifier. */
104
+ triple: Option.Option<Term.Triple> = Option.none();
105
+ }
106
+
107
+ const noReifier = Option.none<Term.NamedNode | Term.BlankNode>();
108
+ const noTriple = Option.none<Term.Triple>();
109
+
110
+ /** A previous prefix binding (`None` when the prefix was unbound). */
111
+ type PrefixBinding = readonly [prefix: string, previous: Option.Option<string>];
112
+
113
+ class Builder {
114
+ readonly options: ParserOptions;
115
+ readonly prefixes = MutableHashMap.empty<string, string>();
116
+ base: Option.Option<string>;
117
+ out: Array<Term.Quad> = [];
118
+ readonly labels = MutableHashMap.empty<string, Term.BlankNode>();
119
+ counter = 0;
120
+ graph: Term.Graph;
121
+ inGraph = false;
122
+
123
+ /** Whether the input is complete, and the text being parsed. */
124
+ final = true;
125
+ input = '';
126
+ readonly frames: Array<Frame> = [];
127
+ depth = -1;
128
+ /** A node read before it is known what it is (a TriG subject or graph name). */
129
+ pending: Term.NamedNode | Term.BlankNode = rdf.nil;
130
+
131
+ /** The state at the start of the current statement, to roll back to. */
132
+ open = false;
133
+ snapPos = 0;
134
+ snapOut = 0;
135
+ snapCounter = 0;
136
+ snapGraph: Term.Graph;
137
+ snapInGraph = false;
138
+ snapBase: Option.Option<string> = Option.none();
139
+ /** The prefix the statement bound, with its previous binding. */
140
+ snapPrefix: Option.Option<PrefixBinding> = Option.none();
141
+ /** Registers for the terms being read (none of them nests). */
142
+ iriStart = 0;
143
+ iriEnd = 0;
144
+ nameStart = 0;
145
+ prefix = '';
146
+ stringStart = 0;
147
+ stringEnd = 0;
148
+ tagStart = 0;
149
+ literalStart = 0;
150
+ literalValue = '';
151
+
152
+ /** Where the last complete statement ended. */
153
+ lastEnd = 0;
154
+ /** The state at the start of the run, for a re-run. */
155
+ private runOut = 0;
156
+ private runCounter = 0;
157
+ private runGraph: Term.Graph;
158
+ private runInGraph = false;
159
+ private runBase: Option.Option<string> = Option.none();
160
+ /** The prefixes set during the run, with their previous values. */
161
+ private readonly runPrefixes: Array<PrefixBinding> = [];
162
+
163
+ constructor(options: ParserOptions) {
164
+ this.options = options;
165
+ this.base = options.baseIri;
166
+ this.graph = options.graph;
167
+ this.snapGraph = options.graph;
168
+ this.runGraph = options.graph;
169
+ }
170
+
171
+ /** Records the state at the start of a run. */
172
+ beginRun(): void {
173
+ this.open = false;
174
+ this.lastEnd = 0;
175
+ this.runOut = this.out.length;
176
+ this.runCounter = this.counter;
177
+ this.runGraph = this.graph;
178
+ this.runInGraph = this.inGraph;
179
+ this.runBase = this.base;
180
+ this.runPrefixes.length = 0;
181
+ }
182
+
183
+ /** Returns to the state at the start of the run (for the re-run of a failed one). */
184
+ restartRun(): void {
185
+ this.open = false;
186
+ this.lastEnd = 0;
187
+ this.depth = -1;
188
+ this.out.length = this.runOut;
189
+ this.counter = this.runCounter;
190
+ this.graph = this.runGraph;
191
+ this.inGraph = this.runInGraph;
192
+ this.base = this.runBase;
193
+ Arr.forEach(Arr.reverse(this.runPrefixes), (binding) => this.restorePrefix(binding));
194
+ this.runPrefixes.length = 0;
195
+ }
196
+
197
+ private restorePrefix([prefix, previous]: PrefixBinding): void {
198
+ if (Option.isSome(previous)) MutableHashMap.set(this.prefixes, prefix, previous.value);
199
+ else MutableHashMap.remove(this.prefixes, prefix);
200
+ }
201
+
202
+ frame(): Frame {
203
+ // The grammar pushes a frame before it reads one, so the fallback is never used
204
+ return this.frames[this.depth] ?? new Frame();
205
+ }
206
+
207
+ push(subject: Term.Subject): void {
208
+ const frame = (this.frames[++this.depth] ??= new Frame());
209
+ frame.subject = subject;
210
+ frame.reifier = noReifier;
211
+ frame.triple = noTriple;
212
+ }
213
+
214
+ emit(s: Term.Subject, p: Term.Predicate, o: Term.Object): void {
215
+ this.out.push(new Term.Quad(s, p, o, this.graph));
216
+ }
217
+
218
+ fresh(): Term.BlankNode {
219
+ return new Term.BlankNode(`${this.options.blankNodePrefix}_${(this.counter++).toString(36)}`);
220
+ }
221
+
222
+ snapshot(pos: number): void {
223
+ this.open = true;
224
+ this.depth = -1;
225
+ this.snapPos = pos;
226
+ this.snapOut = this.out.length;
227
+ this.snapCounter = this.counter;
228
+ this.snapGraph = this.graph;
229
+ this.snapInGraph = this.inGraph;
230
+ this.snapBase = this.base;
231
+ this.snapPrefix = Option.none();
232
+ }
233
+
234
+ /** Undoes the statement in progress. */
235
+ rollback(): void {
236
+ if (!this.open) return;
237
+ this.out.length = this.snapOut;
238
+ this.counter = this.snapCounter;
239
+ this.graph = this.snapGraph;
240
+ this.inGraph = this.snapInGraph;
241
+ this.base = this.snapBase;
242
+ if (Option.isSome(this.snapPrefix)) {
243
+ this.restorePrefix(this.snapPrefix.value);
244
+ this.snapPrefix = Option.none();
245
+ }
246
+ this.depth = -1;
247
+ }
248
+
249
+ setPrefix(prefix: string, iri: string): void {
250
+ const binding: PrefixBinding = [prefix, MutableHashMap.get(this.prefixes, prefix)];
251
+ if (Option.isNone(this.snapPrefix)) this.snapPrefix = Option.some(binding);
252
+ this.runPrefixes.push(binding);
253
+ MutableHashMap.set(this.prefixes, prefix, iri);
254
+ }
255
+
256
+ openGraph(graph: Term.Graph): void {
257
+ this.inGraph = true;
258
+ this.graph = graph;
259
+ }
260
+ }
261
+
262
+ /** The builder of the parser running the grammar. */
263
+ let b: Builder = new Builder({
264
+ trig: false,
265
+ baseIri: Option.none(),
266
+ blankNodePrefix: '',
267
+ graph: Term.defaultGraph,
268
+ });
269
+
270
+ // -----------------------------------------------------------------------------
271
+ // Helpers
272
+ // -----------------------------------------------------------------------------
273
+
274
+ const lit = Token.literal;
275
+ const skip = Grammar.skip;
276
+
277
+ /** Runs `f` at the current offset, consuming nothing (never skipped by the compiler). */
278
+ const act = (f: (pos: number) => void): P<number> => Parser.tap(Parser.location, f);
279
+
280
+ /** Throws `message` at the current offset. */
281
+ const failHere = <A = never>(message: string): P<A> =>
282
+ Parser.make<A>((state) => {
283
+ throw new Stop(message, state.pos);
284
+ });
285
+
286
+ /** Throws the error `diagnose` finds at the current offset. */
287
+ const failWith = <A = never>(diagnose: (input: string, pos: number) => Stop): P<A> =>
288
+ Parser.make<A>((state) => {
289
+ throw diagnose(state.input, state.pos);
290
+ });
291
+
292
+ const at = (s: string): P<unknown> => Parser.peek(lit(s));
293
+
294
+ const nameChar = Token.oneOf([Grammar.pnChars, ':']);
295
+ const notName = Parser.not(nameChar);
296
+
297
+ /** A case-insensitive keyword followed by a character that cannot continue a name. */
298
+ const keyword = (word: string): P<unknown> => Parser.terminated(Ascii.caseless(word), notName);
299
+
300
+ /** An `@` keyword, not followed by a letter, digit or `-`. */
301
+ const atKeyword = (word: string): P<unknown> =>
302
+ Parser.terminated(lit(word), Parser.not(Token.oneOf([Grammar.alphanumeric, '-'])));
303
+
304
+ /** `.` or the error "Expected `what`". */
305
+ const expectDot = (what: string): P<unknown> => Parser.alt(lit('.'), failHere(`Expected ${what}`));
306
+
307
+ const nameStart: P<unknown> = Parser.peek(Parser.alt(lit(':'), Token.oneOf(Grammar.pnCharsBase)));
308
+
309
+ // -----------------------------------------------------------------------------
310
+ // Diagnostics: the errors of IRIs and strings, found by scanning them again
311
+ // -----------------------------------------------------------------------------
312
+
313
+ const isDecodeError = Predicate.isTagged('Error');
314
+
315
+ /**
316
+ * Scans from `start` with `step`, which returns the next offset, or the
317
+ * error found (`Some`) or the end of the term (`None`) to stop.
318
+ */
319
+ const scan = (
320
+ start: number,
321
+ step: (i: number) => number | Option.Option<Stop>,
322
+ ): Option.Option<Stop> => {
323
+ let i = start;
324
+ let error = Option.none<Stop>();
325
+ loop(() => {
326
+ const next = step(i);
327
+ if (Predicate.isNumber(next)) {
328
+ i = next;
329
+ return true;
330
+ }
331
+ error = next;
332
+ return false;
333
+ });
334
+ return error;
335
+ };
336
+
337
+ const fail = (message: string, pos: number): Option.Option<Stop> =>
338
+ Option.some(new Stop(message, pos));
339
+
340
+ /** The error in the IRI at `start`, or `None`; `end` bounds an IRI that matched. */
341
+ const iriError = (input: string, start: number, end = input.length): Option.Option<Stop> =>
342
+ scan(start + 1, (i) => {
343
+ if (i >= end) return end === input.length ? fail('Unterminated IRI', start) : Option.none();
344
+ const c = input.charCodeAt(i);
345
+ if (c === C_GT) return Option.none();
346
+ if (c === C_BACKSLASH) {
347
+ const decoded = Lexical.decodeUchar(input, i);
348
+ if (isDecodeError(decoded)) return fail(decoded.message, i);
349
+ if (!Lexical.isIriChar(decoded.value.codePointAt(0) ?? 0)) {
350
+ return fail('Escaped character is not allowed in an IRI', i);
351
+ }
352
+ return i + decoded.length;
353
+ }
354
+ if (!Lexical.isIriChar(c)) return fail('Invalid character in IRI', i);
355
+ return i + 1;
356
+ });
357
+
358
+ /** The error in the string at `start`, or `None`; `end` bounds a string that matched. */
359
+ const stringError = (input: string, start: number, end = input.length): Option.Option<Stop> => {
360
+ const q = input.charCodeAt(start);
361
+ const long = input.charCodeAt(start + 1) === q && input.charCodeAt(start + 2) === q;
362
+ if (!long && input.charCodeAt(start + 1) === q) return Option.none();
363
+ return scan(start + (long ? 3 : 1), (i) => {
364
+ if (i >= end) {
365
+ return end === input.length ? fail('Unterminated string literal', start) : Option.none();
366
+ }
367
+ const c = input.charCodeAt(i);
368
+ if (c === q) {
369
+ if (!long) return Option.none();
370
+ if (input.charCodeAt(i + 1) === q && input.charCodeAt(i + 2) === q) return Option.none();
371
+ return i + 1;
372
+ }
373
+ if (c === C_BACKSLASH) {
374
+ if (Lexical.decodeEchar(input.charCodeAt(i + 1)) !== undefined) return i + 2;
375
+ const decoded = Lexical.decodeUchar(input, i);
376
+ if (isDecodeError(decoded)) return fail(decoded.message, i);
377
+ return i + decoded.length;
378
+ }
379
+ if (!long && (c === 0x0a || c === 0x0d)) return fail('Line break in string literal', i);
380
+ return i + 1;
381
+ });
382
+ };
383
+
384
+ const diagnosis =
385
+ (find: (input: string, start: number) => Option.Option<Stop>, message: string) =>
386
+ (input: string, pos: number): Stop =>
387
+ Option.getOrElse(find(input, pos), () => new Stop(message, pos));
388
+
389
+ // -----------------------------------------------------------------------------
390
+ // Terms
391
+ // -----------------------------------------------------------------------------
392
+
393
+ /** `IRIREF` (at a `<`), resolved against the base. */
394
+ const iri: P<Term.NamedNode> = Parser.preceded(
395
+ act((pos) => {
396
+ b.iriStart = pos;
397
+ }),
398
+ Parser.terminated(
399
+ Parser.alt(Parser.backtrack(Grammar.iriRef), failWith(diagnosis(iriError, 'Invalid IRI'))),
400
+ act((pos) => {
401
+ b.iriEnd = pos;
402
+ }),
403
+ ),
404
+ ).pipe(
405
+ Parser.map((value) => {
406
+ const start = b.iriStart;
407
+ // Escapes (which shorten the value) may decode to characters an IRI cannot contain
408
+ if (b.iriEnd - start - 2 !== value.length) {
409
+ const error = iriError(b.input, start, b.iriEnd);
410
+ if (Option.isSome(error)) throw error.value;
411
+ }
412
+ if (Option.isNone(b.base)) {
413
+ if (!Lexical.isAbsoluteIri(value)) {
414
+ throw new Stop(`Relative IRI <${value}> cannot be resolved without a base IRI`, start);
415
+ }
416
+ return new Term.NamedNode(value);
417
+ }
418
+ return new Term.NamedNode(Iri.resolve(value, b.base.value));
419
+ }),
420
+ );
421
+
422
+ /** Fails when a prefix name is followed by a dot (which `PN_PREFIX` cannot end with). */
423
+ const noTrailingDot: P<void> = Parser.make<void>((state) => {
424
+ if (state.input.charCodeAt(state.pos) === C_DOT) {
425
+ throw new Stop('A prefix name must not end with "."', state.pos - b.prefix.length);
426
+ }
427
+ return undefined;
428
+ });
429
+
430
+ /** `PN_PREFIX` (possibly empty), before the colon. */
431
+ const prefixLabel: P<string> = Parser.alt(
432
+ Parser.terminated(
433
+ Parser.tap(Grammar.pnPrefix, (prefix) => {
434
+ b.prefix = prefix;
435
+ }),
436
+ noTrailingDot,
437
+ ),
438
+ Parser.preceded(at(':'), Parser.succeed('')),
439
+ failHere('Invalid prefix name'),
440
+ );
441
+
442
+ /** Fails on the escapes that end a local name early: `%` or `\` (after any dots). */
443
+ const localTail: P<void> = Parser.make<void>((state) => {
444
+ const input = state.input;
445
+ const i = skipDots(input, state.pos);
446
+ const c = input.charCodeAt(i);
447
+ if (c === C_PERCENT) throw new Stop('Invalid percent escape', i);
448
+ if (c === C_BACKSLASH) throw new Stop('Invalid escape in local name', i);
449
+ return undefined;
450
+ });
451
+
452
+ const prefixedName: P<Term.NamedNode> = Parser.preceded(
453
+ Parser.seq(
454
+ act((pos) => {
455
+ b.nameStart = pos;
456
+ }),
457
+ Parser.tap(prefixLabel, (prefix) => {
458
+ b.prefix = prefix;
459
+ }),
460
+ ),
461
+ Parser.alt(
462
+ Parser.preceded(
463
+ lit(':'),
464
+ Parser.terminated(Parser.alt(Grammar.pnLocal, Parser.succeed('')), localTail),
465
+ ).pipe(
466
+ Parser.map((local) => {
467
+ const ns = MutableHashMap.get(b.prefixes, b.prefix);
468
+ if (Option.isNone(ns)) throw new Stop(`Undefined prefix "${b.prefix}:"`, b.nameStart);
469
+ return new Term.NamedNode(ns.value + local);
470
+ }),
471
+ ),
472
+ Parser.make<Term.NamedNode>(() => {
473
+ throw new Stop('Expected a prefixed name', b.nameStart);
474
+ }),
475
+ ),
476
+ );
477
+
478
+ const blankNode: P<Term.BlankNode> = Parser.alt(
479
+ Grammar.blankNodeLabel,
480
+ Parser.preceded(lit('_:'), failHere<string>('Invalid blank node label')),
481
+ ).pipe(
482
+ Parser.map((label) => {
483
+ const found = MutableHashMap.get(b.labels, label);
484
+ if (Option.isSome(found)) return found.value;
485
+ const node = new Term.BlankNode(
486
+ b.options.blankNodePrefix + (label.startsWith('_') ? `_${label}` : label),
487
+ );
488
+ MutableHashMap.set(b.labels, label, node);
489
+ return node;
490
+ }),
491
+ );
492
+
493
+ /** An IRI or a blank node label (no anonymous nodes). */
494
+ const resource: P<Term.NamedNode | Term.BlankNode> = Parser.alt(
495
+ Parser.preceded(at('<<'), failHere('Unexpected triple')),
496
+ Parser.preceded(at('<'), iri),
497
+ Parser.preceded(at('_:'), blankNode),
498
+ prefixedName,
499
+ );
500
+
501
+ /** Any of the four string forms (at a quote), returning the value. */
502
+ const string: P<string> = Parser.preceded(
503
+ act((pos) => {
504
+ b.stringStart = pos;
505
+ }),
506
+ Parser.terminated(
507
+ Parser.alt(
508
+ Parser.backtrack(Grammar.stringLiteral),
509
+ failWith(diagnosis(stringError, 'Invalid string literal')),
510
+ ),
511
+ act((pos) => {
512
+ b.stringEnd = pos;
513
+ }),
514
+ ),
515
+ ).pipe(
516
+ Parser.map((value) => {
517
+ // Numeric escapes (which shorten the value) may encode surrogates, which the terminal accepts
518
+ const input = b.input;
519
+ const start = b.stringStart;
520
+ const q = input.charCodeAt(start);
521
+ const quotes = input.charCodeAt(start + 1) === q && input.charCodeAt(start + 2) === q ? 6 : 2;
522
+ if (b.stringEnd - start - quotes !== value.length) {
523
+ const error = stringError(input, start, b.stringEnd);
524
+ if (Option.isSome(error)) throw error.value;
525
+ }
526
+ return value;
527
+ }),
528
+ );
529
+
530
+ const datatype: P<Term.NamedNode> = Parser.alt(
531
+ Parser.preceded(Parser.seq(Parser.not(lit('<<')), at('<')), iri),
532
+ Parser.preceded(nameStart, prefixedName),
533
+ failHere('Expected a datatype IRI'),
534
+ );
535
+
536
+ const languageTag: P<Lexical.LanguageTag> = Parser.preceded(
537
+ lit('@'),
538
+ Parser.preceded(
539
+ act((pos) => {
540
+ b.tagStart = pos;
541
+ }),
542
+ Token.takeWhile([Grammar.alphanumeric, '-']),
543
+ ),
544
+ ).pipe(
545
+ Parser.map((text) => {
546
+ const tag = Lexical.parseLanguageTag(text);
547
+ if (tag === undefined) throw new Stop('Invalid language tag', b.tagStart);
548
+ return tag;
549
+ }),
550
+ );
551
+
552
+ /** The literal read, with a language tag or datatype. */
553
+ const annotatedLiteral = (annotation: Lexical.LanguageTag | Term.NamedNode): Term.Literal => {
554
+ const result = Lexical.makeLiteral(b.literalValue, annotation);
555
+ if (Predicate.isString(result)) throw new Stop(result, b.literalStart);
556
+ return result;
557
+ };
558
+
559
+ const rdfLiteral: P<Term.Literal> = Parser.preceded(
560
+ Parser.seq(
561
+ act((pos) => {
562
+ b.literalStart = pos;
563
+ }),
564
+ Parser.tap(string, (value) => {
565
+ b.literalValue = value;
566
+ }),
567
+ skip,
568
+ ),
569
+ Parser.alt(
570
+ languageTag.pipe(Parser.map(annotatedLiteral)),
571
+ Parser.preceded(
572
+ Parser.alt(lit('^^'), Parser.preceded(at('^'), failHere("Expected '^^'"))),
573
+ Parser.preceded(skip, datatype),
574
+ ).pipe(Parser.map(annotatedLiteral)),
575
+ Parser.make<Term.Literal>(() => Term.literal(b.literalValue)),
576
+ ),
577
+ );
578
+
579
+ const numericLiteral: P<Term.Literal> = Parser.alt(
580
+ Grammar.double.pipe(Parser.map((value) => new Term.Literal(value, xsd.double))),
581
+ Grammar.decimal.pipe(Parser.map((value) => new Term.Literal(value, xsd.decimal))),
582
+ Grammar.integer.pipe(Parser.map((value) => new Term.Literal(value, xsd.integer))),
583
+ failHere('Invalid number'),
584
+ );
585
+
586
+ const trueLiteral = new Term.Literal('true', xsd.boolean);
587
+ const falseLiteral = new Term.Literal('false', xsd.boolean);
588
+
589
+ const booleanLiteral: P<Term.Literal> = Parser.alt(
590
+ Parser.terminated(lit('true'), notName).pipe(Parser.as(trueLiteral)),
591
+ Parser.terminated(lit('false'), notName).pipe(Parser.as(falseLiteral)),
592
+ );
593
+
594
+ /** Numbers, booleans and prefixed names. */
595
+ const simpleObject: P<Term.Object> = Parser.alt(
596
+ Parser.preceded(Parser.peek(Token.oneOf('0123456789+-.')), numericLiteral),
597
+ booleanLiteral,
598
+ Parser.preceded(nameStart, prefixedName),
599
+ failHere('Expected an object'),
600
+ );
601
+
602
+ const anon: P<Term.BlankNode> = Parser.seq(lit('['), Token.takeWhile(' \t\r\n'), lit(']')).pipe(
603
+ Parser.map(() => b.fresh()),
604
+ );
605
+
606
+ /** `iri | BlankNode`, including `[]`. */
607
+ const iriOrBlankNode = (what: string): P<Term.NamedNode | Term.BlankNode> =>
608
+ Parser.alt(
609
+ Parser.preceded(
610
+ at('['),
611
+ Parser.alt(anon, failHere(`Blank node property lists are not allowed in ${what}`)),
612
+ ),
613
+ Parser.preceded(at('<<'), failHere(`Unexpected triple in ${what}`)),
614
+ Parser.preceded(at('('), failHere(`Collections are not allowed in ${what}`)),
615
+ Parser.preceded(Parser.peek(Token.oneOf('<_:')), resource),
616
+ Parser.preceded(
617
+ Parser.seq(Parser.peek(Token.oneOf(Grammar.pnCharsBase)), Parser.not(booleanLiteral)),
618
+ resource,
619
+ ),
620
+ failHere(`Expected an IRI or blank node in ${what}`),
621
+ );
622
+
623
+ const verb: P<Term.NamedNode> = Parser.alt(
624
+ Parser.preceded(at('<<'), failHere('Triples are not allowed as predicates')),
625
+ Parser.preceded(at('<'), iri),
626
+ Parser.terminated(lit('a'), notName).pipe(Parser.as(rdf.type)),
627
+ Parser.preceded(nameStart, prefixedName),
628
+ failHere('Expected a predicate'),
629
+ );
630
+
631
+ const tripleTerm: P<Term.Triple> = Parser.suspend(() => tripleTermDef);
632
+ const reifiedTriple: P<Term.NamedNode | Term.BlankNode> = Parser.suspend(() => reifiedTripleDef);
633
+ const object: P<Term.Object> = Parser.suspend(() => objectDef);
634
+ const predicateObjectList: P<unknown> = Parser.suspend(() => predicateObjectListDef);
635
+
636
+ /** The object of a reified triple or triple term. */
637
+ const innerObject = (reified: boolean): P<Term.Object> => {
638
+ const what = reified ? 'reified triples' : 'triple terms';
639
+ return Parser.alt(
640
+ Parser.preceded(at('<<('), tripleTerm),
641
+ Parser.preceded(
642
+ at('<<'),
643
+ reified ? reifiedTriple : failHere('Reified triples are not allowed in triple terms'),
644
+ ),
645
+ Parser.preceded(Parser.peek(Token.oneOf('<_')), resource),
646
+ Parser.preceded(
647
+ at('['),
648
+ Parser.alt(anon, failHere(`Blank node property lists are not allowed in ${what}`)),
649
+ ),
650
+ Parser.preceded(at('('), failHere(`Collections are not allowed in ${what}`)),
651
+ Parser.preceded(Parser.peek(Token.oneOf('"\'')), rdfLiteral),
652
+ simpleObject,
653
+ );
654
+ };
655
+
656
+ const tripleTermDef: P<Term.Triple> = Parser.seq(
657
+ Parser.preceded(Parser.seq(lit('<<('), skip), iriOrBlankNode('the subject of a triple term')),
658
+ Parser.preceded(skip, verb),
659
+ Parser.preceded(skip, innerObject(false)),
660
+ Parser.preceded(skip, Parser.alt(lit(')>>'), failHere("Expected ')>>'"))),
661
+ ).pipe(Parser.map(([s, p, o]) => new Term.Triple(s, p, o)));
662
+
663
+ const startsReifierId: P<unknown> = Parser.peek(
664
+ Parser.alt(
665
+ Parser.preceded(Parser.not(lit('<<')), lit('<')),
666
+ lit('_:'),
667
+ anon,
668
+ lit(':'),
669
+ Token.oneOf(Grammar.pnCharsBase),
670
+ ),
671
+ );
672
+
673
+ /** A reifier IRI or blank node, including `[]`. */
674
+ const reifierId: P<Term.NamedNode | Term.BlankNode> = Parser.preceded(
675
+ startsReifierId,
676
+ Parser.alt(Parser.preceded(at('['), anon), resource),
677
+ );
678
+
679
+ const reifiedTripleDef: P<Term.NamedNode | Term.BlankNode> = Parser.seq(
680
+ Parser.preceded(
681
+ Parser.seq(lit('<<'), skip),
682
+ Parser.alt(
683
+ Parser.preceded(Parser.seq(at('<<'), Parser.not(lit('<<('))), reifiedTriple),
684
+ iriOrBlankNode('the subject of a reified triple'),
685
+ ),
686
+ ),
687
+ Parser.preceded(skip, verb),
688
+ Parser.preceded(skip, innerObject(true)),
689
+ Parser.preceded(
690
+ skip,
691
+ Parser.opt(
692
+ Parser.preceded(Parser.seq(lit('~'), skip), Parser.terminated(Parser.opt(reifierId), skip)),
693
+ ),
694
+ ),
695
+ Parser.alt(lit('>>'), failHere("Expected '>>'")),
696
+ ).pipe(
697
+ Parser.map(([s, p, o, r]) => {
698
+ const reifier = Option.getOrElse(Option.flatten(r), () => b.fresh());
699
+ b.emit(reifier, rdf.reifies, new Term.Triple(s, p, o));
700
+ return reifier;
701
+ }),
702
+ );
703
+
704
+ const blankNodePropertyList: P<Term.BlankNode> = Parser.seq(
705
+ Parser.tap(lit('[').pipe(Parser.map(() => b.fresh())), (node) => b.push(node)),
706
+ Parser.preceded(skip, predicateObjectList),
707
+ Parser.preceded(skip, Parser.alt(lit(']'), failHere("Expected ']'"))),
708
+ ).pipe(
709
+ Parser.tap(() => {
710
+ b.depth--;
711
+ }),
712
+ Parser.map(([node]) => node),
713
+ );
714
+
715
+ const collection: P<Term.NamedNode | Term.BlankNode> = Parser.preceded(
716
+ Parser.seq(lit('('), skip),
717
+ Parser.terminated(
718
+ Parser.repeat(
719
+ Parser.preceded(
720
+ Parser.seq(Parser.not(lit(')')), Parser.not(Parser.eof)),
721
+ Parser.terminated(object, skip),
722
+ ),
723
+ ),
724
+ Parser.alt(lit(')'), failHere("Expected ')'")),
725
+ ),
726
+ ).pipe(
727
+ Parser.map((items) => {
728
+ if (Arr.isReadonlyArrayEmpty(items)) return rdf.nil;
729
+ // Each cell is labelled before the next: `( a b )` is `_:c0 first a ; rest _:c1`, …
730
+ const head = b.fresh();
731
+ Arr.reduce<Term.Object, Term.NamedNode | Term.BlankNode>(items, head, (cell, item, i) => {
732
+ b.emit(cell, rdf.first, item);
733
+ const next = i + 1 < items.length ? b.fresh() : rdf.nil;
734
+ b.emit(cell, rdf.rest, next);
735
+ return next;
736
+ });
737
+ return head;
738
+ }),
739
+ );
740
+
741
+ /**
742
+ * A parser as a rule of its own: the compiler inlines everything between
743
+ * rules, and leaves inlined into the recursive productions would make their
744
+ * stack frames (and so the nesting the parser supports) much larger.
745
+ */
746
+ const rule = <A>(p: P<A>): P<A> => Parser.suspend(() => p);
747
+
748
+ const objectDef: P<Term.Object> = Parser.alt(
749
+ Parser.preceded(at('<<('), tripleTerm),
750
+ Parser.preceded(at('<<'), reifiedTriple),
751
+ Parser.preceded(at('<'), rule(iri)),
752
+ Parser.preceded(at('_:'), rule(blankNode)),
753
+ Parser.preceded(at('_'), rule(prefixedName)),
754
+ Parser.preceded(at('['), Parser.alt(rule(anon), rule(blankNodePropertyList))),
755
+ Parser.preceded(at('('), rule(collection)),
756
+ Parser.preceded(Parser.peek(Token.oneOf('"\'')), rule(rdfLiteral)),
757
+ rule(simpleObject),
758
+ );
759
+
760
+ // -----------------------------------------------------------------------------
761
+ // Predicate-object lists
762
+ // -----------------------------------------------------------------------------
763
+
764
+ const freshNode: P<Term.BlankNode> = Parser.make<Term.BlankNode>(() => b.fresh());
765
+
766
+ const emitObject: P<Term.Object> = Parser.tap(object, (o) => {
767
+ const frame = b.frame();
768
+ b.emit(frame.subject, frame.predicate, o);
769
+ frame.object = o;
770
+ frame.reifier = noReifier;
771
+ frame.triple = noTriple;
772
+ });
773
+
774
+ /** The triple of the frame's current object, built once. */
775
+ const frameTriple = (frame: Frame): Term.Triple => {
776
+ if (Option.isSome(frame.triple)) return frame.triple.value;
777
+ const triple = new Term.Triple(frame.subject, frame.predicate, frame.object);
778
+ frame.triple = Option.some(triple);
779
+ return triple;
780
+ };
781
+
782
+ const reifies = (frame: Frame, reifier: Term.NamedNode | Term.BlankNode): void => {
783
+ b.emit(reifier, rdf.reifies, frameTriple(frame));
784
+ };
785
+
786
+ // `~ r` names a reifier of the triple; `{| … |}` describes it (a fresh one if none was named).
787
+ const annotation: P<unknown> = Parser.repeat(
788
+ Parser.preceded(
789
+ skip,
790
+ Parser.alt(
791
+ Parser.tap(
792
+ Parser.preceded(Parser.seq(lit('~'), skip), Parser.alt(reifierId, freshNode)),
793
+ (reifier) => {
794
+ const frame = b.frame();
795
+ reifies(frame, reifier);
796
+ frame.reifier = Option.some(reifier);
797
+ },
798
+ ),
799
+ Parser.seq(
800
+ Parser.tap(lit('{|'), () => {
801
+ const frame = b.frame();
802
+ if (Option.isSome(frame.reifier)) {
803
+ b.push(frame.reifier.value);
804
+ return;
805
+ }
806
+ const reifier = b.fresh();
807
+ frame.reifier = Option.some(reifier);
808
+ reifies(frame, reifier);
809
+ b.push(reifier);
810
+ }),
811
+ Parser.preceded(skip, predicateObjectList),
812
+ Parser.preceded(skip, Parser.alt(lit('|}'), failHere("Expected '|}'"))),
813
+ ).pipe(
814
+ Parser.tap(() => {
815
+ b.depth--;
816
+ b.frame().reifier = noReifier;
817
+ }),
818
+ ),
819
+ ),
820
+ ),
821
+ );
822
+
823
+ const objectList: P<unknown> = Parser.seq(
824
+ emitObject,
825
+ rule(annotation),
826
+ skip,
827
+ Parser.repeat(
828
+ Parser.preceded(Parser.seq(lit(','), skip), Parser.seq(emitObject, annotation, skip)),
829
+ ),
830
+ );
831
+
832
+ const setPredicate: P<Term.NamedNode> = Parser.tap(rule(verb), (p) => {
833
+ b.frame().predicate = p;
834
+ });
835
+
836
+ const startsVerb: P<unknown> = Parser.peek(
837
+ Parser.alt(
838
+ Parser.preceded(Parser.not(lit('<<')), lit('<')),
839
+ lit(':'),
840
+ Token.oneOf(Grammar.pnCharsBase),
841
+ ),
842
+ );
843
+
844
+ const predicateObjectListDef: P<unknown> = Parser.seq(
845
+ setPredicate,
846
+ skip,
847
+ objectList,
848
+ Parser.repeat(
849
+ Parser.preceded(
850
+ Parser.repeat(Parser.seq(lit(';'), skip), { min: 1 }),
851
+ Parser.opt(Parser.preceded(startsVerb, Parser.seq(setPredicate, skip, objectList))),
852
+ ),
853
+ ),
854
+ );
855
+
856
+ /** `subject` (pushed while `rest` describes it). */
857
+ const describing = (subject: P<Term.Subject>, rest: P<unknown>): P<unknown> =>
858
+ Parser.terminated(
859
+ Parser.preceded(
860
+ Parser.tap(subject, (s) => b.push(s)),
861
+ rest,
862
+ ),
863
+ act(() => {
864
+ b.depth--;
865
+ }),
866
+ );
867
+
868
+ const notEnd: P<unknown> = Parser.not(Token.oneOf('.}'));
869
+
870
+ const properties: P<unknown> = Parser.preceded(skip, predicateObjectList);
871
+ const optionalProperties: P<unknown> = Parser.preceded(
872
+ skip,
873
+ Parser.opt(Parser.preceded(notEnd, predicateObjectList)),
874
+ );
875
+
876
+ /** The `triples` production. */
877
+ const triples: P<unknown> = Parser.alt(
878
+ Parser.preceded(
879
+ at('['),
880
+ Parser.alt(describing(anon, properties), describing(blankNodePropertyList, optionalProperties)),
881
+ ),
882
+ Parser.preceded(at('('), describing(collection, properties)),
883
+ Parser.preceded(at('<<('), failHere('Triple terms are not allowed as subjects')),
884
+ Parser.preceded(at('<<'), describing(reifiedTriple, optionalProperties)),
885
+ describing(resource, properties),
886
+ );
887
+
888
+ // -----------------------------------------------------------------------------
889
+ // Statements
890
+ // -----------------------------------------------------------------------------
891
+
892
+ const prefixDirective = (turtle: boolean): P<unknown> =>
893
+ Parser.seq(
894
+ Parser.tap(
895
+ Parser.preceded(skip, Parser.seq(Parser.location, prefixLabel, Parser.opt(lit(':')))),
896
+ ([start, , colon]) => {
897
+ if (Option.isNone(colon)) throw new Stop('Expected a prefix name ending with ":"', start);
898
+ },
899
+ ),
900
+ Parser.preceded(skip, Parser.alt(Parser.preceded(at('<'), iri), failHere('Expected an IRI'))),
901
+ turtle ? Parser.preceded(skip, expectDot("'.' after @prefix")) : Parser.succeed(undefined),
902
+ ).pipe(
903
+ Parser.tap(([[, prefix], ref]) => {
904
+ b.setPrefix(prefix, ref.value);
905
+ }),
906
+ );
907
+
908
+ const baseDirective = (turtle: boolean): P<unknown> =>
909
+ Parser.seq(
910
+ Parser.preceded(skip, Parser.alt(Parser.preceded(at('<'), iri), failHere('Expected an IRI'))),
911
+ turtle ? Parser.preceded(skip, expectDot("'.' after @base")) : Parser.succeed(undefined),
912
+ ).pipe(
913
+ Parser.tap(([ref]) => {
914
+ b.base = Option.some(ref.value);
915
+ }),
916
+ );
917
+
918
+ const versionDirective = (turtle: boolean): P<unknown> =>
919
+ Parser.seq(
920
+ Parser.preceded(
921
+ skip,
922
+ Parser.alt(
923
+ Parser.preceded(
924
+ Parser.peek(Parser.alt(lit('"""'), lit("'''"))),
925
+ failHere('Long strings are not allowed as version specifiers'),
926
+ ),
927
+ Parser.preceded(Parser.peek(Token.oneOf('"\'')), string),
928
+ failHere('Expected a version string'),
929
+ ),
930
+ ),
931
+ turtle ? Parser.preceded(skip, expectDot("'.' after @version")) : Parser.succeed(undefined),
932
+ );
933
+
934
+ const directive: P<unknown> = Parser.alt(
935
+ Parser.preceded(
936
+ at('@'),
937
+ Parser.alt(
938
+ Parser.preceded(atKeyword('@prefix'), prefixDirective(true)),
939
+ Parser.preceded(atKeyword('@base'), baseDirective(true)),
940
+ Parser.preceded(atKeyword('@version'), versionDirective(true)),
941
+ failHere('Unknown directive'),
942
+ ),
943
+ ),
944
+ Parser.preceded(keyword('prefix'), prefixDirective(false)),
945
+ Parser.preceded(keyword('base'), baseDirective(false)),
946
+ Parser.preceded(keyword('version'), versionDirective(false)),
947
+ );
948
+
949
+ const endOfStatement: P<unknown> = Parser.preceded(
950
+ skip,
951
+ expectDot("'.' at the end of the statement"),
952
+ );
953
+
954
+ const turtleStatement: P<unknown> = Parser.alt(directive, Parser.seq(triples, endOfStatement));
955
+
956
+ const pending = (p: P<Term.NamedNode | Term.BlankNode>): P<unknown> =>
957
+ Parser.tap(p, (node) => {
958
+ b.pending = node;
959
+ });
960
+
961
+ /** A graph block opened with `{` after `pending`, or properties of `pending`. */
962
+ const graphOrProperties: P<unknown> = Parser.preceded(
963
+ skip,
964
+ Parser.alt(
965
+ Parser.tap(lit('{'), () => b.openGraph(b.pending)),
966
+ Parser.seq(
967
+ describing(
968
+ Parser.make<Term.Subject>(() => b.pending),
969
+ predicateObjectList,
970
+ ),
971
+ endOfStatement,
972
+ ),
973
+ ),
974
+ );
975
+
976
+ const graphLabel: P<Term.NamedNode | Term.BlankNode> = Parser.alt(
977
+ Parser.preceded(at('['), Parser.alt(anon, failHere('Expected a graph name'))),
978
+ resource,
979
+ );
980
+
981
+ /** A TriG block outside graphs. */
982
+ const block: P<unknown> = Parser.alt(
983
+ Parser.tap(lit('{'), () => b.openGraph(Term.defaultGraph)),
984
+ Parser.preceded(
985
+ keyword('graph'),
986
+ Parser.seq(
987
+ pending(Parser.preceded(skip, graphLabel)),
988
+ Parser.preceded(skip, Parser.alt(lit('{'), failHere("Expected '{' after graph name"))),
989
+ ).pipe(Parser.tap(() => b.openGraph(b.pending))),
990
+ ),
991
+ Parser.preceded(
992
+ at('['),
993
+ Parser.alt(
994
+ Parser.preceded(pending(anon), graphOrProperties),
995
+ Parser.seq(
996
+ describing(
997
+ blankNodePropertyList,
998
+ Parser.preceded(
999
+ skip,
1000
+ Parser.opt(Parser.preceded(Parser.not(lit('.')), predicateObjectList)),
1001
+ ),
1002
+ ),
1003
+ endOfStatement,
1004
+ ),
1005
+ ),
1006
+ ),
1007
+ Parser.preceded(at('('), Parser.seq(describing(collection, properties), endOfStatement)),
1008
+ Parser.preceded(at('<<('), failHere('Triple terms are not allowed as subjects')),
1009
+ Parser.preceded(
1010
+ at('<<'),
1011
+ Parser.seq(
1012
+ describing(
1013
+ reifiedTriple,
1014
+ Parser.preceded(
1015
+ skip,
1016
+ Parser.opt(Parser.preceded(Parser.not(lit('.')), predicateObjectList)),
1017
+ ),
1018
+ ),
1019
+ endOfStatement,
1020
+ ),
1021
+ ),
1022
+ Parser.preceded(pending(resource), graphOrProperties),
1023
+ );
1024
+
1025
+ /** Whether a TriG graph block is open (consuming nothing). */
1026
+ const inGraph: P<void> = Parser.make<void>((state) =>
1027
+ b.inGraph ? undefined : state.backtrack('Verify', ['a graph block']),
1028
+ );
1029
+
1030
+ const graphStatement: P<unknown> = Parser.alt(
1031
+ Parser.tap(lit('}'), () => {
1032
+ b.inGraph = false;
1033
+ b.graph = b.options.graph;
1034
+ }),
1035
+ Parser.seq(triples, skip, Parser.alt(lit('.'), at('}'), failHere("Expected '.' or '}'"))),
1036
+ );
1037
+
1038
+ const trigStatement: P<unknown> = Parser.alt(
1039
+ Parser.preceded(inGraph, graphStatement),
1040
+ directive,
1041
+ block,
1042
+ );
1043
+
1044
+ /** Records the state at the start of a statement. */
1045
+ const beginStatement: P<void> = Parser.make<void>((state) => {
1046
+ b.snapshot(state.pos);
1047
+ return undefined;
1048
+ });
1049
+
1050
+ /**
1051
+ * Ends a statement, unless the input may continue so close to its end that
1052
+ * the statement could still turn out differently.
1053
+ */
1054
+ const endStatement: P<void> = Parser.make<void>((state) => {
1055
+ if (!b.final) {
1056
+ const input = state.input;
1057
+ const i = skipDots(input, state.pos);
1058
+ if (i + MARGIN > input.length) return state.backtrack('Verify', ['more input']);
1059
+ }
1060
+ b.open = false;
1061
+ b.lastEnd = state.pos;
1062
+ return undefined;
1063
+ });
1064
+
1065
+ /** Starts a run: the compiled run, or the interpreted re-run after it fails. */
1066
+ const startRun: P<void> = Parser.make<void>((state) => {
1067
+ b.input = state.input;
1068
+ b.restartRun();
1069
+ return undefined;
1070
+ });
1071
+
1072
+ const statements = (statement: P<unknown>): P<number> =>
1073
+ Compiler.jit(
1074
+ Parser.preceded(
1075
+ startRun,
1076
+ Parser.preceded(
1077
+ Parser.repeat(
1078
+ Parser.preceded(
1079
+ skip,
1080
+ Parser.preceded(
1081
+ Parser.not(Parser.eof),
1082
+ Parser.delimited(beginStatement, statement, endStatement),
1083
+ ),
1084
+ ),
1085
+ ),
1086
+ Parser.preceded(skip, Parser.location),
1087
+ ),
1088
+ ),
1089
+ );
1090
+
1091
+ const turtleStatements = statements(turtleStatement);
1092
+ const trigStatements = statements(trigStatement);
1093
+
1094
+ /** One statement, for the partial-mode check (setting the input first). */
1095
+ const single = (statement: P<unknown>): P<unknown> =>
1096
+ Parser.preceded(
1097
+ Parser.make<void>((state) => {
1098
+ b.input = state.input;
1099
+ return undefined;
1100
+ }),
1101
+ statement,
1102
+ );
1103
+
1104
+ const turtleSingle = single(turtleStatement);
1105
+ const trigSingle = single(trigStatement);
1106
+
1107
+ // -----------------------------------------------------------------------------
1108
+ // Driving
1109
+ // -----------------------------------------------------------------------------
1110
+
1111
+ /** @internal */
1112
+ export class TurtleParser {
1113
+ private input = '';
1114
+ private pos = 0;
1115
+ private final = true;
1116
+ /** Lines and columns consumed before the start of `input`. */
1117
+ private lineOffset = 0;
1118
+ private columnOffset = 0;
1119
+ private started = false;
1120
+ private readonly builder: Builder;
1121
+ /** How much text the failing statement at `pos` had when it was last checked (or -1). */
1122
+ private checked = -1;
1123
+
1124
+ readonly options: ParserOptions;
1125
+ constructor(options: ParserOptions) {
1126
+ this.options = options;
1127
+ this.builder = new Builder(options);
1128
+ }
1129
+
1130
+ get prefixes(): MutableHashMap.MutableHashMap<string, string> {
1131
+ return this.builder.prefixes;
1132
+ }
1133
+
1134
+ get base(): Option.Option<string> {
1135
+ return this.builder.base;
1136
+ }
1137
+
1138
+ /** Parses a complete document. */
1139
+ parseDocument(input: string): Array<Term.Quad> {
1140
+ this.input = input;
1141
+ this.pos = 0;
1142
+ this.final = true;
1143
+ this.skipBom();
1144
+ this.run();
1145
+ return this.finish();
1146
+ }
1147
+
1148
+ /** Adds a chunk of input and returns the statements completed so far. */
1149
+ feed(chunk: string): Array<Term.Quad> {
1150
+ this.discardConsumed();
1151
+ this.input += chunk;
1152
+ this.final = false;
1153
+ this.skipBom();
1154
+ this.run();
1155
+ return this.take();
1156
+ }
1157
+
1158
+ /** Signals the end of input and returns the remaining statements. */
1159
+ end(): Array<Term.Quad> {
1160
+ this.final = true;
1161
+ this.run();
1162
+ return this.finish();
1163
+ }
1164
+
1165
+ private finish(): Array<Term.Quad> {
1166
+ if (this.builder.inGraph) this.fail("Unterminated graph block: expected '}'");
1167
+ return this.take();
1168
+ }
1169
+
1170
+ private take(): Array<Term.Quad> {
1171
+ const out = this.builder.out;
1172
+ this.builder.out = [];
1173
+ return out;
1174
+ }
1175
+
1176
+ private skipBom(): void {
1177
+ if (this.started) return;
1178
+ if (Str.isEmpty(this.input)) return;
1179
+ this.started = true;
1180
+ if (this.input.charCodeAt(0) === 0xfeff) this.pos = 1;
1181
+ }
1182
+
1183
+ private discardConsumed(): void {
1184
+ if (this.pos === 0) return;
1185
+ const consumed = this.input.slice(0, this.pos);
1186
+ const lastBreak = Math.max(consumed.lastIndexOf('\n'), consumed.lastIndexOf('\r'));
1187
+ if (lastBreak === -1) {
1188
+ this.columnOffset += consumed.length;
1189
+ } else {
1190
+ this.lineOffset += countLines(consumed);
1191
+ this.columnOffset = consumed.length - lastBreak - 1;
1192
+ }
1193
+ this.input = this.input.slice(this.pos);
1194
+ this.pos = 0;
1195
+ }
1196
+
1197
+ /** Parses the statements of the buffered input. */
1198
+ private run(): void {
1199
+ const base = this.pos;
1200
+ const input = base === 0 ? this.input : this.input.slice(base);
1201
+ const builder = this.builder;
1202
+ b = builder;
1203
+ builder.final = this.final;
1204
+ builder.beginRun();
1205
+ const outcome = Result.try({
1206
+ try: () => {
1207
+ const result = Parser.parsePeek(
1208
+ this.options.trig ? trigStatements : turtleStatements,
1209
+ input,
1210
+ );
1211
+ if (Result.isFailure(result)) this.fail('Invalid syntax', base + result.failure.offset);
1212
+ const [, end] = result.success;
1213
+ if (this.final) {
1214
+ if (end < input.length) this.fail('Invalid syntax', base + end);
1215
+ this.pos = base + end;
1216
+ } else {
1217
+ builder.rollback();
1218
+ this.pos = base + builder.lastEnd;
1219
+ this.checked = -1;
1220
+ }
1221
+ },
1222
+ // A `Stop` is the expected failure; anything else (a `SyntaxFailure`,
1223
+ // a bug) keeps propagating.
1224
+ catch: (e) => {
1225
+ if (e instanceof Stop) return e;
1226
+ throw e;
1227
+ },
1228
+ });
1229
+ if (Result.isFailure(outcome)) {
1230
+ const e = outcome.failure;
1231
+ builder.rollback();
1232
+ if (this.final) this.fail(e.message, base + e.pos);
1233
+ // A statement that fails is usually just cut off: it is retried with more
1234
+ // text, and checked when it still fails once its text has doubled (which
1235
+ // keeps the interpreted checks linear in the input)
1236
+ const start = builder.snapPos;
1237
+ const remaining = input.length - start;
1238
+ if (start !== 0 || this.checked < 0 || remaining < 2 * this.checked) {
1239
+ if (start !== 0 || this.checked < 0) this.checked = remaining;
1240
+ this.pos = base + start;
1241
+ return;
1242
+ }
1243
+ this.checked = remaining;
1244
+ this.check(input, base);
1245
+ }
1246
+ }
1247
+
1248
+ /**
1249
+ * Before the input is complete, re-reads the statement that failed in
1250
+ * partial mode: it fails again if the error is real, and runs out of input
1251
+ * if the statement is only cut off.
1252
+ */
1253
+ private check(input: string, base: number): void {
1254
+ const builder = this.builder;
1255
+ const start = builder.snapPos;
1256
+ builder.open = true;
1257
+ const outcome = Result.try({
1258
+ try: () => {
1259
+ const result = Parser.parsePartial(
1260
+ this.options.trig ? trigSingle : turtleSingle,
1261
+ input.slice(start),
1262
+ );
1263
+ if (Result.isFailure(result))
1264
+ this.fail('Invalid syntax', base + start + result.failure.offset);
1265
+ },
1266
+ // A `Stop` is the expected failure; anything else (a `SyntaxFailure`,
1267
+ // a bug) keeps propagating.
1268
+ catch: (e) => {
1269
+ if (e instanceof Stop) return e;
1270
+ throw e;
1271
+ },
1272
+ });
1273
+ if (Result.isFailure(outcome)) {
1274
+ builder.rollback();
1275
+ this.fail(outcome.failure.message, base + start + outcome.failure.pos);
1276
+ }
1277
+ builder.rollback();
1278
+ builder.open = false;
1279
+ this.pos = base + start;
1280
+ }
1281
+
1282
+ private fail(message: string, pos: number = this.pos): never {
1283
+ const before = this.input.slice(0, pos);
1284
+ const lines = countLines(before);
1285
+ const lastBreak = Math.max(before.lastIndexOf('\n'), before.lastIndexOf('\r'));
1286
+ const column = lines === 0 ? this.columnOffset + pos + 1 : pos - lastBreak;
1287
+ throw new SyntaxFailure(message, this.lineOffset + lines + 1, column);
1288
+ }
1289
+ }
1290
+
1291
+ /** A line break: `\r\n`, `\r` or `\n`. */
1292
+ const LINE_BREAK = /\r\n?|\n/g;
1293
+
1294
+ const countLines = (text: string): number => {
1295
+ let n = 0;
1296
+ LINE_BREAK.lastIndex = 0;
1297
+ loop(() => {
1298
+ if (!LINE_BREAK.test(text)) return false;
1299
+ n++;
1300
+ return true;
1301
+ });
1302
+ return n;
1303
+ };