{"_id":"@akta/react-native-passkey-autofill","_rev":"3-3b97919c2bc2765311c2765435136a9f","name":"@akta/react-native-passkey-autofill","dist-tags":{"latest":"1.0.0-canary.18"},"versions":{"1.0.0-canary.16":{"name":"@akta/react-native-passkey-autofill","version":"1.0.0-canary.16","keywords":["@akta/react-native-passkey-autofill","ReactNativePasskeyAutofill","expo","react-native"],"author":{"name":"Algorand Foundation"},"license":"Apache-2.0","_id":"@akta/react-native-passkey-autofill@1.0.0-canary.16","maintainers":[{"name":"krby","email":"kyle.breeding@algorand.foundation"}],"homepage":"https://github.com/akita-protocol/react-native-passkey-autofill#readme","bugs":{"url":"https://github.com/akita-protocol/react-native-passkey-autofill/issues"},"dist":{"shasum":"7d21ed9d872e83d49de15955e0ab0d210b49a449","tarball":"https://registry.npmjs.org/@akta/react-native-passkey-autofill/-/react-native-passkey-autofill-1.0.0-canary.16.tgz","fileCount":65,"integrity":"sha512-Cwl48tpS+atofnSCd/WO8Fpb10r65kiRpRnrB8i36f4vz3WAuYJTh4uHHGP2YV11OIIXSU7VWikIhWS2rjTZ2g==","signatures":[{"sig":"MEYCIQCgQJdflgWe++qzTtaOh1tkDtc1nVx4JC5q8S6QqLjWugIhALIId/t2dVeY1z85wEYaTj30v+ifMq9LB8ZmnV7Z0dS+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":414293},"jest":{"preset":"ts-jest","testMatch":["<rootDir>/src/**/__tests__/**/*.test.ts"],"testEnvironment":"node"},"main":"build/index.js","pnpm":{"overrides":{"expo":"55.0.17","react":"19.2.0","eslint":"^9.7.0","prettier":"^3.0.0","react-dom":"19.2.0","qs@<6.14.1":">=6.14.1","@types/react":"~19.2.10","uuid@<14.0.0":">=14.0.0","yauzl@=3.2.0":">=3.2.1","@xmldom/xmldom":"0.8.13","postcss@<8.5.10":">=8.5.10","lodash@<=4.17.23":">=4.18.0","basic-ftp@<=5.2.2":">=5.3.0","on-headers@<1.1.0":">=1.1.0","react-native-mmkv":"4.3.1","diff@>=6.0.0 <8.0.3":">=8.0.3","qs@>=6.7.0 <=6.14.1":">=6.14.2","react-test-renderer":"19.2.0","yaml@>=2.0.0 <2.8.3":">=2.8.3","axios@>=1.0.0 <1.12.0":">=1.12.0","axios@>=1.0.0 <1.15.0":">=1.15.0","glob@>=10.2.0 <10.5.0":">=10.5.0","axios@>=1.0.0 <=1.13.4":">=1.13.5","fast-xml-parser@<5.7.0":">=5.7.0","path-to-regexp@<0.1.13":"0.1.13","@appium/support@<=7.0.5":">=7.0.6","@tootallnate/once@<3.0.1":">=3.0.1","form-data@>=4.0.0 <4.0.4":">=4.0.4","lodash@>=4.0.0 <=4.17.22":">=4.17.23","lodash@>=4.0.0 <=4.17.23":">=4.18.0","react-native-quick-crypto":"1.0.19","react-native-nitro-modules":"0.35.5","ajv@>=7.0.0-alpha.0 <8.18.0":">=8.18.0","path-to-regexp@>=8.0.0 <8.4.0":">=8.4.0"}},"types":"build/index.d.ts","engines":{"node":">=22"},"gitHead":"e64c6928b57e4ffa10fc86979e8f118ac22378bd","scripts":{"fmt":"oxfmt","lint":"oxlint","test":"CI=true expo-module test","build":"expo-module build","clean":"expo-module clean","e2e:ios":"start-server-and-test appium:start http-get://127.0.0.1:4723/status \"pnpm --filter @akta/react-native-passkey-autofill-e2e run test:ios\"","lint:fix":"oxlint --fix","open:ios":"xed example/ios","test:all":"pnpm run test && pnpm run test:android","fmt:check":"oxfmt --check","e2e:android":"export PATH=$PATH:$ANDROID_HOME/platform-tools && start-server-and-test appium:start http-get://127.0.0.1:4723/status \"pnpm --filter @akta/react-native-passkey-autofill-e2e run test:android\"","appium:setup":"pnpm run appium:setup:android && pnpm run appium:setup:ios","appium:start":"appium --base-path / --log-level warn","open:android":"open -a \"Android Studio\" example/android","test:android":"cd example/android && ./gradlew :algorandfoundation-react-native-passkey-autofill:testDebugUnitTest --no-daemon","e2e:build:ios":"cd example && expo run:ios --configuration Release --no-install --no-bundler","prepublishOnly":"expo-module prepublishOnly","appium:setup:ios":"appium driver list --installed 2>&1 | grep -q xcuitest || appium driver install xcuitest","e2e:build:android":"cd example && expo run:android --variant release --no-install --no-bundler","appium:setup:android":"appium driver list --installed 2>&1 | grep -q uiautomator2 || appium driver install uiautomator2","test:android:instrumented":"cd example/android && ./gradlew :algorandfoundation-react-native-passkey-autofill:connectedDebugAndroidTest --no-daemon"},"_npmUser":{"name":"krby","email":"kyle.breeding@algorand.foundation"},"repository":{"url":"git+ssh://git@github.com/akita-protocol/react-native-passkey-autofill.git","type":"git"},"_npmVersion":"10.9.2","description":"Passkey AutoFill React Native","directories":{},"_nodeVersion":"22.17.1","dependencies":{"@algorandfoundation/react-native-keystore":"1.0.0-canary.11"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"expo":"~55.0.17","jest":"^29.7.0","oxfmt":"^0.43.0","react":"19.2.0","appium":"^2.19.0","eslint":"^9.39.4","oxlint":"^1.60.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","lefthook":"2.1.4","prettier":"^3.8.3","typescript":"~5.9.3","@types/jest":"^29.5.14","@types/node":"^22.19.17","expo-doctor":"^1.18.19","webdriverio":"^9.27.0","@types/react":"~19.2.10","react-native":"0.83.6","semantic-release":"^25.0.3","@expo/npm-proofread":"^1.0.1","expo-module-scripts":"^55.0.2","@expo/config-plugins":"~55.0.8","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","start-server-and-test":"^2.1.5","appium-xcuitest-driver":"^9.10.5","@semantic-release/github":"^12.0.6","appium-uiautomator2-driver":"^3.10.0","@semantic-release/changelog":"^6.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-passkey-autofill_1.0.0-canary.16_1779306694494_0.6066123028651","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-canary.17":{"name":"@akta/react-native-passkey-autofill","version":"1.0.0-canary.17","keywords":["@akta/react-native-passkey-autofill","ReactNativePasskeyAutofill","expo","react-native"],"author":{"name":"Algorand Foundation"},"license":"Apache-2.0","_id":"@akta/react-native-passkey-autofill@1.0.0-canary.17","maintainers":[{"name":"krby","email":"kyle.breeding@algorand.foundation"}],"homepage":"https://github.com/akita-protocol/react-native-passkey-autofill#readme","bugs":{"url":"https://github.com/akita-protocol/react-native-passkey-autofill/issues"},"dist":{"shasum":"b567492d4f493f5a868ce6ed577587688dbb4d61","tarball":"https://registry.npmjs.org/@akta/react-native-passkey-autofill/-/react-native-passkey-autofill-1.0.0-canary.17.tgz","fileCount":65,"integrity":"sha512-psZ4f855AlqkjLWcSpSlIUBFJZv4lLypv8uw7KNbGD5GmRhs+gsCYVySGLMyhY4S487T2sfc5ovFSZ5ReJlRow==","signatures":[{"sig":"MEQCIAzjfSTlZsHH/D8tW/cwRLqmeqGZB0Ln7OFlGH1yh/BeAiB5SJVD0TaaccUOO7Yy/xKWmYEeYyiiPVfaxFml75Sswg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":415151},"jest":{"preset":"ts-jest","testMatch":["<rootDir>/src/**/__tests__/**/*.test.ts"],"testEnvironment":"node"},"main":"build/index.js","pnpm":{"overrides":{"expo":"55.0.17","react":"19.2.0","eslint":"^9.7.0","prettier":"^3.0.0","react-dom":"19.2.0","qs@<6.14.1":">=6.14.1","@types/react":"~19.2.10","uuid@<14.0.0":">=14.0.0","yauzl@=3.2.0":">=3.2.1","@xmldom/xmldom":"0.8.13","postcss@<8.5.10":">=8.5.10","lodash@<=4.17.23":">=4.18.0","basic-ftp@<=5.2.2":">=5.3.0","on-headers@<1.1.0":">=1.1.0","react-native-mmkv":"4.3.1","diff@>=6.0.0 <8.0.3":">=8.0.3","qs@>=6.7.0 <=6.14.1":">=6.14.2","react-test-renderer":"19.2.0","yaml@>=2.0.0 <2.8.3":">=2.8.3","axios@>=1.0.0 <1.12.0":">=1.12.0","axios@>=1.0.0 <1.15.0":">=1.15.0","glob@>=10.2.0 <10.5.0":">=10.5.0","axios@>=1.0.0 <=1.13.4":">=1.13.5","fast-xml-parser@<5.7.0":">=5.7.0","path-to-regexp@<0.1.13":"0.1.13","@appium/support@<=7.0.5":">=7.0.6","@tootallnate/once@<3.0.1":">=3.0.1","form-data@>=4.0.0 <4.0.4":">=4.0.4","lodash@>=4.0.0 <=4.17.22":">=4.17.23","lodash@>=4.0.0 <=4.17.23":">=4.18.0","react-native-quick-crypto":"1.0.19","react-native-nitro-modules":"0.35.5","ajv@>=7.0.0-alpha.0 <8.18.0":">=8.18.0","path-to-regexp@>=8.0.0 <8.4.0":">=8.4.0"}},"types":"build/index.d.ts","engines":{"node":">=22"},"gitHead":"9da80a2cb2e45180de38aa1ad5b8557f754a33fc","scripts":{"fmt":"oxfmt","lint":"oxlint","test":"CI=true expo-module test","build":"expo-module build","clean":"expo-module clean","e2e:ios":"start-server-and-test appium:start http-get://127.0.0.1:4723/status \"pnpm --filter @akta/react-native-passkey-autofill-e2e run test:ios\"","lint:fix":"oxlint --fix","open:ios":"xed example/ios","test:all":"pnpm run test && pnpm run test:android","fmt:check":"oxfmt --check","e2e:android":"export PATH=$PATH:$ANDROID_HOME/platform-tools && start-server-and-test appium:start http-get://127.0.0.1:4723/status \"pnpm --filter @akta/react-native-passkey-autofill-e2e run test:android\"","appium:setup":"pnpm run appium:setup:android && pnpm run appium:setup:ios","appium:start":"appium --base-path / --log-level warn","open:android":"open -a \"Android Studio\" example/android","test:android":"cd example/android && ./gradlew :algorandfoundation-react-native-passkey-autofill:testDebugUnitTest --no-daemon","e2e:build:ios":"cd example && expo run:ios --configuration Release --no-install --no-bundler","prepublishOnly":"expo-module prepublishOnly","appium:setup:ios":"appium driver list --installed 2>&1 | grep -q xcuitest || appium driver install xcuitest","e2e:build:android":"cd example && expo run:android --variant release --no-install --no-bundler","appium:setup:android":"appium driver list --installed 2>&1 | grep -q uiautomator2 || appium driver install uiautomator2","test:android:instrumented":"cd example/android && ./gradlew :algorandfoundation-react-native-passkey-autofill:connectedDebugAndroidTest --no-daemon"},"_npmUser":{"name":"krby","email":"kyle.breeding@algorand.foundation"},"repository":{"url":"git+ssh://git@github.com/akita-protocol/react-native-passkey-autofill.git","type":"git"},"_npmVersion":"10.9.2","description":"Passkey AutoFill React Native","directories":{},"_nodeVersion":"22.17.1","dependencies":{"@algorandfoundation/react-native-keystore":"1.0.0-canary.11"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"expo":"~55.0.17","jest":"^29.7.0","oxfmt":"^0.43.0","react":"19.2.0","appium":"^2.19.0","eslint":"^9.39.4","oxlint":"^1.60.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","lefthook":"2.1.4","prettier":"^3.8.3","typescript":"~5.9.3","@types/jest":"^29.5.14","@types/node":"^22.19.17","expo-doctor":"^1.18.19","webdriverio":"^9.27.0","@types/react":"~19.2.10","react-native":"0.83.6","semantic-release":"^25.0.3","@expo/npm-proofread":"^1.0.1","expo-module-scripts":"^55.0.2","@expo/config-plugins":"~55.0.8","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","start-server-and-test":"^2.1.5","appium-xcuitest-driver":"^9.10.5","@semantic-release/github":"^12.0.6","appium-uiautomator2-driver":"^3.10.0","@semantic-release/changelog":"^6.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-passkey-autofill_1.0.0-canary.17_1779314212063_0.1279447035498502","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-canary.18":{"name":"@akta/react-native-passkey-autofill","version":"1.0.0-canary.18","description":"Passkey AutoFill React Native","keywords":["@akta/react-native-passkey-autofill","ReactNativePasskeyAutofill","expo","react-native"],"homepage":"https://github.com/akita-protocol/react-native-passkey-autofill#readme","bugs":{"url":"https://github.com/akita-protocol/react-native-passkey-autofill/issues"},"license":"Apache-2.0","author":{"name":"Algorand Foundation"},"repository":{"type":"git","url":"git+ssh://git@github.com/akita-protocol/react-native-passkey-autofill.git"},"main":"build/index.js","types":"build/index.d.ts","publishConfig":{"access":"public","provenance":true},"scripts":{"build":"expo-module build","clean":"expo-module clean","lint":"oxlint","lint:fix":"oxlint --fix","fmt":"oxfmt","fmt:check":"oxfmt --check","test":"CI=true expo-module test","test:android":"cd example/android && ./gradlew :algorandfoundation-react-native-passkey-autofill:testDebugUnitTest --no-daemon","test:android:instrumented":"cd example/android && ./gradlew :algorandfoundation-react-native-passkey-autofill:connectedDebugAndroidTest --no-daemon","test:all":"pnpm run test && pnpm run test:android","prepublishOnly":"expo-module prepublishOnly","open:ios":"xed example/ios","open:android":"open -a \"Android Studio\" example/android","appium:start":"appium --base-path / --log-level warn","appium:setup":"pnpm run appium:setup:android && pnpm run appium:setup:ios","appium:setup:android":"appium driver list --installed 2>&1 | grep -q uiautomator2 || appium driver install uiautomator2","appium:setup:ios":"appium driver list --installed 2>&1 | grep -q xcuitest || appium driver install xcuitest","e2e:build:android":"cd example && expo run:android --variant release --no-install --no-bundler","e2e:build:ios":"cd example && expo run:ios --configuration Release --no-install --no-bundler","e2e:android":"export PATH=$PATH:$ANDROID_HOME/platform-tools && start-server-and-test appium:start http-get://127.0.0.1:4723/status \"pnpm --filter @akta/react-native-passkey-autofill-e2e run test:android\"","e2e:ios":"start-server-and-test appium:start http-get://127.0.0.1:4723/status \"pnpm --filter @akta/react-native-passkey-autofill-e2e run test:ios\""},"dependencies":{"@algorandfoundation/react-native-keystore":"1.0.0-canary.11"},"devDependencies":{"@expo/config-plugins":"~55.0.8","@expo/npm-proofread":"^1.0.1","@semantic-release/changelog":"^6.0.3","@semantic-release/git":"^10.0.1","@semantic-release/github":"^12.0.6","@semantic-release/npm":"^13.1.5","@types/jest":"^29.5.14","@types/node":"^22.19.17","@types/react":"~19.2.10","appium":"^2.19.0","appium-uiautomator2-driver":"^3.10.0","appium-xcuitest-driver":"^9.10.5","eslint":"^9.39.4","expo":"~55.0.17","expo-doctor":"^1.18.19","expo-module-scripts":"^55.0.2","jest":"^29.7.0","lefthook":"2.1.4","oxfmt":"^0.43.0","oxlint":"^1.60.0","prettier":"^3.8.3","react":"19.2.0","react-native":"0.83.6","semantic-release":"^25.0.3","start-server-and-test":"^2.1.5","ts-jest":"^29.4.9","ts-node":"^10.9.2","typescript":"~5.9.3","webdriverio":"^9.27.0"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"jest":{"preset":"ts-jest","testEnvironment":"node","testMatch":["<rootDir>/src/**/__tests__/**/*.test.ts"]},"engines":{"node":">=22"},"packageManager":"pnpm@10.33.0","pnpm":{"overrides":{"@appium/support@<=7.0.5":">=7.0.6","@tootallnate/once@<3.0.1":">=3.0.1","@xmldom/xmldom":"0.8.13","eslint":"^9.7.0","prettier":"^3.0.0","react":"19.2.0","react-dom":"19.2.0","react-test-renderer":"19.2.0","@types/react":"~19.2.10","react-native-mmkv":"4.3.1","react-native-nitro-modules":"0.35.5","react-native-quick-crypto":"1.0.19","expo":"55.0.17","ajv@>=7.0.0-alpha.0 <8.18.0":">=8.18.0","axios@>=1.0.0 <1.12.0":">=1.12.0","axios@>=1.0.0 <1.15.0":">=1.15.0","axios@>=1.0.0 <=1.13.4":">=1.13.5","basic-ftp@<=5.2.2":">=5.3.0","diff@>=6.0.0 <8.0.3":">=8.0.3","fast-xml-parser@<5.7.0":">=5.7.0","form-data@>=4.0.0 <4.0.4":">=4.0.4","glob@>=10.2.0 <10.5.0":">=10.5.0","lodash@<=4.17.23":">=4.18.0","lodash@>=4.0.0 <=4.17.22":">=4.17.23","lodash@>=4.0.0 <=4.17.23":">=4.18.0","on-headers@<1.1.0":">=1.1.0","path-to-regexp@<0.1.13":"0.1.13","path-to-regexp@>=8.0.0 <8.4.0":">=8.4.0","postcss@<8.5.10":">=8.5.10","qs@<6.14.1":">=6.14.1","qs@>=6.7.0 <=6.14.1":">=6.14.2","uuid@<14.0.0":">=14.0.0","yaml@>=2.0.0 <2.8.3":">=2.8.3","yauzl@=3.2.0":">=3.2.1"}},"_id":"@akta/react-native-passkey-autofill@1.0.0-canary.18","gitHead":"9da80a2cb2e45180de38aa1ad5b8557f754a33fc","_nodeVersion":"22.17.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-gNV+wDTFsVPzG+0mjx6z2nEw8z0nDP6LhDs91lCHIubC1NMNFao8kRB3C5gg1DYr4nko6nnT1aBoFlX+ZC5TgA==","shasum":"a8b5e30e70c691e52c388ea00eaeccf2638422c5","tarball":"https://registry.npmjs.org/@akta/react-native-passkey-autofill/-/react-native-passkey-autofill-1.0.0-canary.18.tgz","fileCount":65,"unpackedSize":415092,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIF+j7SRw7aRlVCt8ywSktDo7xFAEt+3U+lH7iNoq7vEZAiEAgNsiI8dAqw6cptPaxCTqW08aZH24gn9tLcOMQ3Rr4nM="}]},"_npmUser":{"name":"krby","email":"kyle.breeding@algorand.foundation"},"directories":{},"maintainers":[{"name":"krby","email":"kyle.breeding@algorand.foundation"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-passkey-autofill_1.0.0-canary.18_1779315346687_0.4542707148823675"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-20T19:51:33.855Z","modified":"2026-05-20T22:15:47.002Z","1.0.0-canary.16":"2026-05-20T19:51:34.657Z","1.0.0-canary.17":"2026-05-20T21:56:52.231Z","1.0.0-canary.18":"2026-05-20T22:15:46.860Z"},"bugs":{"url":"https://github.com/akita-protocol/react-native-passkey-autofill/issues"},"author":{"name":"Algorand Foundation"},"license":"Apache-2.0","homepage":"https://github.com/akita-protocol/react-native-passkey-autofill#readme","keywords":["@akta/react-native-passkey-autofill","ReactNativePasskeyAutofill","expo","react-native"],"repository":{"type":"git","url":"git+ssh://git@github.com/akita-protocol/react-native-passkey-autofill.git"},"description":"Passkey AutoFill React Native","maintainers":[{"name":"krby","email":"kyle.breeding@algorand.foundation"}],"readme":"# @akta/react-native-passkey-autofill\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/akita-protocol/react-native-passkey-autofill/refs/heads/main/assets/banner.png\" width=\"100%\" />\n</p>\n\n<p align=\"center\">\n  Passkey AutoFill for React Native using DP256.\n</p>\n\n# 🚀 Get Started\n\nFor bare React Native projects, you must ensure that you have [installed and configured the `expo` package](https://docs.expo.dev/bare/installing-expo-modules/) before continuing.\n\n### Add the package to your dependencies\n\n```bash\npnpm add @akta/react-native-passkey-autofill\n```\n\n### Configure for Android\n\nTo use this module on Android, you need to configure the AutoFill service in your `AndroidManifest.xml` or via the Expo plugin.\n\n#### Expo Plugin Configuration\n\nIf you are using Expo, you can configure the plugin in your `app.json` or `app.config.js`:\n\n```json\n{\n  \"expo\": {\n    \"plugins\": [\n      [\n        \"@akta/react-native-passkey-autofill\",\n        {\n          \"site\": \"https://your-fido-server.com\",\n          \"label\": \"My Custom Credential Provider\"\n        }\n      ]\n    ]\n  }\n}\n```\n\n- `site`: The URL of your FIDO server (default: `https://debug.liquidauth.com`).\n- `label`: The name of the credential provider as it appears in Android settings (default: `My Credential Provider`).\n\n### Configure for iOS\n\niOS passkey AutoFill requires a Credential Provider extension, an App Group shared between the app and extension, and an associated domain for Web Credentials. The Expo config plugin can create and wire the extension during prebuild:\n\n```json\n{\n  \"expo\": {\n    \"ios\": {\n      \"bundleIdentifier\": \"com.example.wallet\",\n      \"associatedDomains\": [\"webcredentials:your-fido-server.com\"],\n      \"entitlements\": {\n        \"com.apple.developer.authentication-services.autofill-credential-provider\": true\n      }\n    },\n    \"plugins\": [\n      [\n        \"@akta/react-native-passkey-autofill\",\n        {\n          \"site\": \"https://your-fido-server.com\",\n          \"label\": \"My Custom Credential Provider\",\n          \"appGroup\": \"group.com.example.wallet.passkey-autofill\",\n          \"appleTeamId\": \"YOUR_TEAM_ID\"\n        }\n      ]\n    ]\n  }\n}\n```\n\nFor iOS integration, make sure that:\n\n- The app and Credential Provider extension both have the AutoFill Credential Provider capability.\n- The app and extension both have the same App Group entitlement.\n- The app has a `webcredentials:<domain>` associated domain, and that domain serves a valid `apple-app-site-association` file for the app identifier.\n- The deployment target is iOS 17 or newer for passkey credential provider support.\n- The generated extension target can link `AuthenticationServices.framework`, `CryptoKit.framework`, `MMKVCore`, and the deterministic P-256 Swift package.\n- `NSFaceIDUsageDescription` is present when biometric authentication is used.\n\nAt runtime, the app must provide the native side with the master key, identify the HD root key stored in MMKV, and keep the iOS identity store in sync:\n\n```typescript\nawait ReactNativePasskeyAutofill.setMasterKey(masterKeyHex);\nawait ReactNativePasskeyAutofill.setHdRootKeyId(hdRootKeyId);\nawait ReactNativePasskeyAutofill.refreshCredentialIdentities();\n```\n\nCall `refreshCredentialIdentities()` after creating, importing, deleting, or restoring passkeys so iOS AutoFill sees the current credentials.\n\n## Usage\n\n```typescript\nimport ReactNativePasskeyAutofill from \"@akta/react-native-passkey-autofill\";\n\n// 1. Set the master key for encryption (hex string)\nawait ReactNativePasskeyAutofill.setMasterKey(masterKeyHex);\n\n// 2. Set the HD root key ID if applicable\nawait ReactNativePasskeyAutofill.setHdRootKeyId(hdRootKeyId);\n\n// 3. Configure intent actions for the Passkey flows\nawait ReactNativePasskeyAutofill.configureIntentActions(\n  \"your.package.name.GET_PASSKEY\",\n  \"your.package.name.CREATE_PASSKEY\",\n);\n\n// Optional: Clear credentials\nawait ReactNativePasskeyAutofill.clearCredentials();\n```\n\n## Events\n\nYou can listen for events emitted by the native module when a passkey is successfully added or authenticated.\n\n```typescript\nimport ReactNativePasskeyAutofill from \"@akta/react-native-passkey-autofill\";\nimport { useEffect } from \"react\";\n\n// ... inside a component or hook\nuseEffect(() => {\n  const addedSubscription = ReactNativePasskeyAutofill.addListener(\"onPasskeyAdded\", (event) => {\n    console.log(\"Passkey added successfully:\", event.success);\n  });\n\n  const authSubscription = ReactNativePasskeyAutofill.addListener(\n    \"onPasskeyAuthenticated\",\n    (event) => {\n      console.log(\"Passkey authenticated successfully:\", event.success);\n    },\n  );\n\n  return () => {\n    addedSubscription.remove();\n    authSubscription.remove();\n  };\n}, []);\n```\n\n## 🧪 Testing\n\nThe project is set up with a comprehensive testing approach covering both JavaScript and Native (Kotlin) sides.\n\n### JavaScript Tests\n\nRun unit tests for the TypeScript module using Jest:\n\n```bash\npnpm test\n```\n\n### Native Android Tests\n\nRun unit tests for the Kotlin code using JUnit and Robolectric. These tests are executed via the example app's Gradle wrapper:\n\n```bash\npnpm run test:android\n```\n\n### All Tests\n\nRun both JS and Native tests:\n\n```bash\npnpm run test:all\n```\n\n### Continuous Integration (CI)\n\nThe project includes a GitHub Actions workflow that automatically runs linting, JS tests, and Native Android tests on every push and pull request to the `main` or `release` branches. You can find the configuration in `.github/workflows/ci.yml`.\n\n### Integration Testing (E2E)\n\nFull end-to-end tests driving the example app with Appium and WebdriverIO are available in the [`e2e/`](./e2e) directory. These tests exercise the entire passkey creation and usage flow on Android emulators and iOS simulators. See the [E2E README](./e2e/README.md) for more details.\n\n## 📱 Example App\n\nThe [example](./example) app demonstrates how to integrate this module with a full wallet implementation.\n\n# 🤝 Contributing\n\nContributions are very welcome! Please refer to guidelines described in the [contributing guide](./CONTRIBUTING.md).\n\n# 💖 Acknowledgements\n\nThis has been the culmination of many different efforts and ideas. We would like to thank the following individuals and organizations for their contributions:\n\n- [Bruno Martins](https://github.com/bmartins) the architect at [Algorand Foundation](https://github.com/algorandfoundation) for conceptualizing and guiding the project.\n- [HashMapsData2Value](https://github.com/HashMapsData2Value) for his guidance and support in DP256 and XHD and his work on the native autofill libraries.\n- [Will Beaumont](https://github.com/mjbeau) for working through integration within the Pera wallet\n- [Michael T Chuang](https://github.com/michaeltchuang) for his work in KMP integrations and client libraries.\n\n# 📄 License\n\nThis project is licensed under the Apache-2.0 License - see the [LICENSE](./LICENSE) file for details.\n","readmeFilename":"README.md"}