@smileid/usesmileid 12.2.0 → 12.3.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 (169) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/README.md +57 -18
  3. package/dist/camera/bounding_box_metering_region.d.ts +10 -0
  4. package/dist/camera/bounding_box_metering_region.js +1 -0
  5. package/dist/camera/camera_defaults.d.ts +0 -2
  6. package/dist/camera/camera_defaults.js +1 -1
  7. package/dist/camera/document_image_pipeline.d.ts +9 -0
  8. package/dist/camera/document_image_pipeline.js +1 -1
  9. package/dist/camera/imported_document_folder.d.ts +15 -0
  10. package/dist/camera/imported_document_folder.js +1 -0
  11. package/dist/camera/kamera_config_factory.d.ts +11 -1
  12. package/dist/camera/kamera_config_factory.js +1 -1
  13. package/dist/camera/use_smile_id_frame_stream.js +1 -1
  14. package/dist/camera/use_smile_id_kamera_camera_system.d.ts +46 -2
  15. package/dist/camera/use_smile_id_kamera_camera_system.js +1 -1
  16. package/dist/core/exception/use_smile_id_error_code.js +1 -1
  17. package/dist/core/exception/use_smile_id_network_exception.d.ts +10 -3
  18. package/dist/core/exception/use_smile_id_network_exception.js +1 -1
  19. package/dist/core/is_development_build.d.ts +6 -0
  20. package/dist/core/is_development_build.js +1 -0
  21. package/dist/core/models/config.d.ts +6 -0
  22. package/dist/core/models/ml_config.d.ts +1 -1
  23. package/dist/core/models/network_config.d.ts +4 -1
  24. package/dist/core/models/params.d.ts +8 -6
  25. package/dist/core/models/result.d.ts +11 -0
  26. package/dist/core/models/result.js +1 -1
  27. package/dist/core/perf/capture_perf_trace.d.ts +90 -0
  28. package/dist/core/perf/capture_perf_trace.js +1 -0
  29. package/dist/data/api/interceptors/logging_interceptor.js +1 -1
  30. package/dist/data/api/interceptors/smile_auth_interceptor.js +1 -1
  31. package/dist/data/api/request_capture.d.ts +16 -0
  32. package/dist/data/api/request_capture.js +1 -0
  33. package/dist/data/api/smile_id_api.d.ts +1 -1
  34. package/dist/data/api/smile_id_api.js +1 -1
  35. package/dist/data/factory/networking_factory.d.ts +3 -1
  36. package/dist/data/factory/networking_factory.js +1 -1
  37. package/dist/data/model/captured_job.d.ts +49 -0
  38. package/dist/data/model/captured_job.js +1 -0
  39. package/dist/data/model/job_request.d.ts +1 -1
  40. package/dist/data/model/sealed_job_request.d.ts +15 -0
  41. package/dist/data/model/sealed_job_request.js +1 -0
  42. package/dist/data/model/token_payload.d.ts +5 -7
  43. package/dist/data/model/token_payload.js +1 -1
  44. package/dist/data/model/user_details_payload.d.ts +6 -4
  45. package/dist/data/repository/use_smile_id_repository.d.ts +7 -0
  46. package/dist/data/repository/use_smile_id_repository_impl.d.ts +29 -2
  47. package/dist/data/repository/use_smile_id_repository_impl.js +1 -1
  48. package/dist/data/security/job_package_crypto.d.ts +41 -0
  49. package/dist/data/security/job_package_crypto.js +1 -0
  50. package/dist/data/security/job_package_sealer.d.ts +35 -0
  51. package/dist/data/security/job_package_sealer.js +1 -0
  52. package/dist/data/security/signing_crypto.d.ts +34 -0
  53. package/dist/data/security/signing_crypto.js +1 -1
  54. package/dist/data/util/retry_util.d.ts +9 -6
  55. package/dist/data/util/retry_util.js +1 -1
  56. package/dist/debug/selfie_preview_debug_geometry.d.ts +13 -13
  57. package/dist/debug/selfie_preview_debug_geometry.js +1 -1
  58. package/dist/debug/use_smile_id_debug.d.ts +25 -2
  59. package/dist/debug/use_smile_id_debug.js +1 -1
  60. package/dist/debug/use_smile_id_document_preview_debug_overlay.js +1 -1
  61. package/dist/debug/use_smile_id_selfie_preview_debug_overlay.d.ts +5 -1
  62. package/dist/debug/use_smile_id_selfie_preview_debug_overlay.js +1 -1
  63. package/dist/index.d.ts +4 -1
  64. package/dist/index.js +1 -1
  65. package/dist/l10n/strings_en.d.ts +3 -3
  66. package/dist/l10n/strings_en.js +2 -2
  67. package/dist/l10n/use_smile_id_localizations.d.ts +5 -7
  68. package/dist/l10n/use_smile_id_localizations.js +1 -1
  69. package/dist/metadata/metadata_configuration_mappers.d.ts +3 -5
  70. package/dist/metadata/metadata_configuration_mappers.js +1 -1
  71. package/dist/metadata/use_smile_id_metadata_factory.js +1 -1
  72. package/dist/presentation/assets/si_dark_lighting_animation.json +1 -927
  73. package/dist/presentation/assets/si_device_orientation_animation.json +1 -850
  74. package/dist/presentation/assets/si_document_green_book_hero_animation.json +1 -4740
  75. package/dist/presentation/assets/si_document_hero_animation.json +1 -4870
  76. package/dist/presentation/assets/si_document_hero_back_animation.json +1 -2122
  77. package/dist/presentation/assets/si_document_passport_hero_animation.json +1 -14540
  78. package/dist/presentation/assets/si_ess_all_directions_hero_animation.json +1 -5906
  79. package/dist/presentation/assets/si_ess_animation_all_directions.json +1 -5906
  80. package/dist/presentation/assets/si_selfie_hero_animation.json +1 -1468
  81. package/dist/presentation/assets/si_smile_to_capture_animation.json +1 -1412
  82. package/dist/presentation/components/helpers/captured_image_uri.d.ts +11 -0
  83. package/dist/presentation/components/helpers/captured_image_uri.js +1 -0
  84. package/dist/presentation/components/helpers/captured_oval_region.d.ts +40 -0
  85. package/dist/presentation/components/helpers/captured_oval_region.js +1 -0
  86. package/dist/presentation/components/helpers/document_interior_crop.d.ts +13 -2
  87. package/dist/presentation/components/helpers/document_interior_crop.js +1 -1
  88. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts +35 -29
  89. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js +1 -1
  90. package/dist/presentation/components/helpers/selfie_interior_crop.js +1 -1
  91. package/dist/presentation/components/use_smile_id_capture_content.d.ts +5 -2
  92. package/dist/presentation/components/use_smile_id_capture_content.js +1 -1
  93. package/dist/presentation/components/use_smile_id_captured_document_image.d.ts +8 -4
  94. package/dist/presentation/components/use_smile_id_captured_document_image.js +1 -1
  95. package/dist/presentation/components/use_smile_id_captured_image_oval.d.ts +6 -0
  96. package/dist/presentation/components/use_smile_id_captured_image_oval.js +1 -1
  97. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts +17 -7
  98. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js +1 -1
  99. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_direction_animation.d.ts +13 -14
  100. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_direction_animation.js +1 -1
  101. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_full_animation.js +1 -1
  102. package/dist/presentation/components/use_smile_id_face_oval_image.js +1 -1
  103. package/dist/presentation/flow/analytics/unsatisfied_reasons.d.ts +14 -0
  104. package/dist/presentation/flow/analytics/unsatisfied_reasons.js +1 -0
  105. package/dist/presentation/flow/analytics/use_smile_id_analytics_event.d.ts +8 -7
  106. package/dist/presentation/flow/analytics/use_smile_id_analytics_event.js +1 -1
  107. package/dist/presentation/flow/analytics/use_smile_id_analytics_event_kind.d.ts +9 -0
  108. package/dist/presentation/flow/analytics/use_smile_id_analytics_event_kind.js +1 -1
  109. package/dist/presentation/flow/config/flow_configuration_camera.d.ts +9 -0
  110. package/dist/presentation/flow/config/flow_configuration_camera.js +1 -0
  111. package/dist/presentation/flow/dsl/builder/config_builder.d.ts +6 -0
  112. package/dist/presentation/flow/dsl/builder/config_builder.js +1 -1
  113. package/dist/presentation/flow/dsl/builder/ml_builder.d.ts +1 -7
  114. package/dist/presentation/flow/dsl/builder/ml_builder.js +1 -1
  115. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts +0 -9
  116. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js +1 -1
  117. package/dist/presentation/flow/flow_navigation_manager.d.ts +39 -70
  118. package/dist/presentation/flow/flow_navigation_manager.js +1 -1
  119. package/dist/presentation/flow/flow_navigation_manager_analytics.d.ts +23 -0
  120. package/dist/presentation/flow/flow_navigation_manager_analytics.js +1 -0
  121. package/dist/presentation/flow/flow_navigation_manager_documents.d.ts +18 -0
  122. package/dist/presentation/flow/flow_navigation_manager_documents.js +1 -0
  123. package/dist/presentation/flow/flow_navigation_manager_job_request.d.ts +7 -0
  124. package/dist/presentation/flow/flow_navigation_manager_job_request.js +1 -0
  125. package/dist/presentation/flow/flow_navigation_manager_routing.d.ts +12 -0
  126. package/dist/presentation/flow/flow_navigation_manager_routing.js +1 -0
  127. package/dist/presentation/flow/flow_navigation_manager_submission.d.ts +17 -0
  128. package/dist/presentation/flow/flow_navigation_manager_submission.js +1 -0
  129. package/dist/presentation/flow/job_submission_state.d.ts +4 -0
  130. package/dist/presentation/flow/screen/helpers/face_session_config.d.ts +1 -1
  131. package/dist/presentation/flow/screen/helpers/failure_message.js +1 -1
  132. package/dist/presentation/flow/screen/orchestrated_capture_screen.js +1 -1
  133. package/dist/presentation/flow/screen/orchestrated_instructions_screen.js +1 -1
  134. package/dist/presentation/flow/screen/orchestrated_preview_screen.js +1 -1
  135. package/dist/presentation/flow/screen/orchestrated_processing_screen.js +1 -1
  136. package/dist/presentation/flow/use_smile_id_flow.js +1 -1
  137. package/dist/presentation/flow/validation/flow_validator.d.ts +0 -19
  138. package/dist/presentation/flow/validation/flow_validator.js +1 -1
  139. package/dist/presentation/flow/validation/job_type_validator.js +1 -1
  140. package/dist/presentation/screen/helpers/capture_screen_helpers.d.ts +0 -12
  141. package/dist/presentation/screen/helpers/capture_screen_helpers.js +1 -1
  142. package/dist/presentation/screen/helpers/capture_ui_state.d.ts +33 -6
  143. package/dist/presentation/screen/helpers/capture_ui_state.js +1 -1
  144. package/dist/presentation/screen/helpers/dropped_frames.d.ts +6 -0
  145. package/dist/presentation/screen/helpers/dropped_frames.js +1 -0
  146. package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts +2 -0
  147. package/dist/presentation/screen/helpers/ess_turn_haptics.js +1 -1
  148. package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts +5 -1
  149. package/dist/presentation/screen/helpers/instructions_screen_helpers.js +1 -1
  150. package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts +23 -1
  151. package/dist/presentation/screen/helpers/use_capture_orientation_lock.js +1 -1
  152. package/dist/presentation/screen/helpers/use_debounced_feedback_key.d.ts +1 -1
  153. package/dist/presentation/screen/helpers/use_debounced_feedback_key.js +1 -1
  154. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts +4 -1
  155. package/dist/presentation/screen/use_smile_id_capture_screen.js +1 -1
  156. package/dist/presentation/screen/use_smile_id_consent_screen.js +1 -1
  157. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts +3 -0
  158. package/dist/presentation/screen/use_smile_id_preview_screen.js +1 -1
  159. package/dist/presentation/screen/use_smile_id_processing_screen.d.ts +3 -0
  160. package/dist/presentation/screen/use_smile_id_processing_screen.js +1 -1
  161. package/dist/presentation/utils/locale_utils.d.ts +3 -6
  162. package/dist/presentation/utils/locale_utils.js +1 -1
  163. package/dist/testing/scenario_expectations.d.ts +7 -2
  164. package/dist/testing/scenario_expectations.js +1 -1
  165. package/dist/testing/scripted_scan_results.d.ts +2 -1
  166. package/dist/testing/scripted_scan_results.js +1 -1
  167. package/package.json +7 -7
  168. package/dist/presentation/flow/validation/user_details_validator.d.ts +0 -8
  169. package/dist/presentation/flow/validation/user_details_validator.js +0 -1
@@ -1 +1 @@
1
- "use strict";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{useState as y}from"react";import{StyleSheet as U,View as h}from"react-native";import{SafeAreaView as k}from"react-native-safe-area-context";import{useUseSmileIDTheme as x}from"../theme/theme_context";import{defaultFrameAspectRatio as v}from"../../core/models/document_type";import{ATTRIBUTION_TEST_ID as w,UseSmileIDAttribution as R}from"../components/use_smile_id_attribution";import{UseSmileIDCapturedDocumentImage as b}from"../components/use_smile_id_captured_document_image";import{UseSmileIDCapturedImageOval as A}from"../components/use_smile_id_captured_image_oval";import{UseSmileIDCardSurface as E}from"../components/use_smile_id_card_surface";import{UseSmileIDFailedContent as F}from"../components/use_smile_id_failed_content";import{UseSmileIDLoadingContent as T}from"../components/use_smile_id_loading_content";import{UseSmileIDStatusIndicator as m}from"../components/use_smile_id_status_indicator";import{UseSmileIDSuccessContent as L}from"../components/use_smile_id_success_content";import{useUseSmileIDLocalizations as B}from"../../l10n/use_smile_id_localizations_provider";function l(e){switch(e){case"loading":return"loading";case"success":return"success";case"failed":return"failure"}}export function UseSmileIDProcessingScreen(e){const f=x(),t=e.theme??f,a=B(),I=e.showAttribution??!0,_=e.showFaceOval??!0,[u,S]=y({width:0,height:0}),D=g=>{S({width:g.nativeEvent.layout.width,height:g.nativeEvent.layout.height})},C=typeof e.capturedSelfiePath=="string"&&e.capturedSelfiePath.length>0,d=typeof e.documentImageUri=="string"&&e.documentImageUri.length>0,c=e.continueButton,i=e.retryButton,o=e.exitButton;return r(k,{style:[s.root,{backgroundColor:t.colors.background}],testID:"si_processing_screen",onLayout:D,children:[d?n(b,{aspectRatio:e.documentAspectRatio??v("Landscape"),...e.documentImageUri?{uri:e.documentImageUri}:{},...e.documentBorderFraction!==void 0?{borderFraction:e.documentBorderFraction}:{},imageTestID:"si_processing_document_image",imageAccessibilityLabel:a.siCdCapturedImage,overlayChild:n(m,{state:l(e.state.kind),theme:t,testID:"si_processing_center_indicator"}),theme:t}):_?n(A,{screenWidth:u.width,screenHeight:u.height,...C&&e.capturedSelfiePath?{uri:e.capturedSelfiePath}:{},imageTestID:"si_processing_image",imageAccessibilityLabel:a.siCdCapturedImage,overlayChild:n(m,{state:l(e.state.kind),theme:t,testID:"si_processing_center_indicator"}),theme:t}):n(h,{style:s.noOvalRegion,testID:"si_processing_no_oval_region",children:n(m,{state:l(e.state.kind),theme:t,testID:"si_processing_center_indicator"})}),r(E,{theme:t,style:s.card,children:[e.state.kind==="loading"?n(T,{theme:t,testID:"si_processing_loading_content"}):null,e.state.kind==="success"?n(L,{theme:t,...d?{title:a.siDocumentProcessingComplete}:{},...e.state.message!==void 0?{message:e.state.message}:{},...e.onContinue&&!c?{onContinue:e.onContinue}:{},testID:"si_processing_success_content"}):null,e.state.kind==="failed"?n(F,{theme:t,...e.state.errorMessage!==void 0?{errorMessage:e.state.errorMessage}:{},...e.onRetry&&!i?{onRetry:e.onRetry}:{},...e.onExit&&!o?{onExit:e.onExit}:{},testID:"si_processing_failed_content"}):null,e.state.kind==="success"&&c&&e.onContinue?c({onClick:e.onContinue}):null,e.state.kind==="failed"&&(i||o)?r(h,{style:[s.actionStack,{gap:t.spacing.small}],children:[i&&e.onRetry?i({onClick:e.onRetry}):null,o&&e.onExit?o({onClick:e.onExit}):null]}):null]}),I?n(R,{theme:t,testID:w}):null]})}const s=U.create({root:{flex:1,overflow:"hidden"},noOvalRegion:{flex:1,alignItems:"center",justifyContent:"center"},card:{alignItems:"center"},actionStack:{alignSelf:"stretch"}});
1
+ "use strict";import{jsx as n,jsxs as r}from"react/jsx-runtime";import{useState as D}from"react";import{StyleSheet as U,View as h}from"react-native";import{SafeAreaView as k}from"react-native-safe-area-context";import{useUseSmileIDTheme as x}from"../theme/theme_context";import{defaultFrameAspectRatio as v}from"../../core/models/document_type";import{ATTRIBUTION_TEST_ID as w,UseSmileIDAttribution as R}from"../components/use_smile_id_attribution";import{UseSmileIDCapturedDocumentImage as b}from"../components/use_smile_id_captured_document_image";import{UseSmileIDCapturedImageOval as A}from"../components/use_smile_id_captured_image_oval";import{UseSmileIDCardSurface as E}from"../components/use_smile_id_card_surface";import{UseSmileIDFailedContent as F}from"../components/use_smile_id_failed_content";import{UseSmileIDLoadingContent as T}from"../components/use_smile_id_loading_content";import{UseSmileIDStatusIndicator as m}from"../components/use_smile_id_status_indicator";import{UseSmileIDSuccessContent as L}from"../components/use_smile_id_success_content";import{useUseSmileIDLocalizations as B}from"../../l10n/use_smile_id_localizations_provider";function l(e){switch(e){case"loading":return"loading";case"success":return"success";case"failed":return"failure"}}export function UseSmileIDProcessingScreen(e){const f=x(),t=e.theme??f,a=B(),I=e.showAttribution??!0,_=e.showFaceOval??!0,[u,S]=D({width:0,height:0}),y=g=>{S({width:g.nativeEvent.layout.width,height:g.nativeEvent.layout.height})},C=typeof e.capturedSelfiePath=="string"&&e.capturedSelfiePath.length>0,d=typeof e.documentImageUri=="string"&&e.documentImageUri.length>0,c=e.continueButton,i=e.retryButton,o=e.exitButton;return r(k,{style:[s.root,{backgroundColor:t.colors.background}],testID:"si_processing_screen",onLayout:y,children:[d?n(b,{aspectRatio:e.documentAspectRatio??v("Landscape"),...e.documentImageUri?{uri:e.documentImageUri}:{},...e.documentBorderFraction!==void 0?{borderFraction:e.documentBorderFraction}:{},imageTestID:"si_processing_document_image",imageAccessibilityLabel:a.siCdCapturedImage,overlayChild:n(m,{state:l(e.state.kind),theme:t,testID:"si_processing_center_indicator"}),theme:t}):_?n(A,{screenWidth:u.width,screenHeight:u.height,...e.selfieCaptureGeometry?{captureGeometry:e.selfieCaptureGeometry}:{},...C&&e.capturedSelfiePath?{uri:e.capturedSelfiePath}:{},imageTestID:"si_processing_image",imageAccessibilityLabel:a.siCdCapturedImage,overlayChild:n(m,{state:l(e.state.kind),theme:t,testID:"si_processing_center_indicator"}),theme:t}):n(h,{style:s.noOvalRegion,testID:"si_processing_no_oval_region",children:n(m,{state:l(e.state.kind),theme:t,testID:"si_processing_center_indicator"})}),r(E,{theme:t,style:s.card,children:[e.state.kind==="loading"?n(T,{theme:t,testID:"si_processing_loading_content"}):null,e.state.kind==="success"?n(L,{theme:t,...d?{title:a.siDocumentProcessingComplete}:{},...e.state.message!==void 0?{message:e.state.message}:{},...e.onContinue&&!c?{onContinue:e.onContinue}:{},testID:"si_processing_success_content"}):null,e.state.kind==="failed"?n(F,{theme:t,...e.state.errorMessage!==void 0?{errorMessage:e.state.errorMessage}:{},...e.onRetry&&!i?{onRetry:e.onRetry}:{},...e.onExit&&!o?{onExit:e.onExit}:{},testID:"si_processing_failed_content"}):null,e.state.kind==="success"&&c&&e.onContinue?c({onClick:e.onContinue}):null,e.state.kind==="failed"&&(i||o)?r(h,{style:[s.actionStack,{gap:t.spacing.small}],children:[i&&e.onRetry?i({onClick:e.onRetry}):null,o&&e.onExit?o({onClick:e.onExit}):null]}):null]}),I?n(R,{theme:t,testID:w}):null]})}const s=U.create({root:{flex:1,overflow:"hidden"},noOvalRegion:{flex:1,alignItems:"center",justifyContent:"center"},card:{alignItems:"center"},actionStack:{alignSelf:"stretch"}});
@@ -1,11 +1,8 @@
1
1
  import { GlobalPrivacyControl } from "../../core/models/global_privacy_control";
2
2
  /**
3
- * Returns the device's resolved BCP-47 locale tag (e.g. `"en-US"`).
4
- *
5
- * Uses the JS engine's `Intl` resolved options, which on Hermes
6
- * (Expo SDK 51+, with `enableHermesLocaleAPI` enabled by default) and
7
- * JSC reflects the system locale. Returns an empty string if `Intl`
8
- * is unavailable — callers then treat the locale as non-EU.
3
+ * Returns the device's current BCP-47 locale tag (e.g. `"en-US"`): the native module's reading,
4
+ * which follows a language change while the app runs, else `Intl`, which keeps the launch locale.
5
+ * Empty if neither is available — callers then treat the locale as non-EU.
9
6
  */
10
7
  export declare function getDeviceLocale(): string;
11
8
  /**
@@ -1 +1 @@
1
- "use strict";import{GlobalPrivacyControl as n}from"../../core/models/global_privacy_control";const o=new Set(["AT","BE","BG","HR","CY","CZ","DK","EE","FI","FR","DE","GR","HU","IE","IT","LV","LT","LU","MT","NL","PL","PT","RO","SK","SI","ES","SE"]);export function getDeviceLocale(){try{return Intl.DateTimeFormat().resolvedOptions().locale}catch{return""}}export function isDeviceLocaleInEU(e=getDeviceLocale()){const t=e.split("-")[1]?.toUpperCase();return t!==void 0&&o.has(t)}export function getDefaultConsentState(e=n.OptOut,t=getDeviceLocale()){return e===n.OptOut?!0:!isDeviceLocaleInEU(t)}
1
+ "use strict";import{CurrentLocaleProvider as o}from"@smileid/usesmileid_bridge/internal";import{GlobalPrivacyControl as r}from"../../core/models/global_privacy_control";const n=new Set(["AT","BE","BG","HR","CY","CZ","DK","EE","FI","FR","DE","GR","HU","IE","IT","LV","LT","LU","MT","NL","PL","PT","RO","SK","SI","ES","SE"]);export function getDeviceLocale(){const t=o.currentLocale();if(t)return t;try{return Intl.DateTimeFormat().resolvedOptions().locale}catch{return""}}export function isDeviceLocaleInEU(t=getDeviceLocale()){const e=t.split("-")[1]?.toUpperCase();return e!==void 0&&n.has(e)}export function getDefaultConsentState(t=r.OptOut,e=getDeviceLocale()){return t===r.OptOut?!0:!isDeviceLocaleInEU(e)}
@@ -8,8 +8,13 @@ export interface ScenarioExpectations {
8
8
  readonly screens: readonly string[];
9
9
  /** Ordered analytics event types that must fire (subset-in-order). */
10
10
  readonly events: readonly string[];
11
- /** How the capture session ends. */
12
- readonly terminal?: "submitted" | "timeout" | "unsatisfied";
11
+ /**
12
+ * How the capture session ends. `running`: the capture keeps looking until
13
+ * the user leaves, since a selfie or document capture has no time limit.
14
+ * `timeout` is no longer produced (a capture has no time limit) and is kept
15
+ * only so an older scenario still parses.
16
+ */
17
+ readonly terminal?: "submitted" | "captured" | "running" | "unsatisfied" | "timeout";
13
18
  }
14
19
  /**
15
20
  * Extracts and validates the `expected` block from an already-parsed shared
@@ -1 +1 @@
1
- "use strict";const i=new Set(["submitted","timeout","unsatisfied"]);export function parseScenarioExpectations(e){if(typeof e!="object"||e===null)throw new Error("scenario must be a JSON object");const n=e.expected;if(n===void 0)return{screens:[],events:[]};if(typeof n!="object"||n===null)throw new Error("scenario.expected must be an object when present");const r=n,t=c(r.screens,"scenario.expected.screens"),s=c(r.events,"scenario.expected.events"),o=r.terminal;if(o===void 0)return{screens:t,events:s};if(typeof o!="string"||!i.has(o))throw new Error(`scenario.expected.terminal must be one of ${[...i].join(", ")}, got ${String(o)}`);return{screens:t,events:s,terminal:o}}function c(e,n){if(e===void 0)return[];if(!Array.isArray(e)||e.some(r=>typeof r!="string"))throw new Error(`${n} must be an array of strings`);return e}export function expectSubsetInOrder(e,n,r="sequence"){let t=0;for(const s of e)t<n.length&&s===n[t]&&(t+=1);if(t!==n.length)throw new Error(`${r}: expected [${n.slice(t).join(", ")}] to appear in order within [${e.join(", ")}]`)}
1
+ "use strict";const s=new Set(["submitted","captured","running","unsatisfied","timeout"]);export function parseScenarioExpectations(e){if(typeof e!="object"||e===null)throw new Error("scenario must be a JSON object");const n=e.expected;if(n===void 0)return{screens:[],events:[]};if(typeof n!="object"||n===null)throw new Error("scenario.expected must be an object when present");const t=n,r=c(t.screens,"scenario.expected.screens"),i=c(t.events,"scenario.expected.events"),o=t.terminal;if(o===void 0)return{screens:r,events:i};if(typeof o!="string"||!s.has(o))throw new Error(`scenario.expected.terminal must be one of ${[...s].join(", ")}, got ${String(o)}`);return{screens:r,events:i,terminal:o}}function c(e,n){if(e===void 0)return[];if(!Array.isArray(e)||e.some(t=>typeof t!="string"))throw new Error(`${n} must be an array of strings`);return e}export function expectSubsetInOrder(e,n,t="sequence"){let r=0;for(const i of e)r<n.length&&i===n[r]&&(r+=1);if(r!==n.length)throw new Error(`${t}: expected [${n.slice(r).join(", ")}] to appear in order within [${e.join(", ")}]`)}
@@ -7,7 +7,8 @@ import type { ScriptedScenario } from "./fake_face_analyzer";
7
7
  * native frame-processor concern; pixels never reach JS).
8
8
  *
9
9
  * `noFace` → `initial`; `faceTooFar` / `faceCentered` → `found`; `headTurn*` →
10
- * `headTurn` with the direction (`poseMatched` on the held frame); a centered
10
+ * `headTurn` with the direction and a `turnProgress` rising to 1 across the
11
+ * step's frames (`poseMatched` on the held frame); a centered
11
12
  * step between two turns opens on the `si_ess_look_at_camera` re-center gate;
12
13
  * `satisfied` → one `finished` result carrying a `selfie` event plus
13
14
  * [livenessCount] `liveness` events at opaque `file://` URLs the screen never
@@ -1 +1 @@
1
- "use strict";import{CaptureReadyEventKind as m,UseSmileIDScanStateType as r}from"@smileid/usesmileid_bridge";const f={headTurnLeft:"left",headTurnRight:"right",headTurnUp:"up"};export function scriptedFaceScanResults(u,i={}){const t=i.livenessCount??2,n={faces:[],brightness:128},s=[],d=u.steps;for(const[p,c]of d.entries()){const o=c.holdFrames??1;if(c.emit==="satisfied")return s.push({output:n,state:{type:r.Finished},capturedEvents:T(t)}),s;const l=f[c.emit];if(l!==void 0){for(let e=0;e<o;e++)s.push({output:n,state:{type:r.HeadTurn,currentDirection:l,...e===o-1?{poseMatched:!0}:{}},capturedEvents:[]});continue}const h=d[p-1]?.emit,a=E(d,p);if(c.emit==="faceCentered"&&h!==void 0&&f[h]!==void 0&&a!==void 0){s.push({output:n,state:{type:r.HeadTurn,currentDirection:a,feedback:"si_ess_look_at_camera"},capturedEvents:[]});for(let e=1;e<o;e++)s.push({output:n,state:{type:r.HeadTurn,currentDirection:a},capturedEvents:[]});continue}const v=c.emit==="noFace"?r.Initial:r.Found;for(let e=0;e<o;e++)s.push({output:n,state:{type:v},capturedEvents:[]})}return s}function E(u,i){for(const t of u.slice(i+1)){const n=f[t.emit];if(n!==void 0)return n}}function T(u){const i=[{kind:m.Selfie,captureIndex:0,url:"file://selfie-0.jpg"}];for(let t=1;t<=u;t++)i.push({kind:m.Liveness,captureIndex:t,url:`file://liveness-${t}.jpg`});return i}
1
+ "use strict";import{CaptureReadyEventKind as m,UseSmileIDScanStateType as i}from"@smileid/usesmileid_bridge";const f={headTurnLeft:"left",headTurnRight:"right",headTurnUp:"up"};export function scriptedFaceScanResults(u,r={}){const t=r.livenessCount??2,n={faces:[],brightness:128},s=[],d=u.steps;for(const[p,o]of d.entries()){const c=o.holdFrames??1;if(o.emit==="satisfied")return s.push({output:n,state:{type:i.Finished},capturedEvents:T(t)}),s;const l=f[o.emit];if(l!==void 0){for(let e=0;e<c;e++)s.push({output:n,state:{type:i.HeadTurn,currentDirection:l,turnProgress:(e+1)/c,...e===c-1?{poseMatched:!0}:{}},capturedEvents:[]});continue}const h=d[p-1]?.emit,a=E(d,p);if(o.emit==="faceCentered"&&h!==void 0&&f[h]!==void 0&&a!==void 0){s.push({output:n,state:{type:i.HeadTurn,currentDirection:a,feedback:"si_ess_look_at_camera"},capturedEvents:[]});for(let e=1;e<c;e++)s.push({output:n,state:{type:i.HeadTurn,currentDirection:a},capturedEvents:[]});continue}const v=o.emit==="noFace"?i.Initial:i.Found;for(let e=0;e<c;e++)s.push({output:n,state:{type:v},capturedEvents:[]})}return s}function E(u,r){for(const t of u.slice(r+1)){const n=f[t.emit];if(n!==void 0)return n}}function T(u){const r=[{kind:m.Selfie,captureIndex:0,url:"file://selfie-0.jpg"}];for(let t=1;t<=u;t++)r.push({kind:m.Liveness,captureIndex:t,url:`file://liveness-${t}.jpg`});return r}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smileid/usesmileid",
3
- "version": "12.2.0",
3
+ "version": "12.3.0",
4
4
  "description": "Official Smile ID React Native (Expo) SDK for identity verification: selfie capture, liveness checks, and document verification powered by on-device ML.",
5
5
  "homepage": "https://usesmileid.com",
6
6
  "repository": {
@@ -48,11 +48,11 @@
48
48
  "CHANGELOG.md"
49
49
  ],
50
50
  "dependencies": {
51
- "@smileid/kamera": "1.1.0",
51
+ "@smileid/kamera": "1.2.0",
52
52
  "axios": "^1.20.0",
53
53
  "zod": "^4.6.5",
54
- "@smileid/usesmileid_bridge": "12.2.0",
55
- "@smileid/usesmileid_platform_interface": "12.2.0"
54
+ "@smileid/usesmileid_bridge": "12.3.0",
55
+ "@smileid/usesmileid_platform_interface": "12.3.0"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "@react-native-async-storage/async-storage": ">=1.21.0",
@@ -105,9 +105,9 @@
105
105
  }
106
106
  },
107
107
  "devDependencies": {
108
- "@smileid/kamera-testing": "1.1.0",
108
+ "@smileid/kamera-testing": "1.2.0",
109
109
  "@types/react": "^19.2.18",
110
- "expo": "~57.0.25",
110
+ "expo": "~57.0.26",
111
111
  "expo-brightness": "~57.0.2",
112
112
  "expo-file-system": "~57.0.7",
113
113
  "expo-font": "~57.0.4",
@@ -115,7 +115,7 @@
115
115
  "expo-image-manipulator": "~57.0.20",
116
116
  "expo-image-picker": "~57.0.20",
117
117
  "expo-keep-awake": "~57.0.2",
118
- "expo-modules-core": "^57.0.19",
118
+ "expo-modules-core": "^57.0.21",
119
119
  "expo-screen-orientation": "~57.0.2",
120
120
  "jpeg-js": "^0.4.4",
121
121
  "lottie-react-native": "~7.5.0",
@@ -1,8 +0,0 @@
1
- import type { UserDetails } from "../../../core/models/params";
2
- import type { TokenPayload } from "../../../data/model/token_payload";
3
- import type { ValidationIssue } from "./validation_state";
4
- /**
5
- * Field-union rule shared by the content validator and the job-type required
6
- * rule: a field is covered when the token binds it or the builder supplies it.
7
- */
8
- export declare function missingUserDetailsFieldIssues(userDetails: UserDetails | undefined, tokenPayload: TokenPayload | undefined): ValidationIssue[];
@@ -1 +0,0 @@
1
- "use strict";import{InvalidFieldValueException as o}from"../../../core/exception/job_validation_exceptions";export function missingUserDetailsFieldIssues(n,e){const t=[],a=e===void 0?"must not be blank":"not bound by the token and not supplied on the builder",m={givenNames:e?.hasGivenNames===!0,lastName:e?.hasLastName===!0};for(const s of["givenNames","lastName"]){if(m[s])continue;const i=n?.[s];(!i||!i.trim())&&t.push(new o({fieldName:`userDetails.${s}`,reason:a}))}const u=!!n?.email&&n.email.trim().length>0,l=!!n?.phoneNumber&&n.phoneNumber.trim().length>0,r=e?.hasEmail===!0||e?.hasPhoneNumber===!0;return!u&&!l&&!r&&t.push(new o({fieldName:"userDetails",reason:e===void 0?"at least one of email or phoneNumber must be non blank":"at least one contact field must be bound by the token or supplied on the builder"})),t}