@smileid/usesmileid 12.0.0-beta01 → 12.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +701 -89
  3. package/dist/camera/camera_defaults.d.ts +14 -9
  4. package/dist/camera/camera_defaults.d.ts.map +1 -1
  5. package/dist/camera/camera_defaults.js +11 -9
  6. package/dist/camera/camera_defaults.js.map +1 -1
  7. package/dist/camera/orientation_degrees.d.ts +5 -6
  8. package/dist/camera/orientation_degrees.d.ts.map +1 -1
  9. package/dist/camera/orientation_degrees.js +5 -6
  10. package/dist/camera/orientation_degrees.js.map +1 -1
  11. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.d.ts +11 -0
  12. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.d.ts.map +1 -0
  13. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.js +17 -0
  14. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.js.map +1 -0
  15. package/dist/core/exception/capture_validation_exceptions.d.ts +1 -0
  16. package/dist/core/exception/capture_validation_exceptions.d.ts.map +1 -1
  17. package/dist/core/exception/capture_validation_exceptions.js +1 -0
  18. package/dist/core/exception/capture_validation_exceptions.js.map +1 -1
  19. package/dist/core/exception/index.d.ts +1 -0
  20. package/dist/core/exception/index.d.ts.map +1 -1
  21. package/dist/core/exception/index.js +1 -0
  22. package/dist/core/exception/index.js.map +1 -1
  23. package/dist/core/exception/use_smile_id_error_code.d.ts +1 -0
  24. package/dist/core/exception/use_smile_id_error_code.d.ts.map +1 -1
  25. package/dist/core/exception/use_smile_id_error_code.js +1 -0
  26. package/dist/core/exception/use_smile_id_error_code.js.map +1 -1
  27. package/dist/core/models/config.d.ts +19 -0
  28. package/dist/core/models/config.d.ts.map +1 -1
  29. package/dist/core/models/document_capture_mode.d.ts +8 -0
  30. package/dist/core/models/document_capture_mode.d.ts.map +1 -1
  31. package/dist/core/models/document_capture_mode.js +24 -0
  32. package/dist/core/models/document_capture_mode.js.map +1 -1
  33. package/dist/core/models/document_type.d.ts +2 -2
  34. package/dist/core/models/document_type.d.ts.map +1 -1
  35. package/dist/core/models/document_type.js +7 -5
  36. package/dist/core/models/document_type.js.map +1 -1
  37. package/dist/core/models/global_privacy_control.d.ts +36 -0
  38. package/dist/core/models/global_privacy_control.d.ts.map +1 -0
  39. package/dist/core/models/global_privacy_control.js +39 -0
  40. package/dist/core/models/global_privacy_control.js.map +1 -0
  41. package/dist/core/models/network_config.d.ts +2 -2
  42. package/dist/core/models/network_config.js +2 -2
  43. package/dist/core/models/result.d.ts +9 -8
  44. package/dist/core/models/result.d.ts.map +1 -1
  45. package/dist/core/models/result.js +5 -6
  46. package/dist/core/models/result.js.map +1 -1
  47. package/dist/data/api/interceptors/smile_auth_interceptor.d.ts.map +1 -1
  48. package/dist/data/api/interceptors/smile_auth_interceptor.js +3 -17
  49. package/dist/data/api/interceptors/smile_auth_interceptor.js.map +1 -1
  50. package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts +11 -0
  51. package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts.map +1 -1
  52. package/dist/data/api/interceptors/smile_integrity_interceptor.js +13 -0
  53. package/dist/data/api/interceptors/smile_integrity_interceptor.js.map +1 -1
  54. package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts +8 -0
  55. package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts.map +1 -1
  56. package/dist/data/api/interceptors/smile_request_mac_interceptor.js +11 -0
  57. package/dist/data/api/interceptors/smile_request_mac_interceptor.js.map +1 -1
  58. package/dist/data/api/smile_id_api.d.ts +1 -1
  59. package/dist/data/api/smile_id_api.d.ts.map +1 -1
  60. package/dist/data/compression/compressible_asset.d.ts +41 -0
  61. package/dist/data/compression/compressible_asset.d.ts.map +1 -0
  62. package/dist/data/compression/compressible_asset.js +34 -0
  63. package/dist/data/compression/compressible_asset.js.map +1 -0
  64. package/dist/data/compression/payload_compression_config.d.ts +36 -0
  65. package/dist/data/compression/payload_compression_config.d.ts.map +1 -0
  66. package/dist/data/compression/payload_compression_config.js +52 -0
  67. package/dist/data/compression/payload_compression_config.js.map +1 -0
  68. package/dist/data/compression/payload_compression_runner.d.ts +29 -0
  69. package/dist/data/compression/payload_compression_runner.d.ts.map +1 -0
  70. package/dist/data/compression/payload_compression_runner.js +55 -0
  71. package/dist/data/compression/payload_compression_runner.js.map +1 -0
  72. package/dist/data/compression/payload_compressor.d.ts +40 -0
  73. package/dist/data/compression/payload_compressor.d.ts.map +1 -0
  74. package/dist/data/compression/payload_compressor.js +126 -0
  75. package/dist/data/compression/payload_compressor.js.map +1 -0
  76. package/dist/data/compression/uri_compressible_asset.d.ts +23 -0
  77. package/dist/data/compression/uri_compressible_asset.d.ts.map +1 -0
  78. package/dist/data/compression/uri_compressible_asset.js +77 -0
  79. package/dist/data/compression/uri_compressible_asset.js.map +1 -0
  80. package/dist/data/dsl/builder/cache_config_builder.d.ts +2 -1
  81. package/dist/data/dsl/builder/cache_config_builder.d.ts.map +1 -1
  82. package/dist/data/dsl/builder/cache_config_builder.js +2 -1
  83. package/dist/data/dsl/builder/cache_config_builder.js.map +1 -1
  84. package/dist/data/dsl/builder/config_builder.d.ts +40 -14
  85. package/dist/data/dsl/builder/config_builder.d.ts.map +1 -1
  86. package/dist/data/dsl/builder/config_builder.js +40 -14
  87. package/dist/data/dsl/builder/config_builder.js.map +1 -1
  88. package/dist/data/dsl/builder/interceptor_config_builder.d.ts +9 -7
  89. package/dist/data/dsl/builder/interceptor_config_builder.d.ts.map +1 -1
  90. package/dist/data/dsl/builder/interceptor_config_builder.js +9 -7
  91. package/dist/data/dsl/builder/interceptor_config_builder.js.map +1 -1
  92. package/dist/data/dsl/builder/retry_config_builder.d.ts +19 -4
  93. package/dist/data/dsl/builder/retry_config_builder.d.ts.map +1 -1
  94. package/dist/data/dsl/builder/retry_config_builder.js +21 -6
  95. package/dist/data/dsl/builder/retry_config_builder.js.map +1 -1
  96. package/dist/data/dsl/builder/timeout_config_builder.d.ts +4 -0
  97. package/dist/data/dsl/builder/timeout_config_builder.d.ts.map +1 -1
  98. package/dist/data/dsl/builder/timeout_config_builder.js +4 -0
  99. package/dist/data/dsl/builder/timeout_config_builder.js.map +1 -1
  100. package/dist/data/dsl/use_smile_id_network_builder.d.ts +17 -0
  101. package/dist/data/dsl/use_smile_id_network_builder.d.ts.map +1 -1
  102. package/dist/data/dsl/use_smile_id_network_builder.js +17 -0
  103. package/dist/data/dsl/use_smile_id_network_builder.js.map +1 -1
  104. package/dist/data/factory/networking_factory.d.ts.map +1 -1
  105. package/dist/data/factory/networking_factory.js +11 -1
  106. package/dist/data/factory/networking_factory.js.map +1 -1
  107. package/dist/data/repository/use_smile_id_repository_impl.d.ts +6 -0
  108. package/dist/data/repository/use_smile_id_repository_impl.d.ts.map +1 -1
  109. package/dist/data/repository/use_smile_id_repository_impl.js +82 -8
  110. package/dist/data/repository/use_smile_id_repository_impl.js.map +1 -1
  111. package/dist/data/security/request_canonicalizer.d.ts.map +1 -1
  112. package/dist/data/security/request_canonicalizer.js +14 -2
  113. package/dist/data/security/request_canonicalizer.js.map +1 -1
  114. package/dist/data/security/security_policy.d.ts +43 -0
  115. package/dist/data/security/security_policy.d.ts.map +1 -0
  116. package/dist/data/security/security_policy.js +61 -0
  117. package/dist/data/security/security_policy.js.map +1 -0
  118. package/dist/data/smile_id_urls.d.ts +1 -1
  119. package/dist/data/smile_id_urls.js +1 -1
  120. package/dist/data/smile_id_urls.js.map +1 -1
  121. package/dist/data/util/retry_util.d.ts +2 -2
  122. package/dist/data/util/retry_util.d.ts.map +1 -1
  123. package/dist/data/util/retry_util.js +7 -1
  124. package/dist/data/util/retry_util.js.map +1 -1
  125. package/dist/data/util/use_smile_id_token_decoder.d.ts +22 -0
  126. package/dist/data/util/use_smile_id_token_decoder.d.ts.map +1 -1
  127. package/dist/data/util/use_smile_id_token_decoder.js +58 -24
  128. package/dist/data/util/use_smile_id_token_decoder.js.map +1 -1
  129. package/dist/index.d.ts +2 -2
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +2 -2
  132. package/dist/index.js.map +1 -1
  133. package/dist/l10n/strings_en.d.ts +2 -1
  134. package/dist/l10n/strings_en.d.ts.map +1 -1
  135. package/dist/l10n/strings_en.js +2 -1
  136. package/dist/l10n/strings_en.js.map +1 -1
  137. package/dist/l10n/use_smile_id_localizations.d.ts +1 -0
  138. package/dist/l10n/use_smile_id_localizations.d.ts.map +1 -1
  139. package/dist/l10n/use_smile_id_localizations.js +3 -0
  140. package/dist/l10n/use_smile_id_localizations.js.map +1 -1
  141. package/dist/metadata/builder_configuration.d.ts +44 -0
  142. package/dist/metadata/builder_configuration.d.ts.map +1 -0
  143. package/dist/metadata/builder_configuration.js +35 -0
  144. package/dist/metadata/builder_configuration.js.map +1 -0
  145. package/dist/metadata/captured_image_properties.d.ts +11 -0
  146. package/dist/metadata/captured_image_properties.d.ts.map +1 -0
  147. package/dist/metadata/captured_image_properties.js +11 -0
  148. package/dist/metadata/captured_image_properties.js.map +1 -0
  149. package/dist/metadata/device_orientation_collector.d.ts +17 -0
  150. package/dist/metadata/device_orientation_collector.d.ts.map +1 -0
  151. package/dist/metadata/device_orientation_collector.js +66 -0
  152. package/dist/metadata/device_orientation_collector.js.map +1 -0
  153. package/dist/metadata/geolocation.d.ts +20 -0
  154. package/dist/metadata/geolocation.d.ts.map +1 -0
  155. package/dist/metadata/geolocation.js +40 -0
  156. package/dist/metadata/geolocation.js.map +1 -0
  157. package/dist/metadata/metadata_configuration_mappers.d.ts +47 -0
  158. package/dist/metadata/metadata_configuration_mappers.d.ts.map +1 -0
  159. package/dist/metadata/metadata_configuration_mappers.js +178 -0
  160. package/dist/metadata/metadata_configuration_mappers.js.map +1 -0
  161. package/dist/metadata/model_configuration.d.ts +41 -0
  162. package/dist/metadata/model_configuration.d.ts.map +1 -0
  163. package/dist/metadata/model_configuration.js +44 -0
  164. package/dist/metadata/model_configuration.js.map +1 -0
  165. package/dist/metadata/optional_native_modules.d.ts +79 -3
  166. package/dist/metadata/optional_native_modules.d.ts.map +1 -1
  167. package/dist/metadata/optional_native_modules.js +108 -3
  168. package/dist/metadata/optional_native_modules.js.map +1 -1
  169. package/dist/metadata/use_smile_id_metadata.d.ts +45 -7
  170. package/dist/metadata/use_smile_id_metadata.d.ts.map +1 -1
  171. package/dist/metadata/use_smile_id_metadata.js +85 -13
  172. package/dist/metadata/use_smile_id_metadata.js.map +1 -1
  173. package/dist/metadata/use_smile_id_metadata_factory.d.ts +37 -0
  174. package/dist/metadata/use_smile_id_metadata_factory.d.ts.map +1 -1
  175. package/dist/metadata/use_smile_id_metadata_factory.js +197 -16
  176. package/dist/metadata/use_smile_id_metadata_factory.js.map +1 -1
  177. package/dist/presentation/assets/svg/document_shimmer_strings.d.ts +14 -0
  178. package/dist/presentation/assets/svg/document_shimmer_strings.d.ts.map +1 -0
  179. package/dist/presentation/assets/svg/document_shimmer_strings.js +14 -0
  180. package/dist/presentation/assets/svg/document_shimmer_strings.js.map +1 -0
  181. package/dist/presentation/assets/svg/instruction_svg_strings.d.ts +12 -4
  182. package/dist/presentation/assets/svg/instruction_svg_strings.d.ts.map +1 -1
  183. package/dist/presentation/assets/svg/instruction_svg_strings.js +19 -8
  184. package/dist/presentation/assets/svg/instruction_svg_strings.js.map +1 -1
  185. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts +0 -5
  186. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts.map +1 -1
  187. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js +0 -5
  188. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js.map +1 -1
  189. package/dist/presentation/components/icons/index.d.ts +24 -8
  190. package/dist/presentation/components/icons/index.d.ts.map +1 -1
  191. package/dist/presentation/components/icons/index.js +31 -11
  192. package/dist/presentation/components/icons/index.js.map +1 -1
  193. package/dist/presentation/components/use_smile_id_attribution.d.ts +1 -1
  194. package/dist/presentation/components/use_smile_id_button.d.ts +2 -2
  195. package/dist/presentation/components/use_smile_id_button.js +4 -4
  196. package/dist/presentation/components/use_smile_id_button.js.map +1 -1
  197. package/dist/presentation/components/use_smile_id_capture_content.d.ts +13 -0
  198. package/dist/presentation/components/use_smile_id_capture_content.d.ts.map +1 -1
  199. package/dist/presentation/components/use_smile_id_capture_content.js +15 -9
  200. package/dist/presentation/components/use_smile_id_capture_content.js.map +1 -1
  201. package/dist/presentation/components/use_smile_id_captured_document_image.d.ts +2 -3
  202. package/dist/presentation/components/use_smile_id_captured_document_image.d.ts.map +1 -1
  203. package/dist/presentation/components/use_smile_id_captured_document_image.js +1 -3
  204. package/dist/presentation/components/use_smile_id_captured_document_image.js.map +1 -1
  205. package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts +12 -6
  206. package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts.map +1 -1
  207. package/dist/presentation/components/use_smile_id_document_capture_controls.js +59 -16
  208. package/dist/presentation/components/use_smile_id_document_capture_controls.js.map +1 -1
  209. package/dist/presentation/components/use_smile_id_document_overlay.d.ts +22 -5
  210. package/dist/presentation/components/use_smile_id_document_overlay.d.ts.map +1 -1
  211. package/dist/presentation/components/use_smile_id_document_overlay.js +80 -40
  212. package/dist/presentation/components/use_smile_id_document_overlay.js.map +1 -1
  213. package/dist/presentation/components/use_smile_id_document_shimmer.d.ts +15 -0
  214. package/dist/presentation/components/use_smile_id_document_shimmer.d.ts.map +1 -0
  215. package/dist/presentation/components/use_smile_id_document_shimmer.js +23 -0
  216. package/dist/presentation/components/use_smile_id_document_shimmer.js.map +1 -0
  217. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts +5 -2
  218. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts.map +1 -1
  219. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js +9 -6
  220. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js.map +1 -1
  221. package/dist/presentation/components/use_smile_id_guideline_thumbnail.d.ts.map +1 -1
  222. package/dist/presentation/components/use_smile_id_guideline_thumbnail.js +84 -1
  223. package/dist/presentation/components/use_smile_id_guideline_thumbnail.js.map +1 -1
  224. package/dist/presentation/components/use_smile_id_instructions_hero.d.ts +3 -1
  225. package/dist/presentation/components/use_smile_id_instructions_hero.d.ts.map +1 -1
  226. package/dist/presentation/components/use_smile_id_instructions_hero.js +25 -5
  227. package/dist/presentation/components/use_smile_id_instructions_hero.js.map +1 -1
  228. package/dist/presentation/components/use_smile_id_oval_border_palette.d.ts.map +1 -1
  229. package/dist/presentation/components/use_smile_id_oval_border_palette.js +7 -3
  230. package/dist/presentation/components/use_smile_id_oval_border_palette.js.map +1 -1
  231. package/dist/presentation/flow/dsl/builder/config_builder.d.ts +28 -0
  232. package/dist/presentation/flow/dsl/builder/config_builder.d.ts.map +1 -1
  233. package/dist/presentation/flow/dsl/builder/config_builder.js +30 -0
  234. package/dist/presentation/flow/dsl/builder/config_builder.js.map +1 -1
  235. package/dist/presentation/flow/dsl/builder/ml_builder.d.ts +13 -4
  236. package/dist/presentation/flow/dsl/builder/ml_builder.d.ts.map +1 -1
  237. package/dist/presentation/flow/dsl/builder/ml_builder.js +3 -2
  238. package/dist/presentation/flow/dsl/builder/ml_builder.js.map +1 -1
  239. package/dist/presentation/flow/dsl/builder/screens_builder.d.ts +110 -12
  240. package/dist/presentation/flow/dsl/builder/screens_builder.d.ts.map +1 -1
  241. package/dist/presentation/flow/dsl/builder/screens_builder.js +110 -12
  242. package/dist/presentation/flow/dsl/builder/screens_builder.js.map +1 -1
  243. package/dist/presentation/flow/dsl/builder/theme_builder.d.ts +15 -2
  244. package/dist/presentation/flow/dsl/builder/theme_builder.d.ts.map +1 -1
  245. package/dist/presentation/flow/dsl/builder/theme_builder.js +15 -2
  246. package/dist/presentation/flow/dsl/builder/theme_builder.js.map +1 -1
  247. package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts +6 -4
  248. package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts.map +1 -1
  249. package/dist/presentation/flow/dsl/use_smile_id_builder.js.map +1 -1
  250. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts +62 -36
  251. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts.map +1 -1
  252. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js +62 -36
  253. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js.map +1 -1
  254. package/dist/presentation/flow/flow_navigation_manager.d.ts +44 -5
  255. package/dist/presentation/flow/flow_navigation_manager.d.ts.map +1 -1
  256. package/dist/presentation/flow/flow_navigation_manager.js +148 -11
  257. package/dist/presentation/flow/flow_navigation_manager.js.map +1 -1
  258. package/dist/presentation/flow/model/instruction_guideline.d.ts +9 -0
  259. package/dist/presentation/flow/model/instruction_guideline.d.ts.map +1 -1
  260. package/dist/presentation/flow/model/instructions_defaults.d.ts +11 -2
  261. package/dist/presentation/flow/model/instructions_defaults.d.ts.map +1 -1
  262. package/dist/presentation/flow/model/instructions_defaults.js +74 -26
  263. package/dist/presentation/flow/model/instructions_defaults.js.map +1 -1
  264. package/dist/presentation/flow/screen/orchestrated_capture_screen.d.ts.map +1 -1
  265. package/dist/presentation/flow/screen/orchestrated_capture_screen.js +48 -14
  266. package/dist/presentation/flow/screen/orchestrated_capture_screen.js.map +1 -1
  267. package/dist/presentation/flow/screen/orchestrated_consent_screen.d.ts.map +1 -1
  268. package/dist/presentation/flow/screen/orchestrated_consent_screen.js +3 -1
  269. package/dist/presentation/flow/screen/orchestrated_consent_screen.js.map +1 -1
  270. package/dist/presentation/flow/screen/orchestrated_instructions_screen.js +1 -1
  271. package/dist/presentation/flow/screen/orchestrated_instructions_screen.js.map +1 -1
  272. package/dist/presentation/flow/screen/orchestrated_preview_screen.d.ts.map +1 -1
  273. package/dist/presentation/flow/screen/orchestrated_preview_screen.js +3 -9
  274. package/dist/presentation/flow/screen/orchestrated_preview_screen.js.map +1 -1
  275. package/dist/presentation/flow/screen/orchestrated_processing_screen.js +3 -3
  276. package/dist/presentation/flow/screen/orchestrated_processing_screen.js.map +1 -1
  277. package/dist/presentation/flow/use_smile_id_flow.d.ts.map +1 -1
  278. package/dist/presentation/flow/use_smile_id_flow.js +10 -4
  279. package/dist/presentation/flow/use_smile_id_flow.js.map +1 -1
  280. package/dist/presentation/flow/validation/flow_validator.d.ts.map +1 -1
  281. package/dist/presentation/flow/validation/flow_validator.js +42 -20
  282. package/dist/presentation/flow/validation/flow_validator.js.map +1 -1
  283. package/dist/presentation/flow/validation/job_type_validator.d.ts.map +1 -1
  284. package/dist/presentation/flow/validation/job_type_validator.js +14 -0
  285. package/dist/presentation/flow/validation/job_type_validator.js.map +1 -1
  286. package/dist/presentation/screen/helpers/capture_screen_helpers.d.ts.map +1 -1
  287. package/dist/presentation/screen/helpers/capture_screen_helpers.js +1 -0
  288. package/dist/presentation/screen/helpers/capture_screen_helpers.js.map +1 -1
  289. package/dist/presentation/screen/helpers/capture_ui_state.d.ts +6 -6
  290. package/dist/presentation/screen/helpers/capture_ui_state.d.ts.map +1 -1
  291. package/dist/presentation/screen/helpers/capture_ui_state.js +19 -19
  292. package/dist/presentation/screen/helpers/capture_ui_state.js.map +1 -1
  293. package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts +2 -2
  294. package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts.map +1 -1
  295. package/dist/presentation/screen/helpers/ess_turn_haptics.js +6 -6
  296. package/dist/presentation/screen/helpers/ess_turn_haptics.js.map +1 -1
  297. package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts +1 -0
  298. package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts.map +1 -1
  299. package/dist/presentation/screen/helpers/instructions_screen_helpers.js +6 -2
  300. package/dist/presentation/screen/helpers/instructions_screen_helpers.js.map +1 -1
  301. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.d.ts +5 -5
  302. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.d.ts.map +1 -1
  303. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js +14 -11
  304. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js.map +1 -1
  305. package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts +13 -3
  306. package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts.map +1 -1
  307. package/dist/presentation/screen/helpers/use_capture_orientation_lock.js +48 -6
  308. package/dist/presentation/screen/helpers/use_capture_orientation_lock.js.map +1 -1
  309. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts +21 -3
  310. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts.map +1 -1
  311. package/dist/presentation/screen/use_smile_id_capture_screen.js +188 -32
  312. package/dist/presentation/screen/use_smile_id_capture_screen.js.map +1 -1
  313. package/dist/presentation/screen/use_smile_id_consent_screen.d.ts +7 -0
  314. package/dist/presentation/screen/use_smile_id_consent_screen.d.ts.map +1 -1
  315. package/dist/presentation/screen/use_smile_id_consent_screen.js +6 -5
  316. package/dist/presentation/screen/use_smile_id_consent_screen.js.map +1 -1
  317. package/dist/presentation/screen/use_smile_id_document_back_instructions.d.ts.map +1 -1
  318. package/dist/presentation/screen/use_smile_id_document_back_instructions.js +5 -13
  319. package/dist/presentation/screen/use_smile_id_document_back_instructions.js.map +1 -1
  320. package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts +2 -3
  321. package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts.map +1 -1
  322. package/dist/presentation/screen/use_smile_id_document_preview_screen.js +17 -12
  323. package/dist/presentation/screen/use_smile_id_document_preview_screen.js.map +1 -1
  324. package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts +2 -0
  325. package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts.map +1 -1
  326. package/dist/presentation/screen/use_smile_id_instructions_screen.js +2 -1
  327. package/dist/presentation/screen/use_smile_id_instructions_screen.js.map +1 -1
  328. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts +7 -26
  329. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts.map +1 -1
  330. package/dist/presentation/screen/use_smile_id_preview_screen.js +10 -20
  331. package/dist/presentation/screen/use_smile_id_preview_screen.js.map +1 -1
  332. package/dist/presentation/screen/use_smile_id_processing_screen.d.ts +2 -3
  333. package/dist/presentation/screen/use_smile_id_processing_screen.d.ts.map +1 -1
  334. package/dist/presentation/screen/use_smile_id_processing_screen.js +4 -3
  335. package/dist/presentation/screen/use_smile_id_processing_screen.js.map +1 -1
  336. package/dist/presentation/theme/theme.d.ts +1 -1
  337. package/dist/presentation/theme/theme.d.ts.map +1 -1
  338. package/dist/presentation/theme/theme.js +20 -18
  339. package/dist/presentation/theme/theme.js.map +1 -1
  340. package/dist/presentation/utils/force_max_brightness.d.ts +4 -4
  341. package/dist/presentation/utils/locale_utils.d.ts +10 -4
  342. package/dist/presentation/utils/locale_utils.d.ts.map +1 -1
  343. package/dist/presentation/utils/locale_utils.js +13 -5
  344. package/dist/presentation/utils/locale_utils.js.map +1 -1
  345. package/dist/testing/fake_face_analyzer.d.ts +43 -0
  346. package/dist/testing/fake_face_analyzer.d.ts.map +1 -0
  347. package/dist/testing/fake_face_analyzer.js +52 -0
  348. package/dist/testing/fake_face_analyzer.js.map +1 -0
  349. package/dist/testing/index.d.ts +5 -0
  350. package/dist/testing/index.d.ts.map +1 -0
  351. package/dist/testing/index.js +7 -0
  352. package/dist/testing/index.js.map +1 -0
  353. package/dist/testing/scenario_expectations.d.ts +28 -0
  354. package/dist/testing/scenario_expectations.d.ts.map +1 -0
  355. package/dist/testing/scenario_expectations.js +65 -0
  356. package/dist/testing/scenario_expectations.js.map +1 -0
  357. package/dist/testing/scenario_loader.d.ts +11 -0
  358. package/dist/testing/scenario_loader.d.ts.map +1 -0
  359. package/dist/testing/scenario_loader.js +64 -0
  360. package/dist/testing/scenario_loader.js.map +1 -0
  361. package/dist/testing/scripted_scan_results.d.ts +17 -0
  362. package/dist/testing/scripted_scan_results.d.ts.map +1 -0
  363. package/dist/testing/scripted_scan_results.js +52 -0
  364. package/dist/testing/scripted_scan_results.js.map +1 -0
  365. package/package.json +34 -7
  366. package/src/__tests__/dsl.test.ts +51 -1
  367. package/src/__tests__/react_native_mock.tsx +8 -0
  368. package/src/__tests__/setup_react_native.ts +17 -2
  369. package/src/__tests__/snapshots/__snapshots__/screens_structural.test.tsx.snap +5261 -0
  370. package/src/__tests__/snapshots/screens_structural.test.tsx +230 -0
  371. package/src/camera/__tests__/use_smile_id_camera_system.test.ts +103 -0
  372. package/src/camera/camera_defaults.ts +11 -9
  373. package/src/camera/orientation_degrees.ts +5 -6
  374. package/src/core/exception/__tests__/builder_validation_exceptions.test.ts +67 -0
  375. package/src/core/exception/agent_mode_with_enhanced_liveness_exception.ts +20 -0
  376. package/src/core/exception/capture_validation_exceptions.ts +1 -0
  377. package/src/core/exception/index.ts +1 -0
  378. package/src/core/exception/use_smile_id_error_code.ts +1 -0
  379. package/src/core/models/__tests__/document_type.test.ts +7 -5
  380. package/src/core/models/__tests__/flow_models.test.ts +26 -0
  381. package/src/core/models/config.ts +22 -0
  382. package/src/core/models/document_capture_mode.ts +27 -0
  383. package/src/core/models/document_type.ts +7 -5
  384. package/src/core/models/global_privacy_control.ts +45 -0
  385. package/src/core/models/network_config.ts +2 -2
  386. package/src/core/models/result.ts +9 -8
  387. package/src/data/api/__tests__/smile_id_api.test.ts +1 -1
  388. package/src/data/api/interceptors/__tests__/gzip_interceptor.test.ts +83 -0
  389. package/src/data/api/interceptors/__tests__/smile_integrity_interceptor.test.ts +37 -1
  390. package/src/data/api/interceptors/__tests__/smile_request_mac_interceptor.test.ts +59 -1
  391. package/src/data/api/interceptors/smile_auth_interceptor.ts +3 -18
  392. package/src/data/api/interceptors/smile_integrity_interceptor.ts +20 -0
  393. package/src/data/api/interceptors/smile_request_mac_interceptor.ts +13 -0
  394. package/src/data/compression/__tests__/payload_compressor.test.ts +200 -0
  395. package/src/data/compression/__tests__/payload_compressor_real_jpeg.test.ts +226 -0
  396. package/src/data/compression/compressible_asset.ts +62 -0
  397. package/src/data/compression/payload_compression_config.ts +53 -0
  398. package/src/data/compression/payload_compression_runner.ts +102 -0
  399. package/src/data/compression/payload_compressor.ts +164 -0
  400. package/src/data/compression/uri_compressible_asset.ts +85 -0
  401. package/src/data/dsl/builder/__tests__/config_builders.test.ts +62 -0
  402. package/src/data/dsl/builder/cache_config_builder.ts +3 -1
  403. package/src/data/dsl/builder/config_builder.ts +45 -14
  404. package/src/data/dsl/builder/interceptor_config_builder.ts +9 -7
  405. package/src/data/dsl/builder/retry_config_builder.ts +27 -6
  406. package/src/data/dsl/builder/timeout_config_builder.ts +7 -0
  407. package/src/data/dsl/use_smile_id_network_builder.ts +17 -0
  408. package/src/data/factory/__tests__/retry_gzip_mac_composition.test.ts +163 -0
  409. package/src/data/factory/__tests__/signed_job_submission_headers.test.ts +1 -1
  410. package/src/data/factory/networking_factory.ts +14 -1
  411. package/src/data/repository/__tests__/network_retries.test.ts +117 -0
  412. package/src/data/repository/__tests__/use_smile_id_repository.test.ts +1 -1
  413. package/src/data/repository/use_smile_id_repository_impl.ts +96 -9
  414. package/src/data/security/__tests__/request_canonicalizer.test.ts +132 -0
  415. package/src/data/security/__tests__/security_policy.test.ts +96 -0
  416. package/src/data/security/__tests__/smile_id_crypto_manager.test.ts +18 -0
  417. package/src/data/security/request_canonicalizer.ts +15 -2
  418. package/src/data/security/security_policy.ts +70 -0
  419. package/src/data/smile_id_urls.ts +1 -1
  420. package/src/data/util/__tests__/retry_util.test.ts +25 -0
  421. package/src/data/util/__tests__/use_smile_id_token_decoder.test.ts +57 -1
  422. package/src/data/util/retry_util.ts +12 -3
  423. package/src/data/util/use_smile_id_token_decoder.ts +76 -28
  424. package/src/index.ts +6 -4
  425. package/src/l10n/strings_en.ts +2 -1
  426. package/src/l10n/use_smile_id_localizations.ts +3 -0
  427. package/src/metadata/__tests__/device_orientation_collector.test.ts +15 -0
  428. package/src/metadata/__tests__/metadata_configuration_mappers.test.ts +254 -0
  429. package/src/metadata/__tests__/metadata_configuration_objects.test.ts +86 -0
  430. package/src/metadata/__tests__/metadata_device_context.test.ts +147 -0
  431. package/src/metadata/__tests__/metadata_device_os_android.test.ts +18 -0
  432. package/src/metadata/__tests__/metadata_golden_fixture.json +13 -0
  433. package/src/metadata/__tests__/metadata_payload_golden.test.ts +193 -0
  434. package/src/metadata/__tests__/use_smile_id_metadata.test.ts +19 -25
  435. package/src/metadata/builder_configuration.ts +69 -0
  436. package/src/metadata/captured_image_properties.ts +10 -0
  437. package/src/metadata/device_orientation_collector.ts +75 -0
  438. package/src/metadata/geolocation.ts +46 -0
  439. package/src/metadata/metadata_configuration_mappers.ts +248 -0
  440. package/src/metadata/model_configuration.ts +68 -0
  441. package/src/metadata/optional_native_modules.ts +157 -3
  442. package/src/metadata/use_smile_id_metadata.ts +140 -17
  443. package/src/metadata/use_smile_id_metadata_factory.ts +211 -16
  444. package/src/presentation/assets/si_document_green_book_hero_animation.json +1 -4668
  445. package/src/presentation/assets/si_document_hero_animation.json +1 -4799
  446. package/src/presentation/assets/si_document_hero_back_animation.json +1 -2039
  447. package/src/presentation/assets/si_document_passport_hero_animation.json +1 -14491
  448. package/src/presentation/assets/si_ess_all_directions_hero_animation.json +1 -0
  449. package/src/presentation/assets/si_ess_animation_all_directions.json +1 -5575
  450. package/src/presentation/assets/si_selfie_hero_animation.json +1 -1439
  451. package/src/presentation/assets/si_smile_to_capture_animation.json +1 -1439
  452. package/src/presentation/assets/svg/document_shimmer_strings.ts +17 -0
  453. package/src/presentation/assets/svg/instruction_svg_strings.ts +34 -12
  454. package/src/presentation/components/__tests__/enhanced_smart_selfie_animation_frames.test.ts +1 -3
  455. package/src/presentation/components/__tests__/use_smile_id_enhanced_smart_selfie_clip.test.tsx +12 -8
  456. package/src/presentation/components/__tests__/use_smile_id_guideline_thumbnail.test.tsx +34 -1
  457. package/src/presentation/components/__tests__/use_smile_id_instructions_hero.test.tsx +71 -0
  458. package/src/presentation/components/__tests__/use_smile_id_oval_border_palette.test.ts +7 -5
  459. package/src/presentation/components/helpers/enhanced_smart_selfie_animation_frames.ts +0 -6
  460. package/src/presentation/components/icons/index.tsx +65 -18
  461. package/src/presentation/components/use_smile_id_attribution.tsx +1 -1
  462. package/src/presentation/components/use_smile_id_button.tsx +4 -4
  463. package/src/presentation/components/use_smile_id_capture_content.tsx +36 -12
  464. package/src/presentation/components/use_smile_id_captured_document_image.tsx +3 -8
  465. package/src/presentation/components/use_smile_id_document_capture_controls.tsx +103 -39
  466. package/src/presentation/components/use_smile_id_document_overlay.tsx +134 -44
  467. package/src/presentation/components/use_smile_id_document_shimmer.tsx +51 -0
  468. package/src/presentation/components/use_smile_id_enhanced_smart_selfie_clip.tsx +9 -6
  469. package/src/presentation/components/use_smile_id_guideline_thumbnail.tsx +131 -2
  470. package/src/presentation/components/use_smile_id_instructions_hero.tsx +111 -60
  471. package/src/presentation/components/use_smile_id_oval_border_palette.ts +7 -3
  472. package/src/presentation/flow/__tests__/document_flow_navigation.test.ts +203 -4
  473. package/src/presentation/flow/__tests__/flow_navigation_manager.test.ts +49 -0
  474. package/src/presentation/flow/dsl/builder/__tests__/config_builder.test.ts +25 -0
  475. package/src/presentation/flow/dsl/builder/config_builder.ts +35 -0
  476. package/src/presentation/flow/dsl/builder/ml_builder.ts +13 -4
  477. package/src/presentation/flow/dsl/builder/screens_builder.ts +110 -12
  478. package/src/presentation/flow/dsl/builder/theme_builder.ts +19 -2
  479. package/src/presentation/flow/dsl/use_smile_id_builder.tsx +6 -4
  480. package/src/presentation/flow/dsl/use_smile_id_flow_builder.ts +62 -36
  481. package/src/presentation/flow/flow_navigation_manager.ts +185 -14
  482. package/src/presentation/flow/model/instruction_guideline.ts +6 -0
  483. package/src/presentation/flow/model/instructions_defaults.ts +104 -26
  484. package/src/presentation/flow/screen/orchestrated_capture_screen.tsx +60 -12
  485. package/src/presentation/flow/screen/orchestrated_consent_screen.tsx +5 -0
  486. package/src/presentation/flow/screen/orchestrated_instructions_screen.tsx +1 -0
  487. package/src/presentation/flow/screen/orchestrated_preview_screen.tsx +4 -14
  488. package/src/presentation/flow/screen/orchestrated_processing_screen.tsx +3 -3
  489. package/src/presentation/flow/use_smile_id_flow.tsx +11 -4
  490. package/src/presentation/flow/validation/__tests__/flow_validator.test.ts +61 -1
  491. package/src/presentation/flow/validation/__tests__/job_type_validator.test.ts +64 -0
  492. package/src/presentation/flow/validation/flow_validator.ts +55 -26
  493. package/src/presentation/flow/validation/job_type_validator.ts +24 -0
  494. package/src/presentation/screen/__tests__/capture_ui_state.test.ts +66 -47
  495. package/src/presentation/screen/__tests__/ess_turn_haptics.test.ts +15 -11
  496. package/src/presentation/screen/__tests__/instructions_screen_helpers.test.ts +15 -3
  497. package/src/presentation/screen/__tests__/scan_state_to_overlay_state.test.ts +47 -27
  498. package/src/presentation/screen/__tests__/use_smile_id_capture_screen.test.tsx +182 -18
  499. package/src/presentation/screen/__tests__/use_smile_id_document_back_instructions.test.tsx +1 -1
  500. package/src/presentation/screen/__tests__/use_smile_id_preview_screen.test.tsx +10 -40
  501. package/src/presentation/screen/helpers/__tests__/use_capture_orientation_lock.test.tsx +212 -0
  502. package/src/presentation/screen/helpers/capture_screen_helpers.ts +1 -0
  503. package/src/presentation/screen/helpers/capture_ui_state.ts +27 -27
  504. package/src/presentation/screen/helpers/ess_turn_haptics.ts +9 -9
  505. package/src/presentation/screen/helpers/instructions_screen_helpers.ts +7 -2
  506. package/src/presentation/screen/helpers/scan_state_to_overlay_state.ts +16 -13
  507. package/src/presentation/screen/helpers/use_capture_orientation_lock.ts +69 -7
  508. package/src/presentation/screen/use_smile_id_capture_screen.tsx +280 -54
  509. package/src/presentation/screen/use_smile_id_consent_screen.tsx +16 -5
  510. package/src/presentation/screen/use_smile_id_document_back_instructions.tsx +14 -23
  511. package/src/presentation/screen/use_smile_id_document_preview_screen.tsx +33 -23
  512. package/src/presentation/screen/use_smile_id_instructions_screen.tsx +4 -0
  513. package/src/presentation/screen/use_smile_id_preview_screen.tsx +21 -53
  514. package/src/presentation/screen/use_smile_id_processing_screen.tsx +8 -8
  515. package/src/presentation/theme/theme.ts +21 -19
  516. package/src/presentation/utils/__tests__/locale_utils.test.ts +46 -5
  517. package/src/presentation/utils/force_max_brightness.tsx +4 -4
  518. package/src/presentation/utils/locale_utils.ts +13 -4
  519. package/src/testing/__tests__/fake_face_analyzer.test.ts +42 -0
  520. package/src/testing/__tests__/scenario_expectations.test.ts +110 -0
  521. package/src/testing/__tests__/scenario_loader.test.ts +64 -0
  522. package/src/testing/fake_face_analyzer.ts +82 -0
  523. package/src/testing/index.ts +15 -0
  524. package/src/testing/scenario_expectations.ts +87 -0
  525. package/src/testing/scenario_loader.ts +83 -0
  526. package/src/testing/scripted_scan_results.ts +66 -0
  527. package/dist/camera/frame_processor_plugin.d.ts +0 -28
  528. package/dist/camera/frame_processor_plugin.d.ts.map +0 -1
  529. package/dist/camera/frame_processor_plugin.js +0 -21
  530. package/dist/camera/frame_processor_plugin.js.map +0 -1
  531. package/dist/camera/use_smile_id_frame_processor.d.ts +0 -38
  532. package/dist/camera/use_smile_id_frame_processor.d.ts.map +0 -1
  533. package/dist/camera/use_smile_id_frame_processor.js +0 -2
  534. package/dist/camera/use_smile_id_frame_processor.js.map +0 -1
  535. package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts +0 -17
  536. package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts.map +0 -1
  537. package/dist/presentation/components/use_smile_id_document_frame_glyph.js +0 -17
  538. package/dist/presentation/components/use_smile_id_document_frame_glyph.js.map +0 -1
  539. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts +0 -24
  540. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts.map +0 -1
  541. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js +0 -91
  542. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js.map +0 -1
  543. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.d.ts +0 -15
  544. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.d.ts.map +0 -1
  545. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.js +0 -19
  546. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.js.map +0 -1
  547. package/dist/presentation/components/use_smile_id_instruction_card.d.ts +0 -31
  548. package/dist/presentation/components/use_smile_id_instruction_card.d.ts.map +0 -1
  549. package/dist/presentation/components/use_smile_id_instruction_card.js +0 -43
  550. package/dist/presentation/components/use_smile_id_instruction_card.js.map +0 -1
  551. package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts +0 -24
  552. package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts.map +0 -1
  553. package/dist/presentation/screen/helpers/use_document_orientation_lock.js +0 -47
  554. package/dist/presentation/screen/helpers/use_document_orientation_lock.js.map +0 -1
  555. package/src/presentation/components/use_smile_id_document_frame_glyph.tsx +0 -162
  556. package/src/presentation/components/use_smile_id_face_silhouette_overlay.tsx +0 -27
@@ -20,6 +20,14 @@ declare function atob(data: string): string;
20
20
  */
21
21
  export type DecodedToken = {
22
22
  readonly sdkConfig?: SdkConfig;
23
+ /**
24
+ * Canonical `partner_id` from the top-level JWT claim (server-padded form,
25
+ * e.g. `"002"`), which can differ from the partner-supplied config string
26
+ * (`"2"`). The Smile EXIF tagger keys its HMAC/AES derivation on this so the
27
+ * stamped value matches the partner_id the backend validates against.
28
+ * `undefined` when the claim is absent.
29
+ */
30
+ readonly partnerId?: string;
23
31
  };
24
32
 
25
33
  /**
@@ -40,6 +48,73 @@ export type DecodedToken = {
40
48
  * This function never throws — all failure paths return a value.
41
49
  */
42
50
  export function decodeSmileIDToken(token: string): DecodedToken | undefined {
51
+ const payloadObject = parseJwtPayloadObject(token);
52
+ if (payloadObject === undefined) return undefined;
53
+
54
+ // Canonical partner_id — a TOP-LEVEL claim (server-padded form, e.g. "002"), a sibling of
55
+ // `sdk_config`. The EXIF tagger keys on this so the stamped value matches the backend. Spread
56
+ // in only when present so `exactOptionalPropertyTypes` isn't violated by an explicit undefined.
57
+ const rawPartnerId = payloadObject["partner_id"];
58
+ const partnerIdField =
59
+ typeof rawPartnerId === "string" ? { partnerId: rawPartnerId } : {};
60
+
61
+ const rawClaim = payloadObject["sdk_config"];
62
+
63
+ if (rawClaim === undefined || rawClaim === null) {
64
+ // No claim present — defaults apply throughout the flow.
65
+ return { ...partnerIdField };
66
+ }
67
+
68
+ if (typeof rawClaim !== "object" || Array.isArray(rawClaim)) {
69
+ // Claim exists but is not an object — treat as absent.
70
+ return { ...partnerIdField };
71
+ }
72
+
73
+ const parseResult = sdkConfigSchema.safeParse(rawClaim);
74
+ if (!parseResult.success) {
75
+ // Zod rejected the claim shape — degrade to defaults.
76
+ if (!(parseResult.error instanceof ZodError)) {
77
+ // Unreachable in practice (safeParse always gives ZodError on
78
+ // failure), but degrade gracefully to preserve the never-throws
79
+ // contract rather than surfacing an unexpected error type.
80
+ return { ...partnerIdField };
81
+ }
82
+ return { ...partnerIdField };
83
+ }
84
+
85
+ return { sdkConfig: parseResult.data, ...partnerIdField };
86
+ }
87
+
88
+ /**
89
+ * Extract the server-driven security policy bit-code from the token's **top-level** `policy` claim
90
+ * (a sibling of `sdk_config`, not nested inside it — mirroring the backend and the v11
91
+ * `/v1/auth_smile` response).
92
+ *
93
+ * Internal-only: deliberately NOT re-exported from the package entrypoint (`src/index.ts`), so the
94
+ * policy never widens the partner-facing API. It rides here — alongside the decoder — rather than
95
+ * on the exported {@link DecodedToken} for the same reason. See `SecurityPolicy` and
96
+ * `docs/Policy.md`.
97
+ *
98
+ * Returns `undefined` when the token is unparseable or carries no numeric top-level `policy`. The
99
+ * caller treats `undefined` as fail-secure (every behaviour active), so this never throws.
100
+ */
101
+ export function decodeSecurityPolicyBitCode(token: string): number | undefined {
102
+ const payloadObject = parseJwtPayloadObject(token);
103
+ if (payloadObject === undefined) return undefined;
104
+
105
+ const policy = payloadObject["policy"];
106
+ return typeof policy === "number" ? policy : undefined;
107
+ }
108
+
109
+ /**
110
+ * Parse the JWT payload (middle segment) into a JSON object, or `undefined` when the token is
111
+ * structurally invalid (not exactly three `.`-delimited segments, non-base64url payload, or a
112
+ * non-object JSON payload). Shared by {@link decodeSmileIDToken} and
113
+ * {@link decodeSecurityPolicyBitCode} so both read the payload the same way.
114
+ */
115
+ function parseJwtPayloadObject(
116
+ token: string,
117
+ ): Record<string, unknown> | undefined {
43
118
  const segments = token.split(".");
44
119
  if (segments.length !== 3) return undefined;
45
120
 
@@ -74,34 +149,7 @@ export function decodeSmileIDToken(token: string): DecodedToken | undefined {
74
149
  return undefined;
75
150
  }
76
151
 
77
- // Valid structural token from here on — failures below degrade to an
78
- // empty DecodedToken (sdkConfig unset) rather than returning undefined.
79
- const payloadObject = payload as Record<string, unknown>;
80
- const rawClaim = payloadObject["sdk_config"];
81
-
82
- if (rawClaim === undefined || rawClaim === null) {
83
- // No claim present — defaults apply throughout the flow.
84
- return {};
85
- }
86
-
87
- if (typeof rawClaim !== "object" || Array.isArray(rawClaim)) {
88
- // Claim exists but is not an object — treat as absent.
89
- return {};
90
- }
91
-
92
- const parseResult = sdkConfigSchema.safeParse(rawClaim);
93
- if (!parseResult.success) {
94
- // Zod rejected the claim shape — degrade to defaults.
95
- if (!(parseResult.error instanceof ZodError)) {
96
- // Unreachable in practice (safeParse always gives ZodError on
97
- // failure), but degrade gracefully to preserve the never-throws
98
- // contract rather than surfacing an unexpected error type.
99
- return {};
100
- }
101
- return {};
102
- }
103
-
104
- return { sdkConfig: parseResult.data };
152
+ return payload as Record<string, unknown>;
105
153
  }
106
154
 
107
155
  /**
package/src/index.ts CHANGED
@@ -27,6 +27,7 @@ export {
27
27
  // subclass holds a stable `errorCode` and `severity` so partner
28
28
  // tooling can pivot on either without parsing the message text.
29
29
  export {
30
+ AgentModeWithEnhancedLivenessException,
30
31
  BuilderValidationException,
31
32
  ConsentDeniedException,
32
33
  DuplicateScreenTypeException,
@@ -225,6 +226,11 @@ export {
225
226
  type UseSmileIDResult,
226
227
  } from "./core/models/result";
227
228
  export type { ConfigOptions } from "./core/models/config";
229
+ export {
230
+ GlobalPrivacyControl,
231
+ GLOBAL_PRIVACY_CONTROL_WIRE_KEY,
232
+ globalPrivacyControlFromWire,
233
+ } from "./core/models/global_privacy_control";
228
234
  export { LogLevel } from "./core/models/network_config";
229
235
  export type {
230
236
  CacheConfig,
@@ -374,10 +380,6 @@ export {
374
380
  UseSmileIDDocumentOverlay,
375
381
  type UseSmileIDDocumentOverlayProps,
376
382
  } from "./presentation/components/use_smile_id_document_overlay";
377
- export {
378
- UseSmileIDFaceSilhouetteOverlay,
379
- type UseSmileIDFaceSilhouetteOverlayProps,
380
- } from "./presentation/components/use_smile_id_face_silhouette_overlay";
381
383
  export {
382
384
  UseSmileIDInstructionsHero,
383
385
  type UseSmileIDInstructionsHeroProps,
@@ -160,6 +160,7 @@ export const enStrings = {
160
160
  si_ess_look_left: "Turn your head to the left",
161
161
  si_ess_look_right: "Turn your head to the right",
162
162
  si_ess_look_up: "Turn your head slightly upwards",
163
+ si_ess_look_at_camera: "Look at the camera",
163
164
  si_ess_capture_initial_instruction:
164
165
  "Centre your face in the frame and turn your head in the direction of the arrow.",
165
166
  si_ess_hold_still: "Hold still…",
@@ -168,4 +169,4 @@ export const enStrings = {
168
169
  export type SiKey = keyof typeof enStrings;
169
170
 
170
171
  /** Total canonical key count — pinned in tests to catch a missed addition/deletion at PR time. */
171
- export const CANONICAL_KEY_COUNT = 118 as const;
172
+ export const CANONICAL_KEY_COUNT = 119 as const;
@@ -676,6 +676,9 @@ export class UseSmileIDLocalizations {
676
676
  get siEssLookUp(): string {
677
677
  return this._s("si_ess_look_up", enStrings.si_ess_look_up);
678
678
  }
679
+ get siEssLookAtCamera(): string {
680
+ return this._s("si_ess_look_at_camera", enStrings.si_ess_look_at_camera);
681
+ }
679
682
  get siEssCaptureInitialInstruction(): string {
680
683
  return this._s(
681
684
  "si_ess_capture_initial_instruction",
@@ -0,0 +1,15 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { DeviceOrientationCollector } from "../device_orientation_collector";
4
+
5
+ /**
6
+ * Regression guard: with no accelerometer samples, `device_movement_detected` must be absent
7
+ * (`null`) and `device_positions` empty — never a sentinel. Mirrored across all four SDKs.
8
+ */
9
+ describe("DeviceOrientationCollector", () => {
10
+ it("omits movement (null) and positions when no samples were collected", () => {
11
+ const collector = new DeviceOrientationCollector();
12
+ expect(collector.deviceMovementDetected).toBeNull();
13
+ expect(collector.devicePositions).toHaveLength(0);
14
+ });
15
+ });
@@ -0,0 +1,254 @@
1
+ import {
2
+ AnalyzerFactoryKey,
3
+ faceConfigSchema,
4
+ } from "@smileid/usesmileid_bridge";
5
+ import { describe, expect, it } from "vitest";
6
+
7
+ import { DocumentCaptureMode } from "../../core/models/document_capture_mode";
8
+ import { CaptureType } from "../../core/models/ml_config";
9
+ import type { FlowConfiguration } from "../../presentation/flow/config/flow_configuration";
10
+ import { ScreensBuilder } from "../../presentation/flow/dsl/builder/screens_builder";
11
+ import {
12
+ ModelProvider,
13
+ MODEL_DESCRIPTOR_UNKNOWN,
14
+ } from "../model_configuration";
15
+ import { GlobalPrivacyControl } from "../../core/models/global_privacy_control";
16
+ import {
17
+ flowConfigurationToBuilderConfiguration,
18
+ flowConfigurationToModelConfiguration,
19
+ flowConfigurationToSelfieLivenessTelemetry,
20
+ } from "../metadata_configuration_mappers";
21
+
22
+ function flow(
23
+ buildScreens: (screens: ScreensBuilder) => void,
24
+ ml?: FlowConfiguration["ml"],
25
+ ): FlowConfiguration {
26
+ const screensBuilder = new ScreensBuilder();
27
+ buildScreens(screensBuilder);
28
+ return {
29
+ screens: screensBuilder.build(),
30
+ ...(ml ? { ml } : {}),
31
+ onResult: () => {},
32
+ };
33
+ }
34
+
35
+ describe("flowConfigurationToBuilderConfiguration", () => {
36
+ it("reflects the consent screen", () => {
37
+ const config = flowConfigurationToBuilderConfiguration(
38
+ flow((screens) => {
39
+ screens.consent((consent) => {
40
+ consent.partnerIcon = "icon";
41
+ consent.showAttribution = false;
42
+ });
43
+ }),
44
+ );
45
+ expect(config.consentScreenUsed).toBe(true);
46
+ expect(config.consentIconProvided).toBe(true);
47
+ // A React Native consent icon is a ReactNode with no measurable pixel size.
48
+ expect(config.consentIconDimensions).toBeNull();
49
+ expect(config.consentAttributionShown).toBe(false);
50
+ });
51
+
52
+ it("reports consent absent when there is no consent screen", () => {
53
+ const config = flowConfigurationToBuilderConfiguration(
54
+ flow((screens) => screens.instructions()),
55
+ );
56
+ expect(config.consentScreenUsed).toBe(false);
57
+ expect(config.consentIconProvided).toBe(false);
58
+ });
59
+
60
+ it("maps selfie capture flags", () => {
61
+ const config = flowConfigurationToBuilderConfiguration(
62
+ flow((screens) => {
63
+ screens.capture((capture) => {
64
+ capture.captureType = CaptureType.selfie;
65
+ capture.selfie((selfie) => {
66
+ selfie.allowAgentMode = true;
67
+ selfie.enableEnhancedLiveness = true;
68
+ });
69
+ });
70
+ screens.preview();
71
+ }),
72
+ );
73
+ expect(config.allowAgentMode).toBe(true);
74
+ expect(config.enhancedLivenessEnabled).toBe(true);
75
+ expect(config.selfiePreviewEnabled).toBe(true);
76
+ expect(config.documentPreviewEnabled).toBe(false);
77
+ });
78
+
79
+ it("maps document capture flags and capture mode", () => {
80
+ const config = flowConfigurationToBuilderConfiguration(
81
+ flow((screens) => {
82
+ screens.capture((capture) => {
83
+ capture.captureType = CaptureType.document;
84
+ capture.document((document) => {
85
+ document.captureMode = DocumentCaptureMode.ManualCapture;
86
+ document.allowGalleryUpload = true;
87
+ document.captureBothSides = false;
88
+ document.allowSkipBack = true;
89
+ });
90
+ });
91
+ screens.preview();
92
+ }),
93
+ );
94
+ expect(config.autoCaptureEnabled).toBe("manual");
95
+ expect(config.allowGalleryUpload).toBe(true);
96
+ expect(config.captureBothSides).toBe(false);
97
+ expect(config.allowSkipBack).toBe(true);
98
+ expect(config.documentPreviewEnabled).toBe(true);
99
+ expect(config.selfiePreviewEnabled).toBe(false);
100
+ });
101
+
102
+ it("maps each document capture mode to the wire enum", () => {
103
+ const modeFor = (captureMode: DocumentCaptureMode): string =>
104
+ flowConfigurationToBuilderConfiguration(
105
+ flow((screens) => {
106
+ screens.capture((capture) => {
107
+ capture.captureType = CaptureType.document;
108
+ capture.document((document) => {
109
+ document.captureMode = captureMode;
110
+ });
111
+ });
112
+ }),
113
+ ).autoCaptureEnabled;
114
+
115
+ expect(modeFor(DocumentCaptureMode.AutoCapture)).toBe("auto_capture_only");
116
+ expect(modeFor(DocumentCaptureMode.ManualCapture)).toBe("manual");
117
+ expect(modeFor(DocumentCaptureMode.AutoCaptureWithManualFallback())).toBe(
118
+ "autocapture_default",
119
+ );
120
+ });
121
+
122
+ it("reports submission skipped without a processing screen", () => {
123
+ const selfieOnly = (screens: ScreensBuilder) =>
124
+ screens.capture((capture) => {
125
+ capture.captureType = CaptureType.selfie;
126
+ });
127
+ expect(
128
+ flowConfigurationToBuilderConfiguration(flow(selfieOnly))
129
+ .submissionSkipped,
130
+ ).toBe(true);
131
+ expect(
132
+ flowConfigurationToBuilderConfiguration(
133
+ flow((screens) => {
134
+ selfieOnly(screens);
135
+ screens.processing();
136
+ }),
137
+ ).submissionSkipped,
138
+ ).toBe(false);
139
+ });
140
+ });
141
+
142
+ describe("flowConfigurationToModelConfiguration", () => {
143
+ it("maps the face backend key with the noop document fallback", () => {
144
+ const config = flow(
145
+ (screens) =>
146
+ screens.capture((capture) => {
147
+ capture.captureType = CaptureType.selfie;
148
+ }),
149
+ {
150
+ analyzers: {
151
+ selfieConfig: faceConfigSchema.parse({
152
+ analyzerFactoryKey: AnalyzerFactoryKey.MLKitFace,
153
+ }),
154
+ },
155
+ },
156
+ );
157
+ const model = flowConfigurationToModelConfiguration(config);
158
+ expect(model.faceModel.provider).toBe(ModelProvider.Google);
159
+ expect(model.faceModel.name).toBe("play-services-mlkit-face-detection");
160
+ expect(model.documentModel.provider).toBe(ModelProvider.Smile);
161
+ });
162
+
163
+ it("falls back to unknown for an ML-free flow", () => {
164
+ const model = flowConfigurationToModelConfiguration(
165
+ flow((screens) =>
166
+ screens.capture((capture) => {
167
+ capture.captureType = CaptureType.selfie;
168
+ }),
169
+ ),
170
+ );
171
+ expect(model.faceModel).toEqual(MODEL_DESCRIPTOR_UNKNOWN);
172
+ expect(model.documentModel.provider).toBe(ModelProvider.Smile);
173
+ });
174
+ });
175
+
176
+ describe("flowConfigurationToSelfieLivenessTelemetry", () => {
177
+ it("reports smile for a standard selfie flow", () => {
178
+ const telemetry = flowConfigurationToSelfieLivenessTelemetry(
179
+ flow((screens) =>
180
+ screens.capture((capture) => {
181
+ capture.captureType = CaptureType.selfie;
182
+ capture.selfie(() => {});
183
+ }),
184
+ ),
185
+ );
186
+ expect(telemetry.activeLivenessType).toBe("smile");
187
+ expect(telemetry.activeLivenessVersion).toBe("2.0.0");
188
+ expect(telemetry.selfieImageOrigin).toBe("front_camera");
189
+ });
190
+
191
+ it("reports head_pose when enhanced liveness is on", () => {
192
+ const telemetry = flowConfigurationToSelfieLivenessTelemetry(
193
+ flow((screens) =>
194
+ screens.capture((capture) => {
195
+ capture.captureType = CaptureType.selfie;
196
+ capture.selfie((selfie) => {
197
+ selfie.enableEnhancedLiveness = true;
198
+ });
199
+ }),
200
+ ),
201
+ );
202
+ expect(telemetry.activeLivenessType).toBe("head_pose");
203
+ });
204
+
205
+ it("reports back_camera in agent mode", () => {
206
+ const telemetry = flowConfigurationToSelfieLivenessTelemetry(
207
+ flow((screens) =>
208
+ screens.capture((capture) => {
209
+ capture.captureType = CaptureType.selfie;
210
+ capture.selfie((selfie) => {
211
+ selfie.allowAgentMode = true;
212
+ });
213
+ }),
214
+ ),
215
+ );
216
+ expect(telemetry.selfieImageOrigin).toBe("back_camera");
217
+ expect(telemetry.activeLivenessType).toBe("smile");
218
+ });
219
+
220
+ it("is all-null for a document-only flow", () => {
221
+ const telemetry = flowConfigurationToSelfieLivenessTelemetry(
222
+ flow((screens) =>
223
+ screens.capture((capture) => {
224
+ capture.captureType = CaptureType.document;
225
+ }),
226
+ ),
227
+ );
228
+ expect(telemetry.activeLivenessType).toBeNull();
229
+ expect(telemetry.selfieImageOrigin).toBeNull();
230
+ });
231
+
232
+ it("global privacy control lands in the configuration metadata", () => {
233
+ // Default posture: a snapshot without a config block reports the
234
+ // opt-out baseline.
235
+ expect(
236
+ flowConfigurationToBuilderConfiguration(flow(() => {}))
237
+ .globalPrivacyControl,
238
+ ).toBe("opt-out");
239
+
240
+ // Explicit legacy posture flows through the config snapshot.
241
+ const optIn: FlowConfiguration = {
242
+ ...flow(() => {}),
243
+ config: {
244
+ enableCrashReporting: true,
245
+ enableDebugMode: false,
246
+ allowOfflineMode: false,
247
+ globalPrivacyControl: GlobalPrivacyControl.OptIn,
248
+ },
249
+ };
250
+ expect(
251
+ flowConfigurationToBuilderConfiguration(optIn).globalPrivacyControl,
252
+ ).toBe("opt-in");
253
+ });
254
+ });
@@ -0,0 +1,86 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import {
4
+ type BuilderConfiguration,
5
+ builderConfigurationToJson,
6
+ } from "../builder_configuration";
7
+ import {
8
+ type ModelConfiguration,
9
+ ModelProvider,
10
+ modelConfigurationToJson,
11
+ } from "../model_configuration";
12
+
13
+ const builderConfiguration: BuilderConfiguration = {
14
+ consentScreenUsed: true,
15
+ consentIconProvided: true,
16
+ consentIconDimensions: { width: 120, height: 80 },
17
+ consentAttributionShown: true,
18
+ instructionsScreenUsed: true,
19
+ selfiePreviewEnabled: true,
20
+ documentPreviewEnabled: false,
21
+ submissionSkipped: false,
22
+ allowAgentMode: true,
23
+ enhancedLivenessEnabled: false,
24
+ autoCaptureEnabled: "autocapture_default",
25
+ allowGalleryUpload: true,
26
+ captureBothSides: true,
27
+ allowSkipBack: false,
28
+ globalPrivacyControl: "opt-out",
29
+ };
30
+
31
+ const modelConfiguration: ModelConfiguration = {
32
+ faceModel: {
33
+ provider: ModelProvider.Google,
34
+ name: "play-services-mlkit-face-detection",
35
+ version: "17.1.0",
36
+ bundled: false,
37
+ },
38
+ documentModel: {
39
+ provider: ModelProvider.Smile,
40
+ name: "noop_document_detector",
41
+ version: "12.0.1",
42
+ bundled: true,
43
+ },
44
+ };
45
+
46
+ describe("builder_configuration_object", () => {
47
+ it("serialises the full schema with snake_case keys", () => {
48
+ const json = builderConfigurationToJson(builderConfiguration);
49
+ expect(json.consent_screen_used).toBe(true);
50
+ expect(json.consent_icon_provided).toBe(true);
51
+ expect(json.consent_icon_dimensions).toEqual({ width: 120, height: 80 });
52
+ expect(json.auto_capture_enabled).toBe("autocapture_default");
53
+ expect(json.allow_gallery_upload).toBe(true);
54
+ });
55
+
56
+ it("emits consent_icon_dimensions as null when absent", () => {
57
+ const json = builderConfigurationToJson({
58
+ ...builderConfiguration,
59
+ consentIconProvided: false,
60
+ consentIconDimensions: null,
61
+ });
62
+ expect(json.consent_icon_dimensions).toBeNull();
63
+ // round-trips through JSON.stringify as an explicit null, not an omitted key
64
+ const reparsed = JSON.parse(JSON.stringify(json)) as Record<
65
+ string,
66
+ unknown
67
+ >;
68
+ expect("consent_icon_dimensions" in reparsed).toBe(true);
69
+ expect(reparsed.consent_icon_dimensions).toBeNull();
70
+ });
71
+ });
72
+
73
+ describe("model_configuration_object", () => {
74
+ it("serialises both model descriptors", () => {
75
+ const json = modelConfigurationToJson(modelConfiguration);
76
+ const face = json.face_model as Record<string, unknown>;
77
+ expect(face.provider).toBe("google");
78
+ expect(face.name).toBe("play-services-mlkit-face-detection");
79
+ expect(face.version).toBe("17.1.0");
80
+ expect(face.bundled).toBe(false);
81
+
82
+ const document = json.document_model as Record<string, unknown>;
83
+ expect(document.provider).toBe("smile");
84
+ expect(document.bundled).toBe(true);
85
+ });
86
+ });
@@ -0,0 +1,147 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import {
4
+ UseSmileIDMetadata,
5
+ type UseSmileIDMetadataFields,
6
+ } from "../use_smile_id_metadata";
7
+
8
+ function fields(
9
+ overrides: Partial<UseSmileIDMetadataFields> = {},
10
+ ): UseSmileIDMetadataFields {
11
+ return {
12
+ sdkVersion: "12.0.1",
13
+ sdk: "react-native-expo",
14
+ deviceOs: "Android 14",
15
+ deviceModel: "",
16
+ appName: "TestApp",
17
+ sessionId: "session",
18
+ clientIp: "",
19
+ networkConnection: "",
20
+ carrierInfo: "",
21
+ proxy: false,
22
+ timezone: "",
23
+ locale: "",
24
+ screenResolution: "",
25
+ memoryInfoMb: 0,
26
+ deviceOrientation: "",
27
+ systemArchitecture: "",
28
+ numberOfCameras: 0,
29
+ hostApplication: "",
30
+ proximitySensor: false,
31
+ securityPolicyVersion: "",
32
+ sdkConfigSource: "default",
33
+ imageWidth: 0,
34
+ imageHeight: 0,
35
+ livenessImageWidth: 0,
36
+ livenessImageHeight: 0,
37
+ ...overrides,
38
+ };
39
+ }
40
+
41
+ function value(name: string, fieldsValue: UseSmileIDMetadataFields) {
42
+ return new UseSmileIDMetadata(fieldsValue)
43
+ .toEntries()
44
+ .find((entry) => entry.name === name)?.value;
45
+ }
46
+
47
+ describe("device-context keys (62-key parity)", () => {
48
+ it("omits the new keys at their defaults", () => {
49
+ const names = new UseSmileIDMetadata(fields())
50
+ .toEntries()
51
+ .map((entry) => entry.name);
52
+ for (const key of [
53
+ "build_brand",
54
+ "build_device",
55
+ "build_fingerprint",
56
+ "build_product",
57
+ "local_time_of_enrolment",
58
+ "battery_status",
59
+ ]) {
60
+ expect(names).not.toContain(key);
61
+ }
62
+ });
63
+
64
+ it("emits build + carrier + local time when present", () => {
65
+ const populated = fields({
66
+ buildBrand: "google",
67
+ buildDevice: "husky",
68
+ buildFingerprint: "google/husky:14",
69
+ buildProduct: "husky",
70
+ carrierInfo: "MTN",
71
+ localTimeOfEnrolment: "2026-06-24T10:00:00.000+03:00",
72
+ });
73
+ expect(value("build_brand", populated)).toBe("google");
74
+ expect(value("build_device", populated)).toBe("husky");
75
+ expect(value("build_fingerprint", populated)).toBe("google/husky:14");
76
+ expect(value("build_product", populated)).toBe("husky");
77
+ expect(value("carrier_info", populated)).toBe("MTN");
78
+ expect(value("local_time_of_enrolment", populated)).toBe(
79
+ "2026-06-24T10:00:00.000+03:00",
80
+ );
81
+ });
82
+
83
+ it("emits battery_status including the meaningful on-battery value", () => {
84
+ expect(value("battery_status", fields({ batteryStatus: 0 }))).toBe("0");
85
+ expect(value("battery_status", fields({ batteryStatus: 1 }))).toBe("1");
86
+ expect(value("battery_status", fields({ batteryStatus: -1 }))).toBe("-1");
87
+ });
88
+
89
+ it("emits wrapper identity when present and omits it when blank", () => {
90
+ const populated = fields({
91
+ wrapperName: "react_native_expo",
92
+ wrapperVersion: "12.0.1",
93
+ });
94
+ expect(value("wrapper_name", populated)).toBe("react_native_expo");
95
+ expect(value("wrapper_version", populated)).toBe("12.0.1");
96
+
97
+ const names = new UseSmileIDMetadata(fields())
98
+ .toEntries()
99
+ .map((entry) => entry.name);
100
+ expect(names).not.toContain("wrapper_name");
101
+ });
102
+
103
+ it("emits sdk_launch_count when positive and omits it when zero/undefined", () => {
104
+ expect(value("sdk_launch_count", fields({ sdkLaunchCount: 9 }))).toBe("9");
105
+ const zero = new UseSmileIDMetadata(fields({ sdkLaunchCount: 0 }))
106
+ .toEntries()
107
+ .map((entry) => entry.name);
108
+ expect(zero).not.toContain("sdk_launch_count");
109
+ const absent = new UseSmileIDMetadata(fields())
110
+ .toEntries()
111
+ .map((entry) => entry.name);
112
+ expect(absent).not.toContain("sdk_launch_count");
113
+ });
114
+
115
+ it("emits privileges verbatim and omits it when absent", () => {
116
+ const raw = '{"1":"100010","8":"100100"}';
117
+ expect(value("privileges", fields({ privileges: raw }))).toBe(raw);
118
+ const absent = new UseSmileIDMetadata(fields())
119
+ .toEntries()
120
+ .map((entry) => entry.name);
121
+ expect(absent).not.toContain("privileges");
122
+ });
123
+
124
+ it("emits geolocation as a JSON-object string and omits it when absent", () => {
125
+ const raw = value(
126
+ "geolocation",
127
+ fields({
128
+ geolocation: {
129
+ latitude: 1.5,
130
+ longitude: -2.5,
131
+ accuracy: "precise",
132
+ source: "gps",
133
+ },
134
+ }),
135
+ );
136
+ expect(JSON.parse(raw!)).toEqual({
137
+ latitude: 1.5,
138
+ longitude: -2.5,
139
+ accuracy: "precise",
140
+ source: "gps",
141
+ });
142
+ const absent = new UseSmileIDMetadata(fields())
143
+ .toEntries()
144
+ .map((entry) => entry.name);
145
+ expect(absent).not.toContain("geolocation");
146
+ });
147
+ });