@thomasfosterau/effect-rdf 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +2250 -1
- package/dist/Algebra-CGG4oae3.mjs +433 -0
- package/dist/Algebra-CGG4oae3.mjs.map +1 -0
- package/dist/Algebra-uGsIEOUA.d.mts +446 -0
- package/dist/Ast-CPRZmBvk.mjs +552 -0
- package/dist/Ast-CPRZmBvk.mjs.map +1 -0
- package/dist/Ast-vcw2W-lf.d.mts +827 -0
- package/dist/Bindings-Ck3m7JRC.mjs +249 -0
- package/dist/Bindings-Ck3m7JRC.mjs.map +1 -0
- package/dist/Bindings-DiKpBd7f.d.mts +153 -0
- package/dist/ClientErrors-CpXdFX5u.mjs +128 -0
- package/dist/ClientErrors-CpXdFX5u.mjs.map +1 -0
- package/dist/ClientErrors-D4IZHUM-.d.mts +101 -0
- package/dist/ClientFormats-CXomkXLV.mjs +73 -0
- package/dist/ClientFormats-CXomkXLV.mjs.map +1 -0
- package/dist/ClientFormats-Dm57ZPwR.d.mts +36 -0
- package/dist/Csv2Json-DynEcwCh.mjs +194 -0
- package/dist/Csv2Json-DynEcwCh.mjs.map +1 -0
- package/dist/Csv2Json-aXNVDoXQ.d.mts +40 -0
- package/dist/Csv2Rdf-8maXP6mt.d.mts +41 -0
- package/dist/Csv2Rdf-DuSEkaKE.mjs +161 -0
- package/dist/Csv2Rdf-DuSEkaKE.mjs.map +1 -0
- package/dist/Dataset-BlmlcI7J.mjs +782 -0
- package/dist/Dataset-BlmlcI7J.mjs.map +1 -0
- package/dist/Dataset-DS3ESOcO.d.mts +426 -0
- package/dist/Dataset.d.mts +2 -0
- package/dist/Dataset.mjs +1 -0
- package/dist/Datatype-CxMpamHC.d.mts +212 -0
- package/dist/Datatype-DQvkNkiH.mjs +1001 -0
- package/dist/Datatype-DQvkNkiH.mjs.map +1 -0
- package/dist/Dialect-8ChFj5EX.d.mts +113 -0
- package/dist/Dialect-CzVH38uo.mjs +165 -0
- package/dist/Dialect-CzVH38uo.mjs.map +1 -0
- package/dist/DocumentLoader-D3lZREnB.mjs +346 -0
- package/dist/DocumentLoader-D3lZREnB.mjs.map +1 -0
- package/dist/DocumentLoader-ZUCEVrW5.d.mts +178 -0
- package/dist/DublinCore-AnwqxRx6.mjs +137 -0
- package/dist/DublinCore-AnwqxRx6.mjs.map +1 -0
- package/dist/DublinCore-Dq-tVA5d.d.mts +119 -0
- package/dist/Engine-CYPB3g4h.d.mts +144 -0
- package/dist/Engine-DF8PN7g-.mjs +872 -0
- package/dist/Engine-DF8PN7g-.mjs.map +1 -0
- package/dist/Errors-CMdV1RhU.mjs +37 -0
- package/dist/Errors-CMdV1RhU.mjs.map +1 -0
- package/dist/Errors-u2bDjUeM.d.mts +30 -0
- package/dist/Evaluator-DEsU4d1o.d.mts +50 -0
- package/dist/Evaluator-DOY2-guC.mjs +281 -0
- package/dist/Evaluator-DOY2-guC.mjs.map +1 -0
- package/dist/Exif-CpqniYQd.d.mts +78 -0
- package/dist/Exif-DjkCfEB-.mjs +89 -0
- package/dist/Exif-DjkCfEB-.mjs.map +1 -0
- package/dist/Expression-BIMMvduQ.mjs +230 -0
- package/dist/Expression-BIMMvduQ.mjs.map +1 -0
- package/dist/Expression-W8A9cyX7.d.mts +89 -0
- package/dist/Extract-Bop85jES.mjs +220 -0
- package/dist/Extract-Bop85jES.mjs.map +1 -0
- package/dist/Extract-C_pCvuTC.d.mts +88 -0
- package/dist/Federation-BcNrozc1.d.mts +52 -0
- package/dist/Federation-CHScBkaK.mjs +130 -0
- package/dist/Federation-CHScBkaK.mjs.map +1 -0
- package/dist/Functions-AvjNcId_.mjs +1346 -0
- package/dist/Functions-AvjNcId_.mjs.map +1 -0
- package/dist/Functions-OQJZP-F6.d.mts +111 -0
- package/dist/Generator-C52mmq01.d.mts +50 -0
- package/dist/Generator-D3utCJC7.mjs +205 -0
- package/dist/Generator-D3utCJC7.mjs.map +1 -0
- package/dist/Grammar-CPlSxGH6.mjs +200 -0
- package/dist/Grammar-CPlSxGH6.mjs.map +1 -0
- package/dist/Grammar-CRhnRoCu.d.mts +148 -0
- package/dist/Grammar-D6jZdJQ3.d.mts +169 -0
- package/dist/Grammar-mQ8CgE1M.mjs +258 -0
- package/dist/Grammar-mQ8CgE1M.mjs.map +1 -0
- package/dist/GraphStore-DhUa4nFO.d.mts +45 -0
- package/dist/GraphStore-DvbqwKy1.mjs +212 -0
- package/dist/GraphStore-DvbqwKy1.mjs.map +1 -0
- package/dist/Iri-BB8Ks-BF.d.mts +84 -0
- package/dist/Iri-Cr92gsQV.mjs +232 -0
- package/dist/Iri-Cr92gsQV.mjs.map +1 -0
- package/dist/Iri.d.mts +2 -0
- package/dist/Iri.mjs +1 -0
- package/dist/Isomorphism-B6qTY-xy.d.mts +28 -0
- package/dist/Isomorphism-BmqxhKyJ.mjs +232 -0
- package/dist/Isomorphism-BmqxhKyJ.mjs.map +1 -0
- package/dist/Isomorphism-DInKnWIy.mjs +390 -0
- package/dist/Isomorphism-DInKnWIy.mjs.map +1 -0
- package/dist/Isomorphism-DvSfZXLR.d.mts +37 -0
- package/dist/Isomorphism.d.mts +2 -0
- package/dist/Isomorphism.mjs +1 -0
- package/dist/JsonLd-DOwS2FHg.mjs +2836 -0
- package/dist/JsonLd-DOwS2FHg.mjs.map +1 -0
- package/dist/JsonLd-DobFrQNa.d.mts +242 -0
- package/dist/JsonLdError-C9J-BxfG.mjs +106 -0
- package/dist/JsonLdError-C9J-BxfG.mjs.map +1 -0
- package/dist/JsonLdError-DSOfHkOy.d.mts +43 -0
- package/dist/LanguageTag-BCu8rcmX.d.mts +38 -0
- package/dist/LanguageTag-BcOpMGZ4.mjs +89 -0
- package/dist/LanguageTag-BcOpMGZ4.mjs.map +1 -0
- package/dist/LanguageTag.d.mts +2 -0
- package/dist/LanguageTag.mjs +1 -0
- package/dist/Lexical-Cg0JHrf6.mjs +243 -0
- package/dist/Lexical-Cg0JHrf6.mjs.map +1 -0
- package/dist/Lexical-D3zySYVS.d.mts +163 -0
- package/dist/Manifest-B6xf6mUc.mjs +148 -0
- package/dist/Manifest-B6xf6mUc.mjs.map +1 -0
- package/dist/Manifest-DQUMRBFr.d.mts +98 -0
- package/dist/Mapping-BgG74x3U.d.mts +63 -0
- package/dist/Mapping-Dc1ZGirk.mjs +259 -0
- package/dist/Mapping-Dc1ZGirk.mjs.map +1 -0
- package/dist/Mcp-1DwTTKOK.mjs +48 -0
- package/dist/Mcp-1DwTTKOK.mjs.map +1 -0
- package/dist/Mcp-d-pX9erx.d.mts +25 -0
- package/dist/Message-CK_DGQuu.mjs +95 -0
- package/dist/Message-CK_DGQuu.mjs.map +1 -0
- package/dist/Message-fIvTJSXM.d.mts +49 -0
- package/dist/Metadata-BbffwGDZ.mjs +445 -0
- package/dist/Metadata-BbffwGDZ.mjs.map +1 -0
- package/dist/Metadata-CEt3yc1-.d.mts +901 -0
- package/dist/Metadata-D4HsQNXr.mjs +1273 -0
- package/dist/Metadata-D4HsQNXr.mjs.map +1 -0
- package/dist/Metadata-nzS7QKRj.d.mts +350 -0
- package/dist/Model-DaMmxurZ.d.mts +293 -0
- package/dist/Model-DlPzRYhF.mjs +528 -0
- package/dist/Model-DlPzRYhF.mjs.map +1 -0
- package/dist/N3-BzyV-KIH.mjs +974 -0
- package/dist/N3-BzyV-KIH.mjs.map +1 -0
- package/dist/N3-DSLnonDn.d.mts +100 -0
- package/dist/NQuads-C1VBOJ3-.mjs +117 -0
- package/dist/NQuads-C1VBOJ3-.mjs.map +1 -0
- package/dist/NQuads-FjFZikFg.d.mts +76 -0
- package/dist/NTriples-D-kLSEAf.mjs +120 -0
- package/dist/NTriples-D-kLSEAf.mjs.map +1 -0
- package/dist/NTriples-D34OspfW.d.mts +76 -0
- package/dist/Namespace-ClTUO_ya.d.mts +42 -0
- package/dist/Namespace-DHFIsORd.mjs +75 -0
- package/dist/Namespace-DHFIsORd.mjs.map +1 -0
- package/dist/Namespace.d.mts +2 -0
- package/dist/Namespace.mjs +1 -0
- package/dist/Namespaces-Bz85vpjW.mjs +235 -0
- package/dist/Namespaces-Bz85vpjW.mjs.map +1 -0
- package/dist/Namespaces-C1jW6EDo.d.mts +178 -0
- package/dist/Optimizer-BWWQRQPY.mjs +168 -0
- package/dist/Optimizer-BWWQRQPY.mjs.map +1 -0
- package/dist/Optimizer-DUpUow6k.d.mts +26 -0
- package/dist/Options-BLBGL4HE.mjs +72 -0
- package/dist/Options-BLBGL4HE.mjs.map +1 -0
- package/dist/Options-BommQwP9.d.mts +127 -0
- package/dist/Packet-CA76wVX3.mjs +197 -0
- package/dist/Packet-CA76wVX3.mjs.map +1 -0
- package/dist/Packet-Cy5g6XuW.d.mts +130 -0
- package/dist/Parser-p1Gyr0QN.d.mts +85 -0
- package/dist/Parser-xARsOWXk.mjs +1317 -0
- package/dist/Parser-xARsOWXk.mjs.map +1 -0
- package/dist/Path-B20Yp8KE.mjs +284 -0
- package/dist/Path-B20Yp8KE.mjs.map +1 -0
- package/dist/Path-DRB8e-Zn.d.mts +181 -0
- package/dist/Pdf-B9RZn--8.d.mts +77 -0
- package/dist/Pdf-CKK6dkZn.mjs +89 -0
- package/dist/Pdf-CKK6dkZn.mjs.map +1 -0
- package/dist/PdfA-CUjSuntT.d.mts +109 -0
- package/dist/PdfA-CleOhuL6.mjs +124 -0
- package/dist/PdfA-CleOhuL6.mjs.map +1 -0
- package/dist/Photoshop-CiHo80qV.mjs +233 -0
- package/dist/Photoshop-CiHo80qV.mjs.map +1 -0
- package/dist/Photoshop-udKZ0I3N.d.mts +204 -0
- package/dist/PrefixMap-BHFPDLO-.mjs +103 -0
- package/dist/PrefixMap-BHFPDLO-.mjs.map +1 -0
- package/dist/PrefixMap-BMlXrWNd.d.mts +64 -0
- package/dist/PrefixMap.d.mts +2 -0
- package/dist/PrefixMap.mjs +1 -0
- package/dist/Processor-CMmecFsb.mjs +198 -0
- package/dist/Processor-CMmecFsb.mjs.map +1 -0
- package/dist/Processor-FJPvO0CB.d.mts +435 -0
- package/dist/Protocol-BA7OkNgp.mjs +202 -0
- package/dist/Protocol-BA7OkNgp.mjs.map +1 -0
- package/dist/Protocol-DlSoiIKB.d.mts +108 -0
- package/dist/ProtocolErrors-Ckfejnl6.d.mts +84 -0
- package/dist/ProtocolErrors-czDPVcX5.mjs +129 -0
- package/dist/ProtocolErrors-czDPVcX5.mjs.map +1 -0
- package/dist/Query-D9A6LOpP.mjs +364 -0
- package/dist/Query-D9A6LOpP.mjs.map +1 -0
- package/dist/Query-KqSkTYyG.d.mts +96 -0
- package/dist/QueryBuilder-BLK9Vfbz.mjs +674 -0
- package/dist/QueryBuilder-BLK9Vfbz.mjs.map +1 -0
- package/dist/QueryBuilder-DUqh4ECe.d.mts +529 -0
- package/dist/RdfJs-D6-49XB5.mjs +86 -0
- package/dist/RdfJs-D6-49XB5.mjs.map +1 -0
- package/dist/RdfJs-DXFqdWrd.d.mts +76 -0
- package/dist/RdfJs.d.mts +2 -0
- package/dist/RdfJs.mjs +1 -0
- package/dist/RdfJson-5aKPDlPS.d.mts +297 -0
- package/dist/RdfJson-BNocgW4f.mjs +548 -0
- package/dist/RdfJson-BNocgW4f.mjs.map +1 -0
- package/dist/RdfXml-DJ9G4gOq.mjs +1014 -0
- package/dist/RdfXml-DJ9G4gOq.mjs.map +1 -0
- package/dist/RdfXml-_N7yxWEp.d.mts +149 -0
- package/dist/Rdfs-BRVPsAjc.d.mts +84 -0
- package/dist/Rdfs-CyY2wVHI.mjs +167 -0
- package/dist/Rdfs-CyY2wVHI.mjs.map +1 -0
- package/dist/Rdfs.d.mts +2 -0
- package/dist/Rdfs.mjs +1 -0
- package/dist/Reasoner-BxYhx9s7.d.mts +94 -0
- package/dist/Reasoner-Cw90zrjv.mjs +798 -0
- package/dist/Reasoner-Cw90zrjv.mjs.map +1 -0
- package/dist/Reification-BmN4EfnM.d.mts +40 -0
- package/dist/Reification-dpqQvjDE.mjs +82 -0
- package/dist/Reification-dpqQvjDE.mjs.map +1 -0
- package/dist/Reification.d.mts +2 -0
- package/dist/Reification.mjs +1 -0
- package/dist/Report-XHs8htzK.mjs +121 -0
- package/dist/Report-XHs8htzK.mjs.map +1 -0
- package/dist/Report-hcXsc_19.d.mts +115 -0
- package/dist/Resource-B1cI8FyJ.d.mts +218 -0
- package/dist/Resource-sIEeNh15.mjs +374 -0
- package/dist/Resource-sIEeNh15.mjs.map +1 -0
- package/dist/Resource.d.mts +2 -0
- package/dist/Resource.mjs +1 -0
- package/dist/Results-BVNEC-Wt.d.mts +277 -0
- package/dist/Results-peJjGA2V.mjs +621 -0
- package/dist/Results-peJjGA2V.mjs.map +1 -0
- package/dist/ResultsStream-BhF0OcNn.mjs +639 -0
- package/dist/ResultsStream-BhF0OcNn.mjs.map +1 -0
- package/dist/ResultsStream-toYMXrOe.d.mts +100 -0
- package/dist/SemAct-CDchtk49.d.mts +96 -0
- package/dist/SemAct-CmyT4yI8.mjs +118 -0
- package/dist/SemAct-CmyT4yI8.mjs.map +1 -0
- package/dist/Serialization-DP9H5bYQ.mjs +514 -0
- package/dist/Serialization-DP9H5bYQ.mjs.map +1 -0
- package/dist/Serialization-Df8iVauT.d.mts +392 -0
- package/dist/Serialization.d.mts +2 -0
- package/dist/Serialization.mjs +1 -0
- package/dist/ServerFormats-CrRnjjf6.mjs +64 -0
- package/dist/ServerFormats-CrRnjjf6.mjs.map +1 -0
- package/dist/ServerFormats-DjC9NsO_.d.mts +36 -0
- package/dist/ServiceDescription-BERsvg-k.d.mts +54 -0
- package/dist/ServiceDescription-Dq5hxeGy.mjs +97 -0
- package/dist/ServiceDescription-Dq5hxeGy.mjs.map +1 -0
- package/dist/ShExC-Ctf-06CL.d.mts +67 -0
- package/dist/ShExC-DJbB19i3.mjs +1181 -0
- package/dist/ShExC-DJbB19i3.mjs.map +1 -0
- package/dist/ShExError-BeYFD9rv.d.mts +61 -0
- package/dist/ShExError-CVtq2NnM.mjs +64 -0
- package/dist/ShExError-CVtq2NnM.mjs.map +1 -0
- package/dist/ShExJ-C1u_wgyD.d.mts +531 -0
- package/dist/ShExJ-COiPd9Xw.mjs +532 -0
- package/dist/ShExJ-COiPd9Xw.mjs.map +1 -0
- package/dist/ShExR-ByR4mCh-.mjs +480 -0
- package/dist/ShExR-ByR4mCh-.mjs.map +1 -0
- package/dist/ShExR-CqONNNBz.d.mts +40 -0
- package/dist/ShapeMap-C422pxKl.d.mts +140 -0
- package/dist/ShapeMap-CsgKxB2G.mjs +181 -0
- package/dist/ShapeMap-CsgKxB2G.mjs.map +1 -0
- package/dist/Shapes-18GjfyBV.mjs +597 -0
- package/dist/Shapes-18GjfyBV.mjs.map +1 -0
- package/dist/Shapes-BQFDFc4Q.d.mts +306 -0
- package/dist/Sparql-BiYFMSpl.mjs +29 -0
- package/dist/Sparql-BiYFMSpl.mjs.map +1 -0
- package/dist/Sparql-DecpWTPh.d.mts +97 -0
- package/dist/SparqlClient-C_CjXbwj.mjs +333 -0
- package/dist/SparqlClient-C_CjXbwj.mjs.map +1 -0
- package/dist/SparqlClient-UPc88SHy.d.mts +290 -0
- package/dist/SparqlServer-CbUW-pVj.d.mts +71 -0
- package/dist/SparqlServer-Db7w7Cll.mjs +308 -0
- package/dist/SparqlServer-Db7w7Cll.mjs.map +1 -0
- package/dist/SqlStore-BBqFx-Wl.mjs +684 -0
- package/dist/SqlStore-BBqFx-Wl.mjs.map +1 -0
- package/dist/SqlStore-CCJo5I-e.d.mts +117 -0
- package/dist/Store-D0jmVfb3.d.mts +166 -0
- package/dist/Store-DH3Ow1GO.mjs +162 -0
- package/dist/Store-DH3Ow1GO.mjs.map +1 -0
- package/dist/Structure-BjMo4Bkc.mjs +334 -0
- package/dist/Structure-BjMo4Bkc.mjs.map +1 -0
- package/dist/Structure-n4CmDiab.d.mts +63 -0
- package/dist/Table-BGgm9nbM.mjs +538 -0
- package/dist/Table-BGgm9nbM.mjs.map +1 -0
- package/dist/Table-C3reiVrb.d.mts +261 -0
- package/dist/Term-B_4ezyXq.d.mts +619 -0
- package/dist/Term-CFLG1qu4.mjs +991 -0
- package/dist/Term-CFLG1qu4.mjs.map +1 -0
- package/dist/Term.d.mts +2 -0
- package/dist/Term.mjs +1 -0
- package/dist/TermCodec-CDZiEztW.mjs +397 -0
- package/dist/TermCodec-CDZiEztW.mjs.map +1 -0
- package/dist/TermCodec-_03bDXr0.d.mts +209 -0
- package/dist/TermCodec.d.mts +2 -0
- package/dist/TermCodec.mjs +1 -0
- package/dist/TermJson-BOPe0yve.d.mts +232 -0
- package/dist/TermJson-FAg3lvjl.mjs +142 -0
- package/dist/TermJson-FAg3lvjl.mjs.map +1 -0
- package/dist/TermJson.d.mts +2 -0
- package/dist/TermJson.mjs +1 -0
- package/dist/TermSchema-Bn9CoaYA.mjs +30 -0
- package/dist/TermSchema-Bn9CoaYA.mjs.map +1 -0
- package/dist/TermSchema-DBO6MroX.d.mts +6 -0
- package/dist/Testing-B-aPCpmu.mjs +63 -0
- package/dist/Testing-B-aPCpmu.mjs.map +1 -0
- package/dist/Testing-CF6s8P3O.d.mts +53 -0
- package/dist/Tiff-CR-2QeSI.d.mts +148 -0
- package/dist/Tiff-DlsOlZPM.mjs +169 -0
- package/dist/Tiff-DlsOlZPM.mjs.map +1 -0
- package/dist/Tools-7MdRKccr.d.mts +583 -0
- package/dist/Tools-ryxphZbI.mjs +329 -0
- package/dist/Tools-ryxphZbI.mjs.map +1 -0
- package/dist/Translate-B0YKKANS.d.mts +37 -0
- package/dist/Translate-gzWPq0Ia.mjs +308 -0
- package/dist/Translate-gzWPq0Ia.mjs.map +1 -0
- package/dist/Translation-DC9rLm2y.mjs +1535 -0
- package/dist/Translation-DC9rLm2y.mjs.map +1 -0
- package/dist/Translation-K4L9XBqX.d.mts +103 -0
- package/dist/TriG-BkqtqZ6Y.mjs +125 -0
- package/dist/TriG-BkqtqZ6Y.mjs.map +1 -0
- package/dist/TriG-xDjdDatp.d.mts +86 -0
- package/dist/Turtle-Bv1_bisW.d.mts +85 -0
- package/dist/Turtle-CZVUOtwl.mjs +133 -0
- package/dist/Turtle-CZVUOtwl.mjs.map +1 -0
- package/dist/ValidationReport-DBdJshW5.mjs +285 -0
- package/dist/ValidationReport-DBdJshW5.mjs.map +1 -0
- package/dist/ValidationReport-Dx3WxY0h.d.mts +192 -0
- package/dist/Validator-227ff9Rn.d.mts +179 -0
- package/dist/Validator-BzXMKDeJ.mjs +1162 -0
- package/dist/Validator-BzXMKDeJ.mjs.map +1 -0
- package/dist/Validator-Dl8cih5V.d.mts +207 -0
- package/dist/Validator-DmUfMbpL.mjs +568 -0
- package/dist/Validator-DmUfMbpL.mjs.map +1 -0
- package/dist/Vocab-DceKywpq.mjs +168 -0
- package/dist/Vocab-DceKywpq.mjs.map +1 -0
- package/dist/Vocab-Df-L-IwZ.d.mts +46 -0
- package/dist/Vocab-Do56UgBX.d.mts +81 -0
- package/dist/Vocab-TfpWG1Ne.mjs +118 -0
- package/dist/Vocab-TfpWG1Ne.mjs.map +1 -0
- package/dist/Vocab.d.mts +2 -0
- package/dist/Vocab.mjs +1 -0
- package/dist/Vocabulary-C6-GPOy4.d.mts +22 -0
- package/dist/Vocabulary-CnQl-_Z4.mjs +179 -0
- package/dist/Vocabulary-CnQl-_Z4.mjs.map +1 -0
- package/dist/Xml-B7iihYCS.mjs +976 -0
- package/dist/Xml-B7iihYCS.mjs.map +1 -0
- package/dist/Xml-CmfHS7SW.d.mts +267 -0
- package/dist/Xmp-D7CKA7MZ.d.mts +111 -0
- package/dist/Xmp-DCGN9pOD.mjs +307 -0
- package/dist/Xmp-DCGN9pOD.mjs.map +1 -0
- package/dist/XmpBasic-CP38jpR_.mjs +73 -0
- package/dist/XmpBasic-CP38jpR_.mjs.map +1 -0
- package/dist/XmpBasic-Cmbe53rQ.d.mts +64 -0
- package/dist/XmpMM-BfL_TgJF.mjs +73 -0
- package/dist/XmpMM-BfL_TgJF.mjs.map +1 -0
- package/dist/XmpMM-Dqm3IX8p.d.mts +63 -0
- package/dist/XmpRights-BKPtoI5L.mjs +73 -0
- package/dist/XmpRights-BKPtoI5L.mjs.map +1 -0
- package/dist/XmpRights-CaALZQz2.d.mts +63 -0
- package/dist/Xsd-Cdgx5zRB.mjs +405 -0
- package/dist/Xsd-Cdgx5zRB.mjs.map +1 -0
- package/dist/Xsd-D2elNhSm.d.mts +187 -0
- package/dist/Xsd.d.mts +2 -0
- package/dist/Xsd.mjs +1 -0
- package/dist/accessors-CEjaojuQ.mjs +28 -0
- package/dist/accessors-CEjaojuQ.mjs.map +1 -0
- package/dist/codec-Lb2T96rv.d.mts +20 -0
- package/dist/codec-QNo7IdJF.mjs +389 -0
- package/dist/codec-QNo7IdJF.mjs.map +1 -0
- package/dist/csvw/Csv2Json.d.mts +2 -0
- package/dist/csvw/Csv2Json.mjs +1 -0
- package/dist/csvw/Csv2Rdf.d.mts +2 -0
- package/dist/csvw/Csv2Rdf.mjs +1 -0
- package/dist/csvw/Datatype.d.mts +2 -0
- package/dist/csvw/Datatype.mjs +1 -0
- package/dist/csvw/Metadata.d.mts +2 -0
- package/dist/csvw/Metadata.mjs +1 -0
- package/dist/csvw/Processor.d.mts +2 -0
- package/dist/csvw/Processor.mjs +1 -0
- package/dist/csvw/Report.d.mts +2 -0
- package/dist/csvw/Report.mjs +1 -0
- package/dist/csvw/Table.d.mts +2 -0
- package/dist/csvw/Table.mjs +1 -0
- package/dist/csvw/index.d.mts +8 -0
- package/dist/csvw/index.mjs +8 -0
- package/dist/index-Cms2TYfC.d.mts +16 -0
- package/dist/index-Ct8xFmRs.d.mts +7 -0
- package/dist/index-D4QFwOjm.d.mts +28 -0
- package/dist/index.d.mts +18 -0
- package/dist/index.mjs +17 -0
- package/dist/jsonld/DocumentLoader.d.mts +2 -0
- package/dist/jsonld/DocumentLoader.mjs +1 -0
- package/dist/jsonld/JsonLd.d.mts +2 -0
- package/dist/jsonld/JsonLd.mjs +1 -0
- package/dist/jsonld/JsonLdError.d.mts +2 -0
- package/dist/jsonld/JsonLdError.mjs +1 -0
- package/dist/jsonld/index.d.mts +4 -0
- package/dist/jsonld/index.mjs +4 -0
- package/dist/lists-D-OpQ0Ir.mjs +77 -0
- package/dist/lists-D-OpQ0Ir.mjs.map +1 -0
- package/dist/loop-D5-gNx9K.mjs +21 -0
- package/dist/loop-D5-gNx9K.mjs.map +1 -0
- package/dist/loop-DZ2hXlr_.mjs +21 -0
- package/dist/loop-DZ2hXlr_.mjs.map +1 -0
- package/dist/n3/Isomorphism.d.mts +2 -0
- package/dist/n3/Isomorphism.mjs +1 -0
- package/dist/n3/Mapping.d.mts +2 -0
- package/dist/n3/Mapping.mjs +1 -0
- package/dist/n3/Model.d.mts +2 -0
- package/dist/n3/Model.mjs +1 -0
- package/dist/n3/N3.d.mts +2 -0
- package/dist/n3/N3.mjs +1 -0
- package/dist/n3/Reasoner.d.mts +2 -0
- package/dist/n3/Reasoner.mjs +2 -0
- package/dist/n3/Vocab.d.mts +2 -0
- package/dist/n3/Vocab.mjs +1 -0
- package/dist/n3/index.d.mts +7 -0
- package/dist/n3/index.mjs +7 -0
- package/dist/ntriples/Grammar.d.mts +2 -0
- package/dist/ntriples/Grammar.mjs +1 -0
- package/dist/ntriples/Lexical.d.mts +2 -0
- package/dist/ntriples/Lexical.mjs +1 -0
- package/dist/ntriples/NQuads.d.mts +2 -0
- package/dist/ntriples/NQuads.mjs +1 -0
- package/dist/ntriples/NTriples.d.mts +2 -0
- package/dist/ntriples/NTriples.mjs +1 -0
- package/dist/ntriples/index.d.mts +5 -0
- package/dist/ntriples/index.mjs +5 -0
- package/dist/rdfjson/RdfJson.d.mts +2 -0
- package/dist/rdfjson/RdfJson.mjs +1 -0
- package/dist/rdfjson/index.d.mts +2 -0
- package/dist/rdfjson/index.mjs +1 -0
- package/dist/rdfxml/RdfXml.d.mts +2 -0
- package/dist/rdfxml/RdfXml.mjs +1 -0
- package/dist/rdfxml/Xml.d.mts +2 -0
- package/dist/rdfxml/Xml.mjs +1 -0
- package/dist/rdfxml/index.d.mts +3 -0
- package/dist/rdfxml/index.mjs +3 -0
- package/dist/rolldown-runtime-D8jQpDG7.mjs +12 -0
- package/dist/serialize-96KBvKaf.mjs +1463 -0
- package/dist/serialize-96KBvKaf.mjs.map +1 -0
- package/dist/serialize-DsoXdM6n.d.mts +37 -0
- package/dist/shacl/Message.d.mts +2 -0
- package/dist/shacl/Message.mjs +1 -0
- package/dist/shacl/Path.d.mts +2 -0
- package/dist/shacl/Path.mjs +1 -0
- package/dist/shacl/Shapes.d.mts +2 -0
- package/dist/shacl/Shapes.mjs +1 -0
- package/dist/shacl/Sparql.d.mts +2 -0
- package/dist/shacl/Sparql.mjs +1 -0
- package/dist/shacl/ValidationReport.d.mts +2 -0
- package/dist/shacl/ValidationReport.mjs +1 -0
- package/dist/shacl/Validator.d.mts +2 -0
- package/dist/shacl/Validator.mjs +1 -0
- package/dist/shacl/Vocabulary.d.mts +2 -0
- package/dist/shacl/Vocabulary.mjs +1 -0
- package/dist/shacl/index.d.mts +9 -0
- package/dist/shacl/index.mjs +8 -0
- package/dist/shex/SemAct.d.mts +2 -0
- package/dist/shex/SemAct.mjs +1 -0
- package/dist/shex/ShExC.d.mts +2 -0
- package/dist/shex/ShExC.mjs +1 -0
- package/dist/shex/ShExError.d.mts +2 -0
- package/dist/shex/ShExError.mjs +1 -0
- package/dist/shex/ShExJ.d.mts +2 -0
- package/dist/shex/ShExJ.mjs +2 -0
- package/dist/shex/ShExR.d.mts +2 -0
- package/dist/shex/ShExR.mjs +1 -0
- package/dist/shex/ShapeMap.d.mts +2 -0
- package/dist/shex/ShapeMap.mjs +1 -0
- package/dist/shex/Structure.d.mts +2 -0
- package/dist/shex/Structure.mjs +2 -0
- package/dist/shex/Validator.d.mts +2 -0
- package/dist/shex/Validator.mjs +4 -0
- package/dist/shex/index.d.mts +9 -0
- package/dist/shex/index.mjs +9 -0
- package/dist/sparql/Algebra.d.mts +2 -0
- package/dist/sparql/Algebra.mjs +1 -0
- package/dist/sparql/Ast.d.mts +2 -0
- package/dist/sparql/Ast.mjs +1 -0
- package/dist/sparql/Bindings.d.mts +2 -0
- package/dist/sparql/Bindings.mjs +1 -0
- package/dist/sparql/ClientErrors.d.mts +2 -0
- package/dist/sparql/ClientErrors.mjs +1 -0
- package/dist/sparql/ClientFormats.d.mts +2 -0
- package/dist/sparql/ClientFormats.mjs +1 -0
- package/dist/sparql/Engine.d.mts +2 -0
- package/dist/sparql/Engine.mjs +1 -0
- package/dist/sparql/Errors.d.mts +2 -0
- package/dist/sparql/Errors.mjs +1 -0
- package/dist/sparql/Expression.d.mts +2 -0
- package/dist/sparql/Expression.mjs +1 -0
- package/dist/sparql/Federation.d.mts +2 -0
- package/dist/sparql/Federation.mjs +1 -0
- package/dist/sparql/Functions.d.mts +2 -0
- package/dist/sparql/Functions.mjs +1 -0
- package/dist/sparql/Generator.d.mts +2 -0
- package/dist/sparql/Generator.mjs +1 -0
- package/dist/sparql/GraphStore.d.mts +2 -0
- package/dist/sparql/GraphStore.mjs +1 -0
- package/dist/sparql/Optimizer.d.mts +2 -0
- package/dist/sparql/Optimizer.mjs +1 -0
- package/dist/sparql/Options.d.mts +2 -0
- package/dist/sparql/Options.mjs +1 -0
- package/dist/sparql/Parser.d.mts +2 -0
- package/dist/sparql/Parser.mjs +1 -0
- package/dist/sparql/Protocol.d.mts +2 -0
- package/dist/sparql/Protocol.mjs +1 -0
- package/dist/sparql/ProtocolErrors.d.mts +2 -0
- package/dist/sparql/ProtocolErrors.mjs +1 -0
- package/dist/sparql/QueryBuilder.d.mts +2 -0
- package/dist/sparql/QueryBuilder.mjs +1 -0
- package/dist/sparql/Results.d.mts +2 -0
- package/dist/sparql/Results.mjs +1 -0
- package/dist/sparql/ResultsStream.d.mts +2 -0
- package/dist/sparql/ResultsStream.mjs +1 -0
- package/dist/sparql/ServerFormats.d.mts +2 -0
- package/dist/sparql/ServerFormats.mjs +1 -0
- package/dist/sparql/ServiceDescription.d.mts +2 -0
- package/dist/sparql/ServiceDescription.mjs +1 -0
- package/dist/sparql/SparqlClient.d.mts +2 -0
- package/dist/sparql/SparqlClient.mjs +1 -0
- package/dist/sparql/SparqlServer.d.mts +2 -0
- package/dist/sparql/SparqlServer.mjs +1 -0
- package/dist/sparql/Store.d.mts +2 -0
- package/dist/sparql/Store.mjs +1 -0
- package/dist/sparql/TermSchema.d.mts +3 -0
- package/dist/sparql/TermSchema.mjs +2 -0
- package/dist/sparql/Testing.d.mts +2 -0
- package/dist/sparql/Testing.mjs +1 -0
- package/dist/sparql/Translate.d.mts +2 -0
- package/dist/sparql/Translate.mjs +1 -0
- package/dist/sparql/ai/Mcp.d.mts +2 -0
- package/dist/sparql/ai/Mcp.mjs +1 -0
- package/dist/sparql/ai/Tools.d.mts +2 -0
- package/dist/sparql/ai/Tools.mjs +1 -0
- package/dist/sparql/ai/index.d.mts +3 -0
- package/dist/sparql/ai/index.mjs +3 -0
- package/dist/sparql/index.d.mts +30 -0
- package/dist/sparql/index.mjs +29 -0
- package/dist/sparql/shacl/Evaluator.d.mts +2 -0
- package/dist/sparql/shacl/Evaluator.mjs +1 -0
- package/dist/sparql/shacl/Query.d.mts +2 -0
- package/dist/sparql/shacl/Query.mjs +1 -0
- package/dist/sparql/shacl/index.d.mts +3 -0
- package/dist/sparql/shacl/index.mjs +3 -0
- package/dist/sparql/sql/Dialect.d.mts +2 -0
- package/dist/sparql/sql/Dialect.mjs +1 -0
- package/dist/sparql/sql/SqlStore.d.mts +2 -0
- package/dist/sparql/sql/SqlStore.mjs +1 -0
- package/dist/sparql/sql/Translation.d.mts +2 -0
- package/dist/sparql/sql/Translation.mjs +1 -0
- package/dist/sparql/sql/index.d.mts +4 -0
- package/dist/sparql/sql/index.mjs +4 -0
- package/dist/stringMap-D5YIpYtR.mjs +38 -0
- package/dist/stringMap-D5YIpYtR.mjs.map +1 -0
- package/dist/tokens-C6BzeodQ.mjs +24 -0
- package/dist/tokens-C6BzeodQ.mjs.map +1 -0
- package/dist/turtle/Grammar.d.mts +3 -0
- package/dist/turtle/Grammar.mjs +3 -0
- package/dist/turtle/Manifest.d.mts +2 -0
- package/dist/turtle/Manifest.mjs +1 -0
- package/dist/turtle/TriG.d.mts +2 -0
- package/dist/turtle/TriG.mjs +1 -0
- package/dist/turtle/Turtle.d.mts +2 -0
- package/dist/turtle/Turtle.mjs +1 -0
- package/dist/turtle/index.d.mts +5 -0
- package/dist/turtle/index.mjs +5 -0
- package/dist/xmp/DublinCore.d.mts +2 -0
- package/dist/xmp/DublinCore.mjs +1 -0
- package/dist/xmp/Exif.d.mts +2 -0
- package/dist/xmp/Exif.mjs +1 -0
- package/dist/xmp/Extract.d.mts +2 -0
- package/dist/xmp/Extract.mjs +1 -0
- package/dist/xmp/Metadata.d.mts +2 -0
- package/dist/xmp/Metadata.mjs +1 -0
- package/dist/xmp/Namespaces.d.mts +2 -0
- package/dist/xmp/Namespaces.mjs +1 -0
- package/dist/xmp/Packet.d.mts +2 -0
- package/dist/xmp/Packet.mjs +1 -0
- package/dist/xmp/Pdf.d.mts +2 -0
- package/dist/xmp/Pdf.mjs +1 -0
- package/dist/xmp/PdfA.d.mts +2 -0
- package/dist/xmp/PdfA.mjs +1 -0
- package/dist/xmp/Photoshop.d.mts +2 -0
- package/dist/xmp/Photoshop.mjs +1 -0
- package/dist/xmp/Tiff.d.mts +2 -0
- package/dist/xmp/Tiff.mjs +1 -0
- package/dist/xmp/Xmp.d.mts +2 -0
- package/dist/xmp/Xmp.mjs +3 -0
- package/dist/xmp/XmpBasic.d.mts +2 -0
- package/dist/xmp/XmpBasic.mjs +1 -0
- package/dist/xmp/XmpMM.d.mts +2 -0
- package/dist/xmp/XmpMM.mjs +1 -0
- package/dist/xmp/XmpRights.d.mts +2 -0
- package/dist/xmp/XmpRights.mjs +1 -0
- package/dist/xmp/index.d.mts +15 -0
- package/dist/xmp/index.mjs +15 -0
- package/package.json +187 -3
- package/src/Dataset.ts +1085 -0
- package/src/Iri.ts +322 -0
- package/src/Isomorphism.ts +319 -0
- package/src/LanguageTag.ts +98 -0
- package/src/Namespace.ts +100 -0
- package/src/PrefixMap.ts +117 -0
- package/src/RdfJs.ts +146 -0
- package/src/Rdfs.ts +241 -0
- package/src/Reification.ts +103 -0
- package/src/Resource.ts +873 -0
- package/src/Serialization.ts +775 -0
- package/src/Term.ts +1300 -0
- package/src/TermCodec.ts +505 -0
- package/src/TermJson.ts +313 -0
- package/src/Vocab.ts +161 -0
- package/src/Xsd.ts +573 -0
- package/src/csvw/Csv2Json.ts +265 -0
- package/src/csvw/Csv2Rdf.ts +268 -0
- package/src/csvw/Datatype.ts +589 -0
- package/src/csvw/Metadata.ts +1523 -0
- package/src/csvw/Processor.ts +276 -0
- package/src/csvw/Report.ts +135 -0
- package/src/csvw/Table.ts +759 -0
- package/src/csvw/index.ts +22 -0
- package/src/csvw/internal/dateFormat.ts +202 -0
- package/src/csvw/internal/json.ts +104 -0
- package/src/csvw/internal/numberFormat.ts +369 -0
- package/src/csvw/internal/object.ts +23 -0
- package/src/csvw/internal/uriTemplate.ts +130 -0
- package/src/csvw/internal/url.ts +93 -0
- package/src/csvw/internal/vocab.ts +282 -0
- package/src/index.ts +40 -0
- package/src/internal/arbitrary.ts +148 -0
- package/src/internal/loop.ts +24 -0
- package/src/internal/pending.ts +20 -0
- package/src/internal/textDecoder.ts +183 -0
- package/src/jsonld/DocumentLoader.ts +512 -0
- package/src/jsonld/JsonLd.ts +847 -0
- package/src/jsonld/JsonLdError.ts +105 -0
- package/src/jsonld/index.ts +13 -0
- package/src/jsonld/internal/compact.ts +852 -0
- package/src/jsonld/internal/context.ts +781 -0
- package/src/jsonld/internal/expand.ts +614 -0
- package/src/jsonld/internal/flatten.ts +243 -0
- package/src/jsonld/internal/frame.ts +559 -0
- package/src/jsonld/internal/iri.ts +52 -0
- package/src/jsonld/internal/json.ts +19 -0
- package/src/jsonld/internal/linkHeader.ts +60 -0
- package/src/jsonld/internal/rdf.ts +481 -0
- package/src/jsonld/internal/util.ts +367 -0
- package/src/n3/Isomorphism.ts +476 -0
- package/src/n3/Mapping.ts +332 -0
- package/src/n3/Model.ts +696 -0
- package/src/n3/N3.ts +237 -0
- package/src/n3/Reasoner.ts +568 -0
- package/src/n3/Vocab.ts +111 -0
- package/src/n3/index.ts +21 -0
- package/src/n3/internal/builtins.ts +668 -0
- package/src/n3/internal/guards.ts +23 -0
- package/src/n3/internal/lists.ts +106 -0
- package/src/n3/internal/loop.ts +28 -0
- package/src/n3/internal/parser.ts +1032 -0
- package/src/n3/internal/writer.ts +344 -0
- package/src/ntriples/Grammar.ts +317 -0
- package/src/ntriples/Lexical.ts +321 -0
- package/src/ntriples/NQuads.ts +140 -0
- package/src/ntriples/NTriples.ts +143 -0
- package/src/ntriples/index.ts +14 -0
- package/src/ntriples/internal/codec.ts +229 -0
- package/src/ntriples/internal/lineParser.ts +326 -0
- package/src/ntriples/internal/loop.ts +14 -0
- package/src/rdfjson/RdfJson.ts +806 -0
- package/src/rdfjson/index.ts +9 -0
- package/src/rdfjson/internal/json.ts +19 -0
- package/src/rdfxml/RdfXml.ts +1408 -0
- package/src/rdfxml/Xml.ts +419 -0
- package/src/rdfxml/index.ts +11 -0
- package/src/rdfxml/internal/chars.ts +73 -0
- package/src/rdfxml/internal/loop.ts +24 -0
- package/src/rdfxml/internal/parser.ts +1265 -0
- package/src/shacl/Message.ts +102 -0
- package/src/shacl/Path.ts +483 -0
- package/src/shacl/Shapes.ts +913 -0
- package/src/shacl/Sparql.ts +128 -0
- package/src/shacl/ValidationReport.ts +438 -0
- package/src/shacl/Validator.ts +1156 -0
- package/src/shacl/Vocabulary.ts +180 -0
- package/src/shacl/index.ts +22 -0
- package/src/shacl/internal/compare.ts +128 -0
- package/src/shacl/internal/regex.ts +56 -0
- package/src/shex/SemAct.ts +197 -0
- package/src/shex/ShExC.ts +415 -0
- package/src/shex/ShExError.ts +71 -0
- package/src/shex/ShExJ.ts +893 -0
- package/src/shex/ShExR.ts +640 -0
- package/src/shex/ShapeMap.ts +385 -0
- package/src/shex/Structure.ts +467 -0
- package/src/shex/Validator.ts +395 -0
- package/src/shex/index.ts +24 -0
- package/src/shex/internal/engine.ts +682 -0
- package/src/shex/internal/iterate.ts +14 -0
- package/src/shex/internal/json.ts +12 -0
- package/src/shex/internal/lexer.ts +56 -0
- package/src/shex/internal/nodeConstraint.ts +368 -0
- package/src/shex/internal/shexcLexer.ts +387 -0
- package/src/shex/internal/shexcParser.ts +1312 -0
- package/src/shex/internal/tokens.ts +41 -0
- package/src/shex/internal/xpathRegex.ts +290 -0
- package/src/sparql/Algebra.ts +914 -0
- package/src/sparql/Ast.ts +1344 -0
- package/src/sparql/Bindings.ts +272 -0
- package/src/sparql/ClientErrors.ts +156 -0
- package/src/sparql/ClientFormats.ts +70 -0
- package/src/sparql/Engine.ts +699 -0
- package/src/sparql/Errors.ts +30 -0
- package/src/sparql/Expression.ts +360 -0
- package/src/sparql/Federation.ts +187 -0
- package/src/sparql/Functions.ts +689 -0
- package/src/sparql/Generator.ts +426 -0
- package/src/sparql/GraphStore.ts +341 -0
- package/src/sparql/Optimizer.ts +230 -0
- package/src/sparql/Options.ts +191 -0
- package/src/sparql/Parser.ts +173 -0
- package/src/sparql/Protocol.ts +342 -0
- package/src/sparql/ProtocolErrors.ts +113 -0
- package/src/sparql/QueryBuilder.ts +953 -0
- package/src/sparql/Results.ts +844 -0
- package/src/sparql/ResultsStream.ts +771 -0
- package/src/sparql/ServerFormats.ts +75 -0
- package/src/sparql/ServiceDescription.ts +130 -0
- package/src/sparql/SparqlClient.ts +947 -0
- package/src/sparql/SparqlServer.ts +528 -0
- package/src/sparql/Store.ts +311 -0
- package/src/sparql/TermSchema.ts +20 -0
- package/src/sparql/Testing.ts +114 -0
- package/src/sparql/Translate.ts +407 -0
- package/src/sparql/ai/Mcp.ts +43 -0
- package/src/sparql/ai/Tools.ts +481 -0
- package/src/sparql/ai/index.ts +11 -0
- package/src/sparql/index.ts +64 -0
- package/src/sparql/internal/evaluator.ts +947 -0
- package/src/sparql/internal/hash.ts +418 -0
- package/src/sparql/internal/json.ts +12 -0
- package/src/sparql/internal/lexer.ts +488 -0
- package/src/sparql/internal/loop.ts +24 -0
- package/src/sparql/internal/parser.ts +2215 -0
- package/src/sparql/internal/prefetch.ts +46 -0
- package/src/sparql/internal/stringMap.ts +39 -0
- package/src/sparql/internal/textResults.ts +226 -0
- package/src/sparql/internal/values.ts +550 -0
- package/src/sparql/shacl/Evaluator.ts +478 -0
- package/src/sparql/shacl/Query.ts +574 -0
- package/src/sparql/shacl/index.ts +12 -0
- package/src/sparql/sql/Dialect.ts +246 -0
- package/src/sparql/sql/SqlStore.ts +1080 -0
- package/src/sparql/sql/Translation.ts +1898 -0
- package/src/sparql/sql/index.ts +17 -0
- package/src/sparql/sql/internal/encoding.ts +313 -0
- package/src/turtle/Grammar.ts +286 -0
- package/src/turtle/Manifest.ts +215 -0
- package/src/turtle/TriG.ts +158 -0
- package/src/turtle/Turtle.ts +166 -0
- package/src/turtle/index.ts +14 -0
- package/src/turtle/internal/loop.ts +23 -0
- package/src/turtle/internal/parse.ts +112 -0
- package/src/turtle/internal/parser.ts +1303 -0
- package/src/turtle/internal/serialize.ts +79 -0
- package/src/turtle/internal/streamWriter.ts +128 -0
- package/src/turtle/internal/writer.ts +898 -0
- package/src/xmp/DublinCore.ts +147 -0
- package/src/xmp/Exif.ts +109 -0
- package/src/xmp/Extract.ts +351 -0
- package/src/xmp/Metadata.ts +703 -0
- package/src/xmp/Namespaces.ts +228 -0
- package/src/xmp/Packet.ts +297 -0
- package/src/xmp/Pdf.ts +99 -0
- package/src/xmp/PdfA.ts +280 -0
- package/src/xmp/Photoshop.ts +275 -0
- package/src/xmp/Tiff.ts +196 -0
- package/src/xmp/Xmp.ts +430 -0
- package/src/xmp/XmpBasic.ts +90 -0
- package/src/xmp/XmpMM.ts +82 -0
- package/src/xmp/XmpRights.ts +83 -0
- package/src/xmp/index.ts +36 -0
- package/src/xmp/internal/accessors.ts +72 -0
- package/src/xmp/internal/xml.ts +63 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed accessors for the Dublin Core schema (`dc:`, ISO 16684-1 §8.3).
|
|
3
|
+
*
|
|
4
|
+
* @since 0.1.0
|
|
5
|
+
*/
|
|
6
|
+
import type * as Option from 'effect/Option';
|
|
7
|
+
import * as Accessors from './internal/accessors.ts';
|
|
8
|
+
import type * as Metadata from './Metadata.ts';
|
|
9
|
+
import { DC } from './Namespaces.ts';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The title (`dc:title`), a language alternative. Reads the item in `language` (default `x-default`).
|
|
13
|
+
*
|
|
14
|
+
* @since 0.1.0
|
|
15
|
+
* @category getters
|
|
16
|
+
*/
|
|
17
|
+
export const title: (self: Metadata.Metadata, language?: string) => Option.Option<string> =
|
|
18
|
+
Accessors.localized(`${DC}title`);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Sets one language of the title (`dc:title`), a language alternative.
|
|
22
|
+
*
|
|
23
|
+
* @since 0.1.0
|
|
24
|
+
* @category setters
|
|
25
|
+
*/
|
|
26
|
+
export const setTitle: Metadata.LocalizedSetter = Accessors.setLocalized(`${DC}title`);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The creators (`dc:creator`), an ordered array: the document's authors.
|
|
30
|
+
*
|
|
31
|
+
* @since 0.1.0
|
|
32
|
+
* @category getters
|
|
33
|
+
*/
|
|
34
|
+
export const creator: (self: Metadata.Metadata) => Option.Option<ReadonlyArray<string>> =
|
|
35
|
+
Accessors.items(`${DC}creator`);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Sets the creators (`dc:creator`), an ordered array: the document's authors.
|
|
39
|
+
*
|
|
40
|
+
* @since 0.1.0
|
|
41
|
+
* @category setters
|
|
42
|
+
*/
|
|
43
|
+
export const setCreator: Metadata.Setter<Iterable<string>> = Accessors.setSeq(`${DC}creator`);
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The description (`dc:description`), a language alternative. Reads the item in `language` (default `x-default`).
|
|
47
|
+
*
|
|
48
|
+
* @since 0.1.0
|
|
49
|
+
* @category getters
|
|
50
|
+
*/
|
|
51
|
+
export const description: (self: Metadata.Metadata, language?: string) => Option.Option<string> =
|
|
52
|
+
Accessors.localized(`${DC}description`);
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Sets one language of the description (`dc:description`), a language alternative.
|
|
56
|
+
*
|
|
57
|
+
* @since 0.1.0
|
|
58
|
+
* @category setters
|
|
59
|
+
*/
|
|
60
|
+
export const setDescription: Metadata.LocalizedSetter = Accessors.setLocalized(`${DC}description`);
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The subjects (`dc:subject`), an unordered array of keywords.
|
|
64
|
+
*
|
|
65
|
+
* @since 0.1.0
|
|
66
|
+
* @category getters
|
|
67
|
+
*/
|
|
68
|
+
export const subject: (self: Metadata.Metadata) => Option.Option<ReadonlyArray<string>> =
|
|
69
|
+
Accessors.items(`${DC}subject`);
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Sets the subjects (`dc:subject`), an unordered array of keywords.
|
|
73
|
+
*
|
|
74
|
+
* @since 0.1.0
|
|
75
|
+
* @category setters
|
|
76
|
+
*/
|
|
77
|
+
export const setSubject: Metadata.Setter<Iterable<string>> = Accessors.setBag(`${DC}subject`);
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The rights statement (`dc:rights`), a language alternative. Reads the item in `language` (default `x-default`).
|
|
81
|
+
*
|
|
82
|
+
* @since 0.1.0
|
|
83
|
+
* @category getters
|
|
84
|
+
*/
|
|
85
|
+
export const rights: (self: Metadata.Metadata, language?: string) => Option.Option<string> =
|
|
86
|
+
Accessors.localized(`${DC}rights`);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Sets one language of the rights statement (`dc:rights`), a language alternative.
|
|
90
|
+
*
|
|
91
|
+
* @since 0.1.0
|
|
92
|
+
* @category setters
|
|
93
|
+
*/
|
|
94
|
+
export const setRights: Metadata.LocalizedSetter = Accessors.setLocalized(`${DC}rights`);
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The publishers (`dc:publisher`), an unordered array.
|
|
98
|
+
*
|
|
99
|
+
* @since 0.1.0
|
|
100
|
+
* @category getters
|
|
101
|
+
*/
|
|
102
|
+
export const publisher: (self: Metadata.Metadata) => Option.Option<ReadonlyArray<string>> =
|
|
103
|
+
Accessors.items(`${DC}publisher`);
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Sets the publishers (`dc:publisher`), an unordered array.
|
|
107
|
+
*
|
|
108
|
+
* @since 0.1.0
|
|
109
|
+
* @category setters
|
|
110
|
+
*/
|
|
111
|
+
export const setPublisher: Metadata.Setter<Iterable<string>> = Accessors.setBag(`${DC}publisher`);
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* The media type of the resource (`dc:format`).
|
|
115
|
+
*
|
|
116
|
+
* @since 0.1.0
|
|
117
|
+
* @category getters
|
|
118
|
+
*/
|
|
119
|
+
export const format: (self: Metadata.Metadata) => Option.Option<string> = Accessors.text(
|
|
120
|
+
`${DC}format`,
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Sets the media type of the resource (`dc:format`).
|
|
125
|
+
*
|
|
126
|
+
* @since 0.1.0
|
|
127
|
+
* @category setters
|
|
128
|
+
*/
|
|
129
|
+
export const setFormat: Metadata.Setter<string> = Accessors.setText(`${DC}format`);
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* An unambiguous identifier of the resource (`dc:identifier`).
|
|
133
|
+
*
|
|
134
|
+
* @since 0.1.0
|
|
135
|
+
* @category getters
|
|
136
|
+
*/
|
|
137
|
+
export const identifier: (self: Metadata.Metadata) => Option.Option<string> = Accessors.text(
|
|
138
|
+
`${DC}identifier`,
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Sets an unambiguous identifier of the resource (`dc:identifier`).
|
|
143
|
+
*
|
|
144
|
+
* @since 0.1.0
|
|
145
|
+
* @category setters
|
|
146
|
+
*/
|
|
147
|
+
export const setIdentifier: Metadata.Setter<string> = Accessors.setText(`${DC}identifier`);
|
package/src/xmp/Exif.ts
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed accessors for the most used properties of the EXIF schema (`exif:`,
|
|
3
|
+
* XMP Specification Part 2 §3.3.6). Any other EXIF property is read with
|
|
4
|
+
* `Metadata.get`.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
7
|
+
*/
|
|
8
|
+
import type * as DateTime from 'effect/DateTime';
|
|
9
|
+
import type * as Option from 'effect/Option';
|
|
10
|
+
import * as Accessors from './internal/accessors.ts';
|
|
11
|
+
import type * as Metadata from './Metadata.ts';
|
|
12
|
+
import { EXIF } from './Namespaces.ts';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* When the original image was taken (`exif:DateTimeOriginal`). An ISO 8601 date, as XMP stores it; the setter takes a `DateTime` or a string.
|
|
16
|
+
*
|
|
17
|
+
* @since 0.1.0
|
|
18
|
+
* @category getters
|
|
19
|
+
*/
|
|
20
|
+
export const dateTimeOriginal: (self: Metadata.Metadata) => Option.Option<string> = Accessors.text(
|
|
21
|
+
`${EXIF}DateTimeOriginal`,
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Sets when the original image was taken (`exif:DateTimeOriginal`).
|
|
26
|
+
*
|
|
27
|
+
* @since 0.1.0
|
|
28
|
+
* @category setters
|
|
29
|
+
*/
|
|
30
|
+
export const setDateTimeOriginal: Metadata.Setter<DateTime.DateTime | string> = Accessors.setDate(
|
|
31
|
+
`${EXIF}DateTimeOriginal`,
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* When the image was stored as digital data (`exif:DateTimeDigitized`). An ISO 8601 date, as XMP stores it; the setter takes a `DateTime` or a string.
|
|
36
|
+
*
|
|
37
|
+
* @since 0.1.0
|
|
38
|
+
* @category getters
|
|
39
|
+
*/
|
|
40
|
+
export const dateTimeDigitized: (self: Metadata.Metadata) => Option.Option<string> = Accessors.text(
|
|
41
|
+
`${EXIF}DateTimeDigitized`,
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Sets when the image was stored as digital data (`exif:DateTimeDigitized`).
|
|
46
|
+
*
|
|
47
|
+
* @since 0.1.0
|
|
48
|
+
* @category setters
|
|
49
|
+
*/
|
|
50
|
+
export const setDateTimeDigitized: Metadata.Setter<DateTime.DateTime | string> = Accessors.setDate(
|
|
51
|
+
`${EXIF}DateTimeDigitized`,
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* A user comment (`exif:UserComment`). A language alternative; reads the item in `language` (default `x-default`).
|
|
56
|
+
*
|
|
57
|
+
* @since 0.1.0
|
|
58
|
+
* @category getters
|
|
59
|
+
*/
|
|
60
|
+
export const userComment: (self: Metadata.Metadata, language?: string) => Option.Option<string> =
|
|
61
|
+
Accessors.localized(`${EXIF}UserComment`);
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Sets a user comment (`exif:UserComment`).
|
|
65
|
+
*
|
|
66
|
+
* @since 0.1.0
|
|
67
|
+
* @category setters
|
|
68
|
+
*/
|
|
69
|
+
export const setUserComment: Metadata.LocalizedSetter = Accessors.setLocalized(
|
|
70
|
+
`${EXIF}UserComment`,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The valid image width, in pixels (`exif:PixelXDimension`). An integer.
|
|
75
|
+
*
|
|
76
|
+
* @since 0.1.0
|
|
77
|
+
* @category getters
|
|
78
|
+
*/
|
|
79
|
+
export const pixelXDimension: (self: Metadata.Metadata) => Option.Option<number> =
|
|
80
|
+
Accessors.integer(`${EXIF}PixelXDimension`);
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Sets the valid image width, in pixels (`exif:PixelXDimension`).
|
|
84
|
+
*
|
|
85
|
+
* @since 0.1.0
|
|
86
|
+
* @category setters
|
|
87
|
+
*/
|
|
88
|
+
export const setPixelXDimension: Metadata.Setter<number> = Accessors.setInteger(
|
|
89
|
+
`${EXIF}PixelXDimension`,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The valid image height, in pixels (`exif:PixelYDimension`). An integer.
|
|
94
|
+
*
|
|
95
|
+
* @since 0.1.0
|
|
96
|
+
* @category getters
|
|
97
|
+
*/
|
|
98
|
+
export const pixelYDimension: (self: Metadata.Metadata) => Option.Option<number> =
|
|
99
|
+
Accessors.integer(`${EXIF}PixelYDimension`);
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Sets the valid image height, in pixels (`exif:PixelYDimension`).
|
|
103
|
+
*
|
|
104
|
+
* @since 0.1.0
|
|
105
|
+
* @category setters
|
|
106
|
+
*/
|
|
107
|
+
export const setPixelYDimension: Metadata.Setter<number> = Accessors.setInteger(
|
|
108
|
+
`${EXIF}PixelYDimension`,
|
|
109
|
+
);
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading the XMP packet embedded in an image file, as XMP Specification
|
|
3
|
+
* Part 3 places it: a JPEG's APP1 segment (with Extended XMP split across
|
|
4
|
+
* further APP1 segments) or a PNG's `iTXt` chunk with the keyword
|
|
5
|
+
* `XML:com.adobe.xmp` (stored or, read with `png`, zlib-compressed). Any
|
|
6
|
+
* other format (TIFF, WebP, GIF, MP4, PDF, …) can
|
|
7
|
+
* be scanned for its packet with `Packet.find`.
|
|
8
|
+
*
|
|
9
|
+
* @since 0.1.0
|
|
10
|
+
*/
|
|
11
|
+
import * as Arr from 'effect/Array';
|
|
12
|
+
import * as Effect from 'effect/Effect';
|
|
13
|
+
import * as Option from 'effect/Option';
|
|
14
|
+
import * as Result from 'effect/Result';
|
|
15
|
+
import * as Schema from 'effect/Schema';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A malformed image file.
|
|
19
|
+
*
|
|
20
|
+
* @since 0.1.0
|
|
21
|
+
* @category errors
|
|
22
|
+
*/
|
|
23
|
+
export class XmpExtractError extends Schema.TaggedError<XmpExtractError>()('XmpExtractError', {
|
|
24
|
+
message: Schema.String,
|
|
25
|
+
}) {}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The XMP of a JPEG file: the standard packet and, when the packet does not
|
|
29
|
+
* fit one segment, the Extended XMP document its `xmpNote:HasExtendedXMP`
|
|
30
|
+
* names.
|
|
31
|
+
*
|
|
32
|
+
* @since 0.1.0
|
|
33
|
+
* @category models
|
|
34
|
+
*/
|
|
35
|
+
export interface JpegXmp {
|
|
36
|
+
readonly standard: string;
|
|
37
|
+
readonly extended: Option.Option<string>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const fail = (message: string): never => {
|
|
41
|
+
throw new XmpExtractError({ message });
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const ascii = (text: string): Uint8Array =>
|
|
45
|
+
Uint8Array.from(Arr.map(Arr.fromIterable(text), (c) => c.charCodeAt(0)));
|
|
46
|
+
|
|
47
|
+
const startsWith = (bytes: Uint8Array, prefix: Uint8Array): boolean =>
|
|
48
|
+
bytes.length >= prefix.length && Arr.every(Arr.fromIterable(prefix), (b, i) => bytes[i] === b);
|
|
49
|
+
|
|
50
|
+
const utf8 = (bytes: Uint8Array): string => new TextDecoder().decode(bytes);
|
|
51
|
+
const latin1 = (bytes: Uint8Array): string => new TextDecoder('windows-1252').decode(bytes);
|
|
52
|
+
|
|
53
|
+
const view = (bytes: Uint8Array) => new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
54
|
+
|
|
55
|
+
const catchExtract = <A>(f: () => A): Result.Result<A, XmpExtractError> =>
|
|
56
|
+
Result.try({
|
|
57
|
+
try: f,
|
|
58
|
+
catch: (e) => {
|
|
59
|
+
if (e instanceof XmpExtractError) return e;
|
|
60
|
+
throw e;
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// -----------------------------------------------------------------------------
|
|
65
|
+
// JPEG
|
|
66
|
+
// -----------------------------------------------------------------------------
|
|
67
|
+
|
|
68
|
+
const STANDARD = ascii('http://ns.adobe.com/xap/1.0/\0');
|
|
69
|
+
const EXTENSION = ascii('http://ns.adobe.com/xmp/extension/\0');
|
|
70
|
+
const APP1 = 0xe1;
|
|
71
|
+
|
|
72
|
+
interface Segment {
|
|
73
|
+
readonly marker: number;
|
|
74
|
+
readonly data: Uint8Array;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const isStandalone = (marker: number) =>
|
|
78
|
+
marker === 0x01 || marker === 0xff || (marker >= 0xd0 && marker <= 0xd7);
|
|
79
|
+
|
|
80
|
+
/** The segments before the image data (SOS) or the end of the image (EOI). */
|
|
81
|
+
const jpegSegments = (bytes: Uint8Array): ReadonlyArray<Segment> => {
|
|
82
|
+
const data = view(bytes);
|
|
83
|
+
return Arr.getSomes(
|
|
84
|
+
Arr.unfold(2, (pos): Option.Option<readonly [Option.Option<Segment>, number]> => {
|
|
85
|
+
if (pos + 2 > bytes.length) return Option.none();
|
|
86
|
+
if (data.getUint8(pos) !== 0xff) return fail(`Expected a JPEG marker at offset ${pos}`);
|
|
87
|
+
const marker = data.getUint8(pos + 1);
|
|
88
|
+
if (marker === 0xd9 || marker === 0xda) return Option.none();
|
|
89
|
+
// A fill byte (0xFF) or a marker without a length.
|
|
90
|
+
if (isStandalone(marker))
|
|
91
|
+
return Option.some([Option.none(), marker === 0xff ? pos + 1 : pos + 2]);
|
|
92
|
+
if (pos + 4 > bytes.length) return fail(`Truncated JPEG segment at offset ${pos}`);
|
|
93
|
+
const length = data.getUint16(pos + 2);
|
|
94
|
+
const end = pos + 2 + length;
|
|
95
|
+
if (length < 2 || end > bytes.length) return fail(`Truncated JPEG segment at offset ${pos}`);
|
|
96
|
+
return Option.some([Option.some({ marker, data: bytes.subarray(pos + 4, end) }), end]);
|
|
97
|
+
}),
|
|
98
|
+
);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
interface Chunk {
|
|
102
|
+
readonly guid: string;
|
|
103
|
+
readonly length: number;
|
|
104
|
+
readonly offset: number;
|
|
105
|
+
readonly data: Uint8Array;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const extensionChunk = (payload: Uint8Array): Chunk => {
|
|
109
|
+
const header = EXTENSION.length + 40;
|
|
110
|
+
if (payload.length < header) return fail('Truncated Extended XMP segment');
|
|
111
|
+
const data = view(payload);
|
|
112
|
+
return {
|
|
113
|
+
guid: latin1(payload.subarray(EXTENSION.length, EXTENSION.length + 32)),
|
|
114
|
+
length: data.getUint32(EXTENSION.length + 32),
|
|
115
|
+
offset: data.getUint32(EXTENSION.length + 36),
|
|
116
|
+
data: payload.subarray(header),
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/** Reassembles the Extended XMP whose GUID the standard packet names. */
|
|
121
|
+
const extended = (standard: string, chunks: ReadonlyArray<Chunk>): Option.Option<string> =>
|
|
122
|
+
Option.map(
|
|
123
|
+
Arr.findFirst(chunks, (c) => standard.includes(c.guid)),
|
|
124
|
+
({ guid, length }) => {
|
|
125
|
+
const whole = new Uint8Array(length);
|
|
126
|
+
Arr.filter(chunks, (c) => c.guid === guid).forEach((c) => {
|
|
127
|
+
if (c.offset + c.data.length > length) fail('Extended XMP chunk out of bounds');
|
|
128
|
+
whole.set(c.data, c.offset);
|
|
129
|
+
});
|
|
130
|
+
return utf8(whole);
|
|
131
|
+
},
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Reads the XMP of a JPEG file, returning a `Result`: `None` when the file
|
|
136
|
+
* has no XMP.
|
|
137
|
+
*
|
|
138
|
+
* @since 0.1.0
|
|
139
|
+
* @category extraction
|
|
140
|
+
*/
|
|
141
|
+
export const jpegResult = (
|
|
142
|
+
bytes: Uint8Array,
|
|
143
|
+
): Result.Result<Option.Option<JpegXmp>, XmpExtractError> =>
|
|
144
|
+
catchExtract(() => {
|
|
145
|
+
if (bytes[0] !== 0xff || bytes[1] !== 0xd8) return fail('Not a JPEG file');
|
|
146
|
+
const app1 = Arr.map(
|
|
147
|
+
Arr.filter(jpegSegments(bytes), (s) => s.marker === APP1),
|
|
148
|
+
(s) => s.data,
|
|
149
|
+
);
|
|
150
|
+
const chunks = Arr.map(
|
|
151
|
+
Arr.filter(app1, (d) => startsWith(d, EXTENSION)),
|
|
152
|
+
extensionChunk,
|
|
153
|
+
);
|
|
154
|
+
return Option.map(
|
|
155
|
+
Arr.findFirst(app1, (d) => startsWith(d, STANDARD)),
|
|
156
|
+
(d) => {
|
|
157
|
+
const standard = utf8(d.subarray(STANDARD.length));
|
|
158
|
+
return { standard, extended: extended(standard, chunks) };
|
|
159
|
+
},
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Reads the XMP of a JPEG file: `None` when the file has no XMP.
|
|
165
|
+
*
|
|
166
|
+
* @since 0.1.0
|
|
167
|
+
* @category extraction
|
|
168
|
+
*/
|
|
169
|
+
export const jpeg = (bytes: Uint8Array): Effect.Effect<Option.Option<JpegXmp>, XmpExtractError> =>
|
|
170
|
+
Effect.suspend(() => Effect.fromResult(jpegResult(bytes)));
|
|
171
|
+
|
|
172
|
+
// -----------------------------------------------------------------------------
|
|
173
|
+
// PNG
|
|
174
|
+
// -----------------------------------------------------------------------------
|
|
175
|
+
|
|
176
|
+
const PNG_SIGNATURE = Uint8Array.of(0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a);
|
|
177
|
+
const XMP_KEYWORD = 'XML:com.adobe.xmp';
|
|
178
|
+
|
|
179
|
+
interface PngChunk {
|
|
180
|
+
readonly type: string;
|
|
181
|
+
readonly data: Uint8Array;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const pngChunks = (bytes: Uint8Array): ReadonlyArray<PngChunk> => {
|
|
185
|
+
const data = view(bytes);
|
|
186
|
+
return Arr.unfold(PNG_SIGNATURE.length, (pos): Option.Option<readonly [PngChunk, number]> => {
|
|
187
|
+
if (pos >= bytes.length) return Option.none();
|
|
188
|
+
if (pos + 12 > bytes.length) return fail(`Truncated PNG chunk at offset ${pos}`);
|
|
189
|
+
const length = data.getUint32(pos);
|
|
190
|
+
const type = latin1(bytes.subarray(pos + 4, pos + 8));
|
|
191
|
+
const end = pos + 12 + length;
|
|
192
|
+
if (end > bytes.length) return fail(`Truncated PNG chunk at offset ${pos}`);
|
|
193
|
+
if (type === 'IEND') return Option.none();
|
|
194
|
+
return Option.some([{ type, data: bytes.subarray(pos + 8, pos + 8 + length) }, end]);
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/** The text of an XMP `iTXt` chunk: stored, or zlib-compressed. */
|
|
199
|
+
interface XmpChunk {
|
|
200
|
+
readonly compressed: boolean;
|
|
201
|
+
readonly text: Uint8Array;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** The XMP of an `iTXt` chunk, when its keyword is XMP's. */
|
|
205
|
+
const xmpChunk = (chunk: Uint8Array): Option.Option<XmpChunk> => {
|
|
206
|
+
const keywordEnd = chunk.indexOf(0);
|
|
207
|
+
if (keywordEnd < 0 || latin1(chunk.subarray(0, keywordEnd)) !== XMP_KEYWORD) {
|
|
208
|
+
return Option.none();
|
|
209
|
+
}
|
|
210
|
+
const compressed = chunk[keywordEnd + 1] !== 0;
|
|
211
|
+
// Compression method 0 (zlib) is the only one PNG defines.
|
|
212
|
+
if (compressed && chunk[keywordEnd + 2] !== 0) return fail('Unknown iTXt compression method');
|
|
213
|
+
const languageEnd = chunk.indexOf(0, keywordEnd + 3);
|
|
214
|
+
const translatedEnd = languageEnd < 0 ? -1 : chunk.indexOf(0, languageEnd + 1);
|
|
215
|
+
if (translatedEnd < 0) return fail('Malformed iTXt chunk');
|
|
216
|
+
return Option.some({ compressed, text: chunk.subarray(translatedEnd + 1) });
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
const pngXmpChunk = (bytes: Uint8Array): Option.Option<XmpChunk> => {
|
|
220
|
+
if (!startsWith(bytes, PNG_SIGNATURE)) return fail('Not a PNG file');
|
|
221
|
+
return Option.firstSomeOf(
|
|
222
|
+
Arr.map(
|
|
223
|
+
Arr.filter(pngChunks(bytes), (c) => c.type === 'iTXt'),
|
|
224
|
+
(c) => xmpChunk(c.data),
|
|
225
|
+
),
|
|
226
|
+
);
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* The most bytes `Extract.png` inflates a compressed XMP chunk to by
|
|
231
|
+
* default: 4 MiB, far above any real packet, so a small deflate bomb fails
|
|
232
|
+
* instead of exhausting memory.
|
|
233
|
+
*
|
|
234
|
+
* @since 0.1.0
|
|
235
|
+
* @category constants
|
|
236
|
+
*/
|
|
237
|
+
export const DEFAULT_MAX_XMP_BYTES = 4 * 1024 * 1024;
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Options for `Extract.png`.
|
|
241
|
+
*
|
|
242
|
+
* @since 0.1.0
|
|
243
|
+
* @category models
|
|
244
|
+
*/
|
|
245
|
+
export interface PngOptions {
|
|
246
|
+
/**
|
|
247
|
+
* The most bytes a compressed `iTXt` chunk may inflate to; past it the
|
|
248
|
+
* read fails. Defaults to `DEFAULT_MAX_XMP_BYTES`.
|
|
249
|
+
*/
|
|
250
|
+
readonly maxXmpBytes?: number | undefined;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const concatChunks = (chunks: ReadonlyArray<Uint8Array>, total: number): Uint8Array => {
|
|
254
|
+
const out = new Uint8Array(total);
|
|
255
|
+
Arr.reduce(chunks, 0, (offset, chunk) => {
|
|
256
|
+
out.set(chunk, offset);
|
|
257
|
+
return offset + chunk.length;
|
|
258
|
+
});
|
|
259
|
+
return out;
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Reads a stream to its end, failing (and cancelling it) as soon as the
|
|
264
|
+
* running total passes `max`, so nothing past the cap is buffered.
|
|
265
|
+
*/
|
|
266
|
+
const readCapped = (
|
|
267
|
+
reader: ReadableStreamDefaultReader<Uint8Array>,
|
|
268
|
+
max: number,
|
|
269
|
+
chunks: Array<Uint8Array>,
|
|
270
|
+
total: number,
|
|
271
|
+
): Promise<Uint8Array> =>
|
|
272
|
+
reader.read().then((result) => {
|
|
273
|
+
if (result.done) return concatChunks(chunks, total);
|
|
274
|
+
const next = total + result.value.length;
|
|
275
|
+
if (next > max) {
|
|
276
|
+
void reader.cancel();
|
|
277
|
+
return fail(`Compressed XMP iTXt chunk inflates to more than ${max} bytes`);
|
|
278
|
+
}
|
|
279
|
+
chunks.push(result.value);
|
|
280
|
+
return readCapped(reader, max, chunks, next);
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
/** Inflates zlib data with the platform's `DecompressionStream`, up to `max` bytes. */
|
|
284
|
+
const inflate = (data: Uint8Array, max: number): Effect.Effect<Uint8Array, XmpExtractError> =>
|
|
285
|
+
Effect.tryPromise({
|
|
286
|
+
try: () => {
|
|
287
|
+
const source = new ReadableStream<BufferSource>({
|
|
288
|
+
start: (controller) => {
|
|
289
|
+
// A copy: `BufferSource` excludes a view over a `SharedArrayBuffer`.
|
|
290
|
+
controller.enqueue(data.slice());
|
|
291
|
+
controller.close();
|
|
292
|
+
},
|
|
293
|
+
});
|
|
294
|
+
return readCapped(
|
|
295
|
+
source.pipeThrough(new DecompressionStream('deflate')).getReader(),
|
|
296
|
+
max,
|
|
297
|
+
[],
|
|
298
|
+
0,
|
|
299
|
+
);
|
|
300
|
+
},
|
|
301
|
+
catch: (e) =>
|
|
302
|
+
e instanceof XmpExtractError
|
|
303
|
+
? e
|
|
304
|
+
: new XmpExtractError({ message: 'Malformed compressed iTXt chunk' }),
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Reads the XMP packet of a PNG file, returning a `Result`: `None` when the
|
|
309
|
+
* file has no XMP. Decompression is asynchronous, so a compressed `iTXt`
|
|
310
|
+
* chunk fails here; `png` inflates it. (The XMP specification writes the
|
|
311
|
+
* chunk uncompressed, so a scanner can find the packet.)
|
|
312
|
+
*
|
|
313
|
+
* @since 0.1.0
|
|
314
|
+
* @category extraction
|
|
315
|
+
*/
|
|
316
|
+
export const pngResult = (
|
|
317
|
+
bytes: Uint8Array,
|
|
318
|
+
): Result.Result<Option.Option<string>, XmpExtractError> =>
|
|
319
|
+
catchExtract(() =>
|
|
320
|
+
Option.map(pngXmpChunk(bytes), (chunk) =>
|
|
321
|
+
chunk.compressed
|
|
322
|
+
? fail('A compressed XMP iTXt chunk needs Extract.png, which inflates it')
|
|
323
|
+
: utf8(chunk.text),
|
|
324
|
+
),
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Reads the XMP packet of a PNG file: `None` when the file has no XMP. A
|
|
329
|
+
* zlib-compressed `iTXt` chunk is inflated with the platform's
|
|
330
|
+
* `DecompressionStream` (Node, browsers and Workers all provide it), and
|
|
331
|
+
* fails once it inflates past `maxXmpBytes` (default `DEFAULT_MAX_XMP_BYTES`).
|
|
332
|
+
*
|
|
333
|
+
* @since 0.1.0
|
|
334
|
+
* @category extraction
|
|
335
|
+
*/
|
|
336
|
+
export const png = (
|
|
337
|
+
bytes: Uint8Array,
|
|
338
|
+
options?: PngOptions,
|
|
339
|
+
): Effect.Effect<Option.Option<string>, XmpExtractError> =>
|
|
340
|
+
Effect.flatMap(
|
|
341
|
+
Effect.suspend(() => Effect.fromResult(catchExtract(() => pngXmpChunk(bytes)))),
|
|
342
|
+
Option.match({
|
|
343
|
+
onNone: () => Effect.succeed(Option.none()),
|
|
344
|
+
onSome: (chunk) =>
|
|
345
|
+
chunk.compressed
|
|
346
|
+
? Effect.map(inflate(chunk.text, options?.maxXmpBytes ?? DEFAULT_MAX_XMP_BYTES), (text) =>
|
|
347
|
+
Option.some(utf8(text)),
|
|
348
|
+
)
|
|
349
|
+
: Effect.succeed(Option.some(utf8(chunk.text))),
|
|
350
|
+
}),
|
|
351
|
+
);
|