{"_id":"@animo-id/expo-digital-credentials-api","_rev":"17-6c78b40752b0700ec321bce62dfe1bd2","name":"@animo-id/expo-digital-credentials-api","dist-tags":{"latest":"0.5.1"},"versions":{"0.0.1-alpha.0":{"name":"@animo-id/expo-digital-credentials-api","version":"0.0.1-alpha.0","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.0.1-alpha.0","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"3ca1365bbfa2257abe5434cbf774a0ddeee58ea7","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.0.1-alpha.0.tgz","fileCount":42,"integrity":"sha512-hDo+Yj4FTBWEqeMc93xObvSJPzcA+al2IWjUxUqNaAr29Pf+HmrRydIyNumF+7pIl3zEgMdNU8Bx3ZoKHDAKAg==","signatures":[{"sig":"MEQCIAwACKH0cKO1rMNK5e77+sKqVg+0nuDPGn246+PJHTsCAiA4Rbs46xjVKAtdakbybr7Wzv9z7Jeg2cupKYQOZeVTlw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":141257},"main":"build/index.js","types":"build/index.d.ts","gitHead":"58c9abad3aff89b742fc7b5e487886ba65b82329","scripts":{"build":"pnpm build:plugin && pnpm build:module","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"pnpm build:plugin --noEmit && pnpm build:module --noEmit","build:module":"tsc -p tsconfig.json","build:plugin":"tsc -p plugin/tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.18.2","dependencies":{"@expo/config-plugins":"^9.0.15"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.0.1-alpha.0_1739791297460_0.4438311411648066","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.1":{"name":"@animo-id/expo-digital-credentials-api","version":"0.0.1-alpha.1","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.0.1-alpha.1","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"7b11243c6a448cecd3369a113f7e725e47801899","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.0.1-alpha.1.tgz","fileCount":51,"integrity":"sha512-AgKOjbuJhyg+NCdezY/LZljtLWYB/FjL6h3MJQc9+TQzekcXZgAu/dPS4hLMR4+UW8QfhyZffon91mEu3XT2jg==","signatures":[{"sig":"MEUCIQClyqpEqH0OxJRAssOxk1qnrPStn6KRuijdXudIvaIS1QIgfsVEEN7I38VDTJUYU8uUNr5DSOBFDYX9tcIWbaSaPzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":420209},"main":"build/index.js","types":"build/index.d.ts","gitHead":"8f564940909be2e76eb70f8bbb1650aa10ed30cb","scripts":{"build":"pnpm build:plugin && pnpm build:module","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"pnpm build:plugin --noEmit && tsc -p tsconfig.json","build:module":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","build:plugin":"tsc -p plugin/tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.18.2","dependencies":{"@expo/config-plugins":"^9.0.15"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.0.1-alpha.1_1740266507284_0.6267052485139037","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.2":{"name":"@animo-id/expo-digital-credentials-api","version":"0.0.1-alpha.2","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.0.1-alpha.2","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"d675a8e9e3b48d73bd4d9261b5d57bcb0cc55aa7","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.0.1-alpha.2.tgz","fileCount":45,"integrity":"sha512-gTN1PrBPWCaWCAZh6pKFlQGXodd1KTG9pd581f1U9FI2bKN3phTki7UD9u+uILA9oH/9QiVVkQrXEZTTvAbndg==","signatures":[{"sig":"MEUCIQD/4he0hiTxvIeVVoeMxEIB1B3Lczco4ROTRyBGFdW1dAIgB+v+12t2pefa6ylUO8KcOAg4RTkbNBV+PgOGzAsrRfw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":655190},"main":"build/index.js","types":"build/index.d.ts","gitHead":"45b8e4dc9200f60d3296fd512ac50c36444ef294","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.18.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.0.1-alpha.2_1740311339388_0.9460725192937052","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@animo-id/expo-digital-credentials-api","version":"0.1.0","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.1.0","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"5306cdade9a41d372edee6b9519cc97a299f5c4a","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.1.0.tgz","fileCount":45,"integrity":"sha512-PHdGvNYkK+z4tAiaUBia/nwVgnOHQT3Bx8RlKvWyP0WezrpNes0in+lixMBfZ0yCTEbFfM24Xasp12xMCtb34w==","signatures":[{"sig":"MEUCIGiqh9MxnxP8uEwtStIsHFelrrDUzBhu8me4z9eeC5ndAiEAlBxLVanZUNYc/ulahxV0P1+px68HK4L9mxecnB3fGAo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":656990},"main":"build/index.js","types":"build/index.d.ts","gitHead":"1caeaafc2eaf52be78af0ebf4a9066e2a198bace","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.1.0_1742581007072_0.5179803711390116","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@animo-id/expo-digital-credentials-api","version":"0.1.1","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.1.1","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"e0b88b9aae88c68e6e114db8dc97d19921565782","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.1.1.tgz","fileCount":46,"integrity":"sha512-H4FDJvLojcyZ6JWWGQLPtKoMYJcNvmFyn7zIgvlMsump1xdFVfvpM4+lDVj1X3Ay1At3b1A5cg/hfHt44kW1WQ==","signatures":[{"sig":"MEUCIGnS23ovcGMP7YRoCyxpjjM7OYSy4f5jncBNi7vOhVlGAiEA6yAAgw3umTvD1DV2sWbXL25NRPdhlvwU+EwKgLCsYQY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":666192},"main":"build/index.js","types":"build/index.d.ts","gitHead":"137e3a277cb20ecc5a3c2c505cfc2d711c8c0400","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.1.1_1743715162381_0.4365631505916028","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@animo-id/expo-digital-credentials-api","version":"0.1.2","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.1.2","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"d6a14e200d6382c5a2693b41de4bc45195a4fdf2","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.1.2.tgz","fileCount":46,"integrity":"sha512-maiBG43Tq2FbfQKChrPSBbQ7MKdtUfe4jksDvjpch9y1XeEkIDFA2Zg4ZKNRyPY4FCQg4OdszLdCowh+N3ozrw==","signatures":[{"sig":"MEUCID0eMS4YBqFFqzS2mcZL4QEsf3bGf+UtYqG8D5a43whmAiEA1cL0tWCOPG4gJOJ0LMTKzAKdwa5rjO3J1uS3KhQ/HC8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":667586},"main":"build/index.js","types":"build/index.d.ts","gitHead":"d28eedfb24a89774e1be03f0ed76d2ff0d0ab8d9","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.1.2_1743715399330_0.26110684797083783","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@animo-id/expo-digital-credentials-api","version":"0.1.3","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.1.3","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"193e5ddb35dcaa3ae8460d93c83bd51bd1fb233f","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.1.3.tgz","fileCount":47,"integrity":"sha512-ze75iQssJMqmNR8s6lQOQdgGcru/EaxgoCL7/loLHpWAkoOsrF0HbEFEVYNWMRkR91PmW2hmQjbDcfv+z7L6og==","signatures":[{"sig":"MEUCIQDN8eTOYYcr0OJlqSPuxEvQ1gfVvTtYElvKzdyH/yjf8QIgR3mDK4FrLTAi1Vf+5jkajz98d79hStY8ugm9DgVwZH4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":930848},"main":"build/index.js","types":"build/index.d.ts","gitHead":"e69eb4119518211057a160593925646df65926da","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.1.3_1745323607488_0.06763524384976027","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@animo-id/expo-digital-credentials-api","version":"0.1.4","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.1.4","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"1f5c752cf3df92676efc7fdb649026d4cff67e19","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.1.4.tgz","fileCount":47,"integrity":"sha512-fP0lQth8y/9H6z9TuGKO9zTJugu523kRWh5Amor7OU3Sh/SHxSGA468meh6PfzIsmeBi7M/ZkAQF6gfm2r6kpA==","signatures":[{"sig":"MEQCIGe9joxxvT22OM1T9THhrAM94u+tsOSfeZBnGbAgMIC5AiAF2HsoxixtQbZlULEazwsqKS3MOXxFbas5/A5Kj4sCeQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":938141},"main":"build/index.js","types":"build/index.d.ts","gitHead":"c63369091c321e85910c306f112d54c80bd457ec","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.1.4_1745329085942_0.24329897716884719","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@animo-id/expo-digital-credentials-api","version":"0.2.0","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.2.0","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"b998bf6624d6cd967da0998fe0b987d59118e3bf","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.2.0.tgz","fileCount":47,"integrity":"sha512-EXRBPusxrvWDbJHE58L63mZN1fTC+cXiV8udKV0TsjpJHCtZkeSD+txnrLR6X5FoP1fSSplFAl4nzas/PIKReg==","signatures":[{"sig":"MEUCIB61jIwawQRf+Cc1U6iDNE4RNdnyekGtLqb1EeOWwizaAiEAhoI+xtxuRSoVsIPb9uqy6z2v/PZPAP1tzobrJ0vUBM8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":935810},"main":"build/index.js","types":"build/index.d.ts","gitHead":"94cddc575d3063c39ad561c53d5ff57f76c82947","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.2.0_1745335284745_0.20731538525321214","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@animo-id/expo-digital-credentials-api","version":"0.2.1","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.2.1","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"ee4ef475e05eb430e9cf35635d34bb078d83ead7","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.2.1.tgz","fileCount":47,"integrity":"sha512-/nJt7VKiWPB182povci4zSuOlxhvYW/8F8nnJ3h1OcrdzoID9SgBp8FLRyx2al4ho0Cpq4q+udoHdcJ48cnizQ==","signatures":[{"sig":"MEYCIQDBCBZ5TM3fqiz4T42X/qnzaFHzuU5jv7/BrDp60Vu9BgIhAKkrFjcMZfJtpwqVrYRofGNJlsNns3A3/YLwbBuPRZdP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":937171},"main":"build/index.js","types":"build/index.d.ts","gitHead":"be65afb36af73c52522caf27386adf5e940c5852","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.2.1_1745577489244_0.6477334026526727","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@animo-id/expo-digital-credentials-api","version":"0.3.0","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.3.0","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"3a48e8278a45fe703499891f4b2da7fd261f754c","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.3.0.tgz","fileCount":47,"integrity":"sha512-Fsjmh76AQczHH0vBZ7Rr1VIHBcqb8P9N/jAMnTQ9TeQdbGD8R05HNI8t6h7lX6e0Ld6JONXe3IO4ur7ft1YuMQ==","signatures":[{"sig":"MEQCICgbsAvAqmSJMvlzSCKQ+NniIlVoq3gQZ1OeKkSUT8VnAiBYBh5r+xWt2HJe2/NmPkmPnBYVkiLjT98uQRib8cGYNw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":938432},"main":"build/index.js","types":"build/index.d.ts","gitHead":"e3367349fce83f98a25c62f58e0997d8f97656ec","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.3.0_1746089804484_0.22981485886063568","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@animo-id/expo-digital-credentials-api","version":"0.3.1","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.3.1","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"a73c0c873ffb51d37f236914fc98e7cca9fe376b","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.3.1.tgz","fileCount":47,"integrity":"sha512-ORH7MFlDHW3g9Pewhrb7sSVwgnqn//MZTe7vvmwJeYyLyyJkoTAbQNyNpOrU77f9TDVkwQ+oQKAKtfcjlBslnw==","signatures":[{"sig":"MEUCIGio/CSSTLaw78vqrMAkJevrLeXTy6X88qlGHGye66ZrAiEA7FV6iZTrVn+x0YHfj5X4iwOPwuXx0iL3bv2UugLwHDA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":940125},"main":"build/index.js","types":"build/index.d.ts","gitHead":"796564c47026bd1493a6e9ca4dddae38c9ffc79b","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.3.1_1746368407828_0.9860743427984766","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@animo-id/expo-digital-credentials-api","version":"0.3.2","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.3.2","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"437cacc183c8b039ffe81036816f401e73f4c8a9","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.3.2.tgz","fileCount":47,"integrity":"sha512-xXfcxRggEZxz9NuCoc9/YWNO3r+cIQlchXEWvpB3uXHIsm9PVz/spTrBW2zBl9vzitwutrzDrg7C5rA2tbLWyA==","signatures":[{"sig":"MEUCICEZ6KsmOx6HJdYpluU4udVFhFhIWZ0MhA8M3bw81GL2AiEA5dIBjg3/CYjKkuAS+jSDlCuRT3h/lHgoFp5vARZNLdU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":940123},"main":"build/index.js","types":"build/index.d.ts","gitHead":"9479e1d17db67a52a1161975e8ae5fe15c415217","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.3.2_1746440526212_0.33634166952144384","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@animo-id/expo-digital-credentials-api","version":"0.4.0","keywords":["react-native","expo","w3c-digital-credentials-api","oid4vp","w3c","digital-credentials","mdoc","sd-jwt-vc","vc+sd-jwt","dc+sd-jwt","android","mso_mdoc"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.4.0","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"256f9dd7cb6144bf8e0dcfdea2956c4e78153008","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.4.0.tgz","fileCount":47,"integrity":"sha512-VIHt0g8K9Dby79Z7AkExkXI8hGY0Nweil450Ky1/5MSPwaN23GhL0fi6mPBDOs2HkUVEUxYXZrSHoNuSw/4gNg==","signatures":[{"sig":"MEUCIQDzkfTNzAdBfS8rInxktoIozjJwHC3zC6bB441tYhEqhQIgTBhMNPNZru0JXoIkZ0PuRdUDrWf4z9zB6rrWi+UKIf4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":943982},"main":"build/index.js","types":"build/index.d.ts","gitHead":"97eccff25a2fc65e81d77a13fb3442745cf4c6ee","scripts":{"build":"tsc -p tsconfig.json && cp build/register.d.ts register.d.ts","release":"release-it","style:fix":"biome check --write --unsafe","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"animo-bot","actor":{"name":"animo-bot","type":"user","email":"development@animo.id"},"email":"development@animo.id"},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"10.8.2","description":"Expo wrapper around Android Digital Credentials API","directories":{},"_nodeVersion":"20.19.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d","devDependencies":{"expo":"~52.0.0","release-it":"^17.4.1","typescript":"^5.5.3","@types/react":"~18.3.12","react-native":"0.76.0","@biomejs/biome":"1.8.1","expo-module-scripts":"^4.0.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.4.0_1751413382673_0.2650155589220209","host":"s3://npm-registry-packages-npm-production"}},"0.4.1-alpha.0":{"name":"@animo-id/expo-digital-credentials-api","version":"0.4.1-alpha.0","keywords":["android","dc+sd-jwt","digital-credentials","expo","identity-document-services","ios","iso-18013-7","mdoc","mso_mdoc","oid4vp","org-iso-mdoc","react-native","sd-jwt-vc","dc+sd-jwt","w3c","w3c-digital-credentials-api"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.4.1-alpha.0","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"37dab76658af5d63e4723a38be7bcbe9eceb88cb","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.4.1-alpha.0.tgz","fileCount":117,"integrity":"sha512-zstutSZSTBYoh+HCQaFzz5aQhRvMhAycEv5blRkTfr0EmdTX+T7CjctolglnRwjchjMhue2ltx8rxK8mpNs0kw==","signatures":[{"sig":"MEQCIFcbrTMyA8Jj3sXgnTmTUcOoIHPQNdnfsdIuI8v96OaNAiBY7r9C6RZtH+5m0h+LzTLps5nCHDE5YEk8jZ52ne8E6w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCILwhycELjXhQ119zPYhhsGIngwujGevSQZQrptxdfXwIhANdOsomlOspuSfFnu6aw6gWHGtWwEo+RCGSLI0pH4gFN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@animo-id%2fexpo-digital-credentials-api@0.4.1-alpha.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3138553},"main":"build/index.js","types":"build/index.d.ts","exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"},"./package.json":"./package.json","./app.plugin.js":"./app.plugin.js","./request-handler":{"types":"./build/requestHandler.d.ts","default":"./build/requestHandler.js"}},"gitHead":"0c89e4132ed1341220b34aeeddc17d32df901cb4","scripts":{"test":"vitest run","build":"EXPO_NONINTERACTIVE=1 expo-module build && EXPO_NONINTERACTIVE=1 expo-module build plugin","release":"release-it","style:fix":"biome check --write --unsafe","build:watch":"expo-module build","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json --noEmit && tsc -p plugin/tsconfig.json --noEmit","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e8f8d4bd-59b1-43ed-958f-4caed55dace2"}},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"11.19.1","description":"Expo module for the W3C Digital Credentials API on Android and iOS (OpenID4VP and ISO 18013-7 Annex C)","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@expo/plist":"^0.5.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621","devDependencies":{"expo":"~55.0.0","vitest":"^4.1.11","release-it":"^21.0.2","typescript":"^5.9.3","@types/node":"^22.19.3","@types/react":"~19.2.17","react-native":"0.83.10","@biomejs/biome":"1.8.1","expo-module-scripts":"~55.0.2","@expo/config-plugins":"~55.0.11"},"peerDependencies":{"expo":">=55","react":"*","react-native":">=0.83"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.4.1-alpha.0_1789500506007_0.4227304360888713","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@animo-id/expo-digital-credentials-api","version":"0.5.0","keywords":["android","dc+sd-jwt","digital-credentials","expo","identity-document-services","ios","iso-18013-7","mdoc","mso_mdoc","oid4vp","org-iso-mdoc","react-native","sd-jwt-vc","dc+sd-jwt","w3c","w3c-digital-credentials-api"],"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","_id":"@animo-id/expo-digital-credentials-api@0.5.0","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"ae4c138d6ef53a063243a397f711098d629c24e3","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.5.0.tgz","fileCount":117,"integrity":"sha512-vtxWshO0m+4ZnzxVzt/7lgJCDFVt4vrd7WyNQAvalU20u/7oStkvWv8Xyo6/TzGnjH5aLJhpI5tHvjqm+3mvnA==","signatures":[{"sig":"MEUCIQCSP2BLSdDqTRONRhAp0EYQH7mESkbt57O8SdN/2hyeyAIgPvXKyUcyh5Uj9grVRvSECtgRFz+5oXfVMEjDusyPbk4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFjZW/rBpB9a25V84NCvQyMNN347kazqWerr8lceDXlxAiBX26D/wmNgFhsKix8yBhUCI+p2ho5JcojZy/7EJJP0bw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@animo-id%2fexpo-digital-credentials-api@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3138545},"main":"build/index.js","types":"build/index.d.ts","exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"},"./package.json":"./package.json","./app.plugin.js":"./app.plugin.js","./request-handler":{"types":"./build/requestHandler.d.ts","default":"./build/requestHandler.js"}},"gitHead":"0c89e4132ed1341220b34aeeddc17d32df901cb4","scripts":{"test":"vitest run","build":"EXPO_NONINTERACTIVE=1 expo-module build && EXPO_NONINTERACTIVE=1 expo-module build plugin","release":"release-it","style:fix":"biome check --write --unsafe","build:watch":"expo-module build","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json --noEmit && tsc -p plugin/tsconfig.json --noEmit","open:android":"open -a \"Android Studio\" example/android"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e8f8d4bd-59b1-43ed-958f-4caed55dace2"}},"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"11.19.1","description":"Expo module for the W3C Digital Credentials API on Android and iOS (OpenID4VP and ISO 18013-7 Annex C)","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@expo/plist":"^0.5.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621","devDependencies":{"expo":"~55.0.0","vitest":"^4.1.11","release-it":"^21.0.2","typescript":"^5.9.3","@types/node":"^22.19.3","@types/react":"~19.2.17","react-native":"0.83.10","@biomejs/biome":"1.8.1","expo-module-scripts":"~55.0.2","@expo/config-plugins":"~55.0.11"},"peerDependencies":{"expo":">=55","react":"*","react-native":">=0.83"},"_npmOperationalInternal":{"tmp":"tmp/expo-digital-credentials-api_0.5.0_1789655716246_0.1164176754124795","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"_id":"@animo-id/expo-digital-credentials-api@0.5.1","bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"dist":{"shasum":"a39af82491401a98b04af9c1136d617d1479b1c9","tarball":"https://registry.npmjs.org/@animo-id/expo-digital-credentials-api/-/expo-digital-credentials-api-0.5.1.tgz","fileCount":117,"integrity":"sha512-ohy9EQcG+Pr4YVJcGO6ct+DP3AGFFSvPzoMbJACmnKoCSkor8EcIXT3IyTVsI6Srni+Po85yliQAwNG4t9EaKA==","signatures":[{"sig":"MEUCIAdJbzbuv3XLI5sLwOBqXm3KnblCsQPDomXV/fm9sRcAAiEAxYJug80B9KhD9aQaaDkVUhD8jx1Cu3h+itXAWMC3TTM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFLi8Qw1iezq8denFw4+YphreA7+PnzOxwpSpJ2H/U5gAiEA0tw+PhDUFb1eCGZzl/1/zNIsmxGBlB+eGBcH1U37ooA="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@animo-id%2fexpo-digital-credentials-api@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3138737},"main":"build/index.js","name":"@animo-id/expo-digital-credentials-api","types":"build/index.d.ts","author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"},"./package.json":"./package.json","./app.plugin.js":"./app.plugin.js","./request-handler":{"types":"./build/requestHandler.d.ts","default":"./build/requestHandler.js"}},"gitHead":"a112c53c68a6d6f7d32c23f12486fc059c4b7ed4","license":"Apache-2.0","scripts":{"test":"vitest run","build":"EXPO_NONINTERACTIVE=1 expo-module build && EXPO_NONINTERACTIVE=1 expo-module build plugin","release":"release-it","style:fix":"biome check --write --unsafe","build:watch":"expo-module build","expo-module":"expo-module","style:check":"biome check --unsafe","types:check":"tsc -p tsconfig.json --noEmit && tsc -p plugin/tsconfig.json --noEmit","open:android":"open -a \"Android Studio\" example/android"},"version":"0.5.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e8f8d4bd-59b1-43ed-958f-4caed55dace2"}},"homepage":"https://github.com/animo/expo-digital-credentials-api#readme","keywords":["android","dc+sd-jwt","digital-credentials","expo","identity-document-services","ios","iso-18013-7","mdoc","mso_mdoc","oid4vp","org-iso-mdoc","react-native","sd-jwt-vc","dc+sd-jwt","w3c","w3c-digital-credentials-api"],"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"_npmVersion":"11.20.0","description":"Expo module for the W3C Digital Credentials API on Android and iOS (OpenID4VP and ISO 18013-7 Annex C)","directories":{},"maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"_nodeVersion":"24.21.0","dependencies":{"@expo/plist":"^0.5.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621","devDependencies":{"expo":"~55.0.0","vitest":"^4.1.11","release-it":"^21.0.2","typescript":"^5.9.3","@types/node":"^22.19.3","@types/react":"~19.2.17","react-native":"0.83.10","@biomejs/biome":"1.8.1","expo-module-scripts":"~55.0.2","@expo/config-plugins":"~55.0.11"},"peerDependencies":{"expo":">=55","react":"*","react-native":">=0.83"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expo-digital-credentials-api_0.5.1_1790331192915_0.4605743978932815"}}},"time":{"created":"2025-02-17T11:21:37.335Z","modified":"2026-09-25T10:13:13.430Z","0.0.1-alpha.0":"2025-02-17T11:21:37.681Z","0.0.1-alpha.1":"2025-02-22T23:21:47.466Z","0.0.1-alpha.2":"2025-02-23T11:48:59.618Z","0.1.0":"2025-03-21T18:16:47.307Z","0.1.1":"2025-04-03T21:19:22.693Z","0.1.2":"2025-04-03T21:23:19.647Z","0.1.3":"2025-04-22T12:06:47.698Z","0.1.4":"2025-04-22T13:38:06.183Z","0.2.0":"2025-04-22T15:21:25.629Z","0.2.1":"2025-04-25T10:38:09.551Z","0.3.0":"2025-05-01T08:56:44.785Z","0.3.1":"2025-05-04T14:20:08.109Z","0.3.2":"2025-05-05T10:22:06.427Z","0.4.0":"2025-07-01T23:43:02.882Z","0.4.1-alpha.0":"2026-09-15T19:28:26.201Z","0.5.0":"2026-09-17T14:35:16.397Z","0.5.1":"2026-09-25T10:13:13.064Z"},"bugs":{"url":"https://github.com/animo/expo-digital-credentials-api/issues"},"author":{"url":"animo","name":"Animo","email":"contact@animo.id"},"license":"Apache-2.0","homepage":"https://github.com/animo/expo-digital-credentials-api#readme","keywords":["android","dc+sd-jwt","digital-credentials","expo","identity-document-services","ios","iso-18013-7","mdoc","mso_mdoc","oid4vp","org-iso-mdoc","react-native","sd-jwt-vc","dc+sd-jwt","w3c","w3c-digital-credentials-api"],"repository":{"url":"git+https://github.com/animo/expo-digital-credentials-api.git","type":"git"},"description":"Expo module for the W3C Digital Credentials API on Android and iOS (OpenID4VP and ISO 18013-7 Annex C)","maintainers":[{"name":"blu3beri","email":"berend@animo.id"},{"name":"timoglastra","email":"timo@glastra.me"},{"name":"animo-ana","email":"ana@animo.id"},{"name":"animo-bot","email":"development@animo.id"}],"readme":"<p align=\"center\">\n  <picture>\n   <source media=\"(prefers-color-scheme: light)\" srcset=\"https://res.cloudinary.com/animo-solutions/image/upload/v1656578320/animo-logo-light-no-text_ok9auy.svg\">\n   <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://res.cloudinary.com/animo-solutions/image/upload/v1656578320/animo-logo-dark-no-text_fqqdq9.svg\">\n   <img alt=\"Animo Logo\" height=\"200px\" />\n  </picture>\n</p>\n\n<h1 align=\"center\" ><b>Expo - Digital Credentials API</b></h1>\n\n<h4 align=\"center\">Powered by &nbsp; \n  <picture>\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://res.cloudinary.com/animo-solutions/image/upload/v1656579715/animo-logo-light-text_cma2yo.svg\">\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://res.cloudinary.com/animo-solutions/image/upload/v1656579715/animo-logo-dark-text_uccvqa.svg\">\n    <img alt=\"Animo Logo\" height=\"12px\" />\n  </picture>\n</h4><br>\n\n<p align=\"center\">\n  <a href=\"https://typescriptlang.org\">\n    <img src=\"https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@animo-id/expo-digital-credentials-api\">\n    <img src=\"https://img.shields.io/npm/v/@animo-id/expo-digital-credentials-api\" />\n  </a>\n  <a\n    href=\"https://raw.githubusercontent.com/animo/expo-digital-credentials-api/main/LICENSE\"\n    ><img\n      alt=\"License\"\n      src=\"https://img.shields.io/badge/License-Apache%202.0-blue.svg\"\n  /></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"#getting-started\">Getting Started</a> \n  &nbsp;|&nbsp;\n  <a href=\"#usage\">Usage</a> \n  &nbsp;|&nbsp;\n  <a href=\"#contributing\">Contributing</a> \n  &nbsp;|&nbsp;\n  <a href=\"#contributing\">License</a> \n</p>\n\n---\n\nAn [Expo Module](https://docs.expo.dev/modules/overview/) to automatically set up and configure the [Digital Credentials API](https://digitalcredentials.dev) for Android and iOS in Expo apps.\n\nThis library is tested with **Expo 55** and **React Native 0.83**.\n\n| | Android | iOS |\n|---|---|---|\n| Protocol `openid4vp` | ✅ | ❌ (not supported by the platform) |\n| Protocol `org-iso-mdoc` (ISO/IEC TS 18013-7:2025 Annex C) | ✅ | ✅ |\n| Protocol `openid4vp-v1-{unsigned,signed,multisigned}` | ✅  | ❌ |\n| Minimum OS version | Credential Manager with registry support | iOS 26 |\n| Credential matching | wasm matcher bundled with this library | performed by the OS |\n\nThree wasm matchers are bundled for Android. Only Multipaz, the default, supports `org-iso-mdoc`.\n\n<div align=\"center\">\n  <table>\n    <tr>\n      <th align=\"center\" colspan=\"2\">iOS</th>\n      <th align=\"center\" colspan=\"2\">Android</th>\n    </tr>\n    <tr>\n      <td><img src=\"./assets/picker-ios.png\" width=\"190px\"></td>\n      <td><img src=\"./assets/request-ui-ios.png\" width=\"190px\"></td>\n      <td><img src=\"./assets/picker-android.png\" width=\"190px\"></td>\n      <td><img src=\"./assets/request-ui-android.png\" width=\"190px\"></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><sub>Credential picker</sub></td>\n      <td align=\"center\"><sub>Request UI</sub></td>\n      <td align=\"center\"><sub>Credential picker</sub></td>\n      <td align=\"center\"><sub>Request UI</sub></td>\n    </tr>\n  </table>\n</div>\n\n## Getting started\n\n```sh\nnpm install @animo-id/expo-digital-credentials-api   # or yarn add / pnpm add\n```\n\nConfigure the plugin ([below](#configuration)), then `npx expo prebuild` so the native dependency is added.\n\n### Configuration\n\nBoth platforms render the same React component from its own bundle, configured with a single config plugin. Add it to your app config:\n\n```json\n[\n  \"@animo-id/expo-digital-credentials-api\",\n  {\n    \"ios\": {\n      \"documentTypes\": [\"org.iso.18013.5.1.mDL\", \"eu.europa.ec.eudi.pid.1\"],\n      \"excludedPackages\": [\"react-native-maps\"]\n    }\n  }\n]\n```\n\n| Option | Default | Description |\n|---|---|---|\n| `entry` | `dc-api/index` | Bundle root of the request UI, relative to the project root and without extension. Metro resolves platform variants, so `dc-api/index.ios.tsx` works. |\n| `ios.documentTypes` | — | Document types for the `…identity-document-services.document-provider.mobile-document-types` entitlement, from Apple's [allowed set](#supported-document-types). **The iOS extension is only generated when this is set.** |\n| `ios.excludedPackages` | see below | React Native or Expo packages with native code to leave out of the extension's autolinking, by npm package name.|\n| `ios.includedPackages` | — | The inverse: link only these React Native or Expo packages, leave out everything else. Setting both throws. |\n| `ios.appGroup` | `group.<bundleId>` | App group shared by the app and the extension. This package stores nothing in it by default, but it provides a storage directory accessible by both the main application and the DC API app extension. See [Sharing storage with the request UI](#sharing-storage-with-the-request-ui). |\n| `ios.keychainAccessGroup` | `<bundleId>` | Keychain access group shared by the app and the extension. The default is where keys are created by default if you haven't configured an access group, meaning no migration is needed. Using a custom value might require a migration/rotation of keys, if the keys are not already available in this access group.  |\n| `ios.bundleIdSuffix` | `DocumentProvider` | Suffix appended to the app's bundle identifier for the extension. |\n| `ios.deploymentTarget` | `26.0` | Deployment target of the extension. Must be at least iOS 26 (first iOS version DC API was added). The app's own is untouched, so it stays installable on older iOS. |\n| `ios.fonts` | none | Fonts the request UI renders with, by file name as the app bundles them. See [Appearance](#appearance). |\n| `ios.userInterfaceStyle` | the app's | Appearance the request UI renders in: `light`, `dark` or `automatic`. See [Appearance](#appearance) before pinning it, as there's some caveats. |\n| `ios.backgroundColor` | system background | Background behind the request UI, `#RRGGBB` or `#RRGGBBAA`. Visible behind the sheet's title bar, before the JS renders, and wherever your screen is transparent, including insets you pad rather than paint. See [Appearance](#appearance). |\n\nEvery option except `entry` is iOS-only. Android needs no configuration, and applying the plugin with no options at all is valid.\n\n#### Keeping it small\n\nThe request UI is bundled separately from the app. On iOS it runs in an app extension under a much\ntighter memory budget, and everything the app links is linked into it by default. Trim it with\n`ios.excludedPackages` (npm package names, applied to Expo modules and React Native autolinking\nalike), or with `ios.includedPackages` once the list to leave out is longer than the list to keep:\n\n```json\n[\"@animo-id/expo-digital-credentials-api\", {\n  \"ios\": {\n    \"documentTypes\": [\"org.iso.18013.5.1.mDL\"],\n    \"includedPackages\": [\"react-native-keychain\", \"react-native-safe-area-context\"]\n  }\n}]\n```\n\nThey fail in opposite directions, which is the thing to weigh: a package missing from\n`excludedPackages` only makes the extension heavier, while one missing from `includedPackages` makes\nit fail to link. Setting both throws.\n\n`@animo-id/expo-digital-credentials-api`, `react-native`, `expo`, `expo-modules-core` and\n`expo-asset` are always linked, the extension cannot start without them, and excluding one is\nignored with a warning. `expo-dev-client`, `expo-dev-launcher`, `expo-dev-menu`, `expo-router`,\n`expo-splash-screen` and `expo-updates` are always excluded, since they drive the app's lifecycle or\nuse APIs extensions do not have.\n\nKeep the imports under your entrypoint minimal. JS-only libraries count too, which often means\nimporting single components instead of whole barrels. **Never import an excluded package under your\nentrypoint, it will fail at runtime.**\n\n#### Appearance\n\niOS draws a sheet around the request UI, titled with the app's display name (`expo.name`). Android\nhosts it in a transparent, untitled activity. Either way your screen paints what the user sees, so\ngive it a background. `ios.backgroundColor` pins the colour *behind* it, visible before the JS\nrenders, wherever your screen is transparent, and behind the sheet's title bar.\n\n> **The sheet's title colour is the OS's, and follows the device.** iOS draws it in the device's\n> appearance over a background you paint, and there are unfortunately no APIs to style it. So \n> `ios.userInterfaceStyle` only reaches this extension's own views. A light request UI on a dark\n> device puts a white title on a light sheet, invisible. Either pick a `ios.backgroundColor` that\n> both black and white text read against, or set `ios.userInterfaceStyle: 'automatic'`, leave\n> `ios.backgroundColor` unset and theme your screen for both appearances.\n\n`ios.userInterfaceStyle` defaults to your app's, so an app pinned to light gets a light request UI.\n\nThe room your screen gets differs per platform:\n\n- **iOS** hands you the system sheet: already full height, already titled. Fill it (`flex: 1`).\n  Rounding the top or capping the height puts a sheet inside a sheet. The top inset below the title\n  bar is applied natively (`react-native-safe-area-context` cannot see OS chrome above the React\n  Native view). The bottom edge is yours, so pad for the home indicator.\n- **Android** gives you a transparent activity over the verifier's app, so your screen *is* the\n  sheet: bottom aligned, rounding its own top, keeping its own height.\n\nThe app's fonts do not exist in the extension: `UIAppFonts` installs fonts for the bundle that\ndeclares them, and the extension is a separate bundle. Name the ones the request UI draws with, by\nfile name as the app bundles them, and they are registered at launch from the app's bundle. They are\nread in place, never copied, so nothing ships twice:\n\n```json\n[\"@animo-id/expo-digital-credentials-api\", {\n  \"ios\": { \"documentTypes\": [\"org.iso.18013.5.1.mDL\"], \"fonts\": [\"OpenSans_400Regular.ttf\"] }\n}]\n```\n\nA font name the app does not bundle fails the prebuild. In your screen a `fontFamily` still names the\nfont's PostScript name (`OpenSans-Regular`), not the file.\n\n#### Supported document types\n\niOS can only register the following document types:\n\n- `org.iso.18013.5.1.mDL`\n- `org.iso.23220.photoid.1`\n- `org.iso.23220.1.jp.mnc`\n- `eu.europa.ec.eudi.pid.1`\n- `eu.europa.ec.av.1`\n\nYour app is entitled to the ones you list in `ios.documentTypes`, and that list — not the full set\nabove — is what registration filters on: a credential whose document type the app is not entitled to\nis rejected by the OS, so it is skipped before it gets there. Everything else is filtered out too, so\nthe same registration flow works on both platforms. See [Apple Documentation](https://developer.apple.com/documentation/bundleresources/entitlements/com.apple.developer.identity-document-services.document-provider.mobile-document-types) for more information.\n\n## Usage\n\n### Registering credentials\n\nRegistration is what makes your wallet show up in the system credential picker. On Android, every call replaces\nthe whole set, so pass all credentials each time they change. On iOS you can also add and remove individual credential registrations.\n\nCheck `isSupported()` first, it is the only call that is always safe. Everything else throws\n`DcApiUnsupportedError` on iOS below 26 and on Android without Credential Manager's registry API.\n\n```ts\nimport {\n  type DcApiCredential,\n  getRegistrationStatus,\n  isSupported,\n  registerCredentials,\n} from \"@animo-id/expo-digital-credentials-api\";\n\nconst credentials: DcApiCredential[] = [\n  {\n    id: \"mdl\",\n    display: {\n      title: \"Drivers License\",\n      subtitle: \"Issued by Utopia\",\n      // displayValue overrides how the picker renders the value; see below.\n      claims: [{ path: [\"org.iso.18013.5.1\", \"family_name\"], displayName: \"Family Name\" }],\n      // Optional, and shown in the picker: iconDataUrl: \"data:image/png;base64,…\"\n    },\n    credential: {\n      format: \"mso_mdoc\",\n      doctype: \"org.iso.18013.5.1.mDL\",\n      namespaces: { \"org.iso.18013.5.1\": { family_name: \"Glastra\", age_over_18: true } },\n    },\n  },\n  {\n    id: \"pid\",\n    display: {\n      title: \"PID\",\n      claims: [{ path: [\"address\", \"city\"], displayName: \"Resident City\" }],\n    },\n    credential: {\n      format: \"dc+sd-jwt\",\n      vct: \"eu.europa.ec.eudi.pid.1\",\n      claims: { first_name: \"Timo\", address: { city: \"Somewhere\" } },\n    },\n  },\n];\n\nasync function syncRegisteredCredentials() {\n  if (!isSupported()) {\n    console.log('DC API not supported');\n    return\n  }\n\n  // iOS prompts on the first registerCredentials call; this reads where that stands without\n  // prompting.\n  const status = await getRegistrationStatus();\n  if (status === \"notAuthorized\") return;\n\n  const registered = await registerCredentials({\n    credentials,\n    android: { matcher: \"multipaz\" },\n  });\n\n  // ['mdl', 'pid'] on Android, ['mdl'] on iOS — the SD-JWT cannot be presented there.\n  console.log(registered);\n}\n```\n\nCredentials the platform cannot present are skipped rather than rejected, so you can pass the whole set\non both platforms. On iOS only `mso_mdoc` credentials with a document type the app is entitled to —\nthe plugin's [`ios.documentTypes`](#supported-document-types) — register. The returned ids say which\ndid.\n\n**On iOS the credentials never leave your app.** Only the identifier, document type and the `ios`\ngates are handed over, and nothing is kept. The registered ids are how you find your own credentials\nagain when a request comes in. Android needs a good deal more, because its matcher runs in a sandbox\nwith no access to your app. See [What each platform registers](#what-each-platform-registers).\n\niOS keeps the registered set itself, so a document can be added or dropped on its own:\n\n```ts\n// iOS only — on Android, call registerCredentials again with the new set.\nawait registerCredential({ credential: newlyIssuedMdl });\nawait removeCredential(\"mdl\");\n```\n\n| Function | Platform | Description |\n|---|---|---|\n| `isSupported()` | both | Whether the API exists at all. Synchronous, and never throws. |\n| `getRegistrationStatus()` | both | `'authorized' \\| 'notAuthorized' \\| 'notDetermined' \\| 'notSupported'`. Reads the iOS permission without prompting. Always `'authorized'` on Android, which needs no permission. |\n| `registerCredentials(options)` | both | Replaces the registered set. Returns the ids that registered. |\n| `registerCredential(options)` | iOS | Adds one credential, leaving the rest of the registered set alone. Throws on Android, where the registry is replaced as a whole. |\n| `removeCredential(id)` | iOS | Drops one credential. Throws on Android, so call `registerCredentials` with the remaining credentials instead. |\n| `removeAllCredentials()` | both | Drops everything this package registered. |\n| `getSharedContainerPath()` | iOS | Path of the app group container the app and the request UI share. Synchronous. See [Sharing storage with the request UI](#sharing-storage-with-the-request-ui). |\n\nOn Android you choose the matcher: the wasm module Credential Manager runs to match your credentials\nagainst the request.\n\n| Matcher | Protocols | Icons | Claim values | Several credentials per request | Reports the matched request |\n|---|---|---|---|---|---|\n| `multipaz` (default) | `openid4vp`, `openid4vp-v1-*`, `org-iso-mdoc` | ✅ | ✅ | ✅ | Protocol only, see [what was picked](#what-was-picked) |\n| `ubique` | `openid4vp` | ✅ | ✅ | ❌ | ✅ |\n| `cmwallet` | `openid4vp` | ❌ | ❌ | ❌ | ✅ |\n\nAll three support SD-JWT VC and mdoc, signed and unsigned. Sources:\n[multipaz](https://github.com/openwallet-foundation/multipaz/tree/1b045d0e/multipaz-dcapi/src/androidMain/matcher) (Apache-2.0),\n[oid4vp-wasm-matcher](https://github.com/UbiqueInnovation/oid4vp-wasm-matcher/releases/tag/v0.1.0),\n[CMWallet](https://github.com/digitalcredentialsdev/CMWallet/blob/f4aa9ebbeaf55fa3973b467701887464be3d4b51/app/src/main/assets/openid4vp.wasm).\n\n`android.protocols` defaults to everything the chosen matcher supports. Registering a protocol it\ncannot answer throws. Each call clears the previous registry, so switching matcher or protocol never\nleaves credentials showing twice.\n\n#### What each platform registers\n\nThe two platforms match in different places, so they need different things from you.\n\nOn iOS the OS does the matching, and Apple's registration record has four fields: the document\nidentifier, the document type, the authority key identifiers from\n`ios.supportedAuthorityKeyIdentifiers` and the `ios.invalidationDate`. That is all the OS gets. No\ndisplay metadata, no namespaces, no element identifiers and no claim values. The credentials stay in\nyour own storage, and this package keeps no copy of them.\n\nSince the record holds no elements, iOS matches on the document type alone, after the reader trust\ngate. A verifier asking for `family_name` on an mDL surfaces every registered mDL, including one that\ndoes not carry that element. Working out what you can satisfy is the request UI's job. The\nrequested namespaces and elements arrive with the request, and you look up the credential behind the\nidentifier yourself. See [Handling the request](#handling-the-request).\n\nOn Android the matching runs in a wasm sandbox with no access to your app, so everything it needs has\nto be handed over up front. `registerCredentials` encodes the display metadata (title, subtitle,\nicon) and the claim values into the database Credential Manager stores and runs the matcher against.\nThe matcher can filter on individual claims, so a credential that is missing a requested claim never\nreaches the picker.\n\n|  | iOS | Android |\n|---|---|---|\n| Where matching happens | in the OS | in the wasm matcher, in a sandbox |\n| What leaves the app | identifier, document type, trust gate, expiry | display metadata, claim values, issuer and reader identifiers |\n| Matched on | document type | individual claims |\n| Formats | `mso_mdoc` with an [allowed document type](#supported-document-types) | anything the matcher supports |\n| Registered set | added to and removed from per credential | replaced on every call |\n\nSo on iOS a request the user picked your wallet for can still be one you cannot answer. Handle that\nin the request UI instead of assuming the OS filtered it out.\n\n#### Trusting readers on iOS\n\n`ios.supportedAuthorityKeyIdentifiers` is a trust gate the OS applies while matching, before the\nwallet is involved. Each entry is the base64 encoding of one X.509 authority key identifier, belonging\nto an authority you trust to sign requests.\n\n| Value | Which requests reach the wallet |\n|---|---|\n| `[]` (the default) | Every request, signed or not. Trust decisions are yours to make in the request UI, from `readerAuthentications`. |\n| Non-empty | Only requests whose reader authentication chains up to one of these authorities. Everything else, unsigned requests included, is never matched, and the user sees no entry for your wallet. |\n\nThe OS stores it with each document, so it is set on the credential:\n\n```ts\nawait registerCredentials({\n  credentials: [\n    // Any reader may ask for this one.\n    mdl,\n    // This one only goes to readers the government signed for.\n    { ...healthCard, ios: { supportedAuthorityKeyIdentifiers: [\"Ej4mAJk…\"] } },\n  ],\n});\n```\n\nValues that are not valid base64 throw.\n\n#### Trusting issuers and readers on Android\n\nThe `multipaz` matcher has two gates of its own, set on the credential under `android`. Both take\nbase64 X.509 authority key identifiers, like the iOS gate. The matcher only compares identifiers. It\nverifies no signature and no chain, so check what reaches the request UI there too.\n\n| Option | What it does |\n|---|---|\n| `issuerAuthorityKeyIdentifiers` | The authority key identifier of every certificate in the credential's issuer chain: the MSO's `x5chain` for an mdoc, the `x5c` header for an SD-JWT VC. A verifier can name the issuers it accepts, as `trusted_authorities` of type `aki` in DCQL or as `issuerIdentifiers` in an Annex C `deviceRequest`, and the matcher then only offers credentials carrying one of them. **A credential registered without these never matches such a request.** |\n| `supportedAuthorityKeyIdentifiers` | Reader gating, like `ios.supportedAuthorityKeyIdentifiers`. When set, the credential only matches requests whose reader certificate chain carries one of these: the `x5c` of a signed OpenID4VP request, or the `readerAuth` of a `deviceRequest`. Unsigned requests never match. |\n\n```ts\nawait registerCredentials({\n  credentials: [\n    {\n      ...pid,\n      android: {\n        // Matches verifiers that only accept PIDs from this issuer.\n        issuerAuthorityKeyIdentifiers: [\"N1OrmtAijM/4g9xcF7evzmkzXVs=\"],\n        // Only offered to readers the government signed for.\n        supportedAuthorityKeyIdentifiers: [\"Ej4mAJk…\"],\n      },\n    },\n  ],\n});\n```\n\nThe other matchers ignore `trusted_authorities`, so they have no use for the issuer identifiers. They\ncannot gate on the reader either, and registering `supportedAuthorityKeyIdentifiers` with them throws.\n\n#### Expiring a registration on iOS\n\n`ios.invalidationDate` is when the OS should stop matching a document. After that date the credential\nis not matched against, without having to run to unregister anything.\n\n```ts\nawait registerCredentials({\n  credentials: [{ ...mdl, ios: { invalidationDate: new Date(\"2027-01-01T00:00:00Z\") } }],\n});\n```\n\nLeave it out for no expiry. A date in the past throws. Once it passes the OS stops matching silently,\nso drop the credential from your own storage too. Android has no equivalent.\n\n#### Sharing storage with the request UI\n\nOn iOS the request UI runs inside the provider extension, a separate process that cannot see the\napp's container. Since iOS has no system picker, every wallet has to look credentials up while\nanswering a request, so the database belongs in the shared app group container.\n\nThe config plugin sets the app group up in both targets, and `getSharedContainerPath()` resolves it\nin whichever process asks:\n\n```ts\nimport { Platform } from \"react-native\";\nimport { getSharedContainerPath } from \"@animo-id/expo-digital-credentials-api\";\n\n// The same path in the app and in the request UI, so both open the same file. Android's default\n// location already works.\nconst directory = Platform.OS === \"ios\" ? getSharedContainerPath() : undefined;\n\n// expo-sqlite takes it third, op-sqlite as `location` — check yours.\nconst db = await SQLite.openDatabaseAsync(\"wallet.db\", {}, directory);\n```\n\nMoving an existing database there needs care:\n\n- Treat it as a migration. A database in the app's documents directory is invisible to the\n  extension, so copy the file plus its `-wal` and `-shm` siblings once.\n- Two processes now share one file. Use WAL mode, keep the extension's writes short, and never hold\n  a transaction open across the user's decision.\n- The path changes across reinstalls, so store the file name rather than the absolute path.\n\n`getSharedContainerPath()` throws on Android, where the request UI already shares the app's sandbox.\n\n### Handling a credential request\n\nOnce the user picks a credential from your wallet, your own component is rendered as an overlay to\napprove the request.\n\n<img src=\"./assets/overlay.png\" width=\"200px\">\n\n#### Registering the component\n\nThe request UI has one entry file for both platforms, `dc-api/index.tsx` by default. It is bundled on\nits own, so it registers the component itself:\n\n```tsx\n// dc-api/index.tsx\nimport { registerDcApiScreen } from \"@animo-id/expo-digital-credentials-api/request-handler\";\nimport { MyCustomComponent } from \"./MyCustomComponent\";\n\nexport default registerDcApiScreen(MyCustomComponent);\n```\n\nPlatform variants resolve as usual. Add `dc-api/index.ios.tsx` or `dc-api/index.android.tsx` for a\ndifferent component per platform, or point the plugin's `entry` option elsewhere.\n\nKeep the app's own entry (`index.ts`, or the Expo Router root) out of this file: it runs in the\nprovider extension on iOS and in the picker's activity on Android, neither of which loads the app\nbundle.\n\n#### Handling the request\n\nThe registered component gets `request: DcApiRequest`, a union on `platform`, since the platforms\nknow different things at this point:\n\n- **Android** delivers the protocol requests with the picker result, along with the credentials the\n  user chose. Nothing is parsed for you: read the OpenID4VP request or Annex C `deviceRequest` with\n  whatever stack you already use.\n- **iOS** has no picker and holds the raw request back until you commit. Up front you get the request\n  *as the OS parsed it* (which documents, which elements), and render consent and credential\n  selection from that. `approve()` then releases the real thing, always Annex C.\n\n```ts\ntype DcApiRequest =\n  | {\n      platform: \"android\";\n      origin: string | undefined;\n      callingPackage: string;\n      requests: DcApiProtocolRequest[];\n      selection?: {\n        credentialIds: string[];\n        requestIndex: number | undefined;\n        candidateRequestIndexes: number[];\n      };\n      respond(options: DcApiResponseOptions): Promise<void>;\n      decline(reason?: string): void;\n    }\n  | {\n      platform: \"ios\";\n      origin: string;\n      presentmentRequests: IosPresentmentRequest[];\n      readerAuthentications: { certificateChain: string[] }[];\n      approve(): Promise<IsoMdocProtocolRequest[]>;\n      respond(options: IsoMdocResponseOptions): Promise<void>;\n      decline(reason?: string): void;\n    };\n```\n\n| Prop | Platform | Description |\n|---|---|---|\n| `origin` | both | WHATWG ASCII serialization of the requesting website origin, always from the OS. On Android it is `undefined` when a native app asked for itself. See [below](#when-there-is-no-origin). |\n| `callingPackage` | Android | The package that made the request, e.g. `com.android.chrome`. |\n| `requests` | Android | The [protocol requests](#protocol-requests) the verifier sent, in its order. Protocols this package does not know are left out, so this can be empty. |\n| `selection` | Android | What the user picked in the system picker: the credentials, and the request they were matched against. `undefined` when the request did not come through the picker. See [what was picked](#what-was-picked). |\n| `presentmentRequests` | iOS | [What the OS parsed](#the-parsed-request-ios) out of the request: documents, elements, and their `intentToRetain`. |\n| `readerAuthentications` | iOS | The reader authentications the request carried, each with its certificate chain as base64 DER. Empty when the request was not signed. |\n\n| Method | Platform | Behaviour |\n|---|---|---|\n| `approve()` | iOS | Commits to answering, and resolves with the protocol request the OS then releases. Always exactly one `org-iso-mdoc` request, in the same shape Android's `requests` has. Call it after the user approved. On iOS this is the point of no return. |\n| `respond({ protocol, data })` | both | Completes the request. See [responding](#responding). Rejects once the request was answered or declined. A response that failed can be retried, or declined. |\n| `decline(reason?)` | both | Declines. The reason is for logs, and the OS decides what the verifier sees. Does nothing once the request was answered or declined. |\n\n##### Protocol requests\n\nBoth platforms describe a request the same way. Android's `request.requests` and what iOS's\n`approve()` resolves with are the same `DcApiProtocolRequest[]`.\n\n```ts\ntype DcApiProtocolRequest =\n  // openid4vp | openid4vp-v1-unsigned | openid4vp-v1-signed | openid4vp-v1-multisigned\n  | { protocol: Openid4vpProtocol; data: string }\n  | { protocol: \"org-iso-mdoc\"; data: { deviceRequest: string; encryptionInfo: string } };\n```\n\n| Protocol | `data` | Platform |\n|---|---|---|\n| `openid4vp` | The OpenID4VP authorization request, as a JSON string. The draft protocol identifier. | Android |\n| `openid4vp-v1-unsigned` | Same, for an unsigned OpenID4VP 1.0 request. | Android |\n| `openid4vp-v1-signed` | Same, for a signed request. Verify the signature before trusting anything in it. | Android |\n| `openid4vp-v1-multisigned` | Same, for a request carrying more than one signature. | Android |\n| `org-iso-mdoc` | ISO/IEC TS 18013-7:2025 C.2: `deviceRequest` and `encryptionInfo`, both base64url-no-pad encoded CBOR. | both |\n\nChrome is inconsistent about whether `data` arrives as a string or an object. Android normalizes it\nto the table above before it reaches JS. `org-iso-mdoc` is the only protocol iOS speaks.\n\n##### What was picked\n\n`selection` is what the wasm matcher wrote into the picker entries the user chose. Its indexes are\nmapped back onto `requests` after unknown protocols are dropped.\n\n```ts\ntype AndroidDcApiSelection = {\n  credentialIds: string[];\n  requestIndex: number | undefined;\n  candidateRequestIndexes: number[];\n};\n```\n\n**Several credentials.** A request can ask for more than one credential at once: a DCQL query with\nseveral `credentials`, `credential_sets` whose options combine credentials, or an Annex C\n`deviceRequest` with several `docRequests`, optionally grouped by `deviceRequestInfo.useCases`. The\n`multipaz` matcher turns each way of answering into a set of credentials, with one slot per\ncredential the request needs and a choice of credentials in each slot. An optional credential set\nshows up as separate options, with and without it. The user confirms one set, and `credentialIds`\nholds one credential per slot. This works the same for OpenID4VP, with SD-JWT VC or mdoc, and for\n`org-iso-mdoc`. Answer with all of them in one response: a `vp_token` entry per DCQL credential query,\nor a document per credential in the Annex C `DeviceResponse`.\n\n`credentialIds` is in the order the picker returns them, which is not necessarily the order of the\nquery, and the matcher does not say which DCQL credential query each one answers. Match them against\nthe request to find out. `ubique` and `cmwallet` only register single credentials, so with those\n`credentialIds` always has one entry.\n\n**The matched request.** `requestIndex` is the request the credentials were matched against, when\nthe matcher's answer identifies one. `ubique` and `cmwallet` report the request itself. `multipaz`\nonly reports the protocol: its entry ids are `<combination> <protocol> <credentialId>` and carry no\nrequest index. So when the verifier sent several requests with the same protocol, `requestIndex` is\n`undefined` and `candidateRequestIndexes` lists all of them. The matcher answers the first request\nthe registered credentials can satisfy, so the one it matched is the first candidate the picked\ncredentials satisfy:\n\n```ts\nfunction matchedRequestIndex({ requests, selection }: AndroidDcApiRequest) {\n  if (!selection) return undefined;\n\n  return (\n    selection.requestIndex ??\n    // `isSatisfiedBy` is your own DCQL or deviceRequest evaluation.\n    selection.candidateRequestIndexes.find((index) => isSatisfiedBy(requests[index], selection.credentialIds))\n  );\n}\n```\n\n`candidateRequestIndexes` is empty when the matched request uses a protocol this package does not\nknow, since that request is not in `requests`.\n\n##### The parsed request (iOS)\n\n`presentmentRequests` mirrors `ISO18013MobileDocumentRequest.presentmentRequests` one to one:\n\n```ts\ntype IosPresentmentRequest = {\n  // PresentmentRequest.isMandatory\n  isMandatory: boolean;\n  documentRequestSets: {\n    // DocumentRequestSet.requests\n    documentRequests: {\n      // DocumentRequest.documentType\n      doctype: string;\n      // DocumentRequest.namespaces, with ElementInfo.isRetaining as intentToRetain\n      namespaces: Record<string, Record<string, { intentToRetain: boolean }>>;\n    }[];\n  }[];\n};\n```\n\n```ts\n// A request for the family name and portrait from an mDL:\n[\n  {\n    isMandatory: true,\n    documentRequestSets: [\n      {\n        documentRequests: [\n          {\n            doctype: \"org.iso.18013.5.1.mDL\",\n            namespaces: {\n              \"org.iso.18013.5.1\": {\n                family_name: { intentToRetain: false },\n                portrait: { intentToRetain: true },\n              },\n            },\n          },\n        ],\n      },\n    ],\n  },\n];\n```\n\n`intentToRetain` is the verifier's claim about whether it will store an element rather than only check\nit. Show it in your consent screen, but nothing enforces it.\n\nThe nesting carries the verifier's logic, and the wallet has to honour it:\n\n- **`presentmentRequests`**: every request marked `isMandatory` must be answered, the others may be\n  left out.\n- **`documentRequestSets`**: *exactly one* set answers a presentment request. The sets are\n  alternatives, and choosing between them is the only structural choice you have.\n- **`documentRequests`**: *every* document in the chosen set must be answered, so one response can\n  carry several.\n\nMatch this against your own credential storage to find which credentials can answer. The library\nkeeps no copy, see [Sharing storage with the request UI](#sharing-storage-with-the-request-ui).\n[`example/dc-api/DcApiScreen.tsx`](example/dc-api/DcApiScreen.tsx) walks the whole structure.\n\nAndroid has no equivalent and needs none: `request.requests` is the real request from the start.\n\n##### Responding\n\n`respond()` takes the protocol you answered and that protocol's data object.\n\nIt uses the shape the Digital Credentials API itself uses: a `protocol` and its `data`.\n\n```ts\ntype DcApiResponseOptions =\n  | { protocol: Openid4vpProtocol; data: Record<string, unknown> }\n  | { protocol: \"org-iso-mdoc\"; data: { response: string } };\n```\n\n| Protocol | `data` |\n|---|---|\n| `openid4vp*` | The OpenID4VP authorization response. What goes in it is OpenID4VP's business: `{ vp_token: … }`, or `{ response: \"<JWE>\" }` when the request asked for encryption. |\n| `org-iso-mdoc` | The ISO/IEC TS 18013-7:2025 C.3 response: `{ response: \"<base64url-no-pad EncryptedResponse>\" }`. |\n\nThe types enforce which protocols you can answer: Android's `respond` takes either variant, iOS's only\n`org-iso-mdoc`, so an un-narrowed `DcApiRequest` does too. Narrow on `platform` before answering\nOpenID4VP.\n\n##### Putting it together\n\nAnswering both protocols, on both platforms.\n\n```tsx\nimport type { DcApiRequest } from \"@animo-id/expo-digital-credentials-api/request-handler\";\nimport { Button, View } from \"react-native\";\n\nexport function MyCustomComponent({ request }: { request: DcApiRequest }) {\n  const onShare = async () => {\n    if (request.platform === \"android\") {\n      // The picker delivered the request and matched credentials against it.\n      const { selection } = request;\n      if (!selection) return request.decline(\"the request did not come through the picker\");\n\n      // See \"What was picked\" for `matchedRequestIndex`.\n      const index = matchedRequestIndex(request);\n      const picked = index === undefined ? undefined : request.requests[index];\n      if (!picked) return request.decline(\"no protocol this wallet can answer\");\n\n      // One credential per credential the request asks for, all answered in one response.\n      const { credentialIds } = selection;\n\n      if (picked.protocol !== \"org-iso-mdoc\") {\n        // An OpenID4VP authorization request, as a JSON string. Signed variants are a JWT —\n        // verify them before rendering or answering anything they contain.\n        const authorizationResponse = await buildOpenid4vpResponse(picked.data, request.origin, credentialIds);\n        return request.respond({ protocol: picked.protocol, data: authorizationResponse });\n      }\n\n      return request.respond({\n        protocol: \"org-iso-mdoc\",\n        data: { response: await buildAnnexCResponse(picked.data, request.origin, credentialIds) },\n      });\n    }\n\n    // iOS releases the request only once the wallet commits to answering it, so this belongs\n    // behind the user's approval — and what comes back is always Annex C.\n    const [isoMdoc] = await request.approve();\n    if (!isoMdoc) return request.decline(\"no protocol this wallet can answer\");\n\n    // There is no picker on iOS: the credentials are the ones your own screen matched against\n    // `presentmentRequests`.\n    return request.respond({\n      protocol: \"org-iso-mdoc\",\n      data: { response: await buildAnnexCResponse(isoMdoc.data, request.origin, chosenCredentialIds) },\n    });\n  };\n\n  return (\n    <View style={{ width: \"100%\" }}>\n      <Button title=\"Share\" onPress={onShare} />\n      <Button title=\"Decline\" onPress={() => request.decline()} />\n    </View>\n  );\n}\n```\n\n`buildAnnexCResponse` is the same function in both branches, since `{ deviceRequest, encryptionInfo }`\nis the same shape wherever it came from. With Credo it is `agent.mdoc.resolveDcApiRequest` followed by\n`agent.mdoc.createDcApiResponse`. The [example app](./example/dc-api/DcApiScreen.tsx) shows the whole\nscreen.\n\n> [!IMPORTANT]\n> Always use the `origin` the OS provides, never one taken from the request payload. It is bound into the session transcript, which is what makes a response relayed from another origin undecryptable.\n\n##### When there is no origin\n\nOn Android `origin` is `undefined` when a native app called Credential Manager for itself rather than\na browser on behalf of a page. Use `callingPackage` instead: decline, or derive the app-based origin\nyour protocol prescribes from it.\n\nAn unverifiable origin never reaches you: a caller claiming an origin without being a privileged app\nfails natively. On iOS `origin` is always a string, and requests without one are cancelled before\nyour UI is shown.\n\n## Known issues\n\nTwo upstream bugs affect the request UI. Both are fixed by patches in [`patches/`](./patches). Copy\nthe file into your project and apply it with pnpm's `patchedDependencies`, or with\n[`patch-package`](https://github.com/ds300/patch-package), which matches on the file name.\n\n### Text with a `fontFamily` is invisible on iOS\n\nReact Native reads the user's text size from `UIApplication`, which an app extension does not have,\nso its font size multiplier is `0` and every font is sized to nothing. The system font falls back to\nits default size, so *only* text naming a `fontFamily` disappears, which looks like a font problem\nand is not one ([facebook/react-native#54642](https://github.com/facebook/react-native/issues/54642)).\n\n[`react-native+0.83.10.patch`](./patches/react-native+0.83.10.patch) reads the text size from the\ncurrent trait collection instead, which an extension does get from its host, and clamps anything\nunusable to `1.0`. The patched code is unchanged up to at least 0.85.3, so the patch applies as it is:\nrename it to your React Native version. It patches React Core sources, so React Native has to be built from source too.\nAgainst the prebuilt `React.xcframework` it is never compiled:\n\n```json\n[\"expo-build-properties\", { \"ios\": { \"buildReactNativeFromSource\": true } }]\n```\n\n### Keychain reads fail in the request UI on Android\n\nReads fail with `There are multiple DataStores active for the same file` while the same call works\nin the app. Android runs the request UI on a second React host in the app's process, so every\nautolinked module is instantiated twice. Since 9.2.0 `react-native-keychain` builds its `DataStore`\nper instance, so the second host opens a second store over the same file. Your storage layer usually\nwraps this in an error of its own, so read the real cause from `adb logcat`.\n\n[`react-native-keychain+10.0.0.patch`](./patches/react-native-keychain+10.0.0.patch) moves the store\nto file level with a process-owned scope. Upstream:\n[#777](https://github.com/oblador/react-native-keychain/issues/777),\n[#784](https://github.com/oblador/react-native-keychain/issues/784),\n[#801](https://github.com/oblador/react-native-keychain/issues/801). The open fix in\n[#793](https://github.com/oblador/react-native-keychain/pull/793) keeps the module-owned scope, so\nthe first module invalidated still takes the shared store down. Unreleased since 10.0.0.\n\niOS needs no patch: separate process, keychain items reached through `ios.keychainAccessGroup`.\nLink the package into the extension either way.\n\n> [!NOTE]\n> Nothing here is specific to `react-native-keychain`. Any native module holding a process-wide\n> resource keyed by file or name breaks the same way on Android: it works in the app and fails only\n> in the request UI.\n\n## Contributing\n\nIs there something you'd like to fix or add? Great, we love community contributions! To get involved, please follow our [contribution guidelines](https://github.com/animo/.github/blob/main/CONTRIBUTING.md).\n\n## License\n\nThis repository is licensed under the [Apache 2.0](./LICENSE) license.\n","readmeFilename":"README.md"}