{"_id":"@angx/ngx-easy-captcha","_rev":"24-eab6fe6c2421d596e51e04fb28c2b176","name":"@angx/ngx-easy-captcha","dist-tags":{"latest":"3.0.1"},"versions":{"0.0.1":{"name":"@angx/ngx-easy-captcha","version":"0.0.1","keywords":["ngx easy captcha","angular captcha","angular 18 captcha","ngx google recaptcha","ngx cloudflare turnstile","google recaptcha","cloudflare turnstile","angular 18 google recaptcha","angular 18 cloudflare turnstile"],"_id":"@angx/ngx-easy-captcha@0.0.1","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"e0a2380081dd8e9ead03a9655c5073ee09124e43","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-0.0.1.tgz","fileCount":28,"integrity":"sha512-zCUmvRiuWvdTXTlijocH56IeqMtRaaQ3/TeCaooqIV1MLxTvzJTh1z7+PwO42gCxfrixkQ8yK9b5Wtp0QU1AqA==","signatures":[{"sig":"MEUCIQCV736mDrqshLvqmJvQ5i+m4D0TQaMxe0XwvKeQWG5OMAIgBmSLPYfeLoE37uNu9yz1Bpjs0QbE854y3yhbptlR3U8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":90577},"module":"fesm2022/angx-ngx-easy-captcha.mjs","exports":{".":{"esm":"./esm2022/angx-ngx-easy-captcha.mjs","types":"./index.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs","esm2022":"./esm2022/angx-ngx-easy-captcha.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"701a0014c612e69b15ccfae87eed13306e2b66c3","typings":"index.d.ts","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"donations":"https://buymeacoffee.com/er.abhishek","repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"10.2.4","description":"<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/RecaptchaLogo.svg/640px-RecaptchaLogo.svg.png\" alt=\"Ngx Easy Recaptcha\" width=\"200\" height=\"160\"/> <img src=\"https://storage.googleapis.com/zenn-user-upload/8ebc32eb3c69-20230326.png\" alt","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^18.1.0","@angular/common":"^18.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_0.0.1_1722943812768_0.46574282835983727","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"@angx/ngx-easy-captcha","version":"1.0.0","keywords":["ngx easy captcha","angular captcha","angular 18 captcha","ngx google recaptcha","ngx cloudflare turnstile","google recaptcha","cloudflare turnstile","angular 18 google recaptcha","angular 18 cloudflare turnstile"],"_id":"@angx/ngx-easy-captcha@1.0.0","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"247ea7169e82da1f0d156e712d66fc4861e4b958","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-1.0.0.tgz","fileCount":28,"integrity":"sha512-brw3y26TJtCthuGroPRRrYLiq1tNhFbceC3vkHHxkUrPN80eJRFnr9KqgZHIdHax337xU29/os4Sr6pkbNjIRQ==","signatures":[{"sig":"MEQCIDffJjP7usjmB6n84LsTy445vP2fu4cBTCzgNijCN7onAiBuk77ZXygLWsDKl9naNg9rrJaqzuuU/ixLKWVYI9WeVA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":90787},"module":"fesm2022/angx-ngx-easy-captcha.mjs","exports":{".":{"esm":"./esm2022/angx-ngx-easy-captcha.mjs","types":"./index.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs","esm2022":"./esm2022/angx-ngx-easy-captcha.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"911e7ad996a1083827691b64b05ac212ab16e50e","typings":"index.d.ts","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"donations":"https://buymeacoffee.com/er.abhishek","repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"10.2.4","description":"<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/RecaptchaLogo.svg/640px-RecaptchaLogo.svg.png\" alt=\"Ngx Easy Recaptcha\" width=\"200\" height=\"160\"/> <img src=\"https://storage.googleapis.com/zenn-user-upload/8ebc32eb3c69-20230326.png\" alt","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^18.1.0","@angular/common":"^18.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_1.0.0_1722944381508_0.3089407741738488","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@angx/ngx-easy-captcha","version":"1.0.1","keywords":["ngx easy captcha","angular captcha","angular 18 captcha","ngx google recaptcha","ngx cloudflare turnstile","google recaptcha","cloudflare turnstile","angular 18 google recaptcha","angular 18 cloudflare turnstile"],"_id":"@angx/ngx-easy-captcha@1.0.1","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"341d87a6fa8019ddfd15dec1edd257a55b606dd6","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-1.0.1.tgz","fileCount":28,"integrity":"sha512-/3SaQmYSRLIpQBc8TYOvIXRWtCdCtdb6IVIBbrsDsDxCbkWpymHzRX1d3WrcjyEUvPye+ZqkrnDYm9+NFiF/BQ==","signatures":[{"sig":"MEYCIQC5/DlYXf0WgJ8uVS5jg6CqHcdNPlHZ8zIZ7TXySqJ5PgIhAIanbcFWVbaIGxuwnS32p8EqPcUgyc0BOJ/ahJjOhUSs","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":91033},"module":"fesm2022/angx-ngx-easy-captcha.mjs","exports":{".":{"esm":"./esm2022/angx-ngx-easy-captcha.mjs","types":"./index.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs","esm2022":"./esm2022/angx-ngx-easy-captcha.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"911e7ad996a1083827691b64b05ac212ab16e50e","typings":"index.d.ts","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"donations":"https://buymeacoffee.com/er.abhishek","repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"10.2.4","description":"<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/RecaptchaLogo.svg/640px-RecaptchaLogo.svg.png\" alt=\"Ngx Easy Recaptcha\" width=\"200\" height=\"160\"/> <img src=\"https://storage.googleapis.com/zenn-user-upload/8ebc32eb3c69-20230326.png\" alt","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^18.1.0","@angular/common":"^18.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_1.0.1_1722945021514_0.03552237623591892","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"@angx/ngx-easy-captcha","version":"1.0.2","keywords":["ngx easy captcha","angular captcha","angular 18 captcha","ngx google recaptcha","ngx cloudflare turnstile","google recaptcha","cloudflare turnstile","angular 18 google recaptcha","angular 18 cloudflare turnstile"],"_id":"@angx/ngx-easy-captcha@1.0.2","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"56467b7916716ca32b584dbb6b672cb673e7a4cd","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-1.0.2.tgz","fileCount":28,"integrity":"sha512-OiK06N2gJMZenoEKLhCUqBfrW0ppMtoxqTLMT2EpKewiRyBsD9yYvVJ8z8ykRx364bq8nzfuyh8zLabhsoszWA==","signatures":[{"sig":"MEQCIHocSx5XArTIOhdeOgG2QngFiBi5Ji8xgbCgkvBRTpA9AiAOg/XlX+u5u8iiwcGnR6U3fX7hg2wB47AGAL0Fizf4zQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":91724},"module":"fesm2022/angx-ngx-easy-captcha.mjs","exports":{".":{"esm":"./esm2022/angx-ngx-easy-captcha.mjs","types":"./index.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs","esm2022":"./esm2022/angx-ngx-easy-captcha.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"eaf985997017cb150b08f528e065899095374599","typings":"index.d.ts","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"donations":"https://buymeacoffee.com/er.abhishek","repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"10.2.4","description":"<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/RecaptchaLogo.svg/640px-RecaptchaLogo.svg.png\" alt=\"Ngx Easy Recaptcha\" width=\"200\" height=\"160\"/> <img src=\"https://storage.googleapis.com/zenn-user-upload/8ebc32eb3c69-20230326.png\" alt","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^18.1.0","@angular/common":"^18.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_1.0.2_1722946936652_0.9776284730355389","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"@angx/ngx-easy-captcha","version":"1.0.3","keywords":["ngx easy captcha","angular captcha","angular 18 captcha","ngx google recaptcha","ngx cloudflare turnstile","google recaptcha","cloudflare turnstile","angular 18 google recaptcha","angular 18 cloudflare turnstile"],"_id":"@angx/ngx-easy-captcha@1.0.3","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"b0eaf9972d6a430a7bd2b7551b3ba47676fa9e7c","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-1.0.3.tgz","fileCount":28,"integrity":"sha512-PcKri/n2FYY7V0OnxU+FhqNEVA8veqCjzQ7toulyFiKYdmhqxBO6p8jSbR5/q93QvGbiMBiyYc4t+azYUcyN0A==","signatures":[{"sig":"MEUCIEvqcKx8mmYMaQ9BgpPmfMMu3aNeupdQow9vTomUTKKyAiEAroxHckXk2RTjTuG+OF0XA9ZylvYdkgL0bnorlCvVvuU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":91734},"module":"fesm2022/angx-ngx-easy-captcha.mjs","exports":{".":{"esm":"./esm2022/angx-ngx-easy-captcha.mjs","types":"./index.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs","esm2022":"./esm2022/angx-ngx-easy-captcha.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"8bb06bd8aa572afcfc759a947a3bd50f0baa4aa4","typings":"index.d.ts","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"donations":"https://buymeacoffee.com/er.abhishek","repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"10.2.4","description":"<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/RecaptchaLogo.svg/640px-RecaptchaLogo.svg.png\" alt=\"Ngx Easy Recaptcha\" width=\"200\" height=\"160\"/> <img src=\"https://storage.googleapis.com/zenn-user-upload/8ebc32eb3c69-20230326.png\" alt","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^18.1.0","@angular/common":"^18.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_1.0.3_1722947616905_0.9337007785942091","host":"s3://npm-registry-packages"}},"1.0.8":{"name":"@angx/ngx-easy-captcha","version":"1.0.8","keywords":["ngx easy captcha","angular captcha","angular 18 captcha","ngx google recaptcha","ngx cloudflare turnstile","google recaptcha","cloudflare turnstile","angular 18 google recaptcha","angular 18 cloudflare turnstile"],"_id":"@angx/ngx-easy-captcha@1.0.8","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"caa5587981d03ee99c000c8a7aa3fe362b81edf7","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-1.0.8.tgz","fileCount":17,"integrity":"sha512-6UtKcpxBpxX4YYy1O8pGt+KU/VPu9cJ64F/RM3DJ0RurHtqzvDstf7eHrzQ0CdLnSoxQtbSHWrSYnOX2k+obxg==","signatures":[{"sig":"MEUCIDNOuC7vFuToDSnnqGBP3G6fNJDGHeIw0vpwpqjwti00AiEA1l+JeNTNzAqlsTwGeJHsdGgM5ZDSLuVY3cW3+FMe7JA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":17343},"gitHead":"f9cfa5b41523d09d92d2727f8f0332625ccd4a15","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"donations":"https://buymeacoffee.com/er.abhishek","repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"10.2.4","description":"Easy Captcha Implementation for Angular (Supports Angular 18)!","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"tslib":"^2.3.0","@angular/core":"^18.1.0","@angular/common":"^18.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_1.0.8_1723095449024_0.9033265830123749","host":"s3://npm-registry-packages"}},"2.0.2":{"name":"@angx/ngx-easy-captcha","version":"2.0.2","keywords":["ngx easy captcha","angular captcha","ngx google recaptcha","ngx cloudflare turnstile","angular google recaptcha","angular cloudflare turnstile","npm google recaptcha","npm cloudflare turnstile"],"_id":"@angx/ngx-easy-captcha@2.0.2","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"d01c118da5e582edbe9de5703195ad549531cd6e","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-2.0.2.tgz","fileCount":28,"integrity":"sha512-UKZhWW/PeDaAlxhEQJIFXukMgkyKSOKzlQRH6THGZG0iFx9zjcg5kbfZXWctmxWIrmN74A/JmK++HcWZNHBG7Q==","signatures":[{"sig":"MEUCIQD1lOcMf0P1exFEsxqZR5zJcKDD9Mm0ZbGCP/c5IvUirQIgA8jg+hd4qrrzhghrYM/dfvKPmhGTafcPw0GgSPzsJB0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49405},"module":"fesm2022/angx-ngx-easy-captcha.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"375f4b17534519879d2011827e4b04295a53e860","typings":"index.d.ts","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"donations":"https://buymeacoffee.com/er.abhishek","repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"11.5.2","description":"Easy Captcha Implementation for Angular (Supports Angular 19)!","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.2.14","@angular/common":"^19.2.14"},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_2.0.2_1756710874895_0.17757473114138222","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@angx/ngx-easy-captcha","version":"2.0.3","keywords":["ngx easy captcha","angular captcha","ngx google recaptcha","ngx cloudflare turnstile","angular google recaptcha","angular cloudflare turnstile","npm google recaptcha","npm cloudflare turnstile"],"_id":"@angx/ngx-easy-captcha@2.0.3","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"2c27a6c15341e6be56d76e11f69283e1f40f4e58","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-2.0.3.tgz","fileCount":28,"integrity":"sha512-7cuT967kHqDLROam/0AZoy+nbYrzcOCZkd86yPi48eWMbsubvODe6a+mUx6wu+u2iPOSMxrtxGhDDu1qpFOESA==","signatures":[{"sig":"MEQCIG2CHENlMgcTuy36jwEW0GQZz/OG/mG25zlyRS3G626wAiAqXrHzEFXQzlIHG1Fxpbl2rnh93UHPoUPH6VfkrnSBoA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49512},"module":"fesm2022/angx-ngx-easy-captcha.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"454b37a258a7ae2bc00626762a0f25ca7440002b","typings":"index.d.ts","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"donations":"https://buymeacoffee.com/er.abhishek","repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"11.5.2","description":"Easy Captcha Implementation for Angular (Supports Angular 19)!","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.2.14","@angular/common":"^19.2.14"},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_2.0.3_1756872084395_0.20718530449771722","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@angx/ngx-easy-captcha","version":"2.0.4","keywords":["ngx easy captcha","angular captcha","ngx google recaptcha","ngx cloudflare turnstile","angular google recaptcha","angular cloudflare turnstile","npm google recaptcha","npm cloudflare turnstile"],"_id":"@angx/ngx-easy-captcha@2.0.4","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"482a1f57ec94328e17224b2e0b7895117d38cd82","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-2.0.4.tgz","fileCount":28,"integrity":"sha512-XW7qQYWKcETyVKIclr3BmicwFAzcRj+sC7sdY3JCHveDksOdc6LqY9f8Ih4lprC2U1oajRarsgL3qp0tGf+Eog==","signatures":[{"sig":"MEUCIGFiRdNfPwk+zUoCZXb2QLSWZ4ZZlKlLmrMNP1WvVZYUAiEAl2k/9Ue4qivcypQHKfj/J77pX2j+sJVBFx616XZ84PI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49442},"module":"fesm2022/angx-ngx-easy-captcha.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"454b37a258a7ae2bc00626762a0f25ca7440002b","typings":"index.d.ts","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"donations":"https://buymeacoffee.com/er.abhishek","repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"11.5.2","description":"Easy Captcha Implementation for Angular (Supports Angular 19)!","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_2.0.4_1756911377928_0.26331304336457784","host":"s3://npm-registry-packages-npm-production"}},"2.0.6":{"name":"@angx/ngx-easy-captcha","version":"2.0.6","keywords":["ngx easy captcha","angular captcha","ngx google recaptcha","ngx cloudflare turnstile","angular google recaptcha","angular cloudflare turnstile","npm google recaptcha","npm cloudflare turnstile"],"_id":"@angx/ngx-easy-captcha@2.0.6","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"4e4fcfc2d2dc04e91529c3f3ee0fae835c7ae228","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-2.0.6.tgz","fileCount":28,"integrity":"sha512-p5oJYE/FcxhKyNq6M5QLZahBOqHoij/ZClYj4/DbL686UvKte95FitQOOqkpFw+5BfN+hRCLtcXBzkvvjbZUPQ==","signatures":[{"sig":"MEUCIQCIn8ydyFIqQKSHvTi6NJGR1x8WOetFgE2ZEi+8qQsIrQIgTCtNBIcoavEgf0WJQPrrCQcuHW60uIGFsR2ozbaGRcA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50816},"module":"fesm2022/angx-ngx-easy-captcha.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"454b37a258a7ae2bc00626762a0f25ca7440002b","typings":"index.d.ts","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"donations":"https://buymeacoffee.com/er.abhishek","repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"11.5.2","description":"Easy Captcha Implementation for Angular (Supports Angular 19)!","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_2.0.6_1757255234221_0.9074280776939605","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@angx/ngx-easy-captcha","version":"3.0.0","keywords":["angular","angular captcha","ngx easy captcha","ngx google recaptcha","ngx cloudflare turnstile","google recaptcha","recaptcha v3","cloudflare turnstile"],"author":{"name":"Abhishek Singh"},"license":"MIT","_id":"@angx/ngx-easy-captcha@3.0.0","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"dist":{"shasum":"57472d52579c10256322f20bdfa9338cdcb8e978","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-3.0.0.tgz","fileCount":6,"integrity":"sha512-YhHtDyeFbvWYE23k2D5mxkq0qBhap6KgKJ4lw4t2BO+lGjEgmq/nfZx1F5BeQTzoWUSddn2yY0jdDTX3iThyyg==","signatures":[{"sig":"MEUCIGK/JBQ8d1+jLqVVviwIPv95N+j8nk0NwySa/qML1KPFAiEApAIGzNmh1OSposvH9QGSiZOqaizKeq6dwX8zZhAlMG4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65454},"type":"module","module":"fesm2022/angx-ngx-easy-captcha.mjs","exports":{".":{"types":"./types/angx-ngx-easy-captcha.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs"},"./package.json":{"default":"./package.json"}},"funding":{"url":"https://buymeacoffee.com/er.abhishek","type":"buymeacoffee"},"gitHead":"b9ca426caf35b4606ee42e11844f5ea7815874be","typings":"types/angx-ngx-easy-captcha.d.ts","_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"repository":{"url":"git+https://github.com/angx-libs/ngx-easy-captcha.git","type":"git"},"_npmVersion":"11.16.0","description":"One Angular service for both Google reCAPTCHA v3 and Cloudflare Turnstile, loading each script on demand and cleaning up after itself.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.8.1"},"_hasShrinkwrap":false,"peerDependencies":{"rxjs":"^6.5.3 || ^7.4.0","@angular/core":"^21.0.0 || ^22.0.0","@angular/common":"^21.0.0 || ^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-easy-captcha_3.0.0_1785763451258_0.9123627491558781","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@angx/ngx-easy-captcha","version":"3.0.1","description":"One Angular service for both Google reCAPTCHA v3 and Cloudflare Turnstile, loading each script on demand and cleaning up after itself.","license":"MIT","author":{"name":"Abhishek Singh"},"homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"peerDependencies":{"@angular/common":"^21.0.0 || ^22.0.0","@angular/core":"^21.0.0 || ^22.0.0","rxjs":"^6.5.3 || ^7.4.0"},"dependencies":{"tslib":"^2.8.1"},"keywords":["angular","angular captcha","ngx easy captcha","ngx google recaptcha","ngx cloudflare turnstile","google recaptcha","recaptcha v3","cloudflare turnstile"],"sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/angx-libs/ngx-easy-captcha.git"},"funding":{"type":"buymeacoffee","url":"https://buymeacoffee.com/er.abhishek"},"module":"fesm2022/angx-ngx-easy-captcha.mjs","typings":"types/angx-ngx-easy-captcha.d.ts","exports":{"./package.json":{"default":"./package.json"},".":{"types":"./types/angx-ngx-easy-captcha.d.ts","default":"./fesm2022/angx-ngx-easy-captcha.mjs"}},"type":"module","gitHead":"714b09ebd1d52317f7bf9f4863a12b25f595025a","_id":"@angx/ngx-easy-captcha@3.0.1","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-bZKtxbMlfgzdZYnWIiG7FwLO6P2patBmWAjYLYhB+Ai6IjjRAkpT/kp/pgzV6CrR5ia2DER70asECY3x2+8R5A==","shasum":"b19abd572317b1e58f5e495eee407aa522fe999b","tarball":"https://registry.npmjs.org/@angx/ngx-easy-captcha/-/ngx-easy-captcha-3.0.1.tgz","fileCount":6,"unpackedSize":67105,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID6e4irBtAOpZiVN7TujpC+xn49GrKL/0Crd5f6VKIjmAiAI8NZ1kDkLY0lWGOzC5JS4lNgDK0A9P/Ob5JLqRgKRjw=="}]},"_npmUser":{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"},"directories":{},"maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ngx-easy-captcha_3.0.1_1785774782600_0.5083087956065471"},"_hasShrinkwrap":false}},"time":{"created":"2024-08-06T11:30:12.655Z","modified":"2026-08-03T16:33:02.896Z","0.0.1":"2024-08-06T11:30:12.906Z","1.0.0":"2024-08-06T11:39:41.723Z","1.0.1":"2024-08-06T11:50:21.693Z","1.0.2":"2024-08-06T12:22:16.913Z","1.0.3":"2024-08-06T12:33:37.131Z","1.0.4":"2024-08-08T05:28:37.879Z","1.0.5":"2024-08-08T05:34:17.617Z","1.0.6":"2024-08-08T05:35:15.988Z","1.0.7":"2024-08-08T05:36:27.639Z","1.0.8":"2024-08-08T05:37:29.199Z","2.0.0":"2025-09-01T06:03:59.702Z","2.0.1":"2025-09-01T07:05:31.490Z","2.0.2":"2025-09-01T07:14:35.090Z","2.0.3":"2025-09-03T04:01:24.596Z","2.0.4":"2025-09-03T14:56:18.102Z","2.0.6":"2025-09-07T14:27:14.412Z","3.0.0":"2026-08-03T13:24:11.420Z","3.0.1":"2026-08-03T16:33:02.724Z"},"bugs":{"url":"https://github.com/angx-libs/ngx-easy-captcha/issues"},"author":{"name":"Abhishek Singh"},"license":"MIT","homepage":"https://github.com/angx-libs/ngx-easy-captcha#readme","keywords":["angular","angular captcha","ngx easy captcha","ngx google recaptcha","ngx cloudflare turnstile","google recaptcha","recaptcha v3","cloudflare turnstile"],"repository":{"type":"git","url":"git+https://github.com/angx-libs/ngx-easy-captcha.git"},"description":"One Angular service for both Google reCAPTCHA v3 and Cloudflare Turnstile, loading each script on demand and cleaning up after itself.","maintainers":[{"name":"onlyabhishek","email":"singh.abhishek0601@gmail.com"}],"readme":"# @angx/ngx-easy-captcha\r\n\r\nOne Angular service for both [Google reCAPTCHA v3](https://www.google.com/recaptcha/about) and [Cloudflare Turnstile](https://www.cloudflare.com/products/turnstile). Switch providers by changing one value.\r\n\r\n**[Live demo](https://angx-libs.github.io/ngx-easy-captcha/)** · [npm](https://www.npmjs.com/package/@angx/ngx-easy-captcha)\r\n\r\n### Cloudflare Turnstile\r\n\r\nTurnstile renders an interactive widget into the container you point it at — here, inside the sign-in form.\r\n\r\n![Cloudflare Turnstile widget inside the demo sign-in form, showing Success and a received token](https://raw.githubusercontent.com/angx-libs/ngx-easy-captcha/master/src/assets/cloudflare.PNG)\r\n\r\n### Google reCAPTCHA v3\r\n\r\nreCAPTCHA v3 has no challenge for the user to solve, so nothing is rendered into the form. Its only visible element is the reCAPTCHA badge pinned to the bottom-right of the page, as in the screenshot below. The token arrives on the same stream either way.\r\n\r\n![Google reCAPTCHA v3 in the demo app: no in-form widget, the reCAPTCHA badge bottom-right, and a received token](https://raw.githubusercontent.com/angx-libs/ngx-easy-captcha/master/src/assets/google.PNG)\r\n\r\nThe badge is Google's, not this library's, and it appears automatically once the script loads. Google's terms let you hide it only if you show the required attribution text in its place:\r\n\r\n```css\r\n.grecaptcha-badge { visibility: hidden; }\r\n```\r\n\r\n```html\r\n<small>\r\n  This site is protected by reCAPTCHA and the Google\r\n  <a href=\"https://policies.google.com/privacy\">Privacy Policy</a> and\r\n  <a href=\"https://policies.google.com/terms\">Terms of Service</a> apply.\r\n</small>\r\n```\r\n\r\n`ngx-easy-captcha` removes the badge for you when the last consumer is destroyed.\r\n\r\n## Features\r\n\r\n- One API for two providers — swap with a single enum value\r\n- Provider scripts are injected on demand, not bundled\r\n- Reference-counted script loading: several protected forms share one script tag safely\r\n- Cleans up after itself when the injector is destroyed — script tag, widgets, reCAPTCHA badge and globals\r\n- Tokens and errors on separate streams, so a failed challenge never kills the token stream\r\n- Turnstile tokens are refreshed automatically on expiry\r\n- SSR safe: resolves instead of hanging when there is no document\r\n\r\n## Requirements\r\n\r\nAngular 21 or 22.\r\n\r\n## Install\r\n\r\n```bash\r\nnpm i @angx/ngx-easy-captcha\r\n```\r\n\r\n## Usage\r\n\r\nProvide the service where you need it — usually on the component that owns the protected form, so it is torn down with that component.\r\n\r\n### Cloudflare Turnstile\r\n\r\n`initializer` is the **id prefix** of the element(s) the widget renders into. Every element whose id starts with that prefix gets its own widget, which is how one page can protect several forms.\r\n\r\n```html\r\n<div id=\"cloudflare-captcha-signin\"></div>\r\n<div id=\"cloudflare-captcha-signup\"></div>\r\n```\r\n\r\n```ts\r\nimport { Component, inject, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n  CaptchaProvider,\r\n  NgxEasyCaptchaService,\r\n  provideNgxEasyCaptcha,\r\n} from '@angx/ngx-easy-captcha';\r\n\r\n@Component({\r\n  selector: 'app-signin',\r\n  providers: [\r\n    provideNgxEasyCaptcha({\r\n      provider: CaptchaProvider.CloudFlare,\r\n      siteKey: '0x4AAAAAAA...',\r\n      initializer: 'cloudflare-captcha',\r\n    }),\r\n  ],\r\n  templateUrl: './signin.component.html',\r\n})\r\nexport class SignInComponent {\r\n  private readonly captcha = inject(NgxEasyCaptchaService);\r\n\r\n  readonly token = signal('');\r\n  readonly error = signal('');\r\n\r\n  constructor() {\r\n    this.captcha.$.pipe(takeUntilDestroyed()).subscribe((token) => this.token.set(token));\r\n    this.captcha.errors$.pipe(takeUntilDestroyed()).subscribe((e) => this.error.set(e.message));\r\n  }\r\n\r\n  submit() {\r\n    if (this.token()) {\r\n      // Send this.token() to your backend and verify it there.\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### Google reCAPTCHA v3\r\n\r\nreCAPTCHA v3 is invisible, so there is no container element. Here `initializer` is the **action** name (`login`, `register`, ...).\r\n\r\n```ts\r\nproviders: [\r\n  provideNgxEasyCaptcha({\r\n    provider: CaptchaProvider.Google,\r\n    siteKey: '6Lc...',\r\n    initializer: 'login',\r\n  }),\r\n],\r\n```\r\n\r\nEverything else is identical — the same `$` and `errors$` streams.\r\n\r\n### Manual providers\r\n\r\n`provideNgxEasyCaptcha` is a convenience wrapper. The individual tokens still work:\r\n\r\n```ts\r\nproviders: [\r\n  NgxEasyCaptchaService,\r\n  { provide: CAPTCHA_PROVIDER, useValue: CaptchaProvider.CloudFlare },\r\n  { provide: CAPTCHA_SITE_KEY, useValue: '0x4AAAAAAA...' },\r\n  { provide: STRING_INITIALIZER, useValue: 'cloudflare-captcha' },\r\n],\r\n```\r\n\r\n## API\r\n\r\n| Member | Type | Description |\r\n|---|---|---|\r\n| `$` | `Observable<string>` | Emits each issued token. Never errors. |\r\n| `errors$` | `Observable<ICaptchaError>` | Non-fatal provider problems: `{ code, message }`. |\r\n| `refresh()` | `void` | reCAPTCHA: request a new token. Turnstile: reset the widgets. |\r\n\r\nCleanup runs automatically via `ngOnDestroy` when the providing injector is destroyed. You still want `takeUntilDestroyed()` (or an `unsubscribe`) on your own subscriptions.\r\n\r\n> **Verify tokens on your server.** A captcha token proves nothing until your backend posts it to the provider's `siteverify` endpoint with your **secret** key. Never put the secret key in frontend code.\r\n\r\n## Testing locally\r\n\r\nCloudflare publishes dummy site keys that work on any domain, including `localhost`:\r\n\r\n| Key | Behaviour |\r\n|---|---|\r\n| `1x00000000000000000000AA` | Always passes, visible |\r\n| `2x00000000000000000000AB` | Always blocks, visible |\r\n| `3x00000000000000000000FF` | Forces an interactive challenge |\r\n\r\nreCAPTCHA v3 has no universal test key — register `localhost` under your own site key.\r\n\r\n## Migrating from 2.x\r\n\r\n- **Angular 21+ is required**, and the workspace targets Angular 22.\r\n- **`CaptchaProvider` is now a string enum** (`'google'` / `'cloudflare'` rather than `0` / `1`). Use the enum members and nothing changes; only code comparing against raw numbers breaks.\r\n- **`$` no longer errors.** Subscribe to `errors$` instead of an `error` callback. This is what stops one failed challenge from disabling the service for the rest of the session.\r\n- `$` no longer emits an initial empty string, so you can drop `if (token)` guards.\r\n- `removeScriptAndTraces()` is replaced by the reference-counted `release()`.\r\n- Misconfiguration now throws with an actionable message instead of logging to the console and silently returning an observable that never emits.\r\n- New: `provideNgxEasyCaptcha()`, `refresh()`, `errors$`.\r\n\r\n### Fixed in 3.0.0\r\n\r\n- **Turnstile widgets never rendered.** `turnstile.render()` was wrapped in `turnstile.ready()`, which is only for code running *before* `api.js` loads; called afterwards it logs a warning and never invokes the callback.\r\n- **Tearing down one form removed the shared script for every other form** on the page. Script loading is now reference counted.\r\n- **`async` and `defer` were assigned to each other** (`script.async` was set from `defer` and vice versa).\r\n- **The script store was mutated in place** while substituting the site key, so a second consumer with a different key silently reused the first one.\r\n- **The promise never settled during server-side rendering**, leaving callers awaiting forever.\r\n- **The two misconfiguration messages were swapped** — the reCAPTCHA branch printed the Turnstile advice and vice versa.\r\n- A failed script load resolved with `status: 'Loaded'`.\r\n- Removing badges iterated a live `HTMLCollection` forward while deleting from it, leaving roughly half behind.\r\n- Concurrent callers each injected their own copy of the same script tag.\r\n- A hand-written `index.d.ts` re-exported classes and injection tokens with `export type`.\r\n- Cleanup depended on the consumer unsubscribing, via a `finalize()` that never ran if they forgot.\r\n\r\n## Development\r\n\r\n```bash\r\nnpm install\r\nnpm run build:lib   # build the package into dist/angx/ngx-easy-captcha\r\nnpm start           # build the lib, then serve the demo app\r\nnpm test            # run the library unit tests\r\n```\r\n\r\nThe demo app is deployed to GitHub Pages from `master` by `.github/workflows/deploy-demo.yml`.\r\n\r\nThe Turnstile page (`/cloudflare-turnstile`) works out of the box using Cloudflare's public test key. The reCAPTCHA page (`/google-recaptcha`) needs your own site key with `localhost` registered — paste it into the component's `providers`.\r\n\r\n## Support\r\n\r\nIf you like my work and feel like buying me a coffee, please feel free to do so:\r\n\r\n[Buy Me A Coffee](https://buymeacoffee.com/er.abhishek)\r\n\r\n## License\r\n\r\nMIT © Abhishek Singh\r\n\r\n[GitHub](https://github.com/asingh0601) · [Twitter](https://twitter.com/only_abhishek)\r\n","readmeFilename":"README.md"}