@thomasfosterau/effect-rdf 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +2250 -1
- package/dist/Algebra-CGG4oae3.mjs +433 -0
- package/dist/Algebra-CGG4oae3.mjs.map +1 -0
- package/dist/Algebra-uGsIEOUA.d.mts +446 -0
- package/dist/Ast-CPRZmBvk.mjs +552 -0
- package/dist/Ast-CPRZmBvk.mjs.map +1 -0
- package/dist/Ast-vcw2W-lf.d.mts +827 -0
- package/dist/Bindings-Ck3m7JRC.mjs +249 -0
- package/dist/Bindings-Ck3m7JRC.mjs.map +1 -0
- package/dist/Bindings-DiKpBd7f.d.mts +153 -0
- package/dist/ClientErrors-CpXdFX5u.mjs +128 -0
- package/dist/ClientErrors-CpXdFX5u.mjs.map +1 -0
- package/dist/ClientErrors-D4IZHUM-.d.mts +101 -0
- package/dist/ClientFormats-CXomkXLV.mjs +73 -0
- package/dist/ClientFormats-CXomkXLV.mjs.map +1 -0
- package/dist/ClientFormats-Dm57ZPwR.d.mts +36 -0
- package/dist/Csv2Json-DynEcwCh.mjs +194 -0
- package/dist/Csv2Json-DynEcwCh.mjs.map +1 -0
- package/dist/Csv2Json-aXNVDoXQ.d.mts +40 -0
- package/dist/Csv2Rdf-8maXP6mt.d.mts +41 -0
- package/dist/Csv2Rdf-DuSEkaKE.mjs +161 -0
- package/dist/Csv2Rdf-DuSEkaKE.mjs.map +1 -0
- package/dist/Dataset-BlmlcI7J.mjs +782 -0
- package/dist/Dataset-BlmlcI7J.mjs.map +1 -0
- package/dist/Dataset-DS3ESOcO.d.mts +426 -0
- package/dist/Dataset.d.mts +2 -0
- package/dist/Dataset.mjs +1 -0
- package/dist/Datatype-CxMpamHC.d.mts +212 -0
- package/dist/Datatype-DQvkNkiH.mjs +1001 -0
- package/dist/Datatype-DQvkNkiH.mjs.map +1 -0
- package/dist/Dialect-8ChFj5EX.d.mts +113 -0
- package/dist/Dialect-CzVH38uo.mjs +165 -0
- package/dist/Dialect-CzVH38uo.mjs.map +1 -0
- package/dist/DocumentLoader-D3lZREnB.mjs +346 -0
- package/dist/DocumentLoader-D3lZREnB.mjs.map +1 -0
- package/dist/DocumentLoader-ZUCEVrW5.d.mts +178 -0
- package/dist/DublinCore-AnwqxRx6.mjs +137 -0
- package/dist/DublinCore-AnwqxRx6.mjs.map +1 -0
- package/dist/DublinCore-Dq-tVA5d.d.mts +119 -0
- package/dist/Engine-CYPB3g4h.d.mts +144 -0
- package/dist/Engine-DF8PN7g-.mjs +872 -0
- package/dist/Engine-DF8PN7g-.mjs.map +1 -0
- package/dist/Errors-CMdV1RhU.mjs +37 -0
- package/dist/Errors-CMdV1RhU.mjs.map +1 -0
- package/dist/Errors-u2bDjUeM.d.mts +30 -0
- package/dist/Evaluator-DEsU4d1o.d.mts +50 -0
- package/dist/Evaluator-DOY2-guC.mjs +281 -0
- package/dist/Evaluator-DOY2-guC.mjs.map +1 -0
- package/dist/Exif-CpqniYQd.d.mts +78 -0
- package/dist/Exif-DjkCfEB-.mjs +89 -0
- package/dist/Exif-DjkCfEB-.mjs.map +1 -0
- package/dist/Expression-BIMMvduQ.mjs +230 -0
- package/dist/Expression-BIMMvduQ.mjs.map +1 -0
- package/dist/Expression-W8A9cyX7.d.mts +89 -0
- package/dist/Extract-Bop85jES.mjs +220 -0
- package/dist/Extract-Bop85jES.mjs.map +1 -0
- package/dist/Extract-C_pCvuTC.d.mts +88 -0
- package/dist/Federation-BcNrozc1.d.mts +52 -0
- package/dist/Federation-CHScBkaK.mjs +130 -0
- package/dist/Federation-CHScBkaK.mjs.map +1 -0
- package/dist/Functions-AvjNcId_.mjs +1346 -0
- package/dist/Functions-AvjNcId_.mjs.map +1 -0
- package/dist/Functions-OQJZP-F6.d.mts +111 -0
- package/dist/Generator-C52mmq01.d.mts +50 -0
- package/dist/Generator-D3utCJC7.mjs +205 -0
- package/dist/Generator-D3utCJC7.mjs.map +1 -0
- package/dist/Grammar-CPlSxGH6.mjs +200 -0
- package/dist/Grammar-CPlSxGH6.mjs.map +1 -0
- package/dist/Grammar-CRhnRoCu.d.mts +148 -0
- package/dist/Grammar-D6jZdJQ3.d.mts +169 -0
- package/dist/Grammar-mQ8CgE1M.mjs +258 -0
- package/dist/Grammar-mQ8CgE1M.mjs.map +1 -0
- package/dist/GraphStore-DhUa4nFO.d.mts +45 -0
- package/dist/GraphStore-DvbqwKy1.mjs +212 -0
- package/dist/GraphStore-DvbqwKy1.mjs.map +1 -0
- package/dist/Iri-BB8Ks-BF.d.mts +84 -0
- package/dist/Iri-Cr92gsQV.mjs +232 -0
- package/dist/Iri-Cr92gsQV.mjs.map +1 -0
- package/dist/Iri.d.mts +2 -0
- package/dist/Iri.mjs +1 -0
- package/dist/Isomorphism-B6qTY-xy.d.mts +28 -0
- package/dist/Isomorphism-BmqxhKyJ.mjs +232 -0
- package/dist/Isomorphism-BmqxhKyJ.mjs.map +1 -0
- package/dist/Isomorphism-DInKnWIy.mjs +390 -0
- package/dist/Isomorphism-DInKnWIy.mjs.map +1 -0
- package/dist/Isomorphism-DvSfZXLR.d.mts +37 -0
- package/dist/Isomorphism.d.mts +2 -0
- package/dist/Isomorphism.mjs +1 -0
- package/dist/JsonLd-DOwS2FHg.mjs +2836 -0
- package/dist/JsonLd-DOwS2FHg.mjs.map +1 -0
- package/dist/JsonLd-DobFrQNa.d.mts +242 -0
- package/dist/JsonLdError-C9J-BxfG.mjs +106 -0
- package/dist/JsonLdError-C9J-BxfG.mjs.map +1 -0
- package/dist/JsonLdError-DSOfHkOy.d.mts +43 -0
- package/dist/LanguageTag-BCu8rcmX.d.mts +38 -0
- package/dist/LanguageTag-BcOpMGZ4.mjs +89 -0
- package/dist/LanguageTag-BcOpMGZ4.mjs.map +1 -0
- package/dist/LanguageTag.d.mts +2 -0
- package/dist/LanguageTag.mjs +1 -0
- package/dist/Lexical-Cg0JHrf6.mjs +243 -0
- package/dist/Lexical-Cg0JHrf6.mjs.map +1 -0
- package/dist/Lexical-D3zySYVS.d.mts +163 -0
- package/dist/Manifest-B6xf6mUc.mjs +148 -0
- package/dist/Manifest-B6xf6mUc.mjs.map +1 -0
- package/dist/Manifest-DQUMRBFr.d.mts +98 -0
- package/dist/Mapping-BgG74x3U.d.mts +63 -0
- package/dist/Mapping-Dc1ZGirk.mjs +259 -0
- package/dist/Mapping-Dc1ZGirk.mjs.map +1 -0
- package/dist/Mcp-1DwTTKOK.mjs +48 -0
- package/dist/Mcp-1DwTTKOK.mjs.map +1 -0
- package/dist/Mcp-d-pX9erx.d.mts +25 -0
- package/dist/Message-CK_DGQuu.mjs +95 -0
- package/dist/Message-CK_DGQuu.mjs.map +1 -0
- package/dist/Message-fIvTJSXM.d.mts +49 -0
- package/dist/Metadata-BbffwGDZ.mjs +445 -0
- package/dist/Metadata-BbffwGDZ.mjs.map +1 -0
- package/dist/Metadata-CEt3yc1-.d.mts +901 -0
- package/dist/Metadata-D4HsQNXr.mjs +1273 -0
- package/dist/Metadata-D4HsQNXr.mjs.map +1 -0
- package/dist/Metadata-nzS7QKRj.d.mts +350 -0
- package/dist/Model-DaMmxurZ.d.mts +293 -0
- package/dist/Model-DlPzRYhF.mjs +528 -0
- package/dist/Model-DlPzRYhF.mjs.map +1 -0
- package/dist/N3-BzyV-KIH.mjs +974 -0
- package/dist/N3-BzyV-KIH.mjs.map +1 -0
- package/dist/N3-DSLnonDn.d.mts +100 -0
- package/dist/NQuads-C1VBOJ3-.mjs +117 -0
- package/dist/NQuads-C1VBOJ3-.mjs.map +1 -0
- package/dist/NQuads-FjFZikFg.d.mts +76 -0
- package/dist/NTriples-D-kLSEAf.mjs +120 -0
- package/dist/NTriples-D-kLSEAf.mjs.map +1 -0
- package/dist/NTriples-D34OspfW.d.mts +76 -0
- package/dist/Namespace-ClTUO_ya.d.mts +42 -0
- package/dist/Namespace-DHFIsORd.mjs +75 -0
- package/dist/Namespace-DHFIsORd.mjs.map +1 -0
- package/dist/Namespace.d.mts +2 -0
- package/dist/Namespace.mjs +1 -0
- package/dist/Namespaces-Bz85vpjW.mjs +235 -0
- package/dist/Namespaces-Bz85vpjW.mjs.map +1 -0
- package/dist/Namespaces-C1jW6EDo.d.mts +178 -0
- package/dist/Optimizer-BWWQRQPY.mjs +168 -0
- package/dist/Optimizer-BWWQRQPY.mjs.map +1 -0
- package/dist/Optimizer-DUpUow6k.d.mts +26 -0
- package/dist/Options-BLBGL4HE.mjs +72 -0
- package/dist/Options-BLBGL4HE.mjs.map +1 -0
- package/dist/Options-BommQwP9.d.mts +127 -0
- package/dist/Packet-CA76wVX3.mjs +197 -0
- package/dist/Packet-CA76wVX3.mjs.map +1 -0
- package/dist/Packet-Cy5g6XuW.d.mts +130 -0
- package/dist/Parser-p1Gyr0QN.d.mts +85 -0
- package/dist/Parser-xARsOWXk.mjs +1317 -0
- package/dist/Parser-xARsOWXk.mjs.map +1 -0
- package/dist/Path-B20Yp8KE.mjs +284 -0
- package/dist/Path-B20Yp8KE.mjs.map +1 -0
- package/dist/Path-DRB8e-Zn.d.mts +181 -0
- package/dist/Pdf-B9RZn--8.d.mts +77 -0
- package/dist/Pdf-CKK6dkZn.mjs +89 -0
- package/dist/Pdf-CKK6dkZn.mjs.map +1 -0
- package/dist/PdfA-CUjSuntT.d.mts +109 -0
- package/dist/PdfA-CleOhuL6.mjs +124 -0
- package/dist/PdfA-CleOhuL6.mjs.map +1 -0
- package/dist/Photoshop-CiHo80qV.mjs +233 -0
- package/dist/Photoshop-CiHo80qV.mjs.map +1 -0
- package/dist/Photoshop-udKZ0I3N.d.mts +204 -0
- package/dist/PrefixMap-BHFPDLO-.mjs +103 -0
- package/dist/PrefixMap-BHFPDLO-.mjs.map +1 -0
- package/dist/PrefixMap-BMlXrWNd.d.mts +64 -0
- package/dist/PrefixMap.d.mts +2 -0
- package/dist/PrefixMap.mjs +1 -0
- package/dist/Processor-CMmecFsb.mjs +198 -0
- package/dist/Processor-CMmecFsb.mjs.map +1 -0
- package/dist/Processor-FJPvO0CB.d.mts +435 -0
- package/dist/Protocol-BA7OkNgp.mjs +202 -0
- package/dist/Protocol-BA7OkNgp.mjs.map +1 -0
- package/dist/Protocol-DlSoiIKB.d.mts +108 -0
- package/dist/ProtocolErrors-Ckfejnl6.d.mts +84 -0
- package/dist/ProtocolErrors-czDPVcX5.mjs +129 -0
- package/dist/ProtocolErrors-czDPVcX5.mjs.map +1 -0
- package/dist/Query-D9A6LOpP.mjs +364 -0
- package/dist/Query-D9A6LOpP.mjs.map +1 -0
- package/dist/Query-KqSkTYyG.d.mts +96 -0
- package/dist/QueryBuilder-BLK9Vfbz.mjs +674 -0
- package/dist/QueryBuilder-BLK9Vfbz.mjs.map +1 -0
- package/dist/QueryBuilder-DUqh4ECe.d.mts +529 -0
- package/dist/RdfJs-D6-49XB5.mjs +86 -0
- package/dist/RdfJs-D6-49XB5.mjs.map +1 -0
- package/dist/RdfJs-DXFqdWrd.d.mts +76 -0
- package/dist/RdfJs.d.mts +2 -0
- package/dist/RdfJs.mjs +1 -0
- package/dist/RdfJson-5aKPDlPS.d.mts +297 -0
- package/dist/RdfJson-BNocgW4f.mjs +548 -0
- package/dist/RdfJson-BNocgW4f.mjs.map +1 -0
- package/dist/RdfXml-DJ9G4gOq.mjs +1014 -0
- package/dist/RdfXml-DJ9G4gOq.mjs.map +1 -0
- package/dist/RdfXml-_N7yxWEp.d.mts +149 -0
- package/dist/Rdfs-BRVPsAjc.d.mts +84 -0
- package/dist/Rdfs-CyY2wVHI.mjs +167 -0
- package/dist/Rdfs-CyY2wVHI.mjs.map +1 -0
- package/dist/Rdfs.d.mts +2 -0
- package/dist/Rdfs.mjs +1 -0
- package/dist/Reasoner-BxYhx9s7.d.mts +94 -0
- package/dist/Reasoner-Cw90zrjv.mjs +798 -0
- package/dist/Reasoner-Cw90zrjv.mjs.map +1 -0
- package/dist/Reification-BmN4EfnM.d.mts +40 -0
- package/dist/Reification-dpqQvjDE.mjs +82 -0
- package/dist/Reification-dpqQvjDE.mjs.map +1 -0
- package/dist/Reification.d.mts +2 -0
- package/dist/Reification.mjs +1 -0
- package/dist/Report-XHs8htzK.mjs +121 -0
- package/dist/Report-XHs8htzK.mjs.map +1 -0
- package/dist/Report-hcXsc_19.d.mts +115 -0
- package/dist/Resource-B1cI8FyJ.d.mts +218 -0
- package/dist/Resource-sIEeNh15.mjs +374 -0
- package/dist/Resource-sIEeNh15.mjs.map +1 -0
- package/dist/Resource.d.mts +2 -0
- package/dist/Resource.mjs +1 -0
- package/dist/Results-BVNEC-Wt.d.mts +277 -0
- package/dist/Results-peJjGA2V.mjs +621 -0
- package/dist/Results-peJjGA2V.mjs.map +1 -0
- package/dist/ResultsStream-BhF0OcNn.mjs +639 -0
- package/dist/ResultsStream-BhF0OcNn.mjs.map +1 -0
- package/dist/ResultsStream-toYMXrOe.d.mts +100 -0
- package/dist/SemAct-CDchtk49.d.mts +96 -0
- package/dist/SemAct-CmyT4yI8.mjs +118 -0
- package/dist/SemAct-CmyT4yI8.mjs.map +1 -0
- package/dist/Serialization-DP9H5bYQ.mjs +514 -0
- package/dist/Serialization-DP9H5bYQ.mjs.map +1 -0
- package/dist/Serialization-Df8iVauT.d.mts +392 -0
- package/dist/Serialization.d.mts +2 -0
- package/dist/Serialization.mjs +1 -0
- package/dist/ServerFormats-CrRnjjf6.mjs +64 -0
- package/dist/ServerFormats-CrRnjjf6.mjs.map +1 -0
- package/dist/ServerFormats-DjC9NsO_.d.mts +36 -0
- package/dist/ServiceDescription-BERsvg-k.d.mts +54 -0
- package/dist/ServiceDescription-Dq5hxeGy.mjs +97 -0
- package/dist/ServiceDescription-Dq5hxeGy.mjs.map +1 -0
- package/dist/ShExC-Ctf-06CL.d.mts +67 -0
- package/dist/ShExC-DJbB19i3.mjs +1181 -0
- package/dist/ShExC-DJbB19i3.mjs.map +1 -0
- package/dist/ShExError-BeYFD9rv.d.mts +61 -0
- package/dist/ShExError-CVtq2NnM.mjs +64 -0
- package/dist/ShExError-CVtq2NnM.mjs.map +1 -0
- package/dist/ShExJ-C1u_wgyD.d.mts +531 -0
- package/dist/ShExJ-COiPd9Xw.mjs +532 -0
- package/dist/ShExJ-COiPd9Xw.mjs.map +1 -0
- package/dist/ShExR-ByR4mCh-.mjs +480 -0
- package/dist/ShExR-ByR4mCh-.mjs.map +1 -0
- package/dist/ShExR-CqONNNBz.d.mts +40 -0
- package/dist/ShapeMap-C422pxKl.d.mts +140 -0
- package/dist/ShapeMap-CsgKxB2G.mjs +181 -0
- package/dist/ShapeMap-CsgKxB2G.mjs.map +1 -0
- package/dist/Shapes-18GjfyBV.mjs +597 -0
- package/dist/Shapes-18GjfyBV.mjs.map +1 -0
- package/dist/Shapes-BQFDFc4Q.d.mts +306 -0
- package/dist/Sparql-BiYFMSpl.mjs +29 -0
- package/dist/Sparql-BiYFMSpl.mjs.map +1 -0
- package/dist/Sparql-DecpWTPh.d.mts +97 -0
- package/dist/SparqlClient-C_CjXbwj.mjs +333 -0
- package/dist/SparqlClient-C_CjXbwj.mjs.map +1 -0
- package/dist/SparqlClient-UPc88SHy.d.mts +290 -0
- package/dist/SparqlServer-CbUW-pVj.d.mts +71 -0
- package/dist/SparqlServer-Db7w7Cll.mjs +308 -0
- package/dist/SparqlServer-Db7w7Cll.mjs.map +1 -0
- package/dist/SqlStore-BBqFx-Wl.mjs +684 -0
- package/dist/SqlStore-BBqFx-Wl.mjs.map +1 -0
- package/dist/SqlStore-CCJo5I-e.d.mts +117 -0
- package/dist/Store-D0jmVfb3.d.mts +166 -0
- package/dist/Store-DH3Ow1GO.mjs +162 -0
- package/dist/Store-DH3Ow1GO.mjs.map +1 -0
- package/dist/Structure-BjMo4Bkc.mjs +334 -0
- package/dist/Structure-BjMo4Bkc.mjs.map +1 -0
- package/dist/Structure-n4CmDiab.d.mts +63 -0
- package/dist/Table-BGgm9nbM.mjs +538 -0
- package/dist/Table-BGgm9nbM.mjs.map +1 -0
- package/dist/Table-C3reiVrb.d.mts +261 -0
- package/dist/Term-B_4ezyXq.d.mts +619 -0
- package/dist/Term-CFLG1qu4.mjs +991 -0
- package/dist/Term-CFLG1qu4.mjs.map +1 -0
- package/dist/Term.d.mts +2 -0
- package/dist/Term.mjs +1 -0
- package/dist/TermCodec-CDZiEztW.mjs +397 -0
- package/dist/TermCodec-CDZiEztW.mjs.map +1 -0
- package/dist/TermCodec-_03bDXr0.d.mts +209 -0
- package/dist/TermCodec.d.mts +2 -0
- package/dist/TermCodec.mjs +1 -0
- package/dist/TermJson-BOPe0yve.d.mts +232 -0
- package/dist/TermJson-FAg3lvjl.mjs +142 -0
- package/dist/TermJson-FAg3lvjl.mjs.map +1 -0
- package/dist/TermJson.d.mts +2 -0
- package/dist/TermJson.mjs +1 -0
- package/dist/TermSchema-Bn9CoaYA.mjs +30 -0
- package/dist/TermSchema-Bn9CoaYA.mjs.map +1 -0
- package/dist/TermSchema-DBO6MroX.d.mts +6 -0
- package/dist/Testing-B-aPCpmu.mjs +63 -0
- package/dist/Testing-B-aPCpmu.mjs.map +1 -0
- package/dist/Testing-CF6s8P3O.d.mts +53 -0
- package/dist/Tiff-CR-2QeSI.d.mts +148 -0
- package/dist/Tiff-DlsOlZPM.mjs +169 -0
- package/dist/Tiff-DlsOlZPM.mjs.map +1 -0
- package/dist/Tools-7MdRKccr.d.mts +583 -0
- package/dist/Tools-ryxphZbI.mjs +329 -0
- package/dist/Tools-ryxphZbI.mjs.map +1 -0
- package/dist/Translate-B0YKKANS.d.mts +37 -0
- package/dist/Translate-gzWPq0Ia.mjs +308 -0
- package/dist/Translate-gzWPq0Ia.mjs.map +1 -0
- package/dist/Translation-DC9rLm2y.mjs +1535 -0
- package/dist/Translation-DC9rLm2y.mjs.map +1 -0
- package/dist/Translation-K4L9XBqX.d.mts +103 -0
- package/dist/TriG-BkqtqZ6Y.mjs +125 -0
- package/dist/TriG-BkqtqZ6Y.mjs.map +1 -0
- package/dist/TriG-xDjdDatp.d.mts +86 -0
- package/dist/Turtle-Bv1_bisW.d.mts +85 -0
- package/dist/Turtle-CZVUOtwl.mjs +133 -0
- package/dist/Turtle-CZVUOtwl.mjs.map +1 -0
- package/dist/ValidationReport-DBdJshW5.mjs +285 -0
- package/dist/ValidationReport-DBdJshW5.mjs.map +1 -0
- package/dist/ValidationReport-Dx3WxY0h.d.mts +192 -0
- package/dist/Validator-227ff9Rn.d.mts +179 -0
- package/dist/Validator-BzXMKDeJ.mjs +1162 -0
- package/dist/Validator-BzXMKDeJ.mjs.map +1 -0
- package/dist/Validator-Dl8cih5V.d.mts +207 -0
- package/dist/Validator-DmUfMbpL.mjs +568 -0
- package/dist/Validator-DmUfMbpL.mjs.map +1 -0
- package/dist/Vocab-DceKywpq.mjs +168 -0
- package/dist/Vocab-DceKywpq.mjs.map +1 -0
- package/dist/Vocab-Df-L-IwZ.d.mts +46 -0
- package/dist/Vocab-Do56UgBX.d.mts +81 -0
- package/dist/Vocab-TfpWG1Ne.mjs +118 -0
- package/dist/Vocab-TfpWG1Ne.mjs.map +1 -0
- package/dist/Vocab.d.mts +2 -0
- package/dist/Vocab.mjs +1 -0
- package/dist/Vocabulary-C6-GPOy4.d.mts +22 -0
- package/dist/Vocabulary-CnQl-_Z4.mjs +179 -0
- package/dist/Vocabulary-CnQl-_Z4.mjs.map +1 -0
- package/dist/Xml-B7iihYCS.mjs +976 -0
- package/dist/Xml-B7iihYCS.mjs.map +1 -0
- package/dist/Xml-CmfHS7SW.d.mts +267 -0
- package/dist/Xmp-D7CKA7MZ.d.mts +111 -0
- package/dist/Xmp-DCGN9pOD.mjs +307 -0
- package/dist/Xmp-DCGN9pOD.mjs.map +1 -0
- package/dist/XmpBasic-CP38jpR_.mjs +73 -0
- package/dist/XmpBasic-CP38jpR_.mjs.map +1 -0
- package/dist/XmpBasic-Cmbe53rQ.d.mts +64 -0
- package/dist/XmpMM-BfL_TgJF.mjs +73 -0
- package/dist/XmpMM-BfL_TgJF.mjs.map +1 -0
- package/dist/XmpMM-Dqm3IX8p.d.mts +63 -0
- package/dist/XmpRights-BKPtoI5L.mjs +73 -0
- package/dist/XmpRights-BKPtoI5L.mjs.map +1 -0
- package/dist/XmpRights-CaALZQz2.d.mts +63 -0
- package/dist/Xsd-Cdgx5zRB.mjs +405 -0
- package/dist/Xsd-Cdgx5zRB.mjs.map +1 -0
- package/dist/Xsd-D2elNhSm.d.mts +187 -0
- package/dist/Xsd.d.mts +2 -0
- package/dist/Xsd.mjs +1 -0
- package/dist/accessors-CEjaojuQ.mjs +28 -0
- package/dist/accessors-CEjaojuQ.mjs.map +1 -0
- package/dist/codec-Lb2T96rv.d.mts +20 -0
- package/dist/codec-QNo7IdJF.mjs +389 -0
- package/dist/codec-QNo7IdJF.mjs.map +1 -0
- package/dist/csvw/Csv2Json.d.mts +2 -0
- package/dist/csvw/Csv2Json.mjs +1 -0
- package/dist/csvw/Csv2Rdf.d.mts +2 -0
- package/dist/csvw/Csv2Rdf.mjs +1 -0
- package/dist/csvw/Datatype.d.mts +2 -0
- package/dist/csvw/Datatype.mjs +1 -0
- package/dist/csvw/Metadata.d.mts +2 -0
- package/dist/csvw/Metadata.mjs +1 -0
- package/dist/csvw/Processor.d.mts +2 -0
- package/dist/csvw/Processor.mjs +1 -0
- package/dist/csvw/Report.d.mts +2 -0
- package/dist/csvw/Report.mjs +1 -0
- package/dist/csvw/Table.d.mts +2 -0
- package/dist/csvw/Table.mjs +1 -0
- package/dist/csvw/index.d.mts +8 -0
- package/dist/csvw/index.mjs +8 -0
- package/dist/index-Cms2TYfC.d.mts +16 -0
- package/dist/index-Ct8xFmRs.d.mts +7 -0
- package/dist/index-D4QFwOjm.d.mts +28 -0
- package/dist/index.d.mts +18 -0
- package/dist/index.mjs +17 -0
- package/dist/jsonld/DocumentLoader.d.mts +2 -0
- package/dist/jsonld/DocumentLoader.mjs +1 -0
- package/dist/jsonld/JsonLd.d.mts +2 -0
- package/dist/jsonld/JsonLd.mjs +1 -0
- package/dist/jsonld/JsonLdError.d.mts +2 -0
- package/dist/jsonld/JsonLdError.mjs +1 -0
- package/dist/jsonld/index.d.mts +4 -0
- package/dist/jsonld/index.mjs +4 -0
- package/dist/lists-D-OpQ0Ir.mjs +77 -0
- package/dist/lists-D-OpQ0Ir.mjs.map +1 -0
- package/dist/loop-D5-gNx9K.mjs +21 -0
- package/dist/loop-D5-gNx9K.mjs.map +1 -0
- package/dist/loop-DZ2hXlr_.mjs +21 -0
- package/dist/loop-DZ2hXlr_.mjs.map +1 -0
- package/dist/n3/Isomorphism.d.mts +2 -0
- package/dist/n3/Isomorphism.mjs +1 -0
- package/dist/n3/Mapping.d.mts +2 -0
- package/dist/n3/Mapping.mjs +1 -0
- package/dist/n3/Model.d.mts +2 -0
- package/dist/n3/Model.mjs +1 -0
- package/dist/n3/N3.d.mts +2 -0
- package/dist/n3/N3.mjs +1 -0
- package/dist/n3/Reasoner.d.mts +2 -0
- package/dist/n3/Reasoner.mjs +2 -0
- package/dist/n3/Vocab.d.mts +2 -0
- package/dist/n3/Vocab.mjs +1 -0
- package/dist/n3/index.d.mts +7 -0
- package/dist/n3/index.mjs +7 -0
- package/dist/ntriples/Grammar.d.mts +2 -0
- package/dist/ntriples/Grammar.mjs +1 -0
- package/dist/ntriples/Lexical.d.mts +2 -0
- package/dist/ntriples/Lexical.mjs +1 -0
- package/dist/ntriples/NQuads.d.mts +2 -0
- package/dist/ntriples/NQuads.mjs +1 -0
- package/dist/ntriples/NTriples.d.mts +2 -0
- package/dist/ntriples/NTriples.mjs +1 -0
- package/dist/ntriples/index.d.mts +5 -0
- package/dist/ntriples/index.mjs +5 -0
- package/dist/rdfjson/RdfJson.d.mts +2 -0
- package/dist/rdfjson/RdfJson.mjs +1 -0
- package/dist/rdfjson/index.d.mts +2 -0
- package/dist/rdfjson/index.mjs +1 -0
- package/dist/rdfxml/RdfXml.d.mts +2 -0
- package/dist/rdfxml/RdfXml.mjs +1 -0
- package/dist/rdfxml/Xml.d.mts +2 -0
- package/dist/rdfxml/Xml.mjs +1 -0
- package/dist/rdfxml/index.d.mts +3 -0
- package/dist/rdfxml/index.mjs +3 -0
- package/dist/rolldown-runtime-D8jQpDG7.mjs +12 -0
- package/dist/serialize-96KBvKaf.mjs +1463 -0
- package/dist/serialize-96KBvKaf.mjs.map +1 -0
- package/dist/serialize-DsoXdM6n.d.mts +37 -0
- package/dist/shacl/Message.d.mts +2 -0
- package/dist/shacl/Message.mjs +1 -0
- package/dist/shacl/Path.d.mts +2 -0
- package/dist/shacl/Path.mjs +1 -0
- package/dist/shacl/Shapes.d.mts +2 -0
- package/dist/shacl/Shapes.mjs +1 -0
- package/dist/shacl/Sparql.d.mts +2 -0
- package/dist/shacl/Sparql.mjs +1 -0
- package/dist/shacl/ValidationReport.d.mts +2 -0
- package/dist/shacl/ValidationReport.mjs +1 -0
- package/dist/shacl/Validator.d.mts +2 -0
- package/dist/shacl/Validator.mjs +1 -0
- package/dist/shacl/Vocabulary.d.mts +2 -0
- package/dist/shacl/Vocabulary.mjs +1 -0
- package/dist/shacl/index.d.mts +9 -0
- package/dist/shacl/index.mjs +8 -0
- package/dist/shex/SemAct.d.mts +2 -0
- package/dist/shex/SemAct.mjs +1 -0
- package/dist/shex/ShExC.d.mts +2 -0
- package/dist/shex/ShExC.mjs +1 -0
- package/dist/shex/ShExError.d.mts +2 -0
- package/dist/shex/ShExError.mjs +1 -0
- package/dist/shex/ShExJ.d.mts +2 -0
- package/dist/shex/ShExJ.mjs +2 -0
- package/dist/shex/ShExR.d.mts +2 -0
- package/dist/shex/ShExR.mjs +1 -0
- package/dist/shex/ShapeMap.d.mts +2 -0
- package/dist/shex/ShapeMap.mjs +1 -0
- package/dist/shex/Structure.d.mts +2 -0
- package/dist/shex/Structure.mjs +2 -0
- package/dist/shex/Validator.d.mts +2 -0
- package/dist/shex/Validator.mjs +4 -0
- package/dist/shex/index.d.mts +9 -0
- package/dist/shex/index.mjs +9 -0
- package/dist/sparql/Algebra.d.mts +2 -0
- package/dist/sparql/Algebra.mjs +1 -0
- package/dist/sparql/Ast.d.mts +2 -0
- package/dist/sparql/Ast.mjs +1 -0
- package/dist/sparql/Bindings.d.mts +2 -0
- package/dist/sparql/Bindings.mjs +1 -0
- package/dist/sparql/ClientErrors.d.mts +2 -0
- package/dist/sparql/ClientErrors.mjs +1 -0
- package/dist/sparql/ClientFormats.d.mts +2 -0
- package/dist/sparql/ClientFormats.mjs +1 -0
- package/dist/sparql/Engine.d.mts +2 -0
- package/dist/sparql/Engine.mjs +1 -0
- package/dist/sparql/Errors.d.mts +2 -0
- package/dist/sparql/Errors.mjs +1 -0
- package/dist/sparql/Expression.d.mts +2 -0
- package/dist/sparql/Expression.mjs +1 -0
- package/dist/sparql/Federation.d.mts +2 -0
- package/dist/sparql/Federation.mjs +1 -0
- package/dist/sparql/Functions.d.mts +2 -0
- package/dist/sparql/Functions.mjs +1 -0
- package/dist/sparql/Generator.d.mts +2 -0
- package/dist/sparql/Generator.mjs +1 -0
- package/dist/sparql/GraphStore.d.mts +2 -0
- package/dist/sparql/GraphStore.mjs +1 -0
- package/dist/sparql/Optimizer.d.mts +2 -0
- package/dist/sparql/Optimizer.mjs +1 -0
- package/dist/sparql/Options.d.mts +2 -0
- package/dist/sparql/Options.mjs +1 -0
- package/dist/sparql/Parser.d.mts +2 -0
- package/dist/sparql/Parser.mjs +1 -0
- package/dist/sparql/Protocol.d.mts +2 -0
- package/dist/sparql/Protocol.mjs +1 -0
- package/dist/sparql/ProtocolErrors.d.mts +2 -0
- package/dist/sparql/ProtocolErrors.mjs +1 -0
- package/dist/sparql/QueryBuilder.d.mts +2 -0
- package/dist/sparql/QueryBuilder.mjs +1 -0
- package/dist/sparql/Results.d.mts +2 -0
- package/dist/sparql/Results.mjs +1 -0
- package/dist/sparql/ResultsStream.d.mts +2 -0
- package/dist/sparql/ResultsStream.mjs +1 -0
- package/dist/sparql/ServerFormats.d.mts +2 -0
- package/dist/sparql/ServerFormats.mjs +1 -0
- package/dist/sparql/ServiceDescription.d.mts +2 -0
- package/dist/sparql/ServiceDescription.mjs +1 -0
- package/dist/sparql/SparqlClient.d.mts +2 -0
- package/dist/sparql/SparqlClient.mjs +1 -0
- package/dist/sparql/SparqlServer.d.mts +2 -0
- package/dist/sparql/SparqlServer.mjs +1 -0
- package/dist/sparql/Store.d.mts +2 -0
- package/dist/sparql/Store.mjs +1 -0
- package/dist/sparql/TermSchema.d.mts +3 -0
- package/dist/sparql/TermSchema.mjs +2 -0
- package/dist/sparql/Testing.d.mts +2 -0
- package/dist/sparql/Testing.mjs +1 -0
- package/dist/sparql/Translate.d.mts +2 -0
- package/dist/sparql/Translate.mjs +1 -0
- package/dist/sparql/ai/Mcp.d.mts +2 -0
- package/dist/sparql/ai/Mcp.mjs +1 -0
- package/dist/sparql/ai/Tools.d.mts +2 -0
- package/dist/sparql/ai/Tools.mjs +1 -0
- package/dist/sparql/ai/index.d.mts +3 -0
- package/dist/sparql/ai/index.mjs +3 -0
- package/dist/sparql/index.d.mts +30 -0
- package/dist/sparql/index.mjs +29 -0
- package/dist/sparql/shacl/Evaluator.d.mts +2 -0
- package/dist/sparql/shacl/Evaluator.mjs +1 -0
- package/dist/sparql/shacl/Query.d.mts +2 -0
- package/dist/sparql/shacl/Query.mjs +1 -0
- package/dist/sparql/shacl/index.d.mts +3 -0
- package/dist/sparql/shacl/index.mjs +3 -0
- package/dist/sparql/sql/Dialect.d.mts +2 -0
- package/dist/sparql/sql/Dialect.mjs +1 -0
- package/dist/sparql/sql/SqlStore.d.mts +2 -0
- package/dist/sparql/sql/SqlStore.mjs +1 -0
- package/dist/sparql/sql/Translation.d.mts +2 -0
- package/dist/sparql/sql/Translation.mjs +1 -0
- package/dist/sparql/sql/index.d.mts +4 -0
- package/dist/sparql/sql/index.mjs +4 -0
- package/dist/stringMap-D5YIpYtR.mjs +38 -0
- package/dist/stringMap-D5YIpYtR.mjs.map +1 -0
- package/dist/tokens-C6BzeodQ.mjs +24 -0
- package/dist/tokens-C6BzeodQ.mjs.map +1 -0
- package/dist/turtle/Grammar.d.mts +3 -0
- package/dist/turtle/Grammar.mjs +3 -0
- package/dist/turtle/Manifest.d.mts +2 -0
- package/dist/turtle/Manifest.mjs +1 -0
- package/dist/turtle/TriG.d.mts +2 -0
- package/dist/turtle/TriG.mjs +1 -0
- package/dist/turtle/Turtle.d.mts +2 -0
- package/dist/turtle/Turtle.mjs +1 -0
- package/dist/turtle/index.d.mts +5 -0
- package/dist/turtle/index.mjs +5 -0
- package/dist/xmp/DublinCore.d.mts +2 -0
- package/dist/xmp/DublinCore.mjs +1 -0
- package/dist/xmp/Exif.d.mts +2 -0
- package/dist/xmp/Exif.mjs +1 -0
- package/dist/xmp/Extract.d.mts +2 -0
- package/dist/xmp/Extract.mjs +1 -0
- package/dist/xmp/Metadata.d.mts +2 -0
- package/dist/xmp/Metadata.mjs +1 -0
- package/dist/xmp/Namespaces.d.mts +2 -0
- package/dist/xmp/Namespaces.mjs +1 -0
- package/dist/xmp/Packet.d.mts +2 -0
- package/dist/xmp/Packet.mjs +1 -0
- package/dist/xmp/Pdf.d.mts +2 -0
- package/dist/xmp/Pdf.mjs +1 -0
- package/dist/xmp/PdfA.d.mts +2 -0
- package/dist/xmp/PdfA.mjs +1 -0
- package/dist/xmp/Photoshop.d.mts +2 -0
- package/dist/xmp/Photoshop.mjs +1 -0
- package/dist/xmp/Tiff.d.mts +2 -0
- package/dist/xmp/Tiff.mjs +1 -0
- package/dist/xmp/Xmp.d.mts +2 -0
- package/dist/xmp/Xmp.mjs +3 -0
- package/dist/xmp/XmpBasic.d.mts +2 -0
- package/dist/xmp/XmpBasic.mjs +1 -0
- package/dist/xmp/XmpMM.d.mts +2 -0
- package/dist/xmp/XmpMM.mjs +1 -0
- package/dist/xmp/XmpRights.d.mts +2 -0
- package/dist/xmp/XmpRights.mjs +1 -0
- package/dist/xmp/index.d.mts +15 -0
- package/dist/xmp/index.mjs +15 -0
- package/package.json +187 -3
- package/src/Dataset.ts +1085 -0
- package/src/Iri.ts +322 -0
- package/src/Isomorphism.ts +319 -0
- package/src/LanguageTag.ts +98 -0
- package/src/Namespace.ts +100 -0
- package/src/PrefixMap.ts +117 -0
- package/src/RdfJs.ts +146 -0
- package/src/Rdfs.ts +241 -0
- package/src/Reification.ts +103 -0
- package/src/Resource.ts +873 -0
- package/src/Serialization.ts +775 -0
- package/src/Term.ts +1300 -0
- package/src/TermCodec.ts +505 -0
- package/src/TermJson.ts +313 -0
- package/src/Vocab.ts +161 -0
- package/src/Xsd.ts +573 -0
- package/src/csvw/Csv2Json.ts +265 -0
- package/src/csvw/Csv2Rdf.ts +268 -0
- package/src/csvw/Datatype.ts +589 -0
- package/src/csvw/Metadata.ts +1523 -0
- package/src/csvw/Processor.ts +276 -0
- package/src/csvw/Report.ts +135 -0
- package/src/csvw/Table.ts +759 -0
- package/src/csvw/index.ts +22 -0
- package/src/csvw/internal/dateFormat.ts +202 -0
- package/src/csvw/internal/json.ts +104 -0
- package/src/csvw/internal/numberFormat.ts +369 -0
- package/src/csvw/internal/object.ts +23 -0
- package/src/csvw/internal/uriTemplate.ts +130 -0
- package/src/csvw/internal/url.ts +93 -0
- package/src/csvw/internal/vocab.ts +282 -0
- package/src/index.ts +40 -0
- package/src/internal/arbitrary.ts +148 -0
- package/src/internal/loop.ts +24 -0
- package/src/internal/pending.ts +20 -0
- package/src/internal/textDecoder.ts +183 -0
- package/src/jsonld/DocumentLoader.ts +512 -0
- package/src/jsonld/JsonLd.ts +847 -0
- package/src/jsonld/JsonLdError.ts +105 -0
- package/src/jsonld/index.ts +13 -0
- package/src/jsonld/internal/compact.ts +852 -0
- package/src/jsonld/internal/context.ts +781 -0
- package/src/jsonld/internal/expand.ts +614 -0
- package/src/jsonld/internal/flatten.ts +243 -0
- package/src/jsonld/internal/frame.ts +559 -0
- package/src/jsonld/internal/iri.ts +52 -0
- package/src/jsonld/internal/json.ts +19 -0
- package/src/jsonld/internal/linkHeader.ts +60 -0
- package/src/jsonld/internal/rdf.ts +481 -0
- package/src/jsonld/internal/util.ts +367 -0
- package/src/n3/Isomorphism.ts +476 -0
- package/src/n3/Mapping.ts +332 -0
- package/src/n3/Model.ts +696 -0
- package/src/n3/N3.ts +237 -0
- package/src/n3/Reasoner.ts +568 -0
- package/src/n3/Vocab.ts +111 -0
- package/src/n3/index.ts +21 -0
- package/src/n3/internal/builtins.ts +668 -0
- package/src/n3/internal/guards.ts +23 -0
- package/src/n3/internal/lists.ts +106 -0
- package/src/n3/internal/loop.ts +28 -0
- package/src/n3/internal/parser.ts +1032 -0
- package/src/n3/internal/writer.ts +344 -0
- package/src/ntriples/Grammar.ts +317 -0
- package/src/ntriples/Lexical.ts +321 -0
- package/src/ntriples/NQuads.ts +140 -0
- package/src/ntriples/NTriples.ts +143 -0
- package/src/ntriples/index.ts +14 -0
- package/src/ntriples/internal/codec.ts +229 -0
- package/src/ntriples/internal/lineParser.ts +326 -0
- package/src/ntriples/internal/loop.ts +14 -0
- package/src/rdfjson/RdfJson.ts +806 -0
- package/src/rdfjson/index.ts +9 -0
- package/src/rdfjson/internal/json.ts +19 -0
- package/src/rdfxml/RdfXml.ts +1408 -0
- package/src/rdfxml/Xml.ts +419 -0
- package/src/rdfxml/index.ts +11 -0
- package/src/rdfxml/internal/chars.ts +73 -0
- package/src/rdfxml/internal/loop.ts +24 -0
- package/src/rdfxml/internal/parser.ts +1265 -0
- package/src/shacl/Message.ts +102 -0
- package/src/shacl/Path.ts +483 -0
- package/src/shacl/Shapes.ts +913 -0
- package/src/shacl/Sparql.ts +128 -0
- package/src/shacl/ValidationReport.ts +438 -0
- package/src/shacl/Validator.ts +1156 -0
- package/src/shacl/Vocabulary.ts +180 -0
- package/src/shacl/index.ts +22 -0
- package/src/shacl/internal/compare.ts +128 -0
- package/src/shacl/internal/regex.ts +56 -0
- package/src/shex/SemAct.ts +197 -0
- package/src/shex/ShExC.ts +415 -0
- package/src/shex/ShExError.ts +71 -0
- package/src/shex/ShExJ.ts +893 -0
- package/src/shex/ShExR.ts +640 -0
- package/src/shex/ShapeMap.ts +385 -0
- package/src/shex/Structure.ts +467 -0
- package/src/shex/Validator.ts +395 -0
- package/src/shex/index.ts +24 -0
- package/src/shex/internal/engine.ts +682 -0
- package/src/shex/internal/iterate.ts +14 -0
- package/src/shex/internal/json.ts +12 -0
- package/src/shex/internal/lexer.ts +56 -0
- package/src/shex/internal/nodeConstraint.ts +368 -0
- package/src/shex/internal/shexcLexer.ts +387 -0
- package/src/shex/internal/shexcParser.ts +1312 -0
- package/src/shex/internal/tokens.ts +41 -0
- package/src/shex/internal/xpathRegex.ts +290 -0
- package/src/sparql/Algebra.ts +914 -0
- package/src/sparql/Ast.ts +1344 -0
- package/src/sparql/Bindings.ts +272 -0
- package/src/sparql/ClientErrors.ts +156 -0
- package/src/sparql/ClientFormats.ts +70 -0
- package/src/sparql/Engine.ts +699 -0
- package/src/sparql/Errors.ts +30 -0
- package/src/sparql/Expression.ts +360 -0
- package/src/sparql/Federation.ts +187 -0
- package/src/sparql/Functions.ts +689 -0
- package/src/sparql/Generator.ts +426 -0
- package/src/sparql/GraphStore.ts +341 -0
- package/src/sparql/Optimizer.ts +230 -0
- package/src/sparql/Options.ts +191 -0
- package/src/sparql/Parser.ts +173 -0
- package/src/sparql/Protocol.ts +342 -0
- package/src/sparql/ProtocolErrors.ts +113 -0
- package/src/sparql/QueryBuilder.ts +953 -0
- package/src/sparql/Results.ts +844 -0
- package/src/sparql/ResultsStream.ts +771 -0
- package/src/sparql/ServerFormats.ts +75 -0
- package/src/sparql/ServiceDescription.ts +130 -0
- package/src/sparql/SparqlClient.ts +947 -0
- package/src/sparql/SparqlServer.ts +528 -0
- package/src/sparql/Store.ts +311 -0
- package/src/sparql/TermSchema.ts +20 -0
- package/src/sparql/Testing.ts +114 -0
- package/src/sparql/Translate.ts +407 -0
- package/src/sparql/ai/Mcp.ts +43 -0
- package/src/sparql/ai/Tools.ts +481 -0
- package/src/sparql/ai/index.ts +11 -0
- package/src/sparql/index.ts +64 -0
- package/src/sparql/internal/evaluator.ts +947 -0
- package/src/sparql/internal/hash.ts +418 -0
- package/src/sparql/internal/json.ts +12 -0
- package/src/sparql/internal/lexer.ts +488 -0
- package/src/sparql/internal/loop.ts +24 -0
- package/src/sparql/internal/parser.ts +2215 -0
- package/src/sparql/internal/prefetch.ts +46 -0
- package/src/sparql/internal/stringMap.ts +39 -0
- package/src/sparql/internal/textResults.ts +226 -0
- package/src/sparql/internal/values.ts +550 -0
- package/src/sparql/shacl/Evaluator.ts +478 -0
- package/src/sparql/shacl/Query.ts +574 -0
- package/src/sparql/shacl/index.ts +12 -0
- package/src/sparql/sql/Dialect.ts +246 -0
- package/src/sparql/sql/SqlStore.ts +1080 -0
- package/src/sparql/sql/Translation.ts +1898 -0
- package/src/sparql/sql/index.ts +17 -0
- package/src/sparql/sql/internal/encoding.ts +313 -0
- package/src/turtle/Grammar.ts +286 -0
- package/src/turtle/Manifest.ts +215 -0
- package/src/turtle/TriG.ts +158 -0
- package/src/turtle/Turtle.ts +166 -0
- package/src/turtle/index.ts +14 -0
- package/src/turtle/internal/loop.ts +23 -0
- package/src/turtle/internal/parse.ts +112 -0
- package/src/turtle/internal/parser.ts +1303 -0
- package/src/turtle/internal/serialize.ts +79 -0
- package/src/turtle/internal/streamWriter.ts +128 -0
- package/src/turtle/internal/writer.ts +898 -0
- package/src/xmp/DublinCore.ts +147 -0
- package/src/xmp/Exif.ts +109 -0
- package/src/xmp/Extract.ts +351 -0
- package/src/xmp/Metadata.ts +703 -0
- package/src/xmp/Namespaces.ts +228 -0
- package/src/xmp/Packet.ts +297 -0
- package/src/xmp/Pdf.ts +99 -0
- package/src/xmp/PdfA.ts +280 -0
- package/src/xmp/Photoshop.ts +275 -0
- package/src/xmp/Tiff.ts +196 -0
- package/src/xmp/Xmp.ts +430 -0
- package/src/xmp/XmpBasic.ts +90 -0
- package/src/xmp/XmpMM.ts +82 -0
- package/src/xmp/XmpRights.ts +83 -0
- package/src/xmp/index.ts +36 -0
- package/src/xmp/internal/accessors.ts +72 -0
- package/src/xmp/internal/xml.ts +63 -0
package/src/Resource.ts
ADDED
|
@@ -0,0 +1,873 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed records over the resources of a `Dataset`: annotate a `Schema.Struct`
|
|
3
|
+
* with the predicate behind each field, then decode a subject's properties
|
|
4
|
+
* into the struct's type and encode a value back to quads.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const Person = Schema.Struct({
|
|
8
|
+
* name: Resource.property(foaf('name'), TermCodec.string),
|
|
9
|
+
* nick: Schema.optional(Resource.property(foaf('nick'), TermCodec.string)),
|
|
10
|
+
* knows: Resource.property(foaf('knows'), Schema.Array(TermCodec.namedNode)),
|
|
11
|
+
* }).pipe(Resource.describe({ type: foaf('Person') }))
|
|
12
|
+
*
|
|
13
|
+
* Resource.decode(Person)(dataset, alice) // Effect<{ name: string; nick?: string; … }, SchemaError>
|
|
14
|
+
* Resource.encode(Person)(alice, value) // Effect<ReadonlyArray<Quad>, SchemaError>
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* A field's cardinality comes from its schema: a plain codec reads exactly
|
|
18
|
+
* one object, `Schema.optional` / `Schema.optionalKey` at most one,
|
|
19
|
+
* `Schema.Array` any number (in `Term.Order`) and `list` an RDF collection.
|
|
20
|
+
* A field whose codec is a struct is a nested resource, decoded from the
|
|
21
|
+
* object's own properties. Each value decodes through its field's codec (see
|
|
22
|
+
* `TermCodec`), and failures are ordinary schema issues at the field's path.
|
|
23
|
+
*
|
|
24
|
+
* @since 0.1.0
|
|
25
|
+
*/
|
|
26
|
+
import * as Arr from 'effect/Array';
|
|
27
|
+
import * as Effect from 'effect/Effect';
|
|
28
|
+
import * as Equal from 'effect/Equal';
|
|
29
|
+
import * as Option from 'effect/Option';
|
|
30
|
+
import * as Predicate from 'effect/Predicate';
|
|
31
|
+
import * as Record from 'effect/Record';
|
|
32
|
+
import * as Schema from 'effect/Schema';
|
|
33
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
34
|
+
import * as SchemaIssue from 'effect/SchemaIssue';
|
|
35
|
+
import * as SchemaParser from 'effect/SchemaParser';
|
|
36
|
+
import * as SchemaTransformation from 'effect/SchemaTransformation';
|
|
37
|
+
import * as Dataset from './Dataset.ts';
|
|
38
|
+
import * as LanguageTag from './LanguageTag.ts';
|
|
39
|
+
import * as Term from './Term.ts';
|
|
40
|
+
import { rdf } from './Vocab.ts';
|
|
41
|
+
|
|
42
|
+
// -----------------------------------------------------------------------------
|
|
43
|
+
// Annotations
|
|
44
|
+
// -----------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The annotation key `property` stores a field's `Property` under.
|
|
48
|
+
*
|
|
49
|
+
* @since 0.1.0
|
|
50
|
+
* @category annotations
|
|
51
|
+
*/
|
|
52
|
+
export const PropertyKey = '@thomasfosterau/effect-rdf/Resource/property';
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The annotation key `describe` stores a struct's `Description` under.
|
|
56
|
+
*
|
|
57
|
+
* @since 0.1.0
|
|
58
|
+
* @category annotations
|
|
59
|
+
*/
|
|
60
|
+
export const DescriptionKey = '@thomasfosterau/effect-rdf/Resource/description';
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The annotation key `list` marks an array schema as an RDF collection with.
|
|
64
|
+
*
|
|
65
|
+
* @since 0.1.0
|
|
66
|
+
* @category annotations
|
|
67
|
+
*/
|
|
68
|
+
export const ListKey = '@thomasfosterau/effect-rdf/Resource/list';
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* How a field reads its values: the direction of its predicate and, for
|
|
72
|
+
* literals, the language tags it prefers.
|
|
73
|
+
*
|
|
74
|
+
* @since 0.1.0
|
|
75
|
+
* @category models
|
|
76
|
+
*/
|
|
77
|
+
export interface PropertyOptions {
|
|
78
|
+
/**
|
|
79
|
+
* Read the subjects of `?x predicate resource` instead of the objects of
|
|
80
|
+
* `resource predicate ?x` (and write such quads).
|
|
81
|
+
*/
|
|
82
|
+
readonly inverse?: boolean | undefined;
|
|
83
|
+
/**
|
|
84
|
+
* Language tags in order of preference, `''` for an untagged value. A
|
|
85
|
+
* single-valued field takes the first value whose tag matches, trying the
|
|
86
|
+
* tags in order; a multi-valued field keeps the values whose tag is listed.
|
|
87
|
+
* Tags compare case-insensitively. Overrides `DecodeOptions.languages`.
|
|
88
|
+
*/
|
|
89
|
+
readonly languages?: ReadonlyArray<string> | undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The predicate a field maps to, with its `PropertyOptions`: the value of the
|
|
94
|
+
* `PropertyKey` annotation.
|
|
95
|
+
*
|
|
96
|
+
* @since 0.1.0
|
|
97
|
+
* @category models
|
|
98
|
+
*/
|
|
99
|
+
export interface Property extends PropertyOptions {
|
|
100
|
+
readonly predicate: Term.NamedNode;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* What `describe` records about a struct: the `rdf:type` its resources carry
|
|
105
|
+
* and the field holding the resource itself.
|
|
106
|
+
*
|
|
107
|
+
* @since 0.1.0
|
|
108
|
+
* @category models
|
|
109
|
+
*/
|
|
110
|
+
export interface Description {
|
|
111
|
+
/**
|
|
112
|
+
* The class every resource of this shape is an instance of: decoding
|
|
113
|
+
* requires `resource rdf:type type`, encoding writes it, and `decodeAll`
|
|
114
|
+
* finds the resources by it.
|
|
115
|
+
*/
|
|
116
|
+
readonly type?: Term.NamedNode | undefined;
|
|
117
|
+
/**
|
|
118
|
+
* The name of a field that holds the resource term itself (decoded through
|
|
119
|
+
* that field's codec, e.g. `TermCodec.namedNode` or `TermCodec.iri`). A
|
|
120
|
+
* nested value with an id encodes under it; one without becomes a fresh
|
|
121
|
+
* blank node.
|
|
122
|
+
*/
|
|
123
|
+
readonly id?: string | undefined;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Maps a struct field to a predicate: annotates `codec` with the predicate
|
|
128
|
+
* (and `options`) without changing its type, so it composes with
|
|
129
|
+
* `Schema.optional`, `Schema.Array` and `list` on either side.
|
|
130
|
+
*
|
|
131
|
+
* @since 0.1.0
|
|
132
|
+
* @category constructors
|
|
133
|
+
*/
|
|
134
|
+
export const property = <S extends Schema.Top>(
|
|
135
|
+
predicate: Term.NamedNode,
|
|
136
|
+
codec: S,
|
|
137
|
+
options?: PropertyOptions,
|
|
138
|
+
): S['Rebuild'] => {
|
|
139
|
+
const value: Property = { ...options, predicate };
|
|
140
|
+
return codec.annotate({ [PropertyKey]: value });
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Describes a struct as an RDF resource: the `rdf:type` it requires and
|
|
145
|
+
* writes, and the field (if any) holding the resource term.
|
|
146
|
+
*
|
|
147
|
+
* @since 0.1.0
|
|
148
|
+
* @category constructors
|
|
149
|
+
*/
|
|
150
|
+
export const describe =
|
|
151
|
+
(description: Description) =>
|
|
152
|
+
<S extends Schema.Top>(self: S): S['Rebuild'] =>
|
|
153
|
+
self.annotate({ [DescriptionKey]: description });
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* An array read from and written to an RDF collection (an `rdf:first` /
|
|
157
|
+
* `rdf:rest` list ending in `rdf:nil`) instead of repeated objects.
|
|
158
|
+
*
|
|
159
|
+
* @since 0.1.0
|
|
160
|
+
* @category constructors
|
|
161
|
+
*/
|
|
162
|
+
export const list = <S extends Schema.Top>(item: S): Schema.$Array<S> =>
|
|
163
|
+
Schema.Array(item).annotate({ [ListKey]: true });
|
|
164
|
+
|
|
165
|
+
// -----------------------------------------------------------------------------
|
|
166
|
+
// Options
|
|
167
|
+
// -----------------------------------------------------------------------------
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Options for `decode`, `decodeAll` and `schema`.
|
|
171
|
+
*
|
|
172
|
+
* @since 0.1.0
|
|
173
|
+
* @category models
|
|
174
|
+
*/
|
|
175
|
+
export interface DecodeOptions {
|
|
176
|
+
/** The graph to read (every graph when omitted). */
|
|
177
|
+
readonly graph?: Term.Graph | undefined;
|
|
178
|
+
/** The default `PropertyOptions.languages` of every field. */
|
|
179
|
+
readonly languages?: ReadonlyArray<string> | undefined;
|
|
180
|
+
/** Passed to the struct's decoder (e.g. `{ errors: 'all' }`). */
|
|
181
|
+
readonly parseOptions?: SchemaAST.ParseOptions | undefined;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Options for `encode` and `schema`.
|
|
186
|
+
*
|
|
187
|
+
* @since 0.1.0
|
|
188
|
+
* @category models
|
|
189
|
+
*/
|
|
190
|
+
export interface EncodeOptions {
|
|
191
|
+
/** The graph to write the quads into (the default graph when omitted). */
|
|
192
|
+
readonly graph?: Term.Graph | undefined;
|
|
193
|
+
/** Passed to the struct's encoder. */
|
|
194
|
+
readonly parseOptions?: SchemaAST.ParseOptions | undefined;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* One resource `decodeAll` found and decoded.
|
|
199
|
+
*
|
|
200
|
+
* @since 0.1.0
|
|
201
|
+
* @category models
|
|
202
|
+
*/
|
|
203
|
+
export interface Decoded<A> {
|
|
204
|
+
readonly subject: Term.Subject;
|
|
205
|
+
readonly value: A;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// -----------------------------------------------------------------------------
|
|
209
|
+
// Field plans
|
|
210
|
+
// -----------------------------------------------------------------------------
|
|
211
|
+
|
|
212
|
+
type Cardinality = 'one' | 'many' | 'list';
|
|
213
|
+
|
|
214
|
+
// A struct field's name; numeric keys are not fields of a resource.
|
|
215
|
+
type Key = string | symbol;
|
|
216
|
+
|
|
217
|
+
const keyOf = (signature: SchemaAST.PropertySignature): Option.Option<Key> =>
|
|
218
|
+
Predicate.isNumber(signature.name) ? Option.none() : Option.some(signature.name);
|
|
219
|
+
|
|
220
|
+
interface Field {
|
|
221
|
+
readonly name: Key;
|
|
222
|
+
readonly property: Property;
|
|
223
|
+
readonly cardinality: Cardinality;
|
|
224
|
+
/** The key may be absent: `Schema.optional` / `Schema.optionalKey`. */
|
|
225
|
+
readonly optional: boolean;
|
|
226
|
+
/** The schema of one value. */
|
|
227
|
+
readonly item: SchemaAST.AST;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const propertyOf = SchemaAST.resolveAt<Property>(PropertyKey);
|
|
231
|
+
const descriptionOf = SchemaAST.resolveAt<Description>(DescriptionKey);
|
|
232
|
+
const isList = (ast: SchemaAST.AST): boolean => SchemaAST.resolveAt<boolean>(ListKey)(ast) === true;
|
|
233
|
+
|
|
234
|
+
const resolveSuspend = (ast: SchemaAST.AST): SchemaAST.AST =>
|
|
235
|
+
SchemaAST.isSuspend(ast) ? resolveSuspend(ast.thunk()) : ast;
|
|
236
|
+
|
|
237
|
+
// `T | undefined` (what `Schema.optional` wraps a field in) without the `undefined`.
|
|
238
|
+
const withoutUndefined = (ast: SchemaAST.AST): SchemaAST.AST => {
|
|
239
|
+
if (!SchemaAST.isUnion(ast)) return ast;
|
|
240
|
+
const defined = Arr.filter(ast.types, (t) => !SchemaAST.isUndefined(t));
|
|
241
|
+
return defined.length === 1 && defined.length < ast.types.length
|
|
242
|
+
? Option.getOrElse(Arr.head(defined), () => ast)
|
|
243
|
+
: ast;
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
// An array of encoded values (`Schema.Array(codec)`), as opposed to a codec whose type is an array.
|
|
247
|
+
const arrayItem = (ast: SchemaAST.AST): Option.Option<SchemaAST.AST> =>
|
|
248
|
+
SchemaAST.isArrays(ast) && ast.encoding === undefined && Arr.isReadonlyArrayEmpty(ast.elements)
|
|
249
|
+
? Arr.head(ast.rest)
|
|
250
|
+
: Option.none();
|
|
251
|
+
|
|
252
|
+
// A nested resource: a struct whose encoded side is itself a record of terms.
|
|
253
|
+
const nestedStruct = (ast: SchemaAST.AST): Option.Option<SchemaAST.Objects> => {
|
|
254
|
+
const resolved = resolveSuspend(ast);
|
|
255
|
+
return SchemaAST.isObjects(resolved) && resolved.encoding === undefined
|
|
256
|
+
? Option.some(resolved)
|
|
257
|
+
: Option.none();
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
const fieldOf = (signature: SchemaAST.PropertySignature): Option.Option<Field> =>
|
|
261
|
+
Option.flatMap(keyOf(signature), (name) => fieldNamed(name, signature));
|
|
262
|
+
|
|
263
|
+
const fieldNamed = (name: Key, signature: SchemaAST.PropertySignature): Option.Option<Field> => {
|
|
264
|
+
const declared = signature.type;
|
|
265
|
+
const optional = SchemaAST.isOptional(declared);
|
|
266
|
+
const inner = withoutUndefined(declared);
|
|
267
|
+
const element = arrayItem(inner);
|
|
268
|
+
const annotated = Arr.getSomes([
|
|
269
|
+
Option.fromUndefinedOr(propertyOf(declared)),
|
|
270
|
+
Option.fromUndefinedOr(propertyOf(inner)),
|
|
271
|
+
Option.flatMap(element, (e) => Option.fromUndefinedOr(propertyOf(e))),
|
|
272
|
+
]);
|
|
273
|
+
return Option.map(Arr.head(annotated), (found) =>
|
|
274
|
+
Option.match(element, {
|
|
275
|
+
onNone: () => ({
|
|
276
|
+
name,
|
|
277
|
+
property: found,
|
|
278
|
+
cardinality: 'one' as const,
|
|
279
|
+
optional,
|
|
280
|
+
item: inner,
|
|
281
|
+
}),
|
|
282
|
+
onSome: (item) => ({
|
|
283
|
+
name,
|
|
284
|
+
property: found,
|
|
285
|
+
cardinality: isList(inner) ? ('list' as const) : ('many' as const),
|
|
286
|
+
optional,
|
|
287
|
+
item,
|
|
288
|
+
}),
|
|
289
|
+
}),
|
|
290
|
+
);
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
const expectStruct = (ast: SchemaAST.AST): Effect.Effect<SchemaAST.Objects, SchemaIssue.Issue> =>
|
|
294
|
+
Effect.mapError(
|
|
295
|
+
Effect.fromOption(nestedStruct(ast)),
|
|
296
|
+
() =>
|
|
297
|
+
new SchemaIssue.InvalidValue({
|
|
298
|
+
message: 'Expected a struct schema (Schema.Struct) to map a resource to',
|
|
299
|
+
}),
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
const describedType = (ast: SchemaAST.AST): Option.Option<Term.NamedNode> =>
|
|
303
|
+
Option.fromUndefinedOr(descriptionOf(ast)?.type);
|
|
304
|
+
|
|
305
|
+
const describedId = (ast: SchemaAST.AST): Option.Option<string> =>
|
|
306
|
+
Option.fromUndefinedOr(descriptionOf(ast)?.id);
|
|
307
|
+
|
|
308
|
+
// -----------------------------------------------------------------------------
|
|
309
|
+
// Decoding
|
|
310
|
+
// -----------------------------------------------------------------------------
|
|
311
|
+
|
|
312
|
+
interface DecodeContext {
|
|
313
|
+
readonly dataset: Dataset.Dataset;
|
|
314
|
+
readonly options: DecodeOptions;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
type Visit = readonly [SchemaAST.AST, Term.Subject];
|
|
318
|
+
|
|
319
|
+
const languageOf = (term: Term.Term): string =>
|
|
320
|
+
Term.isLiteral(term) ? LanguageTag.normalize(term.language) : '';
|
|
321
|
+
|
|
322
|
+
const hasLanguage =
|
|
323
|
+
(tag: string) =>
|
|
324
|
+
(term: Term.Term): boolean =>
|
|
325
|
+
languageOf(term) === LanguageTag.normalize(tag);
|
|
326
|
+
|
|
327
|
+
// The values of a field, before cardinality: sorted for determinism, then narrowed by language.
|
|
328
|
+
const valuesOf = (
|
|
329
|
+
context: DecodeContext,
|
|
330
|
+
subject: Term.Subject,
|
|
331
|
+
field: Field,
|
|
332
|
+
): ReadonlyArray<Term.Object> => {
|
|
333
|
+
const { predicate, inverse } = field.property;
|
|
334
|
+
const terms: ReadonlyArray<Term.Object> =
|
|
335
|
+
inverse === true
|
|
336
|
+
? Dataset.subjectsOf(context.dataset, predicate, subject, context.options.graph)
|
|
337
|
+
: Dataset.objectsOf(context.dataset, subject, predicate, context.options.graph);
|
|
338
|
+
const sorted = Arr.sort(terms, Term.Order);
|
|
339
|
+
const languages = field.property.languages ?? context.options.languages;
|
|
340
|
+
if (languages === undefined) return sorted;
|
|
341
|
+
if (field.cardinality === 'one') {
|
|
342
|
+
return Arr.fromOption(
|
|
343
|
+
Arr.findFirst(languages, (tag) => Arr.findFirst(sorted, hasLanguage(tag))),
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
return Arr.dedupe(Arr.flatMap(languages, (tag) => Arr.filter(sorted, hasLanguage(tag))));
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
const describePredicate = (field: Field): string =>
|
|
350
|
+
field.property.inverse === true
|
|
351
|
+
? `^${field.property.predicate.toString()}`
|
|
352
|
+
: field.property.predicate.toString();
|
|
353
|
+
|
|
354
|
+
const atField =
|
|
355
|
+
(field: Field, ...path: ReadonlyArray<PropertyKey>) =>
|
|
356
|
+
(issue: SchemaIssue.Issue): SchemaIssue.Issue =>
|
|
357
|
+
new SchemaIssue.Pointer([field.name, ...path], issue);
|
|
358
|
+
|
|
359
|
+
const missing = (field: Field): SchemaIssue.Issue =>
|
|
360
|
+
atField(field)(
|
|
361
|
+
new SchemaIssue.MissingKey({
|
|
362
|
+
messageMissingKey: `Missing value for ${describePredicate(field)}`,
|
|
363
|
+
predicate: field.property.predicate.value,
|
|
364
|
+
}),
|
|
365
|
+
);
|
|
366
|
+
|
|
367
|
+
const tooMany = (field: Field, values: ReadonlyArray<Term.Object>): SchemaIssue.Issue =>
|
|
368
|
+
atField(field)(
|
|
369
|
+
new SchemaIssue.InvalidValue(
|
|
370
|
+
{
|
|
371
|
+
message: `Expected ${field.optional ? 'at most' : 'exactly'} one value for ${describePredicate(field)}, got ${values.length}`,
|
|
372
|
+
predicate: field.property.predicate.value,
|
|
373
|
+
},
|
|
374
|
+
values,
|
|
375
|
+
),
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
const isSubjectTerm = (term: Term.Term): term is Term.Subject => Term.isSubject(term);
|
|
379
|
+
|
|
380
|
+
// The encoded value of one field value: the term, or a nested resource's record.
|
|
381
|
+
const encodedValue = (
|
|
382
|
+
context: DecodeContext,
|
|
383
|
+
item: SchemaAST.AST,
|
|
384
|
+
term: Term.Object,
|
|
385
|
+
visits: ReadonlyArray<Visit>,
|
|
386
|
+
): Effect.Effect<unknown, SchemaIssue.Issue> =>
|
|
387
|
+
Option.match(nestedStruct(item), {
|
|
388
|
+
onNone: () => Effect.succeed(term),
|
|
389
|
+
onSome: () =>
|
|
390
|
+
isSubjectTerm(term)
|
|
391
|
+
? gather(context, item, term, visits)
|
|
392
|
+
: Effect.fail(
|
|
393
|
+
new SchemaIssue.InvalidValue(
|
|
394
|
+
{ message: `Expected an IRI or blank node, got ${term.toString()}` },
|
|
395
|
+
term,
|
|
396
|
+
),
|
|
397
|
+
),
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
const encodedValues = (
|
|
401
|
+
context: DecodeContext,
|
|
402
|
+
field: Field,
|
|
403
|
+
terms: ReadonlyArray<Term.Object>,
|
|
404
|
+
visits: ReadonlyArray<Visit>,
|
|
405
|
+
): Effect.Effect<ReadonlyArray<unknown>, SchemaIssue.Issue> =>
|
|
406
|
+
Effect.forEach(
|
|
407
|
+
terms,
|
|
408
|
+
(term, index) =>
|
|
409
|
+
Effect.mapError(encodedValue(context, field.item, term, visits), atField(field, index)),
|
|
410
|
+
{ concurrency: 1 },
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
const listItems = (
|
|
414
|
+
context: DecodeContext,
|
|
415
|
+
field: Field,
|
|
416
|
+
head: Term.Object,
|
|
417
|
+
): Effect.Effect<ReadonlyArray<Term.Object>, SchemaIssue.Issue> =>
|
|
418
|
+
Effect.mapError(
|
|
419
|
+
Effect.fromOption(Dataset.list(context.dataset, head, context.options.graph)),
|
|
420
|
+
() =>
|
|
421
|
+
atField(field)(
|
|
422
|
+
new SchemaIssue.InvalidValue(
|
|
423
|
+
{
|
|
424
|
+
message: `Expected an RDF list for ${describePredicate(field)}, got ${head.toString()}`,
|
|
425
|
+
predicate: field.property.predicate.value,
|
|
426
|
+
},
|
|
427
|
+
head,
|
|
428
|
+
),
|
|
429
|
+
),
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
// The encoded value of a field (`None` leaves the key out), checking its cardinality.
|
|
433
|
+
const encodedField = (
|
|
434
|
+
context: DecodeContext,
|
|
435
|
+
subject: Term.Subject,
|
|
436
|
+
field: Field,
|
|
437
|
+
visits: ReadonlyArray<Visit>,
|
|
438
|
+
): Effect.Effect<Option.Option<unknown>, SchemaIssue.Issue> => {
|
|
439
|
+
const values = valuesOf(context, subject, field);
|
|
440
|
+
if (field.cardinality === 'many') {
|
|
441
|
+
return Arr.isReadonlyArrayEmpty(values) && field.optional
|
|
442
|
+
? Effect.succeedNone
|
|
443
|
+
: Effect.asSome(encodedValues(context, field, values, visits));
|
|
444
|
+
}
|
|
445
|
+
return Arr.match(values, {
|
|
446
|
+
onEmpty: () => (field.optional ? Effect.succeedNone : Effect.fail(missing(field))),
|
|
447
|
+
onNonEmpty: ([first, ...rest]) => {
|
|
448
|
+
if (Arr.isArrayNonEmpty(rest)) return Effect.fail(tooMany(field, values));
|
|
449
|
+
return field.cardinality === 'list'
|
|
450
|
+
? Effect.asSome(
|
|
451
|
+
Effect.flatMap(listItems(context, field, first), (items) =>
|
|
452
|
+
encodedValues(context, field, items, visits),
|
|
453
|
+
),
|
|
454
|
+
)
|
|
455
|
+
: Effect.asSome(
|
|
456
|
+
Effect.mapError(encodedValue(context, field.item, first, visits), atField(field)),
|
|
457
|
+
);
|
|
458
|
+
},
|
|
459
|
+
});
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
const hasType = (
|
|
463
|
+
context: DecodeContext,
|
|
464
|
+
subject: Term.Subject,
|
|
465
|
+
type: Term.NamedNode,
|
|
466
|
+
): Effect.Effect<void, SchemaIssue.Issue> =>
|
|
467
|
+
Arr.isReadonlyArrayNonEmpty(
|
|
468
|
+
Dataset.match(context.dataset, {
|
|
469
|
+
subject,
|
|
470
|
+
predicate: rdf.type,
|
|
471
|
+
object: type,
|
|
472
|
+
graph: context.options.graph,
|
|
473
|
+
}),
|
|
474
|
+
)
|
|
475
|
+
? Effect.void
|
|
476
|
+
: Effect.fail(
|
|
477
|
+
new SchemaIssue.InvalidValue(
|
|
478
|
+
{
|
|
479
|
+
message: `Expected ${subject.toString()} to have rdf:type ${type.toString()}`,
|
|
480
|
+
predicate: rdf.type.value,
|
|
481
|
+
},
|
|
482
|
+
subject,
|
|
483
|
+
),
|
|
484
|
+
);
|
|
485
|
+
|
|
486
|
+
// The encoded record of a resource: every mapped field's terms (or nested records), so the
|
|
487
|
+
// struct's own decoder turns it into the struct's type.
|
|
488
|
+
const gather = (
|
|
489
|
+
context: DecodeContext,
|
|
490
|
+
ast: SchemaAST.AST,
|
|
491
|
+
subject: Term.Subject,
|
|
492
|
+
visits: ReadonlyArray<Visit>,
|
|
493
|
+
): Effect.Effect<Record.ReadonlyRecord<Key, unknown>, SchemaIssue.Issue> =>
|
|
494
|
+
Effect.gen(function* () {
|
|
495
|
+
const struct = yield* expectStruct(ast);
|
|
496
|
+
if (Arr.some(visits, ([seen, at]) => seen === struct && Equal.equals(at, subject))) {
|
|
497
|
+
return yield* Effect.fail(
|
|
498
|
+
new SchemaIssue.InvalidValue(
|
|
499
|
+
{ message: `Cycle: ${subject.toString()} is already being decoded as this resource` },
|
|
500
|
+
subject,
|
|
501
|
+
),
|
|
502
|
+
);
|
|
503
|
+
}
|
|
504
|
+
yield* Option.match(describedType(struct), {
|
|
505
|
+
onNone: () => Effect.void,
|
|
506
|
+
onSome: (type) => hasType(context, subject, type),
|
|
507
|
+
});
|
|
508
|
+
const id = describedId(struct);
|
|
509
|
+
const inner: ReadonlyArray<Visit> = [...visits, [struct, subject]];
|
|
510
|
+
const entries = yield* Effect.forEach(
|
|
511
|
+
struct.propertySignatures,
|
|
512
|
+
(signature): Effect.Effect<Option.Option<readonly [Key, unknown]>, SchemaIssue.Issue> =>
|
|
513
|
+
Option.match(keyOf(signature), {
|
|
514
|
+
onNone: () => Effect.succeedNone,
|
|
515
|
+
onSome: (name) =>
|
|
516
|
+
Option.contains(id, name)
|
|
517
|
+
? Effect.succeedSome([name, subject])
|
|
518
|
+
: Option.match(fieldNamed(name, signature), {
|
|
519
|
+
onNone: () => Effect.succeedNone,
|
|
520
|
+
onSome: (field) =>
|
|
521
|
+
Effect.map(
|
|
522
|
+
encodedField(context, subject, field, inner),
|
|
523
|
+
Option.map((value) => [name, value]),
|
|
524
|
+
),
|
|
525
|
+
}),
|
|
526
|
+
}),
|
|
527
|
+
{ concurrency: 1 },
|
|
528
|
+
);
|
|
529
|
+
return Record.fromEntries(Arr.getSomes(entries));
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
const contextOf = (dataset: Dataset.Dataset, options: DecodeOptions): DecodeContext => ({
|
|
533
|
+
dataset,
|
|
534
|
+
options,
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
const decodeIssue = <S extends Schema.Constraint>(
|
|
538
|
+
schema: S,
|
|
539
|
+
dataset: Dataset.Dataset,
|
|
540
|
+
subject: Term.Subject,
|
|
541
|
+
options: DecodeOptions,
|
|
542
|
+
parseOptions?: SchemaAST.ParseOptions,
|
|
543
|
+
): Effect.Effect<S['Type'], SchemaIssue.Issue, S['DecodingServices']> =>
|
|
544
|
+
Effect.flatMap(gather(contextOf(dataset, options), schema.ast, subject, []), (record) =>
|
|
545
|
+
SchemaParser.decodeEffect(schema)(record, parseOptions ?? options.parseOptions),
|
|
546
|
+
);
|
|
547
|
+
|
|
548
|
+
const toSchemaError = (issue: SchemaIssue.Issue): Schema.SchemaError =>
|
|
549
|
+
new Schema.SchemaError(issue);
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Decodes the resource `subject` of `dataset` with a struct of `property`
|
|
553
|
+
* fields: reads each field's values, checks their number against the field's
|
|
554
|
+
* cardinality, decodes nested resources recursively and runs the struct's
|
|
555
|
+
* decoder over the result.
|
|
556
|
+
*
|
|
557
|
+
* @since 0.1.0
|
|
558
|
+
* @category decoding
|
|
559
|
+
*/
|
|
560
|
+
export const decode =
|
|
561
|
+
<S extends Schema.Constraint>(schema: S) =>
|
|
562
|
+
(
|
|
563
|
+
dataset: Dataset.Dataset,
|
|
564
|
+
subject: Term.Subject,
|
|
565
|
+
options?: DecodeOptions,
|
|
566
|
+
): Effect.Effect<S['Type'], Schema.SchemaError, S['DecodingServices']> =>
|
|
567
|
+
Effect.mapError(decodeIssue(schema, dataset, subject, options ?? {}), toSchemaError);
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* Decodes every resource whose `rdf:type` is the struct's described `type`
|
|
571
|
+
* (in `Term.Order` of the subjects). Fails on the first resource that does
|
|
572
|
+
* not decode, with the subject at the head of the issue's path; fails when
|
|
573
|
+
* the struct has no described `type`.
|
|
574
|
+
*
|
|
575
|
+
* @since 0.1.0
|
|
576
|
+
* @category decoding
|
|
577
|
+
*/
|
|
578
|
+
export const decodeAll =
|
|
579
|
+
<S extends Schema.Constraint>(schema: S) =>
|
|
580
|
+
(
|
|
581
|
+
dataset: Dataset.Dataset,
|
|
582
|
+
options?: DecodeOptions,
|
|
583
|
+
): Effect.Effect<ReadonlyArray<Decoded<S['Type']>>, Schema.SchemaError, S['DecodingServices']> =>
|
|
584
|
+
Option.match(describedType(schema.ast), {
|
|
585
|
+
onNone: () =>
|
|
586
|
+
Effect.fail(
|
|
587
|
+
toSchemaError(
|
|
588
|
+
new SchemaIssue.InvalidValue({
|
|
589
|
+
message: 'Resource.decodeAll needs a struct described with a type',
|
|
590
|
+
}),
|
|
591
|
+
),
|
|
592
|
+
),
|
|
593
|
+
onSome: (type) =>
|
|
594
|
+
Effect.forEach(
|
|
595
|
+
Arr.sort(Dataset.subjectsOf(dataset, rdf.type, type, options?.graph), Term.Order),
|
|
596
|
+
(subject) =>
|
|
597
|
+
Effect.mapBoth(decodeIssue(schema, dataset, subject, options ?? {}), {
|
|
598
|
+
onFailure: (issue) => toSchemaError(new SchemaIssue.Pointer([subject.key], issue)),
|
|
599
|
+
onSuccess: (value): Decoded<S['Type']> => ({ subject, value }),
|
|
600
|
+
}),
|
|
601
|
+
{ concurrency: 1 },
|
|
602
|
+
),
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
// -----------------------------------------------------------------------------
|
|
606
|
+
// Encoding
|
|
607
|
+
// -----------------------------------------------------------------------------
|
|
608
|
+
|
|
609
|
+
interface Emitted {
|
|
610
|
+
readonly subject: Term.Subject;
|
|
611
|
+
readonly quads: ReadonlyArray<Term.Quad>;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// What a struct encodes to: one entry per field.
|
|
615
|
+
type EncodedRecord = Record.ReadonlyRecord<Key, unknown>;
|
|
616
|
+
|
|
617
|
+
const isEncodedRecord = (u: unknown): u is EncodedRecord =>
|
|
618
|
+
Predicate.isObject(u) && !Term.isTerm(u);
|
|
619
|
+
|
|
620
|
+
const read = (record: EncodedRecord, key: Key): Option.Option<unknown> =>
|
|
621
|
+
Option.filter(Record.get(record, key), Predicate.isNotUndefined);
|
|
622
|
+
|
|
623
|
+
const unexpected = (expected: string): SchemaIssue.Issue =>
|
|
624
|
+
new SchemaIssue.InvalidValue({ message: `Expected the codec to encode to ${expected}` });
|
|
625
|
+
|
|
626
|
+
const statement = (
|
|
627
|
+
field: Field,
|
|
628
|
+
subject: Term.Subject,
|
|
629
|
+
value: Term.Object,
|
|
630
|
+
graph: Term.Graph,
|
|
631
|
+
): Effect.Effect<Term.Quad, SchemaIssue.Issue> => {
|
|
632
|
+
const predicate = field.property.predicate;
|
|
633
|
+
if (field.property.inverse !== true) {
|
|
634
|
+
return Effect.succeed(new Term.Quad(subject, predicate, value, graph));
|
|
635
|
+
}
|
|
636
|
+
return isSubjectTerm(value)
|
|
637
|
+
? Effect.succeed(new Term.Quad(value, predicate, subject, graph))
|
|
638
|
+
: Effect.fail(
|
|
639
|
+
atField(field)(
|
|
640
|
+
new SchemaIssue.InvalidValue(
|
|
641
|
+
{
|
|
642
|
+
message: `Expected an IRI or blank node for ${describePredicate(field)}, got ${value.toString()}`,
|
|
643
|
+
predicate: predicate.value,
|
|
644
|
+
},
|
|
645
|
+
value,
|
|
646
|
+
),
|
|
647
|
+
),
|
|
648
|
+
);
|
|
649
|
+
};
|
|
650
|
+
|
|
651
|
+
// An RDF collection of `items`: its head and the `rdf:first` / `rdf:rest` quads.
|
|
652
|
+
const collection = (
|
|
653
|
+
items: ReadonlyArray<Term.Object>,
|
|
654
|
+
graph: Term.Graph,
|
|
655
|
+
): readonly [Term.Object, ReadonlyArray<Term.Quad>] => {
|
|
656
|
+
const nodes = Arr.map(items, () => Term.blankNode());
|
|
657
|
+
const rests: ReadonlyArray<Term.Object> = [...Arr.drop(nodes, 1), rdf.nil];
|
|
658
|
+
const quads = Arr.flatMap(Arr.zip(nodes, Arr.zip(items, rests)), ([node, [item, rest]]) => [
|
|
659
|
+
new Term.Quad(node, rdf.first, item, graph),
|
|
660
|
+
new Term.Quad(node, rdf.rest, rest, graph),
|
|
661
|
+
]);
|
|
662
|
+
return [Option.getOrElse(Arr.head(nodes), (): Term.Object => rdf.nil), quads];
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
// The term for one encoded value of a field, with the quads of a nested resource.
|
|
666
|
+
type Emittable = readonly [Term.Object, ReadonlyArray<Term.Quad>];
|
|
667
|
+
|
|
668
|
+
// The statements of one field of `record`, with the quads of its nested resources.
|
|
669
|
+
const emitField = (
|
|
670
|
+
field: Field,
|
|
671
|
+
subject: Term.Subject,
|
|
672
|
+
record: EncodedRecord,
|
|
673
|
+
graph: Term.Graph,
|
|
674
|
+
): Effect.Effect<ReadonlyArray<Term.Quad>, SchemaIssue.Issue> =>
|
|
675
|
+
Effect.gen(function* () {
|
|
676
|
+
const items: ReadonlyArray<unknown> = Option.match(read(record, field.name), {
|
|
677
|
+
onNone: () => [],
|
|
678
|
+
onSome: (v) => (field.cardinality !== 'one' && Arr.isArray(v) ? v : [v]),
|
|
679
|
+
});
|
|
680
|
+
const nested = nestedStruct(field.item);
|
|
681
|
+
const emitted = yield* Effect.forEach(
|
|
682
|
+
items,
|
|
683
|
+
(item, index): Effect.Effect<Emittable, SchemaIssue.Issue> => {
|
|
684
|
+
const at = field.cardinality === 'one' ? atField(field) : atField(field, index);
|
|
685
|
+
return Option.match(nested, {
|
|
686
|
+
onNone: () =>
|
|
687
|
+
Term.isObject(item)
|
|
688
|
+
? Effect.succeed([item, []])
|
|
689
|
+
: Effect.fail(at(unexpected('an RDF term'))),
|
|
690
|
+
onSome: (struct) =>
|
|
691
|
+
isEncodedRecord(item)
|
|
692
|
+
? Effect.mapBoth(emit(struct, Option.none(), item, graph), {
|
|
693
|
+
onFailure: at,
|
|
694
|
+
onSuccess: (out): Emittable => [out.subject, out.quads],
|
|
695
|
+
})
|
|
696
|
+
: Effect.fail(at(unexpected('a record'))),
|
|
697
|
+
});
|
|
698
|
+
},
|
|
699
|
+
{ concurrency: 1 },
|
|
700
|
+
);
|
|
701
|
+
const inner = Arr.flatMap(emitted, ([, quads]) => quads);
|
|
702
|
+
const terms = Arr.map(emitted, ([term]) => term);
|
|
703
|
+
if (field.cardinality === 'list' && Option.isSome(read(record, field.name))) {
|
|
704
|
+
const [head, links] = collection(terms, graph);
|
|
705
|
+
const link = yield* statement(field, subject, head, graph);
|
|
706
|
+
return [link, ...links, ...inner];
|
|
707
|
+
}
|
|
708
|
+
const links = yield* Effect.forEach(terms, (term) => statement(field, subject, term, graph), {
|
|
709
|
+
concurrency: 1,
|
|
710
|
+
});
|
|
711
|
+
return [...links, ...inner];
|
|
712
|
+
});
|
|
713
|
+
|
|
714
|
+
// The quads of an encoded record: its type, each mapped field's statements and nested resources.
|
|
715
|
+
const emit = (
|
|
716
|
+
struct: SchemaAST.Objects,
|
|
717
|
+
given: Option.Option<Term.Subject>,
|
|
718
|
+
record: EncodedRecord,
|
|
719
|
+
graph: Term.Graph,
|
|
720
|
+
): Effect.Effect<Emitted, SchemaIssue.Issue> =>
|
|
721
|
+
Effect.gen(function* () {
|
|
722
|
+
const id = describedId(struct);
|
|
723
|
+
const subject = Option.getOrElse(
|
|
724
|
+
Option.orElse(given, () =>
|
|
725
|
+
Option.filter(
|
|
726
|
+
Option.flatMap(id, (key) => read(record, key)),
|
|
727
|
+
(term): term is Term.Subject => Term.isSubject(term),
|
|
728
|
+
),
|
|
729
|
+
),
|
|
730
|
+
(): Term.Subject => Term.blankNode(),
|
|
731
|
+
);
|
|
732
|
+
const typed = Arr.map(
|
|
733
|
+
Arr.fromOption(describedType(struct)),
|
|
734
|
+
(type) => new Term.Quad(subject, rdf.type, type, graph),
|
|
735
|
+
);
|
|
736
|
+
const fields = Arr.filter(
|
|
737
|
+
Arr.getSomes(Arr.map(struct.propertySignatures, fieldOf)),
|
|
738
|
+
(field) => !Option.contains(id, field.name),
|
|
739
|
+
);
|
|
740
|
+
const quads = yield* Effect.forEach(
|
|
741
|
+
fields,
|
|
742
|
+
(field) => emitField(field, subject, record, graph),
|
|
743
|
+
{ concurrency: 1 },
|
|
744
|
+
);
|
|
745
|
+
return { subject, quads: [...typed, ...Arr.flatten(quads)] };
|
|
746
|
+
});
|
|
747
|
+
|
|
748
|
+
const encodeIssue = <S extends Schema.Constraint>(
|
|
749
|
+
schema: S,
|
|
750
|
+
subject: Option.Option<Term.Subject>,
|
|
751
|
+
value: S['Type'],
|
|
752
|
+
options: EncodeOptions,
|
|
753
|
+
parseOptions?: SchemaAST.ParseOptions,
|
|
754
|
+
): Effect.Effect<Emitted, SchemaIssue.Issue, S['EncodingServices']> =>
|
|
755
|
+
Effect.gen(function* () {
|
|
756
|
+
const struct = yield* expectStruct(schema.ast);
|
|
757
|
+
const record = yield* SchemaParser.encodeEffect(schema)(
|
|
758
|
+
value,
|
|
759
|
+
parseOptions ?? options.parseOptions,
|
|
760
|
+
);
|
|
761
|
+
return isEncodedRecord(record)
|
|
762
|
+
? yield* emit(struct, subject, record, options.graph ?? Term.defaultGraph)
|
|
763
|
+
: yield* Effect.fail(unexpected('a record'));
|
|
764
|
+
});
|
|
765
|
+
|
|
766
|
+
/**
|
|
767
|
+
* Encodes `value` as the resource `subject`: the struct's encoder turns each
|
|
768
|
+
* field into terms, written as `subject predicate term` quads (or
|
|
769
|
+
* `term predicate subject` for an `inverse` field), with an `rdf:type` quad
|
|
770
|
+
* for a described type, RDF collections for `list` fields and the quads of
|
|
771
|
+
* nested resources.
|
|
772
|
+
*
|
|
773
|
+
* @since 0.1.0
|
|
774
|
+
* @category encoding
|
|
775
|
+
*/
|
|
776
|
+
export const encode =
|
|
777
|
+
<S extends Schema.Constraint>(schema: S) =>
|
|
778
|
+
(
|
|
779
|
+
subject: Term.Subject,
|
|
780
|
+
value: S['Type'],
|
|
781
|
+
options?: EncodeOptions,
|
|
782
|
+
): Effect.Effect<ReadonlyArray<Term.Quad>, Schema.SchemaError, S['EncodingServices']> =>
|
|
783
|
+
Effect.mapBoth(encodeIssue(schema, Option.some(subject), value, options ?? {}), {
|
|
784
|
+
onFailure: toSchemaError,
|
|
785
|
+
onSuccess: (out) => out.quads,
|
|
786
|
+
});
|
|
787
|
+
|
|
788
|
+
// -----------------------------------------------------------------------------
|
|
789
|
+
// Schema form
|
|
790
|
+
// -----------------------------------------------------------------------------
|
|
791
|
+
|
|
792
|
+
/**
|
|
793
|
+
* A subject term: an IRI, blank node or triple term.
|
|
794
|
+
*
|
|
795
|
+
* @since 0.1.0
|
|
796
|
+
* @category schemas
|
|
797
|
+
*/
|
|
798
|
+
export const SubjectSchema: Schema.Union<
|
|
799
|
+
readonly [
|
|
800
|
+
Schema.declare<Term.NamedNode>,
|
|
801
|
+
Schema.declare<Term.BlankNode>,
|
|
802
|
+
Schema.declare<Term.Triple>,
|
|
803
|
+
]
|
|
804
|
+
> = Schema.Union([Term.NamedNodeSchema, Term.BlankNodeSchema, Term.TripleSchema]);
|
|
805
|
+
|
|
806
|
+
/**
|
|
807
|
+
* The type `SubjectSchema` decodes to: `Term.Subject`.
|
|
808
|
+
*
|
|
809
|
+
* @since 0.1.0
|
|
810
|
+
* @category schemas
|
|
811
|
+
*/
|
|
812
|
+
export type SubjectSchema = typeof SubjectSchema.Type;
|
|
813
|
+
|
|
814
|
+
/**
|
|
815
|
+
* The encoded side of `schema`: a dataset and the resource in it.
|
|
816
|
+
*
|
|
817
|
+
* @since 0.1.0
|
|
818
|
+
* @category schemas
|
|
819
|
+
*/
|
|
820
|
+
export const InputSchema: Schema.Struct<{
|
|
821
|
+
readonly dataset: Schema.declare<Dataset.Dataset>;
|
|
822
|
+
readonly subject: typeof SubjectSchema;
|
|
823
|
+
}> = Schema.Struct({ dataset: Dataset.DatasetSchema, subject: SubjectSchema });
|
|
824
|
+
|
|
825
|
+
/**
|
|
826
|
+
* The type `InputSchema` decodes to: `{ dataset, subject }`.
|
|
827
|
+
*
|
|
828
|
+
* @since 0.1.0
|
|
829
|
+
* @category schemas
|
|
830
|
+
*/
|
|
831
|
+
export type InputSchema = typeof InputSchema.Type;
|
|
832
|
+
|
|
833
|
+
/**
|
|
834
|
+
* The `Schema` form of `decode` / `encode`: decodes `{ dataset, subject }`
|
|
835
|
+
* to the struct's type, and encodes a value to the dataset of its quads with
|
|
836
|
+
* the resource as `subject` (its `describe`d id, or a fresh blank node). It
|
|
837
|
+
* composes with `Schema.decodeTo`, `Schema.decodeUnknownEffect` and the rest
|
|
838
|
+
* of the `Schema` API.
|
|
839
|
+
*
|
|
840
|
+
* @since 0.1.0
|
|
841
|
+
* @category schemas
|
|
842
|
+
*/
|
|
843
|
+
export const schema = <S extends Schema.Top>(
|
|
844
|
+
self: S,
|
|
845
|
+
options?: DecodeOptions & EncodeOptions,
|
|
846
|
+
): Schema.decodeTo<
|
|
847
|
+
Schema.toType<S>,
|
|
848
|
+
typeof InputSchema,
|
|
849
|
+
S['DecodingServices'],
|
|
850
|
+
S['EncodingServices']
|
|
851
|
+
> =>
|
|
852
|
+
InputSchema.pipe(
|
|
853
|
+
Schema.decodeTo(
|
|
854
|
+
Schema.toType(self),
|
|
855
|
+
SchemaTransformation.transformEffect<
|
|
856
|
+
S['Type'],
|
|
857
|
+
InputSchema,
|
|
858
|
+
S['DecodingServices'],
|
|
859
|
+
S['EncodingServices']
|
|
860
|
+
>({
|
|
861
|
+
decode: (input, parseOptions) =>
|
|
862
|
+
decodeIssue(self, input.dataset, input.subject, options ?? {}, parseOptions),
|
|
863
|
+
encode: (value, parseOptions) =>
|
|
864
|
+
Effect.map(
|
|
865
|
+
encodeIssue(self, Option.none(), value, options ?? {}, parseOptions),
|
|
866
|
+
(out): InputSchema => ({
|
|
867
|
+
dataset: Dataset.fromIterable(out.quads),
|
|
868
|
+
subject: out.subject,
|
|
869
|
+
}),
|
|
870
|
+
),
|
|
871
|
+
}),
|
|
872
|
+
),
|
|
873
|
+
);
|