@thomasfosterau/effect-rdf 0.0.0 → 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.
- package/LICENSE +21 -0
- package/README.md +2250 -1
- package/dist/Algebra-CGG4oae3.mjs +433 -0
- package/dist/Algebra-CGG4oae3.mjs.map +1 -0
- package/dist/Algebra-uGsIEOUA.d.mts +446 -0
- package/dist/Ast-CPRZmBvk.mjs +552 -0
- package/dist/Ast-CPRZmBvk.mjs.map +1 -0
- package/dist/Ast-vcw2W-lf.d.mts +827 -0
- package/dist/Bindings-Ck3m7JRC.mjs +249 -0
- package/dist/Bindings-Ck3m7JRC.mjs.map +1 -0
- package/dist/Bindings-DiKpBd7f.d.mts +153 -0
- package/dist/ClientErrors-CpXdFX5u.mjs +128 -0
- package/dist/ClientErrors-CpXdFX5u.mjs.map +1 -0
- package/dist/ClientErrors-D4IZHUM-.d.mts +101 -0
- package/dist/ClientFormats-CXomkXLV.mjs +73 -0
- package/dist/ClientFormats-CXomkXLV.mjs.map +1 -0
- package/dist/ClientFormats-Dm57ZPwR.d.mts +36 -0
- package/dist/Csv2Json-DynEcwCh.mjs +194 -0
- package/dist/Csv2Json-DynEcwCh.mjs.map +1 -0
- package/dist/Csv2Json-aXNVDoXQ.d.mts +40 -0
- package/dist/Csv2Rdf-8maXP6mt.d.mts +41 -0
- package/dist/Csv2Rdf-DuSEkaKE.mjs +161 -0
- package/dist/Csv2Rdf-DuSEkaKE.mjs.map +1 -0
- package/dist/Dataset-BlmlcI7J.mjs +782 -0
- package/dist/Dataset-BlmlcI7J.mjs.map +1 -0
- package/dist/Dataset-DS3ESOcO.d.mts +426 -0
- package/dist/Dataset.d.mts +2 -0
- package/dist/Dataset.mjs +1 -0
- package/dist/Datatype-CxMpamHC.d.mts +212 -0
- package/dist/Datatype-DQvkNkiH.mjs +1001 -0
- package/dist/Datatype-DQvkNkiH.mjs.map +1 -0
- package/dist/Dialect-8ChFj5EX.d.mts +113 -0
- package/dist/Dialect-CzVH38uo.mjs +165 -0
- package/dist/Dialect-CzVH38uo.mjs.map +1 -0
- package/dist/DocumentLoader-D3lZREnB.mjs +346 -0
- package/dist/DocumentLoader-D3lZREnB.mjs.map +1 -0
- package/dist/DocumentLoader-ZUCEVrW5.d.mts +178 -0
- package/dist/DublinCore-AnwqxRx6.mjs +137 -0
- package/dist/DublinCore-AnwqxRx6.mjs.map +1 -0
- package/dist/DublinCore-Dq-tVA5d.d.mts +119 -0
- package/dist/Engine-CYPB3g4h.d.mts +144 -0
- package/dist/Engine-DF8PN7g-.mjs +872 -0
- package/dist/Engine-DF8PN7g-.mjs.map +1 -0
- package/dist/Errors-CMdV1RhU.mjs +37 -0
- package/dist/Errors-CMdV1RhU.mjs.map +1 -0
- package/dist/Errors-u2bDjUeM.d.mts +30 -0
- package/dist/Evaluator-DEsU4d1o.d.mts +50 -0
- package/dist/Evaluator-DOY2-guC.mjs +281 -0
- package/dist/Evaluator-DOY2-guC.mjs.map +1 -0
- package/dist/Exif-CpqniYQd.d.mts +78 -0
- package/dist/Exif-DjkCfEB-.mjs +89 -0
- package/dist/Exif-DjkCfEB-.mjs.map +1 -0
- package/dist/Expression-BIMMvduQ.mjs +230 -0
- package/dist/Expression-BIMMvduQ.mjs.map +1 -0
- package/dist/Expression-W8A9cyX7.d.mts +89 -0
- package/dist/Extract-Bop85jES.mjs +220 -0
- package/dist/Extract-Bop85jES.mjs.map +1 -0
- package/dist/Extract-C_pCvuTC.d.mts +88 -0
- package/dist/Federation-BcNrozc1.d.mts +52 -0
- package/dist/Federation-CHScBkaK.mjs +130 -0
- package/dist/Federation-CHScBkaK.mjs.map +1 -0
- package/dist/Functions-AvjNcId_.mjs +1346 -0
- package/dist/Functions-AvjNcId_.mjs.map +1 -0
- package/dist/Functions-OQJZP-F6.d.mts +111 -0
- package/dist/Generator-C52mmq01.d.mts +50 -0
- package/dist/Generator-D3utCJC7.mjs +205 -0
- package/dist/Generator-D3utCJC7.mjs.map +1 -0
- package/dist/Grammar-CPlSxGH6.mjs +200 -0
- package/dist/Grammar-CPlSxGH6.mjs.map +1 -0
- package/dist/Grammar-CRhnRoCu.d.mts +148 -0
- package/dist/Grammar-D6jZdJQ3.d.mts +169 -0
- package/dist/Grammar-mQ8CgE1M.mjs +258 -0
- package/dist/Grammar-mQ8CgE1M.mjs.map +1 -0
- package/dist/GraphStore-DhUa4nFO.d.mts +45 -0
- package/dist/GraphStore-DvbqwKy1.mjs +212 -0
- package/dist/GraphStore-DvbqwKy1.mjs.map +1 -0
- package/dist/Iri-BB8Ks-BF.d.mts +84 -0
- package/dist/Iri-Cr92gsQV.mjs +232 -0
- package/dist/Iri-Cr92gsQV.mjs.map +1 -0
- package/dist/Iri.d.mts +2 -0
- package/dist/Iri.mjs +1 -0
- package/dist/Isomorphism-B6qTY-xy.d.mts +28 -0
- package/dist/Isomorphism-BmqxhKyJ.mjs +232 -0
- package/dist/Isomorphism-BmqxhKyJ.mjs.map +1 -0
- package/dist/Isomorphism-DInKnWIy.mjs +390 -0
- package/dist/Isomorphism-DInKnWIy.mjs.map +1 -0
- package/dist/Isomorphism-DvSfZXLR.d.mts +37 -0
- package/dist/Isomorphism.d.mts +2 -0
- package/dist/Isomorphism.mjs +1 -0
- package/dist/JsonLd-DOwS2FHg.mjs +2836 -0
- package/dist/JsonLd-DOwS2FHg.mjs.map +1 -0
- package/dist/JsonLd-DobFrQNa.d.mts +242 -0
- package/dist/JsonLdError-C9J-BxfG.mjs +106 -0
- package/dist/JsonLdError-C9J-BxfG.mjs.map +1 -0
- package/dist/JsonLdError-DSOfHkOy.d.mts +43 -0
- package/dist/LanguageTag-BCu8rcmX.d.mts +38 -0
- package/dist/LanguageTag-BcOpMGZ4.mjs +89 -0
- package/dist/LanguageTag-BcOpMGZ4.mjs.map +1 -0
- package/dist/LanguageTag.d.mts +2 -0
- package/dist/LanguageTag.mjs +1 -0
- package/dist/Lexical-Cg0JHrf6.mjs +243 -0
- package/dist/Lexical-Cg0JHrf6.mjs.map +1 -0
- package/dist/Lexical-D3zySYVS.d.mts +163 -0
- package/dist/Manifest-B6xf6mUc.mjs +148 -0
- package/dist/Manifest-B6xf6mUc.mjs.map +1 -0
- package/dist/Manifest-DQUMRBFr.d.mts +98 -0
- package/dist/Mapping-BgG74x3U.d.mts +63 -0
- package/dist/Mapping-Dc1ZGirk.mjs +259 -0
- package/dist/Mapping-Dc1ZGirk.mjs.map +1 -0
- package/dist/Mcp-1DwTTKOK.mjs +48 -0
- package/dist/Mcp-1DwTTKOK.mjs.map +1 -0
- package/dist/Mcp-d-pX9erx.d.mts +25 -0
- package/dist/Message-CK_DGQuu.mjs +95 -0
- package/dist/Message-CK_DGQuu.mjs.map +1 -0
- package/dist/Message-fIvTJSXM.d.mts +49 -0
- package/dist/Metadata-BbffwGDZ.mjs +445 -0
- package/dist/Metadata-BbffwGDZ.mjs.map +1 -0
- package/dist/Metadata-CEt3yc1-.d.mts +901 -0
- package/dist/Metadata-D4HsQNXr.mjs +1273 -0
- package/dist/Metadata-D4HsQNXr.mjs.map +1 -0
- package/dist/Metadata-nzS7QKRj.d.mts +350 -0
- package/dist/Model-DaMmxurZ.d.mts +293 -0
- package/dist/Model-DlPzRYhF.mjs +528 -0
- package/dist/Model-DlPzRYhF.mjs.map +1 -0
- package/dist/N3-BzyV-KIH.mjs +974 -0
- package/dist/N3-BzyV-KIH.mjs.map +1 -0
- package/dist/N3-DSLnonDn.d.mts +100 -0
- package/dist/NQuads-C1VBOJ3-.mjs +117 -0
- package/dist/NQuads-C1VBOJ3-.mjs.map +1 -0
- package/dist/NQuads-FjFZikFg.d.mts +76 -0
- package/dist/NTriples-D-kLSEAf.mjs +120 -0
- package/dist/NTriples-D-kLSEAf.mjs.map +1 -0
- package/dist/NTriples-D34OspfW.d.mts +76 -0
- package/dist/Namespace-ClTUO_ya.d.mts +42 -0
- package/dist/Namespace-DHFIsORd.mjs +75 -0
- package/dist/Namespace-DHFIsORd.mjs.map +1 -0
- package/dist/Namespace.d.mts +2 -0
- package/dist/Namespace.mjs +1 -0
- package/dist/Namespaces-Bz85vpjW.mjs +235 -0
- package/dist/Namespaces-Bz85vpjW.mjs.map +1 -0
- package/dist/Namespaces-C1jW6EDo.d.mts +178 -0
- package/dist/Optimizer-BWWQRQPY.mjs +168 -0
- package/dist/Optimizer-BWWQRQPY.mjs.map +1 -0
- package/dist/Optimizer-DUpUow6k.d.mts +26 -0
- package/dist/Options-BLBGL4HE.mjs +72 -0
- package/dist/Options-BLBGL4HE.mjs.map +1 -0
- package/dist/Options-BommQwP9.d.mts +127 -0
- package/dist/Packet-CA76wVX3.mjs +197 -0
- package/dist/Packet-CA76wVX3.mjs.map +1 -0
- package/dist/Packet-Cy5g6XuW.d.mts +130 -0
- package/dist/Parser-p1Gyr0QN.d.mts +85 -0
- package/dist/Parser-xARsOWXk.mjs +1317 -0
- package/dist/Parser-xARsOWXk.mjs.map +1 -0
- package/dist/Path-B20Yp8KE.mjs +284 -0
- package/dist/Path-B20Yp8KE.mjs.map +1 -0
- package/dist/Path-DRB8e-Zn.d.mts +181 -0
- package/dist/Pdf-B9RZn--8.d.mts +77 -0
- package/dist/Pdf-CKK6dkZn.mjs +89 -0
- package/dist/Pdf-CKK6dkZn.mjs.map +1 -0
- package/dist/PdfA-CUjSuntT.d.mts +109 -0
- package/dist/PdfA-CleOhuL6.mjs +124 -0
- package/dist/PdfA-CleOhuL6.mjs.map +1 -0
- package/dist/Photoshop-CiHo80qV.mjs +233 -0
- package/dist/Photoshop-CiHo80qV.mjs.map +1 -0
- package/dist/Photoshop-udKZ0I3N.d.mts +204 -0
- package/dist/PrefixMap-BHFPDLO-.mjs +103 -0
- package/dist/PrefixMap-BHFPDLO-.mjs.map +1 -0
- package/dist/PrefixMap-BMlXrWNd.d.mts +64 -0
- package/dist/PrefixMap.d.mts +2 -0
- package/dist/PrefixMap.mjs +1 -0
- package/dist/Processor-CMmecFsb.mjs +198 -0
- package/dist/Processor-CMmecFsb.mjs.map +1 -0
- package/dist/Processor-FJPvO0CB.d.mts +435 -0
- package/dist/Protocol-BA7OkNgp.mjs +202 -0
- package/dist/Protocol-BA7OkNgp.mjs.map +1 -0
- package/dist/Protocol-DlSoiIKB.d.mts +108 -0
- package/dist/ProtocolErrors-Ckfejnl6.d.mts +84 -0
- package/dist/ProtocolErrors-czDPVcX5.mjs +129 -0
- package/dist/ProtocolErrors-czDPVcX5.mjs.map +1 -0
- package/dist/Query-D9A6LOpP.mjs +364 -0
- package/dist/Query-D9A6LOpP.mjs.map +1 -0
- package/dist/Query-KqSkTYyG.d.mts +96 -0
- package/dist/QueryBuilder-BLK9Vfbz.mjs +674 -0
- package/dist/QueryBuilder-BLK9Vfbz.mjs.map +1 -0
- package/dist/QueryBuilder-DUqh4ECe.d.mts +529 -0
- package/dist/RdfJs-D6-49XB5.mjs +86 -0
- package/dist/RdfJs-D6-49XB5.mjs.map +1 -0
- package/dist/RdfJs-DXFqdWrd.d.mts +76 -0
- package/dist/RdfJs.d.mts +2 -0
- package/dist/RdfJs.mjs +1 -0
- package/dist/RdfJson-5aKPDlPS.d.mts +297 -0
- package/dist/RdfJson-BNocgW4f.mjs +548 -0
- package/dist/RdfJson-BNocgW4f.mjs.map +1 -0
- package/dist/RdfXml-DJ9G4gOq.mjs +1014 -0
- package/dist/RdfXml-DJ9G4gOq.mjs.map +1 -0
- package/dist/RdfXml-_N7yxWEp.d.mts +149 -0
- package/dist/Rdfs-BRVPsAjc.d.mts +84 -0
- package/dist/Rdfs-CyY2wVHI.mjs +167 -0
- package/dist/Rdfs-CyY2wVHI.mjs.map +1 -0
- package/dist/Rdfs.d.mts +2 -0
- package/dist/Rdfs.mjs +1 -0
- package/dist/Reasoner-BxYhx9s7.d.mts +94 -0
- package/dist/Reasoner-Cw90zrjv.mjs +798 -0
- package/dist/Reasoner-Cw90zrjv.mjs.map +1 -0
- package/dist/Reification-BmN4EfnM.d.mts +40 -0
- package/dist/Reification-dpqQvjDE.mjs +82 -0
- package/dist/Reification-dpqQvjDE.mjs.map +1 -0
- package/dist/Reification.d.mts +2 -0
- package/dist/Reification.mjs +1 -0
- package/dist/Report-XHs8htzK.mjs +121 -0
- package/dist/Report-XHs8htzK.mjs.map +1 -0
- package/dist/Report-hcXsc_19.d.mts +115 -0
- package/dist/Resource-B1cI8FyJ.d.mts +218 -0
- package/dist/Resource-sIEeNh15.mjs +374 -0
- package/dist/Resource-sIEeNh15.mjs.map +1 -0
- package/dist/Resource.d.mts +2 -0
- package/dist/Resource.mjs +1 -0
- package/dist/Results-BVNEC-Wt.d.mts +277 -0
- package/dist/Results-peJjGA2V.mjs +621 -0
- package/dist/Results-peJjGA2V.mjs.map +1 -0
- package/dist/ResultsStream-BhF0OcNn.mjs +639 -0
- package/dist/ResultsStream-BhF0OcNn.mjs.map +1 -0
- package/dist/ResultsStream-toYMXrOe.d.mts +100 -0
- package/dist/SemAct-CDchtk49.d.mts +96 -0
- package/dist/SemAct-CmyT4yI8.mjs +118 -0
- package/dist/SemAct-CmyT4yI8.mjs.map +1 -0
- package/dist/Serialization-DP9H5bYQ.mjs +514 -0
- package/dist/Serialization-DP9H5bYQ.mjs.map +1 -0
- package/dist/Serialization-Df8iVauT.d.mts +392 -0
- package/dist/Serialization.d.mts +2 -0
- package/dist/Serialization.mjs +1 -0
- package/dist/ServerFormats-CrRnjjf6.mjs +64 -0
- package/dist/ServerFormats-CrRnjjf6.mjs.map +1 -0
- package/dist/ServerFormats-DjC9NsO_.d.mts +36 -0
- package/dist/ServiceDescription-BERsvg-k.d.mts +54 -0
- package/dist/ServiceDescription-Dq5hxeGy.mjs +97 -0
- package/dist/ServiceDescription-Dq5hxeGy.mjs.map +1 -0
- package/dist/ShExC-Ctf-06CL.d.mts +67 -0
- package/dist/ShExC-DJbB19i3.mjs +1181 -0
- package/dist/ShExC-DJbB19i3.mjs.map +1 -0
- package/dist/ShExError-BeYFD9rv.d.mts +61 -0
- package/dist/ShExError-CVtq2NnM.mjs +64 -0
- package/dist/ShExError-CVtq2NnM.mjs.map +1 -0
- package/dist/ShExJ-C1u_wgyD.d.mts +531 -0
- package/dist/ShExJ-COiPd9Xw.mjs +532 -0
- package/dist/ShExJ-COiPd9Xw.mjs.map +1 -0
- package/dist/ShExR-ByR4mCh-.mjs +480 -0
- package/dist/ShExR-ByR4mCh-.mjs.map +1 -0
- package/dist/ShExR-CqONNNBz.d.mts +40 -0
- package/dist/ShapeMap-C422pxKl.d.mts +140 -0
- package/dist/ShapeMap-CsgKxB2G.mjs +181 -0
- package/dist/ShapeMap-CsgKxB2G.mjs.map +1 -0
- package/dist/Shapes-18GjfyBV.mjs +597 -0
- package/dist/Shapes-18GjfyBV.mjs.map +1 -0
- package/dist/Shapes-BQFDFc4Q.d.mts +306 -0
- package/dist/Sparql-BiYFMSpl.mjs +29 -0
- package/dist/Sparql-BiYFMSpl.mjs.map +1 -0
- package/dist/Sparql-DecpWTPh.d.mts +97 -0
- package/dist/SparqlClient-C_CjXbwj.mjs +333 -0
- package/dist/SparqlClient-C_CjXbwj.mjs.map +1 -0
- package/dist/SparqlClient-UPc88SHy.d.mts +290 -0
- package/dist/SparqlServer-CbUW-pVj.d.mts +71 -0
- package/dist/SparqlServer-Db7w7Cll.mjs +308 -0
- package/dist/SparqlServer-Db7w7Cll.mjs.map +1 -0
- package/dist/SqlStore-BBqFx-Wl.mjs +684 -0
- package/dist/SqlStore-BBqFx-Wl.mjs.map +1 -0
- package/dist/SqlStore-CCJo5I-e.d.mts +117 -0
- package/dist/Store-D0jmVfb3.d.mts +166 -0
- package/dist/Store-DH3Ow1GO.mjs +162 -0
- package/dist/Store-DH3Ow1GO.mjs.map +1 -0
- package/dist/Structure-BjMo4Bkc.mjs +334 -0
- package/dist/Structure-BjMo4Bkc.mjs.map +1 -0
- package/dist/Structure-n4CmDiab.d.mts +63 -0
- package/dist/Table-BGgm9nbM.mjs +538 -0
- package/dist/Table-BGgm9nbM.mjs.map +1 -0
- package/dist/Table-C3reiVrb.d.mts +261 -0
- package/dist/Term-B_4ezyXq.d.mts +619 -0
- package/dist/Term-CFLG1qu4.mjs +991 -0
- package/dist/Term-CFLG1qu4.mjs.map +1 -0
- package/dist/Term.d.mts +2 -0
- package/dist/Term.mjs +1 -0
- package/dist/TermCodec-CDZiEztW.mjs +397 -0
- package/dist/TermCodec-CDZiEztW.mjs.map +1 -0
- package/dist/TermCodec-_03bDXr0.d.mts +209 -0
- package/dist/TermCodec.d.mts +2 -0
- package/dist/TermCodec.mjs +1 -0
- package/dist/TermJson-BOPe0yve.d.mts +232 -0
- package/dist/TermJson-FAg3lvjl.mjs +142 -0
- package/dist/TermJson-FAg3lvjl.mjs.map +1 -0
- package/dist/TermJson.d.mts +2 -0
- package/dist/TermJson.mjs +1 -0
- package/dist/TermSchema-Bn9CoaYA.mjs +30 -0
- package/dist/TermSchema-Bn9CoaYA.mjs.map +1 -0
- package/dist/TermSchema-DBO6MroX.d.mts +6 -0
- package/dist/Testing-B-aPCpmu.mjs +63 -0
- package/dist/Testing-B-aPCpmu.mjs.map +1 -0
- package/dist/Testing-CF6s8P3O.d.mts +53 -0
- package/dist/Tiff-CR-2QeSI.d.mts +148 -0
- package/dist/Tiff-DlsOlZPM.mjs +169 -0
- package/dist/Tiff-DlsOlZPM.mjs.map +1 -0
- package/dist/Tools-7MdRKccr.d.mts +583 -0
- package/dist/Tools-ryxphZbI.mjs +329 -0
- package/dist/Tools-ryxphZbI.mjs.map +1 -0
- package/dist/Translate-B0YKKANS.d.mts +37 -0
- package/dist/Translate-gzWPq0Ia.mjs +308 -0
- package/dist/Translate-gzWPq0Ia.mjs.map +1 -0
- package/dist/Translation-DC9rLm2y.mjs +1535 -0
- package/dist/Translation-DC9rLm2y.mjs.map +1 -0
- package/dist/Translation-K4L9XBqX.d.mts +103 -0
- package/dist/TriG-BkqtqZ6Y.mjs +125 -0
- package/dist/TriG-BkqtqZ6Y.mjs.map +1 -0
- package/dist/TriG-xDjdDatp.d.mts +86 -0
- package/dist/Turtle-Bv1_bisW.d.mts +85 -0
- package/dist/Turtle-CZVUOtwl.mjs +133 -0
- package/dist/Turtle-CZVUOtwl.mjs.map +1 -0
- package/dist/ValidationReport-DBdJshW5.mjs +285 -0
- package/dist/ValidationReport-DBdJshW5.mjs.map +1 -0
- package/dist/ValidationReport-Dx3WxY0h.d.mts +192 -0
- package/dist/Validator-227ff9Rn.d.mts +179 -0
- package/dist/Validator-BzXMKDeJ.mjs +1162 -0
- package/dist/Validator-BzXMKDeJ.mjs.map +1 -0
- package/dist/Validator-Dl8cih5V.d.mts +207 -0
- package/dist/Validator-DmUfMbpL.mjs +568 -0
- package/dist/Validator-DmUfMbpL.mjs.map +1 -0
- package/dist/Vocab-DceKywpq.mjs +168 -0
- package/dist/Vocab-DceKywpq.mjs.map +1 -0
- package/dist/Vocab-Df-L-IwZ.d.mts +46 -0
- package/dist/Vocab-Do56UgBX.d.mts +81 -0
- package/dist/Vocab-TfpWG1Ne.mjs +118 -0
- package/dist/Vocab-TfpWG1Ne.mjs.map +1 -0
- package/dist/Vocab.d.mts +2 -0
- package/dist/Vocab.mjs +1 -0
- package/dist/Vocabulary-C6-GPOy4.d.mts +22 -0
- package/dist/Vocabulary-CnQl-_Z4.mjs +179 -0
- package/dist/Vocabulary-CnQl-_Z4.mjs.map +1 -0
- package/dist/Xml-B7iihYCS.mjs +976 -0
- package/dist/Xml-B7iihYCS.mjs.map +1 -0
- package/dist/Xml-CmfHS7SW.d.mts +267 -0
- package/dist/Xmp-D7CKA7MZ.d.mts +111 -0
- package/dist/Xmp-DCGN9pOD.mjs +307 -0
- package/dist/Xmp-DCGN9pOD.mjs.map +1 -0
- package/dist/XmpBasic-CP38jpR_.mjs +73 -0
- package/dist/XmpBasic-CP38jpR_.mjs.map +1 -0
- package/dist/XmpBasic-Cmbe53rQ.d.mts +64 -0
- package/dist/XmpMM-BfL_TgJF.mjs +73 -0
- package/dist/XmpMM-BfL_TgJF.mjs.map +1 -0
- package/dist/XmpMM-Dqm3IX8p.d.mts +63 -0
- package/dist/XmpRights-BKPtoI5L.mjs +73 -0
- package/dist/XmpRights-BKPtoI5L.mjs.map +1 -0
- package/dist/XmpRights-CaALZQz2.d.mts +63 -0
- package/dist/Xsd-Cdgx5zRB.mjs +405 -0
- package/dist/Xsd-Cdgx5zRB.mjs.map +1 -0
- package/dist/Xsd-D2elNhSm.d.mts +187 -0
- package/dist/Xsd.d.mts +2 -0
- package/dist/Xsd.mjs +1 -0
- package/dist/accessors-CEjaojuQ.mjs +28 -0
- package/dist/accessors-CEjaojuQ.mjs.map +1 -0
- package/dist/codec-Lb2T96rv.d.mts +20 -0
- package/dist/codec-QNo7IdJF.mjs +389 -0
- package/dist/codec-QNo7IdJF.mjs.map +1 -0
- package/dist/csvw/Csv2Json.d.mts +2 -0
- package/dist/csvw/Csv2Json.mjs +1 -0
- package/dist/csvw/Csv2Rdf.d.mts +2 -0
- package/dist/csvw/Csv2Rdf.mjs +1 -0
- package/dist/csvw/Datatype.d.mts +2 -0
- package/dist/csvw/Datatype.mjs +1 -0
- package/dist/csvw/Metadata.d.mts +2 -0
- package/dist/csvw/Metadata.mjs +1 -0
- package/dist/csvw/Processor.d.mts +2 -0
- package/dist/csvw/Processor.mjs +1 -0
- package/dist/csvw/Report.d.mts +2 -0
- package/dist/csvw/Report.mjs +1 -0
- package/dist/csvw/Table.d.mts +2 -0
- package/dist/csvw/Table.mjs +1 -0
- package/dist/csvw/index.d.mts +8 -0
- package/dist/csvw/index.mjs +8 -0
- package/dist/index-Cms2TYfC.d.mts +16 -0
- package/dist/index-Ct8xFmRs.d.mts +7 -0
- package/dist/index-D4QFwOjm.d.mts +28 -0
- package/dist/index.d.mts +18 -0
- package/dist/index.mjs +17 -0
- package/dist/jsonld/DocumentLoader.d.mts +2 -0
- package/dist/jsonld/DocumentLoader.mjs +1 -0
- package/dist/jsonld/JsonLd.d.mts +2 -0
- package/dist/jsonld/JsonLd.mjs +1 -0
- package/dist/jsonld/JsonLdError.d.mts +2 -0
- package/dist/jsonld/JsonLdError.mjs +1 -0
- package/dist/jsonld/index.d.mts +4 -0
- package/dist/jsonld/index.mjs +4 -0
- package/dist/lists-D-OpQ0Ir.mjs +77 -0
- package/dist/lists-D-OpQ0Ir.mjs.map +1 -0
- package/dist/loop-D5-gNx9K.mjs +21 -0
- package/dist/loop-D5-gNx9K.mjs.map +1 -0
- package/dist/loop-DZ2hXlr_.mjs +21 -0
- package/dist/loop-DZ2hXlr_.mjs.map +1 -0
- package/dist/n3/Isomorphism.d.mts +2 -0
- package/dist/n3/Isomorphism.mjs +1 -0
- package/dist/n3/Mapping.d.mts +2 -0
- package/dist/n3/Mapping.mjs +1 -0
- package/dist/n3/Model.d.mts +2 -0
- package/dist/n3/Model.mjs +1 -0
- package/dist/n3/N3.d.mts +2 -0
- package/dist/n3/N3.mjs +1 -0
- package/dist/n3/Reasoner.d.mts +2 -0
- package/dist/n3/Reasoner.mjs +2 -0
- package/dist/n3/Vocab.d.mts +2 -0
- package/dist/n3/Vocab.mjs +1 -0
- package/dist/n3/index.d.mts +7 -0
- package/dist/n3/index.mjs +7 -0
- package/dist/ntriples/Grammar.d.mts +2 -0
- package/dist/ntriples/Grammar.mjs +1 -0
- package/dist/ntriples/Lexical.d.mts +2 -0
- package/dist/ntriples/Lexical.mjs +1 -0
- package/dist/ntriples/NQuads.d.mts +2 -0
- package/dist/ntriples/NQuads.mjs +1 -0
- package/dist/ntriples/NTriples.d.mts +2 -0
- package/dist/ntriples/NTriples.mjs +1 -0
- package/dist/ntriples/index.d.mts +5 -0
- package/dist/ntriples/index.mjs +5 -0
- package/dist/rdfjson/RdfJson.d.mts +2 -0
- package/dist/rdfjson/RdfJson.mjs +1 -0
- package/dist/rdfjson/index.d.mts +2 -0
- package/dist/rdfjson/index.mjs +1 -0
- package/dist/rdfxml/RdfXml.d.mts +2 -0
- package/dist/rdfxml/RdfXml.mjs +1 -0
- package/dist/rdfxml/Xml.d.mts +2 -0
- package/dist/rdfxml/Xml.mjs +1 -0
- package/dist/rdfxml/index.d.mts +3 -0
- package/dist/rdfxml/index.mjs +3 -0
- package/dist/rolldown-runtime-D8jQpDG7.mjs +12 -0
- package/dist/serialize-96KBvKaf.mjs +1463 -0
- package/dist/serialize-96KBvKaf.mjs.map +1 -0
- package/dist/serialize-DsoXdM6n.d.mts +37 -0
- package/dist/shacl/Message.d.mts +2 -0
- package/dist/shacl/Message.mjs +1 -0
- package/dist/shacl/Path.d.mts +2 -0
- package/dist/shacl/Path.mjs +1 -0
- package/dist/shacl/Shapes.d.mts +2 -0
- package/dist/shacl/Shapes.mjs +1 -0
- package/dist/shacl/Sparql.d.mts +2 -0
- package/dist/shacl/Sparql.mjs +1 -0
- package/dist/shacl/ValidationReport.d.mts +2 -0
- package/dist/shacl/ValidationReport.mjs +1 -0
- package/dist/shacl/Validator.d.mts +2 -0
- package/dist/shacl/Validator.mjs +1 -0
- package/dist/shacl/Vocabulary.d.mts +2 -0
- package/dist/shacl/Vocabulary.mjs +1 -0
- package/dist/shacl/index.d.mts +9 -0
- package/dist/shacl/index.mjs +8 -0
- package/dist/shex/SemAct.d.mts +2 -0
- package/dist/shex/SemAct.mjs +1 -0
- package/dist/shex/ShExC.d.mts +2 -0
- package/dist/shex/ShExC.mjs +1 -0
- package/dist/shex/ShExError.d.mts +2 -0
- package/dist/shex/ShExError.mjs +1 -0
- package/dist/shex/ShExJ.d.mts +2 -0
- package/dist/shex/ShExJ.mjs +2 -0
- package/dist/shex/ShExR.d.mts +2 -0
- package/dist/shex/ShExR.mjs +1 -0
- package/dist/shex/ShapeMap.d.mts +2 -0
- package/dist/shex/ShapeMap.mjs +1 -0
- package/dist/shex/Structure.d.mts +2 -0
- package/dist/shex/Structure.mjs +2 -0
- package/dist/shex/Validator.d.mts +2 -0
- package/dist/shex/Validator.mjs +4 -0
- package/dist/shex/index.d.mts +9 -0
- package/dist/shex/index.mjs +9 -0
- package/dist/sparql/Algebra.d.mts +2 -0
- package/dist/sparql/Algebra.mjs +1 -0
- package/dist/sparql/Ast.d.mts +2 -0
- package/dist/sparql/Ast.mjs +1 -0
- package/dist/sparql/Bindings.d.mts +2 -0
- package/dist/sparql/Bindings.mjs +1 -0
- package/dist/sparql/ClientErrors.d.mts +2 -0
- package/dist/sparql/ClientErrors.mjs +1 -0
- package/dist/sparql/ClientFormats.d.mts +2 -0
- package/dist/sparql/ClientFormats.mjs +1 -0
- package/dist/sparql/Engine.d.mts +2 -0
- package/dist/sparql/Engine.mjs +1 -0
- package/dist/sparql/Errors.d.mts +2 -0
- package/dist/sparql/Errors.mjs +1 -0
- package/dist/sparql/Expression.d.mts +2 -0
- package/dist/sparql/Expression.mjs +1 -0
- package/dist/sparql/Federation.d.mts +2 -0
- package/dist/sparql/Federation.mjs +1 -0
- package/dist/sparql/Functions.d.mts +2 -0
- package/dist/sparql/Functions.mjs +1 -0
- package/dist/sparql/Generator.d.mts +2 -0
- package/dist/sparql/Generator.mjs +1 -0
- package/dist/sparql/GraphStore.d.mts +2 -0
- package/dist/sparql/GraphStore.mjs +1 -0
- package/dist/sparql/Optimizer.d.mts +2 -0
- package/dist/sparql/Optimizer.mjs +1 -0
- package/dist/sparql/Options.d.mts +2 -0
- package/dist/sparql/Options.mjs +1 -0
- package/dist/sparql/Parser.d.mts +2 -0
- package/dist/sparql/Parser.mjs +1 -0
- package/dist/sparql/Protocol.d.mts +2 -0
- package/dist/sparql/Protocol.mjs +1 -0
- package/dist/sparql/ProtocolErrors.d.mts +2 -0
- package/dist/sparql/ProtocolErrors.mjs +1 -0
- package/dist/sparql/QueryBuilder.d.mts +2 -0
- package/dist/sparql/QueryBuilder.mjs +1 -0
- package/dist/sparql/Results.d.mts +2 -0
- package/dist/sparql/Results.mjs +1 -0
- package/dist/sparql/ResultsStream.d.mts +2 -0
- package/dist/sparql/ResultsStream.mjs +1 -0
- package/dist/sparql/ServerFormats.d.mts +2 -0
- package/dist/sparql/ServerFormats.mjs +1 -0
- package/dist/sparql/ServiceDescription.d.mts +2 -0
- package/dist/sparql/ServiceDescription.mjs +1 -0
- package/dist/sparql/SparqlClient.d.mts +2 -0
- package/dist/sparql/SparqlClient.mjs +1 -0
- package/dist/sparql/SparqlServer.d.mts +2 -0
- package/dist/sparql/SparqlServer.mjs +1 -0
- package/dist/sparql/Store.d.mts +2 -0
- package/dist/sparql/Store.mjs +1 -0
- package/dist/sparql/TermSchema.d.mts +3 -0
- package/dist/sparql/TermSchema.mjs +2 -0
- package/dist/sparql/Testing.d.mts +2 -0
- package/dist/sparql/Testing.mjs +1 -0
- package/dist/sparql/Translate.d.mts +2 -0
- package/dist/sparql/Translate.mjs +1 -0
- package/dist/sparql/ai/Mcp.d.mts +2 -0
- package/dist/sparql/ai/Mcp.mjs +1 -0
- package/dist/sparql/ai/Tools.d.mts +2 -0
- package/dist/sparql/ai/Tools.mjs +1 -0
- package/dist/sparql/ai/index.d.mts +3 -0
- package/dist/sparql/ai/index.mjs +3 -0
- package/dist/sparql/index.d.mts +30 -0
- package/dist/sparql/index.mjs +29 -0
- package/dist/sparql/shacl/Evaluator.d.mts +2 -0
- package/dist/sparql/shacl/Evaluator.mjs +1 -0
- package/dist/sparql/shacl/Query.d.mts +2 -0
- package/dist/sparql/shacl/Query.mjs +1 -0
- package/dist/sparql/shacl/index.d.mts +3 -0
- package/dist/sparql/shacl/index.mjs +3 -0
- package/dist/sparql/sql/Dialect.d.mts +2 -0
- package/dist/sparql/sql/Dialect.mjs +1 -0
- package/dist/sparql/sql/SqlStore.d.mts +2 -0
- package/dist/sparql/sql/SqlStore.mjs +1 -0
- package/dist/sparql/sql/Translation.d.mts +2 -0
- package/dist/sparql/sql/Translation.mjs +1 -0
- package/dist/sparql/sql/index.d.mts +4 -0
- package/dist/sparql/sql/index.mjs +4 -0
- package/dist/stringMap-D5YIpYtR.mjs +38 -0
- package/dist/stringMap-D5YIpYtR.mjs.map +1 -0
- package/dist/tokens-C6BzeodQ.mjs +24 -0
- package/dist/tokens-C6BzeodQ.mjs.map +1 -0
- package/dist/turtle/Grammar.d.mts +3 -0
- package/dist/turtle/Grammar.mjs +3 -0
- package/dist/turtle/Manifest.d.mts +2 -0
- package/dist/turtle/Manifest.mjs +1 -0
- package/dist/turtle/TriG.d.mts +2 -0
- package/dist/turtle/TriG.mjs +1 -0
- package/dist/turtle/Turtle.d.mts +2 -0
- package/dist/turtle/Turtle.mjs +1 -0
- package/dist/turtle/index.d.mts +5 -0
- package/dist/turtle/index.mjs +5 -0
- package/dist/xmp/DublinCore.d.mts +2 -0
- package/dist/xmp/DublinCore.mjs +1 -0
- package/dist/xmp/Exif.d.mts +2 -0
- package/dist/xmp/Exif.mjs +1 -0
- package/dist/xmp/Extract.d.mts +2 -0
- package/dist/xmp/Extract.mjs +1 -0
- package/dist/xmp/Metadata.d.mts +2 -0
- package/dist/xmp/Metadata.mjs +1 -0
- package/dist/xmp/Namespaces.d.mts +2 -0
- package/dist/xmp/Namespaces.mjs +1 -0
- package/dist/xmp/Packet.d.mts +2 -0
- package/dist/xmp/Packet.mjs +1 -0
- package/dist/xmp/Pdf.d.mts +2 -0
- package/dist/xmp/Pdf.mjs +1 -0
- package/dist/xmp/PdfA.d.mts +2 -0
- package/dist/xmp/PdfA.mjs +1 -0
- package/dist/xmp/Photoshop.d.mts +2 -0
- package/dist/xmp/Photoshop.mjs +1 -0
- package/dist/xmp/Tiff.d.mts +2 -0
- package/dist/xmp/Tiff.mjs +1 -0
- package/dist/xmp/Xmp.d.mts +2 -0
- package/dist/xmp/Xmp.mjs +3 -0
- package/dist/xmp/XmpBasic.d.mts +2 -0
- package/dist/xmp/XmpBasic.mjs +1 -0
- package/dist/xmp/XmpMM.d.mts +2 -0
- package/dist/xmp/XmpMM.mjs +1 -0
- package/dist/xmp/XmpRights.d.mts +2 -0
- package/dist/xmp/XmpRights.mjs +1 -0
- package/dist/xmp/index.d.mts +15 -0
- package/dist/xmp/index.mjs +15 -0
- package/package.json +187 -3
- package/src/Dataset.ts +1085 -0
- package/src/Iri.ts +322 -0
- package/src/Isomorphism.ts +319 -0
- package/src/LanguageTag.ts +98 -0
- package/src/Namespace.ts +100 -0
- package/src/PrefixMap.ts +117 -0
- package/src/RdfJs.ts +146 -0
- package/src/Rdfs.ts +241 -0
- package/src/Reification.ts +103 -0
- package/src/Resource.ts +873 -0
- package/src/Serialization.ts +775 -0
- package/src/Term.ts +1300 -0
- package/src/TermCodec.ts +505 -0
- package/src/TermJson.ts +313 -0
- package/src/Vocab.ts +161 -0
- package/src/Xsd.ts +573 -0
- package/src/csvw/Csv2Json.ts +265 -0
- package/src/csvw/Csv2Rdf.ts +268 -0
- package/src/csvw/Datatype.ts +589 -0
- package/src/csvw/Metadata.ts +1523 -0
- package/src/csvw/Processor.ts +276 -0
- package/src/csvw/Report.ts +135 -0
- package/src/csvw/Table.ts +759 -0
- package/src/csvw/index.ts +22 -0
- package/src/csvw/internal/dateFormat.ts +202 -0
- package/src/csvw/internal/json.ts +104 -0
- package/src/csvw/internal/numberFormat.ts +369 -0
- package/src/csvw/internal/object.ts +23 -0
- package/src/csvw/internal/uriTemplate.ts +130 -0
- package/src/csvw/internal/url.ts +93 -0
- package/src/csvw/internal/vocab.ts +282 -0
- package/src/index.ts +40 -0
- package/src/internal/arbitrary.ts +148 -0
- package/src/internal/loop.ts +24 -0
- package/src/internal/pending.ts +20 -0
- package/src/internal/textDecoder.ts +183 -0
- package/src/jsonld/DocumentLoader.ts +512 -0
- package/src/jsonld/JsonLd.ts +847 -0
- package/src/jsonld/JsonLdError.ts +105 -0
- package/src/jsonld/index.ts +13 -0
- package/src/jsonld/internal/compact.ts +852 -0
- package/src/jsonld/internal/context.ts +781 -0
- package/src/jsonld/internal/expand.ts +614 -0
- package/src/jsonld/internal/flatten.ts +243 -0
- package/src/jsonld/internal/frame.ts +559 -0
- package/src/jsonld/internal/iri.ts +52 -0
- package/src/jsonld/internal/json.ts +19 -0
- package/src/jsonld/internal/linkHeader.ts +60 -0
- package/src/jsonld/internal/rdf.ts +481 -0
- package/src/jsonld/internal/util.ts +367 -0
- package/src/n3/Isomorphism.ts +476 -0
- package/src/n3/Mapping.ts +332 -0
- package/src/n3/Model.ts +696 -0
- package/src/n3/N3.ts +237 -0
- package/src/n3/Reasoner.ts +568 -0
- package/src/n3/Vocab.ts +111 -0
- package/src/n3/index.ts +21 -0
- package/src/n3/internal/builtins.ts +668 -0
- package/src/n3/internal/guards.ts +23 -0
- package/src/n3/internal/lists.ts +106 -0
- package/src/n3/internal/loop.ts +28 -0
- package/src/n3/internal/parser.ts +1032 -0
- package/src/n3/internal/writer.ts +344 -0
- package/src/ntriples/Grammar.ts +317 -0
- package/src/ntriples/Lexical.ts +321 -0
- package/src/ntriples/NQuads.ts +140 -0
- package/src/ntriples/NTriples.ts +143 -0
- package/src/ntriples/index.ts +14 -0
- package/src/ntriples/internal/codec.ts +229 -0
- package/src/ntriples/internal/lineParser.ts +326 -0
- package/src/ntriples/internal/loop.ts +14 -0
- package/src/rdfjson/RdfJson.ts +806 -0
- package/src/rdfjson/index.ts +9 -0
- package/src/rdfjson/internal/json.ts +19 -0
- package/src/rdfxml/RdfXml.ts +1408 -0
- package/src/rdfxml/Xml.ts +419 -0
- package/src/rdfxml/index.ts +11 -0
- package/src/rdfxml/internal/chars.ts +73 -0
- package/src/rdfxml/internal/loop.ts +24 -0
- package/src/rdfxml/internal/parser.ts +1265 -0
- package/src/shacl/Message.ts +102 -0
- package/src/shacl/Path.ts +483 -0
- package/src/shacl/Shapes.ts +913 -0
- package/src/shacl/Sparql.ts +128 -0
- package/src/shacl/ValidationReport.ts +438 -0
- package/src/shacl/Validator.ts +1156 -0
- package/src/shacl/Vocabulary.ts +180 -0
- package/src/shacl/index.ts +22 -0
- package/src/shacl/internal/compare.ts +128 -0
- package/src/shacl/internal/regex.ts +56 -0
- package/src/shex/SemAct.ts +197 -0
- package/src/shex/ShExC.ts +415 -0
- package/src/shex/ShExError.ts +71 -0
- package/src/shex/ShExJ.ts +893 -0
- package/src/shex/ShExR.ts +640 -0
- package/src/shex/ShapeMap.ts +385 -0
- package/src/shex/Structure.ts +467 -0
- package/src/shex/Validator.ts +395 -0
- package/src/shex/index.ts +24 -0
- package/src/shex/internal/engine.ts +682 -0
- package/src/shex/internal/iterate.ts +14 -0
- package/src/shex/internal/json.ts +12 -0
- package/src/shex/internal/lexer.ts +56 -0
- package/src/shex/internal/nodeConstraint.ts +368 -0
- package/src/shex/internal/shexcLexer.ts +387 -0
- package/src/shex/internal/shexcParser.ts +1312 -0
- package/src/shex/internal/tokens.ts +41 -0
- package/src/shex/internal/xpathRegex.ts +290 -0
- package/src/sparql/Algebra.ts +914 -0
- package/src/sparql/Ast.ts +1344 -0
- package/src/sparql/Bindings.ts +272 -0
- package/src/sparql/ClientErrors.ts +156 -0
- package/src/sparql/ClientFormats.ts +70 -0
- package/src/sparql/Engine.ts +699 -0
- package/src/sparql/Errors.ts +30 -0
- package/src/sparql/Expression.ts +360 -0
- package/src/sparql/Federation.ts +187 -0
- package/src/sparql/Functions.ts +689 -0
- package/src/sparql/Generator.ts +426 -0
- package/src/sparql/GraphStore.ts +341 -0
- package/src/sparql/Optimizer.ts +230 -0
- package/src/sparql/Options.ts +191 -0
- package/src/sparql/Parser.ts +173 -0
- package/src/sparql/Protocol.ts +342 -0
- package/src/sparql/ProtocolErrors.ts +113 -0
- package/src/sparql/QueryBuilder.ts +953 -0
- package/src/sparql/Results.ts +844 -0
- package/src/sparql/ResultsStream.ts +771 -0
- package/src/sparql/ServerFormats.ts +75 -0
- package/src/sparql/ServiceDescription.ts +130 -0
- package/src/sparql/SparqlClient.ts +947 -0
- package/src/sparql/SparqlServer.ts +528 -0
- package/src/sparql/Store.ts +311 -0
- package/src/sparql/TermSchema.ts +20 -0
- package/src/sparql/Testing.ts +114 -0
- package/src/sparql/Translate.ts +407 -0
- package/src/sparql/ai/Mcp.ts +43 -0
- package/src/sparql/ai/Tools.ts +481 -0
- package/src/sparql/ai/index.ts +11 -0
- package/src/sparql/index.ts +64 -0
- package/src/sparql/internal/evaluator.ts +947 -0
- package/src/sparql/internal/hash.ts +418 -0
- package/src/sparql/internal/json.ts +12 -0
- package/src/sparql/internal/lexer.ts +488 -0
- package/src/sparql/internal/loop.ts +24 -0
- package/src/sparql/internal/parser.ts +2215 -0
- package/src/sparql/internal/prefetch.ts +46 -0
- package/src/sparql/internal/stringMap.ts +39 -0
- package/src/sparql/internal/textResults.ts +226 -0
- package/src/sparql/internal/values.ts +550 -0
- package/src/sparql/shacl/Evaluator.ts +478 -0
- package/src/sparql/shacl/Query.ts +574 -0
- package/src/sparql/shacl/index.ts +12 -0
- package/src/sparql/sql/Dialect.ts +246 -0
- package/src/sparql/sql/SqlStore.ts +1080 -0
- package/src/sparql/sql/Translation.ts +1898 -0
- package/src/sparql/sql/index.ts +17 -0
- package/src/sparql/sql/internal/encoding.ts +313 -0
- package/src/turtle/Grammar.ts +286 -0
- package/src/turtle/Manifest.ts +215 -0
- package/src/turtle/TriG.ts +158 -0
- package/src/turtle/Turtle.ts +166 -0
- package/src/turtle/index.ts +14 -0
- package/src/turtle/internal/loop.ts +23 -0
- package/src/turtle/internal/parse.ts +112 -0
- package/src/turtle/internal/parser.ts +1303 -0
- package/src/turtle/internal/serialize.ts +79 -0
- package/src/turtle/internal/streamWriter.ts +128 -0
- package/src/turtle/internal/writer.ts +898 -0
- package/src/xmp/DublinCore.ts +147 -0
- package/src/xmp/Exif.ts +109 -0
- package/src/xmp/Extract.ts +351 -0
- package/src/xmp/Metadata.ts +703 -0
- package/src/xmp/Namespaces.ts +228 -0
- package/src/xmp/Packet.ts +297 -0
- package/src/xmp/Pdf.ts +99 -0
- package/src/xmp/PdfA.ts +280 -0
- package/src/xmp/Photoshop.ts +275 -0
- package/src/xmp/Tiff.ts +196 -0
- package/src/xmp/Xmp.ts +430 -0
- package/src/xmp/XmpBasic.ts +90 -0
- package/src/xmp/XmpMM.ts +82 -0
- package/src/xmp/XmpRights.ts +83 -0
- package/src/xmp/index.ts +36 -0
- package/src/xmp/internal/accessors.ts +72 -0
- package/src/xmp/internal/xml.ts +63 -0
package/src/Term.ts
ADDED
|
@@ -0,0 +1,1300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The RDF 1.2 term model.
|
|
3
|
+
*
|
|
4
|
+
* Terms are immutable values that implement Effect's `Equal` and `Hash`
|
|
5
|
+
* protocols, so they can be used directly as keys of `HashMap`/`HashSet` and
|
|
6
|
+
* compared with `Equal.equals`. Every term carries a canonical `key` — its
|
|
7
|
+
* N-Triples / N-Quads serialisation — which is also what `toString()` returns.
|
|
8
|
+
*
|
|
9
|
+
* The model supports RDF 1.2 (and RDF-star) triple terms, directional
|
|
10
|
+
* language-tagged strings, and SPARQL variables (used only in patterns).
|
|
11
|
+
*
|
|
12
|
+
* @since 0.1.0
|
|
13
|
+
*/
|
|
14
|
+
import * as Effect from 'effect/Effect';
|
|
15
|
+
import * as Equal from 'effect/Equal';
|
|
16
|
+
import * as equivalence from 'effect/Equivalence';
|
|
17
|
+
import * as Hash from 'effect/Hash';
|
|
18
|
+
import { NodeInspectSymbol } from 'effect/Inspectable';
|
|
19
|
+
import * as Match from 'effect/Match';
|
|
20
|
+
import * as order from 'effect/Order';
|
|
21
|
+
import { pipeArguments, type Pipeable } from 'effect/Pipeable';
|
|
22
|
+
import { hasProperty, isString, isTagged } from 'effect/Predicate';
|
|
23
|
+
import * as Schema from 'effect/Schema';
|
|
24
|
+
import * as SchemaIssue from 'effect/SchemaIssue';
|
|
25
|
+
import * as SchemaTransformation from 'effect/SchemaTransformation';
|
|
26
|
+
import type * as SchemaAST from 'effect/SchemaAST';
|
|
27
|
+
import * as TermJson from './TermJson.ts';
|
|
28
|
+
import { representations as Generate } from './internal/arbitrary.ts';
|
|
29
|
+
|
|
30
|
+
const RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
31
|
+
const XSD = 'http://www.w3.org/2001/XMLSchema#';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @since 0.1.0
|
|
35
|
+
* @category symbols
|
|
36
|
+
*/
|
|
37
|
+
export const TypeId: unique symbol = Symbol.for('@thomasfosterau/effect-rdf/Term');
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @since 0.1.0
|
|
41
|
+
* @category symbols
|
|
42
|
+
*/
|
|
43
|
+
export type TypeId = typeof TypeId;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The base direction of a directional language-tagged string.
|
|
47
|
+
*
|
|
48
|
+
* @since 0.1.0
|
|
49
|
+
* @category models
|
|
50
|
+
*/
|
|
51
|
+
export type Direction = 'ltr' | 'rtl';
|
|
52
|
+
|
|
53
|
+
/** `isTerm` for a value already known to be an object. */
|
|
54
|
+
const hasTermTypeId = (u: Equal.Equal): u is Term => TypeId in u;
|
|
55
|
+
|
|
56
|
+
/** Mixed into the hashes of blank nodes and variables, so that `_:a` and `?a` differ from `<a>`. */
|
|
57
|
+
const BLANK_SALT = 0x5f3a;
|
|
58
|
+
const VARIABLE_SALT = 0x3f;
|
|
59
|
+
|
|
60
|
+
abstract class TermBase implements Equal.Equal, Pipeable {
|
|
61
|
+
readonly [TypeId]: TypeId = TypeId;
|
|
62
|
+
abstract readonly _tag: string;
|
|
63
|
+
// Computed on first use. `''` stands for "not yet": only the default graph has the empty key,
|
|
64
|
+
// and computing it again is free. (A flag rather than a `NaN` hash, which would be a boxed
|
|
65
|
+
// number in every term.)
|
|
66
|
+
#key = '';
|
|
67
|
+
#hash = 0;
|
|
68
|
+
#hashed = false;
|
|
69
|
+
|
|
70
|
+
/** The canonical N-Triples serialisation of this term. */
|
|
71
|
+
get key(): string {
|
|
72
|
+
if (this.#key === '') this.#key = this.computeKey();
|
|
73
|
+
return this.#key;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
protected abstract computeKey(): string;
|
|
77
|
+
|
|
78
|
+
/** RDF/JS compatible alias of `_tag`. */
|
|
79
|
+
get termType(): this['_tag'] {
|
|
80
|
+
return this._tag;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** RDF/JS compatible equality. */
|
|
84
|
+
equals(that: unknown): boolean {
|
|
85
|
+
return isTerm(that) && that.key === this.key;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
[Equal.symbol](that: Equal.Equal): boolean {
|
|
89
|
+
return hasTermTypeId(that) && that.key === this.key;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
[Hash.symbol](): number {
|
|
93
|
+
if (!this.#hashed) {
|
|
94
|
+
this.#hash = this.computeHash();
|
|
95
|
+
this.#hashed = true;
|
|
96
|
+
}
|
|
97
|
+
return this.#hash;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* The hash, consistent with `key` (terms with equal keys have equal
|
|
102
|
+
* hashes). IRIs, blank nodes, variables and literals hash their parts, so
|
|
103
|
+
* that hashing one builds no key.
|
|
104
|
+
*/
|
|
105
|
+
protected computeHash(): number {
|
|
106
|
+
return Hash.string(this.key);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
pipe() {
|
|
110
|
+
return pipeArguments(this, arguments);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
toString(): string {
|
|
114
|
+
return this.key;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
toJSON() {
|
|
118
|
+
return { _tag: this._tag, value: this.key };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
[NodeInspectSymbol](): string {
|
|
122
|
+
return `${this._tag}(${this.key})`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* An IRI.
|
|
128
|
+
*
|
|
129
|
+
* @since 0.1.0
|
|
130
|
+
* @category models
|
|
131
|
+
*/
|
|
132
|
+
export class NamedNode<out Iri extends string = string> extends TermBase {
|
|
133
|
+
readonly _tag = 'NamedNode' as const;
|
|
134
|
+
readonly value: Iri;
|
|
135
|
+
constructor(value: Iri) {
|
|
136
|
+
super();
|
|
137
|
+
this.value = value;
|
|
138
|
+
}
|
|
139
|
+
protected computeKey(): string {
|
|
140
|
+
return `<${escapeIri(this.value)}>`;
|
|
141
|
+
}
|
|
142
|
+
protected override computeHash(): number {
|
|
143
|
+
return Hash.string(this.value);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* A blank node. Labels are scoped to the dataset or document that contains
|
|
149
|
+
* them.
|
|
150
|
+
*
|
|
151
|
+
* @since 0.1.0
|
|
152
|
+
* @category models
|
|
153
|
+
*/
|
|
154
|
+
export class BlankNode extends TermBase {
|
|
155
|
+
readonly _tag = 'BlankNode' as const;
|
|
156
|
+
readonly value: string;
|
|
157
|
+
constructor(value: string) {
|
|
158
|
+
super();
|
|
159
|
+
this.value = value;
|
|
160
|
+
}
|
|
161
|
+
protected computeKey(): string {
|
|
162
|
+
return `_:${this.value}`;
|
|
163
|
+
}
|
|
164
|
+
protected override computeHash(): number {
|
|
165
|
+
return Hash.combine(Hash.string(this.value), BLANK_SALT);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* A literal. Language-tagged strings have datatype `rdf:langString`, and
|
|
171
|
+
* directional language-tagged strings (RDF 1.2) have datatype
|
|
172
|
+
* `rdf:dirLangString`.
|
|
173
|
+
*
|
|
174
|
+
* @since 0.1.0
|
|
175
|
+
* @category models
|
|
176
|
+
*/
|
|
177
|
+
export class Literal extends TermBase {
|
|
178
|
+
readonly _tag = 'Literal' as const;
|
|
179
|
+
readonly value: string;
|
|
180
|
+
readonly datatype: NamedNode;
|
|
181
|
+
readonly language: string;
|
|
182
|
+
readonly direction: Direction | undefined;
|
|
183
|
+
constructor(value: string, datatype: NamedNode, language: string = '', direction?: Direction) {
|
|
184
|
+
super();
|
|
185
|
+
this.value = value;
|
|
186
|
+
this.datatype = datatype;
|
|
187
|
+
this.language = language;
|
|
188
|
+
this.direction = direction;
|
|
189
|
+
}
|
|
190
|
+
protected computeKey(): string {
|
|
191
|
+
const lexical = `"${escapeString(this.value)}"`;
|
|
192
|
+
if (this.language !== '') {
|
|
193
|
+
return this.direction === undefined
|
|
194
|
+
? `${lexical}@${this.language}`
|
|
195
|
+
: `${lexical}@${this.language}--${this.direction}`;
|
|
196
|
+
}
|
|
197
|
+
if (this.datatype.value === XSD_STRING) return lexical;
|
|
198
|
+
return `${lexical}^^${this.datatype.key}`;
|
|
199
|
+
}
|
|
200
|
+
protected override computeHash(): number {
|
|
201
|
+
const h = Hash.combine(Hash.string(this.value), this.datatype[Hash.symbol]());
|
|
202
|
+
return this.language === '' ? h : Hash.combine(h, Hash.string(this.language));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* A SPARQL query variable. Variables never appear in RDF data; they are used
|
|
208
|
+
* in quad patterns.
|
|
209
|
+
*
|
|
210
|
+
* @since 0.1.0
|
|
211
|
+
* @category models
|
|
212
|
+
*/
|
|
213
|
+
export class Variable<out Name extends string = string> extends TermBase {
|
|
214
|
+
readonly _tag = 'Variable' as const;
|
|
215
|
+
readonly value: Name;
|
|
216
|
+
constructor(value: Name) {
|
|
217
|
+
super();
|
|
218
|
+
this.value = value;
|
|
219
|
+
}
|
|
220
|
+
protected computeKey(): string {
|
|
221
|
+
return `?${this.value}`;
|
|
222
|
+
}
|
|
223
|
+
protected override computeHash(): number {
|
|
224
|
+
return Hash.combine(Hash.string(this.value), VARIABLE_SALT);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* The default graph of a dataset.
|
|
230
|
+
*
|
|
231
|
+
* @since 0.1.0
|
|
232
|
+
* @category models
|
|
233
|
+
*/
|
|
234
|
+
export class DefaultGraph extends TermBase {
|
|
235
|
+
readonly _tag = 'DefaultGraph' as const;
|
|
236
|
+
readonly value = '' as const;
|
|
237
|
+
protected computeKey(): string {
|
|
238
|
+
return '';
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* An RDF triple. Triples are also terms (RDF 1.2 "triple terms", RDF-star
|
|
244
|
+
* "quoted triples") and may appear in the subject or object position of
|
|
245
|
+
* other triples.
|
|
246
|
+
*
|
|
247
|
+
* @since 0.1.0
|
|
248
|
+
* @category models
|
|
249
|
+
*/
|
|
250
|
+
export class Triple<
|
|
251
|
+
out S extends Subject = Subject,
|
|
252
|
+
out P extends Predicate = Predicate,
|
|
253
|
+
out O extends Object = Object,
|
|
254
|
+
> extends TermBase {
|
|
255
|
+
readonly _tag = 'Triple' as const;
|
|
256
|
+
readonly subject: S;
|
|
257
|
+
readonly predicate: P;
|
|
258
|
+
readonly object: O;
|
|
259
|
+
constructor(subject: S, predicate: P, object: O) {
|
|
260
|
+
super();
|
|
261
|
+
this.subject = subject;
|
|
262
|
+
this.predicate = predicate;
|
|
263
|
+
this.object = object;
|
|
264
|
+
}
|
|
265
|
+
protected computeKey(): string {
|
|
266
|
+
return `<<( ${this.subject.key} ${this.predicate.key} ${this.object.key} )>>`;
|
|
267
|
+
}
|
|
268
|
+
/** Always the default graph: a triple term carries no graph name. */
|
|
269
|
+
get graph(): DefaultGraph {
|
|
270
|
+
return defaultGraph;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* An RDF quad: a triple together with the graph that contains it.
|
|
276
|
+
*
|
|
277
|
+
* `Quad` is a statement, not a term; use `Triple` for triple terms.
|
|
278
|
+
*
|
|
279
|
+
* @since 0.1.0
|
|
280
|
+
* @category models
|
|
281
|
+
*/
|
|
282
|
+
export class Quad<
|
|
283
|
+
out S extends Subject = Subject,
|
|
284
|
+
out P extends Predicate = Predicate,
|
|
285
|
+
out O extends Object = Object,
|
|
286
|
+
out G extends Graph = Graph,
|
|
287
|
+
>
|
|
288
|
+
implements Equal.Equal, Pipeable
|
|
289
|
+
{
|
|
290
|
+
readonly _tag = 'Quad' as const;
|
|
291
|
+
// Computed on first use; `''` stands for "not yet" (no statement has an empty key).
|
|
292
|
+
#key = '';
|
|
293
|
+
#hash = 0;
|
|
294
|
+
#hashed = false;
|
|
295
|
+
readonly subject: S;
|
|
296
|
+
readonly predicate: P;
|
|
297
|
+
readonly object: O;
|
|
298
|
+
readonly graph: G;
|
|
299
|
+
constructor(subject: S, predicate: P, object: O, graph: G) {
|
|
300
|
+
this.subject = subject;
|
|
301
|
+
this.predicate = predicate;
|
|
302
|
+
this.object = object;
|
|
303
|
+
this.graph = graph;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/** The canonical N-Quads statement (without the trailing ` .`). */
|
|
307
|
+
get key(): string {
|
|
308
|
+
if (this.#key === '') {
|
|
309
|
+
const triple = `${this.subject.key} ${this.predicate.key} ${this.object.key}`;
|
|
310
|
+
this.#key = this.graph._tag === 'DefaultGraph' ? triple : `${triple} ${this.graph.key}`;
|
|
311
|
+
}
|
|
312
|
+
return this.#key;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/** The triple of this quad, without its graph. */
|
|
316
|
+
get triple(): Triple<S, P, O> {
|
|
317
|
+
return new Triple(this.subject, this.predicate, this.object);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
equals(that: unknown): boolean {
|
|
321
|
+
return isQuad(that) && that.key === this.key;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
[Equal.symbol](that: Equal.Equal): boolean {
|
|
325
|
+
return that instanceof Quad && that.key === this.key;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
[Hash.symbol](): number {
|
|
329
|
+
if (!this.#hashed) {
|
|
330
|
+
this.#hash = Hash.string(this.key);
|
|
331
|
+
this.#hashed = true;
|
|
332
|
+
}
|
|
333
|
+
return this.#hash;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
pipe() {
|
|
337
|
+
return pipeArguments(this, arguments);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
toString(): string {
|
|
341
|
+
return `${this.key} .`;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
toJSON() {
|
|
345
|
+
return { _tag: 'Quad' as const, value: this.toString() };
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
[NodeInspectSymbol](): string {
|
|
349
|
+
return `Quad(${this.key})`;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// -----------------------------------------------------------------------------
|
|
354
|
+
// Unions
|
|
355
|
+
// -----------------------------------------------------------------------------
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Any RDF term.
|
|
359
|
+
*
|
|
360
|
+
* @since 0.1.0
|
|
361
|
+
* @category models
|
|
362
|
+
*/
|
|
363
|
+
export type Term = NamedNode | BlankNode | Literal | Variable | DefaultGraph | Triple;
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Terms allowed in the subject position of RDF data.
|
|
367
|
+
*
|
|
368
|
+
* @since 0.1.0
|
|
369
|
+
* @category models
|
|
370
|
+
*/
|
|
371
|
+
export type Subject = NamedNode | BlankNode | Triple;
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Terms allowed in the predicate position of RDF data.
|
|
375
|
+
*
|
|
376
|
+
* @since 0.1.0
|
|
377
|
+
* @category models
|
|
378
|
+
*/
|
|
379
|
+
export type Predicate = NamedNode;
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Terms allowed in the object position of RDF data.
|
|
383
|
+
*
|
|
384
|
+
* @since 0.1.0
|
|
385
|
+
* @category models
|
|
386
|
+
*/
|
|
387
|
+
export type Object = NamedNode | BlankNode | Literal | Triple;
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Terms allowed as graph names.
|
|
391
|
+
*
|
|
392
|
+
* @since 0.1.0
|
|
393
|
+
* @category models
|
|
394
|
+
*/
|
|
395
|
+
export type Graph = NamedNode | BlankNode | DefaultGraph;
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Ground terms: terms that may appear in RDF data (everything except
|
|
399
|
+
* variables and the default graph marker).
|
|
400
|
+
*
|
|
401
|
+
* @since 0.1.0
|
|
402
|
+
* @category models
|
|
403
|
+
*/
|
|
404
|
+
export type GroundTerm = NamedNode | BlankNode | Literal | Triple;
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* IRIs and blank nodes.
|
|
408
|
+
*
|
|
409
|
+
* @since 0.1.0
|
|
410
|
+
* @category models
|
|
411
|
+
*/
|
|
412
|
+
export type Resource = NamedNode | BlankNode;
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* A term or variable in a quad pattern.
|
|
416
|
+
*
|
|
417
|
+
* @since 0.1.0
|
|
418
|
+
* @category models
|
|
419
|
+
*/
|
|
420
|
+
export type PatternTerm<T extends Term> = T | Variable;
|
|
421
|
+
|
|
422
|
+
// -----------------------------------------------------------------------------
|
|
423
|
+
// Constructors
|
|
424
|
+
// -----------------------------------------------------------------------------
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* The singleton default graph.
|
|
428
|
+
*
|
|
429
|
+
* @since 0.1.0
|
|
430
|
+
* @category constructors
|
|
431
|
+
*/
|
|
432
|
+
export const defaultGraph: DefaultGraph = new DefaultGraph();
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* @since 0.1.0
|
|
436
|
+
* @category constructors
|
|
437
|
+
*/
|
|
438
|
+
export const namedNode = <const Iri extends string>(iri: Iri): NamedNode<Iri> => new NamedNode(iri);
|
|
439
|
+
|
|
440
|
+
let blankNodeCounter = 0;
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Creates a blank node. When no label is given a fresh, process-unique label
|
|
444
|
+
* is generated.
|
|
445
|
+
*
|
|
446
|
+
* @since 0.1.0
|
|
447
|
+
* @category constructors
|
|
448
|
+
*/
|
|
449
|
+
export const blankNode = (label?: string): BlankNode =>
|
|
450
|
+
new BlankNode(label ?? `b${(blankNodeCounter++).toString(36)}`);
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* @since 0.1.0
|
|
454
|
+
* @category constructors
|
|
455
|
+
*/
|
|
456
|
+
export const variable = <const Name extends string>(name: Name): Variable<Name> =>
|
|
457
|
+
new Variable(name);
|
|
458
|
+
|
|
459
|
+
/** @internal */
|
|
460
|
+
export const XSD_STRING = `${XSD}string`;
|
|
461
|
+
/** @internal */
|
|
462
|
+
export const RDF_LANG_STRING = `${RDF}langString`;
|
|
463
|
+
/** @internal */
|
|
464
|
+
export const RDF_DIR_LANG_STRING = `${RDF}dirLangString`;
|
|
465
|
+
|
|
466
|
+
const xsdString = new NamedNode(XSD_STRING);
|
|
467
|
+
const rdfLangString = new NamedNode(RDF_LANG_STRING);
|
|
468
|
+
const rdfDirLangString = new NamedNode(RDF_DIR_LANG_STRING);
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Creates a literal.
|
|
472
|
+
*
|
|
473
|
+
* - `literal("x")` is an `xsd:string`
|
|
474
|
+
* - `literal("x", "en")` is a language-tagged string
|
|
475
|
+
* - `literal("x", { language: "ar", direction: "rtl" })` is a directional
|
|
476
|
+
* language-tagged string
|
|
477
|
+
* - `literal("1", xsd.integer)` is a typed literal
|
|
478
|
+
*
|
|
479
|
+
* Language tags are normalised to lower case.
|
|
480
|
+
*
|
|
481
|
+
* @since 0.1.0
|
|
482
|
+
* @category constructors
|
|
483
|
+
*/
|
|
484
|
+
export const literal = (
|
|
485
|
+
value: string,
|
|
486
|
+
languageOrDatatype?:
|
|
487
|
+
| string
|
|
488
|
+
| NamedNode
|
|
489
|
+
| { readonly language: string; readonly direction?: Direction | undefined },
|
|
490
|
+
): Literal => {
|
|
491
|
+
if (languageOrDatatype === undefined) return new Literal(value, xsdString);
|
|
492
|
+
if (isString(languageOrDatatype)) {
|
|
493
|
+
return new Literal(value, rdfLangString, languageOrDatatype.toLowerCase());
|
|
494
|
+
}
|
|
495
|
+
if ('language' in languageOrDatatype) {
|
|
496
|
+
const language = languageOrDatatype.language.toLowerCase();
|
|
497
|
+
return languageOrDatatype.direction === undefined
|
|
498
|
+
? new Literal(value, rdfLangString, language)
|
|
499
|
+
: new Literal(value, rdfDirLangString, language, languageOrDatatype.direction);
|
|
500
|
+
}
|
|
501
|
+
if (
|
|
502
|
+
languageOrDatatype.value === RDF_LANG_STRING ||
|
|
503
|
+
languageOrDatatype.value === RDF_DIR_LANG_STRING
|
|
504
|
+
) {
|
|
505
|
+
// A language-tagged datatype without a language tag is invalid; keep the
|
|
506
|
+
// lexical form but fall back to a plain string.
|
|
507
|
+
return new Literal(value, xsdString);
|
|
508
|
+
}
|
|
509
|
+
return new Literal(value, languageOrDatatype);
|
|
510
|
+
};
|
|
511
|
+
|
|
512
|
+
/**
|
|
513
|
+
* Creates a triple (and triple term).
|
|
514
|
+
*
|
|
515
|
+
* @since 0.1.0
|
|
516
|
+
* @category constructors
|
|
517
|
+
*/
|
|
518
|
+
export const triple = <S extends Subject, P extends Predicate, O extends Object>(
|
|
519
|
+
subject: S,
|
|
520
|
+
predicate: P,
|
|
521
|
+
object: O,
|
|
522
|
+
): Triple<S, P, O> => new Triple(subject, predicate, object);
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* Creates a quad. The graph defaults to the default graph.
|
|
526
|
+
*
|
|
527
|
+
* @since 0.1.0
|
|
528
|
+
* @category constructors
|
|
529
|
+
*/
|
|
530
|
+
export function quad<S extends Subject, P extends Predicate, O extends Object>(
|
|
531
|
+
subject: S,
|
|
532
|
+
predicate: P,
|
|
533
|
+
object: O,
|
|
534
|
+
): Quad<S, P, O, DefaultGraph>;
|
|
535
|
+
export function quad<S extends Subject, P extends Predicate, O extends Object, G extends Graph>(
|
|
536
|
+
subject: S,
|
|
537
|
+
predicate: P,
|
|
538
|
+
object: O,
|
|
539
|
+
graph: G,
|
|
540
|
+
): Quad<S, P, O, G>;
|
|
541
|
+
export function quad(
|
|
542
|
+
subject: Subject,
|
|
543
|
+
predicate: Predicate,
|
|
544
|
+
object: Object,
|
|
545
|
+
graph: Graph = defaultGraph,
|
|
546
|
+
): Quad {
|
|
547
|
+
return new Quad(subject, predicate, object, graph);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/**
|
|
551
|
+
* Converts a triple to a quad in the given graph (default graph when omitted).
|
|
552
|
+
*
|
|
553
|
+
* @since 0.1.0
|
|
554
|
+
* @category constructors
|
|
555
|
+
*/
|
|
556
|
+
export const toQuad = <
|
|
557
|
+
S extends Subject,
|
|
558
|
+
P extends Predicate,
|
|
559
|
+
O extends Object,
|
|
560
|
+
G extends Graph = DefaultGraph,
|
|
561
|
+
>(
|
|
562
|
+
self: Triple<S, P, O>,
|
|
563
|
+
graph?: G,
|
|
564
|
+
): Quad<S, P, O, G> =>
|
|
565
|
+
// SAFETY: `G` defaults to the default graph type when no graph is given.
|
|
566
|
+
new Quad(self.subject, self.predicate, self.object, (graph ?? defaultGraph) as G);
|
|
567
|
+
|
|
568
|
+
// -----------------------------------------------------------------------------
|
|
569
|
+
// Guards
|
|
570
|
+
// -----------------------------------------------------------------------------
|
|
571
|
+
|
|
572
|
+
/**
|
|
573
|
+
* @since 0.1.0
|
|
574
|
+
* @category guards
|
|
575
|
+
*/
|
|
576
|
+
export const isTerm = (u: unknown): u is Term => hasProperty(u, TypeId);
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* @since 0.1.0
|
|
580
|
+
* @category guards
|
|
581
|
+
*/
|
|
582
|
+
export const isNamedNode = (u: unknown): u is NamedNode => isTerm(u) && isTagged(u, 'NamedNode');
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* @since 0.1.0
|
|
586
|
+
* @category guards
|
|
587
|
+
*/
|
|
588
|
+
export const isBlankNode = (u: unknown): u is BlankNode => isTerm(u) && isTagged(u, 'BlankNode');
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* @since 0.1.0
|
|
592
|
+
* @category guards
|
|
593
|
+
*/
|
|
594
|
+
export const isLiteral = (u: unknown): u is Literal => isTerm(u) && isTagged(u, 'Literal');
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* @since 0.1.0
|
|
598
|
+
* @category guards
|
|
599
|
+
*/
|
|
600
|
+
export const isVariable = (u: unknown): u is Variable => isTerm(u) && isTagged(u, 'Variable');
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* @since 0.1.0
|
|
604
|
+
* @category guards
|
|
605
|
+
*/
|
|
606
|
+
export const isDefaultGraph = (u: unknown): u is DefaultGraph =>
|
|
607
|
+
isTerm(u) && isTagged(u, 'DefaultGraph');
|
|
608
|
+
|
|
609
|
+
/**
|
|
610
|
+
* @since 0.1.0
|
|
611
|
+
* @category guards
|
|
612
|
+
*/
|
|
613
|
+
export const isTriple = (u: unknown): u is Triple => isTerm(u) && isTagged(u, 'Triple');
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* @since 0.1.0
|
|
617
|
+
* @category guards
|
|
618
|
+
*/
|
|
619
|
+
export const isQuad = (u: unknown): u is Quad => u instanceof Quad;
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* @since 0.1.0
|
|
623
|
+
* @category guards
|
|
624
|
+
*/
|
|
625
|
+
export const isResource = (u: unknown): u is Resource => isNamedNode(u) || isBlankNode(u);
|
|
626
|
+
|
|
627
|
+
/**
|
|
628
|
+
* @since 0.1.0
|
|
629
|
+
* @category guards
|
|
630
|
+
*/
|
|
631
|
+
export const isSubject = (u: unknown): u is Subject =>
|
|
632
|
+
isNamedNode(u) || isBlankNode(u) || isTriple(u);
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* @since 0.1.0
|
|
636
|
+
* @category guards
|
|
637
|
+
*/
|
|
638
|
+
export const isObject = (u: unknown): u is Object =>
|
|
639
|
+
isNamedNode(u) || isBlankNode(u) || isLiteral(u) || isTriple(u);
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* @since 0.1.0
|
|
643
|
+
* @category guards
|
|
644
|
+
*/
|
|
645
|
+
export const isGraph = (u: unknown): u is Graph =>
|
|
646
|
+
isNamedNode(u) || isBlankNode(u) || isDefaultGraph(u);
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* @since 0.1.0
|
|
650
|
+
* @category guards
|
|
651
|
+
*/
|
|
652
|
+
export const isGroundTerm = (u: unknown): u is GroundTerm =>
|
|
653
|
+
isNamedNode(u) || isBlankNode(u) || isLiteral(u) || isTriple(u);
|
|
654
|
+
|
|
655
|
+
/**
|
|
656
|
+
* Whether a literal is a (possibly directional) language-tagged string.
|
|
657
|
+
*
|
|
658
|
+
* @since 0.1.0
|
|
659
|
+
* @category guards
|
|
660
|
+
*/
|
|
661
|
+
export const isLanguageTagged = (self: Literal): boolean => self.language !== '';
|
|
662
|
+
|
|
663
|
+
// Built once: `hasBlankNodes` runs for every term of every quad a dataset or comparison visits.
|
|
664
|
+
const blankNodesIn: (self: Term | Quad) => boolean = Match.type<Term | Quad>().pipe(
|
|
665
|
+
Match.tag('BlankNode', () => true),
|
|
666
|
+
Match.tag('Triple', (self) => hasBlankNodes(self.subject) || hasBlankNodes(self.object)),
|
|
667
|
+
Match.tag(
|
|
668
|
+
'Quad',
|
|
669
|
+
(self) =>
|
|
670
|
+
hasBlankNodes(self.subject) || hasBlankNodes(self.object) || hasBlankNodes(self.graph),
|
|
671
|
+
),
|
|
672
|
+
Match.orElse(() => false),
|
|
673
|
+
);
|
|
674
|
+
|
|
675
|
+
/**
|
|
676
|
+
* Whether a triple or quad mentions a blank node anywhere, including inside
|
|
677
|
+
* nested triple terms.
|
|
678
|
+
*
|
|
679
|
+
* @since 0.1.0
|
|
680
|
+
* @category predicates
|
|
681
|
+
*/
|
|
682
|
+
export const hasBlankNodes = (self: Term | Quad): boolean => blankNodesIn(self);
|
|
683
|
+
|
|
684
|
+
// Built once: `isGround` runs for every term of every pattern or quad it checks.
|
|
685
|
+
const groundCheck: (self: Term | Quad) => boolean = Match.type<Term | Quad>().pipe(
|
|
686
|
+
Match.tag('Variable', () => false),
|
|
687
|
+
Match.tag(
|
|
688
|
+
'Triple',
|
|
689
|
+
(self) => isGround(self.subject) && isGround(self.predicate) && isGround(self.object),
|
|
690
|
+
),
|
|
691
|
+
Match.tag(
|
|
692
|
+
'Quad',
|
|
693
|
+
(self) =>
|
|
694
|
+
isGround(self.subject) &&
|
|
695
|
+
isGround(self.predicate) &&
|
|
696
|
+
isGround(self.object) &&
|
|
697
|
+
isGround(self.graph),
|
|
698
|
+
),
|
|
699
|
+
Match.orElse(() => true),
|
|
700
|
+
);
|
|
701
|
+
|
|
702
|
+
/**
|
|
703
|
+
* Whether a term or quad is free of variables.
|
|
704
|
+
*
|
|
705
|
+
* @since 0.1.0
|
|
706
|
+
* @category predicates
|
|
707
|
+
*/
|
|
708
|
+
export const isGround = (self: Term | Quad): boolean => groundCheck(self);
|
|
709
|
+
|
|
710
|
+
// -----------------------------------------------------------------------------
|
|
711
|
+
// Utilities
|
|
712
|
+
// -----------------------------------------------------------------------------
|
|
713
|
+
|
|
714
|
+
/**
|
|
715
|
+
* Applies `f` to every term in a quad or triple term (recursively through
|
|
716
|
+
* nested triple terms). `f` maps each term to one of the same kind; a
|
|
717
|
+
* result that cannot stand in its position (a literal for a subject, say)
|
|
718
|
+
* leaves the original term there.
|
|
719
|
+
*
|
|
720
|
+
* @since 0.1.0
|
|
721
|
+
* @category combinators
|
|
722
|
+
*/
|
|
723
|
+
export function mapTerms<T extends Quad | Triple>(
|
|
724
|
+
self: T,
|
|
725
|
+
f: (term: NamedNode | BlankNode | Literal | DefaultGraph) => Term,
|
|
726
|
+
): T;
|
|
727
|
+
export function mapTerms(
|
|
728
|
+
self: Quad | Triple,
|
|
729
|
+
f: (term: NamedNode | BlankNode | Literal | DefaultGraph) => Term,
|
|
730
|
+
): Quad | Triple {
|
|
731
|
+
// `f` is to map each leaf to a term of the same kind; a result that cannot stand in its
|
|
732
|
+
// position leaves the term there as it was. A statement whose terms all map to themselves is
|
|
733
|
+
// returned as it is (with its key, if computed).
|
|
734
|
+
const go = (term: Subject | Predicate | Object | Graph): Term =>
|
|
735
|
+
isTripleTerm(term) ? goTriple(term) : f(term);
|
|
736
|
+
const goTriple = (term: Triple): Triple => {
|
|
737
|
+
const s = subjectOr(go(term.subject), term.subject);
|
|
738
|
+
const p = predicateOr(go(term.predicate), term.predicate);
|
|
739
|
+
const o = objectOr(go(term.object), term.object);
|
|
740
|
+
return s === term.subject && p === term.predicate && o === term.object
|
|
741
|
+
? term
|
|
742
|
+
: new Triple(s, p, o);
|
|
743
|
+
};
|
|
744
|
+
if (isTripleTerm(self)) return goTriple(self);
|
|
745
|
+
const s = subjectOr(go(self.subject), self.subject);
|
|
746
|
+
const p = predicateOr(go(self.predicate), self.predicate);
|
|
747
|
+
const o = objectOr(go(self.object), self.object);
|
|
748
|
+
const g = graphOr(go(self.graph), self.graph);
|
|
749
|
+
return s === self.subject && p === self.predicate && o === self.object && g === self.graph
|
|
750
|
+
? self
|
|
751
|
+
: new Quad(s, p, o, g);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
const isTripleTerm = (t: Term | Quad): t is Triple => isTagged(t, 'Triple');
|
|
755
|
+
const isResourceTerm = (t: Term): t is Resource =>
|
|
756
|
+
isTagged(t, 'NamedNode') || isTagged(t, 'BlankNode');
|
|
757
|
+
const subjectOr = (t: Term, fallback: Subject): Subject =>
|
|
758
|
+
isResourceTerm(t) || isTripleTerm(t) ? t : fallback;
|
|
759
|
+
const predicateOr = (t: Term, fallback: Predicate): Predicate =>
|
|
760
|
+
isTagged(t, 'NamedNode') ? t : fallback;
|
|
761
|
+
const objectOr = (t: Term, fallback: Object): Object =>
|
|
762
|
+
isResourceTerm(t) || isTripleTerm(t) || isTagged(t, 'Literal') ? t : fallback;
|
|
763
|
+
const graphOr = (t: Term, fallback: Graph): Graph =>
|
|
764
|
+
isResourceTerm(t) || isTagged(t, 'DefaultGraph') ? t : fallback;
|
|
765
|
+
|
|
766
|
+
/**
|
|
767
|
+
* A total ordering of terms suitable for deterministic serialisation:
|
|
768
|
+
* default graph < blank nodes < IRIs < literals < triple terms < variables,
|
|
769
|
+
* then by canonical key.
|
|
770
|
+
*
|
|
771
|
+
* @since 0.1.0
|
|
772
|
+
* @category ordering
|
|
773
|
+
*/
|
|
774
|
+
export const compare = (a: Term, b: Term): -1 | 0 | 1 => {
|
|
775
|
+
const ra = rank[a._tag];
|
|
776
|
+
const rb = rank[b._tag];
|
|
777
|
+
if (ra !== rb) return ra < rb ? -1 : 1;
|
|
778
|
+
return a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
|
|
779
|
+
};
|
|
780
|
+
|
|
781
|
+
const rank: Record<Term['_tag'], number> = {
|
|
782
|
+
DefaultGraph: 0,
|
|
783
|
+
BlankNode: 1,
|
|
784
|
+
NamedNode: 2,
|
|
785
|
+
Literal: 3,
|
|
786
|
+
Triple: 4,
|
|
787
|
+
Variable: 5,
|
|
788
|
+
};
|
|
789
|
+
|
|
790
|
+
/**
|
|
791
|
+
* Orders quads by graph, subject, predicate, object.
|
|
792
|
+
*
|
|
793
|
+
* @since 0.1.0
|
|
794
|
+
* @category ordering
|
|
795
|
+
*/
|
|
796
|
+
export const compareQuads = (a: Quad, b: Quad): -1 | 0 | 1 =>
|
|
797
|
+
compare(a.graph, b.graph) ||
|
|
798
|
+
compare(a.subject, b.subject) ||
|
|
799
|
+
compare(a.predicate, b.predicate) ||
|
|
800
|
+
compare(a.object, b.object);
|
|
801
|
+
|
|
802
|
+
/**
|
|
803
|
+
* The `compare` ordering of terms as an Effect `Order`, for `Array.sort`,
|
|
804
|
+
* `Order.mapInput` and the other `Order` combinators.
|
|
805
|
+
*
|
|
806
|
+
* @since 0.1.0
|
|
807
|
+
* @category ordering
|
|
808
|
+
*/
|
|
809
|
+
export const Order: order.Order<Term> = order.make(compare);
|
|
810
|
+
|
|
811
|
+
/**
|
|
812
|
+
* The `compareQuads` ordering (graph, subject, predicate, object) as an
|
|
813
|
+
* Effect `Order`.
|
|
814
|
+
*
|
|
815
|
+
* @since 0.1.0
|
|
816
|
+
* @category ordering
|
|
817
|
+
*/
|
|
818
|
+
export const QuadOrder: order.Order<Quad> = order.make(compareQuads);
|
|
819
|
+
|
|
820
|
+
/**
|
|
821
|
+
* Term equality as an Effect `Equivalence`: the same as `Equal.equals`
|
|
822
|
+
* (equal canonical keys).
|
|
823
|
+
*
|
|
824
|
+
* @since 0.1.0
|
|
825
|
+
* @category equivalence
|
|
826
|
+
*/
|
|
827
|
+
export const Equivalence: equivalence.Equivalence<Term> = equivalence.make(
|
|
828
|
+
(a, b) => a.key === b.key,
|
|
829
|
+
);
|
|
830
|
+
|
|
831
|
+
/**
|
|
832
|
+
* Quad equality as an Effect `Equivalence`: the same as `Equal.equals`.
|
|
833
|
+
*
|
|
834
|
+
* @since 0.1.0
|
|
835
|
+
* @category equivalence
|
|
836
|
+
*/
|
|
837
|
+
export const QuadEquivalence: equivalence.Equivalence<Quad> = equivalence.make(
|
|
838
|
+
(a, b) => a.key === b.key,
|
|
839
|
+
);
|
|
840
|
+
|
|
841
|
+
// -----------------------------------------------------------------------------
|
|
842
|
+
// Escaping
|
|
843
|
+
// -----------------------------------------------------------------------------
|
|
844
|
+
|
|
845
|
+
// Built once: `escapeString` runs it for every character of a string that needs escaping.
|
|
846
|
+
const escapeChar: (ch: string) => string = Match.type<string>().pipe(
|
|
847
|
+
Match.when('"', () => '\\"'),
|
|
848
|
+
Match.when('\\', () => '\\\\'),
|
|
849
|
+
Match.when('\n', () => '\\n'),
|
|
850
|
+
Match.when('\r', () => '\\r'),
|
|
851
|
+
Match.when('\t', () => '\\t'),
|
|
852
|
+
Match.when('\b', () => '\\b'),
|
|
853
|
+
Match.when('\f', () => '\\f'),
|
|
854
|
+
Match.orElse((ch) => {
|
|
855
|
+
const code = ch.codePointAt(0) ?? 0;
|
|
856
|
+
return code < 0x20 || code === 0x7f || code === 0xfffe || code === 0xffff
|
|
857
|
+
? `\\u${code.toString(16).toUpperCase().padStart(4, '0')}`
|
|
858
|
+
: ch;
|
|
859
|
+
}),
|
|
860
|
+
);
|
|
861
|
+
|
|
862
|
+
/**
|
|
863
|
+
* Escapes a string for use inside a double-quoted N-Triples / Turtle string
|
|
864
|
+
* literal, using the canonical N-Triples escapes.
|
|
865
|
+
*
|
|
866
|
+
* @since 0.1.0
|
|
867
|
+
* @category formatting
|
|
868
|
+
*/
|
|
869
|
+
export const escapeString = (value: string): string => {
|
|
870
|
+
// eslint-disable-next-line no-control-regex
|
|
871
|
+
if (!/["\\\u0000-\u001f\u007f\ufffe\uffff]/.test(value)) return value;
|
|
872
|
+
// By code point, as `for … of` iterates a string
|
|
873
|
+
return value.replace(/[\s\S]/gu, (ch) => escapeChar(ch));
|
|
874
|
+
};
|
|
875
|
+
|
|
876
|
+
// The characters an IRIREF cannot contain unescaped, hoisted so the hot
|
|
877
|
+
// `NamedNode.key` path does not build a regex per call. `replace` resets the
|
|
878
|
+
// global one's `lastIndex`, and `test` on the non-global one keeps no state.
|
|
879
|
+
// eslint-disable-next-line no-control-regex
|
|
880
|
+
const IRI_UNSAFE = /[\u0000- <>"{}|^`\\]/;
|
|
881
|
+
// eslint-disable-next-line no-control-regex
|
|
882
|
+
const IRI_UNSAFE_ALL = /[\u0000- <>"{}|^`\\]/g;
|
|
883
|
+
|
|
884
|
+
/**
|
|
885
|
+
* Escapes characters that are not allowed inside `<...>` IRI references.
|
|
886
|
+
*
|
|
887
|
+
* @since 0.1.0
|
|
888
|
+
* @category formatting
|
|
889
|
+
*/
|
|
890
|
+
export const escapeIri = (value: string): string =>
|
|
891
|
+
IRI_UNSAFE.test(value)
|
|
892
|
+
? value.replace(
|
|
893
|
+
IRI_UNSAFE_ALL,
|
|
894
|
+
(ch) => `\\u${ch.charCodeAt(0).toString(16).toUpperCase().padStart(4, '0')}`,
|
|
895
|
+
)
|
|
896
|
+
: value;
|
|
897
|
+
|
|
898
|
+
// -----------------------------------------------------------------------------
|
|
899
|
+
// JSON
|
|
900
|
+
// -----------------------------------------------------------------------------
|
|
901
|
+
|
|
902
|
+
const namedNodeToJson = (n: NamedNode): TermJson.NamedNode => ({ type: 'uri', value: n.value });
|
|
903
|
+
|
|
904
|
+
const blankNodeToJson = (b: BlankNode): TermJson.BlankNode => ({ type: 'bnode', value: b.value });
|
|
905
|
+
|
|
906
|
+
const resourceToJson: (r: Resource) => TermJson.NamedNode | TermJson.BlankNode =
|
|
907
|
+
Match.type<Resource>().pipe(
|
|
908
|
+
Match.tag('NamedNode', namedNodeToJson),
|
|
909
|
+
Match.tag('BlankNode', blankNodeToJson),
|
|
910
|
+
Match.exhaustive,
|
|
911
|
+
);
|
|
912
|
+
|
|
913
|
+
const literalToJson = (l: Literal): TermJson.Literal => {
|
|
914
|
+
if (l.language !== '') {
|
|
915
|
+
return l.direction === undefined
|
|
916
|
+
? { type: 'literal', value: l.value, 'xml:lang': l.language }
|
|
917
|
+
: { type: 'literal', value: l.value, 'xml:lang': l.language, 'its:dir': l.direction };
|
|
918
|
+
}
|
|
919
|
+
return l.datatype.value === XSD_STRING
|
|
920
|
+
? { type: 'literal', value: l.value }
|
|
921
|
+
: { type: 'literal', value: l.value, datatype: l.datatype.value };
|
|
922
|
+
};
|
|
923
|
+
|
|
924
|
+
const tripleToJson = (x: Triple): TermJson.Triple => ({
|
|
925
|
+
type: 'triple',
|
|
926
|
+
value: {
|
|
927
|
+
subject: toJson(x.subject),
|
|
928
|
+
predicate: namedNodeToJson(x.predicate),
|
|
929
|
+
object: toJson(x.object),
|
|
930
|
+
},
|
|
931
|
+
});
|
|
932
|
+
|
|
933
|
+
const variableToJson = (v: Variable): TermJson.Variable => ({ type: 'variable', value: v.value });
|
|
934
|
+
|
|
935
|
+
const defaultGraphToJson = (): TermJson.DefaultGraph => ({ type: 'default-graph' });
|
|
936
|
+
|
|
937
|
+
// Built once: `toJson` runs for every term a JSON codec or SPARQL results writer encodes.
|
|
938
|
+
const groundToJson: (self: GroundTerm) => TermJson.GroundTerm = Match.type<GroundTerm>().pipe(
|
|
939
|
+
Match.tag('NamedNode', namedNodeToJson),
|
|
940
|
+
Match.tag('BlankNode', blankNodeToJson),
|
|
941
|
+
Match.tag('Literal', literalToJson),
|
|
942
|
+
Match.tag('Triple', tripleToJson),
|
|
943
|
+
Match.exhaustive,
|
|
944
|
+
);
|
|
945
|
+
|
|
946
|
+
const termToJson: (self: Term) => TermJson.Term = Match.type<Term>().pipe(
|
|
947
|
+
Match.tag('Variable', variableToJson),
|
|
948
|
+
Match.tag('DefaultGraph', defaultGraphToJson),
|
|
949
|
+
Match.orElse(groundToJson),
|
|
950
|
+
);
|
|
951
|
+
|
|
952
|
+
/**
|
|
953
|
+
* Encodes a term as JSON: the SPARQL 1.2 JSON results term for a ground term,
|
|
954
|
+
* plus the `variable` and `default-graph` extensions (see `TermJson`).
|
|
955
|
+
*
|
|
956
|
+
* @since 0.1.0
|
|
957
|
+
* @category json
|
|
958
|
+
*/
|
|
959
|
+
export function toJson(self: GroundTerm): TermJson.GroundTerm;
|
|
960
|
+
export function toJson(self: Term): TermJson.Term;
|
|
961
|
+
export function toJson(self: Term): TermJson.Term {
|
|
962
|
+
return termToJson(self);
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
const literalFromJson = (l: TermJson.Literal): Literal => {
|
|
966
|
+
const lang = l['xml:lang'];
|
|
967
|
+
if (lang !== undefined && lang !== '') {
|
|
968
|
+
const dir = l['its:dir'];
|
|
969
|
+
return dir === 'ltr' || dir === 'rtl'
|
|
970
|
+
? literal(l.value, { language: lang, direction: dir })
|
|
971
|
+
: literal(l.value, lang);
|
|
972
|
+
}
|
|
973
|
+
return l.datatype === undefined ? literal(l.value) : literal(l.value, namedNode(l.datatype));
|
|
974
|
+
};
|
|
975
|
+
|
|
976
|
+
const tripleFromJson = (x: TermJson.Triple): Triple =>
|
|
977
|
+
// SAFETY: unchecked, as in SPARQL JSON results; `isWellFormed` (and the JSON codecs) check
|
|
978
|
+
// that the positions hold a subject, an IRI predicate and an object.
|
|
979
|
+
new Triple(
|
|
980
|
+
fromJson(x.value.subject) as Subject,
|
|
981
|
+
fromJson(x.value.predicate) as Predicate,
|
|
982
|
+
fromJson(x.value.object),
|
|
983
|
+
);
|
|
984
|
+
|
|
985
|
+
const groundFromJson: (json: TermJson.GroundTerm) => GroundTerm =
|
|
986
|
+
Match.type<TermJson.GroundTerm>().pipe(
|
|
987
|
+
Match.when({ type: 'uri' }, (u): GroundTerm => namedNode(u.value)),
|
|
988
|
+
Match.when({ type: 'bnode' }, (b): GroundTerm => blankNode(b.value)),
|
|
989
|
+
Match.when({ type: Match.is('literal', 'typed-literal') }, literalFromJson),
|
|
990
|
+
Match.when({ type: 'triple' }, tripleFromJson),
|
|
991
|
+
Match.exhaustive,
|
|
992
|
+
);
|
|
993
|
+
|
|
994
|
+
// Built once: `fromJson` runs for every term of every JSON row it decodes.
|
|
995
|
+
const termFromJson: (json: TermJson.Term) => Term = Match.type<TermJson.Term>().pipe(
|
|
996
|
+
Match.when({ type: 'variable' }, (v): Term => variable(v.value)),
|
|
997
|
+
Match.when({ type: 'default-graph' }, (): Term => defaultGraph),
|
|
998
|
+
Match.orElse(groundFromJson),
|
|
999
|
+
);
|
|
1000
|
+
|
|
1001
|
+
/**
|
|
1002
|
+
* Decodes a JSON term (see `TermJson`). Like a SPARQL JSON results reader,
|
|
1003
|
+
* it trusts the positions of a triple term; use `isWellFormed`, or decode
|
|
1004
|
+
* through `Schema.toCodecJson(TermSchema)`, to check them.
|
|
1005
|
+
*
|
|
1006
|
+
* @since 0.1.0
|
|
1007
|
+
* @category json
|
|
1008
|
+
*/
|
|
1009
|
+
export function fromJson(json: TermJson.GroundTerm): GroundTerm;
|
|
1010
|
+
export function fromJson(json: TermJson.Term): Term;
|
|
1011
|
+
export function fromJson(json: TermJson.Term): Term {
|
|
1012
|
+
return termFromJson(json);
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
const subjectToJson: (s: Subject) => TermJson.Quad['subject'] = Match.type<Subject>().pipe(
|
|
1016
|
+
Match.tag('Triple', tripleToJson),
|
|
1017
|
+
Match.orElse(resourceToJson),
|
|
1018
|
+
);
|
|
1019
|
+
|
|
1020
|
+
/**
|
|
1021
|
+
* Encodes a quad as JSON; `graph` is omitted for the default graph.
|
|
1022
|
+
*
|
|
1023
|
+
* @since 0.1.0
|
|
1024
|
+
* @category json
|
|
1025
|
+
*/
|
|
1026
|
+
export const quadToJson = (self: Quad): TermJson.Quad => {
|
|
1027
|
+
const subject = subjectToJson(self.subject);
|
|
1028
|
+
const predicate = namedNodeToJson(self.predicate);
|
|
1029
|
+
const object = groundToJson(self.object);
|
|
1030
|
+
return Match.value(self.graph).pipe(
|
|
1031
|
+
Match.tag('DefaultGraph', (): TermJson.Quad => ({ subject, predicate, object })),
|
|
1032
|
+
Match.orElse((graph): TermJson.Quad => ({
|
|
1033
|
+
subject,
|
|
1034
|
+
predicate,
|
|
1035
|
+
object,
|
|
1036
|
+
graph: resourceToJson(graph),
|
|
1037
|
+
})),
|
|
1038
|
+
);
|
|
1039
|
+
};
|
|
1040
|
+
|
|
1041
|
+
const resourceFromJson = (json: TermJson.NamedNode | TermJson.BlankNode): Resource =>
|
|
1042
|
+
json.type === 'uri' ? namedNode(json.value) : blankNode(json.value);
|
|
1043
|
+
|
|
1044
|
+
/**
|
|
1045
|
+
* Decodes a JSON quad; a missing `graph` is the default graph. Triple terms
|
|
1046
|
+
* are trusted as in `fromJson`.
|
|
1047
|
+
*
|
|
1048
|
+
* @since 0.1.0
|
|
1049
|
+
* @category json
|
|
1050
|
+
*/
|
|
1051
|
+
export const quadFromJson = (json: TermJson.Quad): Quad =>
|
|
1052
|
+
new Quad(
|
|
1053
|
+
json.subject.type === 'triple' ? tripleFromJson(json.subject) : resourceFromJson(json.subject),
|
|
1054
|
+
namedNode(json.predicate.value),
|
|
1055
|
+
groundFromJson(json.object),
|
|
1056
|
+
json.graph === undefined ? defaultGraph : resourceFromJson(json.graph),
|
|
1057
|
+
);
|
|
1058
|
+
|
|
1059
|
+
/**
|
|
1060
|
+
* Whether every triple term inside a term or quad, at any depth, has a
|
|
1061
|
+
* subject (IRI, blank node or triple term), an IRI predicate and an object
|
|
1062
|
+
* (anything but a variable or the default graph) — always true for terms
|
|
1063
|
+
* built with `triple` and `quad`.
|
|
1064
|
+
*
|
|
1065
|
+
* @since 0.1.0
|
|
1066
|
+
* @category predicates
|
|
1067
|
+
*/
|
|
1068
|
+
export const isWellFormed = (self: Term | Quad): boolean => wellFormedCheck(self);
|
|
1069
|
+
|
|
1070
|
+
// Built once: the JSON codecs run it on every term and quad they decode.
|
|
1071
|
+
const wellFormedCheck: (self: Term | Quad) => boolean = Match.type<Term | Quad>().pipe(
|
|
1072
|
+
Match.tag('Quad', (q) => isWellFormed(q.subject) && isWellFormed(q.object)),
|
|
1073
|
+
Match.tag(
|
|
1074
|
+
'Triple',
|
|
1075
|
+
(x) =>
|
|
1076
|
+
isSubject(x.subject) &&
|
|
1077
|
+
isNamedNode(x.predicate) &&
|
|
1078
|
+
isObject(x.object) &&
|
|
1079
|
+
isWellFormed(x.subject) &&
|
|
1080
|
+
isWellFormed(x.object),
|
|
1081
|
+
),
|
|
1082
|
+
Match.orElse(() => true),
|
|
1083
|
+
);
|
|
1084
|
+
|
|
1085
|
+
/**
|
|
1086
|
+
* The `toCodecJson` (and `toCodecArbitrary`) link of a term declaration, to a
|
|
1087
|
+
* `TermJson`-shaped schema: decodes through `fromJson` and fails unless the
|
|
1088
|
+
* result is the declared kind and well formed.
|
|
1089
|
+
*/
|
|
1090
|
+
const jsonLink =
|
|
1091
|
+
<T extends Term, J extends TermJson.Term>(
|
|
1092
|
+
json: Schema.Codec<J>,
|
|
1093
|
+
is: (term: Term) => term is T,
|
|
1094
|
+
encode: (term: T) => J,
|
|
1095
|
+
expected: string,
|
|
1096
|
+
) =>
|
|
1097
|
+
(): SchemaAST.Link =>
|
|
1098
|
+
Schema.link<T>()(
|
|
1099
|
+
json,
|
|
1100
|
+
SchemaTransformation.transformEffect<T, J>({
|
|
1101
|
+
decode: (j, options) => {
|
|
1102
|
+
const term = fromJson(j);
|
|
1103
|
+
return is(term) && isWellFormed(term)
|
|
1104
|
+
? Effect.succeed(term)
|
|
1105
|
+
: Effect.fail(new SchemaIssue.InvalidValue({ expected }, j, options));
|
|
1106
|
+
},
|
|
1107
|
+
encode: (term) => Effect.succeed(encode(term)),
|
|
1108
|
+
}),
|
|
1109
|
+
);
|
|
1110
|
+
|
|
1111
|
+
/** The `toCodecJson` / `toCodecArbitrary` link of `QuadSchema`. */
|
|
1112
|
+
const quadLink = (json: Schema.Codec<TermJson.Quad>) => (): SchemaAST.Link =>
|
|
1113
|
+
Schema.link<Quad>()(
|
|
1114
|
+
json,
|
|
1115
|
+
SchemaTransformation.transformEffect<Quad, TermJson.Quad>({
|
|
1116
|
+
decode: (j, options) => {
|
|
1117
|
+
const q = quadFromJson(j);
|
|
1118
|
+
return isWellFormed(q)
|
|
1119
|
+
? Effect.succeed(q)
|
|
1120
|
+
: Effect.fail(
|
|
1121
|
+
new SchemaIssue.InvalidValue({ expected: 'a well-formed quad' }, j, options),
|
|
1122
|
+
);
|
|
1123
|
+
},
|
|
1124
|
+
encode: (q) => Effect.succeed(quadToJson(q)),
|
|
1125
|
+
}),
|
|
1126
|
+
);
|
|
1127
|
+
|
|
1128
|
+
// -----------------------------------------------------------------------------
|
|
1129
|
+
// Schemas
|
|
1130
|
+
// -----------------------------------------------------------------------------
|
|
1131
|
+
|
|
1132
|
+
/**
|
|
1133
|
+
* Schema of an IRI term; its JSON codec is `TermJson.NamedNode`.
|
|
1134
|
+
*
|
|
1135
|
+
* @since 0.1.0
|
|
1136
|
+
* @category schemas
|
|
1137
|
+
*/
|
|
1138
|
+
export const NamedNodeSchema: Schema.declare<NamedNode> = Schema.declare(isNamedNode, {
|
|
1139
|
+
identifier: 'NamedNode',
|
|
1140
|
+
toCodecJson: jsonLink(TermJson.NamedNodeSchema, isNamedNode, namedNodeToJson, 'an IRI'),
|
|
1141
|
+
toCodecArbitrary: jsonLink(Generate.NamedNode, isNamedNode, namedNodeToJson, 'an IRI'),
|
|
1142
|
+
});
|
|
1143
|
+
|
|
1144
|
+
/**
|
|
1145
|
+
* The type `NamedNodeSchema` decodes to.
|
|
1146
|
+
*
|
|
1147
|
+
* @since 0.1.0
|
|
1148
|
+
* @category schemas
|
|
1149
|
+
*/
|
|
1150
|
+
export type NamedNodeSchema = typeof NamedNodeSchema.Type;
|
|
1151
|
+
|
|
1152
|
+
/**
|
|
1153
|
+
* Schema of a blank node; its JSON codec is `TermJson.BlankNode`.
|
|
1154
|
+
*
|
|
1155
|
+
* @since 0.1.0
|
|
1156
|
+
* @category schemas
|
|
1157
|
+
*/
|
|
1158
|
+
export const BlankNodeSchema: Schema.declare<BlankNode> = Schema.declare(isBlankNode, {
|
|
1159
|
+
identifier: 'BlankNode',
|
|
1160
|
+
toCodecJson: jsonLink(TermJson.BlankNodeSchema, isBlankNode, blankNodeToJson, 'a blank node'),
|
|
1161
|
+
toCodecArbitrary: jsonLink(Generate.BlankNode, isBlankNode, blankNodeToJson, 'a blank node'),
|
|
1162
|
+
});
|
|
1163
|
+
|
|
1164
|
+
/**
|
|
1165
|
+
* The type `BlankNodeSchema` decodes to.
|
|
1166
|
+
*
|
|
1167
|
+
* @since 0.1.0
|
|
1168
|
+
* @category schemas
|
|
1169
|
+
*/
|
|
1170
|
+
export type BlankNodeSchema = typeof BlankNodeSchema.Type;
|
|
1171
|
+
|
|
1172
|
+
/**
|
|
1173
|
+
* Schema of a literal; its JSON codec is `TermJson.Literal`.
|
|
1174
|
+
*
|
|
1175
|
+
* @since 0.1.0
|
|
1176
|
+
* @category schemas
|
|
1177
|
+
*/
|
|
1178
|
+
export const LiteralSchema: Schema.declare<Literal> = Schema.declare(isLiteral, {
|
|
1179
|
+
identifier: 'Literal',
|
|
1180
|
+
toCodecJson: jsonLink(TermJson.LiteralSchema, isLiteral, literalToJson, 'a literal'),
|
|
1181
|
+
toCodecArbitrary: jsonLink(Generate.Literal, isLiteral, literalToJson, 'a literal'),
|
|
1182
|
+
});
|
|
1183
|
+
|
|
1184
|
+
/**
|
|
1185
|
+
* The type `LiteralSchema` decodes to.
|
|
1186
|
+
*
|
|
1187
|
+
* @since 0.1.0
|
|
1188
|
+
* @category schemas
|
|
1189
|
+
*/
|
|
1190
|
+
export type LiteralSchema = typeof LiteralSchema.Type;
|
|
1191
|
+
|
|
1192
|
+
/**
|
|
1193
|
+
* Schema of a variable; its JSON codec is `TermJson.Variable`.
|
|
1194
|
+
*
|
|
1195
|
+
* @since 0.1.0
|
|
1196
|
+
* @category schemas
|
|
1197
|
+
*/
|
|
1198
|
+
export const VariableSchema: Schema.declare<Variable> = Schema.declare(isVariable, {
|
|
1199
|
+
identifier: 'Variable',
|
|
1200
|
+
toCodecJson: jsonLink(TermJson.VariableSchema, isVariable, variableToJson, 'a variable'),
|
|
1201
|
+
toCodecArbitrary: jsonLink(Generate.Variable, isVariable, variableToJson, 'a variable'),
|
|
1202
|
+
});
|
|
1203
|
+
|
|
1204
|
+
/**
|
|
1205
|
+
* The type `VariableSchema` decodes to.
|
|
1206
|
+
*
|
|
1207
|
+
* @since 0.1.0
|
|
1208
|
+
* @category schemas
|
|
1209
|
+
*/
|
|
1210
|
+
export type VariableSchema = typeof VariableSchema.Type;
|
|
1211
|
+
|
|
1212
|
+
/**
|
|
1213
|
+
* Schema of a triple term; its JSON codec is `TermJson.Triple`, and decoding rejects positions that don't fit RDF.
|
|
1214
|
+
*
|
|
1215
|
+
* @since 0.1.0
|
|
1216
|
+
* @category schemas
|
|
1217
|
+
*/
|
|
1218
|
+
export const TripleSchema: Schema.declare<Triple> = Schema.declare(isTriple, {
|
|
1219
|
+
identifier: 'Triple',
|
|
1220
|
+
toCodecJson: jsonLink(TermJson.TripleSchema, isTriple, tripleToJson, 'a well-formed triple term'),
|
|
1221
|
+
toCodecArbitrary: jsonLink(Generate.Triple, isTriple, tripleToJson, 'a well-formed triple term'),
|
|
1222
|
+
});
|
|
1223
|
+
|
|
1224
|
+
/**
|
|
1225
|
+
* The type `TripleSchema` decodes to.
|
|
1226
|
+
*
|
|
1227
|
+
* @since 0.1.0
|
|
1228
|
+
* @category schemas
|
|
1229
|
+
*/
|
|
1230
|
+
export type TripleSchema = typeof TripleSchema.Type;
|
|
1231
|
+
|
|
1232
|
+
/**
|
|
1233
|
+
* Schema of a quad; its JSON codec is `TermJson.Quad`, with `graph` omitted for the default graph.
|
|
1234
|
+
*
|
|
1235
|
+
* @since 0.1.0
|
|
1236
|
+
* @category schemas
|
|
1237
|
+
*/
|
|
1238
|
+
export const QuadSchema: Schema.declare<Quad> = Schema.declare(isQuad, {
|
|
1239
|
+
identifier: 'Quad',
|
|
1240
|
+
toCodecJson: quadLink(TermJson.QuadSchema),
|
|
1241
|
+
toCodecArbitrary: quadLink(Generate.Quad),
|
|
1242
|
+
});
|
|
1243
|
+
|
|
1244
|
+
/**
|
|
1245
|
+
* The type `QuadSchema` decodes to.
|
|
1246
|
+
*
|
|
1247
|
+
* @since 0.1.0
|
|
1248
|
+
* @category schemas
|
|
1249
|
+
*/
|
|
1250
|
+
export type QuadSchema = typeof QuadSchema.Type;
|
|
1251
|
+
|
|
1252
|
+
/**
|
|
1253
|
+
* Schema of any term; its JSON codec is `TermJson.Term`.
|
|
1254
|
+
*
|
|
1255
|
+
* @since 0.1.0
|
|
1256
|
+
* @category schemas
|
|
1257
|
+
*/
|
|
1258
|
+
export const TermSchema: Schema.declare<Term> = Schema.declare(isTerm, {
|
|
1259
|
+
identifier: 'Term',
|
|
1260
|
+
toCodecJson: jsonLink(TermJson.TermSchema, isTerm, termToJson, 'a well-formed term'),
|
|
1261
|
+
toCodecArbitrary: jsonLink(Generate.Term, isTerm, termToJson, 'a well-formed term'),
|
|
1262
|
+
});
|
|
1263
|
+
|
|
1264
|
+
/**
|
|
1265
|
+
* The type `TermSchema` decodes to.
|
|
1266
|
+
*
|
|
1267
|
+
* @since 0.1.0
|
|
1268
|
+
* @category schemas
|
|
1269
|
+
*/
|
|
1270
|
+
export type TermSchema = typeof TermSchema.Type;
|
|
1271
|
+
|
|
1272
|
+
/**
|
|
1273
|
+
* Schema of a ground term (no variables or default graph); its JSON codec is `TermJson.GroundTerm`.
|
|
1274
|
+
*
|
|
1275
|
+
* @since 0.1.0
|
|
1276
|
+
* @category schemas
|
|
1277
|
+
*/
|
|
1278
|
+
export const GroundTermSchema: Schema.declare<GroundTerm> = Schema.declare(isGroundTerm, {
|
|
1279
|
+
identifier: 'GroundTerm',
|
|
1280
|
+
toCodecJson: jsonLink(
|
|
1281
|
+
TermJson.GroundTermSchema,
|
|
1282
|
+
isGroundTerm,
|
|
1283
|
+
groundToJson,
|
|
1284
|
+
'a well-formed ground term',
|
|
1285
|
+
),
|
|
1286
|
+
toCodecArbitrary: jsonLink(
|
|
1287
|
+
Generate.GroundTerm,
|
|
1288
|
+
isGroundTerm,
|
|
1289
|
+
groundToJson,
|
|
1290
|
+
'a well-formed ground term',
|
|
1291
|
+
),
|
|
1292
|
+
});
|
|
1293
|
+
|
|
1294
|
+
/**
|
|
1295
|
+
* The type `GroundTermSchema` decodes to.
|
|
1296
|
+
*
|
|
1297
|
+
* @since 0.1.0
|
|
1298
|
+
* @category schemas
|
|
1299
|
+
*/
|
|
1300
|
+
export type GroundTermSchema = typeof GroundTermSchema.Type;
|