{"_id":"zxcvbn-ts","_rev":"21-173cbb477af37c1b981abae2bacc349d","name":"zxcvbn-ts","dist-tags":{"latest":"2.4.0"},"versions":{"1.0.0":{"name":"zxcvbn-ts","version":"1.0.0","keywords":["password","strength","zxcvbn","entropy","security","typescript"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@1.0.0","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"dist":{"shasum":"a35d018dc44016bd7be6f7e834619a45819a73aa","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-1.0.0.tgz","fileCount":66,"integrity":"sha512-HnTCsyHeUDYA90wJF9cO05DdgOMZrTEoec6O6yeW0QcLO5erHv5d9YE4Zi8r00xDDhezPzsUu0lxeJB7IdwMew==","signatures":[{"sig":"MEUCIQCgAzEhakN7Lp7S1dOvdHra6+Sd1s5TjCiQi3wBm4JuJwIgPpcdgaE5Gf/eMsVHkds3GT3DNi4Z59DNnPixF+/AfxM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5427857},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"a35d018dc44016bd7be6f7e834619a45819a73aa","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-HnTCsyHeUDYA90wJF9cO05DdgOMZrTEoec6O6yeW0QcLO5erHv5d9YE4Zi8r00xDDhezPzsUu0lxeJB7IdwMew==","_npmVersion":"10.8.3","description":"TypeScript rewrite of the zxcvbn password strength estimator","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_1.0.0_1774008385421_0.028269504665163314","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"zxcvbn-ts","version":"1.1.0","keywords":["password","strength","zxcvbn","entropy","security","typescript"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@1.1.0","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"dist":{"shasum":"90c5ca38cf2824eb68ed1027f796747c5c5cad30","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-1.1.0.tgz","fileCount":73,"integrity":"sha512-5et5K78brropNTC5VYcYVWWsTKqjj4kIEHEZYHwdY9NJgWwcO6OhuaG2xzVMeL+fRzPZb/6K8yv4IOY9RAXCuQ==","signatures":[{"sig":"MEQCIHmjf9jsgmaUs3dNNLFRLk+olFJgrVfArMnKW+nVTYnQAiBNNeNv96cJUeThQYNtsarFM+01NjH8xXvu3JuIrsEKAQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7716302},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"90c5ca38cf2824eb68ed1027f796747c5c5cad30","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-5et5K78brropNTC5VYcYVWWsTKqjj4kIEHEZYHwdY9NJgWwcO6OhuaG2xzVMeL+fRzPZb/6K8yv4IOY9RAXCuQ==","_npmVersion":"10.8.3","description":"TypeScript rewrite of the zxcvbn password strength estimator","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_1.1.0_1774093601054_0.7046566015892928","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"zxcvbn-ts","version":"1.1.1","keywords":["password","strength","zxcvbn","entropy","security","typescript"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@1.1.1","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"dist":{"shasum":"3e6f8fec62d1c055cc3b7c5d20623fd74693aee8","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-1.1.1.tgz","fileCount":76,"integrity":"sha512-CDpqgbYHcin1fBuz7EqYb/hfSgXGU/eTrCvwQJ7zPIHAYDCYSkAUashlEqRt+IbwNlRv43D72yZApDQRE7ksHg==","signatures":[{"sig":"MEUCIDfOdZ/PIM5Aefg7gpELu0Kj7BsNY20j+0NeH47An9huAiEA2R2zicQ9utuNoJxnYw+5fgsg/Dcr8OXDAwEurV7w5lw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6116180},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"3e6f8fec62d1c055cc3b7c5d20623fd74693aee8","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json && cp data/frequency_lists.json dist/cjs/frequency_lists.json","build:esm":"tsc -p tsconfig.esm.json && cp data/frequency_lists.json dist/esm/frequency_lists.json","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-CDpqgbYHcin1fBuz7EqYb/hfSgXGU/eTrCvwQJ7zPIHAYDCYSkAUashlEqRt+IbwNlRv43D72yZApDQRE7ksHg==","_npmVersion":"10.8.3","description":"TypeScript rewrite of the zxcvbn password strength estimator","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_1.1.1_1774291048440_0.41609298853167065","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"zxcvbn-ts","version":"1.1.2","keywords":["password","strength","zxcvbn","entropy","security","typescript"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@1.1.2","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"dist":{"shasum":"704e22fa01532a18e2183e6d348f8c666dc11dc5","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-1.1.2.tgz","fileCount":34,"integrity":"sha512-IjC+jihlJ/Wn1nE2C98Tj2WkmF/AVryt1oSAjl/AZvyrMk3mQ3xIvxvuLu6G16T41ylTXZ3CJcwhBS/o7YxGXQ==","signatures":[{"sig":"MEQCICUc2KW+3L/seUDSLLm7/DHcCTfhWhV13EK3+VIHx+/cAiAy24g0uZIQOiaG+0mfsDg/xQJGvxFmqTPpnvmYHAp2bQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1132852},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"704e22fa01532a18e2183e6d348f8c666dc11dc5","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-IjC+jihlJ/Wn1nE2C98Tj2WkmF/AVryt1oSAjl/AZvyrMk3mQ3xIvxvuLu6G16T41ylTXZ3CJcwhBS/o7YxGXQ==","_npmVersion":"10.8.3","description":"TypeScript rewrite of the zxcvbn password strength estimator","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_1.1.2_1774292796137_0.6514978197482864","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"zxcvbn-ts","version":"1.2.2","keywords":["password","strength","zxcvbn","entropy","security","typescript"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@1.2.2","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"dist":{"shasum":"e1a55a88eb45fab7646b04af64b80043c0330faf","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-1.2.2.tgz","fileCount":34,"integrity":"sha512-hsE4XN6QIA5d7ZgrxBJWv9kHforISY3Z4+qUvKny26z7VoO5wAceLv2oiVWrw9WHWvmP9WEWQo3cx9pdR25Jbg==","signatures":[{"sig":"MEYCIQCN3Rl/NOXbcJ+60C0DaxZebj/Ot/YYQoP6a4Uw9J1k5gIhAKM1FBi6TTNFS1z/xjvfS0vvmwMiZeKVyelX57qcuVYA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1143655},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"e1a55a88eb45fab7646b04af64b80043c0330faf","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-hsE4XN6QIA5d7ZgrxBJWv9kHforISY3Z4+qUvKny26z7VoO5wAceLv2oiVWrw9WHWvmP9WEWQo3cx9pdR25Jbg==","_npmVersion":"10.8.3","description":"TypeScript rewrite of the zxcvbn password strength estimator","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_1.2.2_1774439776555_0.5039343355434409","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"zxcvbn-ts","version":"1.3.0","keywords":["password","strength","zxcvbn","entropy","security","typescript"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@1.3.0","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"dist":{"shasum":"5220e443afbc31f847eb6f44c0f37287b2cc65d3","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-1.3.0.tgz","fileCount":34,"integrity":"sha512-jMfcz45ChGYFUy7WDqTV19uNUcR7pyovOtcx/FCSKM/IQ5HyLWaJQghBhWZlr+Y5fe8yHL77n093jyKlytblRg==","signatures":[{"sig":"MEQCIB8/XDmg9zv82jlWe2dO4zOl4iHFprWKVusZt0XgHaavAiBy9AiSFp+51Te8MvV2iSbUMYubcLMg1Qt5D3N4iYO2Fw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1179830},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"5220e443afbc31f847eb6f44c0f37287b2cc65d3","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-jMfcz45ChGYFUy7WDqTV19uNUcR7pyovOtcx/FCSKM/IQ5HyLWaJQghBhWZlr+Y5fe8yHL77n093jyKlytblRg==","_npmVersion":"10.8.3","description":"TypeScript rewrite of the zxcvbn password strength estimator","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_1.3.0_1774549919920_0.4267270991710532","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"zxcvbn-ts","version":"2.0.0","keywords":["password","strength","zxcvbn","entropy","security","typescript"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.0.0","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"dist":{"shasum":"9816810be235c160e8d25d56b8b44daaf7b375e3","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.0.0.tgz","fileCount":34,"integrity":"sha512-rH3IpTmEUXxMxg2yEyQt/pMeR6gwcygeejAZzyZRun63E+z2l+VFwG4/sFdOcOaj0SB91CDIWH4v1e3OHgbzXw==","signatures":[{"sig":"MEUCIFntHQotXyxCH2FC/VH9xeFxqDprF7e5p7xXlyKJMpK5AiEAnIMJbXr37t2jcovR8sR1EZKbwpUGSAg7B7TN4v8sDLo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1183705},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"9816810be235c160e8d25d56b8b44daaf7b375e3","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-rH3IpTmEUXxMxg2yEyQt/pMeR6gwcygeejAZzyZRun63E+z2l+VFwG4/sFdOcOaj0SB91CDIWH4v1e3OHgbzXw==","_npmVersion":"10.8.3","description":"TypeScript rewrite of the zxcvbn password strength estimator","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.0.0_1774953313963_0.4418795541608673","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"zxcvbn-ts","version":"2.0.1","keywords":["password","strength","zxcvbn","entropy","security","typescript"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.0.1","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"dist":{"shasum":"ae59b0fb097df3fcb41fff02b7defa84cb89ecde","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.0.1.tgz","fileCount":34,"integrity":"sha512-TJrxZFQgoFwqYb28OUKkNg3jOvZdDjzt0MLvVY6VDBTSooEe+Iq72Z+AmlUD+uk3d2UjCAUjqOt1aLY9nD0R1g==","signatures":[{"sig":"MEUCIQDrO7qJ3okMLSJxFl2qZ0iMeROhEz0g2PqQYXaQYHG2+QIgXrpXlpB2BEeaj9uFZ2ttPN4D7gfc1hM1kSYnAMcuokQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1181139},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"ae59b0fb097df3fcb41fff02b7defa84cb89ecde","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-TJrxZFQgoFwqYb28OUKkNg3jOvZdDjzt0MLvVY6VDBTSooEe+Iq72Z+AmlUD+uk3d2UjCAUjqOt1aLY9nD0R1g==","_npmVersion":"10.8.3","description":"TypeScript rewrite of the zxcvbn password strength estimator","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.0.1_1775624794016_0.9399764802987356","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"zxcvbn-ts","version":"2.0.2","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.0.2","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"6a5de6e422f9175c00349dc0a161671a9ce70833","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.0.2.tgz","fileCount":34,"integrity":"sha512-pqMatMnx6OlrpgGwSc1+9AFDL1mS6T4Lq+tqQGu1vXXU4Bta9F/pUhF0xr5XckaYbj4qON/NvWFba1x27DhWqQ==","signatures":[{"sig":"MEUCIQCQ8nHb4Wiq/pHAj8IpPS1DosHP5Ft79dZapvzMbk2GiwIgBCM4PdN4pU6giHqhPjJYYNGHQ37N4kWM820GoKCTHEg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1181522},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"6a5de6e422f9175c00349dc0a161671a9ce70833","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-pqMatMnx6OlrpgGwSc1+9AFDL1mS6T4Lq+tqQGu1vXXU4Bta9F/pUhF0xr5XckaYbj4qON/NvWFba1x27DhWqQ==","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.13","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.0.2_1776748493987_0.2502227156116237","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"zxcvbn-ts","version":"2.1.0","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.1.0","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"e896e4d060752adf31abe89f78c41c3c5508cd7e","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.1.0.tgz","fileCount":34,"integrity":"sha512-SShfIJI86WcNhZOq4JZm6IAFhwAM1rFsXP7rJIbe0DaDmpCQoObfRYK+HRhiJ1GfHTUuHGGtfJfBGL7XpSGvrQ==","signatures":[{"sig":"MEYCIQDz83G2Yf+Lep4i2d7gFzTZ5Af/qS5mn49Pxv2lf9VIQwIhAMRrTu4qhagcLJUdBmgbMYT8+RW9Pla7h0OGX75NhVl8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1215731},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"e896e4d060752adf31abe89f78c41c3c5508cd7e","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc -p tsconfig.bun.json --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-SShfIJI86WcNhZOq4JZm6IAFhwAM1rFsXP7rJIbe0DaDmpCQoObfRYK+HRhiJ1GfHTUuHGGtfJfBGL7XpSGvrQ==","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.13","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.1.0_1777961167706_0.977787415636115","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"zxcvbn-ts","version":"2.2.0","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.2.0","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"fcdc5db045f782d58cca30ee896980b40ac15c0f","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.2.0.tgz","fileCount":37,"integrity":"sha512-MFdDVDDm7WjUkrllWbA5e5S9XWBlz/sSCVVyYAJpYNohD/9RfOKB/De30XRLr7E5PiClbxdjDRKEYXGY8h5/lg==","signatures":[{"sig":"MEUCIGqmBw/j7k7ciphznEelAuGJPuTySes21fj4jar8UNhgAiEAsBV2f9th9Y3rTptzObID/lFpDaqJf35XX8E3rjf97b8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1231121},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"fcdc5db045f782d58cca30ee896980b40ac15c0f","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"},"./pwned":{"types":"./dist/types/pwned.d.ts","import":"./dist/esm/pwned.js","require":"./dist/cjs/pwned.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc -p tsconfig.bun.json --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-MFdDVDDm7WjUkrllWbA5e5S9XWBlz/sSCVVyYAJpYNohD/9RfOKB/De30XRLr7E5PiClbxdjDRKEYXGY8h5/lg==","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.13","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.2.0_1778531818833_0.8399421253057004","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"zxcvbn-ts","version":"2.2.1","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.2.1","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"cb74c0931ac94cc6ba2a4205218f2110288ba36e","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.2.1.tgz","fileCount":76,"integrity":"sha512-56B50hShtKvGO3BRbwUnNBB+SFsHsJclJPXN8mqdxKEIuda7nAnblwZxyQANswY40A/EhAugdHAQT5MDklwPOA==","signatures":[{"sig":"MEYCIQC7pQlm8e5WS5r/dRogSXdcz6F9l6ADvHMdsTOUTfM2+gIhAInaZwDw3OjELWRD0VZpwqfWI3MFRBEj/xqc0EIsJW1+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1226769},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"cb74c0931ac94cc6ba2a4205218f2110288ba36e","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"},"./pwned":{"types":"./dist/types/pwned.d.ts","import":"./dist/esm/pwned.js","require":"./dist/cjs/pwned.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc -p tsconfig.bun.json --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-56B50hShtKvGO3BRbwUnNBB+SFsHsJclJPXN8mqdxKEIuda7nAnblwZxyQANswY40A/EhAugdHAQT5MDklwPOA==","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.8.4","bun-types":"^1.3.13","typescript":"^5.5.0","@trivago/prettier-plugin-sort-imports":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.2.1_1781060841313_0.931794789933831","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"name":"zxcvbn-ts","version":"2.2.2","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.2.2","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"4cb0be289399af4de4bf8b1bcd51da585981ee22","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.2.2.tgz","fileCount":76,"integrity":"sha512-2vqylFX4cI7I+e9JdTlRcUnQPK+DT8ua0ZlB+ScDyGYgvHP1M8tBzZJKITxqkFV0/HfkcA7Ky+yT4/Zgm2p4mQ==","signatures":[{"sig":"MEUCIQDDzNxkDBIW/QADELypL/Rh+VAKFNkQQ1fjFT0tBiCNQgIgdGxoOiaoRyuSA6RuQcTYBoi1jM7A+LLam+CzRM5zoXs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1226769},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"4cb0be289399af4de4bf8b1bcd51da585981ee22","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"},"./pwned":{"types":"./dist/types/pwned.d.ts","import":"./dist/esm/pwned.js","require":"./dist/cjs/pwned.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc -p tsconfig.bun.json --noEmit","build:types":"tsc -p tsconfig.types.json"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-2vqylFX4cI7I+e9JdTlRcUnQPK+DT8ua0ZlB+ScDyGYgvHP1M8tBzZJKITxqkFV0/HfkcA7Ky+yT4/Zgm2p4mQ==","deprecated":"Duplicate release. Please use 2.2.3","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.8.4","bun-types":"^1.3.13","typescript":"^5.5.0","@trivago/prettier-plugin-sort-imports":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.2.2_1781673400574_0.21750698662767776","host":"s3://npm-registry-packages-npm-production"}},"2.2.3":{"name":"zxcvbn-ts","version":"2.2.3","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.2.3","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"abfbd5579cfc0d7a37b4c3585e3b07dbc7614a3e","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.2.3.tgz","fileCount":76,"integrity":"sha512-O41n0TosP1hDg3FbbdcuqWyDWKVYfMzA9MLvlKPFjQqFvDSSSBPJw6am1h8PyQ/ae5VdaGmyd+NeRrmB9mVXIQ==","signatures":[{"sig":"MEUCIQCLPCNiKFq0PFW9AZ3H4tYGx4GYAVDErlmiv73uYHG3vQIgDyJv2fzZXATFnFMojezyHt+n8clFKvQlVR+okSR9HFI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1227413},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"abfbd5579cfc0d7a37b4c3585e3b07dbc7614a3e","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"},"./pwned":{"types":"./dist/types/pwned.d.ts","import":"./dist/esm/pwned.js","require":"./dist/cjs/pwned.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc -p tsconfig.bun.json --noEmit","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"bun run typecheck && bun run build && bun test"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-O41n0TosP1hDg3FbbdcuqWyDWKVYfMzA9MLvlKPFjQqFvDSSSBPJw6am1h8PyQ/ae5VdaGmyd+NeRrmB9mVXIQ==","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.8.4","bun-types":"^1.3.13","typescript":"^5.5.0","@trivago/prettier-plugin-sort-imports":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.2.3_1781674798381_0.1507263901697118","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"zxcvbn-ts","version":"2.3.0","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.3.0","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"98f9c684b9df79467963774c659df1a6b794902d","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.3.0.tgz","fileCount":76,"integrity":"sha512-wVvt5yaI/gkD1h+TMnfrK5JCs4aE9D+IFVdkfpExadOQquMbBFhXEANf1vClULTbPM+7Xexxr75g0eYyGix4MA==","signatures":[{"sig":"MEYCIQDsgqhX9HCDrsbpBWp+AwF7+wqrnHIHm9rH/4dRObs+6AIhAM7v0dXT6RFtCiMKQ1Mp8VYzn93iSyprIx6NGIHKV+VG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1228211},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"98f9c684b9df79467963774c659df1a6b794902d","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"},"./pwned":{"types":"./dist/types/pwned.d.ts","import":"./dist/esm/pwned.js","require":"./dist/cjs/pwned.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc -p tsconfig.bun.json --noEmit","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"bun run typecheck && bun run build && bun test"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-wVvt5yaI/gkD1h+TMnfrK5JCs4aE9D+IFVdkfpExadOQquMbBFhXEANf1vClULTbPM+7Xexxr75g0eYyGix4MA==","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.8.4","bun-types":"^1.3.13","typescript":"^5.5.0","@trivago/prettier-plugin-sort-imports":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.3.0_1782735346982_0.5303776078368543","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"zxcvbn-ts","version":"2.3.1","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.3.1","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"8ea37f98322010b916030798d7fa341139a69075","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.3.1.tgz","fileCount":76,"integrity":"sha512-KdZHGBfxe1KT9BwUSSFDlzoKTGzFv7zMgereROgYfqHXWqXm5c6kF/DBy7QTj+lMUnmbFtq5AysA8S0lQVjPsw==","signatures":[{"sig":"MEUCIEPRgDiX16AUS9NstH5y0/VIYRifFJfp0ABN4tkRAZwPAiEA1WZ2qlp71uQ/vqD3blXjmTwteWdNILZYURImEUUCQHo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1240069},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"8ea37f98322010b916030798d7fa341139a69075","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"},"./pwned":{"types":"./dist/types/pwned.d.ts","import":"./dist/esm/pwned.js","require":"./dist/cjs/pwned.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","test:all":"bun run test && bun run build && bun run test:node","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","test:node":"node tests/run.js","typecheck":"tsc -p tsconfig.bun.json --noEmit","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"bun run typecheck && bun run test:all"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-KdZHGBfxe1KT9BwUSSFDlzoKTGzFv7zMgereROgYfqHXWqXm5c6kF/DBy7QTj+lMUnmbFtq5AysA8S0lQVjPsw==","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.8.4","bun-types":"^1.3.13","typescript":"^5.5.0","@trivago/prettier-plugin-sort-imports":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.3.1_1782991252912_0.5598453790312703","host":"s3://npm-registry-packages-npm-production"}},"2.3.2":{"name":"zxcvbn-ts","version":"2.3.2","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.3.2","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"d60a0e2220c22a35e9755083c78e106bc019afdd","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.3.2.tgz","fileCount":76,"integrity":"sha512-RkRF1ZZTsR5RiLCocN0LoM1dhGFbQw+Na2pNQdYfmPdPWkJPrU8FKR2AUjIfaXIhGnLfTSYRl3kFxwRpqQmnxA==","signatures":[{"sig":"MEYCIQDH3qO0WSGsEaokv3A4IzKix8gVlot4oyo8SRBTGZp/9AIhAOAwJYEvL2jr3JHs9TlqZ6eoOUGb55EVWImZt2pj6FQY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1240927},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"d60a0e2220c22a35e9755083c78e106bc019afdd","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"},"./pwned":{"types":"./dist/types/pwned.d.ts","import":"./dist/esm/pwned.js","require":"./dist/cjs/pwned.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","prepare":"git config --local core.hooksPath .githooks","test:all":"bun run test && bun run build && bun run test:node","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","test:node":"node tests/run.js","typecheck":"tsc -p tsconfig.bun.json --noEmit","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"bun run typecheck && bun run test:all"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-RkRF1ZZTsR5RiLCocN0LoM1dhGFbQw+Na2pNQdYfmPdPWkJPrU8FKR2AUjIfaXIhGnLfTSYRl3kFxwRpqQmnxA==","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.9.4","bun-types":"^1.3.14","typescript":"^5.9.2","@trivago/prettier-plugin-sort-imports":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.3.2_1783245078675_0.376463117491296","host":"s3://npm-registry-packages-npm-production"}},"2.3.3":{"name":"zxcvbn-ts","version":"2.3.3","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.3.3","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"8bb0b0deb263df095857d7be41e0b6f7d6e83c59","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.3.3.tgz","fileCount":76,"integrity":"sha512-X1c0ROwJqwd7nRmmR6Sfrw+gusdut0sFM8TUAk0NIX31nVJKPVDyfGD6BwDWt00p5CETmqQr7sg2ynYCZBYJ7w==","signatures":[{"sig":"MEUCIQDoF9L0kVODAtXUTr9PW/0T73cmWoabFNuIRaxuKktLuwIgLpxX1OrDouW/qYdnVUFWUYgKyHXeOPYspFNiZbOYgQM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1229984},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"8bb0b0deb263df095857d7be41e0b6f7d6e83c59","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"},"./pwned":{"types":"./dist/types/pwned.d.ts","import":"./dist/esm/pwned.js","require":"./dist/cjs/pwned.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","prepare":"git config --local core.hooksPath .githooks","test:all":"bun run test && bun run build && bun run test:node","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","test:node":"node tests/run.js","typecheck":"tsc -p tsconfig.bun.json --noEmit","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"bun run typecheck && bun run test:all"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-X1c0ROwJqwd7nRmmR6Sfrw+gusdut0sFM8TUAk0NIX31nVJKPVDyfGD6BwDWt00p5CETmqQr7sg2ynYCZBYJ7w==","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.9.4","bun-types":"^1.3.14","typescript":"^5.9.2","@trivago/prettier-plugin-sort-imports":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.3.3_1783542729749_0.03545535887157891","host":"s3://npm-registry-packages-npm-production"}},"2.3.4":{"name":"zxcvbn-ts","version":"2.3.4","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"author":"Kunal Tanwar","license":"MIT","_id":"zxcvbn-ts@2.3.4","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"dist":{"shasum":"6ce72c758875f76eb4e1b3b92271d52496cba206","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.3.4.tgz","fileCount":76,"integrity":"sha512-K98gEkpvRyqWh2GUjNABrSMQ8OW+k9KycIfSufa82CjkZbhK1fl85c75WNUk0mhNEvo59774jLK1dACnXbr0wg==","signatures":[{"sig":"MEUCIQCddHnHo05tSDAXN48P43aLAvVznGWZeFrjnTgkUPkTYgIgV0VbAGaaucIy6GuAzVER8OpcyqxgwCED7VKq0Yp3aQU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1229984},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","shasum":"6ce72c758875f76eb4e1b3b92271d52496cba206","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./ai":{"types":"./dist/types/ai.d.ts","import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js"},"./pwned":{"types":"./dist/types/pwned.d.ts","import":"./dist/esm/pwned.js","require":"./dist/cjs/pwned.js"}},"scripts":{"test":"bun test","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","prepare":"git config --local core.hooksPath .githooks","test:all":"bun run test && bun run build && bun run test:node","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","test:node":"node tests/run.js","typecheck":"tsc -p tsconfig.bun.json --noEmit","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"bun run typecheck && bun run test:all"},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"_integrity":"sha512-K98gEkpvRyqWh2GUjNABrSMQ8OW+k9KycIfSufa82CjkZbhK1fl85c75WNUk0mhNEvo59774jLK1dACnXbr0wg==","repository":{"url":"https://github.com/KunalTanwar/zxcvbn-ts","type":"git"},"_npmVersion":"10.8.3","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.9.4","bun-types":"^1.3.14","typescript":"^5.9.2","@trivago/prettier-plugin-sort-imports":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/zxcvbn-ts_2.3.4_1785585659373_0.20671973068450233","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"zxcvbn-ts","version":"2.4.0","description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","author":"Kunal Tanwar","license":"MIT","main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/types/index.d.ts","exports":{".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/types/index.d.ts"},"./ai":{"import":"./dist/esm/ai.js","require":"./dist/cjs/ai.js","types":"./dist/types/ai.d.ts"},"./pwned":{"import":"./dist/esm/pwned.js","require":"./dist/cjs/pwned.js","types":"./dist/types/pwned.d.ts"}},"scripts":{"prepare":"git config --local core.hooksPath .githooks","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","build":"bun run build:cjs && bun run build:esm && bun run build:types && mkdir -p dist/data && cp data/frequency_lists.json dist/data/frequency_lists.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.bun.json --noEmit","test":"bun test","test:node":"node tests/run.js","test:all":"bun run test && bun run build && bun run test:node","prepublishOnly":"bun run typecheck && bun run test:all"},"keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"devDependencies":{"@trivago/prettier-plugin-sort-imports":"^6.0.2","bun-types":"^1.3.14","prettier":"^3.9.4","typescript":"^5.9.2"},"repository":{"type":"git","url":"https://github.com/KunalTanwar/zxcvbn-ts"},"homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"_id":"zxcvbn-ts@2.4.0","_integrity":"sha512-mVJHPqJkPrlpdPXOzZ+iSv+0Gpo0HPyBBEIlQ/qkQh1tAv44gbALhsrr94EKDzL9qTJWvm851HlviYFATkCsCg==","_nodeVersion":"26.3.0","_npmVersion":"10.8.3","shasum":"dcd31252eac3f9f23199e44c6721c83d5f62b0cc","dist":{"integrity":"sha512-mVJHPqJkPrlpdPXOzZ+iSv+0Gpo0HPyBBEIlQ/qkQh1tAv44gbALhsrr94EKDzL9qTJWvm851HlviYFATkCsCg==","shasum":"dcd31252eac3f9f23199e44c6721c83d5f62b0cc","tarball":"https://registry.npmjs.org/zxcvbn-ts/-/zxcvbn-ts-2.4.0.tgz","fileCount":76,"unpackedSize":1240293,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGbAbxnL+KhLZHj/ffjAzzwTb8C2mTRH/0w+FTS1VQTRAiAvM9jjCSSLOY+NuKF/AiELQELKybCK1NKq9cEX0ZcLzA=="}]},"_npmUser":{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"},"directories":{},"maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/zxcvbn-ts_2.4.0_1788381137402_0.2985142088413746"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-20T12:06:25.420Z","modified":"2026-09-02T20:32:17.718Z","1.0.0":"2026-03-20T12:06:25.600Z","1.1.0":"2026-03-21T11:46:41.268Z","1.1.1":"2026-03-23T18:37:28.619Z","1.1.2":"2026-03-23T19:06:36.372Z","1.2.2":"2026-03-25T11:56:16.740Z","1.3.0":"2026-03-26T18:32:00.105Z","2.0.0":"2026-03-31T10:35:14.144Z","2.0.1":"2026-04-08T05:06:34.231Z","2.0.2":"2026-04-21T05:14:54.207Z","2.1.0":"2026-05-05T06:06:07.903Z","2.2.0":"2026-05-11T20:36:59.026Z","2.2.1":"2026-06-10T03:07:21.511Z","2.2.2":"2026-06-17T05:16:40.761Z","2.2.3":"2026-06-17T05:39:58.592Z","2.3.0":"2026-06-29T12:15:47.122Z","2.3.1":"2026-07-02T11:20:53.055Z","2.3.2":"2026-07-05T09:51:18.877Z","2.3.3":"2026-07-08T20:32:09.946Z","2.3.4":"2026-08-01T12:00:59.560Z","2.4.0":"2026-09-02T20:32:17.551Z"},"bugs":{"url":"https://github.com/KunalTanwar/zxcvbn-ts/issues"},"author":"Kunal Tanwar","license":"MIT","homepage":"https://github.com/KunalTanwar/zxcvbn-ts#readme","keywords":["password","strength","zxcvbn","zxcvbn-ts","entropy","security","typescript","password-strength","crack-time","phone","ai","passphrase","hibp","breach","pwned"],"repository":{"type":"git","url":"https://github.com/KunalTanwar/zxcvbn-ts"},"description":"TypeScript rewrite of zxcvbn — strict types, phone detection, AI feedback, cost-to-crack estimates, and 20+ bug fixes over the original","maintainers":[{"name":"kunaltanwar","email":"iamkunaltanwar@gmail.com"}],"readme":"# zxcvbn-ts\r\n\r\n<div align=\"center\">\r\n\r\n![](https://badgen.net/github/checks/KunalTanwar/zxcvbn-ts/)\r\n![](https://badgen.net/github/last-commit/KunalTanwar/zxcvbn-ts/)\r\n![](https://badgen.net/github/license/KunalTanwar/zxcvbn-ts/)\r\n![](https://badgen.net/npm/v/zxcvbn-ts/)\r\n![](https://badgen.net/npm/dt/zxcvbn-ts/)\r\n![](https://badgen.net/npm/types/zxcvbn-ts/)\r\n![](https://badgen.net/bundlejs/minzip/zxcvbn-ts/)\r\n![](https://badgen.net/packagephobia/install/zxcvbn-ts/)\r\n![](https://badgen.net/packagephobia/publish/zxcvbn-ts/)\r\n![](https://badgen.net/github/open-issues/KunalTanwar/zxcvbn-ts/)\r\n\r\n</div>\r\n\r\nA complete TypeScript rewrite of Dropbox's [zxcvbn](https://github.com/dropbox/zxcvbn) password strength estimator — with strict types, dual CJS/ESM output, fully populated dictionaries, optional AI feedback, and 20+ fixes over the original.\r\n\r\n## Features\r\n\r\n- **[Full TypeScript](#match-discriminated-union)** — strict mode, discriminated-union `Match` type, exhaustive narrowing\r\n- **[Dual CJS/ESM Output](#building)** — works in Node.js, Bun, bundlers, and modern browsers\r\n- **[Populated Dictionaries](#dictionaries)** — all 93,855 words across 6 frequency lists included out of the box\r\n- **[Optional AI Feedback](#ai-powered-feedback)** — personalised explanations via Claude, ChatGPT, Gemini, or any custom adapter\r\n- **[HIBP Breach Check](#breach-check-zxcvbn-tspwned)** — `zxcvbn-ts/pwned` checks if a password has appeared in a known breach via k-anonymity API\r\n- **[Email Pattern Detection](#match-discriminated-union)** — email addresses used as passwords are detected and penalised\r\n- **[Phone Number Detection](#match-discriminated-union)** — NANP, international, and local formats detected and penalised\r\n- **[`minLength` option](#zxcvbnoptions)** — enforce a minimum password length, forcing score 0 with a clear suggestion\r\n- **[Cost-to-crack Estimates](#cracktimesseconds--cracktimesdisplay--cracktimescost)** — `crack_times_cost` field with USD estimates alongside crack time\r\n- **[Custom Hash Rate](#zxcvbnoptions)** — pass `customHashesPerSecond` to model pbkdf2/Argon2 key stretching\r\n- **Updated 2025 threat model** — attack rates reflect modern RTX 4090 GPU benchmarks\r\n- **Zero Runtime Dependencies** for the core library\r\n- **[Bun-native](#building)** — uses `bun test` and `bun run` throughout\r\n- **[20+ Bug Fixes](#issues-from-original-zxcvbn)** over the original CoffeeScript source\r\n\r\n## Installation\r\n\r\n```bash\r\nbun add zxcvbn-ts\r\n# or\r\nnpm install zxcvbn-ts\r\n# or\r\npnpm add zxcvbn-ts\r\n```\r\n\r\n## Quick start\r\n\r\n```ts\r\nimport zxcvbn from \"zxcvbn-ts\"\r\n\r\nconst result = zxcvbn(\"correcthorsebatterystaple\")\r\n\r\nconsole.log(result.score) // 3  (0 = very weak … 4 = very strong)\r\nconsole.log(result.guesses) // ~10^14\r\nconsole.log(result.feedback)\r\n// {\r\n//   warning: \"\",\r\n//   suggestions: [\"Add another word or two. Uncommon words are better.\"]\r\n// }\r\nconsole.log(result.crack_times_display.offline_fast_hashing_1e11_per_second)\r\n// \"centuries\"\r\n```\r\n\r\n### With user-specific inputs\r\n\r\n```ts\r\nconst result = zxcvbn(\"alice1990\", [\"alice\", \"alice@example.com\"])\r\n// guess count is reduced when the password contains user-supplied words\r\n```\r\n\r\n## API\r\n\r\n### `zxcvbn(password, userInputs?, options?)`\r\n\r\n| Parameter    | Type                                 | Default | Description                             |\r\n| ------------ | ------------------------------------ | ------- | --------------------------------------- |\r\n| `password`   | `string`                             | —       | The password to evaluate. **Required.** |\r\n| `userInputs` | `Array<string \\| number \\| boolean>` | `[]`    | User-specific words to penalise.        |\r\n| `options`    | `ZxcvbnOptions`                      | `{}`    | Optional settings.                      |\r\n\r\n**Throws** `TypeError` if `password` is not a string.\r\n\r\n**Returns** [`ZxcvbnResult`](#zxcvbnresult).\r\n\r\n### `ZxcvbnOptions`\r\n\r\n| Option                  | Type     | Default     | Description                                                                                                                                         |\r\n| ----------------------- | -------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |\r\n| `minLength`             | `number` | `undefined` | Minimum password length. Passwords shorter than this are forced to score 0 with a suggestion prepended.                                             |\r\n| `customHashesPerSecond` | `number` | `undefined` | Custom hash rate for key-stretched algorithms (pbkdf2, Argon2, bcrypt with custom cost). Adds a `custom_hash_rate` field to all crack time results. |\r\n\r\n```ts\r\n// Enforce 8-character minimum\r\nzxcvbn(\"abc\", [], {\r\n    minLength: 8,\r\n})\r\n// score: 0, suggestions: [\"Password must be at least 8 characters\", ...]\r\n\r\n// Model pbkdf2 with 100k iterations (~1M hashes/s effective rate)\r\nconst result = zxcvbn(\"password\", [], {\r\n    customHashesPerSecond: 1e6,\r\n})\r\n\r\nconsole.log(result.crack_times_display.custom_hash_rate)\r\n// \"3 hours\"\r\n```\r\n\r\n### `ZxcvbnResult`\r\n\r\n```ts\r\ninterface ZxcvbnResult {\r\n    guesses: number\r\n    guesses_log10: number\r\n    score: 0 | 1 | 2 | 3 | 4\r\n    sequence: Match[]\r\n    crack_times_seconds: CrackTimesSeconds\r\n    crack_times_display: CrackTimesDisplay\r\n    crack_times_cost: CrackTimesCost\r\n    feedback: Feedback\r\n    calc_time: number\r\n}\r\n```\r\n\r\n### `Feedback`\r\n\r\n```ts\r\ninterface Feedback {\r\n    warning: string\r\n    suggestions: string[]\r\n}\r\n\r\n// Extended by zxcvbnAI():\r\ninterface AIFeedback extends Feedback {\r\n    explanation: string\r\n}\r\n```\r\n\r\n### `CrackTimesSeconds` / `CrackTimesDisplay` / `CrackTimesCost`\r\n\r\nFour built-in attack scenarios, available as seconds, human-readable strings, and USD cost estimates:\r\n\r\n| Key                                    | Scenario                                                 |\r\n| -------------------------------------- | -------------------------------------------------------- |\r\n| `online_throttling_100_per_hour`       | Throttled online attack (100 guesses/hour)               |\r\n| `online_no_throttling_10_per_second`   | Unthrottled online attack (10/s)                         |\r\n| `offline_slow_hashing_1e5_per_second`  | Offline, slow hash e.g. bcrypt — 100k/s (RTX 4090, 2025) |\r\n| `offline_fast_hashing_1e11_per_second` | Offline, fast hash e.g. MD5 — 100B/s (RTX 4090, 2025)    |\r\n| `custom_hash_rate` _(optional)_        | Only present when `customHashesPerSecond` is passed      |\r\n\r\n```ts\r\nimport { zxcvbn, displayCost, displayTime } from \"zxcvbn-ts\"\r\n\r\nconst r = zxcvbn(\"correcthorsebatterystaple\")\r\n\r\ndisplayCost(r.crack_times_cost.offline_fast_hashing_1e11_per_second) // \"$2.28\"\r\nr.crack_times_display.offline_slow_hashing_1e5_per_second // \"85 years\"\r\n\r\n// With key stretching\r\nconst r2 = zxcvbn(\"password\", [], {\r\n    customHashesPerSecond: 1e6,\r\n})\r\n\r\nr2.crack_times_display.custom_hash_rate // \"3 hours\"\r\nr2.crack_times_seconds.custom_hash_rate // 10800\r\n```\r\n\r\n### `Match` (discriminated union)\r\n\r\n```ts\r\ntype Match =\r\n    | BruteforceMatch\r\n    | DictionaryMatch\r\n    | SpatialMatch\r\n    | RepeatMatch\r\n    | SequenceMatch\r\n    | RegexMatch\r\n    | DateMatch\r\n    | PhoneMatch\r\n    | EmailMatch\r\n```\r\n\r\nNarrow on the `pattern` discriminant:\r\n\r\n```ts\r\nfor (const m of result.sequence) {\r\n    if (m.pattern === \"dictionary\") {\r\n        console.log(m.matched_word, m.rank, m.dictionary_name)\r\n    } else if (m.pattern === \"spatial\") {\r\n        console.log(m.graph, m.turns, m.shifted_count)\r\n    } else if (m.pattern === \"repeat\") {\r\n        console.log(m.base_token, m.repeat_count)\r\n    } else if (m.pattern === \"date\") {\r\n        console.log(m.year, m.month, m.day)\r\n    } else if (m.pattern === \"phone\") {\r\n        console.log(m.phone_number, m.phone_format)\r\n    } else if (m.pattern === \"email\") {\r\n        console.log(m.local, m.domain, m.tld)\r\n    }\r\n}\r\n```\r\n\r\n## Breach check (`zxcvbn-ts/pwned`)\r\n\r\n### What is Have I Been Pwned?\r\n\r\n[Have I Been Pwned](https://haveibeenpwned.com) (HIBP) is a free service created by security researcher Troy Hunt that aggregates data from hundreds of known data breaches — collections of leaked credentials from companies like Adobe, LinkedIn, and RockYou. The Pwned Passwords API exposes a database of over 800 million real-world passwords that have been exposed in breaches.\r\n\r\nIf a password appears in this list, an attacker using a breach dictionary attack would try it immediately — regardless of how complex it looks.\r\n\r\n### How k-anonymity works\r\n\r\nSending a password to a third-party API would be a serious security risk. HIBP solves this with a k-anonymity model:\r\n\r\n```\r\n1. Hash the password locally with SHA1\r\n   \"password\" → \"5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8\"\r\n\r\n2. Send only the first 5 characters to the API\r\n   GET https://api.pwnedpasswords.com/range/5BAA6\r\n\r\n3. HIBP returns ~800 hash suffixes that share that prefix\r\n   1E4C9B93F3F0682250B6CF8331B7EE68FD8:3861493\r\n   ...hundreds more...\r\n\r\n4. Check locally whether your suffix is in the list\r\n   Found — password appears in 3,861,493 breaches\r\n```\r\n\r\nThe actual password and the full hash never leave your server. HIBP never sees more than 5 characters.\r\n\r\n### Usage\r\n\r\n```ts\r\nimport { checkPwned } from \"zxcvbn-ts/pwned\"\r\n\r\nconst result = await checkPwned(\"password123\")\r\n\r\nresult.isPwned // true\r\nresult.breachCount // 3861493\r\nresult.breachDisplay // \"seen in 3,861,493 breaches\"\r\n```\r\n\r\n### ⚠️ Server-side only\r\n\r\n`checkPwned()` is designed for server-side use (Node.js, Bun, Edge Functions). While the k-anonymity model protects the password itself, calling it from a browser exposes the 5-character hash prefix to network intermediaries and your users' ISPs. Keep breach checks server-side.\r\n\r\n```ts\r\n// ✅ Server-side — safe\r\nconst result = await checkPwned(password)\r\n\r\n// ❌ Avoid in browser — hash prefix visible to network\r\n```\r\n\r\n### Combined with `zxcvbn()`\r\n\r\n```ts\r\nimport { zxcvbn } from \"zxcvbn-ts\"\r\nimport { checkPwned } from \"zxcvbn-ts/pwned\"\r\n\r\nconst strength = zxcvbn(password)\r\nconst breach = await checkPwned(password)\r\n\r\n// A breached password is always weak regardless of entropy\r\nconst finalScore = breach.isPwned ? 0 : strength.score\r\nconst warning = breach.isPwned\r\n    ? `Found in ${breach.breachDisplay} — change this password immediately`\r\n    : strength.feedback.warning\r\n```\r\n\r\n### `PwnedResult`\r\n\r\n| Field           | Type      | Description                                               |\r\n| --------------- | --------- | --------------------------------------------------------- |\r\n| `isPwned`       | `boolean` | Whether the password appears in any known breach          |\r\n| `breachCount`   | `number`  | Number of times seen across all breaches. 0 if not found  |\r\n| `breachDisplay` | `string`  | Human-readable string e.g. `\"seen in 3,861,493 breaches\"` |\r\n\r\n### Options\r\n\r\n```ts\r\nawait checkPwned(password, {\r\n    timeoutMs: 3000, // request timeout, default: 5000ms\r\n    userAgent: \"myapp/1.0\", // HIBP recommends identifying your app\r\n    fetch: customFetchImpl, // custom fetch, useful for testing\r\n})\r\n```\r\n\r\n## AI-powered Feedback\r\n\r\nThe core `zxcvbn()` function is synchronous and has zero dependencies. For richer, personalised feedback use `zxcvbnAI()`, which sends the structured analysis to an LLM and returns a plain-English explanation.\r\n\r\nSupports **Anthropic (Claude)**, **OpenAI (ChatGPT)**, **Google (Gemini)**, and any **custom adapter**.\r\n\r\n### Setup\r\n\r\nGet an API key from your preferred provider:\r\n\r\n- Anthropic: [console.anthropic.com](https://console.anthropic.com) → env var: `ANTHROPIC_API_KEY`\r\n- Gemini: [aistudio.google.com](https://aistudio.google.com) → env var: `GEMINI_API_KEY`\r\n- OpenAI: [platform.openai.com](https://platform.openai.com) → env var: `OPENAI_API_KEY`\r\n\r\n### Usage\r\n\r\n```ts\r\nimport { zxcvbnAI, anthropic, openai, gemini } from \"zxcvbn-ts/ai\"\r\n\r\n// Anthropic (default when no provider given)\r\nconst result = await zxcvbnAI(\"password123\", {\r\n    provider: anthropic({\r\n        apiKey: \"sk-ant-...\",\r\n    }),\r\n})\r\n\r\n// Gemini\r\nconst result = await zxcvbnAI(\"password123\", {\r\n    provider: gemini({\r\n        apiKey: \"...\",\r\n    }),\r\n})\r\n\r\n// OpenAI\r\nconst result = await zxcvbnAI(\"password123\", {\r\n    provider: openai({\r\n        apiKey: \"sk-...\",\r\n    }),\r\n})\r\n\r\nconsole.log(result.feedback.explanation)\r\n// \"Your password combines one of the most commonly used passwords with a\r\n//  predictable number suffix. Attackers specifically try these combinations\r\n//  first. A passphrase of four or more random words would be far more secure.\"\r\n```\r\n\r\n### Custom Adapter\r\n\r\n```ts\r\nimport { zxcvbnAI } from \"zxcvbn-ts/ai\"\r\nimport type { AIProvider } from \"zxcvbn-ts/ai\"\r\n\r\nconst myProvider: AIProvider = {\r\n    complete: async (systemPrompt, userPrompt) => {\r\n        const res = await myLLM.chat({\r\n            system: systemPrompt,\r\n            user: userPrompt,\r\n        })\r\n\r\n        return res.text // must return a JSON string\r\n    },\r\n}\r\n\r\nconst result = await zxcvbnAI(\"password123\", {\r\n    provider: myProvider,\r\n})\r\n```\r\n\r\n### Provider options\r\n\r\n| Provider      | Default model               | Env var             |\r\n| ------------- | --------------------------- | ------------------- |\r\n| `anthropic()` | `claude-haiku-4-5-20251001` | `ANTHROPIC_API_KEY` |\r\n| `openai()`    | `gpt-4o-mini`               | `OPENAI_API_KEY`    |\r\n| `gemini()`    | `gemini-1.5-flash`          | `GEMINI_API_KEY`    |\r\n\r\n### ⚠️ Security & Privacy\r\n\r\n`zxcvbnAI()` sends the **structured analysis** of the password to the AI provider — not the raw password itself. The prompt contains the pattern breakdown, score, and crack time estimate. Even so:\r\n\r\n- **Always call `zxcvbnAI()` server-side** — never expose your API key or send password analysis from the browser\r\n- The raw password is never included in the prompt, but the match sequence may reveal partial information\r\n- Use a backend endpoint to proxy calls if you need AI feedback in a client-side app\r\n\r\n```ts\r\n// ✅ Safe — server-side only\r\napp.post(\"/check-password\", async (req, res) => {\r\n    const result = await zxcvbnAI(req.body.password, {\r\n        provider: anthropic({\r\n            apiKey: process.env.ANTHROPIC_API_KEY,\r\n        }),\r\n    })\r\n\r\n    res.json({\r\n        score: result.score,\r\n        feedback: result.feedback,\r\n    })\r\n})\r\n\r\n// ❌ Never do this — exposes API key in browser bundle\r\nconst result = await zxcvbnAI(password, {\r\n    provider: anthropic({\r\n        apiKey: \"sk-ant-...\",\r\n    }),\r\n})\r\n```\r\n\r\n### Cost\r\n\r\nAll providers default to their cheapest model. A typical check uses **~200 input** + **~100 output** tokens — a fraction of a cent per call. Consider only calling `zxcvbnAI()` for weak passwords (`score < 3`) to minimise cost.\r\n\r\n## Dictionaries\r\n\r\nSix ranked frequency lists are bundled, totalling 93,855 words:\r\n\r\n| List                |  Words | Source                           |\r\n| ------------------- | -----: | -------------------------------- |\r\n| `passwords`         | 30,000 | Common leaked passwords          |\r\n| `english_wikipedia` | 30,000 | Frequent Wikipedia words         |\r\n| `us_tv_and_film`    | 19,160 | TV/film character and show names |\r\n| `surnames`          | 10,000 | Common surnames                  |\r\n| `female_names`      |  3,712 | Common female given names        |\r\n| `male_names`        |    983 | Common male given names          |\r\n\r\n### Custom Dictionaries\r\n\r\n```ts\r\nimport { setUserInputDictionary, zxcvbn } from \"zxcvbn-ts\"\r\n\r\n// Inject per-request user-specific words\r\nsetUserInputDictionary([\"alice\", \"smith\", \"alice@example.com\"])\r\nconst result = zxcvbn(\"alice2024\")\r\n```\r\n\r\nOr pass them as `userInputs` directly (recommended — stateless):\r\n\r\n```ts\r\nzxcvbn(\"alice2024\", [\"alice\", \"smith\", \"alice@example.com\"])\r\n```\r\n\r\n## Lower-level API\r\n\r\nAll internal functions are exported for custom integrations:\r\n\r\n```ts\r\nimport {\r\n    omnimatch,\r\n    dictionaryMatch,\r\n    reverseDictionaryMatch,\r\n    l33tMatch,\r\n    spatialMatch,\r\n    repeatMatch,\r\n    sequenceMatch,\r\n    regexMatch,\r\n    dateMatch,\r\n    phoneMatch,\r\n    emailMatch,\r\n    setUserInputDictionary,\r\n    mostGuessableMatchSequence,\r\n    estimateAttackTimes,\r\n    guessesToScore,\r\n    displayTime,\r\n    displayCost,\r\n    getFeedback,\r\n} from \"zxcvbn-ts\"\r\n```\r\n\r\n## Building\r\n\r\n```bash\r\nbun install              # install typescript + @types/bun\r\nbun test                 # run test suite\r\nbun run build            # emit dist/cjs, dist/esm, dist/types\r\nbun run typecheck        # tsc --noEmit only\r\nbun run clean            # remove dist/\r\n```\r\n\r\nOutput after `bun run build`:\r\n\r\n```\r\ndist/\r\n    cjs/        ← CommonJS (require)\r\n    esm/        ← ES Modules (import)\r\n    types/      ← .d.ts declarations\r\n    data/       ← frequency_lists.json (shipped once)\r\n```\r\n\r\n## Issues from original zxcvbn\r\n\r\nStatus of all tracked issues from the [original zxcvbn repository](https://github.com/dropbox/zxcvbn/issues) as they apply to this rewrite.\r\n\r\n| #   | Issue                                                | Title                                                                                                         | Note                                                                                                                                                                                                                          | Status                                                      |\r\n| --- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- |\r\n| 1   | [#363](https://github.com/dropbox/zxcvbn/issues/363) | Massive Memory Footprint                                                                                      | Fixed by shipping frequency lists as a single minified JSON file in `dist/data/` — shipped once instead of 3× across CJS/ESM/types.                                                                                           | ✅ Fixed                                                    |\r\n| 2   | [#338](https://github.com/dropbox/zxcvbn/issues/338) | Feature request: provide options for smaller builds                                                           | The JSON frequency list is a standalone file that can be replaced. `setUserInputDictionary()` supports injecting custom dictionaries at runtime.                                                                              | ✅ Fixed                                                    |\r\n| 3   | [#327](https://github.com/dropbox/zxcvbn/issues/327) | A ReDoS vulnerability exists in matching.coffee                                                               | Replaced the vulnerable `^(.+?)\\1+$` regex with a safe string-length comparison in `repeatMatch`. Attack string now processes in ~79ms vs 892ms.                                                                              | ✅ Fixed                                                    |\r\n| 4   | [#326](https://github.com/dropbox/zxcvbn/issues/326) | Possible DOS when run server side                                                                             | Fixed with a 128-char password limit and 100-char per-userInput limit in `main.ts`.                                                                                                                                           | ✅ Fixed                                                    |\r\n| 5   | [#318](https://github.com/dropbox/zxcvbn/issues/318) | recent year regex is... out of date.                                                                          | Updated regex from `/19\\d\\d\\|200\\d\\|201\\d/` to `/19\\d\\d\\|20[0-3]\\d/` in `matching.ts` — now covers years up to 2039.                                                                                                          | ✅ Fixed                                                    |\r\n| 6   | [#316](https://github.com/dropbox/zxcvbn/issues/316) | Very slow for certain inputs                                                                                  | Added early exit in `repeatMatch` for all-unique-char passwords and capped l33t substitution enumeration at 4 distinct chars. Reduced from 1500ms → 9ms for the reported input.                                               | ⚠️ Partially Fixed                                          |\r\n| 7   | [#300](https://github.com/dropbox/zxcvbn/issues/300) | Can `zxcvbn()` method take the `minlength` parameter also for validation                                      | Not present in the original either — length validation is the caller's responsibility.                                                                                                                                        | ✅ Fixed                                                    |\r\n| 8   | [#291](https://github.com/dropbox/zxcvbn/issues/291) | Easy way to add build and add custom dictionaries                                                             | Already supported via the exported `setUserInputDictionary()` function.                                                                                                                                                       | ✅ Fixed                                                    |\r\n| 9   | [#284](https://github.com/dropbox/zxcvbn/issues/284) | How to configure i18n support                                                                                 | Requires non-English word lists and translated feedback strings. **Out of scope** for this rewrite.                                                                                                                           | ❌ Not Fixed                                                |\r\n| 10  | [#276](https://github.com/dropbox/zxcvbn/issues/276) | Score incongruous for repeated words                                                                          | The repeat matcher includes trailing spaces in the token. **Algorithmic Limitation** inherited from the original.                                                                                                             | ❌ Not Fixed                                                |\r\n| 11  | [#274](https://github.com/dropbox/zxcvbn/issues/274) | Algorithm does not recognize dictionary words in certain cases                                                | The DP finds the minimum-guesses path, not the maximum-matches path. **Algorithmic Limitation**.                                                                                                                              | ❌ Not Fixed                                                |\r\n| 12  | [#273](https://github.com/dropbox/zxcvbn/issues/273) | Dictionary leaves out common words                                                                            | The frequency lists are derived from Wikipedia and common passwords — not a general English dictionary.                                                                                                                       | ❌ Not Fixed                                                |\r\n| 13  | [#272](https://github.com/dropbox/zxcvbn/issues/272) | Fash hash threat model might be optimistic                                                                    | Threat model constants are unchanged from original. Modern GPU hash rates may warrant updating.                                                                                                                               | ✅ Fixed                                                    |\r\n| 14  | [#268](https://github.com/dropbox/zxcvbn/issues/268) | Evaluate to create a minified version that do not implement check on frequency list                           | Users can replace `data/frequency_lists.json` with `{}` for a frequency-list-free build.                                                                                                                                      | ⚠️ Partially Fixed — users can replace the JSON file        |\r\n| 15  | [#267](https://github.com/dropbox/zxcvbn/issues/267) | User Inputs transformed to lower case leads to unexpectedly high score for upper case variants of user inputs | Fixed in `main.ts` — original-cased user inputs are now also added to the ranked dictionary alongside the lowercased version.                                                                                                 | ✅ Fixed                                                    |\r\n| 16  | [#264](https://github.com/dropbox/zxcvbn/issues/264) | Bruteforce entropy estimator does not account for cardinality                                                 | `BRUTEFORCE_CARDINALITY` is fixed at 10 regardless of actual character set. Fixing this properly **requires algorithm changes**.                                                                                              | ❌ Not Fixed                                                |\r\n| 17  | [#234](https://github.com/dropbox/zxcvbn/issues/234) | Add Markov Chain recognition                                                                                  | Would require a Markov chain model trained on password datasets. Significant addition — **not in scope**.                                                                                                                     | ❌ Not Fixed                                                |\r\n| 18  | [#232](https://github.com/dropbox/zxcvbn/issues/232) | Passwords recognized as single tokens inconsistently rewarded for capitalization                              | Fixed in `scoring.ts` — `uppercaseVariations` now strips non-letter chars before computing the multiplier. `12345Qwert` and `12345qwerT` now both yield 1009 guesses.                                                         | ✅ Fixed                                                    |\r\n| 19  | [#231](https://github.com/dropbox/zxcvbn/issues/231) | No specific suggestion or warning given for passwords that are too weak because of user imputs                | Fixed in `feedback.ts` — added a specific case for `dictionary_name === \"user_inputs\"` returning: \"This password is on your personal info list\".                                                                              | ✅ Fixed                                                    |\r\n| 20  | [#227](https://github.com/dropbox/zxcvbn/issues/227) | user_inputs argument                                                                                          | `user_inputs` works for whole-token matches within the DP. Short words may not match across token boundaries. **DP Limitation**.                                                                                              | ❌ Not Fixed                                                |\r\n| 21  | [#223](https://github.com/dropbox/zxcvbn/issues/223) | Group repetition not detected                                                                                 | Group repetitions like `abcabcabc` are already correctly detected as `repeat(abcabcabc)` in my TypeScript rewrite.                                                                                                            | ✅ Fixed                                                    |\r\n| 22  | [#221](https://github.com/dropbox/zxcvbn/issues/221) | Possible L33t Matcher Bug - Relevant L33t Subtable Always Empty                                               | The l33t subtable bug existed in the original CoffeeScript. My TypeScript rewrite correctly identifies l33t matches.                                                                                                          | ✅ Fixed                                                    |\r\n| 23  | [#216](https://github.com/dropbox/zxcvbn/issues/216) | Match tokens not accurate with spaces                                                                         | Spaces are treated as bruteforce tokens by the DP. Treating whitespace as a separator would change the core algorithm.                                                                                                        | ❌ Not Fixed                                                |\r\n| 24  | [#211](https://github.com/dropbox/zxcvbn/issues/211) | How to generate dictionary in another language than english ?                                                 | Use `setUserInputDictionary()` with a custom non-English word list. Full i18n is **out of scope**.                                                                                                                            | ❌ Not Fixed                                                |\r\n| 25  | [#209](https://github.com/dropbox/zxcvbn/issues/209) | Bruteforce and suboptimal scoring chains                                                                      | The DP is designed to find minimum guesses, not maximum matches. **This is by design**.                                                                                                                                       | ❌ Not Fixed                                                |\r\n| 26  | [#208](https://github.com/dropbox/zxcvbn/issues/208) | Computed guesses for user-input matches is oddly high                                                         | The DP factorial multiplier inflates the combined guess count when all tokens come from user_inputs. **Known DP Limitation**.                                                                                                 | ❌ Not Fixed                                                |\r\n| 27  | [#207](https://github.com/dropbox/zxcvbn/issues/207) | How to best feed large additional dictionaries                                                                | Use `setUserInputDictionary()` for custom words. Very large lists will impact performance.                                                                                                                                    | ❌ Not Fixed                                                |\r\n| 28  | [#206](https://github.com/dropbox/zxcvbn/issues/206) | 'Administrator' password with special chars are indicated as a strong password                                | `aDm1n` is correctly detected as l33t `admin`, but `!str@t0r` cannot be reverse-mapped to `administrator` because `!` has no l33t mapping. **Algorithmic Limitation**.                                                        | ❌ Not Fixed                                                |\r\n| 29  | [#204](https://github.com/dropbox/zxcvbn/issues/204) | ignored dictionaries during matching                                                                          | Fixed in `feedback.ts` — added a specific warning for `us_tv_and_film` dictionary matches: \"TV show and film names are easy to guess\".                                                                                        | ✅ Fixed                                                    |\r\n| 30  | [#201](https://github.com/dropbox/zxcvbn/issues/201) | User input permutation suggestions                                                                            | Covered by the fix for [#231](https://github.com/dropbox/zxcvbn/issues/231) — passwords matching user_inputs now return a specific warning and suggestions.                                                                   | ✅ Fixed                                                    |\r\n| 31  | [#199](https://github.com/dropbox/zxcvbn/issues/199) | Updating estimates for pbkdf2 streaching                                                                      | Fixed via the `customHashesPerSecond` option in `ZxcvbnOptions`. Pass your effective hash rate (e.g. `1e6` for pbkdf2 with 100k iterations) and a `custom_hash_rate` field is added to all crack time results.                | ✅ Fixed                                                    |\r\n| 32  | [#196](https://github.com/dropbox/zxcvbn/issues/196) | I'm unfamilar with what 'keyboard turns' are                                                                  | UX wording issue in the original. \"Keyboard turns\" refers to direction changes in a keyboard walk (e.g. `qweasd` has 1 turn). **No code change needed**.                                                                      | ➖ No code change needed — documentation clarification only |\r\n| 33  | [#195](https://github.com/dropbox/zxcvbn/issues/195) | Check bopomofo combinations                                                                                   | Bopomofo keyboard layout support would require adding a new adjacency graph. **Out of scope** for this rewrite.                                                                                                               | ❌ Not Fixed                                                |\r\n| 34  | [#194](https://github.com/dropbox/zxcvbn/issues/194) | Long password throws an error                                                                                 | Fixed by the 128-char input limit added in `main.ts` (fix for [#326](https://github.com/dropbox/zxcvbn/issues/326)). Long passwords no longer crash the DP.                                                                   | ✅ Fixed                                                    |\r\n| 35  | [#190](https://github.com/dropbox/zxcvbn/issues/190) | Better support for common keyboard layouts                                                                    | Additional keyboard layout support would require new adjacency graphs. **Out of scope**.                                                                                                                                      | ❌ Not Fixed                                                |\r\n| 36  | [#171](https://github.com/dropbox/zxcvbn/issues/171) | Localization of feedback                                                                                      | Feedback strings are hardcoded in `feedback.ts`. A full i18n solution requires translating all strings and is **out of scope**.                                                                                               | ❌ Not Fixed                                                |\r\n| 37  | [#157](https://github.com/dropbox/zxcvbn/issues/157) | Flaw in scoring (or Flaw in my opinion)                                                                       | Spaces between repeated words inflate the entropy estimate. Related to [#276](https://github.com/dropbox/zxcvbn/issues/276) and [#21](https://github.com/dropbox/zxcvbn/issues/21) — **Algorithmic Limitation**.              | ❌ Not Fixed                                                |\r\n| 38  | [#142](https://github.com/dropbox/zxcvbn/issues/142) | represent difficulty to crack as money rather than time                                                       | The `crack_times_seconds` values can be used to compute cost estimates. A `crack_times_cost` field could be added as a future enhancement.                                                                                    | ✅ Fixed                                                    |\r\n| 39  | [#132](https://github.com/dropbox/zxcvbn/issues/132) | Concat extras should have 0 score                                                                             | Concatenated user inputs should score 0. Covered by the fix for [#231](https://github.com/dropbox/zxcvbn/issues/231)/[#201](https://github.com/dropbox/zxcvbn/issues/201) — user_inputs matches now return specific warnings. | ✅ Fixed                                                    |\r\n| 40  | [#129](https://github.com/dropbox/zxcvbn/issues/129) | Suggestion should be shown when password matches user input                                                   | Fixed by the fix for [#231](https://github.com/dropbox/zxcvbn/issues/231) — passwords matching user_inputs now return: \"This password is on your personal info list\".                                                         | ✅ Fixed                                                    |\r\n| 41  | [#128](https://github.com/dropbox/zxcvbn/issues/128) | Suggestion should include actual substitution used                                                            | Fixed in `feedback.ts` — suggestion now uses the actual substitution from `sub_display` (e.g. \"3 → e\") instead of the generic `@` example.                                                                                    | ✅ Fixed                                                    |\r\n| 42  | [#116](https://github.com/dropbox/zxcvbn/issues/116) | \"Capitalization doesn't help very much\" can be confusing                                                      | Fixed in `feedback.ts` — changed to \"Capitalizing the first letter is a common pattern and doesn't add much security\".                                                                                                        | ✅ Fixed                                                    |\r\n| 43  | [#105](https://github.com/dropbox/zxcvbn/issues/105) | Telephone number format sequence                                                                              | Phone number detection would require a new regex matcher. **Out of scope**.                                                                                                                                                   | ✅ Fixed                                                    |\r\n| 44  | [#97](https://github.com/dropbox/zxcvbn/issues/97)   | Diacritics removal before dictionary check                                                                    | Fixed in `matching.ts` — passwords are now normalized via `NFD` + diacritic strip before dictionary lookup. `pässwörd` now matches `password`.                                                                                | ✅ Fixed                                                    |\r\n| 45  | [#21](https://github.com/dropbox/zxcvbn/issues/21)   | spaced passwords add too much entropy                                                                         | Spaces between single chars inflate entropy because each space is treated as a bruteforce token. Related to [#276](https://github.com/dropbox/zxcvbn/issues/276) — **Algorithmic Limitation**.                                | ❌ Not Fixed                                                |\r\n\r\n## License\r\n\r\n[MIT](LICENSE.md)\r\n","readmeFilename":"README.md"}