@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
@@ -0,0 +1,230 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import * as React from "react";
3
+ import { View } from "react-native";
4
+ import { act, create as createRenderer } from "react-test-renderer";
5
+ import { CaptureType } from "../../core/models/ml_config";
6
+ import { UseSmileIDCaptureContent } from "../../presentation/components/use_smile_id_capture_content";
7
+ import type { UseSmileIDCaptureContentState } from "../../presentation/components/use_smile_id_capture_content";
8
+ import { UseSmileIDConsentScreen } from "../../presentation/screen/use_smile_id_consent_screen";
9
+ import { UseSmileIDDocumentBackInstructions } from "../../presentation/screen/use_smile_id_document_back_instructions";
10
+ import { UseSmileIDDocumentPreviewScreen } from "../../presentation/screen/use_smile_id_document_preview_screen";
11
+ import { UseSmileIDInstructionsScreen } from "../../presentation/screen/use_smile_id_instructions_screen";
12
+ import { UseSmileIDPreviewScreen } from "../../presentation/screen/use_smile_id_preview_screen";
13
+ import { UseSmileIDProcessingScreen } from "../../presentation/screen/use_smile_id_processing_screen";
14
+ import { UseSmileIDFaceOverlay } from "../../presentation/components/use_smile_id_face_overlay";
15
+ import { UseSmileIDDocumentOverlay } from "../../presentation/components/use_smile_id_document_overlay";
16
+ import {
17
+ OVERLAY_STATE_COUNT,
18
+ UseSmileIDOverlayState,
19
+ } from "../../presentation/state/use_smile_id_overlay_state";
20
+
21
+ /**
22
+ * Structural snapshots: pin the rendered element tree, not pixels (pixels are
23
+ * the Detox lane's job). Keys follow the `<flow>/<screen>/<state>` contract.
24
+ */
25
+
26
+ function render(element: React.ReactElement) {
27
+ let tree!: ReturnType<typeof createRenderer>;
28
+ act(() => {
29
+ tree = createRenderer(element);
30
+ });
31
+ return tree;
32
+ }
33
+
34
+ const CONTAINER = { containerWidth: 390, containerHeight: 520 } as const;
35
+
36
+ const DOCUMENT_STATES = Object.values(UseSmileIDOverlayState).filter((s) =>
37
+ s.startsWith("DOCUMENT_"),
38
+ );
39
+ const FACE_STATES = Object.values(UseSmileIDOverlayState).filter(
40
+ (s) => !s.startsWith("DOCUMENT_"),
41
+ );
42
+
43
+ describe("structural snapshots", () => {
44
+ it("pins the overlay state inventory", () => {
45
+ expect(FACE_STATES.length + DOCUMENT_STATES.length).toBe(
46
+ OVERLAY_STATE_COUNT,
47
+ );
48
+ });
49
+
50
+ describe("selfie/instructions", () => {
51
+ it("selfie/instructions/default", () => {
52
+ const tree = render(
53
+ <UseSmileIDInstructionsScreen
54
+ onBack={() => {}}
55
+ onContinue={() => {}}
56
+ />,
57
+ );
58
+ expect(tree.toJSON()).toMatchSnapshot();
59
+ });
60
+ });
61
+
62
+ describe("selfie/capture overlay", () => {
63
+ it.each(FACE_STATES)("selfie/capture/%s", (state) => {
64
+ const tree = render(
65
+ <UseSmileIDFaceOverlay state={state} progress={0.5} {...CONTAINER} />,
66
+ );
67
+ expect(tree.toJSON()).toMatchSnapshot();
68
+ });
69
+ });
70
+
71
+ describe("document/capture overlay", () => {
72
+ it.each(DOCUMENT_STATES)("document/capture/%s", (state) => {
73
+ const tree = render(
74
+ <UseSmileIDDocumentOverlay state={state} {...CONTAINER} />,
75
+ );
76
+ expect(tree.toJSON()).toMatchSnapshot();
77
+ });
78
+ });
79
+
80
+ describe("consent", () => {
81
+ it("consent/default", () => {
82
+ const tree = render(
83
+ <UseSmileIDConsentScreen
84
+ partnerName="Acme Bank"
85
+ partnerPrivacyPolicyUrl="https://usesmileid.com/privacy"
86
+ onAllow={() => {}}
87
+ onDeny={() => {}}
88
+ />,
89
+ );
90
+ expect(tree.toJSON()).toMatchSnapshot();
91
+ });
92
+ });
93
+
94
+ describe("document/back_instructions", () => {
95
+ it("document/back_instructions/default", () => {
96
+ const tree = render(
97
+ <UseSmileIDDocumentBackInstructions
98
+ documentTypeDisplayName="National ID"
99
+ onCaptureBack={() => {}}
100
+ allowSkip
101
+ onSkip={() => {}}
102
+ onBack={() => {}}
103
+ />,
104
+ );
105
+ expect(tree.toJSON()).toMatchSnapshot();
106
+ });
107
+ });
108
+
109
+ describe("document/preview", () => {
110
+ it("document/preview/default", () => {
111
+ const tree = render(
112
+ <UseSmileIDDocumentPreviewScreen
113
+ documentAspectRatio={1.586}
114
+ onAccept={() => {}}
115
+ onReject={() => {}}
116
+ onClose={() => {}}
117
+ />,
118
+ );
119
+ expect(tree.toJSON()).toMatchSnapshot();
120
+ });
121
+ });
122
+
123
+ // Composed capture screen: camera slot + overlay + feedback + controls.
124
+ function renderCaptureContent(
125
+ overrides: Partial<UseSmileIDCaptureContentState>,
126
+ ) {
127
+ return render(
128
+ <UseSmileIDCaptureContent
129
+ state={{
130
+ captureType: CaptureType.selfie,
131
+ overlayState: UseSmileIDOverlayState.INSTRUCTION,
132
+ enableEnhancedLiveness: false,
133
+ animationDirection: null,
134
+ poseMatched: false,
135
+ feedbackKey: null,
136
+ showCaptureButton: false,
137
+ ...overrides,
138
+ }}
139
+ captureProgress={0}
140
+ cameraPreview={<View testID="camera-slot" />}
141
+ onStartCapture={() => {}}
142
+ startCaptureEnabled={true}
143
+ showAttribution={true}
144
+ onManualShutter={() => {}}
145
+ onGalleryUpload={() => {}}
146
+ />,
147
+ );
148
+ }
149
+
150
+ describe("selfie/capture content", () => {
151
+ it("selfie/capture/start_button", () => {
152
+ const tree = renderCaptureContent({
153
+ overlayState: UseSmileIDOverlayState.INSTRUCTION,
154
+ feedbackKey: "si_start_capture_instruction",
155
+ showCaptureButton: true,
156
+ });
157
+ expect(tree.toJSON()).toMatchSnapshot();
158
+ });
159
+ });
160
+
161
+ describe("document/capture content", () => {
162
+ const DOCUMENT_VARIANTS: ReadonlyArray<
163
+ [string, Partial<UseSmileIDCaptureContentState>]
164
+ > = [
165
+ ["card_front", { documentTypeKind: "genericDocument" }],
166
+ ["card_back", { documentTypeKind: "genericDocument", isBackSide: true }],
167
+ // TD3 passport data page ratio (125×88 mm).
168
+ ["passport", { documentTypeKind: "passport", knownIdAspectRatio: 1.42 }],
169
+ ["green_book", { documentTypeKind: "southAfricaGreenBook" }],
170
+ ];
171
+
172
+ it.each(DOCUMENT_VARIANTS)("document/capture/%s", (_name, overrides) => {
173
+ const tree = renderCaptureContent({
174
+ captureType: CaptureType.document,
175
+ overlayState: UseSmileIDOverlayState.IDLE,
176
+ knownIdAspectRatio: 1.586,
177
+ showGalleryUpload: true,
178
+ ...overrides,
179
+ });
180
+ expect(tree.toJSON()).toMatchSnapshot();
181
+ });
182
+
183
+ it("document/capture/manual_shutter", () => {
184
+ const tree = renderCaptureContent({
185
+ captureType: CaptureType.document,
186
+ overlayState: UseSmileIDOverlayState.DOCUMENT_TOO_FAR,
187
+ feedbackKey: "si_document_too_far",
188
+ documentTypeKind: "genericDocument",
189
+ knownIdAspectRatio: 1.586,
190
+ showManualShutter: true,
191
+ showGalleryUpload: true,
192
+ });
193
+ expect(tree.toJSON()).toMatchSnapshot();
194
+ });
195
+ });
196
+
197
+ describe("selfie/preview", () => {
198
+ it("selfie/preview/default", () => {
199
+ const tree = render(<UseSmileIDPreviewScreen />);
200
+ expect(tree.toJSON()).toMatchSnapshot();
201
+ });
202
+ });
203
+
204
+ describe("selfie/processing", () => {
205
+ it("selfie/processing/loading", () => {
206
+ const tree = render(
207
+ <UseSmileIDProcessingScreen state={{ kind: "loading" }} />,
208
+ );
209
+ expect(tree.toJSON()).toMatchSnapshot();
210
+ });
211
+
212
+ it("selfie/processing/success", () => {
213
+ const tree = render(
214
+ <UseSmileIDProcessingScreen
215
+ state={{ kind: "success", message: "Verification submitted" }}
216
+ />,
217
+ );
218
+ expect(tree.toJSON()).toMatchSnapshot();
219
+ });
220
+
221
+ it("selfie/processing/failed", () => {
222
+ const tree = render(
223
+ <UseSmileIDProcessingScreen
224
+ state={{ kind: "failed", errorMessage: "Network unavailable" }}
225
+ />,
226
+ );
227
+ expect(tree.toJSON()).toMatchSnapshot();
228
+ });
229
+ });
230
+ });
@@ -0,0 +1,103 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+
3
+ /**
4
+ * Boundary characterization for `UseSmileIDCameraSystem`'s lifecycle state machine
5
+ * (permission gating, running/streaming flags, lens config, listener fan-out). The
6
+ * frame loop is a vision-camera worklet pinned separately by
7
+ * `use_smile_id_frame_stream.test.ts`. Must hold byte-identically across any
8
+ * camera-implementation swap.
9
+ */
10
+ const permissions = vi.hoisted(() => ({
11
+ getStatus: vi.fn(),
12
+ request: vi.fn(),
13
+ }));
14
+
15
+ vi.mock("../camera_permissions", () => ({
16
+ getCameraPermissionStatus: permissions.getStatus,
17
+ requestCameraPermission: permissions.request,
18
+ }));
19
+
20
+ import { CameraLens } from "../camera_lens";
21
+ import { UseSmileIDCameraSystem } from "../use_smile_id_camera_system";
22
+
23
+ describe("UseSmileIDCameraSystem — boundary characterization", () => {
24
+ beforeEach(() => {
25
+ permissions.getStatus.mockReset();
26
+ permissions.request.mockReset();
27
+ });
28
+
29
+ it("starts idle with the configured lens", () => {
30
+ const system = new UseSmileIDCameraSystem(CameraLens.back);
31
+ const state = system.getState();
32
+ expect(state.isCameraRunning).toBe(false);
33
+ expect(state.isStreaming).toBe(false);
34
+ expect(state.hasPermission).toBe(false);
35
+ expect(state.currentLens).toBe(CameraLens.back);
36
+ });
37
+
38
+ it("start() runs + streams when permission is already granted (no re-prompt)", async () => {
39
+ permissions.getStatus.mockResolvedValue("granted");
40
+ const system = new UseSmileIDCameraSystem();
41
+ await system.start();
42
+ const state = system.getState();
43
+ expect(state.isCameraRunning).toBe(true);
44
+ expect(state.isStreaming).toBe(true);
45
+ expect(state.hasPermission).toBe(true);
46
+ expect(permissions.request).not.toHaveBeenCalled();
47
+ });
48
+
49
+ it("start() prompts when undetermined, then runs on grant", async () => {
50
+ permissions.getStatus.mockResolvedValue("undetermined");
51
+ permissions.request.mockResolvedValue("granted");
52
+ const system = new UseSmileIDCameraSystem();
53
+ await system.start();
54
+ expect(permissions.request).toHaveBeenCalledTimes(1);
55
+ expect(system.getState().isCameraRunning).toBe(true);
56
+ });
57
+
58
+ it("start() stays off when permission is denied", async () => {
59
+ permissions.getStatus.mockResolvedValue("undetermined");
60
+ permissions.request.mockResolvedValue("denied");
61
+ const system = new UseSmileIDCameraSystem();
62
+ await system.start();
63
+ const state = system.getState();
64
+ expect(state.isCameraRunning).toBe(false);
65
+ expect(state.hasPermission).toBe(false);
66
+ });
67
+
68
+ it("start() after release() throws — a released system is unusable", async () => {
69
+ permissions.getStatus.mockResolvedValue("granted");
70
+ const system = new UseSmileIDCameraSystem();
71
+ system.release();
72
+ await expect(system.start()).rejects.toThrow(/after release/);
73
+ });
74
+
75
+ it("stop() pauses running + streaming without releasing (re-startable)", async () => {
76
+ permissions.getStatus.mockResolvedValue("granted");
77
+ const system = new UseSmileIDCameraSystem();
78
+ await system.start();
79
+ system.stop();
80
+ const state = system.getState();
81
+ expect(state.isCameraRunning).toBe(false);
82
+ expect(state.isStreaming).toBe(false);
83
+ });
84
+
85
+ it("configure() swaps the lens and notifies subscribers", () => {
86
+ const system = new UseSmileIDCameraSystem(CameraLens.front);
87
+ const seenLenses: CameraLens[] = [];
88
+ system.subscribe((state) => seenLenses.push(state.currentLens));
89
+ system.configure({ lens: CameraLens.back });
90
+ expect(system.getState().currentLens).toBe(CameraLens.back);
91
+ expect(seenLenses).toContain(CameraLens.back);
92
+ });
93
+
94
+ it("unsubscribe stops further notifications", async () => {
95
+ permissions.getStatus.mockResolvedValue("granted");
96
+ const system = new UseSmileIDCameraSystem();
97
+ const listener = vi.fn();
98
+ const unsubscribe = system.subscribe(listener);
99
+ unsubscribe();
100
+ await system.start();
101
+ expect(listener).not.toHaveBeenCalled();
102
+ });
103
+ });
@@ -1,23 +1,25 @@
1
1
  /** Static camera tuning defaults. */
2
2
  export const CameraDefaults = {
3
- /** Focus running indicator visibility duration in ms. */
3
+ /** Focus running indicator visibility duration (ms). */
4
4
  focusRunningDurationMs: 600,
5
- /** Focus settled indicator visibility duration in ms. */
5
+ /** Focus settled indicator visibility duration (ms). */
6
6
  focusSettledDurationMs: 500,
7
7
 
8
- /** Pinned analysis-stream frame rate. 30 fps keeps head motion smooth and per-frame exposure low-ISO. */
8
+ /** Pinned analysis-stream frame rate; 30 fps keeps motion smooth at low ISO. */
9
9
  analysisTargetFps: 30,
10
- /** Analysis-stream resolution (landscape). Matches the scan sessions' tuned input; higher stutters the frame-processor thread without improving detection. */
10
+ /** Selfie analysis resolution (4:3 — the face/smile heuristics are calibrated on it). */
11
11
  analysisTargetResolution: { width: 640, height: 480 } as const,
12
+ /** Document analysis resolution (16:9, matched to the visible preview so the guide-rect crop stays aligned). */
13
+ documentAnalysisResolution: { width: 1280, height: 720 } as const,
12
14
 
13
- /** Longest-edge ceiling (px) for an imported document image; downscale-only, never upscale. Matches the native auto-capture resample target so every upload shares one byte policy. */
15
+ /** Longest-edge ceiling (px) for an imported document image; downscale-only. */
14
16
  documentMaxDimension: 1600,
15
- /** JPEG compression quality (0.0–1.0, `expo-image-manipulator`'s `compress`) for imported document images; matches the auto-capture artifact quality. */
17
+ /** JPEG quality (0–1) for imported document images. */
16
18
  documentJpegQuality: 0.85,
17
- /** Minimum shortest-edge (px) for a gallery document image; smaller is rejected pre-resample since upscaling yields unreadable artifacts. */
19
+ /** Minimum shortest-edge (px) for a gallery document image; smaller is rejected. */
18
20
  minGalleryDocumentDimensionPx: 600,
19
- /** Default selfie JPEG width (px) when no `sdk_config` override is present; also the `image_width` metadata fallback. */
21
+ /** Default selfie JPEG width (px); also the `image_width` metadata fallback. */
20
22
  selfieJpegTargetWidth: 480,
21
- /** Default selfie JPEG height (px) when no `sdk_config` override is present; also the `image_height` metadata fallback. */
23
+ /** Default selfie JPEG height (px); also the `image_height` metadata fallback. */
22
24
  selfieJpegTargetHeight: 640,
23
25
  } as const;
@@ -1,12 +1,11 @@
1
1
  import type { Orientation } from "react-native-vision-camera";
2
2
 
3
3
  /**
4
- * Map VisionCamera's gravity-derived device {@link Orientation} to the
5
- * clockwise degrees the native scan sessions expect (`0` = upright
6
- * portrait). Must reflect the physical device tilt — feed it from
7
- * `onOutputOrientationChanged` with `outputOrientation="device"`. Never
8
- * derive it from `frame.orientation`: that reports the sensor mounting,
9
- * not how the user is holding the phone.
4
+ * Map a VisionCamera {@link Orientation} to clockwise degrees (`0` = portrait).
5
+ * Feeds two callers: `onOutputOrientationChanged` (gravity tilt → the upright
6
+ * validator) and `onPreviewOrientationChanged` (locked viewport axis → the
7
+ * document `viewportOrientation` the frame processor uprights the capture to).
8
+ * Never use `frame.orientation` — that is the fixed sensor mounting.
10
9
  */
11
10
  export function orientationToDegrees(orientation: Orientation): number {
12
11
  switch (orientation) {
@@ -0,0 +1,67 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { DuplicateScreenTypeException } from "../duplicate_screen_type_exception";
4
+ import { InvalidSelfieCaptureConfigException } from "../invalid_selfie_capture_config_exception";
5
+ import { LivenessFrameCountException } from "../liveness_frame_count_exception";
6
+ import { UseSmileIDErrorCode } from "../use_smile_id_error_code";
7
+
8
+ /** Typed builder/validation exceptions: pin `errorCode`, message, and `errorDetails`. */
9
+ describe("DuplicateScreenTypeException", () => {
10
+ it("names the duplicated type + indices and freezes the details", () => {
11
+ const exception = new DuplicateScreenTypeException({
12
+ screenType: "consent",
13
+ indices: [0, 3],
14
+ });
15
+
16
+ expect(exception).toBeInstanceOf(Error);
17
+ expect(exception.errorCode).toBe(
18
+ UseSmileIDErrorCode.Builder.DuplicateScreenType,
19
+ );
20
+ expect(exception.message).toContain("consent");
21
+ expect(exception.message).toContain("0, 3");
22
+ expect(exception.errorDetails).toEqual({
23
+ screenType: "consent",
24
+ indices: [0, 3],
25
+ });
26
+ expect(Object.isFrozen(exception.errorDetails?.["indices"])).toBe(true);
27
+ });
28
+ });
29
+
30
+ describe("LivenessFrameCountException", () => {
31
+ it("reports expected vs actual frame counts", () => {
32
+ const exception = new LivenessFrameCountException({
33
+ expected: 8,
34
+ actual: 3,
35
+ });
36
+
37
+ expect(exception.errorCode).toBe(
38
+ UseSmileIDErrorCode.Validation.ConstraintViolation,
39
+ );
40
+ expect(exception.message).toContain("8");
41
+ expect(exception.message).toContain("3");
42
+ expect(exception.errorDetails).toEqual({ expected: 8, actual: 3 });
43
+ });
44
+ });
45
+
46
+ describe("InvalidSelfieCaptureConfigException", () => {
47
+ it("omits the reason suffix and details when no reason is given", () => {
48
+ const exception = new InvalidSelfieCaptureConfigException();
49
+
50
+ expect(exception.errorCode).toBe(
51
+ UseSmileIDErrorCode.Builder.InvalidSelfieCaptureConfig,
52
+ );
53
+ expect(exception.message).toContain("configuration is missing");
54
+ expect(exception.errorDetails).toBeUndefined();
55
+ });
56
+
57
+ it("appends the reason and carries it in details when provided", () => {
58
+ const exception = new InvalidSelfieCaptureConfigException({
59
+ reason: "minConfidence out of range",
60
+ });
61
+
62
+ expect(exception.message).toContain("minConfidence out of range");
63
+ expect(exception.errorDetails).toEqual({
64
+ reason: "minConfidence out of range",
65
+ });
66
+ });
67
+ });
@@ -0,0 +1,20 @@
1
+ import { UseSmileIDBuilderException } from "./use_smile_id_builder_exception";
2
+ import { UseSmileIDErrorCode } from "./use_smile_id_error_code";
3
+
4
+ /**
5
+ * Agent mode was combined with enhanced liveness. The head-turn challenge is
6
+ * validated for front-camera capture only, so the two options are mutually
7
+ * exclusive.
8
+ */
9
+ export class AgentModeWithEnhancedLivenessException extends UseSmileIDBuilderException {
10
+ readonly errorCode =
11
+ UseSmileIDErrorCode.Builder.AgentModeWithEnhancedLiveness;
12
+
13
+ constructor() {
14
+ super({
15
+ message: "allowAgentMode is not supported with enableEnhancedLiveness",
16
+ suggestedFix:
17
+ "Disable one of them inside selfie { }: allowAgentMode for rear-camera agent capture, or enableEnhancedLiveness for the head-turn challenge",
18
+ });
19
+ }
20
+ }
@@ -3,6 +3,7 @@
3
3
  * Each concrete class lives in its own file; this module keeps the
4
4
  * legacy import path stable.
5
5
  */
6
+ export { AgentModeWithEnhancedLivenessException } from "./agent_mode_with_enhanced_liveness_exception";
6
7
  export { InvalidSelfieCaptureConfigException } from "./invalid_selfie_capture_config_exception";
7
8
  export { InvalidDocumentCaptureConfigException } from "./invalid_document_capture_config_exception";
8
9
  export { InvalidMissingCaptureTypeException } from "./invalid_missing_capture_type_exception";
@@ -43,6 +43,7 @@ export { MissingCaptureForPreviewException } from "./missing_capture_for_preview
43
43
  export { DuplicateScreenTypeException } from "./duplicate_screen_type_exception";
44
44
 
45
45
  // Capture-config validation (`capture { }` block).
46
+ export { AgentModeWithEnhancedLivenessException } from "./agent_mode_with_enhanced_liveness_exception";
46
47
  export { InvalidSelfieCaptureConfigException } from "./invalid_selfie_capture_config_exception";
47
48
  export { InvalidDocumentCaptureConfigException } from "./invalid_document_capture_config_exception";
48
49
  export { InvalidMissingCaptureTypeException } from "./invalid_missing_capture_type_exception";
@@ -24,6 +24,7 @@ export const UseSmileIDErrorCode = {
24
24
  MissingScreenConfiguration: "BUILDER_MISSING_SCREEN_CONFIG",
25
25
  DuplicateScreenType: "BUILDER_DUPLICATE_SCREEN",
26
26
  InvalidSelfieCaptureConfig: "BUILDER_INVALID_SELFIE_CONFIG",
27
+ AgentModeWithEnhancedLiveness: "BUILDER_AGENT_MODE_WITH_ENHANCED_LIVENESS",
27
28
  InvalidDocumentCaptureConfig: "BUILDER_INVALID_DOCUMENT_CONFIG",
28
29
  MissingMLConfiguration: "BUILDER_MISSING_ML_CONFIG",
29
30
  MissingNetworkConfiguration: "BUILDER_MISSING_NETWORK_CONFIG",
@@ -5,21 +5,23 @@ import { DocumentType } from "../document_type";
5
5
  // / orientation drive both copy and capture behaviour). Pin them exactly so a
6
6
  // change forces a deliberate decision here and in the sibling SDKs.
7
7
  describe("DocumentType presets", () => {
8
- it("SouthAfricaGreenBook is a portrait, two-sided document", () => {
8
+ it("SouthAfricaGreenBook is a portrait, single-sided document", () => {
9
9
  expect(DocumentType.SouthAfricaGreenBook).toEqual({
10
10
  kind: "southAfricaGreenBook",
11
11
  displayName: "Green Book",
12
- hasBackSide: true,
12
+ hasBackSide: false,
13
13
  orientation: "Portrait",
14
+ knownAspectRatio: 320 / 428,
14
15
  });
15
16
  });
16
17
 
17
- it("Passport is a portrait, single-sided document", () => {
18
+ it("Passport is a landscape, two-sided document", () => {
18
19
  expect(DocumentType.Passport).toEqual({
19
20
  kind: "passport",
20
21
  displayName: "Passport",
21
- hasBackSide: false,
22
- orientation: "Portrait",
22
+ hasBackSide: true,
23
+ orientation: "Landscape",
24
+ knownAspectRatio: 356 / 272,
23
25
  });
24
26
  });
25
27
 
@@ -0,0 +1,26 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { FlowStep } from "../flow_step";
4
+ import { HEAD_TURN_DIRECTIONS } from "../head_turn_direction";
5
+
6
+ /** FlowStep + head-turn direction order is load-bearing (nav advances through it); pin it. */
7
+ describe("flow model constants", () => {
8
+ it("FlowStep lists the steps in forward-navigation order", () => {
9
+ expect(FlowStep).toEqual([
10
+ "instructions",
11
+ "consent",
12
+ "permission",
13
+ "capture",
14
+ "preview",
15
+ "processing",
16
+ ]);
17
+ });
18
+
19
+ it("HEAD_TURN_DIRECTIONS enumerates the three challenge directions in order", () => {
20
+ expect(HEAD_TURN_DIRECTIONS).toEqual([
21
+ "look_left",
22
+ "look_right",
23
+ "look_up",
24
+ ]);
25
+ });
26
+ });
@@ -1,3 +1,6 @@
1
+ import type * as ScreenOrientation from "expo-screen-orientation";
2
+ import type { GlobalPrivacyControl } from "./global_privacy_control";
3
+
1
4
  /**
2
5
  * Global SDK configuration flags. Snapshot produced by
3
6
  * `UseSmileIDConfigBuilder.build()` — every field is populated, with
@@ -33,4 +36,23 @@ export type ConfigOptions = {
33
36
  * `docs/Architecture.md § Rollout`.
34
37
  */
35
38
  readonly allowOfflineMode: boolean;
39
+
40
+ /**
41
+ * Partner-declared consent posture (`global_privacy_control`).
42
+ * `GlobalPrivacyControl.OptOut` (the default) forces the opt-out consent
43
+ * layout universally; `OptIn` keeps the legacy regional mechanics.
44
+ */
45
+ readonly globalPrivacyControl: GlobalPrivacyControl;
46
+
47
+ /**
48
+ * Orientation lock the SDK applies when a capture screen leaves the screen.
49
+ * Defaults to `PORTRAIT_UP`, the posture most hosts pin at their root
50
+ * layout; multi-orientation hosts set `DEFAULT` so the flow releases the
51
+ * clamp instead of leaving the app portrait-only after verification.
52
+ *
53
+ * Optional so a hand-written `ConfigOptions` literal still compiles; the
54
+ * builder always populates it, and an absent value takes the same
55
+ * `PORTRAIT_UP` default at the capture screen.
56
+ */
57
+ readonly exitOrientations?: ScreenOrientation.OrientationLock;
36
58
  };
@@ -44,3 +44,30 @@ export const DocumentCaptureMode = {
44
44
  });
45
45
  },
46
46
  } as const;
47
+
48
+ /**
49
+ * The wire token the server expects for the `auto_capture_enabled` builder-configuration field,
50
+ * keyed off the mode's `kind`. Lives with {@link DocumentCaptureMode} — its single source of
51
+ * truth — so the metadata layer maps the partner's typed choice straight onto the wire without a
52
+ * parallel enum. These exact strings are the server contract; changing them is a wire-breaking
53
+ * change. Not part of the public package surface (not re-exported from `index.ts`).
54
+ */
55
+ export function autoCaptureWireValue(
56
+ mode: DocumentCaptureMode | undefined,
57
+ ): string {
58
+ switch (mode?.kind) {
59
+ case "autoCapture":
60
+ return "auto_capture_only";
61
+ case "manualCapture":
62
+ return "manual";
63
+ case "autoCaptureWithManualFallback":
64
+ case undefined:
65
+ return "autocapture_default";
66
+ default: {
67
+ // Exhaustiveness guard: a new DocumentCaptureMode kind fails to compile here
68
+ // until it's handled above (`mode` narrows to `never` once all kinds are covered).
69
+ const exhaustive: never = mode;
70
+ return exhaustive;
71
+ }
72
+ }
73
+ }
@@ -26,15 +26,17 @@ export type DocumentType =
26
26
  const SOUTH_AFRICA_GREEN_BOOK: DocumentType = Object.freeze({
27
27
  kind: "southAfricaGreenBook",
28
28
  displayName: "Green Book",
29
- hasBackSide: true,
29
+ hasBackSide: false,
30
30
  orientation: "Portrait",
31
+ knownAspectRatio: 320 / 428,
31
32
  });
32
33
 
33
34
  const PASSPORT: DocumentType = Object.freeze({
34
35
  kind: "passport",
35
36
  displayName: "Passport",
36
- hasBackSide: false,
37
- orientation: "Portrait",
37
+ hasBackSide: true,
38
+ orientation: "Landscape",
39
+ knownAspectRatio: 356 / 272,
38
40
  });
39
41
 
40
42
  /** Configurable fields for {@link DocumentType.GenericDocument}. */
@@ -47,9 +49,9 @@ export type GenericDocumentArgs = {
47
49
 
48
50
  /** Preset values and the `GenericDocument` factory for {@link DocumentType}. */
49
51
  export const DocumentType = {
50
- /** South Africa Green Book — booklet-style, two-sided, portrait. */
52
+ /** South Africa Green Book — booklet-style, single-side, portrait. */
51
53
  SouthAfricaGreenBook: SOUTH_AFRICA_GREEN_BOOK,
52
- /** Passport — single data page, no back side, portrait (provisional values). */
54
+ /** Passport — landscape data page followed by a back-side capture. */
53
55
  Passport: PASSPORT,
54
56
  /** Catch-all without a preset; defaults to a landscape, two-sided "Document". */
55
57
  GenericDocument(args: GenericDocumentArgs = {}): DocumentType {