@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
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server configuration.
|
|
3
|
+
*
|
|
4
|
+
* @since 0.1.0
|
|
5
|
+
*/
|
|
6
|
+
import * as Duration from 'effect/Duration';
|
|
7
|
+
import * as Result from 'effect/Result';
|
|
8
|
+
import type * as HttpServerRequest from 'effect/http/HttpServerRequest';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* CORS settings.
|
|
12
|
+
*
|
|
13
|
+
* @since 0.1.0
|
|
14
|
+
* @category models
|
|
15
|
+
*/
|
|
16
|
+
export interface CorsOptions {
|
|
17
|
+
/** Allowed origins (default: any, `*`). */
|
|
18
|
+
readonly allowedOrigins?: ReadonlyArray<string> | undefined;
|
|
19
|
+
/** Allowed request headers (default: whatever the preflight asks for). */
|
|
20
|
+
readonly allowedHeaders?: ReadonlyArray<string> | undefined;
|
|
21
|
+
/** Response headers exposed to scripts. */
|
|
22
|
+
readonly exposedHeaders?: ReadonlyArray<string> | undefined;
|
|
23
|
+
/** Preflight cache duration in seconds. */
|
|
24
|
+
readonly maxAge?: number | undefined;
|
|
25
|
+
/** Whether to allow credentials. */
|
|
26
|
+
readonly credentials?: boolean | undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Server options. Every field is optional.
|
|
31
|
+
*
|
|
32
|
+
* @since 0.1.0
|
|
33
|
+
* @category models
|
|
34
|
+
*/
|
|
35
|
+
export interface Options {
|
|
36
|
+
/** Path of the SPARQL query endpoint (default `/sparql`). */
|
|
37
|
+
readonly path?: `/${string}` | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Path of the SPARQL update endpoint (default: the query endpoint, which
|
|
40
|
+
* then accepts both).
|
|
41
|
+
*/
|
|
42
|
+
readonly updatePath?: `/${string}` | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Path of the Graph Store Protocol endpoint (default `/rdf-graph-store`),
|
|
45
|
+
* or `false` to disable it. Graphs are identified indirectly with
|
|
46
|
+
* `?default` / `?graph=<iri>` on this path, or directly by any URL below it.
|
|
47
|
+
*/
|
|
48
|
+
readonly graphStorePath?: `/${string}` | false | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* The public origin of the server (e.g. `https://data.example.org`), used to
|
|
51
|
+
* build the request URLs that serve as base IRIs and as directly
|
|
52
|
+
* identified graph IRIs. Defaults to the request's `Host` header (and
|
|
53
|
+
* `X-Forwarded-Proto`).
|
|
54
|
+
*/
|
|
55
|
+
readonly baseUrl?: string | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* The base IRI for queries and updates. Defaults to the endpoint URL, as
|
|
58
|
+
* suggested by the protocol.
|
|
59
|
+
*/
|
|
60
|
+
readonly baseIri?: string | undefined;
|
|
61
|
+
/** Rejects updates and Graph Store writes (default `false`). */
|
|
62
|
+
readonly readOnly?: boolean | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Time limit for evaluating a query. A query that produces no result in
|
|
65
|
+
* time is answered with `503 Service Unavailable`; a streaming response
|
|
66
|
+
* that exceeds it is aborted.
|
|
67
|
+
*/
|
|
68
|
+
readonly queryTimeout?: Duration.Input | undefined;
|
|
69
|
+
/** Time limit for an update request (`503` when exceeded). */
|
|
70
|
+
readonly updateTimeout?: Duration.Input | undefined;
|
|
71
|
+
/** The maximum number of solutions or triples returned by a query. */
|
|
72
|
+
readonly maxResults?: number | undefined;
|
|
73
|
+
/** Enables CORS (`true` for permissive defaults). */
|
|
74
|
+
readonly cors?: boolean | CorsOptions | undefined;
|
|
75
|
+
/** Logs every request with Effect logging (default `false` for the handler). */
|
|
76
|
+
readonly logging?: boolean | undefined;
|
|
77
|
+
/** Serve a service description on `GET` without a query (default `true`). */
|
|
78
|
+
readonly serviceDescription?: boolean | undefined;
|
|
79
|
+
/** Advertised in the service description: `sd:UnionDefaultGraph`. */
|
|
80
|
+
readonly unionDefaultGraph?: boolean | undefined;
|
|
81
|
+
/** Advertised in the service description: `sd:BasicFederatedQuery`. */
|
|
82
|
+
readonly federation?: boolean | undefined;
|
|
83
|
+
/** Prefixes used when serialising graphs in syntaxes that support them. */
|
|
84
|
+
readonly prefixes?: Readonly<Record<string, string>> | undefined;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Options with defaults applied.
|
|
89
|
+
*
|
|
90
|
+
* @since 0.1.0
|
|
91
|
+
* @category models
|
|
92
|
+
*/
|
|
93
|
+
export interface Resolved {
|
|
94
|
+
readonly path: `/${string}`;
|
|
95
|
+
readonly updatePath: `/${string}`;
|
|
96
|
+
readonly graphStorePath: `/${string}` | undefined;
|
|
97
|
+
readonly baseUrl: string | undefined;
|
|
98
|
+
readonly baseIri: string | undefined;
|
|
99
|
+
readonly readOnly: boolean;
|
|
100
|
+
readonly queryTimeout: Duration.Duration | undefined;
|
|
101
|
+
readonly updateTimeout: Duration.Duration | undefined;
|
|
102
|
+
readonly maxResults: number | undefined;
|
|
103
|
+
readonly cors: CorsOptions | undefined;
|
|
104
|
+
readonly logging: boolean;
|
|
105
|
+
readonly serviceDescription: boolean;
|
|
106
|
+
readonly unionDefaultGraph: boolean;
|
|
107
|
+
readonly federation: boolean;
|
|
108
|
+
readonly prefixes: Readonly<Record<string, string>>;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Removes a trailing slash (but not the root's): the path still starts with `/`. */
|
|
112
|
+
const trimSlash = (path: `/${string}`): `/${string}` =>
|
|
113
|
+
path.length > 1 && path.endsWith('/') ? `/${path.slice(1, -1)}` : path;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Applies the defaults.
|
|
117
|
+
*
|
|
118
|
+
* @since 0.1.0
|
|
119
|
+
* @category constructors
|
|
120
|
+
*/
|
|
121
|
+
export const resolve = (options: Options = {}): Resolved => {
|
|
122
|
+
const path = trimSlash(options.path ?? '/sparql');
|
|
123
|
+
return {
|
|
124
|
+
path,
|
|
125
|
+
updatePath: trimSlash(options.updatePath ?? path),
|
|
126
|
+
graphStorePath:
|
|
127
|
+
options.graphStorePath === false
|
|
128
|
+
? undefined
|
|
129
|
+
: trimSlash(options.graphStorePath ?? '/rdf-graph-store'),
|
|
130
|
+
baseUrl: options.baseUrl,
|
|
131
|
+
baseIri: options.baseIri,
|
|
132
|
+
readOnly: options.readOnly ?? false,
|
|
133
|
+
queryTimeout:
|
|
134
|
+
options.queryTimeout === undefined
|
|
135
|
+
? undefined
|
|
136
|
+
: Duration.fromInputUnsafe(options.queryTimeout),
|
|
137
|
+
updateTimeout:
|
|
138
|
+
options.updateTimeout === undefined
|
|
139
|
+
? undefined
|
|
140
|
+
: Duration.fromInputUnsafe(options.updateTimeout),
|
|
141
|
+
maxResults: options.maxResults,
|
|
142
|
+
cors: options.cors === true ? {} : options.cors === false ? undefined : options.cors,
|
|
143
|
+
logging: options.logging ?? false,
|
|
144
|
+
serviceDescription: options.serviceDescription ?? true,
|
|
145
|
+
unionDefaultGraph: options.unionDefaultGraph ?? false,
|
|
146
|
+
federation: options.federation ?? false,
|
|
147
|
+
prefixes: options.prefixes ?? {},
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const stripTrailing = (path: string): string =>
|
|
152
|
+
path.length > 1 && path.endsWith('/') ? path.slice(0, -1) : path;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* The absolute URL of a request (without fragment), using `baseUrl`, the
|
|
156
|
+
* request's absolute URL, or its `Host` header.
|
|
157
|
+
*
|
|
158
|
+
* @since 0.1.0
|
|
159
|
+
* @category utils
|
|
160
|
+
*/
|
|
161
|
+
export const requestUrl = (
|
|
162
|
+
request: HttpServerRequest.HttpServerRequest,
|
|
163
|
+
options: Resolved,
|
|
164
|
+
): URL => {
|
|
165
|
+
const raw = request.originalUrl;
|
|
166
|
+
const parsed = new URL(raw, 'http://localhost');
|
|
167
|
+
if (options.baseUrl !== undefined) {
|
|
168
|
+
return new URL(parsed.pathname + parsed.search, options.baseUrl);
|
|
169
|
+
}
|
|
170
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(raw)) return parsed;
|
|
171
|
+
const host = request.headers['host'] ?? 'localhost';
|
|
172
|
+
const proto = ((request.headers['x-forwarded-proto'] ?? 'http').split(',', 1)[0] ?? '').trim();
|
|
173
|
+
return new URL(parsed.pathname + parsed.search, `${proto}://${host}`);
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* The path of a request URL, without query string and trailing slash.
|
|
178
|
+
*
|
|
179
|
+
* @since 0.1.0
|
|
180
|
+
* @category utils
|
|
181
|
+
*/
|
|
182
|
+
export const requestPath = (url: string): string => {
|
|
183
|
+
const pathname = new URL(url, 'http://localhost').pathname;
|
|
184
|
+
// A malformed percent-encoding is matched as written.
|
|
185
|
+
return stripTrailing(
|
|
186
|
+
Result.getOrElse(
|
|
187
|
+
Result.try(() => decodeURI(pathname)),
|
|
188
|
+
() => pathname,
|
|
189
|
+
),
|
|
190
|
+
);
|
|
191
|
+
};
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A complete parser for SPARQL 1.1 Query and Update, written with
|
|
3
|
+
* `@thomasfosterau/effect-parse` (see `internal/parser.ts`), including the SPARQL 1.2 additions (triple terms, reified triples,
|
|
4
|
+
* annotations, `VERSION`, directional language tags and the new built-in
|
|
5
|
+
* functions).
|
|
6
|
+
*
|
|
7
|
+
* The parser expands all abbreviations (prefixed names, relative IRIs,
|
|
8
|
+
* `a`, blank node property lists, collections, reifiers and annotations)
|
|
9
|
+
* and enforces the static constraints of the specification (blank node
|
|
10
|
+
* label scoping, grouping rules, `BIND`/`AS` scoping, `VALUES` arity,
|
|
11
|
+
* variable-free `INSERT DATA`, blank-node-free `DELETE` templates, …).
|
|
12
|
+
*
|
|
13
|
+
* @since 0.1.0
|
|
14
|
+
*/
|
|
15
|
+
import * as Effect from 'effect/Effect';
|
|
16
|
+
import * as Option from 'effect/Option';
|
|
17
|
+
import * as Result from 'effect/Result';
|
|
18
|
+
import * as Schema from 'effect/Schema';
|
|
19
|
+
import type * as Ast from './Ast.ts';
|
|
20
|
+
import * as Internal from './internal/parser.ts';
|
|
21
|
+
|
|
22
|
+
// -----------------------------------------------------------------------------
|
|
23
|
+
// Errors and options
|
|
24
|
+
// -----------------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A syntax (or static semantic) error in a SPARQL query or update.
|
|
28
|
+
*
|
|
29
|
+
* @since 0.1.0
|
|
30
|
+
* @category errors
|
|
31
|
+
*/
|
|
32
|
+
export class SparqlParseError extends Schema.TaggedError<SparqlParseError>()('SparqlParseError', {
|
|
33
|
+
message: Schema.String,
|
|
34
|
+
/** 1-based line of the error. */
|
|
35
|
+
line: Schema.Number,
|
|
36
|
+
/** 1-based column of the error. */
|
|
37
|
+
column: Schema.Number,
|
|
38
|
+
/** 0-based character offset of the error. */
|
|
39
|
+
offset: Schema.Number,
|
|
40
|
+
}) {}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @since 0.1.0
|
|
44
|
+
* @category models
|
|
45
|
+
*/
|
|
46
|
+
export interface ParseOptions {
|
|
47
|
+
/** The base IRI used to resolve relative IRIs (unless overridden by `BASE`). */
|
|
48
|
+
readonly baseIri?: string | undefined;
|
|
49
|
+
/** Prefixes available without declaration. */
|
|
50
|
+
readonly prefixes?: Readonly<Record<string, string>> | undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// -----------------------------------------------------------------------------
|
|
54
|
+
// Entry points
|
|
55
|
+
// -----------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
const position = (input: string, offset: number) => {
|
|
58
|
+
const before = input.slice(0, Math.max(0, Math.min(offset, input.length)));
|
|
59
|
+
const lineStart = before.lastIndexOf('\n') + 1;
|
|
60
|
+
return { line: before.split('\n').length, column: offset - lineStart + 1 };
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/** The base IRI and prefixes of `options`, as the internal parser takes them. */
|
|
64
|
+
const internalOptions = (
|
|
65
|
+
options?: ParseOptions,
|
|
66
|
+
): readonly [Option.Option<string>, Readonly<Record<string, string>>] => [
|
|
67
|
+
Option.fromUndefinedOr(options?.baseIri),
|
|
68
|
+
options?.prefixes ?? {},
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
const toError =
|
|
72
|
+
(input: string) =>
|
|
73
|
+
(e: Internal.Failure): SparqlParseError => {
|
|
74
|
+
const { line, column } = position(input, e.offset);
|
|
75
|
+
return new SparqlParseError({
|
|
76
|
+
message: `${e.message} (line ${line}, column ${column})`,
|
|
77
|
+
line,
|
|
78
|
+
column,
|
|
79
|
+
offset: e.offset,
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Parses a SPARQL query, returning a `Result`.
|
|
85
|
+
*
|
|
86
|
+
* @since 0.1.0
|
|
87
|
+
* @category parsing
|
|
88
|
+
*/
|
|
89
|
+
export const parseQueryResult = (
|
|
90
|
+
input: string,
|
|
91
|
+
options?: ParseOptions,
|
|
92
|
+
): Result.Result<Ast.Query, SparqlParseError> =>
|
|
93
|
+
Result.mapError(Internal.parseQuery(input, ...internalOptions(options)), toError(input));
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Parses a SPARQL update request, returning a `Result`.
|
|
97
|
+
*
|
|
98
|
+
* @since 0.1.0
|
|
99
|
+
* @category parsing
|
|
100
|
+
*/
|
|
101
|
+
export const parseUpdateResult = (
|
|
102
|
+
input: string,
|
|
103
|
+
options?: ParseOptions,
|
|
104
|
+
): Result.Result<Ast.Update, SparqlParseError> =>
|
|
105
|
+
Result.mapError(Internal.parseUpdate(input, ...internalOptions(options)), toError(input));
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Parses a SPARQL query.
|
|
109
|
+
*
|
|
110
|
+
* @since 0.1.0
|
|
111
|
+
* @category parsing
|
|
112
|
+
*/
|
|
113
|
+
export const parseQuery = (
|
|
114
|
+
input: string,
|
|
115
|
+
options?: ParseOptions,
|
|
116
|
+
): Effect.Effect<Ast.Query, SparqlParseError> =>
|
|
117
|
+
Effect.suspend(() => Effect.fromResult(parseQueryResult(input, options)));
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Parses a SPARQL update request.
|
|
121
|
+
*
|
|
122
|
+
* @since 0.1.0
|
|
123
|
+
* @category parsing
|
|
124
|
+
*/
|
|
125
|
+
export const parseUpdate = (
|
|
126
|
+
input: string,
|
|
127
|
+
options?: ParseOptions,
|
|
128
|
+
): Effect.Effect<Ast.Update, SparqlParseError> =>
|
|
129
|
+
Effect.suspend(() => Effect.fromResult(parseUpdateResult(input, options)));
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Parses either a query or an update request: the text is parsed as a query
|
|
133
|
+
* first and, if that fails, as an update.
|
|
134
|
+
*
|
|
135
|
+
* @since 0.1.0
|
|
136
|
+
* @category parsing
|
|
137
|
+
*/
|
|
138
|
+
export const parse = (
|
|
139
|
+
input: string,
|
|
140
|
+
options?: ParseOptions,
|
|
141
|
+
): Effect.Effect<Ast.Query | Ast.Update, SparqlParseError> =>
|
|
142
|
+
Effect.suspend((): Effect.Effect<Ast.Query | Ast.Update, SparqlParseError> => {
|
|
143
|
+
const q = parseQueryResult(input, options);
|
|
144
|
+
if (Result.isSuccess(q)) return Effect.succeed(q.success);
|
|
145
|
+
const u = parseUpdateResult(input, options);
|
|
146
|
+
if (Result.isSuccess(u)) return Effect.succeed(u.success);
|
|
147
|
+
// Report the error of the parse that got further.
|
|
148
|
+
return Effect.fail(q.failure.offset >= u.failure.offset ? q.failure : u.failure);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Parses a SPARQL query, throwing a `SparqlParseError` on failure.
|
|
153
|
+
*
|
|
154
|
+
* @since 0.1.0
|
|
155
|
+
* @category parsing
|
|
156
|
+
*/
|
|
157
|
+
export const parseQueryUnsafe = (input: string, options?: ParseOptions): Ast.Query => {
|
|
158
|
+
const r = parseQueryResult(input, options);
|
|
159
|
+
if (Result.isFailure(r)) throw r.failure;
|
|
160
|
+
return r.success;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Parses a SPARQL update request, throwing a `SparqlParseError` on failure.
|
|
165
|
+
*
|
|
166
|
+
* @since 0.1.0
|
|
167
|
+
* @category parsing
|
|
168
|
+
*/
|
|
169
|
+
export const parseUpdateUnsafe = (input: string, options?: ParseOptions): Ast.Update => {
|
|
170
|
+
const r = parseUpdateResult(input, options);
|
|
171
|
+
if (Result.isFailure(r)) throw r.failure;
|
|
172
|
+
return r.success;
|
|
173
|
+
};
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decoding of SPARQL 1.1 Protocol requests.
|
|
3
|
+
*
|
|
4
|
+
* A request to the SPARQL endpoint is one of
|
|
5
|
+
*
|
|
6
|
+
* - a query: `GET` with a `query` parameter, `POST` with an
|
|
7
|
+
* `application/x-www-form-urlencoded` body holding `query`, or `POST` with
|
|
8
|
+
* an `application/sparql-query` body;
|
|
9
|
+
* - an update: `POST` with an `application/x-www-form-urlencoded` body
|
|
10
|
+
* holding `update`, or `POST` with an `application/sparql-update` body;
|
|
11
|
+
* - a service description request: `GET` without `query`.
|
|
12
|
+
*
|
|
13
|
+
* The dataset parameters (`default-graph-uri` / `named-graph-uri` for
|
|
14
|
+
* queries, `using-graph-uri` / `using-named-graph-uri` for updates) come from
|
|
15
|
+
* the URL query string, and also from the body of a form request.
|
|
16
|
+
*
|
|
17
|
+
* @since 0.1.0
|
|
18
|
+
*/
|
|
19
|
+
import * as Match from 'effect/Match';
|
|
20
|
+
import * as Arr from 'effect/Array';
|
|
21
|
+
import * as Effect from 'effect/Effect';
|
|
22
|
+
import * as Option from 'effect/Option';
|
|
23
|
+
import type * as HttpServerRequest from 'effect/http/HttpServerRequest';
|
|
24
|
+
import * as Iri from '../Iri.ts';
|
|
25
|
+
import * as Term from '../Term.ts';
|
|
26
|
+
import type * as Store from './Store.ts';
|
|
27
|
+
import * as ProtocolErrors from './ProtocolErrors.ts';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The media type of a direct `POST` query body.
|
|
31
|
+
*
|
|
32
|
+
* @since 0.1.0
|
|
33
|
+
* @category media types
|
|
34
|
+
*/
|
|
35
|
+
export const SPARQL_QUERY = 'application/sparql-query';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The media type of a direct `POST` update body.
|
|
39
|
+
*
|
|
40
|
+
* @since 0.1.0
|
|
41
|
+
* @category media types
|
|
42
|
+
*/
|
|
43
|
+
export const SPARQL_UPDATE = 'application/sparql-update';
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The media type of form-encoded requests.
|
|
47
|
+
*
|
|
48
|
+
* @since 0.1.0
|
|
49
|
+
* @category media types
|
|
50
|
+
*/
|
|
51
|
+
export const FORM = 'application/x-www-form-urlencoded';
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A decoded protocol operation.
|
|
55
|
+
*
|
|
56
|
+
* @since 0.1.0
|
|
57
|
+
* @category models
|
|
58
|
+
*/
|
|
59
|
+
export type Operation =
|
|
60
|
+
| {
|
|
61
|
+
readonly _tag: 'Query';
|
|
62
|
+
readonly query: string;
|
|
63
|
+
/** The protocol dataset (`default-graph-uri` / `named-graph-uri`), if any. */
|
|
64
|
+
readonly dataset: Store.DatasetSpec | undefined;
|
|
65
|
+
}
|
|
66
|
+
| {
|
|
67
|
+
readonly _tag: 'Update';
|
|
68
|
+
readonly update: string;
|
|
69
|
+
/** The protocol dataset (`using-graph-uri` / `using-named-graph-uri`), if any. */
|
|
70
|
+
readonly using: Store.DatasetSpec | undefined;
|
|
71
|
+
}
|
|
72
|
+
| { readonly _tag: 'ServiceDescription' };
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* A parsed `Content-Type` header.
|
|
76
|
+
*
|
|
77
|
+
* @since 0.1.0
|
|
78
|
+
* @category models
|
|
79
|
+
*/
|
|
80
|
+
export interface ContentType {
|
|
81
|
+
readonly mediaType: string;
|
|
82
|
+
readonly parameters: Readonly<Record<string, string>>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Parses a `Content-Type` header (media type lower-cased, parameter names
|
|
87
|
+
* lower-cased, quotes removed).
|
|
88
|
+
*
|
|
89
|
+
* @since 0.1.0
|
|
90
|
+
* @category parsing
|
|
91
|
+
*/
|
|
92
|
+
export const parseContentType = (header: string | undefined): ContentType | undefined => {
|
|
93
|
+
if (header === undefined || header.trim() === '') return undefined;
|
|
94
|
+
const [type, ...params] = header.split(';');
|
|
95
|
+
const parameters: Record<string, string> = {};
|
|
96
|
+
params.forEach((p) => {
|
|
97
|
+
const eq = p.indexOf('=');
|
|
98
|
+
if (eq < 0) return;
|
|
99
|
+
const key = p.slice(0, eq).trim().toLowerCase();
|
|
100
|
+
const raw = p.slice(eq + 1).trim();
|
|
101
|
+
parameters[key] =
|
|
102
|
+
raw.startsWith('"') && raw.endsWith('"') && raw.length >= 2 ? raw.slice(1, -1) : raw;
|
|
103
|
+
});
|
|
104
|
+
return { mediaType: (type ?? '').trim().toLowerCase(), parameters };
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Whether a content type declares a charset other than UTF-8.
|
|
109
|
+
*
|
|
110
|
+
* @since 0.1.0
|
|
111
|
+
* @category parsing
|
|
112
|
+
*/
|
|
113
|
+
export const isNonUtf8 = (contentType: ContentType): boolean => {
|
|
114
|
+
const charset = contentType.parameters['charset'];
|
|
115
|
+
return charset !== undefined && !/^utf-?8$/i.test(charset);
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* The query string parameters of a request URL.
|
|
120
|
+
*
|
|
121
|
+
* @since 0.1.0
|
|
122
|
+
* @category parsing
|
|
123
|
+
*/
|
|
124
|
+
export const searchParams = (url: string): URLSearchParams => {
|
|
125
|
+
const q = url.indexOf('?');
|
|
126
|
+
if (q < 0) return new URLSearchParams();
|
|
127
|
+
const hash = url.indexOf('#', q);
|
|
128
|
+
return new URLSearchParams(url.slice(q + 1, hash < 0 ? undefined : hash));
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const graphList = (
|
|
132
|
+
values: ReadonlyArray<string>,
|
|
133
|
+
baseIri: string,
|
|
134
|
+
): Effect.Effect<Array<Term.NamedNode>, ProtocolErrors.ProtocolError> =>
|
|
135
|
+
Effect.forEach(
|
|
136
|
+
values,
|
|
137
|
+
(value) => {
|
|
138
|
+
const iri = Iri.resolve(value, baseIri);
|
|
139
|
+
return Iri.isAbsolute(iri) && !/[\s<>"{}|^`\\]/.test(iri)
|
|
140
|
+
? Effect.succeed(Term.namedNode(iri))
|
|
141
|
+
: Effect.fail(ProtocolErrors.badRequest(`Invalid graph IRI: ${value}`));
|
|
142
|
+
},
|
|
143
|
+
{ concurrency: 1 },
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Builds the dataset described by protocol parameters (`undefined` when no
|
|
148
|
+
* parameter is present). When only named graphs are given the default graph
|
|
149
|
+
* is empty, as for `FROM NAMED` in a query.
|
|
150
|
+
*
|
|
151
|
+
* @since 0.1.0
|
|
152
|
+
* @category parsing
|
|
153
|
+
*/
|
|
154
|
+
export const datasetFromParams = (
|
|
155
|
+
params: URLSearchParams,
|
|
156
|
+
defaultName: string,
|
|
157
|
+
namedName: string,
|
|
158
|
+
baseIri: string,
|
|
159
|
+
): Effect.Effect<Store.DatasetSpec | undefined, ProtocolErrors.ProtocolError> =>
|
|
160
|
+
Effect.gen(function* () {
|
|
161
|
+
const defaults = params.getAll(defaultName);
|
|
162
|
+
const named = params.getAll(namedName);
|
|
163
|
+
if (Arr.isReadonlyArrayEmpty(defaults) && Arr.isReadonlyArrayEmpty(named)) return undefined;
|
|
164
|
+
return {
|
|
165
|
+
defaultGraph: yield* graphList(defaults, baseIri),
|
|
166
|
+
namedGraphs: yield* graphList(named, baseIri),
|
|
167
|
+
};
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const merge = (a: URLSearchParams, b: URLSearchParams): URLSearchParams => {
|
|
171
|
+
const out = new URLSearchParams(a);
|
|
172
|
+
b.forEach((v, k) => out.append(k, v));
|
|
173
|
+
return out;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
const single = (
|
|
177
|
+
params: URLSearchParams,
|
|
178
|
+
name: string,
|
|
179
|
+
): Effect.Effect<Option.Option<string>, ProtocolErrors.ProtocolError> => {
|
|
180
|
+
const values = params.getAll(name);
|
|
181
|
+
if (values.length > 1) {
|
|
182
|
+
return Effect.fail(ProtocolErrors.badRequest(`Exactly one '${name}' parameter is allowed`));
|
|
183
|
+
}
|
|
184
|
+
return Effect.succeed(Arr.head(values));
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const readBody = (
|
|
188
|
+
request: HttpServerRequest.HttpServerRequest,
|
|
189
|
+
): Effect.Effect<string, ProtocolErrors.ProtocolError> =>
|
|
190
|
+
Effect.mapError(request.text, (e) =>
|
|
191
|
+
ProtocolErrors.badRequest(`Could not read the request body: ${e.message}`),
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* What a SPARQL endpoint accepts.
|
|
196
|
+
*
|
|
197
|
+
* @since 0.1.0
|
|
198
|
+
* @category models
|
|
199
|
+
*/
|
|
200
|
+
export interface EndpointKind {
|
|
201
|
+
readonly query: boolean;
|
|
202
|
+
readonly update: boolean;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const fromParams = (
|
|
206
|
+
params: URLSearchParams,
|
|
207
|
+
kind: EndpointKind,
|
|
208
|
+
method: string,
|
|
209
|
+
baseIri: string,
|
|
210
|
+
): Effect.Effect<Operation, ProtocolErrors.ProtocolError> =>
|
|
211
|
+
Effect.gen(function* () {
|
|
212
|
+
const query = yield* single(params, 'query');
|
|
213
|
+
const update = yield* single(params, 'update');
|
|
214
|
+
if (Option.isSome(query) && Option.isSome(update)) {
|
|
215
|
+
return yield* ProtocolErrors.badRequest("A request cannot have both 'query' and 'update'");
|
|
216
|
+
}
|
|
217
|
+
if (Option.isSome(update)) {
|
|
218
|
+
if (method !== 'POST') {
|
|
219
|
+
return yield* ProtocolErrors.badRequest('Updates must be sent with POST');
|
|
220
|
+
}
|
|
221
|
+
if (!kind.update)
|
|
222
|
+
return yield* ProtocolErrors.badRequest('This endpoint does not accept updates');
|
|
223
|
+
const using = yield* datasetFromParams(
|
|
224
|
+
params,
|
|
225
|
+
'using-graph-uri',
|
|
226
|
+
'using-named-graph-uri',
|
|
227
|
+
baseIri,
|
|
228
|
+
);
|
|
229
|
+
return { _tag: 'Update', update: update.value, using } as const;
|
|
230
|
+
}
|
|
231
|
+
if (Option.isSome(query)) {
|
|
232
|
+
if (!kind.query)
|
|
233
|
+
return yield* ProtocolErrors.badRequest('This endpoint does not accept queries');
|
|
234
|
+
const dataset = yield* datasetFromParams(
|
|
235
|
+
params,
|
|
236
|
+
'default-graph-uri',
|
|
237
|
+
'named-graph-uri',
|
|
238
|
+
baseIri,
|
|
239
|
+
);
|
|
240
|
+
return { _tag: 'Query', query: query.value, dataset } as const;
|
|
241
|
+
}
|
|
242
|
+
if (method === 'GET' || method === 'HEAD') return { _tag: 'ServiceDescription' } as const;
|
|
243
|
+
return yield* ProtocolErrors.badRequest("Missing 'query' or 'update' parameter");
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Decodes a request to the SPARQL endpoint. `baseIri` resolves relative
|
|
248
|
+
* graph IRIs in the dataset parameters.
|
|
249
|
+
*
|
|
250
|
+
* @since 0.1.0
|
|
251
|
+
* @category decoding
|
|
252
|
+
*/
|
|
253
|
+
export const decode = (
|
|
254
|
+
request: HttpServerRequest.HttpServerRequest,
|
|
255
|
+
kind: EndpointKind,
|
|
256
|
+
baseIri: string,
|
|
257
|
+
): Effect.Effect<Operation, ProtocolErrors.ProtocolError> =>
|
|
258
|
+
Effect.gen(function* () {
|
|
259
|
+
const method = request.method;
|
|
260
|
+
const urlParams = searchParams(request.url);
|
|
261
|
+
if (method === 'GET' || method === 'HEAD') {
|
|
262
|
+
return yield* fromParams(urlParams, kind, method, baseIri);
|
|
263
|
+
}
|
|
264
|
+
if (method !== 'POST') {
|
|
265
|
+
return yield* ProtocolErrors.methodNotAllowed(method, ['GET', 'POST']);
|
|
266
|
+
}
|
|
267
|
+
const contentType = parseContentType(request.headers['content-type']);
|
|
268
|
+
if (contentType === undefined) {
|
|
269
|
+
return yield* ProtocolErrors.unsupportedMediaType(
|
|
270
|
+
`A POST request needs a Content-Type of ${FORM}, ${SPARQL_QUERY} or ${SPARQL_UPDATE}`,
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
if (isNonUtf8(contentType)) {
|
|
274
|
+
return yield* ProtocolErrors.unsupportedMediaType(
|
|
275
|
+
`Unsupported charset '${contentType.parameters['charset']}' (only UTF-8 is accepted)`,
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
return yield* Match.value(contentType).pipe(
|
|
279
|
+
Match.when({ mediaType: FORM }, () =>
|
|
280
|
+
Effect.gen(function* () {
|
|
281
|
+
const body = yield* readBody(request);
|
|
282
|
+
return yield* fromParams(
|
|
283
|
+
merge(urlParams, new URLSearchParams(body)),
|
|
284
|
+
kind,
|
|
285
|
+
method,
|
|
286
|
+
baseIri,
|
|
287
|
+
);
|
|
288
|
+
}),
|
|
289
|
+
),
|
|
290
|
+
Match.when({ mediaType: SPARQL_QUERY }, () =>
|
|
291
|
+
Effect.gen(function* () {
|
|
292
|
+
if (!kind.query) {
|
|
293
|
+
return yield* ProtocolErrors.unsupportedMediaType(
|
|
294
|
+
'This endpoint does not accept queries',
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
if (urlParams.has('query') || urlParams.has('update')) {
|
|
298
|
+
return yield* ProtocolErrors.badRequest(
|
|
299
|
+
`A ${SPARQL_QUERY} request cannot also have a 'query' or 'update' parameter`,
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
const query = yield* readBody(request);
|
|
303
|
+
const dataset = yield* datasetFromParams(
|
|
304
|
+
urlParams,
|
|
305
|
+
'default-graph-uri',
|
|
306
|
+
'named-graph-uri',
|
|
307
|
+
baseIri,
|
|
308
|
+
);
|
|
309
|
+
return { _tag: 'Query', query, dataset } as const;
|
|
310
|
+
}),
|
|
311
|
+
),
|
|
312
|
+
Match.when({ mediaType: SPARQL_UPDATE }, () =>
|
|
313
|
+
Effect.gen(function* () {
|
|
314
|
+
if (!kind.update) {
|
|
315
|
+
return yield* ProtocolErrors.unsupportedMediaType(
|
|
316
|
+
'This endpoint does not accept updates',
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
if (urlParams.has('query') || urlParams.has('update')) {
|
|
320
|
+
return yield* ProtocolErrors.badRequest(
|
|
321
|
+
`A ${SPARQL_UPDATE} request cannot also have a 'query' or 'update' parameter`,
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
const update = yield* readBody(request);
|
|
325
|
+
const using = yield* datasetFromParams(
|
|
326
|
+
urlParams,
|
|
327
|
+
'using-graph-uri',
|
|
328
|
+
'using-named-graph-uri',
|
|
329
|
+
baseIri,
|
|
330
|
+
);
|
|
331
|
+
return { _tag: 'Update', update, using } as const;
|
|
332
|
+
}),
|
|
333
|
+
),
|
|
334
|
+
Match.orElse((other) =>
|
|
335
|
+
Effect.gen(function* () {
|
|
336
|
+
return yield* ProtocolErrors.unsupportedMediaType(
|
|
337
|
+
`Unsupported Content-Type '${other.mediaType}'; expected ${FORM}, ${SPARQL_QUERY} or ${SPARQL_UPDATE}`,
|
|
338
|
+
);
|
|
339
|
+
}),
|
|
340
|
+
),
|
|
341
|
+
);
|
|
342
|
+
});
|