@checktiv/sdk-web 1.9.0 → 1.12.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.
- package/README.md +16 -1
- package/dist/agents/AGENTS.md +8 -0
- package/dist/agents/manifest.json +24 -0
- package/dist/capture-ui.d.ts +4 -4
- package/dist/capture-ui.js +7 -6
- package/dist/capture.d.ts +3 -3
- package/dist/capture.js +4 -3
- package/dist/challenge.js +2 -2
- package/dist/chunk-3KEVZCCZ.js +3 -0
- package/dist/chunk-4HIQN4KL.js +3 -0
- package/dist/chunk-C7GRMEYT.js +3 -0
- package/dist/chunk-CAI3JWWU.js +12 -0
- package/dist/chunk-EOTGVXW6.js +7 -0
- package/dist/{chunk-HV2QKVJX.js → chunk-FQSJUWRP.js} +1 -1
- package/dist/{chunk-FL2GCRSI.js → chunk-HWABVMID.js} +4 -4
- package/dist/{chunk-MCYAWMYQ.js → chunk-KYV5BPCD.js} +2 -2
- package/dist/chunk-MLQ2HMTS.js +3 -0
- package/dist/chunk-O3JECGW2.js +3 -0
- package/dist/chunk-PB2THQ3P.js +8 -0
- package/dist/chunk-TKK5CTVG.js +59 -0
- package/dist/chunk-UVTAPUGQ.js +3 -0
- package/dist/chunk-VMWTID63.js +3 -0
- package/dist/{chunk-WC6TLR42.js → chunk-WALPQ6TH.js} +2 -1
- package/dist/chunk-YE2LWN74.js +9 -0
- package/dist/{chunk-XSSM5ZB7.js → chunk-ZU4L3NDZ.js} +1 -1
- package/dist/collect-user-info.d.ts +4 -4
- package/dist/collect-user-info.js +5 -5
- package/dist/{controller-Ta5RgFZ4.d.ts → controller-Dh-rSrot.d.ts} +3 -2
- package/dist/{copy-CEILzVXc.d.ts → copy-Bsb1n1Wv.d.ts} +1 -1
- package/dist/credit-history.d.ts +4 -0
- package/dist/credit-history.js +12 -0
- package/dist/cross-device.js +2 -2
- package/dist/custom-form.css +1 -1
- package/dist/custom-form.d.ts +3 -3
- package/dist/custom-form.js +7 -8
- package/dist/esign/ceremony-runtime.js +7 -0
- package/dist/esign.d.ts +16 -0
- package/dist/esign.js +427 -0
- package/dist/fraud.d.ts +3 -3
- package/dist/fraud.js +5 -6
- package/dist/idv/cross-device.d.ts +7 -7
- package/dist/idv/cross-device.js +4 -5
- package/dist/idv.d.ts +3 -3
- package/dist/idv.js +13 -13
- package/dist/index-CGH7LlPH.d.ts +736 -0
- package/dist/{index-G5mVvjNZ.d.ts → index-CZt19Km4.d.ts} +5 -5
- package/dist/index.d.ts +6 -6
- package/dist/index.js +8 -8
- package/dist/{machine-BhPiYmOR.d.ts → machine-EePe2ERe.d.ts} +49 -2
- package/dist/react.d.ts +4 -4
- package/dist/react.js +11 -11
- package/dist/workspace.d.ts +3 -3
- package/dist/workspace.js +2 -1
- package/package.json +35 -9
- package/dist/api-BrQqQbGK.d.ts +0 -342
- package/dist/chunk-523TT3PD.js +0 -7
- package/dist/chunk-7GP5REM7.js +0 -3
- package/dist/chunk-BBO2X73Y.js +0 -9
- package/dist/chunk-GFHNOZVO.js +0 -3
- package/dist/chunk-NHNGQ5BB.js +0 -66
- package/dist/chunk-S2OOEDJS.js +0 -3
- package/dist/chunk-T4R5TTE5.js +0 -7
- package/dist/chunk-WPMO4FQ2.js +0 -13
- package/dist/chunk-XOGHMNBX.js +0 -3
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { CREDIT_HISTORY_EVENT_TYPES, isChecktivCreditHistoryEvent } from './chunk-O3JECGW2.js';
|
|
2
|
+
import { resolveCaptureTheme } from './chunk-4HIQN4KL.js';
|
|
3
|
+
import { registerModule } from './chunk-VMWTID63.js';
|
|
4
|
+
import { withTokenRetry, createChecktivError } from './chunk-C7GRMEYT.js';
|
|
5
|
+
import { dataPlaneHeaders, TELEMETRY_PATH, isCanonicalOrigin } from './chunk-HFQJYEGZ.js';
|
|
6
|
+
import './chunk-QFA3K5ZV.js';
|
|
7
|
+
import { initTransport } from './chunk-UVTAPUGQ.js';
|
|
8
|
+
import './chunk-AIK7CDV6.js';
|
|
9
|
+
|
|
10
|
+
var CREDIT_CONTEXT_TOKEN_PATH="/sdk/v1/credit/context-token";var CREDIT_LOAD_FAILED_MESSAGE="The credit history form could not start on this device. Reload the page to try again, or open this page on another device.";var CREDIT_FRAME_MIN_HEIGHT_PX=200;var CREDIT_FRAME_MAX_HEIGHT_PX=2e4;var CREDIT_SCREENS=["consent","address_history","identity_and_title","review"];var CREDIT_SCREEN_COUNT=CREDIT_SCREENS.length;var SCREEN_SET=new Set(CREDIT_SCREENS);var ERROR_CODES=["load_failed","config_error","session_expired","submit_failed"];var ERROR_CODE_SET=new Set(ERROR_CODES);var SKIP_REASONS=["unsupported_jurisdiction"];var SKIP_REASON_SET=new Set(SKIP_REASONS);var CREDIT_COPY_KEY_BOUNDS={continueLabel:80,backLabel:80,submitLabel:80};var CREDIT_COPY_KEYS=["continueLabel","backLabel","submitLabel"];function boundedCopyValue(value,maxLen){if(typeof value!=="string")return null;if(value.length===0||value.length>maxLen)return null;return value}function projectCreditCopy(copy){if(copy===void 0)return null;const out={};for(const key of CREDIT_COPY_KEYS){const narrowed=boundedCopyValue(copy[key],CREDIT_COPY_KEY_BOUNDS[key]);if(narrowed!==null)out[key]=narrowed;}return Object.keys(out).length>0?out:null}function isFiniteNumber(value){return typeof value==="number"&&Number.isFinite(value)}function isBoundedInt(value,min,max){return isFiniteNumber(value)&&Number.isInteger(value)&&value>=min&&value<=max}function isBoundedNumber(value,min,max){return isFiniteNumber(value)&&value>=min&&value<=max}function isBoundedString(value,maxLen){return typeof value==="string"&&value.length<=maxLen}function isBoundedNullableString(value,maxLen){return value===null||isBoundedString(value,maxLen)}function asBehaviorStep(value){if(typeof value!=="object"||value===null)return null;const record={...value};const{stepId,seconds,pasteCount}=record;if(!isBoundedString(stepId,80))return null;if(!isBoundedNumber(seconds,0,86400))return null;if(!isBoundedInt(pasteCount,0,1e4))return null;return {stepId,seconds,pasteCount}}function asBehaviorTraits(value){if(typeof value!=="object"||value===null)return null;const record={...value};const{webdriver,maxTouchPoints,timezone,pluginCount,deviceModelHint}=record;if(typeof webdriver!=="boolean")return null;if(!isBoundedInt(maxTouchPoints,0,512))return null;if(!isBoundedNullableString(timezone,64))return null;if(!isBoundedInt(pluginCount,0,256))return null;if(!isBoundedNullableString(deviceModelHint,120))return null;return {webdriver,maxTouchPoints,timezone,pluginCount,deviceModelHint}}function asBehaviorSteps(value){if(!Array.isArray(value)||value.length>50)return null;const steps=[];for(const entry of value){const step=asBehaviorStep(entry);if(step===null)return null;steps.push(step);}return steps}function parseCreditInbound(data){if(typeof data!=="object"||data===null)return null;const record={...data};const type=record.type;if(type==="credit:ready")return {type:"credit:ready"};if(type==="credit:submitted")return {type:"credit:submitted"};if(type==="credit:declined")return {type:"credit:declined"};if(type==="credit:credential_expired")return {type:"credit:credential_expired"};if(type==="credit:resize"){const height=record.height;if(!isFiniteNumber(height))return null;return {type:"credit:resize",height}}if(type==="credit:screen_changed"){const{index,total,screen}=record;if(!isBoundedInt(index,0,CREDIT_SCREEN_COUNT-1))return null;if(!isBoundedInt(total,1,CREDIT_SCREEN_COUNT))return null;if(typeof screen!=="string"||!SCREEN_SET.has(screen))return null;const narrowed=CREDIT_SCREENS.find(candidate=>candidate===screen);if(narrowed===void 0)return null;return {type:"credit:screen_changed",index,total,screen:narrowed}}if(type==="credit:skipped"){const reason=record.reason;if(typeof reason!=="string"||!SKIP_REASON_SET.has(reason))return null;const narrowed=SKIP_REASONS.find(candidate=>candidate===reason);if(narrowed===void 0)return null;return {type:"credit:skipped",reason:narrowed}}if(type==="credit:error"){const code=record.code;if(typeof code!=="string"||!ERROR_CODE_SET.has(code))return null;const narrowed=ERROR_CODES.find(candidate=>candidate===code);if(narrowed===void 0)return null;return {type:"credit:error",code:narrowed}}if(type==="credit:behavior"){const steps=asBehaviorSteps(record.steps);if(steps===null)return null;const traits=asBehaviorTraits(record.traits);if(traits===null)return null;return {type:"credit:behavior",steps,traits}}return null}var CREDIT_FRAME_PATH="/credit";var CREDIT_CONTEXT_PARAM="ctx";var DEFAULT_READY_TIMEOUT_MS=15e3;var IFRAME_SANDBOX="allow-scripts allow-same-origin";var DEFAULT_FRAME_TITLE="Credit history check";var DEFAULT_LOCALE="en";var LOCALE_MIN_LENGTH=2;var LOCALE_MAX_LENGTH=35;var CREDIT_ERROR_MAP={load_failed:{code:"sdk_load_failed",message:CREDIT_LOAD_FAILED_MESSAGE},config_error:{code:"session_expired",message:"The credit history check step could not be set up for this session. Go back to the verification page and open the credit history check step again."},session_expired:{code:"session_expired",message:"The verification session this credit history check belongs to is no longer open. Go back to the verification page to see what happens next."},submit_failed:{code:"submit_failed",message:"The credit history check was not submitted and nothing you entered has been sent. Check the connection and select submit again."}};var RECONNECT_GIVE_UP={bootstrap_timeout:{code:"sdk_load_failed",message:"The credit history form could not start. Reload the page to try again, or open this page on another device."},credential_expired:{code:"session_expired",message:"The credit history check could not be restarted. Go back to the verification page and open the credit history check step again."}};var BOOTSTRAP_MINT_FAILURE={code:"session_expired",message:"The credit history check could not be started. Go back to the verification page and open the credit history check step again."};var ORIGIN_MOVED={code:"origin_not_allowed",message:"The credit history check could not be restarted safely. Go back to the verification page and open the credit history check step again."};function createDefaultScheduler(){const ticket=Symbol("credit-ready-timeout");let live=null;return {set(callback,ms){live=setTimeout(callback,ms);return ticket},clear(handle){if(handle!==ticket||live===null)return;clearTimeout(live);live=null;}}}function buildFrameSrc(embedOrigin,contextToken){return `${embedOrigin}${CREDIT_FRAME_PATH}?${CREDIT_CONTEXT_PARAM}=${encodeURIComponent(contextToken)}`}function creditError(entry){return {...createChecktivError(entry.code),message:entry.message}}function clampFrameHeight(height){const rounded=Math.ceil(height);if(rounded<CREDIT_FRAME_MIN_HEIGHT_PX)return CREDIT_FRAME_MIN_HEIGHT_PX;if(rounded>CREDIT_FRAME_MAX_HEIGHT_PX)return CREDIT_FRAME_MAX_HEIGHT_PX;return rounded}function normalizeLocale(locale){if(locale.length<LOCALE_MIN_LENGTH||locale.length>LOCALE_MAX_LENGTH){return DEFAULT_LOCALE}return locale}function createCreditHistory(options){const doc=options.target.ownerDocument;const scheduler=options.schedule??createDefaultScheduler();const readyTimeoutMs=options.readyTimeoutMs??DEFAULT_READY_TIMEOUT_MS;let started=false;let destroyed=false;let transport=null;let readyTimer=null;let pinnedOrigin=null;let frame=null;let container=null;let bootstrapRemintUsed=false;let credentialRemintUsed=false;function emit(event){if(destroyed)return;try{options.onEvent?.(event);}catch{}}function clearReadyTimeout(){if(readyTimer===null)return;scheduler.clear(readyTimer);readyTimer=null;}function fail(entry){clearReadyTimeout();emit({type:"checktiv.credit_history.error",error:creditError(entry)});}function armReadyTimeout(){clearReadyTimeout();readyTimer=scheduler.set(()=>{readyTimer=null;onReadyTimeout();},readyTimeoutMs);}function buildInit(){const copy=projectCreditCopy(options.copy);const base={type:"credit:init",locale:normalizeLocale(options.locale),theme:options.theme};return copy===null?base:{...base,copy}}function applyHeight(height){if(frame===null)return;frame.style.height=`${clampFrameHeight(height)}px`;}function scrollFrameIntoView(){if(frame===null)return;if(typeof frame.scrollIntoView!=="function")return;frame.scrollIntoView({block:"start"});}function relayBehavior(segment){try{options.onBehaviorSegment?.(segment);}catch{}}async function reconnect(reason){if(destroyed)return;clearReadyTimeout();emit({type:"checktiv.credit_history.reconnecting",reason});let minted;try{minted=await options.mintContext();}catch{if(!destroyed)fail(RECONNECT_GIVE_UP[reason]);return}if(destroyed||frame===null)return;if(minted.embedOrigin!==pinnedOrigin){fail(ORIGIN_MOVED);return}frame.src=buildFrameSrc(minted.embedOrigin,minted.creditContextToken);armReadyTimeout();}function onReadyTimeout(){if(destroyed)return;if(bootstrapRemintUsed){fail(RECONNECT_GIVE_UP.bootstrap_timeout);return}bootstrapRemintUsed=true;void reconnect("bootstrap_timeout");}function onCredentialExpired(){if(destroyed)return;if(credentialRemintUsed){fail(RECONNECT_GIVE_UP.credential_expired);return}credentialRemintUsed=true;void reconnect("credential_expired");}function handleMessage(message,post){switch(message.type){case "credit:ready":{clearReadyTimeout();post(buildInit());emit({type:"checktiv.credit_history.ready"});return}case "credit:resize":{applyHeight(message.height);return}case "credit:screen_changed":{scrollFrameIntoView();emit({type:"checktiv.credit_history.screen",screen:message.screen,index:message.index,total:message.total});return}case "credit:submitted":{emit({type:"checktiv.credit_history.submitted",sessionId:options.sessionId});return}case "credit:declined":{emit({type:"checktiv.credit_history.declined"});return}case "credit:skipped":{emit({type:"checktiv.credit_history.skipped",reason:message.reason});return}case "credit:error":{fail(CREDIT_ERROR_MAP[message.code]);return}case "credit:credential_expired":{onCredentialExpired();return}case "credit:behavior":{relayBehavior({steps:message.steps,traits:message.traits});return}default:{const exhaustive=message;return exhaustive}}}function mountFrame(){const box=doc.createElement("div");box.style.width="100%";options.target.appendChild(box);container=box;const el=doc.createElement("iframe");el.setAttribute("title",options.frameTitle??DEFAULT_FRAME_TITLE);el.setAttribute("sandbox",IFRAME_SANDBOX);el.setAttribute("referrerpolicy","no-referrer");el.style.width="100%";el.style.border="0";el.style.display="block";el.style.minHeight=`${CREDIT_FRAME_MIN_HEIGHT_PX}px`;box.appendChild(el);return el}return {start(){if(destroyed||started)return;started=true;frame=mountFrame();void(async()=>{let minted;try{minted=await options.mintContext();}catch{if(!destroyed)fail(BOOTSTRAP_MINT_FAILURE);return}if(destroyed||frame===null)return;pinnedOrigin=minted.embedOrigin;transport=initTransport({win:options.win,allowedOrigins:[pinnedOrigin],parse:parseCreditInbound,expectedSource:()=>frame?.contentWindow??null,onMessage:(message,post)=>{handleMessage(message,post);}});frame.src=buildFrameSrc(pinnedOrigin,minted.creditContextToken);armReadyTimeout();})();},destroy(){if(destroyed)return;destroyed=true;clearReadyTimeout();transport?.teardown();transport=null;container?.remove();container=null;frame=null;}}}function isRecord(value){return typeof value==="object"&&value!==null}function parseCreditContextMint(body){if(!isRecord(body)||!isRecord(body.data))return null;const d=body.data;const creditContextToken=d.credit_context_token;const embedOrigin=d.embed_origin;const expiresAt=d.expires_at;if(typeof creditContextToken!=="string"||creditContextToken.length===0)return null;if(!isCanonicalOrigin(embedOrigin))return null;if(typeof expiresAt!=="string"||expiresAt.length===0)return null;return {creditContextToken,embedOrigin,expiresAt}}async function mintCreditContext(ctx,fetchImpl,stepId){const res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+CREDIT_CONTEXT_TOKEN_PATH,{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({stepId})}));if(!res.ok)throw new Error("credit context mint refused");const mint=parseCreditContextMint(await res.json());if(mint===null)throw new Error("credit context mint unreadable");return mint}var CREDIT_STEP_TYPE="credit_history";var SCREEN_ADVANCED_EVENT="kyc.step.screen_advanced";var DECLINED_EVENT="kyc.step.declined_by_applicant";function buildCreditTelemetryEvent(event,session,now){switch(event.type){case "checktiv.credit_history.screen":return {event:SCREEN_ADVANCED_EVENT,sessionId:session.sessionId,stepId:session.stepId,ts:now(),payload:{stepType:CREDIT_STEP_TYPE,screen:event.screen,index:event.index,total:event.total}};case "checktiv.credit_history.declined":return {event:DECLINED_EVENT,sessionId:session.sessionId,stepId:session.stepId,ts:now(),payload:{stepType:CREDIT_STEP_TYPE}};case "checktiv.credit_history.ready":case "checktiv.credit_history.reconnecting":case "checktiv.credit_history.submitted":case "checktiv.credit_history.skipped":case "checktiv.credit_history.error":return null;default:{const exhaustive=event;return exhaustive}}}function postCreditTelemetry(ctx,fetchImpl,event){void withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+TELEMETRY_PATH,{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({events:[event]})})).catch(()=>void 0);}function resolveTargetElement(target){if(typeof target!=="string")return target;if(typeof document==="undefined")return null;return document.querySelector(target)}function createCreditHistoryModule(ctx,opts){const win=opts.win??(typeof window!=="undefined"?window:null);const target=resolveTargetElement(opts.target);if(win===null||target===null){return {destroy:()=>void 0}}const fetchImpl=opts.fetchImpl??fetch;const stepId=opts.session.stepId;const controller=createCreditHistory({win,target,sessionId:opts.session.sessionId,locale:ctx.locale,theme:resolveCaptureTheme(ctx.theme),...opts.copy!==void 0?{copy:opts.copy}:{},...opts.frameTitle!==void 0?{frameTitle:opts.frameTitle}:{},...opts.onBehaviorSegment!==void 0?{onBehaviorSegment:opts.onBehaviorSegment}:{},onEvent:event=>{const row=buildCreditTelemetryEvent(event,opts.session,()=>Date.now());if(row!==null)postCreditTelemetry(ctx,fetchImpl,row);opts.onEvent?.(event);},mintContext:()=>mintCreditContext(ctx,fetchImpl,stepId)});controller.start();return {destroy:()=>controller.destroy()}}registerModule("credit_history",createCreditHistoryModule);
|
|
11
|
+
|
|
12
|
+
export { CREDIT_FRAME_MAX_HEIGHT_PX, CREDIT_FRAME_MIN_HEIGHT_PX, CREDIT_SCREENS, CREDIT_SCREEN_COUNT, clampFrameHeight, createCreditHistory, createCreditHistoryModule, parseCreditInbound, projectCreditCopy };
|
package/dist/cross-device.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { l, R, k } from './chunk-
|
|
1
|
+
import { l, R, k } from './chunk-3KEVZCCZ.js';
|
|
2
2
|
import './chunk-AIK7CDV6.js';
|
|
3
3
|
import qrcode from 'qrcode-generator';
|
|
4
4
|
|
|
5
|
-
var t;var r;var u;var i;var o=0;var f=[];var c=l;var e=c.__b;var a=c.__r;var v=c.diffed;var l2=c.__c;var m=c.unmount;var
|
|
5
|
+
var t;var r;var u;var i;var o=0;var f=[];var c=l;var e=c.__b;var a=c.__r;var v=c.diffed;var l2=c.__c;var m=c.unmount;var p=c.__;function s(n,t2){c.__h&&c.__h(r,n,o||t2),o=0;var u2=r.__H||(r.__H={__:[],__h:[]});return n>=u2.__.length&&u2.__.push({}),u2.__[n]}function d(n){return o=1,y(D,n)}function y(n,u2,i2){var o2=s(t++,2);if(o2.t=n,!o2.__c&&(o2.__=[D(void 0,u2),function(n2){var t2=o2.__N?o2.__N[0]:o2.__[0],r2=o2.t(t2,n2);t2!==r2&&(o2.__N=[r2,o2.__[1]],o2.__c.setState({}));}],o2.__c=r,!r.__f)){var f2=function(n2,t2,r2){if(!o2.__c.__H)return true;var u3=false,i3=o2.__c.props!==n2;if(o2.__c.__H.__.some(function(n3){if(n3.__N){u3=true;var t3=n3.__[0];n3.__=n3.__N,n3.__N=void 0,t3!==n3.__[0]&&(i3=true);}}),c2){var f3=c2.call(this,n2,t2,r2);return u3?f3||i3:f3}return !u3||i3};r.__f=true;var c2=r.shouldComponentUpdate,e2=r.componentWillUpdate;r.componentWillUpdate=function(n2,t2,r2){if(this.__e){var u3=c2;c2=void 0,f2(n2,t2,r2),c2=u3;}e2&&e2.call(this,n2,t2,r2);},r.shouldComponentUpdate=f2;}return o2.__N||o2.__}function A(n){return o=5,T(function(){return {current:n}},[])}function T(n,r2){var u2=s(t++,7);return C(u2.__H,r2)&&(u2.__=n(),u2.__H=r2,u2.__h=n),u2.__}function j(){for(var n;n=f.shift();){var t2=n.__H;if(n.__P&&t2)try{t2.__h.some(z),t2.__h.some(B),t2.__h=[];}catch(r2){t2.__h=[],c.__e(r2,n.__v);}}}c.__b=function(n){r=null,e&&e(n);},c.__=function(n,t2){n&&t2.__k&&t2.__k.__m&&(n.__m=t2.__k.__m),p&&p(n,t2);},c.__r=function(n){a&&a(n),t=0;var i2=(r=n.__c).__H;i2&&(u===r?(i2.__h=[],r.__h=[],i2.__.some(function(n2){n2.__N&&(n2.__=n2.__N),n2.u=n2.__N=void 0;})):(i2.__h.some(z),i2.__h.some(B),i2.__h=[],t=0)),u=r;},c.diffed=function(n){v&&v(n);var t2=n.__c;t2&&t2.__H&&(t2.__H.__h.length&&(1!==f.push(t2)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t2.__H.__.some(function(n2){n2.u&&(n2.__H=n2.u,n2.u=void 0);})),u=r=null;},c.__c=function(n,t2){t2.some(function(n2){try{n2.__h.some(z),n2.__h=n2.__h.filter(function(n3){return !n3.__||B(n3)});}catch(r2){t2.some(function(n3){n3.__h&&(n3.__h=[]);}),t2=[],c.__e(r2,n2.__v);}}),l2&&l2(n,t2);},c.unmount=function(n){m&&m(n);var t2,r2=n.__c;r2&&r2.__H&&(r2.__H.__.some(function(n2){try{z(n2);}catch(n3){t2=n3;}}),r2.__H=void 0,t2&&c.__e(t2,r2.__v));};var k2="function"==typeof requestAnimationFrame;function w(n){var t2,r2=function(){clearTimeout(u2),k2&&cancelAnimationFrame(t2),setTimeout(n);},u2=setTimeout(r2,35);k2&&(t2=requestAnimationFrame(r2));}function z(n){var t2=r,u2=n.__c;"function"==typeof u2&&(n.__c=void 0,u2()),r=t2;}function B(n){var t2=r;n.__c=n.__(),r=t2;}function C(n,t2){return !n||n.length!==t2.length||t2.some(function(t3,r2){return t3!==n[r2]})}function D(n,t2){return "function"==typeof t2?t2(n):t2}var CELL_SIZE=4;var MARGIN=4;function QrCodeSvg({url,alt,size}){const qr=qrcode(0,"M");qr.addData(url);qr.make();const count=qr.getModuleCount();const totalCells=count+MARGIN*2;const targetSize=size??totalCells*CELL_SIZE;const cellPx=Math.max(1,Math.floor(targetSize/totalCells));const svgSize=cellPx*totalCells;const marginPx=MARGIN*cellPx;const rects=[];for(let row=0;row<count;row++){for(let col=0;col<count;col++){if(qr.isDark(row,col)){rects.push(k("rect",{key:`${row}-${col}`,x:marginPx+col*cellPx,y:marginPx+row*cellPx,width:cellPx,height:cellPx,fill:"currentColor"}));}}}return k("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:`0 0 ${svgSize} ${svgSize}`,width:svgSize,height:svgSize,role:"img","aria-label":alt??"QR code",style:{color:"#000",background:"#fff"}},...rects)}var STYLE_ELEMENT_ID="ctv-xdev-styles";var STYLESHEET=`
|
|
6
6
|
.ctv-xdev {
|
|
7
7
|
display: flex;
|
|
8
8
|
flex-direction: column;
|
package/dist/custom-form.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.checktiv-cf-field{display:flex;flex-direction:column;gap:0.375rem;margin-bottom:1rem}.checktiv-cf-label{font-size:0.875rem;font-weight:500;color:var(--theme-on-surface-1, #16181d)}.checktiv-cf-help{margin:0;font-size:0.8125rem;color:var(--theme-on-surface-1-muted, rgba(22, 24, 29, 0.62))}.checktiv-cf-input,.checktiv-cf-select{width:100%;box-sizing:border-box;padding:0.5rem 0.75rem;font-size:
|
|
1
|
+
.checktiv-cf-field{display:flex;flex-direction:column;gap:0.375rem;margin-bottom:1rem}.checktiv-cf-label{font-size:0.875rem;font-weight:500;color:var(--theme-on-surface-1, #16181d)}.checktiv-cf-help{margin:0;font-size:0.8125rem;color:var(--theme-on-surface-1-muted, rgba(22, 24, 29, 0.62))}.checktiv-cf-input,.checktiv-cf-select{width:100%;box-sizing:border-box;padding:0.5rem 0.75rem;font-size:max(16px,var(--font-size-base, 15px));font-family:inherit;line-height:1.5;color:var(--theme-on-surface-1, #16181d);background-color:var(--theme-surface-1, #ffffff);border:1px solid var(--theme-border-strong, rgba(22, 24, 29, 0.18));border-radius:var(--theme-button-border-radius, 0.4rem);outline:none;transition:border-color 0.15s ease,box-shadow 0.15s ease}.checktiv-cf-input[type=date]{min-width:0;max-width:100%}.checktiv-cf-input::placeholder{color:var(--theme-on-surface-1-muted, rgba(22, 24, 29, 0.62))}textarea.checktiv-cf-input{min-height:6rem;resize:vertical}.checktiv-cf-input:focus,.checktiv-cf-select:focus{border-color:var(--theme-primary, #2563eb);box-shadow:0 0 0 3px var(--theme-ring, rgba(37, 99, 235, 0.35))}.checktiv-cf-multiselect input[type=checkbox],.checktiv-cf-radio{width:1rem;height:1rem;accent-color:var(--theme-primary, #2563eb)}.checktiv-cf-radiogroup{display:flex;flex-direction:row;gap:1.25rem;margin:0;padding:0;border:0}.checktiv-cf-radio-option{display:inline-flex;align-items:center;gap:0.5rem;font-size:0.9375rem;color:var(--theme-on-surface-1, #16181d);cursor:pointer}.checktiv-cf-multiselect{display:flex;flex-direction:column;gap:0.375rem}.checktiv-cf-option{display:flex;align-items:center;gap:0.5rem;font-size:0.9375rem;color:var(--theme-on-surface-1, #16181d)}.checktiv-cf-file{width:100%;box-sizing:border-box;padding:0.5rem 0.75rem;font-size:0.9375rem;font-family:inherit;color:var(--theme-on-surface-1, #16181d);background-color:var(--theme-surface-1, #ffffff);border:1px dashed var(--theme-border-strong, rgba(22, 24, 29, 0.18));border-radius:var(--theme-button-border-radius, 0.4rem)}.checktiv-cf-error{margin:0.125rem 0 0;font-size:0.8125rem;line-height:1.4;color:var(--theme-danger, #dc2626)}.checktiv-cf-input[aria-invalid=true],.checktiv-cf-select[aria-invalid=true],.checktiv-cf-file[aria-invalid=true]{border-color:var(--theme-danger, #dc2626)}.checktiv-cf-input[aria-invalid=true]:focus,.checktiv-cf-select[aria-invalid=true]:focus{border-color:var(--theme-danger, #dc2626);box-shadow:0 0 0 3px var(--theme-danger, #dc2626)}.checktiv-cf-heading{margin:1rem 0 0.5rem;font-size:1.125rem;font-weight:600;color:var(--theme-on-surface-1, #16181d)}.checktiv-cf-paragraph{margin:0 0 1rem;font-size:0.9375rem;line-height:1.6;color:var(--theme-on-surface-1-muted, rgba(22, 24, 29, 0.62))}.checktiv-cf-submit{display:inline-flex;align-items:center;justify-content:center;padding:0.5rem 1.25rem;font-size:0.9375rem;font-weight:600;font-family:inherit;color:var(--theme-on-primary, #ffffff);background-color:var(--theme-primary, #2563eb);border:none;border-radius:var(--theme-button-border-radius, 0.4rem);cursor:pointer;transition:background-color 0.15s ease}.checktiv-cf-submit:hover:not(:disabled){background-color:var(--theme-primary-hover, #1d4ed8)}.checktiv-cf-submit:disabled{opacity:0.55;cursor:not-allowed}.checktiv-cf-submit[aria-busy=true]{cursor:progress}.checktiv-cf-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
|
package/dist/custom-form.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
2
|
-
import './machine-
|
|
3
|
-
import './copy-
|
|
1
|
+
export { aI as ChecktivCustomFormEvent, aJ as CustomFormChunkModule, aK as CustomFormCopy, aL as CustomFormFieldCopy, aM as CustomFormHandle, aN as CustomFormMountOptions, aO as createCustomForm } from './index-CGH7LlPH.js';
|
|
2
|
+
import './machine-EePe2ERe.js';
|
|
3
|
+
import './copy-Bsb1n1Wv.js';
|
|
4
4
|
import './copy-DCeQ4JKx.js';
|
package/dist/custom-form.js
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { warnWrongTokenPlane, isRecord, isJourneyPlaneBody } from './chunk-
|
|
1
|
+
import { u } from './chunk-FQSJUWRP.js';
|
|
2
|
+
import { R, k, S } from './chunk-3KEVZCCZ.js';
|
|
3
|
+
import { warnWrongTokenPlane, isRecord, isJourneyPlaneBody } from './chunk-EOTGVXW6.js';
|
|
4
|
+
import './chunk-IQKHRPJR.js';
|
|
4
5
|
import { assertNever } from './chunk-UBQTPS5J.js';
|
|
5
|
-
import {
|
|
6
|
+
import { registerModule } from './chunk-VMWTID63.js';
|
|
7
|
+
import { withTokenRetry, isChecktivError, createChecktivError, mapHttpStatusToError } from './chunk-C7GRMEYT.js';
|
|
6
8
|
import { SESSIONS_ME_PATH, dataPlaneHeaders, stepSubmitPath, formUploadUrlPath } from './chunk-HFQJYEGZ.js';
|
|
7
|
-
import { u } from './chunk-HV2QKVJX.js';
|
|
8
|
-
import { R, k, S } from './chunk-XOGHMNBX.js';
|
|
9
|
-
import './chunk-IQKHRPJR.js';
|
|
10
9
|
import './chunk-QFA3K5ZV.js';
|
|
11
10
|
import './chunk-AIK7CDV6.js';
|
|
12
11
|
|
|
13
|
-
function describedBy(props){const ids=[];if(props.copy?.helpText!==void 0)ids.push(`${props.id}-help`);if(props.error!==void 0)ids.push(`${props.id}-error`);return ids.length>0?ids.join(" "):void 0}function ariaInvalid(props){return props.error!==void 0?"true":void 0}function labelText(props){return props.copy?.label??props.field.id}function labelIdFor(controlId){return `${controlId}-label`}function FieldShell(props,control){const help=props.copy?.helpText;return u("div",{class:"checktiv-cf-field",children:[u("label",{id:labelIdFor(props.id),for:props.id,class:"checktiv-cf-label",children:labelText(props)}),help!==void 0?u("p",{id:`${props.id}-help`,class:"checktiv-cf-help",children:help}):null,control,props.error!==void 0?u("p",{id:`${props.id}-error`,class:"checktiv-cf-error",role:"alert",children:props.error}):null]})}function asText(value){return typeof value==="string"?value:""}function asInputValue(value){return typeof value==="number"?String(value):asText(value)}function inputTypeFor(type){switch(type){case "email":return "email";case "phone":return "tel";case "date":return "date";case "number":return "number";default:return "text"}}function renderTextLike(props){const{field}=props;const onInput=e=>{const target=e.target;if(field.type==="number"){const input=target;props.onChange(input.value===""||Number.isNaN(input.valueAsNumber)?void 0:input.valueAsNumber);return}props.onChange(target.value);};if(field.type==="long_text"){return FieldShell(props,u("textarea",{id:props.id,name:field.id,required:field.required,class:"checktiv-cf-input",value:asInputValue(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onInput,onBlur:props.onBlur}))}return FieldShell(props,u("input",{id:props.id,name:field.id,type:inputTypeFor(field.type),required:field.required,class:"checktiv-cf-input",value:asInputValue(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onInput,onBlur:props.onBlur}))}function renderBoolean(props){const yesId=`${props.id}-yes`;const noId=`${props.id}-no`;return FieldShell(props,u("fieldset",{class:"checktiv-cf-radiogroup",role:"radiogroup","aria-labelledby":labelIdFor(props.id),"aria-required":props.field.required?"true":void 0,"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),children:[u("label",{for:yesId,class:"checktiv-cf-radio-option",children:[u("input",{id:yesId,name:props.field.id,type:"radio",class:"checktiv-cf-radio",checked:props.value===true,onChange:e=>{if(e.target.checked)props.onChange(true);}}),props.booleanYes]}),u("label",{for:noId,class:"checktiv-cf-radio-option",children:[u("input",{id:noId,name:props.field.id,type:"radio",class:"checktiv-cf-radio",checked:props.value===false,onChange:e=>{if(e.target.checked)props.onChange(false);}}),props.booleanNo]})]}))}function optionLabel(props,value){return props.copy?.options?.[value]??value}function renderSingleSelect(props){const options=props.field.options??[];return FieldShell(props,u("select",{id:props.id,name:props.field.id,required:props.field.required,class:"checktiv-cf-select",value:asText(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onChange:e=>props.onChange(e.target.value),children:[u("option",{value:"",children:""}),options.map(o=>u("option",{value:o.value,children:optionLabel(props,o.value)}))]}))}function renderMultiSelect(props){const options=props.field.options??[];const selected=Array.isArray(props.value)?props.value:[];const toggle=(value,checked)=>{const next=checked?[...selected,value]:selected.filter(v=>v!==value);props.onChange(next);};return FieldShell(props,u("div",{class:"checktiv-cf-multiselect",role:"group","aria-labelledby":labelIdFor(props.id),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),children:options.map(o=>u("label",{class:"checktiv-cf-option",children:[u("input",{type:"checkbox",name:props.field.id,value:o.value,checked:selected.includes(o.value),onChange:e=>toggle(o.value,e.target.checked)}),optionLabel(props,o.value)]}))}))}function renderFileUpload(props){return FieldShell(props,u("input",{id:props.id,name:props.field.id,type:"file",class:"checktiv-cf-file",required:props.field.required,"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onChange:e=>{const files=e.target.files;props.onFile(files&&files.length>0?files[0]:null);}}))}function renderContent(props){const text=props.copy?.label??props.field.id;return props.field.type==="content_heading"?u("h2",{class:"checktiv-cf-heading",children:text}):u("p",{class:"checktiv-cf-paragraph",children:text})}function renderField(props){switch(props.field.type){case "short_text":case "long_text":case "email":case "phone":case "date":case "number":return renderTextLike(props);case "boolean":return renderBoolean(props);case "single_select":return renderSingleSelect(props);case "multi_select":return renderMultiSelect(props);case "file_upload":return renderFileUpload(props);case "content_heading":case "content_paragraph":return renderContent(props);default:{const _exhaustive=props.field.type;return _exhaustive}}}var CLIENT_PHONE_RE=/^\+?[0-9 ().-]{6,24}$/;var CLIENT_EMAIL_RE=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function isEmptyAnswer(answer){if(answer===void 0)return true;if(typeof answer==="string")return answer.length===0;if(Array.isArray(answer))return answer.length===0;return false}function validateField(field,answer){const requiredIfEmpty=()=>isEmptyAnswer(answer)?field.required?"required":void 0:void 0;switch(field.type){case "short_text":case "long_text":case "date":case "file_upload":return requiredIfEmpty();case "boolean":return field.required&&answer===void 0?"required":void 0;case "email":{if(isEmptyAnswer(answer))return field.required?"required":void 0;return typeof answer==="string"&&!CLIENT_EMAIL_RE.test(answer)?"invalid_email":void 0}case "phone":{if(isEmptyAnswer(answer))return field.required?"required":void 0;return typeof answer==="string"&&!CLIENT_PHONE_RE.test(answer)?"invalid_phone":void 0}case "number":{if(isEmptyAnswer(answer))return field.required?"required":void 0;if(typeof answer!=="number")return void 0;const min=field.validation?.min;const max=field.validation?.max;if(min!==void 0&&answer<min)return "out_of_range";if(max!==void 0&&answer>max)return "out_of_range";return void 0}case "single_select":{if(isEmptyAnswer(answer))return field.required?"required":void 0;const options=field.options??[];if(typeof answer==="string"&&options.length>0){return options.some(o=>o.value===answer)?void 0:"invalid_option"}return void 0}case "multi_select":{const selected=Array.isArray(answer)?answer:[];if(selected.length===0)return field.required?"required":void 0;const min=field.validation?.minSelections;const max=field.validation?.maxSelections;if(min!==void 0&&selected.length<min)return "out_of_range";if(max!==void 0&&selected.length>max)return "out_of_range";return void 0}case "content_heading":case "content_paragraph":return void 0;default:return assertNever(field.type)}}function collectAnswers(answers){const blob={};for(const[fieldId,value]of answers){if(value===void 0)continue;if(typeof value==="string"&&value.length===0)continue;blob[fieldId]=value;}return blob}function isRecord2(v){return typeof v==="object"&&v!==null}function parseUploadTarget(body){if(!isRecord2(body)||!isRecord2(body.data))return null;const d=body.data;const uploadUrl=d.upload_url;const r2Key=d.r2_key;if(typeof uploadUrl!=="string"||uploadUrl.length===0)return null;if(typeof r2Key!=="string"||r2Key.length===0)return null;return {uploadUrl,r2Key}}function extensionOf(fileName){const dot=fileName.lastIndexOf(".");if(dot<0||dot===fileName.length-1)return "";return fileName.slice(dot+1).toLowerCase()}async function uploadFormFile(ctx,fetchImpl,stepId,fieldId,file){const origin=ctx.apiBaseOrigin;let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+formUploadUrlPath(stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({fieldId,ext:extensionOf(file.name),contentLength:file.size})}),result=>result?.status===401);}catch{return null}if(!res.ok)return null;let body;try{body=await res.json();}catch{return null}const target=parseUploadTarget(body);if(target===null)return null;let putRes;try{putRes=await fetchImpl(target.uploadUrl,{method:"PUT",headers:{"content-type":file.type||"application/octet-stream"},body:file});}catch{return null}if(!putRes.ok)return null;return target.r2Key}var FALLBACK={submit:"Continue",requiredError:"This field is required.",invalidPhoneError:"Enter a valid phone number.",invalidEmailError:"Enter a valid email address.",invalidDateError:"Enter a valid date.",invalidOptionError:"Choose one of the available options.",outOfRangeError:"That value is outside the allowed range.",invalidFormatError:"That value is not in the expected format.",invalidError:"That value is not valid.",validationError:"Some answers could not be accepted. Review your entries and try again.",uploadError:"That file could not be uploaded. Choose the file and try again.",submitError:"Something went wrong submitting the form. Please try again.",booleanYes:"Yes",booleanNo:"No"};function resolveCopy(copy){return {submit:copy?.submit??FALLBACK.submit,requiredError:copy?.requiredError??FALLBACK.requiredError,invalidPhoneError:copy?.invalidPhoneError??FALLBACK.invalidPhoneError,invalidEmailError:copy?.invalidEmailError??FALLBACK.invalidEmailError,invalidDateError:copy?.invalidDateError??FALLBACK.invalidDateError,invalidOptionError:copy?.invalidOptionError??FALLBACK.invalidOptionError,outOfRangeError:copy?.outOfRangeError??FALLBACK.outOfRangeError,invalidFormatError:copy?.invalidFormatError??FALLBACK.invalidFormatError,invalidError:copy?.invalidError??FALLBACK.invalidError,validationError:copy?.validationError??FALLBACK.validationError,uploadError:copy?.uploadError??FALLBACK.uploadError,submitError:copy?.submitError??FALLBACK.submitError,booleanYes:copy?.booleanYes??FALLBACK.booleanYes,booleanNo:copy?.booleanNo??FALLBACK.booleanNo}}function messageForReason(chrome,reason){const byReason={required:chrome.requiredError,invalid_phone:chrome.invalidPhoneError,invalid_email:chrome.invalidEmailError,invalid_date:chrome.invalidDateError,invalid_option:chrome.invalidOptionError,out_of_range:chrome.outOfRangeError,invalid_format:chrome.invalidFormatError,invalid:chrome.invalidError};return byReason[reason]}var CUSTOM_FORM_FIELD_ERROR_REASONS=["required","invalid_phone","invalid_email","invalid_date","invalid_option","out_of_range","invalid_format","invalid"];var REASON_SET=new Set(CUSTOM_FORM_FIELD_ERROR_REASONS);function isCustomFormFieldErrorReason(value){return REASON_SET.has(value)}function createCustomFormErrorEvent(code){return {type:"checktiv.custom_form.error",error:createChecktivError(code)}}function resolveTarget(target){if(typeof target!=="string")return target;if(typeof document==="undefined")return null;return document.querySelector(target)}async function resolveSessionIdentity(ctx,fetchImpl){let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+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(!isRecord(body))return {kind:"unresolved"};if(isRecord(body.data)&&body.data.renderable===false){return {kind:"unresolved"}}const data=body.data;if(isRecord(data)){const sessionId=data.session_id;const stepId=data.step_id;if(typeof sessionId==="string"&&sessionId.length>0&&typeof stepId==="string"&&stepId.length>0){ctx.setSessionId(sessionId);return {kind:"ok",identity:{sessionId,stepId}}}}return isJourneyPlaneBody(body)?{kind:"wrong_token"}:{kind:"unresolved"}}async function parseFieldErrors(res){let body;try{body=await res.json();}catch{return null}if(typeof body!=="object"||body===null)return null;const fieldErrors=body.fieldErrors;if(typeof fieldErrors!=="object"||fieldErrors===null)return null;const out=new Map;for(const[fieldId,reason]of Object.entries(fieldErrors)){if(typeof reason==="string"&&isCustomFormFieldErrorReason(reason)){out.set(fieldId,reason);}}return out}function noopHandle(){return {destroy:()=>void 0}}function createCustomForm(ctx,opts){const element=resolveTarget(opts.target);if(element===null){console.warn('[Checktiv] mount("custom_form"): 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;const chrome=resolveCopy(opts.copy);const answers=new Map;const pendingFiles=new Map;const errors=new Map;let formError=null;let identity=null;let submitting=false;let cancelled=false;const PENDING_FILE_SENTINEL="\0pending-file";const clearFieldError=fieldId=>{const clearedField=errors.delete(fieldId);const clearedForm=formError!==null;formError=null;if(clearedField||clearedForm)paint();};const focusField=fieldId=>{element.querySelector(`[name="${fieldId}"]`)?.focus();};const validateAll=()=>{errors.clear();let firstInvalid=null;for(const field of opts.config.fields){const answer=pendingFiles.has(field.id)?PENDING_FILE_SENTINEL:answers.get(field.id);const reason=validateField(field,answer);if(reason!==void 0){errors.set(field.id,reason);if(firstInvalid===null)firstInvalid=field.id;}}return firstInvalid};const applyServerFieldErrors=fieldErrors=>{errors.clear();formError=null;const knownFieldIds=new Set(opts.config.fields.map(f=>f.id));for(const[fieldId,reason]of fieldErrors){if(knownFieldIds.has(fieldId))errors.set(fieldId,reason);}if(errors.size===0)formError=chrome.validationError;paint();const first=opts.config.fields.find(f=>errors.has(f.id));if(first!==void 0)focusField(first.id);};const paint=()=>{if(cancelled)return;R(k(S,null,[...opts.config.fields.map(field=>{const reason=errors.get(field.id);return renderField({field,copy:opts.copy?.fields?.[field.id],value:answers.get(field.id),id:`checktiv-cf-${field.id}`,error:reason!==void 0?messageForReason(chrome,reason):void 0,booleanYes:chrome.booleanYes,booleanNo:chrome.booleanNo,onChange:next=>{answers.set(field.id,next);if(field.type==="multi_select"||field.type==="boolean"||field.type==="single_select"){const clearedField=errors.delete(field.id);const clearedForm=formError!==null;formError=null;if(field.type==="multi_select"||clearedField||clearedForm)paint();}},onBlur:()=>clearFieldError(field.id),onFile:file=>{if(file===null){pendingFiles.delete(field.id);answers.delete(field.id);}else {pendingFiles.set(field.id,file);}clearFieldError(field.id);}})}),formError!==null?k("p",{class:"checktiv-cf-error",role:"alert",id:"checktiv-cf-form-error"},formError):null,k("button",{type:"submit",class:"checktiv-cf-submit",disabled:opts.preview===true,onClick:e=>{e.preventDefault();if(opts.preview===true)return;void onSubmit();}},chrome.submit)]),element);};async function onSubmit(){if(submitting||cancelled)return;formError=null;const firstInvalid=validateAll();if(firstInvalid!==null){paint();focusField(firstInvalid);return}if(identity===null){emit(createCustomFormErrorEvent("session_expired"));return}const session=identity;submitting=true;for(const[fieldId,file]of pendingFiles){const key=await uploadFormFile(ctx,fetchImpl,session.stepId,fieldId,file);if(cancelled)return;if(key===null){emit(createCustomFormErrorEvent("upload_failed"));submitting=false;return}answers.set(fieldId,key);}pendingFiles.clear();const blob=collectAnswers(answers);let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+stepSubmitPath(session.sessionId,session.stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(blob)}),result=>result?.status===401);}catch(err){console.warn("[Checktiv] custom_form submit request failed.",err);submitting=false;return}if(cancelled)return;if(!res.ok){if(res.status===422){const fieldErrors=await parseFieldErrors(res);if(cancelled)return;if(fieldErrors!==null&&fieldErrors.size>0){applyServerFieldErrors(fieldErrors);}else {formError=chrome.validationError;paint();}submitting=false;return}if(res.status===400){formError=chrome.validationError;paint();submitting=false;return}emit(createCustomFormErrorEvent(mapHttpStatusToError(res.status)));submitting=false;return}emit({type:"checktiv.custom_form.submitted",sessionId:session.sessionId});}if(opts.preview===true){paint();emit({type:"checktiv.custom_form.ready"});return {destroy(){if(cancelled)return;cancelled=true;R(null,element);}}}void(async()=>{try{if(opts.session!==void 0){identity=opts.session;}else {const resolution=await resolveSessionIdentity(ctx,fetchImpl);if(cancelled)return;switch(resolution.kind){case "ok":identity=resolution.identity;break;case "wrong_token":warnWrongTokenPlane();emit(createCustomFormErrorEvent("wrong_token_type"));return;case "unresolved":emit(createCustomFormErrorEvent("session_expired"));return;default:return assertNever(resolution)}}if(cancelled)return;paint();emit({type:"checktiv.custom_form.ready"});}catch(err){if(cancelled)return;console.warn('[Checktiv] mount("custom_form") setup failed.',err);emit(createCustomFormErrorEvent("sdk_load_failed"));}})();return {destroy(){if(cancelled)return;cancelled=true;R(null,element);}}}registerModule("custom_form",createCustomForm);
|
|
12
|
+
function describedBy(props){const ids=[];if(props.copy?.helpText!==void 0)ids.push(`${props.id}-help`);if(props.error!==void 0)ids.push(`${props.id}-error`);return ids.length>0?ids.join(" "):void 0}function ariaInvalid(props){return props.error!==void 0?"true":void 0}function labelText(props){return props.copy?.label??props.field.id}function labelIdFor(controlId){return `${controlId}-label`}function FieldShell(props,control){const help=props.copy?.helpText;return u("div",{class:"checktiv-cf-field",children:[u("label",{id:labelIdFor(props.id),for:props.id,class:"checktiv-cf-label",children:labelText(props)}),help!==void 0?u("p",{id:`${props.id}-help`,class:"checktiv-cf-help",children:help}):null,control,props.error!==void 0?u("p",{id:`${props.id}-error`,class:"checktiv-cf-error",role:"alert",children:props.error}):null]})}function asText(value){return typeof value==="string"?value:""}function asInputValue(value){return typeof value==="number"?String(value):asText(value)}function inputTypeFor(type){switch(type){case "email":return "email";case "phone":return "tel";case "date":return "date";case "number":return "number";default:return "text"}}function renderTextLike(props){const{field}=props;const onInput=e=>{const target=e.target;if(field.type==="number"){const input=target;props.onChange(input.value===""||Number.isNaN(input.valueAsNumber)?void 0:input.valueAsNumber);return}props.onChange(target.value);};if(field.type==="long_text"){return FieldShell(props,u("textarea",{id:props.id,name:field.id,required:field.required,class:"checktiv-cf-input",value:asInputValue(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onInput,onBlur:props.onBlur}))}return FieldShell(props,u("input",{id:props.id,name:field.id,type:inputTypeFor(field.type),required:field.required,class:"checktiv-cf-input",value:asInputValue(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onInput,onBlur:props.onBlur}))}function renderBoolean(props){const yesId=`${props.id}-yes`;const noId=`${props.id}-no`;return FieldShell(props,u("fieldset",{class:"checktiv-cf-radiogroup",role:"radiogroup","aria-labelledby":labelIdFor(props.id),"aria-required":props.field.required?"true":void 0,"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),children:[u("label",{for:yesId,class:"checktiv-cf-radio-option",children:[u("input",{id:yesId,name:props.field.id,type:"radio",class:"checktiv-cf-radio",checked:props.value===true,onChange:e=>{if(e.target.checked)props.onChange(true);}}),props.booleanYes]}),u("label",{for:noId,class:"checktiv-cf-radio-option",children:[u("input",{id:noId,name:props.field.id,type:"radio",class:"checktiv-cf-radio",checked:props.value===false,onChange:e=>{if(e.target.checked)props.onChange(false);}}),props.booleanNo]})]}))}function optionLabel(props,value){return props.copy?.options?.[value]??value}function renderSingleSelect(props){const options=props.field.options??[];return FieldShell(props,u("select",{id:props.id,name:props.field.id,required:props.field.required,class:"checktiv-cf-select",value:asText(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onChange:e=>props.onChange(e.target.value),children:[u("option",{value:"",children:""}),options.map(o=>u("option",{value:o.value,children:optionLabel(props,o.value)}))]}))}function renderMultiSelect(props){const options=props.field.options??[];const selected=Array.isArray(props.value)?props.value:[];const toggle=(value,checked)=>{const next=checked?[...selected,value]:selected.filter(v=>v!==value);props.onChange(next);};return FieldShell(props,u("div",{class:"checktiv-cf-multiselect",role:"group","aria-labelledby":labelIdFor(props.id),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),children:options.map(o=>u("label",{class:"checktiv-cf-option",children:[u("input",{type:"checkbox",name:props.field.id,value:o.value,checked:selected.includes(o.value),onChange:e=>toggle(o.value,e.target.checked)}),optionLabel(props,o.value)]}))}))}function renderFileUpload(props){return FieldShell(props,u("input",{id:props.id,name:props.field.id,type:"file",class:"checktiv-cf-file",required:props.field.required,"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onChange:e=>{const files=e.target.files;props.onFile(files&&files.length>0?files[0]:null);}}))}function renderContent(props){const text=props.copy?.label??props.field.id;return props.field.type==="content_heading"?u("h2",{class:"checktiv-cf-heading",children:text}):u("p",{class:"checktiv-cf-paragraph",children:text})}function renderField(props){switch(props.field.type){case "short_text":case "long_text":case "email":case "phone":case "date":case "number":return renderTextLike(props);case "boolean":return renderBoolean(props);case "single_select":return renderSingleSelect(props);case "multi_select":return renderMultiSelect(props);case "file_upload":return renderFileUpload(props);case "content_heading":case "content_paragraph":return renderContent(props);default:{const _exhaustive=props.field.type;return _exhaustive}}}var CLIENT_PHONE_RE=/^\+?[0-9 ().-]{6,24}$/;var CLIENT_EMAIL_RE=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function isEmptyAnswer(answer){if(answer===void 0)return true;if(typeof answer==="string")return answer.length===0;if(Array.isArray(answer))return answer.length===0;return false}function validateField(field,answer){const requiredIfEmpty=()=>isEmptyAnswer(answer)?field.required?"required":void 0:void 0;switch(field.type){case "short_text":case "long_text":case "date":case "file_upload":return requiredIfEmpty();case "boolean":return field.required&&answer===void 0?"required":void 0;case "email":{if(isEmptyAnswer(answer))return field.required?"required":void 0;return typeof answer==="string"&&!CLIENT_EMAIL_RE.test(answer)?"invalid_email":void 0}case "phone":{if(isEmptyAnswer(answer))return field.required?"required":void 0;return typeof answer==="string"&&!CLIENT_PHONE_RE.test(answer)?"invalid_phone":void 0}case "number":{if(isEmptyAnswer(answer))return field.required?"required":void 0;if(typeof answer!=="number")return void 0;const min=field.validation?.min;const max=field.validation?.max;if(min!==void 0&&answer<min)return "out_of_range";if(max!==void 0&&answer>max)return "out_of_range";return void 0}case "single_select":{if(isEmptyAnswer(answer))return field.required?"required":void 0;const options=field.options??[];if(typeof answer==="string"&&options.length>0){return options.some(o=>o.value===answer)?void 0:"invalid_option"}return void 0}case "multi_select":{const selected=Array.isArray(answer)?answer:[];if(selected.length===0)return field.required?"required":void 0;const min=field.validation?.minSelections;const max=field.validation?.maxSelections;if(min!==void 0&&selected.length<min)return "out_of_range";if(max!==void 0&&selected.length>max)return "out_of_range";return void 0}case "content_heading":case "content_paragraph":return void 0;default:return assertNever(field.type)}}function collectAnswers(answers){const blob={};for(const[fieldId,value]of answers){if(value===void 0)continue;if(typeof value==="string"&&value.length===0)continue;blob[fieldId]=value;}return blob}function isRecord2(v){return typeof v==="object"&&v!==null}function parseUploadTarget(body){if(!isRecord2(body)||!isRecord2(body.data))return null;const d=body.data;const uploadUrl=d.upload_url;const r2Key=d.r2_key;if(typeof uploadUrl!=="string"||uploadUrl.length===0)return null;if(typeof r2Key!=="string"||r2Key.length===0)return null;return {uploadUrl,r2Key}}function extensionOf(fileName){const dot=fileName.lastIndexOf(".");if(dot<0||dot===fileName.length-1)return "";return fileName.slice(dot+1).toLowerCase()}async function uploadFormFile(ctx,fetchImpl,stepId,fieldId,file){const origin=ctx.apiBaseOrigin;let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+formUploadUrlPath(stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({fieldId,ext:extensionOf(file.name),contentLength:file.size})}));}catch{return null}if(!res.ok)return null;let body;try{body=await res.json();}catch{return null}const target=parseUploadTarget(body);if(target===null)return null;let putRes;try{putRes=await fetchImpl(target.uploadUrl,{method:"PUT",headers:{"content-type":file.type||"application/octet-stream"},body:file});}catch{return null}if(!putRes.ok)return null;return target.r2Key}var FALLBACK={submit:"Continue",submitPending:"Submitting\u2026",requiredError:"This field is required.",invalidPhoneError:"Enter a valid phone number.",invalidEmailError:"Enter a valid email address.",invalidDateError:"Enter a valid date.",invalidOptionError:"Choose one of the available options.",outOfRangeError:"That value is outside the allowed range.",invalidFormatError:"That value is not in the expected format.",invalidError:"That value is not valid.",validationError:"Some answers could not be accepted. Review your entries and try again.",uploadError:"That file could not be uploaded. Choose the file and try again.",submitError:"Something went wrong submitting the form. Please try again.",booleanYes:"Yes",booleanNo:"No"};function resolveCopy(copy){return {submit:copy?.submit??FALLBACK.submit,submitPending:copy?.submitPending??FALLBACK.submitPending,requiredError:copy?.requiredError??FALLBACK.requiredError,invalidPhoneError:copy?.invalidPhoneError??FALLBACK.invalidPhoneError,invalidEmailError:copy?.invalidEmailError??FALLBACK.invalidEmailError,invalidDateError:copy?.invalidDateError??FALLBACK.invalidDateError,invalidOptionError:copy?.invalidOptionError??FALLBACK.invalidOptionError,outOfRangeError:copy?.outOfRangeError??FALLBACK.outOfRangeError,invalidFormatError:copy?.invalidFormatError??FALLBACK.invalidFormatError,invalidError:copy?.invalidError??FALLBACK.invalidError,validationError:copy?.validationError??FALLBACK.validationError,uploadError:copy?.uploadError??FALLBACK.uploadError,submitError:copy?.submitError??FALLBACK.submitError,booleanYes:copy?.booleanYes??FALLBACK.booleanYes,booleanNo:copy?.booleanNo??FALLBACK.booleanNo}}function messageForReason(chrome,reason){const byReason={required:chrome.requiredError,invalid_phone:chrome.invalidPhoneError,invalid_email:chrome.invalidEmailError,invalid_date:chrome.invalidDateError,invalid_option:chrome.invalidOptionError,out_of_range:chrome.outOfRangeError,invalid_format:chrome.invalidFormatError,invalid:chrome.invalidError};return byReason[reason]}var CUSTOM_FORM_FIELD_ERROR_REASONS=["required","invalid_phone","invalid_email","invalid_date","invalid_option","out_of_range","invalid_format","invalid"];var REASON_SET=new Set(CUSTOM_FORM_FIELD_ERROR_REASONS);function isCustomFormFieldErrorReason(value){return REASON_SET.has(value)}function createCustomFormErrorEvent(code){return {type:"checktiv.custom_form.error",error:createChecktivError(code)}}function resolveTarget(target){if(typeof target!=="string")return target;if(typeof document==="undefined")return null;return document.querySelector(target)}async function resolveSessionIdentity(ctx,fetchImpl){let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+SESSIONS_ME_PATH,{method:"GET",headers:dataPlaneHeaders(ctx,token)}));}catch(err){if(isChecktivError(err)&&err.code==="session_parked")return {kind:"parked"};return {kind:"unresolved"}}if(!res.ok)return {kind:"unresolved"};let body;try{body=await res.json();}catch{return {kind:"unresolved"}}if(!isRecord(body))return {kind:"unresolved"};if(isRecord(body.data)&&body.data.renderable===false){return {kind:"unresolved"}}const data=body.data;if(isRecord(data)){const sessionId=data.session_id;const stepId=data.step_id;if(typeof sessionId==="string"&&sessionId.length>0&&typeof stepId==="string"&&stepId.length>0){ctx.setSessionId(sessionId);return {kind:"ok",identity:{sessionId,stepId}}}}return isJourneyPlaneBody(body)?{kind:"wrong_token"}:{kind:"unresolved"}}async function parseFieldErrors(res){let body;try{body=await res.json();}catch{return null}if(typeof body!=="object"||body===null)return null;const fieldErrors=body.fieldErrors;if(typeof fieldErrors!=="object"||fieldErrors===null)return null;const out=new Map;for(const[fieldId,reason]of Object.entries(fieldErrors)){if(typeof reason==="string"&&isCustomFormFieldErrorReason(reason)){out.set(fieldId,reason);}}return out}function isPromiseLike(value){return typeof value==="object"&&value!==null&&"then"in value&&typeof value.then==="function"}function noopHandle(){return {destroy:()=>void 0}}function createCustomForm(ctx,opts){const element=resolveTarget(opts.target);if(element===null){console.warn('[Checktiv] mount("custom_form"): no target element found. Pass an element or a selector that resolves.');return noopHandle()}const warnHostHandlerFailed=err=>{console.warn("[Checktiv] custom_form onEvent handler threw.",err);};const emit=e=>{try{const settled=opts.onEvent?.(e);if(isPromiseLike(settled))void settled.then(void 0,warnHostHandlerFailed);}catch(err){warnHostHandlerFailed(err);}};const fetchImpl=opts.fetchImpl??fetch;const chrome=resolveCopy(opts.copy);const answers=new Map;const pendingFiles=new Map;const errors=new Map;let formError=null;let identity=null;let submitting=false;let cancelled=false;const PENDING_FILE_SENTINEL="\0pending-file";const clearFieldError=fieldId=>{const clearedField=errors.delete(fieldId);const clearedForm=formError!==null;formError=null;if(clearedField||clearedForm)paint();};const endSubmitting=()=>{submitting=false;paint();};const focusField=fieldId=>{element.querySelector(`[name="${fieldId}"]`)?.focus();};const validateAll=()=>{errors.clear();let firstInvalid=null;for(const field of opts.config.fields){const answer=pendingFiles.has(field.id)?PENDING_FILE_SENTINEL:answers.get(field.id);const reason=validateField(field,answer);if(reason!==void 0){errors.set(field.id,reason);if(firstInvalid===null)firstInvalid=field.id;}}return firstInvalid};const applyServerFieldErrors=fieldErrors=>{errors.clear();formError=null;const knownFieldIds=new Set(opts.config.fields.map(f=>f.id));for(const[fieldId,reason]of fieldErrors){if(knownFieldIds.has(fieldId))errors.set(fieldId,reason);}if(errors.size===0)formError=chrome.validationError;paint();const first=opts.config.fields.find(f=>errors.has(f.id));if(first!==void 0)focusField(first.id);};const paint=()=>{if(cancelled)return;R(k(S,null,[...opts.config.fields.map(field=>{const reason=errors.get(field.id);return renderField({field,copy:opts.copy?.fields?.[field.id],value:answers.get(field.id),id:`checktiv-cf-${field.id}`,error:reason!==void 0?messageForReason(chrome,reason):void 0,booleanYes:chrome.booleanYes,booleanNo:chrome.booleanNo,onChange:next=>{answers.set(field.id,next);if(field.type==="multi_select"||field.type==="boolean"||field.type==="single_select"){const clearedField=errors.delete(field.id);const clearedForm=formError!==null;formError=null;if(field.type==="multi_select"||clearedField||clearedForm)paint();}},onBlur:()=>clearFieldError(field.id),onFile:file=>{if(file===null){pendingFiles.delete(field.id);answers.delete(field.id);}else {pendingFiles.set(field.id,file);}clearFieldError(field.id);}})}),formError!==null?k("p",{class:"checktiv-cf-error",role:"alert",id:"checktiv-cf-form-error"},formError):null,k("div",{class:"checktiv-cf-sr-only",role:"status","aria-live":"polite","data-testid":"custom-form-submitting-status"},submitting?chrome.submitPending:""),k("button",{type:"submit",class:"checktiv-cf-submit",disabled:opts.preview===true||submitting,"aria-busy":submitting?"true":"false",onClick:e=>{e.preventDefault();if(opts.preview===true)return;void onSubmit();}},submitting?chrome.submitPending:chrome.submit)]),element);};async function onSubmit(){if(submitting||cancelled)return;formError=null;const firstInvalid=validateAll();if(firstInvalid!==null){paint();focusField(firstInvalid);return}if(identity===null){emit(createCustomFormErrorEvent("session_expired"));return}const session=identity;submitting=true;paint();for(const[fieldId,file]of pendingFiles){const key=await uploadFormFile(ctx,fetchImpl,session.stepId,fieldId,file);if(cancelled)return;if(key===null){endSubmitting();emit(createCustomFormErrorEvent("upload_failed"));return}answers.set(fieldId,key);}pendingFiles.clear();const blob=collectAnswers(answers);let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+stepSubmitPath(session.sessionId,session.stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(blob)}));}catch(err){console.warn("[Checktiv] custom_form submit request failed.",err);formError=chrome.submitError;endSubmitting();return}if(cancelled)return;if(!res.ok){if(res.status===422){const fieldErrors=await parseFieldErrors(res);if(cancelled)return;submitting=false;if(fieldErrors!==null&&fieldErrors.size>0){applyServerFieldErrors(fieldErrors);}else {formError=chrome.validationError;paint();}return}if(res.status===400){formError=chrome.validationError;endSubmitting();return}endSubmitting();emit(createCustomFormErrorEvent(mapHttpStatusToError(res.status)));return}emit({type:"checktiv.custom_form.submitted",sessionId:session.sessionId});}if(opts.preview===true){paint();emit({type:"checktiv.custom_form.ready"});return {destroy(){if(cancelled)return;cancelled=true;R(null,element);}}}void(async()=>{try{if(opts.session!==void 0){identity=opts.session;}else {const resolution=await resolveSessionIdentity(ctx,fetchImpl);if(cancelled)return;switch(resolution.kind){case "ok":identity=resolution.identity;break;case "wrong_token":warnWrongTokenPlane();emit(createCustomFormErrorEvent("wrong_token_type"));return;case "unresolved":emit(createCustomFormErrorEvent("session_expired"));return;case "parked":emit(createCustomFormErrorEvent("session_parked"));return;default:return assertNever(resolution)}}if(cancelled)return;paint();emit({type:"checktiv.custom_form.ready"});}catch(err){if(cancelled)return;console.warn('[Checktiv] mount("custom_form") setup failed.',err);emit(createCustomFormErrorEvent("sdk_load_failed"));}})();return {destroy(){if(cancelled)return;cancelled=true;R(null,element);}}}registerModule("custom_form",createCustomForm);
|
|
14
13
|
|
|
15
14
|
export { createCustomForm };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { isEsignConsentOutcome, resolveEsignDocumentCopy, ESIGN_STATES, ESIGN_CONSENT_ACTIONS, ESIGN_DOCUMENT_ACTIONS } from '../chunk-MLQ2HMTS.js';
|
|
2
|
+
import { initTransport } from '../chunk-UVTAPUGQ.js';
|
|
3
|
+
import '../chunk-AIK7CDV6.js';
|
|
4
|
+
|
|
5
|
+
function esignFrameOwnsDownload(documentCount){return documentCount===1}function createEsignChrome(deps){const doc=deps.container.ownerDocument;let documentPanel=null;function ensurePanel(existing,marker){if(existing!==null)return existing;const el=doc.createElement("div");el.setAttribute(marker,"");el.className="ctv-esign-callout-body";deps.container.appendChild(el);return el}function button(label,onClick){const el=doc.createElement("button");el.type="button";el.className="ctv-esign-btn ctv-esign-btn-ghost";el.textContent=label;el.addEventListener("click",onClick);return el}function line(text,role){const el=doc.createElement("p");el.className="ctv-esign-callout-text";el.setAttribute("role",role);el.textContent=text;return el}function renderDocuments(model){if(model.documents.length===0){documentPanel?.remove();documentPanel=null;return}const panel=ensurePanel(documentPanel,"data-checktiv-esign-documents");documentPanel=panel;panel.replaceChildren();const frameOwnsTheControl=!model.owned&&model.framePaintsTopBar&&esignFrameOwnsDownload(model.documents.length);if(!frameOwnsTheControl){const controls=doc.createElement("div");controls.className="ctv-esign-callout-actions";panel.appendChild(controls);const label=resolveEsignDocumentCopy(deps.copy,"download");for(const[index,document_]of model.documents.entries()){const text=model.documents.length>1?`${label} ${index+1}`:label;const control=button(text,()=>deps.on.onDownload(document_.documentId));control.setAttribute("data-checktiv-esign-download",document_.documentId);controls.appendChild(control);}}if(model.downloadFailed){const error=line(resolveEsignDocumentCopy(deps.copy,"downloadFailed"),"alert");error.setAttribute("data-checktiv-esign-download-error","");panel.appendChild(error);}if(model.downloadRemoved){const removed=line(resolveEsignDocumentCopy(deps.copy,"downloadRemoved"),"alert");removed.setAttribute("data-checktiv-esign-download-removed","");panel.appendChild(removed);}if(panel.childElementCount===0){panel.remove();documentPanel=null;}}return {render(model){renderDocuments(model);},destroy(){documentPanel?.remove();documentPanel=null;}}}function filenameFromDisposition(raw){if(raw===null)return "document.pdf";const match=/filename="([^"]+)"/.exec(raw);const name=match?.[1];return name!==void 0&&name.length>0?name:"document.pdf"}function saveBlobAsDownload(blob,filename,deps){const doc=deps.container.ownerDocument;const view=doc.defaultView;if(view===null||typeof view.URL?.createObjectURL!=="function")return false;const objectUrl=view.URL.createObjectURL(blob);const anchor=doc.createElement("a");anchor.href=objectUrl;anchor.download=filename;anchor.rel="noopener";anchor.style.display="none";doc.body.appendChild(anchor);anchor.click();anchor.remove();deps.schedule(()=>view.URL.revokeObjectURL(objectUrl),0);return true}var ESIGN_PROTOCOL_VERSION=1;var MIN_ESIGN_PROTOCOL_VERSION=1;function checkInboundProtocolVersion(value){if(value===void 0)return "ok";if(typeof value!=="number"||!Number.isFinite(value))return "malformed";return value<MIN_ESIGN_PROTOCOL_VERSION?"mismatch":"ok"}function isRecord(value){return typeof value==="object"&&value!==null}function isDocumentDocShape(value){if(!isRecord(value))return false;if(value.type!=="doc")return false;return value.content===void 0||Array.isArray(value.content)}function isBundleDocumentShape(value){if(!isRecord(value))return false;if(typeof value.documentId!=="string"||value.documentId.length===0)return false;if(typeof value.templateVersionId!=="string"||value.templateVersionId.length===0){return false}if(typeof value.documentOrder!=="number")return false;if(typeof value.preSignatureHash!=="string")return false;if(!isRecord(value.resolvedVariables))return false;return isDocumentDocShape(value.doc)}function isEsignBundleShape(value){if(!isRecord(value))return false;if(typeof value.envelopeId!=="string"||value.envelopeId.length===0)return false;if(!Array.isArray(value.documents)||value.documents.length===0)return false;if(!value.documents.every(isBundleDocumentShape))return false;if(!Array.isArray(value.parties))return false;const disclosure=value.disclosure;if(!isRecord(disclosure))return false;if(typeof disclosure.version!=="string"||disclosure.version.length===0)return false;if(typeof disclosure.hash!=="string"||disclosure.hash.length===0)return false;if(typeof disclosure.body!=="string"||disclosure.body.length===0)return false;if(typeof disclosure.locale!=="string"||disclosure.locale.length===0)return false;const settings=value.settings;if(!isRecord(settings))return false;if(typeof settings.requireScrollToEnd!=="boolean")return false;if(settings.minimumAgeYears!==void 0&&typeof settings.minimumAgeYears!=="number"){return false}return true}function isEsignProjectionShape(value){if(!isRecord(value))return false;if(typeof value.envelopeId!=="string"||value.envelopeId.length===0)return false;if(typeof value.status!=="string"||value.status.length===0)return false;if(typeof value.expiresAt!=="string")return false;if(!("disclosure"in value)||!("scrolledToEndAt"in value))return false;if(!("adoptedSignature"in value)||!("adoptedAt"in value))return false;return "chainHeadSequence"in value}function parseEsignInbound(data){if(!isRecord(data))return null;const type=data.type;if(typeof type!=="string"||!type.startsWith("esign:"))return null;const verdict=checkInboundProtocolVersion(data.protocolVersion);if(verdict==="malformed")return null;if(verdict==="mismatch")return {kind:"protocol_mismatch"};const protocolVersion=typeof data.protocolVersion==="number"?data.protocolVersion:ESIGN_PROTOCOL_VERSION;if(type==="esign:ready"){return {kind:"message",message:{type:"esign:ready",protocolVersion}}}if(type==="esign:state"){const state=data.state;if(typeof state!=="string"||!isEsignState(state))return null;return {kind:"message",message:{type:"esign:state",protocolVersion,state}}}if(type==="esign:event"){const event=data.event;if(!isCeremonyEventShape(event))return null;return {kind:"message",message:{type:"esign:event",protocolVersion,event}}}if(type==="esign:submit"){const body=data.body;if(!isSubmitBodyShape(body))return null;return {kind:"message",message:{type:"esign:submit",protocolVersion,body}}}if(type==="esign:resize"){const height=data.height;if(typeof height!=="number"||!Number.isFinite(height)||height<=0)return null;return {kind:"message",message:{type:"esign:resize",protocolVersion,height}}}if(type==="esign:consent_act"){const action=data.action;if(typeof action!=="string"||!isEsignConsentAction(action))return null;return {kind:"message",message:{type:"esign:consent_act",protocolVersion,action}}}if(type==="esign:scroll_request"){const offsetTop=data.offsetTop;if(typeof offsetTop!=="number"||!Number.isFinite(offsetTop)||offsetTop<0)return null;return {kind:"message",message:{type:"esign:scroll_request",protocolVersion,offsetTop}}}if(type==="esign:document_act"){const{action,documentId}=data;if(typeof action!=="string"||!isEsignDocumentAction(action))return null;if(typeof documentId!=="string"||documentId.length===0)return null;return {kind:"message",message:{type:"esign:document_act",protocolVersion,action,documentId}}}if(type==="esign:document_extent"){const{documentId,endOffsetTop}=data;if(typeof documentId!=="string"||documentId.length===0)return null;if(typeof endOffsetTop!=="number"||!Number.isFinite(endOffsetTop)||endOffsetTop<0){return null}return {kind:"message",message:{type:"esign:document_extent",protocolVersion,documentId,endOffsetTop}}}return null}function isEsignConsentAction(value){return ESIGN_CONSENT_ACTIONS.includes(value)}function isEsignDocumentAction(value){return ESIGN_DOCUMENT_ACTIONS.includes(value)}var CEREMONY_EVENT_TYPES=["document.viewed","disclosure.presented","disclosure.consented","document.scrolled_to_end","signature.adopted"];function isCeremonyEventShape(value){if(!isRecord(value))return false;return typeof value.type==="string"&&isCeremonyEventType(value.type)}function isCeremonyEventType(value){const types=CEREMONY_EVENT_TYPES;return types.includes(value)}function isSubmitBodyShape(value){if(!isRecord(value))return false;if(!Array.isArray(value.documents)||value.documents.length===0)return false;const signed=value.adoptedSignature!==void 0;const declined=value.declineReason!==void 0;return signed!==declined}function isEsignState(value){return ESIGN_STATES.includes(value)}function buildSignerLocalContext(context){return {getTimezoneOffsetMinutes:(context.now??new Date).getTimezoneOffset(),...context.locale!==void 0?{locale:context.locale}:{}}}function buildEsignCeremonyEventBody(input,context={}){const common={protocolVersion:ESIGN_PROTOCOL_VERSION,...buildSignerLocalContext(context)};switch(input.type){case "document.viewed":return {...common,type:"document.viewed",documentId:input.documentId};case "disclosure.presented":return {...common,type:"disclosure.presented",...input.disclosureLocale!==void 0?{disclosureLocale:input.disclosureLocale}:{}};case "disclosure.consented":return {...common,type:"disclosure.consented",disclosureVersion:input.disclosureVersion,disclosureLocale:input.disclosureLocale,disclosureHash:input.disclosureHash};case "document.scrolled_to_end":return {...common,type:"document.scrolled_to_end",documentId:input.documentId};case "signature.adopted":return {...common,type:"signature.adopted",adoptedSignature:input.adoptedSignature};default:return assertNeverCeremonyEvent(input)}}function buildEsignConsentActBody(action,context={}){return {protocolVersion:ESIGN_PROTOCOL_VERSION,action,...buildSignerLocalContext(context)}}function parseEsignConsentActBody(body){if(!isRecord(body))return null;const outcome=body.outcome;if(typeof outcome!=="string"||!isEsignConsentOutcome(outcome))return null;return outcome}function isEsignDocumentRemovedBody(body){return isRecord(body)&&body.removed===true}function assertNeverCeremonyEvent(input){throw new Error(`Unhandled esign ceremony event input: ${JSON.stringify(input)}`)}var ESIGN_REFUSAL_STATE={esign_protocol_unsupported:{disposition:"upgrade",state:"protocol_mismatch"},esign_envelope_not_ready:{disposition:"retry",state:"preparing"},esign_event_out_of_order:{disposition:"resume",state:"conflict"},esign_disclosure_mismatch:{disposition:"resume",state:"consent"},esign_unknown_document:{disposition:"resume",state:"conflict"},esign_documents_incomplete:{disposition:"resume",state:"conflict"},esign_consent_required:{disposition:"resume",state:"consent"},esign_read_through_required:{disposition:"resume",state:"scroll_incomplete"},esign_signature_not_adopted:{disposition:"resume",state:"adopt"},esign_signature_mismatch:{disposition:"resume",state:"adopt"},esign_template_version_stale:{disposition:"resume",state:"conflict"},esign_age_assurance_required:{disposition:"resume",state:"age_gate"},esign_minimum_age_not_met:{disposition:"blocked",state:"age_blocked"},esign_consent_withdrawn:{disposition:"withdrawn",state:"terminal_withdrawn"},esign_envelope_conflict:{disposition:"concluded",state:"conflict"}};function isRecord2(value){return typeof value==="object"&&value!==null}function isEsignRefusalCode(value){return Object.prototype.hasOwnProperty.call(ESIGN_REFUSAL_STATE,value)}function readEsignRefusal(body){if(!isRecord2(body))return null;const error=body.error;if(!isRecord2(error))return null;const code=error.code;if(typeof code!=="string"||!isEsignRefusalCode(code))return null;const retryAfterMs=error.retryAfterMs;return {code,retryAfterMs:typeof retryAfterMs==="number"&&Number.isFinite(retryAfterMs)&&retryAfterMs>0?retryAfterMs:void 0}}function wireEsignTransport(options){const{win,embedOrigin,getFrameWindow,handlers}=options;return initTransport({win,allowedOrigins:[embedOrigin],parse:parseEsignInbound,expectedSource:getFrameWindow,onMessage:(inbound,post)=>{if(inbound.kind==="protocol_mismatch"){handlers.onProtocolMismatch();return}const message=inbound.message;switch(message.type){case "esign:ready":handlers.onReady(post);return;case "esign:state":handlers.onState(message);return;case "esign:event":handlers.onEvent(message,post);return;case "esign:submit":handlers.onSubmit(message);return;case "esign:resize":handlers.onResize(message);return;case "esign:consent_act":handlers.onConsentAct(message,post);return;case "esign:scroll_request":handlers.onScrollRequest(message);return;case "esign:document_act":handlers.onDocumentAct(message);return;case "esign:document_extent":handlers.onDocumentExtent(message);return;default:return assertNeverEsignInbound(message)}}})}function assertNeverEsignInbound(message){throw new Error(`Unhandled esign inbound message: ${JSON.stringify(message)}`)}
|
|
6
|
+
|
|
7
|
+
export { ESIGN_PROTOCOL_VERSION, ESIGN_REFUSAL_STATE, buildEsignCeremonyEventBody, buildEsignConsentActBody, createEsignChrome, filenameFromDisposition, isEsignBundleShape, isEsignDocumentRemovedBody, isEsignProjectionShape, parseEsignConsentActBody, readEsignRefusal, saveBlobAsDownload, wireEsignTransport };
|
package/dist/esign.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { C as ChecktivEsignEvent, E as ESIGN_CONSENT_ACTIONS, a as ESIGN_COPY_FALLBACKS, b as ESIGN_COPY_STATE_KEYS, c as ESIGN_COUNT_TOKEN, d as ESIGN_DOCUMENT_FALLBACKS, e as ESIGN_DOCUMENT_KEYS, f as ESIGN_FRAME_ANNOUNCE_TIMEOUT_MS, g as ESIGN_LABELS, h as ESIGN_LABEL_FALLBACKS, i as ESIGN_OUTCOME_RIGHTS_KEY, j as ESIGN_RIGHTS_FALLBACKS, k as ESIGN_RIGHTS_KEYS, l as ESIGN_SHELL_FALLBACKS, m as ESIGN_SHELL_KEYS, n as ESIGN_STATES, o as ESIGN_STATE_RIGHTS, p as ESIGN_TERMINAL_STATUS_KEY, q as EsignChunkModule, r as EsignConsentAction, s as EsignConsentOutcome, t as EsignCopy, u as EsignCopyScalarKey, v as EsignDocumentCopyKey, w as EsignHandle, x as EsignLabel, y as EsignMountOptions, z as EsignRightsAffordance, A as EsignRightsKey, B as EsignShellKey, D as EsignState, F as EsignSubmitOutcome, G as EsignTerminalState, T as TERMINAL_STATUS_TO_STATE, H as TerminalEnvelopeStatus, I as createEsign, J as esignStateOffersRights, K as resolveEsignCopy, L as resolveEsignDocumentCopy, M as resolveEsignFrameTitle, N as resolveEsignLabel, O as resolveEsignOutcomeCopy, P as resolveEsignRightsCopy, Q as resolveEsignShellCopy, R as resolveEsignTerminalStatus } from './index-CGH7LlPH.js';
|
|
2
|
+
import './machine-EePe2ERe.js';
|
|
3
|
+
import './copy-Bsb1n1Wv.js';
|
|
4
|
+
import './copy-DCeQ4JKx.js';
|
|
5
|
+
|
|
6
|
+
interface EsignContextMint {
|
|
7
|
+
contextToken: string;
|
|
8
|
+
embedOrigin: string;
|
|
9
|
+
disclosureLocale: string;
|
|
10
|
+
}
|
|
11
|
+
declare function parseEsignMint(body: unknown): EsignContextMint | null;
|
|
12
|
+
declare function parseEsignPending(body: unknown): {
|
|
13
|
+
retryAfterMs: number;
|
|
14
|
+
} | null;
|
|
15
|
+
|
|
16
|
+
export { type EsignContextMint, parseEsignMint, parseEsignPending };
|