@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,703 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The XMP data model (ISO 16684-1 §6) on top of an RDF `Dataset`: one
|
|
3
|
+
* resource described by properties whose values are simple values,
|
|
4
|
+
* structures or arrays (`rdf:Bag`, `rdf:Seq`, `rdf:Alt`), each of which may
|
|
5
|
+
* carry qualifiers.
|
|
6
|
+
*
|
|
7
|
+
* `fromDataset` reads the RDF an XMP packet parses to into this model and
|
|
8
|
+
* `toDataset` writes it back. Values are immutable; `set` and `remove`
|
|
9
|
+
* return a new `Metadata`. Properties, fields and qualifiers are
|
|
10
|
+
* `[iri, value]` entries. Their order carries no meaning in XMP, so
|
|
11
|
+
* `fromDataset` sorts them by IRI and the serializer writes them in entry
|
|
12
|
+
* order, making output deterministic.
|
|
13
|
+
*
|
|
14
|
+
* @since 0.1.0
|
|
15
|
+
*/
|
|
16
|
+
import * as Arr from 'effect/Array';
|
|
17
|
+
import * as Effect from 'effect/Effect';
|
|
18
|
+
import { dual } from 'effect/Function';
|
|
19
|
+
import * as HashSet from 'effect/HashSet';
|
|
20
|
+
import * as Option from 'effect/Option';
|
|
21
|
+
import * as Order from 'effect/Order';
|
|
22
|
+
import * as Predicate from 'effect/Predicate';
|
|
23
|
+
import * as Result from 'effect/Result';
|
|
24
|
+
import * as Schema from 'effect/Schema';
|
|
25
|
+
import * as Dataset from '../Dataset.ts';
|
|
26
|
+
import * as Term from '../Term.ts';
|
|
27
|
+
import { RDF } from './Namespaces.ts';
|
|
28
|
+
|
|
29
|
+
const RDF_VALUE = `${RDF}value`;
|
|
30
|
+
const RDF_TYPE = `${RDF}type`;
|
|
31
|
+
const MEMBER_RE = /^http:\/\/www\.w3\.org\/1999\/02\/22-rdf-syntax-ns#_([1-9][0-9]*)$/;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The `xml:lang` value of the default item of a language alternative.
|
|
35
|
+
*
|
|
36
|
+
* @since 0.1.0
|
|
37
|
+
* @category constants
|
|
38
|
+
*/
|
|
39
|
+
export const X_DEFAULT = 'x-default';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* A named value: a property, a structure field or a qualifier, keyed by its
|
|
43
|
+
* full IRI.
|
|
44
|
+
*
|
|
45
|
+
* @since 0.1.0
|
|
46
|
+
* @category models
|
|
47
|
+
*/
|
|
48
|
+
export type Entry = readonly [iri: string, value: Value];
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Named values, each IRI at most once.
|
|
52
|
+
*
|
|
53
|
+
* @since 0.1.0
|
|
54
|
+
* @category models
|
|
55
|
+
*/
|
|
56
|
+
export type Entries = ReadonlyArray<Entry>;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* A simple value: a text string, or a URI (written with `rdf:resource`).
|
|
60
|
+
*
|
|
61
|
+
* @since 0.1.0
|
|
62
|
+
* @category models
|
|
63
|
+
*/
|
|
64
|
+
export interface Simple {
|
|
65
|
+
readonly _tag: 'Simple';
|
|
66
|
+
readonly value: string;
|
|
67
|
+
/** Whether the value is a URI rather than text. */
|
|
68
|
+
readonly isUri: boolean;
|
|
69
|
+
/** The `xml:lang` qualifier of a text value. */
|
|
70
|
+
readonly language: Option.Option<string>;
|
|
71
|
+
/** The other qualifiers (`xml:lang` is `language`). */
|
|
72
|
+
readonly qualifiers: Entries;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* A structure: named fields, each keyed by its full IRI.
|
|
77
|
+
*
|
|
78
|
+
* @since 0.1.0
|
|
79
|
+
* @category models
|
|
80
|
+
*/
|
|
81
|
+
export interface Struct {
|
|
82
|
+
readonly _tag: 'Struct';
|
|
83
|
+
readonly fields: Entries;
|
|
84
|
+
readonly qualifiers: Entries;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The form of an array: unordered (`Bag`), ordered (`Seq`) or alternatives
|
|
89
|
+
* (`Alt`, of which the first is the default).
|
|
90
|
+
*
|
|
91
|
+
* @since 0.1.0
|
|
92
|
+
* @category models
|
|
93
|
+
*/
|
|
94
|
+
export type ArrayForm = 'Bag' | 'Seq' | 'Alt';
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* An array value (`rdf:Bag`, `rdf:Seq` or `rdf:Alt`).
|
|
98
|
+
*
|
|
99
|
+
* @since 0.1.0
|
|
100
|
+
* @category models
|
|
101
|
+
*/
|
|
102
|
+
export interface ArrayValue {
|
|
103
|
+
readonly _tag: 'Array';
|
|
104
|
+
readonly form: ArrayForm;
|
|
105
|
+
readonly items: ReadonlyArray<Value>;
|
|
106
|
+
readonly qualifiers: Entries;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* An XMP property or field value.
|
|
111
|
+
*
|
|
112
|
+
* @since 0.1.0
|
|
113
|
+
* @category models
|
|
114
|
+
*/
|
|
115
|
+
export type Value = Simple | Struct | ArrayValue;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* The metadata of one resource: the `rdf:about` value of its descriptions
|
|
119
|
+
* (usually `""`, the containing file) and its top-level properties.
|
|
120
|
+
*
|
|
121
|
+
* @since 0.1.0
|
|
122
|
+
* @category models
|
|
123
|
+
*/
|
|
124
|
+
export interface Metadata {
|
|
125
|
+
readonly about: string;
|
|
126
|
+
readonly properties: Entries;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* RDF that does not have the shape of the XMP data model: a cycle, a triple
|
|
131
|
+
* term, an array with non-member properties or a property given twice.
|
|
132
|
+
*
|
|
133
|
+
* @since 0.1.0
|
|
134
|
+
* @category errors
|
|
135
|
+
*/
|
|
136
|
+
export class XmpModelError extends Schema.TaggedError<XmpModelError>()('XmpModelError', {
|
|
137
|
+
message: Schema.String,
|
|
138
|
+
}) {}
|
|
139
|
+
|
|
140
|
+
// -----------------------------------------------------------------------------
|
|
141
|
+
// Guards and entries
|
|
142
|
+
// -----------------------------------------------------------------------------
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Whether a value is a simple value.
|
|
146
|
+
*
|
|
147
|
+
* @since 0.1.0
|
|
148
|
+
* @category guards
|
|
149
|
+
*/
|
|
150
|
+
export const isSimple = (value: Value): value is Simple => Predicate.isTagged(value, 'Simple');
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Whether a value is a structure.
|
|
154
|
+
*
|
|
155
|
+
* @since 0.1.0
|
|
156
|
+
* @category guards
|
|
157
|
+
*/
|
|
158
|
+
export const isStruct = (value: Value): value is Struct => Predicate.isTagged(value, 'Struct');
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Whether a value is an array.
|
|
162
|
+
*
|
|
163
|
+
* @since 0.1.0
|
|
164
|
+
* @category guards
|
|
165
|
+
*/
|
|
166
|
+
export const isArray = (value: Value): value is ArrayValue => Predicate.isTagged(value, 'Array');
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* The value of the entry with the given IRI.
|
|
170
|
+
*
|
|
171
|
+
* @since 0.1.0
|
|
172
|
+
* @category accessors
|
|
173
|
+
*/
|
|
174
|
+
export const lookup = (entries: Entries, iri: string): Option.Option<Value> =>
|
|
175
|
+
Option.map(
|
|
176
|
+
Arr.findFirst(entries, ([key]) => key === iri),
|
|
177
|
+
([, value]) => value,
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
/** Replaces the entry with the same IRI in place, or appends it. */
|
|
181
|
+
const upsert = (entries: Entries, entry: Entry): Entries =>
|
|
182
|
+
Arr.some(entries, ([key]) => key === entry[0])
|
|
183
|
+
? Arr.map(entries, (e) => (e[0] === entry[0] ? entry : e))
|
|
184
|
+
: [...entries, entry];
|
|
185
|
+
|
|
186
|
+
const entriesOf = (entries: Iterable<Entry>): Entries => Arr.reduce(entries, noEntries, upsert);
|
|
187
|
+
|
|
188
|
+
const noEntries: Entries = [];
|
|
189
|
+
|
|
190
|
+
// -----------------------------------------------------------------------------
|
|
191
|
+
// Constructors
|
|
192
|
+
// -----------------------------------------------------------------------------
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Metadata with no properties, about the containing file (`rdf:about=""`).
|
|
196
|
+
*
|
|
197
|
+
* @since 0.1.0
|
|
198
|
+
* @category constructors
|
|
199
|
+
*/
|
|
200
|
+
export const empty: Metadata = { about: '', properties: noEntries };
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Builds metadata from `[iri, value]` entries (a later entry replaces an
|
|
204
|
+
* earlier one with the same IRI).
|
|
205
|
+
*
|
|
206
|
+
* @since 0.1.0
|
|
207
|
+
* @category constructors
|
|
208
|
+
*/
|
|
209
|
+
export const make = (properties: Iterable<Entry>, about: string = ''): Metadata => ({
|
|
210
|
+
about,
|
|
211
|
+
properties: entriesOf(properties),
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* A text value, optionally with an `xml:lang` qualifier.
|
|
216
|
+
*
|
|
217
|
+
* @since 0.1.0
|
|
218
|
+
* @category constructors
|
|
219
|
+
*/
|
|
220
|
+
export const text = (value: string, language?: string): Simple => ({
|
|
221
|
+
_tag: 'Simple',
|
|
222
|
+
value,
|
|
223
|
+
isUri: false,
|
|
224
|
+
language: Option.fromNullishOr(language),
|
|
225
|
+
qualifiers: noEntries,
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* A URI value, written with `rdf:resource`.
|
|
230
|
+
*
|
|
231
|
+
* @since 0.1.0
|
|
232
|
+
* @category constructors
|
|
233
|
+
*/
|
|
234
|
+
export const uri = (value: string): Simple => ({
|
|
235
|
+
_tag: 'Simple',
|
|
236
|
+
value,
|
|
237
|
+
isUri: true,
|
|
238
|
+
language: Option.none(),
|
|
239
|
+
qualifiers: noEntries,
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* A structure from `[iri, value]` field entries.
|
|
244
|
+
*
|
|
245
|
+
* @since 0.1.0
|
|
246
|
+
* @category constructors
|
|
247
|
+
*/
|
|
248
|
+
export const struct = (fields: Iterable<Entry>): Struct => ({
|
|
249
|
+
_tag: 'Struct',
|
|
250
|
+
fields: entriesOf(fields),
|
|
251
|
+
qualifiers: noEntries,
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* An array of the given form.
|
|
256
|
+
*
|
|
257
|
+
* @since 0.1.0
|
|
258
|
+
* @category constructors
|
|
259
|
+
*/
|
|
260
|
+
export const array = (form: ArrayForm, items: Iterable<Value>): ArrayValue => ({
|
|
261
|
+
_tag: 'Array',
|
|
262
|
+
form,
|
|
263
|
+
items: Arr.fromIterable(items),
|
|
264
|
+
qualifiers: noEntries,
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* An unordered array (`rdf:Bag`) of text values.
|
|
269
|
+
*
|
|
270
|
+
* @since 0.1.0
|
|
271
|
+
* @category constructors
|
|
272
|
+
*/
|
|
273
|
+
export const bag = (items: Iterable<string>): ArrayValue =>
|
|
274
|
+
array(
|
|
275
|
+
'Bag',
|
|
276
|
+
Arr.map(Arr.fromIterable(items), (item) => text(item)),
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* An ordered array (`rdf:Seq`) of text values.
|
|
281
|
+
*
|
|
282
|
+
* @since 0.1.0
|
|
283
|
+
* @category constructors
|
|
284
|
+
*/
|
|
285
|
+
export const seq = (items: Iterable<string>): ArrayValue =>
|
|
286
|
+
array(
|
|
287
|
+
'Seq',
|
|
288
|
+
Arr.map(Arr.fromIterable(items), (item) => text(item)),
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
const isDefaultLanguage = ([language]: readonly [string, string]) => language === X_DEFAULT;
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* A language alternative: an `rdf:Alt` of text values each qualified by
|
|
295
|
+
* `xml:lang`, from `[language, text]` pairs. An `x-default` entry is moved
|
|
296
|
+
* first, as ISO 16684-1 requires.
|
|
297
|
+
*
|
|
298
|
+
* @since 0.1.0
|
|
299
|
+
* @category constructors
|
|
300
|
+
*/
|
|
301
|
+
export const languageAlternative = (entries: Iterable<readonly [string, string]>): ArrayValue => {
|
|
302
|
+
const all = Arr.fromIterable(entries);
|
|
303
|
+
return array(
|
|
304
|
+
'Alt',
|
|
305
|
+
Arr.map(
|
|
306
|
+
[
|
|
307
|
+
...Arr.filter(all, isDefaultLanguage),
|
|
308
|
+
...Arr.filter(all, (entry) => !isDefaultLanguage(entry)),
|
|
309
|
+
],
|
|
310
|
+
([language, value]) => text(value, language),
|
|
311
|
+
),
|
|
312
|
+
);
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Returns the value with the given qualifiers added (replacing qualifiers
|
|
317
|
+
* of the same IRI).
|
|
318
|
+
*
|
|
319
|
+
* @since 0.1.0
|
|
320
|
+
* @category combinators
|
|
321
|
+
*/
|
|
322
|
+
export const withQualifiers: {
|
|
323
|
+
(qualifiers: Iterable<Entry>): <V extends Value>(self: V) => V;
|
|
324
|
+
<V extends Value>(self: V, qualifiers: Iterable<Entry>): V;
|
|
325
|
+
} = dual(2, <V extends Value>(self: V, qualifiers: Iterable<Entry>): V => ({
|
|
326
|
+
...self,
|
|
327
|
+
qualifiers: Arr.reduce(qualifiers, self.qualifiers, upsert),
|
|
328
|
+
}));
|
|
329
|
+
|
|
330
|
+
// -----------------------------------------------------------------------------
|
|
331
|
+
// Access
|
|
332
|
+
// -----------------------------------------------------------------------------
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* The value of a top-level property.
|
|
336
|
+
*
|
|
337
|
+
* @since 0.1.0
|
|
338
|
+
* @category accessors
|
|
339
|
+
*/
|
|
340
|
+
export const get: {
|
|
341
|
+
(iri: string): (self: Metadata) => Option.Option<Value>;
|
|
342
|
+
(self: Metadata, iri: string): Option.Option<Value>;
|
|
343
|
+
} = dual(2, (self: Metadata, iri: string): Option.Option<Value> => lookup(self.properties, iri));
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Sets a top-level property, keeping its position if it was already set.
|
|
347
|
+
*
|
|
348
|
+
* @since 0.1.0
|
|
349
|
+
* @category combinators
|
|
350
|
+
*/
|
|
351
|
+
export const set: {
|
|
352
|
+
(iri: string, value: Value): (self: Metadata) => Metadata;
|
|
353
|
+
(self: Metadata, iri: string, value: Value): Metadata;
|
|
354
|
+
} = dual(3, (self: Metadata, iri: string, value: Value): Metadata => ({
|
|
355
|
+
about: self.about,
|
|
356
|
+
properties: upsert(self.properties, [iri, value]),
|
|
357
|
+
}));
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Removes a top-level property.
|
|
361
|
+
*
|
|
362
|
+
* @since 0.1.0
|
|
363
|
+
* @category combinators
|
|
364
|
+
*/
|
|
365
|
+
export const remove: {
|
|
366
|
+
(iri: string): (self: Metadata) => Metadata;
|
|
367
|
+
(self: Metadata, iri: string): Metadata;
|
|
368
|
+
} = dual(2, (self: Metadata, iri: string): Metadata => ({
|
|
369
|
+
about: self.about,
|
|
370
|
+
properties: Arr.filter(self.properties, ([key]) => key !== iri),
|
|
371
|
+
}));
|
|
372
|
+
|
|
373
|
+
const asSimple = Option.liftPredicate(isSimple);
|
|
374
|
+
|
|
375
|
+
const asArray = Option.liftPredicate(isArray);
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* The string of a simple (text or URI) value.
|
|
379
|
+
*
|
|
380
|
+
* @since 0.1.0
|
|
381
|
+
* @category accessors
|
|
382
|
+
*/
|
|
383
|
+
export const textOf = (value: Value): Option.Option<string> =>
|
|
384
|
+
Option.map(asSimple(value), (simple) => simple.value);
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* The strings of an array's simple items, in order; items that are not
|
|
388
|
+
* simple values are skipped.
|
|
389
|
+
*
|
|
390
|
+
* @since 0.1.0
|
|
391
|
+
* @category accessors
|
|
392
|
+
*/
|
|
393
|
+
export const itemsOf = (value: Value): Option.Option<ReadonlyArray<string>> =>
|
|
394
|
+
Option.map(asArray(value), (arr) => Arr.getSomes(Arr.map(arr.items, textOf)));
|
|
395
|
+
|
|
396
|
+
const hasLanguage = (language: string) => (item: Simple) =>
|
|
397
|
+
Option.exists(item.language, (l) => l.toLowerCase() === language.toLowerCase());
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Looks up a language alternative the way ISO 16684-1 §8.2.2.4 describes:
|
|
401
|
+
* the item whose `xml:lang` matches `language` (case-insensitively), else
|
|
402
|
+
* the `x-default` item, else the first item. A simple value is its own
|
|
403
|
+
* only alternative.
|
|
404
|
+
*
|
|
405
|
+
* @since 0.1.0
|
|
406
|
+
* @category accessors
|
|
407
|
+
*/
|
|
408
|
+
export const localizedOf = (value: Value, language: string = X_DEFAULT): Option.Option<string> => {
|
|
409
|
+
if (isSimple(value)) return Option.some(value.value);
|
|
410
|
+
if (!isArray(value)) return Option.none();
|
|
411
|
+
const items = Arr.getSomes(Arr.map(value.items, asSimple));
|
|
412
|
+
return Option.map(
|
|
413
|
+
Option.firstSomeOf([
|
|
414
|
+
Arr.findFirst(items, hasLanguage(language)),
|
|
415
|
+
Arr.findFirst(items, hasLanguage(X_DEFAULT)),
|
|
416
|
+
Arr.head(items),
|
|
417
|
+
]),
|
|
418
|
+
(item) => item.value,
|
|
419
|
+
);
|
|
420
|
+
};
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* The string of a simple top-level property.
|
|
424
|
+
*
|
|
425
|
+
* @since 0.1.0
|
|
426
|
+
* @category accessors
|
|
427
|
+
*/
|
|
428
|
+
export const getText: {
|
|
429
|
+
(iri: string): (self: Metadata) => Option.Option<string>;
|
|
430
|
+
(self: Metadata, iri: string): Option.Option<string>;
|
|
431
|
+
} = dual(2, (self: Metadata, iri: string): Option.Option<string> =>
|
|
432
|
+
Option.flatMap(get(self, iri), textOf),
|
|
433
|
+
);
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* The strings of an array-valued top-level property.
|
|
437
|
+
*
|
|
438
|
+
* @since 0.1.0
|
|
439
|
+
* @category accessors
|
|
440
|
+
*/
|
|
441
|
+
export const getItems: {
|
|
442
|
+
(iri: string): (self: Metadata) => Option.Option<ReadonlyArray<string>>;
|
|
443
|
+
(self: Metadata, iri: string): Option.Option<ReadonlyArray<string>>;
|
|
444
|
+
} = dual(2, (self: Metadata, iri: string): Option.Option<ReadonlyArray<string>> =>
|
|
445
|
+
Option.flatMap(get(self, iri), itemsOf),
|
|
446
|
+
);
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* A language-alternative top-level property in the given language (see
|
|
450
|
+
* `localizedOf`).
|
|
451
|
+
*
|
|
452
|
+
* @since 0.1.0
|
|
453
|
+
* @category accessors
|
|
454
|
+
*/
|
|
455
|
+
export const getLocalized = (
|
|
456
|
+
self: Metadata,
|
|
457
|
+
iri: string,
|
|
458
|
+
language: string = X_DEFAULT,
|
|
459
|
+
): Option.Option<string> => Option.flatMap(get(self, iri), (value) => localizedOf(value, language));
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Sets one language of a language-alternative top-level property, keeping
|
|
463
|
+
* its other languages. Setting `x-default` puts that item first.
|
|
464
|
+
*
|
|
465
|
+
* @since 0.1.0
|
|
466
|
+
* @category combinators
|
|
467
|
+
*/
|
|
468
|
+
export const setLocalized = (
|
|
469
|
+
self: Metadata,
|
|
470
|
+
iri: string,
|
|
471
|
+
value: string,
|
|
472
|
+
language: string = X_DEFAULT,
|
|
473
|
+
): Metadata => {
|
|
474
|
+
const existing = Option.match(Option.flatMap(get(self, iri), asArray), {
|
|
475
|
+
onNone: () => [],
|
|
476
|
+
onSome: (alt) => Arr.getSomes(Arr.map(alt.items, asSimple)),
|
|
477
|
+
});
|
|
478
|
+
const kept = Arr.map(
|
|
479
|
+
Arr.filter(existing, (item) => !hasLanguage(language)(item)),
|
|
480
|
+
(item) => [Option.getOrElse(item.language, () => X_DEFAULT), item.value] as const,
|
|
481
|
+
);
|
|
482
|
+
return set(self, iri, languageAlternative([...kept, [language, value]]));
|
|
483
|
+
};
|
|
484
|
+
|
|
485
|
+
// -----------------------------------------------------------------------------
|
|
486
|
+
// RDF ⇄ model
|
|
487
|
+
// -----------------------------------------------------------------------------
|
|
488
|
+
|
|
489
|
+
const memberIndex = (iri: string): Option.Option<number> =>
|
|
490
|
+
Option.map(Option.fromNullishOr(MEMBER_RE.exec(iri)), (m) => Number(m[1]));
|
|
491
|
+
|
|
492
|
+
const ARRAY_FORMS: ReadonlyArray<ArrayForm> = ['Bag', 'Seq', 'Alt'];
|
|
493
|
+
|
|
494
|
+
const arrayForm = (type: Term.Object): Option.Option<ArrayForm> =>
|
|
495
|
+
Term.isNamedNode(type)
|
|
496
|
+
? Arr.findFirst(ARRAY_FORMS, (form) => type.value === `${RDF}${form}`)
|
|
497
|
+
: Option.none();
|
|
498
|
+
|
|
499
|
+
const byMember = Order.mapInput(Order.Number, (entry: readonly [number, Term.Quad]) => entry[0]);
|
|
500
|
+
|
|
501
|
+
const byPredicate = Order.mapInput(Order.String, (q: Term.Quad) => q.predicate.value);
|
|
502
|
+
|
|
503
|
+
type Visiting = HashSet.HashSet<string>;
|
|
504
|
+
|
|
505
|
+
const isRdfValueQuad = (q: Term.Quad) => q.predicate.value === RDF_VALUE;
|
|
506
|
+
|
|
507
|
+
class ModelReader {
|
|
508
|
+
readonly dataset: Dataset.Dataset;
|
|
509
|
+
constructor(dataset: Dataset.Dataset) {
|
|
510
|
+
this.dataset = dataset;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
fail(message: string): never {
|
|
514
|
+
throw new XmpModelError({ message });
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
properties(subject: Term.Subject): ReadonlyArray<Term.Quad> {
|
|
518
|
+
return Dataset.match(this.dataset, { subject });
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/** Reads entries from quads, rejecting a property given twice. */
|
|
522
|
+
entries(quads: ReadonlyArray<Term.Quad>, visiting: Visiting): Entries {
|
|
523
|
+
const keys = Arr.map(quads, (q) => q.predicate.value);
|
|
524
|
+
Option.map(
|
|
525
|
+
Arr.findFirst(keys, (key, i) => keys.indexOf(key) !== i),
|
|
526
|
+
(key) => this.fail(`Property <${key}> is given more than once`),
|
|
527
|
+
);
|
|
528
|
+
return Arr.map(
|
|
529
|
+
Arr.sort(quads, byPredicate),
|
|
530
|
+
(q) => [q.predicate.value, this.value(q.object, visiting)] as const,
|
|
531
|
+
);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
value(object: Term.Object, visiting: Visiting): Value {
|
|
535
|
+
if (Term.isLiteral(object)) {
|
|
536
|
+
return text(object.value, object.language === '' ? undefined : object.language);
|
|
537
|
+
}
|
|
538
|
+
if (Term.isNamedNode(object)) return uri(object.value);
|
|
539
|
+
if (Term.isTriple(object)) return this.fail('XMP values cannot be triple terms');
|
|
540
|
+
if (HashSet.has(visiting, object.key)) {
|
|
541
|
+
return this.fail(`Blank node ${object.key} contains itself`);
|
|
542
|
+
}
|
|
543
|
+
return this.node(object, HashSet.add(visiting, object.key));
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
node(node: Term.BlankNode, visiting: Visiting): Value {
|
|
547
|
+
const quads = this.properties(node);
|
|
548
|
+
const value = Arr.findFirst(quads, isRdfValueQuad);
|
|
549
|
+
if (Option.isSome(value)) {
|
|
550
|
+
const others = Arr.filter(quads, (q) => !isRdfValueQuad(q));
|
|
551
|
+
return withQualifiers(
|
|
552
|
+
this.value(value.value.object, visiting),
|
|
553
|
+
this.entries(others, visiting),
|
|
554
|
+
);
|
|
555
|
+
}
|
|
556
|
+
const form = Option.flatMap(
|
|
557
|
+
Arr.findFirst(quads, (q) => q.predicate.value === RDF_TYPE),
|
|
558
|
+
(q) => arrayForm(q.object),
|
|
559
|
+
);
|
|
560
|
+
if (Option.isNone(form)) return struct(this.entries(quads, visiting));
|
|
561
|
+
const members = Arr.filterMap(quads, (q) =>
|
|
562
|
+
Option.match(memberIndex(q.predicate.value), {
|
|
563
|
+
onNone: () =>
|
|
564
|
+
q.predicate.value === RDF_TYPE
|
|
565
|
+
? Result.failVoid
|
|
566
|
+
: this.fail(`Array ${node.key} has the non-member property <${q.predicate.value}>`),
|
|
567
|
+
onSome: (i) => Result.succeed([i, q] as const),
|
|
568
|
+
}),
|
|
569
|
+
);
|
|
570
|
+
return array(
|
|
571
|
+
form.value,
|
|
572
|
+
Arr.map(Arr.sort(members, byMember), ([, q]) => this.value(q.object, visiting)),
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* Every top-level description: a subject that is an IRI or a blank node no
|
|
578
|
+
* other triple refers to. ISO 16684-1 §7.4 requires all of them to describe
|
|
579
|
+
* the same resource; readers accept differing or absent `rdf:about` values
|
|
580
|
+
* and merge them.
|
|
581
|
+
*/
|
|
582
|
+
metadata(): Metadata {
|
|
583
|
+
const referenced = HashSet.fromIterable(
|
|
584
|
+
Arr.map(Arr.filter(Dataset.objects(this.dataset), Term.isBlankNode), (o) => o.key),
|
|
585
|
+
);
|
|
586
|
+
const roots = Arr.filter(Dataset.subjects(this.dataset), (s) => {
|
|
587
|
+
if (Term.isTriple(s)) return this.fail('XMP descriptions cannot be about triple terms');
|
|
588
|
+
return Term.isNamedNode(s) || !HashSet.has(referenced, s.key);
|
|
589
|
+
});
|
|
590
|
+
const about = Option.getOrElse(
|
|
591
|
+
Arr.findFirst(roots, (s) =>
|
|
592
|
+
Term.isNamedNode(s) && s.value !== '' ? Option.some(s.value) : Option.none(),
|
|
593
|
+
),
|
|
594
|
+
() => '',
|
|
595
|
+
);
|
|
596
|
+
return make(
|
|
597
|
+
this.entries(
|
|
598
|
+
Arr.flatMap(roots, (s) => this.properties(s)),
|
|
599
|
+
HashSet.empty(),
|
|
600
|
+
),
|
|
601
|
+
about,
|
|
602
|
+
);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Reads the XMP data model from the RDF of an XMP packet, returning a
|
|
608
|
+
* `Result`. Typed literals keep only their lexical form (XMP has no
|
|
609
|
+
* datatypes); named graphs are ignored.
|
|
610
|
+
*
|
|
611
|
+
* @since 0.1.0
|
|
612
|
+
* @category conversions
|
|
613
|
+
*/
|
|
614
|
+
export const fromDatasetResult = (
|
|
615
|
+
dataset: Dataset.Dataset,
|
|
616
|
+
): Result.Result<Metadata, XmpModelError> =>
|
|
617
|
+
Result.try({
|
|
618
|
+
try: () => new ModelReader(dataset).metadata(),
|
|
619
|
+
catch: (e) => {
|
|
620
|
+
if (e instanceof XmpModelError) return e;
|
|
621
|
+
throw e;
|
|
622
|
+
},
|
|
623
|
+
});
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* Reads the XMP data model from the RDF of an XMP packet.
|
|
627
|
+
*
|
|
628
|
+
* @since 0.1.0
|
|
629
|
+
* @category conversions
|
|
630
|
+
*/
|
|
631
|
+
export const fromDataset = (dataset: Dataset.Dataset): Effect.Effect<Metadata, XmpModelError> =>
|
|
632
|
+
Effect.suspend(() => Effect.fromResult(fromDatasetResult(dataset)));
|
|
633
|
+
|
|
634
|
+
const rdf = (local: string) => new Term.NamedNode(`${RDF}${local}`);
|
|
635
|
+
|
|
636
|
+
const simpleTerm = (value: Simple): Term.Object =>
|
|
637
|
+
value.isUri
|
|
638
|
+
? new Term.NamedNode(value.value)
|
|
639
|
+
: Term.literal(value.value, Option.getOrUndefined(value.language));
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* The RDF of the XMP data model: the properties of one `rdf:about` subject,
|
|
643
|
+
* structures and arrays as blank nodes, and qualified values in the
|
|
644
|
+
* `rdf:value` form.
|
|
645
|
+
*
|
|
646
|
+
* @since 0.1.0
|
|
647
|
+
* @category conversions
|
|
648
|
+
*/
|
|
649
|
+
export const toDataset = (self: Metadata): Dataset.Dataset =>
|
|
650
|
+
Dataset.mutate(Dataset.empty, (builder) => {
|
|
651
|
+
const emit = (s: Term.Subject, p: string, o: Term.Object) => {
|
|
652
|
+
builder.add(new Term.Quad(s, new Term.NamedNode(p), o, Term.defaultGraph));
|
|
653
|
+
};
|
|
654
|
+
const emitAll = (s: Term.Subject, entries: Entries) => {
|
|
655
|
+
entries.forEach(([p, v]) => emit(s, p, term(v)));
|
|
656
|
+
};
|
|
657
|
+
const bare = (value: Value): Term.Object => {
|
|
658
|
+
if (isSimple(value)) return simpleTerm(value);
|
|
659
|
+
const node = Term.blankNode();
|
|
660
|
+
if (isStruct(value)) {
|
|
661
|
+
emitAll(node, value.fields);
|
|
662
|
+
} else {
|
|
663
|
+
emit(node, RDF_TYPE, rdf(value.form));
|
|
664
|
+
value.items.forEach((item, i) => emit(node, `${RDF}_${i + 1}`, term(item)));
|
|
665
|
+
}
|
|
666
|
+
return node;
|
|
667
|
+
};
|
|
668
|
+
const term = (value: Value): Term.Object => {
|
|
669
|
+
if (!Arr.isReadonlyArrayNonEmpty(value.qualifiers)) return bare(value);
|
|
670
|
+
const node = Term.blankNode();
|
|
671
|
+
emit(node, RDF_VALUE, bare(value));
|
|
672
|
+
emitAll(node, value.qualifiers);
|
|
673
|
+
return node;
|
|
674
|
+
};
|
|
675
|
+
emitAll(new Term.NamedNode(self.about), self.properties);
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
// -----------------------------------------------------------------------------
|
|
679
|
+
// Typed accessors
|
|
680
|
+
// -----------------------------------------------------------------------------
|
|
681
|
+
|
|
682
|
+
/**
|
|
683
|
+
* A typed setter of one property, data-first or data-last.
|
|
684
|
+
*
|
|
685
|
+
* @since 0.1.0
|
|
686
|
+
* @category models
|
|
687
|
+
*/
|
|
688
|
+
export interface Setter<A> {
|
|
689
|
+
(value: A): (self: Metadata) => Metadata;
|
|
690
|
+
(self: Metadata, value: A): Metadata;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
/**
|
|
694
|
+
* A typed setter of one language of a language-alternative property
|
|
695
|
+
* (`x-default` unless a language is given), data-first or data-last.
|
|
696
|
+
*
|
|
697
|
+
* @since 0.1.0
|
|
698
|
+
* @category models
|
|
699
|
+
*/
|
|
700
|
+
export interface LocalizedSetter {
|
|
701
|
+
(value: string, language?: string): (self: Metadata) => Metadata;
|
|
702
|
+
(self: Metadata, value: string, language?: string): Metadata;
|
|
703
|
+
}
|