{"_id":"@bernierllc/validators-secret-patterns","_rev":"8-0a92040c60d24a0f2589bcbb3cc76045","name":"@bernierllc/validators-secret-patterns","dist-tags":{"latest":"1.6.0"},"versions":{"1.0.1":{"name":"@bernierllc/validators-secret-patterns","version":"1.0.1","keywords":["validator","security","secrets","api-keys","credentials","password","jwt","private-key","entropy","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-secret-patterns@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"7e25fd43000ecf38e5255882427ca709c9184df3","tarball":"https://registry.npmjs.org/@bernierllc/validators-secret-patterns/-/validators-secret-patterns-1.0.1.tgz","fileCount":26,"integrity":"sha512-6wRBraUA+4aL7I8o8u/cEUDA+rS5WivEbp703Ec7QDBQgBo9XnRxDBOzEJLiNjMQ0kM44Nn6luU5PL5sMB7Xwg==","signatures":[{"sig":"MEUCIQCBT2zjhTTKH2Te9Zd322yPWrbSuxzrU2g6frkDfclYwgIgRD6vAft4ZY7J+P3e6W1/f/mRNecn1DYLp1Djn4sNo5U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68698},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"f9ccf2f6718f7a906d6aa4ef724aaf085a00a6ba","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && rm -rf dist/__tests__"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_npmVersion":"11.4.2","description":"Primitive validator for detecting hardcoded secrets and sensitive patterns in code","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@bernierllc/validators-core":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-secret-patterns_1.0.1_1760030206193_0.8163743742960548","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bernierllc/validators-secret-patterns","version":"1.0.2","keywords":["validator","security","secrets","api-keys","credentials","password","jwt","private-key","entropy","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-secret-patterns@1.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"7f0758e50656ac87ff9710e654a9a31a1a5ed0ac","tarball":"https://registry.npmjs.org/@bernierllc/validators-secret-patterns/-/validators-secret-patterns-1.0.2.tgz","fileCount":26,"integrity":"sha512-YkkLntUZzx8azH8T+zq8RoAgSesY7EhEDLH+dQl9FQ5yD6FrcT1SNqSLfSqAh4aNaVdsYlo5EZBjBFmRB/SnKA==","signatures":[{"sig":"MEUCIQDdlBz8qdTkW1GZMzg9USmpWIYxiaRgfiWL4baojCnNswIgWOGv1BdNwk0QqviRVMulgPrGW2SxsHGIm1YispC491E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68698},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"a78b3ebd275f433ca2e8a90e762485da1bcc7b2e","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && rm -rf dist/__tests__"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_npmVersion":"11.4.2","description":"Primitive validator for detecting hardcoded secrets and sensitive patterns in code","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@bernierllc/validators-core":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-secret-patterns_1.0.2_1760030405477_0.3672725501549603","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/validators-secret-patterns","version":"1.2.0","keywords":["validator","security","secrets","api-keys","credentials","password","jwt","private-key","entropy","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-secret-patterns@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"d1bcbc72b39dda1d34dc1977ebbbe42909e3260a","tarball":"https://registry.npmjs.org/@bernierllc/validators-secret-patterns/-/validators-secret-patterns-1.2.0.tgz","fileCount":26,"integrity":"sha512-NOWlkk3dLRPKoG9Vxufnzu49HiL0wAgNNZxee18Is9bx6tknZUNwSmVVDzW4cG2RkElQCvEWFTpyfo+vpKrU+g==","signatures":[{"sig":"MEUCIFGj2daYvPvjbrbNWsrNWccvLPgLwW926MHxcMCIxHyhAiEA+HNgwMwCsAn8m5qmoXl7POqaDdPrKnk5hGSwesluhhw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68801},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && rm -rf dist/__tests__"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73385d6d-8b2e-4414-a5a5-d5facd835e7a"}},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Primitive validator for detecting hardcoded secrets and sensitive patterns in code","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@bernierllc/validators-core":"0.1.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-secret-patterns_1.2.0_1767642375288_0.058326170248494735","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@bernierllc/validators-secret-patterns","version":"1.2.1","keywords":["validator","security","secrets","api-keys","credentials","password","jwt","private-key","entropy","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-secret-patterns@1.2.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"66828412cc4082c1f9413275c4da752220361f0c","tarball":"https://registry.npmjs.org/@bernierllc/validators-secret-patterns/-/validators-secret-patterns-1.2.1.tgz","fileCount":26,"integrity":"sha512-cIOg7K8tfNZvHpB4F3l/CKml6iAaOi1TIH8fPEKjG2S8ByUVrDnlZbGKxJvgWkneC4iV0d+36sxNa/Qf8Z0Y2g==","signatures":[{"sig":"MEYCIQCifPyppVTyv/NQPLKlxUKPzi++nB/kvCPowWHgTxm/3gIhAJ81QFFgmZ2D2bQecaREJ6OlyA9FCEEQ1xcRPd3FulIC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68662},"main":"dist/index.js","type":"module","_from":"file:bernierllc-validators-secret-patterns-1.2.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73385d6d-8b2e-4414-a5a5-d5facd835e7a"}},"_resolved":"/tmp/a60f6910cd8a6f205d97cf85cc31576e/bernierllc-validators-secret-patterns-1.2.1.tgz","_integrity":"sha512-cIOg7K8tfNZvHpB4F3l/CKml6iAaOi1TIH8fPEKjG2S8ByUVrDnlZbGKxJvgWkneC4iV0d+36sxNa/Qf8Z0Y2g==","_npmVersion":"11.11.0","description":"Primitive validator for detecting hardcoded secrets and sensitive patterns in code","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@bernierllc/validators-core":"0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-secret-patterns_1.2.1_1773078328178_0.48592340674478995","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@bernierllc/validators-secret-patterns","version":"1.2.2","keywords":["validator","security","secrets","api-keys","credentials","password","jwt","private-key","entropy","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-secret-patterns@1.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"6ce6a549e96fb2ddd9e0f4e631dd1748586afcb5","tarball":"https://registry.npmjs.org/@bernierllc/validators-secret-patterns/-/validators-secret-patterns-1.2.2.tgz","fileCount":26,"integrity":"sha512-UDiHR2XAFs+BlQZpH8LavpMnUcz3WQdVDpz7DvxmW4gdii1En8rSYNFeU7/7gywr4P8YV1d7ByDbrTpvlyM8gQ==","signatures":[{"sig":"MEUCIQCtZEiCS00foOmIxS/HcZ/VoNkzIaEJ2Yxl/Sh3XYuqigIgJrqHdK7tn/9bcvReJEqxjAMh9oxwU4RoUWh7zcWodtA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68662},"main":"dist/index.js","type":"module","_from":"file:bernierllc-validators-secret-patterns-1.2.2.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73385d6d-8b2e-4414-a5a5-d5facd835e7a"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-secret-patterns/bernierllc-validators-secret-patterns-1.2.2.tgz","_integrity":"sha512-UDiHR2XAFs+BlQZpH8LavpMnUcz3WQdVDpz7DvxmW4gdii1En8rSYNFeU7/7gywr4P8YV1d7ByDbrTpvlyM8gQ==","_npmVersion":"11.11.0","description":"Primitive validator for detecting hardcoded secrets and sensitive patterns in code","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@bernierllc/validators-core":"0.1.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-secret-patterns_1.2.2_1773163985437_0.011428619338675006","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/validators-secret-patterns","version":"1.3.0","keywords":["validator","security","secrets","api-keys","credentials","password","jwt","private-key","entropy","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-secret-patterns@1.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"cdcc8280b9699b0cbc4f89c62ad5300bb050ef64","tarball":"https://registry.npmjs.org/@bernierllc/validators-secret-patterns/-/validators-secret-patterns-1.3.0.tgz","fileCount":26,"integrity":"sha512-gCi/QCvXpofCHMVa4rUHzv7cSgrCzy88ORsTPsssmHSWKW7s0z1EGMNoDLZJnrY6Ok47E8eiqMhToWdEiex5qw==","signatures":[{"sig":"MEYCIQCM/5Dkg9AQN7admC+HuJx6Orv7rtiGcew3ke82QvBHHAIhAJVBRRLn9G7UVAt8DoB2pHtDJRm9m1AXDrZY0pCBg7LC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68662},"main":"dist/index.js","type":"module","_from":"file:bernierllc-validators-secret-patterns-1.3.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73385d6d-8b2e-4414-a5a5-d5facd835e7a"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-secret-patterns/bernierllc-validators-secret-patterns-1.3.0.tgz","_integrity":"sha512-gCi/QCvXpofCHMVa4rUHzv7cSgrCzy88ORsTPsssmHSWKW7s0z1EGMNoDLZJnrY6Ok47E8eiqMhToWdEiex5qw==","_npmVersion":"11.14.1","description":"Primitive validator for detecting hardcoded secrets and sensitive patterns in code","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/validators-core":"0.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-secret-patterns_1.3.0_1779242220808_0.9160323822765946","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/validators-secret-patterns","version":"1.4.0","keywords":["validator","security","secrets","api-keys","credentials","password","jwt","private-key","entropy","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-secret-patterns@1.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"1df35741b1301cc48904ac203d4ca7418def8c31","tarball":"https://registry.npmjs.org/@bernierllc/validators-secret-patterns/-/validators-secret-patterns-1.4.0.tgz","fileCount":26,"integrity":"sha512-I5AXqbd0OPZZ+NhgA3pNsVSS15GKF0CRLg4zblcNwKEPGw6QCD1SnXKQKKJz94eTEPUmwzaHeBLtMnAmY9i8ng==","signatures":[{"sig":"MEUCIQCvk685oENzkrMY6PB3p2QZ3+uwfw4UuUIMYeCiMbhr1AIgKp9HyT67usVtZ+xcxcqVAKoTUGQgWTQy7csAU+9wwSg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68662},"main":"dist/index.js","type":"module","_from":"file:bernierllc-validators-secret-patterns-1.4.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73385d6d-8b2e-4414-a5a5-d5facd835e7a"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-secret-patterns/bernierllc-validators-secret-patterns-1.4.0.tgz","_integrity":"sha512-I5AXqbd0OPZZ+NhgA3pNsVSS15GKF0CRLg4zblcNwKEPGw6QCD1SnXKQKKJz94eTEPUmwzaHeBLtMnAmY9i8ng==","_npmVersion":"11.14.1","description":"Primitive validator for detecting hardcoded secrets and sensitive patterns in code","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/validators-core":"0.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-secret-patterns_1.4.0_1779250975967_0.18087470009123008","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@bernierllc/validators-secret-patterns","version":"1.6.0","description":"Primitive validator for detecting hardcoded secrets and sensitive patterns in code","main":"dist/index.js","types":"dist/index.d.ts","type":"module","keywords":["validator","security","secrets","api-keys","credentials","password","jwt","private-key","entropy","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","dependencies":{"@bernierllc/validators-core":"0.4.0"},"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","clean":"rm -rf dist","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"eslint src --ext .ts"},"_id":"@bernierllc/validators-secret-patterns@1.6.0","_integrity":"sha512-ez9CMo29TTOpatVvAB2W7posaLxJ6+7Ml95DvpijqIvYZuX3LZZNSZn5LNuf7zRCdLd23goc37dZSPmQSG4LIw==","_resolved":"/home/runner/work/tools/tools/packages/validators/validators-secret-patterns/bernierllc-validators-secret-patterns-1.6.0.tgz","_from":"file:bernierllc-validators-secret-patterns-1.6.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-ez9CMo29TTOpatVvAB2W7posaLxJ6+7Ml95DvpijqIvYZuX3LZZNSZn5LNuf7zRCdLd23goc37dZSPmQSG4LIw==","shasum":"494f8f8ec858fa1c169d65a538bc07ef1fe5fc29","tarball":"https://registry.npmjs.org/@bernierllc/validators-secret-patterns/-/validators-secret-patterns-1.6.0.tgz","fileCount":29,"unpackedSize":70859,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBEdgleOjeE7rw+KkVxO5dHKpLkZ5MWMfLb5AArMituFAiEApRfKFHk7RL97FhYVX2nsOtcJ2FHG6MNIY36g5jtE3Xw="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73385d6d-8b2e-4414-a5a5-d5facd835e7a"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/validators-secret-patterns_1.6.0_1779252263051_0.295916119708024"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-09T17:16:46.083Z","modified":"2026-05-20T04:44:23.324Z","1.0.1":"2025-10-09T17:16:46.414Z","1.0.2":"2025-10-09T17:20:05.668Z","1.2.0":"2026-01-05T19:46:15.427Z","1.2.1":"2026-03-09T17:45:28.317Z","1.2.2":"2026-03-10T17:33:05.592Z","1.3.0":"2026-05-20T01:57:00.998Z","1.4.0":"2026-05-20T04:22:56.103Z","1.6.0":"2026-05-20T04:44:23.184Z"},"author":{"name":"Bernier LLC"},"license":"UNLICENSED","keywords":["validator","security","secrets","api-keys","credentials","password","jwt","private-key","entropy","primitive"],"description":"Primitive validator for detecting hardcoded secrets and sensitive patterns in code","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/validators-secret-patterns\n\nPrimitive validator for detecting hardcoded secrets and sensitive patterns in code - API keys, tokens, passwords, private keys, database credentials, and high-entropy strings.\n\n## Installation\n\n```bash\nnpm install @bernierllc/validators-secret-patterns\n```\n\n## Features\n\n- **API Key Detection** - AWS, GitHub, Google, Stripe, SendGrid, Twilio, Slack, NPM, and more\n- **High-Entropy String Detection** - Identifies potential secrets based on entropy analysis\n- **JWT Token Detection** - Detects hardcoded JSON Web Tokens\n- **Private Key Detection** - RSA, SSH, PGP, EC, OpenSSH, and other private key formats\n- **Password Pattern Detection** - Identifies hardcoded passwords in various formats\n- **Database Connection Strings** - PostgreSQL, MySQL, MongoDB, Redis, SQL Server, Oracle\n- **Custom Pattern Support** - Add your own secret detection patterns\n- **Configurable Detection** - Enable/disable specific checks as needed\n- **High-Precision Matching** - Minimizes false positives with smart filtering\n\n## Usage\n\n### Basic Validation\n\n```typescript\nimport { validateSecretPatterns } from '@bernierllc/validators-secret-patterns';\n\nconst code = `\n  const awsKey = \"AKIAIOSFODNN7EXAMPLE\";\n  const password = \"MySecretP@ssw0rd123\";\n`;\n\nconst problems = await validateSecretPatterns(code);\n\nif (problems.length > 0) {\n  problems.forEach(problem => {\n    console.log(`${problem.severity}: ${problem.message}`);\n    console.log(`  at line ${problem.location?.line}, column ${problem.location?.column}`);\n  });\n}\n```\n\n### With Custom Options\n\n```typescript\nimport { validateSecretPatterns } from '@bernierllc/validators-secret-patterns';\n\nconst problems = await validateSecretPatterns(sourceCode, {\n  // Entropy detection settings\n  minEntropyScore: 4.5,      // Higher = stricter (0-8 scale)\n  minEntropyLength: 20,       // Minimum length for entropy analysis\n\n  // Enable/disable specific checks\n  checkApiKeys: true,\n  checkEntropy: true,\n  checkJwtTokens: true,\n  checkPrivateKeys: true,\n  checkPasswords: true,\n  checkDatabaseStrings: true,\n\n  // Custom patterns\n  customPatterns: [\n    {\n      pattern: /CUSTOM-SECRET-\\d+/g,\n      name: 'Custom Secret Format',\n      severity: 'error'\n    }\n  ],\n\n  // Exclude known safe patterns (e.g., test data)\n  excludePatterns: [\n    /example\\.com/,\n    /test-key-\\d+/\n  ]\n});\n```\n\n### Quick Secret Check\n\n```typescript\nimport { hasSecrets } from '@bernierllc/validators-secret-patterns';\n\nif (await hasSecrets(code)) {\n  console.log('⚠️  Secrets detected in code!');\n}\n```\n\n### Get Secret Counts\n\n```typescript\nimport { getSecretCounts } from '@bernierllc/validators-secret-patterns';\n\nconst counts = await getSecretCounts(code);\nconsole.log(`Found ${counts.total} secrets:`);\nconsole.log(`  - ${counts.apiKeys} API keys`);\nconsole.log(`  - ${counts.passwords} passwords`);\nconsole.log(`  - ${counts.privateKeys} private keys`);\nconsole.log(`  - ${counts.databaseStrings} database connections`);\nconsole.log(`  - ${counts.jwtTokens} JWT tokens`);\nconsole.log(`  - ${counts.entropy} high-entropy strings`);\n```\n\n### Using Individual Rules\n\n```typescript\nimport { apiKeysRule, passwordsRule } from '@bernierllc/validators-secret-patterns';\nimport { createRuleContext } from '@bernierllc/validators-core';\n\nconst problems = [];\nconst context = createRuleContext(\n  'secret-patterns/api-keys',\n  { excludePatterns: [/test-key/] },\n  utils,\n  {},\n  (p) => problems.push(p)\n);\n\nconst validator = apiKeysRule.create(context);\nawait validator(sourceCode);\n\nconsole.log(problems);\n```\n\n## API Reference\n\n### `validateSecretPatterns(content, options?, utils?)`\n\nValidates content for hardcoded secrets and sensitive patterns.\n\n**Parameters:**\n- `content` (string): Content to validate (source code, configuration, etc.)\n- `options` (object, optional): Validation options\n  - `minEntropyScore` (number, default: 4.5): Minimum entropy score (0-8)\n  - `minEntropyLength` (number, default: 20): Minimum length for entropy analysis\n  - `checkApiKeys` (boolean, default: true): Check for API keys\n  - `checkEntropy` (boolean, default: true): Check for high-entropy strings\n  - `checkJwtTokens` (boolean, default: true): Check for JWT tokens\n  - `checkPrivateKeys` (boolean, default: true): Check for private keys\n  - `checkPasswords` (boolean, default: true): Check for passwords\n  - `checkDatabaseStrings` (boolean, default: true): Check for database connections\n  - `customPatterns` (array, optional): Custom patterns to detect\n  - `excludePatterns` (array, optional): Patterns to exclude/allowlist\n- `utils` (SharedUtils, optional): Shared utilities from validators-utils\n\n**Returns:** `Promise<Problem[]>` - Array of validation problems\n\n### `hasSecrets(content, options?)`\n\nQuick check if content contains any secrets.\n\n**Parameters:**\n- `content` (string): Content to check\n- `options` (object, optional): Same as validateSecretPatterns\n\n**Returns:** `Promise<boolean>` - true if secrets detected\n\n### `getSecretCounts(content, options?)`\n\nGet count of secrets by type.\n\n**Parameters:**\n- `content` (string): Content to analyze\n- `options` (object, optional): Same as validateSecretPatterns\n\n**Returns:** `Promise<object>` - Object with counts by type:\n- `apiKeys` (number)\n- `entropy` (number)\n- `jwtTokens` (number)\n- `privateKeys` (number)\n- `passwords` (number)\n- `databaseStrings` (number)\n- `custom` (number)\n- `total` (number)\n\n## Validation Rules\n\n### `secret-patterns/api-keys`\n\nDetects hardcoded API keys and tokens from various services.\n\n**Detects:**\n- AWS Access Keys (AKIA..., ASIA...)\n- AWS Secret Keys\n- GitHub Personal Access Tokens (ghp_, gho_, ghr_)\n- Google API Keys (AIza...)\n- Google OAuth Tokens (ya29.)\n- Stripe API Keys (sk_live, pk_live)\n- SendGrid API Keys (SG....)\n- Twilio API Keys (SK...)\n- Slack Tokens (xoxb-, xoxp-)\n- Slack Webhooks\n- Mailgun API Keys\n- Mailchimp API Keys\n- NPM Tokens (npm_...)\n- Azure Storage Keys\n- Heroku API Keys (UUID format)\n- Generic API key patterns\n\n**Example:**\n```typescript\n// ❌ Detected\nconst awsKey = \"AKIAIOSFODNN7EXAMPLE\";\nconst githubToken = \"ghp_1234567890abcdefghijklmnopqrstuv\";\nconst stripeKey = \"sk_live_1234567890abcdefghijklmn\";\n```\n\n### `secret-patterns/entropy`\n\nDetects high-entropy strings that may indicate hardcoded secrets.\n\n**Algorithm:**\n- Calculates Shannon entropy (0-8 scale)\n- Requires mix of character types (uppercase, lowercase, numbers, special chars)\n- Filters out common false positives (UUIDs, URLs, package names, hex colors)\n\n**Configuration:**\n- `minEntropyScore` (default: 4.5): Minimum entropy threshold\n- `minEntropyLength` (default: 20): Minimum string length\n\n**Example:**\n```typescript\n// ⚠️  Detected (high entropy)\nconst secret = \"aB3dEfGhIjKlMnOpQrStUvWxYz123456789\";\n\n// ✅ Not detected (UUID format)\nconst id = \"550e8400-e29b-41d4-a716-446655440000\";\n\n// ✅ Not detected (URL)\nconst url = \"https://api.example.com/v1/users\";\n```\n\n### `secret-patterns/jwt-tokens`\n\nDetects hardcoded JSON Web Tokens (JWT).\n\n**Detection:**\n- Validates three base64url segments separated by dots\n- Decodes header to verify JWT format\n- Extracts algorithm and token type\n\n**Example:**\n```typescript\n// ❌ Detected\nconst token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";\n```\n\n### `secret-patterns/private-keys`\n\nDetects hardcoded private keys in various formats.\n\n**Detects:**\n- RSA Private Keys\n- Generic Private Keys (PKCS#8)\n- EC Private Keys (Elliptic Curve)\n- DSA Private Keys\n- OpenSSH Private Keys\n- PGP/GPG Private Keys\n- Encrypted Private Keys\n\n**Example:**\n```typescript\n// ❌ Detected\nconst privateKey = `-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0Z3VS5JJcds3xvn6bBHs6\n-----END RSA PRIVATE KEY-----`;\n```\n\n### `secret-patterns/passwords`\n\nDetects hardcoded passwords in various contexts.\n\n**Patterns:**\n- Variable assignments (password = \"...\")\n- JSON/config files (\"password\": \"...\")\n- Connection strings (password=...)\n- Basic authentication headers\n\n**False Positive Filtering:**\n- Excludes common placeholders (password, your_password)\n- Excludes environment variable references (${PASSWORD})\n- Excludes single words and simple patterns\n- Excludes example/test data\n\n**Example:**\n```typescript\n// ❌ Detected\nconst password = \"MySecretP@ssw0rd123\";\n{\"password\": \"SecurePass123!\"}\npassword=MySecretPass123\n\n// ✅ Not detected (placeholders)\nconst password = \"password\";\nconst password = \"${PASSWORD}\";\nconst password = \"example\";\n```\n\n### `secret-patterns/database-strings`\n\nDetects database connection strings with embedded credentials.\n\n**Detects:**\n- PostgreSQL (postgresql://user:pass@host/db)\n- MySQL (mysql://user:pass@host/db)\n- MongoDB (mongodb://user:pass@host/db)\n- Redis (redis://user:pass@host)\n- SQL Server (Server=...;Password=...)\n- Oracle (Data Source=...;Password=...)\n- ODBC (DRIVER=...;PWD=...)\n- Generic database URLs\n\n**False Positive Filtering:**\n- Excludes placeholder usernames/passwords\n- Excludes environment variable references\n- Excludes example domains (example.com, test.com)\n\n**Example:**\n```typescript\n// ❌ Detected\nconst db = \"postgresql://admin:secretpass123@localhost:5432/mydb\";\nconst mongo = \"mongodb://user:pass123@dbhost:27017/database\";\nServer=myserver;Database=mydb;Password=sqlpass123;\n\n// ✅ Not detected (placeholders)\nconst db = \"postgresql://username:password@localhost:5432/db\";\nconst db = \"postgresql://user:pass@example.com:5432/db\";\n```\n\n## Problem Structure\n\nEach validation problem includes:\n\n```typescript\ninterface Problem {\n  ruleId: string;           // e.g., \"secret-patterns/api-keys\"\n  message: string;          // Human-readable description\n  severity: 'error' | 'warn' | 'info' | 'off';\n  domain: 'security';       // Validation domain\n  location?: {              // Optional location information\n    line?: number;\n    column?: number;\n  };\n  suggestion?: string;      // How to fix the issue\n  fixable?: boolean;        // Whether issue is auto-fixable\n  evidence?: {              // Supporting evidence\n    snippet?: string;       // Code snippet (with masking for sensitive data)\n    context?: Record<string, unknown>;  // Additional context\n  };\n  tags?: string[];          // Additional categorization\n}\n```\n\n## Examples\n\n### Pre-commit Hook Integration\n\n```typescript\nimport { validateSecretPatterns } from '@bernierllc/validators-secret-patterns';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nasync function checkForSecrets(filePaths: string[]): Promise<boolean> {\n  let hasIssues = false;\n\n  for (const filePath of filePaths) {\n    const content = fs.readFileSync(filePath, 'utf-8');\n    const problems = await validateSecretPatterns(content);\n\n    if (problems.length > 0) {\n      console.error(`❌ Secrets detected in ${filePath}:`);\n      problems.forEach(p => {\n        console.error(`  ${p.severity}: ${p.message} (line ${p.location?.line})`);\n      });\n      hasIssues = true;\n    }\n  }\n\n  return !hasIssues;\n}\n\n// Usage in pre-commit hook\nconst changedFiles = process.argv.slice(2);\nconst passed = await checkForSecrets(changedFiles);\nprocess.exit(passed ? 0 : 1);\n```\n\n### CI/CD Pipeline Integration\n\n```typescript\nimport { validateSecretPatterns, getSecretCounts } from '@bernierllc/validators-secret-patterns';\nimport * as glob from 'glob';\nimport * as fs from 'fs';\n\nasync function scanRepository(): Promise<void> {\n  const files = glob.sync('**/*.{ts,js,json,env}', {\n    ignore: ['node_modules/**', 'dist/**', '.git/**']\n  });\n\n  let totalSecrets = 0;\n\n  for (const file of files) {\n    const content = fs.readFileSync(file, 'utf-8');\n    const counts = await getSecretCounts(content);\n\n    if (counts.total > 0) {\n      console.log(`⚠️  ${file}: ${counts.total} secrets`);\n      totalSecrets += counts.total;\n    }\n  }\n\n  if (totalSecrets > 0) {\n    console.error(`\\n❌ FAIL: Found ${totalSecrets} hardcoded secrets`);\n    process.exit(1);\n  } else {\n    console.log('\\n✅ PASS: No secrets detected');\n  }\n}\n\nscanRepository().catch(console.error);\n```\n\n### IDE Plugin Integration\n\n```typescript\nimport { validateSecretPatterns } from '@bernierllc/validators-secret-patterns';\n\nasync function lintDocument(document: TextDocument): Promise<Diagnostic[]> {\n  const problems = await validateSecretPatterns(document.getText(), {\n    // Adjust sensitivity for IDE (fewer false positives)\n    minEntropyScore: 5.0,\n    checkEntropy: false  // Disable in IDE to reduce noise\n  });\n\n  return problems.map(problem => ({\n    severity: problem.severity === 'error'\n      ? DiagnosticSeverity.Error\n      : DiagnosticSeverity.Warning,\n    range: {\n      start: { line: problem.location?.line || 0, character: problem.location?.column || 0 },\n      end: { line: problem.location?.line || 0, character: (problem.location?.column || 0) + 10 }\n    },\n    message: problem.message,\n    source: 'secret-patterns',\n    code: problem.ruleId\n  }));\n}\n```\n\n### Custom Pattern Detection\n\n```typescript\nimport { validateSecretPatterns } from '@bernierllc/validators-secret-patterns';\n\nconst problems = await validateSecretPatterns(code, {\n  customPatterns: [\n    // Organization-specific secret format\n    {\n      pattern: /ACME-API-[A-Z0-9]{32}/g,\n      name: 'ACME Corp API Key',\n      severity: 'error'\n    },\n    // Internal service tokens\n    {\n      pattern: /internal_token_[a-f0-9]{40}/g,\n      name: 'Internal Service Token',\n      severity: 'error'\n    },\n    // Legacy credential format\n    {\n      pattern: /legacy_cred=[A-Za-z0-9+/=]{24,}/g,\n      name: 'Legacy Credential',\n      severity: 'warn'\n    }\n  ]\n});\n```\n\n### Allowlist/Exclude Patterns\n\n```typescript\nimport { validateSecretPatterns } from '@bernierllc/validators-secret-patterns';\n\nconst problems = await validateSecretPatterns(code, {\n  excludePatterns: [\n    // Test/example keys (documented in README)\n    /AKIAIOSFODNN7EXAMPLE/,\n    /test-key-[a-z0-9]+/i,\n\n    // Known public demo tokens\n    /demo-token-12345/,\n\n    // Development environment keys (non-production)\n    /dev-api-key-/i\n  ]\n});\n```\n\n## Integration with Validators Ecosystem\n\nThis package follows the [BernierLLC Validators Principles](https://github.com/BernierLLC/tools/blob/main/docs/validators-principles.md):\n\n- **Pure Validation Functions** - Returns structured problems, never throws\n- **Atomic Primitives** - Each rule has single responsibility\n- **Tool-Agnostic** - Works in CLI, web apps, CI/CD, IDE plugins\n- **Evidence-Rich Results** - Provides actionable debugging information\n- **Composable** - Can be combined with other validators\n\n### Used By\n\n- `@bernierllc/validators-security` - Comprehensive security validation\n- `@bernierllc/validators-code-quality` - Code quality and security checks\n- Custom security scanning tools\n\n## Integration Status\n\n### Logger Integration\n**Status:** not-applicable\n\nThis is a primitive validator that returns structured problem arrays. Logging is handled by the consumer application. The validator uses `@bernierllc/validators-core` for structured problem reporting, which can be integrated with `@bernierllc/logger` by the consuming application if needed.\n\n### Docs-Suite Integration\n**Status:** ready\n\n- Full TypeDoc API documentation generated\n- Markdown documentation exported\n- Format: markdown, typedoc, jsdoc\n\n### NeverHub Integration\n**Status:** not-applicable\n\nThis is a primitive validator with no service discovery requirements. The validator uses `@bernierllc/neverhub-adapter` pattern through the validators-core framework, but direct NeverHub integration (detectNeverHub) is not needed for atomic validation primitives. Service orchestration and discovery are handled at higher levels (domain validators, validator runners).\n\n## Performance\n\n- **Sub-50ms** validation for typical source files (< 10KB)\n- **Parallel execution** of independent rules\n- **Smart filtering** to minimize false positives\n- **Memory efficient** - Streams through content without full AST\n\n## Security Best Practices\n\n### Prevention Strategies\n\n1. **Use Environment Variables**\n   ```typescript\n   // ✅ Good\n   const apiKey = process.env.API_KEY;\n\n   // ❌ Bad\n   const apiKey = \"AKIAIOSFODNN7EXAMPLE\";\n   ```\n\n2. **Use Secret Management Systems**\n   - AWS Secrets Manager\n   - Azure Key Vault\n   - HashiCorp Vault\n   - Google Secret Manager\n\n3. **Implement Pre-commit Hooks**\n   - Scan all changed files before commit\n   - Block commits containing secrets\n   - Provide clear remediation guidance\n\n4. **CI/CD Integration**\n   - Scan entire repository on each build\n   - Fail builds if secrets detected\n   - Generate security reports\n\n5. **Developer Training**\n   - Educate team about secret detection\n   - Document proper secret management\n   - Regular security awareness training\n\n### Remediation Steps\n\nIf secrets are detected:\n\n1. **Rotate the Secret** - Immediately invalidate and regenerate\n2. **Remove from History** - Use `git filter-branch` or BFG Repo-Cleaner\n3. **Update Code** - Replace with environment variable or secret management\n4. **Review Access Logs** - Check if compromised secret was accessed\n5. **Document Incident** - Record what happened and how it was resolved\n\n## Testing\n\nThis package includes comprehensive test coverage:\n\n```bash\nnpm test              # Run tests in watch mode\nnpm run test:run      # Run tests once\nnpm run test:coverage # Run tests with coverage report\n```\n\n**Coverage Requirements:**\n- Branches: 90%+\n- Functions: 90%+\n- Lines: 90%+\n- Statements: 90%+\n\n## See Also\n\n- [@bernierllc/validators-core](../validators-core) - Core validator types and utilities\n- [@bernierllc/validators-runner](../validators-runner) - Execute validators with policies\n- [@bernierllc/validators-reporters](../validators-reporters) - Format validation results\n- [@bernierllc/validators-security](../validators-security) - Comprehensive security validation\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n","readmeFilename":"README.md"}