@checktiv/sdk-web 1.7.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +36 -10
  2. package/dist/{api-Cjh51lsw.d.ts → api-DicBOi5f.d.ts} +11 -9
  3. package/dist/capture-ui.d.ts +4 -4
  4. package/dist/capture-ui.js +2 -2
  5. package/dist/capture.d.ts +3 -3
  6. package/dist/capture.js +1 -1
  7. package/dist/chunk-523TT3PD.js +7 -0
  8. package/dist/chunk-AW7QM2QH.js +6 -0
  9. package/dist/{chunk-CSNKMUIP.js → chunk-CNHIOCUU.js} +2 -2
  10. package/dist/{chunk-DXW36O3Q.js → chunk-H33IXOKB.js} +4 -4
  11. package/dist/chunk-NC4B6XNS.js +9 -0
  12. package/dist/{chunk-5BFT2P4R.js → chunk-OMR5UY5H.js} +1 -1
  13. package/dist/chunk-S24BZWVR.js +3 -0
  14. package/dist/collect-user-info.d.ts +20 -13
  15. package/dist/collect-user-info.js +3 -3
  16. package/dist/{controller-e63nkNGE.d.ts → controller-DYXlBzQS.d.ts} +4 -2
  17. package/dist/{copy-CC_mrlVV.d.ts → copy-DVW_qbbM.d.ts} +1 -1
  18. package/dist/custom-form.d.ts +3 -3
  19. package/dist/custom-form.js +2 -2
  20. package/dist/fraud.d.ts +3 -3
  21. package/dist/fraud.js +2 -2
  22. package/dist/idv/cross-device.d.ts +3 -3
  23. package/dist/idv/cross-device.js +2 -2
  24. package/dist/idv.d.ts +3 -3
  25. package/dist/idv.js +6 -6
  26. package/dist/{index-9vcErEYX.d.ts → index-DBJeQp6J.d.ts} +3 -3
  27. package/dist/index.d.ts +6 -6
  28. package/dist/index.js +4 -4
  29. package/dist/{machine-DZPN-A44.d.ts → machine-Z0b9Q7zQ.d.ts} +2 -1
  30. package/dist/react.d.ts +4 -4
  31. package/dist/react.js +5 -5
  32. package/dist/workspace.d.ts +3 -3
  33. package/package.json +1 -1
  34. package/dist/chunk-DRNEDARS.js +0 -7
  35. package/dist/chunk-F2BDZRAX.js +0 -9
  36. package/dist/chunk-JS3Y6T76.js +0 -3
  37. package/dist/chunk-OTBL3KBS.js +0 -6
  38. /package/dist/{chunk-EXC2ZRUH.js → chunk-WC6TLR42.js} +0 -0
package/README.md CHANGED
@@ -302,18 +302,37 @@ const collector = collectUserInfo({
302
302
  });
303
303
  ```
304
304
 
305
- **Render your form from the template with `describe()`.** `legalName` is always
306
- required; every other field is optional and gated by the operator's template.
307
- `describe()` tells you which optional fields the template collects, so you render
308
- required-ness template-driven instead of guessing:
305
+ **Collect the name as ICAO components.** Ask for a family name and an ordered
306
+ list of given names, exactly as the hosted verification journey does. A given
307
+ name beyond the first is another entry in the same list, never a separate
308
+ middle-name field, and an empty list is a complete answer for a person with one
309
+ name. `legalName` (the full name verbatim, as printed on the ID) is optional and
310
+ is meant for an integrator who already holds a single full-name string; send it
311
+ only if you have one. Every submission must carry a name in one of those two
312
+ shapes, and TypeScript enforces that at compile time.
313
+
314
+ **Render the rest of your form from the session with `describe()`.** The contact
315
+ fields are optional and gated by the operator's template, and the NAME rule
316
+ depends on which checks the verification runs, so `describe()` tells you both and
317
+ you render required-ness session-driven instead of guessing:
309
318
 
310
319
  ```js
311
320
  const config = await collector.describe();
312
321
  if (config.ok) {
313
322
  // config.fields is a subset of 'email' | 'phone' | 'dob' | 'address'.
314
- // config.captureStructuredName is true when a structured first/middle/last
315
- // name is wanted (otherwise collect a single legal name).
316
- renderForm(config.fields, config.captureStructuredName);
323
+ // config.nameComponents is 'required' | 'requested' | 'optional' and reports
324
+ // what the SERVER enforces. 'required' means a check in this verification
325
+ // reads the name in separate parts, so a submission carrying only a
326
+ // `legalName` is rejected with `name_components_required`.
327
+ //
328
+ // NEVER hide the family-name / given-names inputs on any value: they are
329
+ // always an accepted name shape, and the only one a background check can use.
330
+ // Render a repeatable given-names input, one entry per name, never a separate
331
+ // middle-name field.
332
+ //
333
+ // config.captureStructuredName is deprecated: it reports only what the
334
+ // operator's template declares, never what the server enforces.
335
+ renderForm(config.fields, config.nameComponents);
317
336
  }
318
337
  ```
319
338
 
@@ -324,9 +343,16 @@ step the embedded modules cannot render.
324
343
 
325
344
  ```js
326
345
  const result = await collector.submit({
327
- legalName: 'Ada Lovelace',
328
- name: { first: 'Ada', last: 'Lovelace' }, // when captureStructuredName is true
329
- email: 'ada@example.com',
346
+ // The name. `familyName` may hold several words (a double surname, a
347
+ // particle); `givenNames` is ordered, one entry per given name, and an empty
348
+ // array is a complete answer for a person with one name. Nothing is ever
349
+ // split or joined for you.
350
+ familyName: 'Garcia Lopez',
351
+ givenNames: ['Jose', 'Maria'],
352
+ // Optional: the full name verbatim, if you already hold one. Omit the key
353
+ // when you do not - never send an empty string, which is rejected.
354
+ // legalName: 'Jose Maria Garcia Lopez',
355
+ email: 'jose@example.com',
330
356
  // phone, dateOfBirth ('YYYY-MM-DD'), and address are also optional.
331
357
  });
332
358
 
@@ -1,5 +1,5 @@
1
- import { C as CaptureLayout, a as CaptureBehaviorMessage, h as SelfiePromptMap, j as SelfieChromeCopy, b as CoachingKind } from './machine-DZPN-A44.js';
2
- import { M as MountCopy } from './copy-CC_mrlVV.js';
1
+ import { C as CaptureLayout, a as CaptureBehaviorMessage, j as SelfiePromptMap, k as SelfieChromeCopy, b as CoachingKind } from './machine-Z0b9Q7zQ.js';
2
+ import { M as MountCopy } from './copy-DVW_qbbM.js';
3
3
  import { C as CrossDeviceCopy } from './copy-DCeQ4JKx.js';
4
4
 
5
5
  declare const SystemModes: readonly ["live", "test"];
@@ -7,7 +7,8 @@ type SystemMode = (typeof SystemModes)[number];
7
7
  declare const DataRegions: readonly ["us", "eu"];
8
8
  type DataRegion = (typeof DataRegions)[number];
9
9
 
10
- type ChecktivErrorCode = 'origin_not_allowed' | 'token_expired' | 'session_expired' | 'wrong_token_type' | 'protocol_mismatch' | 'camera_denied' | 'camera_unsupported' | 'cv_gate_failed' | 'upload_failed' | 'sdk_load_failed' | 'biometric_unsupported' | 'isolation_required';
10
+ type ChecktivKnownErrorCode = 'origin_not_allowed' | 'token_expired' | 'session_expired' | 'wrong_token_type' | 'protocol_mismatch' | 'camera_denied' | 'camera_unsupported' | 'cv_gate_failed' | 'upload_failed' | 'submit_failed' | 'sdk_load_failed' | 'biometric_unsupported' | 'isolation_required';
11
+ type ChecktivErrorCode = ChecktivKnownErrorCode | (string & {});
11
12
  declare const CHECKTIV_RECOVERY_STRATEGIES: readonly ["retry", "cross_device", "refresh_session", "contact_operator"];
12
13
  type ChecktivRecovery = (typeof CHECKTIV_RECOVERY_STRATEGIES)[number];
13
14
  interface ChecktivError {
@@ -16,6 +17,8 @@ interface ChecktivError {
16
17
  recovery: ChecktivRecovery;
17
18
  message: string;
18
19
  }
20
+ declare const CHECKTIV_ERROR_CODES: readonly ChecktivKnownErrorCode[];
21
+ declare function createChecktivError(code: ChecktivKnownErrorCode): ChecktivError;
19
22
 
20
23
  interface TokenManager {
21
24
  get(): Promise<string>;
@@ -23,7 +26,7 @@ interface TokenManager {
23
26
  }
24
27
 
25
28
  interface SyntheticIdvScript {
26
- injectError?: ChecktivErrorCode;
29
+ injectError?: ChecktivKnownErrorCode;
27
30
  stepDelayMs?: number;
28
31
  }
29
32
 
@@ -304,10 +307,9 @@ interface SessionsCreateApplicant {
304
307
  readonly externalId?: string;
305
308
  readonly email?: string;
306
309
  readonly phone?: string;
307
- readonly firstName?: string;
308
- readonly middleName?: string;
309
- readonly lastName?: string;
310
- readonly legalName?: string;
310
+ readonly familyName?: string;
311
+ readonly givenNames?: readonly string[];
312
+ readonly nameSuffix?: string;
311
313
  readonly dateOfBirth?: string;
312
314
  readonly address?: SessionsCreateApplicantAddress;
313
315
  readonly referenceName?: string;
@@ -337,4 +339,4 @@ declare class InvalidPublishableKeyError extends Error {
337
339
  }
338
340
  declare function parsePublishableKey(key: string): ParsedPublishableKey;
339
341
 
340
- export { parsePublishableKey as A, type ChecktivInitScope as B, type ChecktivInitOptions as C, type SubstrateContext as D, REMINT_READY_TIMEOUT_MS as E, type FraudHandle as F, type GetSessionToken as G, createIdv as H, type InitOptions as I, type ChecktivCustomFormEvent as J, type CustomFormCopy as K, type CustomFormFieldCopy as L, type MountOptions as M, type CustomFormHandle as N, type CustomFormMountOptions as O, type ProvisionedHandle as P, createCustomForm as Q, type ResolvedIdvConfig as R, type SdkRegion as S, type TokenManager as T, createFraud as U, type ChecktivClient as a, type ChecktivSessions as b, type ChecktivError as c, type ChecktivErrorCode as d, type ChecktivEvent as e, type ChecktivFraudEvent as f, type ChecktivIdvEvent as g, type ChecktivRecovery as h, type CrossDeviceHandoffHook as i, type FraudMountOptions as j, type GetSessionTokenContext as k, type IdvCoachingHint as l, type IdvHandle as m, type IdvMountOptions as n, InvalidPublishableKeyError as o, type MountCompleteResult as p, type MountProvisionedOptions as q, type MountScope as r, type ParsedPublishableKey as s, type SdkMode as t, type SessionsCreateApplicant as u, type SessionsCreateApplicantAddress as v, type SessionsCreateInput as w, type SessionsCreateOptions as x, type SessionsCreateResult as y, type SyntheticIdvScript as z };
342
+ export { type SessionsCreateResult as A, type SyntheticIdvScript as B, type ChecktivInitOptions as C, createChecktivError as D, parsePublishableKey as E, type FraudHandle as F, type GetSessionToken as G, type ChecktivInitScope as H, type InitOptions as I, type SubstrateContext as J, REMINT_READY_TIMEOUT_MS as K, createIdv as L, type MountOptions as M, type ChecktivCustomFormEvent as N, type CustomFormCopy as O, type ProvisionedHandle as P, type CustomFormFieldCopy as Q, type ResolvedIdvConfig as R, type SdkRegion as S, type TokenManager as T, type CustomFormHandle as U, type CustomFormMountOptions as V, createCustomForm as W, createFraud as X, type ChecktivClient as a, type ChecktivSessions as b, CHECKTIV_ERROR_CODES as c, type ChecktivError as d, type ChecktivErrorCode as e, type ChecktivEvent as f, type ChecktivFraudEvent as g, type ChecktivIdvEvent as h, type ChecktivKnownErrorCode as i, type ChecktivRecovery as j, type CrossDeviceHandoffHook as k, type FraudMountOptions as l, type GetSessionTokenContext as m, type IdvCoachingHint as n, type IdvHandle as o, type IdvMountOptions as p, InvalidPublishableKeyError as q, type MountCompleteResult as r, type MountProvisionedOptions as s, type MountScope as t, type ParsedPublishableKey as u, type SdkMode as v, type SessionsCreateApplicant as w, type SessionsCreateApplicantAddress as x, type SessionsCreateInput as y, type SessionsCreateOptions as z };
@@ -1,7 +1,7 @@
1
- import { a as CaptureControllerDeps, b as CaptureEvent } from './controller-e63nkNGE.js';
2
- import { C as CaptureLayout, f as CaptureState } from './machine-DZPN-A44.js';
3
- import { M as MountCopy } from './copy-CC_mrlVV.js';
4
- export { T as TerminalKind, f as fallbackCopy } from './copy-CC_mrlVV.js';
1
+ import { a as CaptureControllerDeps, b as CaptureEvent } from './controller-DYXlBzQS.js';
2
+ import { C as CaptureLayout, f as CaptureState } from './machine-Z0b9Q7zQ.js';
3
+ import { M as MountCopy } from './copy-DVW_qbbM.js';
4
+ export { T as TerminalKind, f as fallbackCopy } from './copy-DVW_qbbM.js';
5
5
 
6
6
  interface MountCaptureOptions extends Omit<CaptureControllerDeps, 'getIframe'> {
7
7
  copy: MountCopy;
@@ -1,7 +1,7 @@
1
- export { fallbackCopy, mount } from './chunk-5BFT2P4R.js';
1
+ export { fallbackCopy, mount } from './chunk-OMR5UY5H.js';
2
2
  import './chunk-HV2QKVJX.js';
3
3
  import './chunk-XOGHMNBX.js';
4
- import './chunk-OTBL3KBS.js';
4
+ import './chunk-AW7QM2QH.js';
5
5
  import './chunk-NHNGQ5BB.js';
6
6
  import './chunk-IQKHRPJR.js';
7
7
  import './chunk-QFA3K5ZV.js';
package/dist/capture.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export { C as CaptureController, a as CaptureControllerDeps, b as CaptureEvent, c as CaptureEventType, S as SubmitResult, d as createCaptureController } from './controller-e63nkNGE.js';
2
- import { b as CoachingKind } from './machine-DZPN-A44.js';
3
- export { c as CaptureAction, d as CaptureErrorKind, e as CapturePhase, f as CaptureState, i as isBiometricPhase, n as nextCapturePhaseAfterDocument, r as reducer } from './machine-DZPN-A44.js';
1
+ export { C as CaptureController, a as CaptureControllerDeps, b as CaptureEvent, c as CaptureEventType, S as SubmitResult, d as createCaptureController } from './controller-DYXlBzQS.js';
2
+ import { b as CoachingKind } from './machine-Z0b9Q7zQ.js';
3
+ export { c as CaptureAction, d as CaptureErrorKind, e as CapturePhase, f as CaptureState, i as isBiometricPhase, n as nextCapturePhaseAfterDocument, r as reducer } from './machine-Z0b9Q7zQ.js';
4
4
 
5
5
  declare function coachingKindForState(state: string): CoachingKind;
6
6
 
package/dist/capture.js CHANGED
@@ -1,4 +1,4 @@
1
- export { coachingKindForState, createCaptureController, isBiometricPhase, nextCapturePhaseAfterDocument, reducer } from './chunk-OTBL3KBS.js';
1
+ export { coachingKindForState, createCaptureController, isBiometricPhase, nextCapturePhaseAfterDocument, reducer } from './chunk-AW7QM2QH.js';
2
2
  import './chunk-NHNGQ5BB.js';
3
3
  import './chunk-IQKHRPJR.js';
4
4
  import './chunk-QFA3K5ZV.js';
@@ -0,0 +1,7 @@
1
+ import { withTokenRetry } from './chunk-S2OOEDJS.js';
2
+ import { sdkPublicSettings, SESSIONS_ME_PATH, dataPlaneHeaders } from './chunk-HFQJYEGZ.js';
3
+ import { IDV_DOCUMENT_TYPES } from './chunk-IQKHRPJR.js';
4
+
5
+ var SDK_MODULES=["idv","fraud","custom_form"];var BIOMETRIC_MODES=["none","selfie","liveness"];var DOCUMENT_TYPES=IDV_DOCUMENT_TYPES;var SDK_MODES=["live","test"];var DATA_REGIONS=Object.keys(sdkPublicSettings.regions);var COLLECT_USER_INFO_FIELD_VALUES=["email","phone","dob","address"];var COLLECT_USER_INFO_NAME_COMPONENTS_VALUES=["required","requested","optional"];function isRecord(v){return typeof v==="object"&&v!==null}function isNonEmptyString(v){return typeof v==="string"&&v.length>0}function isSdkModule(v){return typeof v==="string"&&SDK_MODULES.includes(v)}function isBiometricMode(v){return typeof v==="string"&&BIOMETRIC_MODES.includes(v)}function isSdkMode(v){return typeof v==="string"&&SDK_MODES.includes(v)}function isSdkRegion(v){return typeof v==="string"&&DATA_REGIONS.includes(v)}function isDocumentType(v){return typeof v==="string"&&DOCUMENT_TYPES.includes(v)}function isCollectUserInfoField(v){return typeof v==="string"&&COLLECT_USER_INFO_FIELD_VALUES.includes(v)}function isNameComponents(v){return typeof v==="string"&&COLLECT_USER_INFO_NAME_COMPONENTS_VALUES.includes(v)}function parseCollectUserInfoConfig(value){if(!isRecord(value))return null;const fields=value.fields;const captureStructuredName=value.capture_structured_name;const nameComponents=value.name_components;if(!Array.isArray(fields))return null;const parsedFields=[];for(const f of fields){if(!isCollectUserInfoField(f))return null;parsedFields.push(f);}if(typeof captureStructuredName!=="boolean")return null;if(!isNameComponents(nameComponents))return null;return {fields:parsedFields,nameComponents,captureStructuredName}}function parseIdvConfig(value){if(!isRecord(value))return null;const documentTypes=value.document_types;const biometricMode=value.biometric_mode;const minAge=value.min_age;if(!Array.isArray(documentTypes)||documentTypes.length<1)return null;const types=[];for(const t of documentTypes){if(!isDocumentType(t))return null;types.push(t);}if(!isBiometricMode(biometricMode))return null;if(minAge!==void 0&&typeof minAge!=="number")return null;const config={documentTypes:types,biometricMode};if(typeof minAge==="number")config.minAge=minAge;return config}function parseSessionData(body){if(!isRecord(body)||!isRecord(body.data))return null;const d=body.data;const sessionId=d.session_id;const stepId=d.step_id;const stepType=d.step_type;if(!isNonEmptyString(sessionId)||!isNonEmptyString(stepId)||!isNonEmptyString(stepType)||!isSdkMode(d.mode)||!isSdkRegion(d.region)){return null}if(!Array.isArray(d.modules)||!d.modules.every(isSdkModule))return null;const modules=d.modules;const wantsIdv=stepType==="id_verification";let config=null;if(wantsIdv){config=parseIdvConfig(d.config);if(config===null)return null}const collectUserInfoConfig=stepType==="collect_user_info"?parseCollectUserInfoConfig(d.config)??void 0:void 0;return {sessionId,stepId,stepType,config,mode:d.mode,region:d.region,modules,...collectUserInfoConfig!==void 0?{collectUserInfoConfig}:{}}}function isJourneyPlaneBody(body){if(!isRecord(body)||!isRecord(body.data))return false;const d=body.data;if("session_id"in d)return false;return isRecord(d.session)||isRecord(d.snapshot)}function isNonRenderableMarker(body){if(!isRecord(body)||!isRecord(body.data))return false;return body.data.renderable===false}function warnWrongTokenPlane(){console.warn("[Checktiv] The session token reached the wrong data plane. For the zero-lifecycle APIs (Checktiv.mount() or collectUserInfo), fetchToken must return your durable client token, which the SDK exchanges for a working token. For a customer-embed Checktiv.init(), getSessionToken must return a browser token.");}async function resolveSession(ctx,fetchImpl){const origin=ctx.apiBaseOrigin;let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+SESSIONS_ME_PATH,{method:"GET",headers:dataPlaneHeaders(ctx,token)}),result=>result?.status===401);}catch{return {kind:"unresolved"}}if(!res.ok)return {kind:"unresolved"};let body;try{body=await res.json();}catch{return {kind:"unresolved"}}if(isNonRenderableMarker(body))return {kind:"nothing_to_render"};const data=parseSessionData(body);if(data!==null){ctx.setSessionId(data.sessionId);return {kind:"ok",session:data}}if(isJourneyPlaneBody(body))return {kind:"wrong_token"};return {kind:"unresolved"}}
6
+
7
+ export { isJourneyPlaneBody, isRecord, resolveSession, warnWrongTokenPlane };
@@ -0,0 +1,6 @@
1
+ import { external_exports } from './chunk-NHNGQ5BB.js';
2
+ import { IDV_DOCUMENT_TYPES, isTwoSidedDocumentType } from './chunk-IQKHRPJR.js';
3
+
4
+ var behaviorTraitsSchema=external_exports.object({webdriver:external_exports.boolean(),maxTouchPoints:external_exports.number().int().min(0).max(512),timezone:external_exports.string().max(64).nullable(),pluginCount:external_exports.number().int().min(0).max(256),deviceModelHint:external_exports.string().max(120).nullable()}).strict();var behaviorStepSchema=external_exports.object({stepId:external_exports.string().max(80),seconds:external_exports.number().min(0).max(86400),pasteCount:external_exports.number().int().min(0).max(1e4)}).strict();var behaviorSurfaceEnum=external_exports.enum(["parent","embed"]);var behaviorCapturedPayloadSchema=external_exports.object({steps:external_exports.array(behaviorStepSchema).max(50),traits:behaviorTraitsSchema,segments:external_exports.array(external_exports.object({surface:behaviorSurfaceEnum,steps:external_exports.array(behaviorStepSchema).max(50),traits:behaviorTraitsSchema}).strict()).max(4).optional()}).strict();behaviorCapturedPayloadSchema.extend({ingress:external_exports.enum(["hosted","embedded"]).optional(),stepId:external_exports.string().max(128).optional()}).strict();var REGION_IDS=["us","eu"];var SystemModes=["live","test"];var DataRegions=REGION_IDS;var CURRENT_PROTOCOL_VERSION=1;var LivenessAwsRegions=["us-east-1","eu-west-1"];({us:LivenessAwsRegions[0],eu:LivenessAwsRegions[1]});external_exports.uuid();external_exports.email().toLowerCase();external_exports.object({createdAt:external_exports.iso.datetime(),updatedAt:external_exports.iso.datetime()});var dataRegionEnum=external_exports.enum(DataRegions);var dataModeEnum=external_exports.enum(SystemModes);external_exports.object({orgId:external_exports.string().min(1),mode:dataModeEnum,region:dataRegionEnum});external_exports.object({orgId:external_exports.string().min(1),actorId:external_exports.string().min(1),mode:dataModeEnum,region:dataRegionEnum,traceId:external_exports.string().optional()});var canonicalOriginSchema=external_exports.string().min(1).refine(v=>{if(v.includes("*"))return false;try{return new URL(v).origin===v}catch{return false}},"must be a canonical origin (scheme and host[:port], no path / query / fragment / credentials / wildcard)");canonicalOriginSchema.refine(v=>{try{return new URL(v).protocol==="https:"}catch{return false}},"must be a canonical https-only origin (scheme https: and host[:port], no path / query / fragment / credentials / wildcard)");var MAX_FIELDS_PER_SCREEN=8;var MAX_RULES_PER_SCREEN=10;var MAX_LOCALES=5;var MAX_LABEL_LEN=600;var bcp47LocaleSchema=external_exports.string().regex(/^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$/,"must be a BCP-47 locale tag");var bcp47I18nLabelSchema=external_exports.record(bcp47LocaleSchema,external_exports.string().max(MAX_LABEL_LEN)).refine(map=>Object.keys(map).length<=MAX_LOCALES,{message:`at most ${MAX_LOCALES} locales per label`});var FORM_FIELD_TYPES=["short_text","long_text","number","email","phone","date","single_select","multi_select","boolean","file_upload","content_heading","content_paragraph"];var RESERVED_SLUGS=new Set(["__proto__","constructor","prototype"]);var formFieldSlugSchema=external_exports.string().regex(/^[a-z][a-z0-9_]{0,63}$/,"must be a lowercase slug").refine(s=>!RESERVED_SLUGS.has(s),{message:"reserved slug is not allowed"});var formFieldValidationSchema=external_exports.object({minLength:external_exports.number().int().nonnegative().optional(),maxLength:external_exports.number().int().positive().optional(),min:external_exports.number().optional(),max:external_exports.number().optional(),minSelections:external_exports.number().int().nonnegative().optional(),maxSelections:external_exports.number().int().positive().optional()}).strict();var formFieldOptionSchema=external_exports.object({value:external_exports.string().min(1).max(200),label:bcp47I18nLabelSchema}).strict();var formFieldSchema=external_exports.object({id:formFieldSlugSchema,type:external_exports.enum(FORM_FIELD_TYPES),label:bcp47I18nLabelSchema,helpText:bcp47I18nLabelSchema.optional(),required:external_exports.boolean().default(false),validation:formFieldValidationSchema.optional(),options:external_exports.array(formFieldOptionSchema).max(50).optional()}).strict();var formRuleOpEnum=external_exports.enum(["eq","neq","in"]);var formRuleActionEnum=external_exports.enum(["flag_for_review","notify_email"]);var formRuleValueSchema=external_exports.union([external_exports.string(),external_exports.number(),external_exports.boolean(),external_exports.array(external_exports.union([external_exports.string(),external_exports.number(),external_exports.boolean()]))]);var formRuleSchema=external_exports.object({id:formFieldSlugSchema,when:external_exports.object({fieldId:formFieldSlugSchema,op:formRuleOpEnum,value:formRuleValueSchema}).strict(),actions:external_exports.array(formRuleActionEnum).min(1),notifyOrgMemberIds:external_exports.array(external_exports.string().min(1)).max(25).optional()}).strict();var customFormScreenConfigSchema=external_exports.object({supportedLocales:external_exports.array(bcp47LocaleSchema).min(1).max(MAX_LOCALES),fields:external_exports.array(formFieldSchema).min(1).max(MAX_FIELDS_PER_SCREEN),rules:external_exports.array(formRuleSchema).max(MAX_RULES_PER_SCREEN).default([])}).strict();var hexColorSchema=external_exports.string().regex(/^#[0-9a-fA-F]{6}$/,"Must be a 6-digit hex color, e.g. #2563eb");var colorModeSchema=external_exports.enum(["auto","light","dark"]);external_exports.object({primaryColor:hexColorSchema,secondaryColor:hexColorSchema.nullable().default(null),colorMode:colorModeSchema.default("auto")});var organizationBrandingSchema=external_exports.object({brandName:external_exports.string().min(1).max(120).optional(),primaryColor:hexColorSchema.optional(),secondaryColor:hexColorSchema.nullable().optional(),colorMode:colorModeSchema.optional(),logoUrl:external_exports.url().optional()});organizationBrandingSchema.omit({logoUrl:true});var checkTypeEnum=external_exports.enum(["collect_user_info","watchlist","background_us_criminal","background_global","id_verification","custom_form"]);var testHintEnum=external_exports.enum(["pass","review","fail","doc_quality"]);var STEP_ID_REGEX=/^step_[0-9A-Za-z_-]{1,64}$/;var ADDRESS_TEXT_REGEX=/^[^\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069<>]+$/;var safeAddressText=max=>external_exports.string().min(1).max(max).regex(ADDRESS_TEXT_REGEX,"invalid characters");var postalCodeField=external_exports.string().max(20).regex(/^[A-Za-z0-9 \-]*$/);var countryField=external_exports.string().length(2).regex(/^[A-Z]{2}$/);var placeIdField=external_exports.string().max(255).regex(/^[A-Za-z0-9_\-:]+$/);function levenshtein(a,b){const m=a.length;const n=b.length;let prev=Array.from({length:n+1},(_,j)=>j);let curr=new Array(n+1).fill(0);for(let i=1;i<=m;i++){curr[0]=i;for(let j=1;j<=n;j++){const cost=a[i-1]===b[j-1]?0:1;curr[j]=Math.min(prev[j]+1,curr[j-1]+1,prev[j-1]+cost);}[prev,curr]=[curr,prev];}return prev[n]}var normalizeKey=key=>key.toLowerCase().replace(/[^a-z0-9]/g,"");var CURATED_KEY_SYNONYMS={zip:"postal_code",zipcode:"postal_code",postcode:"postal_code",templateid:"workflow_template_id",suffix:"name_suffix"};function nearestKnownKey(key,knownKeys){const target=normalizeKey(key);if(target.length===0)return null;const curated=Object.hasOwn(CURATED_KEY_SYNONYMS,target)?CURATED_KEY_SYNONYMS[target]:void 0;if(curated!==void 0){const curatedNormalized=normalizeKey(curated);const match=knownKeys.find(candidate=>normalizeKey(candidate)===curatedNormalized);if(match!==void 0)return match}let best=null;let bestDistance=Number.POSITIVE_INFINITY;for(const candidate of knownKeys){const normalized=normalizeKey(candidate);const distance=normalized===target?0:levenshtein(target,normalized);if(distance<bestDistance){bestDistance=distance;best=candidate;}}const threshold=Math.max(1,Math.ceil(target.length/2));return bestDistance<=threshold?best:null}function unknownKeyErrorMap(knownKeys,retiredKeys={}){const retiredByNormalizedKey=new Map(Object.entries(retiredKeys).map(([retired,message])=>[normalizeKey(retired),message]));return issue=>{if(issue.code!=="unrecognized_keys")return void 0;return issue.keys.map(key=>{const migration=retiredByNormalizedKey.get(normalizeKey(key));if(migration!==void 0)return `Unknown field "${key}". ${migration}`;const suggestion=nearestKnownKey(key,knownKeys);return suggestion?`Unknown field "${key}". Did you mean "${suggestion}"?`:`Unknown field "${key}".`}).join(" ")}}external_exports.object({line1:safeAddressText(120),line2:safeAddressText(120).optional(),city:safeAddressText(80),region:safeAddressText(80).optional(),postalCode:postalCodeField.optional(),country:countryField,placeId:placeIdField.optional(),formatted:safeAddressText(500).optional()});var wireAddressShape={line1:safeAddressText(120),line2:safeAddressText(120).optional(),city:safeAddressText(80),region:safeAddressText(80).optional(),postal_code:postalCodeField.optional(),country:countryField,place_id:placeIdField.optional(),formatted:safeAddressText(500).optional()};external_exports.strictObject(wireAddressShape,{error:unknownKeyErrorMap(Object.keys(wireAddressShape))}).transform(wire=>({line1:wire.line1,line2:wire.line2,city:wire.city,region:wire.region,postalCode:wire.postal_code,country:wire.country,placeId:wire.place_id,formatted:wire.formatted}));var applicantSkipPolicySchema=external_exports.object({minAttemptsBeforeShown:external_exports.number().int().nonnegative().default(0),requireReason:external_exports.boolean().default(false)}).loose();var i18nLabelSchema=external_exports.record(external_exports.string(),external_exports.string());var stepConditionSchema=external_exports.object({field:external_exports.string(),operator:external_exports.enum(["eq","neq","in","not_in"]),value:external_exports.union([external_exports.string(),external_exports.array(external_exports.string())])}).optional();var workflowStepSchema=external_exports.object({checkType:checkTypeEnum,isRequired:external_exports.boolean().default(true),order:external_exports.number().int(),maxAttempts:external_exports.number().int().default(3),condition:stepConditionSchema,label:external_exports.string().optional()});external_exports.array(workflowStepSchema).min(1);var baseStepFields={id:external_exports.string().regex(STEP_ID_REGEX),order:external_exports.number().int().nonnegative(),isRequired:external_exports.boolean().default(true),applicantSkippable:external_exports.boolean().default(false),applicantSkipPolicy:applicantSkipPolicySchema.optional(),maxAttempts:external_exports.number().int().positive().default(3),label:i18nLabelSchema.optional(),description:i18nLabelSchema.optional(),dependsOn:external_exports.array(external_exports.string()).optional(),condition:external_exports.unknown().nullable().optional()};var backgroundConfigSchema=external_exports.object({jurisdictionScope:external_exports.enum(["us","eu","global"]).default("global"),recordTypesIncluded:external_exports.array(external_exports.enum(["criminal","sex_offender","adverse_media"])).min(1).default(["criminal"])}).default({jurisdictionScope:"global",recordTypesIncluded:["criminal"]});var watchlistConfigSchema=external_exports.object({lists:external_exports.array(external_exports.enum(["pep","ofac","eu","un"])).default([]),confidenceThreshold:external_exports.number().min(0).max(1).default(.8)}).default({lists:[],confidenceThreshold:.8});var COLLECT_USER_INFO_FIELDS=["email","phone","dob","address"];var collectUserInfoConfigSchema=external_exports.object({fields:external_exports.preprocess(raw=>{if(!Array.isArray(raw))return raw;return raw.filter(v=>v!=="name")},external_exports.array(external_exports.enum(COLLECT_USER_INFO_FIELDS))).default(["email","phone"]),captureStructuredName:external_exports.boolean().default(false)}).default({fields:["email","phone"],captureStructuredName:false});var idvDocumentTypeEnum=external_exports.enum(IDV_DOCUMENT_TYPES);var idVerificationConfigSchema=external_exports.object({documentTypes:idvDocumentTypeEnum.array().min(1).default([...IDV_DOCUMENT_TYPES]),biometricMode:external_exports.enum(["none","selfie","liveness"]).default("none"),requireMrzMatch:external_exports.boolean().default(false),requireExpiryValid:external_exports.boolean().default(true),requireNameMatch:external_exports.boolean().default(false),documentAuthenticity:external_exports.boolean().default(false),minAge:external_exports.number().int().min(0).max(150).optional()}).strict().default({documentTypes:[...IDV_DOCUMENT_TYPES],biometricMode:"none",requireMrzMatch:false,requireExpiryValid:true,requireNameMatch:false,documentAuthenticity:false});var watchlistStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("watchlist"),config:watchlistConfigSchema});var backgroundUsCriminalStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("background_us_criminal"),config:backgroundConfigSchema});var backgroundGlobalStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("background_global"),config:backgroundConfigSchema});var collectUserInfoStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("collect_user_info"),config:collectUserInfoConfigSchema});var idVerificationStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("id_verification"),config:idVerificationConfigSchema});var customFormScreenStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("custom_form"),config:customFormScreenConfigSchema});external_exports.discriminatedUnion("type",[watchlistStepSchema,backgroundUsCriminalStepSchema,backgroundGlobalStepSchema,collectUserInfoStepSchema,idVerificationStepSchema,customFormScreenStepSchema]);var captureBrandTokensSchema=external_exports.object({primary:hexColorSchema,primaryHover:hexColorSchema,onPrimary:hexColorSchema,secondary:hexColorSchema,onSecondary:hexColorSchema,ring:hexColorSchema}).strict();var captureThemeSchema=external_exports.object({colorMode:external_exports.enum(["light","dark"]),brandTokens:captureBrandTokensSchema.nullable().default(null)}).strict();var captureDocumentSideEnum=external_exports.enum(["front","back"]);var captureDocumentGroupEnum=external_exports.enum(["unknown","dl","id","passport","passport-card","visa"]);var captureErrorCodeEnum=external_exports.enum(["cv_gate_failed","upload_failed","sdk_load_failed","token_expired","biometric_unsupported","camera_unsupported","selfie_camera_denied","liveness_camera_denied","liveness_timeout","liveness_server_error","liveness_runtime_error","liveness_cancelled","protocol_mismatch"]);external_exports.enum(["no_face","multiple_faces","too_dark","move_closer","not_centered","hold_still","ready"]);var selfiePromptMapSchema=external_exports.object({no_face:external_exports.string().min(1).max(120).optional(),multiple_faces:external_exports.string().min(1).max(120).optional(),too_dark:external_exports.string().min(1).max(120).optional(),move_closer:external_exports.string().min(1).max(120).optional(),not_centered:external_exports.string().min(1).max(120).optional(),hold_still:external_exports.string().min(1).max(120).optional(),ready:external_exports.string().min(1).max(120).optional()}).strict();var selfieChromeCopySchema=external_exports.object({shutterLabel:external_exports.string().min(1).max(80).optional(),shutterHint:external_exports.string().min(1).max(120).optional(),confirm:external_exports.string().min(1).max(80).optional(),retake:external_exports.string().min(1).max(80).optional()}).strict();var captureInitMessageSchema=external_exports.object({type:external_exports.literal("capture:init"),captureToken:external_exports.string().min(1),config:idVerificationConfigSchema,locale:external_exports.string().min(2).max(35),theme:captureThemeSchema,mode:dataModeEnum.optional(),testHint:testHintEnum.optional(),protocolVersion:external_exports.number().int().min(1).optional(),beginScanPrompt:external_exports.string().min(1).max(200).optional(),beginScanLabel:external_exports.string().min(1).max(80).optional(),selfiePromptMap:selfiePromptMapSchema.optional(),selfieChromeCopy:selfieChromeCopySchema.optional()}).strict();external_exports.object({data:external_exports.object({captureToken:external_exports.string().min(1),embedOrigin:canonicalOriginSchema,runIndex:external_exports.number().int().min(0),expiresAt:external_exports.iso.datetime({offset:true}),embedContextToken:external_exports.string().min(1),mode:dataModeEnum.optional(),testHint:testHintEnum.optional()}).strict()}).strict();var captureReadyMessageSchema=external_exports.object({type:external_exports.literal("capture:ready")}).strict();var captureDocumentCompleteMessageSchema=external_exports.object({type:external_exports.literal("capture:document-complete"),side:captureDocumentSideEnum,r2Key:external_exports.string().min(1)}).strict();var captureSelfieCompleteMessageSchema=external_exports.object({type:external_exports.literal("capture:selfie-complete"),r2Key:external_exports.string().min(1)}).strict();var captureCoachingMessageSchema=external_exports.object({type:external_exports.literal("capture:coaching"),state:external_exports.string().min(1).max(120),attemptIndex:external_exports.number().int().min(0)}).strict();var captureSelfieCvRejectMessageSchema=external_exports.object({type:external_exports.literal("capture:selfie-cv-reject"),retryReason:external_exports.string().min(1).max(120).optional(),attemptIndex:external_exports.number().int().min(0)}).strict();var captureErrorMessageSchema=external_exports.object({type:external_exports.literal("capture:error"),code:captureErrorCodeEnum}).strict();var captureBiometricCameraLiveMessageSchema=external_exports.object({type:external_exports.literal("capture:biometric_camera_live"),timestamp:external_exports.number().optional()}).strict();var idvR2KeysSchema=external_exports.object({front:external_exports.string().min(1),back:external_exports.string().min(1).optional(),selfie:external_exports.string().min(1).optional()}).strict();var captureAllCompleteMessageSchema=external_exports.object({type:external_exports.literal("capture:all-complete"),r2Keys:idvR2KeysSchema,documentGroup:captureDocumentGroupEnum.optional()}).strict();external_exports.object({stepId:external_exports.string().min(1),runIndex:external_exports.number().int().min(0),r2Keys:idvR2KeysSchema,traceId:external_exports.string().optional()}).strict();external_exports.object({stepId:external_exports.string().min(1).optional()}).strict();var idvLivenessStsCredentialsSchema=external_exports.object({accessKeyId:external_exports.string().min(1),secretAccessKey:external_exports.string().min(1),sessionToken:external_exports.string().min(1),expiration:external_exports.string().min(1)}).strict();var livenessAwsRegionEnum=external_exports.enum(LivenessAwsRegions);external_exports.object({awsSessionId:external_exports.string().min(1),awsRegion:livenessAwsRegionEnum,credentials:idvLivenessStsCredentialsSchema}).strict();var captureBehaviorMessageSchema=external_exports.object({type:external_exports.literal("capture:behavior"),steps:external_exports.array(behaviorStepSchema).max(50),traits:behaviorTraitsSchema}).strict();var captureFromIframeMessageSchema=external_exports.discriminatedUnion("type",[captureReadyMessageSchema,captureDocumentCompleteMessageSchema,captureSelfieCompleteMessageSchema,captureCoachingMessageSchema,captureSelfieCvRejectMessageSchema,captureErrorMessageSchema,captureAllCompleteMessageSchema,captureBehaviorMessageSchema,captureBiometricCameraLiveMessageSchema]);external_exports.discriminatedUnion("type",[captureInitMessageSchema]);var idvCvGateRetryReasonEnum=external_exports.enum(["no_face_detected","multiple_faces","low_confidence","no_id_document","image_read_failed"]);external_exports.object({ok:external_exports.boolean(),retryReason:idvCvGateRetryReasonEnum.optional()}).strict();external_exports.enum(["front","back","selfie"]);function reducer(state,action){switch(action.type){case "mint_ok":return {kind:"waiting_for_init",captureToken:action.captureToken,embedOrigin:action.embedOrigin,runIndex:action.runIndex};case "mint_failed":return {kind:"mint_error"};case "iframe_ready":if(state.kind==="waiting_for_init"){return {kind:"ready",embedOrigin:state.embedOrigin,runIndex:state.runIndex}}return state;case "phase":if(state.kind==="ready"||state.kind==="capturing"){return {kind:"capturing",embedOrigin:state.embedOrigin,runIndex:state.runIndex,phase:action.phase,coaching:null,lastCvRejectReason:action.phase==="selfie"&&state.kind==="capturing"?state.lastCvRejectReason:null,biometricLoading:isBiometricPhase(action.phase)}}return state;case "coaching":if(state.kind==="ready"||state.kind==="capturing"){return {kind:"capturing",embedOrigin:state.embedOrigin,runIndex:state.runIndex,phase:"coaching",coaching:action.coaching,lastCvRejectReason:state.kind==="capturing"?state.lastCvRejectReason:null,biometricLoading:state.kind==="capturing"?state.biometricLoading:false}}return state;case "selfie_cv_reject":if(state.kind==="ready"||state.kind==="capturing"){return {kind:"capturing",embedOrigin:state.embedOrigin,runIndex:state.runIndex,phase:state.kind==="capturing"?state.phase:"selfie",coaching:state.kind==="capturing"?state.coaching:null,lastCvRejectReason:action.reason,biometricLoading:false}}return state;case "biometric_camera_live":if(state.kind==="capturing"){return {...state,biometricLoading:false}}return state;case "submitting":return {kind:"submitting"};case "submit_failed":return {kind:"submit_error"};case "submit_pending":return {kind:"submit_pending"};case "capture_superseded":return {kind:"capture_superseded"};case "token_expired":return {kind:"token_expired"};case "capture_error":return {kind:"capture_error",errorKind:action.errorKind};default:return state}}function nextCapturePhaseAfterDocument(side,documentTypes,biometricMode){if(side==="front"&&documentTypes.some(isTwoSidedDocumentType))return "document_back";if(biometricMode==="liveness")return "liveness";if(biometricMode==="selfie")return "selfie";return "uploading"}function isBiometricPhase(phase){return phase==="selfie"||phase==="liveness"}var RETRY_REASON_COACHING={no_face_detected:"hold_steady",multiple_faces:"hold_steady",low_confidence:"move_closer",no_id_document:"hold_steady",image_read_failed:"hold_steady"};function coachingKindForState(state){const retryParsed=idvCvGateRetryReasonEnum.safeParse(state);if(retryParsed.success)return RETRY_REASON_COACHING[retryParsed.data];switch(state){case "camera-too-far":return "move_closer";case "camera-too-close":case "document-too-close-to-frame-edge":return "move_farther";case "glare-detected":return "reduce_glare";case "too-dark":case "lighting-too-dark":return "too_dark";case "wrong-side":return "wrong_side";case "selfie_move_closer":return "move_closer";case "selfie_too_dark":return "too_dark";case "selfie_no_face":case "selfie_multiple_faces":case "selfie_not_centered":return "hold_steady";default:return "hold_steady"}}function createCaptureController(deps){let state={kind:"minting"};const stateListeners=new Set;const eventListeners=new Map;let captureToken=null;let pinnedOrigin=null;let runIndex=null;let mintMode;let mintTestHint;let started=false;let destroyed=false;let cancelled=false;let submitStarted=false;let messageListener=null;function setState(next){state=next;for(const listener of stateListeners)listener(state);}function dispatch(action){setState(reducer(state,action));}function emit(event){const listeners=eventListeners.get(event.type);if(listeners===void 0)return;for(const listener of listeners)listener(event);}function postInit(){if(destroyed||captureToken===null||pinnedOrigin===null)return false;const iframe=deps.getIframe();if(iframe===null||iframe.contentWindow===null)return false;const mintFields={...mintMode!==void 0?{mode:mintMode}:{},...mintTestHint!==void 0?{testHint:mintTestHint}:{}};const init={type:"capture:init",captureToken,...deps.initPayload(),...mintFields};iframe.contentWindow.postMessage(init,pinnedOrigin);return true}function handleMessage(msg){switch(msg.type){case "capture:ready":{const posted=postInit();if(posted&&state.kind==="waiting_for_init"){dispatch({type:"iframe_ready"});}return}case "capture:coaching":{dispatch({type:"coaching",coaching:coachingKindForState(msg.state)});deps.onCoaching?.(msg.state,msg.attemptIndex);return}case "capture:selfie-cv-reject":{const reason=msg.retryReason??null;dispatch({type:"selfie_cv_reject",reason});emit({type:"selfie-cv-reject",attemptIndex:msg.attemptIndex,reason});return}case "capture:document-complete":{const{config}=deps.initPayload();dispatch({type:"phase",phase:nextCapturePhaseAfterDocument(msg.side,config.documentTypes,config.biometricMode)});return}case "capture:selfie-complete":{dispatch({type:"phase",phase:"uploading"});return}case "capture:error":{if(msg.code==="token_expired"){dispatch({type:"token_expired"});return}dispatch({type:"capture_error",errorKind:msg.code});return}case "capture:all-complete":{void submitCapture(msg.r2Keys);return}case "capture:behavior":{deps.onBehaviorSegment?.({steps:msg.steps,traits:msg.traits});return}case "capture:biometric_camera_live":{dispatch({type:"biometric_camera_live"});return}default:{const _exhaustive=msg;return _exhaustive}}}async function submitCapture(r2Keys){if(submitStarted)return;submitStarted=true;if(runIndex===null){dispatch({type:"submit_failed"});return}if(deps.onBeforeSubmit){try{await deps.onBeforeSubmit();}catch{if(!destroyed)dispatch({type:"submit_failed"});return}if(destroyed)return}dispatch({type:"submitting"});let result;try{result=await deps.submit(runIndex,r2Keys);}catch{if(!destroyed)dispatch({type:"submit_failed"});return}if(destroyed)return;if(result.ok){emit({type:"all-complete",runIndex});return}if(result.reason==="token_expired"){dispatch({type:"token_expired"});return}if(result.reason==="signal_pending"){dispatch({type:"submit_pending"});return}if(result.reason==="capture_superseded"){dispatch({type:"capture_superseded"});return}dispatch({type:"submit_failed"});}function onWindowMessage(event){if(destroyed||pinnedOrigin===null)return;if(event.origin!==pinnedOrigin)return;if(event.source!==null&&event.source!==deps.getIframe()?.contentWindow)return;const parsed=captureFromIframeMessageSchema.safeParse(event.data);if(!parsed.success)return;handleMessage(parsed.data);}return {start(){if(destroyed||started)return;started=true;void(async()=>{try{const minted=await deps.mintToken();if(cancelled||destroyed)return;captureToken=minted.captureToken;pinnedOrigin=minted.embedOrigin;runIndex=minted.runIndex;mintMode=minted.mode;mintTestHint=minted.testHint;messageListener=onWindowMessage;window.addEventListener("message",messageListener);dispatch({type:"mint_ok",captureToken:minted.captureToken,embedOrigin:minted.embedOrigin,runIndex:minted.runIndex});}catch{if(cancelled||destroyed)return;dispatch({type:"mint_failed"});}})();},on(type,cb){let listeners=eventListeners.get(type);if(listeners===void 0){listeners=new Set;eventListeners.set(type,listeners);}listeners.add(cb);return ()=>{listeners?.delete(cb);}},subscribe(cb){stateListeners.add(cb);cb(state);return ()=>{stateListeners.delete(cb);}},handleReady(){if(destroyed)return;postInit();},destroy(){if(destroyed)return;destroyed=true;cancelled=true;if(messageListener!==null){window.removeEventListener("message",messageListener);messageListener=null;}}}}
5
+
6
+ export { CURRENT_PROTOCOL_VERSION, coachingKindForState, createCaptureController, isBiometricPhase, nextCapturePhaseAfterDocument, reducer };
@@ -1,5 +1,5 @@
1
- import { createChecktivError } from './chunk-JS3Y6T76.js';
1
+ import { createChecktivError } from './chunk-S24BZWVR.js';
2
2
 
3
- function createChecktivErrorEvent(code){return {type:"checktiv.idv.error",error:createChecktivError(code)}}var CAPTURE_ERROR_CODE={cv_gate_failed:"cv_gate_failed",upload_failed:"upload_failed",sdk_load_failed:"sdk_load_failed",biometric_unsupported:"biometric_unsupported",camera_unsupported:"camera_unsupported",selfie_camera_denied:"camera_denied",liveness_camera_denied:"camera_denied",liveness_runtime_error:"sdk_load_failed",liveness_timeout:"sdk_load_failed",liveness_server_error:"sdk_load_failed",liveness_cancelled:"sdk_load_failed",protocol_mismatch:"protocol_mismatch"};function mapStateToEvent(state,ctx){switch(state.kind){case "minting":case "waiting_for_init":case "submitting":return null;case "ready":return {type:"checktiv.idv.ready",config:ctx.config};case "capturing":if(state.phase==="coaching"&&state.coaching!==null){return {type:"checktiv.idv.coaching",hint:state.coaching}}return {type:"checktiv.idv.phase",phase:state.phase};case "mint_error":return createChecktivErrorEvent("session_expired");case "submit_error":return createChecktivErrorEvent("upload_failed");case "submit_pending":return {type:"checktiv.idv.processing",reason:"signal_pending"};case "capture_superseded":return {type:"checktiv.idv.capture_superseded"};case "token_expired":return createChecktivErrorEvent("token_expired");case "capture_error":return createChecktivErrorEvent(CAPTURE_ERROR_CODE[state.errorKind]);default:return null}}var opener=null;function registerCrossDeviceOpener(fn){opener=fn;}function getCrossDeviceOpener(){return opener}
3
+ function createChecktivErrorEvent(code){return {type:"checktiv.idv.error",error:createChecktivError(code)}}var CAPTURE_ERROR_CODE={cv_gate_failed:"cv_gate_failed",upload_failed:"upload_failed",sdk_load_failed:"sdk_load_failed",biometric_unsupported:"biometric_unsupported",camera_unsupported:"camera_unsupported",selfie_camera_denied:"camera_denied",liveness_camera_denied:"camera_denied",liveness_runtime_error:"sdk_load_failed",liveness_timeout:"sdk_load_failed",liveness_server_error:"sdk_load_failed",liveness_cancelled:"sdk_load_failed",protocol_mismatch:"protocol_mismatch"};function mapStateToEvent(state,ctx){switch(state.kind){case "minting":case "waiting_for_init":case "submitting":return null;case "ready":return {type:"checktiv.idv.ready",config:ctx.config};case "capturing":if(state.phase==="coaching"&&state.coaching!==null){return {type:"checktiv.idv.coaching",hint:state.coaching}}return {type:"checktiv.idv.phase",phase:state.phase};case "mint_error":return createChecktivErrorEvent("session_expired");case "submit_error":return createChecktivErrorEvent("submit_failed");case "submit_pending":return {type:"checktiv.idv.processing",reason:"signal_pending"};case "capture_superseded":return {type:"checktiv.idv.capture_superseded"};case "token_expired":return createChecktivErrorEvent("token_expired");case "capture_error":return createChecktivErrorEvent(CAPTURE_ERROR_CODE[state.errorKind]);default:{return null}}}var opener=null;function registerCrossDeviceOpener(fn){opener=fn;}function getCrossDeviceOpener(){return opener}
4
4
 
5
5
  export { createChecktivErrorEvent, getCrossDeviceOpener, mapStateToEvent, registerCrossDeviceOpener };
@@ -1,13 +1,13 @@
1
1
  import { getModule } from './chunk-GFHNOZVO.js';
2
- import { createChecktivError, isChecktivError } from './chunk-JS3Y6T76.js';
3
- import { parsePublishableKey, createWorkingTokenSource, createWorkingTokenManager } from './chunk-EXC2ZRUH.js';
4
- import { resolveSession, warnWrongTokenPlane } from './chunk-DRNEDARS.js';
2
+ import { createChecktivError, isChecktivError } from './chunk-S24BZWVR.js';
3
+ import { parsePublishableKey, createWorkingTokenSource, createWorkingTokenManager } from './chunk-WC6TLR42.js';
4
+ import { resolveSession, warnWrongTokenPlane } from './chunk-523TT3PD.js';
5
5
  import { assertNever } from './chunk-UBQTPS5J.js';
6
6
  import { createTokenManager } from './chunk-S2OOEDJS.js';
7
7
  import { resolveApiBaseOrigin, sdkPublicSettings, shortCodeRefreshPath, PUBLISHABLE_KEY_HEADER, SESSIONS_ME_REFRESH_LINK_PATH } from './chunk-HFQJYEGZ.js';
8
8
  import { R, k } from './chunk-XOGHMNBX.js';
9
9
  import { getServiceOrigin } from './chunk-QFA3K5ZV.js';
10
10
 
11
- var HOST_TAG="checktiv-root";var MOUNTED_FLAG="__checktivMounted";var LEGACY_HOST_ATTR="data-autohost-kyc-host";var HOST_ATTR="data-checktiv-host";var shadowCache=new WeakMap;function mountShadowHost(target){const existing=findExistingHost(target);if(existing){const cached=shadowCache.get(existing);if(cached)return cached}const host=document.createElement("div");host.setAttribute(HOST_ATTR,HOST_TAG);host.setAttribute(LEGACY_HOST_ATTR,HOST_TAG);host[MOUNTED_FLAG]=true;target.appendChild(host);const shadow=host.attachShadow({mode:"closed"});shadowCache.set(host,shadow);return shadow}function findExistingHost(target){for(const child of Array.from(target.children)){if(!(child instanceof HTMLElement))continue;const candidate=child;if(candidate[MOUNTED_FLAG]===true)return candidate}return null}function moduleErrorEvent(name,error){switch(name){case "idv":return {type:"checktiv.idv.error",error};case "fraud":return {type:"checktiv.fraud.error",error};case "custom_form":return {type:"checktiv.custom_form.error",error}}}function missingModuleMessage(name){return `This session requires the '${name}' module. Import '@checktiv/sdk-web/${name}' in your app.`}function missingModuleError(name){const base=createChecktivError("sdk_load_failed");return moduleErrorEvent(name,{...base,message:missingModuleMessage(name)})}function consentGateRequiredError(){const base=createChecktivError("sdk_load_failed");return moduleErrorEvent("fraud",{...base,message:"This session includes the 'fraud' module, which needs a consent gate. Pass onConsent to mountProvisioned() to enable it."})}function customFormConfigRequiredError(){const base=createChecktivError("sdk_load_failed");return moduleErrorEvent("custom_form",{...base,message:"This session includes the 'custom_form' module, which needs its form config. Pass customFormConfig to mountProvisioned() to enable it."})}function unmappedStepTypeError(stepType){const base=createChecktivError("sdk_load_failed");return moduleErrorEvent("idv",{...base,message:`This session's current step ('${stepType}') has no matching visual module in this SDK build. Upgrade '@checktiv/sdk-web' to a version that renders this step.`})}var MODULE_IS_VISUAL={idv:true,fraud:false,custom_form:true};var STEP_TYPE_TO_VISUAL_MODULE={id_verification:"idv",custom_form:"custom_form"};var stepTypeToVisualModuleView=STEP_TYPE_TO_VISUAL_MODULE;function resolveCurrentStepVisualModule(stepType){return stepTypeToVisualModuleView[stepType]}function defaultLoadModule(name){if(name==="idv"){const factory2=getModule("idv");if(factory2===void 0)return Promise.resolve(null);return Promise.resolve({mount:(ctx,opts)=>factory2(ctx,{target:opts.target,onEvent:opts.onEvent,copy:opts.copy,layout:opts.layout,maxWidth:opts.maxWidth,onBeforeSubmit:opts.onBeforeSubmit,onBehaviorSegment:opts.onBehaviorSegment,synthetic:opts.synthetic,crossDeviceCopy:opts.crossDeviceCopy,onOpenCrossDevice:opts.onOpenCrossDevice})})}if(name==="custom_form"){const factory2=getModule("custom_form");if(factory2===void 0)return Promise.resolve(null);return Promise.resolve({mount:(ctx,opts)=>{if(opts.customFormConfig===void 0){opts.onEvent?.(customFormConfigRequiredError());return {destroy:()=>void 0}}return factory2(ctx,{target:opts.target,config:opts.customFormConfig,copy:opts.customFormCopy,onEvent:opts.onEvent,session:opts.session})}})}const factory=getModule("fraud");if(factory===void 0)return Promise.resolve(null);return Promise.resolve({mount:(ctx,opts)=>{const onConsent=opts.onConsent;if(onConsent===void 0){opts.onEvent?.(consentGateRequiredError());return {destroy:()=>void 0}}return factory(ctx,{onConsent,onEvent:opts.onEvent})}})}function moduleErrorFor(name,code){return moduleErrorEvent(name,createChecktivError(code))}function createMountProvisioned(ctx,opts,deps={}){const emit=e=>opts.onEvent?.(e);const fetchImpl=opts.fetchImpl??fetch;const resolveSession2=deps.resolveSession??(()=>resolveSession(ctx,fetchImpl));const loadModule=deps.loadModule??defaultLoadModule;const handles=[];let destroyed=false;let idvOpenCrossDevice=null;void(async()=>{try{await composeModules();}catch(err){if(destroyed)return;console.warn("[Checktiv] mountProvisioned composition failed.",err);emit(moduleErrorFor("idv","sdk_load_failed"));}})();async function composeModules(){const resolution=await resolveSession2();if(destroyed)return;let session;switch(resolution.kind){case "ok":session=resolution.session;break;case "wrong_token":warnWrongTokenPlane();emit(moduleErrorFor("idv","wrong_token_type"));return;case "unresolved":emit(moduleErrorFor("idv","session_expired"));return;case "nothing_to_render":emit({type:"checktiv.idv.processing",reason:"no_renderable_step"});return;default:return assertNever(resolution)}const currentStepVisualModule=resolveCurrentStepVisualModule(session.stepType);if(currentStepVisualModule===void 0&&session.modules.some(m=>MODULE_IS_VISUAL[m])){emit(unmappedStepTypeError(session.stepType));return}for(const name of session.modules){if(destroyed)return;if(MODULE_IS_VISUAL[name]&&name!==currentStepVisualModule){continue}if(name==="fraud"&&opts.onConsent===void 0){emit(consentGateRequiredError());continue}const mod=await loadModule(name);if(destroyed)return;if(mod===null){emit(missingModuleError(name));continue}let moduleTarget;let containerToRemove=null;if(MODULE_IS_VISUAL[name]){const resolvedParent=typeof opts.target==="string"?typeof document!=="undefined"?document.querySelector(opts.target):null:opts.target;if(resolvedParent!==null){const container=document.createElement("div");resolvedParent.appendChild(container);containerToRemove=container;moduleTarget=container;}else {moduleTarget=opts.target;}}else {moduleTarget=opts.target;}let innerHandle;try{innerHandle=mod.mount(ctx,{target:moduleTarget,onEvent:opts.onEvent,onConsent:opts.onConsent,copy:opts.copy,layout:opts.layout,maxWidth:opts.maxWidth,onBeforeSubmit:opts.onBeforeSubmit,onBehaviorSegment:opts.onBehaviorSegment,synthetic:opts.synthetic,crossDeviceCopy:opts.crossDeviceCopy,onOpenCrossDevice:opts.onOpenCrossDevice,customFormConfig:opts.customFormConfig,customFormCopy:opts.customFormCopy,session:{sessionId:session.sessionId,stepId:session.stepId}});}catch(err){containerToRemove?.remove();throw err}if(name==="idv"){idvOpenCrossDevice=innerHandle.openCrossDevice??null;}const capturedContainer=containerToRemove;const handle={destroy(){try{innerHandle.destroy();}finally{capturedContainer?.remove();}}};if(destroyed){handle.destroy();return}handles.push(handle);}}return {destroy(){destroyed=true;while(handles.length>0){const handle=handles.pop();handle?.destroy();}},openCrossDevice(){idvOpenCrossDevice?.();}}}function init(opts,deps={}){const scope="publishableKey"in opts?{...parsePublishableKey(opts.publishableKey),publishableKey:opts.publishableKey}:{region:opts.region,mode:opts.mode,publishableKey:void 0};let sessionId="";const apiBaseOrigin=resolveApiBaseOrigin(opts.apiBase,scope.region,scope.mode);const ctx={region:scope.region,mode:scope.mode,publishableKey:scope.publishableKey,apiBaseOrigin,theme:opts.theme,locale:opts.locale??"en",betas:opts.betas??[],...opts.selfiePromptMap!==void 0?{selfiePromptMap:opts.selfiePromptMap}:{},...opts.selfieChromeCopy!==void 0?{selfieChromeCopy:opts.selfieChromeCopy}:{},tokens:deps.tokens??createTokenManager(opts.getSessionToken,()=>sessionId),getSessionId:()=>sessionId,setSessionId:id=>{sessionId=id;}};function mount2(...args){if(args[0]==="idv"){const factory2=getModule("idv");if(factory2===void 0)return missingIdvHandle(args[1]);return factory2(ctx,args[1])}if(args[0]==="custom_form"){const factory2=getModule("custom_form");if(factory2===void 0)return missingCustomFormHandle(args[1]);return factory2(ctx,args[1])}const factory=getModule("fraud");if(factory===void 0)return missingFraudHandle(args[1]);return factory(ctx,args[1])}return {mountProvisioned:provOpts=>createMountProvisioned(ctx,provOpts),mount:mount2}}function missingIdvHandle(opts){const base=createChecktivError("sdk_load_failed");opts.onEvent?.({type:"checktiv.idv.error",error:{...base,message:missingModuleMessage("idv")}});return {destroy:()=>void 0,unmount:()=>void 0}}function missingFraudHandle(opts){const base=createChecktivError("sdk_load_failed");opts.onEvent?.({type:"checktiv.fraud.error",error:{...base,message:missingModuleMessage("fraud")}});return {destroy:()=>void 0}}function missingCustomFormHandle(opts){const base=createChecktivError("sdk_load_failed");const error={type:"checktiv.custom_form.error",error:{...base,message:missingModuleMessage("custom_form")}};opts.onEvent?.(error);return {destroy:()=>void 0}}var RESUME_CLIENT_TOKEN_KEY_PREFIX="checktiv.rct.";function safeLocalStorage(){try{return globalThis.localStorage??null}catch{return null}}function createClientTokenStore(resumeKey,storage=safeLocalStorage()){const key=RESUME_CLIENT_TOKEN_KEY_PREFIX+resumeKey;return {read(){if(storage===null)return null;try{const raw=storage.getItem(key);return raw!==null&&raw.length>0?raw:null}catch{return null}},write(token){if(storage===null)return;try{storage.setItem(key,token);}catch{}},clear(){if(storage===null)return;try{storage.removeItem(key);}catch{}}}}var SESSIONS_CREATE_ERROR_CODES=["unauthorized","invalid_template","rate_limited","network","server_error"];function createSessionsCreateError(code,message){return {code,message}}function mapHttpStatusToSessionsCreateError(status){if(status===401||status===403)return "unauthorized";if(status===429)return "rate_limited";if(status===400||status===404||status===422)return "invalid_template";return "server_error"}function isSessionsCreateErrorCode(value){return SESSIONS_CREATE_ERROR_CODES.some(code=>code===value)}function isSessionsCreateError(value){if(typeof value!=="object"||value===null)return false;if(!("code"in value)||!("message"in value))return false;const{code,message}=value;return typeof code==="string"&&isSessionsCreateErrorCode(code)&&typeof message==="string"}async function requestSelfServiceResend(params){const fetchImpl=params.fetchImpl??fetch;const body=JSON.stringify({confirmEmail:params.confirmEmail});try{let res;if(params.mode==="short_code"){res=await fetchImpl(params.origin+shortCodeRefreshPath(params.shortCode),{method:"POST",headers:{"content-type":"application/json"},body});}return {requested:res.ok}}catch{return {requested:false}}}var version="1.7.1";var initialised=new WeakSet;function resolveVerifyOrigin(parsed){return getServiceOrigin(sdkPublicSettings.apps.verify.subdomain,"prod",parsed.region,sdkPublicSettings)}function buildPopupUrl(parsed,opts){const origin=resolveVerifyOrigin(parsed);if(opts.applicantLinkToken){return `${origin}/start?lt=${encodeURIComponent(opts.applicantLinkToken)}`}return `${origin}/`}function launchPopup(url){const w=460;const h=760;const left=Math.max(0,Math.floor((window.screen.width-w)/2));const top=Math.max(0,Math.floor((window.screen.height-h)/2));const features=`popup=yes,width=${w},height=${h},left=${left},top=${top}`;const popup=window.open(url,"checktiv",features);if(!popup){window.location.href=url;return null}return popup}var COMPLETE_EVENT_TYPE="autohost.kyc.complete";function isCompletionMessage(data){if(typeof data!=="object"||data===null)return false;if(!("type"in data))return false;return data.type===COMPLETE_EVENT_TYPE}function listenForCompletion(expectedOrigin,onComplete){if(!onComplete)return;const handler=event=>{if(event.origin!==expectedOrigin)return;const data=event.data;if(!isCompletionMessage(data))return;onComplete(data);};window.addEventListener("message",handler);}function buildButton(onClick){const children="Start verification";return k("button",{type:"button",onClick,style:'display: inline-flex; align-items: center; justify-content: center; padding: 10px 20px; font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif; font-size: 14px; font-weight: 600; color: #fff; background: #0b5fff; border: none; border-radius: 6px; cursor: pointer;'},children)}function resolveTarget(opts){if(opts.target)return opts.target;return document.querySelector("[data-checktiv]")??document.querySelector("[data-autohost-kyc]")}function mountButton(opts){const parsed=parsePublishableKey(opts.publishableKey);const target=resolveTarget(opts);if(!target){console.warn("[Checktiv] No mount target found. Either pass `target` explicitly or add `<div data-checktiv>` to your page.");return}if(initialised.has(target))return;initialised.add(target);const shadow=mountShadowHost(target);const verifyOrigin=resolveVerifyOrigin(parsed);listenForCompletion(verifyOrigin,opts.onComplete);const onClick=()=>{const popupUrl=buildPopupUrl(parsed,opts);launchPopup(popupUrl);};R(buildButton(onClick),shadow);}function completionSessionId(e){if(e.type!=="checktiv.idv.submitted"&&e.type!=="checktiv.custom_form.submitted"){return null}const sid="sessionId"in e?e.sessionId:void 0;return typeof sid==="string"&&sid.length>0?sid:null}function isSessionExpiredEvent(e){if(!e.type.endsWith(".error")||!("error"in e))return false;const err=e.error;if(typeof err!=="object"||err===null||!("code"in err))return false;return err.code==="session_expired"}function checktivErrorFromEvent(e){if(!e.type.endsWith(".error")||!("error"in e))return null;const err=e.error;return isChecktivError(err)?err:null}function mount(target,opts){const fetchImpl=opts.fetchImpl??fetch;const scope="publishableKey"in opts?{...parsePublishableKey(opts.publishableKey),publishableKey:opts.publishableKey}:{region:opts.region,mode:opts.mode,publishableKey:void 0};const mintOrigin=resolveApiBaseOrigin(opts.apiBase,scope.region,scope.mode);const store=opts.resumeKey!==void 0?createClientTokenStore(opts.resumeKey):null;let clientTokenPromise=null;const getClientToken=()=>{if(clientTokenPromise!==null)return clientTokenPromise;const persisted=store?.read()??null;if(persisted!==null){clientTokenPromise=Promise.resolve(persisted);return clientTokenPromise}const p=opts.fetchToken();clientTokenPromise=p;void p.then(tok=>store?.write(tok),()=>{if(clientTokenPromise===p)clientTokenPromise=null;});return p};const mintWorkingToken=createWorkingTokenSource(mintOrigin,getClientToken,scope.publishableKey,fetchImpl);const tokens=createWorkingTokenManager(mintWorkingToken);const base={getSessionToken:()=>tokens.get(),...opts.apiBase!==void 0?{apiBase:opts.apiBase}:{},...opts.theme!==void 0?{theme:opts.theme}:{}};const initOptions=scope.publishableKey!==void 0?{...base,publishableKey:scope.publishableKey}:{...base,region:scope.region,mode:scope.mode};const needsChannel=opts.onEvent!==void 0||opts.onError!==void 0||opts.onComplete!==void 0||store!==null;const safeCall=fn=>{try{fn();}catch{}};const onEvent=needsChannel?e=>{safeCall(()=>opts.onEvent?.(e));const error=checktivErrorFromEvent(e);if(error!==null)safeCall(()=>opts.onError?.(error));const sessionId=completionSessionId(e);if(sessionId!==null){store?.clear();safeCall(()=>opts.onComplete?.({sessionId}));}else if(isSessionExpiredEvent(e)){store?.clear();}}:void 0;const client=init(initOptions,{tokens});const handle=client.mountProvisioned({target,fetchImpl,onEvent,onConsent:opts.onConsent,...opts.layout!==void 0?{layout:opts.layout}:{},...opts.maxWidth!==void 0?{maxWidth:opts.maxWidth}:{},...opts.copy!==void 0?{copy:opts.copy}:{},...opts.crossDeviceCopy!==void 0?{crossDeviceCopy:opts.crossDeviceCopy}:{},...opts.onOpenCrossDevice!==void 0?{onOpenCrossDevice:opts.onOpenCrossDevice}:{}});const requestResend=confirmEmail=>{if(opts.shortCode===void 0)return Promise.resolve({requested:false});return requestSelfServiceResend({mode:"short_code",origin:mintOrigin,shortCode:opts.shortCode,confirmEmail,fetchImpl})};return {destroy(){handle.destroy();tokens.stop();},openCrossDevice:()=>handle.openCrossDevice?.(),requestResend}}function applicantToWire(a){const wire={};if(a.externalId!==void 0)wire.external_id=a.externalId;if(a.email!==void 0)wire.email=a.email;if(a.phone!==void 0)wire.phone=a.phone;if(a.firstName!==void 0)wire.first_name=a.firstName;if(a.middleName!==void 0)wire.middle_name=a.middleName;if(a.lastName!==void 0)wire.last_name=a.lastName;if(a.legalName!==void 0)wire.legal_name=a.legalName;if(a.dateOfBirth!==void 0)wire.date_of_birth=a.dateOfBirth;if(a.address!==void 0)wire.address=a.address;if(a.referenceName!==void 0)wire.reference_name=a.referenceName;return wire}function readCreatedClientToken(body){if(typeof body!=="object"||body===null||!("data"in body))return null;const data=body.data;if(typeof data!=="object"||data===null||!("client_token"in data))return null;const clientToken=data.client_token;return typeof clientToken==="string"&&clientToken.length>0?clientToken:null}var SESSIONS_CREATE_STATUS_HINT={unauthorized:"Verify your secret key (ah_sk_*) and that it matches the apiBase region.",invalid_template:"Verify the templateId (wt_*) and the request body.",rate_limited:"You have hit the rate ceiling. Retry after a short backoff.",network:"Check the apiBase origin and your network connectivity.",server_error:"This looks like a transient server error. Retry after a short backoff."};function sessionsCreateStatusHint(code){return SESSIONS_CREATE_STATUS_HINT[code]}var sessions={async create(input,options){if(typeof window!=="undefined"||typeof document!=="undefined"){throw new Error("checktiv.sessions.create must run on your server: it needs your secret key. Never call it in the browser.")}const fetchImpl=options.fetchImpl??fetch;const headers={Authorization:`Bearer ${options.secretKey}`,"content-type":"application/json"};if(options.idempotencyKey!==void 0)headers["Idempotency-Key"]=options.idempotencyKey;const body=JSON.stringify({workflow_template_id:input.templateId,applicant:applicantToWire(input.applicant)});let res;try{res=await fetchImpl(`${options.apiBase}/v1/sessions`,{method:"POST",headers,body});}catch{throw createSessionsCreateError("network","Checktiv sessions.create could not reach the API. Check the apiBase origin and your network connectivity.")}if(!res.ok){const code=mapHttpStatusToSessionsCreateError(res.status);throw createSessionsCreateError(code,`Checktiv sessions.create failed (status ${res.status}). ${sessionsCreateStatusHint(code)}`)}let parsed;try{parsed=await res.json();}catch{throw createSessionsCreateError("network","Checktiv sessions.create returned a non-JSON response.")}const clientToken=readCreatedClientToken(parsed);if(clientToken===null){throw createSessionsCreateError("server_error","Checktiv sessions.create response carried no client token. Enable the working-token capability for this environment, then retry.")}return {clientToken}}};
11
+ var HOST_TAG="checktiv-root";var MOUNTED_FLAG="__checktivMounted";var LEGACY_HOST_ATTR="data-autohost-kyc-host";var HOST_ATTR="data-checktiv-host";var shadowCache=new WeakMap;function mountShadowHost(target){const existing=findExistingHost(target);if(existing){const cached=shadowCache.get(existing);if(cached)return cached}const host=document.createElement("div");host.setAttribute(HOST_ATTR,HOST_TAG);host.setAttribute(LEGACY_HOST_ATTR,HOST_TAG);host[MOUNTED_FLAG]=true;target.appendChild(host);const shadow=host.attachShadow({mode:"closed"});shadowCache.set(host,shadow);return shadow}function findExistingHost(target){for(const child of Array.from(target.children)){if(!(child instanceof HTMLElement))continue;const candidate=child;if(candidate[MOUNTED_FLAG]===true)return candidate}return null}function moduleErrorEvent(name,error){switch(name){case "idv":return {type:"checktiv.idv.error",error};case "fraud":return {type:"checktiv.fraud.error",error};case "custom_form":return {type:"checktiv.custom_form.error",error}}}function missingModuleMessage(name){return `This session requires the '${name}' module. Import '@checktiv/sdk-web/${name}' in your app.`}function missingModuleError(name){const base=createChecktivError("sdk_load_failed");return moduleErrorEvent(name,{...base,message:missingModuleMessage(name)})}function consentGateRequiredError(){const base=createChecktivError("sdk_load_failed");return moduleErrorEvent("fraud",{...base,message:"This session includes the 'fraud' module, which needs a consent gate. Pass onConsent to mountProvisioned() to enable it."})}function customFormConfigRequiredError(){const base=createChecktivError("sdk_load_failed");return moduleErrorEvent("custom_form",{...base,message:"This session includes the 'custom_form' module, which needs its form config. Pass customFormConfig to mountProvisioned() to enable it."})}function unmappedStepTypeError(stepType){const base=createChecktivError("sdk_load_failed");return moduleErrorEvent("idv",{...base,message:`This session's current step ('${stepType}') has no matching visual module in this SDK build. Upgrade '@checktiv/sdk-web' to a version that renders this step.`})}var MODULE_IS_VISUAL={idv:true,fraud:false,custom_form:true};var STEP_TYPE_TO_VISUAL_MODULE={id_verification:"idv",custom_form:"custom_form"};var stepTypeToVisualModuleView=STEP_TYPE_TO_VISUAL_MODULE;function resolveCurrentStepVisualModule(stepType){return stepTypeToVisualModuleView[stepType]}function defaultLoadModule(name){if(name==="idv"){const factory2=getModule("idv");if(factory2===void 0)return Promise.resolve(null);return Promise.resolve({mount:(ctx,opts)=>factory2(ctx,{target:opts.target,onEvent:opts.onEvent,copy:opts.copy,layout:opts.layout,maxWidth:opts.maxWidth,onBeforeSubmit:opts.onBeforeSubmit,onBehaviorSegment:opts.onBehaviorSegment,synthetic:opts.synthetic,crossDeviceCopy:opts.crossDeviceCopy,onOpenCrossDevice:opts.onOpenCrossDevice})})}if(name==="custom_form"){const factory2=getModule("custom_form");if(factory2===void 0)return Promise.resolve(null);return Promise.resolve({mount:(ctx,opts)=>{if(opts.customFormConfig===void 0){opts.onEvent?.(customFormConfigRequiredError());return {destroy:()=>void 0}}return factory2(ctx,{target:opts.target,config:opts.customFormConfig,copy:opts.customFormCopy,onEvent:opts.onEvent,session:opts.session})}})}const factory=getModule("fraud");if(factory===void 0)return Promise.resolve(null);return Promise.resolve({mount:(ctx,opts)=>{const onConsent=opts.onConsent;if(onConsent===void 0){opts.onEvent?.(consentGateRequiredError());return {destroy:()=>void 0}}return factory(ctx,{onConsent,onEvent:opts.onEvent})}})}function moduleErrorFor(name,code){return moduleErrorEvent(name,createChecktivError(code))}function createMountProvisioned(ctx,opts,deps={}){const emit=e=>opts.onEvent?.(e);const fetchImpl=opts.fetchImpl??fetch;const resolveSession2=deps.resolveSession??(()=>resolveSession(ctx,fetchImpl));const loadModule=deps.loadModule??defaultLoadModule;const handles=[];let destroyed=false;let idvOpenCrossDevice=null;void(async()=>{try{await composeModules();}catch(err){if(destroyed)return;console.warn("[Checktiv] mountProvisioned composition failed.",err);emit(moduleErrorFor("idv","sdk_load_failed"));}})();async function composeModules(){const resolution=await resolveSession2();if(destroyed)return;let session;switch(resolution.kind){case "ok":session=resolution.session;break;case "wrong_token":warnWrongTokenPlane();emit(moduleErrorFor("idv","wrong_token_type"));return;case "unresolved":emit(moduleErrorFor("idv","session_expired"));return;case "nothing_to_render":emit({type:"checktiv.idv.processing",reason:"no_renderable_step"});return;default:return assertNever(resolution)}const currentStepVisualModule=resolveCurrentStepVisualModule(session.stepType);if(currentStepVisualModule===void 0&&session.modules.some(m=>MODULE_IS_VISUAL[m])){emit(unmappedStepTypeError(session.stepType));return}for(const name of session.modules){if(destroyed)return;if(MODULE_IS_VISUAL[name]&&name!==currentStepVisualModule){continue}if(name==="fraud"&&opts.onConsent===void 0){emit(consentGateRequiredError());continue}const mod=await loadModule(name);if(destroyed)return;if(mod===null){emit(missingModuleError(name));continue}let moduleTarget;let containerToRemove=null;if(MODULE_IS_VISUAL[name]){const resolvedParent=typeof opts.target==="string"?typeof document!=="undefined"?document.querySelector(opts.target):null:opts.target;if(resolvedParent!==null){const container=document.createElement("div");resolvedParent.appendChild(container);containerToRemove=container;moduleTarget=container;}else {moduleTarget=opts.target;}}else {moduleTarget=opts.target;}let innerHandle;try{innerHandle=mod.mount(ctx,{target:moduleTarget,onEvent:opts.onEvent,onConsent:opts.onConsent,copy:opts.copy,layout:opts.layout,maxWidth:opts.maxWidth,onBeforeSubmit:opts.onBeforeSubmit,onBehaviorSegment:opts.onBehaviorSegment,synthetic:opts.synthetic,crossDeviceCopy:opts.crossDeviceCopy,onOpenCrossDevice:opts.onOpenCrossDevice,customFormConfig:opts.customFormConfig,customFormCopy:opts.customFormCopy,session:{sessionId:session.sessionId,stepId:session.stepId}});}catch(err){containerToRemove?.remove();throw err}if(name==="idv"){idvOpenCrossDevice=innerHandle.openCrossDevice??null;}const capturedContainer=containerToRemove;const handle={destroy(){try{innerHandle.destroy();}finally{capturedContainer?.remove();}}};if(destroyed){handle.destroy();return}handles.push(handle);}}return {destroy(){destroyed=true;while(handles.length>0){const handle=handles.pop();handle?.destroy();}},openCrossDevice(){idvOpenCrossDevice?.();}}}function init(opts,deps={}){const scope="publishableKey"in opts?{...parsePublishableKey(opts.publishableKey),publishableKey:opts.publishableKey}:{region:opts.region,mode:opts.mode,publishableKey:void 0};let sessionId="";const apiBaseOrigin=resolveApiBaseOrigin(opts.apiBase,scope.region,scope.mode);const ctx={region:scope.region,mode:scope.mode,publishableKey:scope.publishableKey,apiBaseOrigin,theme:opts.theme,locale:opts.locale??"en",betas:opts.betas??[],...opts.selfiePromptMap!==void 0?{selfiePromptMap:opts.selfiePromptMap}:{},...opts.selfieChromeCopy!==void 0?{selfieChromeCopy:opts.selfieChromeCopy}:{},tokens:deps.tokens??createTokenManager(opts.getSessionToken,()=>sessionId),getSessionId:()=>sessionId,setSessionId:id=>{sessionId=id;}};function mount2(...args){if(args[0]==="idv"){const factory2=getModule("idv");if(factory2===void 0)return missingIdvHandle(args[1]);return factory2(ctx,args[1])}if(args[0]==="custom_form"){const factory2=getModule("custom_form");if(factory2===void 0)return missingCustomFormHandle(args[1]);return factory2(ctx,args[1])}const factory=getModule("fraud");if(factory===void 0)return missingFraudHandle(args[1]);return factory(ctx,args[1])}return {mountProvisioned:provOpts=>createMountProvisioned(ctx,provOpts),mount:mount2}}function missingIdvHandle(opts){const base=createChecktivError("sdk_load_failed");opts.onEvent?.({type:"checktiv.idv.error",error:{...base,message:missingModuleMessage("idv")}});return {destroy:()=>void 0,unmount:()=>void 0}}function missingFraudHandle(opts){const base=createChecktivError("sdk_load_failed");opts.onEvent?.({type:"checktiv.fraud.error",error:{...base,message:missingModuleMessage("fraud")}});return {destroy:()=>void 0}}function missingCustomFormHandle(opts){const base=createChecktivError("sdk_load_failed");const error={type:"checktiv.custom_form.error",error:{...base,message:missingModuleMessage("custom_form")}};opts.onEvent?.(error);return {destroy:()=>void 0}}var RESUME_CLIENT_TOKEN_KEY_PREFIX="checktiv.rct.";function safeLocalStorage(){try{return globalThis.localStorage??null}catch{return null}}function createClientTokenStore(resumeKey,storage=safeLocalStorage()){const key=RESUME_CLIENT_TOKEN_KEY_PREFIX+resumeKey;return {read(){if(storage===null)return null;try{const raw=storage.getItem(key);return raw!==null&&raw.length>0?raw:null}catch{return null}},write(token){if(storage===null)return;try{storage.setItem(key,token);}catch{}},clear(){if(storage===null)return;try{storage.removeItem(key);}catch{}}}}var SESSIONS_CREATE_ERROR_CODES=["unauthorized","invalid_template","rate_limited","network","server_error"];function createSessionsCreateError(code,message){return {code,message}}function mapHttpStatusToSessionsCreateError(status){if(status===401||status===403)return "unauthorized";if(status===429)return "rate_limited";if(status===400||status===404||status===422)return "invalid_template";return "server_error"}function isSessionsCreateErrorCode(value){return SESSIONS_CREATE_ERROR_CODES.some(code=>code===value)}function isSessionsCreateError(value){if(typeof value!=="object"||value===null)return false;if(!("code"in value)||!("message"in value))return false;const{code,message}=value;return typeof code==="string"&&isSessionsCreateErrorCode(code)&&typeof message==="string"}async function requestSelfServiceResend(params){const fetchImpl=params.fetchImpl??fetch;const body=JSON.stringify({confirmEmail:params.confirmEmail});try{let res;if(params.mode==="short_code"){res=await fetchImpl(params.origin+shortCodeRefreshPath(params.shortCode),{method:"POST",headers:{"content-type":"application/json"},body});}return {requested:res.ok}}catch{return {requested:false}}}var version="1.8.0";var initialised=new WeakSet;function resolveVerifyOrigin(parsed){return getServiceOrigin(sdkPublicSettings.apps.verify.subdomain,"prod",parsed.region,sdkPublicSettings)}function buildPopupUrl(parsed,opts){const origin=resolveVerifyOrigin(parsed);if(opts.applicantLinkToken){return `${origin}/start?lt=${encodeURIComponent(opts.applicantLinkToken)}`}return `${origin}/`}function launchPopup(url){const w=460;const h=760;const left=Math.max(0,Math.floor((window.screen.width-w)/2));const top=Math.max(0,Math.floor((window.screen.height-h)/2));const features=`popup=yes,width=${w},height=${h},left=${left},top=${top}`;const popup=window.open(url,"checktiv",features);if(!popup){window.location.href=url;return null}return popup}var COMPLETE_EVENT_TYPE="autohost.kyc.complete";function isCompletionMessage(data){if(typeof data!=="object"||data===null)return false;if(!("type"in data))return false;return data.type===COMPLETE_EVENT_TYPE}function listenForCompletion(expectedOrigin,onComplete){if(!onComplete)return;const handler=event=>{if(event.origin!==expectedOrigin)return;const data=event.data;if(!isCompletionMessage(data))return;onComplete(data);};window.addEventListener("message",handler);}function buildButton(onClick){const children="Start verification";return k("button",{type:"button",onClick,style:'display: inline-flex; align-items: center; justify-content: center; padding: 10px 20px; font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif; font-size: 14px; font-weight: 600; color: #fff; background: #0b5fff; border: none; border-radius: 6px; cursor: pointer;'},children)}function resolveTarget(opts){if(opts.target)return opts.target;return document.querySelector("[data-checktiv]")??document.querySelector("[data-autohost-kyc]")}function mountButton(opts){const parsed=parsePublishableKey(opts.publishableKey);const target=resolveTarget(opts);if(!target){console.warn("[Checktiv] No mount target found. Either pass `target` explicitly or add `<div data-checktiv>` to your page.");return}if(initialised.has(target))return;initialised.add(target);const shadow=mountShadowHost(target);const verifyOrigin=resolveVerifyOrigin(parsed);listenForCompletion(verifyOrigin,opts.onComplete);const onClick=()=>{const popupUrl=buildPopupUrl(parsed,opts);launchPopup(popupUrl);};R(buildButton(onClick),shadow);}function completionSessionId(e){if(e.type!=="checktiv.idv.submitted"&&e.type!=="checktiv.custom_form.submitted"){return null}const sid="sessionId"in e?e.sessionId:void 0;return typeof sid==="string"&&sid.length>0?sid:null}function isSessionExpiredEvent(e){if(!e.type.endsWith(".error")||!("error"in e))return false;const err=e.error;if(typeof err!=="object"||err===null||!("code"in err))return false;return err.code==="session_expired"}function checktivErrorFromEvent(e){if(!e.type.endsWith(".error")||!("error"in e))return null;const err=e.error;return isChecktivError(err)?err:null}function mount(target,opts){const fetchImpl=opts.fetchImpl??fetch;const scope="publishableKey"in opts?{...parsePublishableKey(opts.publishableKey),publishableKey:opts.publishableKey}:{region:opts.region,mode:opts.mode,publishableKey:void 0};const mintOrigin=resolveApiBaseOrigin(opts.apiBase,scope.region,scope.mode);const store=opts.resumeKey!==void 0?createClientTokenStore(opts.resumeKey):null;let clientTokenPromise=null;const getClientToken=()=>{if(clientTokenPromise!==null)return clientTokenPromise;const persisted=store?.read()??null;if(persisted!==null){clientTokenPromise=Promise.resolve(persisted);return clientTokenPromise}const p=opts.fetchToken();clientTokenPromise=p;void p.then(tok=>store?.write(tok),()=>{if(clientTokenPromise===p)clientTokenPromise=null;});return p};const mintWorkingToken=createWorkingTokenSource(mintOrigin,getClientToken,scope.publishableKey,fetchImpl);const tokens=createWorkingTokenManager(mintWorkingToken);const base={getSessionToken:()=>tokens.get(),...opts.apiBase!==void 0?{apiBase:opts.apiBase}:{},...opts.theme!==void 0?{theme:opts.theme}:{}};const initOptions=scope.publishableKey!==void 0?{...base,publishableKey:scope.publishableKey}:{...base,region:scope.region,mode:scope.mode};const needsChannel=opts.onEvent!==void 0||opts.onError!==void 0||opts.onComplete!==void 0||store!==null;const safeCall=fn=>{try{fn();}catch{}};const onEvent=needsChannel?e=>{safeCall(()=>opts.onEvent?.(e));const error=checktivErrorFromEvent(e);if(error!==null)safeCall(()=>opts.onError?.(error));const sessionId=completionSessionId(e);if(sessionId!==null){store?.clear();safeCall(()=>opts.onComplete?.({sessionId}));}else if(isSessionExpiredEvent(e)){store?.clear();}}:void 0;const client=init(initOptions,{tokens});const handle=client.mountProvisioned({target,fetchImpl,onEvent,onConsent:opts.onConsent,...opts.layout!==void 0?{layout:opts.layout}:{},...opts.maxWidth!==void 0?{maxWidth:opts.maxWidth}:{},...opts.copy!==void 0?{copy:opts.copy}:{},...opts.crossDeviceCopy!==void 0?{crossDeviceCopy:opts.crossDeviceCopy}:{},...opts.onOpenCrossDevice!==void 0?{onOpenCrossDevice:opts.onOpenCrossDevice}:{}});const requestResend=confirmEmail=>{if(opts.shortCode===void 0)return Promise.resolve({requested:false});return requestSelfServiceResend({mode:"short_code",origin:mintOrigin,shortCode:opts.shortCode,confirmEmail,fetchImpl})};return {destroy(){handle.destroy();tokens.stop();},openCrossDevice:()=>handle.openCrossDevice?.(),requestResend}}function addressToWire(a){const wire={line1:a.line1,city:a.city,country:a.country};if(a.line2!==void 0)wire.line2=a.line2;if(a.region!==void 0)wire.region=a.region;if(a.postalCode!==void 0)wire.postal_code=a.postalCode;if(a.placeId!==void 0)wire.place_id=a.placeId;if(a.formatted!==void 0)wire.formatted=a.formatted;return wire}function applicantToWire(a){return {external_id:a.externalId,email:a.email,phone:a.phone,family_name:a.familyName,given_names:a.givenNames===void 0?void 0:[...a.givenNames],name_suffix:a.nameSuffix,date_of_birth:a.dateOfBirth,address:a.address===void 0?void 0:addressToWire(a.address),reference_name:a.referenceName}}function readCreatedClientToken(body){if(typeof body!=="object"||body===null||!("data"in body))return null;const data=body.data;if(typeof data!=="object"||data===null||!("client_token"in data))return null;const clientToken=data.client_token;return typeof clientToken==="string"&&clientToken.length>0?clientToken:null}var SESSIONS_CREATE_STATUS_HINT={unauthorized:"Verify your secret key (ah_sk_*) and that it matches the apiBase region.",invalid_template:"Verify the templateId (wt_*) and the request body.",rate_limited:"You have hit the rate ceiling. Retry after a short backoff.",network:"Check the apiBase origin and your network connectivity.",server_error:"This looks like a transient server error. Retry after a short backoff."};function sessionsCreateStatusHint(code){return SESSIONS_CREATE_STATUS_HINT[code]}var sessions={async create(input,options){if(typeof window!=="undefined"||typeof document!=="undefined"){throw new Error("checktiv.sessions.create must run on your server: it needs your secret key. Never call it in the browser.")}const fetchImpl=options.fetchImpl??fetch;const headers={Authorization:`Bearer ${options.secretKey}`,"content-type":"application/json"};if(options.idempotencyKey!==void 0)headers["Idempotency-Key"]=options.idempotencyKey;const body=JSON.stringify({workflow_template_id:input.templateId,applicant:applicantToWire(input.applicant)});let res;try{res=await fetchImpl(`${options.apiBase}/v1/sessions`,{method:"POST",headers,body});}catch{throw createSessionsCreateError("network","Checktiv sessions.create could not reach the API. Check the apiBase origin and your network connectivity.")}if(!res.ok){const code=mapHttpStatusToSessionsCreateError(res.status);throw createSessionsCreateError(code,`Checktiv sessions.create failed (status ${res.status}). ${sessionsCreateStatusHint(code)}`)}let parsed;try{parsed=await res.json();}catch{throw createSessionsCreateError("network","Checktiv sessions.create returned a non-JSON response.")}const clientToken=readCreatedClientToken(parsed);if(clientToken===null){throw createSessionsCreateError("server_error","Checktiv sessions.create response carried no client token. Enable the working-token capability for this environment, then retry.")}return {clientToken}}};
12
12
 
13
13
  export { init, isSessionsCreateError, mount, mountButton, sessions, version };
@@ -0,0 +1,9 @@
1
+ import { parsePublishableKey, createWorkingTokenSource, createWorkingTokenManager } from './chunk-WC6TLR42.js';
2
+ import { resolveSession, warnWrongTokenPlane } from './chunk-523TT3PD.js';
3
+ import { assertNever } from './chunk-UBQTPS5J.js';
4
+ import { withTokenRetry } from './chunk-S2OOEDJS.js';
5
+ import { stepSubmitPath, dataPlaneHeaders, resolveApiBaseOrigin } from './chunk-HFQJYEGZ.js';
6
+
7
+ var NAME_COMPONENTS_REQUIRED_ERROR_CODE="name_components_required";var ERROR_MESSAGES={not_collect_step:"The current step does not collect user info. Mount the verification journey to continue.",validation_failed:"The submitted information was rejected. Check the required fields and try again.",[NAME_COMPONENTS_REQUIRED_ERROR_CODE]:"This verification needs the name in separate parts. Enter the family name and the given names, then try again.",token_expired:"The verification session expired. Create a new session so fetchToken returns a fresh client token, then try again.",origin_not_allowed:"This origin is not allowed for the publishable key. Add it to the allowed origins list in the Checktiv console.",rate_limited:"Too many requests. Wait a moment and try again.",service_unavailable:"The service is temporarily unavailable. Try again in a few seconds.",session_expired:"The verification session is no longer valid. Start a new verification from your backend.",wrong_token_type:"This verification could not start. Make sure fetchToken returns the client token, the same one you pass to Checktiv.mount().",network_error:"The request could not be completed. Check the connection and try again."};function fail(code){return {ok:false,code,message:ERROR_MESSAGES[code]}}function mapSubmitStatus(status){if(status===400||status===422)return "validation_failed";if(status===401)return "token_expired";if(status===403)return "origin_not_allowed";if(status===404)return "session_expired";if(status===429)return "rate_limited";if(status>=500)return "service_unavailable";return "session_expired"}async function mapSubmitFailure(res){const fallback=mapSubmitStatus(res.status);if(res.status!==400&&res.status!==422)return fallback;let body;try{body=await res.json();}catch{return fallback}if(typeof body!=="object"||body===null)return fallback;const error=body.error;if(typeof error!=="object"||error===null)return fallback;const code=error.code;return code===NAME_COMPONENTS_REQUIRED_ERROR_CODE?NAME_COMPONENTS_REQUIRED_ERROR_CODE:fallback}var WIRE_KEYS=["legalName","familyName","givenNames","nameSuffix","email","phone","dateOfBirth","address"];function buildSubmitBody(input){const body={};for(const key of WIRE_KEYS){const value=input[key];if(value!==void 0)body[key]=value;}return body}function buildContext(session,fetchImpl){const scope="publishableKey"in session?{...parsePublishableKey(session.publishableKey),publishableKey:session.publishableKey}:{region:session.region,mode:session.mode,publishableKey:void 0};const apiBaseOrigin=resolveApiBaseOrigin(session.apiBase,scope.region,scope.mode);let clientTokenPromise=null;const getClientToken=()=>{if(clientTokenPromise!==null)return clientTokenPromise;const p=session.fetchToken();clientTokenPromise=p;void p.catch(()=>{if(clientTokenPromise===p)clientTokenPromise=null;});return p};const mintWorkingToken=createWorkingTokenSource(apiBaseOrigin,getClientToken,scope.publishableKey,fetchImpl);const tokens=createWorkingTokenManager(mintWorkingToken);let sessionId="";const ctx={region:scope.region,mode:scope.mode,publishableKey:scope.publishableKey,apiBaseOrigin,locale:"en",betas:[],tokens,getSessionId:()=>sessionId,setSessionId:id=>{sessionId=id;}};return {ctx,tokens}}function collectUserInfo(opts){const{session}=opts;const fetchImpl=session.fetchImpl??fetch;const{ctx,tokens}=buildContext(session,fetchImpl);return {async submit(input){try{const resolution=await resolveSession(ctx,fetchImpl);switch(resolution.kind){case "wrong_token":warnWrongTokenPlane();return fail("wrong_token_type");case "unresolved":return fail("session_expired");case "nothing_to_render":return fail("not_collect_step");case "ok":break;default:return assertNever(resolution)}const resolved=resolution.session;if(resolved.stepType!=="collect_user_info"){return fail("not_collect_step")}const body=buildSubmitBody(input);let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+stepSubmitPath(resolved.sessionId,resolved.stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(body)}),result=>result?.status===401);}catch{return fail("network_error")}if(res.ok)return {ok:true};return fail(await mapSubmitFailure(res))}finally{tokens.stop();}},async describe(){const fresh=buildContext(session,fetchImpl);try{const resolution=await resolveSession(fresh.ctx,fetchImpl);switch(resolution.kind){case "wrong_token":warnWrongTokenPlane();return {ok:false,code:"wrong_token_type"};case "unresolved":return {ok:false,code:"session_expired"};case "nothing_to_render":return {ok:false,code:"not_collect_step"};case "ok":break;default:return assertNever(resolution)}const resolved=resolution.session;if(resolved.stepType!=="collect_user_info"){return {ok:false,code:"not_collect_step"}}const config=resolved.collectUserInfoConfig;if(config===void 0){return {ok:true,fields:[],nameComponents:"requested",captureStructuredName:false}}return {ok:true,fields:config.fields,nameComponents:config.nameComponents,captureStructuredName:config.captureStructuredName}}finally{fresh.tokens.stop();}}}}
8
+
9
+ export { collectUserInfo };
@@ -1,6 +1,6 @@
1
1
  import { u } from './chunk-HV2QKVJX.js';
2
2
  import { R, k } from './chunk-XOGHMNBX.js';
3
- import { createCaptureController, isBiometricPhase, coachingKindForState } from './chunk-OTBL3KBS.js';
3
+ import { createCaptureController, isBiometricPhase, coachingKindForState } from './chunk-AW7QM2QH.js';
4
4
 
5
5
  function coachingFallback(kind){switch(kind){case "move_closer":return "Move a little closer.";case "move_farther":return "Move a little farther away.";case "reduce_glare":return "Reduce glare: tilt away from bright light.";case "too_dark":return "Find a brighter, well-lit spot.";case "wrong_side":return "Show the other side of your document.";case "hold_steady":return "Hold steady and keep everything in frame."}}function statusFallback(phase){switch(phase){case "ready":return "Getting the camera ready.";case "document_front":return "Position the front of your document in the frame.";case "document_back":return "Now show the back of your document.";case "selfie":return "Center your face in the frame.";case "liveness":return "Follow the on-screen prompts to confirm it is you.";case "uploading":return "Uploading. This takes a few seconds.";case "coaching":return "Hold steady and keep everything in frame."}}function errorFallback(kind){switch(kind){case "cv_gate_failed":return "We could not read that capture. Please try again in good lighting.";case "upload_failed":return "The upload did not finish. Check your connection and try again.";case "sdk_load_failed":return "The capture tools could not load. Refresh, or continue on your phone.";case "biometric_unsupported":return "This device cannot run the selfie check. Please continue on your phone.";case "camera_unsupported":return "Your camera does not meet the minimum resolution for capture. Please continue on your phone.";case "selfie_camera_denied":return "Camera access was blocked. Allow the camera, or continue on your phone.";case "liveness_camera_denied":return "Camera access was blocked. Allow the camera, or continue on your phone.";case "liveness_timeout":return "The check timed out. Please try again.";case "liveness_server_error":return "Something went wrong on our side. Please try again.";case "liveness_runtime_error":return "The check could not run. Refresh and try again.";case "liveness_cancelled":return "The check was canceled. Please try again when you are ready.";case "protocol_mismatch":return "This version of the verification tool is no longer supported. Please contact the operator to continue.";default:{const _exhaustive=kind;return _exhaustive}}}function terminalFallback(kind){switch(kind){case "mint_error":return "We could not start verification. Please try again.";case "submit_error":return "We could not submit your capture. Please try again.";case "token_expired":return "This step expired for your security. Please refresh to start again.";case "capture_superseded":return "Verification is active on another device. Finish there, or select Try again to continue here.";default:{const _exhaustive=kind;return _exhaustive}}}var fallbackCopy={cvReject:(_attemptIndex,kind)=>`We could not use that photo. ${coachingFallback(kind)}`,error:errorFallback,status:statusFallback,coaching:coachingFallback,terminal:terminalFallback,tryAgain:()=>"Try again",frameTitle:()=>"Identity verification capture"};var CSS_LENGTH_PATTERN=/^\d+(?:\.\d+)?(?:px|rem|em|vw|vh|%|ch)$/;function isValidCssLength(value){return CSS_LENGTH_PATTERN.test(value)}function maxWidthStyle(maxWidth){if(maxWidth===void 0||!isValidCssLength(maxWidth))return void 0;return `--idv-capture-max-width: ${maxWidth};`}var IFRAME_SANDBOX="allow-scripts allow-same-origin";function phaseOf(state){if(state.kind==="capturing")return state.phase;return "ready"}function statusLine(state,copy){if(state.kind==="capturing"&&state.phase==="coaching"&&state.coaching!==null){return (copy.coaching??fallbackCopy.coaching)(state.coaching)}return (copy.status??fallbackCopy.status)(phaseOf(state))}function CvRejectAlert({reason,attemptIndex,copy}){const kind=coachingKindForState(reason);const text=(copy.cvReject??fallbackCopy.cvReject)(attemptIndex,kind);return u("div",{role:"status","data-testid":"idv-cv-reject-alert",className:"idv-capture-cv-reject",style:"margin-bottom: 0.75rem;",children:text})}function CaptureFrame(props){const{colorMode="light",maxWidth}=props;const style=maxWidthStyle(maxWidth);return u("div",{className:"idv-capture-root","data-color-mode":colorMode,style,children:renderCaptureArm(props)})}function renderCaptureArm({state,attemptIndex,getEmbedSrc,onTryAgain,copy,layout="inline",immersiveActive=false,colorMode="light"}){switch(state.kind){case "minting":return u("div",{children:[u("div",{"data-testid":"idv-capture-skeleton","data-color-mode":colorMode,className:"idv-capture-skeleton idv-capture-skeleton--document idv-capture-skeleton--standalone","aria-hidden":"true"}),u("p",{className:"idv-capture-status","aria-live":"polite",children:(copy.status??fallbackCopy.status)("ready")})]});case "mint_error":case "submit_error":case "token_expired":case "capture_superseded":return u("div",{className:"idv-capture-error",role:"alert",children:[u("p",{children:(copy.terminal??fallbackCopy.terminal)(state.kind)}),u("button",{type:"button",onClick:onTryAgain,className:"idv-capture-retry",children:copy.tryAgain??fallbackCopy.tryAgain()})]});case "capture_error":{const errorKind=state.errorKind;const terminal=errorKind==="protocol_mismatch";return u("div",{className:"idv-capture-error",role:"alert",children:[u("p",{children:(copy.error??fallbackCopy.error)(errorKind)}),!terminal&&u("button",{type:"button",onClick:onTryAgain,className:"idv-capture-retry",children:copy.tryAgain??fallbackCopy.tryAgain()})]})}case "submitting":case "submit_pending":return u("p",{className:"idv-capture-status",children:(copy.status??fallbackCopy.status)("uploading")});case "waiting_for_init":case "ready":case "capturing":{const phase=phaseOf(state);const biometric=isBiometricPhase(phase);const frameClass=biometric?"idv-capture-frame idv-capture-frame--biometric":"idv-capture-frame";const reason=state.kind==="capturing"?state.lastCvRejectReason:null;const biometricLoading=biometric&&state.kind==="capturing"&&state.biometricLoading;const initialLoading=state.kind==="waiting_for_init";const showSkeleton=biometricLoading||initialLoading;const skeletonClass=initialLoading?"idv-capture-skeleton idv-capture-skeleton--document":"idv-capture-skeleton";const embedSrc=getEmbedSrc(state.embedOrigin);const immersive=layout==="immersive";const wrapperClass=immersive?"idv-capture-active idv-capture-immersive":"idv-capture-active";const frameTitle=copy.frameTitle??fallbackCopy.frameTitle();let iframeEl=null;const focusFrame=()=>iframeEl?.focus();return u("div",{className:wrapperClass,"data-color-mode":colorMode,role:immersiveActive?"dialog":void 0,"aria-modal":immersiveActive?"true":void 0,"aria-label":immersiveActive?frameTitle:void 0,children:[reason!==null&&u(CvRejectAlert,{reason,attemptIndex,copy}),showSkeleton&&u("div",{"data-testid":"idv-capture-skeleton","data-color-mode":colorMode,className:skeletonClass,"aria-hidden":"true"}),immersiveActive&&u("div",{className:"idv-capture-sentinel",tabIndex:0,onFocus:focusFrame}),u("iframe",{ref:el=>{iframeEl=el;},className:frameClass,title:frameTitle,src:embedSrc,allow:"camera",sandbox:IFRAME_SANDBOX}),immersiveActive&&u("div",{className:"idv-capture-sentinel",tabIndex:0,onFocus:focusFrame}),u("p",{className:"idv-capture-status","aria-live":"polite",children:statusLine(state,copy)})]})}default:{const _exhaustive=state;return _exhaustive}}}var IMMERSIVE_MEDIA="(pointer: coarse) and (max-width: 640px), (pointer: coarse) and (max-height: 640px)";function matchesImmersive(){return typeof window!=="undefined"&&typeof window.matchMedia==="function"&&window.matchMedia(IMMERSIVE_MEDIA).matches}function subscribeImmersive(cb){if(typeof window==="undefined"||typeof window.matchMedia!=="function"){return ()=>{}}const mql=window.matchMedia(IMMERSIVE_MEDIA);mql.addEventListener("change",cb);return ()=>{mql.removeEventListener("change",cb);}}function mount(element,options){const{copy,layout,maxWidth,onState,onControllerEvent,...deps}=options;const resolvedInitPayload=deps.initPayload();const controller=createCaptureController({...deps,initPayload:()=>resolvedInitPayload,getIframe:()=>element.querySelector("iframe.idv-capture-frame")});let destroyed=false;let state={kind:"minting"};let attemptIndex=0;const computeImmersiveActive=()=>layout==="immersive"&&matchesImmersive();let immersiveActive=computeImmersiveActive();let prevFocusable=false;let prevStateKind=state.kind;const IMMERSIVE_FILL_TOLERANCE_PX=2;let selfCheckRaf;let selfCheckWarned=false;const scheduleImmersiveSelfCheck=()=>{if(typeof requestAnimationFrame!=="function")return;if(selfCheckRaf!==void 0&&typeof cancelAnimationFrame==="function"){cancelAnimationFrame(selfCheckRaf);}selfCheckRaf=requestAnimationFrame(()=>{selfCheckRaf=void 0;if(destroyed||selfCheckWarned||typeof window==="undefined")return;const overlay=element.querySelector(".idv-capture-immersive");if(overlay===null)return;const rect=overlay.getBoundingClientRect();const vw=window.innerWidth;const vh=window.innerHeight;if(Math.abs(rect.width-vw)>IMMERSIVE_FILL_TOLERANCE_PX||Math.abs(rect.height-vh)>IMMERSIVE_FILL_TOLERANCE_PX){selfCheckWarned=true;console.warn("[Checktiv] immersive capture overlay does not fill the viewport",rect.width,rect.height,vw,vh);}});};const ERROR_ARM_KINDS={minting:false,mint_error:true,waiting_for_init:false,ready:false,capturing:false,submitting:false,submit_error:true,submit_pending:false,capture_superseded:true,token_expired:true,capture_error:true};const isErrorArm=kind=>ERROR_ARM_KINDS[kind];const onTryAgain=()=>{if(typeof window!=="undefined")window.location.reload();};const paint=()=>{if(destroyed)return;R(k(CaptureFrame,{state,attemptIndex,getEmbedSrc:deps.getEmbedSrc,onTryAgain,copy,layout,maxWidth,immersiveActive,colorMode:resolvedInitPayload.theme.colorMode}),element);const iframeEl=element.querySelector("iframe.idv-capture-frame");const iframePresent=iframeEl!==null;const focusable=immersiveActive&&iframePresent;if(focusable&&!prevFocusable&&!destroyed){iframeEl?.focus();scheduleImmersiveSelfCheck();}if(isErrorArm(state.kind)&&state.kind!==prevStateKind){element.querySelector(".idv-capture-retry")?.focus();}prevFocusable=focusable;prevStateKind=state.kind;};const rerender=()=>{if(destroyed)return;immersiveActive=computeImmersiveActive();paint();};const unsubImmersive=layout==="immersive"?subscribeImmersive(rerender):void 0;const safeObserve=(fn,arg)=>{if(fn===void 0)return;try{fn(arg);}catch(err){console.warn("[Checktiv] capture observer threw; ignoring (observational only).",err);}};const unsubState=controller.subscribe(next=>{state=next;paint();safeObserve(onState,next);});const offReject=controller.on("selfie-cv-reject",event=>{if(event.type==="selfie-cv-reject"){attemptIndex=event.attemptIndex;paint();}safeObserve(onControllerEvent,event);});const offComplete=controller.on("all-complete",event=>{safeObserve(onControllerEvent,event);});controller.start();return {destroy(){if(destroyed)return;destroyed=true;unsubState();offReject();offComplete();if(unsubImmersive!==void 0)unsubImmersive();if(selfCheckRaf!==void 0&&typeof cancelAnimationFrame==="function"){cancelAnimationFrame(selfCheckRaf);}R(null,element);controller.destroy();}}}
6
6
 
@@ -0,0 +1,3 @@
1
+ var CHECKTIV_RECOVERY_STRATEGIES=["retry","cross_device","refresh_session","contact_operator"];var ERROR_TABLE={origin_not_allowed:{recoverable:false,recovery:"contact_operator",message:"This origin is not allowed for the publishable key. Add it to the allowed origins list in the Checktiv console."},token_expired:{recoverable:true,recovery:"retry",message:"The session token expired. The SDK is refreshing it; if this persists, mint a new token from your backend."},session_expired:{recoverable:false,recovery:"refresh_session",message:"The verification session is no longer valid. Start a new verification from your backend."},wrong_token_type:{recoverable:false,recovery:"contact_operator",message:"This verification could not start. Contact the site operator."},protocol_mismatch:{recoverable:false,recovery:"contact_operator",message:"The SDK version is out of date. Update to the latest published version."},camera_denied:{recoverable:true,recovery:"cross_device",message:"Camera access was blocked. Allow camera access, or continue on another device."},camera_unsupported:{recoverable:true,recovery:"cross_device",message:"Your camera does not meet the minimum resolution needed for capture. Try another device, or continue on your phone."},cv_gate_failed:{recoverable:true,recovery:"retry",message:"We could not read the image clearly. Try again with better lighting and a steady hand."},upload_failed:{recoverable:true,recovery:"retry",message:"The upload did not complete. Check the connection and try again."},submit_failed:{recoverable:true,recovery:"retry",message:"The submission did not complete. Your captured images are saved. Check the connection and try again."},sdk_load_failed:{recoverable:true,recovery:"cross_device",message:"Verification could not start on this device. Try again, or continue on another device."},biometric_unsupported:{recoverable:false,recovery:"contact_operator",message:"This capture is not supported on this page. Contact the site operator."},isolation_required:{recoverable:false,recovery:"contact_operator",message:"This page configuration is not supported. Contact the site operator."}};var CHECKTIV_ERROR_CODES=Object.keys(ERROR_TABLE).filter(key=>key in ERROR_TABLE);function createChecktivError(code){const entry=ERROR_TABLE[code];return {code,...entry}}function mapHttpStatusToError(status){if(status===401)return "token_expired";if(status===403)return "origin_not_allowed";if(status===429)return "upload_failed";if(status>=500)return "upload_failed";return "session_expired"}function isChecktivErrorCode(value){return CHECKTIV_ERROR_CODES.some(code=>code===value)}function isChecktivRecovery(value){return CHECKTIV_RECOVERY_STRATEGIES.some(recovery=>recovery===value)}function isChecktivError(value){if(typeof value!=="object"||value===null)return false;if(!("code"in value)||!("message"in value)||!("recoverable"in value)||!("recovery"in value)){return false}const{code,message,recoverable,recovery}=value;return typeof code==="string"&&isChecktivErrorCode(code)&&typeof message==="string"&&typeof recoverable==="boolean"&&typeof recovery==="string"&&isChecktivRecovery(recovery)}
2
+
3
+ export { CHECKTIV_ERROR_CODES, createChecktivError, isChecktivError, mapHttpStatusToError };
@@ -1,16 +1,13 @@
1
- import { B as ChecktivInitScope } from './api-Cjh51lsw.js';
2
- import './machine-DZPN-A44.js';
3
- import './copy-CC_mrlVV.js';
1
+ import { H as ChecktivInitScope } from './api-DicBOi5f.js';
2
+ import './machine-Z0b9Q7zQ.js';
3
+ import './copy-DVW_qbbM.js';
4
4
  import './copy-DCeQ4JKx.js';
5
5
 
6
6
  declare const COLLECT_USER_INFO_FIELDS: readonly ["email", "phone", "dob", "address"];
7
7
  type CollectUserInfoField = (typeof COLLECT_USER_INFO_FIELDS)[number];
8
8
 
9
- interface CollectUserInfoName {
10
- first: string;
11
- middle?: string;
12
- last: string;
13
- }
9
+ declare const NAME_COMPONENTS_REQUIRED_ERROR_CODE: "name_components_required";
10
+
14
11
  interface CollectUserInfoAddress {
15
12
  line1: string;
16
13
  line2?: string;
@@ -21,16 +18,26 @@ interface CollectUserInfoAddress {
21
18
  placeId?: string;
22
19
  formatted?: string;
23
20
  }
24
- interface CollectUserInfoSubmitInput {
25
- legalName: string;
21
+ interface CollectUserInfoSubmitFields {
22
+ legalName?: string;
23
+ familyName?: string;
24
+ givenNames?: string[];
25
+ nameSuffix?: string;
26
26
  email?: string;
27
27
  phone?: string;
28
28
  dateOfBirth?: string;
29
29
  address?: CollectUserInfoAddress;
30
- name?: CollectUserInfoName;
31
30
  }
31
+ type CollectUserInfoSubmitInput = CollectUserInfoSubmitFields & ({
32
+ familyName: string;
33
+ givenNames: string[];
34
+ } | {
35
+ legalName: string;
36
+ });
37
+ type CollectUserInfoNameComponents = 'required' | 'requested' | 'optional';
32
38
  interface CollectUserInfoConfig {
33
39
  fields: CollectUserInfoField[];
40
+ nameComponents: CollectUserInfoNameComponents;
34
41
  captureStructuredName: boolean;
35
42
  }
36
43
  type CollectUserInfoSession = ChecktivInitScope & {
@@ -41,7 +48,7 @@ type CollectUserInfoSession = ChecktivInitScope & {
41
48
  interface CollectUserInfoOptions {
42
49
  session: CollectUserInfoSession;
43
50
  }
44
- type CollectUserInfoSubmitErrorCode = 'not_collect_step' | 'validation_failed' | 'token_expired' | 'origin_not_allowed' | 'rate_limited' | 'service_unavailable' | 'session_expired' | 'wrong_token_type' | 'network_error';
51
+ type CollectUserInfoSubmitErrorCode = 'not_collect_step' | 'validation_failed' | typeof NAME_COMPONENTS_REQUIRED_ERROR_CODE | 'token_expired' | 'origin_not_allowed' | 'rate_limited' | 'service_unavailable' | 'session_expired' | 'wrong_token_type' | 'network_error';
45
52
  type CollectUserInfoSubmitResult = {
46
53
  ok: true;
47
54
  } | {
@@ -61,4 +68,4 @@ interface CollectUserInfoCollector {
61
68
  }
62
69
  declare function collectUserInfo(opts: CollectUserInfoOptions): CollectUserInfoCollector;
63
70
 
64
- export { type CollectUserInfoAddress, type CollectUserInfoCollector, type CollectUserInfoConfig, type CollectUserInfoConfigResult, type CollectUserInfoName, type CollectUserInfoOptions, type CollectUserInfoSession, type CollectUserInfoSubmitErrorCode, type CollectUserInfoSubmitInput, type CollectUserInfoSubmitResult, collectUserInfo };
71
+ export { type CollectUserInfoAddress, type CollectUserInfoCollector, type CollectUserInfoConfig, type CollectUserInfoConfigResult, type CollectUserInfoNameComponents, type CollectUserInfoOptions, type CollectUserInfoSession, type CollectUserInfoSubmitErrorCode, type CollectUserInfoSubmitFields, type CollectUserInfoSubmitInput, type CollectUserInfoSubmitResult, collectUserInfo };
@@ -1,6 +1,6 @@
1
- export { collectUserInfo } from './chunk-F2BDZRAX.js';
2
- import './chunk-EXC2ZRUH.js';
3
- import './chunk-DRNEDARS.js';
1
+ export { collectUserInfo } from './chunk-NC4B6XNS.js';
2
+ import './chunk-WC6TLR42.js';
3
+ import './chunk-523TT3PD.js';
4
4
  import './chunk-UBQTPS5J.js';
5
5
  import './chunk-S2OOEDJS.js';
6
6
  import './chunk-HFQJYEGZ.js';
@@ -1,4 +1,4 @@
1
- import { f as CaptureState, I as IdvR2Keys, g as CaptureInitMessage, a as CaptureBehaviorMessage } from './machine-DZPN-A44.js';
1
+ import { f as CaptureState, D as DataMode, T as TestHint, I as IdvR2Keys, g as CaptureInitMessage, h as CaptureInitStaticKey, a as CaptureBehaviorMessage } from './machine-Z0b9Q7zQ.js';
2
2
 
3
3
  type CaptureEvent = {
4
4
  type: 'selfie-cv-reject';
@@ -22,10 +22,12 @@ interface CaptureControllerDeps {
22
22
  captureToken: string;
23
23
  embedOrigin: string;
24
24
  runIndex: number;
25
+ mode?: DataMode;
26
+ testHint?: TestHint;
25
27
  }>;
26
28
  submit: (runIndex: number, r2Keys: IdvR2Keys) => Promise<SubmitResult>;
27
29
  getEmbedSrc: (embedOrigin: string) => string;
28
- initPayload: () => Omit<CaptureInitMessage, 'type' | 'captureToken'>;
30
+ initPayload: () => Pick<CaptureInitMessage, CaptureInitStaticKey>;
29
31
  onBehaviorSegment?: (segment: Pick<CaptureBehaviorMessage, 'steps' | 'traits'>) => void;
30
32
  onBeforeSubmit?: () => Promise<void>;
31
33
  onCoaching?: (rawState: string, attemptIndex: number) => void;
@@ -1,4 +1,4 @@
1
- import { b as CoachingKind, d as CaptureErrorKind, e as CapturePhase } from './machine-DZPN-A44.js';
1
+ import { b as CoachingKind, d as CaptureErrorKind, e as CapturePhase } from './machine-Z0b9Q7zQ.js';
2
2
 
3
3
  type TerminalKind = 'mint_error' | 'submit_error' | 'token_expired' | 'capture_superseded';
4
4
  interface MountCopy {
@@ -1,4 +1,4 @@
1
- export { J as ChecktivCustomFormEvent, K as CustomFormCopy, L as CustomFormFieldCopy, N as CustomFormHandle, O as CustomFormMountOptions, Q as createCustomForm } from './api-Cjh51lsw.js';
2
- import './machine-DZPN-A44.js';
3
- import './copy-CC_mrlVV.js';
1
+ export { N as ChecktivCustomFormEvent, O as CustomFormCopy, Q as CustomFormFieldCopy, U as CustomFormHandle, V as CustomFormMountOptions, W as createCustomForm } from './api-DicBOi5f.js';
2
+ import './machine-Z0b9Q7zQ.js';
3
+ import './copy-DVW_qbbM.js';
4
4
  import './copy-DCeQ4JKx.js';
@@ -1,6 +1,6 @@
1
1
  import { registerModule } from './chunk-GFHNOZVO.js';
2
- import { createChecktivError, mapHttpStatusToError } from './chunk-JS3Y6T76.js';
3
- import { warnWrongTokenPlane, isRecord, isJourneyPlaneBody } from './chunk-DRNEDARS.js';
2
+ import { createChecktivError, mapHttpStatusToError } from './chunk-S24BZWVR.js';
3
+ import { warnWrongTokenPlane, isRecord, isJourneyPlaneBody } from './chunk-523TT3PD.js';
4
4
  import { assertNever } from './chunk-UBQTPS5J.js';
5
5
  import { withTokenRetry } from './chunk-S2OOEDJS.js';
6
6
  import { SESSIONS_ME_PATH, dataPlaneHeaders, stepSubmitPath, formUploadUrlPath } from './chunk-HFQJYEGZ.js';
package/dist/fraud.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { f as ChecktivFraudEvent, F as FraudHandle, j as FraudMountOptions, U as createFraud } from './api-Cjh51lsw.js';
2
- import './machine-DZPN-A44.js';
3
- import './copy-CC_mrlVV.js';
1
+ export { g as ChecktivFraudEvent, F as FraudHandle, l as FraudMountOptions, X as createFraud } from './api-DicBOi5f.js';
2
+ import './machine-Z0b9Q7zQ.js';
3
+ import './copy-DVW_qbbM.js';
4
4
  import './copy-DCeQ4JKx.js';
package/dist/fraud.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { registerModule } from './chunk-GFHNOZVO.js';
2
- import { createChecktivError } from './chunk-JS3Y6T76.js';
3
- import { resolveSession, warnWrongTokenPlane } from './chunk-DRNEDARS.js';
2
+ import { createChecktivError } from './chunk-S24BZWVR.js';
3
+ import { resolveSession, warnWrongTokenPlane } from './chunk-523TT3PD.js';
4
4
  import { assertNever } from './chunk-UBQTPS5J.js';
5
5
  import { withTokenRetry } from './chunk-S2OOEDJS.js';
6
6
  import { TELEMETRY_PATH, dataPlaneHeaders } from './chunk-HFQJYEGZ.js';
@@ -1,8 +1,8 @@
1
- import { S as SdkCrossDeviceStatusResponse } from '../machine-DZPN-A44.js';
2
- import { D as SubstrateContext, i as CrossDeviceHandoffHook, g as ChecktivIdvEvent } from '../api-Cjh51lsw.js';
1
+ import { S as SdkCrossDeviceStatusResponse } from '../machine-Z0b9Q7zQ.js';
2
+ import { J as SubstrateContext, k as CrossDeviceHandoffHook, h as ChecktivIdvEvent } from '../api-DicBOi5f.js';
3
3
  import { C as CrossDeviceCopy } from '../copy-DCeQ4JKx.js';
4
4
  import { CrossDevicePanelProps, CrossDeviceHandle } from '../cross-device.js';
5
- import '../copy-CC_mrlVV.js';
5
+ import '../copy-DVW_qbbM.js';
6
6
 
7
7
  interface ManagedCrossDeviceParams {
8
8
  ctx: SubstrateContext;
@@ -1,5 +1,5 @@
1
- import { registerCrossDeviceOpener, createChecktivErrorEvent } from '../chunk-CSNKMUIP.js';
2
- import { createChecktivError } from '../chunk-JS3Y6T76.js';
1
+ import { registerCrossDeviceOpener, createChecktivErrorEvent } from '../chunk-CNHIOCUU.js';
2
+ import { createChecktivError } from '../chunk-S24BZWVR.js';
3
3
  import { withTokenRetry } from '../chunk-S2OOEDJS.js';
4
4
  import { SESSIONS_ME_PATH, dataPlaneHeaders, SESSIONS_CROSS_DEVICE_STATUS_PATH } from '../chunk-HFQJYEGZ.js';
5
5
  import '../chunk-QFA3K5ZV.js';
package/dist/idv.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import './machine-DZPN-A44.js';
2
- import './copy-CC_mrlVV.js';
3
- export { i as CrossDeviceHandoffHook, m as IdvHandle, n as IdvMountOptions, E as REMINT_READY_TIMEOUT_MS, H as createIdv } from './api-Cjh51lsw.js';
1
+ import './machine-Z0b9Q7zQ.js';
2
+ import './copy-DVW_qbbM.js';
3
+ export { k as CrossDeviceHandoffHook, o as IdvHandle, p as IdvMountOptions, K as REMINT_READY_TIMEOUT_MS, L as createIdv } from './api-DicBOi5f.js';
4
4
  import './copy-DCeQ4JKx.js';
package/dist/idv.js CHANGED
@@ -1,19 +1,19 @@
1
- import { createChecktivErrorEvent, mapStateToEvent, getCrossDeviceOpener } from './chunk-CSNKMUIP.js';
1
+ import { createChecktivErrorEvent, mapStateToEvent, getCrossDeviceOpener } from './chunk-CNHIOCUU.js';
2
2
  import { registerModule } from './chunk-GFHNOZVO.js';
3
- import { createChecktivError, mapHttpStatusToError } from './chunk-JS3Y6T76.js';
4
- import { resolveSession, warnWrongTokenPlane } from './chunk-DRNEDARS.js';
3
+ import { createChecktivError, mapHttpStatusToError } from './chunk-S24BZWVR.js';
4
+ import { resolveSession, warnWrongTokenPlane } from './chunk-523TT3PD.js';
5
5
  import { assertNever } from './chunk-UBQTPS5J.js';
6
6
  import { withTokenRetry } from './chunk-S2OOEDJS.js';
7
7
  import { stepSubmitPath, dataPlaneHeaders, CAPTURE_TOKEN_MINT_PATH, isCanonicalOrigin } from './chunk-HFQJYEGZ.js';
8
- import { mount } from './chunk-5BFT2P4R.js';
8
+ import { mount } from './chunk-OMR5UY5H.js';
9
9
  import './chunk-HV2QKVJX.js';
10
10
  import './chunk-XOGHMNBX.js';
11
- import { CURRENT_PROTOCOL_VERSION } from './chunk-OTBL3KBS.js';
11
+ import { CURRENT_PROTOCOL_VERSION } from './chunk-AW7QM2QH.js';
12
12
  import './chunk-NHNGQ5BB.js';
13
13
  import './chunk-IQKHRPJR.js';
14
14
  import './chunk-QFA3K5ZV.js';
15
15
  import './chunk-AIK7CDV6.js';
16
16
 
17
- var PLATFORM_BRAND_DEFAULT={primaryColor:"#2563eb",secondaryColor:"#ff5e4d",colorMode:"auto"};var SURFACE={light:{bg:"#fafaf7",surface1:"#ffffff"},dark:{bg:"#0b0c0f",surface1:"#15171c"}};var WHITE="#ffffff";var NEAR_BLACK="#0b0c0f";var ACCENT_TARGET=3;var ADAPT_STEP=.04;var ADAPT_MAX_ITERS=24;var HOVER_DELTA=.08;var SECONDARY_HUE_SHIFT=150;var HEX_RE=/^#[0-9a-fA-F]{6}$/;function toHex(r,g,b){const ch=v=>Math.max(0,Math.min(255,Math.round(v))).toString(16).padStart(2,"0");return `#${ch(r)}${ch(g)}${ch(b)}`}function parseHex(hex){if(typeof hex!=="string"||!HEX_RE.test(hex))return null;const n=Number.parseInt(hex.slice(1),16);return {r:n>>16&255,g:n>>8&255,b:n&255}}function linearize(channel){const s=channel/255;return s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4)}function relativeLuminance(rgb){return .2126*linearize(rgb.r)+.7152*linearize(rgb.g)+.0722*linearize(rgb.b)}function assessContrast(fg,bg){const f=parseHex(fg);const b=parseHex(bg);if(!f||!b)return 1;const l1=relativeLuminance(f);const l2=relativeLuminance(b);const hi=Math.max(l1,l2);const lo=Math.min(l1,l2);return (hi+.05)/(lo+.05)}function rgbToHsl({r,g,b}){const rn=r/255;const gn=g/255;const bn=b/255;const max=Math.max(rn,gn,bn);const min=Math.min(rn,gn,bn);const l=(max+min)/2;let h=0;let s=0;if(max!==min){const d=max-min;s=l>.5?d/(2-max-min):d/(max+min);switch(max){case rn:h=(gn-bn)/d+(gn<bn?6:0);break;case gn:h=(bn-rn)/d+2;break;default:h=(rn-gn)/d+4;break}h/=6;}return {h:h*360,s,l}}function hueToRgb(p,q,tRaw){let t=tRaw;if(t<0)t+=1;if(t>1)t-=1;if(t<1/6)return p+(q-p)*6*t;if(t<1/2)return q;if(t<2/3)return p+(q-p)*(2/3-t)*6;return p}function hslToRgb({h,s,l}){const hn=(h%360+360)%360/360;let r;let g;let b;if(s===0){r=g=b=l;}else {const q=l<.5?l*(1+s):l+s-l*s;const p=2*l-q;r=hueToRgb(p,q,hn+1/3);g=hueToRgb(p,q,hn);b=hueToRgb(p,q,hn-1/3);}return {r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)}}function deriveSecondaryHue(hex){const rgb=parseHex(hex);if(!rgb)return PLATFORM_BRAND_DEFAULT.secondaryColor;const hsl=rgbToHsl(rgb);const out=hslToRgb({...hsl,h:(hsl.h+SECONDARY_HUE_SHIFT)%360});return toHex(out.r,out.g,out.b)}function shiftLightness(hex,delta){const rgb=parseHex(hex);if(!rgb)return toHex(0,0,0);const hsl=rgbToHsl(rgb);const out=hslToRgb({...hsl,l:Math.max(0,Math.min(1,hsl.l+delta))});return toHex(out.r,out.g,out.b)}function onColorFor(bg){const white=assessContrast(WHITE,bg);const dark=assessContrast(NEAR_BLACK,bg);return white>=dark?WHITE:NEAR_BLACK}function adaptAccent(hex,surface,target,warnings,field,mode){const rgb=parseHex(hex);if(!rgb){return toHex(0,0,0)}const hsl=rgbToHsl(rgb);const lighten=relativeLuminance(parseHex(surface)??{r:255,g:255,b:255})<.5;const rawRatio=assessContrast(hex,surface);let l=hsl.l;let out=toHex(rgb.r,rgb.g,rgb.b);for(let i=0;i<ADAPT_MAX_ITERS;i+=1){if(assessContrast(out,surface)>=target)break;l=Math.max(0,Math.min(1,l+(lighten?ADAPT_STEP:-ADAPT_STEP)));const o=hslToRgb({h:hsl.h,s:hsl.s,l});out=toHex(o.r,o.g,o.b);}const finalRatio=assessContrast(out,surface);if(rawRatio<target||finalRatio<target){warnings.push({field,mode,ratio:Number(rawRatio.toFixed(2))});}return out}function deriveMode(input,mode,warnings){const surf=SURFACE[mode];const primary=adaptAccent(input.primaryColor,surf.bg,ACCENT_TARGET,warnings,"primary",mode);const rawSecondary=input.secondaryColor??deriveSecondaryHue(input.primaryColor);const secondary=adaptAccent(rawSecondary,surf.bg,ACCENT_TARGET,warnings,"secondary",mode);const primaryHover=shiftLightness(primary,mode==="light"?-HOVER_DELTA:HOVER_DELTA);const onPrimary=onColorFor(primary);const onSecondary=onColorFor(secondary);const ring=primary;return {primary,primaryHover,onPrimary,secondary,onSecondary,ring}}function toSafeBrandColors(input){if(!input||parseHex(input.primaryColor)===null){return {primaryColor:PLATFORM_BRAND_DEFAULT.primaryColor,secondaryColor:PLATFORM_BRAND_DEFAULT.secondaryColor,colorMode:PLATFORM_BRAND_DEFAULT.colorMode}}const secondaryColor=typeof input.secondaryColor==="string"&&parseHex(input.secondaryColor)!==null?input.secondaryColor:null;const colorMode="auto";return {primaryColor:input.primaryColor,secondaryColor,colorMode}}function deriveBrandTokens(input){const safe=toSafeBrandColors(input);const warnings=[];return {light:deriveMode(safe,"light",warnings),dark:deriveMode(safe,"dark",warnings),warnings}}function defaultPrefersDark(){if(typeof window==="undefined"||typeof window.matchMedia!=="function"){return false}try{return window.matchMedia("(prefers-color-scheme: dark)").matches}catch{return false}}function defaultForcedMode(){if(typeof document==="undefined")return null;const dataTheme=document.documentElement.dataset.theme;return dataTheme==="light"||dataTheme==="dark"?dataTheme:null}function brandColorsFrom(primaryColor){return {primaryColor,secondaryColor:PLATFORM_BRAND_DEFAULT.secondaryColor,colorMode:"auto"}}function resolveCaptureTheme(ctxTheme,opts={}){const prefersDark=opts.prefersDark??defaultPrefersDark;const forcedMode=opts.forcedMode??defaultForcedMode;const colorMode=forcedMode()??(prefersDark()?"dark":"light");const primaryColor=ctxTheme?.primaryColor;if(typeof primaryColor!=="string"||primaryColor.length===0){return {colorMode,brandTokens:null}}const brandTokens=deriveBrandTokens(brandColorsFrom(primaryColor))[colorMode];return {colorMode,brandTokens}}var LEASE_STORAGE_KEY_PREFIX="checktiv.idv.lease.";function isRecord(v){return typeof v==="object"&&v!==null}function storageKey(sessionId){return LEASE_STORAGE_KEY_PREFIX+sessionId}function safeLocalStorage(){try{return globalThis.localStorage??null}catch{return null}}function generateHolderDeviceId(){const c=globalThis.crypto;if(c&&typeof c.randomUUID==="function"){return c.randomUUID()}const bytes=new Uint8Array(16);c.getRandomValues(bytes);let hex="";for(const b of bytes)hex+=b.toString(16).padStart(2,"0");return hex}function loadPersistedLease(sessionId){const ls=safeLocalStorage();if(ls===null)return null;let raw;try{raw=ls.getItem(storageKey(sessionId));}catch{return null}if(raw===null)return null;let parsed;try{parsed=JSON.parse(raw);}catch{return null}if(!isRecord(parsed))return null;const{holderDeviceId,leaseGeneration}=parsed;if(typeof holderDeviceId!=="string"||holderDeviceId.length===0)return null;const gen=typeof leaseGeneration==="number"&&Number.isInteger(leaseGeneration)&&leaseGeneration>=0?leaseGeneration:void 0;return gen===void 0?{holderDeviceId}:{holderDeviceId,leaseGeneration:gen}}function persistLease(sessionId,record){const ls=safeLocalStorage();if(ls===null)return;try{ls.setItem(storageKey(sessionId),JSON.stringify(record));}catch{}}function loadOrCreatePersistedLease(sessionId){const persisted=loadPersistedLease(sessionId);if(persisted!==null)return persisted;const record={holderDeviceId:generateHolderDeviceId()};persistLease(sessionId,record);return record}var MAX_REMINTS=3;function isRecord2(v){return typeof v==="object"&&v!==null}function asMode(value){return value==="live"||value==="test"?value:null}function asTestHint(value){return value==="pass"||value==="review"||value==="fail"?value:null}function parseMintBody(body){if(!isRecord2(body)||!isRecord2(body.data))return null;const d=body.data;const captureToken=d.capture_token;const embedOrigin=d.embed_origin;const runIndex=d.run_index;const embedContextToken=d.embed_context_token;if(typeof captureToken!=="string"||captureToken.length===0)return null;if(!isCanonicalOrigin(embedOrigin))return null;if(typeof runIndex!=="number"||!Number.isInteger(runIndex)||runIndex<0)return null;if(typeof embedContextToken!=="string"||embedContextToken.length===0)return null;const mode=asMode(d.mode);const testHint=asTestHint(d.test_hint);return {captureToken,embedOrigin,runIndex,embedContextToken,...mode!==null?{mode}:{},...testHint!==null?{testHint}:{}}}function buildCaptureSubmitBody(input){return {runIndex:input.runIndex,r2Keys:input.r2Keys,holderDeviceId:input.holderDeviceId,...input.leaseGeneration!==void 0?{leaseGeneration:input.leaseGeneration}:{}}}function createIdvTransport(ctx,opts){const fetchImpl=opts.fetchImpl??fetch;const origin=ctx.apiBaseOrigin;let embedContextToken=null;let mintMode;let mintTestHint;let remintCount=0;const persistedLease=loadOrCreatePersistedLease(opts.sessionId);const holderDeviceId=persistedLease.holderDeviceId;const leaseGeneration=persistedLease.leaseGeneration;async function mintToken(){const res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+CAPTURE_TOKEN_MINT_PATH,{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({stepId:opts.stepId})}),result=>result?.status===401);if(!res.ok){throw createChecktivError(mapHttpStatusToError(res.status))}let body;try{body=await res.json();}catch{opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}const parsed=parseMintBody(body);if(parsed===null){opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}embedContextToken=parsed.embedContextToken;mintMode=parsed.mode;mintTestHint=parsed.testHint;return {captureToken:parsed.captureToken,embedOrigin:parsed.embedOrigin,runIndex:parsed.runIndex}}function getEmbedSrc(embedOrigin){if(embedContextToken===null){opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}return `${embedOrigin}/idv/capture?ctx=${encodeURIComponent(embedContextToken)}`}async function submit(runIndex,r2Keys){let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+stepSubmitPath(opts.sessionId,opts.stepId??""),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(buildCaptureSubmitBody({runIndex,r2Keys,holderDeviceId,leaseGeneration}))}),result=>result?.status===401);}catch{return {ok:false,reason:"failed"}}if(res.ok)return {ok:true};if(res.status===401)return {ok:false,reason:"token_expired"};if(res.status===409)return {ok:false,reason:"capture_superseded"};if(res.status===503&&res.headers.has("Retry-After")){return {ok:false,reason:"signal_pending"}}return {ok:false,reason:"failed"}}function initPayload(){return {config:opts.config(),locale:ctx.locale,theme:resolveCaptureTheme(ctx.theme),protocolVersion:CURRENT_PROTOCOL_VERSION,...mintMode!==void 0?{mode:mintMode}:{},...mintTestHint!==void 0?{testHint:mintTestHint}:{},...ctx.selfiePromptMap!==void 0?{selfiePromptMap:ctx.selfiePromptMap}:{},...ctx.selfieChromeCopy!==void 0?{selfieChromeCopy:ctx.selfieChromeCopy}:{}}}async function remint(){if(remintCount>=MAX_REMINTS){opts.onError?.(createChecktivErrorEvent("session_expired"));return null}remintCount+=1;try{return await mintToken()}catch{return null}}function failProtocolMismatch(){opts.onError?.(createChecktivErrorEvent("protocol_mismatch"));}return {mintToken,submit,getEmbedSrc,initPayload,remint,failProtocolMismatch}}function after(delayMs,fn){return setTimeout(fn,delayMs)}function createSyntheticIdv(opts,config,sessionId,script){const emit=e=>opts.onEvent?.(e);const delayMs=script?.stepDelayMs??0;const timers=[];let destroyed=false;function step(offsetMs,fn){timers.push(after(offsetMs,()=>{if(!destroyed)fn();}));}step(delayMs*0,()=>{emit({type:"checktiv.idv.ready",config});});if(script?.injectError!==void 0){const code=script.injectError;step(delayMs*1,()=>{emit(createChecktivErrorEvent(code));});}else {step(delayMs*1,()=>{emit({type:"checktiv.idv.phase",phase:"document_front"});});step(delayMs*2,()=>{emit({type:"checktiv.idv.submitted",sessionId});});}const destroy=()=>{if(destroyed)return;destroyed=true;for(const id of timers)clearTimeout(id);};return {destroy,unmount:destroy}}function resolveTarget(target){if(typeof target!=="string")return target;if(typeof document==="undefined")return null;return document.querySelector(target)}function toCaptureConfig(config){return {documentTypes:config.documentTypes,biometricMode:config.biometricMode,requireMrzMatch:false,requireExpiryValid:false,requireNameMatch:false,documentAuthenticity:false,...config.minAge!==void 0?{minAge:config.minAge}:{}}}var REMINT_READY_TIMEOUT_MS=15e3;function noopHandle(){return {destroy(){},unmount(){},openCrossDevice(){}}}function isCoarsePointerViewport(){return typeof window!=="undefined"&&typeof window.matchMedia==="function"&&window.matchMedia("(pointer: coarse)").matches}function createIdv(ctx,opts){const element=resolveTarget(opts.target);if(element===null){console.warn('[Checktiv] mount("idv"): no target element found. Pass an element or a selector that resolves.');return noopHandle()}const emit=e=>opts.onEvent?.(e);const fetchImpl=opts.fetchImpl??fetch;let teardown=null;let cancelled=false;let crossDeviceSession=null;let crossDeviceOverlay=null;const closeCrossDevice=()=>{if(crossDeviceOverlay!==null){crossDeviceOverlay.destroy();crossDeviceOverlay=null;}};const openCrossDevice=()=>{if(cancelled)return;if(crossDeviceOverlay!==null){if(crossDeviceOverlay.isCapped())crossDeviceOverlay.restartPoll();return}if(isCoarsePointerViewport()){console.warn('[Checktiv] mount("idv"): openCrossDevice() is a desktop affordance; ignoring the call on a touch device (the immersive capture layout already owns the phone).');return}const sess=crossDeviceSession;if(sess===null){console.warn('[Checktiv] mount("idv"): openCrossDevice() called before the session resolved.');return}const copy=opts.crossDeviceCopy;if(copy===void 0){console.warn('[Checktiv] mount("idv"): openCrossDevice() requires `crossDeviceCopy` (with `unavailableMessage`).');return}const openOverlay=getCrossDeviceOpener();if(openOverlay===null){console.warn(`[Checktiv] mount("idv"): cross-device is not enabled. Import '@checktiv/sdk-web/idv/cross-device' in your app.`);return}crossDeviceOverlay=openOverlay({ctx,fetchImpl,target:sess.element,stepId:sess.stepId,sessionId:sess.sessionId,copy,isMobile:isCoarsePointerViewport(),onOpenCrossDevice:opts.onOpenCrossDevice,emit,onClose:closeCrossDevice});};void(async()=>{try{await setupCapture(element);}catch(err){if(cancelled)return;console.warn('[Checktiv] mount("idv") setup failed.',err);emit(createChecktivErrorEvent("sdk_load_failed"));}})();async function setupCapture(element2){const resolution=await resolveSession(ctx,fetchImpl);if(cancelled)return;let session;switch(resolution.kind){case "ok":session=resolution.session;break;case "wrong_token":warnWrongTokenPlane();emit(createChecktivErrorEvent("wrong_token_type"));return;case "unresolved":emit(createChecktivErrorEvent("session_expired"));return;case "nothing_to_render":emit({type:"checktiv.idv.processing",reason:"no_renderable_step"});return;default:return assertNever(resolution)}const idvConfig=session.config;if(idvConfig===null){emit(createChecktivErrorEvent("session_expired"));return}const readyConfig={documentTypes:idvConfig.documentTypes,biometricMode:idvConfig.biometricMode};if(ctx.mode==="test"&&opts.synthetic!==void 0){const synthHandle=createSyntheticIdv(opts,readyConfig,session.sessionId,opts.synthetic);teardown=()=>synthHandle.destroy();return}const captureConfig=toCaptureConfig(idvConfig);crossDeviceSession={sessionId:session.sessionId,stepId:session.stepId,element:element2};const transport=createIdvTransport(ctx,{fetchImpl,sessionId:session.sessionId,stepId:session.stepId,config:()=>captureConfig,onError:emit});let pinnedOrigin=null;let everReady=false;const onState=state=>{if(state.kind==="ready"){pinnedOrigin=state.embedOrigin;everReady=true;}if(state.kind==="capture_error"&&state.errorKind==="protocol_mismatch"){transport.failProtocolMismatch();return}const event=mapStateToEvent(state,{config:readyConfig,sessionId:session.sessionId});if(event!==null)emit(event);};const onControllerEvent=event=>{if(event.type==="all-complete"){emit({type:"checktiv.idv.submitted",sessionId:session.sessionId});}};const handle=mount(element2,{mintToken:transport.mintToken,submit:transport.submit,getEmbedSrc:transport.getEmbedSrc,initPayload:transport.initPayload,copy:opts.copy??{},layout:opts.layout,maxWidth:opts.maxWidth,onBeforeSubmit:opts.onBeforeSubmit,onBehaviorSegment:opts.onBehaviorSegment,onState,onControllerEvent});let reminting=false;let awaitingRemintReady=false;let remintReadyTimeoutHandle=null;const clearRemintReadyTimeout=()=>{if(remintReadyTimeoutHandle!==null){clearTimeout(remintReadyTimeoutHandle);remintReadyTimeoutHandle=null;}};const armRemintReadyTimeout=()=>{clearRemintReadyTimeout();remintReadyTimeoutHandle=setTimeout(()=>{remintReadyTimeoutHandle=null;if(!awaitingRemintReady)return;if(cancelled)return;void(async()=>{const minted=await transport.remint();if(cancelled||minted===null){awaitingRemintReady=false;reminting=false;return}if(!awaitingRemintReady){reminting=false;return}const frame=element2.querySelector("iframe.idv-capture-frame");if(frame===null){awaitingRemintReady=false;reminting=false;return}armRemintReadyTimeout();frame.src=transport.getEmbedSrc(minted.embedOrigin);})();},REMINT_READY_TIMEOUT_MS);};const isCaptureReady=data=>typeof data==="object"&&data!==null&&"type"in data&&data.type==="capture:ready";const onReloadMessage=mev=>{if(pinnedOrigin===null||mev.origin!==pinnedOrigin)return;if(!everReady)return;if(!isCaptureReady(mev.data))return;const pinnedFrame=element2.querySelector("iframe.idv-capture-frame");if(pinnedFrame===null)return;if(mev.source!==null&&mev.source!==pinnedFrame.contentWindow)return;if(reminting){if(awaitingRemintReady){clearRemintReadyTimeout();awaitingRemintReady=false;reminting=false;}return}reminting=true;void(async()=>{const minted=await transport.remint();if(cancelled||minted===null){reminting=false;return}const frame=element2.querySelector("iframe.idv-capture-frame");if(frame===null){reminting=false;return}awaitingRemintReady=true;armRemintReadyTimeout();frame.src=transport.getEmbedSrc(minted.embedOrigin);})();};if(typeof window!=="undefined"){window.addEventListener("message",onReloadMessage);}teardown=()=>{clearRemintReadyTimeout();if(typeof window!=="undefined"){window.removeEventListener("message",onReloadMessage);}handle.destroy();};}const destroy=()=>{cancelled=true;closeCrossDevice();if(teardown!==null){teardown();teardown=null;}};return {destroy,unmount:destroy,openCrossDevice}}registerModule("idv",createIdv);
17
+ var PLATFORM_BRAND_DEFAULT={primaryColor:"#2563eb",secondaryColor:"#ff5e4d",colorMode:"auto"};var SURFACE={light:{bg:"#fafaf7",surface1:"#ffffff"},dark:{bg:"#0b0c0f",surface1:"#15171c"}};var WHITE="#ffffff";var NEAR_BLACK="#0b0c0f";var ACCENT_TARGET=3;var ADAPT_STEP=.04;var ADAPT_MAX_ITERS=24;var HOVER_DELTA=.08;var SECONDARY_HUE_SHIFT=150;var HEX_RE=/^#[0-9a-fA-F]{6}$/;function toHex(r,g,b){const ch=v=>Math.max(0,Math.min(255,Math.round(v))).toString(16).padStart(2,"0");return `#${ch(r)}${ch(g)}${ch(b)}`}function parseHex(hex){if(typeof hex!=="string"||!HEX_RE.test(hex))return null;const n=Number.parseInt(hex.slice(1),16);return {r:n>>16&255,g:n>>8&255,b:n&255}}function linearize(channel){const s=channel/255;return s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4)}function relativeLuminance(rgb){return .2126*linearize(rgb.r)+.7152*linearize(rgb.g)+.0722*linearize(rgb.b)}function assessContrast(fg,bg){const f=parseHex(fg);const b=parseHex(bg);if(!f||!b)return 1;const l1=relativeLuminance(f);const l2=relativeLuminance(b);const hi=Math.max(l1,l2);const lo=Math.min(l1,l2);return (hi+.05)/(lo+.05)}function rgbToHsl({r,g,b}){const rn=r/255;const gn=g/255;const bn=b/255;const max=Math.max(rn,gn,bn);const min=Math.min(rn,gn,bn);const l=(max+min)/2;let h=0;let s=0;if(max!==min){const d=max-min;s=l>.5?d/(2-max-min):d/(max+min);switch(max){case rn:h=(gn-bn)/d+(gn<bn?6:0);break;case gn:h=(bn-rn)/d+2;break;default:h=(rn-gn)/d+4;break}h/=6;}return {h:h*360,s,l}}function hueToRgb(p,q,tRaw){let t=tRaw;if(t<0)t+=1;if(t>1)t-=1;if(t<1/6)return p+(q-p)*6*t;if(t<1/2)return q;if(t<2/3)return p+(q-p)*(2/3-t)*6;return p}function hslToRgb({h,s,l}){const hn=(h%360+360)%360/360;let r;let g;let b;if(s===0){r=g=b=l;}else {const q=l<.5?l*(1+s):l+s-l*s;const p=2*l-q;r=hueToRgb(p,q,hn+1/3);g=hueToRgb(p,q,hn);b=hueToRgb(p,q,hn-1/3);}return {r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)}}function deriveSecondaryHue(hex){const rgb=parseHex(hex);if(!rgb)return PLATFORM_BRAND_DEFAULT.secondaryColor;const hsl=rgbToHsl(rgb);const out=hslToRgb({...hsl,h:(hsl.h+SECONDARY_HUE_SHIFT)%360});return toHex(out.r,out.g,out.b)}function shiftLightness(hex,delta){const rgb=parseHex(hex);if(!rgb)return toHex(0,0,0);const hsl=rgbToHsl(rgb);const out=hslToRgb({...hsl,l:Math.max(0,Math.min(1,hsl.l+delta))});return toHex(out.r,out.g,out.b)}function onColorFor(bg){const white=assessContrast(WHITE,bg);const dark=assessContrast(NEAR_BLACK,bg);return white>=dark?WHITE:NEAR_BLACK}function adaptAccent(hex,surface,target,warnings,field,mode){const rgb=parseHex(hex);if(!rgb){return toHex(0,0,0)}const hsl=rgbToHsl(rgb);const lighten=relativeLuminance(parseHex(surface)??{r:255,g:255,b:255})<.5;const rawRatio=assessContrast(hex,surface);let l=hsl.l;let out=toHex(rgb.r,rgb.g,rgb.b);for(let i=0;i<ADAPT_MAX_ITERS;i+=1){if(assessContrast(out,surface)>=target)break;l=Math.max(0,Math.min(1,l+(lighten?ADAPT_STEP:-ADAPT_STEP)));const o=hslToRgb({h:hsl.h,s:hsl.s,l});out=toHex(o.r,o.g,o.b);}const finalRatio=assessContrast(out,surface);if(rawRatio<target||finalRatio<target){warnings.push({field,mode,ratio:Number(rawRatio.toFixed(2))});}return out}function deriveMode(input,mode,warnings){const surf=SURFACE[mode];const primary=adaptAccent(input.primaryColor,surf.bg,ACCENT_TARGET,warnings,"primary",mode);const rawSecondary=input.secondaryColor??deriveSecondaryHue(input.primaryColor);const secondary=adaptAccent(rawSecondary,surf.bg,ACCENT_TARGET,warnings,"secondary",mode);const primaryHover=shiftLightness(primary,mode==="light"?-HOVER_DELTA:HOVER_DELTA);const onPrimary=onColorFor(primary);const onSecondary=onColorFor(secondary);const ring=primary;return {primary,primaryHover,onPrimary,secondary,onSecondary,ring}}function toSafeBrandColors(input){if(!input||parseHex(input.primaryColor)===null){return {primaryColor:PLATFORM_BRAND_DEFAULT.primaryColor,secondaryColor:PLATFORM_BRAND_DEFAULT.secondaryColor,colorMode:PLATFORM_BRAND_DEFAULT.colorMode}}const secondaryColor=typeof input.secondaryColor==="string"&&parseHex(input.secondaryColor)!==null?input.secondaryColor:null;const colorMode="auto";return {primaryColor:input.primaryColor,secondaryColor,colorMode}}function deriveBrandTokens(input){const safe=toSafeBrandColors(input);const warnings=[];return {light:deriveMode(safe,"light",warnings),dark:deriveMode(safe,"dark",warnings),warnings}}function defaultPrefersDark(){if(typeof window==="undefined"||typeof window.matchMedia!=="function"){return false}try{return window.matchMedia("(prefers-color-scheme: dark)").matches}catch{return false}}function defaultForcedMode(){if(typeof document==="undefined")return null;const dataTheme=document.documentElement.dataset.theme;return dataTheme==="light"||dataTheme==="dark"?dataTheme:null}function brandColorsFrom(primaryColor){return {primaryColor,secondaryColor:PLATFORM_BRAND_DEFAULT.secondaryColor,colorMode:"auto"}}function resolveCaptureTheme(ctxTheme,opts={}){const prefersDark=opts.prefersDark??defaultPrefersDark;const forcedMode=opts.forcedMode??defaultForcedMode;const colorMode=forcedMode()??(prefersDark()?"dark":"light");const primaryColor=ctxTheme?.primaryColor;if(typeof primaryColor!=="string"||primaryColor.length===0){return {colorMode,brandTokens:null}}const brandTokens=deriveBrandTokens(brandColorsFrom(primaryColor))[colorMode];return {colorMode,brandTokens}}var LEASE_STORAGE_KEY_PREFIX="checktiv.idv.lease.";function isRecord(v){return typeof v==="object"&&v!==null}function storageKey(sessionId){return LEASE_STORAGE_KEY_PREFIX+sessionId}function safeLocalStorage(){try{return globalThis.localStorage??null}catch{return null}}function generateHolderDeviceId(){const c=globalThis.crypto;if(c&&typeof c.randomUUID==="function"){return c.randomUUID()}const bytes=new Uint8Array(16);c.getRandomValues(bytes);let hex="";for(const b of bytes)hex+=b.toString(16).padStart(2,"0");return hex}function loadPersistedLease(sessionId){const ls=safeLocalStorage();if(ls===null)return null;let raw;try{raw=ls.getItem(storageKey(sessionId));}catch{return null}if(raw===null)return null;let parsed;try{parsed=JSON.parse(raw);}catch{return null}if(!isRecord(parsed))return null;const{holderDeviceId,leaseGeneration}=parsed;if(typeof holderDeviceId!=="string"||holderDeviceId.length===0)return null;const gen=typeof leaseGeneration==="number"&&Number.isInteger(leaseGeneration)&&leaseGeneration>=0?leaseGeneration:void 0;return gen===void 0?{holderDeviceId}:{holderDeviceId,leaseGeneration:gen}}function persistLease(sessionId,record){const ls=safeLocalStorage();if(ls===null)return;try{ls.setItem(storageKey(sessionId),JSON.stringify(record));}catch{}}function loadOrCreatePersistedLease(sessionId){const persisted=loadPersistedLease(sessionId);if(persisted!==null)return persisted;const record={holderDeviceId:generateHolderDeviceId()};persistLease(sessionId,record);return record}var MAX_REMINTS=3;function isRecord2(v){return typeof v==="object"&&v!==null}function asMode(value){return value==="live"||value==="test"?value:null}var TEST_HINTS=["pass","review","fail","doc_quality"];function asTestHint(value){return TEST_HINTS.find(hint=>hint===value)??null}function parseMintBody(body){if(!isRecord2(body)||!isRecord2(body.data))return null;const d=body.data;const captureToken=d.capture_token;const embedOrigin=d.embed_origin;const runIndex=d.run_index;const embedContextToken=d.embed_context_token;if(typeof captureToken!=="string"||captureToken.length===0)return null;if(!isCanonicalOrigin(embedOrigin))return null;if(typeof runIndex!=="number"||!Number.isInteger(runIndex)||runIndex<0)return null;if(typeof embedContextToken!=="string"||embedContextToken.length===0)return null;const mode=asMode(d.mode);const testHint=asTestHint(d.test_hint);return {captureToken,embedOrigin,runIndex,embedContextToken,...mode!==null?{mode}:{},...testHint!==null?{testHint}:{}}}function buildCaptureSubmitBody(input){return {runIndex:input.runIndex,r2Keys:input.r2Keys,holderDeviceId:input.holderDeviceId,...input.leaseGeneration!==void 0?{leaseGeneration:input.leaseGeneration}:{}}}function createIdvTransport(ctx,opts){const fetchImpl=opts.fetchImpl??fetch;const origin=ctx.apiBaseOrigin;let embedContextToken=null;let remintCount=0;const persistedLease=loadOrCreatePersistedLease(opts.sessionId);const holderDeviceId=persistedLease.holderDeviceId;const leaseGeneration=persistedLease.leaseGeneration;async function mintToken(){const res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+CAPTURE_TOKEN_MINT_PATH,{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({stepId:opts.stepId})}),result=>result?.status===401);if(!res.ok){throw createChecktivError(mapHttpStatusToError(res.status))}let body;try{body=await res.json();}catch{opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}const parsed=parseMintBody(body);if(parsed===null){opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}embedContextToken=parsed.embedContextToken;return {captureToken:parsed.captureToken,embedOrigin:parsed.embedOrigin,runIndex:parsed.runIndex,...parsed.mode!==void 0?{mode:parsed.mode}:{},...parsed.testHint!==void 0?{testHint:parsed.testHint}:{}}}function getEmbedSrc(embedOrigin){if(embedContextToken===null){opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}return `${embedOrigin}/idv/capture?ctx=${encodeURIComponent(embedContextToken)}`}async function submit(runIndex,r2Keys){let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+stepSubmitPath(opts.sessionId,opts.stepId??""),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(buildCaptureSubmitBody({runIndex,r2Keys,holderDeviceId,leaseGeneration}))}),result=>result?.status===401);}catch{return {ok:false,reason:"failed"}}if(res.ok)return {ok:true};if(res.status===401)return {ok:false,reason:"token_expired"};if(res.status===409)return {ok:false,reason:"capture_superseded"};if(res.status===503&&res.headers.has("Retry-After")){return {ok:false,reason:"signal_pending"}}return {ok:false,reason:"failed"}}function initPayload(){return {config:opts.config(),locale:ctx.locale,theme:resolveCaptureTheme(ctx.theme),protocolVersion:CURRENT_PROTOCOL_VERSION,...ctx.selfiePromptMap!==void 0?{selfiePromptMap:ctx.selfiePromptMap}:{},...ctx.selfieChromeCopy!==void 0?{selfieChromeCopy:ctx.selfieChromeCopy}:{}}}async function remint(){if(remintCount>=MAX_REMINTS){opts.onError?.(createChecktivErrorEvent("session_expired"));return null}remintCount+=1;try{return await mintToken()}catch{return null}}function failProtocolMismatch(){opts.onError?.(createChecktivErrorEvent("protocol_mismatch"));}return {mintToken,submit,getEmbedSrc,initPayload,remint,failProtocolMismatch}}function after(delayMs,fn){return setTimeout(fn,delayMs)}function createSyntheticIdv(opts,config,sessionId,script){const emit=e=>opts.onEvent?.(e);const delayMs=script?.stepDelayMs??0;const timers=[];let destroyed=false;function step(offsetMs,fn){timers.push(after(offsetMs,()=>{if(!destroyed)fn();}));}step(delayMs*0,()=>{emit({type:"checktiv.idv.ready",config});});if(script?.injectError!==void 0){const code=script.injectError;step(delayMs*1,()=>{emit(createChecktivErrorEvent(code));});}else {step(delayMs*1,()=>{emit({type:"checktiv.idv.phase",phase:"document_front"});});step(delayMs*2,()=>{emit({type:"checktiv.idv.submitted",sessionId});});}const destroy=()=>{if(destroyed)return;destroyed=true;for(const id of timers)clearTimeout(id);};return {destroy,unmount:destroy}}function resolveTarget(target){if(typeof target!=="string")return target;if(typeof document==="undefined")return null;return document.querySelector(target)}function toCaptureConfig(config){return {documentTypes:config.documentTypes,biometricMode:config.biometricMode,requireMrzMatch:false,requireExpiryValid:false,requireNameMatch:false,documentAuthenticity:false,...config.minAge!==void 0?{minAge:config.minAge}:{}}}var REMINT_READY_TIMEOUT_MS=15e3;function noopHandle(){return {destroy(){},unmount(){},openCrossDevice(){}}}function isCoarsePointerViewport(){return typeof window!=="undefined"&&typeof window.matchMedia==="function"&&window.matchMedia("(pointer: coarse)").matches}function createIdv(ctx,opts){const element=resolveTarget(opts.target);if(element===null){console.warn('[Checktiv] mount("idv"): no target element found. Pass an element or a selector that resolves.');return noopHandle()}const emit=e=>opts.onEvent?.(e);const fetchImpl=opts.fetchImpl??fetch;let teardown=null;let cancelled=false;let crossDeviceSession=null;let crossDeviceOverlay=null;const closeCrossDevice=()=>{if(crossDeviceOverlay!==null){crossDeviceOverlay.destroy();crossDeviceOverlay=null;}};const openCrossDevice=()=>{if(cancelled)return;if(crossDeviceOverlay!==null){if(crossDeviceOverlay.isCapped())crossDeviceOverlay.restartPoll();return}if(isCoarsePointerViewport()){console.warn('[Checktiv] mount("idv"): openCrossDevice() is a desktop affordance; ignoring the call on a touch device (the immersive capture layout already owns the phone).');return}const sess=crossDeviceSession;if(sess===null){console.warn('[Checktiv] mount("idv"): openCrossDevice() called before the session resolved.');return}const copy=opts.crossDeviceCopy;if(copy===void 0){console.warn('[Checktiv] mount("idv"): openCrossDevice() requires `crossDeviceCopy` (with `unavailableMessage`).');return}const openOverlay=getCrossDeviceOpener();if(openOverlay===null){console.warn(`[Checktiv] mount("idv"): cross-device is not enabled. Import '@checktiv/sdk-web/idv/cross-device' in your app.`);return}crossDeviceOverlay=openOverlay({ctx,fetchImpl,target:sess.element,stepId:sess.stepId,sessionId:sess.sessionId,copy,isMobile:isCoarsePointerViewport(),onOpenCrossDevice:opts.onOpenCrossDevice,emit,onClose:closeCrossDevice});};void(async()=>{try{await setupCapture(element);}catch(err){if(cancelled)return;console.warn('[Checktiv] mount("idv") setup failed.',err);emit(createChecktivErrorEvent("sdk_load_failed"));}})();async function setupCapture(element2){const resolution=await resolveSession(ctx,fetchImpl);if(cancelled)return;let session;switch(resolution.kind){case "ok":session=resolution.session;break;case "wrong_token":warnWrongTokenPlane();emit(createChecktivErrorEvent("wrong_token_type"));return;case "unresolved":emit(createChecktivErrorEvent("session_expired"));return;case "nothing_to_render":emit({type:"checktiv.idv.processing",reason:"no_renderable_step"});return;default:return assertNever(resolution)}const idvConfig=session.config;if(idvConfig===null){emit(createChecktivErrorEvent("session_expired"));return}const readyConfig={documentTypes:idvConfig.documentTypes,biometricMode:idvConfig.biometricMode};if(ctx.mode==="test"&&opts.synthetic!==void 0){const synthHandle=createSyntheticIdv(opts,readyConfig,session.sessionId,opts.synthetic);teardown=()=>synthHandle.destroy();return}const captureConfig=toCaptureConfig(idvConfig);crossDeviceSession={sessionId:session.sessionId,stepId:session.stepId,element:element2};const transport=createIdvTransport(ctx,{fetchImpl,sessionId:session.sessionId,stepId:session.stepId,config:()=>captureConfig,onError:emit});let pinnedOrigin=null;let everReady=false;const onState=state=>{if(state.kind==="ready"){pinnedOrigin=state.embedOrigin;everReady=true;}if(state.kind==="capture_error"&&state.errorKind==="protocol_mismatch"){transport.failProtocolMismatch();return}const event=mapStateToEvent(state,{config:readyConfig,sessionId:session.sessionId});if(event!==null)emit(event);};const onControllerEvent=event=>{if(event.type==="all-complete"){emit({type:"checktiv.idv.submitted",sessionId:session.sessionId});}};const handle=mount(element2,{mintToken:transport.mintToken,submit:transport.submit,getEmbedSrc:transport.getEmbedSrc,initPayload:transport.initPayload,copy:opts.copy??{},layout:opts.layout,maxWidth:opts.maxWidth,onBeforeSubmit:opts.onBeforeSubmit,onBehaviorSegment:opts.onBehaviorSegment,onState,onControllerEvent});let reminting=false;let awaitingRemintReady=false;let remintReadyTimeoutHandle=null;const clearRemintReadyTimeout=()=>{if(remintReadyTimeoutHandle!==null){clearTimeout(remintReadyTimeoutHandle);remintReadyTimeoutHandle=null;}};const armRemintReadyTimeout=()=>{clearRemintReadyTimeout();remintReadyTimeoutHandle=setTimeout(()=>{remintReadyTimeoutHandle=null;if(!awaitingRemintReady)return;if(cancelled)return;void(async()=>{const minted=await transport.remint();if(cancelled||minted===null){awaitingRemintReady=false;reminting=false;return}if(!awaitingRemintReady){reminting=false;return}const frame=element2.querySelector("iframe.idv-capture-frame");if(frame===null){awaitingRemintReady=false;reminting=false;return}armRemintReadyTimeout();frame.src=transport.getEmbedSrc(minted.embedOrigin);})();},REMINT_READY_TIMEOUT_MS);};const isCaptureReady=data=>typeof data==="object"&&data!==null&&"type"in data&&data.type==="capture:ready";const onReloadMessage=mev=>{if(pinnedOrigin===null||mev.origin!==pinnedOrigin)return;if(!everReady)return;if(!isCaptureReady(mev.data))return;const pinnedFrame=element2.querySelector("iframe.idv-capture-frame");if(pinnedFrame===null)return;if(mev.source!==null&&mev.source!==pinnedFrame.contentWindow)return;if(reminting){if(awaitingRemintReady){clearRemintReadyTimeout();awaitingRemintReady=false;reminting=false;}return}reminting=true;void(async()=>{const minted=await transport.remint();if(cancelled||minted===null){reminting=false;return}const frame=element2.querySelector("iframe.idv-capture-frame");if(frame===null){reminting=false;return}awaitingRemintReady=true;armRemintReadyTimeout();frame.src=transport.getEmbedSrc(minted.embedOrigin);})();};if(typeof window!=="undefined"){window.addEventListener("message",onReloadMessage);}teardown=()=>{clearRemintReadyTimeout();if(typeof window!=="undefined"){window.removeEventListener("message",onReloadMessage);}handle.destroy();};}const destroy=()=>{cancelled=true;closeCrossDevice();if(teardown!==null){teardown();teardown=null;}};return {destroy,unmount:destroy,openCrossDevice}}registerModule("idv",createIdv);
18
18
 
19
19
  export { REMINT_READY_TIMEOUT_MS, createIdv };
@@ -1,9 +1,9 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, ReactElement } from 'react';
3
3
  import { CollectUserInfoSession, CollectUserInfoCollector } from './collect-user-info.js';
4
- import { g as ChecktivIdvEvent, M as MountOptions, C as ChecktivInitOptions, B as ChecktivInitScope, a as ChecktivClient } from './api-Cjh51lsw.js';
5
- import { C as CaptureLayout, a as CaptureBehaviorMessage } from './machine-DZPN-A44.js';
6
- import { M as MountCopy } from './copy-CC_mrlVV.js';
4
+ import { h as ChecktivIdvEvent, M as MountOptions, C as ChecktivInitOptions, H as ChecktivInitScope, a as ChecktivClient } from './api-DicBOi5f.js';
5
+ import { C as CaptureLayout, a as CaptureBehaviorMessage } from './machine-Z0b9Q7zQ.js';
6
+ import { M as MountCopy } from './copy-DVW_qbbM.js';
7
7
 
8
8
  interface SelfServiceResendResult {
9
9
  readonly requested: boolean;
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { C as ChecktivInitOptions, T as TokenManager, a as ChecktivClient, S as SdkRegion, P as ProvisionedHandle, M as MountOptions, I as InitOptions, b as ChecktivSessions } from './api-Cjh51lsw.js';
2
- export { c as ChecktivError, d as ChecktivErrorCode, e as ChecktivEvent, f as ChecktivFraudEvent, g as ChecktivIdvEvent, h as ChecktivRecovery, i as CrossDeviceHandoffHook, F as FraudHandle, j as FraudMountOptions, G as GetSessionToken, k as GetSessionTokenContext, l as IdvCoachingHint, m as IdvHandle, n as IdvMountOptions, o as InvalidPublishableKeyError, p as MountCompleteResult, q as MountProvisionedOptions, r as MountScope, s as ParsedPublishableKey, R as ResolvedIdvConfig, t as SdkMode, u as SessionsCreateApplicant, v as SessionsCreateApplicantAddress, w as SessionsCreateInput, x as SessionsCreateOptions, y as SessionsCreateResult, z as SyntheticIdvScript, A as parsePublishableKey } from './api-Cjh51lsw.js';
3
- import { S as SelfServiceResendResult } from './index-9vcErEYX.js';
4
- export { C as ChecktivIdvProps, a as ChecktivJourneyHandle, b as ChecktivJourneyProps, c as ChecktivProviderProps } from './index-9vcErEYX.js';
1
+ import { C as ChecktivInitOptions, T as TokenManager, a as ChecktivClient, S as SdkRegion, P as ProvisionedHandle, M as MountOptions, I as InitOptions, b as ChecktivSessions } from './api-DicBOi5f.js';
2
+ export { c as CHECKTIV_ERROR_CODES, d as ChecktivError, e as ChecktivErrorCode, f as ChecktivEvent, g as ChecktivFraudEvent, h as ChecktivIdvEvent, i as ChecktivKnownErrorCode, j as ChecktivRecovery, k as CrossDeviceHandoffHook, F as FraudHandle, l as FraudMountOptions, G as GetSessionToken, m as GetSessionTokenContext, n as IdvCoachingHint, o as IdvHandle, p as IdvMountOptions, q as InvalidPublishableKeyError, r as MountCompleteResult, s as MountProvisionedOptions, t as MountScope, u as ParsedPublishableKey, R as ResolvedIdvConfig, v as SdkMode, w as SessionsCreateApplicant, x as SessionsCreateApplicantAddress, y as SessionsCreateInput, z as SessionsCreateOptions, A as SessionsCreateResult, B as SyntheticIdvScript, D as createChecktivError, E as parsePublishableKey } from './api-DicBOi5f.js';
3
+ import { S as SelfServiceResendResult } from './index-DBJeQp6J.js';
4
+ export { C as ChecktivIdvProps, a as ChecktivJourneyHandle, b as ChecktivJourneyProps, c as ChecktivProviderProps } from './index-DBJeQp6J.js';
5
5
  export { C as CrossDeviceCopy } from './copy-DCeQ4JKx.js';
6
- import './machine-DZPN-A44.js';
7
- import './copy-CC_mrlVV.js';
6
+ import './machine-Z0b9Q7zQ.js';
7
+ import './copy-DVW_qbbM.js';
8
8
  import 'react';
9
9
  import './collect-user-info.js';
10
10
 
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- export { init, isSessionsCreateError, mount, mountButton, sessions, version } from './chunk-DXW36O3Q.js';
1
+ export { init, isSessionsCreateError, mount, mountButton, sessions, version } from './chunk-H33IXOKB.js';
2
2
  import './chunk-GFHNOZVO.js';
3
- import './chunk-JS3Y6T76.js';
4
- export { InvalidPublishableKeyError, parsePublishableKey } from './chunk-EXC2ZRUH.js';
5
- import './chunk-DRNEDARS.js';
3
+ export { CHECKTIV_ERROR_CODES, createChecktivError } from './chunk-S24BZWVR.js';
4
+ export { InvalidPublishableKeyError, parsePublishableKey } from './chunk-WC6TLR42.js';
5
+ import './chunk-523TT3PD.js';
6
6
  import './chunk-UBQTPS5J.js';
7
7
  import './chunk-S2OOEDJS.js';
8
8
  export { regionToApiBase } from './chunk-HFQJYEGZ.js';
@@ -54,6 +54,7 @@ interface CaptureInitMessage {
54
54
  selfiePromptMap?: SelfiePromptMap;
55
55
  selfieChromeCopy?: SelfieChromeCopy;
56
56
  }
57
+ type CaptureInitStaticKey = 'config' | 'locale' | 'theme' | 'protocolVersion' | 'beginScanPrompt' | 'beginScanLabel' | 'selfiePromptMap' | 'selfieChromeCopy';
57
58
  interface IdvR2Keys {
58
59
  front: string;
59
60
  back?: string;
@@ -157,4 +158,4 @@ declare function reducer(state: CaptureState, action: CaptureAction): CaptureSta
157
158
  declare function nextCapturePhaseAfterDocument(side: CaptureDocumentSide, documentTypes: IdVerificationConfig['documentTypes'], biometricMode: IdVerificationConfig['biometricMode']): CapturePhase;
158
159
  declare function isBiometricPhase(phase: CapturePhase): boolean;
159
160
 
160
- export { type CaptureLayout as C, type IdvR2Keys as I, type SdkCrossDeviceStatusResponse as S, type CaptureBehaviorMessage as a, type CoachingKind as b, type CaptureAction as c, type CaptureErrorKind as d, type CapturePhase as e, type CaptureState as f, type CaptureInitMessage as g, type SelfiePromptMap as h, isBiometricPhase as i, type SelfieChromeCopy as j, nextCapturePhaseAfterDocument as n, reducer as r };
161
+ export { type CaptureLayout as C, type DataMode as D, type IdvR2Keys as I, type SdkCrossDeviceStatusResponse as S, type TestHint as T, type CaptureBehaviorMessage as a, type CoachingKind as b, type CaptureAction as c, type CaptureErrorKind as d, type CapturePhase as e, type CaptureState as f, type CaptureInitMessage as g, type CaptureInitStaticKey as h, isBiometricPhase as i, type SelfiePromptMap as j, type SelfieChromeCopy as k, nextCapturePhaseAfterDocument as n, reducer as r };
package/dist/react.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import 'react';
2
2
  import './collect-user-info.js';
3
- import './api-Cjh51lsw.js';
4
- import './machine-DZPN-A44.js';
5
- import './copy-CC_mrlVV.js';
6
- export { d as ChecktivIdv, C as ChecktivIdvProps, e as ChecktivJourney, a as ChecktivJourneyHandle, b as ChecktivJourneyProps, f as ChecktivProvider, c as ChecktivProviderProps, g as ChecktivProviderPropsBase, u as useChecktiv, h as useCollectUserInfo } from './index-9vcErEYX.js';
3
+ import './api-DicBOi5f.js';
4
+ import './machine-Z0b9Q7zQ.js';
5
+ import './copy-DVW_qbbM.js';
6
+ export { d as ChecktivIdv, C as ChecktivIdvProps, e as ChecktivJourney, a as ChecktivJourneyHandle, b as ChecktivJourneyProps, f as ChecktivProvider, c as ChecktivProviderProps, g as ChecktivProviderPropsBase, u as useChecktiv, h as useCollectUserInfo } from './index-DBJeQp6J.js';
7
7
  import './copy-DCeQ4JKx.js';
package/dist/react.js CHANGED
@@ -1,9 +1,9 @@
1
- import { mount, init } from './chunk-DXW36O3Q.js';
1
+ import { mount, init } from './chunk-H33IXOKB.js';
2
2
  import './chunk-GFHNOZVO.js';
3
- import './chunk-JS3Y6T76.js';
4
- import { collectUserInfo } from './chunk-F2BDZRAX.js';
5
- import './chunk-EXC2ZRUH.js';
6
- import './chunk-DRNEDARS.js';
3
+ import './chunk-S24BZWVR.js';
4
+ import { collectUserInfo } from './chunk-NC4B6XNS.js';
5
+ import './chunk-WC6TLR42.js';
6
+ import './chunk-523TT3PD.js';
7
7
  import './chunk-UBQTPS5J.js';
8
8
  import './chunk-S2OOEDJS.js';
9
9
  import './chunk-HFQJYEGZ.js';
@@ -1,6 +1,6 @@
1
- import { S as SdkRegion } from './api-Cjh51lsw.js';
2
- import './machine-DZPN-A44.js';
3
- import './copy-CC_mrlVV.js';
1
+ import { S as SdkRegion } from './api-DicBOi5f.js';
2
+ import './machine-Z0b9Q7zQ.js';
3
+ import './copy-DVW_qbbM.js';
4
4
  import './copy-DCeQ4JKx.js';
5
5
 
6
6
  interface WorkspaceTokenBundle {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@checktiv/sdk-web",
3
- "version": "1.7.1",
3
+ "version": "1.8.0",
4
4
  "private": false,
5
5
  "license": "Apache-2.0",
6
6
  "publishConfig": {
@@ -1,7 +0,0 @@
1
- import { withTokenRetry } from './chunk-S2OOEDJS.js';
2
- import { sdkPublicSettings, SESSIONS_ME_PATH, dataPlaneHeaders } from './chunk-HFQJYEGZ.js';
3
- import { IDV_DOCUMENT_TYPES } from './chunk-IQKHRPJR.js';
4
-
5
- var SDK_MODULES=["idv","fraud","custom_form"];var BIOMETRIC_MODES=["none","selfie","liveness"];var DOCUMENT_TYPES=IDV_DOCUMENT_TYPES;var SDK_MODES=["live","test"];var DATA_REGIONS=Object.keys(sdkPublicSettings.regions);var COLLECT_USER_INFO_FIELD_VALUES=["email","phone","dob","address"];function isRecord(v){return typeof v==="object"&&v!==null}function isNonEmptyString(v){return typeof v==="string"&&v.length>0}function isSdkModule(v){return typeof v==="string"&&SDK_MODULES.includes(v)}function isBiometricMode(v){return typeof v==="string"&&BIOMETRIC_MODES.includes(v)}function isSdkMode(v){return typeof v==="string"&&SDK_MODES.includes(v)}function isSdkRegion(v){return typeof v==="string"&&DATA_REGIONS.includes(v)}function isDocumentType(v){return typeof v==="string"&&DOCUMENT_TYPES.includes(v)}function isCollectUserInfoField(v){return typeof v==="string"&&COLLECT_USER_INFO_FIELD_VALUES.includes(v)}function parseCollectUserInfoConfig(value){if(!isRecord(value))return null;const fields=value.fields;const captureStructuredName=value.capture_structured_name;if(!Array.isArray(fields))return null;const parsedFields=[];for(const f of fields){if(!isCollectUserInfoField(f))return null;parsedFields.push(f);}if(typeof captureStructuredName!=="boolean")return null;return {fields:parsedFields,captureStructuredName}}function parseIdvConfig(value){if(!isRecord(value))return null;const documentTypes=value.document_types;const biometricMode=value.biometric_mode;const minAge=value.min_age;if(!Array.isArray(documentTypes)||documentTypes.length<1)return null;const types=[];for(const t of documentTypes){if(!isDocumentType(t))return null;types.push(t);}if(!isBiometricMode(biometricMode))return null;if(minAge!==void 0&&typeof minAge!=="number")return null;const config={documentTypes:types,biometricMode};if(typeof minAge==="number")config.minAge=minAge;return config}function parseSessionData(body){if(!isRecord(body)||!isRecord(body.data))return null;const d=body.data;const sessionId=d.session_id;const stepId=d.step_id;const stepType=d.step_type;if(!isNonEmptyString(sessionId)||!isNonEmptyString(stepId)||!isNonEmptyString(stepType)||!isSdkMode(d.mode)||!isSdkRegion(d.region)){return null}if(!Array.isArray(d.modules)||!d.modules.every(isSdkModule))return null;const modules=d.modules;const wantsIdv=stepType==="id_verification";let config=null;if(wantsIdv){config=parseIdvConfig(d.config);if(config===null)return null}const collectUserInfoConfig=stepType==="collect_user_info"?parseCollectUserInfoConfig(d.config)??void 0:void 0;return {sessionId,stepId,stepType,config,mode:d.mode,region:d.region,modules,...collectUserInfoConfig!==void 0?{collectUserInfoConfig}:{}}}function isJourneyPlaneBody(body){if(!isRecord(body)||!isRecord(body.data))return false;const d=body.data;if("session_id"in d)return false;return isRecord(d.session)||isRecord(d.snapshot)}function isNonRenderableMarker(body){if(!isRecord(body)||!isRecord(body.data))return false;return body.data.renderable===false}function warnWrongTokenPlane(){console.warn("[Checktiv] The session token reached the wrong data plane. For the zero-lifecycle APIs (Checktiv.mount() or collectUserInfo), fetchToken must return your durable client token, which the SDK exchanges for a working token. For a customer-embed Checktiv.init(), getSessionToken must return a browser token.");}async function resolveSession(ctx,fetchImpl){const origin=ctx.apiBaseOrigin;let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+SESSIONS_ME_PATH,{method:"GET",headers:dataPlaneHeaders(ctx,token)}),result=>result?.status===401);}catch{return {kind:"unresolved"}}if(!res.ok)return {kind:"unresolved"};let body;try{body=await res.json();}catch{return {kind:"unresolved"}}if(isNonRenderableMarker(body))return {kind:"nothing_to_render"};const data=parseSessionData(body);if(data!==null){ctx.setSessionId(data.sessionId);return {kind:"ok",session:data}}if(isJourneyPlaneBody(body))return {kind:"wrong_token"};return {kind:"unresolved"}}
6
-
7
- export { isJourneyPlaneBody, isRecord, resolveSession, warnWrongTokenPlane };
@@ -1,9 +0,0 @@
1
- import { parsePublishableKey, createWorkingTokenSource, createWorkingTokenManager } from './chunk-EXC2ZRUH.js';
2
- import { resolveSession, warnWrongTokenPlane } from './chunk-DRNEDARS.js';
3
- import { assertNever } from './chunk-UBQTPS5J.js';
4
- import { withTokenRetry } from './chunk-S2OOEDJS.js';
5
- import { stepSubmitPath, dataPlaneHeaders, resolveApiBaseOrigin } from './chunk-HFQJYEGZ.js';
6
-
7
- var ERROR_MESSAGES={not_collect_step:"The current step does not collect user info. Mount the verification journey to continue.",validation_failed:"The submitted information was rejected. Check the required fields and try again.",token_expired:"The verification session expired. Create a new session so fetchToken returns a fresh client token, then try again.",origin_not_allowed:"This origin is not allowed for the publishable key. Add it to the allowed origins list in the Checktiv console.",rate_limited:"Too many requests. Wait a moment and try again.",service_unavailable:"The service is temporarily unavailable. Try again in a few seconds.",session_expired:"The verification session is no longer valid. Start a new verification from your backend.",wrong_token_type:"This verification could not start. Make sure fetchToken returns the client token, the same one you pass to Checktiv.mount().",network_error:"The request could not be completed. Check the connection and try again."};function fail(code){return {ok:false,code,message:ERROR_MESSAGES[code]}}function mapSubmitStatus(status){if(status===400||status===422)return "validation_failed";if(status===401)return "token_expired";if(status===403)return "origin_not_allowed";if(status===404)return "session_expired";if(status===429)return "rate_limited";if(status>=500)return "service_unavailable";return "session_expired"}function buildSubmitBody(input){const body={legalName:input.legalName};if(input.name!==void 0)body.name=input.name;if(input.email!==void 0)body.email=input.email;if(input.phone!==void 0)body.phone=input.phone;if(input.dateOfBirth!==void 0)body.dateOfBirth=input.dateOfBirth;if(input.address!==void 0)body.address=input.address;return body}function buildContext(session,fetchImpl){const scope="publishableKey"in session?{...parsePublishableKey(session.publishableKey),publishableKey:session.publishableKey}:{region:session.region,mode:session.mode,publishableKey:void 0};const apiBaseOrigin=resolveApiBaseOrigin(session.apiBase,scope.region,scope.mode);let clientTokenPromise=null;const getClientToken=()=>{if(clientTokenPromise!==null)return clientTokenPromise;const p=session.fetchToken();clientTokenPromise=p;void p.catch(()=>{if(clientTokenPromise===p)clientTokenPromise=null;});return p};const mintWorkingToken=createWorkingTokenSource(apiBaseOrigin,getClientToken,scope.publishableKey,fetchImpl);const tokens=createWorkingTokenManager(mintWorkingToken);let sessionId="";const ctx={region:scope.region,mode:scope.mode,publishableKey:scope.publishableKey,apiBaseOrigin,locale:"en",betas:[],tokens,getSessionId:()=>sessionId,setSessionId:id=>{sessionId=id;}};return {ctx,tokens}}function collectUserInfo(opts){const{session}=opts;const fetchImpl=session.fetchImpl??fetch;const{ctx,tokens}=buildContext(session,fetchImpl);return {async submit(input){try{const resolution=await resolveSession(ctx,fetchImpl);switch(resolution.kind){case "wrong_token":warnWrongTokenPlane();return fail("wrong_token_type");case "unresolved":return fail("session_expired");case "nothing_to_render":return fail("not_collect_step");case "ok":break;default:return assertNever(resolution)}const resolved=resolution.session;if(resolved.stepType!=="collect_user_info"){return fail("not_collect_step")}const body=buildSubmitBody(input);let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+stepSubmitPath(resolved.sessionId,resolved.stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(body)}),result=>result?.status===401);}catch{return fail("network_error")}if(res.ok)return {ok:true};return fail(mapSubmitStatus(res.status))}finally{tokens.stop();}},async describe(){const fresh=buildContext(session,fetchImpl);try{const resolution=await resolveSession(fresh.ctx,fetchImpl);switch(resolution.kind){case "wrong_token":warnWrongTokenPlane();return {ok:false,code:"wrong_token_type"};case "unresolved":return {ok:false,code:"session_expired"};case "nothing_to_render":return {ok:false,code:"not_collect_step"};case "ok":break;default:return assertNever(resolution)}const resolved=resolution.session;if(resolved.stepType!=="collect_user_info"){return {ok:false,code:"not_collect_step"}}const config=resolved.collectUserInfoConfig;if(config===void 0){return {ok:true,fields:[],captureStructuredName:false}}return {ok:true,fields:config.fields,captureStructuredName:config.captureStructuredName}}finally{fresh.tokens.stop();}}}}
8
-
9
- export { collectUserInfo };
@@ -1,3 +0,0 @@
1
- var CHECKTIV_RECOVERY_STRATEGIES=["retry","cross_device","refresh_session","contact_operator"];var ERROR_TABLE={origin_not_allowed:{recoverable:false,recovery:"contact_operator",message:"This origin is not allowed for the publishable key. Add it to the allowed origins list in the Checktiv console."},token_expired:{recoverable:true,recovery:"retry",message:"The session token expired. The SDK is refreshing it; if this persists, mint a new token from your backend."},session_expired:{recoverable:false,recovery:"refresh_session",message:"The verification session is no longer valid. Start a new verification from your backend."},wrong_token_type:{recoverable:false,recovery:"contact_operator",message:"This verification could not start. Contact the site operator."},protocol_mismatch:{recoverable:false,recovery:"contact_operator",message:"The SDK version is out of date. Update to the latest published version."},camera_denied:{recoverable:true,recovery:"cross_device",message:"Camera access was blocked. Allow camera access, or continue on another device."},camera_unsupported:{recoverable:true,recovery:"cross_device",message:"Your camera does not meet the minimum resolution needed for capture. Try another device, or continue on your phone."},cv_gate_failed:{recoverable:true,recovery:"retry",message:"We could not read the image clearly. Try again with better lighting and a steady hand."},upload_failed:{recoverable:true,recovery:"retry",message:"The upload did not complete. Check the connection and try again."},sdk_load_failed:{recoverable:true,recovery:"cross_device",message:"Verification could not start on this device. Try again, or continue on another device."},biometric_unsupported:{recoverable:false,recovery:"contact_operator",message:"This capture is not supported on this page. Contact the site operator."},isolation_required:{recoverable:false,recovery:"contact_operator",message:"This page configuration is not supported. Contact the site operator."}};var CHECKTIV_ERROR_CODES=Object.keys(ERROR_TABLE).filter(key=>key in ERROR_TABLE);function createChecktivError(code){const entry=ERROR_TABLE[code];return {code,...entry}}function mapHttpStatusToError(status){if(status===401)return "token_expired";if(status===403)return "origin_not_allowed";if(status===429)return "upload_failed";if(status>=500)return "upload_failed";return "session_expired"}function isChecktivErrorCode(value){return CHECKTIV_ERROR_CODES.some(code=>code===value)}function isChecktivRecovery(value){return CHECKTIV_RECOVERY_STRATEGIES.some(recovery=>recovery===value)}function isChecktivError(value){if(typeof value!=="object"||value===null)return false;if(!("code"in value)||!("message"in value)||!("recoverable"in value)||!("recovery"in value)){return false}const{code,message,recoverable,recovery}=value;return typeof code==="string"&&isChecktivErrorCode(code)&&typeof message==="string"&&typeof recoverable==="boolean"&&typeof recovery==="string"&&isChecktivRecovery(recovery)}
2
-
3
- export { createChecktivError, isChecktivError, mapHttpStatusToError };
@@ -1,6 +0,0 @@
1
- import { external_exports } from './chunk-NHNGQ5BB.js';
2
- import { IDV_DOCUMENT_TYPES, isTwoSidedDocumentType } from './chunk-IQKHRPJR.js';
3
-
4
- var behaviorTraitsSchema=external_exports.object({webdriver:external_exports.boolean(),maxTouchPoints:external_exports.number().int().min(0).max(512),timezone:external_exports.string().max(64).nullable(),pluginCount:external_exports.number().int().min(0).max(256),deviceModelHint:external_exports.string().max(120).nullable()}).strict();var behaviorStepSchema=external_exports.object({stepId:external_exports.string().max(80),seconds:external_exports.number().min(0).max(86400),pasteCount:external_exports.number().int().min(0).max(1e4)}).strict();var behaviorSurfaceEnum=external_exports.enum(["parent","embed"]);var behaviorCapturedPayloadSchema=external_exports.object({steps:external_exports.array(behaviorStepSchema).max(50),traits:behaviorTraitsSchema,segments:external_exports.array(external_exports.object({surface:behaviorSurfaceEnum,steps:external_exports.array(behaviorStepSchema).max(50),traits:behaviorTraitsSchema}).strict()).max(4).optional()}).strict();behaviorCapturedPayloadSchema.extend({ingress:external_exports.enum(["hosted","embedded"]).optional(),stepId:external_exports.string().max(128).optional()}).strict();var REGION_IDS=["us","eu"];var SystemModes=["live","test"];var DataRegions=REGION_IDS;var CURRENT_PROTOCOL_VERSION=1;var LivenessAwsRegions=["us-east-1","eu-west-1"];({us:LivenessAwsRegions[0],eu:LivenessAwsRegions[1]});external_exports.uuid();external_exports.email().toLowerCase();external_exports.object({createdAt:external_exports.iso.datetime(),updatedAt:external_exports.iso.datetime()});var dataRegionEnum=external_exports.enum(DataRegions);var dataModeEnum=external_exports.enum(SystemModes);external_exports.object({orgId:external_exports.string().min(1),mode:dataModeEnum,region:dataRegionEnum});external_exports.object({orgId:external_exports.string().min(1),actorId:external_exports.string().min(1),mode:dataModeEnum,region:dataRegionEnum,traceId:external_exports.string().optional()});var canonicalOriginSchema=external_exports.string().min(1).refine(v=>{if(v.includes("*"))return false;try{return new URL(v).origin===v}catch{return false}},"must be a canonical origin (scheme and host[:port], no path / query / fragment / credentials / wildcard)");canonicalOriginSchema.refine(v=>{try{return new URL(v).protocol==="https:"}catch{return false}},"must be a canonical https-only origin (scheme https: and host[:port], no path / query / fragment / credentials / wildcard)");var MAX_FIELDS_PER_SCREEN=8;var MAX_RULES_PER_SCREEN=10;var MAX_LOCALES=5;var MAX_LABEL_LEN=600;var bcp47LocaleSchema=external_exports.string().regex(/^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$/,"must be a BCP-47 locale tag");var bcp47I18nLabelSchema=external_exports.record(bcp47LocaleSchema,external_exports.string().max(MAX_LABEL_LEN)).refine(map=>Object.keys(map).length<=MAX_LOCALES,{message:`at most ${MAX_LOCALES} locales per label`});var FORM_FIELD_TYPES=["short_text","long_text","number","email","phone","date","single_select","multi_select","boolean","file_upload","content_heading","content_paragraph"];var RESERVED_SLUGS=new Set(["__proto__","constructor","prototype"]);var formFieldSlugSchema=external_exports.string().regex(/^[a-z][a-z0-9_]{0,63}$/,"must be a lowercase slug").refine(s=>!RESERVED_SLUGS.has(s),{message:"reserved slug is not allowed"});var formFieldValidationSchema=external_exports.object({minLength:external_exports.number().int().nonnegative().optional(),maxLength:external_exports.number().int().positive().optional(),min:external_exports.number().optional(),max:external_exports.number().optional(),minSelections:external_exports.number().int().nonnegative().optional(),maxSelections:external_exports.number().int().positive().optional()}).strict();var formFieldOptionSchema=external_exports.object({value:external_exports.string().min(1).max(200),label:bcp47I18nLabelSchema}).strict();var formFieldSchema=external_exports.object({id:formFieldSlugSchema,type:external_exports.enum(FORM_FIELD_TYPES),label:bcp47I18nLabelSchema,helpText:bcp47I18nLabelSchema.optional(),required:external_exports.boolean().default(false),validation:formFieldValidationSchema.optional(),options:external_exports.array(formFieldOptionSchema).max(50).optional()}).strict();var formRuleOpEnum=external_exports.enum(["eq","neq","in"]);var formRuleActionEnum=external_exports.enum(["flag_for_review","notify_email"]);var formRuleValueSchema=external_exports.union([external_exports.string(),external_exports.number(),external_exports.boolean(),external_exports.array(external_exports.union([external_exports.string(),external_exports.number(),external_exports.boolean()]))]);var formRuleSchema=external_exports.object({id:formFieldSlugSchema,when:external_exports.object({fieldId:formFieldSlugSchema,op:formRuleOpEnum,value:formRuleValueSchema}).strict(),actions:external_exports.array(formRuleActionEnum).min(1),notifyOrgMemberIds:external_exports.array(external_exports.string().min(1)).max(25).optional()}).strict();var customFormScreenConfigSchema=external_exports.object({supportedLocales:external_exports.array(bcp47LocaleSchema).min(1).max(MAX_LOCALES),fields:external_exports.array(formFieldSchema).min(1).max(MAX_FIELDS_PER_SCREEN),rules:external_exports.array(formRuleSchema).max(MAX_RULES_PER_SCREEN).default([])}).strict();var hexColorSchema=external_exports.string().regex(/^#[0-9a-fA-F]{6}$/,"Must be a 6-digit hex color, e.g. #2563eb");var colorModeSchema=external_exports.enum(["auto","light","dark"]);external_exports.object({primaryColor:hexColorSchema,secondaryColor:hexColorSchema.nullable().default(null),colorMode:colorModeSchema.default("auto")});var organizationBrandingSchema=external_exports.object({brandName:external_exports.string().min(1).max(120).optional(),primaryColor:hexColorSchema.optional(),secondaryColor:hexColorSchema.nullable().optional(),colorMode:colorModeSchema.optional(),logoUrl:external_exports.url().optional()});organizationBrandingSchema.omit({logoUrl:true});var checkTypeEnum=external_exports.enum(["collect_user_info","watchlist","background_us_criminal","background_global","id_verification","custom_form"]);var testHintEnum=external_exports.enum(["pass","review","fail","doc_quality"]);var STEP_ID_REGEX=/^step_[0-9A-Za-z_-]{1,64}$/;var ADDRESS_TEXT_REGEX=/^[^\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069<>]+$/;var safeAddressText=max=>external_exports.string().min(1).max(max).regex(ADDRESS_TEXT_REGEX,"invalid characters");external_exports.object({line1:safeAddressText(120),line2:safeAddressText(120).optional(),city:safeAddressText(80),region:safeAddressText(80).optional(),postalCode:external_exports.string().max(20).regex(/^[A-Za-z0-9 \-]*$/).optional(),country:external_exports.string().length(2).regex(/^[A-Z]{2}$/),placeId:external_exports.string().max(255).regex(/^[A-Za-z0-9_\-:]+$/).optional(),formatted:safeAddressText(500).optional()});var applicantSkipPolicySchema=external_exports.object({minAttemptsBeforeShown:external_exports.number().int().nonnegative().default(0),requireReason:external_exports.boolean().default(false)}).loose();var i18nLabelSchema=external_exports.record(external_exports.string(),external_exports.string());var stepConditionSchema=external_exports.object({field:external_exports.string(),operator:external_exports.enum(["eq","neq","in","not_in"]),value:external_exports.union([external_exports.string(),external_exports.array(external_exports.string())])}).optional();var workflowStepSchema=external_exports.object({checkType:checkTypeEnum,isRequired:external_exports.boolean().default(true),order:external_exports.number().int(),maxAttempts:external_exports.number().int().default(3),condition:stepConditionSchema,label:external_exports.string().optional()});external_exports.array(workflowStepSchema).min(1);var baseStepFields={id:external_exports.string().regex(STEP_ID_REGEX),order:external_exports.number().int().nonnegative(),isRequired:external_exports.boolean().default(true),applicantSkippable:external_exports.boolean().default(false),applicantSkipPolicy:applicantSkipPolicySchema.optional(),maxAttempts:external_exports.number().int().positive().default(3),label:i18nLabelSchema.optional(),description:i18nLabelSchema.optional(),dependsOn:external_exports.array(external_exports.string()).optional(),condition:external_exports.unknown().nullable().optional()};var backgroundConfigSchema=external_exports.object({jurisdictionScope:external_exports.enum(["us","eu","global"]).default("global"),recordTypesIncluded:external_exports.array(external_exports.enum(["criminal","sex_offender","adverse_media"])).min(1).default(["criminal"])}).default({jurisdictionScope:"global",recordTypesIncluded:["criminal"]});var watchlistConfigSchema=external_exports.object({lists:external_exports.array(external_exports.enum(["pep","ofac","eu","un"])).default([]),confidenceThreshold:external_exports.number().min(0).max(1).default(.8)}).default({lists:[],confidenceThreshold:.8});var COLLECT_USER_INFO_FIELDS=["email","phone","dob","address"];var collectUserInfoConfigSchema=external_exports.object({fields:external_exports.preprocess(raw=>{if(!Array.isArray(raw))return raw;return raw.filter(v=>v!=="name")},external_exports.array(external_exports.enum(COLLECT_USER_INFO_FIELDS))).default(["email","phone"]),captureStructuredName:external_exports.boolean().default(false)}).default({fields:["email","phone"],captureStructuredName:false});var idvDocumentTypeEnum=external_exports.enum(IDV_DOCUMENT_TYPES);var idVerificationConfigSchema=external_exports.object({documentTypes:idvDocumentTypeEnum.array().min(1).default([...IDV_DOCUMENT_TYPES]),biometricMode:external_exports.enum(["none","selfie","liveness"]).default("none"),requireMrzMatch:external_exports.boolean().default(false),requireExpiryValid:external_exports.boolean().default(true),requireNameMatch:external_exports.boolean().default(false),documentAuthenticity:external_exports.boolean().default(false),minAge:external_exports.number().int().min(0).max(150).optional()}).strict().default({documentTypes:[...IDV_DOCUMENT_TYPES],biometricMode:"none",requireMrzMatch:false,requireExpiryValid:true,requireNameMatch:false,documentAuthenticity:false});var watchlistStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("watchlist"),config:watchlistConfigSchema});var backgroundUsCriminalStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("background_us_criminal"),config:backgroundConfigSchema});var backgroundGlobalStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("background_global"),config:backgroundConfigSchema});var collectUserInfoStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("collect_user_info"),config:collectUserInfoConfigSchema});var idVerificationStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("id_verification"),config:idVerificationConfigSchema});var customFormScreenStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("custom_form"),config:customFormScreenConfigSchema});external_exports.discriminatedUnion("type",[watchlistStepSchema,backgroundUsCriminalStepSchema,backgroundGlobalStepSchema,collectUserInfoStepSchema,idVerificationStepSchema,customFormScreenStepSchema]);var captureBrandTokensSchema=external_exports.object({primary:hexColorSchema,primaryHover:hexColorSchema,onPrimary:hexColorSchema,secondary:hexColorSchema,onSecondary:hexColorSchema,ring:hexColorSchema}).strict();var captureThemeSchema=external_exports.object({colorMode:external_exports.enum(["light","dark"]),brandTokens:captureBrandTokensSchema.nullable().default(null)}).strict();var captureDocumentSideEnum=external_exports.enum(["front","back"]);var captureDocumentGroupEnum=external_exports.enum(["unknown","dl","id","passport","passport-card","visa"]);var captureErrorCodeEnum=external_exports.enum(["cv_gate_failed","upload_failed","sdk_load_failed","token_expired","biometric_unsupported","camera_unsupported","selfie_camera_denied","liveness_camera_denied","liveness_timeout","liveness_server_error","liveness_runtime_error","liveness_cancelled","protocol_mismatch"]);external_exports.enum(["no_face","multiple_faces","too_dark","move_closer","not_centered","hold_still","ready"]);var selfiePromptMapSchema=external_exports.object({no_face:external_exports.string().min(1).max(120).optional(),multiple_faces:external_exports.string().min(1).max(120).optional(),too_dark:external_exports.string().min(1).max(120).optional(),move_closer:external_exports.string().min(1).max(120).optional(),not_centered:external_exports.string().min(1).max(120).optional(),hold_still:external_exports.string().min(1).max(120).optional(),ready:external_exports.string().min(1).max(120).optional()}).strict();var selfieChromeCopySchema=external_exports.object({shutterLabel:external_exports.string().min(1).max(80).optional(),shutterHint:external_exports.string().min(1).max(120).optional(),confirm:external_exports.string().min(1).max(80).optional(),retake:external_exports.string().min(1).max(80).optional()}).strict();var captureInitMessageSchema=external_exports.object({type:external_exports.literal("capture:init"),captureToken:external_exports.string().min(1),config:idVerificationConfigSchema,locale:external_exports.string().min(2).max(35),theme:captureThemeSchema,mode:dataModeEnum.optional(),testHint:testHintEnum.optional(),protocolVersion:external_exports.number().int().min(1).optional(),beginScanPrompt:external_exports.string().min(1).max(200).optional(),beginScanLabel:external_exports.string().min(1).max(80).optional(),selfiePromptMap:selfiePromptMapSchema.optional(),selfieChromeCopy:selfieChromeCopySchema.optional()}).strict();external_exports.object({data:external_exports.object({captureToken:external_exports.string().min(1),embedOrigin:canonicalOriginSchema,runIndex:external_exports.number().int().min(0),expiresAt:external_exports.iso.datetime({offset:true}),embedContextToken:external_exports.string().min(1),mode:dataModeEnum.optional(),testHint:testHintEnum.optional()}).strict()}).strict();var captureReadyMessageSchema=external_exports.object({type:external_exports.literal("capture:ready")}).strict();var captureDocumentCompleteMessageSchema=external_exports.object({type:external_exports.literal("capture:document-complete"),side:captureDocumentSideEnum,r2Key:external_exports.string().min(1)}).strict();var captureSelfieCompleteMessageSchema=external_exports.object({type:external_exports.literal("capture:selfie-complete"),r2Key:external_exports.string().min(1)}).strict();var captureCoachingMessageSchema=external_exports.object({type:external_exports.literal("capture:coaching"),state:external_exports.string().min(1).max(120),attemptIndex:external_exports.number().int().min(0)}).strict();var captureSelfieCvRejectMessageSchema=external_exports.object({type:external_exports.literal("capture:selfie-cv-reject"),retryReason:external_exports.string().min(1).max(120).optional(),attemptIndex:external_exports.number().int().min(0)}).strict();var captureErrorMessageSchema=external_exports.object({type:external_exports.literal("capture:error"),code:captureErrorCodeEnum}).strict();var captureBiometricCameraLiveMessageSchema=external_exports.object({type:external_exports.literal("capture:biometric_camera_live"),timestamp:external_exports.number().optional()}).strict();var idvR2KeysSchema=external_exports.object({front:external_exports.string().min(1),back:external_exports.string().min(1).optional(),selfie:external_exports.string().min(1).optional()}).strict();var captureAllCompleteMessageSchema=external_exports.object({type:external_exports.literal("capture:all-complete"),r2Keys:idvR2KeysSchema,documentGroup:captureDocumentGroupEnum.optional()}).strict();external_exports.object({stepId:external_exports.string().min(1),runIndex:external_exports.number().int().min(0),r2Keys:idvR2KeysSchema,traceId:external_exports.string().optional()}).strict();external_exports.object({stepId:external_exports.string().min(1).optional()}).strict();var idvLivenessStsCredentialsSchema=external_exports.object({accessKeyId:external_exports.string().min(1),secretAccessKey:external_exports.string().min(1),sessionToken:external_exports.string().min(1),expiration:external_exports.string().min(1)}).strict();var livenessAwsRegionEnum=external_exports.enum(LivenessAwsRegions);external_exports.object({awsSessionId:external_exports.string().min(1),awsRegion:livenessAwsRegionEnum,credentials:idvLivenessStsCredentialsSchema}).strict();var captureBehaviorMessageSchema=external_exports.object({type:external_exports.literal("capture:behavior"),steps:external_exports.array(behaviorStepSchema).max(50),traits:behaviorTraitsSchema}).strict();var captureFromIframeMessageSchema=external_exports.discriminatedUnion("type",[captureReadyMessageSchema,captureDocumentCompleteMessageSchema,captureSelfieCompleteMessageSchema,captureCoachingMessageSchema,captureSelfieCvRejectMessageSchema,captureErrorMessageSchema,captureAllCompleteMessageSchema,captureBehaviorMessageSchema,captureBiometricCameraLiveMessageSchema]);external_exports.discriminatedUnion("type",[captureInitMessageSchema]);var idvCvGateRetryReasonEnum=external_exports.enum(["no_face_detected","multiple_faces","low_confidence","no_id_document","image_read_failed"]);external_exports.object({ok:external_exports.boolean(),retryReason:idvCvGateRetryReasonEnum.optional()}).strict();external_exports.enum(["front","back","selfie"]);function reducer(state,action){switch(action.type){case "mint_ok":return {kind:"waiting_for_init",captureToken:action.captureToken,embedOrigin:action.embedOrigin,runIndex:action.runIndex};case "mint_failed":return {kind:"mint_error"};case "iframe_ready":if(state.kind==="waiting_for_init"){return {kind:"ready",embedOrigin:state.embedOrigin,runIndex:state.runIndex}}return state;case "phase":if(state.kind==="ready"||state.kind==="capturing"){return {kind:"capturing",embedOrigin:state.embedOrigin,runIndex:state.runIndex,phase:action.phase,coaching:null,lastCvRejectReason:action.phase==="selfie"&&state.kind==="capturing"?state.lastCvRejectReason:null,biometricLoading:isBiometricPhase(action.phase)}}return state;case "coaching":if(state.kind==="ready"||state.kind==="capturing"){return {kind:"capturing",embedOrigin:state.embedOrigin,runIndex:state.runIndex,phase:"coaching",coaching:action.coaching,lastCvRejectReason:state.kind==="capturing"?state.lastCvRejectReason:null,biometricLoading:state.kind==="capturing"?state.biometricLoading:false}}return state;case "selfie_cv_reject":if(state.kind==="ready"||state.kind==="capturing"){return {kind:"capturing",embedOrigin:state.embedOrigin,runIndex:state.runIndex,phase:state.kind==="capturing"?state.phase:"selfie",coaching:state.kind==="capturing"?state.coaching:null,lastCvRejectReason:action.reason,biometricLoading:false}}return state;case "biometric_camera_live":if(state.kind==="capturing"){return {...state,biometricLoading:false}}return state;case "submitting":return {kind:"submitting"};case "submit_failed":return {kind:"submit_error"};case "submit_pending":return {kind:"submit_pending"};case "capture_superseded":return {kind:"capture_superseded"};case "token_expired":return {kind:"token_expired"};case "capture_error":return {kind:"capture_error",errorKind:action.errorKind};default:return state}}function nextCapturePhaseAfterDocument(side,documentTypes,biometricMode){if(side==="front"&&documentTypes.some(isTwoSidedDocumentType))return "document_back";if(biometricMode==="liveness")return "liveness";if(biometricMode==="selfie")return "selfie";return "uploading"}function isBiometricPhase(phase){return phase==="selfie"||phase==="liveness"}var RETRY_REASON_COACHING={no_face_detected:"hold_steady",multiple_faces:"hold_steady",low_confidence:"move_closer",no_id_document:"hold_steady",image_read_failed:"hold_steady"};function coachingKindForState(state){const retryParsed=idvCvGateRetryReasonEnum.safeParse(state);if(retryParsed.success)return RETRY_REASON_COACHING[retryParsed.data];switch(state){case "camera-too-far":return "move_closer";case "camera-too-close":case "document-too-close-to-frame-edge":return "move_farther";case "glare-detected":return "reduce_glare";case "too-dark":case "lighting-too-dark":return "too_dark";case "wrong-side":return "wrong_side";case "selfie_move_closer":return "move_closer";case "selfie_too_dark":return "too_dark";case "selfie_no_face":case "selfie_multiple_faces":case "selfie_not_centered":return "hold_steady";default:return "hold_steady"}}function createCaptureController(deps){let state={kind:"minting"};const stateListeners=new Set;const eventListeners=new Map;let captureToken=null;let pinnedOrigin=null;let runIndex=null;let started=false;let destroyed=false;let cancelled=false;let submitStarted=false;let messageListener=null;function setState(next){state=next;for(const listener of stateListeners)listener(state);}function dispatch(action){setState(reducer(state,action));}function emit(event){const listeners=eventListeners.get(event.type);if(listeners===void 0)return;for(const listener of listeners)listener(event);}function postInit(){if(destroyed||captureToken===null||pinnedOrigin===null)return false;const iframe=deps.getIframe();if(iframe===null||iframe.contentWindow===null)return false;const init={type:"capture:init",captureToken,...deps.initPayload()};iframe.contentWindow.postMessage(init,pinnedOrigin);return true}function handleMessage(msg){switch(msg.type){case "capture:ready":{const posted=postInit();if(posted&&state.kind==="waiting_for_init"){dispatch({type:"iframe_ready"});}return}case "capture:coaching":{dispatch({type:"coaching",coaching:coachingKindForState(msg.state)});deps.onCoaching?.(msg.state,msg.attemptIndex);return}case "capture:selfie-cv-reject":{const reason=msg.retryReason??null;dispatch({type:"selfie_cv_reject",reason});emit({type:"selfie-cv-reject",attemptIndex:msg.attemptIndex,reason});return}case "capture:document-complete":{const{config}=deps.initPayload();dispatch({type:"phase",phase:nextCapturePhaseAfterDocument(msg.side,config.documentTypes,config.biometricMode)});return}case "capture:selfie-complete":{dispatch({type:"phase",phase:"uploading"});return}case "capture:error":{if(msg.code==="token_expired"){dispatch({type:"token_expired"});return}dispatch({type:"capture_error",errorKind:msg.code});return}case "capture:all-complete":{void submitCapture(msg.r2Keys);return}case "capture:behavior":{deps.onBehaviorSegment?.({steps:msg.steps,traits:msg.traits});return}case "capture:biometric_camera_live":{dispatch({type:"biometric_camera_live"});return}default:{const _exhaustive=msg;return _exhaustive}}}async function submitCapture(r2Keys){if(submitStarted)return;submitStarted=true;if(runIndex===null){dispatch({type:"submit_failed"});return}if(deps.onBeforeSubmit){try{await deps.onBeforeSubmit();}catch{if(!destroyed)dispatch({type:"submit_failed"});return}if(destroyed)return}dispatch({type:"submitting"});let result;try{result=await deps.submit(runIndex,r2Keys);}catch{if(!destroyed)dispatch({type:"submit_failed"});return}if(destroyed)return;if(result.ok){emit({type:"all-complete",runIndex});return}if(result.reason==="token_expired"){dispatch({type:"token_expired"});return}if(result.reason==="signal_pending"){dispatch({type:"submit_pending"});return}if(result.reason==="capture_superseded"){dispatch({type:"capture_superseded"});return}dispatch({type:"submit_failed"});}function onWindowMessage(event){if(destroyed||pinnedOrigin===null)return;if(event.origin!==pinnedOrigin)return;if(event.source!==null&&event.source!==deps.getIframe()?.contentWindow)return;const parsed=captureFromIframeMessageSchema.safeParse(event.data);if(!parsed.success)return;handleMessage(parsed.data);}return {start(){if(destroyed||started)return;started=true;void(async()=>{try{const minted=await deps.mintToken();if(cancelled||destroyed)return;captureToken=minted.captureToken;pinnedOrigin=minted.embedOrigin;runIndex=minted.runIndex;messageListener=onWindowMessage;window.addEventListener("message",messageListener);dispatch({type:"mint_ok",...minted});}catch{if(cancelled||destroyed)return;dispatch({type:"mint_failed"});}})();},on(type,cb){let listeners=eventListeners.get(type);if(listeners===void 0){listeners=new Set;eventListeners.set(type,listeners);}listeners.add(cb);return ()=>{listeners?.delete(cb);}},subscribe(cb){stateListeners.add(cb);cb(state);return ()=>{stateListeners.delete(cb);}},handleReady(){if(destroyed)return;postInit();},destroy(){if(destroyed)return;destroyed=true;cancelled=true;if(messageListener!==null){window.removeEventListener("message",messageListener);messageListener=null;}}}}
5
-
6
- export { CURRENT_PROTOCOL_VERSION, coachingKindForState, createCaptureController, isBiometricPhase, nextCapturePhaseAfterDocument, reducer };
File without changes