@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
|
@@ -0,0 +1,1162 @@
|
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-D8jQpDG7.mjs";
|
|
2
|
+
import { B as isNamedNode, K as isTriple, N as isBlankNode, P as isDefaultGraph, U as isResource, q as isVariable, rt as triple, z as isLiteral } from "./Term-CFLG1qu4.mjs";
|
|
3
|
+
import { E as match, t as DatasetSchema } from "./Dataset-BlmlcI7J.mjs";
|
|
4
|
+
import { _ as isValidLexical, g as isNumericDatatype } from "./Xsd-Cdgx5zRB.mjs";
|
|
5
|
+
import { c as withExternalCode, t as SemActHandler } from "./SemAct-CmyT4yI8.mjs";
|
|
6
|
+
import { n as ShExImportError, o as ShExValidationError } from "./ShExError-CVtq2NnM.mjs";
|
|
7
|
+
import { A as cardinality } from "./ShExJ-COiPd9Xw.mjs";
|
|
8
|
+
import { a as isStart, c as resolve } from "./ShapeMap-CsgKxB2G.mjs";
|
|
9
|
+
import { n as check, o as iterate, r as makeIndex } from "./Structure-BjMo4Bkc.mjs";
|
|
10
|
+
import * as Arr from "effect/Array";
|
|
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 Predicate from "effect/Predicate";
|
|
16
|
+
import * as Schema from "effect/Schema";
|
|
17
|
+
import * as SchemaTransformation from "effect/SchemaTransformation";
|
|
18
|
+
import * as Effect from "effect/Effect";
|
|
19
|
+
import * as Match from "effect/Match";
|
|
20
|
+
import * as SchemaIssue from "effect/SchemaIssue";
|
|
21
|
+
import * as Context from "effect/Context";
|
|
22
|
+
import * as Layer from "effect/Layer";
|
|
23
|
+
import * as Result from "effect/Result";
|
|
24
|
+
// src/shex/internal/xpathRegex.ts
|
|
25
|
+
/**
|
|
26
|
+
* Translation of XPath / XML Schema regular expressions (as used by the
|
|
27
|
+
* ShEx `pattern` facet and `fn:matches`) to JavaScript `RegExp`s.
|
|
28
|
+
*
|
|
29
|
+
* Handled differences: `.` excludes only `\n` and `\r`; `\d`, `\w`, `\i`,
|
|
30
|
+
* `\c` and their complements use the XML Schema definitions; character class
|
|
31
|
+
* subtraction (`[a-z-[aeiou]]`); `\p{IsBlock}` names; the `x` flag removes
|
|
32
|
+
* whitespace; escapes JavaScript rejects in Unicode mode are normalised.
|
|
33
|
+
*
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
const NAME_START = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u{10000}-\\u{EFFFF}";
|
|
37
|
+
const NAME_CHAR = `${NAME_START}\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040`;
|
|
38
|
+
/** Class body fragments for the multi-character escapes. */
|
|
39
|
+
const CLASS_ESCAPES = {
|
|
40
|
+
d: {
|
|
41
|
+
body: "\\p{Nd}",
|
|
42
|
+
negated: false
|
|
43
|
+
},
|
|
44
|
+
D: {
|
|
45
|
+
body: "\\p{Nd}",
|
|
46
|
+
negated: true
|
|
47
|
+
},
|
|
48
|
+
w: {
|
|
49
|
+
body: "\\p{L}\\p{M}\\p{N}\\p{S}",
|
|
50
|
+
negated: false
|
|
51
|
+
},
|
|
52
|
+
W: {
|
|
53
|
+
body: "\\p{L}\\p{M}\\p{N}\\p{S}",
|
|
54
|
+
negated: true
|
|
55
|
+
},
|
|
56
|
+
s: {
|
|
57
|
+
body: " \\t\\n\\r",
|
|
58
|
+
negated: false
|
|
59
|
+
},
|
|
60
|
+
S: {
|
|
61
|
+
body: " \\t\\n\\r",
|
|
62
|
+
negated: true
|
|
63
|
+
},
|
|
64
|
+
i: {
|
|
65
|
+
body: NAME_START,
|
|
66
|
+
negated: false
|
|
67
|
+
},
|
|
68
|
+
I: {
|
|
69
|
+
body: NAME_START,
|
|
70
|
+
negated: true
|
|
71
|
+
},
|
|
72
|
+
c: {
|
|
73
|
+
body: NAME_CHAR,
|
|
74
|
+
negated: false
|
|
75
|
+
},
|
|
76
|
+
C: {
|
|
77
|
+
body: NAME_CHAR,
|
|
78
|
+
negated: true
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const BLOCKS = {
|
|
82
|
+
BasicLatin: "\\u0000-\\u007F",
|
|
83
|
+
"Latin-1Supplement": "\\u0080-\\u00FF",
|
|
84
|
+
LatinExtended_A: "\\u0100-\\u017F",
|
|
85
|
+
"LatinExtended-A": "\\u0100-\\u017F",
|
|
86
|
+
"LatinExtended-B": "\\u0180-\\u024F",
|
|
87
|
+
IPAExtensions: "\\u0250-\\u02AF",
|
|
88
|
+
Greek: "\\u0370-\\u03FF",
|
|
89
|
+
GreekandCoptic: "\\u0370-\\u03FF",
|
|
90
|
+
Cyrillic: "\\u0400-\\u04FF",
|
|
91
|
+
Hebrew: "\\u0590-\\u05FF",
|
|
92
|
+
Arabic: "\\u0600-\\u06FF",
|
|
93
|
+
CJKUnifiedIdeographs: "\\u4E00-\\u9FFF",
|
|
94
|
+
Hiragana: "\\u3040-\\u309F",
|
|
95
|
+
Katakana: "\\u30A0-\\u30FF"
|
|
96
|
+
};
|
|
97
|
+
const SYNTAX = MutableHashSet.make("^", "$", "\\", ".", "*", "+", "?", "(", ")", "[", "]", "{", "}", "|", "/");
|
|
98
|
+
const escapeOf = Match.fn((c, _t) => c).pipe(Match.withReturnType(), Match.when("n", () => ({
|
|
99
|
+
kind: "char",
|
|
100
|
+
text: "\\n"
|
|
101
|
+
})), Match.when("r", () => ({
|
|
102
|
+
kind: "char",
|
|
103
|
+
text: "\\r"
|
|
104
|
+
})), Match.when("t", () => ({
|
|
105
|
+
kind: "char",
|
|
106
|
+
text: "\\t"
|
|
107
|
+
})), Match.when(Match.is("p", "P"), (c, _c, t) => {
|
|
108
|
+
return {
|
|
109
|
+
kind: "class",
|
|
110
|
+
...t.property(c === "P")
|
|
111
|
+
};
|
|
112
|
+
}), Match.orElse((c, _c, t) => {
|
|
113
|
+
const ce = CLASS_ESCAPES[c];
|
|
114
|
+
if (ce !== void 0) return {
|
|
115
|
+
kind: "class",
|
|
116
|
+
...ce
|
|
117
|
+
};
|
|
118
|
+
if (/[0-9]/.test(c)) return {
|
|
119
|
+
kind: "char",
|
|
120
|
+
text: `\\${c}`
|
|
121
|
+
};
|
|
122
|
+
if (c === "-") return {
|
|
123
|
+
kind: "char",
|
|
124
|
+
text: "\\-"
|
|
125
|
+
};
|
|
126
|
+
if (MutableHashSet.has(SYNTAX, c)) return {
|
|
127
|
+
kind: "char",
|
|
128
|
+
text: `\\${c}`
|
|
129
|
+
};
|
|
130
|
+
return t.fail(`invalid escape \\${c}`);
|
|
131
|
+
}));
|
|
132
|
+
var Translator = class {
|
|
133
|
+
i = 0;
|
|
134
|
+
src;
|
|
135
|
+
dotAll;
|
|
136
|
+
extended;
|
|
137
|
+
constructor(src, dotAll, extended) {
|
|
138
|
+
this.src = src;
|
|
139
|
+
this.dotAll = dotAll;
|
|
140
|
+
this.extended = extended;
|
|
141
|
+
}
|
|
142
|
+
fail(msg) {
|
|
143
|
+
throw new SyntaxError(`${msg} at ${this.i} in /${this.src}/`);
|
|
144
|
+
}
|
|
145
|
+
/** Translates a property escape `\p{..}` / `\P{..}` (cursor after `p`/`P`). */
|
|
146
|
+
property(negated) {
|
|
147
|
+
if (this.src[this.i] !== "{") this.fail("expected {");
|
|
148
|
+
const end = this.src.indexOf("}", this.i);
|
|
149
|
+
if (end === -1) this.fail("unterminated property escape");
|
|
150
|
+
const name = this.src.slice(this.i + 1, end);
|
|
151
|
+
this.i = end + 1;
|
|
152
|
+
if (name.startsWith("Is")) {
|
|
153
|
+
const block = BLOCKS[name.slice(2)];
|
|
154
|
+
if (block === void 0) this.fail(`unsupported block ${name}`);
|
|
155
|
+
return {
|
|
156
|
+
body: block,
|
|
157
|
+
negated
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
body: `\\p{${name}}`,
|
|
162
|
+
negated
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** Reads an escape inside or outside a class (cursor after the backslash). */
|
|
166
|
+
escape() {
|
|
167
|
+
const c = this.src[this.i++];
|
|
168
|
+
if (c === void 0) this.fail("dangling backslash");
|
|
169
|
+
return escapeOf(c, this);
|
|
170
|
+
}
|
|
171
|
+
/** Translates a character class (cursor after `[`); returns a JS fragment. */
|
|
172
|
+
charClass() {
|
|
173
|
+
const negated = this.src[this.i] === "^";
|
|
174
|
+
if (negated) this.i++;
|
|
175
|
+
const state = {
|
|
176
|
+
extra: [],
|
|
177
|
+
subtraction: Option.none()
|
|
178
|
+
};
|
|
179
|
+
const raw = Arr.unfold(true, (first) => Option.map(this.classAtom(first, state), (fragment) => [fragment, false])).join("");
|
|
180
|
+
const body = restoreRanges(raw);
|
|
181
|
+
const { extra } = state;
|
|
182
|
+
const set = Arr.isReadonlyArrayEmpty(extra) ? `[${negated ? "^" : ""}${body}]` : this.union(negated, [...body === "" ? [] : [`[${body}]`], ...extra]);
|
|
183
|
+
return Option.match(state.subtraction, {
|
|
184
|
+
onNone: () => set,
|
|
185
|
+
onSome: (subtraction) => `(?:(?!${subtraction})${set})`
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/** A class with complemented escapes: the union of its alternatives (or its complement). */
|
|
189
|
+
union(negated, alts) {
|
|
190
|
+
const union = `(?:${alts.join("|")})`;
|
|
191
|
+
return negated ? `(?:(?!${union})[\\s\\S])` : union;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Reads the next atom of a character class, returning its body fragment,
|
|
195
|
+
* or none once the class ends (`]`, or a subtraction, which ends it).
|
|
196
|
+
*/
|
|
197
|
+
classAtom(first, state) {
|
|
198
|
+
const c = this.src[this.i];
|
|
199
|
+
if (c === void 0) this.fail("unterminated character class");
|
|
200
|
+
if (c === "]" && !first) {
|
|
201
|
+
this.i++;
|
|
202
|
+
return Option.none();
|
|
203
|
+
}
|
|
204
|
+
if (c === "-" && this.src[this.i + 1] === "[") {
|
|
205
|
+
this.i += 2;
|
|
206
|
+
state.subtraction = Option.some(this.charClass());
|
|
207
|
+
if (this.src[this.i] !== "]") this.fail("expected ] after class subtraction");
|
|
208
|
+
this.i++;
|
|
209
|
+
return Option.none();
|
|
210
|
+
}
|
|
211
|
+
this.i++;
|
|
212
|
+
if (c === "\\") {
|
|
213
|
+
const e = this.escape();
|
|
214
|
+
if (e.kind === "char") return Option.some(e.text);
|
|
215
|
+
if (!e.negated) return Option.some(e.body);
|
|
216
|
+
state.extra.push(`[^${e.body}]`);
|
|
217
|
+
return Option.some("");
|
|
218
|
+
}
|
|
219
|
+
if (c === "[" || c === "/" || c === "{" || c === "}" || c === "(" || c === ")" || c === "|") return Option.some(`\\${c}`);
|
|
220
|
+
return Option.some(c === "-" ? "\\-" : c);
|
|
221
|
+
}
|
|
222
|
+
/** Translates the atom at the cursor (outside a class). */
|
|
223
|
+
atom() {
|
|
224
|
+
const c = this.src.charAt(this.i);
|
|
225
|
+
if (this.extended && /\s/.test(c)) {
|
|
226
|
+
this.i++;
|
|
227
|
+
return "";
|
|
228
|
+
}
|
|
229
|
+
if (c === "\\") {
|
|
230
|
+
this.i++;
|
|
231
|
+
const e = this.escape();
|
|
232
|
+
return e.kind === "char" ? e.text === "\\-" ? "-" : e.text : `[${e.negated ? "^" : ""}${e.body}]`;
|
|
233
|
+
}
|
|
234
|
+
if (c === "[") {
|
|
235
|
+
this.i++;
|
|
236
|
+
return this.charClass();
|
|
237
|
+
}
|
|
238
|
+
if (c === "{") {
|
|
239
|
+
const q = /^\{\d+(?:,\d*)?\}/.exec(this.src.slice(this.i));
|
|
240
|
+
if (q !== null) {
|
|
241
|
+
this.i += q[0].length;
|
|
242
|
+
return q[0];
|
|
243
|
+
}
|
|
244
|
+
this.i++;
|
|
245
|
+
return "\\{";
|
|
246
|
+
}
|
|
247
|
+
this.i++;
|
|
248
|
+
if (c === ".") return this.dotAll ? "[\\s\\S]" : "[^\\n\\r]";
|
|
249
|
+
if (c === "/") return "\\/";
|
|
250
|
+
if (c === "]" || c === "}") return `\\${c}`;
|
|
251
|
+
return c;
|
|
252
|
+
}
|
|
253
|
+
translate() {
|
|
254
|
+
return Arr.unfold(this, (t) => t.i < t.src.length ? Option.some([t.atom(), t]) : Option.none()).join("");
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
/**
|
|
258
|
+
* Inside a translated class body, a `-` between two class atoms that was
|
|
259
|
+
* written unescaped is a range; we escaped every `-` while scanning, so turn
|
|
260
|
+
* back those that had atoms on both sides in the source.
|
|
261
|
+
*/
|
|
262
|
+
const restoreRanges = (body) => {
|
|
263
|
+
const atoms = body.match(CLASS_ATOM) ?? [];
|
|
264
|
+
const endpointAt = (k) => {
|
|
265
|
+
const a = atoms[k];
|
|
266
|
+
return a !== void 0 && isRangeEndpoint(a);
|
|
267
|
+
};
|
|
268
|
+
return Arr.map(atoms, (a, k) => a === "\\-" && endpointAt(k - 1) && endpointAt(k + 1) ? "-" : a).join("");
|
|
269
|
+
};
|
|
270
|
+
const CLASS_ATOM = /\\(?:[pP]\{[^}]*\}|u\{[0-9A-Fa-f]+\}|u[0-9A-Fa-f]{4}|.)|./gsu;
|
|
271
|
+
const isRangeEndpoint = (atom) => !/^\\[pPdDwWsS]/.test(atom) && atom !== "\\-";
|
|
272
|
+
/**
|
|
273
|
+
* Compiles an XPath regular expression with XPath flags (`s`, `m`, `i`, `x`,
|
|
274
|
+
* `q`) to a JavaScript `RegExp` (Unicode mode).
|
|
275
|
+
*
|
|
276
|
+
* @internal
|
|
277
|
+
*/
|
|
278
|
+
const compileXPathRegex = (pattern, flags) => {
|
|
279
|
+
if (flags.includes("q")) {
|
|
280
|
+
const escaped = pattern.replace(/[\\^$.*+?()[\]{}|/-]/g, "\\$&");
|
|
281
|
+
return new RegExp(escaped, `u${flags.includes("i") ? "i" : ""}`);
|
|
282
|
+
}
|
|
283
|
+
const source = new Translator(pattern, flags.includes("s"), flags.includes("x")).translate();
|
|
284
|
+
let jsFlags = "u";
|
|
285
|
+
if (flags.includes("i")) jsFlags += "i";
|
|
286
|
+
if (flags.includes("m")) jsFlags += "m";
|
|
287
|
+
return new RegExp(source, jsFlags);
|
|
288
|
+
};
|
|
289
|
+
// src/shex/internal/nodeConstraint.ts
|
|
290
|
+
/**
|
|
291
|
+
* Node constraint evaluation (`satisfies2`): node kinds, datatypes, XML
|
|
292
|
+
* Schema string and numeric facets, and value sets.
|
|
293
|
+
*
|
|
294
|
+
* @internal
|
|
295
|
+
*/
|
|
296
|
+
const XSD = "http://www.w3.org/2001/XMLSchema#";
|
|
297
|
+
const XSD_STRING = `${XSD}string`;
|
|
298
|
+
const RDF_LANG_STRING = "http://www.w3.org/1999/02/22-rdf-syntax-ns#langString";
|
|
299
|
+
const decimalDerived = MutableHashSet.fromIterable([
|
|
300
|
+
"decimal",
|
|
301
|
+
"integer",
|
|
302
|
+
"nonPositiveInteger",
|
|
303
|
+
"negativeInteger",
|
|
304
|
+
"long",
|
|
305
|
+
"int",
|
|
306
|
+
"short",
|
|
307
|
+
"byte",
|
|
308
|
+
"nonNegativeInteger",
|
|
309
|
+
"unsignedLong",
|
|
310
|
+
"unsignedInt",
|
|
311
|
+
"unsignedShort",
|
|
312
|
+
"unsignedByte",
|
|
313
|
+
"positiveInteger"
|
|
314
|
+
].map((l) => XSD + l));
|
|
315
|
+
/** The string a string facet applies to. */
|
|
316
|
+
const lexicalForm = (n) => isLiteral(n) || isNamedNode(n) || isBlankNode(n) ? n.value : n.key;
|
|
317
|
+
/** The number of code points (a lone surrogate counts as one, as string iteration does). */
|
|
318
|
+
const codePointLength = (s) => s.length - (s.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)?.length ?? 0);
|
|
319
|
+
const regexCache = MutableHashMap.empty();
|
|
320
|
+
/** Compiles (once) an XPath pattern; fails with the reason it is invalid. */
|
|
321
|
+
const getRegex = (pattern, flags) => {
|
|
322
|
+
const key = `${flags}/${pattern}`;
|
|
323
|
+
return Option.getOrElse(MutableHashMap.get(regexCache, key), () => {
|
|
324
|
+
const re = Result.try({
|
|
325
|
+
try: () => compileXPathRegex(pattern, flags),
|
|
326
|
+
catch: (e) => Predicate.hasProperty(e, "message") && Predicate.isString(e.message) ? e.message : String(e)
|
|
327
|
+
});
|
|
328
|
+
MutableHashMap.set(regexCache, key, re);
|
|
329
|
+
return re;
|
|
330
|
+
});
|
|
331
|
+
};
|
|
332
|
+
const decimalParts = (lexical) => {
|
|
333
|
+
const m = /^([+-]?)(\d*)(?:\.(\d*))?$/.exec(lexical.trim());
|
|
334
|
+
if (m === null || (m[2] ?? "") === "" && (m[3] ?? "") === "") return Option.none();
|
|
335
|
+
const int = (m[2] ?? "").replace(/^0+/, "");
|
|
336
|
+
const frac = (m[3] ?? "").replace(/0+$/, "");
|
|
337
|
+
return Option.some({
|
|
338
|
+
negative: m[1] === "-" && (int !== "" || frac !== ""),
|
|
339
|
+
int,
|
|
340
|
+
frac
|
|
341
|
+
});
|
|
342
|
+
};
|
|
343
|
+
const compareDecimalParts = (a, b) => {
|
|
344
|
+
if (a.negative !== b.negative) return a.negative ? -1 : 1;
|
|
345
|
+
const sign = a.negative ? -1 : 1;
|
|
346
|
+
if (a.int.length !== b.int.length) return sign * (a.int.length < b.int.length ? -1 : 1);
|
|
347
|
+
if (a.int !== b.int) return sign * (a.int < b.int ? -1 : 1);
|
|
348
|
+
const len = Math.max(a.frac.length, b.frac.length);
|
|
349
|
+
const fa = a.frac.padEnd(len, "0");
|
|
350
|
+
const fb = b.frac.padEnd(len, "0");
|
|
351
|
+
if (fa === fb) return 0;
|
|
352
|
+
return sign * (fa < fb ? -1 : 1);
|
|
353
|
+
};
|
|
354
|
+
const numberToDecimalParts = (n) => {
|
|
355
|
+
if (!Number.isFinite(n)) return Option.none();
|
|
356
|
+
const s = String(n);
|
|
357
|
+
if (/e/i.test(s)) {
|
|
358
|
+
const m = /^(-?)(\d+)(?:\.(\d+))?e([+-]\d+)$/i.exec(s);
|
|
359
|
+
if (m === null) return Option.none();
|
|
360
|
+
const digits = (m[2] ?? "") + (m[3] ?? "");
|
|
361
|
+
const exp = parseInt(m[4] ?? "", 10) - (m[3] ?? "").length;
|
|
362
|
+
const body = exp >= 0 ? digits + "0".repeat(exp) : (() => {
|
|
363
|
+
const padded = digits.padStart(-exp + 1, "0");
|
|
364
|
+
return `${padded.slice(0, exp)}.${padded.slice(exp)}`;
|
|
365
|
+
})();
|
|
366
|
+
return decimalParts(m[1] + body);
|
|
367
|
+
}
|
|
368
|
+
return decimalParts(s);
|
|
369
|
+
};
|
|
370
|
+
const numericValue = (n) => {
|
|
371
|
+
if (!isLiteral(n)) return Option.none();
|
|
372
|
+
const dt = n.datatype.value;
|
|
373
|
+
if (!isNumericDatatype(dt) || !isValidLexical(dt, n.value)) return Option.none();
|
|
374
|
+
if (MutableHashSet.has(decimalDerived, dt)) return Option.map(decimalParts(n.value), (parts) => ({
|
|
375
|
+
kind: "decimal",
|
|
376
|
+
parts
|
|
377
|
+
}));
|
|
378
|
+
const v = n.value.trim();
|
|
379
|
+
const value = v === "INF" || v === "+INF" ? Infinity : v === "-INF" ? -Infinity : v === "NaN" ? NaN : Number(v);
|
|
380
|
+
return Option.some({
|
|
381
|
+
kind: "float",
|
|
382
|
+
value
|
|
383
|
+
});
|
|
384
|
+
};
|
|
385
|
+
/** Compares a numeric value with a facet; returns NaN when incomparable. */
|
|
386
|
+
const compareWith = (v, facet) => {
|
|
387
|
+
if (v.kind === "decimal") {
|
|
388
|
+
const { parts } = v;
|
|
389
|
+
return Option.match(numberToDecimalParts(facet), {
|
|
390
|
+
onNone: () => Number.isNaN(facet) ? NaN : facet === Infinity ? -1 : 1,
|
|
391
|
+
onSome: (f) => compareDecimalParts(parts, f)
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
if (Number.isNaN(v.value) || Number.isNaN(facet)) return NaN;
|
|
395
|
+
return v.value < facet ? -1 : v.value > facet ? 1 : 0;
|
|
396
|
+
};
|
|
397
|
+
const lowerEq = (a, b) => a.toLowerCase() === b.toLowerCase();
|
|
398
|
+
/** Basic language-range filtering (RFC 4647 §3.3.1). */
|
|
399
|
+
const languageMatches = (tag, range) => {
|
|
400
|
+
if (range === "" || range === "*") return tag !== "";
|
|
401
|
+
const t = tag.toLowerCase();
|
|
402
|
+
const r = range.toLowerCase();
|
|
403
|
+
return t === r || t.startsWith(`${r}-`);
|
|
404
|
+
};
|
|
405
|
+
const literalEquals = (n, v) => {
|
|
406
|
+
if (n.value !== v.value) return false;
|
|
407
|
+
if (v.language !== void 0) return n.language !== "" && lowerEq(n.language, v.language);
|
|
408
|
+
if (n.language !== "") return false;
|
|
409
|
+
return n.datatype.value === (v.type ?? XSD_STRING);
|
|
410
|
+
};
|
|
411
|
+
/**
|
|
412
|
+
* Whether a value is in an IRI or literal stem range: under its stem (any
|
|
413
|
+
* value, for a wildcard) and under none of its exclusions.
|
|
414
|
+
*/
|
|
415
|
+
const inStemRange = (value, range) => (!Predicate.isString(range.stem) || value.startsWith(range.stem)) && !range.exclusions.some((e) => Predicate.isString(e) ? value === e : value.startsWith(e.stem));
|
|
416
|
+
const stemValueMatches = Match.fn((v, _n) => v).pipe(Match.withReturnType(), Match.when({ type: "IriStem" }, (v, _v, n) => isNamedNode(n) && n.value.startsWith(v.stem)), Match.when({ type: "IriStemRange" }, (v, _v, n) => isNamedNode(n) && inStemRange(n.value, v)), Match.when({ type: "LiteralStem" }, (v, _v, n) => isLiteral(n) && n.value.startsWith(v.stem)), Match.when({ type: "LiteralStemRange" }, (v, _v, n) => isLiteral(n) && inStemRange(n.value, v)), Match.when({ type: "Language" }, (v, _v, n) => isLiteral(n) && n.language !== "" && lowerEq(n.language, v.languageTag)), Match.when({ type: "LanguageStem" }, (v, _v, n) => isLiteral(n) && n.language !== "" && languageMatches(n.language, v.stem)), Match.when({ type: "LanguageStemRange" }, (v, _v, n) => {
|
|
417
|
+
if (!isLiteral(n) || n.language === "") return false;
|
|
418
|
+
if (Predicate.isString(v.stem) && !languageMatches(n.language, v.stem)) return false;
|
|
419
|
+
return !v.exclusions.some((e) => Predicate.isString(e) ? lowerEq(n.language, e) : languageMatches(n.language, e.stem));
|
|
420
|
+
}), Match.orElse(() => false));
|
|
421
|
+
/**
|
|
422
|
+
* Whether a term matches a value set value.
|
|
423
|
+
*
|
|
424
|
+
* @internal
|
|
425
|
+
*/
|
|
426
|
+
const valueMatches = (n, v) => {
|
|
427
|
+
if (Predicate.isString(v)) return isNamedNode(n) && n.value === v;
|
|
428
|
+
if (!("type" in v) || "value" in v) return isLiteral(n) && literalEquals(n, v);
|
|
429
|
+
return stemValueMatches(v, n);
|
|
430
|
+
};
|
|
431
|
+
const failure = (cond, message) => cond ? Option.some(message()) : Option.none();
|
|
432
|
+
const nodeKindFailure = Match.fn((nc, _n) => nc.nodeKind).pipe(Match.withReturnType(), Match.when("iri", (_kind, _nc, n) => failure(!isNamedNode(n), () => `${n.key} is not an IRI`)), Match.when("bnode", (_kind, _nc, n) => failure(!isBlankNode(n), () => `${n.key} is not a blank node`)), Match.when("literal", (_kind, _nc, n) => failure(!isLiteral(n), () => `${n.key} is not a literal`)), Match.when("nonliteral", (_kind, _nc, n) => failure(!isResource(n), () => `${n.key} is not an IRI or blank node`)), Match.orElse(() => Option.none()));
|
|
433
|
+
/** The numeric range facets: how each reads its limit, and which comparisons it accepts. */
|
|
434
|
+
const numericFacets = [
|
|
435
|
+
[
|
|
436
|
+
"mininclusive",
|
|
437
|
+
(nc) => Option.fromUndefinedOr(nc.mininclusive),
|
|
438
|
+
(c) => c >= 0
|
|
439
|
+
],
|
|
440
|
+
[
|
|
441
|
+
"minexclusive",
|
|
442
|
+
(nc) => Option.fromUndefinedOr(nc.minexclusive),
|
|
443
|
+
(c) => c > 0
|
|
444
|
+
],
|
|
445
|
+
[
|
|
446
|
+
"maxinclusive",
|
|
447
|
+
(nc) => Option.fromUndefinedOr(nc.maxinclusive),
|
|
448
|
+
(c) => c <= 0
|
|
449
|
+
],
|
|
450
|
+
[
|
|
451
|
+
"maxexclusive",
|
|
452
|
+
(nc) => Option.fromUndefinedOr(nc.maxexclusive),
|
|
453
|
+
(c) => c < 0
|
|
454
|
+
]
|
|
455
|
+
];
|
|
456
|
+
/** The datatype check of a node constraint with a `datatype`. */
|
|
457
|
+
const datatypeFailure = (n, datatype) => {
|
|
458
|
+
if (!isLiteral(n)) return Option.some(`${n.key} is not a literal of datatype <${datatype}>`);
|
|
459
|
+
if ((n.language !== "" ? RDF_LANG_STRING : n.datatype.value) !== datatype && !(n.language !== "" && n.datatype.value === datatype)) return Option.some(`${n.key} does not have datatype <${datatype}>`);
|
|
460
|
+
return failure(n.language === "" && (!isValidLexical(datatype, n.value) || (datatype === `${XSD}float` || datatype === `${XSD}double`) && n.value === "+INF"), () => `${n.key} is not a valid <${datatype}>`);
|
|
461
|
+
};
|
|
462
|
+
/** The string facets (`length`, `minlength`, `maxlength`, `pattern`). */
|
|
463
|
+
const stringFacetFailure = (n, nc) => {
|
|
464
|
+
const lex = lexicalForm(n);
|
|
465
|
+
const len = codePointLength(lex);
|
|
466
|
+
if (nc.length !== void 0 && len !== nc.length) return Option.some(`${n.key} has length ${len}, expected ${nc.length}`);
|
|
467
|
+
if (nc.minlength !== void 0 && len < nc.minlength) return Option.some(`${n.key} has length ${len}, expected at least ${nc.minlength}`);
|
|
468
|
+
if (nc.maxlength !== void 0 && len > nc.maxlength) return Option.some(`${n.key} has length ${len}, expected at most ${nc.maxlength}`);
|
|
469
|
+
if (nc.pattern === void 0) return Option.none();
|
|
470
|
+
const compiled = getRegex(nc.pattern, nc.flags ?? "");
|
|
471
|
+
if (Result.isFailure(compiled)) return Option.some(`invalid pattern /${nc.pattern}/: ${compiled.failure}`);
|
|
472
|
+
const re = compiled.success;
|
|
473
|
+
re.lastIndex = 0;
|
|
474
|
+
return failure(!re.test(lex), () => `${n.key} does not match /${nc.pattern}/${nc.flags ?? ""}`);
|
|
475
|
+
};
|
|
476
|
+
/** The numeric range facets, in order: the first one the node violates. */
|
|
477
|
+
const numericFacetFailure = (n, nc) => Arr.findFirst(numericFacets, ([facet, limitOf, ok]) => Option.flatMap(limitOf(nc), (limit) => Option.match(numericValue(n), {
|
|
478
|
+
onNone: () => Option.some(`${n.key} is not numeric (${facet})`),
|
|
479
|
+
onSome: (v) => failure(!ok(compareWith(v, limit)), () => `${n.key} violates ${facet} ${limit}`)
|
|
480
|
+
})));
|
|
481
|
+
/** The digits facets (`totaldigits`, `fractiondigits`). */
|
|
482
|
+
const digitsFailure = (n, nc) => {
|
|
483
|
+
const parts = isLiteral(n) && MutableHashSet.has(decimalDerived, n.datatype.value) && isValidLexical(n.datatype.value, n.value) ? decimalParts(n.value) : Option.none();
|
|
484
|
+
return Option.match(parts, {
|
|
485
|
+
onNone: () => Option.some(`${n.key} is not an xsd:decimal value`),
|
|
486
|
+
onSome: ({ int, frac }) => {
|
|
487
|
+
const total = Math.max(1, int.length + frac.length);
|
|
488
|
+
if (nc.totaldigits !== void 0 && total > nc.totaldigits) return Option.some(`${n.key} has ${total} digits, expected at most ${nc.totaldigits}`);
|
|
489
|
+
return failure(nc.fractiondigits !== void 0 && frac.length > nc.fractiondigits, () => `${n.key} has ${frac.length} fraction digits, expected at most ${nc.fractiondigits}`);
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
};
|
|
493
|
+
/**
|
|
494
|
+
* Evaluates a node constraint (without its semantic actions): none on
|
|
495
|
+
* success, or the reason it fails.
|
|
496
|
+
*
|
|
497
|
+
* @internal
|
|
498
|
+
*/
|
|
499
|
+
const checkNodeConstraint = (n, nc) => {
|
|
500
|
+
const kindFailure = nodeKindFailure(nc, n);
|
|
501
|
+
if (Option.isSome(kindFailure)) return kindFailure;
|
|
502
|
+
if (nc.datatype !== void 0) {
|
|
503
|
+
const f = datatypeFailure(n, nc.datatype);
|
|
504
|
+
if (Option.isSome(f)) return f;
|
|
505
|
+
}
|
|
506
|
+
if (nc.length !== void 0 || nc.minlength !== void 0 || nc.maxlength !== void 0 || nc.pattern !== void 0) {
|
|
507
|
+
const f = stringFacetFailure(n, nc);
|
|
508
|
+
if (Option.isSome(f)) return f;
|
|
509
|
+
}
|
|
510
|
+
const numeric = numericFacetFailure(n, nc);
|
|
511
|
+
if (Option.isSome(numeric)) return numeric;
|
|
512
|
+
if (nc.totaldigits !== void 0 || nc.fractiondigits !== void 0) {
|
|
513
|
+
const f = digitsFailure(n, nc);
|
|
514
|
+
if (Option.isSome(f)) return f;
|
|
515
|
+
}
|
|
516
|
+
return failure(nc.values !== void 0 && !nc.values.some((v) => valueMatches(n, v)), () => `${n.key} is not in the value set`);
|
|
517
|
+
};
|
|
518
|
+
// src/shex/internal/engine.ts
|
|
519
|
+
/**
|
|
520
|
+
* The ShEx validation engine: a synchronous evaluator of `satisfies` with
|
|
521
|
+
* memoisation and coinductive (greatest fixed point) handling of recursive
|
|
522
|
+
* references, partition search for triple expressions over bags of triple
|
|
523
|
+
* constraint assignments, and ShEx 2.2 `EXTENDS` / `ABSTRACT` /
|
|
524
|
+
* `RESTRICTS` semantics.
|
|
525
|
+
*
|
|
526
|
+
* @internal
|
|
527
|
+
*/
|
|
528
|
+
const FULL = {
|
|
529
|
+
arcs: Option.none(),
|
|
530
|
+
target: Option.none(),
|
|
531
|
+
partitionClosed: false
|
|
532
|
+
};
|
|
533
|
+
const success = Option.none();
|
|
534
|
+
const unused = {
|
|
535
|
+
used: false,
|
|
536
|
+
r: success
|
|
537
|
+
};
|
|
538
|
+
/** A failure reason as the messages print it (`undefined` when there is none). */
|
|
539
|
+
const show = (o) => Option.getOrElse(o, () => "undefined");
|
|
540
|
+
const bagKey = (bag) => bag.join(",");
|
|
541
|
+
const dedupe = (bags) => Arr.fromIterable(MutableHashMap.values(MutableHashMap.fromIterable(Arr.map(bags, (b) => [bagKey(b), b]))));
|
|
542
|
+
/** The first of the alternatives of a `ShapeOr` that `n` satisfies, preferring the target. */
|
|
543
|
+
const satisfiesOr = (e, engine, n, ctx, deps) => {
|
|
544
|
+
let first = Option.none();
|
|
545
|
+
let passed = false;
|
|
546
|
+
return Arr.some(e.shapeExprs, (c) => {
|
|
547
|
+
const before = Option.match(ctx.target, {
|
|
548
|
+
onNone: () => 0,
|
|
549
|
+
onSome: (t) => t.count
|
|
550
|
+
});
|
|
551
|
+
const r = engine.satisfies(n, c, ctx, deps, Option.none());
|
|
552
|
+
if (Option.isNone(r)) {
|
|
553
|
+
if (Option.match(ctx.target, {
|
|
554
|
+
onNone: () => true,
|
|
555
|
+
onSome: (t) => t.count > before
|
|
556
|
+
})) return true;
|
|
557
|
+
passed = true;
|
|
558
|
+
} else if (Option.isNone(first)) first = r;
|
|
559
|
+
return false;
|
|
560
|
+
}) || passed ? success : Option.some(`${n.key} matches none of the alternatives (${show(first)})`);
|
|
561
|
+
};
|
|
562
|
+
const satisfiesExpr = Match.fn((e, _engine, _n, _ctx, _deps, _declLabel) => e).pipe(Match.withReturnType(), Match.when({ type: "ShapeAnd" }, (e, _e, engine, n, ctx, deps) => Arr.findFirst(e.shapeExprs, (c) => engine.satisfies(n, c, ctx, deps, Option.none()))), Match.when({ type: "ShapeOr" }, (e, _e, engine, n, ctx, deps) => satisfiesOr(e, engine, n, ctx, deps)), Match.when({ type: "ShapeNot" }, (e, _e, engine, n, ctx, deps) => Option.isNone(engine.satisfies(n, e.shapeExpr, ctx, deps, Option.none())) ? Option.some(`${n.key} matches a negated shape expression`) : success), Match.when({ type: "NodeConstraint" }, (e, _e, engine, n) => {
|
|
563
|
+
const r = checkNodeConstraint(n, e);
|
|
564
|
+
if (Option.isSome(r)) return r;
|
|
565
|
+
return engine.runSemActs(e.semActs, {
|
|
566
|
+
site: "nodeConstraint",
|
|
567
|
+
node: n
|
|
568
|
+
});
|
|
569
|
+
}), Match.when({ type: "ShapeExternal" }, (_e, _input, engine, n, ctx, deps, declLabel) => Option.match(Option.flatMap(declLabel, (l) => MutableHashMap.get(engine.externs, l)), {
|
|
570
|
+
onNone: () => Option.some(`no definition available for external shape ${Option.getOrElse(declLabel, () => "undefined")}`),
|
|
571
|
+
onSome: (ext) => engine.satisfies(n, ext.shapeExpr, ctx, deps, Option.none())
|
|
572
|
+
})), Match.when({ type: "Shape" }, (e, _e, engine, n, ctx, deps) => engine.matchesShape(n, e, ctx, deps)), Match.exhaustive);
|
|
573
|
+
/** Appends to `out` the triple constraints of `tcs` it does not have yet. */
|
|
574
|
+
const addAll = (out, tcs) => tcs.forEach((tc) => {
|
|
575
|
+
if (!out.includes(tc)) out.push(tc);
|
|
576
|
+
});
|
|
577
|
+
const extensionTcsOf = Match.fn((e, _engine, _out, _seen) => e).pipe(Match.when({ type: "Shape" }, (e, _e, engine, out, seen) => {
|
|
578
|
+
addAll(out, engine.localTcs(e));
|
|
579
|
+
e.extends?.forEach((x) => engine.extensionTcs(x, out, seen));
|
|
580
|
+
}), Match.when({ type: Match.is("ShapeAnd", "ShapeOr") }, (e, _e, engine, out, seen) => {
|
|
581
|
+
e.shapeExprs.forEach((c) => engine.extensionTcs(c, out, seen));
|
|
582
|
+
}), Match.when({ type: "ShapeNot" }, (e, _e, engine, out, seen) => {
|
|
583
|
+
engine.extensionTcs(e.shapeExpr, out, seen);
|
|
584
|
+
}), Match.orElse(() => void 0));
|
|
585
|
+
/** The arcs of `quads` in one direction, each triple once. */
|
|
586
|
+
const arcsOf = (quads, dir, valueOf) => {
|
|
587
|
+
const seen = MutableHashSet.empty();
|
|
588
|
+
return Arr.filterMap(Arr.fromIterable(quads), (q) => {
|
|
589
|
+
const t = triple(q.subject, q.predicate, q.object);
|
|
590
|
+
if (MutableHashSet.has(seen, t.key)) return Result.failVoid;
|
|
591
|
+
MutableHashSet.add(seen, t.key);
|
|
592
|
+
return Result.succeed({
|
|
593
|
+
triple: t,
|
|
594
|
+
dir,
|
|
595
|
+
predicate: q.predicate.value,
|
|
596
|
+
value: valueOf(q)
|
|
597
|
+
});
|
|
598
|
+
});
|
|
599
|
+
};
|
|
600
|
+
var Engine = class {
|
|
601
|
+
cache = MutableHashMap.empty();
|
|
602
|
+
inProgress = MutableHashSet.empty();
|
|
603
|
+
neighbourhoods = MutableHashMap.empty();
|
|
604
|
+
shapeTcs = /* @__PURE__ */ new WeakMap();
|
|
605
|
+
index;
|
|
606
|
+
dataset;
|
|
607
|
+
handler;
|
|
608
|
+
externs;
|
|
609
|
+
constructor(index, dataset, handler, externs) {
|
|
610
|
+
this.index = index;
|
|
611
|
+
this.dataset = dataset;
|
|
612
|
+
this.handler = handler;
|
|
613
|
+
this.externs = externs;
|
|
614
|
+
}
|
|
615
|
+
neighbourhood(n) {
|
|
616
|
+
return Option.getOrElse(MutableHashMap.get(this.neighbourhoods, n.key), () => {
|
|
617
|
+
const arcs = [...isResource(n) || isTriple(n) ? arcsOf(match(this.dataset, { subject: n }), "out", (q) => q.object) : [], ...!isVariable(n) && !isDefaultGraph(n) ? arcsOf(match(this.dataset, { object: n }), "in", (q) => q.subject) : []];
|
|
618
|
+
MutableHashMap.set(this.neighbourhoods, n.key, arcs);
|
|
619
|
+
return arcs;
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
runSemActs(acts = [], context) {
|
|
623
|
+
return Arr.findFirst(acts, (act) => {
|
|
624
|
+
const r = this.handler(act, context);
|
|
625
|
+
return Option.isSome(r) && !r.value ? Option.some(`semantic action <${act.name}> failed`) : Option.none();
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
/** Validates `n` against a shape label (or a descendant) on its full neighbourhood. */
|
|
629
|
+
validateLabel(n, label, deps) {
|
|
630
|
+
return this.memoized(`${n.key}\u0000${label}`, deps, (local) => this.satisfiesDescendant(n, label, local));
|
|
631
|
+
}
|
|
632
|
+
/** Validates `n` against the start shape expression. */
|
|
633
|
+
validateStart(n, deps) {
|
|
634
|
+
const start = this.index.schema.start;
|
|
635
|
+
if (start === void 0) return Option.some("the schema has no start shape");
|
|
636
|
+
return this.memoized(`${n.key}\u0000\u0000START`, deps, (local) => this.satisfies(n, start, FULL, local, Option.none()));
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Runs `check` once per `key` (a node and shape pair), caching its outcome.
|
|
640
|
+
* A key already in progress is a recursive reference: it succeeds for now
|
|
641
|
+
* and is reported to the caller in `deps`, and an outcome is cached only
|
|
642
|
+
* once it no longer depends on an unfinished key.
|
|
643
|
+
*/
|
|
644
|
+
memoized(key, deps, check) {
|
|
645
|
+
const cached = MutableHashMap.get(this.cache, key);
|
|
646
|
+
if (Option.isSome(cached)) return cached.value;
|
|
647
|
+
if (MutableHashSet.has(this.inProgress, key)) {
|
|
648
|
+
MutableHashSet.add(deps, key);
|
|
649
|
+
return success;
|
|
650
|
+
}
|
|
651
|
+
MutableHashSet.add(this.inProgress, key);
|
|
652
|
+
const local = MutableHashSet.empty();
|
|
653
|
+
const result = Result.try(() => check(local));
|
|
654
|
+
MutableHashSet.remove(this.inProgress, key);
|
|
655
|
+
if (Result.isFailure(result)) throw result.failure;
|
|
656
|
+
const r = result.success;
|
|
657
|
+
MutableHashSet.remove(local, key);
|
|
658
|
+
if (Option.isSome(r) || MutableHashSet.size(local) === 0) MutableHashMap.set(this.cache, key, r);
|
|
659
|
+
Iterable.forEach(local, (d) => MutableHashSet.add(deps, d));
|
|
660
|
+
return r;
|
|
661
|
+
}
|
|
662
|
+
satisfiesDescendant(n, label, deps) {
|
|
663
|
+
if (this.index.shapes.get(label) === void 0) return Option.some(`unknown shape ${label}`);
|
|
664
|
+
const candidates = [label, ...this.index.descendants.get(label) ?? []].filter((l) => this.index.shapes.get(l)?.abstract !== true);
|
|
665
|
+
if (Arr.isReadonlyArrayEmpty(candidates)) return Option.some(`${label} is abstract and has no concrete extension`);
|
|
666
|
+
let first = Option.none();
|
|
667
|
+
return Arr.some(candidates, (c) => {
|
|
668
|
+
const target = c === label ? Option.none() : Option.some({
|
|
669
|
+
label,
|
|
670
|
+
count: 0
|
|
671
|
+
});
|
|
672
|
+
const r = this.satisfiesDecl(n, c, {
|
|
673
|
+
arcs: Option.none(),
|
|
674
|
+
target,
|
|
675
|
+
partitionClosed: false
|
|
676
|
+
}, deps);
|
|
677
|
+
if (Option.isNone(r) && Option.match(target, {
|
|
678
|
+
onNone: () => true,
|
|
679
|
+
onSome: (t) => t.count > 0
|
|
680
|
+
})) return true;
|
|
681
|
+
if (Option.isNone(first)) first = Option.orElse(r, () => Option.some(`${n.key} matches ${c} but not through ${label}`));
|
|
682
|
+
return false;
|
|
683
|
+
}) ? success : first;
|
|
684
|
+
}
|
|
685
|
+
satisfiesDecl(n, label, ctx, deps) {
|
|
686
|
+
const decl = this.index.shapes.get(label);
|
|
687
|
+
if (decl === void 0) return Option.some(`unknown shape ${label}`);
|
|
688
|
+
return Arr.findFirst([...decl.restricts ?? [], decl.shapeExpr], (e) => this.satisfies(n, e, ctx, deps, Option.some(label)));
|
|
689
|
+
}
|
|
690
|
+
satisfies(n, e, ctx, deps, declLabel) {
|
|
691
|
+
if (Predicate.isString(e)) {
|
|
692
|
+
if (Option.isNone(ctx.arcs)) return this.validateLabel(n, e, deps);
|
|
693
|
+
const r = this.satisfiesDecl(n, e, ctx, deps);
|
|
694
|
+
if (Option.isNone(r) && Option.isSome(ctx.target) && ctx.target.value.label === e) ctx.target.value.count++;
|
|
695
|
+
return r;
|
|
696
|
+
}
|
|
697
|
+
return satisfiesExpr(e, this, n, ctx, deps, declLabel);
|
|
698
|
+
}
|
|
699
|
+
/** The triple constraints of a triple expression (through inclusions). */
|
|
700
|
+
tcsOf(te, out, seen) {
|
|
701
|
+
if (Predicate.isString(te)) {
|
|
702
|
+
if (MutableHashSet.has(seen, te)) return;
|
|
703
|
+
MutableHashSet.add(seen, te);
|
|
704
|
+
const included = this.index.tripleExprs.get(te);
|
|
705
|
+
if (included !== void 0) this.tcsOf(included, out, seen);
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
if (te.type === "TripleConstraint") {
|
|
709
|
+
if (!out.includes(te)) out.push(te);
|
|
710
|
+
} else te.expressions.forEach((c) => this.tcsOf(c, out, seen));
|
|
711
|
+
}
|
|
712
|
+
localTcs(shape) {
|
|
713
|
+
const cached = this.shapeTcs.get(shape);
|
|
714
|
+
if (cached !== void 0) return cached;
|
|
715
|
+
const out = [];
|
|
716
|
+
if (shape.expression !== void 0) this.tcsOf(shape.expression, out, MutableHashSet.empty());
|
|
717
|
+
this.shapeTcs.set(shape, out);
|
|
718
|
+
return out;
|
|
719
|
+
}
|
|
720
|
+
/** All triple constraints of the shapes an extension refers to (recursively). */
|
|
721
|
+
extensionTcs(e, out, seen) {
|
|
722
|
+
if (Predicate.isString(e)) {
|
|
723
|
+
if (MutableHashSet.has(seen, e)) return;
|
|
724
|
+
MutableHashSet.add(seen, e);
|
|
725
|
+
const decl = this.index.shapes.get(e);
|
|
726
|
+
if (decl !== void 0) {
|
|
727
|
+
decl.restricts?.forEach((r) => this.extensionTcs(r, out, seen));
|
|
728
|
+
this.extensionTcs(decl.shapeExpr, out, seen);
|
|
729
|
+
}
|
|
730
|
+
return;
|
|
731
|
+
}
|
|
732
|
+
extensionTcsOf(e, this, out, seen);
|
|
733
|
+
}
|
|
734
|
+
matchesShape(n, shape, ctx, deps) {
|
|
735
|
+
const arcs = Option.getOrElse(ctx.arcs, () => this.neighbourhood(n));
|
|
736
|
+
const closed = shape.closed === true || ctx.partitionClosed;
|
|
737
|
+
const local = this.localTcs(shape);
|
|
738
|
+
const extensions = shape.extends ?? [];
|
|
739
|
+
const extTcs = Arr.map(extensions, (x) => {
|
|
740
|
+
const out = [];
|
|
741
|
+
this.extensionTcs(x, out, MutableHashSet.empty());
|
|
742
|
+
return out;
|
|
743
|
+
});
|
|
744
|
+
const all = Arr.dedupeWith([...local, ...Arr.flatten(extTcs)], (a, b) => a === b);
|
|
745
|
+
const localIndex = new WeakMap(Arr.map(local, (tc, i) => [tc, i]));
|
|
746
|
+
const extGroupsOf = /* @__PURE__ */ new WeakMap();
|
|
747
|
+
extTcs.forEach((group, i) => group.forEach((tc) => {
|
|
748
|
+
if (localIndex.has(tc)) return;
|
|
749
|
+
const g = extGroupsOf.get(tc);
|
|
750
|
+
if (g === void 0) extGroupsOf.set(tc, [i]);
|
|
751
|
+
else g.push(i);
|
|
752
|
+
}));
|
|
753
|
+
const byPredicate = Arr.groupBy(all, (tc) => `${tc.inverse === true ? "in" : "out"} ${tc.predicate}`);
|
|
754
|
+
const extra = MutableHashSet.fromIterable(shape.extra ?? []);
|
|
755
|
+
const choices = [];
|
|
756
|
+
const valueCache = MutableHashMap.empty();
|
|
757
|
+
const valueOutcome = (tc, valueExpr, arc) => {
|
|
758
|
+
const ck = `${all.indexOf(tc)} ${arc.value.key}`;
|
|
759
|
+
return Option.getOrElse(MutableHashMap.get(valueCache, ck), () => {
|
|
760
|
+
const r = this.satisfies(arc.value, valueExpr, FULL, deps, Option.none());
|
|
761
|
+
MutableHashMap.set(valueCache, ck, r);
|
|
762
|
+
return r;
|
|
763
|
+
});
|
|
764
|
+
};
|
|
765
|
+
const arcFailure = Arr.findFirst(arcs, (arc) => {
|
|
766
|
+
const tcs = byPredicate[`${arc.dir} ${arc.predicate}`];
|
|
767
|
+
if (tcs === void 0) return arc.dir === "out" && closed ? Option.some(`closed shape does not allow ${arc.triple.key}`) : success;
|
|
768
|
+
let firstReason = Option.none();
|
|
769
|
+
const ok = Arr.filter(tcs, (tc) => {
|
|
770
|
+
if (tc.valueExpr === void 0) return true;
|
|
771
|
+
const r = valueOutcome(tc, tc.valueExpr, arc);
|
|
772
|
+
if (Option.isNone(r)) return true;
|
|
773
|
+
if (Option.isNone(firstReason)) firstReason = r;
|
|
774
|
+
return false;
|
|
775
|
+
});
|
|
776
|
+
if (Arr.isReadonlyArrayEmpty(ok)) return MutableHashSet.has(extra, arc.predicate) ? success : Option.some(`${arc.triple.key} does not match its triple constraint: ${show(firstReason)}`);
|
|
777
|
+
choices.push({
|
|
778
|
+
arc,
|
|
779
|
+
tcs: ok
|
|
780
|
+
});
|
|
781
|
+
return success;
|
|
782
|
+
});
|
|
783
|
+
if (Option.isSome(arcFailure)) return arcFailure;
|
|
784
|
+
const hasTcSemActs = local.some((tc) => tc.semActs !== void 0);
|
|
785
|
+
const tried = MutableHashSet.empty();
|
|
786
|
+
const assignment = [];
|
|
787
|
+
let firstFailure = Option.none();
|
|
788
|
+
const tryAssignment = () => {
|
|
789
|
+
const counts = Array.from({ length: local.length }, () => 0);
|
|
790
|
+
const partitions = extensions.map(() => []);
|
|
791
|
+
const keyParts = Arr.filterMap(assignment, ({ arc, tc }) => {
|
|
792
|
+
const li = localIndex.get(tc);
|
|
793
|
+
if (li !== void 0) {
|
|
794
|
+
counts[li] = (counts[li] ?? 0) + 1;
|
|
795
|
+
return hasTcSemActs ? Result.succeed(`L${li}`) : Result.failVoid;
|
|
796
|
+
}
|
|
797
|
+
const groups = extGroupsOf.get(tc) ?? [];
|
|
798
|
+
groups.forEach((g) => partitions[g]?.push(arc));
|
|
799
|
+
return Result.succeed(`E${groups.join(".")}`);
|
|
800
|
+
});
|
|
801
|
+
const key = `${counts.join(",")}|${keyParts.join("-")}`;
|
|
802
|
+
if (MutableHashSet.has(tried, key)) return Option.some("duplicate partition");
|
|
803
|
+
MutableHashSet.add(tried, key);
|
|
804
|
+
if (shape.expression !== void 0) {
|
|
805
|
+
if (!this.matchBag(shape.expression, counts, localIndex)) return Option.some(`the triples of ${n.key} do not match the triple expression`);
|
|
806
|
+
} else if (counts.some((c) => c > 0)) return Option.some("unexpected triples");
|
|
807
|
+
const extFailure = Arr.findFirst(extensions, (x, i) => this.satisfies(n, x, {
|
|
808
|
+
arcs: Option.some(partitions[i] ?? []),
|
|
809
|
+
target: ctx.target,
|
|
810
|
+
partitionClosed: closed
|
|
811
|
+
}, deps, Option.none()));
|
|
812
|
+
if (Option.isSome(extFailure)) return extFailure;
|
|
813
|
+
const matched = Arr.map(assignment, ({ arc }) => arc.triple);
|
|
814
|
+
const tcFailure = Arr.findFirst(assignment, ({ arc, tc }) => localIndex.has(tc) ? this.runSemActs(tc.semActs, {
|
|
815
|
+
site: "tripleConstraint",
|
|
816
|
+
node: n,
|
|
817
|
+
triple: arc.triple
|
|
818
|
+
}) : success);
|
|
819
|
+
if (Option.isSome(tcFailure)) return tcFailure;
|
|
820
|
+
if (shape.expression !== void 0) {
|
|
821
|
+
const r = this.groupSemActs(shape.expression, counts, localIndex, n, matched);
|
|
822
|
+
if (Option.isSome(r)) return r;
|
|
823
|
+
}
|
|
824
|
+
return this.runSemActs(shape.semActs, {
|
|
825
|
+
site: "shape",
|
|
826
|
+
node: n,
|
|
827
|
+
triples: matched
|
|
828
|
+
});
|
|
829
|
+
};
|
|
830
|
+
const search = (i) => {
|
|
831
|
+
const choice = choices[i];
|
|
832
|
+
if (choice === void 0) {
|
|
833
|
+
const r = tryAssignment();
|
|
834
|
+
if (Option.isNone(r)) return true;
|
|
835
|
+
if (r.value !== "duplicate partition" && Option.isNone(firstFailure)) firstFailure = r;
|
|
836
|
+
return false;
|
|
837
|
+
}
|
|
838
|
+
return Arr.some(choice.tcs, (tc) => {
|
|
839
|
+
assignment[i] = {
|
|
840
|
+
arc: choice.arc,
|
|
841
|
+
tc
|
|
842
|
+
};
|
|
843
|
+
return search(i + 1);
|
|
844
|
+
});
|
|
845
|
+
};
|
|
846
|
+
if (search(0)) return success;
|
|
847
|
+
return Option.orElse(firstFailure, () => Option.some(`${n.key} does not match the shape`));
|
|
848
|
+
}
|
|
849
|
+
/** Whether the bag of triple constraint counts matches the triple expression. */
|
|
850
|
+
matchBag(te, counts, localIndex) {
|
|
851
|
+
const zero = bagKey(counts.map(() => 0));
|
|
852
|
+
return this.step(te, counts, localIndex, 0).some((b) => bagKey(b) === zero);
|
|
853
|
+
}
|
|
854
|
+
resolveTe(te) {
|
|
855
|
+
return Predicate.isString(te) ? Option.fromUndefinedOr(this.index.tripleExprs.get(te)) : Option.some(te);
|
|
856
|
+
}
|
|
857
|
+
/** All bags remaining after `te` (with its cardinality) consumes part of `bag`. */
|
|
858
|
+
step(te0, bag, localIndex, depth) {
|
|
859
|
+
const resolved = this.resolveTe(te0);
|
|
860
|
+
if (Option.isNone(resolved) || depth > 64) return [];
|
|
861
|
+
const te = resolved.value;
|
|
862
|
+
const { min, max } = cardinality(te);
|
|
863
|
+
if (te.type === "TripleConstraint") {
|
|
864
|
+
const k = localIndex.get(te);
|
|
865
|
+
if (k === void 0) return min === 0 ? [bag] : [];
|
|
866
|
+
const avail = bag[k] ?? 0;
|
|
867
|
+
const hi = Math.min(max, avail);
|
|
868
|
+
return hi < min ? [] : Arr.map(Arr.range(min, hi), (c) => {
|
|
869
|
+
const nb = bag.slice();
|
|
870
|
+
nb[k] = avail - c;
|
|
871
|
+
return nb;
|
|
872
|
+
});
|
|
873
|
+
}
|
|
874
|
+
const once = (b) => te.type === "OneOf" ? dedupe(te.expressions.flatMap((x) => this.step(x, b, localIndex, depth + 1))) : Arr.reduce(te.expressions, [b], (sets, x) => Arr.isReadonlyArrayEmpty(sets) ? sets : dedupe(sets.flatMap((s) => this.step(x, s, localIndex, depth + 1))));
|
|
875
|
+
const result = MutableHashMap.empty();
|
|
876
|
+
if (min === 0) MutableHashMap.set(result, bagKey(bag), bag);
|
|
877
|
+
iterate({
|
|
878
|
+
i: 1,
|
|
879
|
+
frontier: [bag]
|
|
880
|
+
}, ({ i, frontier }) => {
|
|
881
|
+
if (i > max || Arr.isReadonlyArrayEmpty(frontier)) return Option.none();
|
|
882
|
+
const next = dedupe(frontier.flatMap(once));
|
|
883
|
+
if (i < min) return Option.some({
|
|
884
|
+
i: i + 1,
|
|
885
|
+
frontier: next
|
|
886
|
+
});
|
|
887
|
+
const fresh = Arr.filter(next, (b) => {
|
|
888
|
+
const k = bagKey(b);
|
|
889
|
+
if (MutableHashMap.has(result, k)) return false;
|
|
890
|
+
MutableHashMap.set(result, k, b);
|
|
891
|
+
return true;
|
|
892
|
+
});
|
|
893
|
+
return Option.some({
|
|
894
|
+
i: i + 1,
|
|
895
|
+
frontier: fresh
|
|
896
|
+
});
|
|
897
|
+
});
|
|
898
|
+
return Arr.fromIterable(MutableHashMap.values(result));
|
|
899
|
+
}
|
|
900
|
+
/** Runs the semantic actions of the groups (EachOf/OneOf) that took part in a match. */
|
|
901
|
+
groupSemActs(te0, counts, localIndex, n, triples) {
|
|
902
|
+
const visit = (node, seen) => {
|
|
903
|
+
if (Predicate.isString(node)) {
|
|
904
|
+
if (MutableHashSet.has(seen, node)) return unused;
|
|
905
|
+
MutableHashSet.add(seen, node);
|
|
906
|
+
}
|
|
907
|
+
const resolved = this.resolveTe(node);
|
|
908
|
+
if (Option.isNone(resolved)) return unused;
|
|
909
|
+
const te = resolved.value;
|
|
910
|
+
if (te.type === "TripleConstraint") {
|
|
911
|
+
const k = localIndex.get(te);
|
|
912
|
+
return {
|
|
913
|
+
used: k !== void 0 && (counts[k] ?? 0) > 0,
|
|
914
|
+
r: success
|
|
915
|
+
};
|
|
916
|
+
}
|
|
917
|
+
let used = false;
|
|
918
|
+
const failed = Arr.findFirst(te.expressions, (x) => {
|
|
919
|
+
const v = visit(x, seen);
|
|
920
|
+
if (Option.isSome(v.r)) return Option.some(v);
|
|
921
|
+
used ||= v.used;
|
|
922
|
+
return Option.none();
|
|
923
|
+
});
|
|
924
|
+
if (Option.isSome(failed)) return failed.value;
|
|
925
|
+
if (used || cardinality(te).min > 0) {
|
|
926
|
+
const r = this.runSemActs(te.semActs, {
|
|
927
|
+
site: "tripleExpression",
|
|
928
|
+
node: n,
|
|
929
|
+
triples
|
|
930
|
+
});
|
|
931
|
+
if (Option.isSome(r)) return {
|
|
932
|
+
used,
|
|
933
|
+
r
|
|
934
|
+
};
|
|
935
|
+
}
|
|
936
|
+
return {
|
|
937
|
+
used,
|
|
938
|
+
r: success
|
|
939
|
+
};
|
|
940
|
+
};
|
|
941
|
+
return visit(te0, MutableHashSet.empty()).r;
|
|
942
|
+
}
|
|
943
|
+
};
|
|
944
|
+
// src/shex/Validator.ts
|
|
945
|
+
/**
|
|
946
|
+
* ShEx validation: checks node/shape associations of a shape map against an
|
|
947
|
+
* RDF dataset per the ShEx 2.1 semantics (with the ShEx 2.2 `EXTENDS`,
|
|
948
|
+
* `ABSTRACT` and `RESTRICTS` extensions).
|
|
949
|
+
*
|
|
950
|
+
* Recursive references are evaluated coinductively (the maximal typing) and
|
|
951
|
+
* memoised; schemas are checked for the structural requirements, which
|
|
952
|
+
* guarantee a stratification so that negation is well-defined. Imports are
|
|
953
|
+
* loaded through the `SchemaLoader` service and semantic actions are
|
|
954
|
+
* dispatched to the `SemAct.SemActHandler` service.
|
|
955
|
+
*
|
|
956
|
+
* @since 0.1.0
|
|
957
|
+
*/
|
|
958
|
+
var Validator_exports = /* @__PURE__ */ __exportAll({
|
|
959
|
+
SchemaLoader: () => SchemaLoader,
|
|
960
|
+
formatResult: () => formatResult,
|
|
961
|
+
loaderFromRecord: () => loaderFromRecord,
|
|
962
|
+
loaderLayer: () => loaderLayer,
|
|
963
|
+
make: () => make,
|
|
964
|
+
resolveImports: () => resolveImports,
|
|
965
|
+
schema: () => schema,
|
|
966
|
+
validate: () => validate,
|
|
967
|
+
validateNode: () => validateNode
|
|
968
|
+
});
|
|
969
|
+
/**
|
|
970
|
+
* The service used to resolve `IMPORT`s. The default loader fails for every
|
|
971
|
+
* import.
|
|
972
|
+
*
|
|
973
|
+
* @since 0.1.0
|
|
974
|
+
* @category services
|
|
975
|
+
*/
|
|
976
|
+
const SchemaLoader = Context.Reference("@thomasfosterau/effect-rdf/shex/SchemaLoader", { defaultValue: () => ({ load: (iri) => Effect.fail(new ShExImportError({
|
|
977
|
+
iri,
|
|
978
|
+
message: "no SchemaLoader is configured"
|
|
979
|
+
})) }) });
|
|
980
|
+
/**
|
|
981
|
+
* A layer providing a `SchemaLoader`.
|
|
982
|
+
*
|
|
983
|
+
* @since 0.1.0
|
|
984
|
+
* @category layers
|
|
985
|
+
*/
|
|
986
|
+
const loaderLayer = (loader) => Layer.succeed(SchemaLoader, loader);
|
|
987
|
+
/**
|
|
988
|
+
* A loader serving schemas from a map of IRIs (useful for tests and bundled
|
|
989
|
+
* schemas).
|
|
990
|
+
*
|
|
991
|
+
* @since 0.1.0
|
|
992
|
+
* @category constructors
|
|
993
|
+
*/
|
|
994
|
+
const loaderFromRecord = (schemas) => ({ load: (iri) => {
|
|
995
|
+
const s = schemas[iri];
|
|
996
|
+
return s === void 0 ? Effect.fail(new ShExImportError({
|
|
997
|
+
iri,
|
|
998
|
+
message: "unknown schema"
|
|
999
|
+
})) : Effect.succeed(s);
|
|
1000
|
+
} });
|
|
1001
|
+
/**
|
|
1002
|
+
* Loads the imports of a schema (transitively, each IRI once) and merges
|
|
1003
|
+
* their declarations into it. The importing schema's `start` and `startActs`
|
|
1004
|
+
* are kept.
|
|
1005
|
+
*
|
|
1006
|
+
* @since 0.1.0
|
|
1007
|
+
* @category imports
|
|
1008
|
+
*/
|
|
1009
|
+
const resolveImports = Effect.fnUntraced(function* (schema, schemaIri) {
|
|
1010
|
+
if (schema.imports === void 0 || Arr.isReadonlyArrayEmpty(schema.imports)) return schema;
|
|
1011
|
+
const loader = yield* SchemaLoader;
|
|
1012
|
+
const seen = MutableHashSet.fromIterable(schemaIri === void 0 ? [] : [schemaIri]);
|
|
1013
|
+
const shapes = [...schema.shapes ?? []];
|
|
1014
|
+
const labels = MutableHashSet.fromIterable(shapes.map((s) => s.id));
|
|
1015
|
+
const load = (queue) => Arr.match(queue, {
|
|
1016
|
+
onEmpty: () => Effect.void,
|
|
1017
|
+
onNonEmpty: ([iri, ...rest]) => {
|
|
1018
|
+
if (MutableHashSet.has(seen, iri)) return load(rest);
|
|
1019
|
+
MutableHashSet.add(seen, iri);
|
|
1020
|
+
return Effect.flatMap(loader.load(iri), (imported) => {
|
|
1021
|
+
imported.shapes?.forEach((d) => {
|
|
1022
|
+
if (MutableHashSet.has(labels, d.id)) return;
|
|
1023
|
+
MutableHashSet.add(labels, d.id);
|
|
1024
|
+
shapes.push(d);
|
|
1025
|
+
});
|
|
1026
|
+
return load([...rest, ...imported.imports ?? []]);
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
});
|
|
1030
|
+
yield* load(schema.imports);
|
|
1031
|
+
const { imports: _, ...rest } = schema;
|
|
1032
|
+
return Arr.isReadonlyArrayNonEmpty(shapes) ? {
|
|
1033
|
+
...rest,
|
|
1034
|
+
shapes
|
|
1035
|
+
} : rest;
|
|
1036
|
+
});
|
|
1037
|
+
const isFixedMap = (map) => map.every((a) => !Predicate.isTagged(a.node, "TriplePattern"));
|
|
1038
|
+
/**
|
|
1039
|
+
* Prepares a validator: loads imports through `SchemaLoader`, checks the
|
|
1040
|
+
* structural requirements and indexes the schema. Semantic actions are
|
|
1041
|
+
* dispatched to the `SemAct.SemActHandler` in scope when the validator is
|
|
1042
|
+
* made.
|
|
1043
|
+
*
|
|
1044
|
+
* @since 0.1.0
|
|
1045
|
+
* @category constructors
|
|
1046
|
+
*/
|
|
1047
|
+
const make = Effect.fnUntraced(function* (schema, options = {}) {
|
|
1048
|
+
const resolved = yield* resolveImports(schema, options.schemaIri);
|
|
1049
|
+
yield* check(resolved);
|
|
1050
|
+
const index = makeIndex(resolved);
|
|
1051
|
+
const baseHandler = yield* SemActHandler;
|
|
1052
|
+
const handler = options.externalSemActs === void 0 ? baseHandler : withExternalCode(baseHandler, options.externalSemActs);
|
|
1053
|
+
const externs = MutableHashMap.fromIterable(Arr.map(options.externalShapes?.shapes ?? [], (d) => [d.id, d]));
|
|
1054
|
+
const validate = (dataset, shapeMap) => Effect.suspend(() => {
|
|
1055
|
+
const fixed = isFixedMap(shapeMap) ? shapeMap : resolve(shapeMap, dataset);
|
|
1056
|
+
const invalid = Arr.findFirst(fixed, (a) => isStart(a.shape) ? resolved.start === void 0 ? Option.some("the shape map uses START but the schema has no start") : Option.none() : index.shapes.has(a.shape) ? Option.none() : Option.some(`the schema does not declare shape ${a.shape}`));
|
|
1057
|
+
if (Option.isSome(invalid)) return Effect.fail(new ShExValidationError({ message: invalid.value }));
|
|
1058
|
+
const engine = new Engine(index, dataset, handler, externs);
|
|
1059
|
+
const startFailure = engine.runSemActs(resolved.startActs, {
|
|
1060
|
+
site: "start",
|
|
1061
|
+
node: void 0
|
|
1062
|
+
});
|
|
1063
|
+
const results = fixed.map((a) => {
|
|
1064
|
+
const reason = Option.orElse(startFailure, () => isStart(a.shape) ? engine.validateStart(a.node, MutableHashSet.empty()) : engine.validateLabel(a.node, a.shape, MutableHashSet.empty()));
|
|
1065
|
+
return Option.match(reason, {
|
|
1066
|
+
onNone: () => ({
|
|
1067
|
+
node: a.node,
|
|
1068
|
+
shape: a.shape,
|
|
1069
|
+
status: "conformant"
|
|
1070
|
+
}),
|
|
1071
|
+
onSome: (why) => ({
|
|
1072
|
+
node: a.node,
|
|
1073
|
+
shape: a.shape,
|
|
1074
|
+
status: "nonconformant",
|
|
1075
|
+
reason: why
|
|
1076
|
+
})
|
|
1077
|
+
});
|
|
1078
|
+
});
|
|
1079
|
+
const conformant = results.every((r) => r.status === "conformant");
|
|
1080
|
+
return Effect.as(Effect.annotateCurrentSpan({
|
|
1081
|
+
"shex.associations": results.length,
|
|
1082
|
+
"shex.nonconformant": results.filter((r) => r.status === "nonconformant").length,
|
|
1083
|
+
"shex.conformant": conformant
|
|
1084
|
+
}), {
|
|
1085
|
+
results,
|
|
1086
|
+
conformant
|
|
1087
|
+
});
|
|
1088
|
+
}).pipe(Effect.withSpan("ShEx.validate"));
|
|
1089
|
+
return {
|
|
1090
|
+
schema: resolved,
|
|
1091
|
+
index,
|
|
1092
|
+
validate
|
|
1093
|
+
};
|
|
1094
|
+
});
|
|
1095
|
+
/**
|
|
1096
|
+
* Validates a shape map against a dataset with a schema.
|
|
1097
|
+
*
|
|
1098
|
+
* @since 0.1.0
|
|
1099
|
+
* @category validation
|
|
1100
|
+
*/
|
|
1101
|
+
const validate = (dataset, schema, shapeMap, options = {}) => Effect.flatMap(make(schema, options), (v) => v.validate(dataset, shapeMap));
|
|
1102
|
+
/**
|
|
1103
|
+
* Validates a single node against a shape label (or `START`).
|
|
1104
|
+
*
|
|
1105
|
+
* @since 0.1.0
|
|
1106
|
+
* @category validation
|
|
1107
|
+
*/
|
|
1108
|
+
const validateNode = (dataset, schema, node, shape, options = {}) => Effect.map(validate(dataset, schema, [{
|
|
1109
|
+
node,
|
|
1110
|
+
shape
|
|
1111
|
+
}], options), (r) => Arr.getUnsafe(r.results, 0));
|
|
1112
|
+
/**
|
|
1113
|
+
* Formats a shape result on one line: `<node>@<shape>` and, when it does
|
|
1114
|
+
* not conform, why.
|
|
1115
|
+
*
|
|
1116
|
+
* @since 0.1.0
|
|
1117
|
+
* @category formatting
|
|
1118
|
+
*/
|
|
1119
|
+
const formatResult = (result) => {
|
|
1120
|
+
const label = isStart(result.shape) ? "START" : `<${result.shape}>`;
|
|
1121
|
+
const association = `${result.node.key}@${label}`;
|
|
1122
|
+
return result.reason === void 0 ? `${association}: ${result.status}` : `${association}: ${result.reason}`;
|
|
1123
|
+
};
|
|
1124
|
+
const nonconformance = (failing, data, options) => {
|
|
1125
|
+
const issues = Arr.map(failing, (result) => new SchemaIssue.InvalidValue({
|
|
1126
|
+
message: formatResult(result),
|
|
1127
|
+
result
|
|
1128
|
+
}, result, options));
|
|
1129
|
+
return new SchemaIssue.Composite(DatasetSchema.ast, issues, data);
|
|
1130
|
+
};
|
|
1131
|
+
/**
|
|
1132
|
+
* A `Schema` that accepts a `Dataset` only if every association of the
|
|
1133
|
+
* shape map (or the single `{ node, shape }`) conforms, so ShEx validation
|
|
1134
|
+
* fits into `Schema.decode` pipelines. It takes a prepared `Validator`
|
|
1135
|
+
* (`make`), so imports are resolved before the schema is built and decoding
|
|
1136
|
+
* needs no services.
|
|
1137
|
+
*
|
|
1138
|
+
* Decoding fails with a `SchemaIssue.Composite` holding one `InvalidValue`
|
|
1139
|
+
* issue per nonconformant association: its `message` annotation is the
|
|
1140
|
+
* formatted result (`formatResult`) and its `result` annotation the
|
|
1141
|
+
* `ShapeResult`. A shape map naming an undeclared shape fails with one
|
|
1142
|
+
* `InvalidValue`. Encoding is the identity.
|
|
1143
|
+
*
|
|
1144
|
+
* Compose it with a syntax codec to parse and validate in one decode:
|
|
1145
|
+
* `Turtle.codec.schema.pipe(Schema.decodeTo(Validator.schema(validator, map)))`.
|
|
1146
|
+
*
|
|
1147
|
+
* @since 0.1.0
|
|
1148
|
+
* @category schemas
|
|
1149
|
+
*/
|
|
1150
|
+
const schema = (validator, shapeMap) => {
|
|
1151
|
+
const map = "node" in shapeMap ? [shapeMap] : shapeMap;
|
|
1152
|
+
return DatasetSchema.pipe(Schema.decodeTo(DatasetSchema, SchemaTransformation.transformEffect({
|
|
1153
|
+
decode: (data, options) => validator.validate(data, map).pipe(Effect.mapError((e) => new SchemaIssue.InvalidValue({ message: e.message }, data, options)), Effect.flatMap((report) => {
|
|
1154
|
+
const failing = Arr.filter(report.results, (r) => r.status === "nonconformant");
|
|
1155
|
+
return Arr.isReadonlyArrayNonEmpty(failing) ? Effect.fail(nonconformance(failing, data, options)) : Effect.succeed(data);
|
|
1156
|
+
})),
|
|
1157
|
+
encode: (data) => Effect.succeed(data)
|
|
1158
|
+
})));
|
|
1159
|
+
};
|
|
1160
|
+
export { loaderLayer as a, schema as c, loaderFromRecord as i, validate as l, Validator_exports as n, make as o, formatResult as r, resolveImports as s, SchemaLoader as t, validateNode as u };
|
|
1161
|
+
|
|
1162
|
+
//# sourceMappingURL=Validator-BzXMKDeJ.mjs.map
|