{"_id":"@appthreat/sqlite3","_rev":"20-9d4b3edbc54ae2f829a9536a9d68c230","name":"@appthreat/sqlite3","dist-tags":{"latest":"9.1.0"},"versions":{"6.0.0":{"name":"@appthreat/sqlite3","version":"6.0.0","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@6.0.0","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"41cf466342ed61250ab0023b8b39c92a64cc6d28","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-6.0.0.tgz","fileCount":25,"integrity":"sha512-LoFXSVOQ0IcNcARzLmF/NKuJ/bCLsIV9eYYAB7GXIatByadh/hpo0NQ1+hJovqZjiUTCw1AlCNYDiaHG3OLZLg==","signatures":[{"sig":"MEQCIENyF0jMQDrglwyRU4QujWCNSViKftdtOqQN5ygeb8QZAiA1L3+s3cYwdvgSbR4vf4QRX/lS/VFMQsDBUcwKs1zeSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@6.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11184455},"main":"./lib/sqlite3","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"83450bd2a4a5cd8358b11dd6a751d7ab05eecf1d","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"10.8.2","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"20.19.2","dependencies":{"bindings":"^1.5.0","node-addon-api":"^8.3.1","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"11.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_6.0.0_1748640625121_0.0610311723144259","host":"s3://npm-registry-packages-npm-production"}},"6.0.2":{"name":"@appthreat/sqlite3","version":"6.0.2","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@6.0.2","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"3a053265b8af523debdfe435d8d1446b8b16a7ce","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-6.0.2.tgz","fileCount":25,"integrity":"sha512-Xe1segAwSm3+QaFTB2dFIjOEt/GIVC3/OVetUwqKQm4NmnqE+qWX5c7C67ZYFx7dsw+vJ6QCq9/0Zjbjq+TFdQ==","signatures":[{"sig":"MEYCIQCF3vepKJk6MxUID5SosZpXZJs9SklY20qeSUAv3VQhugIhAK2rkwUFfMyib6WXIQAzdB/kSBwsJ0aQDD8lWn5uYwzj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@6.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11184455},"main":"./lib/sqlite3","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"826d2c7e332eede384607cebeda0cd51276cb832","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"10.8.2","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"20.19.1","dependencies":{"bindings":"^1.5.0","node-addon-api":"^8.3.1","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"11.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_6.0.2_1748641192405_0.960095748885134","host":"s3://npm-registry-packages-npm-production"}},"6.0.3":{"name":"@appthreat/sqlite3","version":"6.0.3","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@6.0.3","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"f44bbaf034546d5fb9cde0b6248cd9ac7727347f","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-6.0.3.tgz","fileCount":25,"integrity":"sha512-7tHZoxELI7cVp3iTqYyyIFalorbdianmbTqBQf6S+i5Kw3Lj/POEkeQX2727Tpv2Rkt09UhSx37p8KbWepnouQ==","signatures":[{"sig":"MEYCIQDrLDJYY6tWJJ/JLDbw4w5pEBVAMM6Z6R/ZHvVuzPTXpgIhAOrq8CXUdRU2BV1D6XaT8SU5ZA9nkv+qO6PSFY9tI+Nt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@6.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11184455},"main":"./lib/sqlite3","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"42c0311222e2958ccf5278a4f4e97a53eb4bdd71","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.3.0","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.1.0","dependencies":{"bindings":"^1.5.0","node-addon-api":"^8.3.1","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"11.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_6.0.3_1748647109441_0.8693780510709317","host":"s3://npm-registry-packages-npm-production"}},"6.0.4":{"name":"@appthreat/sqlite3","version":"6.0.4","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@6.0.4","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"f1c66c1a30e24a0f7b9315849cf80b0cecf0d9a7","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-6.0.4.tgz","fileCount":25,"integrity":"sha512-l6s/OkX5wwnH5hV4yUDsYoEgwZLzEGYBxCCpd2e2j9b96uHPepbkFc2hKf9juCcko7jdI93zowbTOmP7MOxgqw==","signatures":[{"sig":"MEUCIF/Z9WcSP+iXMOq8OseOw9LGulszjfOQqt73BwhwyUn4AiEA68bBBq1u2vkkqNgcU8FHSKyLYlNbHKneaWslyZjGZkU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@6.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11184455},"main":"./lib/sqlite3","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"a229cd9bd0497f8f36ee819c1fee3174888a7c38","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.3.0","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.1.0","dependencies":{"bindings":"^1.5.0","node-addon-api":"^8.3.1","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"11.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_6.0.4_1748663982134_0.7030117214301239","host":"s3://npm-registry-packages-npm-production"}},"6.0.5":{"name":"@appthreat/sqlite3","version":"6.0.5","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@6.0.5","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"c5e43ea1a9175cb21dc541103ff2252f57d19fa8","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-6.0.5.tgz","fileCount":25,"integrity":"sha512-zPimZ82ms4xgCgk0cMVDE8jsDxvS+rO48W5wegzejjbG/Yd8mOObRyqv7D/OkIpSpU2cPVJa3wXg53BveHeHmw==","signatures":[{"sig":"MEYCIQCC576KuKCaw8YTWN/2ozwKWA0P461NnSkjBsLaMaunugIhAJ5edhLWPIebkOFSIanckU452D/49S8JC2IM7J52tCE/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@6.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11184455},"main":"./lib/sqlite3","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"6e158b7e4c0b902c3228041ffee06b8cfe55c04d","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.3.0","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.1.0","dependencies":{"bindings":"^1.5.0","node-addon-api":"^8.3.1","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"11.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_6.0.5_1749041734711_0.35739514987178067","host":"s3://npm-registry-packages-npm-production"}},"6.0.6":{"name":"@appthreat/sqlite3","version":"6.0.6","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@6.0.6","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"76dcfbdc4211560c9b0e95c2e4e16e4c40ebecaa","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-6.0.6.tgz","fileCount":25,"integrity":"sha512-0nJUe+lLET/Y0bY8j/PXLtozC0DqFBtau3uDXkPugH50jZyd4zd3s7RhR3oDYo0xZEVixcZOqJz+15jbRxmdCg==","signatures":[{"sig":"MEUCIGYpqsgDkLhr78/uz1SZ2eiTEgwrCe5ucMK4YytN4x0CAiEAjpAI9ie26iBdXK1f//5FdAtbbySyYiYhJGYqF0r6ZGI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@6.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11185620},"main":"./lib/sqlite3","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"a003b72517a5457bd53744285051f9684b684464","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.3.0","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.1.0","dependencies":{"bindings":"^1.5.0","node-addon-api":"^8.3.1","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"11.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_6.0.6_1749248678540_0.09309454304020304","host":"s3://npm-registry-packages-npm-production"}},"6.0.7":{"name":"@appthreat/sqlite3","version":"6.0.7","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@6.0.7","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"96c87410d2aeb254d8c4e6d7f47961e6267da567","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-6.0.7.tgz","fileCount":25,"integrity":"sha512-e00AbENW05FKbqpDQGJAKs/C2jYkJj1DFTqiX7yuHG/K1V8wiMp5l8Ef/V8pLSNnPbsNaZY1odQN6mtA3jpREQ==","signatures":[{"sig":"MEYCIQDO1yG/zjfj9LY925n32wBEW93vLxRpZutwpIbxe14B9gIhAIWbq1QRoMIZzHQsy0OUc9VaRTRn99dbNWKI+qTjjQDm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@6.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11187663},"main":"./lib/sqlite3","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"55107620076960d254204182ea134e2c8f105f28","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","actor":{"name":"prabhus","type":"user","email":"cloud@appthreat.com"},"email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.4.2","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.3.0","dependencies":{"bindings":"^1.5.0","node-addon-api":"^8.4.0","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"11.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_6.0.7_1751577486481_0.691876704056767","host":"s3://npm-registry-packages-npm-production"}},"6.0.8":{"name":"@appthreat/sqlite3","version":"6.0.8","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@6.0.8","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"570775e75c1fb0ad6e1862f0d9bac9d8d04c6668","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-6.0.8.tgz","fileCount":25,"integrity":"sha512-IBLYA3D8UgHGWBsrokqaEWrSwYRxBRVdjQfFA7YRhAeVA7eMkYAKbAfF/LPZUYSSdWUBpy4CWpXYBP3BZ5xXxg==","signatures":[{"sig":"MEQCICqAvc+NE2Zf1x5U5h3ZOQrCYFGK5HI2H7/+8f+mWhlFAiA2XvFJYjR+AtGPdmF0O0eIDTaE/KPT+8mPWVm1b3ReQg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@6.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11188212},"main":"./lib/sqlite3","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"878b04945b9f02c4e4f4a31df201ee410d560aef","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.4.2","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.4.1","dependencies":{"bindings":"^1.5.0","node-addon-api":"^8.4.0","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"11.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_6.0.8_1753114579546_0.9153109147404661","host":"s3://npm-registry-packages-npm-production"}},"6.0.9":{"name":"@appthreat/sqlite3","version":"6.0.9","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@6.0.9","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"062374f2bae97123588f91caa6669569d6307898","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-6.0.9.tgz","fileCount":25,"integrity":"sha512-Aim5tAIusHm2zZVhqedZwl1MGiSMaWhJ9Ev9ctBuv82fJv/gmE0FhHY/tv/ikoMTNGWlaClAgJayfPLJxvkQ7Q==","signatures":[{"sig":"MEUCIQCC81on9bPLX9OOxKlcoM+Vd3GAlvfrwe4nNROF9ZwOgQIgROwoHLjLO8DI47G3ZFX5ruA1B2zKFiD3h11qbDzN+e8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@6.0.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11189167},"main":"./lib/sqlite3","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"e5993c37d5be7f0ae0bcf03167d9cee438eca920","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.4.2","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.4.1","dependencies":{"bindings":"^1.5.0","node-addon-api":"^8.5.0","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"11.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_6.0.9_1753980489493_0.3054559655086069","host":"s3://npm-registry-packages-npm-production"}},"7.0.1":{"name":"@appthreat/sqlite3","version":"7.0.1","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@7.0.1","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"c83d888ea0fdec84ad6414d088b286cda396ff1f","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-7.0.1.tgz","fileCount":26,"integrity":"sha512-6g0unju2BJMfKkGjoIXFyxWGeW4QrGVwzK0LL3jAzqTfJ3PrYeiz5PmwBdrdlBjE2IqMehuKrKgRShwQ5nEP4g==","signatures":[{"sig":"MEYCIQDiENI7o2QvapcLeuWI6OATYNV41DznG+pVmeFAfoWeXQIhAN08GEw90iQuxS5YlQlNh+O+MRZ9ibWsTLtbgSeLI5bH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@7.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11194977},"main":"./lib/sqlite3","type":"module","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"b1f472c51369750f0910089e6d592bc76fd9e0fb","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.5.1","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.7.0","dependencies":{"node-addon-api":"^8.5.0","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"11.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_7.0.1_1757488368727_0.3314632722145061","host":"s3://npm-registry-packages-npm-production"}},"7.0.2":{"name":"@appthreat/sqlite3","version":"7.0.2","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@7.0.2","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"e608fcdd76bc451abd01e3702ab15e1d190cac05","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-7.0.2.tgz","fileCount":26,"integrity":"sha512-AMsplY4Z/whvQfcML8bucKtVzSb2KUygvG3rQ0Qn0WjheL8j+cmfA4n0c4jACs5GaEbm25ElnXGlR7afi5ceYg==","signatures":[{"sig":"MEUCIQCJAJWFtbq8v/TdrGdJ4QT+c1YS3c7LqRCbfgvTYtgdVgIgDuZzHeyHISk0YArE9ZJGvD99+oBD18WqaN4Ys4KsLzI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@7.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11308975},"main":"./lib/sqlite3","type":"module","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"062bd31d3bbf63361e645ad94f78a860041cae87","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"prabhus","email":"cloud@appthreat.com"},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.6.2","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.11.1","dependencies":{"node-addon-api":"^8.5.0","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.5.0","eslint":"9.27.0","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"11.x"},"optionalDependencies":{"node-gyp":"12.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_7.0.2_1763556969023_0.49766677888538413","host":"s3://npm-registry-packages-npm-production"}},"7.0.3":{"name":"@appthreat/sqlite3","version":"7.0.3","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@7.0.3","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"b9830282cc99b5b411fb101ffffa50fcf865c3dd","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-7.0.3.tgz","fileCount":26,"integrity":"sha512-pJcqUz0FfpJP7yGLcCvlqm9mQuHFPF2xh8Af1B9Z9hr0dBxEJ8MPYrO9Nqst+TZFEskMyPE+x4KVgFoXc+OQgg==","signatures":[{"sig":"MEYCIQCNppNOaKltylodpAX+MHFZ28zE4jWQDsG8+blGIxesNgIhAIkQkb4RbaU510KgXzfhrCrpfb2Uok4OWUv60sFf/dar","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@7.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11312562},"main":"./lib/sqlite3.js","type":"module","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"d83d1c06323247fbe12f757f923f54abde2efc31","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ecad64d-f33a-4274-bc23-657574484642"}},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.6.2","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.13.0","dependencies":{"node-addon-api":"^8.5.0","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.7.5","eslint":"9.39.2","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"12.x"},"optionalDependencies":{"node-gyp":"12.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_7.0.3_1769292541039_0.6107214050109653","host":"s3://npm-registry-packages-npm-production"}},"7.0.4":{"name":"@appthreat/sqlite3","version":"7.0.4","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@7.0.4","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"contributors":[{"name":"Daniel Lockyer","email":"hi@daniellockyer.com"},{"name":"Konstantin Käfer","email":"mail@kkaefer.com"},{"name":"Dane Springmeyer","email":"dane@mapbox.com"},{"name":"Will White","email":"will@mapbox.com"},{"name":"Orlando Vazquez","email":"ovazquez@gmail.com"},{"name":"Artem Kustikov","email":"kustikoff@gmail.com"},{"name":"Eric Fredricksen","email":"efredricksen@gmail.com"},{"name":"John Wright","email":"mrjjwright@gmail.com"},{"name":"Ryan Dahl","email":"ry@tinyclouds.org"},{"name":"Tom MacWright","email":"tom@mapbox.com"},{"name":"Carter Thaxton","email":"carter.thaxton@gmail.com"},{"name":"Audrius Kažukauskas","email":"audrius@neutrino.lt"},{"name":"Johannes Schauer","email":"josch@pyneo.org"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"AJ ONeal","email":"coolaj86@gmail.com"},{"name":"Mithgol"},{"name":"Ben Noordhuis","email":"ben@strongloop.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"ee698ba405bcb09a49aa2d3a966bf918b06652b5","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-7.0.4.tgz","fileCount":26,"integrity":"sha512-Y0TTKOkIcwZoFVzSZtHuva25rt96q7dCZNownjfIw0+AGNGO/EtWkLgesGTqfZe3i45HsVXBDB/Ci2zCT+TcxQ==","signatures":[{"sig":"MEYCIQC+hPP/LLBeSiewNDnKJBkq5aMsMIhmHPfZfNUKLlRqmgIhAI5CDFKAq8gRLwJ2nLyo1UTxxM0czAfzzrt66Eqh50cB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@7.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11482807},"main":"./lib/sqlite3.js","type":"module","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"ab7b4137e366079c1f311a2c42762ca57aa8bcbb","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","upload":"prebuild --verbose --prerelease","install":"prebuild-install -r napi || node-gyp rebuild","rebuild":"node-gyp rebuild","prebuild":"prebuild --runtime napi --all --verbose"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ecad64d-f33a-4274-bc23-657574484642"}},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.9.0","description":"Asynchronous, non-blocking SQLite3 bindings. Forked from TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.14.0","dependencies":{"node-addon-api":"^8.5.0","prebuild-install":"^7.1.3"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.7.5","eslint":"9.39.2","prebuild":"^13.0.1"},"peerDependencies":{"node-gyp":"12.x"},"optionalDependencies":{"node-gyp":"12.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_7.0.4_1773094142062_0.2826705527582143","host":"s3://npm-registry-packages-npm-production"}},"8.0.0":{"name":"@appthreat/sqlite3","version":"8.0.0","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@8.0.0","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"9ee1b599e63e4d518cee23c94047ab1558caa3a5","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-8.0.0.tgz","fileCount":33,"integrity":"sha512-Ifqn0A06NSSoci/9Olk9GV1Xl06tWdhdnb87u6lObpYW+todWeBvHdrQ5Mc22m34upCLBdz1ngIMP8SNnfB7DA==","signatures":[{"sig":"MEUCIQDh08cTCEhkYGl14z/3vFZTqZzyAZnN7tuxf663J7pjFgIgekYAD1LrKasRZV9ixnXmM6HiZd6SQ5MDf29FKyrMAvU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@8.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":27854848},"main":"./lib/sqlite3.js","type":"module","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"304edc15ac6245c42ef4862caf046b7d7038f6ff","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","install":"node-gyp-build","rebuild":"node-gyp rebuild","prebuild":"prebuildify --napi --strip"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ecad64d-f33a-4274-bc23-657574484642"}},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.9.0","description":"Asynchronous, non-blocking SQLite3 bindings. Modern rewrite of TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.14.0","dependencies":{"node-addon-api":"^8.6.0","node-gyp-build":"^4.8.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.7.5","eslint":"9.39.2","prebuildify":"^6.0.1"},"peerDependencies":{"node-gyp":"12.x"},"optionalDependencies":{"node-gyp":"12.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_8.0.0_1773103085847_0.1445679961012638","host":"s3://npm-registry-packages-npm-production"}},"8.0.1":{"name":"@appthreat/sqlite3","version":"8.0.1","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@8.0.1","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"174dc69844b70873d069bf0200be41d2ae343550","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-8.0.1.tgz","fileCount":33,"integrity":"sha512-vniyX1KlUNAFVUCvfOrCidJfKox9E2nMd4O2qXu9BtD4XfcPGfqaLPlZMiKtXyoRHqFGqTLtNE1mejONqMhucg==","signatures":[{"sig":"MEUCIQDJ//yfM6/UMbqSLnA1Wddd4DLZ8bVQRKwdSCGUW8J7qgIgGT07qmfoqaHivj+sQgo+vqKIDLn730xb77zXmvJTSnE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@8.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":27723824},"main":"./lib/sqlite3.js","type":"module","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"274bb45938be4a3d2fb12869c0bf287f0f4ee63f","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","install":"node-gyp-build","rebuild":"node-gyp rebuild","prebuild":"prebuildify --napi --strip"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ecad64d-f33a-4274-bc23-657574484642"}},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.9.0","description":"Asynchronous, non-blocking SQLite3 bindings. Modern rewrite of TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.14.0","dependencies":{"node-addon-api":"^8.6.0","node-gyp-build":"^4.8.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.7.5","eslint":"9.39.2","prebuildify":"^6.0.1"},"peerDependencies":{"node-gyp":"12.x"},"optionalDependencies":{"node-gyp":"12.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_8.0.1_1773136094948_0.8350915291930996","host":"s3://npm-registry-packages-npm-production"}},"8.0.2":{"name":"@appthreat/sqlite3","version":"8.0.2","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@8.0.2","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"baadfeb932dd562fb1fd01724da3ed3cd3ce27b1","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-8.0.2.tgz","fileCount":33,"integrity":"sha512-UJprK5HxuRSLW/9GcEWlPDQmRy1e5UQsA51dDcFywAZihAS0EYpmWmVaU1iV2k7mCliBkgBK4kjhxxsOly54PA==","signatures":[{"sig":"MEUCIFik9Ev0eVh/zTsBnli7Tsi1Xxi6/w8WGJ6SAEQXWgYoAiEA95GT1vNmbdLdc4R70TFSyVsczmjzYAndfZuNJH9yQlo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@8.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":27811157},"main":"./lib/sqlite3.js","type":"module","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[9,10]},"engines":{"node":">=20"},"gitHead":"91dc09433c5c9a1ba7dea7d39819466e89b1f62c","scripts":{"test":"node test/support/createdb.js && mocha -R spec --timeout 480000","install":"node-gyp-build","rebuild":"node-gyp rebuild","prebuild":"prebuildify --napi --strip"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ecad64d-f33a-4274-bc23-657574484642"}},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.11.0","description":"Asynchronous, non-blocking SQLite3 bindings. Modern rewrite of TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.14.1","dependencies":{"node-addon-api":"^8.7.0","node-gyp-build":"^4.8.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"11.7.5","eslint":"9.39.2","prebuildify":"^6.0.1"},"peerDependencies":{"node-gyp":"12.x"},"optionalDependencies":{"node-gyp":"12.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_8.0.2_1775780075941_0.9423129735654538","host":"s3://npm-registry-packages-npm-production"}},"9.0.0":{"name":"@appthreat/sqlite3","version":"9.0.0","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@9.0.0","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"tsd":{"directory":"types"},"dist":{"shasum":"3ed3de79e0ff9b126b99c28c19aff1fd185372cc","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-9.0.0.tgz","fileCount":50,"integrity":"sha512-6QzXVEw8hq7tt1yBOQ7U0N3vTHiDV0+IDNbdp0EbZrXIaW6unHFI5wROgnwKzprFa7m/cwIMuSKV5Lcf4N6+zA==","signatures":[{"sig":"MEQCIH5sQoVCn8/M4mPIxqlmVdzhcdHneVWT1p3SdKHHQprUAiAUjHpdoQyJjSj2cZNrrOchyAdlZJ4fVU7Nszk4IlsvvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@9.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":32658708},"main":"./lib/sqlite3.js","type":"module","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[10]},"engines":{"node":">=24","pnpm":">=11","electron":">=35"},"gitHead":"397d2d2ca20d078eac24cbec894b52d7896c6d0d","scripts":{"lint":"biome check --write","test":"node test/support/createdb.js && node tools/check-no-only.js && node tools/run-tests.mjs","bench":"node --expose-gc bench/index.js","install":"node-gyp-build","rebuild":"node-gyp rebuild","prebuild":"prebuildify --napi --strip","gen-types":"node tools/gen-types.js","lint:check":"biome check","lint:jsdoc":"node contrib/check-jsdoc.js","test:types":"tsd && tsc --noEmit -p tsconfig.check.json","lint:errors":"biome check --diagnostic-level=error","test:matrix":"node tools/test-matrix.mjs","bench:update":"node --expose-gc bench/index.js --write-baseline","bench:compare":"node --expose-gc bench/index.js --compare --baseline bench/baseline.json","test:electron":"node test/support/createdb.js && node tools/check-no-only.js && node test/electron/run.mjs suite && node test/electron/run.mjs main","install:frozen":"pnpm install --config.strict-dep-builds=true --frozen-lockfile --package-import-method copy","test:electron:asar":"node test/electron/asar.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ecad64d-f33a-4274-bc23-657574484642"}},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.17.0","description":"Asynchronous, non-blocking SQLite3 bindings. Modern rewrite of TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.19.0","dependencies":{"node-addon-api":"^8.9.2","node-gyp-build":"^4.8.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.21.0","devDependencies":{"tsd":"^0.33.0","semver":"^7.8.5","electron":"43.4.1","typescript":"~5.9.3","@types/node":"^24.13.3","prebuildify":"^6.0.1","@biomejs/biome":"2.5.10","@electron/packager":"20.3.0"},"peerDependencies":{"node-gyp":"13.x"},"optionalDependencies":{"node-gyp":"13.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_9.0.0_1788004440538_0.5671452499724177","host":"s3://npm-registry-packages-npm-production"}},"9.0.1":{"name":"@appthreat/sqlite3","version":"9.0.1","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@9.0.1","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"a3ee8c266a537bd1864958520b086fcf1066a2a4","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-9.0.1.tgz","fileCount":50,"integrity":"sha512-PsnxS/xD7dtrOw4G9nPMXKgR0PpqIr5mfHUWElNYzLmYysWXZFHcCDqGC3szdyFJu0SMKz+SnUnWv9fHOkDM2w==","signatures":[{"sig":"MEUCIQC+Uy9CmxaWRJaYpAQoD0l5Kxj4gSGPwrRcFCQ/n5+PEQIgVi8PXEIYKd7eK43ioKEU2oKaqUjg/XgI5JdjTx1tdKo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@9.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":32660354},"main":"./lib/sqlite3.js","type":"module","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[10]},"engines":{"node":">=24","pnpm":">=11","electron":">=35"},"gitHead":"350d52615a4ba22d7387b97fc3ad4996121a4bc8","scripts":{"lint":"biome check --write","test":"node test/support/createdb.js && node tools/check-no-only.js && node tools/run-tests.mjs","bench":"node --expose-gc bench/index.js","install":"node-gyp-build","rebuild":"node-gyp rebuild","prebuild":"prebuildify --napi --strip","gen-types":"node tools/gen-types.js","lint:check":"biome check","lint:jsdoc":"node contrib/check-jsdoc.js","test:types":"tsc --noEmit -p tsconfig.check.json","lint:errors":"biome check --diagnostic-level=error","test:matrix":"node tools/test-matrix.mjs","bench:update":"node --expose-gc bench/index.js --write-baseline","bench:compare":"node --expose-gc bench/index.js --compare --baseline bench/baseline.json","test:electron":"node test/support/createdb.js && node tools/check-no-only.js && node test/electron/run.mjs suite && node test/electron/run.mjs main","install:frozen":"pnpm install --config.strict-dep-builds=true --frozen-lockfile --package-import-method copy","test:electron:asar":"node test/electron/asar.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ecad64d-f33a-4274-bc23-657574484642"}},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.17.0","description":"Asynchronous, non-blocking SQLite3 bindings. Modern rewrite of TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.19.0","dependencies":{"node-addon-api":"^8.9.2","node-gyp-build":"^4.8.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.21.0","devDependencies":{"semver":"^7.8.5","electron":"43.4.1","typescript":"7.0.2","@types/node":"^24.13.3","prebuildify":"^6.0.1","@biomejs/biome":"2.5.10","@electron/packager":"20.3.0"},"peerDependencies":{"node-gyp":"13.x"},"optionalDependencies":{"node-gyp":"13.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_9.0.1_1788047841904_0.4954321846314724","host":"s3://npm-registry-packages-npm-production"}},"9.0.2":{"name":"@appthreat/sqlite3","version":"9.0.2","keywords":["sql","sqlite","sqlite3","database"],"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","_id":"@appthreat/sqlite3@9.0.2","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"homepage":"https://github.com/AppThreat/node-sqlite3","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"dist":{"shasum":"29a8abe64c4a225bbe1774c85df588a853adaf68","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-9.0.2.tgz","fileCount":50,"integrity":"sha512-i/TUHpgZT210LsP47WSnOuUp8mCfJpuZ3VTiUYue54h4TR23NHbMJm8hbtD5Aq3CMjd5xg3+tTCRyvn0oEq32g==","signatures":[{"sig":"MEQCIAXi7u9bvaRvfq4QhnprYO7bB/MyAiOGiVxYeFlmx1RYAiA305N6MLcR3vuC3fpeiANfVH/4uD6ECEOMQ6zNfw9EYw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@9.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":32696057},"main":"./lib/sqlite3.js","type":"module","types":"./lib/sqlite3.d.ts","binary":{"napi_versions":[10]},"engines":{"node":">=24","pnpm":">=11","electron":">=35"},"gitHead":"25814f7569e929ddbda0e0418b162beed3ebdcfe","scripts":{"lint":"biome check --write","test":"node test/support/createdb.js && node tools/check-no-only.js && node tools/run-tests.mjs","bench":"node --expose-gc bench/index.js","install":"node-gyp-build","rebuild":"node-gyp rebuild","prebuild":"prebuildify --napi --strip","gen-types":"node tools/gen-types.js","lint:check":"biome check","lint:jsdoc":"node contrib/check-jsdoc.js","test:types":"tsc --noEmit -p tsconfig.check.json","lint:errors":"biome check --diagnostic-level=error","test:matrix":"node tools/test-matrix.mjs","bench:update":"node --expose-gc bench/index.js --write-baseline","bench:compare":"node --expose-gc bench/index.js --compare --baseline bench/baseline.json","test:electron":"node test/support/createdb.js && node tools/check-no-only.js && node test/electron/run.mjs suite && node test/electron/run.mjs main","install:frozen":"pnpm install --config.strict-dep-builds=true --frozen-lockfile --package-import-method copy","test:electron:asar":"node test/electron/asar.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ecad64d-f33a-4274-bc23-657574484642"}},"repository":{"url":"git+https://github.com/AppThreat/node-sqlite3.git","type":"git"},"_npmVersion":"11.17.0","description":"Asynchronous, non-blocking SQLite3 bindings. Modern rewrite of TryGhost/node-sqlite3","directories":{},"_nodeVersion":"24.19.0","dependencies":{"node-addon-api":"^8.9.2","node-gyp-build":"^4.8.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.21.0","devDependencies":{"semver":"^7.8.5","electron":"43.4.1","typescript":"7.0.2","@types/node":"^24.13.3","prebuildify":"^6.0.1","@biomejs/biome":"2.5.10","@electron/packager":"20.3.0"},"peerDependencies":{"node-gyp":"13.x"},"optionalDependencies":{"node-gyp":"13.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sqlite3_9.0.2_1788097961138_0.6201191601597515","host":"s3://npm-registry-packages-npm-production"}},"9.1.0":{"name":"@appthreat/sqlite3","description":"Asynchronous, non-blocking SQLite3 bindings. Modern rewrite of TryGhost/node-sqlite3","version":"9.1.0","homepage":"https://github.com/AppThreat/node-sqlite3","author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"binary":{"napi_versions":[10]},"repository":{"type":"git","url":"git+https://github.com/AppThreat/node-sqlite3.git"},"dependencies":{"node-addon-api":"^8.9.2","node-gyp-build":"^4.8.0"},"devDependencies":{"@biomejs/biome":"2.5.10","@electron/packager":"20.3.0","@types/node":"^24.13.3","electron":"43.4.1","prebuildify":"^6.0.1","semver":"^7.8.5","typescript":"7.0.2"},"peerDependencies":{"node-gyp":"13.x"},"peerDependenciesMeta":{"node-gyp":{"optional":true}},"optionalDependencies":{"node-gyp":"13.x"},"engines":{"node":">=24","pnpm":">=11","electron":">=35"},"packageManager":"pnpm@11.21.0","scripts":{"install":"node-gyp-build","install:frozen":"pnpm install --config.strict-dep-builds=true --frozen-lockfile --package-import-method copy","prebuild":"node tools/prebuild.mjs","check:prebuilds":"node tools/check-prebuilds.mjs","rebuild":"node-gyp rebuild","lint":"biome check --write","lint:check":"biome check","lint:errors":"biome check --diagnostic-level=error","lint:jsdoc":"node contrib/check-jsdoc.js","test":"node test/support/createdb.js && node tools/check-no-only.js && node tools/run-tests.mjs","test:electron":"node test/support/createdb.js && node tools/check-no-only.js && node test/electron/run.mjs suite && node test/electron/run.mjs main","test:electron:asar":"node test/electron/asar.mjs","bench":"node --expose-gc bench/index.js","bench:compare":"node --expose-gc bench/index.js --compare --baseline bench/baseline.json","bench:update":"node --expose-gc bench/index.js --write-baseline","gen-types":"node tools/gen-types.js","test:types":"tsc --noEmit -p tsconfig.check.json","test:matrix":"node tools/test-matrix.mjs"},"license":"BSD-3-Clause","keywords":["sql","sqlite","sqlite3","database"],"type":"module","main":"./lib/sqlite3.js","types":"./lib/sqlite3.d.ts","exports":{".":{"types":"./lib/sqlite3.d.ts","default":"./lib/sqlite3.js"},"./compat":{"types":"./lib/compat.d.ts","default":"./lib/compat.js"},"./package.json":"./package.json","./*":"./*"},"gitHead":"e6429ba5598971ff30eddb2ac5bd9dde6918c4bb","_id":"@appthreat/sqlite3@9.1.0","bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-DaWNs3q3cPKQriig7/F8suBmOKBTZ0Pkx3lTF67WGGGRVxj+PgZnPp0NI706EJ9HWf4zyRW0fLI+xS/h+fJXUA==","shasum":"2d8c4b0e4de50d3112af7acf0001d9420ab50e59","tarball":"https://registry.npmjs.org/@appthreat/sqlite3/-/sqlite3-9.1.0.tgz","fileCount":56,"unpackedSize":33770500,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@appthreat%2fsqlite3@9.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFNVchSArHP4WL070vW3rSzljYyBostiXi6J4DTbgNEBAiBCQgVARCtND0qZoA6vU7c1iTJB3rat1TDpmJRnaGPk3g=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ecad64d-f33a-4274-bc23-657574484642"}},"directories":{},"maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sqlite3_9.1.0_1789642385590_0.009071201101520598"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-30T21:30:24.962Z","modified":"2026-09-17T10:53:06.225Z","6.0.0":"2025-05-30T21:30:25.354Z","6.0.2":"2025-05-30T21:39:52.703Z","6.0.3":"2025-05-30T23:18:29.687Z","6.0.4":"2025-05-31T03:59:42.403Z","6.0.5":"2025-06-04T12:55:34.969Z","6.0.6":"2025-06-06T22:24:38.823Z","6.0.7":"2025-07-03T21:18:06.756Z","6.0.8":"2025-07-21T16:16:19.843Z","6.0.9":"2025-07-31T16:48:09.754Z","7.0.1":"2025-09-10T07:12:48.957Z","7.0.2":"2025-11-19T12:56:09.247Z","7.0.3":"2026-01-24T22:09:01.360Z","7.0.4":"2026-03-09T22:09:02.444Z","8.0.0":"2026-03-10T00:38:06.316Z","8.0.1":"2026-03-10T09:48:15.451Z","8.0.2":"2026-04-10T00:14:36.374Z","9.0.0":"2026-08-29T11:54:00.845Z","9.0.1":"2026-08-29T23:57:22.257Z","9.0.2":"2026-08-30T13:52:41.454Z","9.1.0":"2026-09-17T10:53:05.929Z"},"bugs":{"url":"https://github.com/AppThreat/node-sqlite3/issues"},"author":{"name":"Team AppThreat","email":"cloud@appthreat.com"},"license":"BSD-3-Clause","homepage":"https://github.com/AppThreat/node-sqlite3","keywords":["sql","sqlite","sqlite3","database"],"repository":{"type":"git","url":"git+https://github.com/AppThreat/node-sqlite3.git"},"description":"Asynchronous, non-blocking SQLite3 bindings. Modern rewrite of TryGhost/node-sqlite3","maintainers":[{"name":"prabhus","email":"cloud@appthreat.com"}],"readme":"# ⚙️ node-sqlite3\n\nAsynchronous, non-blocking [SQLite3](https://sqlite.org/) bindings for [Node.js](http://nodejs.org/). Forked from TryGhost/node-sqlite3.\n\n![NPM Downloads](https://img.shields.io/npm/dm/%40appthreat%2Fsqlite3)\n[![Latest release](https://img.shields.io/github/release/AppThreat/node-sqlite3.svg)](https://www.npmjs.com/package/@appthreat/sqlite3)\n\n# Features\n\n- Straightforward query and parameter binding interface\n- Full Buffer/Blob support\n- Extensive [debugging support](https://github.com/AppThreat/node-sqlite3/wiki/Debugging)\n- [Query serialization](https://github.com/AppThreat/node-sqlite3/wiki/Control-Flow) API\n- [Extension support](https://github.com/AppThreat/node-sqlite3/wiki/API#databaseloadextensionpath-callback), including bundled support for the [json1 extension](https://www.sqlite.org/json1.html)\n- Big test suite\n- Written in modern C++ and tested for memory leaks\n- Bundles SQLite v3.53.4, or you can build using a local SQLite [amalgamation](https://www.sqlite.org/amalgamation.html)\n\n# Compared with `node:sqlite`\n\nNode ships a built-in SQLite module. It has grown a lot and now covers\nmost of what a synchronous driver needs, so the honest summary is: **if\nyour workload is synchronous and fits `node:sqlite`, use `node:sqlite`**\n— nothing needs installing and nothing needs compiling. This package\nexists for the parts it does not cover.\n\nVerified against `@appthreat/sqlite3` 9.0.2 on **Node v24.18.0 and\nv26.7.0**, which expose an identical `node:sqlite` surface and behave\nidentically on every point below — so this table holds across the whole\nrange this package supports. `node:sqlite` did grow quickly during 24.x\n(`backup` and `createTagStore` among the later additions) and is still\ngaining features, so on an older 24.x patch release, or a newer Node\nthan the two above, check\n[the `node:sqlite` docs](https://nodejs.org/api/sqlite.html) before\nrelying on a ❌ below.\n\n## What only this package has\n\n| Capability                                   | `@appthreat/sqlite3`                                            | `node:sqlite`                            |\n| -------------------------------------------- | --------------------------------------------------------------- | ---------------------------------------- |\n| Asynchronous API (event loop stays free)     | ✅ callbacks + promises                                         | ❌ synchronous only                      |\n| `async` iteration (`for await`), streams     | ✅ `iterate`, `stream`                                          | ❌ (sync `iterate` only)                 |\n| Worker-thread connection pool                | ✅ `pool()`                                                     | ❌                                       |\n| Transaction helper with savepoints           | ✅ `transaction()`, reusable `createTransaction()`               | ❌ hand-rolled `BEGIN`/`COMMIT`          |\n| Statement cache                              | ✅ `cacheStatements()`, implicit on sync                        | ❌ prepare per call                      |\n| Custom collations                            | ✅ `collation()` / `removeCollation()`                          | ❌                                       |\n| Incremental blob I/O                         | ✅ `openBlob()`                                                 | ❌ read/write whole values               |\n| Update / commit / rollback / preupdate hooks | ✅ EventEmitter                                                 | ❌                                       |\n| Progress handler                             | ✅ `progress()`                                                 | ❌                                       |\n| Query cancellation                           | ✅ `cancellationToken()`, connection-wide                       | ❌                                       |\n| WAL checkpoint control                       | ✅ `checkpoint()`                                               | ❌                                       |\n| Schema introspection                         | ✅ `tableInfo()`, `columns()`, `parameterNames`                 | ⚠️ `columns()` only                      |\n| Changeset utilities                          | ✅ concat / invert / iterate / **rebase** / `session.diff()`    | ⚠️ apply + create only                   |\n| JavaScript virtual tables                    | ✅ `db.table()` generator tables + `db.values()` array tables   | ❌                                       |\n| Atomic `batch()`                             | ✅ multi-statement, libsql-style modes                          | ❌                                       |\n| `pragma()` / `explain()` helpers             | ✅ parsed rows, `EXPLAIN QUERY PLAN`                            | ❌                                       |\n| SQL text dump (`.dump`)                      | ✅ `db.dump()`, streaming `iterdump()`                          | ❌                                       |\n| Error token byte offset                      | ✅ `err.offset` on failed prepares                              | ❌                                       |\n| `diagnostics_channel` query spans            | ✅ `subscribeQueries()` + the `sqlite.db.query` mirror          | ⚠️ `sqlite.db.query` only                |\n| Backup control                               | ✅ handle you step yourself (`remaining`, `idle`, retry policy) | ⚠️ one-shot promise (`rate`, `progress`) |\n| Integer read modes                           | ✅ `number` / `mixed` / `bigint`, per connection or statement   | ⚠️ `setReadBigInts()` per statement      |\n| Electron support                             | ✅ tested in CI, main + utility process                         | ⚠️ works, untested by us                 |\n\n## What both have\n\nUser-defined functions and aggregates (including window functions via\n`inverse`) — on the async paths here through a worker round trip, and on\nthe synchronous fast path through a direct re-entrant call (see below) —\nsessions and changesets, the authorizer, extension loading,\n`serialize`/`deserialize`, incremental online backup with progress\nreporting, `readOnly` and busy-timeout connection options, array row\nmode, bare and unknown named-parameter control, tagged-template queries\n(`createTagStore()` here is promise-native and carries the\n`raw`/`join`/`identifier` composition helpers), `inTransaction`, and\nextended result codes on errors. Both also **refuse to truncate** an\nINTEGER outside the safe range rather than silently losing precision —\nthey differ only in how you opt into `BigInt`.\n\n## What only `node:sqlite` has\n\n| Capability                                                             | Why it matters                   |\n| ---------------------------------------------------------------------- | -------------------------------- |\n| **Zero install** — built in, no compiler, no prebuild, no supply chain | Usually the deciding factor      |\n| `enableDefensive()` as a method                                        | ⚠️ this package has `dbConfig()` |\n\n### The UDF story\n\n`node:sqlite` runs SQLite on the main thread, so a JavaScript callback\nruns inline while a query is stepping. This package runs asynchronous\nqueries on a worker, and a JS callback fires safely there — one blocking\nround trip to the JS thread per call (a few microseconds; fine for\nbounded-row logic, wrong for per-row bulk predicates). Since 9.1 the\n**synchronous fast path runs UDFs directly**: on `getSync`/`allSync`/\n`runSync` the JS thread is the one executing SQL, so the callback is\ninvoked re-entrantly on that same thread — exactly like `node:sqlite` —\nwith the one hard rule preserved (a UDF cannot drive *its own* statement\nre-entrantly; other statements on the connection work). A throwing\ncallback surfaces through the step error with the thrown value as\n`cause`, and JS collations/progress callbacks still refuse on the sync\npath (they have no error channel).\n\nThe cost model in one line: **sync-path UDFs are direct calls; async-path\nUDFs pay one worker→JS round trip each.**\n\nMigrating from `node:sqlite` is mostly mechanical — `DatabaseSync` maps\nto `Database` plus the `*Sync` methods — and since 9.1 there is a\ndrop-in shim: `import { DatabaseSync } from '@appthreat/sqlite3/compat'`\nmaps the `node:sqlite` surface onto this package's sync fast path (with\nthe documented divergences where a synchronous form cannot exist). See\n[MIGRATING-TO-V9.md](MIGRATING-TO-V9.md) for the value-marshalling\ndifferences, which are where the surprises live.\n\n# Installing\n\nUse whichever package manager you like:\n\n```bash\nnpm install @appthreat/sqlite3\n# or\npnpm add @appthreat/sqlite3\n# or\nyarn add @appthreat/sqlite3\n```\n\nOn the Bun runtime use Bun's built-in `bun:sqlite` — this package's\naddon needs N-API behaviour Bun 1.4 does not provide (see\n[docs/install.md](docs/install.md#bun-install-works-runtime-does-not-yet)).\n\n- GitHub's `master` branch: `npm install https://github.com/AppThreat/node-sqlite3/tarball/master`\n\nRequires Node.js >= 24. See [docs/install.md](docs/install.md) for the full\ninstallation guide: prebuild coverage, source builds, custom SQLite/SQLCipher,\nand troubleshooting.\n\n### Prebuilt binaries\n\n`@appthreat/sqlite3` v6+ was rewritten to use [Node-API](https://nodejs.org/api/n-api.html), so a single prebuilt binary per platform covers every supported Node version — nothing is compiled or downloaded at install time for the platforms below:\n\n- `darwin-arm64`\n- `darwin-x64`\n- `linux-arm64` (glibc and musl)\n- `linux-x64` (glibc and musl)\n- `win32-arm64`\n- `win32-x64`\n\nThe prebuilds are bundled **inside the npm tarball** and resolved at\n**runtime**, not by an install script. In particular, **pnpm 10+ users need no\n`onlyBuiltDependencies` allowlist**: pnpm blocks dependencies' install scripts\nby default, and that block is a no-op here because `lib/sqlite3-binding.js`\nlocates the prebuild itself when the module is first imported.\n\nSupport for other platforms and architectures may be added in the future if CI\nsupports building on them. Everywhere else, `@appthreat/sqlite3` builds from\nsource via `node-gyp` — see\n[docs/install.md](docs/install.md#source-builds) for the toolchain\nrequirements and the pnpm specifics for source builds.\n\n### Other ways to install\n\nIt is also possible to make your own build of `sqlite3` from its source instead of its npm package ([See below.](#source-install)).\n\nSQLite's [SQLCipher extension](https://github.com/sqlcipher/sqlcipher) is also supported. [(See below.)](#sqlcipher-encrypted-databases)\n\n## Electron\n\nNo rebuild, no `electron-rebuild`: v9 ships Node-API 10 prebuilds, and Node-API\nis ABI-stable across runtimes — the same binary Node loads is the one Electron\nloads. The minimum is **Electron 35** (the first major whose bundled Node\nexposes Node-API 10; verified by loading the prebuild in Electron 35 and 44),\nrecorded in `engines.electron`. Source builds against Electron headers are only\nneeded for SQLCipher or a custom `sqlite_magic` — see\n[docs/electron.md](docs/electron.md) for process placement (main vs. utility\nprocess vs. preload), ASAR/`asarUnpack` configuration for electron-builder and\nelectron-forge, bundler externals, `userData` paths, and the SQLCipher rebuild\npath.\n\n# API\n\nSee the [API documentation](https://github.com/AppThreat/node-sqlite3/wiki/API) in the wiki.\n\n# Usage\n\n**Note:** the module must be [installed](#installing) before use.\n\nThis package is now ESM only.\n\n```js\nimport sqlite3 from \"sqlite3\";\nconst db = new sqlite3.verbose().Database(\":memory:\");\n\ndb.serialize(() => {\n  db.run(\"CREATE TABLE lorem (info TEXT)\");\n\n  const stmt = db.prepare(\"INSERT INTO lorem VALUES (?)\");\n  for (let i = 0; i < 10; i++) {\n    stmt.run(\"Ipsum \" + i);\n  }\n  stmt.finalize();\n\n  db.each(\"SELECT rowid AS id, info FROM lorem\", (err, row) => {\n    console.log(row.id + \": \" + row.info);\n  });\n});\n\ndb.close();\n```\n\n## Promises, async iteration and disposal (v9)\n\nEvery data method is dual-mode: pass a trailing callback for the classic\nbehaviour (returning `this`, chainable), or omit it to get a promise. `run`\nresolves `{ lastID, lastIDBigInt, changes }`; `get`/`all`/`map` resolve the\nrows; `exec`/`close`/`wait` resolve `undefined`. Errors carry the v9\n`code`/`errno`/`primaryCode` triple.\n\n```js\nconst db = await sqlite3.open(\":memory:\"); // promise-native open\nawait db.exec(\"CREATE TABLE lorem (info TEXT)\");\nconst { lastID } = await db.run(\"INSERT INTO lorem VALUES (?)\", \"Ipsum 1\");\nconst row = await db.get(\"SELECT * FROM lorem WHERE rowid = ?\", lastID);\n```\n\nStream large results with real backpressure — batches are pulled from\nSQLite (64..1024 rows) only as fast as the consumer reads them:\n\n```js\nfor await (const row of db.iterate(\"SELECT * FROM big\")) { ... }\ndb.stream(\"SELECT * FROM big\").pipe(someTransform);   // object-mode Readable\n```\n\nTransactions, cancellation and `await using` disposal:\n\n```js\nawait db.transaction(async (tx) => {\n  // ROLLBACK on throw, nested savepoints\n  await tx.run(\"INSERT INTO lorem VALUES (?)\", \"Ipsum 2\");\n});\n\nconst rows = await db.all(\"SELECT * FROM big\", { signal }); // AbortSignal:\n// an already-aborted signal rejects before scheduling; aborting in flight\n// interrupts the whole connection (a SQLite constraint) and rejects with\n// the signal's reason.\n\nawait using db2 = await sqlite3.open(\"app.db\"); // closed however the block exits\nawait using stmt = db2.prepare(\"SELECT 1\"); // finalized the same way\n```\n\n`each()` stays callback-only — the async iterator is its promise-based\nreplacement. `db.backup()` keeps its synchronous return in every form.\n`db.prepare()` returns the statement synchronously in its callback form; the\nno-callback form returns the statement wrapped so that `await db.prepare(sql)`\nresolves only once the prepare has completed and the introspection accessors\n(`columns`, `parameterCount`, `parameterNames`, `readonly`) are populated —\nand yields the statement itself. The wrapper still forwards every statement\nmethod, so `db.prepare(sql).run(...)` chaining is unchanged.\n\n## Performance options\n\nTwo opt-in fast paths avoid the per-call prepare and threadpool round-trip\ncosts. Both keep the default asynchronous behaviour untouched.\n\n### Statement cache\n\n```js\ndb.cacheStatements(); // or db.cacheStatements(16) to cap the LRU size\n```\n\n`run/get/all/each/map` then reuse prepared statements (LRU, keyed on the SQL\nstring, 64 entries by default). The cache is bypassed, falling back to a\nper-call prepare, whenever ordering guarantees would otherwise be lost: under\n`serialize()`, and while an exclusive operation (`exec`, `close`, `wait`,\n`loadExtension`) is running or queued. `close()` finalizes cached statements.\n\nA cached statement retains its most recently bound text/blob parameters until\nit is rebound or finalized, so a large blob bound through a cached statement\nstays resident while that entry lives in the cache.\n\n### Synchronous fast path\n\n```js\ndb.cacheStatements();\nconst row = db.getSync(\"SELECT * FROM t WHERE rowid = ?\", 42); // row | undefined\nconst info = db.runSync(\"INSERT INTO t (a) VALUES (?)\", 42); // { lastID, changes }\nconst rows = db.allSync(\"SELECT * FROM t\");\nconst stmt = db.prepareSync(\"SELECT ? AS v\"); // statement-level variants\n// Bulk-reader row shape: one array per row, values in result-column order.\nconst flat = db.allSync(\"SELECT * FROM t\", { rowMode: \"array\" });\n```\n\n`getSync`/`allSync` (not the async paths) accept a trailing\n`{ rowMode: 'array' }` option: rows come back as arrays instead of\nobjects — duplicate column names keep every value instead of collapsing,\nand the per-cell property stores disappear entirely, making it the\nfastest row shape the sync paths can build. CSV export, ETL and bulk\nfeeds are the intended users; the default object shape is unchanged.\n(A named bind parameter could never have the bare key `rowMode` — bind\nkeys carry a sigil — so the option is unambiguous.)\n\n`getSync/runSync/allSync` execute on the calling thread. On the benchmark\nsuite (`pnpm run bench`, [docs/performance.md](docs/performance.md)),\ncached single-row lookups are **8–12× faster** than the cached async\n`get`/`run`\nequivalents on arm64 macOS (10.4–11.8× for `getSync`, flat\nfrom batches of 1 to 10,000; `runSync` 8.2× at one operation rising to\n~11.5× at 10,000 as per-round overhead amortises) — and **22–31×** on\nLinux, where the async threadpool round trip costs more. For large\nresult sets sync and async are level (20,000 rows × 4 cols measured\nwithin the noise floor): the marshalling is the same work either way,\nand it dominates the threadpool round trip. They throw when the\ndatabase is not fully idle: async work in flight or queued, or when called\nfrom inside an async completion callback (defer with `setImmediate` or use\n`db.wait`). They accept no callback argument. Like any synchronous database\nAPI, a busy database file can block the event loop for up to the configured\n`busyTimeout`.\n\nThese `Database`-level forms keep their own statement cache, so they do\nnot prepare and finalize a statement per call; that is automatic and\ndoes not need `cacheStatements()`, which is opt-in and governs the\nasynchronous calls.\n\n### Scheduling change\n\nThe database queue is now strictly FIFO. Previously a non-exclusive call\ncould dispatch immediately while an exclusive one (`exec`, `close`, `wait`,\n`loadExtension`) was still waiting in the queue, so it could overtake that\ncall and run concurrently with it — for example a write landing outside a\ntransaction opened by `exec(\"BEGIN\")`. Code that implicitly relied on the\nold queue-jumping behaviour may see operations complete in a different\norder. Parallel throughput is unchanged: the queue is only non-empty once\nsomething has had to wait.\n\n## Value marshalling (v9)\n\n### Integer modes\n\n```js\ndb.getSync(\"SELECT COUNT(*) AS n FROM t\").n; // number (default)\ndb.configure(\"integerMode\", \"mixed\"); // or 'number' | 'bigint'\ndb.integerMode; // 'mixed'\n```\n\nIntegers are stored as true 64-bit values on both the bind and the read\npath, and `BigInt` parameters bind exactly. Reads follow the configured\nmode:\n\n| Mode                 | INTEGER columns and `lastID`                                                                     |\n| -------------------- | ------------------------------------------------------------------------------------------------ |\n| `'number'` (default) | `number` when safely representable, otherwise a `RangeError` — never a silently truncated double |\n| `'bigint'`           | always `BigInt`                                                                                  |\n| `'mixed'`            | `number` when safe, `BigInt` otherwise — recommended for anything touching `rowid`s              |\n\n`Statement#lastIDBigInt` returns the last insert rowid as a `BigInt` in\nevery mode, so `'number'`-mode code can still read a large rowid without\nswitching modes.\n\n### Accepted bind values\n\n`string`, `number` (integral values within the int64 range bind as\nINTEGER; the double `2**63` clamps to `2**63-1`), `bigint` (`RangeError`\noutside the signed 64-bit range), `boolean` (0/1), `null` and `undefined`\n(both NULL), `Date` (epoch milliseconds as REAL — documented, lossy in\ntype), `RegExp` (its source string), and any binary view: Node `Buffer`,\n`Uint8Array`/`Float64Array`/… (byte range honoured), `DataView`\n(byte range honoured), `ArrayBuffer`.\n\nEverything else — plain objects, arrays, `Map`, class instances, symbols,\nfunctions — throws a `TypeError` naming the parameter index and the\nconstructor. Bind the number of parameters the statement takes: too few\n(previously silently NULL) and too many (previously ignored) are both\nerrors now, and a named parameter absent from the SQL (`sqlite3_bind_parameter_index`\nreturning 0) throws as well.\n\n### Extended result codes\n\nErrors carry three properties: `err.code` (the extended name, e.g.\n`SQLITE_CONSTRAINT_UNIQUE`), `err.errno` (the extended number) and\n`err.primaryCode` (the primary name, e.g. `SQLITE_CONSTRAINT`). The\n`SQLITE_CONSTRAINT_*`, `SQLITE_BUSY_*`, `SQLITE_READONLY_*`,\n`SQLITE_IOERR_*`, `SQLITE_CANTOPEN_*`, `SQLITE_LOCKED_*`,\n`SQLITE_CORRUPT_*`, `SQLITE_ERROR_*`, `SQLITE_ABORT_ROLLBACK` and\n`SQLITE_AUTH_USER` constants are exported, as are the previously missing\nopen flags `OPEN_NOMUTEX`, `OPEN_MEMORY` and `OPEN_EXRESCODE`.\n\n## User-defined functions, aggregates and collations (v9)\n\n```js\n// Scalar functions — this makes WHERE x REGEXP ? work:\ndb.function(\"regexp\", { deterministic: true }, (pattern, value) =>\n  new RegExp(pattern).test(value) ? 1 : 0,\n);\n\n// Aggregates: start() builds an accumulator, step() folds a row into it,\n// result() produces the value. Providing inverse makes it a window\n// function usable with OVER (...).\ndb.aggregate(\"median\", {\n  start: () => [],\n  step: (acc, v) => {\n    acc.push(v);\n    return acc;\n  },\n  result: (acc) => {\n    acc.sort((a, b) => a - b);\n    return acc.length ? acc[acc.length >> 1] : null;\n  },\n});\nawait db.get(\"SELECT median(salary) AS m FROM employees\");\n\n// Collations — ORDER BY, indexes, COLLATE:\ndb.collation(\"german\", (a, b) => a.localeCompare(b, \"de\"));\nawait db.all(\"SELECT name FROM t ORDER BY name COLLATE german\");\n\ndb.removeFunction(\"regexp\");\ndb.removeCollation(\"german\");\n```\n\nArguments and return values use exactly the bind-marshalling rules above\n(int64/BigInt, buffers for blobs, strict types: an unsupported return\nvalue is an error, never a coerced string). Without `varargs: true` the\narity comes from the implementation's `length` (minus the accumulator for\naggregates), and calls with any other argument count are SQL errors.\n\nOptions: `deterministic` (required for index/generated-column use, and a\nfalse claim corrupts results — opt-in), `directOnly` (default **true**:\nschema SQL — triggers, views, CHECK constraints, index expressions —\ncannot invoke the function; opt out explicitly), `innocuous`, `varargs`.\nWindow functions (aggregates with `inverse`) are registered through\n`sqlite3_create_window_function`, which has no flag slot, so the flag\noptions do not apply to them.\n\n### The threading model, and what it costs\n\nSQLite invokes a function callback on whatever thread is executing the\nstatement — here a worker thread. Each call therefore makes a blocking\nround trip to the JS thread: the worker marshals the arguments and waits\nwhile the JS thread runs your function and posts the result back.\n\nMeasured cost (`pnpm run bench`, Apple Silicon, Node 26): **~18 µs per\ncall**. Consequences, with one decimal of honesty:\n\n| Filtering 100,000 rows                 | Time     |\n| -------------------------------------- | -------- |\n| the predicate in SQL                   | 5 ms     |\n| the predicate in JS after `all()`      | 25 ms    |\n| the predicate in a JS function per row | 1,830 ms |\n\nA JS function called per row is the wrong tool for bulk filtering —\nfetch and filter in JS (or write the predicate in SQL). A JS collation is\neven sharper: sorting 100k rows costs O(N log N) round trips (~17 s).\nWhere they shine is pushing _logic_ into a query — a regexp, a domain\nchecksum, a custom aggregate over a bounded group. SQLite invokes a\nscalar function per row and needs each result before the next row is\nread, so there is no batched/array form: the per-call cost is\nstructural. [docs/performance.md](docs/performance.md#javascript-functions-the-crossover-to-fetch-and-filter)\nworks out the crossover — a few thousand candidate rows is where\nfetch-and-filter overtakes a UDF predicate, measured at ~60× on a real\n16k-row scan.\n\nTwo deliberate restrictions follow from the threading model:\n\n- A JS function reached from a **synchronous method**\n  (`getSync`/`runSync`/`allSync`/`prepareSync` steps) runs **directly**:\n  the JS thread is the one executing SQL there, so the callback is\n  invoked re-entrantly on that same thread — same-thread, no round\n  trip, like `node:sqlite`. (Since 9.1; before that this refused.) The\n  one rule: such a callback cannot drive *its own* statement\n  re-entrantly — use another statement or the async API. Nor can it do\n  anything that flushes the statement cache mid-step, since the cache\n  holds the executing statement: registering or removing a function,\n  aggregate, collation, virtual table or authorizer policy, clearing a\n  tag store, or closing the connection all refuse with a message saying\n  so. Do those before or after the query.\n- While a JS **collation** is registered, the synchronous methods refuse\n  to run entirely (remove it with `removeCollation()` or use the async\n  API): a comparison would need the blocked JS thread, and unlike\n  functions, a collation callback has no way to report an error.\n  `db.withCollation(name, cmp, fn)` scopes a registration to the awaited\n  body, registering before it runs and removing after — even when the\n  body throws — so the sync methods are only gated for the block:\n\n  ```js\n  const rows = await db.withCollation(\n    \"locale\",\n    (a, b) => a.localeCompare(b, \"de\"),\n    () => db.all(\"SELECT name FROM t ORDER BY name COLLATE locale\"),\n  ); // here the collation is removed and getSync() works again\n  ```\n\nErrors: a throwing callback surfaces as a `SQLITE_ERROR` whose message\nnames the function, with the original JS error attached as `err.cause`;\nthe connection stays usable. Registration and replacement are refused\nwith `SQLITE_BUSY` (reported on the connection's `'error'` event) while\na cursor is suspended mid-query; the statement cache is flushed on every\nregistration, replacement and removal, so no statement compiled against\nthe old implementation is handed back.\n\n## Hooks, authorizer, progress and introspection (v9)\n\n```js\n// Transaction hooks. commit fires after the transaction commits — every\n// change event of that transaction is delivered first, which is what\n// makes the pair useful for cache invalidation. The hooks are\n// observational: the commit (or rollback) has already happened when the\n// listener runs, and no return value can veto it.\ndb.on(\"change\", (type, database, table, rowid) => {\n  /* ... */\n});\ndb.on(\"commit\", () => {\n  /* ... */\n});\ndb.on(\"rollback\", () => {\n  /* ... */\n});\n\n// WAL hook: fires after a commit appends frames to the WAL.\ndb.on(\"wal\", (database, pages) => {\n  /* ... */\n});\n```\n\nA hook's native sqlite callback exists only while at least one listener\nis registered — an installed-but-unused hook costs nothing. In WAL mode,\n`db.checkpoint()` is the lever for keeping the WAL bounded:\n\n```js\nconst { busy, logFrames, checkpointedFrames } = await db.checkpoint({\n  mode: \"truncate\",\n});\n```\n\n### Sandboxing SQL with the authorizer\n\n```js\ndb.authorizer({\n  default: \"deny\",\n  allow: [{ action: sqlite3.SELECT }, { action: sqlite3.READ, table: \"users\" }],\n});\ndb.authorizer(null); // remove\n```\n\nThe policy is a rule list evaluated inside SQLite itself, in C++ — no\nJavaScript runs on the prepare path, so it is fast and thread-safe by\nconstruction. `deny` rules win over `allow` rules; a denied action fails\nthe statement with `SQLITE_AUTH` (\"not authorized\"). The ~35 action\nconstants (`sqlite3.SELECT`, `sqlite3.READ`, `sqlite3.INSERT`,\n`sqlite3.ATTACH`, …) and the decisions (`sqlite3.DENY`,\n`sqlite3.IGNORE`) are exported. The statement cache is flushed on every\npolicy change: a cached statement was compiled under the old policy and\nwould bypass the new one.\n\n### Cancelling queries\n\n```js\n// The cancellation token: an atomic flag in a SharedArrayBuffer that\n// the native progress handler polls. Zero JS cost per check, and\n// cancel() works from any thread — post token.buffer to a Worker.\nconst token = db.cancellationToken();\ndb.all(longRunningSql).catch(() => {});\nsetTimeout(() => token.cancel(), 100);\n\n// token.signal is a real AbortSignal, so the promise form rejects with\n// your reason:\ndb.all(longRunningSql, { signal: token.signal }).catch((reason) => {});\n```\n\nCancellation is connection-wide, like `db.interrupt()`: the abort\nreaches every statement running on the connection. While a token exists,\neach query pays one relaxed atomic load per `period` VM instructions\n(default 1000) — within measurement noise in the benchmark suite.\n\nOne timing detail worth knowing: an `AbortSignal` rejection is delivered\nas soon as the signal fires, which is *before* the interrupted statement\nhas finished unwinding on its worker. The connection is therefore not yet\nidle at the moment the rejection is observed, so a synchronous method\ncalled right there refuses with \"database is busy: sync methods require a\nfully idle database\". `await db.wait()` (or any awaited query) drains the\nteardown:\n\n```js\ntry {\n  await db.all(longRunningSql, { signal });\n} catch (err) {\n  await db.wait(); // the interrupted statement has finished unwinding\n  db.allSync(\"SELECT 1\"); // now the sync path is available again\n}\n```\n\nA cancellation token's own rejection (`token.cancel()` with no signal)\narrives with the statement already unwound, so it needs no drain.\n\nA JavaScript callback form exists for progress reporting —\n`db.progress(10000, () => shouldStop)` calls the callback every 10,000\nVM instructions and aborts the statement when it returns truthy — but\neach invocation is a blocking round trip to the JS thread (the same\n~18 µs class as JS functions), so it is for progress bars over long\nqueries, not per-row work. While it is registered, the synchronous\nmethods refuse to run (a callback would fire on the thread that must\nservice it). The token form has no such restriction.\n\n### Statement and connection introspection\n\n```js\nconst stmt = await db.prepare(\"SELECT name AS who FROM users WHERE id = $id\", { $id: 1 });\nstmt.readonly; // true — sqlite3_stmt_readonly\nstmt.parameterCount; // 1\nstmt.parameterNames; // ['$id'] — a fully positional statement (`?`) has\n// no names at all and reports undefined; mixed statements keep null at\n// every positional index so indices stay aligned\nstmt.columns; // [{ name: 'who', declaredType: 'TEXT',\n//    database: 'main', table: 'users', origin: 'name' }]\nstmt.status(sqlite3.STMTSTATUS_FULLSCAN_STEP); // >0: the query scanned\n// without an index\n\ndb.changes; // rows changed by the most recent statement (64-bit)\ndb.totalChanges; // every change since open (64-bit)\nawait db.tableInfo(\"users\"); // column metadata incl. collation, defaults\nawait db.dbConfig(sqlite3.DBCONFIG_DEFENSIVE, true); // safe db_config switches\n```\n\nThe statement accessors serve a snapshot taken when the statement was\nprepared, so reading them never touches the sqlite handle and cannot\nrace a running query; `await db.prepare(sql)` resolves only after that\nsnapshot is published, so the accessors are populated at the first read.\nFields SQLite reports as absent (an expression\ncolumn has no origin, a typeless column no declared type) are omitted\nrather than nulled. Integer modes apply to `changes`/`totalChanges` as\neverywhere else. `tableInfo` runs a `PRAGMA table_info`, so a\ndeny-by-default authorizer must allow `sqlite3.PRAGMA`.\n\n## Sessions, changesets and the preupdate event (v9)\n\nA session records every INSERT, UPDATE and DELETE made through the\nconnection (tables need a primary key to be recordable), and harvests\nthem as a changeset — a `Uint8Array` you can store, ship, or apply to\nanother connection:\n\n```js\nconst session = db.session({ table: \"users\" }); // or every table\nawait db.run(\"UPDATE users SET name = ? WHERE id = ?\", \"x\", 1);\nconst changeset = await session.changeset(); // Uint8Array\nconst patchset = await session.patchset(); // new rows only, smaller\nawait session.close();\n\nawait target.applyChangeset(changeset, { conflict: \"replace\" });\nawait target.applyChangeset(changeset, {\n  // the fully general form — runs per conflict:\n  conflict: (info) => (info.conflict === \"notFound\" ? \"omit\" : \"replace\"),\n  filter: (table) => table !== \"audit\",\n});\n\nfor (const op of sqlite3.iterateChangeset(changeset)) {\n  console.log(op.op, op.table, op.oldRow, op.newRow);\n}\nconst inverse = sqlite3.invertChangeset(changeset); // undoes the apply\nconst both = sqlite3.concatChangeset(a, b); // a then b\n```\n\n### Rebasing (9.1): the fork-free sync loop\n\nApply with `{ rebase: true }` to harvest a **rebase buffer** — the\nrecord of which conflicting changes this database omitted or replaced —\nthen rebase the changesets you recorded *before* that apply, so they\nland upstream without anyone resolving the same conflicts twice.\nTogether with `session.diff()` (a changeset of the differences between\nan attached database's table and this one, without recording anything)\nthis is a complete offline-first sync toolkit on stock SQLite; no other\nJS driver has rebasing (rusqlite is the only binding anywhere):\n\n```js\n// This database is at S0 and records its own work (S0 → S1):\nconst session = db.session({ table: \"t\" });\nawait db.run(\"UPDATE t SET v = ? WHERE id = ?\", \"mine\", 1);\nconst local = await session.changeset();\nawait session.close();\n\n// A changeset based on S0 arrives from the peer. Apply it *here*,\n// resolving conflicts, and keep the record of those resolutions:\nconst rebase = await db.applyChangeset(incoming, {\n  conflict: \"omit\", // this database's row wins\n  rebase: true, // resolves the rebase buffer (null if no conflicts)\n});\n\n// Rebasing rewrites the local changeset's old values to the ones the\n// peer holds, so pushing it needs no conflict handling at all:\nawait peer.applyChangeset(sqlite3.rebaseChangeset(local, rebase));\n```\n\nThe matching rule, because it is easy to get backwards: the rebaser\nfinds a buffer entry **by primary key** and rewrites the change's\n`old.*` values to the values the buffer carries (for an omitted remote\nUPDATE, the values that remote left in place). It does not check when\nthe change was recorded — so a changeset recorded *after* the apply is\nrewritten just the same, and its old values then describe a state the\npeer has already moved past. **One buffer belongs to the changesets\nrecorded before its apply**; later work gets its own round of the loop.\nThe direction matters too: the buffer must come from the apply performed\non the database whose changeset you are rebasing.\n\n`session.diff('t', 'other')` records the changes that transform the\nattached database `other`'s table into this connection's — the\n\"what changed between these two databases\" primitive for verification\nand sync tooling.\n\n`applyChangeset` wraps the apply in one savepoint: either every change\nlands or the whole apply rolls back. `conflict` decides what happens on\na collision — `'abort'` (the default) rolls back, `'omit'` skips the\nchange, `'replace'` overwrites the row — or a function returning one of\nthose per conflict. The function form is a blocking round trip from the\napplying thread (like a user-defined JS function), so it must not use\nthe synchronous methods on that connection.\n\nThe `'preupdate'` event fires for every write with the row's before and\nafter values — the old values `change` events cannot give you:\n\n```js\ndb.on(\"preupdate\", ({ op, table, rowid, oldRowid, oldRow, newRow }) => {\n  audit.log(op, table, oldRow, newRow);\n});\n```\n\n`oldRowid` and `rowid` differ exactly on a rowid-changing update.\nOne preupdate hook exists per connection and is shared with the session\nmachinery, so a session and a `'preupdate'` listener cannot coexist on\none connection — attempting either direction fails loudly instead of\nsilently stopping the other.\n\n## In-memory snapshots: serializeToBytes / deserializeFromBytes (v9)\n\nThe whole database as bytes — snapshotting, shipping a prebuilt\ndatabase, fast fixtures, moving a database between threads:\n\n```js\nconst bytes = await db.serializeToBytes(); // Uint8Array snapshot\nconst copy = await sqlite3.deserializeFromBytes(bytes, {\n  readonly: false,\n  resizable: true,\n});\n```\n\n`serializeToBytes` returns the exact bytes a file copy would contain\n(the FIFO-ordering `db.serialize()` keeps its old meaning). The\nsnapshot includes every committed transaction — serialization reads\nthrough the pager, and the pager reads through the WAL — and for a WAL\ndatabase the returned bytes are rewritten to rollback-journal format,\nso the output always round-trips through `deserializeFromBytes` (a\ndeserialized copy has no `-wal` file and could not open a WAL-format\nimage demanding recovery). The live database's journal mode is\nuntouched. The bytes are named deliberately: overloading `serialize()`\nwould be the worst API decision available. `deserializeFromBytes`\n**copies** into SQLite-owned memory — handing a JS buffer to SQLite\ndirectly is a use-after-free waiting to happen — and rejects corrupt\ninput with `SQLITE_NOTADB` rather than crashing later.\n\n## Incremental blob I/O (v9)\n\nReading a 500 MB blob as one value materialises it as a single buffer;\n`openBlob` gives you a handle that streams it instead:\n\n```js\nconst blob = await db.openBlob({ table: \"files\", column: \"data\", rowid: 1 });\nconst chunk = new Uint8Array(65536);\nconst n = await blob.read(chunk, 0); // n bytes at blob offset 0\nawait blob.write(source, 4096); // write at an offset\nblob.size; // sqlite3_blob_bytes\n\nawait pipeline(blob.createReadStream(), fs.createWriteSink(path));\nawait pipeline(fs.createReadStream(path), blob.createWriteStream());\nawait blob.close();\n```\n\nStreams read and write in chunks (default 64 KiB), so memory stays flat\nregardless of the blob's size. Any write to the row invalidates open\nhandles with `SQLITE_ABORT` (and a message saying so); an aborted handle\ncannot be reopened — close and open a fresh one — while `blob.reopen(\nrowid)` cheaply re-aims a _healthy_ handle at another row. The blob\ncannot grow through the handle: size the column first (e.g.\n`UPDATE ... SET data = zeroblob(n)`) and then stream into it. Writing\nthrough a blob handle surfaces as a `'preupdate'` delete event (the new\nvalues are not yet available inside `sqlite3_blob_write`).\n\n## Ergonomics, virtual tables and migrations (9.1)\n\nThe sync-first drivers make a set of small things trivial; 9.1 adds the\nwhole bundle, promise-native:\n\n```js\n// pragmas with parsed results (the recommended way to run them)\nawait db.pragma(\"journal_mode = WAL\");\nconst version = await db.pragma(\"user_version\", { simple: true });\n\n// the query planner's own account, without executing\nconst plan = await db.explain(\"SELECT * FROM users WHERE id = ?\");\n\n// atomic multi-statement batches (migrations, seeding)\nawait db.batch([\n  \"CREATE TABLE t (a)\",\n  { sql: \"INSERT INTO t VALUES (?)\", args: 1 },\n]);\n\n// reusable transactions with begin-mode variants\nconst move = db.createTransaction((tx, from, to, n) => /* ... */);\nawait move.immediate(1, 2, 50);\n\n// .dump-style SQL export (streaming form: sqlite3.iterdump(db)) —\n// AUTOINCREMENT counters, user_version and virtual-table content included\nconst sqlText = await db.dump();\n\n// live state\ndb.inTransaction; // true inside BEGIN\ndb.txnState;      // 'none' | 'read' | 'write'\ndb.limits;        // the run-time limits\ndb.status(\"cacheHit\"); // { current, highwater }\ndb.location();    // the attached file's path\n\n// array/pluck row modes on the async paths too\nconst ids = await db.all(\"SELECT id FROM t\", { rowMode: \"pluck\" });\n\n// failed prepares carry the failing token's byte offset\ntry { db.prepareSync(\"SELECT * FRUM t\"); }\ncatch (err) { err.offset; } // 9\n\n// per-statement integer mode\nconst stmt = db.prepareSync(sql, { integerMode: \"bigint\" });\n\n// connection-free namespace helpers\nsqlite3.complete(\"SELECT 1;\"); // true — a complete statement (REPL input)\nsqlite3.compileOptions(); // ['ENABLE_FTS5', 'ENABLE_SESSION', …]\n```\n\n**JavaScript virtual tables** — generator-computed, read-only, working\nfrom both the async paths (rows are pulled in batches through the worker\nround trip) and the sync methods (direct re-entrant calls):\n\n```js\ndb.table(\"sequence\", {\n  columns: [\"value\", \"count\"],\n  parameters: [\"count\"], // HIDDEN → a table-valued function's argument\n  rows: function* (count) {\n    for (let i = 0; i < count; i++) yield [i, count];\n  },\n});\nawait db.all(\"SELECT value FROM sequence(5)\");\n```\n\nRows are pulled as the query consumes them (64 at first, growing to\n1024), so an **unbounded generator is fine** — `SELECT … LIMIT 3` over an\ninfinite sequence stops after the first batch, and a table larger than\nmemory streams. A scan that stops early leaves the generator suspended\nand never resumes it, so generator `finally` blocks are not a place to\nrelease resources. An unconstrained HIDDEN parameter reaches the\ngenerator as `undefined`; one the query constrained is also reported as\nthat column's value, so `SELECT count FROM sequence(5)` works without the\ngenerator echoing it.\n\nA parameter is a real (hidden) column, and `sequence(5)` is exactly\n`WHERE count = 5` — **SQLite re-checks that predicate against every row\nthe generator produces**, rather than trusting the generator to have\napplied it. So a row either leaves the parameter's column NULL — filled\nwith the argument, as above — or echoes the argument **as it was\nreceived**: parameter columns carry no affinity (like every other column\nhere), so an echoed `String(5)` is the text `'5'`, which does not equal\nthe integer `5`, and the row is filtered out. A row reporting anything\nelse in that column contradicts the `WHERE` clause the argument came from\nand is filtered out too; put unrelated output in its own column. The\ngenerator is still free to pre-filter for speed, and should: a generator\nthat ignores a constraint it cannot satisfy again produces an endless\nscan (correct, but unbounded — `LIMIT`, or a cancellation token on the\nasync path, is the stop). A row shorter than `columns` pads with NULL, so\na mis-ordered `yield` shows up as NULLs rather than an error, and a\nthrowing generator fails the query with a message naming the table and the\nthrown value attached as `err.cause`.\n\n`db.values(array)` exposes any JS array as a queryable table — the\nrusqlite `rarray()` ergonomics no JS driver had: `JOIN` against\nin-memory data instead of building IN-lists. `drop()` the handle when you\nare done (anonymous registrations are capped at 32 per connection, the\noldest being dropped to make room).\n\n**Tagged templates** — node:sqlite's tag store, promise-native, with\nthe composition helpers ORMs need (the ones Bun notably lacks):\n\n```js\nconst store = db.createTagStore();\nconst table = store.identifier(\"users\");\nawait store.all`SELECT * FROM ${table} WHERE id = ${id}`;\nawait store.all`SELECT * FROM ${table} WHERE id IN (${store.join(ids)})`;\n```\n\nEvery interpolated value binds as a parameter unless it came from\n`raw`/`identifier`/`identifierPath`/`join`/`empty` — a look-alike object\n(`{ text, params }` out of `JSON.parse`) binds like anything else rather\nthan becoming SQL. `join()` takes values as well as fragments, which is\nwhat an IN-list of user data needs. Creating a store turns the connection\nstatement cache on if it was off, since reusing statements is the point.\n\n**Migrations** — `PRAGMA user_version`-based, sequential, each in one\ntransaction; from a directory of `NNN-name.sql` files or a list:\n\n```js\nawait sqlite3.migrate(db, \"migrations/\");\n```\n\n**Observability** — finished-statement spans on diagnostics channels,\narmed only while subscribed:\n\n```js\nconst unsubscribe = sqlite3.subscribeQueries(({ sql, durationMs }) => {\n  apm.record(sql, durationMs); // also mirrored to node's sqlite.db.query\n});\n```\n\nSpans are delivered **asynchronously**: SQLite reports a statement's\ntiming on the thread that ran it, and the span crosses to the JS thread\nthrough a queue drained on a later event-loop turn — so right after\n`await db.all(sql)` the span for that query has usually not arrived yet.\n`sqlite3.flushQuerySpans()` delivers everything pending, synchronously,\nwhich is what a test or a shutdown flush wants; `unsubscribe()` drains\nfirst as well, so nothing recorded before it is lost.\n\n```js\nconst spans = [];\nconst stop = sqlite3.subscribeQueries((s) => spans.push(s.sql));\nawait db.all(\"SELECT 1\");\nsqlite3.flushQuerySpans(); // spans === ['SELECT 1']\nstop();\n```\n\nSpans are per module instance, so `pool()` traffic is invisible here: a\npool's queries run in workers, each with its own copy of this module and\nits own channels ([docs/concurrency.md](docs/concurrency.md#the-pool)).\n\n**node:sqlite drop-in** — code written against the built-in module can\nswitch without rewriting:\n\n```js\nimport { DatabaseSync } from \"@appthreat/sqlite3/compat\";\nconst db = new DatabaseSync(\":memory:\"); // opens synchronously\ndb.exec(\"CREATE TABLE t (a)\");\nconst row = db.prepare(\"SELECT * FROM t WHERE a = ?\").get(1);\n```\n\nThe shim maps onto the sync fast path (re-entrant UDFs included) and\nexposes the full async surface through `db.native`. The places a\nsynchronous form cannot exist keep this package's async signatures and\nare listed at the top of [lib/compat.js](lib/compat.js): sessions,\n`serialize`, and `close()`, which finalizes the statements it prepared\n(as `node:sqlite` does) and then *starts* the close rather than\ncompleting it (`await using`, or `await db.native.close()`, when a caller\nmust know the file is free — deleting or reopening it on Windows).\n`StatementSync.iterate()` materialises its rows, because the sync path has\nno mid-cursor suspension.\n\n## Worker threads and the connection pool (v9)\n\nThe addon is context-aware: it loads cleanly in every `worker_threads`\nworker, and each environment gets its own constructors. Two supported\nways to use it from workers — plus the pool, which is the batteries-\nincluded version:\n\n**Path handoff** — the worker opens its own connection to the same file\n(WAL mode gives real read concurrency):\n\n```js\nconst w = new Worker(\"./db-worker.js\", {\n  workerData: { filename: \"app.db\" },\n});\n```\n\n**Bytes handoff** — move an in-memory database across threads with one\ncopy (`serializeToBytes()` → transfer → `deserializeFromBytes()`):\n\n```js\nconst bytes = await db.serializeToBytes();\nconst movable = bytes.slice().buffer; // plain ArrayBuffer copy\nw.postMessage({ bytes: movable }, [movable]);\n// worker: await sqlite3.deserializeFromBytes(new Uint8Array(bytes))\n```\n\n**The pool** — one writer plus N read-only reader connections, each on\nits own worker; writes queue instead of racing to `SQLITE_BUSY`:\n\n```js\nconst pool = await sqlite3.pool(\"app.db\", { readers: 4 });\n\nconst rows = await pool.read(\"SELECT * FROM t WHERE a = ?\", [1]);\nconst one = await pool.get(\"SELECT b FROM t WHERE a = ?\", [1]);\nawait pool.write(\"INSERT INTO t (b) VALUES (?)\", [\"hi\"]);\n\nawait pool.transaction(async (tx) => {\n  const row = await tx.get(\"SELECT a FROM t\"); // pinned to the writer\n  await tx.write(\"UPDATE t SET a = ?\", [row.a + 1]);\n});\n\nawait pool.close(); // drains, closes every connection, no worker survives\n```\n\nQueries accept `{ signal }` (cancellation crosses the thread boundary\nthrough a shared-memory flag), errors keep `code`/`errno`/`primaryCode`,\nand `await using pool` works. Rows are structured-cloned across the\nboundary: blob columns come back as `Uint8Array` (not `Buffer`) and huge\nresult sets pay a copy — the pool is for many small queries, not bulk\nreads. See [docs/concurrency.md](docs/concurrency.md) for the full\npicture: `serialize()`/`parallelize()` semantics, WAL, busy timeouts,\nand when to use one connection, several, or the pool.\n\n## Using with Kysely and Drizzle\n\nBoth major ORMs need only what this package already has — no separate\ndialect package. For **Kysely** (async-native, the natural fit) a\nworking dialect is ~40 lines over one connection:\n`acquireConnection`/`releaseConnection` hand out the database, the\ntransaction verbs are raw `BEGIN`/`COMMIT`/`ROLLBACK`, and Kysely's own\n`SqliteAdapter`/`SqliteIntrospector`/`SqliteQueryCompiler` fill the\nrest —\n[examples/kysely-dialect.mjs](examples/kysely-dialect.mjs) is a\nzero-dependency template:\n\n```js\nimport { kyselyFor } from \"./examples/kysely-dialect.mjs\";\nconst kysely = kyselyFor(db, {\n  onCreateConnection: (c) => c.pragma(\"journal_mode = WAL\"),\n});\nconst rows = await kysely.selectFrom(\"users\").selectAll().execute();\n```\n\nFor **Drizzle** (whose SQLite dialect is synchronous), map onto the\nsync fast path: `prepare` → `db.prepareSync`, `run`/`all`/`get` → the\n`*Sync` methods, `transaction` → `db.transaction(fn, { mode: \"immediate\" })`.\nDrizzle's better-sqlite3 driver is ~100 lines; the deltas are those\nthree substitutions plus reading `lastInsertRowid` from the run result.\n\n## Source install\n\nTo skip searching for pre-compiled binaries, and force a build from source, use\n\n```bash\nnpm install --build-from-source\n```\n\nThe sqlite3 module depends only on libsqlite3. However, by default, an internal/bundled copy of sqlite will be built and statically linked, so an externally installed sqlite3 is not required.\n\nIf you wish to install against an external sqlite then you need to pass the `--sqlite` argument to `npm` wrapper:\n\n```bash\nnpm install --build-from-source --sqlite=/usr/local\n```\n\nIf building against an external sqlite3 make sure to have the development headers available. Mac OS X ships with these by default. If you don't have them installed, install the `-dev` package with your package manager, e.g. `apt-get install libsqlite3-dev` for Debian/Ubuntu. Make sure that you have at least `libsqlite3` >= 3.6.\n\nNote, if building against homebrew-installed sqlite on OS X you can do:\n\n```bash\nnpm install --build-from-source --sqlite=/usr/local/opt/sqlite/\n```\n\n## Custom file header (magic)\n\nThe default sqlite file header is “SQLite format 3”. You can specify a different magic, though this will make standard tools and libraries unable to work with your files.\n\n```bash\nnpm install --build-from-source --sqlite_magic=”MyCustomMagic15”\n```\n\nNote that the magic _must_ be exactly 15 characters long (16 bytes including null terminator).\n\n## SQLCipher (encrypted databases)\n\nSQLCipher is supported via a **source build** — no prebuild ships with\nSQLCipher, because the encryption runtime must come from your system's\nSQLCipher. Build flags, Homebrew/Linux paths and the Electron variant are\nin [docs/security.md#sqlcipher](docs/security.md#sqlcipher).\n\n### Custom builds and Electron\n\nThe default build needs **no Electron-specific step at all**: v9 ships Node-API\n10 prebuilds and Node-API is ABI-stable across runtimes, so the prebuild loads\nin Electron >= 35 unchanged (see [Electron](#electron) above and\n[docs/electron.md](docs/electron.md)).\n\nRunning a **source** build (SQLCipher, custom `sqlite_magic`) against Electron\nheaders needs extra flags for `npm install sqlite3 --build-from-source`\n(replace the target with your Electron version):\n\n```bash\n--runtime=electron --target=44.0.0 --dist-url=https://electronjs.org/headers\n```\n\nThe SQLite location and library name go through `GYP_DEFINES`, not\ncommand-line flags — node-gyp 13 treats anything after `--` as a\nbuild-file name. For macOS with Homebrew:\n\n```bash\nexport GYP_DEFINES=\"sqlite=$(brew --prefix) sqlite_libname=sqlcipher\"\nnpm install @appthreat/sqlite3 --build-from-source \\\n    --runtime=electron --target=44.0.0 --dist-url=https://electronjs.org/headers\n```\n\nSQLCipher needs the session extension enabled, which packaged builds\nusually omit — see [docs/security.md](docs/security.md#sqlcipher).\n\n# Security\n\nThe security posture — what this package does and does not protect\nagainst, the Node `--permission` interaction (and how the checks refuse\nout-of-scope file access), the `untrusted: true` recipe for hostile\ndatabase files, extension-loading policy, and the vendored-SQLite CVE\npolicy — is documented in [docs/security.md](docs/security.md).\nVulnerability reporting is in [SECURITY.md](SECURITY.md).\n\n# Testing\n\n```bash\npnpm run test\n```\n\n# Developing\n\nDevelopment of this repo itself requires **pnpm >= 11** (`corepack enable`, or a\nstandalone install). Clone, then:\n\n```bash\npnpm install          # also builds the native binding via the install script\npnpm run rebuild      # recompile after changing C++ (node-gyp rebuild)\npnpm run lint         # biome check --write (autofix; CI runs lint:check)\npnpm run test         # node:test, 20s per-test timeout, files run in parallel\npnpm run prebuild     # produce the shipping prebuilds/ artifacts\npnpm run test:electron # the full suite + app-env harness inside Electron\npnpm run test:matrix   # the suite across glibc/musl containers (needs Docker)\n```\n\n`test:matrix` exists for the failures that do not reproduce on a developer\nmachine — a musl-only segfault, or a race that needs an older glibc, a\nspecific Node and a busy CPU before it shows up at all:\n\n```bash\nnode tools/test-matrix.mjs --list          # the targets and why each exists\nnode tools/test-matrix.mjs --cpus=1 --load=6   # simulate a slow CI runner\nnode tools/test-matrix.mjs --repeat=20 --cmd='node --test test/foo.test.js'\n```\n\nIt rebuilds the addon and regenerates fixtures inside each container,\nignoring your local `node_modules/`, `build/`, `prebuilds/` and `test/tmp/`,\nso a result does not depend on working-tree leftovers.\n\nAlways use `pnpm run rebuild`, never bare `pnpm rebuild` — the latter is a\npnpm builtin that rebuilds _dependencies_, not this repo's `rebuild` script.\nSee [docs/install.md](docs/install.md#development) for the full guide,\nincluding the stale-`prebuilds/` trap when iterating on C++.\n\n# Copyright & license\n\nCopyright (c) 2013-2025 Mapbox & Ghost Foundation\nCopyright (c) 2025-2026 Team AppThreat\n\n`@appthreat/sqlite3` is a fork of node-sqlite3 and is\n[BSD-3-Clause licensed](https://github.com/AppThreat/node-sqlite3/raw/master/LICENSE),\nthe same terms as the original. The vendored SQLite amalgamation is public\ndomain. See [LICENSE](LICENSE) for the full text and the attribution of prior\nwork.\n","readmeFilename":"README.md"}