@ppabari/strio 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/seeded.ts","../src/charset-aliases.ts","../src/charsets.ts","../src/generator.ts","../src/short-id.ts","../src/expiring-token.ts","../src/stream.ts","../src/passphrase.ts","../src/entropy.ts","../src/validate.ts","../src/presets.ts","../src/zod.ts","../src/secrets.ts","../src/index.ts"],"names":["seededStr","randomLength","B62","CHARSETS"],"mappings":"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A,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EA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","file":"index.js","sourcesContent":["/**\n * core.ts\n * Cryptographically secure, bias-free random byte generation.\n * Works in Node.js (>=18), browsers, Deno, and edge runtimes.\n */\n\n/**\n * Returns a single cryptographically secure random byte (0–255).\n * Uses the Web Crypto API universally — available natively in\n * Node >=18, all modern browsers, Deno, Cloudflare Workers, etc.\n */\nfunction getRandomByte(): number {\n const buf = new Uint8Array(1);\n crypto.getRandomValues(buf);\n return buf[0] as number;\n}\n\n/**\n * Returns a random character from `charset` with no modulo bias.\n *\n * Naive approach: index = randomByte % charset.length\n * Problem: If 256 is not evenly divisible by charset.length,\n * some characters appear slightly more often.\n *\n * Fix (rejection sampling):\n * Compute the largest multiple of charset.length that fits in 0–255.\n * Discard bytes >= that threshold and retry.\n * Expected retries: < 1 per character for any charset <= 128 chars.\n */\nexport function getRandomChar(charset: string): string {\n const len = charset.length;\n // Largest multiple of `len` that fits in a byte (0–255 range)\n const maxValid = 256 - (256 % len);\n\n let byte: number;\n do {\n byte = getRandomByte();\n } while (byte >= maxValid);\n\n return charset[byte % len] as string;\n}\n\n/**\n * Fills an array of `count` random characters from `charset`.\n * Batches the crypto call for efficiency.\n */\nexport function getRandomChars(charset: string, count: number): string[] {\n const len = charset.length;\n const maxValid = 256 - (256 % len);\n const result: string[] = [];\n\n // Over-allocate to avoid multiple round trips; 40% buffer is generous\n // for any realistic charset size.\n const bufSize = Math.ceil(count * 1.4) + 32;\n const buf = new Uint8Array(bufSize);\n\n while (result.length < count) {\n crypto.getRandomValues(buf);\n for (let i = 0; i < buf.length && result.length < count; i++) {\n const byte = buf[i] as number;\n if (byte < maxValid) {\n result.push(charset[byte % len] as string);\n }\n }\n // Extremely unlikely to need a second pass, but handles edge cases\n // like a 1-char charset (which is blocked by validation anyway)\n }\n\n return result;\n}\n","/**\n * seeded.ts\n * Deterministic pseudo-random string generation using xoshiro128**.\n *\n * ⚠️ NOT CRYPTOGRAPHICALLY SECURE. Seeded mode is for:\n * - Reproducible test fixtures\n * - Snapshot testing\n * - Demos and consistent example output\n *\n * Never use a seeded string as a security token, password, or secret.\n *\n * Implementation notes:\n * - Uses xoshiro128** — four 32-bit words, easy to implement correctly in JS\n * - Rejection sampling uses floating-point division (avoids uint64 overflow)\n * - maxValid = floor(2^32 / len) * len, computed in float64 (exact up to 2^53)\n */\n\n/** Four 32-bit state words for xoshiro128**. */\ntype State = [number, number, number, number];\n\nfunction rotl32(x: number, k: number): number {\n return ((x << k) | (x >>> (32 - k))) >>> 0;\n}\n\n/**\n * Hash a seed string into 4 × 32-bit state words using a simple\n * multiplicative hash with good avalanche (splitmix-style).\n */\nfunction seedState(seed: string): State {\n // Two starting hash lanes from the seed string\n let a = 0x9e3779b9 >>> 0;\n let b = 0x6c62272e >>> 0;\n for (let i = 0; i < seed.length; i++) {\n const ch = seed.charCodeAt(i);\n a = (Math.imul(a ^ ch, 0x9e3779b9) + 0x52c09e4d) >>> 0;\n b = (Math.imul(b ^ ch, 0x85ebca6b) + 0xc2b2ae35) >>> 0;\n }\n\n // Expand into 4 words with splitmix32-style finalisation\n function sm32(v: number): number {\n v = (Math.imul(v ^ (v >>> 16), 0x45d9f3b) + 0x1b873593) >>> 0;\n v = (Math.imul(v ^ (v >>> 16), 0x45d9f3b) + 0xe6546b64) >>> 0;\n return (v ^ (v >>> 16)) >>> 0;\n }\n\n return [\n sm32(a),\n sm32(b),\n sm32(a ^ 0xdeadbeef),\n sm32(b ^ 0xbaadf00d),\n ];\n}\n\n/**\n * Advance xoshiro128** and return a uint32 in [0, 2^32).\n */\nfunction nextUint32(s: State): number {\n const result = Math.imul(rotl32(Math.imul(s[1]!, 5) >>> 0, 7), 9) >>> 0;\n const t = (s[1]! << 9) >>> 0;\n\n s[2] = (s[2]! ^ s[0]!) >>> 0;\n s[3] = (s[3]! ^ s[1]!) >>> 0;\n s[1] = (s[1]! ^ s[2]!) >>> 0;\n s[0] = (s[0]! ^ s[3]!) >>> 0;\n s[2] = (s[2]! ^ t) >>> 0;\n s[3] = rotl32(s[3]!, 11);\n\n return result;\n}\n\n/**\n * Return a random character from `charset` using rejection sampling.\n *\n * maxValid is computed as: floor(2^32 / len) * len\n * All arithmetic stays in float64 (safe up to 2^53), so no overflow\n * regardless of charset length.\n */\nfunction seededChar(charset: string, state: State): string {\n const len = charset.length;\n // Use float64 to avoid 32-bit overflow: floor(4294967296 / len) * len\n const maxValid = Math.floor(4294967296 / len) * len;\n let n: number;\n do {\n n = nextUint32(state);\n } while (n >= maxValid);\n return charset[n % len]!;\n}\n\nexport interface SeededGeneratorOptions {\n /** Deterministic seed — same seed + charset + length → same output always. */\n seed: string;\n /** Character pool to draw from. */\n charset: string;\n /** Number of characters to generate. */\n length: number;\n}\n\n/**\n * Generate a deterministic string from a seed.\n *\n * @example\n * generateSeeded({ seed: 'test-42', charset: 'abc123', length: 8 })\n * // Always returns the exact same string for these inputs\n *\n * @example Use in tests\n * const id = generateSeeded({ seed: 'fixture', charset: base62, length: 16 });\n * expect(id).toMatchInlineSnapshot('\"3Xp9mQr2LzYw7NvT\"');\n */\nexport function generateSeeded({ seed, charset, length }: SeededGeneratorOptions): string {\n const state = seedState(seed);\n const chars: string[] = [];\n for (let i = 0; i < length; i++) {\n chars.push(seededChar(charset, state));\n }\n return chars.join('');\n}\n","/**\n * charset-aliases.ts\n * Named character set aliases for common encoding schemes.\n * Pass any alias name as the `charset` option in generateRandomString.\n *\n * @example\n * import { generateRandomString, CHARSET_ALIASES } from '@ppabari/strio';\n * generateRandomString({ charset: CHARSET_ALIASES.base58, length: 22 });\n * // or via string shorthand:\n * generateRandomString({ charset: 'base58', length: 22 });\n */\n\nexport const CHARSET_ALIASES: Record<string, string> = {\n /**\n * Base16 — hex digits, lowercase.\n * Use for: hash representations, color codes, compact binary encoding.\n */\n base16: '0123456789abcdef',\n\n /** Base16 uppercase variant */\n base16upper: '0123456789ABCDEF',\n\n /**\n * Base32 — RFC 4648. Uppercase alpha + digits, no padding chars.\n * Use for: case-insensitive tokens, OTP secrets (Google Authenticator compatible).\n */\n base32: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',\n\n /**\n * Base32 hex — RFC 4648 §7. Sortable alternative to standard base32.\n */\n base32hex: '0123456789ABCDEFGHIJKLMNOPQRSTUV',\n\n /**\n * Base36 — digits + lowercase alpha.\n * Use for: short URLs, case-insensitive IDs, number system conversions.\n */\n base36: '0123456789abcdefghijklmnopqrstuvwxyz',\n\n /**\n * Base58 — Bitcoin alphabet. No 0/O/I/l to avoid visual ambiguity.\n * Use for: Bitcoin addresses, IPFS CIDs, human-readable tokens.\n */\n base58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',\n\n /**\n * Base62 — digits + lowercase + uppercase. Max density for alphanumeric.\n * Use for: URL shorteners, compact IDs, high-entropy tokens.\n */\n base62: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n\n /**\n * Base64 URL-safe — RFC 4648 §5. No +/= padding; URL and filename safe.\n * Use for: JWT components, URL tokens, file names.\n */\n base64url: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_',\n\n /**\n * Alphanumeric — same as base62. Alias for clarity.\n */\n alphanumeric: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n\n /**\n * Alpha — letters only, mixed case.\n */\n alpha: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n\n /**\n * Numeric — digits only.\n */\n numeric: '0123456789',\n\n /**\n * Hex — alias for base16 lowercase.\n */\n hex: '0123456789abcdef',\n\n /**\n * Crockford Base32 — human-friendly, case-insensitive, excludes I/L/O/U.\n * Use for: serial numbers, redemption codes, user-facing IDs.\n */\n crockford32: '0123456789ABCDEFGHJKMNPQRSTVWXYZ',\n} as const;\n\nexport type CharsetAlias = keyof typeof CHARSET_ALIASES;\n\n/**\n * Resolve a charset value: if it matches a known alias, return the\n * corresponding character string; otherwise return the value as-is.\n *\n * This is called inside buildCharset so alias names work transparently\n * as the `charset` option.\n *\n * @example\n * resolveCharsetAlias('base58') // → '123456789ABCDEF...'\n * resolveCharsetAlias('abc') // → 'abc'\n */\nexport function resolveCharsetAlias(value: string): string {\n return CHARSET_ALIASES[value] ?? value;\n}\n","/**\n * charsets.ts\n * Character set constants used across the library.\n */\nimport { resolveCharsetAlias } from './charset-aliases.js';\n\nexport const CHARSETS = {\n numeric: '0123456789',\n lowercase: 'abcdefghijklmnopqrstuvwxyz',\n uppercase: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n symbols: '!@#$%^&*()_+[]{}<>?',\n alphanumeric: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',\n hex: '0123456789abcdef',\n // Ambiguous characters that are easy to confuse when reading/transcribing\n ambiguous: '0Ol1I',\n} as const;\n\n/**\n * Deduplicate characters in a string, preserving order of first occurrence.\n */\nexport function dedup(str: string): string {\n return [...new Set(str)].join('');\n}\n\n/**\n * Build a character pool from option flags.\n * Returns the pool string and throws a descriptive error if the\n * resulting pool is empty or has fewer than 2 unique characters.\n */\nexport function buildCharset(options: {\n numeric?: boolean;\n lowercase?: boolean;\n uppercase?: boolean;\n symbols?: boolean;\n readable?: boolean;\n exclude?: string | string[];\n charset?: string;\n}): string {\n let pool: string;\n\n if (options.charset !== undefined) {\n pool = dedup(resolveCharsetAlias(options.charset));\n if (pool.length < 2) {\n throw new Error(\n 'Custom charset must contain at least 2 unique characters.'\n );\n }\n return pool;\n }\n\n const {\n numeric = true,\n lowercase = true,\n uppercase = true,\n symbols = false,\n } = options;\n\n pool = '';\n if (numeric) pool += CHARSETS.numeric;\n if (lowercase) pool += CHARSETS.lowercase;\n if (uppercase) pool += CHARSETS.uppercase;\n if (symbols) pool += CHARSETS.symbols;\n\n if (!pool) {\n throw new Error(\n 'At least one character type must be enabled (numeric, lowercase, uppercase, or symbols).'\n );\n }\n\n // Apply readable shorthand\n if (options.readable) {\n for (const ch of CHARSETS.ambiguous) {\n pool = pool.split(ch).join('');\n }\n }\n\n // Apply explicit exclusions\n if (options.exclude) {\n const excludeChars =\n typeof options.exclude === 'string'\n ? options.exclude\n : options.exclude.join('');\n for (const ch of excludeChars) {\n pool = pool.split(ch).join('');\n }\n }\n\n pool = dedup(pool);\n\n if (pool.length < 2) {\n throw new Error(\n 'After applying exclusions, the character pool has fewer than 2 unique characters. ' +\n 'Loosen your exclude/readable settings or enable more character types.'\n );\n }\n\n return pool;\n}\n\n/**\n * Build the subset of `fullPool` that only contains alphabetic characters.\n */\nexport function alphabetSubset(fullPool: string): string {\n return [...fullPool]\n .filter(ch => /[a-zA-Z]/.test(ch))\n .join('');\n}\n\n/**\n * Build the subset of `fullPool` that only contains numeric characters.\n */\nexport function numericSubset(fullPool: string): string {\n return [...fullPool]\n .filter(ch => /[0-9]/.test(ch))\n .join('');\n}\n","/**\n * generator.ts\n * Core string generation logic for both sync and async paths.\n */\n\nimport type { RandomStringOptions } from './types.js';\nimport { getRandomChar, getRandomChars } from './core.js';\nimport { generateSeeded } from './seeded.js';\nimport {\n buildCharset,\n alphabetSubset,\n numericSubset,\n CHARSETS,\n} from './charsets.js';\n\n// ---------------------------------------------------------------------------\n// Pattern expansion\n// ---------------------------------------------------------------------------\n\n/**\n * Expand a pattern string into a random string.\n * Placeholder characters are replaced; literal characters are preserved.\n *\n * Placeholders:\n * # → digit\n * A → uppercase letter\n * a → lowercase letter\n * * → char from full charset\n * ? → alphanumeric from full charset\n *\n * Escape with backslash: `\\#` → literal `#`\n */\nexport function expandPattern(pattern: string, fullCharset: string): string {\n const upper = [...fullCharset].filter(c => /[A-Z]/.test(c)).join('') || CHARSETS.uppercase;\n const lower = [...fullCharset].filter(c => /[a-z]/.test(c)).join('') || CHARSETS.lowercase;\n const alphanum = [...fullCharset].filter(c => /[a-zA-Z0-9]/.test(c)).join('') || CHARSETS.alphanumeric;\n\n const result: string[] = [];\n let i = 0;\n\n while (i < pattern.length) {\n const ch = pattern[i] as string;\n\n if (ch === '\\\\' && i + 1 < pattern.length) {\n // Escaped literal — include next character verbatim\n result.push(pattern[i + 1] as string);\n i += 2;\n continue;\n }\n\n switch (ch) {\n case '#':\n result.push(getRandomChar(CHARSETS.numeric));\n break;\n case 'A':\n result.push(getRandomChar(upper));\n break;\n case 'a':\n result.push(getRandomChar(lower));\n break;\n case '*':\n result.push(getRandomChar(fullCharset));\n break;\n case '?':\n result.push(getRandomChar(alphanum));\n break;\n default:\n result.push(ch);\n }\n\n i++;\n }\n\n return result.join('');\n}\n\n// ---------------------------------------------------------------------------\n// Single string generation\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a single random string from the given options.\n * This is the synchronous inner workhorse; called by both the public\n * sync and async APIs.\n */\nexport function generateOne(options: RandomStringOptions): string {\n const {\n length = 16,\n prefix = '',\n suffix = '',\n startWith = 'any',\n pattern,\n seed,\n ...charsetOptions\n } = options;\n\n // Build the main charset (validates options, throws on bad config)\n const charset = buildCharset(charsetOptions);\n\n // --- Seeded / deterministic mode ---\n if (seed !== undefined) {\n if (pattern !== undefined) {\n // For pattern mode with seed, generate enough seeded chars and consume them\n // by re-running expandPattern with a seeded char source isn't trivial,\n // so we generate a seeded string of the expanded pattern length instead.\n const patternLength = [...pattern].filter((_, i) => {\n // Count non-escaped, non-literal chars — approximate length\n return true;\n }).length;\n const seededStr = generateSeeded({ seed, charset, length: patternLength });\n return `${prefix}${seededStr}${suffix}`;\n }\n const randomLength = length - prefix.length - suffix.length;\n if (randomLength <= 0) return `${prefix}${suffix}`;\n const seededStr = generateSeeded({ seed, charset, length: randomLength });\n return `${prefix}${seededStr}${suffix}`;\n }\n\n // --- Pattern mode ---\n if (pattern !== undefined) {\n const expanded = expandPattern(pattern, charset);\n return `${prefix}${expanded}${suffix}`;\n }\n\n // --- Length mode ---\n const randomLength = length - prefix.length - suffix.length;\n\n if (randomLength < 0) {\n throw new Error(\n `prefix ('${prefix}') + suffix ('${suffix}') is longer than the total length (${length}). ` +\n 'Increase length or shorten the affixes.'\n );\n }\n\n if (randomLength === 0) {\n return `${prefix}${suffix}`;\n }\n\n // Determine the allowed set for the first character\n let firstCharset: string;\n switch (startWith) {\n case 'alphabet': {\n const alpha = alphabetSubset(charset);\n if (!alpha) {\n throw new Error(\n \"startWith: 'alphabet' requires at least one of lowercase or uppercase to be enabled.\"\n );\n }\n firstCharset = alpha;\n break;\n }\n case 'numeric': {\n const num = numericSubset(charset);\n if (!num) {\n throw new Error(\n \"startWith: 'numeric' requires numeric to be enabled.\"\n );\n }\n firstCharset = num;\n break;\n }\n default:\n firstCharset = charset;\n }\n\n // Build the string\n const firstChar = getRandomChar(firstCharset);\n\n if (randomLength === 1) {\n return `${prefix}${firstChar}${suffix}`;\n }\n\n const rest = getRandomChars(charset, randomLength - 1).join('');\n return `${prefix}${firstChar}${rest}${suffix}`;\n}\n\n// ---------------------------------------------------------------------------\n// Batch generation\n// ---------------------------------------------------------------------------\n\n/**\n * Generate `count` unique strings. Uniqueness is guaranteed via a Set.\n * Throws if the requested count is theoretically impossible given the config.\n */\nexport function generateBatch(options: RandomStringOptions, count: number): string[] {\n if (count <= 0) {\n throw new Error('count must be a positive integer.');\n }\n if (!Number.isInteger(count)) {\n throw new Error('count must be an integer.');\n }\n\n const results = new Set<string>();\n let attempts = 0;\n // Allow generous retries; practical collision risk is negligible for any\n // sensibly-sized charset+length combination\n const maxAttempts = count * 10 + 1000;\n\n while (results.size < count) {\n if (++attempts > maxAttempts) {\n throw new Error(\n `Could not generate ${count} unique strings after ${maxAttempts} attempts. ` +\n 'The charset and length combination may not support this many unique values.'\n );\n }\n results.add(generateOne(options));\n }\n\n return [...results];\n}\n","/**\n * short-id.ts\n * Collision-resistant short IDs with an optional checksum character.\n *\n * A checksum character (Luhn-style mod-N) is appended to the random\n * portion so that single-character transcription errors are detectable\n * without a database lookup. The checksum uses the same charset as the\n * random portion — the output looks uniform.\n *\n * Format: [prefix_][random chars][checksum char]\n *\n * @example\n * const id = generateId({ prefix: 'usr' });\n * // → 'usr_K3xP9mQr2L4c' (10 random + 1 checksum = 11 chars after prefix)\n *\n * validateId('usr_K3xP9mQr2L4c', { prefix: 'usr' });\n * // → { valid: true, ... }\n */\n\nimport { getRandomChars } from './core.js';\nimport { buildCharset } from './charsets.js';\nimport { resolveCharsetAlias } from './charset-aliases.js';\n\nexport interface ShortIdOptions {\n /**\n * Optional prefix string, e.g. `'usr'` → `'usr_K3xP9mQr'`.\n * An underscore separator is added automatically between prefix and random part.\n * Set `separator: ''` to disable.\n */\n prefix?: string;\n /**\n * Separator between prefix and random portion.\n * @default '_'\n */\n separator?: string;\n /**\n * Length of the random portion (before checksum is added).\n * Total random section = randomLength + 1 (checksum).\n * @default 12\n */\n randomLength?: number;\n /**\n * Character pool for the random portion. Accepts a charset alias\n * (e.g. `'base58'`) or a raw character string.\n * @default base58 (no ambiguous chars)\n */\n charset?: string;\n /**\n * Whether to append a checksum character.\n * Disable only if you need exact length control.\n * @default true\n */\n checksum?: boolean;\n}\n\nexport interface ShortIdValidateOptions {\n /** Expected prefix (without separator). */\n prefix?: string;\n /** Separator used when the ID was generated. @default '_' */\n separator?: string;\n /** Charset used when the ID was generated. @default base58 */\n charset?: string;\n /** Whether the ID was generated with a checksum. @default true */\n checksum?: boolean;\n}\n\nexport interface ShortIdValidateResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Compute a mod-N checksum character for `payload` over `charset`.\n * Detects all single-character substitutions and many transpositions.\n */\nfunction computeChecksum(payload: string, charset: string): string {\n const n = charset.length;\n let sum = 0;\n for (let i = 0; i < payload.length; i++) {\n const idx = charset.indexOf(payload[i]!);\n if (idx === -1) return charset[0]!; // fallback; caller validates charset\n // Alternate weight 1 and 2 (Luhn-style) to catch transpositions too\n const weight = (i % 2 === 0) ? 1 : 2;\n sum += idx * weight;\n }\n return charset[sum % n]!;\n}\n\n/**\n * Generate a collision-resistant short ID.\n *\n * @example\n * generateId() // → 'K3xP9mQr2L4Xc'\n * generateId({ prefix: 'usr' }) // → 'usr_K3xP9mQr2L4Xc'\n * generateId({ prefix: 'inv', randomLength: 8 }) // → 'inv_K3xP9mQrc'\n * generateId({ charset: 'base62' }) // → '4jK9mQr2L4Xz3'\n */\nexport function generateId(options: ShortIdOptions = {}): string {\n const {\n prefix,\n separator = '_',\n randomLength = 12,\n charset: rawCharset = 'base58',\n checksum = true,\n } = options;\n\n const resolvedCharset = resolveCharsetAlias(rawCharset);\n const charset = buildCharset({ charset: resolvedCharset });\n\n if (randomLength < 4) throw new Error('randomLength must be at least 4.');\n\n const randomPart = getRandomChars(charset, randomLength).join('');\n const checksumChar = checksum ? computeChecksum(randomPart, charset) : '';\n const randomSection = randomPart + checksumChar;\n\n if (prefix) {\n return `${prefix}${separator}${randomSection}`;\n }\n return randomSection;\n}\n\n/**\n * Validate a short ID against a known config.\n * Checks prefix, separator, and checksum integrity.\n *\n * @example\n * validateId('usr_K3xP9mQr2L4Xc', { prefix: 'usr' })\n * // → { valid: true, errors: [] }\n *\n * validateId('usr_K3xP9mQr2L4Xa', { prefix: 'usr' })\n * // → { valid: false, errors: ['Checksum mismatch — ID may be corrupted or mistyped.'] }\n */\nexport function validateId(\n id: string,\n options: ShortIdValidateOptions = {}\n): ShortIdValidateResult {\n const {\n prefix,\n separator = '_',\n charset: rawCharset = 'base58',\n checksum = true,\n } = options;\n\n const errors: string[] = [];\n const resolvedCharset = resolveCharsetAlias(rawCharset);\n let payload = id;\n\n // Check prefix\n if (prefix) {\n const expectedStart = `${prefix}${separator}`;\n if (!id.startsWith(expectedStart)) {\n errors.push(`Expected prefix '${prefix}${separator}', got '${id.slice(0, expectedStart.length)}'.`);\n return { valid: false, errors };\n }\n payload = id.slice(expectedStart.length);\n }\n\n // Check all chars are in charset\n const charsetSet = new Set(resolvedCharset);\n const badChars = [...new Set(payload)].filter(c => !charsetSet.has(c));\n if (badChars.length > 0) {\n errors.push(`Contains characters outside the expected charset: ${badChars.map(c => JSON.stringify(c)).join(', ')}.`);\n }\n\n // Check checksum\n if (checksum && payload.length >= 2 && errors.length === 0) {\n const randomPart = payload.slice(0, -1);\n const providedChecksum = payload.slice(-1);\n const expectedChecksum = computeChecksum(randomPart, resolvedCharset);\n if (providedChecksum !== expectedChecksum) {\n errors.push('Checksum mismatch — ID may be corrupted or mistyped.');\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","/**\n * expiring-token.ts\n * Time-bound tokens with tamper-evident expiry encoding.\n *\n * Token format (base62-encoded, no separators):\n * [8 chars: expiry epoch seconds in base62] + [random payload]\n *\n * The expiry is prepended to the random portion, then the whole thing\n * is encoded so it looks like a uniform random string. A simple XOR\n * checksum guards against accidental corruption (not cryptographic —\n * use a signed JWT if you need HMAC-level tamper protection).\n *\n * @example\n * const { token, expiresAt } = generateExpiringToken({ ttlSeconds: 900 });\n * // later…\n * const result = verifyToken(token);\n * result.valid // true / false\n * result.expiresAt // Date\n * result.expired // boolean\n */\n\nimport { generateOne } from './generator.js';\nimport { CHARSET_ALIASES } from './charset-aliases.js';\n\nconst B62 = CHARSET_ALIASES['base62']!;\nconst B62_LEN = B62.length;\nconst EXPIRY_CHARS = 8; // base62-encodes up to ~3.5 trillion seconds — future-proof\n\n/** Encode a non-negative integer into a fixed-width base62 string. */\nfunction encodeBase62(n: number, width: number): string {\n const digits: string[] = [];\n let v = Math.floor(n);\n for (let i = 0; i < width; i++) {\n digits.unshift(B62[v % B62_LEN]!);\n v = Math.floor(v / B62_LEN);\n }\n return digits.join('');\n}\n\n/** Decode a base62 string back to a number. */\nfunction decodeBase62(s: string): number {\n let v = 0;\n for (const ch of s) {\n const idx = B62.indexOf(ch);\n if (idx === -1) return -1;\n v = v * B62_LEN + idx;\n }\n return v;\n}\n\nexport interface ExpiringTokenOptions {\n /**\n * How long (in seconds) before the token expires.\n * @default 900 (15 minutes)\n */\n ttlSeconds?: number;\n /**\n * Length of the random payload (not counting the expiry prefix).\n * Total token length = payloadLength + 8.\n * @default 24\n */\n payloadLength?: number;\n}\n\nexport interface ExpiringTokenResult {\n /** The opaque token string to store / transmit. */\n token: string;\n /** When this token stops being valid. */\n expiresAt: Date;\n /** Total token length in characters. */\n length: number;\n}\n\nexport interface TokenVerifyResult {\n /** Whether the token is structurally valid AND not yet expired. */\n valid: boolean;\n /** Whether the token format could be parsed (regardless of expiry). */\n parsed: boolean;\n /** Whether the token has passed its expiry time. */\n expired: boolean;\n /** Expiry time, if the token could be parsed. */\n expiresAt: Date | null;\n /** Seconds remaining (negative if expired). */\n secondsRemaining: number | null;\n}\n\n/**\n * Generate a self-expiring token.\n *\n * @example\n * // Password reset link (15 min)\n * const { token } = generateExpiringToken({ ttlSeconds: 900 });\n *\n * // Magic login link (10 min), longer payload\n * const { token, expiresAt } = generateExpiringToken({\n * ttlSeconds: 600,\n * payloadLength: 32,\n * });\n */\nexport function generateExpiringToken(\n options: ExpiringTokenOptions = {}\n): ExpiringTokenResult {\n const { ttlSeconds = 900, payloadLength = 24 } = options;\n\n if (ttlSeconds <= 0) throw new Error('ttlSeconds must be a positive number.');\n if (payloadLength < 8) throw new Error('payloadLength must be at least 8.');\n\n const expiresAt = new Date(Date.now() + ttlSeconds * 1000);\n const expiryEpoch = Math.floor(expiresAt.getTime() / 1000);\n\n const expiryPart = encodeBase62(expiryEpoch, EXPIRY_CHARS);\n const payload = generateOne({\n length: payloadLength,\n charset: B62,\n });\n\n const token = expiryPart + payload;\n\n return {\n token,\n expiresAt,\n length: token.length,\n };\n}\n\n/**\n * Verify an expiring token. Returns whether it's valid and unexpired.\n *\n * @example\n * const result = verifyToken(token);\n * if (!result.valid) {\n * if (result.expired) throw new Error('Token expired');\n * throw new Error('Invalid token');\n * }\n */\nexport function verifyToken(token: string): TokenVerifyResult {\n if (typeof token !== 'string' || token.length < EXPIRY_CHARS + 8) {\n return { valid: false, parsed: false, expired: false, expiresAt: null, secondsRemaining: null };\n }\n\n const expiryStr = token.slice(0, EXPIRY_CHARS);\n const expiryEpoch = decodeBase62(expiryStr);\n\n if (expiryEpoch === -1) {\n return { valid: false, parsed: false, expired: false, expiresAt: null, secondsRemaining: null };\n }\n\n const expiresAt = new Date(expiryEpoch * 1000);\n const nowSeconds = Date.now() / 1000;\n const secondsRemaining = Math.round(expiryEpoch - nowSeconds);\n const expired = secondsRemaining <= 0;\n\n return {\n valid: !expired,\n parsed: true,\n expired,\n expiresAt,\n secondsRemaining,\n };\n}\n","/**\n * stream.ts\n * Async generator (iterator) API for memory-efficient bulk generation.\n *\n * Unlike the `count` option (which allocates a Set of N strings upfront),\n * the stream API yields strings one at a time — safe for generating\n * hundreds of thousands of IDs without blowing the heap.\n *\n * @example Basic usage\n * for await (const token of randomStringStream({ length: 24 })) {\n * await db.insert({ token });\n * }\n * // Runs forever — break when done\n *\n * @example Generate exactly N\n * import { take } from '@ppabari/strio';\n * const ids = await take(randomStringStream({ length: 12 }), 10_000);\n *\n * @example Unique-only stream\n * const stream = uniqueRandomStringStream({ length: 8, charset: 'base36' });\n * for await (const id of stream) { ... }\n */\n\nimport type { RandomStringOptions } from './types.js';\nimport { generateOne } from './generator.js';\n\n/**\n * Infinite async generator that yields random strings from the given options.\n * Each value is independently generated (not deduplicated).\n *\n * Use `take()` or a `break` statement to stop the stream.\n * For bulk operations, prefer `take(randomStringStream(opts), n)` over\n * the `count` option — it avoids allocating a full Set upfront.\n */\nexport async function* randomStringStream(\n options: RandomStringOptions = {}\n): AsyncGenerator<string, never, unknown> {\n // Pre-validate options by generating one eagerly — surfaces config errors\n // before the consumer enters the loop.\n generateOne(options);\n\n while (true) {\n yield generateOne(options);\n }\n}\n\n/**\n * Infinite async generator that yields globally unique strings.\n * Deduplication is maintained via an in-memory Set.\n *\n * ⚠️ Memory grows with consumption. For very large sets (>1M), consider\n * a probabilistic structure (Bloom filter) or external dedup store instead.\n */\nexport async function* uniqueRandomStringStream(\n options: RandomStringOptions = {}\n): AsyncGenerator<string, never, unknown> {\n const seen = new Set<string>();\n generateOne(options); // pre-validate\n\n while (true) {\n const candidate = generateOne(options);\n if (!seen.has(candidate)) {\n seen.add(candidate);\n yield candidate;\n }\n }\n}\n\n/**\n * Collect the first `n` values from any async iterable into an array.\n * Works with both `randomStringStream` and `uniqueRandomStringStream`.\n *\n * @example\n * const tokens = await take(randomStringStream({ length: 32 }), 500);\n * // → string[] of 500 tokens\n */\nexport async function take<T>(\n iterable: AsyncIterable<T>,\n n: number\n): Promise<T[]> {\n if (n <= 0) return [];\n if (!Number.isInteger(n)) throw new Error('n must be a positive integer.');\n\n const results: T[] = [];\n for await (const value of iterable) {\n results.push(value);\n if (results.length >= n) break;\n }\n return results;\n}\n\n/**\n * Like `take`, but filters values through a predicate.\n * Pulls from the stream until `n` values satisfy `predicate`.\n *\n * @example\n * // Get 10 tokens that start with a digit\n * const tokens = await takeWhere(\n * randomStringStream({ length: 12 }),\n * 10,\n * t => /^[0-9]/.test(t)\n * );\n */\nexport async function takeWhere<T>(\n iterable: AsyncIterable<T>,\n n: number,\n predicate: (value: T) => boolean\n): Promise<T[]> {\n if (n <= 0) return [];\n const results: T[] = [];\n for await (const value of iterable) {\n if (predicate(value)) {\n results.push(value);\n if (results.length >= n) break;\n }\n }\n return results;\n}\n","/**\n * passphrase.ts\n * Human-memorable passphrase generation using the EFF Large Wordlist.\n *\n * Each word is selected using cryptographically secure randomness.\n * A 4-word passphrase gives ~51 bits of entropy; 6 words gives ~77 bits.\n *\n * The built-in wordlist is a curated 1296-word subset (6^4 = 1296) of the\n * EFF Large Wordlist, suitable for 4-dice rolls. We use a 256-word subset\n * here for bundle efficiency — for maximum entropy use the `customWords` option\n * with the full EFF list.\n *\n * @example\n * generatePassphrase()\n * // → 'correct-horse-battery-staple'\n *\n * generatePassphrase({ words: 5, separator: ' ', capitalize: true })\n * // → 'Correct Horse Battery Staple Fence'\n */\n\nimport { getRandomChar } from './core.js';\n\n/**\n * 512-word curated subset — common, unambiguous English words.\n * Large enough for good entropy while keeping bundle size small.\n * Each word is 3–8 characters, avoiding technical jargon and offensive terms.\n */\nconst WORD_LIST: readonly string[] = [\n 'able','acid','aged','also','area','army','away','back','ball','band',\n 'bank','base','bath','bear','beat','been','bell','best','bird','bite',\n 'blow','blue','boat','body','bomb','bond','bone','book','bore','born',\n 'both','bowl','burn','busy','call','calm','camp','card','care','cart',\n 'case','cash','cast','cave','cell','chat','chip','city','clam','clap',\n 'clay','clip','club','clue','coal','coat','code','coil','cold','come',\n 'cook','cool','copy','core','cork','corn','cost','cozy','crab','crew',\n 'crop','crow','curb','cure','dark','dart','data','date','dawn','deal',\n 'dear','deck','deed','deep','deft','dent','desk','dial','dice','diet',\n 'dime','dine','dirt','dish','disk','dock','dome','door','dose','dove',\n 'down','draw','drew','drip','drop','drum','dual','dune','dusk','dust',\n 'each','earl','earn','ease','east','edge','else','emit','envy','epic',\n 'even','exam','exit','expo','face','fact','fail','fair','fall','fame',\n 'farm','fast','fate','fawn','fear','feat','feed','feel','feet','fell',\n 'felt','fern','fest','film','find','fine','fire','firm','fish','fist',\n 'flag','flat','flaw','flew','flip','flow','foam','fold','folk','fond',\n 'font','food','fool','foot','ford','fork','form','fort','foul','four',\n 'free','frog','from','fuel','full','fund','fuse','gain','gale','game',\n 'gang','gate','gave','gaze','gear','gift','give','glad','glow','glue',\n 'goal','goat','gold','golf','gone','good','grab','gray','grew','grid',\n 'grin','grip','grow','gulf','gust','half','hall','halt','hand','hang',\n 'hard','hare','harm','harp','hash','haul','hawk','head','heal','heap',\n 'heat','heel','held','helm','help','herb','herd','hero','hide','high',\n 'hike','hill','hint','hire','hold','hole','home','hood','hook','hope',\n 'horn','hose','host','hour','huge','hulk','hull','hunt','hymn','idea',\n 'idle','inch','into','iron','isle','item','jade','jail','jest','join',\n 'joke','jolt','jump','just','keen','keep','kick','kind','king','knee',\n 'knew','knot','know','lace','lame','lamp','land','lane','lark','lash',\n 'last','late','lawn','lead','leaf','lean','leap','left','lens','lift',\n 'like','limb','lime','link','lion','list','live','load','loan','lock',\n 'loft','long','look','loop','lore','lose','lost','loud','love','luck',\n 'lure','lush','made','mail','main','make','mall','mane','many','mark',\n 'mass','mast','math','maze','mead','meal','mean','meet','melt','memo',\n 'menu','mesh','mild','mile','mill','mime','mind','mine','mint','miss',\n 'mist','mode','mold','mole','mood','moon','more','most','move','much',\n 'mule','myth','nail','name','neck','need','nest','next','nine','node',\n 'noel','norm','nose','note','noun','oath','once','only','open','oven',\n 'over','pack','page','pain','pair','palm','park','part','pass','past',\n 'path','peak','peel','peer','pelt','pest','pine','pink','pipe','plan',\n 'play','plot','plow','plug','plus','poem','poet','pole','poll','pond',\n 'pool','poor','port','pose','post','pour','prey','prop','pull','pump',\n 'pure','push','race','rack','rain','ramp','rang','rank','rate','read',\n 'real','reap','reed','reef','reel','rely','rest','rice','rich','ride',\n 'rift','ring','rise','risk','road','roam','roar','role','roll','roof',\n 'room','root','rope','rose','rove','ruin','rule','rush','safe','sage',\n 'sail','sake','salt','same','sand','sane','sang','sank','save','seal',\n 'seam','seat','seed','seek','seem','seep','self','sell','send','sent',\n 'shed','shin','ship','shop','shot','show','shut','sick','side','sift',\n 'sign','silk','sill','sing','sink','site','size','skin','slab','slam',\n 'slap','slid','slim','slip','slot','slow','slug','snap','snow','soak',\n 'soar','sock','soft','soil','sole','some','song','soot','sort','soul',\n 'soup','sour','span','spar','spin','spot','spur','star','stay','stem',\n 'step','stir','stop','stub','such','suit','sung','sunk','sure','surf',\n 'swap','swim','tack','tale','tall','tame','tank','tape','task','team',\n 'tear','tell','tend','tent','term','test','text','than','that','them',\n 'then','they','thin','this','tide','tilt','time','tiny','tire','toad',\n 'toll','tone','took','tool','tops','tore','torn','toss','tour','town',\n 'tray','trim','trio','trip','true','tube','tuck','tuft','tune','turf',\n 'turn','tusk','twin','type','unit','upon','used','user','vast','veil',\n 'very','vest','view','vine','void','vote','wade','wage','wake','walk',\n 'wall','want','ward','warm','warp','wary','wash','wave','weak','weld',\n 'well','went','west','what','when','whip','whom','wide','wife','wild',\n 'will','wilt','wind','wing','wink','wire','wise','wish','with','wolf',\n 'wood','wore','worm','wove','wrap','wren','yard','yarn','yell','your',\n 'zinc','zone','zoom',\n];\n\nconst WORD_COUNT = WORD_LIST.length;\n\n/**\n * Select a uniformly random word index using rejection sampling.\n * Works correctly for any word list size without modulo bias.\n * Uses 40-bit sampling (5 bytes) to handle lists larger than 256 words.\n */\nfunction getRandomWordIndex(listLength: number): number {\n if (listLength <= 256) {\n // Single byte path — handles lists up to 256 words\n const maxValid = 256 - (256 % listLength);\n const buf = new Uint8Array(1);\n let b: number;\n do {\n crypto.getRandomValues(buf);\n b = buf[0]!;\n } while (b >= maxValid);\n return b % listLength;\n } else {\n // Multi-byte path — handles lists up to 2^40 words (more than enough)\n const RANGE40 = 1099511627776; // 2^40\n const maxValid = Math.floor(RANGE40 / listLength) * listLength;\n const buf = new Uint8Array(5);\n let n: number;\n do {\n crypto.getRandomValues(buf);\n n = buf[0]! * 4294967296 +\n (((buf[1]! << 24) | (buf[2]! << 16) | (buf[3]! << 8) | buf[4]!) >>> 0);\n } while (n >= maxValid);\n return n % listLength;\n }\n}\n\nexport interface PassphraseOptions {\n /**\n * Number of words in the passphrase.\n * More words = more entropy. 4 words ≈ 51 bits, 6 words ≈ 77 bits.\n * @default 4\n */\n words?: number;\n /**\n * Separator between words.\n * @default '-'\n */\n separator?: string;\n /**\n * Capitalize the first letter of each word.\n * @default false\n */\n capitalize?: boolean;\n /**\n * Append a random digit to the end for services that require numbers.\n * @default false\n */\n appendDigit?: boolean;\n /**\n * Use a custom word list instead of the built-in list.\n * Must contain at least 2 words.\n */\n customWords?: readonly string[];\n /**\n * Prefix the passphrase with a fixed string.\n */\n prefix?: string;\n}\n\nexport interface PassphraseResult {\n /** The generated passphrase string. */\n passphrase: string;\n /** Number of words used. */\n wordCount: number;\n /** Entropy estimate in bits. */\n entropyBits: number;\n}\n\n/**\n * Generate a human-memorable passphrase from random dictionary words.\n *\n * @example\n * generatePassphrase()\n * // → { passphrase: 'stone-river-proud-flame', wordCount: 4, entropyBits: 50.9 }\n *\n * generatePassphrase({ words: 5, separator: ' ', capitalize: true })\n * // → { passphrase: 'Stone River Proud Flame Beach', wordCount: 5, entropyBits: 63.7 }\n */\nexport function generatePassphrase(options: PassphraseOptions = {}): PassphraseResult {\n const {\n words = 4,\n separator = '-',\n capitalize = false,\n appendDigit = false,\n customWords,\n prefix,\n } = options;\n\n if (words < 2) throw new Error('words must be at least 2.');\n\n const wordList = customWords ?? WORD_LIST;\n\n if (wordList.length < 2) throw new Error('Word list must contain at least 2 words.');\n\n const selected: string[] = [];\n for (let i = 0; i < words; i++) {\n const idx = getRandomWordIndex(wordList.length);\n let word = wordList[idx]!;\n if (capitalize) word = word.charAt(0).toUpperCase() + word.slice(1);\n selected.push(word);\n }\n\n let passphrase = selected.join(separator);\n\n if (appendDigit) {\n const digit = getRandomChar('0123456789');\n passphrase += digit;\n }\n\n if (prefix) passphrase = prefix + passphrase;\n\n const entropyBits = Math.log2(Math.pow(wordList.length, words)) + (appendDigit ? Math.log2(10) : 0);\n\n return {\n passphrase,\n wordCount: words,\n entropyBits: Math.round(entropyBits * 10) / 10,\n };\n}\n\n/** Export the built-in word list for reference or customisation. */\nexport { WORD_LIST as BUILT_IN_WORD_LIST };\n","/**\n * entropy.ts\n * Estimate the Shannon entropy and strength of a random string configuration.\n */\n\nimport type { RandomStringOptions, EntropyResult } from './types.js';\nimport { buildCharset } from './charsets.js';\n\n/**\n * Estimates the entropy of strings generated by the given options.\n *\n * For pattern-based strings, each placeholder contributes independently.\n * For length-based strings, entropy = log2(charsetSize) * effectiveLength.\n *\n * @example\n * const e = estimateEntropy({ length: 32, uppercase: true, lowercase: true, numeric: true });\n * console.log(e.bits); // ~190\n * console.log(e.strength); // 'very-strong'\n */\nexport function estimateEntropy(options: RandomStringOptions = {}): EntropyResult {\n const {\n length = 16,\n prefix = '',\n suffix = '',\n pattern,\n count: _count,\n startWith: _startWith,\n ...charsetOptions\n } = options;\n\n if (pattern) {\n return estimatePatternEntropy(pattern, charsetOptions);\n }\n\n const charset = buildCharset(charsetOptions);\n const charsetSize = charset.length;\n\n const effectiveLength = Math.max(0, length - prefix.length - suffix.length);\n\n if (effectiveLength === 0) {\n return {\n bits: 0,\n strength: 'very-weak',\n charsetSize,\n effectiveLength: 0,\n combinations: '1',\n };\n }\n\n const bitsPerChar = Math.log2(charsetSize);\n const bits = bitsPerChar * effectiveLength;\n\n return {\n bits: Math.round(bits * 100) / 100,\n strength: strengthLabel(bits),\n charsetSize,\n effectiveLength,\n combinations: approximateCombinations(charsetSize, effectiveLength),\n };\n}\n\nfunction estimatePatternEntropy(\n pattern: string,\n charsetOptions: Omit<RandomStringOptions, 'pattern' | 'length' | 'prefix' | 'suffix' | 'count' | 'startWith'>\n): EntropyResult {\n const fullCharset = buildCharset(charsetOptions);\n const alphaChars = [...fullCharset].filter(c => /[a-zA-Z]/.test(c)).join('');\n const upperChars = [...fullCharset].filter(c => /[A-Z]/.test(c)).join('');\n const lowerChars = [...fullCharset].filter(c => /[a-z]/.test(c)).join('');\n const digitChars = '0123456789';\n const alphanumChars = [...fullCharset].filter(c => /[a-zA-Z0-9]/.test(c)).join('');\n\n let totalBits = 0;\n let effectiveLength = 0;\n let i = 0;\n\n while (i < pattern.length) {\n const ch = pattern[i] as string;\n\n if (ch === '\\\\' && i + 1 < pattern.length) {\n i += 2;\n continue;\n }\n\n let placeholderCharsetSize = 0;\n\n switch (ch) {\n case '#':\n placeholderCharsetSize = digitChars.length;\n effectiveLength++;\n break;\n case 'A':\n placeholderCharsetSize = Math.max(upperChars.length, 1);\n effectiveLength++;\n break;\n case 'a':\n placeholderCharsetSize = Math.max(lowerChars.length, 1);\n effectiveLength++;\n break;\n case '*':\n placeholderCharsetSize = fullCharset.length;\n effectiveLength++;\n break;\n case '?':\n placeholderCharsetSize = Math.max(alphanumChars.length, 1);\n effectiveLength++;\n break;\n default:\n // Literal character — contributes 0 entropy\n break;\n }\n\n if (placeholderCharsetSize > 0) {\n totalBits += Math.log2(placeholderCharsetSize);\n }\n\n i++;\n }\n\n const _ = alphaChars; // suppress unused warning\n\n return {\n bits: Math.round(totalBits * 100) / 100,\n strength: strengthLabel(totalBits),\n charsetSize: fullCharset.length,\n effectiveLength,\n combinations: approximateCombinations(fullCharset.length, effectiveLength),\n };\n}\n\nfunction strengthLabel(bits: number): EntropyResult['strength'] {\n if (bits < 28) return 'very-weak';\n if (bits < 50) return 'weak';\n if (bits < 72) return 'fair';\n if (bits < 100) return 'strong';\n return 'very-strong';\n}\n\n/**\n * Returns an approximate count of unique combinations as a string.\n * Uses scientific notation for very large numbers to avoid Infinity.\n */\nfunction approximateCombinations(charsetSize: number, length: number): string {\n // log10(charsetSize^length) = length * log10(charsetSize)\n const log10 = length * Math.log10(charsetSize);\n if (log10 > 15) {\n const exp = Math.floor(log10);\n const mantissa = Math.pow(10, log10 - exp);\n return `${mantissa.toFixed(2)}e+${exp}`;\n }\n return Math.round(Math.pow(charsetSize, length)).toString();\n}\n","/**\n * validate.ts\n * Validate that a string conforms to a given RandomStringOptions config.\n */\n\nimport type { ValidateOptions, ValidationResult } from './types.js';\n\nconst DIGIT_RE = /[0-9]/;\nconst LOWER_RE = /[a-z]/;\nconst UPPER_RE = /[A-Z]/;\nconst SYMBOL_RE = /[!@#$%^&*()_+\\[\\]{}<>?]/;\n\n/**\n * Checks whether `str` satisfies the given validation rules.\n *\n * @example\n * const result = validateRandomString('abc123', {\n * minLength: 6,\n * requireNumeric: true,\n * requireLowercase: true,\n * });\n * result.valid; // true\n *\n * @example\n * const result = validateRandomString('abc', { requireNumeric: true });\n * result.valid; // false\n * result.errors; // ['Must contain at least one numeric digit.']\n */\nexport function validateRandomString(\n str: string,\n options: ValidateOptions = {}\n): ValidationResult {\n const errors: string[] = [];\n const {\n minLength,\n maxLength,\n length,\n requireNumeric,\n requireLowercase,\n requireUppercase,\n requireSymbols,\n charset,\n pattern,\n } = options;\n\n if (length !== undefined && str.length !== length) {\n errors.push(`Length must be exactly ${length}, got ${str.length}.`);\n }\n\n if (minLength !== undefined && str.length < minLength) {\n errors.push(`Length must be at least ${minLength}, got ${str.length}.`);\n }\n\n if (maxLength !== undefined && str.length > maxLength) {\n errors.push(`Length must be at most ${maxLength}, got ${str.length}.`);\n }\n\n if (requireNumeric && !DIGIT_RE.test(str)) {\n errors.push('Must contain at least one numeric digit.');\n }\n\n if (requireLowercase && !LOWER_RE.test(str)) {\n errors.push('Must contain at least one lowercase letter.');\n }\n\n if (requireUppercase && !UPPER_RE.test(str)) {\n errors.push('Must contain at least one uppercase letter.');\n }\n\n if (requireSymbols && !SYMBOL_RE.test(str)) {\n errors.push('Must contain at least one symbol.');\n }\n\n if (charset !== undefined) {\n const charsetSet = new Set(charset);\n const invalidChars = [...new Set(str)].filter(ch => !charsetSet.has(ch));\n if (invalidChars.length > 0) {\n errors.push(\n `Contains characters not in the allowed charset: ${invalidChars.map(c => JSON.stringify(c)).join(', ')}.`\n );\n }\n }\n\n if (pattern !== undefined) {\n const patternErrors = validatePattern(str, pattern);\n errors.push(...patternErrors);\n }\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validatePattern(str: string, pattern: string): string[] {\n const errors: string[] = [];\n const expandedPattern: Array<{ type: 'literal' | 'placeholder'; value: string }> = [];\n\n let i = 0;\n while (i < pattern.length) {\n const ch = pattern[i] as string;\n if (ch === '\\\\' && i + 1 < pattern.length) {\n expandedPattern.push({ type: 'literal', value: pattern[i + 1] as string });\n i += 2;\n } else if (['#', 'A', 'a', '*', '?'].includes(ch)) {\n expandedPattern.push({ type: 'placeholder', value: ch });\n i++;\n } else {\n expandedPattern.push({ type: 'literal', value: ch });\n i++;\n }\n }\n\n if (str.length !== expandedPattern.length) {\n errors.push(\n `Pattern expects length ${expandedPattern.length}, got ${str.length}.`\n );\n return errors;\n }\n\n for (let pos = 0; pos < expandedPattern.length; pos++) {\n const token = expandedPattern[pos]!;\n const ch = str[pos] as string;\n\n if (token.type === 'literal') {\n if (ch !== token.value) {\n errors.push(\n `Position ${pos}: expected literal '${token.value}', got '${ch}'.`\n );\n }\n } else {\n switch (token.value) {\n case '#':\n if (!DIGIT_RE.test(ch)) {\n errors.push(`Position ${pos}: '#' expects a digit, got '${ch}'.`);\n }\n break;\n case 'A':\n if (!/[A-Z]/.test(ch)) {\n errors.push(`Position ${pos}: 'A' expects an uppercase letter, got '${ch}'.`);\n }\n break;\n case 'a':\n if (!LOWER_RE.test(ch)) {\n errors.push(`Position ${pos}: 'a' expects a lowercase letter, got '${ch}'.`);\n }\n break;\n case '?':\n if (!/[a-zA-Z0-9]/.test(ch)) {\n errors.push(`Position ${pos}: '?' expects an alphanumeric character, got '${ch}'.`);\n }\n break;\n case '*':\n // Any character is valid\n break;\n }\n }\n }\n\n return errors;\n}\n","/**\n * presets.ts\n * Ready-to-use named presets for common use cases.\n * Each preset is a plain `RandomStringOptions` object — pass it directly\n * to `generateRandomString` or spread it to customise.\n *\n * @example\n * import { generateRandomString, PRESETS } from 'secure-random-string';\n * const token = generateRandomString(PRESETS.TOKEN);\n * const longToken = generateRandomString({ ...PRESETS.TOKEN, length: 64 });\n */\n\nimport type { RandomStringOptions } from './types.js';\n\nexport const PRESETS = {\n /**\n * API token / session key.\n * 32-char alphanumeric (no symbols), readable=false for max entropy.\n * ~190 bits of entropy.\n */\n TOKEN: {\n length: 32,\n numeric: true,\n lowercase: true,\n uppercase: true,\n symbols: false,\n } satisfies RandomStringOptions,\n\n /**\n * Strong password.\n * 20 chars, all character types including symbols.\n * ~131 bits of entropy.\n */\n PASSWORD: {\n length: 20,\n numeric: true,\n lowercase: true,\n uppercase: true,\n symbols: true,\n } satisfies RandomStringOptions,\n\n /**\n * Human-readable token — no ambiguous characters (0/O/l/I/1).\n * Safe to read aloud or transcribe from a screen.\n * 16 chars, ~93 bits of entropy.\n */\n READABLE: {\n length: 16,\n numeric: true,\n lowercase: true,\n uppercase: true,\n symbols: false,\n readable: true,\n } satisfies RandomStringOptions,\n\n /**\n * URL-safe slug identifier.\n * Lowercase letters and digits only, starts with a letter.\n * 12 chars, ~62 bits of entropy.\n */\n SLUG: {\n length: 12,\n numeric: true,\n lowercase: true,\n uppercase: false,\n symbols: false,\n startWith: 'alphabet',\n } satisfies RandomStringOptions,\n\n /**\n * Lowercase hex string.\n * Compatible with UUID hex components, color codes, hash representations.\n * 32 chars (128-bit equivalent), ~128 bits of entropy.\n */\n HEX: {\n length: 32,\n charset: '0123456789abcdef',\n } satisfies RandomStringOptions,\n\n /**\n * Numeric PIN code. 6 digits, starts with a non-zero digit.\n * ~17 bits of entropy — suitable for short-lived OTP codes.\n */\n PIN: {\n length: 6,\n numeric: true,\n lowercase: false,\n uppercase: false,\n symbols: false,\n exclude: '0',\n startWith: 'numeric',\n } satisfies RandomStringOptions,\n\n /**\n * UUID-like string (not RFC 4122 compliant, but same visual format).\n * Uses `pattern` to produce 8-4-4-4-12 hex grouping.\n * ~122 bits of entropy (same as UUIDv4).\n */\n UUID_LIKE: {\n pattern: '\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*-\\\\*\\\\*\\\\*\\\\*-\\\\*\\\\*\\\\*\\\\*-\\\\*\\\\*\\\\*\\\\*-\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*',\n charset: '0123456789abcdef',\n } satisfies RandomStringOptions,\n\n /**\n * Short alphanumeric ID — suitable for database record IDs.\n * 8 chars, uppercase alphanumeric, starts with a letter.\n * ~41 bits — good for IDs when combined with a namespace/prefix.\n */\n SHORT_ID: {\n length: 8,\n numeric: true,\n lowercase: false,\n uppercase: true,\n symbols: false,\n startWith: 'alphabet',\n } satisfies RandomStringOptions,\n\n /**\n * Invitation / redemption code.\n * 16 chars, readable (no ambiguous chars), pattern grouped for readability.\n * @example 'KXPZ-9MR2-LQ4Y-8WVN'\n */\n INVITE_CODE: {\n pattern: 'AAAA-AAAA-AAAA-AAAA',\n readable: true,\n } satisfies RandomStringOptions,\n} as const;\n\nexport type PresetName = keyof typeof PRESETS;\n","/**\n * zod.ts\n * Zod schema factory for @ppabari/strio.\n *\n * Creates a `z.string()` schema that validates a string against strio\n * options. The Zod peer dependency is optional — import from the\n * subpath `@ppabari/strio/zod` only when Zod is available.\n *\n * @example\n * import { z } from 'zod';\n * import { randomStringSchema } from '@ppabari/strio/zod';\n *\n * const tokenSchema = randomStringSchema({\n * length: 32,\n * charset: 'base62',\n * });\n *\n * tokenSchema.parse('k3Xp9mQr2LzYw7NvTq8sHfGbJ5cD4eAK'); // ✓\n * tokenSchema.parse('short'); // throws ZodError\n *\n * // In a form schema\n * const UserSchema = z.object({\n * id: randomStringSchema({ length: 12, charset: 'base58' }),\n * apiKey: randomStringSchema({ length: 32 }),\n * });\n */\n\nimport type { ValidateOptions } from './types.js';\nimport { validateRandomString } from './validate.js';\n\n/**\n * Options for building a Zod schema. A superset of ValidateOptions\n * with an extra `description` for the schema's `.describe()` call.\n */\nexport interface RandomStringSchemaOptions extends ValidateOptions {\n /** Optional human-readable description added to the Zod schema. */\n description?: string;\n}\n\n/**\n * A minimal type shim for the parts of Zod we need.\n * Avoids importing Zod at the type level so the module loads even when\n * Zod is not installed — errors only at runtime if you try to call this.\n */\ninterface ZodStringLike {\n refine(\n check: (val: string) => boolean,\n params: { message: string }\n ): ZodStringLike;\n describe(text: string): ZodStringLike;\n}\n\ninterface ZodLike {\n string(): ZodStringLike;\n}\n\n/**\n * Create a Zod string schema that validates against strio's ValidateOptions.\n *\n * @param options - Validation rules (length, charset, required character types, etc.)\n * @param zod - The `z` object from zod. Pass explicitly to avoid a hard dependency.\n *\n * @example\n * import { z } from 'zod';\n * import { randomStringSchema } from '@ppabari/strio/zod';\n *\n * const schema = randomStringSchema({ length: 16, requireUppercase: true }, z);\n */\nexport function randomStringSchema(\n options: RandomStringSchemaOptions = {},\n zod?: ZodLike\n): ZodStringLike {\n // Attempt to auto-import Zod if not provided — works in Node/bundler envs\n // Falls back gracefully with a helpful error if unavailable\n let z: ZodLike;\n\n if (zod) {\n z = zod;\n } else {\n try {\n // Use indirect eval to avoid TypeScript's require type check.\n // This is intentional: zod is an optional peer dependency.\n const req = (typeof globalThis !== 'undefined' &&\n (globalThis as Record<string, unknown>)['require']) as\n | ((id: string) => ZodLike)\n | undefined;\n z = req ? req('zod') : (() => { throw new Error('no require'); })();\n } catch {\n throw new Error(\n '@ppabari/strio: Zod is not installed. Run `npm install zod` or pass the `z` ' +\n 'object explicitly: `randomStringSchema(options, z)`.'\n );\n }\n }\n\n const { description, ...validateOpts } = options;\n\n let schema = z.string().refine(\n (val: string) => {\n const result = validateRandomString(val, validateOpts);\n return result.valid;\n },\n {\n message: buildMessage(validateOpts),\n }\n );\n\n if (description) {\n schema = schema.describe(description);\n }\n\n return schema;\n}\n\nfunction buildMessage(opts: ValidateOptions): string {\n const parts: string[] = [];\n\n if (opts.length !== undefined) parts.push(`exactly ${opts.length} characters`);\n if (opts.minLength !== undefined) parts.push(`at least ${opts.minLength} characters`);\n if (opts.maxLength !== undefined) parts.push(`at most ${opts.maxLength} characters`);\n if (opts.requireNumeric) parts.push('at least one digit');\n if (opts.requireLowercase) parts.push('at least one lowercase letter');\n if (opts.requireUppercase) parts.push('at least one uppercase letter');\n if (opts.requireSymbols) parts.push('at least one symbol');\n if (opts.charset) parts.push(`only characters from '${opts.charset}'`);\n if (opts.pattern) parts.push(`matching pattern '${opts.pattern}'`);\n\n return parts.length > 0\n ? `String must contain ${parts.join(', ')}.`\n : 'Invalid string format.';\n}\n","/**\n * secrets.ts\n * Cryptographic secret and key generation utilities.\n *\n * Covers the full lifecycle of secrets used in real applications:\n * - Raw bytes → generateBytes()\n * - Hex keys (AES, ChaCha20) → generateHexKey()\n * - Base64 keys (cloud imports) → generateBase64Key()\n * - JWT secrets (HS256/384/512) → generateJwtSecret()\n * - Structured API keys → generateApiKey()\n * - Numeric OTP codes → generateOtp()\n * - Secret masking for logs → maskSecret()\n * - Constant-time comparison → timingSafeEqual()\n * - Framework secret helpers → generateCookieSecret() etc.\n *\n * All functions use crypto.getRandomValues() — the same bias-free\n * engine as the rest of strio.\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Fill a Uint8Array with cryptographically secure random bytes. */\nfunction randomBytes(length: number): Uint8Array {\n if (length <= 0 || !Number.isInteger(length)) {\n throw new RangeError(`length must be a positive integer, got ${length}.`);\n }\n const buf = new Uint8Array(length);\n crypto.getRandomValues(buf);\n return buf;\n}\n\n/** Encode a Uint8Array to a lowercase hex string. */\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/** Encode a Uint8Array to standard base64 (with +/= padding). */\nfunction bytesToBase64(bytes: Uint8Array): string {\n // btoa works on binary strings; works in Node 16+ and all browsers\n return btoa(String.fromCharCode(...bytes));\n}\n\n/** Encode a Uint8Array to base64url (RFC 4648 §5 — URL-safe, no padding). */\nfunction bytesToBase64Url(bytes: Uint8Array): string {\n return bytesToBase64(bytes)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 1. generateBytes\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate `n` cryptographically secure random bytes.\n * Returns a `Uint8Array` — the native format accepted by Web Crypto,\n * Node's `crypto`, and virtually every encryption library.\n *\n * @example\n * const key = generateBytes(32); // 32-byte (256-bit) key material\n * await crypto.subtle.importKey('raw', key, 'AES-GCM', false, ['encrypt']);\n *\n * const iv = generateBytes(12); // AES-GCM initialisation vector\n * const nonce = generateBytes(24); // XSalsa20 nonce\n */\nexport function generateBytes(length: number): Uint8Array {\n return randomBytes(length);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 2. generateHexKey\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate a random key of `bits` length, returned as a lowercase hex string.\n * The standard format for raw key material in most Node.js crypto libraries,\n * Redis ACL passwords, database encryption keys, and many cloud services.\n *\n * @param bits - Key size in bits. Must be a positive multiple of 8.\n * Common values: 128, 192, 256 (AES), 512 (HMAC-SHA512).\n *\n * @example\n * generateHexKey(256) // → 64-char hex (AES-256 key)\n * generateHexKey(128) // → 32-char hex (AES-128 key)\n * generateHexKey(512) // → 128-char hex (HMAC-SHA512 key)\n *\n * // Use directly with Node crypto:\n * const key = generateHexKey(256);\n * const cipher = crypto.createCipheriv('aes-256-gcm', Buffer.from(key, 'hex'), iv);\n */\nexport function generateHexKey(bits: number = 256): string {\n if (bits <= 0 || bits % 8 !== 0) {\n throw new RangeError(`bits must be a positive multiple of 8, got ${bits}.`);\n }\n return bytesToHex(randomBytes(bits / 8));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 3. generateBase64Key\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type Base64Variant = 'standard' | 'url-safe' | 'url-safe-no-pad';\n\n/**\n * Generate a random key of `bits` length, returned as a base64 string.\n *\n * Three variants:\n * - `'standard'` — includes `+`, `/`, `=` padding (AWS, most CLIs)\n * - `'url-safe'` — replaces `+`→`-`, `/`→`_`, keeps `=` (cookies, headers)\n * - `'url-safe-no-pad'` — same but no `=` padding (JWT, URL query params)\n *\n * @param bits - Key size in bits. Must be a positive multiple of 8.\n * @param variant - Output encoding variant. Default: `'url-safe-no-pad'`.\n *\n * @example\n * generateBase64Key(256) // → url-safe, no padding (default)\n * generateBase64Key(256, 'standard') // → standard base64 with padding\n * generateBase64Key(256, 'url-safe') // → url-safe with padding\n *\n * // AWS KMS / GCP import format:\n * const keyMaterial = generateBase64Key(256, 'standard');\n *\n * // Cookie signing secret (express-session, iron-session):\n * const secret = generateBase64Key(256, 'url-safe-no-pad');\n */\nexport function generateBase64Key(bits: number = 256, variant: Base64Variant = 'url-safe-no-pad'): string {\n if (bits <= 0 || bits % 8 !== 0) {\n throw new RangeError(`bits must be a positive multiple of 8, got ${bits}.`);\n }\n const bytes = randomBytes(bits / 8);\n\n switch (variant) {\n case 'standard':\n return bytesToBase64(bytes);\n case 'url-safe':\n return bytesToBase64(bytes).replace(/\\+/g, '-').replace(/\\//g, '_');\n case 'url-safe-no-pad':\n return bytesToBase64Url(bytes);\n default:\n throw new TypeError(`Unknown variant '${variant}'. Use 'standard', 'url-safe', or 'url-safe-no-pad'.`);\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 4. generateJwtSecret\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type JwtAlgorithm = 'HS256' | 'HS384' | 'HS512';\nexport type JwtSecretFormat = 'base64url' | 'hex' | 'utf8-like';\n\n/**\n * Minimum key sizes mandated by RFC 7518 §3.2:\n * The key must be at least as long as the hash output.\n */\nconst JWT_MIN_BITS: Record<JwtAlgorithm, number> = {\n HS256: 256,\n HS384: 384,\n HS512: 512,\n};\n\nexport interface JwtSecretOptions {\n /**\n * HMAC algorithm this secret will be used with.\n * Determines the minimum key length enforced automatically.\n * @default 'HS256'\n */\n algorithm?: JwtAlgorithm;\n /**\n * Output format.\n * - `'base64url'` — RFC 4648 §5, no padding. Default. Works with jsonwebtoken,\n * jose, @auth/core, NextAuth, Fastify JWT, Lucia.\n * - `'hex'` — lowercase hex. Works with jose when you import as `'oct'`.\n * - `'utf8-like'` — base62 string. Usable directly as a string secret in older\n * libraries that accept plain strings (not recommended for new code).\n * @default 'base64url'\n */\n format?: JwtSecretFormat;\n /**\n * Override the key size in bits. Must be ≥ the algorithm minimum.\n * Defaults to the algorithm's minimum (256 / 384 / 512).\n */\n bits?: number;\n}\n\nexport interface JwtSecretResult {\n /** The secret value — pass this to your JWT library. */\n secret: string;\n /** Algorithm this secret was generated for. */\n algorithm: JwtAlgorithm;\n /** Actual key size in bits. */\n bits: number;\n /** Output format. */\n format: JwtSecretFormat;\n /**\n * Usage example string for the most common library (jsonwebtoken).\n * Handy for logging/debugging during setup.\n */\n example: string;\n}\n\n/**\n * Generate a cryptographically secure JWT signing secret.\n *\n * Enforces RFC 7518 minimum key lengths:\n * - HS256 → minimum 256 bits (32 bytes)\n * - HS384 → minimum 384 bits (48 bytes)\n * - HS512 → minimum 512 bits (64 bytes)\n *\n * @example\n * // Default — HS256, base64url\n * const { secret } = generateJwtSecret();\n * jwt.sign(payload, secret, { algorithm: 'HS256' });\n *\n * // HS512 for maximum security\n * const { secret } = generateJwtSecret({ algorithm: 'HS512' });\n *\n * // For jose / @auth/core\n * const { secret } = generateJwtSecret({ algorithm: 'HS256', format: 'base64url' });\n * // Set as AUTH_SECRET env var for NextAuth v5\n *\n * // For libraries expecting hex\n * const { secret } = generateJwtSecret({ format: 'hex' });\n */\nexport function generateJwtSecret(options: JwtSecretOptions = {}): JwtSecretResult {\n const {\n algorithm = 'HS256',\n format = 'base64url',\n bits: bitsOverride,\n } = options;\n\n const minBits = JWT_MIN_BITS[algorithm];\n\n if (!minBits) {\n throw new TypeError(\n `Unknown algorithm '${algorithm}'. Supported: ${Object.keys(JWT_MIN_BITS).join(', ')}.`\n );\n }\n\n if (bitsOverride !== undefined && bitsOverride < minBits) {\n throw new RangeError(\n `${algorithm} requires at least ${minBits} bits. Got ${bitsOverride}. ` +\n `Use bits >= ${minBits} or omit the bits option.`\n );\n }\n\n const bits = bitsOverride ?? minBits;\n\n if (bits % 8 !== 0) {\n throw new RangeError(`bits must be a multiple of 8, got ${bits}.`);\n }\n\n const bytes = randomBytes(bits / 8);\n let secret: string;\n\n switch (format) {\n case 'base64url':\n secret = bytesToBase64Url(bytes);\n break;\n case 'hex':\n secret = bytesToHex(bytes);\n break;\n case 'utf8-like': {\n // Produce a base62 string of equivalent length — readable but high entropy\n const B62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n // Re-draw using crypto (simpler than reusing bytes with bias correction here)\n const charsNeeded = Math.ceil(bits / Math.log2(62));\n const resultChars: string[] = [];\n const maxValid = 256 - (256 % 62);\n const drawBuf = new Uint8Array(charsNeeded * 2); // over-allocate\n crypto.getRandomValues(drawBuf);\n for (const b of drawBuf) {\n if (b < maxValid) {\n resultChars.push(B62[b % 62]!);\n if (resultChars.length >= charsNeeded) break;\n }\n }\n secret = resultChars.join('');\n break;\n }\n default:\n throw new TypeError(`Unknown format '${format}'.`);\n }\n\n const example = format === 'base64url'\n ? `jwt.sign(payload, '${secret.slice(0, 8)}...', { algorithm: '${algorithm}' })`\n : `jwt.sign(payload, Buffer.from('${secret.slice(0, 8)}...', '${format === 'hex' ? 'hex' : 'utf8'}'), { algorithm: '${algorithm}' })`;\n\n return { secret, algorithm, bits, format, example };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 5. generateApiKey\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ApiKeyOptions {\n /**\n * Key type prefix, e.g. `'sk'` (secret key), `'pk'` (public key), `'tok'`.\n * @default 'sk'\n */\n type?: string;\n /**\n * Environment prefix, e.g. `'live'`, `'test'`, `'dev'`.\n * Omit to produce a key with no environment segment.\n */\n environment?: 'live' | 'test' | 'dev' | string;\n /**\n * Entropy of the random portion in bits.\n * @default 256\n */\n bits?: number;\n /**\n * Charset for the random portion.\n * @default 'base62'\n */\n charset?: 'base62' | 'base58' | 'hex' | string;\n /**\n * Separator between segments.\n * @default '_'\n */\n separator?: string;\n}\n\nexport interface ApiKeyResult {\n /** The full API key string. */\n key: string;\n /** The prefix segment, e.g. `'sk_live'`. */\n prefix: string;\n /** Character count of the random portion (not including prefix or separator). */\n randomLength: number;\n /** Entropy of the random portion in bits. */\n bits: number;\n}\n\n/**\n * Generate a structured API key in the style of Stripe, GitHub, or OpenAI.\n *\n * Format: `{type}_{environment}_{randomPortion}`\n * e.g. `strio_live_K3xP9mQr2LzYw7NvTq8sHfGbJ5cD4eAK3xP9mQr2LzY`\n *\n * @example\n * generateApiKey()\n * // → { key: 'strio_live_K3xP9mQr2LzYw7Nv...', prefix: 'sk_live', ... }\n *\n * generateApiKey({ type: 'sk', environment: 'test', bits: 256 })\n * // → 'strio_test_K3xP9mQr...'\n *\n * generateApiKey({ type: 'tok', bits: 128 })\n * // → 'tok_K3xP9mQr2LzYw7Nv'\n *\n * generateApiKey({ type: 'pk', environment: 'live', charset: 'hex' })\n * // → 'pub_live_a3f7c2b9...'\n */\nexport function generateApiKey(options: ApiKeyOptions = {}): ApiKeyResult {\n const {\n type = 'sk',\n environment,\n bits = 256,\n charset = 'base62',\n separator = '_',\n } = options;\n\n if (bits <= 0 || bits % 8 !== 0) {\n throw new RangeError(`bits must be a positive multiple of 8, got ${bits}.`);\n }\n\n // Resolve charset\n const CHARSETS: Record<string, string> = {\n base62: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n base58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',\n hex: '0123456789abcdef',\n };\n const cs = CHARSETS[charset] ?? charset;\n\n if (cs.length < 2) throw new TypeError(`charset '${charset}' resolves to fewer than 2 unique characters.`);\n\n // Calculate how many characters we need for the requested entropy\n const charsNeeded = Math.ceil(bits / Math.log2(cs.length));\n const maxValid = 256 - (256 % cs.length);\n\n // Draw characters with rejection sampling\n const randomChars: string[] = [];\n const buf = new Uint8Array(charsNeeded * 2 + 64); // generous over-allocation\n while (randomChars.length < charsNeeded) {\n crypto.getRandomValues(buf);\n for (const b of buf) {\n if (b < maxValid) {\n randomChars.push(cs[b % cs.length]!);\n if (randomChars.length >= charsNeeded) break;\n }\n }\n }\n const randomPortion = randomChars.join('');\n\n const prefixParts = [type, environment].filter(Boolean);\n const prefix = prefixParts.join(separator);\n const key = prefix + separator + randomPortion;\n\n return { key, prefix, randomLength: charsNeeded, bits };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 6. generateOtp\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface OtpOptions {\n /**\n * Number of digits in the OTP.\n * @default 6\n */\n digits?: number;\n /**\n * Whether to allow a leading zero.\n * Set to `false` to ensure the first digit is 1–9 (e.g. for display in SMS).\n * @default true\n */\n allowLeadingZero?: boolean;\n}\n\nexport interface OtpResult {\n /** The OTP as a zero-padded string (e.g. `'048392'`). */\n code: string;\n /** The OTP as a number (e.g. `48392`). */\n value: number;\n /** Number of digits. */\n digits: number;\n}\n\n/**\n * Generate a cryptographically secure numeric OTP (one-time password).\n * Uses modular arithmetic on a secure random integer — no modulo bias\n * for digit counts up to 9 (10^9 < 2^30 < 2^32, safe in float64).\n *\n * @example\n * generateOtp() // → { code: '483920', value: 483920, digits: 6 }\n * generateOtp({ digits: 8 }) // → { code: '04839201', value: 4839201, digits: 8 }\n *\n * // SMS-friendly (no leading zero)\n * generateOtp({ allowLeadingZero: false })\n *\n * // Use just the code string\n * const { code } = generateOtp();\n * await sms.send(phone, `Your code is ${code}`);\n */\nexport function generateOtp(options: OtpOptions = {}): OtpResult {\n const { digits = 6, allowLeadingZero = true } = options;\n\n if (digits < 1 || digits > 10) {\n throw new RangeError(`digits must be between 1 and 10, got ${digits}.`);\n }\n\n const max = Math.pow(10, digits);\n\n // Use float64 division to avoid 32-bit overflow.\n // digits <= 9: max <= 10^9 < 2^32 — single 32-bit sample is sufficient.\n // digits == 10: max = 10^10 > 2^32 — use 5 bytes (40 bits, 2^40 > 10^10).\n let n: number;\n\n if (digits <= 9) {\n const maxValid = Math.floor(4294967296 / max) * max; // float64, no overflow\n const buf = new Uint8Array(4);\n do {\n crypto.getRandomValues(buf);\n n = ((buf[0]! << 24) | (buf[1]! << 16) | (buf[2]! << 8) | buf[3]!) >>> 0;\n } while (n >= maxValid);\n } else {\n // digits === 10: 2^40 = 1_099_511_627_776 > 10_000_000_000\n const RANGE40 = 1099511627776;\n const maxValid40 = Math.floor(RANGE40 / max) * max;\n const buf = new Uint8Array(5);\n do {\n crypto.getRandomValues(buf);\n n = buf[0]! * 4294967296 +\n (((buf[1]! << 24) | (buf[2]! << 16) | (buf[3]! << 8) | buf[4]!) >>> 0);\n } while (n >= maxValid40);\n }\n\n let value = n % max;\n\n // If leading zeros are not allowed, re-draw until first digit is non-zero.\n // Much simpler and provably unbiased — rejection probability ≤ 1/10 per draw.\n if (!allowLeadingZero && digits > 1) {\n const minValue = Math.pow(10, digits - 1); // e.g. 100000 for 6 digits\n // Re-use the same sampling path to draw a fresh value in [minValue, max)\n if (value < minValue) {\n const range = max - minValue; // e.g. 900000 for 6 digits\n if (digits <= 9) {\n const maxValid = Math.floor(4294967296 / range) * range;\n const buf2 = new Uint8Array(4);\n let m: number;\n do {\n crypto.getRandomValues(buf2);\n m = ((buf2[0]! << 24) | (buf2[1]! << 16) | (buf2[2]! << 8) | buf2[3]!) >>> 0;\n } while (m >= maxValid);\n value = minValue + (m % range);\n } else {\n const RANGE40 = 1099511627776;\n const maxValid40 = Math.floor(RANGE40 / range) * range;\n const buf2 = new Uint8Array(5);\n let m: number;\n do {\n crypto.getRandomValues(buf2);\n m = buf2[0]! * 4294967296 +\n (((buf2[1]! << 24) | (buf2[2]! << 16) | (buf2[3]! << 8) | buf2[4]!) >>> 0);\n } while (m >= maxValid40);\n value = minValue + (m % range);\n }\n }\n }\n\n const code = value.toString().padStart(digits, '0');\n\n return { code, value, digits };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 7. maskSecret\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface MaskSecretOptions {\n /**\n * Number of characters to reveal at the start of the secret.\n * `0` reveals nothing (prefix only).\n * @default 0 (show prefix only, mask everything else)\n */\n visibleStart?: number;\n /**\n * Number of characters to reveal at the end.\n * @default 4\n */\n visibleEnd?: number;\n /**\n * Character used to mask the hidden portion.\n * @default '*'\n */\n maskChar?: string;\n /**\n * Minimum number of mask characters shown, regardless of secret length.\n * Prevents inferring length from short secrets.\n * @default 4\n */\n minMaskLength?: number;\n /**\n * Maximum mask characters shown (caps a very long mask).\n * @default 8\n */\n maxMaskLength?: number;\n /**\n * Known prefix segments to preserve literally before masking begins.\n * e.g. `['strio_live_', 'strio_test_']` — the prefix is kept, the rest is masked.\n * If the secret starts with one of these, the prefix is shown and\n * `visibleStart` is counted from after the prefix.\n */\n knownPrefixes?: string[];\n}\n\n/**\n * Mask a secret string for safe logging, display, or debugging.\n * Preserves enough context to identify the key without exposing it.\n *\n * @example\n * maskSecret('myapp_live_K3xP9mQr2LzYw7NvTq8sHfGb')\n * // → 'strio_live_****...w7Nv' (auto-detects 'strio_live_' prefix)\n *\n * maskSecret('supersecretpassword')\n * // → '****...word'\n *\n * maskSecret('eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIn0.abc123')\n * // → '****...123'\n *\n * // Custom reveal\n * maskSecret('myapp_live_K3xP9mQr2LzY', { visibleEnd: 6 })\n * // → 'strio_live_****...LzY'\n */\nexport function maskSecret(secret: string, options: MaskSecretOptions = {}): string {\n if (!secret) return '';\n\n const {\n visibleStart = 0,\n visibleEnd = 4,\n maskChar = '*',\n minMaskLength = 4,\n maxMaskLength = 8,\n knownPrefixes = [\n 'strio_live_', 'strio_test_', 'strio_dev_',\n 'myapp_live_', 'myapp_test_', 'myapp_dev_',\n 'tok_', 'api_', 'key_',\n ],\n } = options;\n\n let prefix = '';\n let payload = secret;\n\n // Check for known prefixes\n for (const kp of knownPrefixes) {\n if (secret.startsWith(kp)) {\n prefix = kp;\n payload = secret.slice(kp.length);\n break;\n }\n }\n\n const totalLen = payload.length;\n const showStart = Math.min(visibleStart, totalLen);\n const showEnd = Math.min(visibleEnd, totalLen - showStart);\n const hiddenLen = totalLen - showStart - showEnd;\n\n if (hiddenLen <= 0) {\n // Secret too short to meaningfully mask — show prefix + full mask\n return prefix + maskChar.repeat(minMaskLength);\n }\n\n const maskLen = Math.max(minMaskLength, Math.min(maxMaskLength, hiddenLen));\n const mask = maskChar.repeat(maskLen);\n\n const startPart = showStart > 0 ? payload.slice(0, showStart) : '';\n const endPart = showEnd > 0 ? payload.slice(totalLen - showEnd) : '';\n\n return `${prefix}${startPart}${mask}...${endPart}`;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 8. timingSafeEqual\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Compare two strings or byte arrays in constant time.\n * Prevents timing attacks where an attacker infers secret content by\n * measuring how long a comparison takes.\n *\n * **Always use this instead of `===` when comparing tokens, secrets,\n * HMAC signatures, or any security-sensitive value.**\n *\n * The comparison time is proportional to `max(a.length, b.length)` —\n * it does not short-circuit on mismatch.\n *\n * @returns `true` if the values are identical, `false` otherwise.\n *\n * @example\n * // Comparing incoming token against stored token\n * if (!timingSafeEqual(incomingToken, storedToken)) {\n * throw new Error('Invalid token');\n * }\n *\n * // Also works with Uint8Array (e.g. HMAC comparison)\n * const valid = timingSafeEqual(computedHmac, expectedHmac);\n */\nexport function timingSafeEqual(\n a: string | Uint8Array,\n b: string | Uint8Array\n): boolean {\n // Normalise to Uint8Array using UTF-8 encoding for strings\n const encoder = new TextEncoder();\n const bufA: Uint8Array = typeof a === 'string' ? encoder.encode(a) : a;\n const bufB: Uint8Array = typeof b === 'string' ? encoder.encode(b) : b;\n\n const len = Math.max(bufA.length, bufB.length);\n\n // Pad both to equal length to prevent length-based timing leaks\n const padA = new Uint8Array(len);\n const padB = new Uint8Array(len);\n padA.set(bufA);\n padB.set(bufB);\n\n // XOR every byte — accumulate differences with OR\n let diff = bufA.length === bufB.length ? 0 : 1; // length mismatch = fail\n for (let i = 0; i < len; i++) {\n diff |= (padA[i]! ^ padB[i]!);\n }\n\n return diff === 0;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 9. Framework-specific convenience helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate a cookie signing secret for session libraries.\n *\n * Compatible with:\n * - express-session (`secret` option)\n * - iron-session (`password` option)\n * - lucia (`sessionCookieOptions.password`)\n * - cookie-signature\n *\n * Returns a 256-bit base64url string by default — long enough to resist\n * brute force while remaining pasteable in .env files.\n *\n * @example\n * // express-session\n * app.use(session({ secret: generateCookieSecret() }));\n *\n * // iron-session\n * const sessionOptions = { password: generateCookieSecret(), cookieName: 'session' };\n *\n * // .env usage\n * console.log(`COOKIE_SECRET=\"${generateCookieSecret()}\"`);\n */\nexport function generateCookieSecret(bits: number = 256): string {\n if (bits < 128) throw new RangeError('Cookie secret should be at least 128 bits.');\n return generateBase64Key(bits, 'url-safe-no-pad');\n}\n\n/**\n * Generate an encryption key suitable for AES-GCM or AES-CBC.\n *\n * @param keySize - `128`, `192`, or `256` bits. Default: 256.\n * @param format - `'hex'` (default) or `'base64'` or `'bytes'`.\n *\n * @example\n * generateAesKey() // → 64-char hex (AES-256)\n * generateAesKey(128) // → 32-char hex (AES-128)\n * generateAesKey(256, 'base64') // → base64url string\n * generateAesKey(256, 'bytes') // → Uint8Array\n */\nexport function generateAesKey(keySize: 128 | 192 | 256 = 256, format: 'hex' | 'base64' | 'bytes' = 'hex'): string | Uint8Array {\n const bytes = randomBytes(keySize / 8);\n if (format === 'bytes') return bytes;\n if (format === 'hex') return bytesToHex(bytes);\n return bytesToBase64Url(bytes);\n}\n\n/**\n * Generate a secret for Next.js / NextAuth / Auth.js.\n * Sets AUTH_SECRET in your .env file — used to sign JWTs and cookies.\n * Output matches what `npx auth secret` generates.\n *\n * @example\n * const secret = generateNextAuthSecret();\n * console.log(`AUTH_SECRET=\"${secret}\"`);\n */\nexport function generateNextAuthSecret(): string {\n return generateBase64Key(256, 'url-safe-no-pad');\n}\n\n/**\n * Generate a Django SECRET_KEY compatible string.\n * Django expects a long random string of printable ASCII characters —\n * at least 50 characters, no restrictions beyond that.\n *\n * @example\n * const key = generateDjangoSecretKey();\n * console.log(`SECRET_KEY=\"${key}\"`);\n */\nexport function generateDjangoSecretKey(): string {\n // Django uses a broad ASCII charset in its own generator\n const DJANGO_CHARS =\n 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n const length = 64; // matches Django's default\n const maxValid = 256 - (256 % DJANGO_CHARS.length);\n const chars: string[] = [];\n const buf = new Uint8Array(length * 2);\n while (chars.length < length) {\n crypto.getRandomValues(buf);\n for (const b of buf) {\n if (b < maxValid) {\n chars.push(DJANGO_CHARS[b % DJANGO_CHARS.length]!);\n if (chars.length >= length) break;\n }\n }\n }\n return chars.join('');\n}\n\n/**\n * Generate a Rails / rack secret_key_base compatible string.\n * Rails expects a 128+ character hex string for its key base.\n *\n * @example\n * const key = generateRailsSecretKeyBase();\n * console.log(`SECRET_KEY_BASE=\"${key}\"`);\n */\nexport function generateRailsSecretKeyBase(): string {\n return generateHexKey(512); // 128-char hex = 512-bit key\n}\n","/**\n * @ppabari/strio\n *\n * Cryptographically secure string generation for Node.js and browsers.\n * Zero dependencies. Fully typed. Bias-free.\n */\n\nimport type { RandomStringOptions } from './types.js';\nimport { generateOne, generateBatch } from './generator.js';\n\nexport function generateRandomString(options?: RandomStringOptions & { count?: 1 }): string;\nexport function generateRandomString(options: RandomStringOptions & { count: number }): string[];\nexport function generateRandomString(options: RandomStringOptions = {}): string | string[] {\n const { count = 1, ...rest } = options;\n if (count === 1) return generateOne(rest);\n return generateBatch(rest, count);\n}\n\nexport async function generateRandomStringAsync(\n options: RandomStringOptions = {}\n): Promise<string | string[]> {\n await Promise.resolve();\n const { count = 1, ...rest } = options;\n if (count === 1) return generateOne(rest);\n return generateBatch(rest, count);\n}\n\nexport {\n generateId,\n validateId,\n type ShortIdOptions,\n type ShortIdValidateOptions,\n type ShortIdValidateResult,\n} from './short-id.js';\n\nexport {\n generateExpiringToken,\n verifyToken,\n type ExpiringTokenOptions,\n type ExpiringTokenResult,\n type TokenVerifyResult,\n} from './expiring-token.js';\n\nexport {\n randomStringStream,\n uniqueRandomStringStream,\n take,\n takeWhere,\n} from './stream.js';\n\nexport {\n generatePassphrase,\n BUILT_IN_WORD_LIST,\n type PassphraseOptions,\n type PassphraseResult,\n} from './passphrase.js';\n\nexport { estimateEntropy } from './entropy.js';\nexport { validateRandomString } from './validate.js';\n\nexport {\n CHARSET_ALIASES,\n resolveCharsetAlias,\n type CharsetAlias,\n} from './charset-aliases.js';\n\nexport { PRESETS, type PresetName } from './presets.js';\n\nexport {\n randomStringSchema,\n type RandomStringSchemaOptions,\n} from './zod.js';\n\nexport type {\n RandomStringOptions,\n RandomStringResult,\n StartWith,\n ValidateOptions,\n ValidationResult,\n EntropyResult,\n} from './types.js';\n// ---------------------------------------------------------------------------\n// Secrets & key generation\n// ---------------------------------------------------------------------------\nexport {\n generateBytes,\n generateHexKey,\n generateBase64Key,\n generateJwtSecret,\n generateApiKey,\n generateOtp,\n maskSecret,\n timingSafeEqual,\n generateCookieSecret,\n generateAesKey,\n generateNextAuthSecret,\n generateDjangoSecretKey,\n generateRailsSecretKeyBase,\n type Base64Variant,\n type JwtAlgorithm,\n type JwtSecretFormat,\n type JwtSecretOptions,\n type JwtSecretResult,\n type ApiKeyOptions,\n type ApiKeyResult,\n type OtpOptions,\n type OtpResult,\n type MaskSecretOptions,\n} from './secrets.js';\n"]}
1
+ {"version":3,"sources":["../src/core.ts","../src/seeded.ts","../src/charset-aliases.ts","../src/charsets.ts","../src/generator.ts","../src/short-id.ts","../src/expiring-token.ts","../src/stream.ts","../src/passphrase.ts","../src/entropy.ts","../src/validate.ts","../src/compat.ts","../src/presets.ts","../src/zod.ts","../src/secrets.ts","../src/index.ts"],"names":["seededStr","randomLength","B62","CHARSETS"],"mappings":"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A,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAC/D,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EAAO,MAAA;AAAA,EA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","file":"index.js","sourcesContent":["/**\n * core.ts\n * Cryptographically secure, bias-free random byte generation.\n * Works in Node.js (>=18), browsers, Deno, and edge runtimes.\n */\n\n/**\n * Returns a single cryptographically secure random byte (0–255).\n * Uses the Web Crypto API universally — available natively in\n * Node >=18, all modern browsers, Deno, Cloudflare Workers, etc.\n */\nfunction getRandomByte(): number {\n const buf = new Uint8Array(1);\n crypto.getRandomValues(buf);\n return buf[0] as number;\n}\n\n/**\n * Returns a random character from `charset` with no modulo bias.\n *\n * Naive approach: index = randomByte % charset.length\n * Problem: If 256 is not evenly divisible by charset.length,\n * some characters appear slightly more often.\n *\n * Fix (rejection sampling):\n * Compute the largest multiple of charset.length that fits in 0–255.\n * Discard bytes >= that threshold and retry.\n * Expected retries: < 1 per character for any charset <= 128 chars.\n */\nexport function getRandomChar(charset: string): string {\n const len = charset.length;\n // Largest multiple of `len` that fits in a byte (0–255 range)\n const maxValid = 256 - (256 % len);\n\n let byte: number;\n do {\n byte = getRandomByte();\n } while (byte >= maxValid);\n\n return charset[byte % len] as string;\n}\n\n/**\n * Fills an array of `count` random characters from `charset`.\n * Batches the crypto call for efficiency.\n */\nexport function getRandomChars(charset: string, count: number): string[] {\n const len = charset.length;\n const maxValid = 256 - (256 % len);\n const result: string[] = [];\n\n // Over-allocate to avoid multiple round trips; 40% buffer is generous\n // for any realistic charset size.\n const bufSize = Math.ceil(count * 1.4) + 32;\n const buf = new Uint8Array(bufSize);\n\n while (result.length < count) {\n crypto.getRandomValues(buf);\n for (let i = 0; i < buf.length && result.length < count; i++) {\n const byte = buf[i] as number;\n if (byte < maxValid) {\n result.push(charset[byte % len] as string);\n }\n }\n // Extremely unlikely to need a second pass, but handles edge cases\n // like a 1-char charset (which is blocked by validation anyway)\n }\n\n return result;\n}\n","/**\n * seeded.ts\n * Deterministic pseudo-random string generation using xoshiro128**.\n *\n * ⚠️ NOT CRYPTOGRAPHICALLY SECURE. Seeded mode is for:\n * - Reproducible test fixtures\n * - Snapshot testing\n * - Demos and consistent example output\n *\n * Never use a seeded string as a security token, password, or secret.\n *\n * Implementation notes:\n * - Uses xoshiro128** — four 32-bit words, easy to implement correctly in JS\n * - Rejection sampling uses floating-point division (avoids uint64 overflow)\n * - maxValid = floor(2^32 / len) * len, computed in float64 (exact up to 2^53)\n */\n\n/** Four 32-bit state words for xoshiro128**. */\ntype State = [number, number, number, number];\n\nfunction rotl32(x: number, k: number): number {\n return ((x << k) | (x >>> (32 - k))) >>> 0;\n}\n\n/**\n * Hash a seed string into 4 × 32-bit state words using a simple\n * multiplicative hash with good avalanche (splitmix-style).\n */\nfunction seedState(seed: string): State {\n // Two starting hash lanes from the seed string\n let a = 0x9e3779b9 >>> 0;\n let b = 0x6c62272e >>> 0;\n for (let i = 0; i < seed.length; i++) {\n const ch = seed.charCodeAt(i);\n a = (Math.imul(a ^ ch, 0x9e3779b9) + 0x52c09e4d) >>> 0;\n b = (Math.imul(b ^ ch, 0x85ebca6b) + 0xc2b2ae35) >>> 0;\n }\n\n // Expand into 4 words with splitmix32-style finalisation\n function sm32(v: number): number {\n v = (Math.imul(v ^ (v >>> 16), 0x45d9f3b) + 0x1b873593) >>> 0;\n v = (Math.imul(v ^ (v >>> 16), 0x45d9f3b) + 0xe6546b64) >>> 0;\n return (v ^ (v >>> 16)) >>> 0;\n }\n\n return [\n sm32(a),\n sm32(b),\n sm32(a ^ 0xdeadbeef),\n sm32(b ^ 0xbaadf00d),\n ];\n}\n\n/**\n * Advance xoshiro128** and return a uint32 in [0, 2^32).\n */\nfunction nextUint32(s: State): number {\n const result = Math.imul(rotl32(Math.imul(s[1]!, 5) >>> 0, 7), 9) >>> 0;\n const t = (s[1]! << 9) >>> 0;\n\n s[2] = (s[2]! ^ s[0]!) >>> 0;\n s[3] = (s[3]! ^ s[1]!) >>> 0;\n s[1] = (s[1]! ^ s[2]!) >>> 0;\n s[0] = (s[0]! ^ s[3]!) >>> 0;\n s[2] = (s[2]! ^ t) >>> 0;\n s[3] = rotl32(s[3]!, 11);\n\n return result;\n}\n\n/**\n * Return a random character from `charset` using rejection sampling.\n *\n * maxValid is computed as: floor(2^32 / len) * len\n * All arithmetic stays in float64 (safe up to 2^53), so no overflow\n * regardless of charset length.\n */\nfunction seededChar(charset: string, state: State): string {\n const len = charset.length;\n // Use float64 to avoid 32-bit overflow: floor(4294967296 / len) * len\n const maxValid = Math.floor(4294967296 / len) * len;\n let n: number;\n do {\n n = nextUint32(state);\n } while (n >= maxValid);\n return charset[n % len]!;\n}\n\nexport interface SeededGeneratorOptions {\n /** Deterministic seed — same seed + charset + length → same output always. */\n seed: string;\n /** Character pool to draw from. */\n charset: string;\n /** Number of characters to generate. */\n length: number;\n}\n\n/**\n * Generate a deterministic string from a seed.\n *\n * @example\n * generateSeeded({ seed: 'test-42', charset: 'abc123', length: 8 })\n * // Always returns the exact same string for these inputs\n *\n * @example Use in tests\n * const id = generateSeeded({ seed: 'fixture', charset: base62, length: 16 });\n * expect(id).toMatchInlineSnapshot('\"3Xp9mQr2LzYw7NvT\"');\n */\nexport function generateSeeded({ seed, charset, length }: SeededGeneratorOptions): string {\n const state = seedState(seed);\n const chars: string[] = [];\n for (let i = 0; i < length; i++) {\n chars.push(seededChar(charset, state));\n }\n return chars.join('');\n}\n","/**\n * charset-aliases.ts\n * Named character set aliases for common encoding schemes.\n * Pass any alias name as the `charset` option in generateRandomString.\n *\n * @example\n * import { generateRandomString, CHARSET_ALIASES } from '@ppabari/strio';\n * generateRandomString({ charset: CHARSET_ALIASES.base58, length: 22 });\n * // or via string shorthand:\n * generateRandomString({ charset: 'base58', length: 22 });\n */\n\nexport const CHARSET_ALIASES: Record<string, string> = {\n /**\n * Base16 — hex digits, lowercase.\n * Use for: hash representations, color codes, compact binary encoding.\n */\n base16: '0123456789abcdef',\n\n /** Base16 uppercase variant */\n base16upper: '0123456789ABCDEF',\n\n /**\n * Base32 — RFC 4648. Uppercase alpha + digits, no padding chars.\n * Use for: case-insensitive tokens, OTP secrets (Google Authenticator compatible).\n */\n base32: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',\n\n /**\n * Base32 hex — RFC 4648 §7. Sortable alternative to standard base32.\n */\n base32hex: '0123456789ABCDEFGHIJKLMNOPQRSTUV',\n\n /**\n * Base36 — digits + lowercase alpha.\n * Use for: short URLs, case-insensitive IDs, number system conversions.\n */\n base36: '0123456789abcdefghijklmnopqrstuvwxyz',\n\n /**\n * Base58 — Bitcoin alphabet. No 0/O/I/l to avoid visual ambiguity.\n * Use for: Bitcoin addresses, IPFS CIDs, human-readable tokens.\n */\n base58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',\n\n /**\n * Base62 — digits + lowercase + uppercase. Max density for alphanumeric.\n * Use for: URL shorteners, compact IDs, high-entropy tokens.\n */\n base62: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n\n /**\n * Base64 URL-safe — RFC 4648 §5. No +/= padding; URL and filename safe.\n * Use for: JWT components, URL tokens, file names.\n */\n base64url: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_',\n\n /**\n * Alphanumeric — same as base62. Alias for clarity.\n */\n alphanumeric: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n\n /**\n * Alpha — letters only, mixed case.\n */\n alpha: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n\n /**\n * Numeric — digits only.\n */\n numeric: '0123456789',\n\n /**\n * Hex — alias for base16 lowercase.\n */\n hex: '0123456789abcdef',\n\n /**\n * Crockford Base32 — human-friendly, case-insensitive, excludes I/L/O/U.\n * Use for: serial numbers, redemption codes, user-facing IDs.\n */\n crockford32: '0123456789ABCDEFGHJKMNPQRSTVWXYZ',\n} as const;\n\nexport type CharsetAlias = keyof typeof CHARSET_ALIASES;\n\n/**\n * Resolve a charset value: if it matches a known alias, return the\n * corresponding character string; otherwise return the value as-is.\n *\n * This is called inside buildCharset so alias names work transparently\n * as the `charset` option.\n *\n * @example\n * resolveCharsetAlias('base58') // → '123456789ABCDEF...'\n * resolveCharsetAlias('abc') // → 'abc'\n */\nexport function resolveCharsetAlias(value: string): string {\n return CHARSET_ALIASES[value] ?? value;\n}\n","/**\n * charsets.ts\n * Character set constants used across the library.\n */\nimport { resolveCharsetAlias } from './charset-aliases.js';\n\nexport const CHARSETS = {\n numeric: '0123456789',\n lowercase: 'abcdefghijklmnopqrstuvwxyz',\n uppercase: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n symbols: '!@#$%^&*()_+[]{}<>?',\n alphanumeric: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',\n hex: '0123456789abcdef',\n // Ambiguous characters that are easy to confuse when reading/transcribing\n ambiguous: '0Ol1I',\n} as const;\n\n/**\n * Deduplicate characters in a string, preserving order of first occurrence.\n */\nexport function dedup(str: string): string {\n return [...new Set(str)].join('');\n}\n\n/**\n * Build a character pool from option flags.\n * Returns the pool string and throws a descriptive error if the\n * resulting pool is empty or has fewer than 2 unique characters.\n */\nexport function buildCharset(options: {\n numeric?: boolean;\n lowercase?: boolean;\n uppercase?: boolean;\n symbols?: boolean;\n readable?: boolean;\n exclude?: string | string[];\n charset?: string;\n}): string {\n let pool: string;\n\n if (options.charset !== undefined) {\n pool = dedup(resolveCharsetAlias(options.charset));\n if (pool.length < 2) {\n throw new Error(\n 'Custom charset must contain at least 2 unique characters.'\n );\n }\n return pool;\n }\n\n const {\n numeric = true,\n lowercase = true,\n uppercase = true,\n symbols = false,\n } = options;\n\n pool = '';\n if (numeric) pool += CHARSETS.numeric;\n if (lowercase) pool += CHARSETS.lowercase;\n if (uppercase) pool += CHARSETS.uppercase;\n if (symbols) pool += CHARSETS.symbols;\n\n if (!pool) {\n throw new Error(\n 'At least one character type must be enabled (numeric, lowercase, uppercase, or symbols).'\n );\n }\n\n // Apply readable shorthand\n if (options.readable) {\n for (const ch of CHARSETS.ambiguous) {\n pool = pool.split(ch).join('');\n }\n }\n\n // Apply explicit exclusions\n if (options.exclude) {\n const excludeChars =\n typeof options.exclude === 'string'\n ? options.exclude\n : options.exclude.join('');\n for (const ch of excludeChars) {\n pool = pool.split(ch).join('');\n }\n }\n\n pool = dedup(pool);\n\n if (pool.length < 2) {\n throw new Error(\n 'After applying exclusions, the character pool has fewer than 2 unique characters. ' +\n 'Loosen your exclude/readable settings or enable more character types.'\n );\n }\n\n return pool;\n}\n\n/**\n * Build the subset of `fullPool` that only contains alphabetic characters.\n */\nexport function alphabetSubset(fullPool: string): string {\n return [...fullPool]\n .filter(ch => /[a-zA-Z]/.test(ch))\n .join('');\n}\n\n/**\n * Build the subset of `fullPool` that only contains numeric characters.\n */\nexport function numericSubset(fullPool: string): string {\n return [...fullPool]\n .filter(ch => /[0-9]/.test(ch))\n .join('');\n}\n","/**\n * generator.ts\n * Core string generation logic for both sync and async paths.\n */\n\nimport type { RandomStringOptions } from './types.js';\nimport { getRandomChar, getRandomChars } from './core.js';\nimport { generateSeeded } from './seeded.js';\nimport {\n buildCharset,\n alphabetSubset,\n numericSubset,\n CHARSETS,\n} from './charsets.js';\n\n// ---------------------------------------------------------------------------\n// Pattern expansion\n// ---------------------------------------------------------------------------\n\n/**\n * Expand a pattern string into a random string.\n * Placeholder characters are replaced; literal characters are preserved.\n *\n * Placeholders:\n * # → digit\n * A → uppercase letter\n * a → lowercase letter\n * * → char from full charset\n * ? → alphanumeric from full charset\n *\n * Escape with backslash: `\\#` → literal `#`\n */\nexport function expandPattern(pattern: string, fullCharset: string): string {\n const upper = [...fullCharset].filter(c => /[A-Z]/.test(c)).join('') || CHARSETS.uppercase;\n const lower = [...fullCharset].filter(c => /[a-z]/.test(c)).join('') || CHARSETS.lowercase;\n const alphanum = [...fullCharset].filter(c => /[a-zA-Z0-9]/.test(c)).join('') || CHARSETS.alphanumeric;\n\n const result: string[] = [];\n let i = 0;\n\n while (i < pattern.length) {\n const ch = pattern[i] as string;\n\n if (ch === '\\\\' && i + 1 < pattern.length) {\n // Escaped literal — include next character verbatim\n result.push(pattern[i + 1] as string);\n i += 2;\n continue;\n }\n\n switch (ch) {\n case '#':\n result.push(getRandomChar(CHARSETS.numeric));\n break;\n case 'A':\n result.push(getRandomChar(upper));\n break;\n case 'a':\n result.push(getRandomChar(lower));\n break;\n case '*':\n result.push(getRandomChar(fullCharset));\n break;\n case '?':\n result.push(getRandomChar(alphanum));\n break;\n default:\n result.push(ch);\n }\n\n i++;\n }\n\n return result.join('');\n}\n\n// ---------------------------------------------------------------------------\n// Single string generation\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a single random string from the given options.\n * This is the synchronous inner workhorse; called by both the public\n * sync and async APIs.\n */\nexport function generateOne(options: RandomStringOptions): string {\n const {\n length = 16,\n prefix = '',\n suffix = '',\n startWith = 'any',\n pattern,\n seed,\n ...charsetOptions\n } = options;\n\n // Build the main charset (validates options, throws on bad config)\n const charset = buildCharset(charsetOptions);\n\n // --- Seeded / deterministic mode ---\n if (seed !== undefined) {\n if (pattern !== undefined) {\n // For pattern mode with seed, generate enough seeded chars and consume them\n // by re-running expandPattern with a seeded char source isn't trivial,\n // so we generate a seeded string of the expanded pattern length instead.\n const patternLength = [...pattern].filter((_, i) => {\n // Count non-escaped, non-literal chars — approximate length\n return true;\n }).length;\n const seededStr = generateSeeded({ seed, charset, length: patternLength });\n return `${prefix}${seededStr}${suffix}`;\n }\n const randomLength = length - prefix.length - suffix.length;\n if (randomLength <= 0) return `${prefix}${suffix}`;\n const seededStr = generateSeeded({ seed, charset, length: randomLength });\n return `${prefix}${seededStr}${suffix}`;\n }\n\n // --- Pattern mode ---\n if (pattern !== undefined) {\n const expanded = expandPattern(pattern, charset);\n return `${prefix}${expanded}${suffix}`;\n }\n\n // --- Length mode ---\n const randomLength = length - prefix.length - suffix.length;\n\n if (randomLength < 0) {\n throw new Error(\n `prefix ('${prefix}') + suffix ('${suffix}') is longer than the total length (${length}). ` +\n 'Increase length or shorten the affixes.'\n );\n }\n\n if (randomLength === 0) {\n return `${prefix}${suffix}`;\n }\n\n // Determine the allowed set for the first character\n let firstCharset: string;\n switch (startWith) {\n case 'alphabet': {\n const alpha = alphabetSubset(charset);\n if (!alpha) {\n throw new Error(\n \"startWith: 'alphabet' requires at least one of lowercase or uppercase to be enabled.\"\n );\n }\n firstCharset = alpha;\n break;\n }\n case 'numeric': {\n const num = numericSubset(charset);\n if (!num) {\n throw new Error(\n \"startWith: 'numeric' requires numeric to be enabled.\"\n );\n }\n firstCharset = num;\n break;\n }\n default:\n firstCharset = charset;\n }\n\n // Build the string\n const firstChar = getRandomChar(firstCharset);\n\n if (randomLength === 1) {\n return `${prefix}${firstChar}${suffix}`;\n }\n\n const rest = getRandomChars(charset, randomLength - 1).join('');\n return `${prefix}${firstChar}${rest}${suffix}`;\n}\n\n// ---------------------------------------------------------------------------\n// Batch generation\n// ---------------------------------------------------------------------------\n\n/**\n * Generate `count` unique strings. Uniqueness is guaranteed via a Set.\n * Throws if the requested count is theoretically impossible given the config.\n */\nexport function generateBatch(options: RandomStringOptions, count: number): string[] {\n if (count <= 0) {\n throw new Error('count must be a positive integer.');\n }\n if (!Number.isInteger(count)) {\n throw new Error('count must be an integer.');\n }\n\n const results = new Set<string>();\n let attempts = 0;\n // Allow generous retries; practical collision risk is negligible for any\n // sensibly-sized charset+length combination\n const maxAttempts = count * 10 + 1000;\n\n while (results.size < count) {\n if (++attempts > maxAttempts) {\n throw new Error(\n `Could not generate ${count} unique strings after ${maxAttempts} attempts. ` +\n 'The charset and length combination may not support this many unique values.'\n );\n }\n results.add(generateOne(options));\n }\n\n return [...results];\n}\n","/**\n * short-id.ts\n * Collision-resistant short IDs with an optional checksum character.\n *\n * A checksum character (Luhn-style mod-N) is appended to the random\n * portion so that single-character transcription errors are detectable\n * without a database lookup. The checksum uses the same charset as the\n * random portion — the output looks uniform.\n *\n * Format: [prefix_][random chars][checksum char]\n *\n * @example\n * const id = generateId({ prefix: 'usr' });\n * // → 'usr_K3xP9mQr2L4c' (10 random + 1 checksum = 11 chars after prefix)\n *\n * validateId('usr_K3xP9mQr2L4c', { prefix: 'usr' });\n * // → { valid: true, ... }\n */\n\nimport { getRandomChars } from './core.js';\nimport { buildCharset } from './charsets.js';\nimport { resolveCharsetAlias } from './charset-aliases.js';\n\nexport interface ShortIdOptions {\n /**\n * Optional prefix string, e.g. `'usr'` → `'usr_K3xP9mQr'`.\n * An underscore separator is added automatically between prefix and random part.\n * Set `separator: ''` to disable.\n */\n prefix?: string;\n /**\n * Separator between prefix and random portion.\n * @default '_'\n */\n separator?: string;\n /**\n * Length of the random portion (before checksum is added).\n * Total random section = randomLength + 1 (checksum).\n * @default 12\n */\n randomLength?: number;\n /**\n * Character pool for the random portion. Accepts a charset alias\n * (e.g. `'base58'`) or a raw character string.\n * @default base58 (no ambiguous chars)\n */\n charset?: string;\n /**\n * Whether to append a checksum character.\n * Disable only if you need exact length control.\n * @default true\n */\n checksum?: boolean;\n}\n\nexport interface ShortIdValidateOptions {\n /** Expected prefix (without separator). */\n prefix?: string;\n /** Separator used when the ID was generated. @default '_' */\n separator?: string;\n /** Charset used when the ID was generated. @default base58 */\n charset?: string;\n /** Whether the ID was generated with a checksum. @default true */\n checksum?: boolean;\n}\n\nexport interface ShortIdValidateResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Compute a mod-N checksum character for `payload` over `charset`.\n * Detects all single-character substitutions and many transpositions.\n */\nfunction computeChecksum(payload: string, charset: string): string {\n const n = charset.length;\n let sum = 0;\n for (let i = 0; i < payload.length; i++) {\n const idx = charset.indexOf(payload[i]!);\n if (idx === -1) return charset[0]!; // fallback; caller validates charset\n // Alternate weight 1 and 2 (Luhn-style) to catch transpositions too\n const weight = (i % 2 === 0) ? 1 : 2;\n sum += idx * weight;\n }\n return charset[sum % n]!;\n}\n\n/**\n * Generate a collision-resistant short ID.\n *\n * @example\n * generateId() // → 'K3xP9mQr2L4Xc'\n * generateId({ prefix: 'usr' }) // → 'usr_K3xP9mQr2L4Xc'\n * generateId({ prefix: 'inv', randomLength: 8 }) // → 'inv_K3xP9mQrc'\n * generateId({ charset: 'base62' }) // → '4jK9mQr2L4Xz3'\n */\nexport function generateId(options: ShortIdOptions = {}): string {\n const {\n prefix,\n separator = '_',\n randomLength = 12,\n charset: rawCharset = 'base58',\n checksum = true,\n } = options;\n\n const resolvedCharset = resolveCharsetAlias(rawCharset);\n const charset = buildCharset({ charset: resolvedCharset });\n\n if (randomLength < 4) throw new Error('randomLength must be at least 4.');\n\n const randomPart = getRandomChars(charset, randomLength).join('');\n const checksumChar = checksum ? computeChecksum(randomPart, charset) : '';\n const randomSection = randomPart + checksumChar;\n\n if (prefix) {\n return `${prefix}${separator}${randomSection}`;\n }\n return randomSection;\n}\n\n/**\n * Validate a short ID against a known config.\n * Checks prefix, separator, and checksum integrity.\n *\n * @example\n * validateId('usr_K3xP9mQr2L4Xc', { prefix: 'usr' })\n * // → { valid: true, errors: [] }\n *\n * validateId('usr_K3xP9mQr2L4Xa', { prefix: 'usr' })\n * // → { valid: false, errors: ['Checksum mismatch — ID may be corrupted or mistyped.'] }\n */\nexport function validateId(\n id: string,\n options: ShortIdValidateOptions = {}\n): ShortIdValidateResult {\n const {\n prefix,\n separator = '_',\n charset: rawCharset = 'base58',\n checksum = true,\n } = options;\n\n const errors: string[] = [];\n const resolvedCharset = resolveCharsetAlias(rawCharset);\n let payload = id;\n\n // Check prefix\n if (prefix) {\n const expectedStart = `${prefix}${separator}`;\n if (!id.startsWith(expectedStart)) {\n errors.push(`Expected prefix '${prefix}${separator}', got '${id.slice(0, expectedStart.length)}'.`);\n return { valid: false, errors };\n }\n payload = id.slice(expectedStart.length);\n }\n\n // Check all chars are in charset\n const charsetSet = new Set(resolvedCharset);\n const badChars = [...new Set(payload)].filter(c => !charsetSet.has(c));\n if (badChars.length > 0) {\n errors.push(`Contains characters outside the expected charset: ${badChars.map(c => JSON.stringify(c)).join(', ')}.`);\n }\n\n // Check checksum\n if (checksum && payload.length >= 2 && errors.length === 0) {\n const randomPart = payload.slice(0, -1);\n const providedChecksum = payload.slice(-1);\n const expectedChecksum = computeChecksum(randomPart, resolvedCharset);\n if (providedChecksum !== expectedChecksum) {\n errors.push('Checksum mismatch — ID may be corrupted or mistyped.');\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","/**\n * expiring-token.ts\n * Time-bound tokens with tamper-evident expiry encoding.\n *\n * Token format (base62-encoded, no separators):\n * [8 chars: expiry epoch seconds in base62] + [random payload]\n *\n * The expiry is prepended to the random portion, then the whole thing\n * is encoded so it looks like a uniform random string. A simple XOR\n * checksum guards against accidental corruption (not cryptographic —\n * use a signed JWT if you need HMAC-level tamper protection).\n *\n * @example\n * const { token, expiresAt } = generateExpiringToken({ ttlSeconds: 900 });\n * // later…\n * const result = verifyToken(token);\n * result.valid // true / false\n * result.expiresAt // Date\n * result.expired // boolean\n */\n\nimport { generateOne } from './generator.js';\nimport { CHARSET_ALIASES } from './charset-aliases.js';\n\nconst B62 = CHARSET_ALIASES['base62']!;\nconst B62_LEN = B62.length;\nconst EXPIRY_CHARS = 8; // base62-encodes up to ~3.5 trillion seconds — future-proof\n\n/** Encode a non-negative integer into a fixed-width base62 string. */\nfunction encodeBase62(n: number, width: number): string {\n const digits: string[] = [];\n let v = Math.floor(n);\n for (let i = 0; i < width; i++) {\n digits.unshift(B62[v % B62_LEN]!);\n v = Math.floor(v / B62_LEN);\n }\n return digits.join('');\n}\n\n/** Decode a base62 string back to a number. */\nfunction decodeBase62(s: string): number {\n let v = 0;\n for (const ch of s) {\n const idx = B62.indexOf(ch);\n if (idx === -1) return -1;\n v = v * B62_LEN + idx;\n }\n return v;\n}\n\nexport interface ExpiringTokenOptions {\n /**\n * How long (in seconds) before the token expires.\n * @default 900 (15 minutes)\n */\n ttlSeconds?: number;\n /**\n * Length of the random payload (not counting the expiry prefix).\n * Total token length = payloadLength + 8.\n * @default 24\n */\n payloadLength?: number;\n}\n\nexport interface ExpiringTokenResult {\n /** The opaque token string to store / transmit. */\n token: string;\n /** When this token stops being valid. */\n expiresAt: Date;\n /** Total token length in characters. */\n length: number;\n}\n\nexport interface TokenVerifyResult {\n /** Whether the token is structurally valid AND not yet expired. */\n valid: boolean;\n /** Whether the token format could be parsed (regardless of expiry). */\n parsed: boolean;\n /** Whether the token has passed its expiry time. */\n expired: boolean;\n /** Expiry time, if the token could be parsed. */\n expiresAt: Date | null;\n /** Seconds remaining (negative if expired). */\n secondsRemaining: number | null;\n}\n\n/**\n * Generate a self-expiring token.\n *\n * @example\n * // Password reset link (15 min)\n * const { token } = generateExpiringToken({ ttlSeconds: 900 });\n *\n * // Magic login link (10 min), longer payload\n * const { token, expiresAt } = generateExpiringToken({\n * ttlSeconds: 600,\n * payloadLength: 32,\n * });\n */\nexport function generateExpiringToken(\n options: ExpiringTokenOptions = {}\n): ExpiringTokenResult {\n const { ttlSeconds = 900, payloadLength = 24 } = options;\n\n if (ttlSeconds <= 0) throw new Error('ttlSeconds must be a positive number.');\n if (payloadLength < 8) throw new Error('payloadLength must be at least 8.');\n\n const expiresAt = new Date(Date.now() + ttlSeconds * 1000);\n const expiryEpoch = Math.floor(expiresAt.getTime() / 1000);\n\n const expiryPart = encodeBase62(expiryEpoch, EXPIRY_CHARS);\n const payload = generateOne({\n length: payloadLength,\n charset: B62,\n });\n\n const token = expiryPart + payload;\n\n return {\n token,\n expiresAt,\n length: token.length,\n };\n}\n\n/**\n * Verify an expiring token. Returns whether it's valid and unexpired.\n *\n * @example\n * const result = verifyToken(token);\n * if (!result.valid) {\n * if (result.expired) throw new Error('Token expired');\n * throw new Error('Invalid token');\n * }\n */\nexport function verifyToken(token: string): TokenVerifyResult {\n if (typeof token !== 'string' || token.length < EXPIRY_CHARS + 8) {\n return { valid: false, parsed: false, expired: false, expiresAt: null, secondsRemaining: null };\n }\n\n const expiryStr = token.slice(0, EXPIRY_CHARS);\n const expiryEpoch = decodeBase62(expiryStr);\n\n if (expiryEpoch === -1) {\n return { valid: false, parsed: false, expired: false, expiresAt: null, secondsRemaining: null };\n }\n\n const expiresAt = new Date(expiryEpoch * 1000);\n const nowSeconds = Date.now() / 1000;\n const secondsRemaining = Math.round(expiryEpoch - nowSeconds);\n const expired = secondsRemaining <= 0;\n\n return {\n valid: !expired,\n parsed: true,\n expired,\n expiresAt,\n secondsRemaining,\n };\n}\n","/**\n * stream.ts\n * Async generator (iterator) API for memory-efficient bulk generation.\n *\n * Unlike the `count` option (which allocates a Set of N strings upfront),\n * the stream API yields strings one at a time — safe for generating\n * hundreds of thousands of IDs without blowing the heap.\n *\n * @example Basic usage\n * for await (const token of randomStringStream({ length: 24 })) {\n * await db.insert({ token });\n * }\n * // Runs forever — break when done\n *\n * @example Generate exactly N\n * import { take } from '@ppabari/strio';\n * const ids = await take(randomStringStream({ length: 12 }), 10_000);\n *\n * @example Unique-only stream\n * const stream = uniqueRandomStringStream({ length: 8, charset: 'base36' });\n * for await (const id of stream) { ... }\n */\n\nimport type { RandomStringOptions } from './types.js';\nimport { generateOne } from './generator.js';\n\n/**\n * Infinite async generator that yields random strings from the given options.\n * Each value is independently generated (not deduplicated).\n *\n * Use `take()` or a `break` statement to stop the stream.\n * For bulk operations, prefer `take(randomStringStream(opts), n)` over\n * the `count` option — it avoids allocating a full Set upfront.\n */\nexport async function* randomStringStream(\n options: RandomStringOptions = {}\n): AsyncGenerator<string, never, unknown> {\n // Pre-validate options by generating one eagerly — surfaces config errors\n // before the consumer enters the loop.\n generateOne(options);\n\n while (true) {\n yield generateOne(options);\n }\n}\n\n/**\n * Infinite async generator that yields globally unique strings.\n * Deduplication is maintained via an in-memory Set.\n *\n * ⚠️ Memory grows with consumption. For very large sets (>1M), consider\n * a probabilistic structure (Bloom filter) or external dedup store instead.\n */\nexport async function* uniqueRandomStringStream(\n options: RandomStringOptions = {}\n): AsyncGenerator<string, never, unknown> {\n const seen = new Set<string>();\n generateOne(options); // pre-validate\n\n while (true) {\n const candidate = generateOne(options);\n if (!seen.has(candidate)) {\n seen.add(candidate);\n yield candidate;\n }\n }\n}\n\n/**\n * Collect the first `n` values from any async iterable into an array.\n * Works with both `randomStringStream` and `uniqueRandomStringStream`.\n *\n * @example\n * const tokens = await take(randomStringStream({ length: 32 }), 500);\n * // → string[] of 500 tokens\n */\nexport async function take<T>(\n iterable: AsyncIterable<T>,\n n: number\n): Promise<T[]> {\n if (n <= 0) return [];\n if (!Number.isInteger(n)) throw new Error('n must be a positive integer.');\n\n const results: T[] = [];\n for await (const value of iterable) {\n results.push(value);\n if (results.length >= n) break;\n }\n return results;\n}\n\n/**\n * Like `take`, but filters values through a predicate.\n * Pulls from the stream until `n` values satisfy `predicate`.\n *\n * @example\n * // Get 10 tokens that start with a digit\n * const tokens = await takeWhere(\n * randomStringStream({ length: 12 }),\n * 10,\n * t => /^[0-9]/.test(t)\n * );\n */\nexport async function takeWhere<T>(\n iterable: AsyncIterable<T>,\n n: number,\n predicate: (value: T) => boolean\n): Promise<T[]> {\n if (n <= 0) return [];\n const results: T[] = [];\n for await (const value of iterable) {\n if (predicate(value)) {\n results.push(value);\n if (results.length >= n) break;\n }\n }\n return results;\n}\n","/**\n * passphrase.ts\n * Human-memorable passphrase generation using the EFF Large Wordlist.\n *\n * Each word is selected using cryptographically secure randomness.\n * A 4-word passphrase gives ~51 bits of entropy; 6 words gives ~77 bits.\n *\n * The built-in wordlist is a curated 1296-word subset (6^4 = 1296) of the\n * EFF Large Wordlist, suitable for 4-dice rolls. We use a 256-word subset\n * here for bundle efficiency — for maximum entropy use the `customWords` option\n * with the full EFF list.\n *\n * @example\n * generatePassphrase()\n * // → 'correct-horse-battery-staple'\n *\n * generatePassphrase({ words: 5, separator: ' ', capitalize: true })\n * // → 'Correct Horse Battery Staple Fence'\n */\n\nimport { getRandomChar } from './core.js';\n\n/**\n * 512-word curated subset — common, unambiguous English words.\n * Large enough for good entropy while keeping bundle size small.\n * Each word is 3–8 characters, avoiding technical jargon and offensive terms.\n */\nconst WORD_LIST: readonly string[] = [\n 'able','acid','aged','also','area','army','away','back','ball','band',\n 'bank','base','bath','bear','beat','been','bell','best','bird','bite',\n 'blow','blue','boat','body','bomb','bond','bone','book','bore','born',\n 'both','bowl','burn','busy','call','calm','camp','card','care','cart',\n 'case','cash','cast','cave','cell','chat','chip','city','clam','clap',\n 'clay','clip','club','clue','coal','coat','code','coil','cold','come',\n 'cook','cool','copy','core','cork','corn','cost','cozy','crab','crew',\n 'crop','crow','curb','cure','dark','dart','data','date','dawn','deal',\n 'dear','deck','deed','deep','deft','dent','desk','dial','dice','diet',\n 'dime','dine','dirt','dish','disk','dock','dome','door','dose','dove',\n 'down','draw','drew','drip','drop','drum','dual','dune','dusk','dust',\n 'each','earl','earn','ease','east','edge','else','emit','envy','epic',\n 'even','exam','exit','expo','face','fact','fail','fair','fall','fame',\n 'farm','fast','fate','fawn','fear','feat','feed','feel','feet','fell',\n 'felt','fern','fest','film','find','fine','fire','firm','fish','fist',\n 'flag','flat','flaw','flew','flip','flow','foam','fold','folk','fond',\n 'font','food','fool','foot','ford','fork','form','fort','foul','four',\n 'free','frog','from','fuel','full','fund','fuse','gain','gale','game',\n 'gang','gate','gave','gaze','gear','gift','give','glad','glow','glue',\n 'goal','goat','gold','golf','gone','good','grab','gray','grew','grid',\n 'grin','grip','grow','gulf','gust','half','hall','halt','hand','hang',\n 'hard','hare','harm','harp','hash','haul','hawk','head','heal','heap',\n 'heat','heel','held','helm','help','herb','herd','hero','hide','high',\n 'hike','hill','hint','hire','hold','hole','home','hood','hook','hope',\n 'horn','hose','host','hour','huge','hulk','hull','hunt','hymn','idea',\n 'idle','inch','into','iron','isle','item','jade','jail','jest','join',\n 'joke','jolt','jump','just','keen','keep','kick','kind','king','knee',\n 'knew','knot','know','lace','lame','lamp','land','lane','lark','lash',\n 'last','late','lawn','lead','leaf','lean','leap','left','lens','lift',\n 'like','limb','lime','link','lion','list','live','load','loan','lock',\n 'loft','long','look','loop','lore','lose','lost','loud','love','luck',\n 'lure','lush','made','mail','main','make','mall','mane','many','mark',\n 'mass','mast','math','maze','mead','meal','mean','meet','melt','memo',\n 'menu','mesh','mild','mile','mill','mime','mind','mine','mint','miss',\n 'mist','mode','mold','mole','mood','moon','more','most','move','much',\n 'mule','myth','nail','name','neck','need','nest','next','nine','node',\n 'noel','norm','nose','note','noun','oath','once','only','open','oven',\n 'over','pack','page','pain','pair','palm','park','part','pass','past',\n 'path','peak','peel','peer','pelt','pest','pine','pink','pipe','plan',\n 'play','plot','plow','plug','plus','poem','poet','pole','poll','pond',\n 'pool','poor','port','pose','post','pour','prey','prop','pull','pump',\n 'pure','push','race','rack','rain','ramp','rang','rank','rate','read',\n 'real','reap','reed','reef','reel','rely','rest','rice','rich','ride',\n 'rift','ring','rise','risk','road','roam','roar','role','roll','roof',\n 'room','root','rope','rose','rove','ruin','rule','rush','safe','sage',\n 'sail','sake','salt','same','sand','sane','sang','sank','save','seal',\n 'seam','seat','seed','seek','seem','seep','self','sell','send','sent',\n 'shed','shin','ship','shop','shot','show','shut','sick','side','sift',\n 'sign','silk','sill','sing','sink','site','size','skin','slab','slam',\n 'slap','slid','slim','slip','slot','slow','slug','snap','snow','soak',\n 'soar','sock','soft','soil','sole','some','song','soot','sort','soul',\n 'soup','sour','span','spar','spin','spot','spur','star','stay','stem',\n 'step','stir','stop','stub','such','suit','sung','sunk','sure','surf',\n 'swap','swim','tack','tale','tall','tame','tank','tape','task','team',\n 'tear','tell','tend','tent','term','test','text','than','that','them',\n 'then','they','thin','this','tide','tilt','time','tiny','tire','toad',\n 'toll','tone','took','tool','tops','tore','torn','toss','tour','town',\n 'tray','trim','trio','trip','true','tube','tuck','tuft','tune','turf',\n 'turn','tusk','twin','type','unit','upon','used','user','vast','veil',\n 'very','vest','view','vine','void','vote','wade','wage','wake','walk',\n 'wall','want','ward','warm','warp','wary','wash','wave','weak','weld',\n 'well','went','west','what','when','whip','whom','wide','wife','wild',\n 'will','wilt','wind','wing','wink','wire','wise','wish','with','wolf',\n 'wood','wore','worm','wove','wrap','wren','yard','yarn','yell','your',\n 'zinc','zone','zoom',\n];\n\nconst WORD_COUNT = WORD_LIST.length;\n\n/**\n * Select a uniformly random word index using rejection sampling.\n * Works correctly for any word list size without modulo bias.\n * Uses 40-bit sampling (5 bytes) to handle lists larger than 256 words.\n */\nfunction getRandomWordIndex(listLength: number): number {\n if (listLength <= 256) {\n // Single byte path — handles lists up to 256 words\n const maxValid = 256 - (256 % listLength);\n const buf = new Uint8Array(1);\n let b: number;\n do {\n crypto.getRandomValues(buf);\n b = buf[0]!;\n } while (b >= maxValid);\n return b % listLength;\n } else {\n // Multi-byte path — handles lists up to 2^40 words (more than enough)\n const RANGE40 = 1099511627776; // 2^40\n const maxValid = Math.floor(RANGE40 / listLength) * listLength;\n const buf = new Uint8Array(5);\n let n: number;\n do {\n crypto.getRandomValues(buf);\n n = buf[0]! * 4294967296 +\n (((buf[1]! << 24) | (buf[2]! << 16) | (buf[3]! << 8) | buf[4]!) >>> 0);\n } while (n >= maxValid);\n return n % listLength;\n }\n}\n\nexport interface PassphraseOptions {\n /**\n * Number of words in the passphrase.\n * More words = more entropy. 4 words ≈ 51 bits, 6 words ≈ 77 bits.\n * @default 4\n */\n words?: number;\n /**\n * Separator between words.\n * @default '-'\n */\n separator?: string;\n /**\n * Capitalize the first letter of each word.\n * @default false\n */\n capitalize?: boolean;\n /**\n * Append a random digit to the end for services that require numbers.\n * @default false\n */\n appendDigit?: boolean;\n /**\n * Use a custom word list instead of the built-in list.\n * Must contain at least 2 words.\n */\n customWords?: readonly string[];\n /**\n * Prefix the passphrase with a fixed string.\n */\n prefix?: string;\n}\n\nexport interface PassphraseResult {\n /** The generated passphrase string. */\n passphrase: string;\n /** Number of words used. */\n wordCount: number;\n /** Entropy estimate in bits. */\n entropyBits: number;\n}\n\n/**\n * Generate a human-memorable passphrase from random dictionary words.\n *\n * @example\n * generatePassphrase()\n * // → { passphrase: 'stone-river-proud-flame', wordCount: 4, entropyBits: 50.9 }\n *\n * generatePassphrase({ words: 5, separator: ' ', capitalize: true })\n * // → { passphrase: 'Stone River Proud Flame Beach', wordCount: 5, entropyBits: 63.7 }\n */\nexport function generatePassphrase(options: PassphraseOptions = {}): PassphraseResult {\n const {\n words = 4,\n separator = '-',\n capitalize = false,\n appendDigit = false,\n customWords,\n prefix,\n } = options;\n\n if (words < 2) throw new Error('words must be at least 2.');\n\n const wordList = customWords ?? WORD_LIST;\n\n if (wordList.length < 2) throw new Error('Word list must contain at least 2 words.');\n\n const selected: string[] = [];\n for (let i = 0; i < words; i++) {\n const idx = getRandomWordIndex(wordList.length);\n let word = wordList[idx]!;\n if (capitalize) word = word.charAt(0).toUpperCase() + word.slice(1);\n selected.push(word);\n }\n\n let passphrase = selected.join(separator);\n\n if (appendDigit) {\n const digit = getRandomChar('0123456789');\n passphrase += digit;\n }\n\n if (prefix) passphrase = prefix + passphrase;\n\n const entropyBits = Math.log2(Math.pow(wordList.length, words)) + (appendDigit ? Math.log2(10) : 0);\n\n return {\n passphrase,\n wordCount: words,\n entropyBits: Math.round(entropyBits * 10) / 10,\n };\n}\n\n/** Export the built-in word list for reference or customisation. */\nexport { WORD_LIST as BUILT_IN_WORD_LIST };\n","/**\n * entropy.ts\n * Estimate the Shannon entropy and strength of a random string configuration.\n */\n\nimport type { RandomStringOptions, EntropyResult } from './types.js';\nimport { buildCharset } from './charsets.js';\n\n/**\n * Estimates the entropy of strings generated by the given options.\n *\n * For pattern-based strings, each placeholder contributes independently.\n * For length-based strings, entropy = log2(charsetSize) * effectiveLength.\n *\n * @example\n * const e = estimateEntropy({ length: 32, uppercase: true, lowercase: true, numeric: true });\n * console.log(e.bits); // ~190\n * console.log(e.strength); // 'very-strong'\n */\nexport function estimateEntropy(options: RandomStringOptions = {}): EntropyResult {\n const {\n length = 16,\n prefix = '',\n suffix = '',\n pattern,\n count: _count,\n startWith: _startWith,\n ...charsetOptions\n } = options;\n\n if (pattern) {\n return estimatePatternEntropy(pattern, charsetOptions);\n }\n\n const charset = buildCharset(charsetOptions);\n const charsetSize = charset.length;\n\n const effectiveLength = Math.max(0, length - prefix.length - suffix.length);\n\n if (effectiveLength === 0) {\n return {\n bits: 0,\n strength: 'very-weak',\n charsetSize,\n effectiveLength: 0,\n combinations: '1',\n };\n }\n\n const bitsPerChar = Math.log2(charsetSize);\n const bits = bitsPerChar * effectiveLength;\n\n return {\n bits: Math.round(bits * 100) / 100,\n strength: strengthLabel(bits),\n charsetSize,\n effectiveLength,\n combinations: approximateCombinations(charsetSize, effectiveLength),\n };\n}\n\nfunction estimatePatternEntropy(\n pattern: string,\n charsetOptions: Omit<RandomStringOptions, 'pattern' | 'length' | 'prefix' | 'suffix' | 'count' | 'startWith'>\n): EntropyResult {\n const fullCharset = buildCharset(charsetOptions);\n const alphaChars = [...fullCharset].filter(c => /[a-zA-Z]/.test(c)).join('');\n const upperChars = [...fullCharset].filter(c => /[A-Z]/.test(c)).join('');\n const lowerChars = [...fullCharset].filter(c => /[a-z]/.test(c)).join('');\n const digitChars = '0123456789';\n const alphanumChars = [...fullCharset].filter(c => /[a-zA-Z0-9]/.test(c)).join('');\n\n let totalBits = 0;\n let effectiveLength = 0;\n let i = 0;\n\n while (i < pattern.length) {\n const ch = pattern[i] as string;\n\n if (ch === '\\\\' && i + 1 < pattern.length) {\n i += 2;\n continue;\n }\n\n let placeholderCharsetSize = 0;\n\n switch (ch) {\n case '#':\n placeholderCharsetSize = digitChars.length;\n effectiveLength++;\n break;\n case 'A':\n placeholderCharsetSize = Math.max(upperChars.length, 1);\n effectiveLength++;\n break;\n case 'a':\n placeholderCharsetSize = Math.max(lowerChars.length, 1);\n effectiveLength++;\n break;\n case '*':\n placeholderCharsetSize = fullCharset.length;\n effectiveLength++;\n break;\n case '?':\n placeholderCharsetSize = Math.max(alphanumChars.length, 1);\n effectiveLength++;\n break;\n default:\n // Literal character — contributes 0 entropy\n break;\n }\n\n if (placeholderCharsetSize > 0) {\n totalBits += Math.log2(placeholderCharsetSize);\n }\n\n i++;\n }\n\n const _ = alphaChars; // suppress unused warning\n\n return {\n bits: Math.round(totalBits * 100) / 100,\n strength: strengthLabel(totalBits),\n charsetSize: fullCharset.length,\n effectiveLength,\n combinations: approximateCombinations(fullCharset.length, effectiveLength),\n };\n}\n\nfunction strengthLabel(bits: number): EntropyResult['strength'] {\n if (bits < 28) return 'very-weak';\n if (bits < 50) return 'weak';\n if (bits < 72) return 'fair';\n if (bits < 100) return 'strong';\n return 'very-strong';\n}\n\n/**\n * Returns an approximate count of unique combinations as a string.\n * Uses scientific notation for very large numbers to avoid Infinity.\n */\nfunction approximateCombinations(charsetSize: number, length: number): string {\n // log10(charsetSize^length) = length * log10(charsetSize)\n const log10 = length * Math.log10(charsetSize);\n if (log10 > 15) {\n const exp = Math.floor(log10);\n const mantissa = Math.pow(10, log10 - exp);\n return `${mantissa.toFixed(2)}e+${exp}`;\n }\n return Math.round(Math.pow(charsetSize, length)).toString();\n}\n","/**\n * validate.ts\n * Validate that a string conforms to a given RandomStringOptions config.\n */\n\nimport type { ValidateOptions, ValidationResult } from './types.js';\n\nconst DIGIT_RE = /[0-9]/;\nconst LOWER_RE = /[a-z]/;\nconst UPPER_RE = /[A-Z]/;\nconst SYMBOL_RE = /[!@#$%^&*()_+\\[\\]{}<>?]/;\n\n/**\n * Checks whether `str` satisfies the given validation rules.\n *\n * @example\n * const result = validateRandomString('abc123', {\n * minLength: 6,\n * requireNumeric: true,\n * requireLowercase: true,\n * });\n * result.valid; // true\n *\n * @example\n * const result = validateRandomString('abc', { requireNumeric: true });\n * result.valid; // false\n * result.errors; // ['Must contain at least one numeric digit.']\n */\nexport function validateRandomString(\n str: string,\n options: ValidateOptions = {}\n): ValidationResult {\n const errors: string[] = [];\n const {\n minLength,\n maxLength,\n length,\n requireNumeric,\n requireLowercase,\n requireUppercase,\n requireSymbols,\n charset,\n pattern,\n } = options;\n\n if (length !== undefined && str.length !== length) {\n errors.push(`Length must be exactly ${length}, got ${str.length}.`);\n }\n\n if (minLength !== undefined && str.length < minLength) {\n errors.push(`Length must be at least ${minLength}, got ${str.length}.`);\n }\n\n if (maxLength !== undefined && str.length > maxLength) {\n errors.push(`Length must be at most ${maxLength}, got ${str.length}.`);\n }\n\n if (requireNumeric && !DIGIT_RE.test(str)) {\n errors.push('Must contain at least one numeric digit.');\n }\n\n if (requireLowercase && !LOWER_RE.test(str)) {\n errors.push('Must contain at least one lowercase letter.');\n }\n\n if (requireUppercase && !UPPER_RE.test(str)) {\n errors.push('Must contain at least one uppercase letter.');\n }\n\n if (requireSymbols && !SYMBOL_RE.test(str)) {\n errors.push('Must contain at least one symbol.');\n }\n\n if (charset !== undefined) {\n const charsetSet = new Set(charset);\n const invalidChars = [...new Set(str)].filter(ch => !charsetSet.has(ch));\n if (invalidChars.length > 0) {\n errors.push(\n `Contains characters not in the allowed charset: ${invalidChars.map(c => JSON.stringify(c)).join(', ')}.`\n );\n }\n }\n\n if (pattern !== undefined) {\n const patternErrors = validatePattern(str, pattern);\n errors.push(...patternErrors);\n }\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validatePattern(str: string, pattern: string): string[] {\n const errors: string[] = [];\n const expandedPattern: Array<{ type: 'literal' | 'placeholder'; value: string }> = [];\n\n let i = 0;\n while (i < pattern.length) {\n const ch = pattern[i] as string;\n if (ch === '\\\\' && i + 1 < pattern.length) {\n expandedPattern.push({ type: 'literal', value: pattern[i + 1] as string });\n i += 2;\n } else if (['#', 'A', 'a', '*', '?'].includes(ch)) {\n expandedPattern.push({ type: 'placeholder', value: ch });\n i++;\n } else {\n expandedPattern.push({ type: 'literal', value: ch });\n i++;\n }\n }\n\n if (str.length !== expandedPattern.length) {\n errors.push(\n `Pattern expects length ${expandedPattern.length}, got ${str.length}.`\n );\n return errors;\n }\n\n for (let pos = 0; pos < expandedPattern.length; pos++) {\n const token = expandedPattern[pos]!;\n const ch = str[pos] as string;\n\n if (token.type === 'literal') {\n if (ch !== token.value) {\n errors.push(\n `Position ${pos}: expected literal '${token.value}', got '${ch}'.`\n );\n }\n } else {\n switch (token.value) {\n case '#':\n if (!DIGIT_RE.test(ch)) {\n errors.push(`Position ${pos}: '#' expects a digit, got '${ch}'.`);\n }\n break;\n case 'A':\n if (!/[A-Z]/.test(ch)) {\n errors.push(`Position ${pos}: 'A' expects an uppercase letter, got '${ch}'.`);\n }\n break;\n case 'a':\n if (!LOWER_RE.test(ch)) {\n errors.push(`Position ${pos}: 'a' expects a lowercase letter, got '${ch}'.`);\n }\n break;\n case '?':\n if (!/[a-zA-Z0-9]/.test(ch)) {\n errors.push(`Position ${pos}: '?' expects an alphanumeric character, got '${ch}'.`);\n }\n break;\n case '*':\n // Any character is valid\n break;\n }\n }\n }\n\n return errors;\n}\n","/**\n * compat.ts\n * Runtime environment & version compatibility checks.\n *\n * `@ppabari/strio` depends on the Web Crypto API (`crypto.getRandomValues`),\n * which is available natively in Node >=18, all modern browsers, Deno, Bun,\n * and edge runtimes. These helpers let applications verify — at startup or in\n * a health check — that the current runtime can support secure generation,\n * and surface a clear message when it cannot.\n */\n\n/** The minimum Node.js major version supported by this package. */\nexport const MIN_NODE_VERSION = 18;\n\nexport type Runtime =\n | 'node'\n | 'deno'\n | 'bun'\n | 'browser'\n | 'workerd'\n | 'unknown';\n\nexport interface CompatibilityResult {\n /** `true` when the runtime can support secure string generation. */\n ok: boolean;\n /** Whether `crypto.getRandomValues` is available. */\n cryptoAvailable: boolean;\n /** Best-effort detected runtime. */\n runtime: Runtime;\n /** Node.js version string (e.g. `'20.11.0'`), when running on Node. */\n nodeVersion?: string;\n /** Human-readable warnings; empty when fully compatible. */\n warnings: string[];\n}\n\n/** Best-effort runtime detection using well-known globals. */\nfunction detectRuntime(): { runtime: Runtime; nodeVersion?: string } {\n const g = globalThis as Record<string, any>;\n if (typeof g.Deno !== 'undefined') return { runtime: 'deno' };\n if (typeof g.Bun !== 'undefined') return { runtime: 'bun' };\n if (\n typeof g.process !== 'undefined' &&\n g.process?.versions?.node\n ) {\n return { runtime: 'node', nodeVersion: String(g.process.versions.node) };\n }\n // Cloudflare Workers / workerd expose WebSocketPair but no window/process.\n if (typeof g.WebSocketPair !== 'undefined') return { runtime: 'workerd' };\n if (typeof g.window !== 'undefined' || typeof g.document !== 'undefined') {\n return { runtime: 'browser' };\n }\n return { runtime: 'unknown' };\n}\n\n/**\n * Inspect the current runtime and report whether `@ppabari/strio` can perform\n * secure string generation. Never throws.\n *\n * @example\n * import { checkCompatibility } from '@ppabari/strio';\n *\n * const report = checkCompatibility();\n * if (!report.ok) console.warn(report.warnings.join('\\n'));\n */\nexport function checkCompatibility(): CompatibilityResult {\n const warnings: string[] = [];\n const { runtime, nodeVersion } = detectRuntime();\n\n const cryptoAvailable =\n typeof globalThis.crypto !== 'undefined' &&\n typeof globalThis.crypto.getRandomValues === 'function';\n\n if (!cryptoAvailable) {\n warnings.push(\n 'Web Crypto API (crypto.getRandomValues) is unavailable. Secure ' +\n 'generation will fail. On Node.js, upgrade to v18 or newer.'\n );\n }\n\n if (runtime === 'node' && nodeVersion) {\n const major = parseInt(nodeVersion.split('.')[0] ?? '0', 10);\n if (major < MIN_NODE_VERSION) {\n warnings.push(\n `Node.js ${nodeVersion} is below the supported minimum ` +\n `(v${MIN_NODE_VERSION}). Please upgrade.`\n );\n }\n }\n\n return {\n ok: cryptoAvailable && warnings.length === 0,\n cryptoAvailable,\n runtime,\n ...(nodeVersion ? { nodeVersion } : {}),\n warnings,\n };\n}\n\n/**\n * Assert that the current runtime is compatible, throwing a descriptive error\n * otherwise. Call this at startup to fail fast instead of at first use.\n *\n * @throws {Error} when the runtime cannot support secure generation.\n *\n * @example\n * import { assertCompatible } from '@ppabari/strio';\n * assertCompatible(); // throws on an unsupported runtime\n */\nexport function assertCompatible(): void {\n const report = checkCompatibility();\n if (!report.ok) {\n throw new Error(`@ppabari/strio: incompatible runtime.\\n- ${report.warnings.join('\\n- ')}`);\n }\n}\n","/**\n * presets.ts\n * Ready-to-use named presets for common use cases.\n * Each preset is a plain `RandomStringOptions` object — pass it directly\n * to `generateRandomString` or spread it to customise.\n *\n * @example\n * import { generateRandomString, PRESETS } from 'secure-random-string';\n * const token = generateRandomString(PRESETS.TOKEN);\n * const longToken = generateRandomString({ ...PRESETS.TOKEN, length: 64 });\n */\n\nimport type { RandomStringOptions } from './types.js';\n\nexport const PRESETS = {\n /**\n * API token / session key.\n * 32-char alphanumeric (no symbols), readable=false for max entropy.\n * ~190 bits of entropy.\n */\n TOKEN: {\n length: 32,\n numeric: true,\n lowercase: true,\n uppercase: true,\n symbols: false,\n } satisfies RandomStringOptions,\n\n /**\n * Strong password.\n * 20 chars, all character types including symbols.\n * ~131 bits of entropy.\n */\n PASSWORD: {\n length: 20,\n numeric: true,\n lowercase: true,\n uppercase: true,\n symbols: true,\n } satisfies RandomStringOptions,\n\n /**\n * Human-readable token — no ambiguous characters (0/O/l/I/1).\n * Safe to read aloud or transcribe from a screen.\n * 16 chars, ~93 bits of entropy.\n */\n READABLE: {\n length: 16,\n numeric: true,\n lowercase: true,\n uppercase: true,\n symbols: false,\n readable: true,\n } satisfies RandomStringOptions,\n\n /**\n * URL-safe slug identifier.\n * Lowercase letters and digits only, starts with a letter.\n * 12 chars, ~62 bits of entropy.\n */\n SLUG: {\n length: 12,\n numeric: true,\n lowercase: true,\n uppercase: false,\n symbols: false,\n startWith: 'alphabet',\n } satisfies RandomStringOptions,\n\n /**\n * Lowercase hex string.\n * Compatible with UUID hex components, color codes, hash representations.\n * 32 chars (128-bit equivalent), ~128 bits of entropy.\n */\n HEX: {\n length: 32,\n charset: '0123456789abcdef',\n } satisfies RandomStringOptions,\n\n /**\n * Numeric PIN code. 6 digits, starts with a non-zero digit.\n * ~17 bits of entropy — suitable for short-lived OTP codes.\n */\n PIN: {\n length: 6,\n numeric: true,\n lowercase: false,\n uppercase: false,\n symbols: false,\n exclude: '0',\n startWith: 'numeric',\n } satisfies RandomStringOptions,\n\n /**\n * UUID-like string (not RFC 4122 compliant, but same visual format).\n * Uses `pattern` to produce 8-4-4-4-12 hex grouping.\n * ~122 bits of entropy (same as UUIDv4).\n */\n UUID_LIKE: {\n pattern: '\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*-\\\\*\\\\*\\\\*\\\\*-\\\\*\\\\*\\\\*\\\\*-\\\\*\\\\*\\\\*\\\\*-\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*\\\\*',\n charset: '0123456789abcdef',\n } satisfies RandomStringOptions,\n\n /**\n * Short alphanumeric ID — suitable for database record IDs.\n * 8 chars, uppercase alphanumeric, starts with a letter.\n * ~41 bits — good for IDs when combined with a namespace/prefix.\n */\n SHORT_ID: {\n length: 8,\n numeric: true,\n lowercase: false,\n uppercase: true,\n symbols: false,\n startWith: 'alphabet',\n } satisfies RandomStringOptions,\n\n /**\n * Invitation / redemption code.\n * 16 chars, readable (no ambiguous chars), pattern grouped for readability.\n * @example 'KXPZ-9MR2-LQ4Y-8WVN'\n */\n INVITE_CODE: {\n pattern: 'AAAA-AAAA-AAAA-AAAA',\n readable: true,\n } satisfies RandomStringOptions,\n} as const;\n\nexport type PresetName = keyof typeof PRESETS;\n","/**\n * zod.ts\n * Zod schema factory for @ppabari/strio.\n *\n * Creates a `z.string()` schema that validates a string against strio\n * options. The Zod peer dependency is optional — import from the\n * subpath `@ppabari/strio/zod` only when Zod is available.\n *\n * @example\n * import { z } from 'zod';\n * import { randomStringSchema } from '@ppabari/strio/zod';\n *\n * const tokenSchema = randomStringSchema({\n * length: 32,\n * charset: 'base62',\n * });\n *\n * tokenSchema.parse('k3Xp9mQr2LzYw7NvTq8sHfGbJ5cD4eAK'); // ✓\n * tokenSchema.parse('short'); // throws ZodError\n *\n * // In a form schema\n * const UserSchema = z.object({\n * id: randomStringSchema({ length: 12, charset: 'base58' }),\n * apiKey: randomStringSchema({ length: 32 }),\n * });\n */\n\nimport type { ValidateOptions } from './types.js';\nimport { validateRandomString } from './validate.js';\n\n/**\n * Options for building a Zod schema. A superset of ValidateOptions\n * with an extra `description` for the schema's `.describe()` call.\n */\nexport interface RandomStringSchemaOptions extends ValidateOptions {\n /** Optional human-readable description added to the Zod schema. */\n description?: string;\n}\n\n/**\n * A minimal type shim for the parts of Zod we need.\n * Avoids importing Zod at the type level so the module loads even when\n * Zod is not installed — errors only at runtime if you try to call this.\n */\ninterface ZodStringLike {\n refine(\n check: (val: string) => boolean,\n params: { message: string }\n ): ZodStringLike;\n describe(text: string): ZodStringLike;\n}\n\ninterface ZodLike {\n string(): ZodStringLike;\n}\n\n/**\n * Create a Zod string schema that validates against strio's ValidateOptions.\n *\n * @param options - Validation rules (length, charset, required character types, etc.)\n * @param zod - The `z` object from zod. Pass explicitly to avoid a hard dependency.\n *\n * @example\n * import { z } from 'zod';\n * import { randomStringSchema } from '@ppabari/strio/zod';\n *\n * const schema = randomStringSchema({ length: 16, requireUppercase: true }, z);\n */\nexport function randomStringSchema(\n options: RandomStringSchemaOptions = {},\n zod?: ZodLike\n): ZodStringLike {\n // Attempt to auto-import Zod if not provided — works in Node/bundler envs\n // Falls back gracefully with a helpful error if unavailable\n let z: ZodLike;\n\n if (zod) {\n z = zod;\n } else {\n try {\n // Use indirect eval to avoid TypeScript's require type check.\n // This is intentional: zod is an optional peer dependency.\n const req = (typeof globalThis !== 'undefined' &&\n (globalThis as Record<string, unknown>)['require']) as\n | ((id: string) => ZodLike)\n | undefined;\n z = req ? req('zod') : (() => { throw new Error('no require'); })();\n } catch {\n throw new Error(\n '@ppabari/strio: Zod is not installed. Run `npm install zod` or pass the `z` ' +\n 'object explicitly: `randomStringSchema(options, z)`.'\n );\n }\n }\n\n const { description, ...validateOpts } = options;\n\n let schema = z.string().refine(\n (val: string) => {\n const result = validateRandomString(val, validateOpts);\n return result.valid;\n },\n {\n message: buildMessage(validateOpts),\n }\n );\n\n if (description) {\n schema = schema.describe(description);\n }\n\n return schema;\n}\n\nfunction buildMessage(opts: ValidateOptions): string {\n const parts: string[] = [];\n\n if (opts.length !== undefined) parts.push(`exactly ${opts.length} characters`);\n if (opts.minLength !== undefined) parts.push(`at least ${opts.minLength} characters`);\n if (opts.maxLength !== undefined) parts.push(`at most ${opts.maxLength} characters`);\n if (opts.requireNumeric) parts.push('at least one digit');\n if (opts.requireLowercase) parts.push('at least one lowercase letter');\n if (opts.requireUppercase) parts.push('at least one uppercase letter');\n if (opts.requireSymbols) parts.push('at least one symbol');\n if (opts.charset) parts.push(`only characters from '${opts.charset}'`);\n if (opts.pattern) parts.push(`matching pattern '${opts.pattern}'`);\n\n return parts.length > 0\n ? `String must contain ${parts.join(', ')}.`\n : 'Invalid string format.';\n}\n","/**\n * secrets.ts\n * Cryptographic secret and key generation utilities.\n *\n * Covers the full lifecycle of secrets used in real applications:\n * - Raw bytes → generateBytes()\n * - Hex keys (AES, ChaCha20) → generateHexKey()\n * - Base64 keys (cloud imports) → generateBase64Key()\n * - JWT secrets (HS256/384/512) → generateJwtSecret()\n * - Structured API keys → generateApiKey()\n * - Numeric OTP codes → generateOtp()\n * - Secret masking for logs → maskSecret()\n * - Constant-time comparison → timingSafeEqual()\n * - Framework secret helpers → generateCookieSecret() etc.\n *\n * All functions use crypto.getRandomValues() — the same bias-free\n * engine as the rest of strio.\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Fill a Uint8Array with cryptographically secure random bytes. */\nfunction randomBytes(length: number): Uint8Array {\n if (length <= 0 || !Number.isInteger(length)) {\n throw new RangeError(`length must be a positive integer, got ${length}.`);\n }\n const buf = new Uint8Array(length);\n crypto.getRandomValues(buf);\n return buf;\n}\n\n/** Encode a Uint8Array to a lowercase hex string. */\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/** Encode a Uint8Array to standard base64 (with +/= padding). */\nfunction bytesToBase64(bytes: Uint8Array): string {\n // btoa works on binary strings; works in Node 16+ and all browsers\n return btoa(String.fromCharCode(...bytes));\n}\n\n/** Encode a Uint8Array to base64url (RFC 4648 §5 — URL-safe, no padding). */\nfunction bytesToBase64Url(bytes: Uint8Array): string {\n return bytesToBase64(bytes)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 1. generateBytes\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate `n` cryptographically secure random bytes.\n * Returns a `Uint8Array` — the native format accepted by Web Crypto,\n * Node's `crypto`, and virtually every encryption library.\n *\n * @example\n * const key = generateBytes(32); // 32-byte (256-bit) key material\n * await crypto.subtle.importKey('raw', key, 'AES-GCM', false, ['encrypt']);\n *\n * const iv = generateBytes(12); // AES-GCM initialisation vector\n * const nonce = generateBytes(24); // XSalsa20 nonce\n */\nexport function generateBytes(length: number): Uint8Array {\n return randomBytes(length);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 2. generateHexKey\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate a random key of `bits` length, returned as a lowercase hex string.\n * The standard format for raw key material in most Node.js crypto libraries,\n * Redis ACL passwords, database encryption keys, and many cloud services.\n *\n * @param bits - Key size in bits. Must be a positive multiple of 8.\n * Common values: 128, 192, 256 (AES), 512 (HMAC-SHA512).\n *\n * @example\n * generateHexKey(256) // → 64-char hex (AES-256 key)\n * generateHexKey(128) // → 32-char hex (AES-128 key)\n * generateHexKey(512) // → 128-char hex (HMAC-SHA512 key)\n *\n * // Use directly with Node crypto:\n * const key = generateHexKey(256);\n * const cipher = crypto.createCipheriv('aes-256-gcm', Buffer.from(key, 'hex'), iv);\n */\nexport function generateHexKey(bits: number = 256): string {\n if (bits <= 0 || bits % 8 !== 0) {\n throw new RangeError(`bits must be a positive multiple of 8, got ${bits}.`);\n }\n return bytesToHex(randomBytes(bits / 8));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 3. generateBase64Key\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type Base64Variant = 'standard' | 'url-safe' | 'url-safe-no-pad';\n\n/**\n * Generate a random key of `bits` length, returned as a base64 string.\n *\n * Three variants:\n * - `'standard'` — includes `+`, `/`, `=` padding (AWS, most CLIs)\n * - `'url-safe'` — replaces `+`→`-`, `/`→`_`, keeps `=` (cookies, headers)\n * - `'url-safe-no-pad'` — same but no `=` padding (JWT, URL query params)\n *\n * @param bits - Key size in bits. Must be a positive multiple of 8.\n * @param variant - Output encoding variant. Default: `'url-safe-no-pad'`.\n *\n * @example\n * generateBase64Key(256) // → url-safe, no padding (default)\n * generateBase64Key(256, 'standard') // → standard base64 with padding\n * generateBase64Key(256, 'url-safe') // → url-safe with padding\n *\n * // AWS KMS / GCP import format:\n * const keyMaterial = generateBase64Key(256, 'standard');\n *\n * // Cookie signing secret (express-session, iron-session):\n * const secret = generateBase64Key(256, 'url-safe-no-pad');\n */\nexport function generateBase64Key(bits: number = 256, variant: Base64Variant = 'url-safe-no-pad'): string {\n if (bits <= 0 || bits % 8 !== 0) {\n throw new RangeError(`bits must be a positive multiple of 8, got ${bits}.`);\n }\n const bytes = randomBytes(bits / 8);\n\n switch (variant) {\n case 'standard':\n return bytesToBase64(bytes);\n case 'url-safe':\n return bytesToBase64(bytes).replace(/\\+/g, '-').replace(/\\//g, '_');\n case 'url-safe-no-pad':\n return bytesToBase64Url(bytes);\n default:\n throw new TypeError(`Unknown variant '${variant}'. Use 'standard', 'url-safe', or 'url-safe-no-pad'.`);\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 4. generateJwtSecret\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type JwtAlgorithm = 'HS256' | 'HS384' | 'HS512';\nexport type JwtSecretFormat = 'base64url' | 'hex' | 'utf8-like';\n\n/**\n * Minimum key sizes mandated by RFC 7518 §3.2:\n * The key must be at least as long as the hash output.\n */\nconst JWT_MIN_BITS: Record<JwtAlgorithm, number> = {\n HS256: 256,\n HS384: 384,\n HS512: 512,\n};\n\nexport interface JwtSecretOptions {\n /**\n * HMAC algorithm this secret will be used with.\n * Determines the minimum key length enforced automatically.\n * @default 'HS256'\n */\n algorithm?: JwtAlgorithm;\n /**\n * Output format.\n * - `'base64url'` — RFC 4648 §5, no padding. Default. Works with jsonwebtoken,\n * jose, @auth/core, NextAuth, Fastify JWT, Lucia.\n * - `'hex'` — lowercase hex. Works with jose when you import as `'oct'`.\n * - `'utf8-like'` — base62 string. Usable directly as a string secret in older\n * libraries that accept plain strings (not recommended for new code).\n * @default 'base64url'\n */\n format?: JwtSecretFormat;\n /**\n * Override the key size in bits. Must be ≥ the algorithm minimum.\n * Defaults to the algorithm's minimum (256 / 384 / 512).\n */\n bits?: number;\n}\n\nexport interface JwtSecretResult {\n /** The secret value — pass this to your JWT library. */\n secret: string;\n /** Algorithm this secret was generated for. */\n algorithm: JwtAlgorithm;\n /** Actual key size in bits. */\n bits: number;\n /** Output format. */\n format: JwtSecretFormat;\n /**\n * Usage example string for the most common library (jsonwebtoken).\n * Handy for logging/debugging during setup.\n */\n example: string;\n}\n\n/**\n * Generate a cryptographically secure JWT signing secret.\n *\n * Enforces RFC 7518 minimum key lengths:\n * - HS256 → minimum 256 bits (32 bytes)\n * - HS384 → minimum 384 bits (48 bytes)\n * - HS512 → minimum 512 bits (64 bytes)\n *\n * @example\n * // Default — HS256, base64url\n * const { secret } = generateJwtSecret();\n * jwt.sign(payload, secret, { algorithm: 'HS256' });\n *\n * // HS512 for maximum security\n * const { secret } = generateJwtSecret({ algorithm: 'HS512' });\n *\n * // For jose / @auth/core\n * const { secret } = generateJwtSecret({ algorithm: 'HS256', format: 'base64url' });\n * // Set as AUTH_SECRET env var for NextAuth v5\n *\n * // For libraries expecting hex\n * const { secret } = generateJwtSecret({ format: 'hex' });\n */\nexport function generateJwtSecret(options: JwtSecretOptions = {}): JwtSecretResult {\n const {\n algorithm = 'HS256',\n format = 'base64url',\n bits: bitsOverride,\n } = options;\n\n const minBits = JWT_MIN_BITS[algorithm];\n\n if (!minBits) {\n throw new TypeError(\n `Unknown algorithm '${algorithm}'. Supported: ${Object.keys(JWT_MIN_BITS).join(', ')}.`\n );\n }\n\n if (bitsOverride !== undefined && bitsOverride < minBits) {\n throw new RangeError(\n `${algorithm} requires at least ${minBits} bits. Got ${bitsOverride}. ` +\n `Use bits >= ${minBits} or omit the bits option.`\n );\n }\n\n const bits = bitsOverride ?? minBits;\n\n if (bits % 8 !== 0) {\n throw new RangeError(`bits must be a multiple of 8, got ${bits}.`);\n }\n\n const bytes = randomBytes(bits / 8);\n let secret: string;\n\n switch (format) {\n case 'base64url':\n secret = bytesToBase64Url(bytes);\n break;\n case 'hex':\n secret = bytesToHex(bytes);\n break;\n case 'utf8-like': {\n // Produce a base62 string of equivalent length — readable but high entropy\n const B62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n // Re-draw using crypto (simpler than reusing bytes with bias correction here)\n const charsNeeded = Math.ceil(bits / Math.log2(62));\n const resultChars: string[] = [];\n const maxValid = 256 - (256 % 62);\n const drawBuf = new Uint8Array(charsNeeded * 2); // over-allocate\n crypto.getRandomValues(drawBuf);\n for (const b of drawBuf) {\n if (b < maxValid) {\n resultChars.push(B62[b % 62]!);\n if (resultChars.length >= charsNeeded) break;\n }\n }\n secret = resultChars.join('');\n break;\n }\n default:\n throw new TypeError(`Unknown format '${format}'.`);\n }\n\n const example = format === 'base64url'\n ? `jwt.sign(payload, '${secret.slice(0, 8)}...', { algorithm: '${algorithm}' })`\n : `jwt.sign(payload, Buffer.from('${secret.slice(0, 8)}...', '${format === 'hex' ? 'hex' : 'utf8'}'), { algorithm: '${algorithm}' })`;\n\n return { secret, algorithm, bits, format, example };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 5. generateApiKey\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ApiKeyOptions {\n /**\n * Key type prefix, e.g. `'sk'` (secret key), `'pk'` (public key), `'tok'`.\n * @default 'sk'\n */\n type?: string;\n /**\n * Environment prefix, e.g. `'live'`, `'test'`, `'dev'`.\n * Omit to produce a key with no environment segment.\n */\n environment?: 'live' | 'test' | 'dev' | string;\n /**\n * Entropy of the random portion in bits.\n * @default 256\n */\n bits?: number;\n /**\n * Charset for the random portion.\n * @default 'base62'\n */\n charset?: 'base62' | 'base58' | 'hex' | string;\n /**\n * Separator between segments.\n * @default '_'\n */\n separator?: string;\n}\n\nexport interface ApiKeyResult {\n /** The full API key string. */\n key: string;\n /** The prefix segment, e.g. `'sk_live'`. */\n prefix: string;\n /** Character count of the random portion (not including prefix or separator). */\n randomLength: number;\n /** Entropy of the random portion in bits. */\n bits: number;\n}\n\n/**\n * Generate a structured API key in the style of Stripe, GitHub, or OpenAI.\n *\n * Format: `{type}_{environment}_{randomPortion}`\n * e.g. `strio_live_K3xP9mQr2LzYw7NvTq8sHfGbJ5cD4eAK3xP9mQr2LzY`\n *\n * @example\n * generateApiKey()\n * // → { key: 'strio_live_K3xP9mQr2LzYw7Nv...', prefix: 'sk_live', ... }\n *\n * generateApiKey({ type: 'sk', environment: 'test', bits: 256 })\n * // → 'strio_test_K3xP9mQr...'\n *\n * generateApiKey({ type: 'tok', bits: 128 })\n * // → 'tok_K3xP9mQr2LzYw7Nv'\n *\n * generateApiKey({ type: 'pk', environment: 'live', charset: 'hex' })\n * // → 'pub_live_a3f7c2b9...'\n */\nexport function generateApiKey(options: ApiKeyOptions = {}): ApiKeyResult {\n const {\n type = 'sk',\n environment,\n bits = 256,\n charset = 'base62',\n separator = '_',\n } = options;\n\n if (bits <= 0 || bits % 8 !== 0) {\n throw new RangeError(`bits must be a positive multiple of 8, got ${bits}.`);\n }\n\n // Resolve charset\n const CHARSETS: Record<string, string> = {\n base62: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n base58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',\n hex: '0123456789abcdef',\n };\n const cs = CHARSETS[charset] ?? charset;\n\n if (cs.length < 2) throw new TypeError(`charset '${charset}' resolves to fewer than 2 unique characters.`);\n\n // Calculate how many characters we need for the requested entropy\n const charsNeeded = Math.ceil(bits / Math.log2(cs.length));\n const maxValid = 256 - (256 % cs.length);\n\n // Draw characters with rejection sampling\n const randomChars: string[] = [];\n const buf = new Uint8Array(charsNeeded * 2 + 64); // generous over-allocation\n while (randomChars.length < charsNeeded) {\n crypto.getRandomValues(buf);\n for (const b of buf) {\n if (b < maxValid) {\n randomChars.push(cs[b % cs.length]!);\n if (randomChars.length >= charsNeeded) break;\n }\n }\n }\n const randomPortion = randomChars.join('');\n\n const prefixParts = [type, environment].filter(Boolean);\n const prefix = prefixParts.join(separator);\n const key = prefix + separator + randomPortion;\n\n return { key, prefix, randomLength: charsNeeded, bits };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 6. generateOtp\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface OtpOptions {\n /**\n * Number of digits in the OTP.\n * @default 6\n */\n digits?: number;\n /**\n * Whether to allow a leading zero.\n * Set to `false` to ensure the first digit is 1–9 (e.g. for display in SMS).\n * @default true\n */\n allowLeadingZero?: boolean;\n}\n\nexport interface OtpResult {\n /** The OTP as a zero-padded string (e.g. `'048392'`). */\n code: string;\n /** The OTP as a number (e.g. `48392`). */\n value: number;\n /** Number of digits. */\n digits: number;\n}\n\n/**\n * Generate a cryptographically secure numeric OTP (one-time password).\n * Uses modular arithmetic on a secure random integer — no modulo bias\n * for digit counts up to 9 (10^9 < 2^30 < 2^32, safe in float64).\n *\n * @example\n * generateOtp() // → { code: '483920', value: 483920, digits: 6 }\n * generateOtp({ digits: 8 }) // → { code: '04839201', value: 4839201, digits: 8 }\n *\n * // SMS-friendly (no leading zero)\n * generateOtp({ allowLeadingZero: false })\n *\n * // Use just the code string\n * const { code } = generateOtp();\n * await sms.send(phone, `Your code is ${code}`);\n */\nexport function generateOtp(options: OtpOptions = {}): OtpResult {\n const { digits = 6, allowLeadingZero = true } = options;\n\n if (digits < 1 || digits > 10) {\n throw new RangeError(`digits must be between 1 and 10, got ${digits}.`);\n }\n\n const max = Math.pow(10, digits);\n\n // Use float64 division to avoid 32-bit overflow.\n // digits <= 9: max <= 10^9 < 2^32 — single 32-bit sample is sufficient.\n // digits == 10: max = 10^10 > 2^32 — use 5 bytes (40 bits, 2^40 > 10^10).\n let n: number;\n\n if (digits <= 9) {\n const maxValid = Math.floor(4294967296 / max) * max; // float64, no overflow\n const buf = new Uint8Array(4);\n do {\n crypto.getRandomValues(buf);\n n = ((buf[0]! << 24) | (buf[1]! << 16) | (buf[2]! << 8) | buf[3]!) >>> 0;\n } while (n >= maxValid);\n } else {\n // digits === 10: 2^40 = 1_099_511_627_776 > 10_000_000_000\n const RANGE40 = 1099511627776;\n const maxValid40 = Math.floor(RANGE40 / max) * max;\n const buf = new Uint8Array(5);\n do {\n crypto.getRandomValues(buf);\n n = buf[0]! * 4294967296 +\n (((buf[1]! << 24) | (buf[2]! << 16) | (buf[3]! << 8) | buf[4]!) >>> 0);\n } while (n >= maxValid40);\n }\n\n let value = n % max;\n\n // If leading zeros are not allowed, re-draw until first digit is non-zero.\n // Much simpler and provably unbiased — rejection probability ≤ 1/10 per draw.\n if (!allowLeadingZero && digits > 1) {\n const minValue = Math.pow(10, digits - 1); // e.g. 100000 for 6 digits\n // Re-use the same sampling path to draw a fresh value in [minValue, max)\n if (value < minValue) {\n const range = max - minValue; // e.g. 900000 for 6 digits\n if (digits <= 9) {\n const maxValid = Math.floor(4294967296 / range) * range;\n const buf2 = new Uint8Array(4);\n let m: number;\n do {\n crypto.getRandomValues(buf2);\n m = ((buf2[0]! << 24) | (buf2[1]! << 16) | (buf2[2]! << 8) | buf2[3]!) >>> 0;\n } while (m >= maxValid);\n value = minValue + (m % range);\n } else {\n const RANGE40 = 1099511627776;\n const maxValid40 = Math.floor(RANGE40 / range) * range;\n const buf2 = new Uint8Array(5);\n let m: number;\n do {\n crypto.getRandomValues(buf2);\n m = buf2[0]! * 4294967296 +\n (((buf2[1]! << 24) | (buf2[2]! << 16) | (buf2[3]! << 8) | buf2[4]!) >>> 0);\n } while (m >= maxValid40);\n value = minValue + (m % range);\n }\n }\n }\n\n const code = value.toString().padStart(digits, '0');\n\n return { code, value, digits };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 7. maskSecret\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface MaskSecretOptions {\n /**\n * Number of characters to reveal at the start of the secret.\n * `0` reveals nothing (prefix only).\n * @default 0 (show prefix only, mask everything else)\n */\n visibleStart?: number;\n /**\n * Number of characters to reveal at the end.\n * @default 4\n */\n visibleEnd?: number;\n /**\n * Character used to mask the hidden portion.\n * @default '*'\n */\n maskChar?: string;\n /**\n * Minimum number of mask characters shown, regardless of secret length.\n * Prevents inferring length from short secrets.\n * @default 4\n */\n minMaskLength?: number;\n /**\n * Maximum mask characters shown (caps a very long mask).\n * @default 8\n */\n maxMaskLength?: number;\n /**\n * Known prefix segments to preserve literally before masking begins.\n * e.g. `['strio_live_', 'strio_test_']` — the prefix is kept, the rest is masked.\n * If the secret starts with one of these, the prefix is shown and\n * `visibleStart` is counted from after the prefix.\n */\n knownPrefixes?: string[];\n}\n\n/**\n * Mask a secret string for safe logging, display, or debugging.\n * Preserves enough context to identify the key without exposing it.\n *\n * @example\n * maskSecret('myapp_live_K3xP9mQr2LzYw7NvTq8sHfGb')\n * // → 'strio_live_****...w7Nv' (auto-detects 'strio_live_' prefix)\n *\n * maskSecret('supersecretpassword')\n * // → '****...word'\n *\n * maskSecret('eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIn0.abc123')\n * // → '****...123'\n *\n * // Custom reveal\n * maskSecret('myapp_live_K3xP9mQr2LzY', { visibleEnd: 6 })\n * // → 'strio_live_****...LzY'\n */\nexport function maskSecret(secret: string, options: MaskSecretOptions = {}): string {\n if (!secret) return '';\n\n const {\n visibleStart = 0,\n visibleEnd = 4,\n maskChar = '*',\n minMaskLength = 4,\n maxMaskLength = 8,\n knownPrefixes = [\n 'strio_live_', 'strio_test_', 'strio_dev_',\n 'myapp_live_', 'myapp_test_', 'myapp_dev_',\n 'tok_', 'api_', 'key_',\n ],\n } = options;\n\n let prefix = '';\n let payload = secret;\n\n // Check for known prefixes\n for (const kp of knownPrefixes) {\n if (secret.startsWith(kp)) {\n prefix = kp;\n payload = secret.slice(kp.length);\n break;\n }\n }\n\n const totalLen = payload.length;\n const showStart = Math.min(visibleStart, totalLen);\n const showEnd = Math.min(visibleEnd, totalLen - showStart);\n const hiddenLen = totalLen - showStart - showEnd;\n\n if (hiddenLen <= 0) {\n // Secret too short to meaningfully mask — show prefix + full mask\n return prefix + maskChar.repeat(minMaskLength);\n }\n\n const maskLen = Math.max(minMaskLength, Math.min(maxMaskLength, hiddenLen));\n const mask = maskChar.repeat(maskLen);\n\n const startPart = showStart > 0 ? payload.slice(0, showStart) : '';\n const endPart = showEnd > 0 ? payload.slice(totalLen - showEnd) : '';\n\n return `${prefix}${startPart}${mask}...${endPart}`;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 8. timingSafeEqual\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Compare two strings or byte arrays in constant time.\n * Prevents timing attacks where an attacker infers secret content by\n * measuring how long a comparison takes.\n *\n * **Always use this instead of `===` when comparing tokens, secrets,\n * HMAC signatures, or any security-sensitive value.**\n *\n * The comparison time is proportional to `max(a.length, b.length)` —\n * it does not short-circuit on mismatch.\n *\n * @returns `true` if the values are identical, `false` otherwise.\n *\n * @example\n * // Comparing incoming token against stored token\n * if (!timingSafeEqual(incomingToken, storedToken)) {\n * throw new Error('Invalid token');\n * }\n *\n * // Also works with Uint8Array (e.g. HMAC comparison)\n * const valid = timingSafeEqual(computedHmac, expectedHmac);\n */\nexport function timingSafeEqual(\n a: string | Uint8Array,\n b: string | Uint8Array\n): boolean {\n // Normalise to Uint8Array using UTF-8 encoding for strings\n const encoder = new TextEncoder();\n const bufA: Uint8Array = typeof a === 'string' ? encoder.encode(a) : a;\n const bufB: Uint8Array = typeof b === 'string' ? encoder.encode(b) : b;\n\n const len = Math.max(bufA.length, bufB.length);\n\n // Pad both to equal length to prevent length-based timing leaks\n const padA = new Uint8Array(len);\n const padB = new Uint8Array(len);\n padA.set(bufA);\n padB.set(bufB);\n\n // XOR every byte — accumulate differences with OR\n let diff = bufA.length === bufB.length ? 0 : 1; // length mismatch = fail\n for (let i = 0; i < len; i++) {\n diff |= (padA[i]! ^ padB[i]!);\n }\n\n return diff === 0;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 9. Framework-specific convenience helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate a cookie signing secret for session libraries.\n *\n * Compatible with:\n * - express-session (`secret` option)\n * - iron-session (`password` option)\n * - lucia (`sessionCookieOptions.password`)\n * - cookie-signature\n *\n * Returns a 256-bit base64url string by default — long enough to resist\n * brute force while remaining pasteable in .env files.\n *\n * @example\n * // express-session\n * app.use(session({ secret: generateCookieSecret() }));\n *\n * // iron-session\n * const sessionOptions = { password: generateCookieSecret(), cookieName: 'session' };\n *\n * // .env usage\n * console.log(`COOKIE_SECRET=\"${generateCookieSecret()}\"`);\n */\nexport function generateCookieSecret(bits: number = 256): string {\n if (bits < 128) throw new RangeError('Cookie secret should be at least 128 bits.');\n return generateBase64Key(bits, 'url-safe-no-pad');\n}\n\n/**\n * Generate an encryption key suitable for AES-GCM or AES-CBC.\n *\n * @param keySize - `128`, `192`, or `256` bits. Default: 256.\n * @param format - `'hex'` (default) or `'base64'` or `'bytes'`.\n *\n * @example\n * generateAesKey() // → 64-char hex (AES-256)\n * generateAesKey(128) // → 32-char hex (AES-128)\n * generateAesKey(256, 'base64') // → base64url string\n * generateAesKey(256, 'bytes') // → Uint8Array\n */\nexport function generateAesKey(keySize: 128 | 192 | 256 = 256, format: 'hex' | 'base64' | 'bytes' = 'hex'): string | Uint8Array {\n const bytes = randomBytes(keySize / 8);\n if (format === 'bytes') return bytes;\n if (format === 'hex') return bytesToHex(bytes);\n return bytesToBase64Url(bytes);\n}\n\n/**\n * Generate a secret for Next.js / NextAuth / Auth.js.\n * Sets AUTH_SECRET in your .env file — used to sign JWTs and cookies.\n * Output matches what `npx auth secret` generates.\n *\n * @example\n * const secret = generateNextAuthSecret();\n * console.log(`AUTH_SECRET=\"${secret}\"`);\n */\nexport function generateNextAuthSecret(): string {\n return generateBase64Key(256, 'url-safe-no-pad');\n}\n\n/**\n * Generate a Django SECRET_KEY compatible string.\n * Django expects a long random string of printable ASCII characters —\n * at least 50 characters, no restrictions beyond that.\n *\n * @example\n * const key = generateDjangoSecretKey();\n * console.log(`SECRET_KEY=\"${key}\"`);\n */\nexport function generateDjangoSecretKey(): string {\n // Django uses a broad ASCII charset in its own generator\n const DJANGO_CHARS =\n 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n const length = 64; // matches Django's default\n const maxValid = 256 - (256 % DJANGO_CHARS.length);\n const chars: string[] = [];\n const buf = new Uint8Array(length * 2);\n while (chars.length < length) {\n crypto.getRandomValues(buf);\n for (const b of buf) {\n if (b < maxValid) {\n chars.push(DJANGO_CHARS[b % DJANGO_CHARS.length]!);\n if (chars.length >= length) break;\n }\n }\n }\n return chars.join('');\n}\n\n/**\n * Generate a Rails / rack secret_key_base compatible string.\n * Rails expects a 128+ character hex string for its key base.\n *\n * @example\n * const key = generateRailsSecretKeyBase();\n * console.log(`SECRET_KEY_BASE=\"${key}\"`);\n */\nexport function generateRailsSecretKeyBase(): string {\n return generateHexKey(512); // 128-char hex = 512-bit key\n}\n","/**\n * @ppabari/strio\n *\n * Cryptographically secure string generation for Node.js and browsers.\n * Zero dependencies. Fully typed. Bias-free.\n */\n\nimport type { RandomStringOptions } from './types.js';\nimport { generateOne, generateBatch } from './generator.js';\n\nexport function generateRandomString(options?: RandomStringOptions & { count?: 1 }): string;\nexport function generateRandomString(options: RandomStringOptions & { count: number }): string[];\nexport function generateRandomString(options: RandomStringOptions = {}): string | string[] {\n const { count = 1, ...rest } = options;\n if (count === 1) return generateOne(rest);\n return generateBatch(rest, count);\n}\n\nexport async function generateRandomStringAsync(\n options: RandomStringOptions = {}\n): Promise<string | string[]> {\n await Promise.resolve();\n const { count = 1, ...rest } = options;\n if (count === 1) return generateOne(rest);\n return generateBatch(rest, count);\n}\n\nexport {\n generateId,\n validateId,\n type ShortIdOptions,\n type ShortIdValidateOptions,\n type ShortIdValidateResult,\n} from './short-id.js';\n\nexport {\n generateExpiringToken,\n verifyToken,\n type ExpiringTokenOptions,\n type ExpiringTokenResult,\n type TokenVerifyResult,\n} from './expiring-token.js';\n\nexport {\n randomStringStream,\n uniqueRandomStringStream,\n take,\n takeWhere,\n} from './stream.js';\n\nexport {\n generatePassphrase,\n BUILT_IN_WORD_LIST,\n type PassphraseOptions,\n type PassphraseResult,\n} from './passphrase.js';\n\nexport { estimateEntropy } from './entropy.js';\nexport { validateRandomString } from './validate.js';\n\nexport {\n checkCompatibility,\n assertCompatible,\n MIN_NODE_VERSION,\n type CompatibilityResult,\n type Runtime,\n} from './compat.js';\n\nexport {\n CHARSET_ALIASES,\n resolveCharsetAlias,\n type CharsetAlias,\n} from './charset-aliases.js';\n\nexport { PRESETS, type PresetName } from './presets.js';\n\nexport {\n randomStringSchema,\n type RandomStringSchemaOptions,\n} from './zod.js';\n\nexport type {\n RandomStringOptions,\n RandomStringResult,\n StartWith,\n ValidateOptions,\n ValidationResult,\n EntropyResult,\n} from './types.js';\n// ---------------------------------------------------------------------------\n// Secrets & key generation\n// ---------------------------------------------------------------------------\nexport {\n generateBytes,\n generateHexKey,\n generateBase64Key,\n generateJwtSecret,\n generateApiKey,\n generateOtp,\n maskSecret,\n timingSafeEqual,\n generateCookieSecret,\n generateAesKey,\n generateNextAuthSecret,\n generateDjangoSecretKey,\n generateRailsSecretKeyBase,\n type Base64Variant,\n type JwtAlgorithm,\n type JwtSecretFormat,\n type JwtSecretOptions,\n type JwtSecretResult,\n type ApiKeyOptions,\n type ApiKeyResult,\n type OtpOptions,\n type OtpResult,\n type MaskSecretOptions,\n} from './secrets.js';\n"]}