{"_id":"@tryghost/brute-knex","_rev":"9-1fb0f8ad11b6729328874354831aa58e","name":"@tryghost/brute-knex","dist-tags":{"latest":"3.2.2"},"versions":{"3.0.0":{"name":"@tryghost/brute-knex","version":"3.0.0","keywords":["express","brute","knex"],"license":"ISC","_id":"@tryghost/brute-knex@3.0.0","maintainers":[{"name":"zimoatghost","email":"zimo@ghost.org"},{"name":"allouis","email":"fabien@allou.is"},{"name":"kernalghost","email":"matthew@ghost.org"},{"name":"chrisraible","email":"chris@ghost.org"},{"name":"erisds","email":"github.erisds@gmail.com"},{"name":"johnonolan","email":"john@onolan.org"},{"name":"kevinansfield","email":"kevin@ghost.org"},{"name":"cobbspur","email":"david@ghost.org"},{"name":"aileencgn","email":"aileen@ghost.org"},{"name":"jloh","email":"npmjs@jloh.co"},{"name":"minimaluminium","email":"sodbileg.gansukh@gmail.com"},{"name":"sam-lord","email":"hello@samlord.me"},{"name":"pauladamdavis","email":"paul@ghost.org"},{"name":"bobvaneck","email":"bobvaneck@gmail.com"},{"name":"joeegrigg","email":"account@joegrigg.com"},{"name":"hadret","email":"filip@ghost.org"},{"name":"jonhickman","email":"jon@theplan.co.uk"},{"name":"erik-ghost","email":"erik@ghost.org"},{"name":"sagzy","email":"guptazy@gmail.com"},{"name":"vershwal","email":"vershwal.princi@gmail.com"},{"name":"mike182uk","email":"mike182uk@gmail.com"},{"name":"luissazevedo","email":"luis@ghost.org"},{"name":"lsinger","email":"leif@ghost.org"},{"name":"nickmoreton","email":"nick@ghost.org"},{"name":"renatoworks","email":"renatocesarcp@gmail.com"},{"name":"rblstr-ghost","email":"rob@ghost.org"},{"name":"evanhahn-ghost","email":"evan@ghost.org"},{"name":"weylandswart","email":"weyland.swart@gmail.com"},{"name":"ghost-slimer","email":"info@ghost.org"},{"name":"tmciesco","email":"tmciesco@gmail.com"},{"name":"jonatan-ghost","email":"jonatan@ghost.org"},{"name":"9larsons","email":"9larsons@gmail.com"}],"homepage":"https://github.com/TryGhost/brute-knex#readme","bugs":{"url":"https://github.com/TryGhost/brute-knex/issues"},"dist":{"shasum":"c2a71e60dd58839e8d8280e97100be9b667d855c","tarball":"https://registry.npmjs.org/@tryghost/brute-knex/-/brute-knex-3.0.0.tgz","fileCount":5,"integrity":"sha512-NT3LGUAgMPpGBPD8CBhJ/dcfZatHT2bs+wy2DKA5ugyq7cXayn2suH1bjWkzJs/yd52nQNZgp0xYAVMegf/L3w==","signatures":[{"sig":"MEQCIGLl2n2Z9QOPvtkIHOEP+sYLCgu5PV+/DEPVtYT3xSU9AiAyjUGEBnvR7KFyktqWCNd/wXOTqdHp3DCtcB01MfAI9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13118},"main":"index.js","_from":"file:tryghost-brute-knex-3.0.0.tgz","types":"index.d.ts","engines":{"node":">=20.20.0"},"private":false,"scripts":{"lint":"oxlint --quiet && oxfmt --check . && pnpm run test:types","ship":"pro-ship --publish","test":"vitest run --coverage","format":"oxfmt .","preship":"pnpm lint && pnpm test","lint:fix":"oxlint --fix && oxfmt .","test:types":"tsc --noEmit -p tsconfig.types.json","test:e2e:mysql":"BRUTE_KNEX_DIALECTS=mysql vitest run --coverage","test:e2e:sqlite":"BRUTE_KNEX_DIALECTS=sqlite vitest run --coverage","test:e2e:postgres":"BRUTE_KNEX_DIALECTS=postgres vitest run --coverage"},"_npmUser":{"name":"aileencgn","email":"aileen@ghost.org"},"_resolved":"/private/var/folders/5p/nqbznz_s1yb60j0shlt4fhnh0000gn/T/cf68acc751311495ba3b030218576b1d/tryghost-brute-knex-3.0.0.tgz","_integrity":"sha512-NT3LGUAgMPpGBPD8CBhJ/dcfZatHT2bs+wy2DKA5ugyq7cXayn2suH1bjWkzJs/yd52nQNZgp0xYAVMegf/L3w==","repository":{"url":"git+ssh://git@github.com/TryGhost/brute-knex.git","type":"git"},"_npmVersion":"10.9.8","description":"A Knex.js store for express-brute","directories":{},"_nodeVersion":"22.23.1","dependencies":{"knex":"2.5.1","lodash":"4.18.1","express-brute":"1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"8.22.0","oxfmt":"0.56.0","mysql2":"3.22.5","oxlint":"1.71.0","vitest":"4.1.9","sqlite3":"6.0.1","typescript":"6.0.3","@tryghost/pro-ship":"1.1.4","@vitest/coverage-v8":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/brute-knex_3.0.0_1782471733663_0.561232240884741","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@tryghost/brute-knex","version":"3.1.0","keywords":["express","brute","knex"],"license":"ISC","_id":"@tryghost/brute-knex@3.1.0","maintainers":[{"name":"zimoatghost","email":"zimo@ghost.org"},{"name":"allouis","email":"fabien@allou.is"},{"name":"kernalghost","email":"matthew@ghost.org"},{"name":"chrisraible","email":"chris@ghost.org"},{"name":"erisds","email":"github.erisds@gmail.com"},{"name":"johnonolan","email":"john@onolan.org"},{"name":"kevinansfield","email":"kevin@ghost.org"},{"name":"cobbspur","email":"david@ghost.org"},{"name":"aileencgn","email":"aileen@ghost.org"},{"name":"jloh","email":"npmjs@jloh.co"},{"name":"minimaluminium","email":"sodbileg.gansukh@gmail.com"},{"name":"sam-lord","email":"hello@samlord.me"},{"name":"pauladamdavis","email":"paul@ghost.org"},{"name":"bobvaneck","email":"bobvaneck@gmail.com"},{"name":"joeegrigg","email":"account@joegrigg.com"},{"name":"hadret","email":"filip@ghost.org"},{"name":"jonhickman","email":"jon@theplan.co.uk"},{"name":"erik-ghost","email":"erik@ghost.org"},{"name":"sagzy","email":"guptazy@gmail.com"},{"name":"vershwal","email":"vershwal.princi@gmail.com"},{"name":"mike182uk","email":"mike182uk@gmail.com"},{"name":"luissazevedo","email":"luis@ghost.org"},{"name":"lsinger","email":"leif@ghost.org"},{"name":"nickmoreton","email":"nick@ghost.org"},{"name":"renatoworks","email":"renatocesarcp@gmail.com"},{"name":"rblstr-ghost","email":"rob@ghost.org"},{"name":"evanhahn-ghost","email":"evan@ghost.org"},{"name":"weylandswart","email":"weyland.swart@gmail.com"},{"name":"ghost-slimer","email":"info@ghost.org"},{"name":"tmciesco","email":"tmciesco@gmail.com"},{"name":"jonatan-ghost","email":"jonatan@ghost.org"},{"name":"9larsons","email":"9larsons@gmail.com"}],"homepage":"https://github.com/TryGhost/brute-knex#readme","bugs":{"url":"https://github.com/TryGhost/brute-knex/issues"},"dist":{"shasum":"6f500fb98f6c154dcf7eec36709f32227ee4a350","tarball":"https://registry.npmjs.org/@tryghost/brute-knex/-/brute-knex-3.1.0.tgz","fileCount":5,"integrity":"sha512-IFgJBdtL43rvvDdDKAPiQWGiura59wKw92xn4LgyCSTHGzODHMy8lgSTI6yJWv7I5uDTNYyjix26BxcnWjmKDA==","signatures":[{"sig":"MEQCIA+DEDcMtw+5yDZHH3q5x4rZYE3Ss3zFuq+CxY4vFg1qAiAQC/jON3eqSP6af/wxr8SDmr+0wF6OsxWEBgzbJUs/tw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12253},"main":"index.js","_from":"file:tryghost-brute-knex-3.1.0.tgz","types":"index.d.ts","engines":{"node":">=20.20.0"},"private":false,"scripts":{"lint":"oxlint --quiet && oxfmt --check . && pnpm run test:types","ship":"pro-ship --publish","test":"vitest run --coverage","format":"oxfmt .","preship":"pnpm lint && pnpm test","lint:fix":"oxlint --fix && oxfmt .","test:types":"tsc --noEmit -p tsconfig.types.json","test:e2e:mysql":"BRUTE_KNEX_DIALECTS=mysql vitest run --coverage","test:e2e:sqlite":"BRUTE_KNEX_DIALECTS=sqlite vitest run --coverage","test:e2e:postgres":"BRUTE_KNEX_DIALECTS=postgres vitest run --coverage"},"_npmUser":{"name":"aileencgn","email":"aileen@ghost.org"},"_resolved":"/private/var/folders/5p/nqbznz_s1yb60j0shlt4fhnh0000gn/T/449f5956189c70e95ef4b22b129d4da8/tryghost-brute-knex-3.1.0.tgz","_integrity":"sha512-IFgJBdtL43rvvDdDKAPiQWGiura59wKw92xn4LgyCSTHGzODHMy8lgSTI6yJWv7I5uDTNYyjix26BxcnWjmKDA==","repository":{"url":"git+ssh://git@github.com/TryGhost/brute-knex.git","type":"git"},"_npmVersion":"10.9.8","description":"A Knex.js store for express-brute","directories":{},"_nodeVersion":"22.23.1","dependencies":{"knex":"2.5.1","express-brute":"1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"8.22.0","oxfmt":"0.56.0","mysql2":"3.22.5","oxlint":"1.71.0","vitest":"4.1.9","sqlite3":"6.0.1","typescript":"6.0.3","@tryghost/pro-ship":"1.1.4","@vitest/coverage-v8":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/brute-knex_3.1.0_1782721663559_0.2538418760576491","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"@tryghost/brute-knex","version":"3.1.1","keywords":["express","brute","knex"],"license":"ISC","_id":"@tryghost/brute-knex@3.1.1","maintainers":[{"name":"zimoatghost","email":"zimo@ghost.org"},{"name":"allouis","email":"fabien@allou.is"},{"name":"kernalghost","email":"matthew@ghost.org"},{"name":"chrisraible","email":"chris@ghost.org"},{"name":"erisds","email":"github.erisds@gmail.com"},{"name":"johnonolan","email":"john@onolan.org"},{"name":"kevinansfield","email":"kevin@ghost.org"},{"name":"cobbspur","email":"david@ghost.org"},{"name":"aileencgn","email":"aileen@ghost.org"},{"name":"jloh","email":"npmjs@jloh.co"},{"name":"minimaluminium","email":"sodbileg.gansukh@gmail.com"},{"name":"sam-lord","email":"hello@samlord.me"},{"name":"pauladamdavis","email":"paul@ghost.org"},{"name":"bobvaneck","email":"bobvaneck@gmail.com"},{"name":"joeegrigg","email":"account@joegrigg.com"},{"name":"hadret","email":"filip@ghost.org"},{"name":"jonhickman","email":"jon@theplan.co.uk"},{"name":"erik-ghost","email":"erik@ghost.org"},{"name":"sagzy","email":"guptazy@gmail.com"},{"name":"vershwal","email":"vershwal.princi@gmail.com"},{"name":"zach1618","email":"zach@ghost.org"},{"name":"mike182uk","email":"mike182uk@gmail.com"},{"name":"luissazevedo","email":"luis@ghost.org"},{"name":"lsinger","email":"leif@ghost.org"},{"name":"nickmoreton","email":"nick@ghost.org"},{"name":"renatoworks","email":"renatocesarcp@gmail.com"},{"name":"rblstr-ghost","email":"rob@ghost.org"},{"name":"evanhahn-ghost","email":"evan@ghost.org"},{"name":"weylandswart","email":"weyland.swart@gmail.com"},{"name":"ghost-slimer","email":"info@ghost.org"},{"name":"tmciesco","email":"tmciesco@gmail.com"},{"name":"jonatan-ghost","email":"jonatan@ghost.org"},{"name":"9larsons","email":"9larsons@gmail.com"}],"homepage":"https://github.com/TryGhost/brute-knex#readme","bugs":{"url":"https://github.com/TryGhost/brute-knex/issues"},"dist":{"shasum":"47cddc7bb4cf673e6fecfd87bd8647731f29834e","tarball":"https://registry.npmjs.org/@tryghost/brute-knex/-/brute-knex-3.1.1.tgz","fileCount":5,"integrity":"sha512-hUIkGq4X283ZPTRaLZTR5HU4eZ8UETo3KLxpXcE5gCClLoxOxMM3UwW6yM5/tcq+JP1rfxk6jS3TfnOYrMndPQ==","signatures":[{"sig":"MEUCIQCG1v2damEV4Is5uq6ZDe0C6FI4UI4unFUpS42P3m54ewIgGZSFTpH8+y6YCoSAuXzPV0KEnckyYnbinhwbxpXTZWY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tryghost%2fbrute-knex@3.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12568},"main":"index.js","_from":"file:tryghost-brute-knex-3.1.1.tgz","types":"index.d.ts","engines":{"node":">=20.20.0"},"private":false,"scripts":{"lint":"oxlint --quiet && oxfmt --check . && pnpm run test:types","ship":"pro-ship","test":"vitest run --coverage","format":"oxfmt .","preship":"pnpm lint && pnpm test","lint:fix":"oxlint --fix && oxfmt .","test:types":"tsc --noEmit -p tsconfig.types.json","test:e2e:mysql":"BRUTE_KNEX_DIALECTS=mysql vitest run --coverage","test:e2e:sqlite":"BRUTE_KNEX_DIALECTS=sqlite vitest run --coverage","test:e2e:postgres":"BRUTE_KNEX_DIALECTS=postgres vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93448fb3-7209-4b3b-959e-3e9761f6ef5f"}},"_resolved":"/tmp/741eb4465d41718b59098e514c0a1339/tryghost-brute-knex-3.1.1.tgz","_integrity":"sha512-hUIkGq4X283ZPTRaLZTR5HU4eZ8UETo3KLxpXcE5gCClLoxOxMM3UwW6yM5/tcq+JP1rfxk6jS3TfnOYrMndPQ==","repository":{"url":"git+ssh://git@github.com/TryGhost/brute-knex.git","type":"git"},"_npmVersion":"11.11.0","description":"A Knex.js store for express-brute","directories":{},"_nodeVersion":"24.14.1","dependencies":{"knex":"2.5.1","express-brute":"1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"8.22.0","oxfmt":"0.57.0","mysql2":"3.22.5","oxlint":"1.72.0","vitest":"4.1.9","sqlite3":"6.0.1","typescript":"6.0.3","@tryghost/pro-ship":"1.1.4","@vitest/coverage-v8":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/brute-knex_3.1.1_1783321449532_0.6210031615615415","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@tryghost/brute-knex","version":"3.2.0","keywords":["express","brute","knex"],"license":"ISC","_id":"@tryghost/brute-knex@3.2.0","maintainers":[{"name":"zimoatghost","email":"zimo@ghost.org"},{"name":"allouis","email":"fabien@allou.is"},{"name":"kernalghost","email":"matthew@ghost.org"},{"name":"chrisraible","email":"chris@ghost.org"},{"name":"erisds","email":"github.erisds@gmail.com"},{"name":"johnonolan","email":"john@onolan.org"},{"name":"kevinansfield","email":"kevin@ghost.org"},{"name":"cobbspur","email":"david@ghost.org"},{"name":"aileencgn","email":"aileen@ghost.org"},{"name":"jloh","email":"npmjs@jloh.co"},{"name":"minimaluminium","email":"sodbileg.gansukh@gmail.com"},{"name":"sam-lord","email":"hello@samlord.me"},{"name":"pauladamdavis","email":"paul@ghost.org"},{"name":"bobvaneck","email":"bobvaneck@gmail.com"},{"name":"joeegrigg","email":"account@joegrigg.com"},{"name":"hadret","email":"filip@ghost.org"},{"name":"jonhickman","email":"jon@theplan.co.uk"},{"name":"erik-ghost","email":"erik@ghost.org"},{"name":"sagzy","email":"guptazy@gmail.com"},{"name":"vershwal","email":"vershwal.princi@gmail.com"},{"name":"zach1618","email":"zach@ghost.org"},{"name":"mike182uk","email":"mike182uk@gmail.com"},{"name":"luissazevedo","email":"luis@ghost.org"},{"name":"lsinger","email":"leif@ghost.org"},{"name":"nickmoreton","email":"nick@ghost.org"},{"name":"renatoworks","email":"renatocesarcp@gmail.com"},{"name":"rblstr-ghost","email":"rob@ghost.org"},{"name":"evanhahn-ghost","email":"evan@ghost.org"},{"name":"weylandswart","email":"weyland.swart@gmail.com"},{"name":"ghost-slimer","email":"info@ghost.org"},{"name":"tmciesco","email":"tmciesco@gmail.com"},{"name":"jonatan-ghost","email":"jonatan@ghost.org"},{"name":"9larsons","email":"9larsons@gmail.com"}],"homepage":"https://github.com/TryGhost/brute-knex#readme","bugs":{"url":"https://github.com/TryGhost/brute-knex/issues"},"dist":{"shasum":"c4c9378b668b46c8ebc8a2f4331d3e2bd085ae78","tarball":"https://registry.npmjs.org/@tryghost/brute-knex/-/brute-knex-3.2.0.tgz","fileCount":5,"integrity":"sha512-x1e/Eh897AT6Q/XkTQz2HcgI0vJqrRtvdQH22qWBMghXIXXoevJuXqYVHrZwq00x9XyIdeoreG0ZzLA3OB3Irg==","signatures":[{"sig":"MEUCIQC3QELIXK6e5m1fg9h+WwffffOv2rMPll7NgE2hFzYX1wIgXpFnP+ENhDzvc7aezLSj/bchZQ08SowH8I8hWJ2nlfI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tryghost%2fbrute-knex@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12692},"main":"index.js","_from":"file:tryghost-brute-knex-3.2.0.tgz","types":"index.d.ts","engines":{"node":">=20.20.0"},"private":false,"scripts":{"lint":"oxlint --quiet && oxfmt --check . && pnpm run test:types","ship":"pro-ship","test":"vitest run --coverage","format":"oxfmt .","preship":"pnpm lint && pnpm test","lint:fix":"oxlint --fix && oxfmt .","test:types":"tsc --noEmit -p tsconfig.types.json","test:e2e:mysql":"BRUTE_KNEX_DIALECTS=mysql vitest run --coverage","test:e2e:sqlite":"BRUTE_KNEX_DIALECTS=sqlite vitest run --coverage","test:e2e:postgres":"BRUTE_KNEX_DIALECTS=postgres vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93448fb3-7209-4b3b-959e-3e9761f6ef5f"}},"_resolved":"/tmp/4e6e4720c9a271d588410bfb6f2297e3/tryghost-brute-knex-3.2.0.tgz","_integrity":"sha512-x1e/Eh897AT6Q/XkTQz2HcgI0vJqrRtvdQH22qWBMghXIXXoevJuXqYVHrZwq00x9XyIdeoreG0ZzLA3OB3Irg==","repository":{"url":"git+ssh://git@github.com/TryGhost/brute-knex.git","type":"git"},"_npmVersion":"11.16.0","description":"A Knex.js store for express-brute","directories":{},"_nodeVersion":"24.18.0","dependencies":{"knex":"2.4.2","express-brute":"1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"8.22.0","oxfmt":"0.57.0","mysql2":"3.22.5","oxlint":"1.72.0","vitest":"4.1.9","sqlite3":"6.0.1","typescript":"6.0.3","@tryghost/pro-ship":"1.1.5","@vitest/coverage-v8":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/brute-knex_3.2.0_1783409593983_0.5462602831851595","host":"s3://npm-registry-packages-npm-production"}},"3.2.1":{"name":"@tryghost/brute-knex","version":"3.2.1","keywords":["express","brute","knex"],"license":"ISC","_id":"@tryghost/brute-knex@3.2.1","maintainers":[{"name":"zimoatghost","email":"zimo@ghost.org"},{"name":"allouis","email":"fabien@allou.is"},{"name":"kernalghost","email":"matthew@ghost.org"},{"name":"chrisraible","email":"chris@ghost.org"},{"name":"erisds","email":"github.erisds@gmail.com"},{"name":"johnonolan","email":"john@onolan.org"},{"name":"kevinansfield","email":"kevin@ghost.org"},{"name":"cobbspur","email":"david@ghost.org"},{"name":"aileencgn","email":"aileen@ghost.org"},{"name":"jloh","email":"npmjs@jloh.co"},{"name":"minimaluminium","email":"sodbileg.gansukh@gmail.com"},{"name":"sam-lord","email":"hello@samlord.me"},{"name":"pauladamdavis","email":"paul@ghost.org"},{"name":"bobvaneck","email":"bobvaneck@gmail.com"},{"name":"joeegrigg","email":"account@joegrigg.com"},{"name":"hadret","email":"filip@ghost.org"},{"name":"jonhickman","email":"jon@theplan.co.uk"},{"name":"erik-ghost","email":"erik@ghost.org"},{"name":"sagzy","email":"guptazy@gmail.com"},{"name":"vershwal","email":"vershwal.princi@gmail.com"},{"name":"zach1618","email":"zach@ghost.org"},{"name":"mike182uk","email":"mike182uk@gmail.com"},{"name":"luissazevedo","email":"luis@ghost.org"},{"name":"lsinger","email":"leif@ghost.org"},{"name":"nickmoreton","email":"nick@ghost.org"},{"name":"renatoworks","email":"renatocesarcp@gmail.com"},{"name":"rblstr-ghost","email":"rob@ghost.org"},{"name":"evanhahn-ghost","email":"evan@ghost.org"},{"name":"weylandswart","email":"weyland.swart@gmail.com"},{"name":"ghost-slimer","email":"info@ghost.org"},{"name":"tmciesco","email":"tmciesco@gmail.com"},{"name":"jonatan-ghost","email":"jonatan@ghost.org"},{"name":"9larsons","email":"9larsons@gmail.com"}],"homepage":"https://github.com/TryGhost/brute-knex#readme","bugs":{"url":"https://github.com/TryGhost/brute-knex/issues"},"dist":{"shasum":"02e07b51013e4ef023b88f57b6d2f3d3023942c9","tarball":"https://registry.npmjs.org/@tryghost/brute-knex/-/brute-knex-3.2.1.tgz","fileCount":5,"integrity":"sha512-1Q1CzpDuWNRrejD4sbSZF4CAJ9RTuZWLuQH1BjcC1U6+5sTY3cbnRv4w6mmxGHbUxWJ0kwbP10UM+ODheGaL7A==","signatures":[{"sig":"MEQCIH8MVBYFq+x/WyQQ6shg/h3aMRj0brdugXPShy/ucRJIAiB61qD+sB9J0bVZxePN9O4jB3nnkka8Bi3+h1V67x1RGw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tryghost%2fbrute-knex@3.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12694},"main":"index.js","_from":"file:tryghost-brute-knex-3.2.1.tgz","types":"index.d.ts","engines":{"node":">=20.20.0"},"private":false,"scripts":{"lint":"oxlint --quiet && oxfmt --check . && pnpm run test:types","ship":"pro-ship","test":"vitest run --coverage","format":"oxfmt .","preship":"pnpm lint && pnpm test","lint:fix":"oxlint --fix && oxfmt .","test:types":"tsc --noEmit -p tsconfig.types.json","test:e2e:mysql":"BRUTE_KNEX_DIALECTS=mysql vitest run --coverage","test:e2e:sqlite":"BRUTE_KNEX_DIALECTS=sqlite vitest run --coverage","test:e2e:postgres":"BRUTE_KNEX_DIALECTS=postgres vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93448fb3-7209-4b3b-959e-3e9761f6ef5f"}},"_resolved":"/tmp/48529e9201ebce59a358752b6a3014fa/tryghost-brute-knex-3.2.1.tgz","_integrity":"sha512-1Q1CzpDuWNRrejD4sbSZF4CAJ9RTuZWLuQH1BjcC1U6+5sTY3cbnRv4w6mmxGHbUxWJ0kwbP10UM+ODheGaL7A==","repository":{"url":"git+ssh://git@github.com/TryGhost/brute-knex.git","type":"git"},"_npmVersion":"11.16.0","description":"A Knex.js store for express-brute","directories":{},"_nodeVersion":"24.18.0","dependencies":{"knex":"2.4.2","express-brute":"1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"8.22.0","oxfmt":"0.58.0","mysql2":"3.22.6","oxlint":"1.73.0","vitest":"4.1.10","sqlite3":"6.0.1","typescript":"7.0.2","@tryghost/pro-ship":"1.1.5","@vitest/coverage-v8":"4.1.10"},"_npmOperationalInternal":{"tmp":"tmp/brute-knex_3.2.1_1784035538857_0.5399440207792248","host":"s3://npm-registry-packages-npm-production"}},"3.2.2":{"name":"@tryghost/brute-knex","version":"3.2.2","description":"A Knex.js store for express-brute","keywords":["express","brute","knex"],"license":"ISC","private":false,"publishConfig":{"access":"public"},"main":"index.js","types":"index.d.ts","engines":{"node":">=20.20.0"},"repository":{"type":"git","url":"git+ssh://git@github.com/TryGhost/brute-knex.git"},"devDependencies":{"@tryghost/pro-ship":"1.1.7","@vitest/coverage-v8":"4.1.10","mysql2":"3.23.2","oxfmt":"0.61.0","oxlint":"1.76.0","pg":"8.22.0","sqlite3":"6.0.1","typescript":"7.0.2","vitest":"4.1.10"},"dependencies":{"express-brute":"1.0.1","knex":"2.4.2"},"scripts":{"format":"oxfmt .","lint":"oxlint --quiet && oxfmt --check . && pnpm run test:types","lint:fix":"oxlint --fix && oxfmt .","preship":"pnpm lint && pnpm test","ship":"pro-ship","test":"vitest run --coverage","test:e2e:sqlite":"BRUTE_KNEX_DIALECTS=sqlite vitest run --coverage","test:e2e:mysql":"BRUTE_KNEX_DIALECTS=mysql vitest run --coverage","test:e2e:postgres":"BRUTE_KNEX_DIALECTS=postgres vitest run --coverage","test:types":"tsc --noEmit -p tsconfig.types.json"},"_id":"@tryghost/brute-knex@3.2.2","bugs":{"url":"https://github.com/TryGhost/brute-knex/issues"},"homepage":"https://github.com/TryGhost/brute-knex#readme","_integrity":"sha512-wdhqZV5klysUO+0ZthzxkaWiSxqKKoJm7rkqby3llt5FHZTU5yiaJ55yraio9knm5MHqfDd+IFspNTKEjAnsIw==","_resolved":"/tmp/fd1ccff4cd0acebdcae475e12558ac93/tryghost-brute-knex-3.2.2.tgz","_from":"file:tryghost-brute-knex-3.2.2.tgz","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-wdhqZV5klysUO+0ZthzxkaWiSxqKKoJm7rkqby3llt5FHZTU5yiaJ55yraio9knm5MHqfDd+IFspNTKEjAnsIw==","shasum":"d3655741849f7b6d7e20f6e45323483b275733af","tarball":"https://registry.npmjs.org/@tryghost/brute-knex/-/brute-knex-3.2.2.tgz","fileCount":5,"unpackedSize":12694,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tryghost%2fbrute-knex@3.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFvTIo2x+HgvS0Ko/Ct4tha/0NwhKVq0DaiuYyLNU4tfAiALO4fKaATe69WzwQeAeK9NmG1vpy8Kz6PH7cAgjuEXfw=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93448fb3-7209-4b3b-959e-3e9761f6ef5f"}},"directories":{},"maintainers":[{"name":"zimoatghost","email":"zimo@ghost.org"},{"name":"allouis","email":"fabien@allou.is"},{"name":"kernalghost","email":"matthew@ghost.org"},{"name":"chrisraible","email":"chris@ghost.org"},{"name":"erisds","email":"github.erisds@gmail.com"},{"name":"johnonolan","email":"john@onolan.org"},{"name":"kevinansfield","email":"kevin@ghost.org"},{"name":"cobbspur","email":"david@ghost.org"},{"name":"aileencgn","email":"aileen@ghost.org"},{"name":"jloh","email":"npmjs@jloh.co"},{"name":"minimaluminium","email":"sodbileg.gansukh@gmail.com"},{"name":"sam-lord","email":"hello@samlord.me"},{"name":"pauladamdavis","email":"paul@ghost.org"},{"name":"bobvaneck","email":"bobvaneck@gmail.com"},{"name":"joeegrigg","email":"account@joegrigg.com"},{"name":"hadret","email":"filip@ghost.org"},{"name":"erik-ghost","email":"erik@ghost.org"},{"name":"sagzy","email":"guptazy@gmail.com"},{"name":"vershwal","email":"vershwal.princi@gmail.com"},{"name":"zach1618","email":"zach@ghost.org"},{"name":"mike182uk","email":"mike182uk@gmail.com"},{"name":"luissazevedo","email":"luis@ghost.org"},{"name":"lsinger","email":"leif@ghost.org"},{"name":"nickmoreton","email":"nick@ghost.org"},{"name":"renatoworks","email":"renatocesarcp@gmail.com"},{"name":"rblstr-ghost","email":"rob@ghost.org"},{"name":"evanhahn-ghost","email":"evan@ghost.org"},{"name":"austin.burdine","email":"austin@ghost.org"},{"name":"weylandswart","email":"weyland.swart@gmail.com"},{"name":"ghost-slimer","email":"info@ghost.org"},{"name":"tmciesco","email":"tmciesco@gmail.com"},{"name":"jonatan-ghost","email":"jonatan@ghost.org"},{"name":"9larsons","email":"9larsons@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/brute-knex_3.2.2_1785914738248_0.7983197657810408"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-26T11:02:13.524Z","modified":"2026-08-05T07:25:39.351Z","3.0.0":"2026-06-26T11:02:13.839Z","3.1.0":"2026-06-29T08:27:43.681Z","3.1.1":"2026-07-06T07:04:09.676Z","3.2.0":"2026-07-07T07:33:14.133Z","3.2.1":"2026-07-14T13:25:38.996Z","3.2.2":"2026-08-05T07:25:38.377Z"},"bugs":{"url":"https://github.com/TryGhost/brute-knex/issues"},"license":"ISC","homepage":"https://github.com/TryGhost/brute-knex#readme","keywords":["express","brute","knex"],"repository":{"type":"git","url":"git+ssh://git@github.com/TryGhost/brute-knex.git"},"description":"A Knex.js store for express-brute","maintainers":[{"name":"zimoatghost","email":"zimo@ghost.org"},{"name":"allouis","email":"fabien@allou.is"},{"name":"kernalghost","email":"matthew@ghost.org"},{"name":"chrisraible","email":"chris@ghost.org"},{"name":"erisds","email":"github.erisds@gmail.com"},{"name":"johnonolan","email":"john@onolan.org"},{"name":"kevinansfield","email":"kevin@ghost.org"},{"name":"cobbspur","email":"david@ghost.org"},{"name":"aileencgn","email":"aileen@ghost.org"},{"name":"jloh","email":"npmjs@jloh.co"},{"name":"minimaluminium","email":"sodbileg.gansukh@gmail.com"},{"name":"sam-lord","email":"hello@samlord.me"},{"name":"pauladamdavis","email":"paul@ghost.org"},{"name":"bobvaneck","email":"bobvaneck@gmail.com"},{"name":"joeegrigg","email":"account@joegrigg.com"},{"name":"hadret","email":"filip@ghost.org"},{"name":"erik-ghost","email":"erik@ghost.org"},{"name":"sagzy","email":"guptazy@gmail.com"},{"name":"vershwal","email":"vershwal.princi@gmail.com"},{"name":"zach1618","email":"zach@ghost.org"},{"name":"mike182uk","email":"mike182uk@gmail.com"},{"name":"luissazevedo","email":"luis@ghost.org"},{"name":"lsinger","email":"leif@ghost.org"},{"name":"nickmoreton","email":"nick@ghost.org"},{"name":"renatoworks","email":"renatocesarcp@gmail.com"},{"name":"rblstr-ghost","email":"rob@ghost.org"},{"name":"evanhahn-ghost","email":"evan@ghost.org"},{"name":"austin.burdine","email":"austin@ghost.org"},{"name":"weylandswart","email":"weyland.swart@gmail.com"},{"name":"ghost-slimer","email":"info@ghost.org"},{"name":"tmciesco","email":"tmciesco@gmail.com"},{"name":"jonatan-ghost","email":"jonatan@ghost.org"},{"name":"9larsons","email":"9larsons@gmail.com"}],"readme":"# @tryghost/brute-knex\n\nKnex-backed store for [express-brute](https://github.com/AdamPflug/express-brute) that persists rate-limit state in SQL databases.\n\n## What It Does\n\n`@tryghost/brute-knex` lets `express-brute` share brute-force counters through a Knex table instead of keeping them in process memory. It can create its storage table automatically, use a caller-provided Knex instance, or fall back to a local SQLite database when no Knex instance is supplied.\n\nThe package supports Node.js `>=20.20.0`. CI exercises the store against SQLite, MySQL, and Postgres using Knex `2.4.2`, the version currently shared by Ghost and Daisy.\n\n## Installation\n\nInstall the package and the Knex database driver your app uses:\n\n```sh\nnpm install @tryghost/brute-knex knex mysql2\n```\n\nUse `pg` instead of `mysql2` for Postgres, or `sqlite3` for SQLite.\n\n## Usage\n\n```js\nconst ExpressBrute = require('express-brute');\nconst Knex = require('knex');\nconst BruteKnex = require('@tryghost/brute-knex');\n\nconst knex = Knex({\n    client: 'mysql2',\n    connection: {\n        host: '127.0.0.1',\n        user: 'root',\n        password: 'root',\n        database: 'brute_knex'\n    }\n});\n\nconst store = new BruteKnex({\n    knex,\n    tablename: 'brute'\n});\n\nconst bruteforce = new ExpressBrute(store, {\n    freeRetries: 2\n});\n```\n\nSee [example.js](example.js) for a complete Express route.\n\n## Options\n\n- `tablename`: table name for brute-force records. Defaults to `brute`.\n- `knex`: Knex instance to use. If omitted, `brute-knex` creates a SQLite database at `./brute-knex.sqlite`.\n- `createTable`: set to `false` when the table already exists and should not be created automatically.\n\nThe table stores `key`, `firstRequest`, `lastRequest`, `lifetime`, and `count` columns. Timestamps are stored as UTC millisecond values.\n\n## Development\n\nThis repo uses the organisation default Node.js `22` for local development through `.nvmrc`, and pnpm `10.x` through Corepack. Package support still starts at Node.js `20.20.0` for existing consumers.\n\n```sh\ncorepack enable\npnpm install --frozen-lockfile\npnpm test\npnpm lint\n```\n\nDatabase-specific test commands:\n\n```sh\npnpm run test:e2e:sqlite\npnpm run test:e2e:mysql\npnpm run test:e2e:postgres\n```\n\nThe MySQL and Postgres commands expect local test databases unless they are running inside the GitHub Actions service containers. The test suite reads standard connection env vars such as `MYSQL_HOST`, `MYSQL_DATABASE`, `POSTGRES_HOST`, and `POSTGRES_DB`.\n\nUse [config.example.json](config.example.json) as a local Knex/store configuration blueprint when setting up those databases outside CI.\n\n## Releasing\n\nReleases are handled by [`@tryghost/pro-ship`](https://www.npmjs.com/package/@tryghost/pro-ship):\n\n```sh\npnpm ship\n```\n\nThe `ship` script bumps the version, creates the release commit and tag, and pushes them. The push to `main` triggers the [Publish workflow](.github/workflows/publish.yml), which publishes `@tryghost/brute-knex` to npm through [trusted publishing](https://docs.npmjs.com/trusted-publishers) (GitHub Actions OIDC) — no npm tokens are involved. The workflow skips versions that are already on npm and can be run manually as a dry run from the Actions tab.\n\n## Copyright & License\n\nCopyright (c) 2014, llambda <xxgsoftware@gmail.com>.\nReleased under the [ISC license](LICENSE).\n","readmeFilename":"README.md"}