{"_id":"@boindahood/react-native-biometrics","_rev":"5-c94bf2858353ffa9b7151446526dfd65","name":"@boindahood/react-native-biometrics","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.1":{"name":"@boindahood/react-native-biometrics","version":"1.0.1","keywords":["react-native","ios","android"],"author":{"url":"https://github.com/chubo274","name":"boindahood","email":"chubo274@gmail.com"},"license":"MIT","_id":"@boindahood/react-native-biometrics@1.0.1","maintainers":[{"name":"chubo274","email":"chubo274@gmail.com"}],"homepage":"https://github.com/chubo274/react-native-biometrics#readme","bugs":{"url":"https://github.com/chubo274/react-native-biometrics/issues"},"dist":{"shasum":"5cfc2f1b2fb7411caba971e7ed7aaccc6d4950de","tarball":"https://registry.npmjs.org/@boindahood/react-native-biometrics/-/react-native-biometrics-1.0.1.tgz","fileCount":23,"integrity":"sha512-aku5Mqywm2DeSkcueQCEKqG+x2DazmfPNUD9BQwKUt1/sTpCQvgM9gk+7n0fTa4LJUocYCwlXN8Z9Ku5KDQRKw==","signatures":[{"sig":"MEQCIHuJmWbxeEqxn0RG8DoWQRLLz4oxplM42d1pMcvJL8wdAiAkQkm5RvRoKN8p+MICQ7UmO2ELdG8/6k6P9vssa64cOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63291},"jest":{"preset":"react-native","modulePathIgnorePatterns":["<rootDir>/example/node_modules","<rootDir>/lib/"]},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"a97028f9dace90303e1e4f703cafb53d28a8241c","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace react-native-biometrics-example","prepare":"bob build","release":"release-it --only-version","typecheck":"tsc","postinstall":"react-native setup-ios-permissions || true"},"_npmUser":{"name":"chubo274","actor":{"name":"chubo274","type":"user","email":"chubo274@gmail.com"},"email":"chubo274@gmail.com"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"commitlint":{"extends":["@commitlint/config-conventional"]},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore: release ${version}"},"npm":{"publish":true},"github":{"release":true},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"repository":{"url":"git+https://github.com/chubo274/react-native-biometrics.git","type":"git"},"workspaces":["example"],"_npmVersion":"10.8.2","description":"react native biometrics","directories":{},"_nodeVersion":"20.19.2","react-native":"./src/index.tsx","codegenConfig":{"ios":{"modulesProvider":{"NativeBiometrics":"BiometricsSpec"}},"name":"BiometricsSpec","type":"modules","android":{"javaPackageName":"com.biometrics"},"jsSrcsDir":"src"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@3.6.1","devDependencies":{"jest":"^29.7.0","react":"19.0.0","turbo":"^1.10.7","eslint":"^9.22.0","del-cli":"^5.1.0","prettier":"^3.0.3","@eslint/js":"^9.22.0","commitlint":"^19.6.1","release-it":"^17.10.0","typescript":"^5.8.3","@types/jest":"^29.5.5","@types/react":"^19.0.0","react-native":"0.79.2","@eslint/compat":"^1.2.7","@eslint/eslintrc":"^3.3.0","@evilmartians/lefthook":"^1.5.0","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.3","react-native-builder-bob":"^0.40.12","@react-native/babel-preset":"0.79.2","@react-native-community/cli":"15.0.0-alpha.2","@react-native/eslint-config":"^0.78.0","@commitlint/config-conventional":"^19.6.0","@release-it/conventional-changelog":"^9.0.2"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-biometrics_1.0.1_1750678303295_0.2573380752264587","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","version":"0.51.0","template":"turbo","languages":"kotlin-objc","namespace":"com.boindahood"}},"1.0.2":{"name":"@boindahood/react-native-biometrics","version":"1.0.2","keywords":["react-native","ios","android"],"author":{"url":"https://github.com/chubo274","name":"boindahood","email":"chubo274@gmail.com"},"license":"MIT","_id":"@boindahood/react-native-biometrics@1.0.2","maintainers":[{"name":"chubo274","email":"chubo274@gmail.com"}],"homepage":"https://github.com/chubo274/react-native-biometrics#readme","bugs":{"url":"https://github.com/chubo274/react-native-biometrics/issues"},"dist":{"shasum":"1ec0b813ebb9d0b16879e2edacea9687c043efa7","tarball":"https://registry.npmjs.org/@boindahood/react-native-biometrics/-/react-native-biometrics-1.0.2.tgz","fileCount":23,"integrity":"sha512-K14V7ekWrB3huD+AoEQaLl4g/K7HdIqm6eex0V0JhpA812iUPR5YobSwh5L6HAYjSYsvf6I1e94sXgYDOKmehw==","signatures":[{"sig":"MEUCICDtRJzA/dGEE70jleZhn8QtFqwY6NNfhUVL8BNoDRBxAiEAqq3TCk4f2dOjDxoHctRIDGeCMbBaKeQ7nGYXr3BC72M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64461},"jest":{"preset":"react-native","modulePathIgnorePatterns":["<rootDir>/example/node_modules","<rootDir>/lib/"]},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"a97028f9dace90303e1e4f703cafb53d28a8241c","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace react-native-biometrics-example","prepare":"bob build","release":"release-it --only-version","typecheck":"tsc","postinstall":"react-native setup-ios-permissions || true"},"_npmUser":{"name":"chubo274","actor":{"name":"chubo274","type":"user","email":"chubo274@gmail.com"},"email":"chubo274@gmail.com"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"commitlint":{"extends":["@commitlint/config-conventional"]},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore: release ${version}"},"npm":{"publish":true},"github":{"release":true},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"repository":{"url":"git+https://github.com/chubo274/react-native-biometrics.git","type":"git"},"workspaces":["example"],"_npmVersion":"10.8.2","description":"react native biometrics","directories":{},"_nodeVersion":"20.19.2","react-native":"./src/index.tsx","codegenConfig":{"ios":{"modulesProvider":{"NativeBiometrics":"BiometricsSpec"}},"name":"BiometricsSpec","type":"modules","android":{"javaPackageName":"com.biometrics"},"jsSrcsDir":"src"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@3.6.1","devDependencies":{"jest":"^29.7.0","react":"19.0.0","turbo":"^1.10.7","eslint":"^9.22.0","del-cli":"^5.1.0","prettier":"^3.0.3","@eslint/js":"^9.22.0","commitlint":"^19.6.1","release-it":"^17.10.0","typescript":"^5.8.3","@types/jest":"^29.5.5","@types/react":"^19.0.0","react-native":"0.79.2","@eslint/compat":"^1.2.7","@eslint/eslintrc":"^3.3.0","@evilmartians/lefthook":"^1.5.0","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.3","react-native-builder-bob":"^0.40.12","@react-native/babel-preset":"0.79.2","@react-native-community/cli":"15.0.0-alpha.2","@react-native/eslint-config":"^0.78.0","@commitlint/config-conventional":"^19.6.0","@release-it/conventional-changelog":"^9.0.2"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-biometrics_1.0.2_1750687698361_0.44638980333370926","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","version":"0.51.0","template":"turbo","languages":"kotlin-objc","namespace":"com.boindahood"}},"1.0.3":{"name":"@boindahood/react-native-biometrics","version":"1.0.3","keywords":["react-native","ios","android"],"author":{"url":"https://github.com/chubo274","name":"boindahood","email":"chubo274@gmail.com"},"license":"MIT","_id":"@boindahood/react-native-biometrics@1.0.3","maintainers":[{"name":"chubo274","email":"chubo274@gmail.com"}],"homepage":"https://github.com/chubo274/react-native-biometrics#readme","bugs":{"url":"https://github.com/chubo274/react-native-biometrics/issues"},"dist":{"shasum":"b46aaf8522845b0ce1ff2becc8bbe571bcbfcd69","tarball":"https://registry.npmjs.org/@boindahood/react-native-biometrics/-/react-native-biometrics-1.0.3.tgz","fileCount":23,"integrity":"sha512-YHI/Pt+6n71IF31qStZBH2dDBSX52JIgUYg5b6su2f3WADLPO7lOyq7bOFLhlgdN6ugWNmLqBf2RQ4uLqJ+fIg==","signatures":[{"sig":"MEYCIQC+zaPzWFQegLmrATwoOg536y9OpKPexQt+ilxlPfmV0gIhAKFmLfDgYvUadycuh2n4KpL611bVl9oGf7MYZrjAWNAw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64449},"jest":{"preset":"react-native","modulePathIgnorePatterns":["<rootDir>/example/node_modules","<rootDir>/lib/"]},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"54319c8582348c572f7d6371d5cca547256f9786","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace react-native-biometrics-example","prepare":"bob build","release":"release-it --only-version","typecheck":"tsc","postinstall":"react-native setup-ios-permissions || true"},"_npmUser":{"name":"chubo274","actor":{"name":"chubo274","type":"user","email":"chubo274@gmail.com"},"email":"chubo274@gmail.com"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"commitlint":{"extends":["@commitlint/config-conventional"]},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore: release ${version}"},"npm":{"publish":true},"github":{"release":true},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"repository":{"url":"git+https://github.com/chubo274/react-native-biometrics.git","type":"git"},"workspaces":["example"],"_npmVersion":"10.8.2","description":"react native biometrics","directories":{},"_nodeVersion":"20.19.2","react-native":"./src/index.tsx","codegenConfig":{"ios":{"modulesProvider":{"NativeBiometrics":"BiometricsSpec"}},"name":"BiometricsSpec","type":"modules","android":{"javaPackageName":"com.biometrics"},"jsSrcsDir":"src"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@3.6.1","devDependencies":{"jest":"^29.7.0","react":"19.0.0","turbo":"^1.10.7","eslint":"^9.22.0","del-cli":"^5.1.0","prettier":"^3.0.3","@eslint/js":"^9.22.0","commitlint":"^19.6.1","release-it":"^17.10.0","typescript":"^5.8.3","@types/jest":"^29.5.5","@types/react":"^19.0.0","react-native":"0.79.2","@eslint/compat":"^1.2.7","@eslint/eslintrc":"^3.3.0","@evilmartians/lefthook":"^1.5.0","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.3","react-native-builder-bob":"^0.40.12","@react-native/babel-preset":"0.79.2","@react-native-community/cli":"15.0.0-alpha.2","@react-native/eslint-config":"^0.78.0","@commitlint/config-conventional":"^19.6.0","@release-it/conventional-changelog":"^9.0.2"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-biometrics_1.0.3_1750687981776_0.28581565004375364","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","version":"0.51.0","template":"turbo","languages":"kotlin-objc","namespace":"com.boindahood"}},"1.0.4":{"name":"@boindahood/react-native-biometrics","version":"1.0.4","keywords":["react-native","ios","android"],"author":{"url":"https://github.com/chubo274","name":"boindahood","email":"chubo274@gmail.com"},"license":"MIT","_id":"@boindahood/react-native-biometrics@1.0.4","maintainers":[{"name":"chubo274","email":"chubo274@gmail.com"}],"homepage":"https://github.com/chubo274/react-native-biometrics#readme","bugs":{"url":"https://github.com/chubo274/react-native-biometrics/issues"},"dist":{"shasum":"6095db0fe73a3577abac92b730d05c91330c95c1","tarball":"https://registry.npmjs.org/@boindahood/react-native-biometrics/-/react-native-biometrics-1.0.4.tgz","fileCount":26,"integrity":"sha512-sCIdy91ZjC8a/uA49a8C2mNZjh4LYB6poHwaT4K+eKoW9+RtaoUIC9F+u1VaOvsqHvZeqI624cuLi/HCEY25mQ==","signatures":[{"sig":"MEUCIQCPseQGfvOzkO7MOfeHtN6MfpDfIpv41NlwjbTVF7IrvgIgSQPoCjjF4rwKMzYgGcQyh5LnXCjjx0JjotWC8S20e4A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108227},"jest":{"preset":"react-native","modulePathIgnorePatterns":["<rootDir>/example/node_modules","<rootDir>/lib/"]},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"d81fcdea5af80a9dc390c7a971ad3e1c30422ee4","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace react-native-biometrics-example","prepare":"bob build","release":"release-it --only-version","typecheck":"tsc","postinstall":"react-native setup-ios-permissions || true"},"_npmUser":{"name":"chubo274","actor":{"name":"chubo274","type":"user","email":"chubo274@gmail.com"},"email":"chubo274@gmail.com"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"commitlint":{"extends":["@commitlint/config-conventional"]},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore: release ${version}"},"npm":{"publish":true},"github":{"release":true},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"repository":{"url":"git+https://github.com/chubo274/react-native-biometrics.git","type":"git"},"workspaces":["example"],"_npmVersion":"10.8.2","description":"react native biometrics","directories":{},"_nodeVersion":"20.19.2","react-native":"./src/index.tsx","codegenConfig":{"ios":{"modulesProvider":{"NativeBiometrics":"BiometricsSpec"}},"name":"BiometricsSpec","type":"modules","android":{"javaPackageName":"com.biometrics"},"jsSrcsDir":"src"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@3.6.1","devDependencies":{"jest":"^29.7.0","react":"19.0.0","turbo":"^1.10.7","eslint":"^9.22.0","del-cli":"^5.1.0","prettier":"^3.0.3","@eslint/js":"^9.22.0","commitlint":"^19.6.1","release-it":"^17.10.0","typescript":"^5.8.3","@types/jest":"^29.5.5","@types/react":"^19.0.0","react-native":"0.79.2","@eslint/compat":"^1.2.7","@eslint/eslintrc":"^3.3.0","@evilmartians/lefthook":"^1.5.0","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.3","react-native-builder-bob":"^0.40.12","@react-native/babel-preset":"0.79.2","@react-native-community/cli":"15.0.0-alpha.2","@react-native/eslint-config":"^0.78.0","@commitlint/config-conventional":"^19.6.0","@release-it/conventional-changelog":"^9.0.2"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-biometrics_1.0.4_1750808023537_0.32014725624100726","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","version":"0.51.0","template":"turbo","languages":"kotlin-objc","namespace":"com.boindahood"}},"1.0.5":{"name":"@boindahood/react-native-biometrics","version":"1.0.5","description":"react native biometrics","main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","react-native":"./src/index.tsx","exports":{".":{"source":"./src/index.tsx","types":"./lib/typescript/src/index.d.ts","default":"./lib/module/index.js"},"./package.json":"./package.json"},"scripts":{"example":"yarn workspace react-native-biometrics-example","test":"jest","typecheck":"tsc","lint":"eslint \"**/*.{js,ts,tsx}\"","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","prepare":"bob build","postinstall":"react-native setup-ios-permissions || true","release":"release-it --only-version"},"keywords":["react-native","ios","android"],"repository":{"type":"git","url":"git+https://github.com/chubo274/react-native-biometrics.git"},"author":{"name":"boindahood","email":"chubo274@gmail.com","url":"https://github.com/chubo274"},"license":"MIT","bugs":{"url":"https://github.com/chubo274/react-native-biometrics/issues"},"homepage":"https://github.com/chubo274/react-native-biometrics#readme","publishConfig":{"registry":"https://registry.npmjs.org/"},"devDependencies":{"@commitlint/config-conventional":"^19.6.0","@eslint/compat":"^1.2.7","@eslint/eslintrc":"^3.3.0","@eslint/js":"^9.22.0","@evilmartians/lefthook":"^1.5.0","@react-native-community/cli":"15.0.0-alpha.2","@react-native/babel-preset":"0.79.2","@react-native/eslint-config":"^0.78.0","@release-it/conventional-changelog":"^9.0.2","@types/jest":"^29.5.5","@types/react":"^19.0.0","commitlint":"^19.6.1","del-cli":"^5.1.0","eslint":"^9.22.0","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.3","jest":"^29.7.0","prettier":"^3.0.3","react":"19.0.0","react-native":"0.79.2","react-native-builder-bob":"^0.40.12","release-it":"^17.10.0","turbo":"^1.10.7","typescript":"^5.8.3"},"peerDependencies":{"react":"*","react-native":"*"},"workspaces":["example"],"packageManager":"yarn@3.6.1","jest":{"preset":"react-native","modulePathIgnorePatterns":["<rootDir>/example/node_modules","<rootDir>/lib/"]},"commitlint":{"extends":["@commitlint/config-conventional"]},"release-it":{"git":{"commitMessage":"chore: release ${version}","tagName":"v${version}"},"npm":{"publish":true},"github":{"release":true},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"prettier":{"quoteProps":"consistent","singleQuote":true,"tabWidth":2,"trailingComma":"es5","useTabs":false},"react-native-builder-bob":{"source":"src","output":"lib","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"codegenConfig":{"name":"BiometricsSpec","type":"modules","jsSrcsDir":"src","ios":{"modulesProvider":{"NativeBiometrics":"BiometricsSpec"}},"android":{"javaPackageName":"com.biometrics"}},"create-react-native-library":{"template":"turbo","namespace":"com.boindahood","languages":"kotlin-objc","type":"turbo-module","version":"0.51.0"},"_id":"@boindahood/react-native-biometrics@1.0.5","gitHead":"d81fcdea5af80a9dc390c7a971ad3e1c30422ee4","_nodeVersion":"20.19.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-efM4vvJQuEP6ksRL7TROSKbF/j0Wjarv/LhYn+PQv5wySZAJ4zKHXn/rgn0C92b2XW5M0Lxrdqs1NUa4l/Likw==","shasum":"b8d97e9a0c275cf9c65675bdfc17931f5459cc02","tarball":"https://registry.npmjs.org/@boindahood/react-native-biometrics/-/react-native-biometrics-1.0.5.tgz","fileCount":26,"unpackedSize":110036,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDJ42zD0oVshkb1nyKrQn7m3vA2AhQP2u+rJrWzw1KxBwIgKFP9K9FhZEgQNDgKP3ake5GmYTQO0cj6H+CwuU3bFG8="}]},"_npmUser":{"name":"chubo274","email":"chubo274@gmail.com","actor":{"name":"chubo274","email":"chubo274@gmail.com","type":"user"}},"directories":{},"maintainers":[{"name":"chubo274","email":"chubo274@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-biometrics_1.0.5_1750832278628_0.16758072729719609"},"_hasShrinkwrap":false}},"time":{"created":"2025-06-23T11:31:42.919Z","modified":"2025-06-25T06:17:59.148Z","1.0.1":"2025-06-23T11:31:43.463Z","1.0.2":"2025-06-23T14:08:18.531Z","1.0.3":"2025-06-23T14:13:01.975Z","1.0.4":"2025-06-24T23:33:43.699Z","1.0.5":"2025-06-25T06:17:58.937Z"},"bugs":{"url":"https://github.com/chubo274/react-native-biometrics/issues"},"author":{"name":"boindahood","email":"chubo274@gmail.com","url":"https://github.com/chubo274"},"license":"MIT","homepage":"https://github.com/chubo274/react-native-biometrics#readme","keywords":["react-native","ios","android"],"repository":{"type":"git","url":"git+https://github.com/chubo274/react-native-biometrics.git"},"description":"react native biometrics","maintainers":[{"name":"chubo274","email":"chubo274@gmail.com"}],"readme":"# @boindahood/react-native-biometrics\n\nReact Native biometric authentication with private key management. Create biometric-protected private keys and digital signatures using native iOS Keychain and Android Keystore.\n\n[![npm version](https://badge.fury.io/js/@boindahood%2Freact-native-biometrics.svg)](https://badge.fury.io/js/@boindahood%2Freact-native-biometrics)\n[![npm downloads](https://img.shields.io/npm/dt/@boindahood/react-native-biometrics.svg)](https://www.npmjs.com/package/@boindahood/react-native-biometrics)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## Features\n\n✅ **Biometric Authentication** - Face ID, Touch ID, Fingerprint, Iris recognition  \n✅ **Private Key Management** - Hardware-protected private keys with biometric access  \n✅ **Digital Signatures** - Create cryptographic signatures with biometric authentication  \n✅ **Cross Platform** - iOS (Keychain) and Android (Keystore) native storage  \n✅ **TypeScript** - Full type definitions included  \n✅ **TurboModule** - Built for React Native's new architecture\n\n## 🎉 What's New in v1.0.4\n\n### Private Key Management\n- **Hardware-protected keys**: Create and manage biometric-protected private keys\n- **Digital signatures**: Sign data with biometric authentication: `createSignature`\n- **Cross-platform security**: Secure Enclave (iOS) + Android Keystore support\n- **Key lifecycle management**: Create, check existence, and delete keys: `createBiometricKey`, `biometricKeyExists`, `deleteBiometricKey`\n\n### Breaking Changes\n- `enum` `BiometricOtherwayMode: 'hide' | 'callback' | 'PIN'`\n- `otherwayWithPIN: boolean` → `otherwayWith: BiometricOtherwayMode`\n- **New `otherwayWith` modes**: Replaced `otherwayWithPIN: boolean` with flexible mode system\n  - `'hide'`: **iOS only** - Biometric-only authentication, no fallback button  \n  - `'callback'`: Custom fallback button with `pressedOtherway` callback\n  - `'PIN'`: **Default mode** - Native device PIN/passcode authentication\n\n![usage-private-key-flow](https://raw.githubusercontent.com/chubo274/react-native-biometrics/main/assets/usage-private-key-flow.png)\n\n## Screenshots\n\n| iOS Authentication | iOS \"Another way\" fallback | Android \"Another way\" fallback |\n|:---:|:---:|:---:|\n| ![iOS Authentication](https://raw.githubusercontent.com/chubo274/react-native-biometrics/main/assets/Ios-authentication.PNG) | ![iOS Fallback](https://raw.githubusercontent.com/chubo274/react-native-biometrics/main/assets/Ios-another-way.PNG) | ![Android Authentication](https://raw.githubusercontent.com/chubo274/react-native-biometrics/main/assets/android.png) |\n\n## Installation\n\n```bash\nnpm install @boindahood/react-native-biometrics\n# or\nyarn add @boindahood/react-native-biometrics\n```\n\n### iOS Setup\n\n1. Add the following to your `Info.plist`:\n\n```xml\n<key>NSFaceIDUsageDescription</key>\n<string>This app uses Face/Touch ID for secure authentication</string>\n```\n\n2. The library automatically links with LocalAuthentication framework.\n\n### Android Setup\n\n1. Add the following permissions to your `android/app/src/main/AndroidManifest.xml`:\n\n```xml\n<uses-permission android:name=\"android.permission.USE_BIOMETRIC\" />\n<uses-permission android:name=\"android.permission.USE_FINGERPRINT\" />\n```\n\n2. Ensure your `minSdkVersion` is at least 23 in `android/app/build.gradle`:\n\n```gradle\nandroid {\n    defaultConfig {\n        minSdkVersion 23\n        // ...\n    }\n}\n```\n\n## Usage\n\n### Basic Authentication\n\n```typescript\nimport ReactNativeBiometrics, { BiometricOtherwayModem, BiometricType, BiometricErrorCode } from '@boindahood/react-native-biometrics';\n\n// Check if biometric authentication is available\nconst result = await ReactNativeBiometrics.checkBiometricAvailability();\n\nif (result.isAvailable) {\n  // Authenticate with custom prompt\n  const authResult = await ReactNativeBiometrics.authenticateBiometric({\n    titlePrompt: 'Authenticate',\n    otherwayWith: BiometricOtherwayMode.PIN\n  });\n  \n  if (authResult.success) {\n    console.log('Authentication successful');\n  } else if (authResult.pressedOtherway) {\n    console.log('User chose PIN authentication');\n  }\n}\n```\n\n### Private Key Management\n\n```typescript\n// Create a biometric-protected private key\nconst createResult = await ReactNativeBiometrics.createBiometricKey();\n\nif (createResult.success) {\n  // Create a digital signature with custom prompt\n  const signResult = await ReactNativeBiometrics.createSignature('data to sign', {\n    titlePrompt: 'Sign Transaction',\n    otherwayWith: BiometricOtherwayMode.CALLBACK,\n    otherwayText: 'Use Password'\n  });\n  \n  if (signResult.success && signResult.signature) {\n    console.log('Signature:', signResult.signature);\n  } else if (signResult.pressedOtherway) {\n    console.log('User wants to use password instead');\n  }\n}\n```\n\n## API Reference\n\n### checkBiometricAvailability()\n\nChecks if biometric authentication is available on the device.\n\n**Returns:** `Promise<BiometricAvailability>`\n\n| Property | Type | Description | iOS | Android |\n|:---------|:-----|:------------|:---:|:-------:|\n| isAvailable | boolean | Device supports and has biometrics enrolled | ✔ | ✔ |\n| allowAccess | boolean | App has permission to use biometrics | ✔ | ✔ |\n| biometricType | BiometricType | Primary biometric type available | ✔ | ✔ |\n| errorCode | BiometricErrorCode? | Error code if not available | ✔ | ✔ |\n| errorMessage | string? | Error message if not available | ✔ | ✔ |\n\nExample:\n```typescript\nconst result = await ReactNativeBiometrics.checkBiometricAvailability();\n\nif (result.isAvailable) {\n  console.log(`Biometric type: ${result.biometricType}`);\n} else {\n  console.log(`Error: ${result.errorMessage}`);\n}\n```\n\n### requestBiometricPermission()\n\nRequests permission to use biometric authentication.\n\n**Note:** \n- **iOS**: Triggers biometric permission prompt - user must grant access to use Face ID/Touch ID\n- **Android**: Always returns `success: true` (permissions granted via manifest)\n\n**Returns:** `Promise<BiometricPermissionResult>`\n\n| Property | Type | Description | iOS | Android |\n|:---------|:-----|:------------|:---:|:-------:|\n| success | boolean | Permission granted by user (iOS) or automatically granted (Android) | ✔ | ✔ |\n| errorCode | BiometricErrorCode? | Error code if permission denied or hardware issues | ✔ | ✔ |\n| errorMessage | string? | Error message if permission denied or hardware issues | ✔ | ✔ |\n\nExample:\n```typescript\nconst result = await ReactNativeBiometrics.requestBiometricPermission();\n\nif (result.success) {\n  console.log('Permission granted');\n}\n```\n\n### authenticateBiometric(options?)\n\nPerforms biometric authentication with customizable prompts and fallback options.\n\n**Options Object:**\n\n| Property | Type | Description | iOS | Android |\n|:---------|:-----|:------------|:---:|:-------:|\n| titlePrompt | string? | Main authentication prompt title | ✔ | ✔ |\n| otherwayWith | 'hide' \\| 'callback' \\| 'PIN'? | Fallback button behavior (default: 'PIN') | ✔ | ✔ |\n| otherwayText | string? | Custom fallback button text (required on Android, fallback: \"Another way\") | ✔ | ✔ |\n\n**Fallback Options:**\n- `'hide'`: **iOS only** - No fallback button, biometric-only authentication (Android defaults to PIN)\n- `'callback'`: Show fallback button with custom text, returns `pressedOtherway: true` when pressed\n- `'PIN'` (default): Allow device PIN/passcode as authentication alternative\n\n**Result Object:**\n\n| Property | Type | Description | iOS | Android |\n|:---------|:-----|:------------|:---:|:-------:|\n| success | boolean | Authentication successful | ✔ | ✔ |\n| pressedOtherway | boolean? | User pressed fallback button (when otherwayWith='callback') | ✔ | ✔ |\n| errorCode | BiometricErrorCode? | Error code if authentication failed | ✔ | ✔ |\n| errorMessage | string? | Error message if authentication failed | ✔ | ✔ |\n\nExample:\n```typescript\n// Simple biometric authentication (defaults to PIN fallback)\nconst result = await ReactNativeBiometrics.authenticateBiometric({\n  titlePrompt: 'Authenticate'\n});\n\n// Explicitly with PIN fallback\nconst result = await ReactNativeBiometrics.authenticateBiometric({\n  titlePrompt: 'Secure Login',\n  otherwayWith: BiometricOtherwayMode.PIN\n});\n\n// With custom callback button\nconst result = await ReactNativeBiometrics.authenticateBiometric({\n  titlePrompt: 'Biometric Auth',\n  otherwayWith: BiometricOtherwayMode.CALLBACK,\n  otherwayText: 'Use Password'\n});\n\nif (result.success) {\n  console.log('Authentication successful');\n} else if (result.pressedOtherway) {\n  console.log('User chose alternative authentication');\n}\n```\n\n### authenticatePIN()\n\nPerforms authentication using device PIN/passcode only.\n- **Android**:  working normally, it just open prompt PIN only.\n- **iOS**: open prompt full with Biometric + PIN flow (via manifest)\n\n**Returns:** `Promise<BiometricAuthResult>`\n\n| Property | Type | Description | iOS | Android |\n|:---------|:-----|:------------|:---:|:-------:|\n| success | boolean | Authentication successful | ✔ | ✔ |\n| errorCode | BiometricErrorCode? | Error code if authentication failed | ✔ | ✔ |\n| errorMessage | string? | Error message if authentication failed | ✔ | ✔ |\n\nExample:\n```typescript\nconst result = await ReactNativeBiometrics.authenticatePIN();\n\nif (result.success) {\n  console.log('PIN authentication successful');\n}\n```\n\n### createBiometricKey()\n\nCreates a new biometric-protected private key. Only one key per app is allowed for security.\n\n**Returns:** `Promise<BiometricKeyResult>`\n\n| Property | Type | Description | iOS | Android |\n|:---------|:-----|:------------|:---:|:-------:|\n| success | boolean | Key created successfully | ✔ | ✔ |\n| errorCode | BiometricErrorCode? | Error code if creation failed (e.g., BIOMETRIC_KEY_EXISTS) | ✔ | ✔ |\n| errorMessage | string? | Error message if creation failed | ✔ | ✔ |\n\nExample:\n```typescript\nconst result = await ReactNativeBiometrics.createBiometricKey();\n\nif (result.success) {\n  console.log('Biometric key created successfully');\n} else if (result.errorCode === 'BIOMETRIC_KEY_EXISTS') {\n  console.log('Key already exists');\n}\n```\n\n### biometricKeyExists()\n\nChecks if a biometric-protected private key exists.\n\n**Returns:** `Promise<BiometricKeyExistsResult>`\n\n| Property | Type | Description | iOS | Android |\n|:---------|:-----|:------------|:---:|:-------:|\n| exists | boolean | Key exists in keystore | ✔ | ✔ |\n| errorCode | BiometricErrorCode? | Error code if check failed | ✔ | ✔ |\n| errorMessage | string? | Error message if check failed | ✔ | ✔ |\n\nExample:\n```typescript\nconst result = await ReactNativeBiometrics.biometricKeyExists();\n\nif (result.exists) {\n  console.log('Biometric key exists');\n} else {\n  console.log('No biometric key found');\n}\n```\n\n### deleteBiometricKey()\n\nDeletes the biometric-protected private key.\n\n**Returns:** `Promise<BiometricKeyResult>`\n\n| Property | Type | Description | iOS | Android |\n|:---------|:-----|:------------|:---:|:-------:|\n| success | boolean | Key deleted successfully | ✔ | ✔ |\n| errorCode | BiometricErrorCode? | Error code if deletion failed | ✔ | ✔ |\n| errorMessage | string? | Error message if deletion failed | ✔ | ✔ |\n\nExample:\n```typescript\nconst result = await ReactNativeBiometrics.deleteBiometricKey();\n\nif (result.success) {\n  console.log('Biometric key deleted successfully');\n}\n```\n\n### createSignature(payload, options?)\n\nCreates a digital signature using the biometric-protected private key. Requires biometric authentication with customizable prompts.\n\n**IOS:** options not working for this case, SecKey of iphone will automatic handle this flow. We cant make any impact\n\n**Parameters:**\n\n| Parameter | Type | Description |\n|:----------|:-----|:------------|\n| payload | string | The data to sign |\n| options | BiometricAuthOptions? | Authentication options for prompt customization |\n\n**Options Object:** (Same as authenticateBiometric)\n\n| Property | Type | Description | iOS | Android |\n|:---------|:-----|:------------|:---:|:-------:|\n| titlePrompt | string? | Main authentication prompt title | ✖ | ✔ |\n| otherwayWith | 'hide' \\| 'callback' \\| 'PIN'? | Fallback button behavior (default: 'PIN') | ✖ | ✔ |\n| otherwayText | string? | Custom fallback button text (required on Android, fallback: \"Another way\") | ✖ | ✔ |\n\n**Returns:** `Promise<BiometricSignatureResult>`\n\n| Property | Type | Description | iOS | Android |\n|:---------|:-----|:------------|:---:|:-------:|\n| success | boolean | Signature created successfully | ✔ | ✔ |\n| signature | string? | Base64 encoded signature | ✔ | ✔ |\n| pressedOtherway | boolean? | User pressed fallback button (when otherwayWith='callback') | ✔ | ✔ |\n| errorCode | BiometricErrorCode? | Error code if signature creation failed | ✔ | ✔ |\n| errorMessage | string? | Error message if signature creation failed | ✔ | ✔ |\n\nExample:\n```typescript\n// Basic signature creation (defaults to PIN fallback)\nconst result = await ReactNativeBiometrics.createSignature('data to sign');\n\n// Explicitly with PIN fallback\nconst result = await ReactNativeBiometrics.createSignature('data to sign', {\n  titlePrompt: 'Sign Transaction',\n  otherwayWith: BiometricOtherwayMode.PIN\n});\n\nif (result.success && result.signature) {\n  console.log('Signature:', result.signature);\n  // Use the signature for authentication or verification\n} else if (result.pressedOtherway) {\n  console.log('User chose alternative authentication');\n}\n```\n\n## Biometric Types\n\n| Type | Platform | Description |\n|:-----|:---------|:------------|\n| `touchId` | iOS | Touch ID fingerprint sensor |\n| `faceId` | iOS/Android | Face ID facial recognition |\n| `fingerprint` | Android | Fingerprint sensor |\n| `iris` | Android | Iris recognition sensor |\n\nExample:\n```typescript\nimport { BiometricType } from '@boindahood/react-native-biometrics'\n\nconst { biometricType } = await ReactNativeBiometrics.checkBiometricAvailability()\n\nswitch (biometricType) {\n  case BiometricType.TOUCH_ID:\n    console.log('Touch ID available')\n    break\n  case BiometricType.FACE_ID:\n    console.log('Face ID available')\n    break\n  case BiometricType.FINGERPRINT:\n    console.log('Fingerprint available')\n    break\n  case BiometricType.IRIS:\n    console.log('Iris recognition available')\n    break\n  default:\n    console.log('No biometrics available')\n}\n```\n\n## Error Handling\n\nThe library provides comprehensive error handling with standardized error codes:\n\n| Error Code | Description | iOS | Android |\n|:-----------|:------------|:---:|:-------:|\n| BIOMETRIC_NOT_AVAILABLE | Biometric hardware not available | ✔ | ✔ |\n| BIOMETRIC_NOT_ENROLLED | No biometric credentials enrolled | ✔ | ✔ |\n| BIOMETRIC_PERMISSION_DENIED | App doesn't have biometric permission | ✔ | ✔ |\n| BIOMETRIC_LOCKOUT | Too many failed attempts, temporarily locked | ✔ | ✔ |\n| BIOMETRIC_LOCKOUT_PERMANENT | Permanently locked, requires device unlock | ✔ | ✔ |\n| BIOMETRIC_AUTH_FAILED | Authentication failed | ✔ | ✔ |\n| BIOMETRIC_USER_CANCEL | User canceled authentication | ✔ | ✔ |\n| BIOMETRIC_SYSTEM_CANCEL | System canceled authentication | ✔ | ✔ |\n| BIOMETRIC_PRESSED_OTHER_WAY | User pressed fallback button | ✔ | ✔ |\n| BIOMETRIC_KEY_EXISTS | Biometric key already exists | ✔ | ✔ |\n| BIOMETRIC_KEY_NOT_FOUND | Biometric key not found | ✔ | ✔ |\n| BIOMETRIC_UNKNOWN_ERROR | Unknown error occurred | ✔ | ✔ |\n\nExample:\n```typescript\nimport { BiometricErrorCode, BiometricOtherwayMode } from '@boindahood/react-native-biometrics'\n\nconst result = await ReactNativeBiometrics.authenticateBiometric({\n  titlePrompt: 'Authenticate',\n  otherwayWith: BiometricOtherwayMode.CALLBACK,\n  otherwayText: 'Use Password'\n})\n\nif (!result.success) {\n  switch (result.errorCode) {\n    case BiometricErrorCode.BIOMETRIC_NOT_AVAILABLE:\n      console.log('Biometric hardware not available')\n      break\n    case BiometricErrorCode.BIOMETRIC_NOT_ENROLLED:\n      console.log('No biometric credentials enrolled')\n      break\n    case BiometricErrorCode.BIOMETRIC_LOCKOUT:\n      console.log('Too many failed attempts, try again later')\n      break\n    case BiometricErrorCode.BIOMETRIC_USER_CANCEL:\n      console.log('User canceled authentication')\n      break\n    case BiometricErrorCode.BIOMETRIC_PRESSED_OTHER_WAY:\n      console.log('User pressed fallback button')\n      // Handle custom authentication flow\n      break\n    // Handle other error codes...\n  }\n} else if (result.pressedOtherway) {\n  console.log('User wants to use alternative authentication')\n  // Handle fallback authentication\n}\n```\n\n## Platform Differences\n\n### iOS\n- Uses Local Authentication framework with Keychain Services\n- Face ID and Touch ID support\n- **Requires user permission** - first biometric access triggers system permission prompt\n- Supports device passcode fallback via `otherwayWith: 'PIN'`\n- Private keys stored in Secure Enclave when available\n- **Prompt customization**: `titlePrompt` works for all authentication methods\n- **createSignature**: iOS automatically handles biometric prompt, options mainly for consistency\n\n### Android\n- Uses AndroidX Biometric library with Android Keystore\n- authenticate simple use BIOMETRIC_WEAK prefer: finger > face > iris (avoid BIOMETRIC_LOCKOUT_PERMANENT when user input wrong too many)\n- authenticate for createSignature use BIOMETRIC_STRONG\n- **Permissions granted via manifest** - no runtime permission needed\n- Supports fingerprint, face, and iris recognition\n- Supports device PIN/pattern/password fallback via `otherwayWith: 'PIN'`\n- Private keys stored in hardware-backed Android Keystore\n- **Prompt customization**: Full support for all `BiometricAuthOptions` properties\n- **Fallback behavior**: \n  - `'hide'`: Biometric-only, no fallback button\n  - `'callback'`: Custom fallback button, returns `pressedOtherway: true`\n  - `'PIN'`: Native PIN/pattern/password fallback option\n\n### Lockout Detection\n\n**Important:** Both platforms can only reliably detect biometric lockout status during authentication attempts. The lockout information is provided through error codes:\n\n- `BIOMETRIC_LOCKOUT` - Temporary lockout (30 seconds on Android, varies on iOS)\n- `BIOMETRIC_LOCKOUT_PERMANENT` - Permanent lockout, requires device unlock\n\nTo handle lockout, catch these error codes during authentication and guide users accordingly.\n\n## Requirements\n\n- React Native >= 0.70\n- iOS >= 12.0\n- Android API >= 23\n\n## Example App\n\nThe library includes a comprehensive example app demonstrating all features. To run the example:\n\n```bash\ncd example\nyarn install\n\n# For iOS\nyarn ios\n\n# For Android  \nyarn android\n```\n\n## Contributing\n\nSee the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow.\n\n## License\n\nMIT\n\n## Support\n\n- 📖 [Documentation](https://github.com/chubo274/react-native-biometrics#readme)\n- 🐛 [Bug Reports](https://github.com/chubo274/react-native-biometrics/issues)\n- 💡 [Feature Requests](https://github.com/chubo274/react-native-biometrics/issues)\n\n---\n\nMade with ❤️ by [boindahood](https://github.com/chubo274)\n","readmeFilename":"README.md"}