datakeen-session-react 1.1.195-dev.8 → 1.1.195-dev.9

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 (878) hide show
  1. package/README.md +1 -17
  2. package/dist/cjs/_virtual/_commonjsHelpers.js +0 -1
  3. package/dist/cjs/_virtual/heic2any.js +0 -1
  4. package/dist/cjs/_virtual/heic2any2.js +0 -1
  5. package/dist/cjs/assets/Face Scan Square.svg.js +0 -1
  6. package/dist/cjs/assets/Lightbulb.svg.js +0 -1
  7. package/dist/cjs/assets/Monitor Camera.svg.js +0 -1
  8. package/dist/cjs/assets/User Hands.svg.js +0 -1
  9. package/dist/cjs/assets/before-document.png.js +0 -1
  10. package/dist/cjs/assets/before-passport.png.js +0 -1
  11. package/dist/cjs/assets/before-photo.png.js +0 -1
  12. package/dist/cjs/assets/before-verso.png.js +0 -1
  13. package/dist/cjs/assets/check.svg.js +0 -1
  14. package/dist/cjs/assets/icons/shield_magic_link.svg.js +0 -1
  15. package/dist/cjs/assets/selfietake.svg.js +0 -1
  16. package/dist/cjs/components/DatakeenSession.js +0 -1
  17. package/dist/cjs/components/document-collection/DocumentCollection.js +0 -1
  18. package/dist/cjs/components/document-collection/DocumentCollectionIntroduction.js +0 -1
  19. package/dist/cjs/components/document-collection/DocumentCollectionMethodSelection.js +0 -1
  20. package/dist/cjs/components/document-collection/DocumentCollectionSelection.js +0 -1
  21. package/dist/cjs/components/document-collection/DocumentCollectionUpload.js +0 -1
  22. package/dist/cjs/components/document-collection/DocumentError.js +0 -1
  23. package/dist/cjs/components/document-collection/DocumentProcessing.js +0 -1
  24. package/dist/cjs/components/document-collection/DocumentSuccess.js +0 -1
  25. package/dist/cjs/components/document-video/DocumentVideoCapture.js +0 -1
  26. package/dist/cjs/components/document-video/DocumentVideoConfirmation.js +0 -1
  27. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoFlow.js +0 -1
  28. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoInstructions.js +0 -1
  29. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoProcessing.js +0 -1
  30. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoRecorder.js +0 -1
  31. package/dist/cjs/components/icons/ElectronicIcon.js +0 -1
  32. package/dist/cjs/components/icons/PoweredByIcon.js +0 -1
  33. package/dist/cjs/components/icons/PreIntroIcon.js +0 -1
  34. package/dist/cjs/components/icons/StartIcon.js +0 -1
  35. package/dist/cjs/components/id-check/BeforePhoto.js +0 -1
  36. package/dist/cjs/components/id-check/BeforeVersoPhoto.js +0 -1
  37. package/dist/cjs/components/id-check/CameraError.js +0 -1
  38. package/dist/cjs/components/id-check/CameraMask.js +0 -1
  39. package/dist/cjs/components/id-check/OrientationToggle.js +0 -1
  40. package/dist/cjs/components/id-check/Photo.js +0 -1
  41. package/dist/cjs/components/id-check/PhotoConfirmation.js +0 -1
  42. package/dist/cjs/components/id-check/PhotoPreview.js +0 -1
  43. package/dist/cjs/components/jdi/JDDWorkInProgress.js +0 -1
  44. package/dist/cjs/components/jdi/JDICountrySelection.js +0 -1
  45. package/dist/cjs/components/jdi/JDIDocumentSelection.js +0 -1
  46. package/dist/cjs/components/jdi/JDIDocumentUpload.js +0 -1
  47. package/dist/cjs/components/jdi/JDIError.js +0 -1
  48. package/dist/cjs/components/jdi/JDIPreIntroduction.js +0 -1
  49. package/dist/cjs/components/jdi/JDIProcessing.js +0 -1
  50. package/dist/cjs/components/jdi/JDISuccess.js +0 -1
  51. package/dist/cjs/components/legal-consent/LegalConsentNode.js +0 -1
  52. package/dist/cjs/components/nfc-scan/BiometricSymbol.js +0 -1
  53. package/dist/cjs/components/nfc-scan/NfcChipGate.js +0 -1
  54. package/dist/cjs/components/nfc-scan/NfcFallbackSurvey.js +0 -1
  55. package/dist/cjs/components/nfc-scan/NfcOnboardingNotice.js +0 -1
  56. package/dist/cjs/components/nfc-scan/NfcScanNode.js +0 -1
  57. package/dist/cjs/components/nfc-scan/NfcSuccessAnimation.js +0 -1
  58. package/dist/cjs/components/nfc-scan/PuceCniSymbol.js +0 -1
  59. package/dist/cjs/components/selfie/SelfieConfirmation.js +0 -1
  60. package/dist/cjs/components/selfie/Video.css.js +0 -1
  61. package/dist/cjs/components/selfie/Video.js +0 -1
  62. package/dist/cjs/components/selfie/VideoFixes.css.js +0 -1
  63. package/dist/cjs/components/selfie/VideoResetStyles.js +0 -1
  64. package/dist/cjs/components/selfie/hooks/useLiveFrameCapture.js +0 -1
  65. package/dist/cjs/components/selfie/hooks/useVideoRecorderStyles.js +0 -1
  66. package/dist/cjs/components/selfie/selfie-flow/InstructionsSelfie.js +0 -1
  67. package/dist/cjs/components/selfie/selfie-flow/SelfieFlow.js +0 -1
  68. package/dist/cjs/components/selfie/selfie-flow/SelfiePreIntroduction.js +0 -1
  69. package/dist/cjs/components/selfie/selfie-flow/SelfieProcessing.js +0 -1
  70. package/dist/cjs/components/selfie/selfie-flow/SelfieRecorder.js +0 -1
  71. package/dist/cjs/components/selfie/utils/selfieCaptureUtils.js +0 -1
  72. package/dist/cjs/components/selfie/utils/unisseyStrings.js +0 -1
  73. package/dist/cjs/components/selfie/utils/videoElementStyles.js +0 -1
  74. package/dist/cjs/components/session/DocumentCheck.js +0 -1
  75. package/dist/cjs/components/session/EndFlow.js +0 -1
  76. package/dist/cjs/components/session/MobileRedirect.js +0 -1
  77. package/dist/cjs/components/session/PdfGeneration.js +0 -1
  78. package/dist/cjs/components/session/Selfie.js +0 -1
  79. package/dist/cjs/components/session/SessionContent.js +0 -1
  80. package/dist/cjs/components/session/SessionExpired.js +0 -1
  81. package/dist/cjs/components/session/StartSession.js +0 -1
  82. package/dist/cjs/components/session/UserInputForm/AddressFields.js +0 -1
  83. package/dist/cjs/components/session/UserInputForm/ContactFields.js +0 -1
  84. package/dist/cjs/components/session/UserInputForm/CustomFormFields.js +0 -1
  85. package/dist/cjs/components/session/UserInputForm/DatePickerField.js +0 -1
  86. package/dist/cjs/components/session/UserInputForm/IdentityFields.js +0 -1
  87. package/dist/cjs/components/session/UserInputForm/LegalEntityFields.js +0 -1
  88. package/dist/cjs/components/session/UserInputForm/LegalRepFields.js +0 -1
  89. package/dist/cjs/components/session/UserInputForm/NationalityField.js +0 -1
  90. package/dist/cjs/components/session/UserInputForm.js +0 -1
  91. package/dist/cjs/components/session/VideoWorkInProgress.js +0 -1
  92. package/dist/cjs/components/session/controleJdiPolicy.js +0 -1
  93. package/dist/cjs/components/session/endScreenIcons.js +0 -1
  94. package/dist/cjs/components/signature-electronic/DocusealSignature.js +0 -1
  95. package/dist/cjs/components/signature-electronic/SignatureElectronic.js +0 -1
  96. package/dist/cjs/components/signature-electronic/SignatureElectronicIntroduction.js +0 -1
  97. package/dist/cjs/components/signature-electronic/SignedDocumentPreview.js +0 -1
  98. package/dist/cjs/components/start-flow/Start.js +0 -1
  99. package/dist/cjs/components/states/ErrorState.js +0 -1
  100. package/dist/cjs/components/states/LoadingState.js +0 -1
  101. package/dist/cjs/components/states/NoSessionIdState.js +0 -1
  102. package/dist/cjs/components/template/ComplementaryMandateNodeHandler.js +0 -1
  103. package/dist/cjs/components/template/ConditionNodeHandler.js +0 -1
  104. package/dist/cjs/components/template/ExternalVerificationNodeHandler.js +0 -1
  105. package/dist/cjs/components/template/TemplateNodeRenderer.js +0 -1
  106. package/dist/cjs/components/template/conditionNodePolicy.js +0 -1
  107. package/dist/cjs/components/ui/Body.js +0 -1
  108. package/dist/cjs/components/ui/Button.js +0 -1
  109. package/dist/cjs/components/ui/ButtonDesktop.js +0 -1
  110. package/dist/cjs/components/ui/Card.js +0 -1
  111. package/dist/cjs/components/ui/MobilePageLayout.js +0 -1
  112. package/dist/cjs/components/ui/PDFPreview.js +0 -1
  113. package/dist/cjs/components/ui/PageActions.js +0 -1
  114. package/dist/cjs/components/ui/Paper.js +0 -1
  115. package/dist/cjs/components/ui/PoweredBy.js +0 -1
  116. package/dist/cjs/components/ui/QRCodeDisplay.js +0 -1
  117. package/dist/cjs/components/ui/SelectComponent.js +0 -1
  118. package/dist/cjs/components/ui/Subtitle.js +0 -1
  119. package/dist/cjs/components/ui/Title.js +0 -1
  120. package/dist/cjs/config/env.js +0 -1
  121. package/dist/cjs/constants/userInputForm.js +0 -1
  122. package/dist/cjs/context/ConfigContext.js +0 -1
  123. package/dist/cjs/context/DocumentContext.js +0 -1
  124. package/dist/cjs/context/SessionContext.js +0 -1
  125. package/dist/cjs/hooks/useClientInfo.js +0 -1
  126. package/dist/cjs/hooks/useCountryOptions.js +0 -1
  127. package/dist/cjs/hooks/useI18n.js +0 -1
  128. package/dist/cjs/hooks/useIsMobile.js +0 -1
  129. package/dist/cjs/hooks/useNfcSseStatus.js +0 -1
  130. package/dist/cjs/hooks/useRouteCSS.js +0 -1
  131. package/dist/cjs/hooks/useSession.js +0 -1
  132. package/dist/cjs/hooks/useSessionData.js +0 -1
  133. package/dist/cjs/hooks/useStepCSS.js +0 -1
  134. package/dist/cjs/hooks/useStepNavigation.js +0 -1
  135. package/dist/cjs/hooks/useTemplateLoader.js +0 -1
  136. package/dist/cjs/hooks/useUserInputForm.js +0 -1
  137. package/dist/cjs/i18n/country/country.en.json.js +0 -1
  138. package/dist/cjs/i18n/country/country.fr.json.js +0 -1
  139. package/dist/cjs/i18n/country/country.iso2.en.json.js +0 -1
  140. package/dist/cjs/i18n/country/country.iso2.fr.json.js +0 -1
  141. package/dist/cjs/i18n/documents/documents.en.json.js +0 -1
  142. package/dist/cjs/i18n/documents/documents.fr.json.js +0 -1
  143. package/dist/cjs/i18n/en.json.js +0 -1
  144. package/dist/cjs/i18n/es.json.js +0 -1
  145. package/dist/cjs/i18n/fr.json.js +0 -1
  146. package/dist/cjs/i18n/index.js +0 -1
  147. package/dist/cjs/index.css.js +0 -1
  148. package/dist/cjs/index.js +0 -1
  149. package/dist/cjs/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +0 -1
  150. package/dist/cjs/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +0 -1
  151. package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchFn.js +0 -1
  152. package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +0 -1
  153. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +0 -1
  154. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatLong.js +0 -1
  155. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +0 -1
  156. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/localize.js +0 -1
  157. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/match.js +0 -1
  158. package/dist/cjs/node_modules/date-fns/locale/en-US.js +0 -1
  159. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatDistance.js +0 -1
  160. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatLong.js +0 -1
  161. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatRelative.js +0 -1
  162. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/localize.js +0 -1
  163. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/match.js +0 -1
  164. package/dist/cjs/node_modules/date-fns/locale/fr.js +0 -1
  165. package/dist/cjs/node_modules/heic2any/dist/heic2any.js +0 -1
  166. package/dist/cjs/node_modules/pdfjs-dist/legacy/build/pdf.js +0 -1
  167. package/dist/cjs/node_modules/pdfjs-dist/legacy/build/pdf.worker.js +0 -1
  168. package/dist/cjs/node_modules/style-inject/dist/style-inject.es.js +0 -1
  169. package/dist/cjs/node_modules/tslib/tslib.es6.js +0 -1
  170. package/dist/cjs/providers/I18nProvider.js +0 -1
  171. package/dist/cjs/services/analysis.js +0 -1
  172. package/dist/cjs/services/api.js +0 -1
  173. package/dist/cjs/services/auditTrailService.js +0 -1
  174. package/dist/cjs/services/cameraService.js +0 -1
  175. package/dist/cjs/services/documentEdgeDetectionService.js +0 -1
  176. package/dist/cjs/services/documentTemplate.js +0 -1
  177. package/dist/cjs/services/iadService.js +0 -1
  178. package/dist/cjs/services/integrationService.js +0 -1
  179. package/dist/cjs/services/pollingService.js +0 -1
  180. package/dist/cjs/services/professionalImageQuality.js +0 -1
  181. package/dist/cjs/services/retryService.js +0 -1
  182. package/dist/cjs/services/sessionCredentials.js +0 -1
  183. package/dist/cjs/services/sessionMemoryStore.js +0 -1
  184. package/dist/cjs/services/sessionService.js +0 -1
  185. package/dist/cjs/services/utils.js +0 -1
  186. package/dist/cjs/types/session.js +0 -1
  187. package/dist/cjs/utils/analysisErrors.js +0 -1
  188. package/dist/cjs/utils/apiAnalysis.js +0 -1
  189. package/dist/cjs/utils/conditionEvaluator.js +0 -1
  190. package/dist/cjs/utils/countryFlags.js +0 -1
  191. package/dist/cjs/utils/cssLoader.js +0 -1
  192. package/dist/cjs/utils/customFieldIds.js +0 -1
  193. package/dist/cjs/utils/customFieldValidation.js +0 -1
  194. package/dist/cjs/utils/documentLabels.js +0 -1
  195. package/dist/cjs/utils/europeanCountries.js +0 -1
  196. package/dist/cjs/utils/fileConverter.js +0 -1
  197. package/dist/cjs/utils/imageConverter.js +0 -1
  198. package/dist/cjs/utils/imageProcessing.js +0 -1
  199. package/dist/cjs/utils/isMobileDevice.js +0 -1
  200. package/dist/cjs/utils/isoCountryCodes.js +0 -1
  201. package/dist/cjs/utils/jdiCodes.js +0 -1
  202. package/dist/cjs/utils/labelToKey.js +0 -1
  203. package/dist/cjs/utils/listFieldUtils.js +0 -1
  204. package/dist/cjs/utils/mimeTypes.js +0 -1
  205. package/dist/cjs/utils/navigation.js +0 -1
  206. package/dist/cjs/utils/renderInlineMarkdown.js +0 -1
  207. package/dist/cjs/utils/sessionStatus.js +0 -1
  208. package/dist/cjs/utils/userInputForm.js +0 -1
  209. package/dist/cjs/utils/utils.js +0 -1
  210. package/dist/cjs/utils/validationUtils.js +0 -1
  211. package/dist/esm/_virtual/_commonjsHelpers.js +0 -1
  212. package/dist/esm/_virtual/heic2any.js +0 -1
  213. package/dist/esm/_virtual/heic2any2.js +0 -1
  214. package/dist/esm/assets/Face Scan Square.svg.js +0 -1
  215. package/dist/esm/assets/Lightbulb.svg.js +0 -1
  216. package/dist/esm/assets/Monitor Camera.svg.js +0 -1
  217. package/dist/esm/assets/User Hands.svg.js +0 -1
  218. package/dist/esm/assets/before-document.png.js +0 -1
  219. package/dist/esm/assets/before-passport.png.js +0 -1
  220. package/dist/esm/assets/before-photo.png.js +0 -1
  221. package/dist/esm/assets/before-verso.png.js +0 -1
  222. package/dist/esm/assets/check.svg.js +0 -1
  223. package/dist/esm/assets/icons/shield_magic_link.svg.js +0 -1
  224. package/dist/esm/assets/selfietake.svg.js +0 -1
  225. package/dist/esm/components/DatakeenSession.js +0 -1
  226. package/dist/esm/components/document-collection/DocumentCollection.js +0 -1
  227. package/dist/esm/components/document-collection/DocumentCollectionIntroduction.js +0 -1
  228. package/dist/esm/components/document-collection/DocumentCollectionMethodSelection.js +0 -1
  229. package/dist/esm/components/document-collection/DocumentCollectionSelection.js +0 -1
  230. package/dist/esm/components/document-collection/DocumentCollectionUpload.js +0 -1
  231. package/dist/esm/components/document-collection/DocumentError.js +0 -1
  232. package/dist/esm/components/document-collection/DocumentProcessing.js +0 -1
  233. package/dist/esm/components/document-collection/DocumentSuccess.js +0 -1
  234. package/dist/esm/components/document-video/DocumentVideoCapture.js +0 -1
  235. package/dist/esm/components/document-video/DocumentVideoConfirmation.js +0 -1
  236. package/dist/esm/components/document-video/document-video-flow/DocumentVideoFlow.js +0 -1
  237. package/dist/esm/components/document-video/document-video-flow/DocumentVideoInstructions.js +0 -1
  238. package/dist/esm/components/document-video/document-video-flow/DocumentVideoProcessing.js +0 -1
  239. package/dist/esm/components/document-video/document-video-flow/DocumentVideoRecorder.js +0 -1
  240. package/dist/esm/components/icons/ElectronicIcon.js +0 -1
  241. package/dist/esm/components/icons/PoweredByIcon.js +0 -1
  242. package/dist/esm/components/icons/PreIntroIcon.js +0 -1
  243. package/dist/esm/components/icons/StartIcon.js +0 -1
  244. package/dist/esm/components/id-check/BeforePhoto.js +0 -1
  245. package/dist/esm/components/id-check/BeforeVersoPhoto.js +0 -1
  246. package/dist/esm/components/id-check/CameraError.js +0 -1
  247. package/dist/esm/components/id-check/CameraMask.js +0 -1
  248. package/dist/esm/components/id-check/OrientationToggle.js +0 -1
  249. package/dist/esm/components/id-check/Photo.js +0 -1
  250. package/dist/esm/components/id-check/PhotoConfirmation.js +0 -1
  251. package/dist/esm/components/id-check/PhotoPreview.js +0 -1
  252. package/dist/esm/components/jdi/JDDWorkInProgress.js +0 -1
  253. package/dist/esm/components/jdi/JDICountrySelection.js +0 -1
  254. package/dist/esm/components/jdi/JDIDocumentSelection.js +0 -1
  255. package/dist/esm/components/jdi/JDIDocumentUpload.js +0 -1
  256. package/dist/esm/components/jdi/JDIError.js +0 -1
  257. package/dist/esm/components/jdi/JDIPreIntroduction.js +0 -1
  258. package/dist/esm/components/jdi/JDIProcessing.js +0 -1
  259. package/dist/esm/components/jdi/JDISuccess.js +0 -1
  260. package/dist/esm/components/legal-consent/LegalConsentNode.js +0 -1
  261. package/dist/esm/components/nfc-scan/BiometricSymbol.js +0 -1
  262. package/dist/esm/components/nfc-scan/NfcChipGate.js +0 -1
  263. package/dist/esm/components/nfc-scan/NfcFallbackSurvey.js +0 -1
  264. package/dist/esm/components/nfc-scan/NfcOnboardingNotice.js +0 -1
  265. package/dist/esm/components/nfc-scan/NfcScanNode.js +0 -1
  266. package/dist/esm/components/nfc-scan/NfcSuccessAnimation.js +0 -1
  267. package/dist/esm/components/nfc-scan/PuceCniSymbol.js +0 -1
  268. package/dist/esm/components/selfie/SelfieConfirmation.js +0 -1
  269. package/dist/esm/components/selfie/Video.css.js +0 -1
  270. package/dist/esm/components/selfie/Video.js +0 -1
  271. package/dist/esm/components/selfie/VideoFixes.css.js +0 -1
  272. package/dist/esm/components/selfie/VideoResetStyles.js +0 -1
  273. package/dist/esm/components/selfie/hooks/useLiveFrameCapture.js +0 -1
  274. package/dist/esm/components/selfie/hooks/useVideoRecorderStyles.js +0 -1
  275. package/dist/esm/components/selfie/selfie-flow/InstructionsSelfie.js +0 -1
  276. package/dist/esm/components/selfie/selfie-flow/SelfieFlow.js +0 -1
  277. package/dist/esm/components/selfie/selfie-flow/SelfiePreIntroduction.js +0 -1
  278. package/dist/esm/components/selfie/selfie-flow/SelfieProcessing.js +0 -1
  279. package/dist/esm/components/selfie/selfie-flow/SelfieRecorder.js +0 -1
  280. package/dist/esm/components/selfie/utils/selfieCaptureUtils.js +0 -1
  281. package/dist/esm/components/selfie/utils/unisseyStrings.js +0 -1
  282. package/dist/esm/components/selfie/utils/videoElementStyles.js +0 -1
  283. package/dist/esm/components/session/DocumentCheck.js +0 -1
  284. package/dist/esm/components/session/EndFlow.js +0 -1
  285. package/dist/esm/components/session/MobileRedirect.js +0 -1
  286. package/dist/esm/components/session/PdfGeneration.js +0 -1
  287. package/dist/esm/components/session/Selfie.js +0 -1
  288. package/dist/esm/components/session/SessionContent.js +0 -1
  289. package/dist/esm/components/session/SessionExpired.js +0 -1
  290. package/dist/esm/components/session/StartSession.js +0 -1
  291. package/dist/esm/components/session/UserInputForm/AddressFields.js +0 -1
  292. package/dist/esm/components/session/UserInputForm/ContactFields.js +0 -1
  293. package/dist/esm/components/session/UserInputForm/CustomFormFields.js +0 -1
  294. package/dist/esm/components/session/UserInputForm/DatePickerField.js +0 -1
  295. package/dist/esm/components/session/UserInputForm/IdentityFields.js +0 -1
  296. package/dist/esm/components/session/UserInputForm/LegalEntityFields.js +0 -1
  297. package/dist/esm/components/session/UserInputForm/LegalRepFields.js +0 -1
  298. package/dist/esm/components/session/UserInputForm/NationalityField.js +0 -1
  299. package/dist/esm/components/session/UserInputForm.js +0 -1
  300. package/dist/esm/components/session/VideoWorkInProgress.js +0 -1
  301. package/dist/esm/components/session/controleJdiPolicy.js +0 -1
  302. package/dist/esm/components/session/endScreenIcons.js +0 -1
  303. package/dist/esm/components/signature-electronic/DocusealSignature.js +0 -1
  304. package/dist/esm/components/signature-electronic/SignatureElectronic.js +0 -1
  305. package/dist/esm/components/signature-electronic/SignatureElectronicIntroduction.js +0 -1
  306. package/dist/esm/components/signature-electronic/SignedDocumentPreview.js +0 -1
  307. package/dist/esm/components/start-flow/Start.js +0 -1
  308. package/dist/esm/components/states/ErrorState.js +0 -1
  309. package/dist/esm/components/states/LoadingState.js +0 -1
  310. package/dist/esm/components/states/NoSessionIdState.js +0 -1
  311. package/dist/esm/components/template/ComplementaryMandateNodeHandler.js +0 -1
  312. package/dist/esm/components/template/ConditionNodeHandler.js +0 -1
  313. package/dist/esm/components/template/ExternalVerificationNodeHandler.js +0 -1
  314. package/dist/esm/components/template/TemplateNodeRenderer.js +0 -1
  315. package/dist/esm/components/template/conditionNodePolicy.js +0 -1
  316. package/dist/esm/components/ui/Body.js +0 -1
  317. package/dist/esm/components/ui/Button.js +0 -1
  318. package/dist/esm/components/ui/ButtonDesktop.js +0 -1
  319. package/dist/esm/components/ui/Card.js +0 -1
  320. package/dist/esm/components/ui/MobilePageLayout.js +0 -1
  321. package/dist/esm/components/ui/PDFPreview.js +0 -1
  322. package/dist/esm/components/ui/PageActions.js +0 -1
  323. package/dist/esm/components/ui/Paper.js +0 -1
  324. package/dist/esm/components/ui/PoweredBy.js +0 -1
  325. package/dist/esm/components/ui/QRCodeDisplay.js +0 -1
  326. package/dist/esm/components/ui/SelectComponent.js +0 -1
  327. package/dist/esm/components/ui/Subtitle.js +0 -1
  328. package/dist/esm/components/ui/Title.js +0 -1
  329. package/dist/esm/config/env.js +0 -1
  330. package/dist/esm/constants/userInputForm.js +0 -1
  331. package/dist/esm/context/ConfigContext.js +0 -1
  332. package/dist/esm/context/DocumentContext.js +0 -1
  333. package/dist/esm/context/SessionContext.js +0 -1
  334. package/dist/esm/hooks/useClientInfo.js +0 -1
  335. package/dist/esm/hooks/useCountryOptions.js +0 -1
  336. package/dist/esm/hooks/useI18n.js +0 -1
  337. package/dist/esm/hooks/useIsMobile.js +0 -1
  338. package/dist/esm/hooks/useNfcSseStatus.js +0 -1
  339. package/dist/esm/hooks/useRouteCSS.js +0 -1
  340. package/dist/esm/hooks/useSession.js +0 -1
  341. package/dist/esm/hooks/useSessionData.js +0 -1
  342. package/dist/esm/hooks/useStepCSS.js +0 -1
  343. package/dist/esm/hooks/useStepNavigation.js +0 -1
  344. package/dist/esm/hooks/useTemplateLoader.js +0 -1
  345. package/dist/esm/hooks/useUserInputForm.js +0 -1
  346. package/dist/esm/i18n/country/country.en.json.js +0 -1
  347. package/dist/esm/i18n/country/country.fr.json.js +0 -1
  348. package/dist/esm/i18n/country/country.iso2.en.json.js +0 -1
  349. package/dist/esm/i18n/country/country.iso2.fr.json.js +0 -1
  350. package/dist/esm/i18n/documents/documents.en.json.js +0 -1
  351. package/dist/esm/i18n/documents/documents.fr.json.js +0 -1
  352. package/dist/esm/i18n/en.json.js +0 -1
  353. package/dist/esm/i18n/es.json.js +0 -1
  354. package/dist/esm/i18n/fr.json.js +0 -1
  355. package/dist/esm/i18n/index.js +0 -1
  356. package/dist/esm/index.css.js +0 -1
  357. package/dist/esm/index.js +0 -1
  358. package/dist/esm/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +0 -1
  359. package/dist/esm/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +0 -1
  360. package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchFn.js +0 -1
  361. package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +0 -1
  362. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +0 -1
  363. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatLong.js +0 -1
  364. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +0 -1
  365. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/localize.js +0 -1
  366. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/match.js +0 -1
  367. package/dist/esm/node_modules/date-fns/locale/en-US.js +0 -1
  368. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatDistance.js +0 -1
  369. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatLong.js +0 -1
  370. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatRelative.js +0 -1
  371. package/dist/esm/node_modules/date-fns/locale/fr/_lib/localize.js +0 -1
  372. package/dist/esm/node_modules/date-fns/locale/fr/_lib/match.js +0 -1
  373. package/dist/esm/node_modules/date-fns/locale/fr.js +0 -1
  374. package/dist/esm/node_modules/heic2any/dist/heic2any.js +0 -1
  375. package/dist/esm/node_modules/pdfjs-dist/legacy/build/pdf.js +0 -1
  376. package/dist/esm/node_modules/pdfjs-dist/legacy/build/pdf.worker.js +0 -1
  377. package/dist/esm/node_modules/style-inject/dist/style-inject.es.js +0 -1
  378. package/dist/esm/node_modules/tslib/tslib.es6.js +0 -1
  379. package/dist/esm/providers/I18nProvider.js +0 -1
  380. package/dist/esm/services/analysis.js +0 -1
  381. package/dist/esm/services/api.js +0 -1
  382. package/dist/esm/services/auditTrailService.js +0 -1
  383. package/dist/esm/services/cameraService.js +0 -1
  384. package/dist/esm/services/documentEdgeDetectionService.js +0 -1
  385. package/dist/esm/services/documentTemplate.js +0 -1
  386. package/dist/esm/services/iadService.js +0 -1
  387. package/dist/esm/services/integrationService.js +0 -1
  388. package/dist/esm/services/pollingService.js +0 -1
  389. package/dist/esm/services/professionalImageQuality.js +0 -1
  390. package/dist/esm/services/retryService.js +0 -1
  391. package/dist/esm/services/sessionCredentials.js +0 -1
  392. package/dist/esm/services/sessionMemoryStore.js +0 -1
  393. package/dist/esm/services/sessionService.js +0 -1
  394. package/dist/esm/services/utils.js +0 -1
  395. package/dist/esm/types/session.js +0 -1
  396. package/dist/esm/utils/analysisErrors.js +0 -1
  397. package/dist/esm/utils/apiAnalysis.js +0 -1
  398. package/dist/esm/utils/conditionEvaluator.js +0 -1
  399. package/dist/esm/utils/countryFlags.js +0 -1
  400. package/dist/esm/utils/cssLoader.js +0 -1
  401. package/dist/esm/utils/customFieldIds.js +0 -1
  402. package/dist/esm/utils/customFieldValidation.js +0 -1
  403. package/dist/esm/utils/documentLabels.js +0 -1
  404. package/dist/esm/utils/europeanCountries.js +0 -1
  405. package/dist/esm/utils/fileConverter.js +0 -1
  406. package/dist/esm/utils/imageConverter.js +0 -1
  407. package/dist/esm/utils/imageProcessing.js +0 -1
  408. package/dist/esm/utils/isMobileDevice.js +0 -1
  409. package/dist/esm/utils/isoCountryCodes.js +0 -1
  410. package/dist/esm/utils/jdiCodes.js +0 -1
  411. package/dist/esm/utils/labelToKey.js +0 -1
  412. package/dist/esm/utils/listFieldUtils.js +0 -1
  413. package/dist/esm/utils/mimeTypes.js +0 -1
  414. package/dist/esm/utils/navigation.js +0 -1
  415. package/dist/esm/utils/renderInlineMarkdown.js +0 -1
  416. package/dist/esm/utils/sessionStatus.js +0 -1
  417. package/dist/esm/utils/userInputForm.js +0 -1
  418. package/dist/esm/utils/utils.js +0 -1
  419. package/dist/esm/utils/validationUtils.js +0 -1
  420. package/package.json +9 -2
  421. package/.gitlab/issue_templates/bug.md +0 -14
  422. package/.gitlab/issue_templates/feature.md +0 -11
  423. package/.gitlab/issue_templates/task.md +0 -11
  424. package/.gitlab/merge_request_templates/default.md +0 -15
  425. package/.gitlab/merge_request_templates/hotfix.md +0 -15
  426. package/.gitlab-ci.yml +0 -290
  427. package/CLAUDE.md +0 -233
  428. package/__mocks__/@unissey-web/sdk-react.js +0 -17
  429. package/__mocks__/fileMock.js +0 -1
  430. package/__mocks__/pdfjs-dist/legacy/build/pdf.js +0 -5
  431. package/__mocks__/pdfjs-dist/legacy/build/pdf.worker.js +0 -1
  432. package/assets/logo.svg +0 -56
  433. package/axios.install.md +0 -2
  434. package/babel.config.js +0 -15
  435. package/dist/cjs/_virtual/_commonjsHelpers.js.map +0 -1
  436. package/dist/cjs/_virtual/heic2any.js.map +0 -1
  437. package/dist/cjs/_virtual/heic2any2.js.map +0 -1
  438. package/dist/cjs/assets/Face Scan Square.svg.js.map +0 -1
  439. package/dist/cjs/assets/Lightbulb.svg.js.map +0 -1
  440. package/dist/cjs/assets/Monitor Camera.svg.js.map +0 -1
  441. package/dist/cjs/assets/User Hands.svg.js.map +0 -1
  442. package/dist/cjs/assets/before-document.png.js.map +0 -1
  443. package/dist/cjs/assets/before-passport.png.js.map +0 -1
  444. package/dist/cjs/assets/before-photo.png.js.map +0 -1
  445. package/dist/cjs/assets/before-verso.png.js.map +0 -1
  446. package/dist/cjs/assets/check.svg.js.map +0 -1
  447. package/dist/cjs/assets/icons/shield_magic_link.svg.js.map +0 -1
  448. package/dist/cjs/assets/selfietake.svg.js.map +0 -1
  449. package/dist/cjs/components/DatakeenSession.js.map +0 -1
  450. package/dist/cjs/components/document-collection/DocumentCollection.js.map +0 -1
  451. package/dist/cjs/components/document-collection/DocumentCollectionIntroduction.js.map +0 -1
  452. package/dist/cjs/components/document-collection/DocumentCollectionMethodSelection.js.map +0 -1
  453. package/dist/cjs/components/document-collection/DocumentCollectionSelection.js.map +0 -1
  454. package/dist/cjs/components/document-collection/DocumentCollectionUpload.js.map +0 -1
  455. package/dist/cjs/components/document-collection/DocumentError.js.map +0 -1
  456. package/dist/cjs/components/document-collection/DocumentProcessing.js.map +0 -1
  457. package/dist/cjs/components/document-collection/DocumentSuccess.js.map +0 -1
  458. package/dist/cjs/components/document-video/DocumentVideoCapture.js.map +0 -1
  459. package/dist/cjs/components/document-video/DocumentVideoConfirmation.js.map +0 -1
  460. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoFlow.js.map +0 -1
  461. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoInstructions.js.map +0 -1
  462. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoProcessing.js.map +0 -1
  463. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoRecorder.js.map +0 -1
  464. package/dist/cjs/components/icons/ElectronicIcon.js.map +0 -1
  465. package/dist/cjs/components/icons/PoweredByIcon.js.map +0 -1
  466. package/dist/cjs/components/icons/PreIntroIcon.js.map +0 -1
  467. package/dist/cjs/components/icons/StartIcon.js.map +0 -1
  468. package/dist/cjs/components/id-check/BeforePhoto.js.map +0 -1
  469. package/dist/cjs/components/id-check/BeforeVersoPhoto.js.map +0 -1
  470. package/dist/cjs/components/id-check/CameraError.js.map +0 -1
  471. package/dist/cjs/components/id-check/CameraMask.js.map +0 -1
  472. package/dist/cjs/components/id-check/OrientationToggle.js.map +0 -1
  473. package/dist/cjs/components/id-check/Photo.js.map +0 -1
  474. package/dist/cjs/components/id-check/PhotoConfirmation.js.map +0 -1
  475. package/dist/cjs/components/id-check/PhotoPreview.js.map +0 -1
  476. package/dist/cjs/components/jdi/JDDWorkInProgress.js.map +0 -1
  477. package/dist/cjs/components/jdi/JDICountrySelection.js.map +0 -1
  478. package/dist/cjs/components/jdi/JDIDocumentSelection.js.map +0 -1
  479. package/dist/cjs/components/jdi/JDIDocumentUpload.js.map +0 -1
  480. package/dist/cjs/components/jdi/JDIError.js.map +0 -1
  481. package/dist/cjs/components/jdi/JDIPreIntroduction.js.map +0 -1
  482. package/dist/cjs/components/jdi/JDIProcessing.js.map +0 -1
  483. package/dist/cjs/components/jdi/JDISuccess.js.map +0 -1
  484. package/dist/cjs/components/legal-consent/LegalConsentNode.js.map +0 -1
  485. package/dist/cjs/components/nfc-scan/BiometricSymbol.js.map +0 -1
  486. package/dist/cjs/components/nfc-scan/NfcChipGate.js.map +0 -1
  487. package/dist/cjs/components/nfc-scan/NfcFallbackSurvey.js.map +0 -1
  488. package/dist/cjs/components/nfc-scan/NfcOnboardingNotice.js.map +0 -1
  489. package/dist/cjs/components/nfc-scan/NfcScanNode.js.map +0 -1
  490. package/dist/cjs/components/nfc-scan/NfcSuccessAnimation.js.map +0 -1
  491. package/dist/cjs/components/nfc-scan/PuceCniSymbol.js.map +0 -1
  492. package/dist/cjs/components/selfie/SelfieConfirmation.js.map +0 -1
  493. package/dist/cjs/components/selfie/Video.css.js.map +0 -1
  494. package/dist/cjs/components/selfie/Video.js.map +0 -1
  495. package/dist/cjs/components/selfie/VideoFixes.css.js.map +0 -1
  496. package/dist/cjs/components/selfie/VideoResetStyles.js.map +0 -1
  497. package/dist/cjs/components/selfie/hooks/useLiveFrameCapture.js.map +0 -1
  498. package/dist/cjs/components/selfie/hooks/useVideoRecorderStyles.js.map +0 -1
  499. package/dist/cjs/components/selfie/selfie-flow/InstructionsSelfie.js.map +0 -1
  500. package/dist/cjs/components/selfie/selfie-flow/SelfieFlow.js.map +0 -1
  501. package/dist/cjs/components/selfie/selfie-flow/SelfiePreIntroduction.js.map +0 -1
  502. package/dist/cjs/components/selfie/selfie-flow/SelfieProcessing.js.map +0 -1
  503. package/dist/cjs/components/selfie/selfie-flow/SelfieRecorder.js.map +0 -1
  504. package/dist/cjs/components/selfie/utils/selfieCaptureUtils.js.map +0 -1
  505. package/dist/cjs/components/selfie/utils/unisseyStrings.js.map +0 -1
  506. package/dist/cjs/components/selfie/utils/videoElementStyles.js.map +0 -1
  507. package/dist/cjs/components/session/DocumentCheck.js.map +0 -1
  508. package/dist/cjs/components/session/EndFlow.js.map +0 -1
  509. package/dist/cjs/components/session/MobileRedirect.js.map +0 -1
  510. package/dist/cjs/components/session/PdfGeneration.js.map +0 -1
  511. package/dist/cjs/components/session/Selfie.js.map +0 -1
  512. package/dist/cjs/components/session/SessionContent.js.map +0 -1
  513. package/dist/cjs/components/session/SessionExpired.js.map +0 -1
  514. package/dist/cjs/components/session/StartSession.js.map +0 -1
  515. package/dist/cjs/components/session/UserInputForm/AddressFields.js.map +0 -1
  516. package/dist/cjs/components/session/UserInputForm/ContactFields.js.map +0 -1
  517. package/dist/cjs/components/session/UserInputForm/CustomFormFields.js.map +0 -1
  518. package/dist/cjs/components/session/UserInputForm/DatePickerField.js.map +0 -1
  519. package/dist/cjs/components/session/UserInputForm/IdentityFields.js.map +0 -1
  520. package/dist/cjs/components/session/UserInputForm/LegalEntityFields.js.map +0 -1
  521. package/dist/cjs/components/session/UserInputForm/LegalRepFields.js.map +0 -1
  522. package/dist/cjs/components/session/UserInputForm/NationalityField.js.map +0 -1
  523. package/dist/cjs/components/session/UserInputForm.js.map +0 -1
  524. package/dist/cjs/components/session/VideoWorkInProgress.js.map +0 -1
  525. package/dist/cjs/components/session/controleJdiPolicy.js.map +0 -1
  526. package/dist/cjs/components/session/endScreenIcons.js.map +0 -1
  527. package/dist/cjs/components/signature-electronic/DocusealSignature.js.map +0 -1
  528. package/dist/cjs/components/signature-electronic/SignatureElectronic.js.map +0 -1
  529. package/dist/cjs/components/signature-electronic/SignatureElectronicIntroduction.js.map +0 -1
  530. package/dist/cjs/components/signature-electronic/SignedDocumentPreview.js.map +0 -1
  531. package/dist/cjs/components/start-flow/Start.js.map +0 -1
  532. package/dist/cjs/components/states/ErrorState.js.map +0 -1
  533. package/dist/cjs/components/states/LoadingState.js.map +0 -1
  534. package/dist/cjs/components/states/NoSessionIdState.js.map +0 -1
  535. package/dist/cjs/components/template/ComplementaryMandateNodeHandler.js.map +0 -1
  536. package/dist/cjs/components/template/ConditionNodeHandler.js.map +0 -1
  537. package/dist/cjs/components/template/ExternalVerificationNodeHandler.js.map +0 -1
  538. package/dist/cjs/components/template/TemplateNodeRenderer.js.map +0 -1
  539. package/dist/cjs/components/template/conditionNodePolicy.js.map +0 -1
  540. package/dist/cjs/components/ui/Body.js.map +0 -1
  541. package/dist/cjs/components/ui/Button.js.map +0 -1
  542. package/dist/cjs/components/ui/ButtonDesktop.js.map +0 -1
  543. package/dist/cjs/components/ui/Card.js.map +0 -1
  544. package/dist/cjs/components/ui/MobilePageLayout.js.map +0 -1
  545. package/dist/cjs/components/ui/PDFPreview.js.map +0 -1
  546. package/dist/cjs/components/ui/PageActions.js.map +0 -1
  547. package/dist/cjs/components/ui/Paper.js.map +0 -1
  548. package/dist/cjs/components/ui/PoweredBy.js.map +0 -1
  549. package/dist/cjs/components/ui/QRCodeDisplay.js.map +0 -1
  550. package/dist/cjs/components/ui/SelectComponent.js.map +0 -1
  551. package/dist/cjs/components/ui/Subtitle.js.map +0 -1
  552. package/dist/cjs/components/ui/Title.js.map +0 -1
  553. package/dist/cjs/config/env.js.map +0 -1
  554. package/dist/cjs/constants/userInputForm.js.map +0 -1
  555. package/dist/cjs/context/ConfigContext.js.map +0 -1
  556. package/dist/cjs/context/DocumentContext.js.map +0 -1
  557. package/dist/cjs/context/SessionContext.js.map +0 -1
  558. package/dist/cjs/hooks/useClientInfo.js.map +0 -1
  559. package/dist/cjs/hooks/useCountryOptions.js.map +0 -1
  560. package/dist/cjs/hooks/useI18n.js.map +0 -1
  561. package/dist/cjs/hooks/useIsMobile.js.map +0 -1
  562. package/dist/cjs/hooks/useNfcSseStatus.js.map +0 -1
  563. package/dist/cjs/hooks/useRouteCSS.js.map +0 -1
  564. package/dist/cjs/hooks/useSession.js.map +0 -1
  565. package/dist/cjs/hooks/useSessionData.js.map +0 -1
  566. package/dist/cjs/hooks/useStepCSS.js.map +0 -1
  567. package/dist/cjs/hooks/useStepNavigation.js.map +0 -1
  568. package/dist/cjs/hooks/useTemplateLoader.js.map +0 -1
  569. package/dist/cjs/hooks/useUserInputForm.js.map +0 -1
  570. package/dist/cjs/i18n/country/country.en.json.js.map +0 -1
  571. package/dist/cjs/i18n/country/country.fr.json.js.map +0 -1
  572. package/dist/cjs/i18n/country/country.iso2.en.json.js.map +0 -1
  573. package/dist/cjs/i18n/country/country.iso2.fr.json.js.map +0 -1
  574. package/dist/cjs/i18n/documents/documents.en.json.js.map +0 -1
  575. package/dist/cjs/i18n/documents/documents.fr.json.js.map +0 -1
  576. package/dist/cjs/i18n/en.json.js.map +0 -1
  577. package/dist/cjs/i18n/es.json.js.map +0 -1
  578. package/dist/cjs/i18n/fr.json.js.map +0 -1
  579. package/dist/cjs/i18n/index.js.map +0 -1
  580. package/dist/cjs/index.css.js.map +0 -1
  581. package/dist/cjs/index.js.map +0 -1
  582. package/dist/cjs/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +0 -1
  583. package/dist/cjs/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +0 -1
  584. package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +0 -1
  585. package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +0 -1
  586. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +0 -1
  587. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +0 -1
  588. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +0 -1
  589. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/localize.js.map +0 -1
  590. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/match.js.map +0 -1
  591. package/dist/cjs/node_modules/date-fns/locale/en-US.js.map +0 -1
  592. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatDistance.js.map +0 -1
  593. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatLong.js.map +0 -1
  594. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatRelative.js.map +0 -1
  595. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/localize.js.map +0 -1
  596. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/match.js.map +0 -1
  597. package/dist/cjs/node_modules/date-fns/locale/fr.js.map +0 -1
  598. package/dist/cjs/node_modules/heic2any/dist/heic2any.js.map +0 -1
  599. package/dist/cjs/node_modules/pdfjs-dist/legacy/build/pdf.js.map +0 -1
  600. package/dist/cjs/node_modules/pdfjs-dist/legacy/build/pdf.worker.js.map +0 -1
  601. package/dist/cjs/node_modules/style-inject/dist/style-inject.es.js.map +0 -1
  602. package/dist/cjs/node_modules/tslib/tslib.es6.js.map +0 -1
  603. package/dist/cjs/providers/I18nProvider.js.map +0 -1
  604. package/dist/cjs/services/analysis.js.map +0 -1
  605. package/dist/cjs/services/api.js.map +0 -1
  606. package/dist/cjs/services/auditTrailService.js.map +0 -1
  607. package/dist/cjs/services/cameraService.js.map +0 -1
  608. package/dist/cjs/services/documentEdgeDetectionService.js.map +0 -1
  609. package/dist/cjs/services/documentTemplate.js.map +0 -1
  610. package/dist/cjs/services/iadService.js.map +0 -1
  611. package/dist/cjs/services/integrationService.js.map +0 -1
  612. package/dist/cjs/services/pollingService.js.map +0 -1
  613. package/dist/cjs/services/professionalImageQuality.js.map +0 -1
  614. package/dist/cjs/services/retryService.js.map +0 -1
  615. package/dist/cjs/services/sessionCredentials.js.map +0 -1
  616. package/dist/cjs/services/sessionMemoryStore.js.map +0 -1
  617. package/dist/cjs/services/sessionService.js.map +0 -1
  618. package/dist/cjs/services/utils.js.map +0 -1
  619. package/dist/cjs/types/session.js.map +0 -1
  620. package/dist/cjs/utils/analysisErrors.js.map +0 -1
  621. package/dist/cjs/utils/apiAnalysis.js.map +0 -1
  622. package/dist/cjs/utils/conditionEvaluator.js.map +0 -1
  623. package/dist/cjs/utils/countryFlags.js.map +0 -1
  624. package/dist/cjs/utils/cssLoader.js.map +0 -1
  625. package/dist/cjs/utils/customFieldIds.js.map +0 -1
  626. package/dist/cjs/utils/customFieldValidation.js.map +0 -1
  627. package/dist/cjs/utils/documentLabels.js.map +0 -1
  628. package/dist/cjs/utils/europeanCountries.js.map +0 -1
  629. package/dist/cjs/utils/fileConverter.js.map +0 -1
  630. package/dist/cjs/utils/imageConverter.js.map +0 -1
  631. package/dist/cjs/utils/imageProcessing.js.map +0 -1
  632. package/dist/cjs/utils/isMobileDevice.js.map +0 -1
  633. package/dist/cjs/utils/isoCountryCodes.js.map +0 -1
  634. package/dist/cjs/utils/jdiCodes.js.map +0 -1
  635. package/dist/cjs/utils/labelToKey.js.map +0 -1
  636. package/dist/cjs/utils/listFieldUtils.js.map +0 -1
  637. package/dist/cjs/utils/mimeTypes.js.map +0 -1
  638. package/dist/cjs/utils/navigation.js.map +0 -1
  639. package/dist/cjs/utils/renderInlineMarkdown.js.map +0 -1
  640. package/dist/cjs/utils/sessionStatus.js.map +0 -1
  641. package/dist/cjs/utils/userInputForm.js.map +0 -1
  642. package/dist/cjs/utils/utils.js.map +0 -1
  643. package/dist/cjs/utils/validationUtils.js.map +0 -1
  644. package/dist/esm/_virtual/_commonjsHelpers.js.map +0 -1
  645. package/dist/esm/_virtual/heic2any.js.map +0 -1
  646. package/dist/esm/_virtual/heic2any2.js.map +0 -1
  647. package/dist/esm/assets/Face Scan Square.svg.js.map +0 -1
  648. package/dist/esm/assets/Lightbulb.svg.js.map +0 -1
  649. package/dist/esm/assets/Monitor Camera.svg.js.map +0 -1
  650. package/dist/esm/assets/User Hands.svg.js.map +0 -1
  651. package/dist/esm/assets/before-document.png.js.map +0 -1
  652. package/dist/esm/assets/before-passport.png.js.map +0 -1
  653. package/dist/esm/assets/before-photo.png.js.map +0 -1
  654. package/dist/esm/assets/before-verso.png.js.map +0 -1
  655. package/dist/esm/assets/check.svg.js.map +0 -1
  656. package/dist/esm/assets/icons/shield_magic_link.svg.js.map +0 -1
  657. package/dist/esm/assets/selfietake.svg.js.map +0 -1
  658. package/dist/esm/components/DatakeenSession.js.map +0 -1
  659. package/dist/esm/components/document-collection/DocumentCollection.js.map +0 -1
  660. package/dist/esm/components/document-collection/DocumentCollectionIntroduction.js.map +0 -1
  661. package/dist/esm/components/document-collection/DocumentCollectionMethodSelection.js.map +0 -1
  662. package/dist/esm/components/document-collection/DocumentCollectionSelection.js.map +0 -1
  663. package/dist/esm/components/document-collection/DocumentCollectionUpload.js.map +0 -1
  664. package/dist/esm/components/document-collection/DocumentError.js.map +0 -1
  665. package/dist/esm/components/document-collection/DocumentProcessing.js.map +0 -1
  666. package/dist/esm/components/document-collection/DocumentSuccess.js.map +0 -1
  667. package/dist/esm/components/document-video/DocumentVideoCapture.js.map +0 -1
  668. package/dist/esm/components/document-video/DocumentVideoConfirmation.js.map +0 -1
  669. package/dist/esm/components/document-video/document-video-flow/DocumentVideoFlow.js.map +0 -1
  670. package/dist/esm/components/document-video/document-video-flow/DocumentVideoInstructions.js.map +0 -1
  671. package/dist/esm/components/document-video/document-video-flow/DocumentVideoProcessing.js.map +0 -1
  672. package/dist/esm/components/document-video/document-video-flow/DocumentVideoRecorder.js.map +0 -1
  673. package/dist/esm/components/icons/ElectronicIcon.js.map +0 -1
  674. package/dist/esm/components/icons/PoweredByIcon.js.map +0 -1
  675. package/dist/esm/components/icons/PreIntroIcon.js.map +0 -1
  676. package/dist/esm/components/icons/StartIcon.js.map +0 -1
  677. package/dist/esm/components/id-check/BeforePhoto.js.map +0 -1
  678. package/dist/esm/components/id-check/BeforeVersoPhoto.js.map +0 -1
  679. package/dist/esm/components/id-check/CameraError.js.map +0 -1
  680. package/dist/esm/components/id-check/CameraMask.js.map +0 -1
  681. package/dist/esm/components/id-check/OrientationToggle.js.map +0 -1
  682. package/dist/esm/components/id-check/Photo.js.map +0 -1
  683. package/dist/esm/components/id-check/PhotoConfirmation.js.map +0 -1
  684. package/dist/esm/components/id-check/PhotoPreview.js.map +0 -1
  685. package/dist/esm/components/jdi/JDDWorkInProgress.js.map +0 -1
  686. package/dist/esm/components/jdi/JDICountrySelection.js.map +0 -1
  687. package/dist/esm/components/jdi/JDIDocumentSelection.js.map +0 -1
  688. package/dist/esm/components/jdi/JDIDocumentUpload.js.map +0 -1
  689. package/dist/esm/components/jdi/JDIError.js.map +0 -1
  690. package/dist/esm/components/jdi/JDIPreIntroduction.js.map +0 -1
  691. package/dist/esm/components/jdi/JDIProcessing.js.map +0 -1
  692. package/dist/esm/components/jdi/JDISuccess.js.map +0 -1
  693. package/dist/esm/components/legal-consent/LegalConsentNode.js.map +0 -1
  694. package/dist/esm/components/nfc-scan/BiometricSymbol.js.map +0 -1
  695. package/dist/esm/components/nfc-scan/NfcChipGate.js.map +0 -1
  696. package/dist/esm/components/nfc-scan/NfcFallbackSurvey.js.map +0 -1
  697. package/dist/esm/components/nfc-scan/NfcOnboardingNotice.js.map +0 -1
  698. package/dist/esm/components/nfc-scan/NfcScanNode.js.map +0 -1
  699. package/dist/esm/components/nfc-scan/NfcSuccessAnimation.js.map +0 -1
  700. package/dist/esm/components/nfc-scan/PuceCniSymbol.js.map +0 -1
  701. package/dist/esm/components/selfie/SelfieConfirmation.js.map +0 -1
  702. package/dist/esm/components/selfie/Video.css.js.map +0 -1
  703. package/dist/esm/components/selfie/Video.js.map +0 -1
  704. package/dist/esm/components/selfie/VideoFixes.css.js.map +0 -1
  705. package/dist/esm/components/selfie/VideoResetStyles.js.map +0 -1
  706. package/dist/esm/components/selfie/hooks/useLiveFrameCapture.js.map +0 -1
  707. package/dist/esm/components/selfie/hooks/useVideoRecorderStyles.js.map +0 -1
  708. package/dist/esm/components/selfie/selfie-flow/InstructionsSelfie.js.map +0 -1
  709. package/dist/esm/components/selfie/selfie-flow/SelfieFlow.js.map +0 -1
  710. package/dist/esm/components/selfie/selfie-flow/SelfiePreIntroduction.js.map +0 -1
  711. package/dist/esm/components/selfie/selfie-flow/SelfieProcessing.js.map +0 -1
  712. package/dist/esm/components/selfie/selfie-flow/SelfieRecorder.js.map +0 -1
  713. package/dist/esm/components/selfie/utils/selfieCaptureUtils.js.map +0 -1
  714. package/dist/esm/components/selfie/utils/unisseyStrings.js.map +0 -1
  715. package/dist/esm/components/selfie/utils/videoElementStyles.js.map +0 -1
  716. package/dist/esm/components/session/DocumentCheck.js.map +0 -1
  717. package/dist/esm/components/session/EndFlow.js.map +0 -1
  718. package/dist/esm/components/session/MobileRedirect.js.map +0 -1
  719. package/dist/esm/components/session/PdfGeneration.js.map +0 -1
  720. package/dist/esm/components/session/Selfie.js.map +0 -1
  721. package/dist/esm/components/session/SessionContent.js.map +0 -1
  722. package/dist/esm/components/session/SessionExpired.js.map +0 -1
  723. package/dist/esm/components/session/StartSession.js.map +0 -1
  724. package/dist/esm/components/session/UserInputForm/AddressFields.js.map +0 -1
  725. package/dist/esm/components/session/UserInputForm/ContactFields.js.map +0 -1
  726. package/dist/esm/components/session/UserInputForm/CustomFormFields.js.map +0 -1
  727. package/dist/esm/components/session/UserInputForm/DatePickerField.js.map +0 -1
  728. package/dist/esm/components/session/UserInputForm/IdentityFields.js.map +0 -1
  729. package/dist/esm/components/session/UserInputForm/LegalEntityFields.js.map +0 -1
  730. package/dist/esm/components/session/UserInputForm/LegalRepFields.js.map +0 -1
  731. package/dist/esm/components/session/UserInputForm/NationalityField.js.map +0 -1
  732. package/dist/esm/components/session/UserInputForm.js.map +0 -1
  733. package/dist/esm/components/session/VideoWorkInProgress.js.map +0 -1
  734. package/dist/esm/components/session/controleJdiPolicy.js.map +0 -1
  735. package/dist/esm/components/session/endScreenIcons.js.map +0 -1
  736. package/dist/esm/components/signature-electronic/DocusealSignature.js.map +0 -1
  737. package/dist/esm/components/signature-electronic/SignatureElectronic.js.map +0 -1
  738. package/dist/esm/components/signature-electronic/SignatureElectronicIntroduction.js.map +0 -1
  739. package/dist/esm/components/signature-electronic/SignedDocumentPreview.js.map +0 -1
  740. package/dist/esm/components/start-flow/Start.js.map +0 -1
  741. package/dist/esm/components/states/ErrorState.js.map +0 -1
  742. package/dist/esm/components/states/LoadingState.js.map +0 -1
  743. package/dist/esm/components/states/NoSessionIdState.js.map +0 -1
  744. package/dist/esm/components/template/ComplementaryMandateNodeHandler.js.map +0 -1
  745. package/dist/esm/components/template/ConditionNodeHandler.js.map +0 -1
  746. package/dist/esm/components/template/ExternalVerificationNodeHandler.js.map +0 -1
  747. package/dist/esm/components/template/TemplateNodeRenderer.js.map +0 -1
  748. package/dist/esm/components/template/conditionNodePolicy.js.map +0 -1
  749. package/dist/esm/components/ui/Body.js.map +0 -1
  750. package/dist/esm/components/ui/Button.js.map +0 -1
  751. package/dist/esm/components/ui/ButtonDesktop.js.map +0 -1
  752. package/dist/esm/components/ui/Card.js.map +0 -1
  753. package/dist/esm/components/ui/MobilePageLayout.js.map +0 -1
  754. package/dist/esm/components/ui/PDFPreview.js.map +0 -1
  755. package/dist/esm/components/ui/PageActions.js.map +0 -1
  756. package/dist/esm/components/ui/Paper.js.map +0 -1
  757. package/dist/esm/components/ui/PoweredBy.js.map +0 -1
  758. package/dist/esm/components/ui/QRCodeDisplay.js.map +0 -1
  759. package/dist/esm/components/ui/SelectComponent.js.map +0 -1
  760. package/dist/esm/components/ui/Subtitle.js.map +0 -1
  761. package/dist/esm/components/ui/Title.js.map +0 -1
  762. package/dist/esm/config/env.js.map +0 -1
  763. package/dist/esm/constants/userInputForm.js.map +0 -1
  764. package/dist/esm/context/ConfigContext.js.map +0 -1
  765. package/dist/esm/context/DocumentContext.js.map +0 -1
  766. package/dist/esm/context/SessionContext.js.map +0 -1
  767. package/dist/esm/hooks/useClientInfo.js.map +0 -1
  768. package/dist/esm/hooks/useCountryOptions.js.map +0 -1
  769. package/dist/esm/hooks/useI18n.js.map +0 -1
  770. package/dist/esm/hooks/useIsMobile.js.map +0 -1
  771. package/dist/esm/hooks/useNfcSseStatus.js.map +0 -1
  772. package/dist/esm/hooks/useRouteCSS.js.map +0 -1
  773. package/dist/esm/hooks/useSession.js.map +0 -1
  774. package/dist/esm/hooks/useSessionData.js.map +0 -1
  775. package/dist/esm/hooks/useStepCSS.js.map +0 -1
  776. package/dist/esm/hooks/useStepNavigation.js.map +0 -1
  777. package/dist/esm/hooks/useTemplateLoader.js.map +0 -1
  778. package/dist/esm/hooks/useUserInputForm.js.map +0 -1
  779. package/dist/esm/i18n/country/country.en.json.js.map +0 -1
  780. package/dist/esm/i18n/country/country.fr.json.js.map +0 -1
  781. package/dist/esm/i18n/country/country.iso2.en.json.js.map +0 -1
  782. package/dist/esm/i18n/country/country.iso2.fr.json.js.map +0 -1
  783. package/dist/esm/i18n/documents/documents.en.json.js.map +0 -1
  784. package/dist/esm/i18n/documents/documents.fr.json.js.map +0 -1
  785. package/dist/esm/i18n/en.json.js.map +0 -1
  786. package/dist/esm/i18n/es.json.js.map +0 -1
  787. package/dist/esm/i18n/fr.json.js.map +0 -1
  788. package/dist/esm/i18n/index.js.map +0 -1
  789. package/dist/esm/index.css.js.map +0 -1
  790. package/dist/esm/index.js.map +0 -1
  791. package/dist/esm/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +0 -1
  792. package/dist/esm/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +0 -1
  793. package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +0 -1
  794. package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +0 -1
  795. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +0 -1
  796. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +0 -1
  797. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +0 -1
  798. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/localize.js.map +0 -1
  799. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/match.js.map +0 -1
  800. package/dist/esm/node_modules/date-fns/locale/en-US.js.map +0 -1
  801. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatDistance.js.map +0 -1
  802. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatLong.js.map +0 -1
  803. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatRelative.js.map +0 -1
  804. package/dist/esm/node_modules/date-fns/locale/fr/_lib/localize.js.map +0 -1
  805. package/dist/esm/node_modules/date-fns/locale/fr/_lib/match.js.map +0 -1
  806. package/dist/esm/node_modules/date-fns/locale/fr.js.map +0 -1
  807. package/dist/esm/node_modules/heic2any/dist/heic2any.js.map +0 -1
  808. package/dist/esm/node_modules/pdfjs-dist/legacy/build/pdf.js.map +0 -1
  809. package/dist/esm/node_modules/pdfjs-dist/legacy/build/pdf.worker.js.map +0 -1
  810. package/dist/esm/node_modules/style-inject/dist/style-inject.es.js.map +0 -1
  811. package/dist/esm/node_modules/tslib/tslib.es6.js.map +0 -1
  812. package/dist/esm/providers/I18nProvider.js.map +0 -1
  813. package/dist/esm/services/analysis.js.map +0 -1
  814. package/dist/esm/services/api.js.map +0 -1
  815. package/dist/esm/services/auditTrailService.js.map +0 -1
  816. package/dist/esm/services/cameraService.js.map +0 -1
  817. package/dist/esm/services/documentEdgeDetectionService.js.map +0 -1
  818. package/dist/esm/services/documentTemplate.js.map +0 -1
  819. package/dist/esm/services/iadService.js.map +0 -1
  820. package/dist/esm/services/integrationService.js.map +0 -1
  821. package/dist/esm/services/pollingService.js.map +0 -1
  822. package/dist/esm/services/professionalImageQuality.js.map +0 -1
  823. package/dist/esm/services/retryService.js.map +0 -1
  824. package/dist/esm/services/sessionCredentials.js.map +0 -1
  825. package/dist/esm/services/sessionMemoryStore.js.map +0 -1
  826. package/dist/esm/services/sessionService.js.map +0 -1
  827. package/dist/esm/services/utils.js.map +0 -1
  828. package/dist/esm/types/session.js.map +0 -1
  829. package/dist/esm/utils/analysisErrors.js.map +0 -1
  830. package/dist/esm/utils/apiAnalysis.js.map +0 -1
  831. package/dist/esm/utils/conditionEvaluator.js.map +0 -1
  832. package/dist/esm/utils/countryFlags.js.map +0 -1
  833. package/dist/esm/utils/cssLoader.js.map +0 -1
  834. package/dist/esm/utils/customFieldIds.js.map +0 -1
  835. package/dist/esm/utils/customFieldValidation.js.map +0 -1
  836. package/dist/esm/utils/documentLabels.js.map +0 -1
  837. package/dist/esm/utils/europeanCountries.js.map +0 -1
  838. package/dist/esm/utils/fileConverter.js.map +0 -1
  839. package/dist/esm/utils/imageConverter.js.map +0 -1
  840. package/dist/esm/utils/imageProcessing.js.map +0 -1
  841. package/dist/esm/utils/isMobileDevice.js.map +0 -1
  842. package/dist/esm/utils/isoCountryCodes.js.map +0 -1
  843. package/dist/esm/utils/jdiCodes.js.map +0 -1
  844. package/dist/esm/utils/labelToKey.js.map +0 -1
  845. package/dist/esm/utils/listFieldUtils.js.map +0 -1
  846. package/dist/esm/utils/mimeTypes.js.map +0 -1
  847. package/dist/esm/utils/navigation.js.map +0 -1
  848. package/dist/esm/utils/renderInlineMarkdown.js.map +0 -1
  849. package/dist/esm/utils/sessionStatus.js.map +0 -1
  850. package/dist/esm/utils/userInputForm.js.map +0 -1
  851. package/dist/esm/utils/utils.js.map +0 -1
  852. package/dist/esm/utils/validationUtils.js.map +0 -1
  853. package/docs/COMPLEMENTARY_MANDATE.md +0 -22
  854. package/docs/GITLAB_BADGES_SETUP.md +0 -317
  855. package/docs/JOURNEY_NODE_BUILDER.md +0 -222
  856. package/docs/POLLING_SYSTEM.md +0 -699
  857. package/docs/README.md +0 -254
  858. package/docs/SESSION_TOKEN_MIGRATION.md +0 -52
  859. package/docs/condition-node.md +0 -651
  860. package/docs/configuration.md +0 -113
  861. package/docs/dynamic-configuration.md +0 -97
  862. package/docs/environment.md +0 -27
  863. package/docs/migration-guide.md +0 -120
  864. package/docs/multi-runs.md +0 -111
  865. package/docs/navigation-history.md +0 -163
  866. package/docs/sdk_integration_guide.md +0 -58
  867. package/eslint.config.js +0 -13
  868. package/examples/analysis-progress-example.tsx +0 -220
  869. package/examples/sdk-configuration.ts +0 -187
  870. package/examples/test-updated-urls.ts +0 -162
  871. package/examples/usage-example.tsx +0 -49
  872. package/jest.config.js +0 -32
  873. package/postcss.config.js +0 -6
  874. package/renovate.json +0 -242
  875. package/rollup.asset-url-plugin.js +0 -38
  876. package/rollup.dev.config.js +0 -65
  877. package/setupTests.js +0 -41
  878. package/tailwind.config.js +0 -11
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessionService.js","sources":["../../../../src/services/sessionService.ts"],"sourcesContent":["import type { ComplementaryMandateOutcome } from '../types/session';\n/**\n * Session Service\n *\n * Service for interacting with the Datakeen Session API.\n * Handles fetching session data by ID.\n */\n\nimport type {\n ClientInfo,\n SessionData,\n SessionTemplate,\n SessionTemplateNode,\n} from \"../types/session\";\nimport { apiService } from \"./api\";\nimport { logStatusModified } from \"./auditTrailService\";\nimport { clearSessionMemory } from \"./sessionMemoryStore\";\n\n/**\n * Fetches session data by ID from the Datakeen backend\n *\n * @param sessionId - The unique identifier of the session\n * @returns The session data\n */\nexport const fetchSessionById = async (\n sessionId: string,\n): Promise<SessionData> => {\n try {\n const response = await apiService.get(`/session/sdk/${sessionId}`);\n return response.data;\n } catch (error) {\n console.error(\"Error fetching session data:\", error);\n throw error;\n }\n};\n\n/** Sends client information (IP, device, browser, OS) to the backend for a specific session\n *\n * @param sessionId - The unique identifier of the session\n * @param clientInfo - The client information to send\n */\nexport const sendClientInfo = async (\n sessionId: string,\n clientInfo: ClientInfo,\n): Promise<void> => {\n try {\n await apiService.post(`/session/sdk/${sessionId}/client-info`, clientInfo);\n } catch (error) {\n console.error(\"Error sending client info:\", error);\n throw error;\n }\n};\n\n/**\n * Determines if the session template has a specific type of node\n *\n * @param template - The session template\n * @param nodeType - The type of node to check for\n * @returns true if the template has a node of the specified type, false otherwise\n */\nexport const hasNodeType = (\n template: SessionTemplate,\n nodeType: string,\n): boolean => {\n return template.nodes.some((node) => node.type === nodeType);\n};\n\n/**\n * Determines if the session template has a node with a specific requiredDocumentType\n *\n * @param template - The session template\n * @param requiredDocumentType - The requiredDocumentType to check for\n * @returns true if the template has a node with the specified requiredDocumentType, false otherwise\n */\nexport const hasDocumentTypeNode = (\n template: SessionTemplate,\n requiredDocumentType: string,\n): boolean => {\n return template.nodes.some(\n (node) => node.requiredDocumentType === requiredDocumentType,\n );\n};\n\n/**\n * Gets all nodes of a specific type\n *\n * @param template - The session template\n * @param nodeType - The type of node to get\n * @returns Array of nodes matching the type\n */\nexport const getNodesByType = (\n template: SessionTemplate,\n nodeType: string,\n): SessionTemplateNode[] => {\n return template.nodes.filter((node) => node.type === nodeType);\n};\n\n/**\n * Gets all nodes with a specific requiredDocumentType\n *\n * @param template - The session template\n * @param requiredDocumentType - The requiredDocumentType to get\n * @returns Array of nodes matching the requiredDocumentType\n */\nexport const getNodesByDocumentType = (\n template: SessionTemplate,\n requiredDocumentType: string,\n): SessionTemplateNode[] => {\n return template.nodes.filter(\n (node) => node.requiredDocumentType === requiredDocumentType,\n );\n};\n\n/**\n * Get document options for a specific document type\n *\n * @param template - The session template\n * @param requiredDocumentType - The document type to get options for\n * @returns Array of document options (empty if none found)\n */\nexport const getDocumentOptions = (\n template: SessionTemplate,\n requiredDocumentType: string,\n): string[] => {\n const node = template.nodes.find(\n (node) => node.requiredDocumentType === requiredDocumentType,\n );\n return node?.selectedOptions || [];\n};\n\n/**\n * Determines if the session template has a selfie step\n *\n * @param template - The session template\n * @returns true if the template has a selfie step, false otherwise\n */\nexport const hasSelfieCaptureStep = (template: SessionTemplate): boolean => {\n return hasNodeType(template, \"selfie-capture\");\n};\n\n/**\n * Determines if the session template has an ID document step\n *\n * @param template - The session template\n * @returns true if the template has an ID document step, false otherwise\n */\nexport const hasDocumentStep = (template: SessionTemplate): boolean => {\n // Check if there's any document-selection node with requiredDocumentType \"id-card\"\n // or if none specified, just check for document-selection nodes\n const hasIDCard = hasDocumentTypeNode(template, \"id-card\");\n return hasIDCard || hasNodeType(template, \"document-selection\");\n};\n\n/**\n * Determines if the session template has a JDD (proof of address) step\n *\n * @param template - The session template\n * @returns true if the template has a JDD step, false otherwise\n */\nexport const hasJDDStep = (template: SessionTemplate): boolean => {\n return hasDocumentTypeNode(template, \"jdd\");\n};\n\n/**\n * Determines if the session template has a proof of funds step\n *\n * @param template - The session template\n * @returns true if the template has a proof of funds step, false otherwise\n */\nexport const hasProofOfFundsStep = (template: SessionTemplate): boolean => {\n return hasDocumentTypeNode(template, \"income-proof\");\n};\n\n/**\n * Determines if the session template has a document collection step\n *\n * @param template - The session template\n * @returns true if the template has a document collection step, false otherwise\n */\nexport const hasDocumentCollectionStep = (\n template: SessionTemplate,\n): boolean => {\n return hasNodeType(template, \"document-collection\");\n};\n\n/**\n * Gets all node types in the template\n *\n * @param template - The session template\n * @returns Array of node types in the template\n */\nexport const getNodeTypes = (template: SessionTemplate): string[] => {\n return Array.from(new Set(template.nodes.map((node) => node.type)));\n};\n\n/**\n * Gets all document types required in the template\n *\n * @param template - The session template\n * @returns Array of document types required in the template\n */\nexport const getRequiredDocumentTypes = (\n template: SessionTemplate,\n): string[] => {\n return Array.from(\n new Set(\n template.nodes\n .filter((node) => node.requiredDocumentType)\n .map((node) => node.requiredDocumentType!),\n ),\n );\n};\n\n/**\n * Converts template document type to internal document type\n * This helps standardize document types between the template and the application\n *\n * @param templateDocType - The document type as defined in the template\n * @returns The internal document type used by the application\n */\nexport const convertTemplateDocTypeToInternal = (\n templateDocType: string,\n): string => {\n if (!templateDocType) return \"\";\n\n // Mapping between template document types and internal document types\n const typeMap: Record<string, string> = {\n \"id-card\": \"id-card\",\n jdd: \"jdd\",\n \"income-proof\": \"income-proof\", // Using consistent naming\n };\n\n return typeMap[templateDocType] || templateDocType;\n};\n\n/**\n * Converts internal document type to template document type\n *\n * @param internalDocType - The document type used internally by the application\n * @returns The document type as expected in the template\n */\nexport const convertInternalDocTypeToTemplate = (\n internalDocType: string,\n): string => {\n if (!internalDocType) return \"\";\n\n // Mapping between internal document types and template document types\n const typeMap: Record<string, string> = {\n \"id-card\": \"id-card\",\n jdd: \"jdd\",\n funds: \"income-proof\", // Map funds to income-proof for backwards compatibility\n \"income-proof\": \"income-proof\",\n };\n\n return typeMap[internalDocType] || internalDocType;\n};\n\n/**\n * Updates session data with user input information\n *\n * @param sessionId - The unique identifier of the session\n * @param userInput - The user input data (firstName, lastName, birthDate)\n * @returns The updated session data\n */\nexport const updateSessionUserInput = async (\n sessionId: string,\n userInput: {\n firstName?: string;\n lastName?: string;\n birthDate?: string;\n [key: string]: unknown;\n },\n): Promise<SessionData> => {\n try {\n const response = await apiService.patch(`/session/sdk/${sessionId}`, {\n userInput,\n });\n return response.data;\n } catch (error) {\n console.error(\"Error updating session data:\", error);\n throw error;\n }\n};\n\n/**\n * Records the NFC fallback reason when the user declares they cannot use the\n * contactless scan, and marks the NFC scan as skipped server-side.\n *\n * @param sessionId - The unique identifier of the session\n * @param payload - The selected reason (technical key), its human-readable label,\n * and an optional free-text comment.\n */\nexport const skipNfcWithReason = async (\n sessionId: string,\n payload: { reason: string; label: string; comment?: string },\n): Promise<void> => {\n await apiService.post(`/session/sdk/${sessionId}/nfc-skip`, payload);\n};\n\nexport type SelfieFailureReason =\n | \"timeout\"\n | \"network_error\"\n | \"api_error\"\n | \"user_bypassed\";\n\nexport interface SelfieFailurePayload {\n nodeId: string;\n reason?: SelfieFailureReason;\n conformityCode?: string;\n bypassed?: boolean;\n}\n\nexport const reportSelfieFailure = async (\n sessionId: string,\n payload: SelfieFailurePayload,\n): Promise<void> => {\n await apiService.post(`/session/sdk/${sessionId}/selfie-failed`, payload);\n};\n\n/**\n * Resets a terminal NFC failure before the user starts again with another\n * document. The backend keeps completed scans immutable and treats this call\n * as a no-op when the status is not terminal.\n */\nexport const resetNfcScan = async (sessionId: string): Promise<void> => {\n await apiService.post(`/session/sdk/${sessionId}/nfc-reset`);\n};\n\n/**\n * Updates session data with contact information\n *\n * @param sessionId - The unique identifier of the session\n * @param contactInfo - The contact information data (email, phoneNumber)\n * @returns The updated session data\n */\nexport const updateSessionContactInfo = async (\n sessionId: string,\n contactInfo: {\n email: string;\n phoneNumber: string;\n [key: string]: unknown;\n },\n): Promise<SessionData> => {\n try {\n const response = await apiService.patch(`/session/sdk/${sessionId}`, {\n contactInfo,\n });\n return response.data;\n } catch (error) {\n console.error(\"Error updating contact information:\", error);\n throw error;\n }\n};\n\n/**\n * Updates session status\n *\n * @param sessionId - The unique identifier of the session\n * @param status - The new status for the session\n * @param reachedEndNodeId - Id of the end node actually reached (when status is \"ended\"),\n * so the backend can force the correct final status with multiple end nodes.\n * @returns The updated session data\n */\nexport const updateSessionStatus = async (\n sessionId: string,\n status: string,\n reachedEndNodeId?: string,\n): Promise<SessionData> => {\n try {\n const response = await apiService.patch(`/session/sdk/${sessionId}`, {\n status,\n ...(reachedEndNodeId ? { reachedEndNodeId } : {}),\n });\n\n // Log status modification in audit trail\n if (response.data && response.data.analysisId) {\n try {\n await logStatusModified(\n sessionId,\n status,\n response.data.clientInfoId || undefined,\n );\n } catch (err) {\n console.error(\"Failed to log status modification in audit trail:\", err);\n // Non-blocking error - continue session\n }\n }\n\n return response.data;\n } catch (error) {\n console.error(\"Error updating session status:\", error);\n throw error;\n }\n};\n\n/**\n * Updates the current step in the session\n *\n * @param sessionId - The unique identifier of the session\n * @param currentStep - The current step index in the workflow\n * @returns The updated session data\n */\nexport const updateSessionCurrentStep = async (\n sessionId: string,\n currentStep: number,\n): Promise<SessionData> => {\n try {\n const response = await apiService.patch(`/session/sdk/${sessionId}`, {\n currentStep,\n });\n return response.data;\n } catch (error) {\n console.error(\"Error updating session current step:\", error);\n throw error;\n }\n};\n\n/**\n * Gets the journey steps from the template in order\n *\n * @param template - The session template\n * @returns Array of ordered steps\n */\nexport const getOrderedJourneySteps = (\n template: SessionTemplate,\n): SessionTemplateNode[] => {\n // Filter out only start nodes, keep end nodes for proper journey completion, then sort by order.\n // Tiebreaker on id keeps the ordering deterministic when several nodes share the same `order`\n // (e.g. parallel branches of a condition), independently of their position in template.nodes.\n return template.nodes\n .filter((node) => node.type !== \"start\")\n .sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));\n};\n\nconst normalizeHandle = (value?: string): string => {\n return (value || \"\").trim().toLowerCase();\n};\n\n/**\n * Finds the outgoing edge to follow from a node.\n *\n * Resolution order:\n * 1. Exact handle match via sourceHandle/conditionValue.\n * 2. For condition:false loops, fallback to targetHandle=right.\n * 3. First outgoing edge as final fallback.\n */\nexport const findOutgoingEdge = (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n): SessionTemplate[\"edges\"][number] | null => {\n const outgoingEdges = (template.edges || []).filter(\n (edge) => edge.source === currentNodeId,\n );\n\n if (outgoingEdges.length === 0) {\n return null;\n }\n\n if (!handle) {\n return outgoingEdges[0];\n }\n\n const normalizedHandle = normalizeHandle(handle);\n const edgeByHandle = outgoingEdges.find((edge) => {\n return (\n normalizeHandle(edge.sourceHandle) === normalizedHandle ||\n normalizeHandle(edge.conditionValue) === normalizedHandle\n );\n });\n\n if (edgeByHandle) {\n return edgeByHandle;\n }\n\n const currentNode = template.nodes.find((node) => node.id === currentNodeId);\n if (currentNode?.type === \"condition\" && normalizedHandle === \"false\") {\n const rightHandleLoopEdge = outgoingEdges.find(\n (edge) => normalizeHandle(edge.targetHandle) === \"right\",\n );\n if (rightHandleLoopEdge) {\n return rightHandleLoopEdge;\n }\n }\n\n return outgoingEdges[0];\n};\n\n/**\n * Strict existence check for a named outgoing edge — unlike `findOutgoingEdge`,\n * this does NOT fall back to the first outgoing edge when no edge matches the\n * handle. Used by controle-jdi to decide whether a node is \"new-style\" (author\n * explicitly wired a \"false\" edge, enabling automatic true/false routing) or\n * \"legacy\" (single edge, preserve the existing manual continue/retry UX).\n */\nexport const hasOutgoingEdgeForHandle = (\n currentNodeId: string,\n template: SessionTemplate,\n handle: string,\n): boolean => {\n const normalizedHandle = normalizeHandle(handle);\n return (template.edges || []).some(\n (edge) =>\n edge.source === currentNodeId &&\n normalizeHandle(edge.sourceHandle) === normalizedHandle,\n );\n};\n\n/**\n * Gets the next step index by following the graph edge from the current node\n *\n * @param currentNodeId - The ID of the current node\n * @param template - The session template\n * @returns The next step index (1-based) or null if no edge found\n */\nexport const getNextStepIndex = (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n): number | null => {\n const orderedNodes = getOrderedJourneySteps(template);\n const edge = findOutgoingEdge(currentNodeId, template, handle);\n\n if (!edge) {\n console.debug(\n `[sessionService] No outgoing edge found for node ${currentNodeId}${handle ? ` with handle ${handle}` : \"\"}`,\n );\n return null;\n }\n\n const targetId = edge.target;\n const targetIndex = orderedNodes.findIndex((n) => n.id === targetId);\n\n if (targetIndex === -1) {\n console.debug(\n `[sessionService] Target node ${targetId} not found in ordered steps`,\n );\n return null;\n }\n\n // steps are 1-indexed in the SDK (0 is StartSession)\n return 1 + targetIndex;\n};\n\n/**\n * Reconstructs the navigation history by following the graph from step 0\n * up to (and including) targetStep. Returns [0, ...stepIndices].\n * If the graph path cannot reach targetStep, falls back to [0, targetStep].\n */\nexport const reconstructHistoryToStep = (\n targetStep: number,\n template: SessionTemplate,\n): number[] => {\n if (targetStep <= 0) return [0];\n\n const orderedNodes = getOrderedJourneySteps(template);\n const history: number[] = [0];\n let currentStep = 1; // first node is step 1\n\n // Follow the default (first) edge from each node in sequence\n for (let safetyLimit = 0; safetyLimit < orderedNodes.length + 1; safetyLimit++) {\n if (currentStep === targetStep) {\n history.push(currentStep);\n break;\n }\n if (currentStep > targetStep) break;\n\n const nodeIndex = currentStep - 1;\n const currentNode = orderedNodes[nodeIndex];\n if (!currentNode) break;\n\n history.push(currentStep);\n\n const nextStep = getNextStepIndex(currentNode.id, template);\n if (nextStep === null) break;\n currentStep = nextStep;\n }\n\n // Fallback: if we couldn't reach targetStep via graph, use simple seed\n if (history[history.length - 1] !== targetStep) {\n return [0, targetStep];\n }\n\n return history;\n};\n\n/**\n * Maps a template node type to a step component type\n *\n * @param node - The session template node\n * @returns The step component type\n */\nexport const getStepComponentType = (node: SessionTemplateNode): string => {\n // Map from template node types to component types\n const typeMap: Record<string, string> = {\n \"document-selection\": \"document\",\n \"document-collection\": \"document-collection\",\n \"selfie-capture\": \"selfie\",\n \"contact-info\": \"contact-info\",\n \"user-input\": \"user-input\",\n \"otp-verification\": \"otp\",\n };\n\n // First check the node type\n if (node.type in typeMap) {\n return typeMap[node.type];\n }\n\n // Then check the requiredDocumentType\n if (node.requiredDocumentType) {\n return node.requiredDocumentType;\n }\n\n // Default fallback\n return node.type;\n};\n\n/**\n * Checks if a session has expired\n *\n * @param session - The session data to check\n * @returns true if the session has expired, false otherwise\n */\nexport const isSessionExpired = (session: SessionData): boolean => {\n if (!session.expireTime) {\n return false;\n }\n\n const currentTime = Date.now();\n return currentTime > session.expireTime;\n};\n\n/**\n * Stores document options in localStorage for a specific document type\n *\n * @param sessionId - The session ID\n * @param documentTypeId - The document type ID (e.g., 'jdd', 'income-proof')\n * @param options - The options to store\n */\nexport const storeDocumentOptions = (\n sessionId: string,\n documentTypeId: string,\n options: string[],\n): void => {\n if (!sessionId || !documentTypeId || !options || options.length === 0) {\n console.warn(\"Missing data for storeDocumentOptions:\", {\n sessionId,\n documentTypeId,\n options,\n });\n return;\n }\n\n // Create a consistent key format based on document type\n let storageKey = \"\";\n\n switch (documentTypeId) {\n case \"jdd\":\n storageKey = `jddOptions_${sessionId}`;\n break;\n case \"income-proof\":\n storageKey = `fundsOptions_${sessionId}`;\n break;\n case \"id-card\":\n storageKey = `idOptions_${sessionId}`;\n break;\n case \"document-collection\":\n storageKey = `documentCollectionOptions_${sessionId}`;\n break;\n default:\n storageKey = `${documentTypeId}Options_${sessionId}`;\n }\n\n localStorage.setItem(storageKey, JSON.stringify(options));\n};\n\n/**\n * Retrieves document options from localStorage for a specific document type\n *\n * @param sessionId - The session ID\n * @param documentTypeId - The document type ID (e.g., 'jdd', 'income-proof')\n * @returns Array of options or default options if none found\n */\nexport const retrieveDocumentOptions = (\n sessionId: string,\n documentTypeId: string,\n): string[] => {\n if (!sessionId || !documentTypeId) {\n console.warn(\"Missing data for retrieveDocumentOptions:\", {\n sessionId,\n documentTypeId,\n });\n return [];\n }\n\n // Create consistent key formats to check\n const possibleKeys = [\n `${documentTypeId}Options_${sessionId}`,\n documentTypeId === \"jdd\" ? `jddOptions_${sessionId}` : \"\",\n documentTypeId === \"income-proof\" ? `fundsOptions_${sessionId}` : \"\",\n documentTypeId === \"id-card\" ? `idOptions_${sessionId}` : \"\",\n documentTypeId === \"document-collection\"\n ? `documentCollectionOptions_${sessionId}`\n : \"\",\n ].filter(Boolean);\n\n // Try each possible key\n for (const key of possibleKeys) {\n const savedOptions = localStorage.getItem(key);\n if (savedOptions) {\n try {\n const parsedOptions = JSON.parse(savedOptions);\n\n return parsedOptions;\n } catch (e) {\n console.error(\n `Error parsing options for ${documentTypeId} with key ${key}:`,\n e,\n );\n }\n }\n }\n\n // Return default options if none found\n console.warn(`No options found for ${documentTypeId}, using defaults`);\n if (documentTypeId === \"jdd\") {\n return [\n \"Facture d'électricité (< 3 mois)\",\n \"Facture de gaz (< 3 mois)\",\n \"Facture d'eau (< 3 mois)\",\n \"Quittance de loyer (< 3 mois)\",\n \"Facture téléphone/internet (< 3 mois)\",\n \"Attestation d'assurance habitation (< 3 mois)\",\n ];\n } else if (documentTypeId === \"income-proof\") {\n return [\n \"Bulletin de salaire\",\n \"Avis d'imposition\",\n \"Relevé de compte bancaire\",\n \"Attestation de revenus\",\n \"Contrat de travail\",\n ];\n } else if (documentTypeId === \"id-card\") {\n return [\"Carte nationale d'identité\", \"Passeport\", \"Permis de conduire\"];\n } else if (documentTypeId === \"document-collection\") {\n return [\"Document administratif\", \"Justificatif\", \"Attestation\"];\n }\n\n return [];\n};\n\nconst clearStorageBySessionId = (sessionId: string): void => {\n const scopedKeys = [\n `userInput_${sessionId}`,\n `contactInfo_${sessionId}`,\n `sessionData_${sessionId}`,\n ];\n\n scopedKeys.forEach((key) => {\n localStorage.removeItem(key);\n sessionStorage.removeItem(key);\n });\n\n for (let i = localStorage.length - 1; i >= 0; i -= 1) {\n const key = localStorage.key(i);\n if (!key) {\n continue;\n }\n if (key.endsWith(`_${sessionId}`)) {\n localStorage.removeItem(key);\n }\n }\n\n for (let i = sessionStorage.length - 1; i >= 0; i -= 1) {\n const key = sessionStorage.key(i);\n if (!key) {\n continue;\n }\n if (key.endsWith(`_${sessionId}`)) {\n sessionStorage.removeItem(key);\n }\n }\n\n if (localStorage.getItem(\"sessionId\") === sessionId) {\n localStorage.removeItem(\"sessionId\");\n }\n if (sessionStorage.getItem(\"sessionId\") === sessionId) {\n sessionStorage.removeItem(\"sessionId\");\n }\n};\n\n/**\n * Clears all client-side session traces (memory + browser storage)\n * for a given session. This is intentionally aggressive for security.\n */\nexport const clearSessionSensitiveData = (sessionId?: string): void => {\n clearSessionMemory(sessionId);\n\n if (sessionId) {\n clearStorageBySessionId(sessionId);\n return;\n }\n\n localStorage.removeItem(\"sessionId\");\n sessionStorage.removeItem(\"sessionId\");\n\n for (let i = localStorage.length - 1; i >= 0; i -= 1) {\n const key = localStorage.key(i);\n if (!key) {\n continue;\n }\n if (\n key.startsWith(\"userInput_\") ||\n key.startsWith(\"contactInfo_\") ||\n key.includes(\"Options_\")\n ) {\n localStorage.removeItem(key);\n }\n }\n\n for (let i = sessionStorage.length - 1; i >= 0; i -= 1) {\n const key = sessionStorage.key(i);\n if (!key) {\n continue;\n }\n if (\n key.startsWith(\"userInput_\") ||\n key.startsWith(\"contactInfo_\") ||\n key.includes(\"Options_\")\n ) {\n sessionStorage.removeItem(key);\n }\n }\n};\n\n/**\n * Returns the pre-fill data for a given run index from a `userInput` object\n * that contains a `_list` array.\n *\n * Convention: when the integrator wants to pre-fill different data per run\n * (e.g. multiple persons in a loop), they pass `userInput: { _list: [...] }`\n * at session creation. Each element in `_list` corresponds to a run (0-indexed).\n *\n * @param userInput - The session's userInput object\n * @param runIndex - The current run index (0 = first pass, 1 = second pass, …)\n * @returns The pre-fill data for that run, or null if not defined\n */\nexport const getRunPrefillData = (\n userInput: Record<string, unknown>,\n runIndex: number,\n): Record<string, unknown> | null => {\n const list = userInput?._list;\n if (!Array.isArray(list)) return null;\n return (list[runIndex] as Record<string, unknown>) ?? null;\n};\n\n/**\n * Checks en cours par nœud : un double montage (StrictMode, remontage) partage\n * la même requête au lieu d'en lancer une seconde qui entrerait en concurrence\n * avec la première côté serveur. L'entrée est libérée dès que l'appel aboutit,\n * pour qu'un réessai reparte bien du serveur.\n */\nconst pendingMandateChecks = new Map<string, Promise<{ outcome: ComplementaryMandateOutcome }>>();\n\n/** The server reads persisted identity; no identity or verdict is submitted. */\nexport function checkComplementaryMandate(sessionId: string, nodeId: string): Promise<{ outcome: ComplementaryMandateOutcome }> {\n const key = `${sessionId}:${nodeId}`;\n const pending = pendingMandateChecks.get(key);\n if (pending) return pending;\n const request = (async () => {\n const response = await apiService.post(`/session/sdk/${sessionId}/complementary-mandate/${encodeURIComponent(nodeId)}`);\n const outcome = response.data?.outcome;\n if (!['same_signer', 'new_signer', 'no_mandate'].includes(outcome)) throw new Error('Invalid complementary mandate outcome');\n return { outcome };\n })().finally(() => pendingMandateChecks.delete(key));\n pendingMandateChecks.set(key, request);\n return request;\n}\n"],"names":["__awaiter","apiService","__assign","logStatusModified","clearSessionMemory"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/services/utils.ts"],"sourcesContent":["export function dataURLtoFile(dataurl: string, filename: string): File {\n const arr = dataurl.split(\",\");\n const mime = arr[0].match(/:(.*?);/)?.[1] || \"application/octet-stream\";\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n // Créer un File avec les propriétés nécessaires\n const file = new File([u8arr], filename, { type: mime });\n\n // Ajouter les propriétés que Multer attend (hack nécessaire)\n (file as any).originalname = filename;\n (file as any).mimetype = mime;\n\n return file;\n}\n\nexport function getMimeTypeFromDataURL(dataurl: string): string | null {\n const match = dataurl.match(/^data:(.*?);/);\n return match ? match[1] : null;\n}\n\n// Map conformity code to the corresponding step index\nexport const codeToStep = (code: string): number => {\n if (!code) return 0; // Default to generic error if no code is provided\n\n // Success case - codes 1.0 and 4.0 should go to success screen (step 4)\n if (code === \"1.0\" || code === \"4.0\") {\n return 4; // Conform - success\n }\n\n // Document not valid (codes 7.x) - check this before codes 2.x\n if (code.startsWith(\"7\")) {\n // Document not valid\n return 3;\n }\n\n // Document not readable/processing issues (codes 2.x)\n if (code.startsWith(\"2\")) {\n // Document not readable\n return 1;\n }\n\n // Document does not correspond to user input (codes 3.x, 4.x, 5.x, 8.x)\n if (\n code.startsWith(\"3\") ||\n code.startsWith(\"4\") ||\n code.startsWith(\"5\") ||\n code.startsWith(\"8\")\n ) {\n // Document does not correspond to user input\n return 2;\n }\n\n return 0; // Default to generic error\n};\n"],"names":[],"mappings":";;AAAM,SAAU,aAAa,CAAC,OAAe,EAAE,QAAgB,EAAA;;IAC7D,IAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9B,IAAA,IAAM,IAAI,GAAG,CAAA,MAAA,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAG,CAAC,CAAC,KAAI,0BAA0B;IACvE,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB,IAAA,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;AACnB,IAAA,IAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC;IAE/B,OAAO,CAAC,EAAE,EAAE;QACV,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/B;;AAGA,IAAA,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;AAGvD,IAAA,IAAY,CAAC,YAAY,GAAG,QAAQ;AACpC,IAAA,IAAY,CAAC,QAAQ,GAAG,IAAI;AAE7B,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,sBAAsB,CAAC,OAAe,EAAA;IACpD,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;AAC3C,IAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;AAChC;AAEA;AACO,IAAM,UAAU,GAAG,UAAC,IAAY,EAAA;;IAIrC,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QACpC,OAAO,CAAC,CAAC;IACX;;AAGA,IAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;;AAExB,QAAA,OAAO,CAAC;IACV;;AAGA,IAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;;AAExB,QAAA,OAAO,CAAC;IACV;;AAGA,IAAA,IACE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EACpB;;AAEA,QAAA,OAAO,CAAC;IACV;IAEA,OAAO,CAAC,CAAC;AACX;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.js","sources":["../../../../src/types/session.ts"],"sourcesContent":["import type React from \"react\";\n\nexport interface SessionConfig {\n sessionToken?: string;\n selfie?: boolean;\n requireMobile?: boolean;\n}\n\nexport interface DatakeenSessionProps {\n /** Session credential returned by server-side session creation. Required by secured backends. */\n sessionToken?: string;\n sessionId: string;\n sessionConfig?: SessionConfig;\n apiBaseUrl?: string; // Optional API base URL for dynamic environment configuration\n}\n\nexport interface UseSessionReturn {\n SessionComponent: React.ReactElement;\n}\n\nexport type stepObject = {\n setStep: (step: number, skipHistory?: boolean) => void;\n goBack: () => void;\n /** Retour arrière vers un nœud précis (ex: \"Corriger ma saisie\") :\n * tronque l'historique jusqu'à `targetStep` au lieu de l'empiler. */\n goBackToStep: (targetStep: number) => void;\n goToNextStep: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n /** Avance via le graphe et tronque l'historique au nœud d'arrivée. */\n goToNextStepCommitted: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n step: number;\n canGoBack: boolean;\n};\n\nexport interface ProcessingStep {\n title: string;\n subtitle: string;\n hasError?: boolean;\n}\n\nexport type ConditionTokenType = \"variable\" | \"control\" | \"operator\" | \"input\";\n\nexport interface ConditionToken {\n type: ConditionTokenType;\n value: string;\n label?: string;\n sourceNodeId?: string;\n}\n\n/**\n * Type for custom field value types\n */\nexport type CustomFieldValueType =\n | \"text\"\n | \"enum\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"email\"\n | \"address\"\n | \"list\";\n\n/**\n * Display formats supported for date fields (top-level and list columns).\n */\nexport type DateDisplayFormat = \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy-mm-dd\";\n\nexport const DEFAULT_DATE_DISPLAY_FORMAT: DateDisplayFormat = \"dd/mm/yyyy\";\n\n/** Un cas de la règle : une option du pilote → un regex. */\nexport interface ListColumnRegexCase {\n value: string; // valeur exacte d'une option du pilote\n regex: string; // source JS sans slashes ; vide = pas de contrainte\n errorMessage?: string; // message spécifique à ce cas\n}\n\n/** Regex conditionnelle pilotée par une autre colonne enum de la même ligne. */\nexport interface ListColumnRegexRules {\n /** Builder-only explicit opt-out for uncovered text options. */\n allowUnconstrained?: boolean;\n sourceColumn: string; // label de la colonne enum pilote\n cases: ListColumnRegexCase[]; // une entrée par option couverte\n}\n\n/**\n * Column definition for a list-type custom field\n */\nexport interface ListColumn {\n label: string;\n type: \"text\" | \"enum\" | \"date\" | \"email\";\n options?: string[]; // required when type === 'enum'\n placeholder?: string; // text/email/date — shown to the end user\n regex?: string; // text/email — JS regex source (without slashes)\n regexErrorMessage?: string; // text/email — message displayed when regex fails\n regexRules?: ListColumnRegexRules; // text/email — conditional regex rules\n dateFormat?: DateDisplayFormat; // date — display format expected\n}\n\n/**\n * Interface for custom field definition\n */\nexport interface CustomField {\n id: string;\n label: string;\n placeholder?: string;\n description?: string;\n valueType: CustomFieldValueType;\n enumOptions?: string[];\n listColumns?: ListColumn[]; // for list type: column definitions\n minRows?: number; // for list type: minimum rows expected\n required?: boolean;\n /** Absent means personal data. Lists are classified as a whole, not per column. */\n containsPersonalData?: boolean;\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n lockedFromApi?: boolean;\n editableIfMissing?: boolean; // soft lock — éditable si la valeur API est absente\n userInputKey?: string;\n}\n\n/**\n * Interface for session template node\n */\nexport interface SessionTemplateNode {\n id: string;\n type: string;\n title: string;\n description: string;\n informationType?:\n | \"identity\"\n | \"identity-legal\"\n | \"contact\"\n | \"address\"\n | \"nationality\"\n | \"custom\";\n position: {\n x: number;\n y: number;\n };\n options: unknown[];\n selectedOptions: string[];\n requiredDocumentType?: string;\n isRequired: boolean;\n order: number;\n optionalFields?: string[];\n requiredFields?: string[];\n pageTitle?: string;\n pageDescription?: string;\n // Properties for document-collection node type\n allowedDocumentTypes?: Array<{\n id: string;\n name: string;\n /**\n * Optional side information coming from the template.\n * When provided and equals to two (\"two\", 2, \"double\", \"recto-verso\"),\n * consumers should allow uploading two sides (front/back).\n */\n side?: string | number;\n }>;\n allowedAddingMethods?: string[];\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n // Start node specific properties\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n qrCodeTitle?: string;\n qrCodeDescription?: string;\n\n // Legal consent node specific properties\n consentDescription?: string;\n consentDescription2?: string;\n cguUrl?: string;\n privacyPolicyUrl?: string;\n cguLinkLabel?: string;\n privacyLinkLabel?: string;\n checkboxText?: string;\n // Identity control specific properties\n automaticPhotoCapture?: boolean;\n nfcEnabled?: boolean;\n // \"nfcAndApi\" reste accepté pour rétrocompat (parcours legacy) ; à normaliser à la lecture.\n nfcMode?: \"nfcOnly\" | \"nfcOrPhoto\" | \"nfcAndApi\";\n iad?: {\n enabled: boolean;\n level?: \"basic\" | \"reinforced\";\n };\n acceptedCountries?: AcceptedCountry[];\n // End node specific properties\n callbackURL?: string | null;\n // Résultat forcé par le nœud `end` (configuré dans le builder). Sert au SDK à\n // afficher la variante « erreur conservée » de l'écran de fin quand la branche\n // fausse d'une condition pointe directement vers un end non_compliant.\n expectedResult?: string;\n // Condition node specific properties\n conditionExpression?: string;\n conditionTokens?: ConditionToken[];\n conditionFalseErrorMessage?: string;\n conditionMaxRetries?: number;\n conditionMaxRetryAction?: \"end-journey\" | \"force-true\";\n // Undefined is treated as \"loop\" by the SDK for legacy templates.\n conditionFalseMode?: \"retry\" | \"loop\";\n\n // External verification specific properties\n targetApi?: \"INSEE\" | \"INPI_RBE\";\n /** INPI_RBE only. Opt-in: retry against the RNA (associations) when the RNE finds nothing. */\n rnaFallbackEnabled?: boolean;\n /**\n * INPI_RBE only. Opt-in: retry against INSEE (Sirene) when the RNE finds\n * nothing. Tried before the RNA fallback when both are enabled.\n */\n enableInseeFallback?: boolean;\n referenceNodeId?: string;\n referenceNodeType?:\n | \"information-input\"\n | \"document-collection\"\n | \"identity-control\";\n referenceField?: \"siren\" | \"siret\";\n referenceVariable?: string;\n // Custom form fields (for information-input with type 'custom')\n customFields?: CustomField[];\n\n // Electronic signature specific properties\n templateId?: string;\n external_id?: string;\n /** Écran affiché après la signature. Valeurs vides : textes standard traduits. */\n signedScreenTitle?: string;\n signedScreenDescription?: string;\n signedScreenDownloadHint?: string;\n fieldMappings?: Array<{\n sourceFieldId: string;\n label: string;\n docusealType: string;\n readonly: boolean;\n role?: string;\n sourceNodeId?: string;\n }>;\n /** If set, the generated PDF from this upstream pdf-generation node will be used as the document to sign */\n sourcePdfNodeId?: string;\n\n // PDF generation node specific properties\n // Note: htmlTemplate is intentionally NOT included — it is server-side only and never sent to the client\n pdfMode?: \"upload\" | \"html-template\";\n sourceNodeIds?: string[];\n\n // retry properties\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n\n /**\n * Paramétrable par nœud depuis le journey builder : autorise ou non le\n * bouton \"Poursuivre quand même\" en cas d'échec. S'applique aux nœuds\n * identity-control, document-collection, biometric-capture (selfie/video)\n * et external-verification. Absent/true = comportement actuel inchangé\n * (bouton proposé), false = masqué.\n *\n * Déprécié pour controle-jdi/identity-control quand une sortie \"false\" est\n * câblée : dans ce cas le routage automatique (blockingCodes +\n * maxResubmissionAction) prend le relais et ce bouton disparaît. Reste lu\n * tel quel pour les nœuds legacy sans sortie \"false\" (rétrocompat).\n */\n allowContinueOnFailure?: boolean;\n\n /**\n * Codes JDI exacts considérés comme bloquants pour ce nœud controle-jdi\n * (déclenchent la boucle de resoumission). Absent = DEFAULT_BLOCKING_CODES\n * (utils/jdiCodes.ts) — comportement legacy inchangé. Le code 8.0 est\n * toujours bloquant indépendamment de cette liste.\n */\n blockingCodes?: string[];\n\n /**\n * Action suivie quand les resoumissions sont épuisées sur un code bloquant\n * ET qu'une sortie \"false\" est câblée sur ce nœud controle-jdi (miroir de\n * conditionMaxRetryAction sur le nœud condition). Défaut \"end-journey\".\n */\n maxResubmissionAction?: \"end-journey\" | \"force-true\";\n}\n\n/**\n * Interface for accepted countries\n */\nexport interface AcceptedCountry {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n driverLicense: string[];\n residencePermit: string[];\n pinkDriverLicense: string[];\n };\n}\n\n/**\n * Interface for session template edge\n */\nexport interface SessionTemplateEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n conditionValue?: string;\n}\n\n/**\n * Interface for platform information\n */\nexport interface PlatformInfo {\n mobile: boolean;\n desktop: boolean;\n backoffice: boolean;\n}\n\n/**\n * Interface for session template\n */\n/** Clé du catalogue d'icônes des écrans de fin (mappée vers lucide-react au rendu). */\nexport type EndScreenIcon =\n | \"thanks\"\n | \"send\"\n | \"mail\"\n | \"check\"\n | \"clock\"\n | \"shield\"\n | \"user\"\n | \"info\";\n\nexport interface EndScreenItem {\n icon: EndScreenIcon;\n text: string;\n}\n\nexport interface EndScreenCase {\n title?: string;\n items: EndScreenItem[];\n}\n\n/** Textes de fin personnalisés (config globale du journey). Vide → fallback standard. */\nexport interface EndScreenConfig {\n compliant?: EndScreenCase;\n nonCompliant?: EndScreenCase;\n}\n\nexport interface SessionTemplate {\n id: string;\n name: string;\n description: string;\n version: string;\n languages: string[];\n nodes: SessionTemplateNode[];\n edges: SessionTemplateEdge[];\n groupId: string;\n userId: string | null;\n created_at: string;\n updated_at: string;\n platforms?: PlatformInfo;\n logo?: string;\n showQRCode?: boolean;\n buttonBgColor?: string;\n buttonTextColor?: string;\n endScreenConfig?: EndScreenConfig;\n}\n\n/**\n * Interface for session data\n */\nexport interface SessionData {\n id: string;\n userId: string | null;\n token: string;\n templateId: string;\n templateKey: string;\n expireTime: number;\n status: string;\n result: Record<string, unknown>;\n landingPage: unknown;\n withSelfie: boolean | null;\n groupId: string | null;\n userInput: Record<string, unknown>;\n contactInfo?: {\n email: string;\n phoneNumber: string;\n };\n callbackURL?: string | null;\n webhookURL: string;\n analysisTemplateId: string | null;\n userAgent: unknown[];\n mobile: boolean;\n analysisId: string | null;\n currentStep?: number;\n nfcStatus?: \"pending\" | \"opened\" | \"completed\" | \"skipped\" | \"failed\";\n createdAt: string;\n updatedAt: string;\n auditTrail: unknown[];\n user: unknown | null;\n analysis: unknown[];\n documents: unknown[];\n template: SessionTemplate;\n retryCounts?: Record<string, number>; // nodeId -> retry count\n}\n\nexport interface ClientInfo {\n ip?: string;\n location?: string;\n device: string;\n browser: string;\n os: string;\n}\n\nexport type ComplementaryMandateOutcome = 'same_signer' | 'new_signer' | 'no_mandate';\nexport interface ComplementaryMandateNode extends SessionTemplateNode {\n type: 'complementary-mandate';\n sourceJourneyId?: string;\n maxAgeMonths?: number;\n excludedInheritedFields?: string[];\n}\n"],"names":[],"mappings":";;AA0EO,IAAM,2BAA2B,GAAsB;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"analysisErrors.js","sources":["../../../../src/utils/analysisErrors.ts"],"sourcesContent":["// Must stay aligned with the public error code returned by the backend AnalysisService.\nexport const S3_UPLOAD_NOT_CONFIRMED_CODE = \"S3_UPLOAD_NOT_CONFIRMED\";\n\nexport const isS3UploadNotConfirmedError = (error: unknown): boolean => {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n\n const apiError = error as { code?: unknown; details?: unknown };\n if (apiError.code === S3_UPLOAD_NOT_CONFIRMED_CODE) {\n return true;\n }\n\n if (typeof apiError.details !== \"object\" || apiError.details === null) {\n return false;\n }\n\n return (\n (apiError.details as { code?: unknown }).code ===\n S3_UPLOAD_NOT_CONFIRMED_CODE\n );\n};\n\n// Must stay aligned with QUOTA_EXCEEDED_CODE in the backend\n// (src/common/constants/quota-exceeded.constant.ts).\nexport const QUOTA_EXCEEDED_CODE = \"QUOTA_EXCEEDED\";\n\nexport const isQuotaExceededError = (error: unknown): boolean => {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n\n const apiError = error as { code?: unknown; details?: unknown };\n if (apiError.code === QUOTA_EXCEEDED_CODE) {\n return true;\n }\n\n if (typeof apiError.details !== \"object\" || apiError.details === null) {\n return false;\n }\n\n return (\n (apiError.details as { code?: unknown }).code === QUOTA_EXCEEDED_CODE\n );\n};\n\n// Must stay aligned with INSUFFICIENT_CREDITS_CODE in the backend\n// (src/common/constants/quota-exceeded.constant.ts): overdraft cap reached.\nexport const INSUFFICIENT_CREDITS_CODE = \"INSUFFICIENT_CREDITS\";\n\nconst SERVICE_ERROR_CODES = [QUOTA_EXCEEDED_CODE, INSUFFICIENT_CREDITS_CODE];\n\n// codeName of the backend fallback document (origin api_failure) returned by\n// analysis-status polling when the async analysis was refused.\nconst SERVICE_ERROR_CODE_NAMES: Record<string, string> = {\n quota_exceeded: QUOTA_EXCEEDED_CODE,\n insufficient_credits: INSUFFICIENT_CREDITS_CODE,\n};\n\n/**\n * Code of a service refusal (engine quota / organisation out of credits) carried\n * by an ApiError (`code` or `details.code`), else null. Screens show it through\n * `user_guidance.<code>`.\n */\nexport const getServiceErrorCode = (error: unknown): string | null => {\n if (typeof error !== \"object\" || error === null) return null;\n const apiError = error as { code?: unknown; details?: unknown };\n const details =\n typeof apiError.details === \"object\" && apiError.details !== null\n ? (apiError.details as { code?: unknown })\n : undefined;\n if (isServiceErrorCode(apiError.code)) return apiError.code;\n return isServiceErrorCode(details?.code) ? details.code : null;\n};\n\nexport const isServiceErrorCode = (code: unknown): code is string =>\n SERVICE_ERROR_CODES.includes(code as string);\n\n/** Same as getServiceErrorCode, from the polled fallback document codeName. */\nexport const getServiceErrorCodeFromCodeName = (\n codeName: unknown,\n): string | null =>\n typeof codeName === \"string\" ? SERVICE_ERROR_CODE_NAMES[codeName] ?? null : null;\n"],"names":[],"mappings":";;AAAA;AACO,IAAM,4BAA4B,GAAG;AAErC,IAAM,2BAA2B,GAAG,UAAC,KAAc,EAAA;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AAC/C,QAAA,OAAO,KAAK;IACd;IAEA,IAAM,QAAQ,GAAG,KAA8C;AAC/D,IAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,4BAA4B,EAAE;AAClD,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE;AACrE,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,QACG,QAAQ,CAAC,OAA8B,CAAC,IAAI;AAC7C,QAAA,4BAA4B;AAEhC;AAEA;AACA;AACO,IAAM,mBAAmB,GAAG;AAqBnC;AACA;AACO,IAAM,yBAAyB,GAAG;AAEzC,IAAM,mBAAmB,GAAG,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;AAE5E;AACA;AACA,IAAM,wBAAwB,GAA2B;AACvD,IAAA,cAAc,EAAE,mBAAmB;AACnC,IAAA,oBAAoB,EAAE,yBAAyB;CAChD;AAED;;;;AAIG;AACI,IAAM,mBAAmB,GAAG,UAAC,KAAc,EAAA;AAChD,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;AAAE,QAAA,OAAO,IAAI;IAC5D,IAAM,QAAQ,GAAG,KAA8C;AAC/D,IAAA,IAAM,OAAO,GACX,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK;UACxD,QAAQ,CAAC;UACV,SAAS;AACf,IAAA,IAAI,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC,IAAI;IAC3D,OAAO,kBAAkB,CAAC,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI;AAChE;AAEO,IAAM,kBAAkB,GAAG,UAAC,IAAa,EAAA;AAC9C,IAAA,OAAA,mBAAmB,CAAC,QAAQ,CAAC,IAAc,CAAC;AAA5C;AAEF;AACO,IAAM,+BAA+B,GAAG,UAC7C,QAAiB,EAAA,EAAA,IAAA,EAAA,CAAA,CAEjB,OAAA,OAAO,QAAQ,KAAK,QAAQ,GAAG,CAAA,EAAA,GAAA,wBAAwB,CAAC,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI,GAAG,IAAI,CAAA,CAAA;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"apiAnalysis.js","sources":["../../../../src/utils/apiAnalysis.ts"],"sourcesContent":["/**\n * Détail d'un champ d'identité en échec pour le code 7.0 (owner mismatch) :\n * valeur saisie par l'utilisateur vs valeur lue sur le document, telles que\n * calculées côté backend (voir GET /session/sdk/:id/analysis-status).\n */\nexport interface JdiMismatchDetail {\n field: 'firstName' | 'lastName' | 'birthDate';\n entered: string;\n read: string;\n}\n\nexport interface Prediction {\n code: string;\n codeDescription: string;\n codeName: string;\n type: string;\n userInput?: {\n birthDate?: string;\n firstName?: string;\n lastName?: string;\n };\n /** Présent uniquement pour le code 7.0, quand un mismatch a été détecté. */\n mismatchDetails?: JdiMismatchDetail[];\n}\n\nexport interface AnalysisResult {\n predictions: Prediction[];\n internal_status: string;\n analysis_id: string;\n}\n\n/**\n * Extrait les root causes principales à partir des prédictions de l'API\n * Retourne les codes d'erreur (ex: \"2.2\", \"4.0\") au lieu des codeNames\n */\nexport const extractRootCauses = (predictions: Prediction[]): string[] => {\n if (!predictions || !Array.isArray(predictions)) {\n return [];\n }\n\n return predictions\n .filter(prediction => prediction.code && prediction.code !== '1.0')\n .map(prediction => prediction.code);\n};\n\n/**\n * Détermine si l'analyse a échoué basé sur les prédictions\n */\nexport const hasAnalysisFailed = (predictions: Prediction[]): boolean => {\n if (!predictions || !Array.isArray(predictions)) {\n return true;\n }\n\n // Si au moins une prédiction n'est pas '1.0' (conform), l'analyse a échoué\n return predictions.some(prediction =>\n prediction.code && prediction.code !== '1.0'\n );\n};\n\n/**\n * Obtient la root cause principale (première dans la liste)\n */\nexport const getPrimaryRootCause = (predictions: Prediction[]): string | null => {\n const rootCauses = extractRootCauses(predictions);\n return rootCauses.length > 0 ? rootCauses[0] : null;\n};\n\nexport function analyzeApiResponse(response: { status: number; data: any }) {\n // Dummy implementation for test\n return response.status === 200 ? 'success' : 'error';\n}\n"],"names":[],"mappings":";;AA+BA;;;AAGG;AACI,IAAM,iBAAiB,GAAG,UAAC,WAAyB,EAAA;IACzD,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC/C,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,OAAO;AACJ,SAAA,MAAM,CAAC,UAAA,UAAU,EAAA,EAAI,OAAA,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,CAAA,CAA5C,CAA4C;SACjE,GAAG,CAAC,UAAA,UAAU,EAAA,EAAI,OAAA,UAAU,CAAC,IAAI,CAAA,CAAf,CAAe,CAAC;AACvC;AAEA;;AAEG;AACI,IAAM,iBAAiB,GAAG,UAAC,WAAyB,EAAA;IACzD,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC/C,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,OAAO,WAAW,CAAC,IAAI,CAAC,UAAA,UAAU,EAAA;QAChC,OAAA,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK;AAA5C,IAAA,CAA4C,CAC7C;AACH;AAEA;;AAEG;AACI,IAAM,mBAAmB,GAAG,UAAC,WAAyB,EAAA;AAC3D,IAAA,IAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC;AACjD,IAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;AACrD;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"conditionEvaluator.js","sources":["../../../../src/utils/conditionEvaluator.ts"],"sourcesContent":["import type { ConditionToken, ConditionTokenType, SessionData } from \"../types/session\";\nimport type { UserInput } from \"../types/userInput\";\nimport type { ContactInfo } from \"../types/contactInfo\";\n\nexport interface ConditionEvaluationContext {\n session: SessionData;\n userInput?: UserInput | Record<string, unknown>;\n contactInfo?: ContactInfo | Record<string, unknown>;\n}\n\nconst LOGICAL_OPERATORS = new Set([\"&&\", \"||\"]);\nconst COMPARISON_OPERATORS = new Set([\"==\", \"===\", \"!=\", \"!==\", \">\", \">=\", \"<\", \"<=\"]);\n\n// Valeurs sentinelles reconnues comme opérande droite pour tester la présence d'une valeur.\n// Syntaxe builder : « variable == isEmpty » ou « variable != isEmpty »\nconst PRESENCE_SENTINELS = new Set([\"isEmpty\", \"isNotEmpty\"]);\n\ninterface ComparisonTerm {\n left?: ConditionToken;\n operator?: string;\n right?: ConditionToken;\n}\n\nexport const parseConditionExpression = (expression?: string): ConditionToken[] => {\n if (!expression) {\n return [];\n }\n\n const cleanedExpression = expression.replace(/\\s+/g, \" \").trim();\n if (!cleanedExpression) {\n return [];\n }\n\n const regex = /(===|!==|==|!=|<=|>=|&&|\\|\\||<|>)|(\"(?:[^\"\\\\]|\\\\.)*\")|([^\\s]+)/g;\n const tokens: ConditionToken[] = [];\n let match: RegExpExecArray | null;\n while ((match = regex.exec(cleanedExpression)) !== null) {\n const value = match[0];\n\n if (LOGICAL_OPERATORS.has(value) || COMPARISON_OPERATORS.has(value)) {\n tokens.push({ type: \"operator\", value });\n } else {\n const isQuoted = value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\");\n const literal = isQuoted ? value.slice(1, -1) : value;\n const tokenType: ConditionTokenType = isQuoted\n ? \"input\"\n : determineOperandType(literal);\n tokens.push({ type: tokenType, value: literal });\n }\n }\n\n return tokens;\n};\n\nexport const evaluateConditionTokens = (\n tokens: ConditionToken[] = [],\n context: ConditionEvaluationContext\n): boolean => {\n if (!tokens || tokens.length === 0) {\n console.warn(\"[ConditionEvaluator] No tokens provided\");\n return false;\n }\n\n const { terms, logicalOperators } = buildComparisonTerms(tokens);\n\n if (terms.length === 0) {\n console.warn(\"[ConditionEvaluator] No comparison terms built\");\n return false;\n }\n\n const termResults = terms.map((term) => evaluateComparison(term, context));\n\n if (termResults.length === 1) {\n return termResults[0];\n }\n\n const finalResult = termResults.reduce((acc, result, index) => {\n if (index === 0) {\n return result;\n }\n const logicalOperator = logicalOperators[index - 1] || \"&&\";\n return logicalOperator === \"||\" ? acc || result : acc && result;\n }, true);\n\n return finalResult;\n};\n\nconst buildComparisonTerms = (tokens: ConditionToken[]) => {\n const terms: ComparisonTerm[] = [];\n const logicalOperators: string[] = [];\n let currentTerm: ComparisonTerm = {};\n\n tokens.forEach((token) => {\n if (token.type === \"operator\") {\n if (LOGICAL_OPERATORS.has(token.value)) {\n // If we have a left operand without comparison operator, treat it as a boolean term\n if (currentTerm.left && !currentTerm.operator) {\n terms.push({ left: currentTerm.left, operator: \"truthy\", right: undefined });\n logicalOperators.push(token.value);\n currentTerm = {};\n } else if (currentTerm.left && currentTerm.operator && currentTerm.right) {\n terms.push(currentTerm);\n logicalOperators.push(token.value);\n currentTerm = {};\n }\n } else if (COMPARISON_OPERATORS.has(token.value)) {\n currentTerm.operator = token.value;\n }\n } else {\n if (!currentTerm.left) {\n currentTerm.left = token;\n } else if (!currentTerm.right) {\n currentTerm.right = token;\n } else {\n currentTerm = { left: token };\n }\n }\n });\n\n // Handle the last term\n if (currentTerm.left) {\n if (!currentTerm.operator) {\n terms.push({ left: currentTerm.left, operator: \"truthy\", right: undefined });\n } else if (currentTerm.right) {\n terms.push(currentTerm);\n }\n }\n\n return { terms, logicalOperators };\n};\n\nconst evaluateComparison = (\n term: ComparisonTerm,\n context: ConditionEvaluationContext\n): boolean => {\n if (!term.left || !term.operator) {\n console.warn(\"[EvaluateComparison] Incomplete term - missing left or operator\");\n return false;\n }\n\n // Handle boolean/truthy evaluation (no right operand)\n if (term.operator === \"truthy\") {\n const leftValue = resolveTokenValue(term.left, context);\n return isTruthy(leftValue);\n }\n\n // Standard comparison requires both operands\n if (!term.right) {\n console.warn(\"[EvaluateComparison] Comparison operator requires right operand\");\n return false;\n }\n\n const leftValue = resolveTokenValue(term.left, context);\n\n // Sentinel « isEmpty » / « isNotEmpty » en opérande droite — teste la présence de la valeur gauche.\n // Syntaxe : « variable == isEmpty » → vide ; « variable != isEmpty » → non vide.\n // De même avec « variable == isNotEmpty » / « variable != isNotEmpty » (sens inversé).\n if (term.right && PRESENCE_SENTINELS.has(term.right.value)) {\n const empty = isEmptyValue(leftValue);\n const sentinelMeansEmpty = term.right.value === \"isEmpty\";\n if (term.operator === \"==\" || term.operator === \"===\") {\n return sentinelMeansEmpty ? empty : !empty;\n }\n if (term.operator === \"!=\" || term.operator === \"!==\") {\n return sentinelMeansEmpty ? !empty : empty;\n }\n }\n\n const rightValue = resolveTokenValue(term.right, context);\n\n if (leftValue === undefined || rightValue === undefined) {\n console.warn(\"[EvaluateComparison] Undefined value - left:\", leftValue, \"right:\", rightValue);\n return false;\n }\n\n const trimIfString = (v: unknown) =>\n typeof v === \"string\" ? v.trim() : v;\n\n const leftComparable = trimIfString(coerceValue(leftValue));\n const rightComparable = trimIfString(coerceValue(rightValue));\n\n console.log(\"[EvaluateComparison]\", leftComparable, term.operator, rightComparable);\n\n let result: boolean;\n switch (term.operator) {\n case \"==\":\n result = leftComparable == rightComparable; // eslint-disable-line eqeqeq\n break;\n case \"===\":\n result = leftComparable === rightComparable;\n break;\n case \"!=\":\n result = leftComparable != rightComparable; // eslint-disable-line eqeqeq\n break;\n case \"!==\":\n result = leftComparable !== rightComparable;\n break;\n case \">\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a > b);\n break;\n case \">=\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a >= b);\n break;\n case \"<\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a < b);\n break;\n case \"<=\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a <= b);\n break;\n default:\n console.warn(\"[EvaluateComparison] Unknown operator:\", term.operator);\n result = false;\n }\n\n console.log(\"[EvaluateComparison] Result:\", result);\n return result;\n};\n\nconst isTruthy = (value: unknown): boolean => {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n if (typeof value === \"number\") return value !== 0;\n if (value === null || value === undefined) return false;\n if (value === \"\") return false;\n return true;\n};\n\nconst isEmptyValue = (value: unknown): boolean => {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n return false;\n};\n\nconst resolveTokenValue = (\n token: ConditionToken,\n context: ConditionEvaluationContext\n): unknown => {\n switch (token.type) {\n case \"input\":\n return parseLiteral(token.value);\n case \"variable\":\n case \"control\":\n return resolvePathValue(token.value, context, token.sourceNodeId);\n default:\n console.warn(\"[ResolveTokenValue] Unknown token type:\", token.type);\n return undefined;\n }\n};\n\nconst FIELD_ALIASES: Record<string, string[]> = {\n nom: [\"lastName\"],\n denomination_sociale: [\"companyName\"],\n prenom: [\"firstName\"],\n email: [\"email\"],\n sms: [\"phoneNumber\"],\n date_naissance: [\"birthDate\"],\n adresse: [\"addressLine1\"],\n ville: [\"city\"],\n code_postal: [\"postalCode\"],\n pays: [\"countryCode\", \"country\"],\n nationalite: [\"nationality\"],\n};\n\nconst resolvePathValue = (\n path: string,\n context: ConditionEvaluationContext,\n sourceNodeId?: string\n): unknown => {\n if (!path) {\n console.warn(\"[ResolvePathValue] Empty path provided\");\n return undefined;\n }\n\n const segments = path.split(\".\").filter(Boolean);\n\n if (segments.length === 0) {\n console.warn(\"[ResolvePathValue] No segments after splitting path\");\n return undefined;\n }\n\n const sources: Array<Record<string, unknown> | undefined> = [\n context.session?.result as Record<string, unknown>,\n context.session?.userInput as Record<string, unknown>,\n context.session?.contactInfo as Record<string, unknown>,\n context.userInput as Record<string, unknown>,\n context.contactInfo as Record<string, unknown>,\n context.session as unknown as Record<string, unknown>,\n ];\n\n // Helper to resolve aliases\n const getPossibleKeys = (key: string): string[] => {\n return [key, ...(FIELD_ALIASES[key] || [])];\n };\n\n // 1. Try direct/nested resolution with alias support for the last segment\n for (const source of sources) {\n if (!source) continue;\n\n const parentPath = segments.slice(0, -1);\n const lastSegment = segments[segments.length - 1];\n const parent = parentPath.length > 0 ? getNestedValue(source, parentPath) : source;\n\n if (parent && typeof parent === \"object\") {\n for (const key of getPossibleKeys(lastSegment)) {\n const value = (parent as Record<string, unknown>)[key];\n if (value !== undefined) {\n console.log(`[ResolvePathValue] Found ${path} (as ${key}) in direct sources`);\n return extractValue(value);\n }\n }\n }\n }\n\n // 2. Handle nodeId prefixes and fallbacks\n if (segments.length > 1) {\n const [root, ...rest] = segments;\n const lastSegment = segments[segments.length - 1];\n\n // Check in contextual userInput (structured by node or flat)\n if (context.userInput && typeof context.userInput === \"object\") {\n const userInput = context.userInput as Record<string, unknown>;\n\n // A. Try structured by nodeId\n const nodeData = userInput[root];\n if (nodeData && typeof nodeData === \"object\") {\n const value = getNestedValue(nodeData as Record<string, unknown>, rest);\n if (value !== undefined) {\n console.log(`[ResolvePathValue] Found ${path} in contextual userInput (nested)`);\n return extractValue(value);\n }\n }\n\n // B. Flat fallback: search for the property directly if it's a node-ID.property\n for (const key of getPossibleKeys(lastSegment)) {\n if (userInput[key] !== undefined) {\n console.log(`[ResolvePathValue] Found ${lastSegment} (as ${key}) in flat userInput`);\n return extractValue(userInput[key]);\n }\n\n // C. Check in customFormData\n const customFormData = userInput[\"customFormData\"] as Record<string, unknown> | undefined;\n if (customFormData && customFormData[key] !== undefined) {\n console.log(`[ResolvePathValue] Found ${lastSegment} (as ${key}) in customFormData`);\n return extractValue(customFormData[key]);\n }\n }\n }\n\n const analysisEntries = Array.isArray(context.session?.analysis)\n ? (context.session.analysis as Array<Record<string, unknown>>)\n : [];\n\n // If sourceNodeId is provided, use it to find the relevant analysis entry\n if (sourceNodeId || segments.length > 1) {\n const targetNodeId = sourceNodeId || root;\n const relevantEntries = analysisEntries.filter((entry) => {\n const entryRecord = entry as Record<string, unknown>;\n return entryRecord[\"nodeId\"] === targetNodeId || entryRecord[\"id\"] === targetNodeId;\n });\n\n if (relevantEntries.length > 0) {\n // Use the most recent entry (last one in array)\n const targetEntry = relevantEntries[relevantEntries.length - 1];\n\n // Check if the first segment is a hash/identifier that should be skipped\n const isHashLikeId = /^[a-f0-9]{24}$/i.test(root);\n const pathToResolve = isHashLikeId ? rest : [root, ...rest];\n\n // For control tokens, look in the documents array associated with this analysis entry\n if (pathToResolve.length > 0) {\n const propertyName = pathToResolve[pathToResolve.length - 1];\n const propertyKeys = getPossibleKeys(propertyName);\n\n const documents = Array.isArray(context.session?.documents)\n ? (context.session.documents as Array<Record<string, unknown>>)\n : [];\n\n if (documents.length > 0) {\n const analysisId = targetEntry[\"id\"] as string;\n const relevantDocs = documents.filter((doc) => doc[\"analysisId\"] === analysisId);\n\n if (relevantDocs.length > 0) {\n const doc = relevantDocs[0];\n\n // Look in controlCategories for control properties\n const controlCategories = doc[\"controlCategories\"] as Record<string, unknown> | undefined;\n if (controlCategories) {\n for (const categoryData of Object.values(controlCategories)) {\n const category = categoryData as Record<string, unknown>;\n const controls = category[\"controls\"] as Record<string, unknown> | undefined;\n\n if (controls) {\n for (const key of propertyKeys) {\n if (key in controls) {\n const control = controls[key] as Record<string, unknown>;\n return extractValue(control[\"value\"]);\n }\n }\n }\n }\n }\n\n // Also check in extractedInformations\n const extractedInformations = doc[\"extractedInformations\"] as Record<string, unknown> | undefined;\n if (extractedInformations) {\n for (const key of propertyKeys) {\n const valueFromExtracted = getNestedValue(extractedInformations, [key]);\n if (valueFromExtracted !== undefined) {\n return extractValue(valueFromExtracted);\n }\n }\n }\n }\n }\n }\n\n // Try direct access on analysis entry with aliases\n const propertyName = segments[segments.length - 1];\n for (const key of getPossibleKeys(propertyName)) {\n const valueFromEntry = (targetEntry as Record<string, unknown>)[key];\n if (valueFromEntry !== undefined) {\n return extractValue(valueFromEntry);\n }\n\n const extractedInfo = (targetEntry as Record<string, unknown>)[\n \"extractedInformation\"\n ] as Record<string, unknown> | undefined;\n if (extractedInfo && extractedInfo[key] !== undefined) {\n return extractValue(extractedInfo[key]);\n }\n\n const resultInfo = (targetEntry as Record<string, unknown>)[\n \"result\"\n ] as Record<string, unknown> | undefined;\n if (resultInfo && resultInfo[key] !== undefined) {\n return extractValue(resultInfo[key]);\n }\n }\n }\n }\n }\n\n console.warn(\"⚠️ [ResolvePathValue] Could not resolve path:\", path);\n return undefined;\n};\n\n/**\n * Extracts the actual value from objects with {confidence, value} structure.\n * This is common in extractedInformations from the API.\n */\nconst extractValue = (value: unknown): unknown => {\n // If it's an object with both 'value' and 'confidence' properties, extract the value\n if (\n value &&\n typeof value === \"object\" &&\n \"value\" in value &&\n \"confidence\" in value\n ) {\n return (value as Record<string, unknown>)[\"value\"];\n }\n return value;\n};\n\nconst getNestedValue = (\n source: Record<string, unknown> | undefined,\n path: string[]\n): unknown => {\n if (!source) {\n return undefined;\n }\n\n return path.reduce<unknown>((acc, key) => {\n if (acc === undefined || acc === null) {\n return undefined;\n }\n if (Array.isArray(acc)) {\n const index = Number(key);\n if (Number.isNaN(index)) {\n return undefined;\n }\n return acc[index];\n }\n if (typeof acc === \"object\") {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, source);\n};\n\nconst parseLiteral = (value: string): unknown => {\n const trimmed = value?.trim();\n if (!trimmed) {\n return \"\";\n }\n\n if (trimmed.toLowerCase() === \"true\") {\n return true;\n }\n if (trimmed.toLowerCase() === \"false\") {\n return false;\n }\n\n const numericValue = Number(trimmed);\n if (!Number.isNaN(numericValue)) {\n return numericValue;\n }\n\n const timestamp = Date.parse(trimmed);\n if (!Number.isNaN(timestamp)) {\n return new Date(timestamp).getTime();\n }\n return trimmed.replace(/\"/g, '');\n};\n\nconst coerceValue = (value: unknown): unknown => {\n if (value instanceof Date) {\n return value.getTime();\n }\n if (typeof value === \"string\") {\n const literal = parseLiteral(value);\n if (literal !== value) {\n return literal;\n }\n }\n return value;\n};\n\nconst compareValues = (\n left: unknown,\n right: unknown,\n comparator: (a: number | string, b: number | string) => boolean\n): boolean => {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return comparator(left, right);\n }\n\n if (typeof left === \"string\" && typeof right === \"string\") {\n // Normalize case for better string matching\n return comparator(left.trim().toLowerCase(), right.trim().toLowerCase());\n }\n\n console.warn(`[CompareValues] Type mismatch: left=${typeof left}, right=${typeof right}`);\n return false;\n};\n\nconst determineOperandType = (value: string): ConditionTokenType => {\n if (isBooleanLiteral(value) || isNumericLiteral(value) || PRESENCE_SENTINELS.has(value)) {\n return \"input\";\n }\n\n return \"variable\";\n};\n\nconst isNumericLiteral = (value: string): boolean => {\n return /^-?\\d+(?:\\.\\d+)?$/.test(value);\n};\n\nconst isBooleanLiteral = (value: string): boolean => {\n return value.toLowerCase() === \"true\" || value.toLowerCase() === \"false\";\n};\n"],"names":["__spreadArray"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"countryFlags.js","sources":["../../../../src/utils/countryFlags.ts"],"sourcesContent":["/**\n * Utility to convert ISO 3166-1 alpha-2 country codes to emoji flags\n * Using regional indicator symbols (Unicode regional indicator)\n */\n\nexport const getCountryFlag = (countryCode: string): string => {\n if (!countryCode || countryCode.length !== 2) {\n return \"\";\n }\n\n const code = countryCode.toUpperCase();\n\n // Special case for International or Europe\n if (code === \"INT\") {\n return \"🌍\";\n }\n\n if (code === \"EU\") {\n return \"🇪🇺\";\n }\n\n // Convert ISO 3166-1 alpha-2 code to flag emoji\n // Regional Indicator Symbols are in the range 0x1F1E6 to 0x1F1FF\n // A = 0x1F1E6, so we add the letter index\n const OFFSET = 0x1F1E6;\n\n try {\n const flagEmoji = String.fromCodePoint(\n code.charCodeAt(0) - 65 + OFFSET,\n code.charCodeAt(1) - 65 + OFFSET\n );\n return flagEmoji;\n } catch {\n return \"\";\n }\n};\n\n/**\n * Returns a formatted string with flag and country name\n */\nexport const formatCountryWithFlag = (countryCode: string, countryName: string): string => {\n const flag = getCountryFlag(countryCode);\n return flag ? `${flag} ${countryName}` : countryName;\n};\n"],"names":[],"mappings":";;AAAA;;;AAGG;AAEI,IAAM,cAAc,GAAG,UAAC,WAAmB,EAAA;IAChD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5C,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,IAAM,IAAI,GAAG,WAAW,CAAC,WAAW,EAAE;;AAGtC,IAAA,IAAI,IAAI,KAAK,KAAK,EAAE;AAClB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,IAAI,KAAK,IAAI,EAAE;AACjB,QAAA,OAAO,MAAM;IACf;;;;IAKA,IAAM,MAAM,GAAG,OAAO;AAEtB,IAAA,IAAI;AACF,QAAA,IAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CACpC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,EAChC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,CACjC;AACD,QAAA,OAAO,SAAS;IAClB;AAAE,IAAA,OAAA,EAAA,EAAM;AACN,QAAA,OAAO,EAAE;IACX;AACF;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cssLoader.js","sources":["../../../../src/utils/cssLoader.ts"],"sourcesContent":["/**\n * CSS Route Loading Utility\n * Dynamically loads and manages CSS files based on routes/components\n */\n\ninterface LoadedCSS {\n link: HTMLLinkElement;\n refCount: number;\n}\n\nclass CSSLoader {\n private loadedCSS: Map<string, LoadedCSS> = new Map();\n private baseUrl: string;\n\n constructor(baseUrl: string = '') {\n this.baseUrl = baseUrl;\n }\n\n /**\n * Load a CSS file for a specific route/component\n * @param routeName - Name of the route/component\n * @param cssPath - Path to the CSS file (relative to base URL)\n */\n async loadRouteCSS(routeName: string, cssPath: string): Promise<void> {\n const fullPath = `${this.baseUrl}${cssPath}`;\n \n // Check if CSS is already loaded\n const existing = this.loadedCSS.get(routeName);\n if (existing) {\n existing.refCount++;\n return;\n }\n\n return new Promise((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.type = 'text/css';\n link.href = fullPath;\n link.dataset.route = routeName;\n\n link.onload = () => {\n this.loadedCSS.set(routeName, { link, refCount: 1 });\n resolve();\n };\n\n link.onerror = () => {\n reject(new Error(`Failed to load CSS for route: ${routeName}`));\n };\n\n document.head.appendChild(link);\n });\n }\n\n /**\n * Unload CSS for a specific route/component\n * @param routeName - Name of the route/component\n */\n unloadRouteCSS(routeName: string): void {\n const existing = this.loadedCSS.get(routeName);\n if (!existing) return;\n\n existing.refCount--;\n \n if (existing.refCount <= 0) {\n document.head.removeChild(existing.link);\n this.loadedCSS.delete(routeName);\n }\n }\n\n /**\n * Load CSS inline (for smaller styles)\n * @param routeName - Name of the route/component\n * @param cssContent - CSS content as string\n */\n loadInlineCSS(routeName: string, cssContent: string): void {\n // Check if already loaded\n if (this.loadedCSS.has(routeName)) {\n const existing = this.loadedCSS.get(routeName)!;\n existing.refCount++;\n return;\n }\n\n const style = document.createElement('style');\n style.type = 'text/css';\n style.textContent = cssContent;\n style.dataset.route = routeName;\n\n document.head.appendChild(style);\n this.loadedCSS.set(routeName, { \n link: style as any, // Type cast for consistency\n refCount: 1 \n });\n }\n\n /**\n * Get all currently loaded routes\n */\n getLoadedRoutes(): string[] {\n return Array.from(this.loadedCSS.keys());\n }\n\n /**\n * Clean up all loaded CSS\n */\n cleanup(): void {\n this.loadedCSS.forEach((cssData, routeName) => {\n document.head.removeChild(cssData.link);\n });\n this.loadedCSS.clear();\n }\n}\n\n// Global instance - will be configured by the SDK consumer\nexport const cssLoader = new CSSLoader();\n\n/**\n * Configure the CSS loader base URL\n * This should be called once when the SDK is initialized\n * @param baseUrl - Base URL where CSS files are served from\n */\nexport function configureCSSLoader(baseUrl: string) {\n cssLoader['baseUrl'] = baseUrl;\n}\n\n// Route CSS mappings\nexport const ROUTE_CSS_MAP = {\n // Core routes\n 'start': 'css/routes/start.css',\n 'user-input': 'css/routes/user-input.css',\n 'contact-info': 'css/routes/contact-info.css',\n 'otp': 'css/routes/otp.css',\n \n // Main flows\n 'selfie': 'css/routes/selfie.css',\n 'document-check': 'css/routes/document-check.css',\n 'end-flow': 'css/routes/end-flow.css',\n \n // Sub-components\n 'jdi': 'css/components/jdi.css',\n 'video-recorder': 'css/components/video-recorder.css',\n 'ui-components': 'css/components/ui.css',\n} as const;\n\nexport type RouteCSS = keyof typeof ROUTE_CSS_MAP;\n\n/**\n * Load CSS for a specific route/component\n * @param routeName - Name of the route/component\n * @param cssPath - Path to the CSS file (default is '/index.css')\n */\nexport function loadCSS(routeName: string, cssPath: string = '/index.css') {\n const loader = new CSSLoader();\n loader.loadRouteCSS(routeName, cssPath);\n return loader;\n}"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"customFieldIds.js","sources":["../../../../src/utils/customFieldIds.ts"],"sourcesContent":["import type { CustomField } from \"../types/session\";\n\n/** Séparateur du suffixe ajouté à un identifiant en collision. */\nconst DUPLICATE_SUFFIX = \"__dup\";\n\n/**\n * Garantit l'unicité des identifiants de champs d'un formulaire personnalisé.\n *\n * Tout l'état du formulaire est indexé par `field.id` (valeur saisie, erreur,\n * erreurs de cellule). Deux champs partageant un identifiant partagent donc\n * leur valeur : taper dans l'un remplit l'autre, et un seul des deux est\n * finalement transmis.\n *\n * Le builder a longtemps dérivé l'identifiant de `Date.now()` seul, sans\n * composante aléatoire : deux champs enregistrés dans la même milliseconde\n * (double clic, ajout programmatique, import) se retrouvent avec le même.\n * Les parcours déjà publiés portent ces doublons, que le SDK doit servir sans\n * attendre une ré-édition côté backoffice.\n *\n * La première occurrence garde son identifiant — les conditions de parcours et\n * les sessions existantes qui le référencent continuent de fonctionner. Seules\n * les suivantes reçoivent un suffixe déterministe, donc stable d'un rendu à\n * l'autre. La clé métier envoyée à l'API (`userInputKey` ou le label\n * normalisé) n'est pas touchée.\n */\nexport function dedupeCustomFieldIds(\n fields: CustomField[] | undefined,\n): CustomField[] {\n if (!fields || fields.length === 0) return [];\n\n const seen = new Set<string>();\n let hasDuplicate = false;\n\n const deduped = fields.map((field, index) => {\n const id = field.id;\n if (!seen.has(id)) {\n seen.add(id);\n return field;\n }\n\n hasDuplicate = true;\n let candidate = `${id}${DUPLICATE_SUFFIX}${index}`;\n // Un parcours peut déjà contenir un identifiant homonyme du suffixe.\n while (seen.has(candidate)) candidate = `${candidate}_`;\n seen.add(candidate);\n return { ...field, id: candidate };\n });\n\n // Référence stable quand il n'y a rien à corriger : le cas normal ne doit pas\n // invalider les mémos qui dépendent de la liste.\n return hasDuplicate ? deduped : fields;\n}\n"],"names":["__assign"],"mappings":";;;;AAEA;AACA,IAAM,gBAAgB,GAAG,OAAO;AAEhC;;;;;;;;;;;;;;;;;;;AAmBG;AACG,SAAU,oBAAoB,CAClC,MAAiC,EAAA;AAEjC,IAAA,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;AAE7C,IAAA,IAAM,IAAI,GAAG,IAAI,GAAG,EAAU;IAC9B,IAAI,YAAY,GAAG,KAAK;IAExB,IAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAC,KAAK,EAAE,KAAK,EAAA;AACtC,QAAA,IAAM,EAAE,GAAG,KAAK,CAAC,EAAE;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACjB,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACZ,YAAA,OAAO,KAAK;QACd;QAEA,YAAY,GAAG,IAAI;QACnB,IAAI,SAAS,GAAG,EAAA,CAAA,MAAA,CAAG,EAAE,SAAG,gBAAgB,CAAA,CAAA,MAAA,CAAG,KAAK,CAAE;;AAElD,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AAAE,YAAA,SAAS,GAAG,EAAA,CAAA,MAAA,CAAG,SAAS,EAAA,GAAA,CAAG;AACvD,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AACnB,QAAA,OAAAA,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EAAY,KAAK,CAAA,EAAA,EAAE,EAAE,EAAE,SAAS,EAAA,CAAA;AAClC,IAAA,CAAC,CAAC;;;IAIF,OAAO,YAAY,GAAG,OAAO,GAAG,MAAM;AACxC;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"customFieldValidation.js","sources":["../../../../src/utils/customFieldValidation.ts"],"sourcesContent":["import type { DateDisplayFormat, ListColumn } from \"../types/session\";\nimport { DEFAULT_DATE_DISPLAY_FORMAT } from \"../types/session\";\n\nexport const EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nconst warnedInvalidRegexSources = new Set<string>();\n\nexport const isEmailValid = (value: string): boolean =>\n EMAIL_REGEX.test(String(value).trim());\n\nconst SLASH_DATE_RE = /^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/;\nconst ISO_DATE_RE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\ntype DatePart = \"day\" | \"month\" | \"year\";\n\nconst DATE_FORMAT_SPECS: Record<\n DateDisplayFormat,\n { re: RegExp; order: [DatePart, DatePart, DatePart] }\n> = {\n \"dd/mm/yyyy\": { re: SLASH_DATE_RE, order: [\"day\", \"month\", \"year\"] },\n \"mm/dd/yyyy\": { re: SLASH_DATE_RE, order: [\"month\", \"day\", \"year\"] },\n \"yyyy-mm-dd\": { re: ISO_DATE_RE, order: [\"year\", \"month\", \"day\"] },\n};\n\nconst isValidDateParts = (\n year: number,\n month: number,\n day: number,\n): boolean => {\n if (\n !Number.isInteger(year) ||\n !Number.isInteger(month) ||\n !Number.isInteger(day)\n ) {\n return false;\n }\n if (year < 1 || month < 1 || month > 12 || day < 1 || day > 31) return false;\n const d = new Date(Date.UTC(year, month - 1, day));\n return (\n d.getUTCFullYear() === year &&\n d.getUTCMonth() === month - 1 &&\n d.getUTCDate() === day\n );\n};\n\nexport const isDateValid = (\n value: string,\n format: DateDisplayFormat = DEFAULT_DATE_DISPLAY_FORMAT,\n): boolean => {\n const v = String(value || \"\").trim();\n if (!v) return false;\n const spec =\n DATE_FORMAT_SPECS[format] ?? DATE_FORMAT_SPECS[DEFAULT_DATE_DISPLAY_FORMAT];\n const m = v.match(spec.re);\n if (!m) return false;\n const parts: Record<DatePart, number> = { day: 0, month: 0, year: 0 };\n spec.order.forEach((part, i) => {\n parts[part] = Number(m[i + 1]);\n });\n return isValidDateParts(parts.year, parts.month, parts.day);\n};\n\nexport const isRegexMatch = (value: string, source: string): boolean => {\n if (!source) return true;\n try {\n return new RegExp(source).test(String(value));\n } catch (error) {\n if (!warnedInvalidRegexSources.has(source)) {\n warnedInvalidRegexSources.add(source);\n console.warn(\n \"[customFieldValidation] Invalid regex; validation was skipped.\",\n source,\n error,\n );\n }\n return true;\n }\n};\n\n/**\n * Resolves the regex for a list cell from another enum cell in the same row.\n * Malformed or incomplete conditional rules deliberately fall back to the\n * column regex so legacy configurations remain usable.\n */\nexport const resolveColumnRegex = (\n col: ListColumn,\n row: Record<string, string> | undefined,\n): { regex: string; errorMessage?: string } => {\n const fallback = {\n regex: typeof col.regex === \"string\" ? col.regex : \"\",\n errorMessage:\n typeof col.regexErrorMessage === \"string\"\n ? col.regexErrorMessage\n : undefined,\n };\n const rules = col.regexRules;\n\n if (\n !rules ||\n typeof rules.sourceColumn !== \"string\" ||\n !rules.sourceColumn ||\n !Array.isArray(rules.cases) ||\n !row\n ) {\n return fallback;\n }\n\n const sourceValue = row[rules.sourceColumn];\n if (typeof sourceValue !== \"string\" || !sourceValue) return fallback;\n\n const matchingCase = rules.cases.find(\n (candidate) =>\n candidate &&\n typeof candidate.value === \"string\" &&\n candidate.value === sourceValue,\n );\n if (!matchingCase || typeof matchingCase.regex !== \"string\") return fallback;\n\n const regex = matchingCase.regex.trim();\n if (!regex) return fallback;\n\n return {\n regex,\n errorMessage:\n typeof matchingCase.errorMessage === \"string\"\n ? matchingCase.errorMessage\n : fallback.errorMessage,\n };\n};\n\nexport const cellErrorKey = (rowIndex: number, columnLabel: string): string =>\n `${rowIndex}::${columnLabel}`;\n"],"names":["DEFAULT_DATE_DISPLAY_FORMAT"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"documentLabels.js","sources":["../../../../src/utils/documentLabels.ts"],"sourcesContent":["/**\n * Document label utilities for JDI document upload\n */\n\n/**\n * Gets the appropriate document label based on document type and ID\n *\n * @param t - Translation function\n * @param documentType - Type of document (idCard, passport, etc.)\n * @param documentTypeId - Optional specific document type ID (jdd, income-proof, etc.)\n * @param documentLabel - Optional custom document label\n * @returns string - Localized document label\n */\nexport const getDocumentLabel = (\n t: (key: string) => string,\n documentType: string,\n documentLabel?: string\n): string => {\n // Si un label spécifique est fourni, l'utiliser en priorité\n if (documentLabel && documentLabel !== documentType) {\n return documentLabel;\n }\n\n // Sinon, utiliser la logique standard pour les documents d'identité\n let translatedLabel;\n switch (documentType.toLowerCase().replace(\"_\", \"\")) {\n case \"idcard\":\n translatedLabel = \"Carte nationale d'identité\";\n break;\n case \"passport\":\n translatedLabel = \"Passeport\";\n break;\n case \"driverlicense\":\n case \"drivinglicense\":\n translatedLabel = \"Permis de conduire\";\n break;\n case \"residencepermit\":\n case \"residencypermit\":\n translatedLabel = \"Titre de séjour\";\n break;\n default:\n translatedLabel = t(documentType); // Utiliser directement la valeur si c'est un label personnalisé\n }\n\n return translatedLabel;\n};\n\n/**\n * Gets the upload label for a document side (front/back)\n *\n * @param documentType - Type of document\n * @param side - Document side (front or back)\n * @param twoSidesRequired - Whether document requires two sides\n * @returns string - Upload label\n */\nexport const getUploadLabel = (\n documentType: string,\n side: \"front\" | \"back\",\n twoSidesRequired: boolean\n): string => {\n if (twoSidesRequired) {\n // Document avec recto/verso : afficher \"Recto\" ou \"Verso\"\n return side === \"front\" ? \"Recto\" : \"Verso\";\n } else {\n // Document avec un seul côté : afficher le nom traduit du document\n return documentType;\n }\n};\n\n/**\n * Determines if a document type requires two sides (front and back)\n *\n * @param documentType - Type of document\n * @param documentTypeId - Optional specific document type ID\n * @returns boolean - True if document requires two sides\n */\nexport const requiresTwoSides = (documentType: string): boolean => {\n // Déterminer dynamiquement si le document nécessite deux côtés\n const isTwoSided = documentType !== \"passport\"; // Logique par défaut pour les documents recto-verso\n return isTwoSided;\n};\n"],"names":[],"mappings":";;AAAA;;AAEG;AAEH;;;;;;;;AAQG;AAyDH;;;;;;AAMG;AACI,IAAM,gBAAgB,GAAG,UAAC,YAAoB,EAAA;;AAEnD,IAAA,IAAM,UAAU,GAAG,YAAY,KAAK,UAAU,CAAC;AAC/C,IAAA,OAAO,UAAU;AACnB;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"europeanCountries.js","sources":["../../../../src/utils/europeanCountries.ts"],"sourcesContent":["export const EUROPEAN_COUNTRY_CODES = [\n \"AT\", // Austria\n \"BE\", // Belgium\n \"BG\", // Bulgaria\n \"CY\", // Cyprus\n \"CZ\", // Czechia\n \"DE\", // Germany\n \"DK\", // Denmark\n \"EE\", // Estonia\n \"ES\", // Spain\n \"FI\", // Finland\n \"FR\", // France\n \"GR\", // Greece\n \"HR\", // Croatia\n \"HU\", // Hungary\n \"IE\", // Ireland\n \"IT\", // Italy\n \"LT\", // Lithuania\n \"LU\", // Luxembourg\n \"LV\", // Latvia\n \"MT\", // Malta\n \"NL\", // Netherlands\n \"PL\", // Poland\n \"PT\", // Portugal\n \"RO\", // Romania\n \"SE\", // Sweden\n \"SI\", // Slovenia\n \"SK\", // Slovakia\n \"GB\", // United Kingdom\n \"CH\", // Switzerland\n \"NO\", // Norway\n];\n"],"names":[],"mappings":";;AAAO,IAAM,sBAAsB,GAAG;AAClC,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fileConverter.js","sources":["../../../../src/utils/fileConverter.ts"],"sourcesContent":["/**\n * File conversion utilities for document upload\n * These utilities are optimized for cross-browser compatibility including Firefox Mobile\n */\n\n/**\n * Converts a File object to base64 data URL\n * Optimized for Firefox Mobile - defers conversion until needed\n *\n * @param file - File object to convert\n * @returns Promise<string> - Base64 data URL\n * @throws Error if conversion fails or results in invalid data\n */\nexport const fileToBase64 = (file: File): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n const result = reader.result as string;\n if (result && result.length > 100) {\n resolve(result);\n } else {\n reject(new Error(\"File conversion resulted in empty or invalid data\"));\n }\n };\n\n reader.onerror = () => {\n reject(new Error(\"Failed to read file\"));\n };\n\n reader.onabort = () => {\n reject(new Error(\"File reading was aborted\"));\n };\n\n reader.readAsDataURL(file);\n });\n};\n\n/**\n * Checks if a File object is a PDF\n *\n * @param file - File object to check\n * @returns boolean - True if the file is a PDF\n */\nexport const isPDF = (file: File | null): boolean => {\n return file?.type === \"application/pdf\";\n};\n\nconst ALLOWED_MIME_TYPES = [\"image/png\", \"image/jpeg\", \"application/pdf\"];\nconst ALLOWED_EXTENSIONS = [\".png\", \".jpg\", \".jpeg\", \".pdf\"];\nconst HEIC_MIME_TYPES = [\"image/heic\", \"image/heif\"];\nconst HEIC_EXTENSIONS = [\".heic\", \".heif\"];\n\n/**\n * Validates file type (PNG, JPG/JPEG or PDF)\n *\n * @param file - File object to validate\n * @returns boolean - True if valid file type\n */\nexport const isValidFileType = (file: File): boolean => {\n const normalizedType = file.type?.toLowerCase();\n if (normalizedType && ALLOWED_MIME_TYPES.includes(normalizedType)) {\n return true;\n }\n\n const extension = file.name?.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return false;\n }\n\n return ALLOWED_EXTENSIONS.includes(`.${extension}`);\n};\n\n/**\n * Validates file size\n *\n * @param file - File object to validate\n * @param maxSizeInMB - Maximum file size in megabytes (default: 10MB)\n * @returns boolean - True if file size is within limit\n */\nexport const isValidFileSize = (file: File, maxSizeInMB: number = 10): boolean => {\n return file.size <= maxSizeInMB * 1024 * 1024;\n};\n\n/**\n * Validates base64 data string\n *\n * @param base64Data - Base64 string to validate\n * @param minLength - Minimum expected length (default: 1000)\n * @returns boolean - True if data appears valid\n */\nexport const isValidBase64Data = (base64Data: string, minLength: number = 1000): boolean => {\n return !!base64Data && base64Data.length >= minLength;\n};\n\n/**\n * Converts HEIC/HEIF files to JPEG so upstream validation accepts them\n *\n * @param file - File object selected by the user\n * @returns Promise<File> - Converted JPEG file or original file if conversion not needed\n * @throws Error if conversion fails\n */\nexport const convertFileToSupportedFormat = async (file: File): Promise<File> => {\n const normalizedType = file.type?.toLowerCase();\n const extension = file.name?.split(\".\").pop()?.toLowerCase();\n const hasHeicMime = normalizedType ? HEIC_MIME_TYPES.includes(normalizedType) : false;\n const hasHeicExtension = extension ? HEIC_EXTENSIONS.includes(`.${extension}`) : false;\n\n if (!hasHeicMime && !hasHeicExtension) {\n return file;\n }\n\n try {\n const heic2any = (await import(\"heic2any\")).default;\n const conversionResult = await heic2any({\n blob: file,\n toType: \"image/jpeg\",\n });\n\n const conversionBlob = Array.isArray(conversionResult) ? conversionResult[0] : conversionResult;\n const blob = conversionBlob instanceof Blob ? conversionBlob : new Blob([conversionBlob], { type: \"image/jpeg\" });\n\n const baseName = file.name?.replace(/\\.[^/.]+$/, \"\") || \"document\";\n const convertedFileName = `${baseName}.jpg`;\n\n return new File([blob], convertedFileName, { type: \"image/jpeg\" });\n } catch (error) {\n console.error(\"convertFileToSupportedFormat: HEIC conversion failed\", error);\n throw new Error(\"Nous n'avons pas pu convertir votre photo HEIC. Veuillez sélectionner un fichier PNG, JPG ou PDF.\");\n }\n};\n"],"names":["__awaiter"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"imageConverter.js","sources":["../../../../src/utils/imageConverter.ts"],"sourcesContent":["/**\n * Converts a PDF to PNG (first page only)\n * @param pdfDataUrl - Data URL of the PDF to convert\n * @returns Promise<File> - Converted PNG file\n */\nexport const convertPdfToPng = async (pdfDataUrl: string): Promise<File> => {\n try {\n const pdfjsLib = await import(\"pdfjs-dist/legacy/build/pdf\");\n await import(\"pdfjs-dist/legacy/build/pdf.worker\");\n\n // Convert data URL to ArrayBuffer\n const base64Data = pdfDataUrl.split(\",\")[1];\n const binaryString = atob(base64Data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n // Load the PDF\n const pdf = await pdfjsLib.getDocument({ data: bytes }).promise;\n\n // Get the first page\n const page = await pdf.getPage(1);\n\n // Set up the canvas with a 2.0 scale for good quality\n const viewport = page.getViewport({ scale: 2.0 });\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n\n if (!context) {\n throw new Error(\"Impossible de créer le contexte canvas\");\n }\n\n canvas.height = viewport.height;\n canvas.width = viewport.width;\n\n // Render the page to the canvas\n await page.render({\n canvasContext: context,\n viewport: viewport,\n canvas: canvas,\n }).promise;\n\n // Convert the canvas to a PNG blob\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) {\n const file = new File([blob], \"converted_id_card.png\", {\n type: \"image/png\",\n });\n resolve(file);\n } else {\n reject(new Error(\"Impossible de créer le blob PNG\"));\n }\n },\n \"image/png\",\n 0.95\n );\n });\n } catch (error) {\n console.error(\"Erreur lors de la conversion PDF vers PNG:\", error);\n throw new Error(\"Impossible de convertir le PDF en PNG\");\n }\n};\n\n/**\n * Converts a JPEG image to PNG\n * @param jpegDataUrl - Data URL of the JPEG image to convert\n * @returns Promise<File> - Converted PNG file\n */\nexport const convertJpegToPng = async (jpegDataUrl: string): Promise<File> => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n\n img.onload = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n reject(new Error(\"Impossible de créer le contexte canvas\"));\n return;\n }\n\n canvas.width = img.width;\n canvas.height = img.height;\n\n // Draw the image on the canvas\n ctx.drawImage(img, 0, 0);\n\n // Convert to a PNG blob\n canvas.toBlob(\n (blob) => {\n if (blob) {\n const file = new File([blob], \"converted_id_card.png\", {\n type: \"image/png\",\n });\n resolve(file);\n } else {\n reject(new Error(\"Impossible de convertir JPEG en PNG\"));\n }\n },\n \"image/png\",\n 0.95\n );\n };\n\n img.onerror = () => {\n reject(new Error(\"Erreur lors du chargement de l'image JPEG\"));\n };\n\n img.src = jpegDataUrl;\n });\n};\n\n/**\n * Converts a data URL to a File\n * @param dataUrl - Data URL to convert\n * @param fileName - Output file name\n * @returns File - Created file\n */\nexport const dataUrlToFile = (dataUrl: string, fileName: string): File => {\n const base64Data = dataUrl.split(\",\")[1];\n const mimeType = dataUrl.split(\",\")[0].split(\":\")[1].split(\";\")[0];\n const binaryString = atob(base64Data);\n const bytes = new Uint8Array(binaryString.length);\n\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n return new File([bytes], fileName, { type: mimeType });\n};\n\n/**\n * Gets the MIME type from a data URL\n * @param dataUrl - Data URL to analyze\n * @returns string - Detected MIME type\n */\nexport const getMimeTypeFromDataUrl = (dataUrl: string): string => {\n return dataUrl.split(\",\")[0].split(\":\")[1].split(\";\")[0];\n};\n\n/**\n * Checks if a file is a PDF\n * @param dataUrl - Data URL to check\n * @returns boolean - True if it's a PDF\n */\nexport const isPdf = (dataUrl: string): boolean => {\n return getMimeTypeFromDataUrl(dataUrl) === \"application/pdf\";\n};\n\n/**\n * Checks if a file is a JPEG\n * @param dataUrl - Data URL to check\n * @returns boolean - True if it's a JPEG\n */\nexport const isJpeg = (dataUrl: string): boolean => {\n const mimeType = getMimeTypeFromDataUrl(dataUrl);\n return mimeType === \"image/jpeg\" || mimeType === \"image/jpg\";\n};\n\n/**\n * Checks if a file is a PNG\n * @param dataUrl - Data URL to check\n * @returns boolean - True if it's a PNG\n */\nexport const isPng = (dataUrl: string): boolean => {\n return getMimeTypeFromDataUrl(dataUrl) === \"image/png\";\n};\n"],"names":["__awaiter"],"mappings":";;;;AAAA;;;;AAIG;AACI,IAAM,eAAe,GAAG,UAAO,UAAkB,EAAA,EAAA,OAAAA,mBAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;;AAEnC,gBAAA,OAAA,CAAA,CAAA,YAAM,oDAAO,gDAA6B,KAAC,CAAA;;AAAtD,gBAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAA2C;AAC5D,gBAAA,OAAA,CAAA,CAAA,YAAM,oDAAO,uDAAoC,KAAC,CAAA;;AAAlD,gBAAA,EAAA,CAAA,IAAA,EAAkD;gBAG5C,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrC,gBAAA,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;gBAC/B,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC;AACjD,gBAAA,KAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;gBACvC;AAGY,gBAAA,OAAA,CAAA,CAAA,YAAM,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAA;;AAAzD,gBAAA,GAAG,GAAG,EAAA,CAAA,IAAA,EAAmD;AAGlD,gBAAA,OAAA,CAAA,CAAA,YAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;;AAA3B,gBAAA,IAAI,GAAG,EAAA,CAAA,IAAA,EAAoB;gBAG3B,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC3C,gBAAA,QAAA,GAAS,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACzC,gBAAA,OAAO,GAAG,QAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gBAEvC,IAAI,CAAC,OAAO,EAAE;AACZ,oBAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;gBAC3D;AAEA,gBAAA,QAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;AAC/B,gBAAA,QAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK;;gBAG7B,OAAA,CAAA,CAAA,YAAM,IAAI,CAAC,MAAM,CAAC;AAChB,wBAAA,aAAa,EAAE,OAAO;AACtB,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,MAAM,EAAE,QAAM;qBACf,CAAC,CAAC,OAAO,CAAA;;;AAJV,gBAAA,EAAA,CAAA,IAAA,EAIU;;AAGV,gBAAA,OAAA,CAAA,CAAA,aAAO,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM,EAAA;AACjC,wBAAA,QAAM,CAAC,MAAM,CACX,UAAC,IAAI,EAAA;4BACH,IAAI,IAAI,EAAE;gCACR,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,uBAAuB,EAAE;AACrD,oCAAA,IAAI,EAAE,WAAW;AAClB,iCAAA,CAAC;gCACF,OAAO,CAAC,IAAI,CAAC;4BACf;iCAAO;AACL,gCAAA,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;4BACtD;AACF,wBAAA,CAAC,EACD,WAAW,EACX,IAAI,CACL;AACH,oBAAA,CAAC,CAAC,CAAA;;;AAEF,gBAAA,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,OAAK,CAAC;AAClE,gBAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC;;;;;AAI5D;;;;AAIG;AACI,IAAM,gBAAgB,GAAG,UAAO,WAAmB,EAAA,EAAA,OAAAA,mBAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;AACxD,QAAA,OAAA,CAAA,CAAA,aAAO,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM,EAAA;AACjC,gBAAA,IAAM,GAAG,GAAG,IAAI,KAAK,EAAE;gBAEvB,GAAG,CAAC,MAAM,GAAG,YAAA;oBACX,IAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAC/C,IAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;oBAEnC,IAAI,CAAC,GAAG,EAAE;AACR,wBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;wBAC3D;oBACF;AAEA,oBAAA,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK;AACxB,oBAAA,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM;;oBAG1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;;AAGxB,oBAAA,MAAM,CAAC,MAAM,CACX,UAAC,IAAI,EAAA;wBACH,IAAI,IAAI,EAAE;4BACR,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,uBAAuB,EAAE;AACrD,gCAAA,IAAI,EAAE,WAAW;AAClB,6BAAA,CAAC;4BACF,OAAO,CAAC,IAAI,CAAC;wBACf;6BAAO;AACL,4BAAA,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;wBAC1D;AACF,oBAAA,CAAC,EACD,WAAW,EACX,IAAI,CACL;AACH,gBAAA,CAAC;gBAED,GAAG,CAAC,OAAO,GAAG,YAAA;AACZ,oBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAChE,gBAAA,CAAC;AAED,gBAAA,GAAG,CAAC,GAAG,GAAG,WAAW;AACvB,YAAA,CAAC,CAAC,CAAA;;;AAGJ;;;;;AAKG;AACI,IAAM,aAAa,GAAG,UAAC,OAAe,EAAE,QAAgB,EAAA;IAC7D,IAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxC,IAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClE,IAAA,IAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;IACrC,IAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC;AAEjD,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;IACvC;AAEA,IAAA,OAAO,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACxD;AAEA;;;;AAIG;AACI,IAAM,sBAAsB,GAAG,UAAC,OAAe,EAAA;IACpD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1D;AAEA;;;;AAIG;AACI,IAAM,KAAK,GAAG,UAAC,OAAe,EAAA;AACnC,IAAA,OAAO,sBAAsB,CAAC,OAAO,CAAC,KAAK,iBAAiB;AAC9D;AAEA;;;;AAIG;AACI,IAAM,MAAM,GAAG,UAAC,OAAe,EAAA;AACpC,IAAA,IAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC;AAChD,IAAA,OAAO,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,WAAW;AAC9D;AAEA;;;;AAIG;AACI,IAAM,KAAK,GAAG,UAAC,OAAe,EAAA;AACnC,IAAA,OAAO,sBAAsB,CAAC,OAAO,CAAC,KAAK,WAAW;AACxD;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"imageProcessing.js","sources":["../../../../src/utils/imageProcessing.ts"],"sourcesContent":["/**\n * Image processing utilities for mobile SDK\n * Handles post-capture image resizing and format conversion\n */\n\n/**\n * Maximum width for resized images\n */\nconst MAX_WIDTH = 2048;\n\n/**\n * JPEG quality for conversion (0.0 to 1.0)\n */\nconst JPEG_QUALITY = 0.92;\n\n/**\n * Converts a PNG Blob to JPEG format\n *\n * @param pngBlob - The PNG image as a Blob\n * @returns Promise resolving to a JPEG Blob\n * @throws Error if conversion fails\n */\nasync function convertToJpeg(pngBlob: Blob): Promise<Blob> {\n return new Promise((resolve, reject) => {\n // Create an image element to load the PNG\n const img = new Image();\n\n img.onload = () => {\n try {\n // Create a canvas with the same dimensions as the image\n const canvas = document.createElement(\"canvas\");\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get canvas 2D context\");\n }\n\n // Draw a white background (JPEG doesn't support transparency)\n ctx.fillStyle = \"#FFFFFF\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Draw the image on top\n ctx.drawImage(img, 0, 0);\n\n // Convert canvas to JPEG Blob\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Failed to convert image to JPEG\"));\n return;\n }\n resolve(blob);\n },\n \"image/jpeg\",\n JPEG_QUALITY,\n );\n } catch (error) {\n reject(\n new Error(\n `JPEG conversion failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n ),\n );\n } finally {\n // Clean up\n URL.revokeObjectURL(img.src);\n }\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(img.src);\n reject(new Error(\"Failed to load image for JPEG conversion\"));\n };\n\n // Load the PNG blob into the image\n img.src = URL.createObjectURL(pngBlob);\n });\n}\n\n/**\n * Resizes an image Blob if its width exceeds MAX_WIDTH pixels\n * Maintains aspect ratio and converts to JPEG when possible\n *\n * This function operates on the captured image AFTER photo capture,\n * not on the camera stream (getUserMedia). It's designed for mobile\n * SDK usage where images need to be optimized before upload.\n *\n * @param imageBlob - The captured image as a Blob (typically PNG from camera)\n * @returns Promise resolving to a processed Blob (JPEG if conversion succeeds, otherwise original format)\n * @throws Error if image processing fails\n *\n * @example\n * ```typescript\n * const photo = await capturePhotoFromCamera();\n * const processed = await resizeAfterCapture(photo);\n * sdk.runControls(processed);\n * ```\n */\nexport async function resizeAfterCapture(imageBlob: Blob): Promise<Blob> {\n return new Promise((resolve, reject) => {\n // Create an image element to analyze dimensions\n const img = new Image();\n\n img.onload = async () => {\n try {\n const originalWidth = img.width;\n const originalHeight = img.height;\n\n // Determine if resizing is needed\n const needsResize = originalWidth > MAX_WIDTH;\n\n let processedBlob: Blob;\n\n if (needsResize) {\n // Calculate new dimensions maintaining aspect ratio\n const scaleFactor = MAX_WIDTH / originalWidth;\n const newWidth = MAX_WIDTH;\n const newHeight = Math.round(originalHeight * scaleFactor);\n\n // Create canvas for resizing\n const canvas = document.createElement(\"canvas\");\n canvas.width = newWidth;\n canvas.height = newHeight;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get canvas 2D context\");\n }\n\n // Use white background for JPEG compatibility\n ctx.fillStyle = \"#FFFFFF\";\n ctx.fillRect(0, 0, newWidth, newHeight);\n\n // Draw resized image with high quality\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n ctx.drawImage(img, 0, 0, newWidth, newHeight);\n\n // Convert to JPEG Blob\n const resizedBlob = await new Promise<Blob>(\n (resolveBlob, rejectBlob) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n rejectBlob(\n new Error(\"Failed to create resized image blob\"),\n );\n return;\n }\n resolveBlob(blob);\n },\n \"image/jpeg\",\n JPEG_QUALITY,\n );\n },\n );\n\n processedBlob = resizedBlob;\n } else {\n // No resizing needed, but attempt JPEG conversion if it's PNG\n if (imageBlob.type === \"image/png\") {\n try {\n processedBlob = await convertToJpeg(imageBlob);\n } catch (conversionError) {\n // If conversion fails, use original blob\n console.warn(\n \"JPEG conversion failed, using original format:\",\n conversionError,\n );\n processedBlob = imageBlob;\n }\n } else {\n // Keep original blob if already in a suitable format\n processedBlob = imageBlob;\n }\n }\n\n URL.revokeObjectURL(img.src);\n resolve(processedBlob);\n } catch (error) {\n URL.revokeObjectURL(img.src);\n reject(\n new Error(\n `Image processing failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n ),\n );\n }\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(img.src);\n reject(new Error(\"Failed to load image for processing\"));\n };\n\n // Load the blob into the image element\n img.src = URL.createObjectURL(imageBlob);\n });\n}\n\n/**\n * Type guard to check if the code is running in a mobile browser environment\n * This can be used to conditionally apply mobile-only processing\n *\n * @returns true if running in a mobile browser\n */\nexport function isMobileBrowser(): boolean {\n const userAgent =\n navigator.userAgent || navigator.vendor || (window as any).opera;\n\n return /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(\n userAgent.toLowerCase(),\n );\n}\n\n/**\n * Converts a data URL string to a Blob\n *\n * @param dataUrl - The data URL to convert (e.g., \"data:image/png;base64,...\")\n * @returns Blob representation of the image\n * @throws Error if the data URL format is invalid\n */\nexport function dataUrlToBlob(dataUrl: string): Blob {\n const parts = dataUrl.split(\",\");\n\n if (parts.length !== 2) {\n throw new Error(\"Invalid data URL format\");\n }\n\n const mimeMatch = parts[0].match(/:(.*?);/);\n if (!mimeMatch) {\n throw new Error(\"Could not extract MIME type from data URL\");\n }\n\n const mime = mimeMatch[1];\n const binaryString = atob(parts[1]);\n const bytes = new Uint8Array(binaryString.length);\n\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n return new Blob([bytes], { type: mime });\n}\n\n/**\n * Converts a Blob to a data URL string\n *\n * @param blob - The Blob to convert\n * @returns Promise resolving to a data URL string\n * @throws Error if the conversion fails\n */\nexport function blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onloadend = () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n } else {\n reject(new Error(\"FileReader result is not a string\"));\n }\n };\n\n reader.onerror = () => {\n reject(new Error(\"Failed to read Blob as data URL\"));\n };\n\n reader.readAsDataURL(blob);\n });\n}\n"],"names":["__awaiter"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"isMobileDevice.js","sources":["../../../../src/utils/isMobileDevice.ts"],"sourcesContent":["/**\n * Détection du type d'appareil par userAgent (plus fiable que la largeur d'écran : un poste de\n * bureau dans une fenêtre étroite ne doit pas être traité comme un mobile).\n *\n * Réutilisé par le rendu de capture (TemplateNodeRenderer) et l'étape NFC (NfcScanNode), où l'on\n * ouvre directement l'application `/scan/:sessionId` plutôt que d'afficher un QR code.\n */\nexport const isMobileDevice = (): boolean => {\n if (typeof navigator === \"undefined\") return false;\n return /Android|iPhone|iPad|iPod|Opera Mini|IEMobile|WPDesktop/i.test(\n navigator.userAgent,\n );\n};\n"],"names":[],"mappings":";;AAAA;;;;;;AAMG;AACI,IAAM,cAAc,GAAG,YAAA;IAC5B,IAAI,OAAO,SAAS,KAAK,WAAW;AAAE,QAAA,OAAO,KAAK;IAClD,OAAO,yDAAyD,CAAC,IAAI,CACnE,SAAS,CAAC,SAAS,CACpB;AACH;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"isoCountryCodes.js","sources":["../../../../src/utils/isoCountryCodes.ts"],"sourcesContent":["export const ISO_COUNTRY_CODES = [\n \"AF\",\n \"AX\",\n \"AL\",\n \"DZ\",\n \"AS\",\n \"AD\",\n \"AO\",\n \"AI\",\n \"AQ\",\n \"AG\",\n \"AR\",\n \"AM\",\n \"AW\",\n \"AU\",\n \"AT\",\n \"AZ\",\n \"BS\",\n \"BH\",\n \"BD\",\n \"BB\",\n \"BY\",\n \"BE\",\n \"BZ\",\n \"BJ\",\n \"BM\",\n \"BT\",\n \"BO\",\n \"BQ\",\n \"BA\",\n \"BW\",\n \"BV\",\n \"BR\",\n \"IO\",\n \"BN\",\n \"BG\",\n \"BF\",\n \"BI\",\n \"KH\",\n \"CM\",\n \"CA\",\n \"CV\",\n \"KY\",\n \"CF\",\n \"TD\",\n \"CL\",\n \"CN\",\n \"CX\",\n \"CC\",\n \"CO\",\n \"KM\",\n \"CG\",\n \"CD\",\n \"CK\",\n \"CR\",\n \"CI\",\n \"HR\",\n \"CU\",\n \"CW\",\n \"CY\",\n \"CZ\",\n \"DK\",\n \"DJ\",\n \"DM\",\n \"DO\",\n \"EC\",\n \"EG\",\n \"SV\",\n \"GQ\",\n \"ER\",\n \"EE\",\n \"SZ\",\n \"ET\",\n \"FK\",\n \"FO\",\n \"FJ\",\n \"FI\",\n \"FR\",\n \"GF\",\n \"PF\",\n \"TF\",\n \"GA\",\n \"GM\",\n \"GE\",\n \"DE\",\n \"GH\",\n \"GI\",\n \"GR\",\n \"GL\",\n \"GD\",\n \"GP\",\n \"GU\",\n \"GT\",\n \"GG\",\n \"GN\",\n \"GW\",\n \"GY\",\n \"HT\",\n \"HM\",\n \"VA\",\n \"HN\",\n \"HK\",\n \"HU\",\n \"IS\",\n \"IN\",\n \"ID\",\n \"IR\",\n \"IQ\",\n \"IE\",\n \"IM\",\n \"IL\",\n \"IT\",\n \"JM\",\n \"JP\",\n \"JE\",\n \"JO\",\n \"KZ\",\n \"KE\",\n \"KI\",\n \"KP\",\n \"KR\",\n \"KW\",\n \"KG\",\n \"LA\",\n \"LV\",\n \"LB\",\n \"LS\",\n \"LR\",\n \"LY\",\n \"LI\",\n \"LT\",\n \"LU\",\n \"MO\",\n \"MG\",\n \"MW\",\n \"MY\",\n \"MV\",\n \"ML\",\n \"MT\",\n \"MH\",\n \"MQ\",\n \"MR\",\n \"MU\",\n \"YT\",\n \"MX\",\n \"FM\",\n \"MD\",\n \"MC\",\n \"MN\",\n \"ME\",\n \"MS\",\n \"MA\",\n \"MZ\",\n \"MM\",\n \"NA\",\n \"NR\",\n \"NP\",\n \"NL\",\n \"NC\",\n \"NZ\",\n \"NI\",\n \"NE\",\n \"NG\",\n \"NU\",\n \"NF\",\n \"MK\",\n \"MP\",\n \"NO\",\n \"OM\",\n \"PK\",\n \"PW\",\n \"PS\",\n \"PA\",\n \"PG\",\n \"PY\",\n \"PE\",\n \"PH\",\n \"PN\",\n \"PL\",\n \"PT\",\n \"PR\",\n \"QA\",\n \"RE\",\n \"RO\",\n \"RU\",\n \"RW\",\n \"BL\",\n \"SH\",\n \"KN\",\n \"LC\",\n \"MF\",\n \"PM\",\n \"VC\",\n \"WS\",\n \"SM\",\n \"ST\",\n \"SA\",\n \"SN\",\n \"RS\",\n \"SC\",\n \"SL\",\n \"SG\",\n \"SX\",\n \"SK\",\n \"SI\",\n \"SB\",\n \"SO\",\n \"ZA\",\n \"GS\",\n \"SS\",\n \"ES\",\n \"LK\",\n \"SD\",\n \"SR\",\n \"SJ\",\n \"SE\",\n \"CH\",\n \"SY\",\n \"TW\",\n \"TJ\",\n \"TZ\",\n \"TH\",\n \"TL\",\n \"TG\",\n \"TK\",\n \"TO\",\n \"TT\",\n \"TN\",\n \"TR\",\n \"TM\",\n \"TC\",\n \"TV\",\n \"UG\",\n \"UA\",\n \"AE\",\n \"GB\",\n \"US\",\n \"UM\",\n \"UY\",\n \"UZ\",\n \"VU\",\n \"VE\",\n \"VN\",\n \"VG\",\n \"VI\",\n \"WF\",\n \"EH\",\n \"YE\",\n \"ZM\",\n \"ZW\"\n];\n"],"names":[],"mappings":";;AAAO,IAAM,iBAAiB,GAAG;IAC/B,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"jdiCodes.js","sources":["../../../../src/utils/jdiCodes.ts"],"sourcesContent":["/**\n * Codes JDI (Justificatif D'Identité) considérés comme \"bloquants\" pour le\n * nœud controle-jdi, c'est-à-dire déclenchant la boucle de resoumission\n * (écran d'erreur + éventuel réessai) plutôt qu'un passage silencieux.\n *\n * Historiquement cette liste était hardcodée en dur (inversée) dans\n * JDIProcessing.tsx / DocumentVideoProcessing.tsx / DocumentProcessing.tsx :\n * `isSuccess = [\"1.\", \"4.\", \"5.\", \"6.\", \"9.\"].some(prefix => code.startsWith(prefix))`.\n * Elle est désormais configurable par nœud via `node.blockingCodes`, avec\n * cette liste comme valeur par défaut pour préserver le comportement legacy.\n *\n * Miroir exact du catalogue frontend (app-frontend/src/utils/jdiCodes.ts) —\n * les deux listes doivent rester synchronisées.\n *\n * 2026-09-03 : 7.1 retiré (décision produit, cf. scripts/remediate-controle-jdi-blocking-codes.ts\n * côté app-backend pour le nettoyage des configs `blockingCodes` déjà sauvegardées).\n */\nexport const DEFAULT_BLOCKING_CODES: string[] = [\n '2.0',\n '2.1',\n '2.2',\n '2.3',\n '2.4',\n '2.5',\n '2.6',\n '3.0',\n '7.0',\n];\n\n/**\n * Codes toujours bloquants, quelle que soit la configuration du nœud.\n * 8.0 (document trouvé dans la base de spécimens frauduleux) ne doit jamais\n * pouvoir être désactivé — cf. DocumentCheck.tsx `isRetryAllowed` historique\n * (`errorCode?.startsWith(\"8\")` bloque déjà totalement le retry).\n */\nexport const ALWAYS_BLOCKING_CODES: string[] = ['8.0'];\n\n/**\n * Détermine si un code JDI doit être traité comme bloquant pour un nœud\n * controle-jdi donné.\n *\n * - `configured` absent (nœud legacy, jamais reconfiguré) → applique\n * DEFAULT_BLOCKING_CODES (comportement inchangé).\n * - `configured` présent (même vide) → correspondance exacte uniquement\n * (pas de préfixe : \"4.0\" dans la liste ne bloque pas \"4.1\"/\"4.2\").\n * - Les codes de ALWAYS_BLOCKING_CODES bloquent toujours, indépendamment\n * de `configured`.\n */\nexport function isBlockingCode(code: string, configured?: string[]): boolean {\n if (ALWAYS_BLOCKING_CODES.includes(code)) {\n return true;\n }\n const list = configured ?? DEFAULT_BLOCKING_CODES;\n return list.includes(code);\n}\n"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;;AAgBG;AACI,IAAM,sBAAsB,GAAa;IAC9C,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;;AAGP;;;;;AAKG;AACI,IAAM,qBAAqB,GAAa,CAAC,KAAK;AAErD;;;;;;;;;;AAUG;AACG,SAAU,cAAc,CAAC,IAAY,EAAE,UAAqB,EAAA;AAChE,IAAA,IAAI,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACxC,QAAA,OAAO,IAAI;IACb;IACA,IAAM,IAAI,GAAG,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,MAAA,GAAV,UAAU,GAAI,sBAAsB;AACjD,IAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC5B;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"labelToKey.js","sources":["../../../../src/utils/labelToKey.ts"],"sourcesContent":["/**\n * Converts a human-readable label into a snake_case key suitable for top-level\n * storage in userInput.\n *\n * Rules:\n * - Strip diacritical marks (accents)\n * - Lowercase everything\n * - Replace any sequence of non-alphanumeric characters with a single underscore\n * - Trim leading/trailing underscores\n *\n * Examples:\n * \"Dénomination sociale\" → \"denomination_sociale\"\n * \"N° de SIREN / SIRET\" → \"n_de_siren_siret\"\n * \" E-mail \" → \"e_mail\"\n */\nexport function labelToKey(label: string): string {\n return label\n .normalize(\"NFD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;AAcG;AACG,SAAU,UAAU,CAAC,KAAa,EAAA;AACtC,IAAA,OAAO;SACJ,SAAS,CAAC,KAAK;AACf,SAAA,OAAO,CAAC,QAAQ,EAAE,EAAE;AACpB,SAAA,WAAW;AACX,SAAA,OAAO,CAAC,aAAa,EAAE,GAAG;AAC1B,SAAA,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;AAC5B;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"listFieldUtils.js","sources":["../../../../src/utils/listFieldUtils.ts"],"sourcesContent":["import type { CustomField, ListColumn } from \"../types/session\";\n\nconst DEFAULT_LIST_MIN_ROWS = 1;\n\nexport const getListFieldMinRows = (field: Pick<CustomField, \"minRows\">) => {\n const candidate = Number(field.minRows);\n if (!Number.isFinite(candidate) || candidate < DEFAULT_LIST_MIN_ROWS) {\n return DEFAULT_LIST_MIN_ROWS;\n }\n return Math.floor(candidate);\n};\n\n/**\n * Normalise listColumns vers le nouveau format ListColumn[].\n * Rétrocompatibilité : si l'ancien format string[] est détecté, chaque\n * entrée est convertie en { label: string, type: 'text' }.\n */\nexport const normalizeListColumns = (\n columns: ListColumn[] | string[] | undefined,\n): ListColumn[] => {\n if (!columns || columns.length === 0) return [];\n if (typeof columns[0] === \"string\") {\n return (columns as string[]).map((label) => ({ label, type: \"text\" as const }));\n }\n return columns as ListColumn[];\n};\n\nexport const createEmptyListRow = (columns: ListColumn[]): Record<string, string> =>\n Object.fromEntries(columns.map((col) => [col.label, \"\"]));\n\nexport const ensureMinimumListRows = (\n rows: Record<string, string>[],\n columns: ListColumn[],\n minRows: number,\n): Record<string, string>[] => {\n if (rows.length >= minRows) {\n return rows;\n }\n\n const missingRows = Array.from({ length: minRows - rows.length }, () =>\n createEmptyListRow(columns),\n );\n return [...rows, ...missingRows];\n};\n\nexport const countNonEmptyListRows = (rows: Record<string, string>[]) =>\n rows.filter((row) =>\n Object.values(row).some((value) => String(value || \"\").trim().length > 0),\n ).length;\n"],"names":["__spreadArray"],"mappings":";;;;AAEA,IAAM,qBAAqB,GAAG,CAAC;AAExB,IAAM,mBAAmB,GAAG,UAAC,KAAmC,EAAA;IACrE,IAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;AACvC,IAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,qBAAqB,EAAE;AACpE,QAAA,OAAO,qBAAqB;IAC9B;AACA,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC9B;AAEA;;;;AAIG;AACI,IAAM,oBAAoB,GAAG,UAClC,OAA4C,EAAA;AAE5C,IAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;IAC/C,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QAClC,OAAQ,OAAoB,CAAC,GAAG,CAAC,UAAC,KAAK,EAAA,EAAK,QAAC,EAAE,KAAK,EAAA,KAAA,EAAE,IAAI,EAAE,MAAe,EAAE,EAAC,CAAlC,CAAkC,CAAC;IACjF;AACA,IAAA,OAAO,OAAuB;AAChC;AAEO,IAAM,kBAAkB,GAAG,UAAC,OAAqB,EAAA;IACtD,OAAA,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,UAAC,GAAG,EAAA,EAAK,OAAA,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,CAAf,CAAe,CAAC,CAAC;AAAzD;IAEW,qBAAqB,GAAG,UACnC,IAA8B,EAC9B,OAAqB,EACrB,OAAe,EAAA;AAEf,IAAA,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE;AAC1B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,YAAA;QAChE,OAAA,kBAAkB,CAAC,OAAO,CAAC;AAA3B,IAAA,CAA2B,CAC5B;IACD,OAAAA,uBAAA,CAAAA,uBAAA,CAAA,EAAA,EAAW,IAAI,EAAA,IAAA,CAAA,EAAK,WAAW,EAAA,IAAA,CAAA;AACjC;AAEO,IAAM,qBAAqB,GAAG,UAAC,IAA8B,EAAA;AAClE,IAAA,OAAA,IAAI,CAAC,MAAM,CAAC,UAAC,GAAG,EAAA;AACd,QAAA,OAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAC,KAAK,EAAA,EAAK,OAAA,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA,CAArC,CAAqC,CAAC;IAAzE,CAAyE,CAC1E,CAAC,MAAM;AAFR;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mimeTypes.js","sources":["../../../../src/utils/mimeTypes.ts"],"sourcesContent":["export function mimeTypeToExtension(mimeType: string): string {\n const mimeTypes: { [key: string]: string } = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpg\",\n \"application/pdf\": \"pdf\",\n \"text/plain\": \"txt\",\n // Ajoutez d'autres types MIME et leurs extensions si nécessaire\n };\n\n return mimeTypes[mimeType] || \"\";\n}\n\nexport function getMimeType(ext: string): string {\n const extToMime: { [key: string]: string } = {\n png: 'image/png',\n jpg: 'image/jpeg',\n pdf: 'application/pdf',\n txt: 'text/plain',\n };\n return extToMime[ext] || '';\n}\n"],"names":[],"mappings":";;AAAM,SAAU,mBAAmB,CAAC,QAAgB,EAAA;AAClD,IAAA,IAAM,SAAS,GAA8B;AAC3C,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,iBAAiB,EAAE,KAAK;AACxB,QAAA,YAAY,EAAE,KAAK;;KAEpB;AAED,IAAA,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE;AAClC;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation.js","sources":["../../../../src/utils/navigation.ts"],"sourcesContent":["/**\n * Indirection minimale devant `window.location`.\n *\n * jsdom ≥ 22 déclare `window.location` non-configurable et `location.replace`\n * non-inscriptible : `delete window.location` renvoie `false` et toute\n * réassignation échoue en silence. Une redirection appelée directement sur\n * `window.location` n'est donc plus observable en test — elle se contente\n * d'émettre « Not implemented: navigation » dans la console jsdom, ce qui fait\n * passer un test qui n'a en réalité rien vérifié.\n *\n * Ce module est interne : il n'est pas exporté par `src/index.ts` et ne fait\n * pas partie du contrat public du paquet.\n */\nexport function replaceLocation(url: string): void {\n window.location.replace(url);\n}\n"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;AAYG;AACG,SAAU,eAAe,CAAC,GAAW,EAAA;AACzC,IAAA,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;AAC9B;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderInlineMarkdown.js","sources":["../../../../src/utils/renderInlineMarkdown.tsx"],"sourcesContent":["import React from \"react\";\n\n/**\n * Mini-renderer Markdown *inline* et sûr, pour les textes de consentement.\n *\n * Volontairement limité (pas de lib externe, SDK publié npm) :\n * - liens `[libellé](url)` — uniquement http(s) et mailto, ouverts en nouvel onglet ;\n * - gras `**texte**` ;\n * - paragraphes (lignes vides) et sauts de ligne simples.\n *\n * Aucune injection de HTML brut : on ne produit que des éléments React, le texte\n * reste du texte. Les URLs non http(s)/mailto sont rendues en texte (pas de lien).\n */\n\nconst SAFE_URL = /^(https?:|mailto:)/i;\n\n// Capture **gras** ou [libellé](url) ; le reste est du texte simple.\nconst INLINE_PATTERN = /(\\*\\*([^*]+)\\*\\*)|(\\[([^\\]]+)\\]\\(([^)\\s]+)\\))/g;\n\nfunction renderInlineSegments(text: string, keyPrefix: string): React.ReactNode[] {\n const nodes: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let i = 0;\n\n INLINE_PATTERN.lastIndex = 0;\n while ((match = INLINE_PATTERN.exec(text)) !== null) {\n if (match.index > lastIndex) {\n nodes.push(text.slice(lastIndex, match.index));\n }\n\n if (match[2] !== undefined) {\n // **gras**\n nodes.push(<strong key={`${keyPrefix}-b-${i}`}>{match[2]}</strong>);\n } else if (match[4] !== undefined && match[5] !== undefined) {\n // [libellé](url)\n const label = match[4];\n const url = match[5];\n if (SAFE_URL.test(url)) {\n nodes.push(\n <a\n key={`${keyPrefix}-a-${i}`}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {label}\n </a>,\n );\n } else {\n // URL non sûre : on retombe sur le libellé en texte simple.\n nodes.push(label);\n }\n }\n\n lastIndex = INLINE_PATTERN.lastIndex;\n i += 1;\n }\n\n if (lastIndex < text.length) {\n nodes.push(text.slice(lastIndex));\n }\n\n return nodes;\n}\n\n/**\n * Rend une chaîne markdown en paragraphes React. Les blocs séparés par une ligne\n * vide deviennent des `<p>` ; les sauts de ligne simples deviennent des `<br/>`.\n */\nexport function renderInlineMarkdown(\n text: string | undefined,\n): React.ReactNode {\n if (!text) return null;\n\n const blocks = text.split(/\\n\\s*\\n/);\n\n return blocks.map((block, blockIndex) => {\n const lines = block.split(\"\\n\");\n const content: React.ReactNode[] = [];\n\n lines.forEach((line, lineIndex) => {\n if (lineIndex > 0) {\n content.push(<br key={`br-${blockIndex}-${lineIndex}`} />);\n }\n content.push(\n ...renderInlineSegments(line, `${blockIndex}-${lineIndex}`),\n );\n });\n\n return <p key={`p-${blockIndex}`}>{content}</p>;\n });\n}\n"],"names":["_jsx"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessionStatus.js","sources":["../../../../src/utils/sessionStatus.ts"],"sourcesContent":["// Statuts de résultat consolidé : le backend réécrit sessions.status avec le\n// résultat consolidé une fois la session terminale (voir\n// ResultUpdaterHelper.updateResult côté backend). Une session rouverte après\n// coup porte donc l'un de ces statuts en base, pas \"ended\".\nconst CONSOLIDATED_RESULT_STATUSES = new Set([\n \"verify\",\n \"ai_approved\",\n \"ai_rejected\",\n \"user_approved\",\n \"user_rejected\",\n]);\n\n/**\n * true si la session est terminée (écran de fin), qu'elle porte encore le\n * statut brut \"ended\" ou déjà un statut de résultat consolidé.\n *\n * Ne PAS confondre avec \"conform\" : posé par SignatureElectronic juste après\n * la signature, avant le vrai nœud \"end\" — ce n'est pas une fin de parcours.\n */\nexport const isSessionFinished = (status?: string | null): boolean => {\n if (!status) return false;\n return status === \"ended\" || CONSOLIDATED_RESULT_STATUSES.has(status);\n};\n"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA,IAAM,4BAA4B,GAAG,IAAI,GAAG,CAAC;IAC3C,QAAQ;IACR,aAAa;IACb,aAAa;IACb,eAAe;IACf,eAAe;AAChB,CAAA,CAAC;AAEF;;;;;;AAMG;AACI,IAAM,iBAAiB,GAAG,UAAC,MAAsB,EAAA;AACtD,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,KAAK;IACzB,OAAO,MAAM,KAAK,OAAO,IAAI,4BAA4B,CAAC,GAAG,CAAC,MAAM,CAAC;AACvE;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"userInputForm.js","sources":["../../../../src/utils/userInputForm.ts"],"sourcesContent":["import type {\n AddressParts,\n BirthDateParts,\n InformationType,\n} from \"../types/userInputForm\";\n\nexport const resolveInformationType = (\n informationType?: string,\n fallback: InformationType = \"identity\"\n): InformationType => {\n if (\n informationType === \"identity\" ||\n informationType === \"identity-legal\" ||\n informationType === \"identity-legal-rep\" ||\n informationType === \"contact\" ||\n informationType === \"address\" ||\n informationType === \"nationality\" ||\n informationType === \"custom\"\n ) {\n return informationType;\n }\n return fallback;\n};\n\nexport const parseBirthDate = (value: string): BirthDateParts => {\n if (!value) {\n return { day: \"\", month: \"\", year: \"\" };\n }\n\n try {\n if (value.includes(\"-\")) {\n const parts = value.split(\"-\");\n if (parts.length === 3) {\n if (Number(parts[0]) <= 31) {\n const [day, month, year] = parts;\n return {\n day,\n month,\n year,\n };\n }\n }\n }\n\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n return {\n day: String(date.getDate()).padStart(2, \"0\"),\n month: String(date.getMonth() + 1).padStart(2, \"0\"),\n year: String(date.getFullYear()),\n };\n }\n } catch (error) {\n console.error(\"Error parsing birth date:\", error);\n }\n\n return { day: \"\", month: \"\", year: \"\" };\n};\n\nexport const checkIsMajor = (birthDate: string): boolean => {\n if (!birthDate) {\n return false;\n }\n\n const today = new Date();\n let birthDateObj: Date | undefined;\n\n if (birthDate.includes(\"-\") && birthDate.split(\"-\").length === 3) {\n const parts = birthDate.split(\"-\");\n if (Number(parts[0]) <= 31) {\n const [day, month, year] = parts;\n birthDateObj = new Date(Number(year), Number(month) - 1, Number(day));\n } else {\n birthDateObj = new Date(birthDate);\n }\n } else {\n birthDateObj = new Date(birthDate);\n }\n\n if (!birthDateObj || Number.isNaN(birthDateObj.getTime())) {\n return false;\n }\n\n const age = today.getFullYear() - birthDateObj.getFullYear();\n const monthDiff = today.getMonth() - birthDateObj.getMonth();\n const dayDiff = today.getDate() - birthDateObj.getDate();\n\n return (\n age > 18 ||\n (age === 18 && (monthDiff > 0 || (monthDiff === 0 && dayDiff >= 0)))\n );\n};\n\nexport const parseAddress = (\n value: string,\n fallback: AddressParts\n): AddressParts => {\n if (!value) {\n return fallback;\n }\n\n const parts = value.split(\",\");\n if (parts.length < 2) {\n return {\n ...fallback,\n addressLine1: value.trim(),\n };\n }\n\n const addressLine1 = (parts[0] || \"\").trim();\n const cityPostalPart = (parts[1] || \"\").trim();\n const country = (parts[2] || \"\").trim();\n\n const cityPostalMatch = cityPostalPart.match(/^(\\d{4,6})\\s+(.*)$/);\n\n if (cityPostalMatch) {\n return {\n addressLine1,\n postalCode: cityPostalMatch[1],\n city: cityPostalMatch[2],\n country,\n };\n }\n\n return {\n addressLine1,\n postalCode: fallback.postalCode,\n city: cityPostalPart || fallback.city,\n country: country || fallback.country,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/utils/utils.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Combines multiple class names using clsx and merges Tailwind classes with twMerge\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"names":["twMerge","clsx"],"mappings":";;;;;AAGA;;AAEG;SACa,EAAE,GAAA;IAAC,IAAA,MAAA,GAAA,EAAA;SAAA,IAAA,EAAA,GAAA,CAAuB,EAAvB,EAAA,GAAA,SAAA,CAAA,MAAuB,EAAvB,EAAA,EAAuB,EAAA;QAAvB,MAAA,CAAA,EAAA,CAAA,GAAA,SAAA,CAAA,EAAA,CAAA;;AACjB,IAAA,OAAOA,qBAAO,CAACC,SAAI,CAAC,MAAM,CAAC,CAAC;AAC9B;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"validationUtils.js","sources":["../../../../src/utils/validationUtils.ts"],"sourcesContent":["import type { Prediction, JdiMismatchDetail } from \"./apiAnalysis\";\n\n/**\n * Clé i18n (suffixe de `validation_points.7.0.*`) pour chaque champ d'identité\n * en échec. Voir docs backend NFC_JDI_ERROR_MAPPING.md pour le référentiel de\n * codes — 7.0 = \"owner\" (le détenteur du document ne correspond pas à la\n * saisie utilisateur).\n */\nconst MISMATCH_FIELD_KEY: Record<JdiMismatchDetail[\"field\"], string> = {\n firstName: \"mismatch_first_name\",\n lastName: \"mismatch_last_name\",\n birthDate: \"mismatch_birth_date\",\n};\n\n/**\n * Default validation points for success scenarios\n */\nconst DEFAULT_SUCCESS_VALIDATION_POINTS = {\n quality: \"success.quality_excellent\",\n readability: \"success.readability_confirmed\",\n authenticity: \"success.authenticity_verified\",\n} as const;\n\n/**\n * Default validation points for error scenarios\n */\nconst DEFAULT_ERROR_VALIDATION_POINTS = {\n quality: \"errors.image_quality_insufficient\",\n readability: \"errors.readability_problematic\",\n authenticity: \"errors.authenticity_not_verified\",\n} as const;\n\n/**\n * Safely extracts error code from predictions array\n */\nexport function getErrorCodeFromPredictions(predictions?: Prediction[] | null): string | null {\n if (!predictions || !Array.isArray(predictions) || predictions.length === 0) {\n return null;\n }\n return predictions[0].code || null;\n}\n\n/**\n * Gets validation points based on error code and scenario type\n *\n * @param errorCode - The error code from API response (e.g., \"1.0\", \"2.1\")\n * @param predictions - Optional predictions array as fallback for error code\n * @param t - Translation function from i18n\n * @param type - Type of scenario: 'success' or 'error'\n * @param mismatchDetails - Pour le code 7.0 uniquement : champs d'identité en\n * échec (saisi vs lu), calculés côté backend. S'ils sont fournis et non\n * vides, remplacent la bullet \"document\" générique par un message\n * personnalisé par champ. Sinon, comportement inchangé (message générique).\n * @returns Array of validation point strings\n */\nexport function getValidationPoints(\n errorCode: string | undefined | null,\n predictions: Prediction[] | undefined | null,\n t: any, // Using any to be compatible with i18n TFunction\n type: 'success' | 'error',\n mismatchDetails?: JdiMismatchDetail[] | null,\n): string[] {\n // Use errorCode from props, or try to get from predictions as fallback\n let code = errorCode;\n if (!code) {\n code = getErrorCodeFromPredictions(predictions);\n }\n\n if (code) {\n // Try to get code-specific validation points from i18n\n const quality = t(`validation_points.${code}.quality`, \"\");\n const readability = t(`validation_points.${code}.readability`, \"\");\n\n // If we have at least quality and readability, use code-specific points\n if (quality && readability) {\n if (code === '7.0' && mismatchDetails && mismatchDetails.length > 0) {\n const mismatchBullets = mismatchDetails\n .map((detail) => {\n const fieldKey = MISMATCH_FIELD_KEY[detail.field];\n if (!fieldKey) return \"\";\n return t(`validation_points.7.0.${fieldKey}`, {\n entered: detail.entered,\n read: detail.read,\n });\n })\n .filter(Boolean);\n\n if (mismatchBullets.length > 0) {\n return [quality, readability, ...mismatchBullets].filter(Boolean);\n }\n }\n\n const document = t(`validation_points.${code}.document`, \"\");\n // Filter out empty strings\n return [quality, readability, document].filter(Boolean);\n }\n }\n\n // Fallback to default validation points\n const defaults = type === 'success'\n ? DEFAULT_SUCCESS_VALIDATION_POINTS\n : DEFAULT_ERROR_VALIDATION_POINTS;\n\n return [\n t(defaults.quality, \"\"),\n t(defaults.readability, \"\"),\n t(defaults.authenticity, \"\"),\n ].filter(Boolean);\n}\n"],"names":["__spreadArray"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"_commonjsHelpers.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"heic2any.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"heic2any2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Face Scan Square.svg.js","sources":["../../../src/assets/Face Scan Square.svg"],"sourcesContent":["export default \"assets/Face Scan Square-c5a142da630f8205.svg\""],"names":[],"mappings":"AAAA,yBAAe,IAAI,GAAG,CAAC,yCAAyC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Lightbulb.svg.js","sources":["../../../src/assets/Lightbulb.svg"],"sourcesContent":["export default \"assets/Lightbulb-209595ace824e52e.svg\""],"names":[],"mappings":"AAAA,oBAAe,IAAI,GAAG,CAAC,kCAAkC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Monitor Camera.svg.js","sources":["../../../src/assets/Monitor Camera.svg"],"sourcesContent":["export default \"assets/Monitor Camera-ab984ad5aef2f553.svg\""],"names":[],"mappings":"AAAA,wBAAe,IAAI,GAAG,CAAC,uCAAuC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI;;;;"}