@smileid/usesmileid 12.0.0-beta01 → 12.0.0

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 (403) hide show
  1. package/CHANGELOG.md +11 -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/models/document_capture_mode.d.ts +8 -0
  12. package/dist/core/models/document_capture_mode.d.ts.map +1 -1
  13. package/dist/core/models/document_capture_mode.js +24 -0
  14. package/dist/core/models/document_capture_mode.js.map +1 -1
  15. package/dist/core/models/document_type.d.ts +2 -2
  16. package/dist/core/models/document_type.d.ts.map +1 -1
  17. package/dist/core/models/document_type.js +6 -4
  18. package/dist/core/models/document_type.js.map +1 -1
  19. package/dist/core/models/result.d.ts +9 -8
  20. package/dist/core/models/result.d.ts.map +1 -1
  21. package/dist/core/models/result.js +5 -6
  22. package/dist/core/models/result.js.map +1 -1
  23. package/dist/data/api/interceptors/smile_auth_interceptor.js +1 -1
  24. package/dist/data/api/interceptors/smile_auth_interceptor.js.map +1 -1
  25. package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts +11 -0
  26. package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts.map +1 -1
  27. package/dist/data/api/interceptors/smile_integrity_interceptor.js +13 -0
  28. package/dist/data/api/interceptors/smile_integrity_interceptor.js.map +1 -1
  29. package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts +8 -0
  30. package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts.map +1 -1
  31. package/dist/data/api/interceptors/smile_request_mac_interceptor.js +11 -0
  32. package/dist/data/api/interceptors/smile_request_mac_interceptor.js.map +1 -1
  33. package/dist/data/compression/compressible_asset.d.ts +41 -0
  34. package/dist/data/compression/compressible_asset.d.ts.map +1 -0
  35. package/dist/data/compression/compressible_asset.js +34 -0
  36. package/dist/data/compression/compressible_asset.js.map +1 -0
  37. package/dist/data/compression/payload_compression_config.d.ts +36 -0
  38. package/dist/data/compression/payload_compression_config.d.ts.map +1 -0
  39. package/dist/data/compression/payload_compression_config.js +52 -0
  40. package/dist/data/compression/payload_compression_config.js.map +1 -0
  41. package/dist/data/compression/payload_compression_runner.d.ts +29 -0
  42. package/dist/data/compression/payload_compression_runner.d.ts.map +1 -0
  43. package/dist/data/compression/payload_compression_runner.js +55 -0
  44. package/dist/data/compression/payload_compression_runner.js.map +1 -0
  45. package/dist/data/compression/payload_compressor.d.ts +40 -0
  46. package/dist/data/compression/payload_compressor.d.ts.map +1 -0
  47. package/dist/data/compression/payload_compressor.js +126 -0
  48. package/dist/data/compression/payload_compressor.js.map +1 -0
  49. package/dist/data/compression/uri_compressible_asset.d.ts +23 -0
  50. package/dist/data/compression/uri_compressible_asset.d.ts.map +1 -0
  51. package/dist/data/compression/uri_compressible_asset.js +77 -0
  52. package/dist/data/compression/uri_compressible_asset.js.map +1 -0
  53. package/dist/data/dsl/builder/cache_config_builder.d.ts +2 -1
  54. package/dist/data/dsl/builder/cache_config_builder.d.ts.map +1 -1
  55. package/dist/data/dsl/builder/cache_config_builder.js +2 -1
  56. package/dist/data/dsl/builder/cache_config_builder.js.map +1 -1
  57. package/dist/data/dsl/builder/config_builder.d.ts +40 -14
  58. package/dist/data/dsl/builder/config_builder.d.ts.map +1 -1
  59. package/dist/data/dsl/builder/config_builder.js +40 -14
  60. package/dist/data/dsl/builder/config_builder.js.map +1 -1
  61. package/dist/data/dsl/builder/interceptor_config_builder.d.ts +9 -7
  62. package/dist/data/dsl/builder/interceptor_config_builder.d.ts.map +1 -1
  63. package/dist/data/dsl/builder/interceptor_config_builder.js +9 -7
  64. package/dist/data/dsl/builder/interceptor_config_builder.js.map +1 -1
  65. package/dist/data/dsl/builder/retry_config_builder.d.ts +16 -1
  66. package/dist/data/dsl/builder/retry_config_builder.d.ts.map +1 -1
  67. package/dist/data/dsl/builder/retry_config_builder.js +16 -1
  68. package/dist/data/dsl/builder/retry_config_builder.js.map +1 -1
  69. package/dist/data/dsl/builder/timeout_config_builder.d.ts +4 -0
  70. package/dist/data/dsl/builder/timeout_config_builder.d.ts.map +1 -1
  71. package/dist/data/dsl/builder/timeout_config_builder.js +4 -0
  72. package/dist/data/dsl/builder/timeout_config_builder.js.map +1 -1
  73. package/dist/data/dsl/use_smile_id_network_builder.d.ts +17 -0
  74. package/dist/data/dsl/use_smile_id_network_builder.d.ts.map +1 -1
  75. package/dist/data/dsl/use_smile_id_network_builder.js +17 -0
  76. package/dist/data/dsl/use_smile_id_network_builder.js.map +1 -1
  77. package/dist/data/factory/networking_factory.d.ts.map +1 -1
  78. package/dist/data/factory/networking_factory.js +11 -1
  79. package/dist/data/factory/networking_factory.js.map +1 -1
  80. package/dist/data/repository/use_smile_id_repository_impl.d.ts +6 -0
  81. package/dist/data/repository/use_smile_id_repository_impl.d.ts.map +1 -1
  82. package/dist/data/repository/use_smile_id_repository_impl.js +82 -8
  83. package/dist/data/repository/use_smile_id_repository_impl.js.map +1 -1
  84. package/dist/data/security/request_canonicalizer.d.ts.map +1 -1
  85. package/dist/data/security/request_canonicalizer.js +14 -2
  86. package/dist/data/security/request_canonicalizer.js.map +1 -1
  87. package/dist/data/security/security_policy.d.ts +43 -0
  88. package/dist/data/security/security_policy.d.ts.map +1 -0
  89. package/dist/data/security/security_policy.js +61 -0
  90. package/dist/data/security/security_policy.js.map +1 -0
  91. package/dist/data/util/retry_util.d.ts +1 -1
  92. package/dist/data/util/retry_util.d.ts.map +1 -1
  93. package/dist/data/util/retry_util.js +2 -1
  94. package/dist/data/util/retry_util.js.map +1 -1
  95. package/dist/data/util/use_smile_id_token_decoder.d.ts +22 -0
  96. package/dist/data/util/use_smile_id_token_decoder.d.ts.map +1 -1
  97. package/dist/data/util/use_smile_id_token_decoder.js +58 -24
  98. package/dist/data/util/use_smile_id_token_decoder.js.map +1 -1
  99. package/dist/l10n/strings_en.d.ts +2 -1
  100. package/dist/l10n/strings_en.d.ts.map +1 -1
  101. package/dist/l10n/strings_en.js +2 -1
  102. package/dist/l10n/strings_en.js.map +1 -1
  103. package/dist/l10n/use_smile_id_localizations.d.ts +1 -0
  104. package/dist/l10n/use_smile_id_localizations.d.ts.map +1 -1
  105. package/dist/l10n/use_smile_id_localizations.js +3 -0
  106. package/dist/l10n/use_smile_id_localizations.js.map +1 -1
  107. package/dist/metadata/builder_configuration.d.ts +39 -0
  108. package/dist/metadata/builder_configuration.d.ts.map +1 -0
  109. package/dist/metadata/builder_configuration.js +34 -0
  110. package/dist/metadata/builder_configuration.js.map +1 -0
  111. package/dist/metadata/captured_image_properties.d.ts +11 -0
  112. package/dist/metadata/captured_image_properties.d.ts.map +1 -0
  113. package/dist/metadata/captured_image_properties.js +11 -0
  114. package/dist/metadata/captured_image_properties.js.map +1 -0
  115. package/dist/metadata/device_orientation_collector.d.ts +17 -0
  116. package/dist/metadata/device_orientation_collector.d.ts.map +1 -0
  117. package/dist/metadata/device_orientation_collector.js +66 -0
  118. package/dist/metadata/device_orientation_collector.js.map +1 -0
  119. package/dist/metadata/geolocation.d.ts +20 -0
  120. package/dist/metadata/geolocation.d.ts.map +1 -0
  121. package/dist/metadata/geolocation.js +40 -0
  122. package/dist/metadata/geolocation.js.map +1 -0
  123. package/dist/metadata/metadata_configuration_mappers.d.ts +48 -0
  124. package/dist/metadata/metadata_configuration_mappers.d.ts.map +1 -0
  125. package/dist/metadata/metadata_configuration_mappers.js +171 -0
  126. package/dist/metadata/metadata_configuration_mappers.js.map +1 -0
  127. package/dist/metadata/model_configuration.d.ts +41 -0
  128. package/dist/metadata/model_configuration.d.ts.map +1 -0
  129. package/dist/metadata/model_configuration.js +44 -0
  130. package/dist/metadata/model_configuration.js.map +1 -0
  131. package/dist/metadata/optional_native_modules.d.ts +79 -3
  132. package/dist/metadata/optional_native_modules.d.ts.map +1 -1
  133. package/dist/metadata/optional_native_modules.js +108 -3
  134. package/dist/metadata/optional_native_modules.js.map +1 -1
  135. package/dist/metadata/use_smile_id_metadata.d.ts +45 -7
  136. package/dist/metadata/use_smile_id_metadata.d.ts.map +1 -1
  137. package/dist/metadata/use_smile_id_metadata.js +85 -13
  138. package/dist/metadata/use_smile_id_metadata.js.map +1 -1
  139. package/dist/metadata/use_smile_id_metadata_factory.d.ts +37 -0
  140. package/dist/metadata/use_smile_id_metadata_factory.d.ts.map +1 -1
  141. package/dist/metadata/use_smile_id_metadata_factory.js +184 -12
  142. package/dist/metadata/use_smile_id_metadata_factory.js.map +1 -1
  143. package/dist/presentation/assets/svg/document_shimmer_strings.d.ts +14 -0
  144. package/dist/presentation/assets/svg/document_shimmer_strings.d.ts.map +1 -0
  145. package/dist/presentation/assets/svg/document_shimmer_strings.js +14 -0
  146. package/dist/presentation/assets/svg/document_shimmer_strings.js.map +1 -0
  147. package/dist/presentation/assets/svg/instruction_svg_strings.d.ts +12 -4
  148. package/dist/presentation/assets/svg/instruction_svg_strings.d.ts.map +1 -1
  149. package/dist/presentation/assets/svg/instruction_svg_strings.js +19 -8
  150. package/dist/presentation/assets/svg/instruction_svg_strings.js.map +1 -1
  151. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts +0 -5
  152. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts.map +1 -1
  153. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js +0 -5
  154. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js.map +1 -1
  155. package/dist/presentation/components/icons/index.d.ts +24 -8
  156. package/dist/presentation/components/icons/index.d.ts.map +1 -1
  157. package/dist/presentation/components/icons/index.js +31 -11
  158. package/dist/presentation/components/icons/index.js.map +1 -1
  159. package/dist/presentation/components/use_smile_id_attribution.d.ts +1 -1
  160. package/dist/presentation/components/use_smile_id_button.d.ts +2 -2
  161. package/dist/presentation/components/use_smile_id_button.js +4 -4
  162. package/dist/presentation/components/use_smile_id_button.js.map +1 -1
  163. package/dist/presentation/components/use_smile_id_capture_content.d.ts +13 -0
  164. package/dist/presentation/components/use_smile_id_capture_content.d.ts.map +1 -1
  165. package/dist/presentation/components/use_smile_id_capture_content.js +15 -9
  166. package/dist/presentation/components/use_smile_id_capture_content.js.map +1 -1
  167. package/dist/presentation/components/use_smile_id_captured_document_image.d.ts +2 -3
  168. package/dist/presentation/components/use_smile_id_captured_document_image.d.ts.map +1 -1
  169. package/dist/presentation/components/use_smile_id_captured_document_image.js +1 -3
  170. package/dist/presentation/components/use_smile_id_captured_document_image.js.map +1 -1
  171. package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts +12 -6
  172. package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts.map +1 -1
  173. package/dist/presentation/components/use_smile_id_document_capture_controls.js +59 -16
  174. package/dist/presentation/components/use_smile_id_document_capture_controls.js.map +1 -1
  175. package/dist/presentation/components/use_smile_id_document_overlay.d.ts +22 -5
  176. package/dist/presentation/components/use_smile_id_document_overlay.d.ts.map +1 -1
  177. package/dist/presentation/components/use_smile_id_document_overlay.js +80 -40
  178. package/dist/presentation/components/use_smile_id_document_overlay.js.map +1 -1
  179. package/dist/presentation/components/use_smile_id_document_shimmer.d.ts +15 -0
  180. package/dist/presentation/components/use_smile_id_document_shimmer.d.ts.map +1 -0
  181. package/dist/presentation/components/use_smile_id_document_shimmer.js +23 -0
  182. package/dist/presentation/components/use_smile_id_document_shimmer.js.map +1 -0
  183. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts.map +1 -1
  184. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js +1 -3
  185. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js.map +1 -1
  186. package/dist/presentation/components/use_smile_id_guideline_thumbnail.d.ts.map +1 -1
  187. package/dist/presentation/components/use_smile_id_guideline_thumbnail.js +84 -1
  188. package/dist/presentation/components/use_smile_id_guideline_thumbnail.js.map +1 -1
  189. package/dist/presentation/components/use_smile_id_instructions_hero.d.ts +3 -1
  190. package/dist/presentation/components/use_smile_id_instructions_hero.d.ts.map +1 -1
  191. package/dist/presentation/components/use_smile_id_instructions_hero.js +18 -3
  192. package/dist/presentation/components/use_smile_id_instructions_hero.js.map +1 -1
  193. package/dist/presentation/components/use_smile_id_oval_border_palette.d.ts.map +1 -1
  194. package/dist/presentation/components/use_smile_id_oval_border_palette.js +7 -3
  195. package/dist/presentation/components/use_smile_id_oval_border_palette.js.map +1 -1
  196. package/dist/presentation/flow/dsl/builder/config_builder.d.ts +12 -0
  197. package/dist/presentation/flow/dsl/builder/config_builder.d.ts.map +1 -1
  198. package/dist/presentation/flow/dsl/builder/config_builder.js +12 -0
  199. package/dist/presentation/flow/dsl/builder/config_builder.js.map +1 -1
  200. package/dist/presentation/flow/dsl/builder/ml_builder.d.ts +13 -4
  201. package/dist/presentation/flow/dsl/builder/ml_builder.d.ts.map +1 -1
  202. package/dist/presentation/flow/dsl/builder/ml_builder.js +3 -2
  203. package/dist/presentation/flow/dsl/builder/ml_builder.js.map +1 -1
  204. package/dist/presentation/flow/dsl/builder/screens_builder.d.ts +111 -10
  205. package/dist/presentation/flow/dsl/builder/screens_builder.d.ts.map +1 -1
  206. package/dist/presentation/flow/dsl/builder/screens_builder.js +111 -10
  207. package/dist/presentation/flow/dsl/builder/screens_builder.js.map +1 -1
  208. package/dist/presentation/flow/dsl/builder/theme_builder.d.ts +15 -2
  209. package/dist/presentation/flow/dsl/builder/theme_builder.d.ts.map +1 -1
  210. package/dist/presentation/flow/dsl/builder/theme_builder.js +15 -2
  211. package/dist/presentation/flow/dsl/builder/theme_builder.js.map +1 -1
  212. package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts +6 -4
  213. package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts.map +1 -1
  214. package/dist/presentation/flow/dsl/use_smile_id_builder.js.map +1 -1
  215. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts +62 -36
  216. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts.map +1 -1
  217. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js +62 -36
  218. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js.map +1 -1
  219. package/dist/presentation/flow/flow_navigation_manager.d.ts +39 -4
  220. package/dist/presentation/flow/flow_navigation_manager.d.ts.map +1 -1
  221. package/dist/presentation/flow/flow_navigation_manager.js +141 -10
  222. package/dist/presentation/flow/flow_navigation_manager.js.map +1 -1
  223. package/dist/presentation/flow/model/instruction_guideline.d.ts +9 -0
  224. package/dist/presentation/flow/model/instruction_guideline.d.ts.map +1 -1
  225. package/dist/presentation/flow/model/instructions_defaults.d.ts +11 -2
  226. package/dist/presentation/flow/model/instructions_defaults.d.ts.map +1 -1
  227. package/dist/presentation/flow/model/instructions_defaults.js +73 -25
  228. package/dist/presentation/flow/model/instructions_defaults.js.map +1 -1
  229. package/dist/presentation/flow/screen/orchestrated_capture_screen.d.ts.map +1 -1
  230. package/dist/presentation/flow/screen/orchestrated_capture_screen.js +36 -12
  231. package/dist/presentation/flow/screen/orchestrated_capture_screen.js.map +1 -1
  232. package/dist/presentation/flow/screen/orchestrated_instructions_screen.js +1 -1
  233. package/dist/presentation/flow/screen/orchestrated_instructions_screen.js.map +1 -1
  234. package/dist/presentation/flow/screen/orchestrated_preview_screen.d.ts.map +1 -1
  235. package/dist/presentation/flow/screen/orchestrated_preview_screen.js +3 -1
  236. package/dist/presentation/flow/screen/orchestrated_preview_screen.js.map +1 -1
  237. package/dist/presentation/flow/screen/orchestrated_processing_screen.js +3 -3
  238. package/dist/presentation/flow/screen/orchestrated_processing_screen.js.map +1 -1
  239. package/dist/presentation/flow/validation/job_type_validator.d.ts.map +1 -1
  240. package/dist/presentation/flow/validation/job_type_validator.js +14 -0
  241. package/dist/presentation/flow/validation/job_type_validator.js.map +1 -1
  242. package/dist/presentation/screen/helpers/capture_screen_helpers.d.ts.map +1 -1
  243. package/dist/presentation/screen/helpers/capture_screen_helpers.js +1 -0
  244. package/dist/presentation/screen/helpers/capture_screen_helpers.js.map +1 -1
  245. package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts +1 -0
  246. package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts.map +1 -1
  247. package/dist/presentation/screen/helpers/instructions_screen_helpers.js +6 -2
  248. package/dist/presentation/screen/helpers/instructions_screen_helpers.js.map +1 -1
  249. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js +3 -0
  250. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js.map +1 -1
  251. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts +17 -1
  252. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts.map +1 -1
  253. package/dist/presentation/screen/use_smile_id_capture_screen.js +153 -18
  254. package/dist/presentation/screen/use_smile_id_capture_screen.js.map +1 -1
  255. package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts +2 -3
  256. package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts.map +1 -1
  257. package/dist/presentation/screen/use_smile_id_document_preview_screen.js +16 -11
  258. package/dist/presentation/screen/use_smile_id_document_preview_screen.js.map +1 -1
  259. package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts +2 -0
  260. package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts.map +1 -1
  261. package/dist/presentation/screen/use_smile_id_instructions_screen.js +2 -1
  262. package/dist/presentation/screen/use_smile_id_instructions_screen.js.map +1 -1
  263. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts +7 -6
  264. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts.map +1 -1
  265. package/dist/presentation/screen/use_smile_id_preview_screen.js +9 -8
  266. package/dist/presentation/screen/use_smile_id_preview_screen.js.map +1 -1
  267. package/dist/presentation/screen/use_smile_id_processing_screen.d.ts +2 -3
  268. package/dist/presentation/screen/use_smile_id_processing_screen.d.ts.map +1 -1
  269. package/dist/presentation/screen/use_smile_id_processing_screen.js +3 -2
  270. package/dist/presentation/screen/use_smile_id_processing_screen.js.map +1 -1
  271. package/dist/presentation/theme/theme.d.ts +1 -1
  272. package/dist/presentation/theme/theme.d.ts.map +1 -1
  273. package/dist/presentation/theme/theme.js +20 -18
  274. package/dist/presentation/theme/theme.js.map +1 -1
  275. package/dist/presentation/utils/force_max_brightness.d.ts +4 -4
  276. package/package.json +26 -6
  277. package/src/__tests__/react_native_mock.tsx +8 -0
  278. package/src/camera/camera_defaults.ts +11 -9
  279. package/src/camera/orientation_degrees.ts +5 -6
  280. package/src/core/models/__tests__/document_type.test.ts +6 -4
  281. package/src/core/models/document_capture_mode.ts +27 -0
  282. package/src/core/models/document_type.ts +6 -4
  283. package/src/core/models/result.ts +9 -8
  284. package/src/data/api/interceptors/__tests__/smile_integrity_interceptor.test.ts +37 -1
  285. package/src/data/api/interceptors/__tests__/smile_request_mac_interceptor.test.ts +59 -1
  286. package/src/data/api/interceptors/smile_auth_interceptor.ts +1 -1
  287. package/src/data/api/interceptors/smile_integrity_interceptor.ts +20 -0
  288. package/src/data/api/interceptors/smile_request_mac_interceptor.ts +13 -0
  289. package/src/data/compression/__tests__/payload_compressor.test.ts +200 -0
  290. package/src/data/compression/__tests__/payload_compressor_real_jpeg.test.ts +222 -0
  291. package/src/data/compression/compressible_asset.ts +62 -0
  292. package/src/data/compression/payload_compression_config.ts +53 -0
  293. package/src/data/compression/payload_compression_runner.ts +102 -0
  294. package/src/data/compression/payload_compressor.ts +164 -0
  295. package/src/data/compression/uri_compressible_asset.ts +85 -0
  296. package/src/data/dsl/builder/cache_config_builder.ts +3 -1
  297. package/src/data/dsl/builder/config_builder.ts +45 -14
  298. package/src/data/dsl/builder/interceptor_config_builder.ts +9 -7
  299. package/src/data/dsl/builder/retry_config_builder.ts +22 -1
  300. package/src/data/dsl/builder/timeout_config_builder.ts +7 -0
  301. package/src/data/dsl/use_smile_id_network_builder.ts +17 -0
  302. package/src/data/factory/networking_factory.ts +14 -1
  303. package/src/data/repository/__tests__/network_retries.test.ts +117 -0
  304. package/src/data/repository/use_smile_id_repository_impl.ts +96 -9
  305. package/src/data/security/__tests__/security_policy.test.ts +96 -0
  306. package/src/data/security/__tests__/smile_id_crypto_manager.test.ts +18 -0
  307. package/src/data/security/request_canonicalizer.ts +15 -2
  308. package/src/data/security/security_policy.ts +70 -0
  309. package/src/data/util/__tests__/use_smile_id_token_decoder.test.ts +57 -1
  310. package/src/data/util/retry_util.ts +3 -2
  311. package/src/data/util/use_smile_id_token_decoder.ts +76 -28
  312. package/src/l10n/strings_en.ts +2 -1
  313. package/src/l10n/use_smile_id_localizations.ts +3 -0
  314. package/src/metadata/__tests__/device_orientation_collector.test.ts +15 -0
  315. package/src/metadata/__tests__/metadata_configuration_mappers.test.ts +215 -0
  316. package/src/metadata/__tests__/metadata_configuration_objects.test.ts +85 -0
  317. package/src/metadata/__tests__/metadata_device_context.test.ts +147 -0
  318. package/src/metadata/__tests__/metadata_golden_fixture.json +13 -0
  319. package/src/metadata/__tests__/metadata_payload_golden.test.ts +193 -0
  320. package/src/metadata/__tests__/use_smile_id_metadata.test.ts +18 -24
  321. package/src/metadata/builder_configuration.ts +63 -0
  322. package/src/metadata/captured_image_properties.ts +10 -0
  323. package/src/metadata/device_orientation_collector.ts +75 -0
  324. package/src/metadata/geolocation.ts +46 -0
  325. package/src/metadata/metadata_configuration_mappers.ts +234 -0
  326. package/src/metadata/model_configuration.ts +68 -0
  327. package/src/metadata/optional_native_modules.ts +157 -3
  328. package/src/metadata/use_smile_id_metadata.ts +140 -17
  329. package/src/metadata/use_smile_id_metadata_factory.ts +195 -11
  330. package/src/presentation/assets/si_ess_animation_all_directions.json +1300 -286
  331. package/src/presentation/assets/svg/document_shimmer_strings.ts +17 -0
  332. package/src/presentation/assets/svg/instruction_svg_strings.ts +34 -12
  333. package/src/presentation/components/__tests__/enhanced_smart_selfie_animation_frames.test.ts +1 -3
  334. package/src/presentation/components/__tests__/use_smile_id_enhanced_smart_selfie_clip.test.tsx +3 -4
  335. package/src/presentation/components/__tests__/use_smile_id_guideline_thumbnail.test.tsx +34 -1
  336. package/src/presentation/components/__tests__/use_smile_id_instructions_hero.test.tsx +27 -0
  337. package/src/presentation/components/__tests__/use_smile_id_oval_border_palette.test.ts +7 -5
  338. package/src/presentation/components/helpers/enhanced_smart_selfie_animation_frames.ts +0 -6
  339. package/src/presentation/components/icons/index.tsx +65 -18
  340. package/src/presentation/components/use_smile_id_attribution.tsx +1 -1
  341. package/src/presentation/components/use_smile_id_button.tsx +4 -4
  342. package/src/presentation/components/use_smile_id_capture_content.tsx +36 -12
  343. package/src/presentation/components/use_smile_id_captured_document_image.tsx +3 -8
  344. package/src/presentation/components/use_smile_id_document_capture_controls.tsx +103 -39
  345. package/src/presentation/components/use_smile_id_document_overlay.tsx +134 -44
  346. package/src/presentation/components/use_smile_id_document_shimmer.tsx +51 -0
  347. package/src/presentation/components/use_smile_id_enhanced_smart_selfie_clip.tsx +0 -3
  348. package/src/presentation/components/use_smile_id_guideline_thumbnail.tsx +131 -2
  349. package/src/presentation/components/use_smile_id_instructions_hero.tsx +100 -59
  350. package/src/presentation/components/use_smile_id_oval_border_palette.ts +7 -3
  351. package/src/presentation/flow/__tests__/document_flow_navigation.test.ts +200 -1
  352. package/src/presentation/flow/dsl/builder/config_builder.ts +14 -0
  353. package/src/presentation/flow/dsl/builder/ml_builder.ts +13 -4
  354. package/src/presentation/flow/dsl/builder/screens_builder.ts +111 -10
  355. package/src/presentation/flow/dsl/builder/theme_builder.ts +19 -2
  356. package/src/presentation/flow/dsl/use_smile_id_builder.tsx +6 -4
  357. package/src/presentation/flow/dsl/use_smile_id_flow_builder.ts +62 -36
  358. package/src/presentation/flow/flow_navigation_manager.ts +179 -13
  359. package/src/presentation/flow/model/instruction_guideline.ts +6 -0
  360. package/src/presentation/flow/model/instructions_defaults.ts +103 -25
  361. package/src/presentation/flow/screen/orchestrated_capture_screen.tsx +43 -10
  362. package/src/presentation/flow/screen/orchestrated_instructions_screen.tsx +1 -0
  363. package/src/presentation/flow/screen/orchestrated_preview_screen.tsx +4 -2
  364. package/src/presentation/flow/screen/orchestrated_processing_screen.tsx +3 -3
  365. package/src/presentation/flow/validation/__tests__/job_type_validator.test.ts +64 -0
  366. package/src/presentation/flow/validation/job_type_validator.ts +24 -0
  367. package/src/presentation/screen/__tests__/instructions_screen_helpers.test.ts +15 -3
  368. package/src/presentation/screen/__tests__/use_smile_id_capture_screen.test.tsx +6 -4
  369. package/src/presentation/screen/helpers/capture_screen_helpers.ts +1 -0
  370. package/src/presentation/screen/helpers/instructions_screen_helpers.ts +7 -2
  371. package/src/presentation/screen/helpers/scan_state_to_overlay_state.ts +3 -0
  372. package/src/presentation/screen/use_smile_id_capture_screen.tsx +234 -36
  373. package/src/presentation/screen/use_smile_id_document_preview_screen.tsx +32 -22
  374. package/src/presentation/screen/use_smile_id_instructions_screen.tsx +4 -0
  375. package/src/presentation/screen/use_smile_id_preview_screen.tsx +9 -9
  376. package/src/presentation/screen/use_smile_id_processing_screen.tsx +7 -7
  377. package/src/presentation/theme/theme.ts +21 -19
  378. package/src/presentation/utils/force_max_brightness.tsx +4 -4
  379. package/dist/camera/frame_processor_plugin.d.ts +0 -28
  380. package/dist/camera/frame_processor_plugin.d.ts.map +0 -1
  381. package/dist/camera/frame_processor_plugin.js +0 -21
  382. package/dist/camera/frame_processor_plugin.js.map +0 -1
  383. package/dist/camera/use_smile_id_frame_processor.d.ts +0 -38
  384. package/dist/camera/use_smile_id_frame_processor.d.ts.map +0 -1
  385. package/dist/camera/use_smile_id_frame_processor.js +0 -2
  386. package/dist/camera/use_smile_id_frame_processor.js.map +0 -1
  387. package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts +0 -17
  388. package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts.map +0 -1
  389. package/dist/presentation/components/use_smile_id_document_frame_glyph.js +0 -17
  390. package/dist/presentation/components/use_smile_id_document_frame_glyph.js.map +0 -1
  391. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts +0 -24
  392. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts.map +0 -1
  393. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js +0 -91
  394. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js.map +0 -1
  395. package/dist/presentation/components/use_smile_id_instruction_card.d.ts +0 -31
  396. package/dist/presentation/components/use_smile_id_instruction_card.d.ts.map +0 -1
  397. package/dist/presentation/components/use_smile_id_instruction_card.js +0 -43
  398. package/dist/presentation/components/use_smile_id_instruction_card.js.map +0 -1
  399. package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts +0 -24
  400. package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts.map +0 -1
  401. package/dist/presentation/screen/helpers/use_document_orientation_lock.js +0 -47
  402. package/dist/presentation/screen/helpers/use_document_orientation_lock.js.map +0 -1
  403. package/src/presentation/components/use_smile_id_document_frame_glyph.tsx +0 -162
@@ -27,6 +27,9 @@ const DEFAULT_LOOP_MS = 2000;
27
27
  // the hero animation's playback speed, so a long hero composition can't slow
28
28
  // the fill down to a crawl.
29
29
  export const OVAL_PROGRESS_DURATION_MS = 5500;
30
+ // Document hero card: 4:3 frame, corner radius = 40/384 of its width.
31
+ const HERO_CARD_WIDTH_TO_HEIGHT = 384 / 288;
32
+ const HERO_CARD_CORNER_RATIO = 40 / 384;
30
33
 
31
34
  export type UseSmileIDInstructionsHeroProps = {
32
35
  /** Lottie animation rendered inside the (optional) face-oval ring. */
@@ -39,6 +42,8 @@ export type UseSmileIDInstructionsHeroProps = {
39
42
  * scheduled (Enhanced Smart Selfie has no single rising-progress gesture).
40
43
  */
41
44
  readonly showOvalProgress?: boolean;
45
+ /** Present the animation inside a cream rounded card instead of a face oval (document instructions). */
46
+ readonly showCardBackground?: boolean;
42
47
  readonly theme?: UseSmileIDTheme;
43
48
  };
44
49
 
@@ -67,6 +72,7 @@ export function UseSmileIDInstructionsHero({
67
72
  source,
68
73
  showOval = false,
69
74
  showOvalProgress = true,
75
+ showCardBackground = false,
70
76
  theme: themeProp,
71
77
  }: UseSmileIDInstructionsHeroProps) {
72
78
  const themeFromContext = useUseSmileIDTheme();
@@ -134,6 +140,13 @@ export function UseSmileIDInstructionsHero({
134
140
  const verticalOffset = animationSize * ANIMATION_VERTICAL_OFFSET_RATIO;
135
141
  const hasSize = ovalWidth > 0 && ovalHeight > 0;
136
142
 
143
+ const cardWidth = Math.min(
144
+ size.width,
145
+ size.height * HERO_CARD_WIDTH_TO_HEIGHT,
146
+ );
147
+ const cardHeight = cardWidth / HERO_CARD_WIDTH_TO_HEIGHT;
148
+ const cardRadius = cardWidth * HERO_CARD_CORNER_RATIO;
149
+
137
150
  const onLayout = (event: LayoutChangeEvent) => {
138
151
  const { width, height } = event.nativeEvent.layout;
139
152
  setSize((previous) =>
@@ -164,77 +177,105 @@ export function UseSmileIDInstructionsHero({
164
177
  testID="si_instructions_hero"
165
178
  >
166
179
  {hasSize ? (
167
- <>
168
- {showOval ? (
169
- <>
170
- <Svg
171
- width={ovalWidth}
172
- height={ovalHeight}
173
- style={{
174
- position: "absolute",
175
- left: (size.width - ovalWidth) / 2,
176
- top: (size.height - ovalHeight) / 2,
177
- }}
178
- >
179
- <Ellipse {...ellipseProps} stroke={theme.colors.ovalDefault} />
180
- </Svg>
181
- {/* Green fill revealed by a bottom-anchored view window —
182
- Android never re-resolves animated SVG clipPath contents,
183
- so the clip must happen at the View layer. */}
184
- {showOvalProgress ? (
185
- <View
186
- pointerEvents="none"
180
+ showCardBackground ? (
181
+ <View
182
+ style={{
183
+ position: "absolute",
184
+ left: (size.width - cardWidth) / 2,
185
+ top: (size.height - cardHeight) / 2,
186
+ width: cardWidth,
187
+ height: cardHeight,
188
+ borderRadius: cardRadius,
189
+ overflow: "hidden",
190
+ backgroundColor: theme.colors.instructionCardBackground,
191
+ }}
192
+ testID="si_instructions_hero_card"
193
+ >
194
+ <AnimatedLottieView
195
+ source={source}
196
+ autoPlay={!lottieDrivenByProgress}
197
+ loop={!lottieDrivenByProgress}
198
+ {...(lottieDrivenByProgress ? { progress: heroProgress } : {})}
199
+ resizeMode="contain"
200
+ style={{ width: cardWidth, height: cardHeight }}
201
+ />
202
+ </View>
203
+ ) : (
204
+ <>
205
+ {showOval ? (
206
+ <>
207
+ <Svg
208
+ width={ovalWidth}
209
+ height={ovalHeight}
187
210
  style={{
188
211
  position: "absolute",
189
212
  left: (size.width - ovalWidth) / 2,
190
213
  top: (size.height - ovalHeight) / 2,
191
- width: ovalWidth,
192
- height: ovalHeight,
193
214
  }}
194
215
  >
195
- <Animated.View
216
+ <Ellipse
217
+ {...ellipseProps}
218
+ stroke={theme.colors.ovalDefault}
219
+ />
220
+ </Svg>
221
+ {/* Green fill revealed by a bottom-anchored view window —
222
+ Android never re-resolves animated SVG clipPath contents,
223
+ so the clip must happen at the View layer. */}
224
+ {showOvalProgress ? (
225
+ <View
226
+ pointerEvents="none"
196
227
  style={{
197
228
  position: "absolute",
198
- left: 0,
199
- right: 0,
200
- bottom: 0,
201
- overflow: "hidden",
202
- height: ovalProgress.interpolate({
203
- inputRange: [0, 1],
204
- outputRange: [0, ovalHeight],
205
- }),
229
+ left: (size.width - ovalWidth) / 2,
230
+ top: (size.height - ovalHeight) / 2,
231
+ width: ovalWidth,
232
+ height: ovalHeight,
206
233
  }}
207
234
  >
208
- <Svg
209
- width={ovalWidth}
210
- height={ovalHeight}
211
- style={{ position: "absolute", left: 0, bottom: 0 }}
235
+ <Animated.View
236
+ style={{
237
+ position: "absolute",
238
+ left: 0,
239
+ right: 0,
240
+ bottom: 0,
241
+ overflow: "hidden",
242
+ height: ovalProgress.interpolate({
243
+ inputRange: [0, 1],
244
+ outputRange: [0, ovalHeight],
245
+ }),
246
+ }}
212
247
  >
213
- <Ellipse
214
- {...ellipseProps}
215
- stroke={theme.colors.ovalActive}
216
- />
217
- </Svg>
218
- </Animated.View>
219
- </View>
220
- ) : null}
221
- </>
222
- ) : null}
248
+ <Svg
249
+ width={ovalWidth}
250
+ height={ovalHeight}
251
+ style={{ position: "absolute", left: 0, bottom: 0 }}
252
+ >
253
+ <Ellipse
254
+ {...ellipseProps}
255
+ stroke={theme.colors.ovalActive}
256
+ />
257
+ </Svg>
258
+ </Animated.View>
259
+ </View>
260
+ ) : null}
261
+ </>
262
+ ) : null}
223
263
 
224
- <AnimatedLottieView
225
- source={source}
226
- autoPlay={!lottieDrivenByProgress}
227
- loop={!lottieDrivenByProgress}
228
- {...(lottieDrivenByProgress ? { progress: heroProgress } : {})}
229
- style={{
230
- position: "absolute",
231
- width: animationSize,
232
- height: animationSize,
233
- left: (size.width - animationSize) / 2,
234
- top: (size.height - animationSize) / 2 + verticalOffset,
235
- }}
236
- />
237
- </>
264
+ <AnimatedLottieView
265
+ source={source}
266
+ autoPlay={!lottieDrivenByProgress}
267
+ loop={!lottieDrivenByProgress}
268
+ {...(lottieDrivenByProgress ? { progress: heroProgress } : {})}
269
+ style={{
270
+ position: "absolute",
271
+ width: animationSize,
272
+ height: animationSize,
273
+ left: (size.width - animationSize) / 2,
274
+ top: (size.height - animationSize) / 2 + verticalOffset,
275
+ }}
276
+ />
277
+ </>
278
+ )
238
279
  ) : null}
239
280
  </View>
240
281
  );
@@ -48,13 +48,17 @@ export const UseSmileIDOvalBorderPalette = {
48
48
  case UseSmileIDOverlayState.MULTIPLE_FACES:
49
49
  return "ovalWarning";
50
50
 
51
- // Document states render via UseSmileIDDocumentOverlay, not here.
51
+ // Document states (UseSmileIDDocumentOverlay resolves its border through
52
+ // this same table): green once the document is correctly framed, red
53
+ // while it is detected but mispositioned (too far / close / off-centre /
54
+ // not steady).
55
+ case UseSmileIDOverlayState.DOCUMENT_READY:
56
+ return "ovalActive";
52
57
  case UseSmileIDOverlayState.DOCUMENT_NOT_CENTERED:
53
58
  case UseSmileIDOverlayState.DOCUMENT_TOO_FAR:
54
59
  case UseSmileIDOverlayState.DOCUMENT_TOO_CLOSE:
55
60
  case UseSmileIDOverlayState.DOCUMENT_HOLD_STILL:
56
- case UseSmileIDOverlayState.DOCUMENT_READY:
57
- return "ovalDefault";
61
+ return "ovalWarning";
58
62
  }
59
63
  },
60
64
  } as const;
@@ -3,6 +3,7 @@ import { DocumentSide } from "@smileid/usesmileid_bridge";
3
3
  import { FlowNavigationManager } from "../flow_navigation_manager";
4
4
  import {
5
5
  CaptureType,
6
+ type DocumentCaptureConfigBuilder,
6
7
  ScreensBuilder,
7
8
  type ScreensConfig,
8
9
  } from "../dsl/builder/screens_builder";
@@ -40,7 +41,7 @@ function twoSidedDocumentFlow(): ScreensConfig {
40
41
  screens.capture((capture) => {
41
42
  capture.captureType = CaptureType.document;
42
43
  capture.document((document) => {
43
- document.documentType = DocumentType.SouthAfricaGreenBook; // hasBackSide
44
+ document.documentType = DocumentType.GenericDocument(); // hasBackSide
44
45
  document.captureBothSides = true;
45
46
  document.allowSkipBack = true;
46
47
  });
@@ -136,6 +137,44 @@ describe("FlowNavigationManager — document per-side preview loop", () => {
136
137
  );
137
138
  });
138
139
 
140
+ it("with no document preview, still routes to the BACK capture after the front", () => {
141
+ // Regression: captureBothSides must capture the back even with no document
142
+ // preview { }, not jump straight to the selfie.
143
+ const noPreviewFlow = buildScreens((screens) => {
144
+ screens.instructions();
145
+ screens.capture((capture) => {
146
+ capture.captureType = CaptureType.document;
147
+ capture.document((document) => {
148
+ document.documentType = DocumentType.GenericDocument(); // hasBackSide
149
+ document.captureBothSides = true;
150
+ document.allowSkipBack = false;
151
+ });
152
+ });
153
+ screens.capture((capture) => {
154
+ capture.captureType = CaptureType.selfie;
155
+ });
156
+ screens.processing();
157
+ });
158
+ const manager = makeManager(noPreviewFlow);
159
+ manager.navigateToNext(); // instructions → document capture (front)
160
+ manager.setCapturedFrontDocument("file:///front.jpg");
161
+
162
+ // No preview follows → re-enter the document capture for the back side.
163
+ const next = manager.getNextScreen();
164
+ expect(next?.kind).toBe("capture");
165
+ expect(next?.kind === "capture" ? next.config.captureType : undefined).toBe(
166
+ CaptureType.document,
167
+ );
168
+
169
+ // After the back is captured, advance to the selfie.
170
+ manager.navigateToNext(); // → document capture (back)
171
+ manager.setCapturedBackDocument("file:///back.jpg");
172
+ const afterBack = manager.getNextScreen();
173
+ expect(
174
+ afterBack?.kind === "capture" ? afterBack.config.captureType : undefined,
175
+ ).toBe(CaptureType.selfie);
176
+ });
177
+
139
178
  it("retakeCurrentDocumentSide clears the back first, then the front", () => {
140
179
  const manager = makeManager(twoSidedDocumentFlow());
141
180
  manager.setCapturedFrontDocument("file:///front.jpg");
@@ -282,4 +321,164 @@ describe("FlowNavigationManager — document image origin metadata", () => {
282
321
  entries.some((entry) => entry.name === "DocumentBackImageOrigin"),
283
322
  ).toBe(false);
284
323
  });
324
+
325
+ it("stamps capture telemetry and image properties onto the submitted metadata", () => {
326
+ const repository = new StubRepository();
327
+ const manager = makeManager(
328
+ buildScreens((screens) => screens.processing()),
329
+ {
330
+ documentVerificationParams: { country: "NG" },
331
+ userDetails: SAMPLE_USER_DETAILS,
332
+ network: {
333
+ config: {
334
+ jobType: JobType.documentVerification,
335
+ token: "k",
336
+ partnerConfig: {
337
+ partnerId: "p",
338
+ callbackUrl: "",
339
+ useSandbox: true,
340
+ },
341
+ },
342
+ },
343
+ },
344
+ repository,
345
+ );
346
+ manager.setCapturedSelfie("file:///selfie.jpg", ["file:///l1.jpg"]);
347
+ manager.setCapturedFrontDocument("file:///front.jpg");
348
+ manager.recordSelfieCaptureTelemetry({
349
+ durationMs: 4200,
350
+ retries: 0,
351
+ cameraName: "com.apple.avfoundation:front",
352
+ devicePositions: ["1000,0.1,0.2,0.98", "1066,0.1,0.3,0.97"],
353
+ deviceMovementDetected: 0.35,
354
+ });
355
+ manager.recordDocumentCaptureTelemetry(DocumentSide.Front, {
356
+ durationMs: 5000,
357
+ retries: 1,
358
+ devicePositions: [],
359
+ deviceMovementDetected: null,
360
+ });
361
+ manager.setConsent(consentInfo);
362
+
363
+ manager.beginSubmissionIfNeeded();
364
+
365
+ const entries = repository.received[0]!.metadata.toEntries();
366
+ // Selfie: duration + retries (0 kept) + image color depth / pixel config.
367
+ expect(entries).toContainEqual({
368
+ name: "selfie_capture_duration_ms",
369
+ value: "4200",
370
+ });
371
+ expect(entries).toContainEqual({
372
+ name: "selfie_capture_retries",
373
+ value: "0",
374
+ });
375
+ expect(entries).toContainEqual({
376
+ name: "selfie_image_color_depth",
377
+ value: "24",
378
+ });
379
+ expect(entries).toContainEqual({
380
+ name: "selfie_image_pixel_config",
381
+ value: "RGB_888",
382
+ });
383
+ // Document front: telemetry + image color depth / pixel config. (Original/final compressed
384
+ // sizes are stamped in the repository around the compression pass, not by the flow manager.)
385
+ expect(entries).toContainEqual({
386
+ name: "document_front_capture_duration_ms",
387
+ value: "5000",
388
+ });
389
+ expect(entries).toContainEqual({
390
+ name: "document_front_capture_retries",
391
+ value: "1",
392
+ });
393
+ // Back side never captured → no back entries.
394
+ expect(
395
+ entries.some((entry) => entry.name === "document_back_capture_retries"),
396
+ ).toBe(false);
397
+ // Camera id from the telemetry.
398
+ expect(entries).toContainEqual({
399
+ name: "camera_name",
400
+ value: "com.apple.avfoundation:front",
401
+ });
402
+ // Accelerometer telemetry from the selfie capture.
403
+ expect(entries).toContainEqual({
404
+ name: "device_positions",
405
+ value: JSON.stringify(["1000,0.1,0.2,0.98", "1066,0.1,0.3,0.97"]),
406
+ });
407
+ expect(entries).toContainEqual({
408
+ name: "device_movement_detected",
409
+ value: "0.35",
410
+ });
411
+ });
412
+ });
413
+
414
+ describe("FlowNavigationManager — documentFrameAspectRatio", () => {
415
+ function documentFlow(
416
+ configure: (document: DocumentCaptureConfigBuilder) => void,
417
+ ): ScreensConfig {
418
+ return buildScreens((screens) => {
419
+ screens.capture((capture) => {
420
+ capture.captureType = CaptureType.document;
421
+ capture.document(configure);
422
+ });
423
+ });
424
+ }
425
+
426
+ it("uses the document type's own knownAspectRatio for presets", () => {
427
+ expect(
428
+ makeManager(
429
+ documentFlow((document) => {
430
+ document.documentType = DocumentType.Passport;
431
+ }),
432
+ ).documentFrameAspectRatio,
433
+ ).toBeCloseTo(356 / 272);
434
+
435
+ expect(
436
+ makeManager(
437
+ documentFlow((document) => {
438
+ document.documentType = DocumentType.SouthAfricaGreenBook;
439
+ }),
440
+ ).documentFrameAspectRatio,
441
+ ).toBeCloseTo(320 / 428);
442
+ });
443
+
444
+ it("falls back to the partner ratio, then the orientation default", () => {
445
+ // Generic landscape with no fixed ratio → landscape default.
446
+ expect(
447
+ makeManager(
448
+ documentFlow((document) => {
449
+ document.documentType = DocumentType.GenericDocument();
450
+ }),
451
+ ).documentFrameAspectRatio,
452
+ ).toBeCloseTo(1.586);
453
+
454
+ // A partner override wins when the type has no fixed ratio.
455
+ expect(
456
+ makeManager(
457
+ documentFlow((document) => {
458
+ document.documentType = DocumentType.GenericDocument();
459
+ document.knownIdAspectRatio = 1.4;
460
+ }),
461
+ ).documentFrameAspectRatio,
462
+ ).toBeCloseTo(1.4);
463
+
464
+ // Generic portrait with no fixed ratio → portrait default.
465
+ expect(
466
+ makeManager(
467
+ documentFlow((document) => {
468
+ document.documentType = DocumentType.GenericDocument({
469
+ orientation: "Portrait",
470
+ });
471
+ }),
472
+ ).documentFrameAspectRatio,
473
+ ).toBeCloseTo(0.65);
474
+ });
475
+
476
+ it("is undefined when the flow has no document capture step", () => {
477
+ const selfieFlow = buildScreens((screens) => {
478
+ screens.capture((capture) => {
479
+ capture.captureType = CaptureType.selfie;
480
+ });
481
+ });
482
+ expect(makeManager(selfieFlow).documentFrameAspectRatio).toBeUndefined();
483
+ });
285
484
  });
@@ -8,8 +8,22 @@ import type { ConfigOptions } from "../../../../core/models/config";
8
8
  * populated.
9
9
  */
10
10
  export class UseSmileIDConfigBuilder {
11
+ /**
12
+ * When true (the default), the SDK reports its own crashes to Smile ID's
13
+ * crash-reporting backend. Set false to opt out.
14
+ */
11
15
  enableCrashReporting = true;
16
+
17
+ /**
18
+ * When true, enables verbose SDK debug logging and on-device
19
+ * diagnostics. Defaults to false; leave off in production.
20
+ */
12
21
  enableDebugMode = false;
22
+
23
+ /**
24
+ * When true, captured images are written to disk so the job can be
25
+ * submitted later when connectivity returns. Defaults to false.
26
+ */
13
27
  allowOfflineMode = false;
14
28
 
15
29
  build(): ConfigOptions {
@@ -34,7 +34,7 @@ import {
34
34
  */
35
35
 
36
36
  export class FaceAnalyzerScope {
37
- /** Register the face analyzer for this scope. */
37
+ /** Registers a detection backend for this capture type. */
38
38
  add(analyzer: FaceAnalyzer): void {
39
39
  this._analyzer = analyzer;
40
40
  }
@@ -130,7 +130,7 @@ export class FaceAnalyzerScope {
130
130
  }
131
131
 
132
132
  export class DocumentAnalyzerScope {
133
- /** Register the document analyzer for this scope. */
133
+ /** Registers a detection backend for this capture type. */
134
134
  add(analyzer: DocumentAnalyzer): void {
135
135
  this._analyzer = analyzer;
136
136
  }
@@ -143,12 +143,20 @@ export class AnalyzerRegistryBuilder {
143
143
  private _selfieConfig?: FaceConfig | undefined;
144
144
  private _document?: DocumentAnalyzer | undefined;
145
145
 
146
- /** Open a selfie-analyzer registration scope. */
146
+ /**
147
+ * Registers and tunes the analyzer(s) for the selfie capture type.
148
+ * Calling it again for the same capture type replaces the previous
149
+ * registration.
150
+ */
147
151
  forCaptureType(
148
152
  captureType: CaptureType.selfie,
149
153
  block: (a: FaceAnalyzerScope) => void,
150
154
  ): void;
151
- /** Open a document-analyzer registration scope. */
155
+ /**
156
+ * Registers and tunes the analyzer(s) for the document capture type.
157
+ * Calling it again for the same capture type replaces the previous
158
+ * registration.
159
+ */
152
160
  forCaptureType(
153
161
  captureType: CaptureType.document,
154
162
  block: (a: DocumentAnalyzerScope) => void,
@@ -188,6 +196,7 @@ export class AnalyzerRegistryBuilder {
188
196
  export class UseSmileIDMLBuilder {
189
197
  private _analyzers?: AnalyzerRegistryBuilder;
190
198
 
199
+ /** Registers the ML analyzers for the flow, keyed by capture type. */
191
200
  analyzers(block: (a: AnalyzerRegistryBuilder) => void): void {
192
201
  if (!this._analyzers) this._analyzers = new AnalyzerRegistryBuilder();
193
202
  block(this._analyzers);