{"_id":"@blackcatinformatics/purrdf","_rev":"30-bcf0a2d6c5342a8ddda70f5f879105a7","name":"@blackcatinformatics/purrdf","dist-tags":{"latest":"3.0.1"},"versions":{"0.1.3":{"name":"@blackcatinformatics/purrdf","version":"0.1.3","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.1.3","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf#readme","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"2aa4fcd705e9ad1259351ec3afedf407d971674a","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.1.3.tgz","fileCount":7,"integrity":"sha512-CRqeQaLExsPaKNYWP4V//nEYAsXT3+CZsY/cAOj+s1oM0xAaMysh9ELU88K9PqEmW2NYGN6LtPQlinFDNISIkQ==","signatures":[{"sig":"MEUCIQDil2f7hQjMF4n7aBt7jlKZw1SnXVH6aB9XGF/eO7UJJQIgU03HxkPw3EH+Xpq1evYbusgfwvBDBi0eKBhTEfrg+U8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2206084},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"29f6f3a986bbbb1d77ef4713491035dc70e509d3","scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"paudley","email":"paudley@blackcat.ca"},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"11.18.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.1.3_1782952579049_0.7244489266486267","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@blackcatinformatics/purrdf","version":"0.1.4","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.1.4","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"ff37e4f4828b0475152106baf50eb43cc242f5be","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.1.4.tgz","fileCount":8,"integrity":"sha512-xufGYnQCyj+F3MMNP6JWr+JMPB904JjVGn9fLTKEAwZdXtVUlUQyPpSjq5Xh6Gpb78Fk8CegRu3trBaHDRiScw==","signatures":[{"sig":"MEUCIQCooljQhDR3yufFMLTiek9b4AMWfD5QackGSPp+EFCSVwIgMf7ISEQfq0X0SLFyQp2tySm0Z3Mz9XDcIM69NYP4xqQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2209636},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"477a02be3ada129a8045d0132feb16a270c31182","scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"11.18.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.17.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.1.4_1782953043999_0.9835314361864718","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@blackcatinformatics/purrdf","version":"0.1.5","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.1.5","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"9ed700f683880f5f25ab70c515dc6e6c5192639b","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.1.5.tgz","fileCount":8,"integrity":"sha512-ENXOb2hQmzkMF92VafZcx3tzKlJpD2TxFhl0MRTi47Wavlq1zzJDBv3JSb2ojKerZUZvCUlofpLxrRf4jkVUOw==","signatures":[{"sig":"MEYCIQDgcPC0m48f6AILTVXun0vYPCAd0CtdYvQJKz84isgOmgIhAO2amKZ2m9BHfOVEy8ZfxUSRhO2m2T/8Sab7SYYMVsKP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2240976},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"8a69feb2404a6b17be5abb80e71f60309c1e9364","scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"11.18.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.17.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.1.5_1782965737174_0.7070622997892106","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@blackcatinformatics/purrdf","version":"0.2.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.2.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"4152efcacb1cebd3f5bbecb91390125adf6b0254","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.2.0.tgz","fileCount":8,"integrity":"sha512-931ksNSW4IbBxgrYTV5d0QK11l3ZJUI2yfHOtO1TERFMee8EPhTgV8oNAAn4q32Wn7yWky2dmuJuBDHKNibJIQ==","signatures":[{"sig":"MEUCIGYROdDJvTfK7WPuhNle1W83waOtrL27rlgPhYTSdCNCAiEAxtw13dTFglfqlSoc/o+ygd/DC9iTIR9f74gg7PGlXH4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2240976},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"245dc7282c937854ef6859fbf2626f520a38d5fd","scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"11.18.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.2.0_1782972258259_0.9828788363598793","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@blackcatinformatics/purrdf","version":"0.2.1","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.2.1","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"9ad11caf6803176ce63e6fd2885d59a7c7d8d81a","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.2.1.tgz","fileCount":8,"integrity":"sha512-a3e/W3sYQgno1/fFH+8wbbM5pZjhPpqXv9ajtRfAoLZdJ/8zEFk06WF4LXhzQ3KAQOIBovnkj474wQj4yshG9g==","signatures":[{"sig":"MEUCIQCLx0xSthyRttpRVbvOsKPHuYvpxEUhcO2FD1KP/oTUTAIgfPmS0kQQUBS24m4bp8e85wdDMkab9yN+4ktTaLvbwGI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2303660},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"ba08a6facd4a04c2012df1d0193025d3348f0bed","scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"11.18.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.2.1_1783007182829_0.39126639991701695","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@blackcatinformatics/purrdf","version":"0.3.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.3.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"a758d996b28baf1696bb3a2b4a3891fba6e17114","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.3.0.tgz","fileCount":8,"integrity":"sha512-BpX7IK5hKmP1ODcUaRQDNUvCfWwWUDkusuK8xpFKSlyQ6nCvPSvQXiTZ5EaInCUHmjrx/m1d3K1ApooUo3LQIA==","signatures":[{"sig":"MEQCIEL7iiatOvpJawOErhr8YI4QmvYd2d2dphUph0tu/o36AiB/wgsC7fri+uk0ka3VjK7fSYV7jjwPehFrybWn4ciHYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2950168},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"453d79715eea6f59a093eeccb94ea2a03344e605","scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"11.18.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.3.0_1783233367384_0.025773002950010504","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@blackcatinformatics/purrdf","version":"0.3.1","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.3.1","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"1c478c72af18a2531a1672456e5845a18ae64404","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.3.1.tgz","fileCount":8,"integrity":"sha512-QKK0SLock1aoguc1izUhf7HmolGHM92YoTrYMbAx60QtYFOABHZfHUk1tmJul7nSWgX5klAPU1SmjRMNKHAuwg==","signatures":[{"sig":"MEQCIHUHYS2d4bbDIdGhZzmGqvszSHfge5AMQRcqzM9tVoiPAiA5h1UbcGvzvCyfjLvzD54T2ND8a/1uZlP2BS9sr7tjYw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2949862},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"edd5c0617a09a2fae37fec96ba426f41fbe3374a","scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"11.18.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.3.1_1783243798544_0.016806618595839096","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@blackcatinformatics/purrdf","version":"0.3.2","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.3.2","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"873a0ebd9cdc5ce5719f57cf1223461d1024e3ab","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.3.2.tgz","fileCount":8,"integrity":"sha512-9OR75BoCBgM0CTgu9gskt+phMfvD5kLZUxc+GipEeSmG4Q+MJttA1911XcaA9VfE4RbbBiMdg12UfkohDvnGjw==","signatures":[{"sig":"MEQCIBRCQSAghrOIBtNsnqyIWFSfO82qkKZ5HAwpqkjd0monAiBeDnVIEKXfeehlZB8qHU1P6CBeqR5yTXEbfL3RoTmBPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3075743},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"f6d739930ee9d839e4cde85b0b327334e45fa7ca","scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"11.18.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.3.2_1783278013775_0.9694472976000237","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@blackcatinformatics/purrdf","version":"0.3.3","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.3.3","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"5baf8da2b2b26bcea3b670209d13f15314a223be","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.3.3.tgz","fileCount":8,"integrity":"sha512-QPy90x3oWjyDaBL2/tHD85tu2sht7fGBLbR++CuK34uHbkqxeX/VNV8CHBgLOHT8Cz5Tf7uPYxAKGympvaEoGg==","signatures":[{"sig":"MEUCIQDbanLxLCPolYEVzxAv4Y49PjVhYLSTVKVWDK7MpHfsSQIgNH0Cip4VPCIwSAZG+YqHt+XltdFG90SK09VaM2eLA1E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3076136},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"59d372ffbcd57ab1b200fe86b4b661ffdd8150b1","scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"11.18.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.3.3_1783289782384_0.6059896042067388","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@blackcatinformatics/purrdf","version":"0.4.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.4.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"f5b5169530096625dde43f4ba33875c6cd1705f0","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.4.0.tgz","fileCount":8,"integrity":"sha512-sSEBm5nYcBfPHcls6Pej7saNpYSR4umSNproq0kOsu5DSa8FzHm63CjR7cg77s7bYe24YPQr5h4otn+kIC9paQ==","signatures":[{"sig":"MEYCIQDlzJcEModqaeqPdLagxoEVJlSE9fVlu6/3YjWIXXV1jgIhAKl937YNvcOwVC1BcsShYtBgAR77kOzI3Y+wuFcJd2Ue","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3069826},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"f25989bb50bb920669e9fd41c4cb2cfca40225f9","scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"11.18.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.4.0_1783417335703_0.8952615646857647","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@blackcatinformatics/purrdf","version":"0.4.3","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.4.3","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"0188ab7252f5d3d3fe59c8551bda08047d6cf19f","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.4.3.tgz","fileCount":8,"integrity":"sha512-WdfSoA3etjGZrS60BTNUFJSUYrGHqBEAr8TduWVT8bVroPvlBwGrWzYTjmXaGYyCiUzLUVCNYReNzup/iJIuIA==","signatures":[{"sig":"MEQCIDznfxwfBxeVwfcAyxKe/Rg/cbK4+Gl9hjlFtt/v8ZUkAiAYzB/+jYgwKh4hYb3sH9XqcalwjfHAZKUfXc5esrF9QA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.4.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3874835},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"804fd75cc372de43f2fbdab3b2f630dbc8b2b2d5","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.1","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.4.3_1783724931691_0.6595876274542589","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@blackcatinformatics/purrdf","version":"0.5.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.5.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"c30c711ea89e44dccc64485c42304627cce56672","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.5.0.tgz","fileCount":8,"integrity":"sha512-VyKs9vePxVc1/lm+bWjQQ410EyKwlOIjMMBA/JbMiShuwwNZRArwhHUJEq2ENq5HJViJut2Dv0OkPx0oG4t+YQ==","signatures":[{"sig":"MEUCIAP1LLbhoaFHfjGs62fTEIpDCaqlrhVDW5B1FpFKQ8woAiEA+8S/52/nFs928758imXaAjcbyUrI2/Zmd6OnFOSwwNc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3905276},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"5fbfb1c06d86dfd967087adebd23fa57155bb025","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.1","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.5.0_1783841311518_0.7520780757548979","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@blackcatinformatics/purrdf","version":"0.6.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.6.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"9fe98ce4426fdb9f39d3b3414317d82f769e609e","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.6.0.tgz","fileCount":8,"integrity":"sha512-bI0DWVt6M8sHR2Gj+ey+UkW5VZMVHeamaoiPQiTmGCSGeVzSerrvOcUape9QA4zdTQjaZkxzvSDIfP6yM6Mfrg==","signatures":[{"sig":"MEUCIQD53Q5YNvwp4X4PmugcTJlMfJRiWsUf2RnNcp4mzmFq3AIgIExqI3C9w+mv2yL3/yjH+40IV1PBcMMLnwN4r7/TYsk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3912109},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"c1f6e1a074186a49b4df0673f56c9cd4f2d69828","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.1","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.6.0_1783988854505_0.5183960570539032","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@blackcatinformatics/purrdf","version":"0.7.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.7.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"9687825d811f94c629b3b77c69e6e0bb6802dd94","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.7.0.tgz","fileCount":8,"integrity":"sha512-ycDGHtj9I2Oxz34CM5VOFonBbW3jC98Jg+lVlnNyp+nEDRPap/wdfkeQLj1gfTKx/7YE7acJ+Ld6smxEiVeChA==","signatures":[{"sig":"MEYCIQDFMWUrqCANaMSFwgEYrtJy4zMU3mrgc+HqdXKXRNdP0QIhAOacZJqIJ2E3cpO9rBuVyg9eNaN22zi52kmLriIUnfZN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6116507},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"a2a4670d1204c833730e685277dd8506a4be2c37","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.1","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.7.0_1784275610717_0.8948936432425036","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@blackcatinformatics/purrdf","version":"0.8.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.8.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"460c392e5261428edb177a4cb09c6d667ec84a8d","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.8.0.tgz","fileCount":8,"integrity":"sha512-6wsdFYlxxqcEiW863qw4viAum8/BbMbhqwKqPWe0svfyeADol8EgHhKTzdSeh18FjmuAdCaeOsffhRT1uuPVig==","signatures":[{"sig":"MEUCIEFzd81Ql1raQ0bawNNLMsoBntNzYMH4b6MYWioMAzaDAiEA/Ll2Q1Ol6wssKgxx9WEyC7O0N//dLlI35U4VZUtqTFw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7956279},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"3a6dfe776e4e99b5eea02c5ddc6ffabb33db1c75","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.1","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.8.0_1784539458454_0.3583088582514138","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@blackcatinformatics/purrdf","version":"0.8.1","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.8.1","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"9f3ed7d9ae594a79dd637466ad2361f9b39255b9","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.8.1.tgz","fileCount":8,"integrity":"sha512-F9gAhTiOg/A0TANaurK1sZOP5u9GQGzTzfOlC3z4e9MP1n1y9OFlCUg4gp/F/y57Coxnu80bIgaa9aMt/jOUJA==","signatures":[{"sig":"MEUCIF0GXmlut4eGD4WMcX1nhTfqTeNZfr9kYKjvB9JSRj5VAiEAhyVG5w8KHGO+/FTGDzdBV84ZNLkwYXDXAxGXX6kEsus=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8311725},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"a3bb1f6389f624e1e281d4726ab6816be8fbc50a","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.1","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.8.1_1784609111794_0.32159474160997203","host":"s3://npm-registry-packages-npm-production"}},"0.8.3":{"name":"@blackcatinformatics/purrdf","version":"0.8.3","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.8.3","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"4666d5ae50a75d757a474c85a1d8729d94a5e5ab","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.8.3.tgz","fileCount":8,"integrity":"sha512-jNgZjrOWG0vwXZnK6L0oc8gELaqtwZF6/jae/QWeDAI0NUHs1DEbrkGUckI+IZkMLymWhAlbtDNZPokskg7tMQ==","signatures":[{"sig":"MEUCIBFGdblT07A8jC2C2+K7AX3VtrlZyWChg559d+5kotBBAiEArA3zgKGvK1sYKSAMkUWqpastpAlY9nBMIZLgE53iHCA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.8.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8312086},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"64dda6c43dd2bdef70647a9c9a112d2d32152b25","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.1","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.8.3_1784845890193_0.7907666082397684","host":"s3://npm-registry-packages-npm-production"}},"0.8.5":{"name":"@blackcatinformatics/purrdf","version":"0.8.5","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.8.5","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"fe19e236c647313ffeec55630613f1a9532d3b29","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.8.5.tgz","fileCount":8,"integrity":"sha512-dhhDwLEgo7gtCP1TF4w78Xusts1NtcoHlCJ2l3dGffeF4EWsLDiiV/cbegDubCKIjbSDnidp77TEyQr1GyR24A==","signatures":[{"sig":"MEUCIQCHxKKNG1g2EMLjKqPyfy18UCPQOO7KKY9aIAbFxoPMPwIgVcXh191kfiDCz9Ewm5OA524ti0LNtfJneqKFLnGh2W8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.8.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8318830},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"59c31dc5763b0cb76d606a2dc3f0a82073f3008b","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.1","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.8.5_1785071603813_0.4677126053390446","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@blackcatinformatics/purrdf","version":"0.9.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.9.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"5f3e0a2a17f72ba45a9da118537506aaa0bb1f8c","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.9.0.tgz","fileCount":8,"integrity":"sha512-g6Iw//dUoGGgKS4DbLhx0cojQEiQEotrH/dNVvh8H1byz4/5AE+H0/NVFcYO8ECan2u7vYcp0dQWLX0kx6VyGw==","signatures":[{"sig":"MEUCIGzjjvtZGf8QcqNIUXPGaql0G3WlxcOgs97NFelWFPmeAiEA25JAWJYRDpCiCD6rF++kJOdffayoazK8mPU3obluPak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8311757},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"f355b544132ec5f64127f9538c59d41e002d1492","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.1","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.9.0_1785261222892_0.5436687678443124","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@blackcatinformatics/purrdf","version":"0.10.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.10.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"bf1d0ea5c96f8e2289d81289ce19ffa2a3608491","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.10.0.tgz","fileCount":8,"integrity":"sha512-UvU9riC9M3GOAng7qmDUlmu+XSqnXOCjX4EHgBnfZEZvXzo8HxNIhXl7kHJ9b1qA0pAMkw23k45kNJuyxv2oNQ==","signatures":[{"sig":"MEQCIHI6M9em2VD1STmrGSGBaX+t1rildbN8gR6cNrr/srpDAiBYY6tiZiWxFDZ9h8d8dYj1B5TYV8RizzFsJXacHa2Kig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":9738262},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"f9f3f848d0ea3f439a30812258fc8a065aa715ce","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.2","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.10.0_1785490679827_0.886550336632469","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@blackcatinformatics/purrdf","version":"0.11.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.11.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"568db4ee944cdd1a163186fd9089999875ad33c2","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.11.0.tgz","fileCount":8,"integrity":"sha512-C2FBHvvEG9gTSlL1MZdZDba6Gv3j7wStZpB78zaWdeiJtN7xl9JRjjmdNFI/F5yvDkJRG17y428MkubSm/M8hw==","signatures":[{"sig":"MEQCIC+651cFH63BH5OdwzNyIVC5F1yjJhEz0G+MC2wbmuv2AiAxg7o8QbyE0Y6PHqQ+c6Xa6QbXtRa8YXkSwZQIcN4nnw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10036801},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"296300d6d8e668e4920e056d52092df797e12727","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.2","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.11.0_1785654607518_0.5530689795518646","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@blackcatinformatics/purrdf","version":"0.12.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.12.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"d2ead01e37002bf675f6aac4ad44e422027cfc9a","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.12.0.tgz","fileCount":8,"integrity":"sha512-txvWHPNuiv+8Ls8/KGMXWAT9TAS/8QalD/bJJbqHoAFhyhzhExT3ki97G468eakr2dtpxtEzVtAAxkpVa7oYrg==","signatures":[{"sig":"MEQCIH9hnBqSyDx8ep4563Qsft4kTr6G5w53vFHJAPlHnqeoAiA55O0W4Pe2Pwa4N7xM/0SbjPThGPIfNuk5oMwyrbu8Uw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10028176},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"dfb1df73199668720116dfbc737c0585e23afb5e","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.2","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.12.0_1785705717375_0.7090952185443022","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@blackcatinformatics/purrdf","version":"0.13.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@0.13.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"320e0642050ef0c916ed390314f4e0c484138cb7","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-0.13.0.tgz","fileCount":8,"integrity":"sha512-R5nfXviBSW4+Pt5RUAJtbdelt4GkQlqEOV0826hiJ87OA0WEYLvyV+hHmTcUOFrZsFu49wnpG0JqblQJwQWyoQ==","signatures":[{"sig":"MEQCIAGU/rI6KKtqvAbdFSQC1nS6BJUAdvnPJBEoVcf7RPhiAiAtppSkTUshZ/hxO8UIUZ2x7H6x+armAgpCx0FXxhJHDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12057571},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"7b63f4498c7142975580ddc283e9972801e64bed","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.2","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_0.13.0_1788410490587_0.5274584221780987","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@blackcatinformatics/purrdf","version":"1.0.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@1.0.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"e3d7cecf497714908ab2f3c9325f9125306e5905","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-1.0.0.tgz","fileCount":8,"integrity":"sha512-pzBbR/Xvrmoa31CHi92aOrBpuEdOxPqi4tD7bJM8QoaNPzS260k2Hu4Ezw+BOI5IUkMQ7Mo0VhbabiFWjzeWoQ==","signatures":[{"sig":"MEUCIAafzeQhelRGnH294L7l5MXCKX5/dh0Ql/nocDHj/Q0WAiEAt4kt2CV9FX4LIdLEOgH30hwRm863BVf3ItdjyEFPUy0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12057907},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"8a58cad5522a0e59444a98faed5c66ed5264fbbc","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.2","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_1.0.0_1788448133502_0.9897313419786096","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@blackcatinformatics/purrdf","version":"1.1.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@1.1.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"4381b4a6e18768cdbd404d46e73d4ea38cb6bbe4","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-1.1.0.tgz","fileCount":8,"integrity":"sha512-zGWqFuxWiv3HWFnS3I0dxfGMljZvnp60DuJhPGzOuPS13AYK1lwxg2yeehpyQUnY00AXBU40xiqjk3CWQvcWlQ==","signatures":[{"sig":"MEUCIETY6in5Rd6Ykk480IG75VWCP1ClzJ+FVyCuU9Ma92AdAiEAplavSa1I8XPfHxG9EM5TioUG6cX2cVcD9brJ3CdTrhg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12047583},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"051ff9cb266c3db62c492ee3b911424fa797be27","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.2","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_1.1.0_1788498080065_0.0375680624174306","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@blackcatinformatics/purrdf","version":"2.0.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@2.0.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"ad5e4150e85d25a99ebf1010b81562d6fc289c1e","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-2.0.0.tgz","fileCount":8,"integrity":"sha512-f/O/6TYG5YJtpBVFDzIbXQYXhsXvV1LCvDOhmzyu5ORwWf8BtAi7j/YKI20HRTVWW851c2xn2ww/cXXVaDsuHw==","signatures":[{"sig":"MEYCIQCrjpamS7ymjfFBsXgvRyN3Xl1ncZtV+EfpdQv63WCqgQIhAL6s2uM9lc4WFNzZE9ToxEKpRlD4I3xoCpL8paPHILkb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":13598787},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"86ade42292e1d2ee9610a2d8475f5e81792fb3d7","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.2","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_2.0.0_1789434927823_0.09796690252330698","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@blackcatinformatics/purrdf","version":"2.0.1","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@2.0.1","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"0219f0b74dc45ce7abe5754f5170640f80a9fdec","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-2.0.1.tgz","fileCount":8,"integrity":"sha512-ZOFZXaD5v+v8YbIidm3wnNg69G26rXH1rfnPApGVJevRe4pN6gH8pN3jLuyTP6hySxsSHax/0OR0fG6brYxR9g==","signatures":[{"sig":"MEYCIQCvYQZhNBE1P434dKi3u8LgfmVSRfzvcmV0y6VpuWmgFAIhAJhBEaOz8e3leRW34kv/wmeDu8AdKC9oL1N9ofdSxNUq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@2.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":13596929},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"eda878dfbfdbd01c6c491fe30a704967045dca4c","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.2","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_2.0.1_1789439052183_0.3903428497536088","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@blackcatinformatics/purrdf","version":"2.0.2","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0","_id":"@blackcatinformatics/purrdf@2.0.2","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"b686ee7221fc2facfcda52f6104d29d6f3bfc60a","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-2.0.2.tgz","fileCount":8,"integrity":"sha512-FYK5sNIwriU5mv3W3h2HcsJ6YecJp2iTp1wOajW4yWh0sJXao0TmICRym5TfMc65eeVE4IWuab+wRdueziBGdQ==","signatures":[{"sig":"MEYCIQDEvdwNDzyB0cGShesN3zDJuxZVsUq5bpee6jk80GR3xAIhAK2TECvE8JeaCDrOH6bJwNy3H3xqR8nOScHgqTGZGgRn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@2.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":13598251},"main":"./index.mjs","type":"module","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"}},"gitHead":"42d98a0e76a75dfa7232e525b6d362b054d663ea","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.0.2","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_2.0.2_1789448810477_0.2509742879274779","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@blackcatinformatics/purrdf","version":"3.0.0","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0 OR MulanPSL-2.0","_id":"@blackcatinformatics/purrdf@3.0.0","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"95dda12f28d9e593978f32ea6684292096882e22","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-3.0.0.tgz","fileCount":164,"integrity":"sha512-FGQ1kwPK/EeX3sz+6Gy63wtr0yWfmxgOn5GlHt/uE/Bm90nqc09QFInxqnwFmGGkxULJnu1VksGCqULE9EUeLg==","signatures":[{"sig":"MEYCIQCiD+htEkl+frUr3ZFwWMKKM5Z6Lh99rTglpWwc2T717QIhAKsoQgfP7DrsRhnhv62Lg60+eak8pyZslyCcmhopbIi3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIETUTh8kwMlsRhNx22nWrAxVzT+V0vRGELU4zU28r8EcAiEArQ6wLybT33lfv7Z5yEnbX6U+XHbqIyVxHPJsx2XgKTE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":19900300},"main":"./index.mjs","type":"module","_from":"file:/home/runner/work/purrdf/purrdf/crates/rdf-wasm/js/blackcatinformatics-purrdf-3.0.0.tgz","types":"./index.d.ts","module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"},"./cloudflare":{"types":"./cloudflare.d.ts","import":"./cloudflare.mjs"},"./purrdf_wasm_bg.wasm":"./pkg/purrdf_wasm_bg.wasm"},"scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"_resolved":"/home/runner/work/purrdf/purrdf/crates/rdf-wasm/js/blackcatinformatics-purrdf-3.0.0.tgz","_integrity":"sha512-FGQ1kwPK/EeX3sz+6Gy63wtr0yWfmxgOn5GlHt/uE/Bm90nqc09QFInxqnwFmGGkxULJnu1VksGCqULE9EUeLg==","repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.2.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"_nodeVersion":"24.21.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/purrdf_3.0.0_1790934816099_0.2782238953432612","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"_id":"@blackcatinformatics/purrdf@3.0.1","bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"dist":{"shasum":"8ade619250cb552319482cefc3badee6b193421d","tarball":"https://registry.npmjs.org/@blackcatinformatics/purrdf/-/purrdf-3.0.1.tgz","fileCount":164,"integrity":"sha512-i/z2eszJ4WhTa4qodbeHiv5BloqaAl6a7fX9ONtkG8dQotkYeHjuGx+k/PQKgy0sQd9vu2PxO5jRCzpaVvBV0Q==","signatures":[{"sig":"MEYCIQDD+gOWmZ6UxmoFgRsfIGAmEaUypIfBvmtyE7gD8VCt7wIhAJg8Z+9idG0S4+P+m/rFGQGSiuUGOUm7yVHVyOWXBlB4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCzYnwQIaA8a0sf/3U6BJ85NFvIMHnqHXpaKlWi48U2DAIgMempxuxGmVa0EKDfqiNtg5ko3fTmPYNEBzWTiYRgztM="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackcatinformatics%2fpurrdf@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20161151},"main":"./index.mjs","name":"@blackcatinformatics/purrdf","type":"module","_from":"file:/home/runner/work/purrdf/purrdf/crates/rdf-wasm/js/blackcatinformatics-purrdf-3.0.1.tgz","types":"./index.d.ts","author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"module":"./index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"},"./cloudflare":{"types":"./cloudflare.d.ts","import":"./cloudflare.mjs"},"./purrdf_wasm_bg.wasm":"./pkg/purrdf_wasm_bg.wasm"},"license":"MIT OR Apache-2.0 OR MulanPSL-2.0","scripts":{"test":"node --test tests/*.test.mjs","check":"npm run typecheck && npm test && npm run smoke:pack","typecheck":"tsc -p tsconfig.types.json","smoke:pack":"node tests/pack-smoke.mjs"},"version":"3.0.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"e959c5d5-9c7e-44a6-aa34-467b6bd116b8"}},"homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"_resolved":"/home/runner/work/purrdf/purrdf/crates/rdf-wasm/js/blackcatinformatics-purrdf-3.0.1.tgz","_integrity":"sha512-i/z2eszJ4WhTa4qodbeHiv5BloqaAl6a7fX9ONtkG8dQotkYeHjuGx+k/PQKgy0sQd9vu2PxO5jRCzpaVvBV0Q==","repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"_npmVersion":"12.2.0","description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","directories":{},"maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"_nodeVersion":"24.21.0","_hasShrinkwrap":false,"devDependencies":{"graphql":"16.14.0","typescript":"7.0.2"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/purrdf_3.0.1_1790984179851_0.02044647266814792"}}},"time":{"created":"2026-07-02T00:36:18.876Z","modified":"2026-10-02T23:36:20.443Z","0.1.3":"2026-07-02T00:36:19.251Z","0.1.4":"2026-07-02T00:44:04.168Z","0.1.5":"2026-07-02T04:15:37.346Z","0.2.0":"2026-07-02T06:04:18.426Z","0.2.1":"2026-07-02T15:46:23.072Z","0.3.0":"2026-07-05T06:36:07.560Z","0.3.1":"2026-07-05T09:29:58.729Z","0.3.2":"2026-07-05T19:00:14.002Z","0.3.3":"2026-07-05T22:16:22.579Z","0.4.0":"2026-07-07T09:42:15.861Z","0.4.3":"2026-07-10T23:08:51.866Z","0.5.0":"2026-07-12T07:28:31.697Z","0.6.0":"2026-07-14T00:27:34.681Z","0.7.0":"2026-07-17T08:06:50.912Z","0.8.0":"2026-07-20T09:24:18.645Z","0.8.1":"2026-07-21T04:45:12.023Z","0.8.3":"2026-07-23T22:31:30.422Z","0.8.5":"2026-07-26T13:13:24.084Z","0.9.0":"2026-07-28T17:53:43.192Z","0.10.0":"2026-07-31T09:38:00.061Z","0.11.0":"2026-08-02T07:10:07.724Z","0.12.0":"2026-08-02T21:21:57.598Z","0.13.0":"2026-09-03T04:41:30.822Z","1.0.0":"2026-09-03T15:08:53.727Z","1.1.0":"2026-09-04T05:01:20.273Z","2.0.0":"2026-09-15T01:15:28.014Z","2.0.1":"2026-09-15T02:24:12.410Z","2.0.2":"2026-09-15T05:06:50.704Z","3.0.0":"2026-10-02T09:53:36.327Z","3.0.1":"2026-10-02T23:36:20.054Z"},"bugs":{"url":"https://github.com/Blackcat-Informatics/purrdf/issues"},"author":{"name":"Blackcat Informatics® Inc.","email":"paudley@blackcatinformatics.ca"},"license":"MIT OR Apache-2.0 OR MulanPSL-2.0","homepage":"https://github.com/Blackcat-Informatics/purrdf/tree/main/crates/rdf-wasm","keywords":["rdf","rdf-1.2","rdf-star","rdfjs","wasm","turtle","n-quads"],"repository":{"url":"git+https://github.com/Blackcat-Informatics/purrdf.git","type":"git"},"description":"A wasm32, in-memory RDF 1.2 engine with an idiomatic RDF/JS (DataFactory/Dataset/Stream) API. Quoted-triple terms and directional literals included.","maintainers":[{"name":"paudley","email":"paudley@blackcat.ca"}],"readme":"<!--\nSPDX-FileCopyrightText: 2026 Blackcat Informatics® Inc. <paudley@blackcatinformatics.ca>\nSPDX-License-Identifier: MIT OR Apache-2.0 OR MulanPSL-2.0\n-->\n\n# @blackcatinformatics/purrdf\n\n**PurRDF** — an in-memory RDF 1.2 engine for JavaScript, compiled to\nWebAssembly from the [purrdf](https://github.com/Blackcat-Informatics/purrdf)\nRust workspace, with an idiomatic [RDF/JS](https://rdf.js.org/)\n(`DataFactory` / `DatasetCore` / `Stream`) API.\n\nIt is the same engine, byte-for-byte behavior, that ships as the `purrdf`\nRust crates, the `purrdf` PyPI package, and `libpurrdf` — PurRDF's rule is\n**one engine, one behavior, every language**.\n\n> **Try it live** — the [RDF-1.2 playground](https://blackcat-informatics.github.io/purrdf/playground/)\n> runs this package in your browser: parse, SPARQL, SHACL, serialize, and\n> canonicalize/compare RDF-1.2 graphs client-side, with no install.\n\n## Why this instead of an incumbent RDF/JS library?\n\nNo incumbent RDF/JS library carries the RDF 1.2 features:\n\n- **Quoted-triple terms** (RDF-star / RDF 1.2 triple terms), usable in the\n  object position;\n- **Base-direction literals** (`rdf:dirLangString`) — language *plus*\n  `ltr`/`rtl` direction;\n- Byte-deterministic serializers backed by W3C conformance corpora\n  (SPARQL 1.1, RDFC-1.0 canonicalization fixtures) in the parent workspace.\n\n## Install\n\n```sh\nnpm install @blackcatinformatics/purrdf\n```\n\nRuns in Node ≥ 18 and modern browsers (ESM, `web`-target wasm-bindgen).\n\nThe wasm artifact is built with WebAssembly SIMD (`+simd128`) for higher parse\nthroughput, so it requires a runtime with wasm SIMD support: every major browser\nsince ~2021 (Chrome/Edge 91+, Firefox 89+, Safari 16.4+) and Node ≥ 18.\n\nAsynchronous operations — jobs that suspend while the host answers a `SERVICE`\nor `LOAD`, and that yield to the event loop while they evaluate — run over\nWebAssembly JavaScript Promise Integration (JSPI): Chrome/Edge 137+, Firefox\n139+, Safari 27, Node ≥ 24.20 and Cloudflare Workers. On a runtime without JSPI\nthe synchronous API is unchanged, and the asynchronous methods refuse with one\nclear error before touching wasm.\n\n## Quickstart\n\n```js\nimport { ready, DataFactory, Dataset, QueryEngine } from \"@blackcatinformatics/purrdf\";\n\nawait ready(); // one-time async wasm instantiation\n\nconst f = new DataFactory();\n\n// A quoted triple, usable as a subject/object (RDF-star / RDF 1.2).\nconst quoted = f.quotedTriple(\n  f.namedNode(\"https://ex/alice\"),\n  f.namedNode(\"https://ex/knows\"),\n  f.namedNode(\"https://ex/bob\"),\n);\n\n// A base-direction literal (rdf:dirLangString).\nconst rtl = f.directionalLiteral(\"مرحبا\", \"ar\", \"rtl\");\n\nconst ds = new Dataset();\nds.add(f.quad(f.namedNode(\"https://ex/s\"), f.namedNode(\"https://ex/says\"), rtl));\nds.add(f.quad(f.namedNode(\"https://ex/stmt\"), f.namedNode(\"https://ex/asserts\"), quoted));\n\n// Quoted triples + directions survive a round-trip through N-Quads.\nconst nq = ds.serialize(\"nquads\");\nconst reparsed = Dataset.parse(nq, \"nquads\");\n\nconst engine = new QueryEngine();\nconst names = engine.select(\n  reparsed,\n  \"SELECT ?message WHERE { <https://ex/s> <https://ex/says> ?message }\",\n);\nconsole.log(names.rows.take(0)?.message.value);\n```\n\nConfigured JSON-LD/YAML-LD calls the same Rust context engine as native PurRDF:\n\n```js\nimport { CompiledJsonLdContext } from \"@blackcatinformatics/purrdf\";\n\nconst options = JSON.stringify({\n  version: 1,\n  mode: \"context\",\n  prefixes: { ex: \"https://ex/\" },\n});\nconst context = new CompiledJsonLdContext(options);\nconst jsonld = reparsed.serializeWithContext(\"jsonld\", context);\n```\n\n`serializeConfigured` handles one-shot expanded, context, registry-backed, or\nderived requests. Matching `QueryEngine.queryRawConfigured` and\n`queryRawWithContext` methods serialize CONSTRUCT/DESCRIBE graph results.\n\n## Graph, tabular, and research-object projection archives\n\nProjection and lift run entirely in memory through the native Rust engine. The\ncaller supplies strict profile-tagged JSON; PurRDF does not fabricate vocabulary,\nidentity, or resource limits.\n\n```js\nimport { Dataset, liftProjection, ready } from \"@blackcatinformatics/purrdf\";\n\nawait ready();\nconst config = JSON.stringify({\n  profile: \"lpg-csv\",\n  config: {\n    rdf_type: \"https://example.org/type\",\n    scope: { mode: \"all\" },\n    limits: {\n      max_artifacts: 16,\n      max_artifact_bytes: 1_000_000,\n      max_total_bytes: 4_000_000,\n      max_archive_bytes: 5_000_000,\n      max_term_depth: 16,\n    },\n    execution_limits: {\n      max_input_records: 1_000,\n      max_model_records: 1_000,\n      max_nodes: 1_000,\n      max_edges: 1_000,\n    },\n  },\n});\nconst dataset = Dataset.parse(\n  \"@prefix ex: <https://example.org/> . ex:alice ex:knows ex:bob .\",\n  \"turtle\",\n);\nconst projected = dataset.project(\"lpg-csv\", config);\nconst lifted = liftProjection(projected.archive, \"lpg-csv\", config);\nconst roundTrip = lifted.takeDataset();\nconsole.log(roundTrip?.size, JSON.parse(projected.lossLedgerJson));\n```\n\n`lpg-csv`, `neo4j-csv`, `open-cypher`, `graphml`, `csvw-exact`, `croissant-1.1`,\n`ro-crate-1.3`, `datacite-4.6`, `dcat-3`, and `frictionless-data-package-1` are\nbidirectional. `csvw-terms`, `okf-terms`, `obo-graphs`, `skos`, `dcat-rdf`, and\n`void` are write-only, loss-ledgered views and are excluded from the\n`LiftProfile` TypeScript union.\nResearch-object contexts, vocabularies, identities, and\nprofiles are mandatory caller configuration. Archives are canonical\ndeterministic USTAR bytes. Package/lift objects own wasm memory; call `free()`\nwhen finished, and remember that `takeDataset()` transfers its dataset exactly\nonce. A runnable Node example is\n[`projection-roundtrip.mjs`](https://github.com/Blackcat-Informatics/purrdf/blob/main/crates/rdf-wasm/js/examples/projection-roundtrip.mjs).\n\nFor native RDF dataset descriptions, parse the complete source dataset and pass\nthe same strict caller-owned JSON used by Rust and the other hosts:\n\n```js\nconst dataset = Dataset.parse(sourceTrig, \"trig\");\nconst description = dataset.project(\"void\", voidConfigJson);\nconst archive = description.archive;\ndescription.free();\ndataset.free();\n```\n\nThe `dcat-rdf` configuration selects mapped or bounded CONSTRUCT mode; the\n`void` configuration names exact graphs, every target role, dataset-prefix\nownership, and all limits. Complete examples are in\n`crates/rdf/tests/fixtures/dataset-description/`.\n\n## API surface\n\n- `ready(bytesOrUrl?)` — one-time async wasm instantiation, from bytes, a URL, or a\n  compiled `WebAssembly.Module` (what a Cloudflare Worker's `.wasm` import yields). There\n  is one instance per JavaScript realm; a poisoned one (see\n  [Stack regions and faults](#stack-regions-and-faults)) is never replaced.\n- `DataFactory` — `namedNode`, `blankNode`, `literal`, `typedLiteral`,\n  `directionalLiteral`, `variable`, `defaultGraph`, `quad`, `quotedTriple`,\n  `fromTerm`, `fromQuad`.\n- `Dataset` — `Dataset.parse(input, format, base?)`, `serialize(format)`,\n  `serializeWithLoss(format)`, `serializeConfigured(format, optionsJson)`,\n  `serializeWithContext(format, context)`,\n  `add` / `delete` / `has` / `match` / `quads` / `size`, iteration.\n  Formats: `turtle`, `ntriples`, `nquads`, `trig`, `rdfxml` (`serialize` also `jsonld`).\n- `Dataset.serializeWithLoss(format)` — the same document `serialize` returns plus the\n  realized loss of producing it (`statementRowsDropped`,\n  `directionalLiteralsDropped`, `namedGraphRowsDropped`). A single-graph target drops\n  every named graph and a star-incapable one drops the RDF 1.2 statement layer; these\n  counts are how many, partitioned so their sum is the total.\n- `Dataset.canonicalize()` / `Dataset.isomorphic(other)` — RDFC-1.0 canonical N-Quads\n  and RDF graph-identity (isomorphism under blank-node relabeling).\n- `Dataset.project(profile, configJson)` / `liftProjection(archive, profile,\n  configJson)` — canonical graph/tabular/research-object USTAR carriers with structured,\n  always-computed loss-ledger JSON.\n- `Dataset.visualModel(options?)` / `visualExport(options?)` /\n  `visualSvg(options?)` — the renderer-neutral RDF 1.2 model, complete semantic\n  scene and deterministic geometry, or self-contained SVG paired with that export.\n  Returned objects are structured-clone-safe and preserve triple-term identity,\n  assertion graphs, reifier/annotation graph context, nesting, and diagnostics.\n- `QueryEngine` — a reusable SPARQL execution context with a native plan cache,\n  typed `select` / `ask` / `construct` / `describe` helpers, atomic `update`,\n  and `queryRaw` serialization for SPARQL Results JSON/XML/CSV/TSV plus graph\n  formats. SELECT `rows` are a single-owner iterable; use `take(index)`,\n  `toArray()`, or iteration, and call `free()` when abandoning unconsumed rows.\n  `Dataset.query(...)` remains as the compatibility raw-string helper. With no\n  `format`, a graph result is Turtle — or TriG when it carries a named graph, since\n  Turtle has no `GRAPH` construct and would otherwise render a quad-template\n  `CONSTRUCT` as an empty document. Naming a single-graph syntax for such a result\n  throws, listing the graphs and the quad-capable alternatives, rather than returning\n  bytes that omit exactly what the query asked for.\n  Results names accept `json`, `srj`, `sparql-json`, `xml`, `sparql-xml`, `csv`,\n  `tsv`, and their media types (`application/sparql-results+json`,\n  `application/sparql-results+xml`, `text/csv`, `text/tab-separated-values`).\n  All format-taking raw query APIs ignore surrounding whitespace and ASCII case.\n- `QueryEngine.blankScope` — how a blank node's scope crosses to JS in the engine's typed\n  results: `\"keep\"` (the default) hands a scoped blank over as its scope envelope, so two\n  blank nodes that share a label in different scopes stay two nodes; `\"merge\"` drops the\n  scope, so they are one node (lossy by declaration). Any other value throws.\n  Kept scope labels are deterministic: inserting the returned terms into a new\n  dataset, serializing and parsing preserves the same blank identity, including\n  blank nodes inside quoted triple terms.\n- `QueryEngine.queryGoverned(dataset, sparql, options?)` /\n  `updateGoverned(dataset, sparql, options?)` — the same evaluator under caller-supplied\n  execution governors: `fuel`, `deadlineMs`, `maxAnswers`, `maxIntermediateCells`,\n  `maxScratchBytes`, `maxRemoteRequests`, and a `CancellationToken`. Every ceiling is\n  inclusive, and `0` is a valid ceiling that trips on the first charged unit of work.\n  Omitted resource caps use the engine's `METERED` baseline: every dimension is\n  accounted for without a reachable cap. Set `noCeiling: true` to remove resource\n  caps and accounting explicitly. It refuses any simultaneous resource cap;\n  `deadlineMs`, cancellation and asynchronous `signal` still work. `false` keeps\n  the metered baseline. This boolean is accepted by every governed twin, including\n  entailment and negotiated asynchronous queries; ungoverned calls refuse it.\n  **A trip is a returned outcome, never a throw**: read `isComplete`, then `result`, or\n  `tripped` with `partial` — where `partial.certainty` states what the rows in hand\n  certify (`\"certain\"` = a lower bound, safe to admit; `\"at-most\"` = an upper bound;\n  `\"unknown\"` = no rows at all, plus the operator that withheld them). Both paths carry\n  `evidence`, the per-dimension consumption and ceiling maps a caller sizes the next\n  budget from. A tripped UPDATE applies **nothing**. This is the ceiling a browser tab\n  needs: the evaluator runs on the UI thread, so an accidental cross product with no\n  deadline freezes the page.\n- `QueryEngine.queryAsync` … `updateGovernedAsync`, `Dataset.queryAsync` — the\n  Promise-returning twins, which take `resolveService` / `resolveLoad` handlers, a\n  `ServiceCatalog`, `localServices`, an `AbortSignal` and the yielding and stack options;\n  `hasAsyncQueries()` and `configureAsync(...)` describe and\n  configure the scheduler, and `SparqlProtocolRequest` reads a SPARQL 1.1 Protocol\n  request. See\n  [Asynchronous queries, federation and the Cloudflare adapter](#asynchronous-queries-federation-and-the-cloudflare-adapter).\n- `QueryEngine.explainQuery(dataset, sparql, options?)` / `governorDimensions()` — the\n  metered charge ledger a budget is sized from (join orders, plan estimates, per-node\n  cost) and the engine's dimension vocabulary, which keys every `evidence` map.\n  EXPLAIN evaluates the query to measure it, so `explainQueryAsync` is its\n  Promise-returning twin: it explains a `SERVICE` query over the host's answer, yields\n  while it measures, and stops on its `signal`.\n- `shaclValidateToSarif(shapesTtl, dataNt, shapesBase?)` /\n  `shaclEntail(shapesTtl, dataNt, shapesBase?)` — SHACL validation to a SARIF\n  2.1.0 report and SHACL-AF `sh:rule` entailment, returned as a\n  `ShaclEntailment` (`ntriples`, `diagnostics`; call `free()`). A shape whose\n  `sh:in` or `sh:xone` list is empty is a mandatory diagnostic every run reports,\n  beside the verdict and never among the results: the SARIF log carries each as a\n  `level: \"note\"` notification in `invocations[0].toolExecutionNotifications`,\n  and `ShaclEntailment.diagnostics`, `ShaclRulesInference.diagnostics` and\n  `ShaclNodeExprOutcome.diagnostics` carry `ShaclDiagnostic` values — `rule`\n  (`in-minListLength`, `xone-minListLength`) and `shape` as separate fields, the one\n  encoding every host shares. `shapesBase` is\n  the base the shapes document's relative IRI references resolve against; a\n  browser or Node host has no retrieval IRI of its own, so omit it and a\n  relative reference throws rather than being mis-parsed (`dataNt` needs no\n  counterpart — N-Triples admits no relative IRI by grammar). `Dataset.parse`\n  takes the same optional third argument. `shaclValidateToSarif` also takes\n  `conformanceDisallows?`, `importIris?`, `importDocuments?` and a trailing\n  `shapesGraph?`: the IRI SHACL-SPARQL sees the shapes graph under, as `purrdf\n  validate --shapes-graph` names it. `$shapesGraph` is pre-bound to it and `GRAPH\n  $shapesGraph { … }` reads the shapes graph (SHACL 1.0's pre-binding, which SHACL\n  1.2 removed); omitted, `$shapesGraph` is an ordinary variable. A relative IRI\n  resolves against `shapesBase`, and one with no base throws.\n  `shaclValidateChangesToSarif`, `shaclPackProduct` (which records it in the\n  product), `shaclLintShapes`, `shaclApplyRules` and `shaclEntail` take the same\n  `shapesGraph?`, right after the import table; on the two rules entry points a\n  `sh:SPARQLRule`'s `$shapesGraph` is pre-bound to it, and `shaclApplyRules` throws\n  when it is named beside `srl`, which has no shapes graph. After `shapesGraph?`, both\n  rules entry points take `maxTermGeneratingRounds?`, `maxGeneratedTerms?`,\n  `maxStoredFacts?` and `maxJoinSteps?` (each a `bigint`), contiguous and in that\n  order: the four rule-evaluation limits, with the same defaults, bounding an\n  entailment run the way they bound a rules run. A run past one throws naming the limit, the numbers and the argument\n  that raises it (`shaclEntail's maxStoredFacts`, …).\n  `shaclValidateToSarif` takes one more, `subClassOfInShapesGraph?`: SHACL 1.2\n  Core §6.3's parameter of that name. `true` reads the shapes graph's\n  `rdfs:subClassOf` triples, in addition to the data graph's, wherever SHACL type\n  decides class membership (`sh:targetClass`, implicit class targets, `sh:class`,\n  `sh:rootClass`, `shnex:instancesOf`); omitted or `false`, the specification's\n  default, the data graph alone.\n- `shaclValidateChangesToSarif(shapesTtl, dataNt, addedNt?, removedNt?, shapesBase?)`\n  — validates a CHANGE to `dataNt` rather than the whole graph: hand it the rows\n  joining and the rows leaving, and the engine re-validates only the focus nodes\n  that change can move. Returns a `ShaclChangeValidation`; read `bounded` before\n  the log, because it decides what the log MEANS. `true` and an empty log means\n  *this change introduced no violation*; `false` means the shapes graph reads\n  through SPARQL query text, no bounded footprint exists for it, the call fell\n  back to a FULL validation, and an empty log means *the graph conforms*. Call\n  `free()` when done.\n- SHACL evaluates SPARQL — `sh:SPARQLTarget` queries, SHACL-SPARQL constraints,\n  SHACL-AF node expressions and rules — so every SHACL entry that can evaluate SPARQL\n  has a Promise-returning twin: `shaclValidateToSarifAsync`,\n  `shaclValidateChangesToSarifAsync`, `shaclEntailAsync`, `shaclApplyRulesAsync`,\n  `shaclEvalNodeExprAsync` and the four `shaclProductValidateToSarif…Async`. Each takes\n  exactly its synchronous twin's arguments and then the host options, yields while it\n  validates and stops on its `signal`. SHACL-SPARQL admits no `SERVICE` in any query, so\n  a shapes graph with one is refused while it loads, on either lane. See\n  [Asynchronous queries, federation and the Cloudflare adapter](#asynchronous-queries-federation-and-the-cloudflare-adapter).\n- `shaclApplyRules(dataNt, shapesTtl?, srl?, shapesBase?, srlBase?, explain?,\n  importIris?, importDocuments?, shapesGraph?, maxTermGeneratingRounds?,\n  maxGeneratedTerms?, maxStoredFacts?, maxJoinSteps?)` —\n  runs exactly one rule source, the SHACL 1.2 rules of `shapesTtl` or the SPARQL 1.2\n  RL rule set `srl`, and returns a `ShaclRulesInference`: `inferred` is the\n  inference graph (the inferred triples only) as N-Triples, `proof` is the proof\n  of every inferred triple when `explain` is set, and `diagnostics` the shapes\n  graph's mandatory diagnostics as `ShaclDiagnostic` values (`rule`, `shape`). Two limits stop a rule set that\n  keeps inferring new terms. `maxTermGeneratingRounds` (a `bigint`) bounds the\n  evaluation rounds that infer a term the graph did not hold (default 16384), and\n  `maxGeneratedTerms` (a `bigint`) the terms inferred beyond the input's (default\n  `max(65536, 4 × N)` for `N` distinct input terms). A run past either throws\n  naming the limit, the numbers, the rules that inferred a new term last, and the\n  argument that raises it; a rule set that needs more states it here.\n  `maxStoredFacts` (a `bigint`) bounds the facts the evaluation store holds — the\n  data graph, a rule set's data and every inferred triple — and `maxJoinSteps` (a\n  `bigint`) the candidate solutions the rule bodies enumerate. Omitted, each is the\n  WebAssembly default: 131072 facts and 1048576 join steps, sized for one linear\n  memory (a native build's defaults are 4194304 and 1048576). A rule copying a\n  predicate over 70,000 triples holds 140,000 facts and is refused here naming\n  `maxStoredFacts`; stating `140000n` admits it. A run past either throws naming\n  the limit, the numbers and the argument.\n  `importIris` / `importDocuments` are the rule source's import table: the shapes\n  graph's `owl:imports` table (Turtle documents) beside `shapesTtl`, the rule set's\n  `IMPORTS` table (SPARQL 1.2 RL texts) beside `srl`, followed transitively. An\n  imported document's rules run. An import no entry supplies, and an entry the\n  import closure never names, throw. Call `free()` when done.\n- `shaclCheckRules(srl, srlBase?, importIris?, importDocuments?, level?)` — checks\n  the SPARQL 1.2 RL rule set `srl` WITHOUT evaluating it: the grammar, the `IMPORTS`\n  closure resolved from `importIris` / `importDocuments` exactly as `shaclApplyRules`\n  resolves it, well-formedness and stratification, with no data graph read and no\n  rule run. `level` is `\"syntax\"`, `\"well-formed\"` or `\"stratified\"` (the default,\n  every static check `shaclApplyRules` applies before it runs), each including the\n  ones before it. Returns a `ShaclRulesCheck` — `level`, `rules`, `dataTriples`,\n  `imported`, `versions`, `strata` (`undefined` below `\"stratified\"`) and the\n  one-line `summary` every host reports; a refused rule set throws naming the\n  stage. Call `free()` when done.\n- `shaclEvalNodeExpr(shapesTtl, dataNt, expr, focus, scope?, shapesBase?,\n  importIris?, importDocuments?, exprAt?, exprVia?, exprTurtle?)` — evaluates\n  one node expression of the shapes graph against a focus node, with `scope` as\n  `\"NAME=TERM\"` strings, and returns a `ShaclNodeExprOutcome`: `outputs`, the\n  output nodes as N-Triples terms in sequence order, and `diagnostics`, the shapes\n  graph's mandatory diagnostics as `ShaclDiagnostic` values (`rule`, `shape`). The expression is named one way: `expr` is an IRI or\n  `\"_:label\"`; or `expr` is `undefined` and `exprAt` plus `exprVia` walk from a\n  named node to an anonymous expression, each step reaching exactly one value;\n  or `exprTurtle` gives the expression inline as Turtle, whose one root blank\n  node is the expression.\n- `shaclLintShapes(shapesTtl, shapesBase?, importIris?, importDocuments?, shapesGraph?)` — certifies a shapes graph: the\n  loader's verdict, every result of validating it against the W3C\n  `shacl-shacl.ttl`, which implementation every function call binds to, and\n  every validator declared for a built-in component (superseded by the native\n  implementation, never run). Returns a `ShaclLintReport` with `clean`, `findings`, `loadError` and the\n  deterministic `report` text. Call `free()` when done.\n- `entailMaterialize(document, regime, program, importIris, importDocuments, premiseIris, maxStoredFacts?, maxJoinSteps?)` —\n  SPARQL entailment-**regime**\n  materialization over all SEVEN regimes (`\"simple\"` / `\"rdf\"` / `\"rdfs\"` /\n  `\"owl-rl\"` / `\"d\"` / `\"owl-direct\"` / `\"rif\"` — none is refused), returning\n  `{ nquads, report }`: the canonical N-Quads closure and a byte-stable reasoning\n  report. Unlike `shaclEntail` it takes no shapes graph — it closes the document\n  under the regime's own specification rule table. The report is never optional:\n  it names which rules fired, which specification rules did **not**, which\n  constructs were left at a boundary, the evaluation budget and the calculus's\n  contract hash, so \"OWL-RL entailment\" can never be claimed without saying how\n  much of OWL-RL actually ran. `maxStoredFacts` and `maxJoinSteps` (`bigint`s) are\n  the evaluation limits of the `rdf`, `rdfs`, `owl-rl` and `d` lanes — omitted, the\n  WebAssembly defaults of 131072 facts and 1048576 join steps. A run past either\n  throws naming the limit and the argument; the report's contract hash names the\n  calculus under the limits in force, so it differs from a native build's report\n  unless the native defaults (4194304 and 1048576) are stated. `importIris` /\n  `importDocuments` / `premiseIris` are the document's `owl:imports` table (`[]`,\n  `[]`, `[]` imports nothing): the closure is taken over the document merged with\n  every imported N-Quads document, and an import the table does not resolve throws\n  by name rather than closing a smaller ontology. `entailConsistency(document,\n  importIris, importDocuments, premiseIris, stepCap, workCap)` and\n  `queryEntailmentGoverned`'s `importIris`/`importDocuments`/`premiseIris` options\n  take the same table.\n- `entailRules(regime)` / `entailImplementedRules(regime)` — the rule table the\n  specification *defines* the regime by, and the subset this build fires. The\n  difference is the measurable gap, and is exactly the report's `missing` lines.\n- `entailCheckGoldenVectors()` — run the project's committed cross-host golden\n  vector artifact through the wasm you actually loaded and throw on the first\n  byte that differs from the reference (native Rust) implementation.\n- `Sink`, `datasetToStream`, `streamToDataset` — the async RDF/JS\n  Stream/Sink primitives over the synchronous engine surface.\n- SPARQL evaluation over the in-memory dataset (no server required).\n\nFull typings ship in `index.d.ts`.\n\n```js\nconst { svg, export: graph } = reparsed.visualSvg({\n  mode: \"compact\",\n  vocabulary: [{ prefix: \"ex\", namespace: \"https://ex/\" }],\n  svg: { title: \"RDF 1.2 graph\", embedMetadata: true },\n});\n\nconsole.log(graph.model.statements, graph.model.relations);\ndocument.querySelector(\"#graph\").innerHTML = svg;\n```\n\nCompact mode keeps ordinary asserted RDF as directed predicate-labelled edges and\npromotes statements only when they need identity. Incidence mode exposes exact\nsubject/predicate/object ports. Table mode scales statement inspection without\ndiscarding the same underlying model.\n\n## Asynchronous queries, federation and the Cloudflare adapter\n\nThe synchronous methods are the offline lane: they install no `SERVICE` or `LOAD`\nsource, so a `SERVICE` or `LOAD` fails by name. `SERVICE SILENT` is the join identity\nthere, since an invocation that cannot succeed is what `SILENT` answers that way\n(SPARQL 1.1 Federated Query §3.2); a governed method's evidence lists it under\n`silenced`. Every evaluating method\nalso has a Promise-returning twin that takes the host's handlers for those two\nclauses:\n\n- on `QueryEngine`: `queryAsync`, `selectAsync`, `askAsync`, `constructAsync`,\n  `describeAsync`, `queryRawAsync`, `queryRawBytesAsync`, `queryRawWithContextAsync`,\n  `queryGovernedAsync`, `queryEntailmentGovernedAsync`, `updateAsync`,\n  `updateGovernedAsync` and `explainQueryAsync`, plus `queryGovernedNegotiatedAsync` (a\n  governed query answered as a document in the format negotiated from an HTTP `Accept`\n  header, which has no synchronous twin);\n- on `Dataset`: `queryAsync`;\n- the SHACL functions: `shaclValidateToSarifAsync`, `shaclValidateChangesToSarifAsync`,\n  `shaclEntailAsync`, `shaclApplyRulesAsync`, `shaclEvalNodeExprAsync`,\n  `shaclProductValidateToSarifAsync`,\n  `shaclProductValidateToSarifRebuildAsync`, `shaclProductValidateToSarifExpectingAsync`\n  and `shaclProductValidateToSarifRebuildExpectingAsync`.\n\nEach twin runs the same evaluator as its synchronous twin, over a snapshot of the\ndataset taken when the call starts, and resolves to exactly the shape the synchronous\ntwin returns. A SHACL twin takes its synchronous twin's arguments, then the host options\n(and no ceiling, as no synchronous SHACL entry takes one; a deadline is a `signal`).\nThe `signal` is polled between focus nodes as well as inside queries, so a validation\nwith no SPARQL in it still yields and stops. SHACL-SPARQL admits no `SERVICE` in any\nquery, a `sh:SPARQLTarget`'s included: a shapes graph with one is refused while it\nloads, on either lane. A refused product rejects with the same `ShaclProductRefusal` the\nsynchronous twin throws, and an `owl:imports` closure not in hand with the same\n`ShaclImportError`. It runs as a *job*: the job suspends while the host answers a `SERVICE`\nor `LOAD`, and it gives the event loop back at regular intervals while it evaluates.\nThe host does the I/O and owns its policy. PurRDF keeps the parsing, the evaluation,\nthe joins, the `SILENT` semantics and the result encoding.\n\n### Hosts\n\nThe twins run over WebAssembly JavaScript Promise Integration (JSPI), which is on by\ndefault in Chrome and Edge 137+, Firefox 139+, Safari 27, Node 24.20+ and Cloudflare\nWorkers (workerd). `hasAsyncQueries()` reports whether the current engine has it. Where\nit does not, every twin rejects with one error naming what is missing before it touches\nwasm, and the synchronous API works as before.\n\n### Errors carry their code\n\nEvery error the package throws for a failure it classifies carries the stable code it\nis reported under as `error.code`, on the synchronous and the asynchronous lane alike:\nan engine diagnostic's own (`native-sparql-query-parse`, `native-sparql-load-denied`,\n…), a job's stop or fault (`native-sparql-cancelled`, `native-sparql-deadline`,\n`native-sparql-not-acceptable`, `native-sparql-update-in-flight`,\n`native-sparql-host-fault`), or one of the package's own refusals\n(`purrdf-wasm-options`, `purrdf-wasm-usage`, …). Switch on `code`, never on the\nmessage. A cancellation with a `signal.reason` rejects with that reason itself.\n\n### Answering `SERVICE`: `resolveService`\n\n`resolveService(request, ctx)` is called once for each distinct `SERVICE` request a job\nissues, and may return its answer or a Promise of it. `request` is the SPARQL 1.1\nProtocol POST to send:\n\n- `endpoint`: the service IRI;\n- `queryText`: the forwarded query;\n- `contentType`: `application/sparql-query`;\n- `accept`: `application/sparql-results+json`;\n- `userAgent`;\n- `timeoutMs`: the catalog profile's timeout, or the default (30 s);\n- `headers`: the catalog profile's headers and then its credential header, as\n  `[name, value]` pairs in sending order. Append each pair and never merge repeated\n  names. Without a catalog the list is empty;\n- `cacheable`: whether a shared cache may answer the request or keep its answer —\n  `false` when it carries a credential, whose answer belongs to the credential's holder.\n\n`ctx` carries four fields:\n\n- `signal`: an `AbortSignal` that fires once no job waits on the call any more: every\n  job waiting on it was cancelled, or reached its request's timeout or its deadline,\n  whichever comes first (the job decides that instant, not the handler). For a call that\n  several jobs share (see [Concurrency](#concurrency)), it fires only once every one of\n  them has stopped waiting.\n- `remainingDeadlineMs`: the time left before the deadline, when the job has one.\n- `silent`: whether the clause was written `SERVICE SILENT`.\n- `maxIntermediateCells`: the query's cell ceiling, when one is set.\n\nThe answer is one of:\n\n- SPARQL Results JSON as a `Uint8Array`, an `ArrayBuffer` or a string;\n- a `Response`, whose 2xx body is read as SPARQL Results JSON. Any other status is a\n  transport failure;\n- `{ kind: \"transport\", message }` when the endpoint could not be reached or read;\n- `{ kind: \"denied\", message }` when the host's policy refuses the request;\n- `{ kind: \"fault\", message }` when the handler itself could not answer.\n\nEach failure fails the query: `native-sparql-service-failed`,\n`native-sparql-service-host-denied` and `native-sparql-host-fault`. Under\n`SERVICE SILENT` each contributes the join identity instead, so the surrounding\npattern's own solutions come back unextended, and the job's `evidence.async.silenced`\nrecords the endpoint and the failure's `kind`.\n\nA handler that throws, rejects, or returns anything else has failed the invocation it\nwas answering, and is delivered exactly as `{ kind: \"fault\" }`: the invocation's own\nfailure, never the job's. The error a query fails with carries the handler's words,\nfor the host that wrote the handler. `ctx.silent` is for information only: an empty answer is not the handler's to\ninvent, and the failure it reports decides what `SILENT` does with it.\n\nThis handler sends each request with `fetch`:\n\n```js resolve-service-recipe\nimport { ready, Dataset, QueryEngine } from \"@blackcatinformatics/purrdf\";\n\nawait ready();\n\n// One SERVICE request, sent as a SPARQL 1.1 Protocol POST.\nasync function resolveService(request, { signal }) {\n  try {\n    // A Response is an answer as it stands: a 2xx body is read as SPARQL Results\n    // JSON, and any other status is a transport failure.\n    return await fetch(request.endpoint, {\n      method: \"POST\",\n      headers: [\n        [\"Content-Type\", request.contentType], // application/sparql-query\n        [\"Accept\", request.accept], // application/sparql-results+json\n        ...request.headers, // the catalog profile's headers, in sending order\n      ],\n      body: request.queryText,\n      // Fires at the request's timeout, the job's deadline or its cancellation.\n      signal,\n    });\n  } catch (error) {\n    // A network error is the endpoint's failure; a throw would be reported as this\n    // handler's own fault instead.\n    return { kind: \"transport\", message: String(error) };\n  }\n}\n\nconst engine = new QueryEngine();\nconst dataset = Dataset.parse(\n  \"<https://example.org/a> <https://example.org/p> <https://example.org/o1> .\\n\",\n  \"nquads\",\n);\nconst { rows } = await engine.selectAsync(\n  dataset,\n  `SELECT ?s ?x WHERE {\n     ?s <https://example.org/p> ?o\n     SERVICE <https://remote.example.org/sparql> { ?o <https://example.org/q> ?x }\n   }`,\n  { resolveService },\n);\nfor (const row of rows) console.log(row.s.value, row.x.value);\n```\n\nA `ServiceCatalog` passed as `catalog` authorizes every request — every `SERVICE`, and\nevery `LOAD` source and redirect — before the handler is called. It denies by default,\nholds one profile per endpoint and an optional fallback, and a profile grants the\ncapabilities `query`, `network` and `credentials` and may add headers, a credential\nheader, a `User-Agent` and a `timeoutMs` (at most 2 147 483 647, the longest delay a\nJavaScript timer honours): the job abandons a request still unanswered at that timeout,\nas a transport failure, or at its deadline when that falls first. A denied request fails\nthe query, and under `SERVICE SILENT` is the join identity recorded as `\"denied\"`. The\ncatalog is copied, so it stays usable for later operations.\n`localServices: { [endpoint]: dataset }` answers the\nnamed endpoints in process from a snapshot of a `Dataset`, without calling the handler.\n\nIn a browser, the remote endpoint's CORS policy governs whether `fetch` can read its\nanswer: a cross-origin endpoint that does not allow the page's origin surfaces as a\nnetwork error, which the handler above reports as a transport failure. Write\n`SERVICE SILENT` where an endpoint may be unreachable and its rows are optional.\n\n### Variable endpoints: `SERVICE ?e`\n\nA `SERVICE ?e { … }` answers every row with the `?e` of the endpoint that produced it.\n`?e` must be bound in every solution that reaches the clause, and where it is bound\ndecides how many requests the clause makes. It is bound by one of:\n\n- a pattern earlier in the same group — a triple pattern, `VALUES`, `BIND`, or an\n  explicit `LATERAL { SERVICE ?e { … } }`. The clause is evaluated once per solution,\n  with that solution's bindings substituted into the forwarded query: one request per\n  solution, so two solutions that name the same IRI send it two requests, which differ\n  in the bindings they carry. (A job asks `resolveService` only once for a request it\n  repeats exactly; see [Concurrency](#concurrency).)\n- the left side of the `OPTIONAL`, `MINUS` or group join whose right side holds the\n  clause: `?g ex:endpoint ?e OPTIONAL { SERVICE ?e { … } }`,\n  `?g ex:endpoint ?e MINUS { SERVICE ?e { … } }`,\n  `{ ?g ex:endpoint ?e } { SERVICE ?e { … } }`. The right side is still evaluated on its\n  own, as SPARQL evaluates it; the left side supplies only the list of endpoints to ask,\n  each distinct IRI is asked once, and a row from any other endpoint could match no left\n  row anyway. A left row whose\n  endpoint answers nothing keeps its own bindings under `OPTIONAL` and is not removed\n  under `MINUS`;\n- the other side of the group join that holds the clause: `{ SERVICE ?e { … } ?g\n  ex:endpoint ?e }`, `{ SERVICE ?e { … } VALUES ?e { … } }`. A join is commutative, so\n  these answer the rows, and ask the endpoints, of `{ ?g ex:endpoint ?e } { SERVICE ?e\n  { … } }`. `OPTIONAL` and `MINUS` are not: `{ SERVICE ?e { … } OPTIONAL { ?g ex:endpoint\n  ?e } }` is refused, since the optional side need not bind `?e`.\n\nUnder `SERVICE SILENT` an endpoint that fails is the join identity for its own left rows\nalone. Under a group join or `OPTIONAL` it contributes one row binding only `?e`, so its\nleft rows survive unextended and no other endpoint's rows change. Under `MINUS` the left\nrows are subtracted one endpoint at a time, and a failing endpoint subtracts nothing from\nits own rows while the others' answers still remove theirs. An `?e` bound to a literal or\na blank node names no endpoint: an error before any request is made, and under `SILENT`\nthe join identity for that value's rows.\n\nA clause for which no solution binds `?e` is refused, `SILENT` or not: no invocation is\nmade for `SILENT` to absorb, and an empty answer would look complete when nothing was\nasked. That covers an `?e` bound nowhere, bound in only some of\nthe left side's solutions, or bound only outside a further `OPTIONAL` or `MINUS` right\nside, an `EXISTS`, a `LIMIT`/`OFFSET`, an aggregate not grouped by `?e`, or a sub-`SELECT`\nthat does not project `?e` between the binding and the clause. The error names the\nrewrite: bind `?e` before the clause, as in `?s ex:endpoint ?e . SERVICE ?e { … }` or\n`?s ex:endpoint ?e LATERAL { SERVICE ?e { … } }`.\n\nSPARQL 1.1 Federated Query leaves `SERVICE` with a variable informative (§4). This is the\nreading that section describes — one invocation per binding, the results combined by\nunion — with the endpoints to try taken from the evaluation order, which it allows.\n\n### Answering `LOAD`: `resolveLoad`\n\n`resolveLoad(request, { signal })` answers one hop of a `LOAD`. `request` is the `GET` to\nsend: `{ kind: \"load\", iri, accept, userAgent, headers, timeoutMs }`, where `accept`\nnames every RDF syntax a `LOAD` parses and `userAgent`, `headers` and `timeoutMs` are\nthe source's catalog profile's (no headers and the default timeout without a catalog).\nWith a catalog, the job authorizes the IRI before the handler is called: a source the\ncatalog does not grant `network` fails with `native-sparql-load-denied`, and nothing is\nfetched. `signal` fires at the job's cancellation, the request's timeout or the job's\ndeadline. The answer is any of:\n\n- `{ bytes, mediaType, base? }` or `{ text, mediaType, base? }`. `mediaType` is a media\n  type or any format name `Dataset.parse` accepts, and `base` defaults to the IRI;\n- a `Response`, whose `Content-Type` names the media type;\n- a `Dataset`;\n- `{ kind: \"redirect\", location }`: the job resolves `location` against the IRI,\n  authorizes it against the catalog as a source of its own, and asks for it as a fresh\n  hop with that source's own profile — up to five hops; a sixth redirect fails the\n  `LOAD` as a transport failure;\n- `{ kind: \"transport\" }` when the document could not be fetched or read;\n- `{ kind: \"denied\" }` when the host's policy refuses the request\n  (`native-sparql-load-host-denied`, apart from the catalog's own denial);\n- `{ kind: \"fault\" }` when the handler itself could not answer\n  (`native-sparql-load-fault`).\n\nEach failure fails the request. `LOAD SILENT` succeeds over any of them — and over a\nmissing `resolveLoad` — with nothing loaded (SPARQL 1.1 Update §3.1.4), and the job's\n`evidence.async.silenced` records the source's `iri` and the failure's `kind`.\n\nA handler that throws or rejects, and a bare string or bytes (which carry no media\ntype), are the handler's fault, delivered as `{ kind: \"fault\" }`. A document that does\nnot parse — or names a media type no parser reads — is the `LOAD`'s decode failure\n(`native-sparql-load-decode`).\n\n### Yielding, cancellation and deadlines\n\nA job counts the evaluator's governor polls and gives the event loop one turn every\n`yieldEveryPolls` polls: 65 536 by default, and `0` yields at every poll. The count, not\nthe clock, decides when to yield. Every yield is one `setTimeout(…, 0)` task, on every\nhost — Node, a browser, a Cloudflare Worker alike. A timer task queues behind the tasks\nalready waiting, so other requests, timers and the fetch responses other jobs await all\nrun between a job's turns. `globalThis.setTimeout` and `globalThis.clearTimeout`\nare bound once, when the module loads; a host without either has no asynchronous lane, and `hasAsyncQueries()` says so. Only\nevaluation yields (an entailment closure included). Freezing the dataset before the job and serializing\nthe result after are linear passes that run to completion. `evidence.async` reports\nwhat each phase cost (`freezeMs`, `evaluateMs`, `serializeMs`).\n\n`signal: AbortSignal` cancels a job. The job observes it at the next yield or host\neffect, and the twin rejects with `signal.reason` (an `AbortError` when the signal has no\nreason). A governed twin reports the cancellation as a tripped governor instead. Passing\n`cancel` (a `CancellationToken`) to a twin is a `TypeError` that names `signal`. On the\ngoverned twins, `deadlineMs` includes the time spent waiting for the handlers as well as\nevaluation. The job checks it at every yield and every host effect, and every effect\nnames the instant it is abandoned at if still unanswered — its request's timeout or the\ndeadline, whichever falls first — so an effect still pending at the deadline trips it.\n\nOn Cloudflare Workers, `Date.now()` does not advance during CPU-bound execution; it moves\nonly across I/O. A synchronous `deadlineMs` therefore cannot trip during CPU-bound work\nthere. The asynchronous lane observes the deadline at every yield and every effect, which\nis where the clock moves.\n\n### Concurrency\n\nJobs interleave at every yield and effect, and synchronous calls may run between them. A\nquery reads the snapshot taken when it started, so a later mutation never shows up in a\nrunning job. One asynchronous update of a dataset may be in flight at a time: beginning\nanother while it runs rejects at once with the code `native-sparql-update-in-flight`, and\napplies and asks nothing — await the first, then send the next. Each update reads a\nsnapshot and is applied only if the dataset was not mutated while it ran; otherwise it\nrejects with the same code and applies nothing. `dataset.id` identifies a dataset within the\nwasm instance, and `dataset.generation` counts the mutations it has seen.\nBoth properties are exact JavaScript `bigint` values. Compare generations with\n`0n`, `1n`, and other bigint literals; use `id.toString()` when storing an identity\nin JSON. Converting either property to `number` can lose precision above `2^53`.\n`configureAsync({ maxConcurrentJobs })` bounds how many jobs may be in flight (16 by\ndefault); a twin started beyond the bound rejects.\n\nA job asks `resolveService` once for each distinct `SERVICE` request. When it repeats a\nrequest with the same `ctx.silent` and `ctx.maxIntermediateCells`, it reuses the first\nanswer when that answer was rows; a failure or a fault is never reused, so a repeat asks\nagain. Another job, even one issuing the same request later, asks again.\n\nConcurrent jobs share one call only when the handler would see an equivalent context.\nA job joins a call already in flight through the same `resolveService` when all of these\nhold:\n\n- the request is identical: endpoint, query text, `Accept`, `Content-Type`,\n  `User-Agent`, timeout and headers;\n- `ctx.silent` is the same;\n- `ctx.maxIntermediateCells` is the same, or unset for both;\n- the job's deadline falls no later than the instant the call was told about. That\n  instant is when the call started plus the `remainingDeadlineMs` it received. A job\n  without a deadline joins only a call that was given none.\n\nAny other job gets a call of its own, with its own `ctx`. A handler that bounds its work\nby `ctx.remainingDeadlineMs` therefore never gives up on a joined job sooner than it\nwould on that job's own call. Every waiting job receives the shared answer as it stands:\nrows, a `transport` or `denied` failure, or a fault. The call's `ctx.signal` belongs to\nthe shared call. When one waiting job is cancelled or passes its deadline, only that job\nstops waiting. The signal fires once every waiting job has stopped. `LOAD` requests are\nnever shared or reused.\n\n### Stack regions and faults\n\nEach job evaluates on its own stack region, exactly as large as the module's own shadow\nstack — the stack the synchronous lane runs on (1 MiB in the shipped module). No option\nsizes it. `evidence.async.stackHighWaterBytes` reports the deepest the job went below the\nregion's top. The two stacks are the same size, so the two lanes evaluate requests to\nnearly the same depth — each spends a little stack on its own frames, so the deepest\nrequest each evaluates can differ by a few levels — and a request too deep for either\nfails with the evaluator's own typed stack refusal,\n`native-sparql-evaluation-stack-exhausted`, which names no lane-specific remedy. The\nconstruct its message names is the one whose frame found the stack low. The evaluator checks the stack left above the\nregion's base at every recursive step and refuses while 64 KiB remain. Parsing keeps a\nrequest's nesting in linear memory and spends neither stack on it.\n\nA region is the size of the shadow stack in linear memory only. Every wasm call also takes frames\non the JavaScript engine's own call stack, which no wasm code can read, and V8 (Node.js,\nChromium, Cloudflare Workers) gives a job's suspendable stack the same size as the\nsynchronous lane's: the smaller of its `--stack-size` and\n`--wasm-stack-switching-stack-size` flags, 984 KiB by default, set for the whole process.\nPurRDF keeps a fixed 640 KiB budget of it for evaluating a request, so on both lanes a\nrequest's graph patterns nest at most 284 levels deep, and a plan taller than the\nevaluator's host-stack bounds is refused before it runs. Past either is\n`native-sparql-host-stack-exhausted`, which names the budget; no lane raises it, and the\nremedy is a request nested less deeply. Either way the job fails and the instance stays\nusable. A canary word at each region's base is read before every suspension and when\nthe run returns: a job whose frames ran past the base fails with a fault naming its\nregion, and never suspends or commits. If a job traps, the instance's state can no longer\nbe trusted: the trap leaves anything the job was mutating half-changed. The instance is\nthen *poisoned*, and it cannot be used again. Every in-flight job rejects with the poison error, and so does every later\nasynchronous twin, `hasAsyncQueries()`, `configureAsync()` and `ready()` — because there\nis one instance per JavaScript realm. Every later synchronous call into the instance — a\nconstructor, a static, a free function, a method or getter of an object created before\nthe trap — traps at the instance's own entry with a `WebAssembly.RuntimeError`: the\npackage build links a poison gate into the wasm module itself, so no JavaScript stands\nbetween a caller and the refusal. `free()` and `[Symbol.dispose]()` are the exception:\nthey return without entering the instance and release nothing, because the instance's\nmemory is abandoned whole and a finalizer has no caller to report an error to. Only a\nfresh realm (a new page, Worker isolate or process) can load the package again.\n\nA trap poisons the instance the same way when it comes out of a synchronous call. The\ntrapping call throws the trap itself, the engine's `WebAssembly.RuntimeError`; the entry\nit unwound never returned through the gate, so the next entry finds the instance\npoisoned and traps, and so does every entry after it. A typed PurRDF error, a parse\nerror for instance, is thrown after the call has returned and never poisons anything. A\nJavaScript exception thrown through wasm frames — a sink callback that throws, or V8\nreporting its own native stack exhausted as a `RangeError` inside a call — unwinds the\ninstance the same way and poisons it too; the same exception thrown by the caller's own\ncode, outside any call into the instance, does not. Out of PurRDF's own code, the traps\nleft are memory exhaustion, which aborts without running the panic hook, and a Rust\npanic; PurRDF's parser and evaluator refuse nesting before either stack runs out (the\nhost-stack budget above keeps V8's).\n\nA Rust panic poisons the instance too, in an asynchronous job or in a synchronous call\nalike. A panic aborts on wasm32 and leaves whatever it interrupted half-changed, so the\npanic hook PurRDF installs when the instance starts poisons the instance, naming the\npanic's location and message, before the panic's trap unwinds. The call that panicked\nthrows that trap; every asynchronous entry afterwards rejects with the poison error,\nwhich names the panic rather than the trap that followed it. PurRDF is written not to\npanic on any input, so a poison that names a panic is a PurRDF defect to report.\n\n### The Cloudflare adapter\n\n`@blackcatinformatics/purrdf/cloudflare` builds a SPARQL 1.1 Protocol endpoint from these\npieces:\n\n- `createFetchServiceResolver({ fetch?, bindings?, cache?, cacheTtlSeconds? })`\n  returns a `resolveService` that POSTs each request with `fetch`, or through the\n  service binding registered for the endpoint's origin, always with `redirect: \"manual\"`\n  and bounded by `ctx.signal` (the request's catalog timeout or the query's deadline). A\n  network error, an abandoned request or a non-2xx status is reported as\n  `{ kind: \"transport\" }`, never thrown — and so is a 3xx (or a browser's opaque-redirect\n  response): it is never followed, so the profile's headers and credential (an\n  `X-Api-Key`, a `Cookie`, …) can never reach an origin the catalog did not authorize.\n  With `cache` and `cacheTtlSeconds` it reuses the answer of every request the job marks\n  `cacheable` through the Cache API; a request that carries a credential is never read\n  from or written to the shared cache, and goes to the endpoint instead. A `cache.match`\n  or `cache.put` that fails (e.g. \"No Cache was configured\" from a workerd runtime\n  started without a cache) is that request's transport failure: under `SERVICE SILENT`\n  the join identity, recorded, and without it the query's failure. Pass no `cache` where\n  none is configured.\n- `createFetchLoadResolver({ fetch?, bindings? })` returns a `resolveLoad` that GETs\n  each hop the job asks for — with the `Accept`, `User-Agent`, headers and credential of\n  that hop's own catalog profile, which the job authorized first — also with\n  `redirect: \"manual\"`, and answers a redirect `{ kind: \"redirect\", location }` for the\n  job to resolve, re-authorize and ask for as a fresh hop. A redirect whose `Location`\n  is withheld (an opaque one) or missing is a `{ kind: \"transport\" }` failure.\n- `handleSparqlRequest(request, options)` answers one protocol request (`GET ?query=`,\n  or a `POST` of `application/sparql-query`, `application/sparql-update` or a form) with\n  a `Response`, by the status table below. A partial answer is never sent with a `200`.\n  Every error body is `application/problem+json` (RFC 9457) with a stable `code`, and\n  every evaluated response carries `Server-Timing` from the job's evidence. The `cors`\n  option answers preflights and adds `Access-Control-Allow-Origin`; without it no CORS\n  header is sent. `governors.deadlineMs` is required. `maxRequestBytes` (1 MiB by\n  default: a SPARQL query or update's text is a program, not a payload, and 1 MiB\n  comfortably covers even a large one) bounds the request body — a `Content-Length`\n  above it is refused before anything is read, and a missing or understated one is still\n  caught by counting bytes as the body streams in, so a lying header never buys a larger\n  body than an honest one would. An error's `detail` is the engine's own words only when\n  the failure is the query's — a refusal to evaluate it as written, its evaluation, a\n  tripped governor: a SPARQL client is owed the reason its request failed. A `403` or\n  `502` gets a fixed `detail` for its code instead, because the engine's message would\n  echo the catalog's policy or a resolver's or remote's own words. A fault of this\n  endpoint's own — no resolver reaching a named endpoint or source, a `resolveLoad`\n  answer that is not one, `resolveService`/`resolveLoad` throwing or rejecting, a\n  rejection no engine code classifies, any other exception this adapter did not\n  otherwise classify — never puts its own message or stack in the response: it gets a\n  fixed `detail` and a fresh `correlationId`, while the real error goes to exactly one\n  place, `onInternalError(error, { correlationId, request })` (one\n  `console.error(error, correlationId)` line by default), so an operator can always join\n  what the client saw to what actually broke. A `resolveService`/`resolveLoad` that\n  throws under `SERVICE SILENT` or `LOAD SILENT` is reported there too, under its\n  correlation id, while the response is the clause's own answer — the join identity, or\n  nothing loaded — with the invocation recorded on the job's evidence as a silenced\n  `\"fault\"`.\n\n| Status | `code` | When |\n|---|---|---|\n| `200` | — | a query answered, with the negotiated document |\n| `204` | — | an update applied |\n| `400` | the protocol refusal's name | a malformed request, or dataset parameters applied to an operation that does not parse |\n| `400` | `native-sparql-query-parse`, `native-sparql-update-parse` | the operation does not parse; `detail` is the parser's message |\n| `400` | `native-sparql-unsupported`, `native-sparql-custom-function`, `native-sparql-quoted-triple-term-variable`, `native-sparql-host-stack-exhausted` | the engine refuses to evaluate the request as written (a `SERVICE ?e` no solution names an endpoint for, an unregistered function, nesting past the host-stack budget); `detail` is the engine's message |\n| `403` | `native-sparql-service-denied` | the catalog withholds a capability from a `SERVICE` endpoint the query names; no endpoint was contacted |\n| `403` | `native-sparql-service-host-denied` | `resolveService` refused the request by its own policy (`{ kind: \"denied\" }`); no endpoint was contacted |\n| `403` | `native-sparql-load-denied` | the catalog does not authorize a `LOAD` source, or a location it redirected to; nothing was fetched |\n| `403` | `native-sparql-load-host-denied` | `resolveLoad` refused the source by its own policy (`{ kind: \"denied\" }`) |\n| `405` | the protocol refusal's name | a method the protocol does not bind |\n| `406` | `NotAcceptable` | no acceptable format can carry the result |\n| `409` | `native-sparql-update-in-flight` | another update of the dataset is in flight, or the dataset was mutated while this one ran; nothing was applied |\n| `413` | `ContentTooLarge` | the body exceeds `maxRequestBytes` |\n| `415` | the protocol refusal's name | a `Content-Type` the protocol does not define |\n| `422` | the governor's label | a deterministic ceiling stopped the request |\n| `500` | the engine's diagnostic code (`native-sparql-query-eval`, `native-sparql-evaluation-stack-exhausted`, …) | the query's evaluation failed; `detail` is the engine's message |\n| `500` | `native-sparql-service-unconfigured`, `native-sparql-load-no-resolver` | no resolver reaches a named endpoint or source; with a `correlationId` |\n| `500` | `InternalError` | a host-supplied resolver threw, rejected or answered with something that is not an answer, an exception no code classifies, or any other unexpected exception; with a `correlationId` |\n| `502` | `native-sparql-service-failed` | a `SERVICE` endpoint was contacted and gave no usable answer: a network error, the resolver's timeout, an HTTP error status, a redirect, an undecodable body |\n| `502` | `native-sparql-load-failed` | a `LOAD` source could not be fetched: a network error, its timeout, an HTTP error status, more than five redirects |\n| `502` | `native-sparql-load-decode` | a `LOAD` source was fetched and could not be parsed |\n| `503` | the governor's label, or `cancelled` | the deadline or a cancellation stopped the request (no `Retry-After`: the same request would stop again) |\n\nA complete Worker:\n\n```js worker-recipe\nimport wasm from \"@blackcatinformatics/purrdf/purrdf_wasm_bg.wasm\";\nimport { ready, Dataset, QueryEngine, ServiceCatalog } from \"@blackcatinformatics/purrdf\";\nimport { createFetchServiceResolver, handleSparqlRequest } from \"@blackcatinformatics/purrdf/cloudflare\";\n\nawait ready(wasm);\nconst engine = new QueryEngine();\nconst dataset = Dataset.parse(\n  \"<https://example.org/a> <https://example.org/p> <https://example.org/o1> .\\n\",\n  \"nquads\",\n);\nconst catalog = new ServiceCatalog();\ncatalog.addService(\n  \"https://remote.example.org/sparql\",\n  JSON.stringify({ capabilities: [\"query\", \"network\"], timeoutMs: 5_000 }),\n);\n\nexport default {\n  fetch(request, env) {\n    const resolveService = createFetchServiceResolver({\n      bindings: { \"https://remote.example.org\": env.REMOTE },\n      cache: caches.default,\n      cacheTtlSeconds: 300,\n    });\n    return handleSparqlRequest(request, {\n      engine,\n      dataset,\n      catalog,\n      resolveService,\n      cors: { origins: \"*\" },\n      governors: { deadlineMs: 10_000, maxRemoteRequests: 40 },\n    });\n  },\n};\n```\n\nWorkers limits how many subrequests one invocation may make. `maxRemoteRequests` is the\nexact control for that limit. Every `SERVICE` request and every `LOAD` is charged against\nit before it reaches the handler, including one the cache then answers, so a request\nnever makes more subrequests than the ceiling. Set it to the subrequests you allow one\nquery. A `SERVICE ?e` bound by a pattern earlier in its group is charged once per\nsolution that reaches it, not once per endpoint (see\n[Variable endpoints](#variable-endpoints-service-e)), so size the ceiling to those\nsolutions. The Cache API does nothing on `workers.dev` hostnames, so caching is effectively\noff there; on a Worker served from a custom domain it works. A runtime started without a\ncache configured (a locally run workerd, for example) rejects `cache.match` and\n`cache.put` with \"No Cache was configured\", which fails every request that consults the\ncache: configure no `cache` there.\n\n## Scope\n\nIn-memory only, by design: no persistent store and no network I/O inside the\nwasm module. The synchronous methods install no `SERVICE` or `LOAD` source, so\nthere a remote `SERVICE` or `LOAD` fails explicitly, even when it is written `SILENT`:\n`SILENT` tolerates an endpoint or document that fails, and none was reached.\nThe asynchronous twins reach remote endpoints only through the handlers the host\npasses them (`resolveService`, `resolveLoad`), or through the Cloudflare adapter's\n`fetch`-based handlers. For the container transport (GTS), native APIs, and the\nrest of the toolkit, see the\n[main repository](https://github.com/Blackcat-Informatics/purrdf).\n\n## Conformance and host integration\n\nThe package's frozen lexical replay tests verify escape prefixes and every UCHAR\nscalar through Turtle literals, JSON string bodies and every\nUTF-16 code unit/surrogate pair through JSON-LD literals, and the unreserved\npercent-encoding corpus through SPARQL `ENCODE_FOR_URI`, including every Unicode\nplane digest. The capability inventory accounts for every frozen lexical file.\nThe package exposes no primitive for byte search,\nJSON Pointer tokens, Unicode normalization/combining classes or the other percent\nlaws; their primitive corpora run in the Rust lexical conformance suite.\nJavaScript host imports are supplied by the generated wasm-bindgen glue:\n`Reflect.get` comes from the shared binding host module and `Date.now` from the\nshared evaluator host module. The package root and Worker adapter both use that\nglue. Throwing option getters become typed refusals, and deadline tests exercise\nthe imported clock.\n\nJSON record options reject repeated members and arrays where objects are required.\nVisualization records report `visualization options: <reason> at <JSON pointer>`;\nSERVICE profile records report `service profile: <reason> at <JSON pointer>`.\nNested pointers identify the exact record member; a root refusal uses the empty\npointer and omits the `at` suffix. Header pairs remain ordered arrays and may\nrepeat names deliberately.\n\n## Supply chain\n\nPublished from GitHub Actions via npm trusted publishing with sigstore\nprovenance, a GitHub build-provenance attestation, and an SPDX SBOM per\nrelease.\n\n## License\n\n[MIT OR Apache-2.0 OR MulanPSL-2.0](https://github.com/Blackcat-Informatics/purrdf/blob/main/LICENSING.md),\n© 2026 Blackcat Informatics® Inc.\n","readmeFilename":"README.md"}