@thomasfosterau/effect-rdf 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +2251 -2
- 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 +195 -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/Iri.ts
ADDED
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IRI utilities: RFC 3986 reference resolution, relativisation and
|
|
3
|
+
* validation.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.1.0
|
|
6
|
+
*/
|
|
7
|
+
import * as Equal from 'effect/Equal';
|
|
8
|
+
import * as Str from 'effect/String';
|
|
9
|
+
import * as Option from 'effect/Option';
|
|
10
|
+
import * as Schema from 'effect/Schema';
|
|
11
|
+
import { loop } from './internal/loop.ts';
|
|
12
|
+
|
|
13
|
+
interface Parts {
|
|
14
|
+
readonly scheme: Option.Option<string>;
|
|
15
|
+
readonly authority: Option.Option<string>;
|
|
16
|
+
readonly path: string;
|
|
17
|
+
readonly query: Option.Option<string>;
|
|
18
|
+
readonly fragment: Option.Option<string>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const PARTS =
|
|
22
|
+
/^(?:([A-Za-z][A-Za-z0-9+.-]*):)?(?:\/\/([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?$/s;
|
|
23
|
+
|
|
24
|
+
const parse = (iri: string): Parts => {
|
|
25
|
+
// Every part of the pattern is optional, so it matches any string
|
|
26
|
+
const m = PARTS.exec(iri) ?? [];
|
|
27
|
+
return {
|
|
28
|
+
scheme: Option.fromUndefinedOr(m[1]),
|
|
29
|
+
authority: Option.fromUndefinedOr(m[2]),
|
|
30
|
+
path: m[3] ?? '',
|
|
31
|
+
query: Option.fromUndefinedOr(m[4]),
|
|
32
|
+
fragment: Option.fromUndefinedOr(m[5]),
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// A document resolves many references against one base, so the last base's
|
|
37
|
+
// parts are kept. `Parts` are never mutated once parsed.
|
|
38
|
+
let lastBase = '';
|
|
39
|
+
let lastBaseParts: Parts = parse('');
|
|
40
|
+
|
|
41
|
+
const parseBase = (base: string): Parts => {
|
|
42
|
+
if (base !== lastBase) {
|
|
43
|
+
lastBaseParts = parse(base);
|
|
44
|
+
lastBase = base;
|
|
45
|
+
}
|
|
46
|
+
return lastBaseParts;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/** `part` between `before` and `after`, or nothing when it is absent. */
|
|
50
|
+
const affix = (part: Option.Option<string>, before: string, after: string): string =>
|
|
51
|
+
Option.match(part, { onNone: () => '', onSome: (v) => `${before}${v}${after}` });
|
|
52
|
+
|
|
53
|
+
const recompose = (p: Parts): string =>
|
|
54
|
+
affix(p.scheme, '', ':') +
|
|
55
|
+
affix(p.authority, '//', '') +
|
|
56
|
+
p.path +
|
|
57
|
+
affix(p.query, '?', '') +
|
|
58
|
+
affix(p.fragment, '#', '');
|
|
59
|
+
|
|
60
|
+
// A `.` or `..` segment: the only thing `removeDotSegments` changes.
|
|
61
|
+
const DOT_SEGMENT = /(?:^|\/)\.\.?(?:\/|$)/;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Removes `.` and `..` segments from a path (RFC 3986 §5.2.4).
|
|
65
|
+
*
|
|
66
|
+
* @since 0.1.0
|
|
67
|
+
*/
|
|
68
|
+
export const removeDotSegments = (path: string): string => {
|
|
69
|
+
// Most paths have no dot segment, and the algorithm leaves those unchanged.
|
|
70
|
+
if (!DOT_SEGMENT.test(path)) return path;
|
|
71
|
+
let input = path;
|
|
72
|
+
const output: Array<string> = [];
|
|
73
|
+
loop(() => {
|
|
74
|
+
if (!Str.isNonEmpty(input)) return false;
|
|
75
|
+
if (input.startsWith('../')) input = input.slice(3);
|
|
76
|
+
else if (input.startsWith('./')) input = input.slice(2);
|
|
77
|
+
else if (input.startsWith('/./')) input = input.slice(2);
|
|
78
|
+
else if (input === '/.') input = '/';
|
|
79
|
+
else if (input.startsWith('/../')) {
|
|
80
|
+
input = input.slice(3);
|
|
81
|
+
output.pop();
|
|
82
|
+
} else if (input === '/..') {
|
|
83
|
+
input = '/';
|
|
84
|
+
output.pop();
|
|
85
|
+
} else if (input === '.' || input === '..') input = '';
|
|
86
|
+
else {
|
|
87
|
+
const start = input.startsWith('/') ? 1 : 0;
|
|
88
|
+
const next = input.indexOf('/', start);
|
|
89
|
+
const segment = next === -1 ? input : input.slice(0, next);
|
|
90
|
+
output.push(segment);
|
|
91
|
+
input = next === -1 ? '' : input.slice(next);
|
|
92
|
+
}
|
|
93
|
+
return true;
|
|
94
|
+
});
|
|
95
|
+
return output.join('');
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const merge = (base: Parts, ref: string): string => {
|
|
99
|
+
if (Option.isSome(base.authority) && base.path === '') return `/${ref}`;
|
|
100
|
+
const i = base.path.lastIndexOf('/');
|
|
101
|
+
return i === -1 ? ref : base.path.slice(0, i + 1) + ref;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// Hoisted: a regex literal makes a new `RegExp` each time it is evaluated.
|
|
105
|
+
const SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*:/;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Whether a string is an absolute IRI (has a scheme).
|
|
109
|
+
*
|
|
110
|
+
* @since 0.1.0
|
|
111
|
+
*/
|
|
112
|
+
export const isAbsolute = (iri: string): boolean => SCHEME.test(iri);
|
|
113
|
+
|
|
114
|
+
const SCHEME_THEN_PATH = /^[A-Za-z][A-Za-z0-9+.-]*:(?!\.)/;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Whether `iri` has a scheme and no `.` or `..` segment anywhere, without
|
|
118
|
+
* splitting it into its parts: such a reference resolves to itself
|
|
119
|
+
* (RFC 3986 §5.2.2), and most references in a document are like that. A
|
|
120
|
+
* `/.` anywhere (even in the query or fragment) or a path starting with `.`
|
|
121
|
+
* sends the reference down the full algorithm.
|
|
122
|
+
*/
|
|
123
|
+
const isPlainAbsolute = (iri: string): boolean => SCHEME_THEN_PATH.test(iri) && !iri.includes('/.');
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Resolves a (possibly relative) IRI reference against a base IRI, following
|
|
127
|
+
* RFC 3986 §5.2.
|
|
128
|
+
*
|
|
129
|
+
* @since 0.1.0
|
|
130
|
+
*/
|
|
131
|
+
export const resolve = (reference: string, base: string | undefined): string => {
|
|
132
|
+
if (base === undefined || base === '') return reference;
|
|
133
|
+
if (isPlainAbsolute(reference)) return reference;
|
|
134
|
+
const r = parse(reference);
|
|
135
|
+
// An absolute reference without dot segments resolves to itself (§5.2.2:
|
|
136
|
+
// only its path is rewritten, by `removeDotSegments`).
|
|
137
|
+
if (Option.isSome(r.scheme) && !DOT_SEGMENT.test(r.path)) return reference;
|
|
138
|
+
const b = parseBase(base);
|
|
139
|
+
const fragment = r.fragment;
|
|
140
|
+
const t: Parts = Option.isSome(r.scheme)
|
|
141
|
+
? {
|
|
142
|
+
scheme: r.scheme,
|
|
143
|
+
authority: r.authority,
|
|
144
|
+
path: removeDotSegments(r.path),
|
|
145
|
+
query: r.query,
|
|
146
|
+
fragment,
|
|
147
|
+
}
|
|
148
|
+
: Option.isSome(r.authority)
|
|
149
|
+
? {
|
|
150
|
+
scheme: b.scheme,
|
|
151
|
+
authority: r.authority,
|
|
152
|
+
path: removeDotSegments(r.path),
|
|
153
|
+
query: r.query,
|
|
154
|
+
fragment,
|
|
155
|
+
}
|
|
156
|
+
: r.path === ''
|
|
157
|
+
? {
|
|
158
|
+
scheme: b.scheme,
|
|
159
|
+
authority: b.authority,
|
|
160
|
+
path: b.path,
|
|
161
|
+
query: Option.orElse(r.query, () => b.query),
|
|
162
|
+
fragment,
|
|
163
|
+
}
|
|
164
|
+
: {
|
|
165
|
+
scheme: b.scheme,
|
|
166
|
+
authority: b.authority,
|
|
167
|
+
path: r.path.startsWith('/')
|
|
168
|
+
? removeDotSegments(r.path)
|
|
169
|
+
: removeDotSegments(merge(b, r.path)),
|
|
170
|
+
query: r.query,
|
|
171
|
+
fragment,
|
|
172
|
+
};
|
|
173
|
+
return recompose(t);
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Removes the fragment from an IRI.
|
|
178
|
+
*
|
|
179
|
+
* @since 0.1.0
|
|
180
|
+
*/
|
|
181
|
+
export const withoutFragment = (iri: string): string => {
|
|
182
|
+
const i = iri.indexOf('#');
|
|
183
|
+
return i === -1 ? iri : iri.slice(0, i);
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Computes a relative reference for `iri` with respect to `base`, if a
|
|
188
|
+
* simple one exists (same scheme and authority). Resolving the result against
|
|
189
|
+
* `base` always yields `iri`.
|
|
190
|
+
*
|
|
191
|
+
* @since 0.1.0
|
|
192
|
+
*/
|
|
193
|
+
export const relativize = (iri: string, base: string): Option.Option<string> => {
|
|
194
|
+
if (iri === base) return Option.some('');
|
|
195
|
+
const i = parse(iri);
|
|
196
|
+
const b = parse(base);
|
|
197
|
+
if (
|
|
198
|
+
!Equal.equals(i.scheme, b.scheme) ||
|
|
199
|
+
!Equal.equals(i.authority, b.authority) ||
|
|
200
|
+
Option.isNone(i.scheme)
|
|
201
|
+
) {
|
|
202
|
+
return Option.none();
|
|
203
|
+
}
|
|
204
|
+
// `iri` as a reference with only `path` and its query and fragment
|
|
205
|
+
const relative = (path: string): string =>
|
|
206
|
+
recompose({
|
|
207
|
+
scheme: Option.none(),
|
|
208
|
+
authority: Option.none(),
|
|
209
|
+
path,
|
|
210
|
+
query: i.query,
|
|
211
|
+
fragment: i.fragment,
|
|
212
|
+
});
|
|
213
|
+
const dir = b.path.slice(0, b.path.lastIndexOf('/') + 1);
|
|
214
|
+
const rest = i.path.slice(dir.length);
|
|
215
|
+
const candidate: Option.Option<string> =
|
|
216
|
+
i.path === b.path
|
|
217
|
+
? Equal.equals(i.query, b.query)
|
|
218
|
+
? Option.map(i.fragment, (f) => `#${f}`)
|
|
219
|
+
: Option.isSome(i.query)
|
|
220
|
+
? Option.some(relative(''))
|
|
221
|
+
: Option.none()
|
|
222
|
+
: Option.orElse(
|
|
223
|
+
// Avoid references whose first segment looks like a scheme.
|
|
224
|
+
dir !== '' && i.path.startsWith(dir) && rest !== '' && !/^[^/]*:/.test(rest)
|
|
225
|
+
? Option.some(relative(rest))
|
|
226
|
+
: Option.none(),
|
|
227
|
+
() =>
|
|
228
|
+
i.path.startsWith('/') && !i.path.startsWith('//')
|
|
229
|
+
? Option.some(relative(i.path))
|
|
230
|
+
: Option.none(),
|
|
231
|
+
);
|
|
232
|
+
return Option.filter(candidate, (c) => resolve(c, base) === iri);
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
// IRI grammar (RFC 3987) character classes, used for validation.
|
|
236
|
+
const UCSCHAR =
|
|
237
|
+
'\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF\\u{10000}-\\u{1FFFD}\\u{20000}-\\u{2FFFD}\\u{30000}-\\u{3FFFD}\\u{40000}-\\u{4FFFD}\\u{50000}-\\u{5FFFD}\\u{60000}-\\u{6FFFD}\\u{70000}-\\u{7FFFD}\\u{80000}-\\u{8FFFD}\\u{90000}-\\u{9FFFD}\\u{A0000}-\\u{AFFFD}\\u{B0000}-\\u{BFFFD}\\u{C0000}-\\u{CFFFD}\\u{D0000}-\\u{DFFFD}\\u{E1000}-\\u{EFFFD}';
|
|
238
|
+
const IPRIVATE = '\\uE000-\\uF8FF\\u{F0000}-\\u{FFFFD}\\u{100000}-\\u{10FFFD}';
|
|
239
|
+
const IUNRESERVED = `A-Za-z0-9\\-._~${UCSCHAR}`;
|
|
240
|
+
const SUBDELIMS = "!$&'()*+,;=";
|
|
241
|
+
const PCT = '%[0-9A-Fa-f]{2}';
|
|
242
|
+
const IPCHAR = `(?:[${IUNRESERVED}${SUBDELIMS}:@]|${PCT})`;
|
|
243
|
+
// `ihier-part` / `irelative-part` (optional authority, then a path), query and fragment: the
|
|
244
|
+
// IRI grammar after the scheme, shared by absolute IRIs and relative references.
|
|
245
|
+
const IRI_AFTER_SCHEME =
|
|
246
|
+
`(?://(?:(?:[${IUNRESERVED}${SUBDELIMS}:]|${PCT})*@)?(?:\\[[0-9A-Fa-f:.vV${IUNRESERVED}${SUBDELIMS}]*\\]|(?:[${IUNRESERVED}${SUBDELIMS}]|${PCT})*)(?::[0-9]*)?)?` +
|
|
247
|
+
`(?:/?${IPCHAR}*)*` +
|
|
248
|
+
`(?:\\?(?:${IPCHAR}|[/?${IPRIVATE}])*)?` +
|
|
249
|
+
`(?:#(?:${IPCHAR}|[/?])*)?`;
|
|
250
|
+
const IRI_RE = new RegExp(`^[A-Za-z][A-Za-z0-9+.\\-]*:${IRI_AFTER_SCHEME}$`, 'u');
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Whether a string is a syntactically valid absolute IRI (RFC 3987).
|
|
254
|
+
*
|
|
255
|
+
* @since 0.1.0
|
|
256
|
+
*/
|
|
257
|
+
export const isValid = (iri: string): boolean => IRI_RE.test(iri);
|
|
258
|
+
|
|
259
|
+
// A relative reference (RFC 3987 `irelative-ref`): the IRI grammar without the scheme.
|
|
260
|
+
const RELATIVE_RE = new RegExp(`^${IRI_AFTER_SCHEME}$`, 'u');
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Whether a string is a syntactically valid IRI reference (RFC 3987): an
|
|
264
|
+
* absolute IRI, or a relative reference whose first path segment has no `:`.
|
|
265
|
+
*
|
|
266
|
+
* @since 0.1.0
|
|
267
|
+
*/
|
|
268
|
+
export const isValidReference = (reference: string): boolean =>
|
|
269
|
+
isAbsolute(reference)
|
|
270
|
+
? isValid(reference)
|
|
271
|
+
: !/^[^/?#]*:/.test(reference) && RELATIVE_RE.test(reference);
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Schema of an absolute IRI (`isValid`): a string, with JSON Schema
|
|
275
|
+
* `format: "iri"`. Use it to validate IRIs from `Config`, CLI flags or HTTP
|
|
276
|
+
* parameters.
|
|
277
|
+
*
|
|
278
|
+
* @since 0.1.0
|
|
279
|
+
* @category schemas
|
|
280
|
+
*/
|
|
281
|
+
export const IriSchema: Schema.String = Schema.String.check(
|
|
282
|
+
Schema.makeFilter((s: string) => isValid(s), {
|
|
283
|
+
identifier: 'isIri',
|
|
284
|
+
title: 'IRI',
|
|
285
|
+
description: 'An absolute IRI (RFC 3987).',
|
|
286
|
+
expected: 'an absolute IRI',
|
|
287
|
+
toJsonSchema: () => ({ format: 'iri' }),
|
|
288
|
+
}),
|
|
289
|
+
).annotate({ identifier: 'Iri' });
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* The type `IriSchema` decodes to: a string.
|
|
293
|
+
*
|
|
294
|
+
* @since 0.1.0
|
|
295
|
+
* @category schemas
|
|
296
|
+
*/
|
|
297
|
+
export type IriSchema = typeof IriSchema.Type;
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Schema of an IRI reference, absolute or relative (`isValidReference`): a
|
|
301
|
+
* string, with JSON Schema `format: "iri-reference"`.
|
|
302
|
+
*
|
|
303
|
+
* @since 0.1.0
|
|
304
|
+
* @category schemas
|
|
305
|
+
*/
|
|
306
|
+
export const IriReferenceSchema: Schema.String = Schema.String.check(
|
|
307
|
+
Schema.makeFilter((s: string) => isValidReference(s), {
|
|
308
|
+
identifier: 'isIriReference',
|
|
309
|
+
title: 'IRI reference',
|
|
310
|
+
description: 'An absolute IRI or relative reference (RFC 3987).',
|
|
311
|
+
expected: 'an IRI reference',
|
|
312
|
+
toJsonSchema: () => ({ format: 'iri-reference' }),
|
|
313
|
+
}),
|
|
314
|
+
).annotate({ identifier: 'IriReference' });
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* The type `IriReferenceSchema` decodes to: a string.
|
|
318
|
+
*
|
|
319
|
+
* @since 0.1.0
|
|
320
|
+
* @category schemas
|
|
321
|
+
*/
|
|
322
|
+
export type IriReferenceSchema = typeof IriReferenceSchema.Type;
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blank-node-aware dataset comparison (RDF graph isomorphism).
|
|
3
|
+
*
|
|
4
|
+
* Uses iterative signature refinement to partition blank nodes, then a
|
|
5
|
+
* backtracking search over the (usually tiny) ambiguous classes.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.1.0
|
|
8
|
+
*/
|
|
9
|
+
import * as Arr from 'effect/Array';
|
|
10
|
+
import { dual } from 'effect/Function';
|
|
11
|
+
import * as Iterable from 'effect/Iterable';
|
|
12
|
+
import * as MutableHashMap from 'effect/MutableHashMap';
|
|
13
|
+
import * as MutableHashSet from 'effect/MutableHashSet';
|
|
14
|
+
import * as Option from 'effect/Option';
|
|
15
|
+
import * as Order from 'effect/Order';
|
|
16
|
+
import * as Predicate from 'effect/Predicate';
|
|
17
|
+
import * as Dataset from './Dataset.ts';
|
|
18
|
+
import { loop } from './internal/loop.ts';
|
|
19
|
+
import * as Term from './Term.ts';
|
|
20
|
+
|
|
21
|
+
/** Blank node labels, by blank node label. */
|
|
22
|
+
type Labels = MutableHashMap.MutableHashMap<string, string>;
|
|
23
|
+
|
|
24
|
+
const fnv = (s: string): string => {
|
|
25
|
+
let h1 = 0x811c9dc5;
|
|
26
|
+
let h2 = 0x01000193;
|
|
27
|
+
loop((i) => {
|
|
28
|
+
if (i >= s.length) return false;
|
|
29
|
+
const c = s.charCodeAt(i);
|
|
30
|
+
h1 = Math.imul(h1 ^ c, 0x01000193);
|
|
31
|
+
h2 = Math.imul(h2 ^ c, 0x5bd1e995);
|
|
32
|
+
return true;
|
|
33
|
+
});
|
|
34
|
+
return (h1 >>> 0).toString(36) + (h2 >>> 0).toString(36);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** Appends the blank nodes of `t` (and of the triple terms inside it) to `out`, each once. */
|
|
38
|
+
const collectBlankNodes = (t: Term.Term, out: Array<string>): void => {
|
|
39
|
+
if (Term.isBlankNode(t)) {
|
|
40
|
+
if (!out.includes(t.value)) out.push(t.value);
|
|
41
|
+
} else if (Term.isTriple(t)) {
|
|
42
|
+
collectBlankNodes(t.subject, out);
|
|
43
|
+
collectBlankNodes(t.object, out);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** The distinct blank nodes of a quad, in order of first occurrence. */
|
|
48
|
+
const quadBlankNodes = (q: Term.Quad): ReadonlyArray<string> => {
|
|
49
|
+
const out: Array<string> = [];
|
|
50
|
+
collectBlankNodes(q.subject, out);
|
|
51
|
+
collectBlankNodes(q.object, out);
|
|
52
|
+
collectBlankNodes(q.graph, out);
|
|
53
|
+
return out;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const labelOf = (labels: Labels, node: string): string =>
|
|
57
|
+
Option.getOrElse(MutableHashMap.get(labels, node), () => '');
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* A quad's signature for one of its blank nodes, compiled once: text, and in
|
|
61
|
+
* between the indexes (into `Partition.nodes`) of the other blank nodes,
|
|
62
|
+
* whose current labels each refinement round fills in. The node itself is
|
|
63
|
+
* `@self`.
|
|
64
|
+
*/
|
|
65
|
+
type Template = ReadonlyArray<string | number>;
|
|
66
|
+
|
|
67
|
+
const compile = (
|
|
68
|
+
t: Term.Term,
|
|
69
|
+
self: string,
|
|
70
|
+
index: MutableHashMap.MutableHashMap<string, number>,
|
|
71
|
+
out: Array<string | number>,
|
|
72
|
+
): void => {
|
|
73
|
+
if (Term.isBlankNode(t)) {
|
|
74
|
+
if (t.value === self) out.push('@self');
|
|
75
|
+
else out.push(Option.getOrElse(MutableHashMap.get(index, t.value), () => '@'));
|
|
76
|
+
} else if (Term.isTriple(t)) {
|
|
77
|
+
out.push('<<');
|
|
78
|
+
compile(t.subject, self, index, out);
|
|
79
|
+
out.push(` ${t.predicate.key} `);
|
|
80
|
+
compile(t.object, self, index, out);
|
|
81
|
+
out.push('>>');
|
|
82
|
+
} else out.push(t.key);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const template = (
|
|
86
|
+
q: Term.Quad,
|
|
87
|
+
self: string,
|
|
88
|
+
index: MutableHashMap.MutableHashMap<string, number>,
|
|
89
|
+
): Template => {
|
|
90
|
+
const out: Array<string | number> = [];
|
|
91
|
+
compile(q.subject, self, index, out);
|
|
92
|
+
out.push(` ${q.predicate.key} `);
|
|
93
|
+
compile(q.object, self, index, out);
|
|
94
|
+
out.push(' ');
|
|
95
|
+
compile(q.graph, self, index, out);
|
|
96
|
+
return out;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
/** A template with the blank nodes' labels filled in. */
|
|
100
|
+
const render = (t: Template, labels: ReadonlyArray<string>): string =>
|
|
101
|
+
t.map((part) => (Predicate.isString(part) ? part : `@${labels[part] ?? ''}`)).join('');
|
|
102
|
+
|
|
103
|
+
interface Partition {
|
|
104
|
+
readonly nodes: ReadonlyArray<string>;
|
|
105
|
+
readonly labels: Labels;
|
|
106
|
+
readonly byNode: MutableHashMap.MutableHashMap<string, Array<Term.Quad>>;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** The quads a blank node occurs in. */
|
|
110
|
+
const quadsOf = (p: Partition, node: string): ReadonlyArray<Term.Quad> =>
|
|
111
|
+
Option.getOrElse(MutableHashMap.get(p.byNode, node), () => []);
|
|
112
|
+
|
|
113
|
+
const refine = (quads: ReadonlyArray<Term.Quad>): Partition => {
|
|
114
|
+
const byNode = MutableHashMap.empty<string, Array<Term.Quad>>();
|
|
115
|
+
quads.forEach((q) => {
|
|
116
|
+
quadBlankNodes(q).forEach((b) => {
|
|
117
|
+
const list = MutableHashMap.get(byNode, b);
|
|
118
|
+
if (Option.isSome(list)) list.value.push(q);
|
|
119
|
+
else MutableHashMap.set(byNode, b, [q]);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
const nodes = Arr.fromIterable(MutableHashMap.keys(byNode));
|
|
123
|
+
const index = MutableHashMap.fromIterable(nodes.map((n, i) => [n, i] as const));
|
|
124
|
+
const templates = nodes.map((n) =>
|
|
125
|
+
Option.getOrElse(MutableHashMap.get(byNode, n), () => []).map((q) => template(q, n, index)),
|
|
126
|
+
);
|
|
127
|
+
let labels: ReadonlyArray<string> = nodes.map(() => '');
|
|
128
|
+
let classes = 1;
|
|
129
|
+
// Refine until the number of classes stops growing (at most one round per node)
|
|
130
|
+
loop((round) => {
|
|
131
|
+
if (round > nodes.length) return false;
|
|
132
|
+
const current = labels;
|
|
133
|
+
const next = templates.map((ts, i) =>
|
|
134
|
+
fnv(
|
|
135
|
+
`${current[i] ?? ''}|${Arr.sort(
|
|
136
|
+
ts.map((t) => render(t, current)),
|
|
137
|
+
Order.String,
|
|
138
|
+
).join('\n')}`,
|
|
139
|
+
),
|
|
140
|
+
);
|
|
141
|
+
const nextClasses = MutableHashSet.size(MutableHashSet.fromIterable(next));
|
|
142
|
+
labels = next;
|
|
143
|
+
if (nextClasses === classes) return false;
|
|
144
|
+
classes = nextClasses;
|
|
145
|
+
return true;
|
|
146
|
+
});
|
|
147
|
+
const final = labels;
|
|
148
|
+
return {
|
|
149
|
+
nodes,
|
|
150
|
+
labels: MutableHashMap.fromIterable(nodes.map((n, i) => [n, final[i] ?? ''] as const)),
|
|
151
|
+
byNode,
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
/** `q` with its blank nodes renamed by `mapping` (those it does not map are kept). */
|
|
156
|
+
const renameBlankNodes = (q: Term.Quad, mapping: Labels): Term.Quad =>
|
|
157
|
+
Term.mapTerms(q, (t) =>
|
|
158
|
+
Term.isBlankNode(t)
|
|
159
|
+
? new Term.BlankNode(Option.getOrElse(MutableHashMap.get(mapping, t.value), () => t.value))
|
|
160
|
+
: t,
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
const rename = (q: Term.Quad, mapping: Labels): string => renameBlankNodes(q, mapping).key;
|
|
164
|
+
|
|
165
|
+
/** The blank nodes of a partition grouped by label, in order. */
|
|
166
|
+
const groupsOf = (p: Partition): MutableHashMap.MutableHashMap<string, Array<string>> => {
|
|
167
|
+
const groups = MutableHashMap.empty<string, Array<string>>();
|
|
168
|
+
p.nodes.forEach((n) => {
|
|
169
|
+
const l = labelOf(p.labels, n);
|
|
170
|
+
const group = MutableHashMap.get(groups, l);
|
|
171
|
+
if (Option.isSome(group)) group.value.push(n);
|
|
172
|
+
else MutableHashMap.set(groups, l, [n]);
|
|
173
|
+
});
|
|
174
|
+
return groups;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
/** The class of `node`: the nodes of `groups` with its label in `labels`. */
|
|
178
|
+
const classOf = (
|
|
179
|
+
groups: MutableHashMap.MutableHashMap<string, ReadonlyArray<string>>,
|
|
180
|
+
labels: Labels,
|
|
181
|
+
node: string,
|
|
182
|
+
): ReadonlyArray<string> =>
|
|
183
|
+
Option.getOrElse(MutableHashMap.get(groups, labelOf(labels, node)), () => []);
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* The public result of `bijection`: a native `ReadonlyMap`, copied once
|
|
187
|
+
* from the search's map at the end.
|
|
188
|
+
*/
|
|
189
|
+
const toReadonlyMap = (mapping: Labels): ReadonlyMap<string, string> => new Map(mapping);
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Finds a blank node bijection from `self` to `that` under which the two
|
|
193
|
+
* datasets are equal, if one exists.
|
|
194
|
+
*
|
|
195
|
+
* @since 0.1.0
|
|
196
|
+
* @category isomorphism
|
|
197
|
+
*/
|
|
198
|
+
export const bijection = (
|
|
199
|
+
self: Dataset.Dataset,
|
|
200
|
+
that: Dataset.Dataset,
|
|
201
|
+
): Option.Option<ReadonlyMap<string, string>> => {
|
|
202
|
+
if (self.size !== that.size) return Option.none();
|
|
203
|
+
const aBlank: Array<Term.Quad> = [];
|
|
204
|
+
const groundMissing = Iterable.some(self, (q) => {
|
|
205
|
+
if (!Term.hasBlankNodes(q)) return !Dataset.has(that, q);
|
|
206
|
+
aBlank.push(q);
|
|
207
|
+
return false;
|
|
208
|
+
});
|
|
209
|
+
if (groundMissing) return Option.none();
|
|
210
|
+
const bBlank = Arr.filter(Arr.fromIterable(that), (q) => Term.hasBlankNodes(q));
|
|
211
|
+
if (aBlank.length !== bBlank.length) return Option.none();
|
|
212
|
+
if (Arr.isReadonlyArrayEmpty(aBlank)) return Option.some(toReadonlyMap(MutableHashMap.empty()));
|
|
213
|
+
|
|
214
|
+
const a = refine(aBlank);
|
|
215
|
+
const b = refine(bBlank);
|
|
216
|
+
if (a.nodes.length !== b.nodes.length) return Option.none();
|
|
217
|
+
|
|
218
|
+
const groupsB = groupsOf(b);
|
|
219
|
+
const groupsA = groupsOf(a);
|
|
220
|
+
const sameClasses = !Iterable.some(
|
|
221
|
+
groupsA,
|
|
222
|
+
([l, g]) => !Option.exists(MutableHashMap.get(groupsB, l), (gb) => gb.length === g.length),
|
|
223
|
+
);
|
|
224
|
+
if (!sameClasses) return Option.none();
|
|
225
|
+
|
|
226
|
+
const target = MutableHashSet.fromIterable(bBlank.map((q) => q.key));
|
|
227
|
+
const mapping: Labels = MutableHashMap.empty();
|
|
228
|
+
const used = MutableHashSet.empty<string>();
|
|
229
|
+
// Assign unambiguous nodes first, then search the rest smallest class first.
|
|
230
|
+
const order = Arr.sort(
|
|
231
|
+
a.nodes,
|
|
232
|
+
Order.mapInput(Order.Number, (x: string) => classOf(groupsA, a.labels, x).length),
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
const consistent = (node: string): boolean =>
|
|
236
|
+
!quadsOf(a, node).some((q) => {
|
|
237
|
+
const complete = quadBlankNodes(q).every((x) => MutableHashMap.has(mapping, x));
|
|
238
|
+
return complete && !MutableHashSet.has(target, rename(q, mapping));
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
// Iterative depth-first search (graphs can have many thousands of blank nodes).
|
|
242
|
+
const cursors: Array<number> = [0];
|
|
243
|
+
let found = false;
|
|
244
|
+
loop(() => {
|
|
245
|
+
const i = cursors.length - 1;
|
|
246
|
+
const node = order[i];
|
|
247
|
+
if (i < 0 || node === undefined) {
|
|
248
|
+
// The search is exhausted, or every node is assigned
|
|
249
|
+
found = i === order.length;
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
const candidates = classOf(groupsB, a.labels, node);
|
|
253
|
+
const previous = MutableHashMap.get(mapping, node);
|
|
254
|
+
if (Option.isSome(previous)) {
|
|
255
|
+
MutableHashMap.remove(mapping, node);
|
|
256
|
+
MutableHashSet.remove(used, previous.value);
|
|
257
|
+
}
|
|
258
|
+
let next = cursors[i] ?? 0;
|
|
259
|
+
let advanced = false;
|
|
260
|
+
loop(() => {
|
|
261
|
+
const candidate = candidates[next];
|
|
262
|
+
if (candidate === undefined) return false;
|
|
263
|
+
next++;
|
|
264
|
+
if (MutableHashSet.has(used, candidate)) return true;
|
|
265
|
+
MutableHashMap.set(mapping, node, candidate);
|
|
266
|
+
MutableHashSet.add(used, candidate);
|
|
267
|
+
if (consistent(node)) {
|
|
268
|
+
advanced = true;
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
MutableHashMap.remove(mapping, node);
|
|
272
|
+
MutableHashSet.remove(used, candidate);
|
|
273
|
+
return true;
|
|
274
|
+
});
|
|
275
|
+
cursors[i] = next;
|
|
276
|
+
if (advanced) cursors.push(0);
|
|
277
|
+
else cursors.pop();
|
|
278
|
+
return true;
|
|
279
|
+
});
|
|
280
|
+
return found ? Option.some(toReadonlyMap(mapping)) : Option.none();
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Whether two datasets are isomorphic: equal up to a consistent renaming of
|
|
285
|
+
* blank nodes.
|
|
286
|
+
*
|
|
287
|
+
* @since 0.1.0
|
|
288
|
+
* @category isomorphism
|
|
289
|
+
*/
|
|
290
|
+
export const isomorphic: {
|
|
291
|
+
(that: Dataset.Dataset): (self: Dataset.Dataset) => boolean;
|
|
292
|
+
(self: Dataset.Dataset, that: Dataset.Dataset): boolean;
|
|
293
|
+
} = dual(2, (self: Dataset.Dataset, that: Dataset.Dataset): boolean =>
|
|
294
|
+
Option.isSome(bijection(self, that)),
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Relabels blank nodes in a dataset with fresh labels `prefix0`, `prefix1`,
|
|
299
|
+
* … in a deterministic order derived from their structural signatures.
|
|
300
|
+
*
|
|
301
|
+
* Isomorphic datasets without automorphic blank nodes yield identical
|
|
302
|
+
* results; this is not a full canonicalisation algorithm.
|
|
303
|
+
*
|
|
304
|
+
* @since 0.1.0
|
|
305
|
+
* @category isomorphism
|
|
306
|
+
*/
|
|
307
|
+
export const relabel = (self: Dataset.Dataset, prefix = 'c'): Dataset.Dataset => {
|
|
308
|
+
const blank = Array.from(self).filter(Term.hasBlankNodes);
|
|
309
|
+
if (Arr.isReadonlyArrayEmpty(blank)) return self;
|
|
310
|
+
const { nodes, labels } = refine(blank);
|
|
311
|
+
const sorted = Arr.sort(
|
|
312
|
+
nodes,
|
|
313
|
+
Order.mapInput(Order.String, (x: string) => labelOf(labels, x)),
|
|
314
|
+
);
|
|
315
|
+
const mapping: Labels = MutableHashMap.fromIterable(
|
|
316
|
+
sorted.map((n, i) => [n, `${prefix}${i}`] as const),
|
|
317
|
+
);
|
|
318
|
+
return Dataset.map(self, (q) => renameBlankNodes(q, mapping));
|
|
319
|
+
};
|