@inploi/flows 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-3HF7KDUR.mjs → chunk-H5IXVEP2.mjs} +1 -1
- package/dist/{chunk-3HF7KDUR.mjs.map → chunk-H5IXVEP2.mjs.map} +1 -1
- package/dist/i18n.d.mts +7 -0
- package/dist/i18n.mjs +1 -1
- package/dist/i18n.mjs.map +1 -1
- package/dist/interpreter.d.mts +1 -1
- package/dist/interpreter.mjs +1 -1
- package/dist/interpreter.mjs.map +1 -1
- package/dist/linked-list.mjs +1 -1
- package/dist/{result-3e1b4efe.d.ts → result-e69ff761.d.ts} +1 -1
- package/dist/utils.d.mts +1 -1
- package/dist/utils.mjs +1 -1
- package/package.json +3 -3
package/dist/i18n.d.mts
CHANGED
|
@@ -34,6 +34,7 @@ declare const TranslationProvider: (props: {
|
|
|
34
34
|
readonly country: "Country";
|
|
35
35
|
readonly select_country: "Select a country";
|
|
36
36
|
readonly validation_empty: "Please enter a value";
|
|
37
|
+
readonly validation_date: "Please enter a valid date (YYYY-MM-DD)";
|
|
37
38
|
readonly validation_email: "That doesn’t look like a valid email address";
|
|
38
39
|
readonly validation_url: "That doesn’t look like a valid URL";
|
|
39
40
|
readonly validation_max_chars: "Please enter no more than {{count}} characters";
|
|
@@ -91,6 +92,7 @@ declare const useTranslation: <T extends {
|
|
|
91
92
|
readonly country: "Country";
|
|
92
93
|
readonly select_country: "Select a country";
|
|
93
94
|
readonly validation_empty: "Please enter a value";
|
|
95
|
+
readonly validation_date: "Please enter a valid date (YYYY-MM-DD)";
|
|
94
96
|
readonly validation_email: "That doesn’t look like a valid email address";
|
|
95
97
|
readonly validation_url: "That doesn’t look like a valid URL";
|
|
96
98
|
readonly validation_max_chars: "Please enter no more than {{count}} characters";
|
|
@@ -144,6 +146,7 @@ declare const useTranslation: <T extends {
|
|
|
144
146
|
readonly country: "Country";
|
|
145
147
|
readonly select_country: "Select a country";
|
|
146
148
|
readonly validation_empty: "Please enter a value";
|
|
149
|
+
readonly validation_date: "Please enter a valid date (YYYY-MM-DD)";
|
|
147
150
|
readonly validation_email: "That doesn’t look like a valid email address";
|
|
148
151
|
readonly validation_url: "That doesn’t look like a valid URL";
|
|
149
152
|
readonly validation_max_chars: "Please enter no more than {{count}} characters";
|
|
@@ -201,6 +204,7 @@ declare const createTFunction: <T extends {
|
|
|
201
204
|
readonly country: "Country";
|
|
202
205
|
readonly select_country: "Select a country";
|
|
203
206
|
readonly validation_empty: "Please enter a value";
|
|
207
|
+
readonly validation_date: "Please enter a valid date (YYYY-MM-DD)";
|
|
204
208
|
readonly validation_email: "That doesn’t look like a valid email address";
|
|
205
209
|
readonly validation_url: "That doesn’t look like a valid URL";
|
|
206
210
|
readonly validation_max_chars: "Please enter no more than {{count}} characters";
|
|
@@ -254,6 +258,7 @@ declare const createTFunction: <T extends {
|
|
|
254
258
|
readonly country: "Country";
|
|
255
259
|
readonly select_country: "Select a country";
|
|
256
260
|
readonly validation_empty: "Please enter a value";
|
|
261
|
+
readonly validation_date: "Please enter a valid date (YYYY-MM-DD)";
|
|
257
262
|
readonly validation_email: "That doesn’t look like a valid email address";
|
|
258
263
|
readonly validation_url: "That doesn’t look like a valid URL";
|
|
259
264
|
readonly validation_max_chars: "Please enter no more than {{count}} characters";
|
|
@@ -308,6 +313,7 @@ declare const createTFunction: <T extends {
|
|
|
308
313
|
readonly country: "Country";
|
|
309
314
|
readonly select_country: "Select a country";
|
|
310
315
|
readonly validation_empty: "Please enter a value";
|
|
316
|
+
readonly validation_date: "Please enter a valid date (YYYY-MM-DD)";
|
|
311
317
|
readonly validation_email: "That doesn’t look like a valid email address";
|
|
312
318
|
readonly validation_url: "That doesn’t look like a valid URL";
|
|
313
319
|
readonly validation_max_chars: "Please enter no more than {{count}} characters";
|
|
@@ -364,6 +370,7 @@ declare const defaultTerms: {
|
|
|
364
370
|
readonly country: "Country";
|
|
365
371
|
readonly select_country: "Select a country";
|
|
366
372
|
readonly validation_empty: "Please enter a value";
|
|
373
|
+
readonly validation_date: "Please enter a valid date (YYYY-MM-DD)";
|
|
367
374
|
readonly validation_email: "That doesn’t look like a valid email address";
|
|
368
375
|
readonly validation_url: "That doesn’t look like a valid URL";
|
|
369
376
|
readonly validation_max_chars: "Please enter no more than {{count}} characters";
|
package/dist/i18n.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./chunk-DKKJHDKM.mjs";import{createTranslation as e}from"@inploi/i18n/preact";var{TranslationProvider:i,useTranslation:t,createTFunction:
|
|
1
|
+
import"./chunk-DKKJHDKM.mjs";import{createTranslation as e}from"@inploi/i18n/preact";var{TranslationProvider:i,useTranslation:t,createTFunction:l,defaultTerms:o}=e({submission_redirect_message:"Almost there! Please complete your submission here:",complete_submission:"Complete submission",submission_completed:"Submission completed!",submission_failed:"Failed to submit",maximize:"Maximise",minimize:"Minimise",close_application:"Close application",invalid_state:"Invalid application state",redirect_url_error:"Couldn\u2019t get the redirect URL.",upload_file:{one:"Select file to upload",other:"Select files to upload"},file_max_size:"max {{size}}",file_extensions:"Accepted file extensions",address_error:"Something went wrong! Plase continue manually",address_search:"Type and search for places\u2026",address_manual:"Fill in manually",back:"Back",search:"Search",unknown_error:"An error occurred",line1:"Line 1",line2:"Line 2",line3:"Line 3",city:"City",state:"State",postcode:"Postcode",country:"Country",select_country:"Select a country",validation_empty:"Please enter a value",validation_date:"Please enter a valid date (YYYY-MM-DD)",validation_email:"That doesn\u2019t look like a valid email address",validation_url:"That doesn\u2019t look like a valid URL",validation_max_chars:"Please enter no more than {{count}} characters",validation_min_chars:"Please enter {{count}} or more characters",validation_phone:"Please enter a valid phone number",validation_country_code:"Please select a country code",validation_number:"Please enter a valid number",validation_number_min:"Please enter a number greater than or equal to {{min}}",validation_number_max:"Please enter a number less than or equal to {{max}}",validation_number_decimal_cases:"Please enter a number with at most {{count}} decimal cases",validation_file:"Please select a file",validation_file_ext:"Please only upload {{ext}} files",validation_file_min:{one:"Please upload at least one file",other:"Please only upload at least {{count}} files"},validation_file_max:{one:"Please only upload one file",other:"Please only upload up to {{count}} files"},validation_file_size:"Your file is too big. Please upload a file smaller than {{size}}"});export{i as TranslationProvider,l as createTFunction,o as defaultTerms,t as useTranslation};
|
|
2
2
|
//# sourceMappingURL=i18n.mjs.map
|
package/dist/i18n.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/i18n.ts"],"sourcesContent":["import { createTranslation } from '@inploi/i18n/preact';\n\nexport const { TranslationProvider, useTranslation, createTFunction, defaultTerms } = createTranslation({\n\tsubmission_redirect_message: 'Almost there! Please complete your submission here:',\n\tcomplete_submission: 'Complete submission',\n\tsubmission_completed: 'Submission completed!',\n\tsubmission_failed: 'Failed to submit',\n\tmaximize: 'Maximise',\n\tminimize: 'Minimise',\n\tclose_application: 'Close application',\n\t/** When an application is at an invalid state, the user will get this error. */\n\tinvalid_state: 'Invalid application state',\n\tredirect_url_error: 'Couldn’t get the redirect URL.',\n\tupload_file: {\n\t\tone: 'Select file to upload',\n\t\tother: 'Select files to upload',\n\t},\n\tfile_max_size: 'max {{size}}',\n\tfile_extensions: 'Accepted file extensions',\n\taddress_error: 'Something went wrong! Plase continue manually',\n\taddress_search: 'Type and search for places…',\n\taddress_manual: 'Fill in manually',\n\tback: 'Back',\n\tsearch: 'Search',\n\tunknown_error: 'An error occurred',\n\n\tline1: 'Line 1',\n\tline2: 'Line 2',\n\tline3: 'Line 3',\n\tcity: 'City',\n\tstate: 'State',\n\tpostcode: 'Postcode',\n\tcountry: 'Country',\n\tselect_country: 'Select a country',\n\n\tvalidation_empty: 'Please enter a value',\n\tvalidation_email: 'That doesn’t look like a valid email address',\n\tvalidation_url: 'That doesn’t look like a valid URL',\n\tvalidation_max_chars: 'Please enter no more than {{count}} characters',\n\tvalidation_min_chars: 'Please enter {{count}} or more characters',\n\tvalidation_phone: 'Please enter a valid phone number',\n\tvalidation_country_code: 'Please select a country code',\n\tvalidation_number: 'Please enter a valid number',\n\tvalidation_number_min: 'Please enter a number greater than or equal to {{min}}',\n\tvalidation_number_max: 'Please enter a number less than or equal to {{max}}',\n\tvalidation_number_decimal_cases: 'Please enter a number with at most {{count}} decimal cases',\n\tvalidation_file: 'Please select a file',\n\tvalidation_file_ext: 'Please only upload {{ext}} files',\n\tvalidation_file_min: { one: 'Please upload at least one file', other: 'Please only upload at least {{count}} files' },\n\tvalidation_file_max: { one: 'Please only upload one file', other: 'Please only upload up to {{count}} files' },\n\tvalidation_file_size: 'Your file is too big. Please upload a file smaller than {{size}}',\n});\n\nexport type TFunction = ReturnType<typeof useTranslation>['t'];\n\nexport type ChatbotTranslationTerms = Parameters<typeof TranslationProvider>[0]['terms'];\n"],"mappings":"6BAAA,OAAS,qBAAAA,MAAyB,sBAE3B,GAAM,CAAE,oBAAAC,EAAqB,eAAAC,EAAgB,gBAAAC,EAAiB,aAAAC,CAAa,EAAIJ,EAAkB,CACvG,4BAA6B,sDAC7B,oBAAqB,sBACrB,qBAAsB,wBACtB,kBAAmB,mBACnB,SAAU,WACV,SAAU,WACV,kBAAmB,oBAEnB,cAAe,4BACf,mBAAoB,sCACpB,YAAa,CACZ,IAAK,wBACL,MAAO,wBACR,EACA,cAAe,eACf,gBAAiB,2BACjB,cAAe,gDACf,eAAgB,mCAChB,eAAgB,mBAChB,KAAM,OACN,OAAQ,SACR,cAAe,oBAEf,MAAO,SACP,MAAO,SACP,MAAO,SACP,KAAM,OACN,MAAO,QACP,SAAU,WACV,QAAS,UACT,eAAgB,mBAEhB,iBAAkB,uBAClB,iBAAkB,oDAClB,eAAgB,0CAChB,qBAAsB,iDACtB,qBAAsB,4CACtB,iBAAkB,oCAClB,wBAAyB,+BACzB,kBAAmB,8BACnB,sBAAuB,yDACvB,sBAAuB,sDACvB,gCAAiC,6DACjC,gBAAiB,uBACjB,oBAAqB,mCACrB,oBAAqB,CAAE,IAAK,kCAAmC,MAAO,6CAA8C,EACpH,oBAAqB,CAAE,IAAK,8BAA+B,MAAO,0CAA2C,EAC7G,qBAAsB,kEACvB,CAAC","names":["createTranslation","TranslationProvider","useTranslation","createTFunction","defaultTerms"]}
|
|
1
|
+
{"version":3,"sources":["../src/i18n.ts"],"sourcesContent":["import { createTranslation } from '@inploi/i18n/preact';\n\nexport const { TranslationProvider, useTranslation, createTFunction, defaultTerms } = createTranslation({\n\tsubmission_redirect_message: 'Almost there! Please complete your submission here:',\n\tcomplete_submission: 'Complete submission',\n\tsubmission_completed: 'Submission completed!',\n\tsubmission_failed: 'Failed to submit',\n\tmaximize: 'Maximise',\n\tminimize: 'Minimise',\n\tclose_application: 'Close application',\n\t/** When an application is at an invalid state, the user will get this error. */\n\tinvalid_state: 'Invalid application state',\n\tredirect_url_error: 'Couldn’t get the redirect URL.',\n\tupload_file: {\n\t\tone: 'Select file to upload',\n\t\tother: 'Select files to upload',\n\t},\n\tfile_max_size: 'max {{size}}',\n\tfile_extensions: 'Accepted file extensions',\n\taddress_error: 'Something went wrong! Plase continue manually',\n\taddress_search: 'Type and search for places…',\n\taddress_manual: 'Fill in manually',\n\tback: 'Back',\n\tsearch: 'Search',\n\tunknown_error: 'An error occurred',\n\n\tline1: 'Line 1',\n\tline2: 'Line 2',\n\tline3: 'Line 3',\n\tcity: 'City',\n\tstate: 'State',\n\tpostcode: 'Postcode',\n\tcountry: 'Country',\n\tselect_country: 'Select a country',\n\n\tvalidation_empty: 'Please enter a value',\n\tvalidation_date: 'Please enter a valid date (YYYY-MM-DD)',\n\tvalidation_email: 'That doesn’t look like a valid email address',\n\tvalidation_url: 'That doesn’t look like a valid URL',\n\tvalidation_max_chars: 'Please enter no more than {{count}} characters',\n\tvalidation_min_chars: 'Please enter {{count}} or more characters',\n\tvalidation_phone: 'Please enter a valid phone number',\n\tvalidation_country_code: 'Please select a country code',\n\tvalidation_number: 'Please enter a valid number',\n\tvalidation_number_min: 'Please enter a number greater than or equal to {{min}}',\n\tvalidation_number_max: 'Please enter a number less than or equal to {{max}}',\n\tvalidation_number_decimal_cases: 'Please enter a number with at most {{count}} decimal cases',\n\tvalidation_file: 'Please select a file',\n\tvalidation_file_ext: 'Please only upload {{ext}} files',\n\tvalidation_file_min: { one: 'Please upload at least one file', other: 'Please only upload at least {{count}} files' },\n\tvalidation_file_max: { one: 'Please only upload one file', other: 'Please only upload up to {{count}} files' },\n\tvalidation_file_size: 'Your file is too big. Please upload a file smaller than {{size}}',\n});\n\nexport type TFunction = ReturnType<typeof useTranslation>['t'];\n\nexport type ChatbotTranslationTerms = Parameters<typeof TranslationProvider>[0]['terms'];\n"],"mappings":"6BAAA,OAAS,qBAAAA,MAAyB,sBAE3B,GAAM,CAAE,oBAAAC,EAAqB,eAAAC,EAAgB,gBAAAC,EAAiB,aAAAC,CAAa,EAAIJ,EAAkB,CACvG,4BAA6B,sDAC7B,oBAAqB,sBACrB,qBAAsB,wBACtB,kBAAmB,mBACnB,SAAU,WACV,SAAU,WACV,kBAAmB,oBAEnB,cAAe,4BACf,mBAAoB,sCACpB,YAAa,CACZ,IAAK,wBACL,MAAO,wBACR,EACA,cAAe,eACf,gBAAiB,2BACjB,cAAe,gDACf,eAAgB,mCAChB,eAAgB,mBAChB,KAAM,OACN,OAAQ,SACR,cAAe,oBAEf,MAAO,SACP,MAAO,SACP,MAAO,SACP,KAAM,OACN,MAAO,QACP,SAAU,WACV,QAAS,UACT,eAAgB,mBAEhB,iBAAkB,uBAClB,gBAAiB,yCACjB,iBAAkB,oDAClB,eAAgB,0CAChB,qBAAsB,iDACtB,qBAAsB,4CACtB,iBAAkB,oCAClB,wBAAyB,+BACzB,kBAAmB,8BACnB,sBAAuB,yDACvB,sBAAuB,sDACvB,gCAAiC,6DACjC,gBAAiB,uBACjB,oBAAqB,mCACrB,oBAAqB,CAAE,IAAK,kCAAmC,MAAO,6CAA8C,EACpH,oBAAqB,CAAE,IAAK,8BAA+B,MAAO,0CAA2C,EAC7G,qBAAsB,kEACvB,CAAC","names":["createTranslation","TranslationProvider","useTranslation","createTFunction","defaultTerms"]}
|
package/dist/interpreter.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FlowNode } from '@inploi/core/flows';
|
|
2
2
|
import { InploiRpcClient, AnalyticsService, Logger } from '@inploi/sdk';
|
|
3
|
-
import { F as FlowSubmissions, a as FlowInput, R as Result, V as ValiError } from './result-
|
|
3
|
+
import { F as FlowSubmissions, a as FlowInput, R as Result, V as ValiError } from './result-e69ff761.js';
|
|
4
4
|
import { TFunction } from './i18n.mjs';
|
|
5
5
|
import { LinkedList } from './linked-list.mjs';
|
|
6
6
|
import 'preact';
|
package/dist/interpreter.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A as S,B as T,C as W,D as V,E as X,a as Y,b as P,c as z,d as k,e as K,f as h,g as $,h as j,i as C,j as B,k as E,l as G,m as q,n as w,o as v,p as L,q as R,r as c,s as O,t as y,u as f,v as d,w as p,x as D,z as U}from"./chunk-3HF7KDUR.mjs";import{b as Q}from"./chunk-DKKJHDKM.mjs";var M=Q(Y());var H=({condition:r,context:e,submissions:l,ifBlock:o})=>{let[u,...a]=r.compareKey.split(".");if(!u)return!1;let t=T({context:e,key:u,path:a,submissions:l});if(!t)return!1;switch(t.type){case"address":{let n=(0,M.default)(t.value,a.join("."));switch(r.compare){case"equals":return n===r.compareValue;case"contains":return n?n.includes(r.compareValue):!1;case"notEquals":return n!==r.compareValue;case"notContains":return n?!n.includes(r.compareValue):!0}break}case"integration":{if(typeof t.value!="object"||Array.isArray(t.value))return!1;let n=(0,M.default)(t.value,a.join(".")),s={...o,data:{...o.data,compareKey:"_temp"}};switch(typeof n){case"boolean":return _(s,{submissions:{_temp:{value:n,type:"boolean"}},context:e});case"string":return _(s,{submissions:{_temp:{value:n,type:"string"}},context:e});case"number":return _(s,{submissions:{_temp:{value:n,type:"number"}},context:e});case"object":return Array.isArray(n)&&n.every(i=>typeof i=="string")?_(s,{submissions:{_temp:{value:n,type:"enum"}},context:e}):!1}break}case"boolean":{let n=r.compareValue==="true";switch(r.compare){case"equals":return t.value===n;case"notEquals":return t.value!==n}break}case"phone":case"string":{let n=t.type==="phone"?t.value.countryCode+t.value.phoneNumber:t.value;switch(r.compare){case"equals":return n===r.compareValue;case"contains":return n?n.includes(r.compareValue):!1;case"notEquals":return n!==r.compareValue;case"notContains":return n?!n.includes(r.compareValue):!0}break}case"number":{try{let n=Number(r.compareValue);switch(r.compare){case"equals":return t.value===n;case"notEquals":return t.value!==n;case"greaterThan":return t.value>n;case"greaterThanOrEqualTo":return t.value>=n;case"lessThan":return t.value<n;case"lessThanOrEqualTo":return t.value<=n}}catch{return console.error(`Failed to parse number in if-block ${o.id}`,t.value),!1}break}case"enum":switch(r.compare){case"equals":return t.value.length===1&&t.value[0]===r.compareValue;case"notEquals":return t.value.length===1&&t.value[0]!==r.compareValue;case"contains":return t.value.includes(r.compareValue);case"notContains":return!t.value.includes(r.compareValue)}break;case"file":break;default:break}},_=(r,{context:e,submissions:l})=>{let o="combinator"in r.data?r.data.conditions:[r.data];if(("combinator"in r.data?r.data.combinator:"and")==="or"){for(let a of o)if(H({condition:a,context:e,submissions:l,ifBlock:r}))return!0;return!1}else{for(let a of o)if(!H({condition:a,context:e,submissions:l,ifBlock:r}))return!1;return!0}};var J=Q(Y());var me=/{{\s*([^}]+?)\s*(?:\|\s*([^}]+?)\s*)?}}/g,I=(r,{context:e,submissions:l})=>r.replace(me,(o,u,a="")=>{let[t,...n]=u.trim().split("."),s=T({key:t,path:n,submissions:l,context:e});if(!s)return a;switch(s.type){case"boolean":return s.value===!0?"true":"false";case"file":return s.value.map(i=>`${i.name} (${V(i.sizeKb)})`).join(", ");case"enum":return s.value.join(", ");case"address":return Object.values(s.value).filter(i=>i&&i.trim().length>0).join(", ");case"number":case"string":return s.value?s.value.toString():a;case"phone":return X(s.value);case"integration":{if(typeof s.value!="object"||Array.isArray(s.value))break;let i=(0,J.default)(s.value,n.join("."));switch(typeof i){case"boolean":return i===!0?"true":"false";case"string":return i;case"number":return i.toString();case"object":if(Array.isArray(i)&&i.every(m=>typeof m=="string"))return i.join(", ")}break}default:}return a});async function*Z(r){let{node:e,config:{logger:l,analytics:o,submissions:u,next:a}}=r;return o.service.log({event:"IDENTIFY",properties:{identifier:S({key:e.data.key,submissions:u}).toString(),first_name:e.data.firstName?S({key:e.data.firstName,submissions:u}).toString():void 0,last_name:e.data.lastName?S({key:e.data.lastName,submissions:u}).toString():void 0,email:e.data.email?S({key:e.data.email,submissions:u}).toString():void 0,phone_number:e.data.phoneNumber?S({key:e.data.phoneNumber,submissions:u}).toString():void 0,custom_traits:e.data.customTraits?Object.fromEntries(e.data.customTraits.map(({key:t,value:n})=>[t,u[n]?.value])):void 0}}).catch(l.error),a(e.nextId)}import{endpoint as pe,typed as ce}from"@inploi/sdk";var ee=v({success:G(),integration_response:v({service:L(c()),status:w(),data:O(),error:q(v({message:c(),data:O()}))})}),fe=pe({pathname:"/flow/submit",method:"POST",schema:{response:ee,body:ce()}});async function*te(r){let{node:e,config:{rpcClient:l,submissions:o,actions:u,next:a,analytics:t,logger:n,context:s}}=r;return e.data.skipConfirmation!==!0&&(yield u.input("submit",{config:{key:e.data.key??"_SUBMIT",label:e.data.submitLabel},validate:async()=>{let m=D(t.service.getSessionInfo)();m.err&&n.error(m.val.originalError);try{let g=await l.request(fe,{body:{log_submit:!1,integration_id:e.data.integrationId,anonymous_id:m.ok?m.val.anonymous_id:void 0,session_id:m.ok?m.val.session_id:void 0,job:s.job,submissions:U(o)}}),b=f(ee,g);return b.success===!1?p(b.issues):d(b.output)}catch(g){let b=[{input:g,origin:"value",reason:"unknown",validation:"API error",message:g instanceof Error?g.message:"toString"in g?g.toString():"Unknown error"}];return p(b)}}})),a(e.nextId)}var N=y(q(L(c())),C(r=>r===null?void 0:r)),ye=({node:r})=>{let e=r.data.keys;return v({[e.line1??"line1"]:N,[e.line2??"line2"]:N,[e.line3??"line3"]:N,[e.city??"city"]:N,[e.country??"country"]:N,[e.postcode??"postcode"]:N,[e.state??"state"]:N})};async function*re(r){let{node:e,config:{submissions:l,actions:o,next:u}}=r;return yield o.text({author:"bot",message:e.data.question}),yield o.input("address",{config:{key:e.data.key,keys:e.data.keys,placeholder:e.data.placeholder,optional:e.data.optional},validate:a=>{if(e.data.optional&&a===null)return d(a);let t=ye(r),n=f(t,a);return n.success===!1?p(n.issues):(l[e.data.key]={type:"address",value:n.output},d(a))}}),u(e.nextId)}var ge=["true","false"],ve=R(ge);async function*ne(r){let{node:e,config:{submissions:l,actions:o,next:u}}=r;return yield o.text({author:"bot",message:e.data.question}),yield o.input("boolean",{config:{key:e.data.key,labels:{false:e.data.falseLabel,true:e.data.trueLabel},optional:e.data.optional},validate:a=>{if(e.data.optional&&a===null)return d(a);let t=f(ve,a);return t.success===!1?p(t.issues):(l[e.data.key]={type:"boolean",value:t.output==="true"},d(a))}}),u(e.nextId)}async function*ae(r){let{node:e,config:{submissions:l,actions:o,next:u}}=r;yield o.text({author:"bot",message:e.data.question});let a=E(R(e.data.options.map(t=>t.value)));return yield o.input("multiple-choice",{config:{key:e.data.key,options:e.data.options,maxSelected:e.data.maxSelected,minSelected:e.data.minSelected},validate:t=>{if(e.data.minSelected===0&&t===null)return d(t);let n=f(a,t);return n.success===!1?p(n.issues):(l[e.data.key]={type:"enum",value:n.output},d(t))}}),u(e.nextId)}async function*oe(r){let{node:e,config:{submissions:l,actions:o,next:u,t:a}}=r;return yield o.text({author:"bot",message:e.data.question}),yield o.input("file",{config:{key:e.data.key,allowMultiple:e.data.multiple===!0,extensions:e.data.extensions,fileSizeLimitKib:e.data.maxSizeKb,optional:e.data.optional},validate:t=>{if(e.data.optional&&t===null)return d(t);let n=e.data.optional?0:1,s=e.data.multiple?Number.POSITIVE_INFINITY:1,i=e.data.maxSizeKb??0,m=e.data.extensions.map(F=>F.toLowerCase()),g=y(E(v({name:y(c(a("validation_empty")),P(F=>{let A=W(F);return A.ok===!1?!1:m.includes(A.val.toLowerCase())},a("validation_file_ext",{ext:m.join(", ")}))),data:c(),sizeKb:w()})),h(n,a("validation_file_min",{count:n})),k(s,a("validation_file_max",{count:s})),P(F=>F.reduce((le,de)=>le+de.sizeKb,0)<=i,a("validation_file_size",{size:V(i)}))),b=f(g,t);return b.success===!1?p(b.issues):(l[e.data.key]={type:"file",value:b.output},d(t))}}),u(e.nextId)}var be=({node:r,config:{t:e}})=>{let l=r.data.min??Number.MIN_SAFE_INTEGER,o=r.data.max??Number.MAX_SAFE_INTEGER,u=r.data.decimalCases??0;return y(w(e("validation_number")),$(l,e("validation_number_min",{min:l})),K(o,e("validation_number_max",{max:o})),P(a=>a===Number(a.toFixed(u)),e("validation_number_decimal_cases",{count:u})))};async function*se(r){let{node:e,config:{submissions:l,actions:o,next:u}}=r;yield o.text({author:"bot",message:e.data.question});let a=l[e.data.key];return yield o.input("number",{config:{key:e.data.key,placeholder:e.data.placeholder,optional:e.data.optional,decimalCases:e.data.decimalCases,max:e.data.max,min:e.data.min,defaultValue:a?.type==="number"?a.value.toString():void 0},validate:t=>{if(e.data.optional&&t===null)return d(t);let n=be(r),s=f(n,t);return s.success===!1?p(s.issues):(l[e.data.key]={type:"number",value:s.output},d(t))}}),u(e.nextId)}var he=({node:r,config:{t:e}})=>v({countryCode:y(c(e("validation_country_code")),j(/^\+?[0-9 -]+$/,e("validation_country_code"))),phoneNumber:y(c(e("validation_phone")),j(/^\+?[0-9 -]+$/,e("validation_phone")),h(r.data.minChars,e("validation_min_chars",{count:r.data.minChars})),C(l=>l.replace(/[^0-9]/g,"")))});async function*ie(r){let{node:e,config:{actions:l,next:o,submissions:u}}=r;yield l.text({author:"bot",message:e.data.question});let a=u[e.data.key];return yield l.input("phone",{config:{key:e.data.key,minChars:e.data.minChars,defaultValue:a?.type==="phone"?a.value:{countryCode:e.data.defaultCountryCode},placeholder:e.data.placeholder,submissionFormat:"phone",optional:e.data.optional},validate:t=>{if(e.data.optional&&t===null)return d(t);let n=he(r),s=f(n,t);return s.success===!1?p(s.issues):(u[e.data.key]={type:"address",value:s.output},d(t))}}),o(e.nextId)}var Ie=({node:r,config:{t:e,logger:l}})=>{let o={email:e("validation_email"),url:e("validation_url"),maxLength:e("validation_max_chars",{count:r.data.maxChars??999}),minLength:e("validation_min_chars",{count:r.data.minChars??1})};switch(r.data.format){case"email":return y(c(o.email),z(o.email),h(r.data.minChars??1,o.minLength),k(r.data.maxChars??1/0,o.maxLength));case"text":return y(c(),h(r.data.minChars??1,o.minLength),k(r.data.maxChars??1/0,o.maxLength));case"url":return y(c(),B(o.url),h(r.data.minChars??1,o.minLength),k(r.data.maxChars??1/0,o.maxLength));case"phone":return y(c(),h(r.data.minChars??1,o.minLength),k(r.data.maxChars??1/0,o.maxLength));default:return r.data.format,l.error(`Unsupported question-text format: ${r.data.format}`),null}};async function*ue(r){let{node:e,config:{submissions:l,actions:o,next:u}}=r;yield o.text({author:"bot",message:e.data.question});let a=l[e.data.key];return yield o.input("text",{config:{key:e.data.key,maxChars:e.data.maxChars,minChars:e.data.minChars,placeholder:e.data.placeholder,format:e.data.format,optional:e.data.optional,defaultValue:a?.type==="string"?a.value:void 0},validate:t=>{if(e.data.optional&&t===null)return d(t);let n=Ie(r);if(n===null)return d(t);let s=f(n,t);return s.success===!1?p(s.issues):(l[e.data.key]={type:"string",value:s.output},d(t))}}),u(e.nextId)}var nt=r=>{let e={};return{interpret:async function*({nodes:o,context:u}){let a={error:({message:i})=>({type:"error",message:I(i,{submissions:e,context:u})}),info:({message:i})=>({type:"info",message:I(i,{submissions:e,context:u})}),success:({message:i})=>({type:"success",message:I(i,{submissions:e,context:u})}),text:({message:i,author:m})=>({type:"text",author:m,message:I(i,{submissions:e,context:u})}),image:({url:i,height:m,width:g})=>({type:"image",url:I(i,{submissions:e,context:u}),height:m,width:g}),state:i=>({type:"state",state:i}),link:({href:i,message:m})=>({type:"link",href:I(i,{submissions:e,context:u}),message:I(m,{submissions:e,context:u})}),submissions:i=>({type:"submissions",submissions:i}),input:(i,m)=>({type:"input",input:{type:i,config:m.config,validate:m.validate}})};if(!o.headId)return{type:"error",message:"No head node found"};let t=o.items[o.headId],n=i=>{if(!i)return t=void 0,{type:"next",nodeId:void 0};let m=o.items[i];if(!m)throw new Error(`Next node with id ${i} not found`);return t=m,{type:"next",nodeId:i}},s={...r,context:u,submissions:e,next:n,actions:a};for(;t;){switch(t.type){case"text":yield a.text({author:"bot",message:t.data.text}),n(t.nextId);break;case"image":yield a.image(t.data),n(t.nextId);break;case"link":yield a.link({href:t.data.href,message:t.data.cta}),n(t.nextId);break;case"add-submission":e[t.data.key]={type:"string",value:t.data.value},n(t.nextId);break;case"jump":n(t.data.targetId);break;case"question-text":yield*ue({config:s,node:t});break;case"question-phone":yield*ie({config:s,node:t});break;case"question-boolean":yield*ne({config:s,node:t});break;case"question-number":yield*se({config:s,node:t});break;case"question-address":yield*re({config:s,node:t});break;case"question-enum":yield*ae({config:s,node:t});break;case"question-file":yield*oe({config:s,node:t});break;case"identify":{yield*Z({config:s,node:t});break}case"if-block":{let i=_(t,{context:s.context,submissions:e})?t.branchId:t.nextId;n(i);break}case"integration-application-submit":yield*te({config:s,node:t});break;case"feedback":yield a.error({message:"Not implemented"});break;case"integration-workflow-get":yield a.error({message:"This message should never be reached"});break;case"end-flow":t=void 0;break}yield a.submissions(e)}yield{type:"end"}}}};export{nt as createFlowInterpreter};
|
|
1
|
+
import{A as S,B as V,C as W,D as A,E as X,a as Y,b as P,c as z,d as k,e as K,f as h,g as $,h as C,i as E,j as B,k as q,l as G,m as L,n as w,o as v,p as R,q as T,r as p,s as O,t as f,u as y,v as d,w as c,x as D,z as U}from"./chunk-H5IXVEP2.mjs";import{b as Q}from"./chunk-DKKJHDKM.mjs";var M=Q(Y());var H=({condition:r,context:e,submissions:l,ifBlock:a})=>{let[u,...o]=r.compareKey.split(".");if(!u)return!1;let t=V({context:e,key:u,path:o,submissions:l});if(!t)return!1;switch(t.type){case"address":{let n=(0,M.default)(t.value,o.join("."));switch(r.compare){case"equals":return n===r.compareValue;case"contains":return n?n.includes(r.compareValue):!1;case"notEquals":return n!==r.compareValue;case"notContains":return n?!n.includes(r.compareValue):!0}break}case"integration":{if(typeof t.value!="object"||Array.isArray(t.value))return!1;let n=(0,M.default)(t.value,o.join(".")),s={...a,data:{...a.data,compareKey:"_temp"}};switch(typeof n){case"boolean":return _(s,{submissions:{_temp:{value:n,type:"boolean"}},context:e});case"string":return _(s,{submissions:{_temp:{value:n,type:"string"}},context:e});case"number":return _(s,{submissions:{_temp:{value:n,type:"number"}},context:e});case"object":return Array.isArray(n)&&n.every(i=>typeof i=="string")?_(s,{submissions:{_temp:{value:n,type:"enum"}},context:e}):!1}break}case"boolean":{let n=r.compareValue==="true";switch(r.compare){case"equals":return t.value===n;case"notEquals":return t.value!==n}break}case"phone":case"string":{let n=t.type==="phone"?t.value.countryCode+t.value.phoneNumber:t.value;switch(r.compare){case"equals":return n===r.compareValue;case"contains":return n?n.includes(r.compareValue):!1;case"notEquals":return n!==r.compareValue;case"notContains":return n?!n.includes(r.compareValue):!0}break}case"number":{try{let n=Number(r.compareValue);switch(r.compare){case"equals":return t.value===n;case"notEquals":return t.value!==n;case"greaterThan":return t.value>n;case"greaterThanOrEqualTo":return t.value>=n;case"lessThan":return t.value<n;case"lessThanOrEqualTo":return t.value<=n}}catch{return console.error(`Failed to parse number in if-block ${a.id}`,t.value),!1}break}case"enum":switch(r.compare){case"equals":return t.value.length===1&&t.value[0]===r.compareValue;case"notEquals":return t.value.length===1&&t.value[0]!==r.compareValue;case"contains":return t.value.includes(r.compareValue);case"notContains":return!t.value.includes(r.compareValue)}break;case"file":break;default:break}},_=(r,{context:e,submissions:l})=>{let a="combinator"in r.data?r.data.conditions:[r.data];if(("combinator"in r.data?r.data.combinator:"and")==="or"){for(let o of a)if(H({condition:o,context:e,submissions:l,ifBlock:r}))return!0;return!1}else{for(let o of a)if(!H({condition:o,context:e,submissions:l,ifBlock:r}))return!1;return!0}};var J=Q(Y());var me=/{{\s*([^}]+?)\s*(?:\|\s*([^}]+?)\s*)?}}/g,I=(r,{context:e,submissions:l})=>r.replace(me,(a,u,o="")=>{let[t,...n]=u.trim().split("."),s=V({key:t,path:n,submissions:l,context:e});if(!s)return o;switch(s.type){case"boolean":return s.value===!0?"true":"false";case"file":return s.value.map(i=>`${i.name} (${A(i.sizeKb)})`).join(", ");case"enum":return s.value.join(", ");case"address":return Object.values(s.value).filter(i=>i&&i.trim().length>0).join(", ");case"number":case"string":return s.value?s.value.toString():o;case"phone":return X(s.value);case"integration":{if(typeof s.value!="object"||Array.isArray(s.value))break;let i=(0,J.default)(s.value,n.join("."));switch(typeof i){case"boolean":return i===!0?"true":"false";case"string":return i;case"number":return i.toString();case"object":if(Array.isArray(i)&&i.every(m=>typeof m=="string"))return i.join(", ")}break}default:}return o});async function*Z(r){let{node:e,config:{logger:l,analytics:a,submissions:u,next:o}}=r;return a.service.log({event:"IDENTIFY",properties:{identifier:S({key:e.data.key,submissions:u}).toString(),first_name:e.data.firstName?S({key:e.data.firstName,submissions:u}).toString():void 0,last_name:e.data.lastName?S({key:e.data.lastName,submissions:u}).toString():void 0,email:e.data.email?S({key:e.data.email,submissions:u}).toString():void 0,phone_number:e.data.phoneNumber?S({key:e.data.phoneNumber,submissions:u}).toString():void 0,custom_traits:e.data.customTraits?Object.fromEntries(e.data.customTraits.map(({key:t,value:n})=>[t,u[n]?.value])):void 0}}).catch(l.error),o(e.nextId)}import{endpoint as pe,typed as ce}from"@inploi/sdk";var ee=v({success:G(),integration_response:v({service:R(p()),status:w(),data:O(),error:L(v({message:p(),data:O()}))})}),fe=pe({pathname:"/flow/submit",method:"POST",schema:{response:ee,body:ce()}});async function*te(r){let{node:e,config:{rpcClient:l,submissions:a,actions:u,next:o,analytics:t,logger:n,context:s}}=r;return e.data.skipConfirmation!==!0&&(yield u.input("submit",{config:{key:e.data.key??"_SUBMIT",label:e.data.submitLabel},validate:async()=>{let m=D(t.service.getSessionInfo)();m.err&&n.error(m.val.originalError);try{let g=await l.request(fe,{body:{log_submit:!1,integration_id:e.data.integrationId,anonymous_id:m.ok?m.val.anonymous_id:void 0,session_id:m.ok?m.val.session_id:void 0,job:s.job,submissions:U(a)}}),b=y(ee,g);return b.success===!1?c(b.issues):d(b.output)}catch(g){let b=[{input:g,origin:"value",reason:"unknown",validation:"API error",message:g instanceof Error?g.message:"toString"in g?g.toString():"Unknown error"}];return c(b)}}})),o(e.nextId)}var N=f(L(R(p())),E(r=>r===null?void 0:r)),ye=({node:r})=>{let e=r.data.keys;return v({[e.line1??"line1"]:N,[e.line2??"line2"]:N,[e.line3??"line3"]:N,[e.city??"city"]:N,[e.country??"country"]:N,[e.postcode??"postcode"]:N,[e.state??"state"]:N})};async function*re(r){let{node:e,config:{submissions:l,actions:a,next:u}}=r;return yield a.text({author:"bot",message:e.data.question}),yield a.input("address",{config:{key:e.data.key,keys:e.data.keys,placeholder:e.data.placeholder,optional:e.data.optional},validate:o=>{if(e.data.optional&&o===null)return d(o);let t=ye(r),n=y(t,o);return n.success===!1?c(n.issues):(l[e.data.key]={type:"address",value:n.output},d(o))}}),u(e.nextId)}var ge=["true","false"],ve=T(ge);async function*ne(r){let{node:e,config:{submissions:l,actions:a,next:u}}=r;return yield a.text({author:"bot",message:e.data.question}),yield a.input("boolean",{config:{key:e.data.key,labels:{false:e.data.falseLabel,true:e.data.trueLabel},optional:e.data.optional},validate:o=>{if(e.data.optional&&o===null)return d(o);let t=y(ve,o);return t.success===!1?c(t.issues):(l[e.data.key]={type:"boolean",value:t.output==="true"},d(o))}}),u(e.nextId)}async function*ae(r){let{node:e,config:{submissions:l,actions:a,next:u}}=r;yield a.text({author:"bot",message:e.data.question});let o=q(T(e.data.options.map(t=>t.value)));return yield a.input("multiple-choice",{config:{key:e.data.key,options:e.data.options,maxSelected:e.data.maxSelected,minSelected:e.data.minSelected},validate:t=>{if(e.data.minSelected===0&&t===null)return d(t);let n=y(o,t);return n.success===!1?c(n.issues):(l[e.data.key]={type:"enum",value:n.output},d(t))}}),u(e.nextId)}async function*oe(r){let{node:e,config:{submissions:l,actions:a,next:u,t:o}}=r;return yield a.text({author:"bot",message:e.data.question}),yield a.input("file",{config:{key:e.data.key,allowMultiple:e.data.multiple===!0,extensions:e.data.extensions,fileSizeLimitKib:e.data.maxSizeKb,optional:e.data.optional},validate:t=>{if(e.data.optional&&t===null)return d(t);let n=e.data.optional?0:1,s=e.data.multiple?Number.POSITIVE_INFINITY:1,i=e.data.maxSizeKb??0,m=e.data.extensions.map(F=>F.toLowerCase()),g=f(q(v({name:f(p(o("validation_empty")),P(F=>{let j=W(F);return j.ok===!1?!1:m.includes(j.val.toLowerCase())},o("validation_file_ext",{ext:m.join(", ")}))),data:p(),sizeKb:w()})),h(n,o("validation_file_min",{count:n})),k(s,o("validation_file_max",{count:s})),P(F=>F.reduce((le,de)=>le+de.sizeKb,0)<=i,o("validation_file_size",{size:A(i)}))),b=y(g,t);return b.success===!1?c(b.issues):(l[e.data.key]={type:"file",value:b.output},d(t))}}),u(e.nextId)}var be=({node:r,config:{t:e}})=>{let l=r.data.min??Number.MIN_SAFE_INTEGER,a=r.data.max??Number.MAX_SAFE_INTEGER,u=r.data.decimalCases??0;return f(w(e("validation_number")),$(l,e("validation_number_min",{min:l})),K(a,e("validation_number_max",{max:a})),P(o=>o===Number(o.toFixed(u)),e("validation_number_decimal_cases",{count:u})))};async function*se(r){let{node:e,config:{submissions:l,actions:a,next:u}}=r;yield a.text({author:"bot",message:e.data.question});let o=l[e.data.key];return yield a.input("number",{config:{key:e.data.key,placeholder:e.data.placeholder,optional:e.data.optional,decimalCases:e.data.decimalCases,max:e.data.max,min:e.data.min,defaultValue:o?.type==="number"?o.value.toString():void 0},validate:t=>{if(e.data.optional&&t===null)return d(t);let n=be(r),s=y(n,t);return s.success===!1?c(s.issues):(l[e.data.key]={type:"number",value:s.output},d(t))}}),u(e.nextId)}var he=({node:r,config:{t:e}})=>v({countryCode:f(p(e("validation_country_code")),C(/^\+?[0-9 -]+$/,e("validation_country_code"))),phoneNumber:f(p(e("validation_phone")),C(/^\+?[0-9 -]+$/,e("validation_phone")),h(r.data.minChars,e("validation_min_chars",{count:r.data.minChars})),E(l=>l.replace(/[^0-9]/g,"")))});async function*ie(r){let{node:e,config:{actions:l,next:a,submissions:u}}=r;yield l.text({author:"bot",message:e.data.question});let o=u[e.data.key];return yield l.input("phone",{config:{key:e.data.key,minChars:e.data.minChars,defaultValue:o?.type==="phone"?o.value:{countryCode:e.data.defaultCountryCode},placeholder:e.data.placeholder,submissionFormat:"phone",optional:e.data.optional},validate:t=>{if(e.data.optional&&t===null)return d(t);let n=he(r),s=y(n,t);return s.success===!1?c(s.issues):(u[e.data.key]={type:"address",value:s.output},d(t))}}),a(e.nextId)}var Ie=({node:r,config:{t:e,logger:l}})=>{let a={date:e("validation_date"),email:e("validation_email"),url:e("validation_url"),maxLength:e("validation_max_chars",{count:r.data.maxChars??999}),minLength:e("validation_min_chars",{count:r.data.minChars??1})};switch(r.data.format){case"date":return f(p(a.date),C(/^\d{4}-\d{2}-\d{2}$/,a.date));case"email":return f(p(a.email),z(a.email),h(r.data.minChars??1,a.minLength),k(r.data.maxChars??1/0,a.maxLength));case"text":return f(p(),h(r.data.minChars??1,a.minLength),k(r.data.maxChars??1/0,a.maxLength));case"url":return f(p(),B(a.url),h(r.data.minChars??1,a.minLength),k(r.data.maxChars??1/0,a.maxLength));case"phone":return f(p(),h(r.data.minChars??1,a.minLength),k(r.data.maxChars??1/0,a.maxLength));default:return r.data.format,l.error(`Unsupported question-text format: ${r.data.format}`),null}};async function*ue(r){let{node:e,config:{submissions:l,actions:a,next:u}}=r;yield a.text({author:"bot",message:e.data.question});let o=l[e.data.key];return yield a.input("text",{config:{key:e.data.key,maxChars:e.data.maxChars,minChars:e.data.minChars,placeholder:e.data.placeholder,format:e.data.format,optional:e.data.optional,defaultValue:o?.type==="string"?o.value:void 0},validate:t=>{if(e.data.optional&&t===null)return d(t);let n=Ie(r);if(n===null)return d(t);let s=y(n,t);return s.success===!1?c(s.issues):(l[e.data.key]={type:"string",value:s.output},d(t))}}),u(e.nextId)}var nt=r=>{let e={};return{interpret:async function*({nodes:a,context:u}){let o={error:({message:i})=>({type:"error",message:I(i,{submissions:e,context:u})}),info:({message:i})=>({type:"info",message:I(i,{submissions:e,context:u})}),success:({message:i})=>({type:"success",message:I(i,{submissions:e,context:u})}),text:({message:i,author:m})=>({type:"text",author:m,message:I(i,{submissions:e,context:u})}),image:({url:i,height:m,width:g})=>({type:"image",url:I(i,{submissions:e,context:u}),height:m,width:g}),state:i=>({type:"state",state:i}),link:({href:i,message:m})=>({type:"link",href:I(i,{submissions:e,context:u}),message:I(m,{submissions:e,context:u})}),submissions:i=>({type:"submissions",submissions:i}),input:(i,m)=>({type:"input",input:{type:i,config:m.config,validate:m.validate}})};if(!a.headId)return{type:"error",message:"No head node found"};let t=a.items[a.headId],n=i=>{if(!i)return t=void 0,{type:"next",nodeId:void 0};let m=a.items[i];if(!m)throw new Error(`Next node with id ${i} not found`);return t=m,{type:"next",nodeId:i}},s={...r,context:u,submissions:e,next:n,actions:o};for(;t;){switch(t.type){case"text":yield o.text({author:"bot",message:t.data.text}),n(t.nextId);break;case"image":yield o.image(t.data),n(t.nextId);break;case"link":yield o.link({href:t.data.href,message:t.data.cta}),n(t.nextId);break;case"add-submission":e[t.data.key]={type:"string",value:t.data.value},n(t.nextId);break;case"jump":n(t.data.targetId);break;case"question-text":yield*ue({config:s,node:t});break;case"question-phone":yield*ie({config:s,node:t});break;case"question-boolean":yield*ne({config:s,node:t});break;case"question-number":yield*se({config:s,node:t});break;case"question-address":yield*re({config:s,node:t});break;case"question-enum":yield*ae({config:s,node:t});break;case"question-file":yield*oe({config:s,node:t});break;case"identify":{yield*Z({config:s,node:t});break}case"if-block":{let i=_(t,{context:s.context,submissions:e})?t.branchId:t.nextId;n(i);break}case"integration-application-submit":yield*te({config:s,node:t});break;case"feedback":yield o.error({message:"Not implemented"});break;case"integration-workflow-get":yield o.error({message:"This message should never be reached"});break;case"end-flow":t=void 0;break}yield o.submissions(e)}yield{type:"end"}}}};export{nt as createFlowInterpreter};
|
|
2
2
|
//# sourceMappingURL=interpreter.mjs.map
|
package/dist/interpreter.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/conditions.ts","../src/interpolation.ts","../src/interpreter.identify.ts","../src/interpreter.integration-application-submit.ts","../src/interpreter.question-address.ts","../src/interpreter.question-boolean.ts","../src/interpreter.question-enum.ts","../src/interpreter.question-file.ts","../src/interpreter.question-number.ts","../src/interpreter.question-phone.ts","../src/interpreter.question-text.ts","../src/interpreter.ts"],"sourcesContent":["import { IfBlockNode, IfBlockNodeCondition } from '@inploi/core/flows';\nimport get from 'lodash/get';\n\nimport { FlowSubmissions } from './flow.types';\nimport { getSubmissionValueToCheck } from './utils';\n\nconst isConditionMet = ({\n\tcondition,\n\tcontext,\n\tsubmissions,\n\tifBlock,\n}: {\n\tcontext: Record<string, unknown>;\n\tcondition: IfBlockNodeCondition;\n\tsubmissions: FlowSubmissions;\n\tifBlock: IfBlockNode;\n}) => {\n\tconst [firstSegment, ...path] = condition.compareKey.split('.');\n\tif (!firstSegment) return false;\n\n\tconst answer = getSubmissionValueToCheck({ context, key: firstSegment, path, submissions });\n\tif (!answer) return false;\n\n\tswitch (answer.type) {\n\t\tcase 'address': {\n\t\t\tconst value = get(answer.value, path.join('.'));\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn value === condition.compareValue;\n\t\t\t\tcase 'contains':\n\t\t\t\t\tif (!value) return false;\n\t\t\t\t\treturn value.includes(condition.compareValue);\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn value !== condition.compareValue;\n\t\t\t\tcase 'notContains':\n\t\t\t\t\tif (!value) return true;\n\t\t\t\t\treturn !value.includes(condition.compareValue);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'integration': {\n\t\t\t/** We only handle objects as integration submissions for now. */\n\t\t\tif (typeof answer.value !== 'object') return false;\n\t\t\tif (Array.isArray(answer.value)) return false;\n\n\t\t\tconst value = get(answer.value, path.join('.'));\n\t\t\tconst newIfBlock = { ...ifBlock, data: { ...ifBlock.data, compareKey: '_temp' } };\n\t\t\tswitch (typeof value) {\n\t\t\t\tcase 'boolean':\n\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'boolean' } },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t});\n\t\t\t\tcase 'string':\n\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'string' } },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t});\n\t\t\t\tcase 'number':\n\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'number' } },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t});\n\t\t\t\tcase 'object':\n\t\t\t\t\t/** We only handle enums if the result is an array of strings */\n\t\t\t\t\tif (Array.isArray(value) && value.every((value): value is string => typeof value === 'string')) {\n\t\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'enum' } },\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'boolean': {\n\t\t\tconst compareBoolean = condition.compareValue === 'true';\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn answer.value === compareBoolean;\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn answer.value !== compareBoolean;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'phone':\n\t\tcase 'string': {\n\t\t\tconst value = answer.type === 'phone' ? answer.value.countryCode + answer.value.phoneNumber : answer.value;\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn value === condition.compareValue;\n\t\t\t\tcase 'contains':\n\t\t\t\t\tif (!value) return false;\n\t\t\t\t\treturn value.includes(condition.compareValue);\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn value !== condition.compareValue;\n\t\t\t\tcase 'notContains':\n\t\t\t\t\tif (!value) return true;\n\t\t\t\t\treturn !value.includes(condition.compareValue);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'number': {\n\t\t\ttry {\n\t\t\t\tconst compareNumber = Number(condition.compareValue);\n\t\t\t\tswitch (condition.compare) {\n\t\t\t\t\tcase 'equals':\n\t\t\t\t\t\treturn answer.value === compareNumber;\n\t\t\t\t\tcase 'notEquals':\n\t\t\t\t\t\treturn answer.value !== compareNumber;\n\t\t\t\t\tcase 'greaterThan':\n\t\t\t\t\t\treturn answer.value > compareNumber;\n\t\t\t\t\tcase 'greaterThanOrEqualTo':\n\t\t\t\t\t\treturn answer.value >= compareNumber;\n\t\t\t\t\tcase 'lessThan':\n\t\t\t\t\t\treturn answer.value < compareNumber;\n\t\t\t\t\tcase 'lessThanOrEqualTo':\n\t\t\t\t\t\treturn answer.value <= compareNumber;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.error(`Failed to parse number in if-block ${ifBlock.id}`, answer.value);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'enum':\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn answer.value.length === 1 && answer.value[0] === condition.compareValue;\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn answer.value.length === 1 && answer.value[0] !== condition.compareValue;\n\t\t\t\tcase 'contains':\n\t\t\t\t\treturn answer.value.includes(condition.compareValue);\n\t\t\t\tcase 'notContains':\n\t\t\t\t\treturn !answer.value.includes(condition.compareValue);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'file':\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tanswer satisfies never;\n\t\t\tbreak;\n\t}\n};\n\nexport const isIfBlockConditionMet = (\n\tifBlock: IfBlockNode,\n\t{ context, submissions }: { submissions: FlowSubmissions; context: Record<string, unknown> },\n): boolean => {\n\tconst conditions = 'combinator' in ifBlock.data ? ifBlock.data.conditions : [ifBlock.data];\n\tconst combinator = 'combinator' in ifBlock.data ? ifBlock.data.combinator : 'and';\n\n\tif (combinator === 'or') {\n\t\tfor (const condition of conditions) {\n\t\t\tconst isMet = isConditionMet({ condition, context, submissions, ifBlock });\n\t\t\tif (isMet) return true;\n\t\t}\n\t\treturn false;\n\t} else {\n\t\tfor (const condition of conditions) {\n\t\t\tconst isMet = isConditionMet({ condition, context, submissions, ifBlock });\n\t\t\tif (!isMet) return false;\n\t\t}\n\t\treturn true;\n\t}\n};\n","import get from 'lodash/get';\n\nimport { FlowSubmissions } from './flow.types';\nimport { formatPhoneNumber, getSubmissionValueToCheck, kbToReadableSize } from './utils';\n\nconst HANDLEBARS_REGEXP = /{{\\s*([^}]+?)\\s*(?:\\|\\s*([^}]+?)\\s*)?}}/g;\n\nexport const interpolateWithData = (\n\tstr: string,\n\t{ context, submissions }: { submissions: FlowSubmissions; context: Record<string, unknown> },\n) => {\n\treturn str.replace(HANDLEBARS_REGEXP, (_, key, defaultValue = '') => {\n\t\tconst [firstSegment, ...path] = key.trim().split('.');\n\t\tconst entity = getSubmissionValueToCheck({ key: firstSegment, path, submissions, context });\n\t\tif (!entity) return defaultValue;\n\n\t\tswitch (entity.type) {\n\t\t\tcase 'boolean':\n\t\t\t\treturn entity.value === true ? 'true' : 'false';\n\t\t\tcase 'file':\n\t\t\t\treturn entity.value.map(file => `${file.name} (${kbToReadableSize(file.sizeKb)})`).join(', ');\n\t\t\tcase 'enum':\n\t\t\t\treturn entity.value.join(', ');\n\t\t\tcase 'address':\n\t\t\t\treturn Object.values(entity.value)\n\t\t\t\t\t.filter(line => line && line.trim().length > 0)\n\t\t\t\t\t.join(', ');\n\t\t\tcase 'number':\n\t\t\tcase 'string':\n\t\t\t\tif (!entity.value) return defaultValue;\n\t\t\t\treturn entity.value.toString();\n\t\t\tcase 'phone':\n\t\t\t\treturn formatPhoneNumber(entity.value);\n\t\t\tcase 'integration': {\n\t\t\t\t/** We only handle objects as integration submissions for now. */\n\t\t\t\tif (typeof entity.value !== 'object') break;\n\t\t\t\tif (Array.isArray(entity.value)) break;\n\n\t\t\t\tconst value = get(entity.value, path.join('.'));\n\t\t\t\tswitch (typeof value) {\n\t\t\t\t\tcase 'boolean':\n\t\t\t\t\t\treturn value === true ? 'true' : 'false';\n\t\t\t\t\tcase 'string':\n\t\t\t\t\t\treturn value;\n\t\t\t\t\tcase 'number':\n\t\t\t\t\t\treturn value.toString();\n\t\t\t\t\tcase 'object':\n\t\t\t\t\t\t/** We only handle enums if the result is an array of strings */\n\t\t\t\t\t\tif (Array.isArray(value) && value.every((i): i is string => typeof i === 'string')) {\n\t\t\t\t\t\t\treturn value.join(', ');\n\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tentity satisfies never;\n\t\t}\n\t\treturn defaultValue;\n\t});\n};\n","import { InterpretNodeParams } from './interpreter';\nimport { getSubmissionValue } from './utils';\n\nexport async function* interpretIdentifyNode(params: InterpretNodeParams<'identify'>) {\n\tconst {\n\t\tnode,\n\t\tconfig: { logger, analytics, submissions, next },\n\t} = params;\n\n\tanalytics.service\n\t\t.log({\n\t\t\tevent: 'IDENTIFY',\n\t\t\tproperties: {\n\t\t\t\tidentifier: getSubmissionValue({ key: node.data.key, submissions }).toString(),\n\t\t\t\tfirst_name:\n\t\t\t\t\tnode.data.firstName ? getSubmissionValue({ key: node.data.firstName, submissions }).toString() : undefined,\n\t\t\t\tlast_name:\n\t\t\t\t\tnode.data.lastName ? getSubmissionValue({ key: node.data.lastName, submissions }).toString() : undefined,\n\t\t\t\temail: node.data.email ? getSubmissionValue({ key: node.data.email, submissions }).toString() : undefined,\n\t\t\t\tphone_number:\n\t\t\t\t\tnode.data.phoneNumber ?\n\t\t\t\t\t\tgetSubmissionValue({ key: node.data.phoneNumber, submissions }).toString()\n\t\t\t\t\t:\tundefined,\n\t\t\t\tcustom_traits:\n\t\t\t\t\tnode.data.customTraits ?\n\t\t\t\t\t\tObject.fromEntries(node.data.customTraits.map(({ key, value }) => [key, submissions[value]?.value]))\n\t\t\t\t\t:\tundefined,\n\t\t\t},\n\t\t})\n\t\t.catch(logger.error);\n\n\treturn next(node.nextId);\n}\n","import { endpoint, typed } from '@inploi/sdk';\nimport * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok, tryCatch } from './result';\nimport { getFlowSubmissionsPayload } from './utils';\n\nconst responseSchema = v.object({\n\t/** Not necessarily true when we receive a positive response because the API considers only 200 as success */\n\tsuccess: v.boolean(),\n\tintegration_response: v.object({\n\t\tservice: v.optional(v.string()),\n\t\tstatus: v.number(),\n\t\tdata: v.unknown(),\n\t\terror: v.nullable(v.object({ message: v.string(), data: v.unknown() })),\n\t}),\n});\nexport type IntegrationResponse = v.InferOutput<typeof responseSchema>;\n\nconst submitEndpoint = endpoint({\n\tpathname: '/flow/submit',\n\tmethod: 'POST',\n\tschema: {\n\t\tresponse: responseSchema,\n\t\tbody: typed<{\n\t\t\tlog_submit: boolean;\n\t\t\tintegration_id: string;\n\t\t\tanonymous_id: string | null | undefined;\n\t\t\tsession_id: string | null | undefined;\n\t\t\tjob: unknown;\n\t\t\tsubmissions: Record<string, unknown>;\n\t\t}>(),\n\t},\n});\n\nexport async function* interpretIntegrationApplicationSubmitNode(\n\tparams: InterpretNodeParams<'integration-application-submit'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { rpcClient, submissions, actions, next, analytics, logger, context },\n\t} = params;\n\n\tif (node.data.skipConfirmation !== true) {\n\t\tyield actions.input('submit', {\n\t\t\tconfig: {\n\t\t\t\tkey: node.data.key ?? '_SUBMIT',\n\t\t\t\tlabel: node.data.submitLabel,\n\t\t\t},\n\t\t\t/** for submit node, validating _is_ submitting */\n\t\t\tvalidate: async () => {\n\t\t\t\tconst getSessionInfoSafe = tryCatch(analytics.service.getSessionInfo);\n\t\t\t\tconst sessionInfo = getSessionInfoSafe();\n\t\t\t\tif (sessionInfo.err) logger.error(sessionInfo.val.originalError);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await rpcClient.request(submitEndpoint, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tlog_submit: false,\n\t\t\t\t\t\t\tintegration_id: node.data.integrationId,\n\t\t\t\t\t\t\tanonymous_id: sessionInfo.ok ? sessionInfo.val.anonymous_id : undefined,\n\t\t\t\t\t\t\tsession_id: sessionInfo.ok ? sessionInfo.val.session_id : undefined,\n\t\t\t\t\t\t\tjob: context.job,\n\t\t\t\t\t\t\tsubmissions: getFlowSubmissionsPayload(submissions),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tconst parsed = v.safeParse(responseSchema, response);\n\t\t\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\t\t\treturn Ok(parsed.output);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconst issues: v.ValiError<any>['issues'] = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinput: e,\n\t\t\t\t\t\t\torigin: 'value',\n\t\t\t\t\t\t\treason: 'unknown',\n\t\t\t\t\t\t\tvalidation: 'API error',\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\te instanceof Error ? e.message\n\t\t\t\t\t\t\t\t: 'toString' in (e as any) ? (e as any).toString()\n\t\t\t\t\t\t\t\t: 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t\treturn Err(issues);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst fieldValueSchema = v.pipe(\n\tv.nullable(v.optional(v.string())),\n\tv.transform(i => (i === null ? undefined : i)),\n);\nconst getValidationSchema = ({ node }: InterpretNodeParams<'question-address'>) => {\n\tconst keys = node.data.keys;\n\treturn v.object({\n\t\t[keys.line1 ?? 'line1']: fieldValueSchema,\n\t\t[keys.line2 ?? 'line2']: fieldValueSchema,\n\t\t[keys.line3 ?? 'line3']: fieldValueSchema,\n\t\t[keys.city ?? 'city']: fieldValueSchema,\n\t\t[keys.country ?? 'country']: fieldValueSchema,\n\t\t[keys.postcode ?? 'postcode']: fieldValueSchema,\n\t\t[keys.state ?? 'state']: fieldValueSchema,\n\t});\n};\n\nexport async function* interpretQuestionAddressNode(\n\tparams: InterpretNodeParams<'question-address'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tyield actions.input('address', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tkeys: node.data.keys,\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'address', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst options = ['true', 'false'] as const;\nconst schema = v.picklist(options);\n\nexport async function* interpretQuestionBooleanNode(\n\tparams: InterpretNodeParams<'question-boolean'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tyield actions.input('boolean', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tlabels: {\n\t\t\t\tfalse: node.data.falseLabel,\n\t\t\t\ttrue: node.data.trueLabel,\n\t\t\t},\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'boolean', value: parsed.output === 'true' };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import { NonEmptyArray } from '@inploi/core/common';\nimport * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nexport async function* interpretQuestionEnumNode(params: InterpretNodeParams<'question-enum'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst schema = v.array(v.picklist(node.data.options.map(o => o.value) as NonEmptyArray<string>));\n\tyield actions.input('multiple-choice', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\toptions: node.data.options,\n\t\t\tmaxSelected: node.data.maxSelected,\n\t\t\tminSelected: node.data.minSelected,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.minSelected === 0 && submission === null) return Ok(submission);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'enum', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\nimport { getFileExtension, kbToReadableSize } from './utils';\n\nexport async function* interpretQuestionFileNode(params: InterpretNodeParams<'question-file'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next, t },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tyield actions.input('file', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tallowMultiple: node.data.multiple === true,\n\t\t\textensions: node.data.extensions,\n\t\t\tfileSizeLimitKib: node.data.maxSizeKb,\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst minFiles = node.data.optional ? 0 : 1;\n\t\t\tconst maxFiles = node.data.multiple ? Number.POSITIVE_INFINITY : 1;\n\t\t\tconst maxSize = node.data.maxSizeKb ?? 0;\n\t\t\tconst allowedExtensions = node.data.extensions.map(ext => ext.toLowerCase());\n\t\t\tconst schema = v.pipe(\n\t\t\t\tv.array(\n\t\t\t\t\tv.object({\n\t\t\t\t\t\tname: v.pipe(\n\t\t\t\t\t\t\tv.string(t('validation_empty')),\n\t\t\t\t\t\t\tv.check(\n\t\t\t\t\t\t\t\tfilename => {\n\t\t\t\t\t\t\t\t\tconst extension = getFileExtension(filename);\n\t\t\t\t\t\t\t\t\tif (extension.ok === false) return false;\n\t\t\t\t\t\t\t\t\treturn allowedExtensions.includes(extension.val.toLowerCase());\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tt('validation_file_ext', { ext: allowedExtensions.join(', ') }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tdata: v.string(),\n\t\t\t\t\t\tsizeKb: v.number(),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\tv.minLength(minFiles, t('validation_file_min', { count: minFiles })),\n\t\t\t\tv.maxLength(maxFiles, t('validation_file_max', { count: maxFiles })),\n\t\t\t\tv.check(\n\t\t\t\t\tfiles => {\n\t\t\t\t\t\tconst totalSize = files.reduce((acc, cur) => acc + cur.sizeKb, 0);\n\t\t\t\t\t\treturn totalSize <= maxSize;\n\t\t\t\t\t},\n\t\t\t\t\tt('validation_file_size', { size: kbToReadableSize(maxSize) }),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'file', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst getValidationSchema = ({ node, config: { t } }: InterpretNodeParams<'question-number'>) => {\n\tconst min = node.data.min ?? Number.MIN_SAFE_INTEGER;\n\tconst max = node.data.max ?? Number.MAX_SAFE_INTEGER;\n\tconst decimalCases = node.data.decimalCases ?? 0;\n\n\treturn v.pipe(\n\t\tv.number(t('validation_number')),\n\t\tv.minValue(min, t('validation_number_min', { min })),\n\t\tv.maxValue(max, t('validation_number_max', { max })),\n\t\tv.check(\n\t\t\tvalue => {\n\t\t\t\treturn value === Number(value.toFixed(decimalCases));\n\t\t\t},\n\t\t\tt('validation_number_decimal_cases', { count: decimalCases }),\n\t\t),\n\t);\n};\n\nexport async function* interpretQuestionNumberNode(\n\tparams: InterpretNodeParams<'question-number'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst thisSubmission = submissions[node.data.key];\n\tyield actions.input('number', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\toptional: node.data.optional,\n\t\t\tdecimalCases: node.data.decimalCases,\n\t\t\tmax: node.data.max,\n\t\t\tmin: node.data.min,\n\t\t\tdefaultValue: thisSubmission?.type === 'number' ? thisSubmission.value.toString() : undefined,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'number', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst getValidationSchema = ({ node, config: { t } }: InterpretNodeParams<'question-phone'>) => {\n\treturn v.object({\n\t\tcountryCode: v.pipe(v.string(t('validation_country_code')), v.regex(/^\\+?[0-9 -]+$/, t('validation_country_code'))),\n\t\tphoneNumber: v.pipe(\n\t\t\tv.string(t('validation_phone')),\n\t\t\tv.regex(/^\\+?[0-9 -]+$/, t('validation_phone')),\n\t\t\tv.minLength(node.data.minChars, t('validation_min_chars', { count: node.data.minChars })),\n\t\t\tv.transform(value => value.replace(/[^0-9]/g, '')),\n\t\t),\n\t});\n};\n\nexport async function* interpretQuestionPhoneNode(params: InterpretNodeParams<'question-phone'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { actions, next, submissions },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst thisSubmission = submissions[node.data.key];\n\tyield actions.input('phone', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tminChars: node.data.minChars,\n\t\t\tdefaultValue:\n\t\t\t\tthisSubmission?.type === 'phone' ?\n\t\t\t\t\tthisSubmission.value\n\t\t\t\t:\t{\n\t\t\t\t\t\tcountryCode: node.data.defaultCountryCode,\n\t\t\t\t\t},\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\tsubmissionFormat: 'phone',\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'address', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst getValidationSchema = ({ node, config: { t, logger } }: InterpretNodeParams<'question-text'>) => {\n\tconst errors = {\n\t\temail: t('validation_email'),\n\t\turl: t('validation_url'),\n\t\tmaxLength: t('validation_max_chars', { count: node.data.maxChars ?? 999 }),\n\t\tminLength: t('validation_min_chars', { count: node.data.minChars ?? 1 }),\n\t};\n\n\tswitch (node.data.format) {\n\t\tcase 'email':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(errors.email),\n\t\t\t\tv.email(errors.email),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\n\t\tcase 'text':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\t\tcase 'url':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(),\n\t\t\t\tv.url(errors.url),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\t\tcase 'phone':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\t\tdefault:\n\t\t\tnode.data.format satisfies never;\n\t\t\tlogger.error(`Unsupported question-text format: ${node.data.format}`);\n\t\t\treturn null;\n\t}\n};\n\nexport async function* interpretQuestionTextNode(params: InterpretNodeParams<'question-text'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst thisSubmission = submissions[node.data.key];\n\tyield actions.input('text', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tmaxChars: node.data.maxChars,\n\t\t\tminChars: node.data.minChars,\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\tformat: node.data.format,\n\t\t\toptional: node.data.optional,\n\t\t\tdefaultValue: thisSubmission?.type === 'string' ? thisSubmission.value : undefined,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tif (schema === null) return Ok(submission);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'string', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import { FlowNode } from '@inploi/core/flows';\nimport { AnalyticsService, InploiRpcClient, Logger } from '@inploi/sdk';\nimport { ValiError } from 'valibot';\n\nimport { isIfBlockConditionMet } from './conditions';\nimport { FlowSubmissions } from './flow.types';\nimport { TFunction } from './i18n';\nimport { FlowInput } from './inputs';\nimport { interpolateWithData } from './interpolation';\nimport { interpretIdentifyNode } from './interpreter.identify';\nimport { interpretIntegrationApplicationSubmitNode } from './interpreter.integration-application-submit';\nimport { interpretQuestionAddressNode } from './interpreter.question-address';\nimport { interpretQuestionBooleanNode } from './interpreter.question-boolean';\nimport { interpretQuestionEnumNode } from './interpreter.question-enum';\nimport { interpretQuestionFileNode } from './interpreter.question-file';\nimport { interpretQuestionNumberNode } from './interpreter.question-number';\nimport { interpretQuestionPhoneNode } from './interpreter.question-phone';\nimport { interpretQuestionTextNode } from './interpreter.question-text';\nimport { LinkedList, LinkedListItem } from './linked-list';\nimport { Result } from './result';\n\ntype MaybePromise<T> = T | Promise<T>;\ntype FlowInterpreterYield =\n\t| { type: 'submissions'; submissions: FlowSubmissions }\n\t| { type: 'state'; state: 'loading' | 'idle' }\n\t| { type: 'error'; message: string }\n\t| { type: 'info'; message: string }\n\t| { type: 'success'; message: string }\n\t| { type: 'text'; author: 'user' | 'bot'; message: string }\n\t| { type: 'image'; url: string; height: number; width: number }\n\t| { type: 'link'; href: string; message: string }\n\t| { type: 'end' }\n\t| {\n\t\t\ttype: 'input';\n\t\t\tinput: {\n\t\t\t\t[I in FlowInput['type']]: {\n\t\t\t\t\ttype: I;\n\t\t\t\t\tconfig: (FlowInput & { type: I })['config'];\n\t\t\t\t\tvalidate: (\n\t\t\t\t\t\tinput: NonNullable<(FlowInput & { type: I })['submission']>['value'] | null,\n\t\t\t\t\t) => MaybePromise<\n\t\t\t\t\t\tResult<NonNullable<(FlowInput & { type: I })['submission']>['value'] | null, ValiError<any>['issues']>\n\t\t\t\t\t>;\n\t\t\t\t};\n\t\t\t}[FlowInput['type']];\n\t };\n\nexport type FlowInterpreterParams = {\n\trpcClient: InploiRpcClient;\n\tanalytics: {\n\t\tservice: AnalyticsService;\n\t\tcustomProperties?: Record<string, unknown>;\n\t};\n\tlogger: Logger;\n\tt: TFunction;\n};\n\nexport type FlowActions = {\n\terror: ({ message }: { message: string }) => FlowInterpreterYield;\n\tinfo: ({ message }: { message: string }) => FlowInterpreterYield;\n\tsuccess: ({ message }: { message: string }) => FlowInterpreterYield;\n\ttext: ({ message, author }: { message: string; author: 'bot' | 'user' }) => FlowInterpreterYield;\n\timage: ({ url, height, width }: { url: string; height: number; width: number }) => FlowInterpreterYield;\n\tlink: ({ href, message }: { href: string; message: string }) => FlowInterpreterYield;\n\tsubmissions: (submissions: FlowSubmissions) => FlowInterpreterYield;\n\tstate: (state: 'loading' | 'idle') => FlowInterpreterYield;\n\tinput: <T extends FlowInput['type'], Input extends FlowInput & { type: T }>(\n\t\ttype: T,\n\t\tparams: {\n\t\t\tconfig: Input['config'];\n\t\t\tvalidate: (\n\t\t\t\tinput: NonNullable<Input['submission']>['value'] | null,\n\t\t\t) => MaybePromise<Result<NonNullable<Input['submission']>['value'] | null, ValiError<any>['issues']>>;\n\t\t},\n\t) => FlowInterpreterYield;\n};\n\nexport const createFlowInterpreter = (params: FlowInterpreterParams) => {\n\tconst submissions: FlowSubmissions = {};\n\n\treturn {\n\t\tinterpret: async function* interpret({\n\t\t\tnodes,\n\t\t\tcontext,\n\t\t}: {\n\t\t\tnodes: LinkedList<FlowNode>;\n\t\t\tcontext: Record<string, unknown>;\n\t\t}): AsyncGenerator<FlowInterpreterYield> {\n\t\t\tconst actions: FlowActions = {\n\t\t\t\terror: ({ message }) => ({ type: 'error', message: interpolateWithData(message, { submissions, context }) }),\n\t\t\t\tinfo: ({ message }) => ({ type: 'info', message: interpolateWithData(message, { submissions, context }) }),\n\t\t\t\tsuccess: ({ message }) => ({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tmessage: interpolateWithData(message, { submissions, context }),\n\t\t\t\t}),\n\t\t\t\ttext: ({ message, author }) => ({\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tauthor,\n\t\t\t\t\tmessage: interpolateWithData(message, { submissions, context }),\n\t\t\t\t}),\n\t\t\t\timage: ({ url, height, width }) => ({\n\t\t\t\t\ttype: 'image',\n\t\t\t\t\turl: interpolateWithData(url, { submissions, context }),\n\t\t\t\t\theight,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t\tstate: state => ({ type: 'state', state }),\n\t\t\t\tlink: ({ href, message }) => ({\n\t\t\t\t\ttype: 'link',\n\t\t\t\t\thref: interpolateWithData(href, { submissions, context }),\n\t\t\t\t\tmessage: interpolateWithData(message, { submissions, context }),\n\t\t\t\t}),\n\t\t\t\tsubmissions: submissions => ({ type: 'submissions', submissions }),\n\t\t\t\tinput: (type, params) => {\n\t\t\t\t\treturn { type: 'input', input: { type, config: params.config, validate: params.validate } as any };\n\t\t\t\t},\n\t\t\t};\n\t\t\tif (!nodes.headId) return { type: 'error', message: 'No head node found' };\n\t\t\tlet node: LinkedListItem<FlowNode> | undefined = nodes.items[nodes.headId];\n\t\t\tconst next = (nextId: string | undefined): { type: 'next'; nodeId: string | undefined } => {\n\t\t\t\tif (!nextId) {\n\t\t\t\t\tnode = undefined;\n\t\t\t\t\treturn { type: 'next', nodeId: undefined };\n\t\t\t\t}\n\t\t\t\tconst nextNode = nodes.items[nextId];\n\t\t\t\tif (!nextNode) throw new Error(`Next node with id ${nextId} not found`);\n\t\t\t\tnode = nextNode;\n\t\t\t\treturn { type: 'next', nodeId: nextId };\n\t\t\t};\n\t\t\tconst config = { ...params, context, submissions, next, actions };\n\n\t\t\twhile (node) {\n\t\t\t\tswitch (node.type) {\n\t\t\t\t\tcase 'text':\n\t\t\t\t\t\tyield actions.text({ author: 'bot', message: node.data.text });\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'image':\n\t\t\t\t\t\tyield actions.image(node.data);\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'link':\n\t\t\t\t\t\tyield actions.link({ href: node.data.href, message: node.data.cta });\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'add-submission':\n\t\t\t\t\t\tsubmissions[node.data.key] = { type: 'string', value: node.data.value };\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'jump':\n\t\t\t\t\t\tnext(node.data.targetId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-text':\n\t\t\t\t\t\tyield* interpretQuestionTextNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-phone':\n\t\t\t\t\t\tyield* interpretQuestionPhoneNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-boolean':\n\t\t\t\t\t\tyield* interpretQuestionBooleanNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-number':\n\t\t\t\t\t\tyield* interpretQuestionNumberNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-address':\n\t\t\t\t\t\tyield* interpretQuestionAddressNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-enum':\n\t\t\t\t\t\tyield* interpretQuestionEnumNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-file':\n\t\t\t\t\t\tyield* interpretQuestionFileNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'identify': {\n\t\t\t\t\t\tyield* interpretIdentifyNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'if-block': {\n\t\t\t\t\t\tconst nextNodeId =\n\t\t\t\t\t\t\tisIfBlockConditionMet(node, { context: config.context, submissions }) ? node.branchId : node.nextId;\n\t\t\t\t\t\tnext(nextNodeId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'integration-application-submit':\n\t\t\t\t\t\tyield* interpretIntegrationApplicationSubmitNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'feedback':\n\t\t\t\t\t\tyield actions.error({ message: 'Not implemented' });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'integration-workflow-get':\n\t\t\t\t\t\tyield actions.error({ message: 'This message should never be reached' });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'end-flow':\n\t\t\t\t\t\tnode = undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tyield actions.submissions(submissions);\n\t\t\t}\n\t\t\tyield { type: 'end' };\n\t\t},\n\t};\n};\n\nexport type InterpretNodeParams<TNodeType extends FlowNode['type']> = {\n\tnode: FlowNode & { type: TNodeType };\n\tconfig: FlowInterpreterParams & {\n\t\tsubmissions: FlowSubmissions;\n\t\tcontext: Record<string, unknown>;\n\t\tnext: (nextId: string | undefined) => { type: 'next'; nodeId: string | undefined };\n\t\tactions: FlowActions;\n\t};\n};\n\nexport type InterpretNodeReturn = AsyncGenerator<FlowInterpreterYield, { type: 'next'; nodeId: string | undefined }>;\n"],"mappings":"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","names":["import_get","isConditionMet","condition","context","submissions","ifBlock","firstSegment","path","answer","getSubmissionValueToCheck","value","get","newIfBlock","isIfBlockConditionMet","compareBoolean","compareNumber","conditions","import_get","HANDLEBARS_REGEXP","interpolateWithData","str","context","submissions","_","key","defaultValue","firstSegment","path","entity","getSubmissionValueToCheck","file","kbToReadableSize","line","formatPhoneNumber","value","get","i","interpretIdentifyNode","params","node","logger","analytics","submissions","next","getSubmissionValue","key","value","endpoint","typed","responseSchema","object","boolean","optional","string","number","unknown","nullable","submitEndpoint","endpoint","typed","interpretIntegrationApplicationSubmitNode","params","node","rpcClient","submissions","actions","next","analytics","logger","context","sessionInfo","tryCatch","response","getFlowSubmissionsPayload","parsed","safeParse","Err","Ok","e","issues","fieldValueSchema","pipe","nullable","optional","string","transform","i","getValidationSchema","node","keys","object","interpretQuestionAddressNode","params","submissions","actions","next","submission","Ok","schema","parsed","safeParse","Err","options","schema","picklist","interpretQuestionBooleanNode","params","node","submissions","actions","next","submission","Ok","parsed","safeParse","Err","interpretQuestionEnumNode","params","node","submissions","actions","next","schema","array","picklist","o","submission","Ok","parsed","safeParse","Err","interpretQuestionFileNode","params","node","submissions","actions","next","t","submission","Ok","minFiles","maxFiles","maxSize","allowedExtensions","ext","schema","pipe","array","object","string","check","filename","extension","getFileExtension","number","minLength","maxLength","files","acc","cur","kbToReadableSize","parsed","safeParse","Err","getValidationSchema","node","t","min","max","decimalCases","pipe","number","minValue","maxValue","check","value","interpretQuestionNumberNode","params","submissions","actions","next","thisSubmission","submission","Ok","schema","parsed","safeParse","Err","getValidationSchema","node","t","object","pipe","string","regex","minLength","transform","value","interpretQuestionPhoneNode","params","actions","next","submissions","thisSubmission","submission","Ok","schema","parsed","safeParse","Err","getValidationSchema","node","t","logger","errors","pipe","string","email","minLength","maxLength","url","interpretQuestionTextNode","params","submissions","actions","next","thisSubmission","submission","Ok","schema","parsed","safeParse","Err","createFlowInterpreter","params","submissions","nodes","context","actions","message","interpolateWithData","author","url","height","width","state","href","type","node","next","nextId","nextNode","config","interpretQuestionTextNode","interpretQuestionPhoneNode","interpretQuestionBooleanNode","interpretQuestionNumberNode","interpretQuestionAddressNode","interpretQuestionEnumNode","interpretQuestionFileNode","interpretIdentifyNode","nextNodeId","isIfBlockConditionMet","interpretIntegrationApplicationSubmitNode"]}
|
|
1
|
+
{"version":3,"sources":["../src/conditions.ts","../src/interpolation.ts","../src/interpreter.identify.ts","../src/interpreter.integration-application-submit.ts","../src/interpreter.question-address.ts","../src/interpreter.question-boolean.ts","../src/interpreter.question-enum.ts","../src/interpreter.question-file.ts","../src/interpreter.question-number.ts","../src/interpreter.question-phone.ts","../src/interpreter.question-text.ts","../src/interpreter.ts"],"sourcesContent":["import { IfBlockNode, IfBlockNodeCondition } from '@inploi/core/flows';\nimport get from 'lodash/get';\n\nimport { FlowSubmissions } from './flow.types';\nimport { getSubmissionValueToCheck } from './utils';\n\nconst isConditionMet = ({\n\tcondition,\n\tcontext,\n\tsubmissions,\n\tifBlock,\n}: {\n\tcontext: Record<string, unknown>;\n\tcondition: IfBlockNodeCondition;\n\tsubmissions: FlowSubmissions;\n\tifBlock: IfBlockNode;\n}) => {\n\tconst [firstSegment, ...path] = condition.compareKey.split('.');\n\tif (!firstSegment) return false;\n\n\tconst answer = getSubmissionValueToCheck({ context, key: firstSegment, path, submissions });\n\tif (!answer) return false;\n\n\tswitch (answer.type) {\n\t\tcase 'address': {\n\t\t\tconst value = get(answer.value, path.join('.'));\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn value === condition.compareValue;\n\t\t\t\tcase 'contains':\n\t\t\t\t\tif (!value) return false;\n\t\t\t\t\treturn value.includes(condition.compareValue);\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn value !== condition.compareValue;\n\t\t\t\tcase 'notContains':\n\t\t\t\t\tif (!value) return true;\n\t\t\t\t\treturn !value.includes(condition.compareValue);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'integration': {\n\t\t\t/** We only handle objects as integration submissions for now. */\n\t\t\tif (typeof answer.value !== 'object') return false;\n\t\t\tif (Array.isArray(answer.value)) return false;\n\n\t\t\tconst value = get(answer.value, path.join('.'));\n\t\t\tconst newIfBlock = { ...ifBlock, data: { ...ifBlock.data, compareKey: '_temp' } };\n\t\t\tswitch (typeof value) {\n\t\t\t\tcase 'boolean':\n\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'boolean' } },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t});\n\t\t\t\tcase 'string':\n\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'string' } },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t});\n\t\t\t\tcase 'number':\n\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'number' } },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t});\n\t\t\t\tcase 'object':\n\t\t\t\t\t/** We only handle enums if the result is an array of strings */\n\t\t\t\t\tif (Array.isArray(value) && value.every((value): value is string => typeof value === 'string')) {\n\t\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'enum' } },\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'boolean': {\n\t\t\tconst compareBoolean = condition.compareValue === 'true';\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn answer.value === compareBoolean;\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn answer.value !== compareBoolean;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'phone':\n\t\tcase 'string': {\n\t\t\tconst value = answer.type === 'phone' ? answer.value.countryCode + answer.value.phoneNumber : answer.value;\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn value === condition.compareValue;\n\t\t\t\tcase 'contains':\n\t\t\t\t\tif (!value) return false;\n\t\t\t\t\treturn value.includes(condition.compareValue);\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn value !== condition.compareValue;\n\t\t\t\tcase 'notContains':\n\t\t\t\t\tif (!value) return true;\n\t\t\t\t\treturn !value.includes(condition.compareValue);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'number': {\n\t\t\ttry {\n\t\t\t\tconst compareNumber = Number(condition.compareValue);\n\t\t\t\tswitch (condition.compare) {\n\t\t\t\t\tcase 'equals':\n\t\t\t\t\t\treturn answer.value === compareNumber;\n\t\t\t\t\tcase 'notEquals':\n\t\t\t\t\t\treturn answer.value !== compareNumber;\n\t\t\t\t\tcase 'greaterThan':\n\t\t\t\t\t\treturn answer.value > compareNumber;\n\t\t\t\t\tcase 'greaterThanOrEqualTo':\n\t\t\t\t\t\treturn answer.value >= compareNumber;\n\t\t\t\t\tcase 'lessThan':\n\t\t\t\t\t\treturn answer.value < compareNumber;\n\t\t\t\t\tcase 'lessThanOrEqualTo':\n\t\t\t\t\t\treturn answer.value <= compareNumber;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.error(`Failed to parse number in if-block ${ifBlock.id}`, answer.value);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'enum':\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn answer.value.length === 1 && answer.value[0] === condition.compareValue;\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn answer.value.length === 1 && answer.value[0] !== condition.compareValue;\n\t\t\t\tcase 'contains':\n\t\t\t\t\treturn answer.value.includes(condition.compareValue);\n\t\t\t\tcase 'notContains':\n\t\t\t\t\treturn !answer.value.includes(condition.compareValue);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'file':\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tanswer satisfies never;\n\t\t\tbreak;\n\t}\n};\n\nexport const isIfBlockConditionMet = (\n\tifBlock: IfBlockNode,\n\t{ context, submissions }: { submissions: FlowSubmissions; context: Record<string, unknown> },\n): boolean => {\n\tconst conditions = 'combinator' in ifBlock.data ? ifBlock.data.conditions : [ifBlock.data];\n\tconst combinator = 'combinator' in ifBlock.data ? ifBlock.data.combinator : 'and';\n\n\tif (combinator === 'or') {\n\t\tfor (const condition of conditions) {\n\t\t\tconst isMet = isConditionMet({ condition, context, submissions, ifBlock });\n\t\t\tif (isMet) return true;\n\t\t}\n\t\treturn false;\n\t} else {\n\t\tfor (const condition of conditions) {\n\t\t\tconst isMet = isConditionMet({ condition, context, submissions, ifBlock });\n\t\t\tif (!isMet) return false;\n\t\t}\n\t\treturn true;\n\t}\n};\n","import get from 'lodash/get';\n\nimport { FlowSubmissions } from './flow.types';\nimport { formatPhoneNumber, getSubmissionValueToCheck, kbToReadableSize } from './utils';\n\nconst HANDLEBARS_REGEXP = /{{\\s*([^}]+?)\\s*(?:\\|\\s*([^}]+?)\\s*)?}}/g;\n\nexport const interpolateWithData = (\n\tstr: string,\n\t{ context, submissions }: { submissions: FlowSubmissions; context: Record<string, unknown> },\n) => {\n\treturn str.replace(HANDLEBARS_REGEXP, (_, key, defaultValue = '') => {\n\t\tconst [firstSegment, ...path] = key.trim().split('.');\n\t\tconst entity = getSubmissionValueToCheck({ key: firstSegment, path, submissions, context });\n\t\tif (!entity) return defaultValue;\n\n\t\tswitch (entity.type) {\n\t\t\tcase 'boolean':\n\t\t\t\treturn entity.value === true ? 'true' : 'false';\n\t\t\tcase 'file':\n\t\t\t\treturn entity.value.map(file => `${file.name} (${kbToReadableSize(file.sizeKb)})`).join(', ');\n\t\t\tcase 'enum':\n\t\t\t\treturn entity.value.join(', ');\n\t\t\tcase 'address':\n\t\t\t\treturn Object.values(entity.value)\n\t\t\t\t\t.filter(line => line && line.trim().length > 0)\n\t\t\t\t\t.join(', ');\n\t\t\tcase 'number':\n\t\t\tcase 'string':\n\t\t\t\tif (!entity.value) return defaultValue;\n\t\t\t\treturn entity.value.toString();\n\t\t\tcase 'phone':\n\t\t\t\treturn formatPhoneNumber(entity.value);\n\t\t\tcase 'integration': {\n\t\t\t\t/** We only handle objects as integration submissions for now. */\n\t\t\t\tif (typeof entity.value !== 'object') break;\n\t\t\t\tif (Array.isArray(entity.value)) break;\n\n\t\t\t\tconst value = get(entity.value, path.join('.'));\n\t\t\t\tswitch (typeof value) {\n\t\t\t\t\tcase 'boolean':\n\t\t\t\t\t\treturn value === true ? 'true' : 'false';\n\t\t\t\t\tcase 'string':\n\t\t\t\t\t\treturn value;\n\t\t\t\t\tcase 'number':\n\t\t\t\t\t\treturn value.toString();\n\t\t\t\t\tcase 'object':\n\t\t\t\t\t\t/** We only handle enums if the result is an array of strings */\n\t\t\t\t\t\tif (Array.isArray(value) && value.every((i): i is string => typeof i === 'string')) {\n\t\t\t\t\t\t\treturn value.join(', ');\n\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tentity satisfies never;\n\t\t}\n\t\treturn defaultValue;\n\t});\n};\n","import { InterpretNodeParams } from './interpreter';\nimport { getSubmissionValue } from './utils';\n\nexport async function* interpretIdentifyNode(params: InterpretNodeParams<'identify'>) {\n\tconst {\n\t\tnode,\n\t\tconfig: { logger, analytics, submissions, next },\n\t} = params;\n\n\tanalytics.service\n\t\t.log({\n\t\t\tevent: 'IDENTIFY',\n\t\t\tproperties: {\n\t\t\t\tidentifier: getSubmissionValue({ key: node.data.key, submissions }).toString(),\n\t\t\t\tfirst_name:\n\t\t\t\t\tnode.data.firstName ? getSubmissionValue({ key: node.data.firstName, submissions }).toString() : undefined,\n\t\t\t\tlast_name:\n\t\t\t\t\tnode.data.lastName ? getSubmissionValue({ key: node.data.lastName, submissions }).toString() : undefined,\n\t\t\t\temail: node.data.email ? getSubmissionValue({ key: node.data.email, submissions }).toString() : undefined,\n\t\t\t\tphone_number:\n\t\t\t\t\tnode.data.phoneNumber ?\n\t\t\t\t\t\tgetSubmissionValue({ key: node.data.phoneNumber, submissions }).toString()\n\t\t\t\t\t:\tundefined,\n\t\t\t\tcustom_traits:\n\t\t\t\t\tnode.data.customTraits ?\n\t\t\t\t\t\tObject.fromEntries(node.data.customTraits.map(({ key, value }) => [key, submissions[value]?.value]))\n\t\t\t\t\t:\tundefined,\n\t\t\t},\n\t\t})\n\t\t.catch(logger.error);\n\n\treturn next(node.nextId);\n}\n","import { endpoint, typed } from '@inploi/sdk';\nimport * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok, tryCatch } from './result';\nimport { getFlowSubmissionsPayload } from './utils';\n\nconst responseSchema = v.object({\n\t/** Not necessarily true when we receive a positive response because the API considers only 200 as success */\n\tsuccess: v.boolean(),\n\tintegration_response: v.object({\n\t\tservice: v.optional(v.string()),\n\t\tstatus: v.number(),\n\t\tdata: v.unknown(),\n\t\terror: v.nullable(v.object({ message: v.string(), data: v.unknown() })),\n\t}),\n});\nexport type IntegrationResponse = v.InferOutput<typeof responseSchema>;\n\nconst submitEndpoint = endpoint({\n\tpathname: '/flow/submit',\n\tmethod: 'POST',\n\tschema: {\n\t\tresponse: responseSchema,\n\t\tbody: typed<{\n\t\t\tlog_submit: boolean;\n\t\t\tintegration_id: string;\n\t\t\tanonymous_id: string | null | undefined;\n\t\t\tsession_id: string | null | undefined;\n\t\t\tjob: unknown;\n\t\t\tsubmissions: Record<string, unknown>;\n\t\t}>(),\n\t},\n});\n\nexport async function* interpretIntegrationApplicationSubmitNode(\n\tparams: InterpretNodeParams<'integration-application-submit'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { rpcClient, submissions, actions, next, analytics, logger, context },\n\t} = params;\n\n\tif (node.data.skipConfirmation !== true) {\n\t\tyield actions.input('submit', {\n\t\t\tconfig: {\n\t\t\t\tkey: node.data.key ?? '_SUBMIT',\n\t\t\t\tlabel: node.data.submitLabel,\n\t\t\t},\n\t\t\t/** for submit node, validating _is_ submitting */\n\t\t\tvalidate: async () => {\n\t\t\t\tconst getSessionInfoSafe = tryCatch(analytics.service.getSessionInfo);\n\t\t\t\tconst sessionInfo = getSessionInfoSafe();\n\t\t\t\tif (sessionInfo.err) logger.error(sessionInfo.val.originalError);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await rpcClient.request(submitEndpoint, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tlog_submit: false,\n\t\t\t\t\t\t\tintegration_id: node.data.integrationId,\n\t\t\t\t\t\t\tanonymous_id: sessionInfo.ok ? sessionInfo.val.anonymous_id : undefined,\n\t\t\t\t\t\t\tsession_id: sessionInfo.ok ? sessionInfo.val.session_id : undefined,\n\t\t\t\t\t\t\tjob: context.job,\n\t\t\t\t\t\t\tsubmissions: getFlowSubmissionsPayload(submissions),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tconst parsed = v.safeParse(responseSchema, response);\n\t\t\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\t\t\treturn Ok(parsed.output);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconst issues: v.ValiError<any>['issues'] = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinput: e,\n\t\t\t\t\t\t\torigin: 'value',\n\t\t\t\t\t\t\treason: 'unknown',\n\t\t\t\t\t\t\tvalidation: 'API error',\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\te instanceof Error ? e.message\n\t\t\t\t\t\t\t\t: 'toString' in (e as any) ? (e as any).toString()\n\t\t\t\t\t\t\t\t: 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t\treturn Err(issues);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst fieldValueSchema = v.pipe(\n\tv.nullable(v.optional(v.string())),\n\tv.transform(i => (i === null ? undefined : i)),\n);\nconst getValidationSchema = ({ node }: InterpretNodeParams<'question-address'>) => {\n\tconst keys = node.data.keys;\n\treturn v.object({\n\t\t[keys.line1 ?? 'line1']: fieldValueSchema,\n\t\t[keys.line2 ?? 'line2']: fieldValueSchema,\n\t\t[keys.line3 ?? 'line3']: fieldValueSchema,\n\t\t[keys.city ?? 'city']: fieldValueSchema,\n\t\t[keys.country ?? 'country']: fieldValueSchema,\n\t\t[keys.postcode ?? 'postcode']: fieldValueSchema,\n\t\t[keys.state ?? 'state']: fieldValueSchema,\n\t});\n};\n\nexport async function* interpretQuestionAddressNode(\n\tparams: InterpretNodeParams<'question-address'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tyield actions.input('address', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tkeys: node.data.keys,\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'address', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst options = ['true', 'false'] as const;\nconst schema = v.picklist(options);\n\nexport async function* interpretQuestionBooleanNode(\n\tparams: InterpretNodeParams<'question-boolean'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tyield actions.input('boolean', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tlabels: {\n\t\t\t\tfalse: node.data.falseLabel,\n\t\t\t\ttrue: node.data.trueLabel,\n\t\t\t},\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'boolean', value: parsed.output === 'true' };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import { NonEmptyArray } from '@inploi/core/common';\nimport * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nexport async function* interpretQuestionEnumNode(params: InterpretNodeParams<'question-enum'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst schema = v.array(v.picklist(node.data.options.map(o => o.value) as NonEmptyArray<string>));\n\tyield actions.input('multiple-choice', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\toptions: node.data.options,\n\t\t\tmaxSelected: node.data.maxSelected,\n\t\t\tminSelected: node.data.minSelected,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.minSelected === 0 && submission === null) return Ok(submission);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'enum', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\nimport { getFileExtension, kbToReadableSize } from './utils';\n\nexport async function* interpretQuestionFileNode(params: InterpretNodeParams<'question-file'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next, t },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tyield actions.input('file', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tallowMultiple: node.data.multiple === true,\n\t\t\textensions: node.data.extensions,\n\t\t\tfileSizeLimitKib: node.data.maxSizeKb,\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst minFiles = node.data.optional ? 0 : 1;\n\t\t\tconst maxFiles = node.data.multiple ? Number.POSITIVE_INFINITY : 1;\n\t\t\tconst maxSize = node.data.maxSizeKb ?? 0;\n\t\t\tconst allowedExtensions = node.data.extensions.map(ext => ext.toLowerCase());\n\t\t\tconst schema = v.pipe(\n\t\t\t\tv.array(\n\t\t\t\t\tv.object({\n\t\t\t\t\t\tname: v.pipe(\n\t\t\t\t\t\t\tv.string(t('validation_empty')),\n\t\t\t\t\t\t\tv.check(\n\t\t\t\t\t\t\t\tfilename => {\n\t\t\t\t\t\t\t\t\tconst extension = getFileExtension(filename);\n\t\t\t\t\t\t\t\t\tif (extension.ok === false) return false;\n\t\t\t\t\t\t\t\t\treturn allowedExtensions.includes(extension.val.toLowerCase());\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tt('validation_file_ext', { ext: allowedExtensions.join(', ') }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tdata: v.string(),\n\t\t\t\t\t\tsizeKb: v.number(),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\tv.minLength(minFiles, t('validation_file_min', { count: minFiles })),\n\t\t\t\tv.maxLength(maxFiles, t('validation_file_max', { count: maxFiles })),\n\t\t\t\tv.check(\n\t\t\t\t\tfiles => {\n\t\t\t\t\t\tconst totalSize = files.reduce((acc, cur) => acc + cur.sizeKb, 0);\n\t\t\t\t\t\treturn totalSize <= maxSize;\n\t\t\t\t\t},\n\t\t\t\t\tt('validation_file_size', { size: kbToReadableSize(maxSize) }),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'file', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst getValidationSchema = ({ node, config: { t } }: InterpretNodeParams<'question-number'>) => {\n\tconst min = node.data.min ?? Number.MIN_SAFE_INTEGER;\n\tconst max = node.data.max ?? Number.MAX_SAFE_INTEGER;\n\tconst decimalCases = node.data.decimalCases ?? 0;\n\n\treturn v.pipe(\n\t\tv.number(t('validation_number')),\n\t\tv.minValue(min, t('validation_number_min', { min })),\n\t\tv.maxValue(max, t('validation_number_max', { max })),\n\t\tv.check(\n\t\t\tvalue => {\n\t\t\t\treturn value === Number(value.toFixed(decimalCases));\n\t\t\t},\n\t\t\tt('validation_number_decimal_cases', { count: decimalCases }),\n\t\t),\n\t);\n};\n\nexport async function* interpretQuestionNumberNode(\n\tparams: InterpretNodeParams<'question-number'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst thisSubmission = submissions[node.data.key];\n\tyield actions.input('number', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\toptional: node.data.optional,\n\t\t\tdecimalCases: node.data.decimalCases,\n\t\t\tmax: node.data.max,\n\t\t\tmin: node.data.min,\n\t\t\tdefaultValue: thisSubmission?.type === 'number' ? thisSubmission.value.toString() : undefined,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'number', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst getValidationSchema = ({ node, config: { t } }: InterpretNodeParams<'question-phone'>) => {\n\treturn v.object({\n\t\tcountryCode: v.pipe(v.string(t('validation_country_code')), v.regex(/^\\+?[0-9 -]+$/, t('validation_country_code'))),\n\t\tphoneNumber: v.pipe(\n\t\t\tv.string(t('validation_phone')),\n\t\t\tv.regex(/^\\+?[0-9 -]+$/, t('validation_phone')),\n\t\t\tv.minLength(node.data.minChars, t('validation_min_chars', { count: node.data.minChars })),\n\t\t\tv.transform(value => value.replace(/[^0-9]/g, '')),\n\t\t),\n\t});\n};\n\nexport async function* interpretQuestionPhoneNode(params: InterpretNodeParams<'question-phone'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { actions, next, submissions },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst thisSubmission = submissions[node.data.key];\n\tyield actions.input('phone', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tminChars: node.data.minChars,\n\t\t\tdefaultValue:\n\t\t\t\tthisSubmission?.type === 'phone' ?\n\t\t\t\t\tthisSubmission.value\n\t\t\t\t:\t{\n\t\t\t\t\t\tcountryCode: node.data.defaultCountryCode,\n\t\t\t\t\t},\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\tsubmissionFormat: 'phone',\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'address', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst getValidationSchema = ({ node, config: { t, logger } }: InterpretNodeParams<'question-text'>) => {\n\tconst errors = {\n\t\tdate: t('validation_date'),\n\t\temail: t('validation_email'),\n\t\turl: t('validation_url'),\n\t\tmaxLength: t('validation_max_chars', { count: node.data.maxChars ?? 999 }),\n\t\tminLength: t('validation_min_chars', { count: node.data.minChars ?? 1 }),\n\t};\n\n\tswitch (node.data.format) {\n\t\tcase 'date':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(errors.date),\n\t\t\t\tv.regex(/^\\d{4}-\\d{2}-\\d{2}$/, errors.date),\n\t\t\t);\n\t\tcase 'email':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(errors.email),\n\t\t\t\tv.email(errors.email),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\n\t\tcase 'text':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\t\tcase 'url':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(),\n\t\t\t\tv.url(errors.url),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\t\tcase 'phone':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\t\tdefault:\n\t\t\tnode.data.format satisfies never;\n\t\t\tlogger.error(`Unsupported question-text format: ${node.data.format}`);\n\t\t\treturn null;\n\t}\n};\n\nexport async function* interpretQuestionTextNode(params: InterpretNodeParams<'question-text'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst thisSubmission = submissions[node.data.key];\n\tyield actions.input('text', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tmaxChars: node.data.maxChars,\n\t\t\tminChars: node.data.minChars,\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\tformat: node.data.format,\n\t\t\toptional: node.data.optional,\n\t\t\tdefaultValue: thisSubmission?.type === 'string' ? thisSubmission.value : undefined,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tif (schema === null) return Ok(submission);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'string', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import { FlowNode } from '@inploi/core/flows';\nimport { AnalyticsService, InploiRpcClient, Logger } from '@inploi/sdk';\nimport { ValiError } from 'valibot';\n\nimport { isIfBlockConditionMet } from './conditions';\nimport { FlowSubmissions } from './flow.types';\nimport { TFunction } from './i18n';\nimport { FlowInput } from './inputs';\nimport { interpolateWithData } from './interpolation';\nimport { interpretIdentifyNode } from './interpreter.identify';\nimport { interpretIntegrationApplicationSubmitNode } from './interpreter.integration-application-submit';\nimport { interpretQuestionAddressNode } from './interpreter.question-address';\nimport { interpretQuestionBooleanNode } from './interpreter.question-boolean';\nimport { interpretQuestionEnumNode } from './interpreter.question-enum';\nimport { interpretQuestionFileNode } from './interpreter.question-file';\nimport { interpretQuestionNumberNode } from './interpreter.question-number';\nimport { interpretQuestionPhoneNode } from './interpreter.question-phone';\nimport { interpretQuestionTextNode } from './interpreter.question-text';\nimport { LinkedList, LinkedListItem } from './linked-list';\nimport { Result } from './result';\n\ntype MaybePromise<T> = T | Promise<T>;\ntype FlowInterpreterYield =\n\t| { type: 'submissions'; submissions: FlowSubmissions }\n\t| { type: 'state'; state: 'loading' | 'idle' }\n\t| { type: 'error'; message: string }\n\t| { type: 'info'; message: string }\n\t| { type: 'success'; message: string }\n\t| { type: 'text'; author: 'user' | 'bot'; message: string }\n\t| { type: 'image'; url: string; height: number; width: number }\n\t| { type: 'link'; href: string; message: string }\n\t| { type: 'end' }\n\t| {\n\t\t\ttype: 'input';\n\t\t\tinput: {\n\t\t\t\t[I in FlowInput['type']]: {\n\t\t\t\t\ttype: I;\n\t\t\t\t\tconfig: (FlowInput & { type: I })['config'];\n\t\t\t\t\tvalidate: (\n\t\t\t\t\t\tinput: NonNullable<(FlowInput & { type: I })['submission']>['value'] | null,\n\t\t\t\t\t) => MaybePromise<\n\t\t\t\t\t\tResult<NonNullable<(FlowInput & { type: I })['submission']>['value'] | null, ValiError<any>['issues']>\n\t\t\t\t\t>;\n\t\t\t\t};\n\t\t\t}[FlowInput['type']];\n\t };\n\nexport type FlowInterpreterParams = {\n\trpcClient: InploiRpcClient;\n\tanalytics: {\n\t\tservice: AnalyticsService;\n\t\tcustomProperties?: Record<string, unknown>;\n\t};\n\tlogger: Logger;\n\tt: TFunction;\n};\n\nexport type FlowActions = {\n\terror: ({ message }: { message: string }) => FlowInterpreterYield;\n\tinfo: ({ message }: { message: string }) => FlowInterpreterYield;\n\tsuccess: ({ message }: { message: string }) => FlowInterpreterYield;\n\ttext: ({ message, author }: { message: string; author: 'bot' | 'user' }) => FlowInterpreterYield;\n\timage: ({ url, height, width }: { url: string; height: number; width: number }) => FlowInterpreterYield;\n\tlink: ({ href, message }: { href: string; message: string }) => FlowInterpreterYield;\n\tsubmissions: (submissions: FlowSubmissions) => FlowInterpreterYield;\n\tstate: (state: 'loading' | 'idle') => FlowInterpreterYield;\n\tinput: <T extends FlowInput['type'], Input extends FlowInput & { type: T }>(\n\t\ttype: T,\n\t\tparams: {\n\t\t\tconfig: Input['config'];\n\t\t\tvalidate: (\n\t\t\t\tinput: NonNullable<Input['submission']>['value'] | null,\n\t\t\t) => MaybePromise<Result<NonNullable<Input['submission']>['value'] | null, ValiError<any>['issues']>>;\n\t\t},\n\t) => FlowInterpreterYield;\n};\n\nexport const createFlowInterpreter = (params: FlowInterpreterParams) => {\n\tconst submissions: FlowSubmissions = {};\n\n\treturn {\n\t\tinterpret: async function* interpret({\n\t\t\tnodes,\n\t\t\tcontext,\n\t\t}: {\n\t\t\tnodes: LinkedList<FlowNode>;\n\t\t\tcontext: Record<string, unknown>;\n\t\t}): AsyncGenerator<FlowInterpreterYield> {\n\t\t\tconst actions: FlowActions = {\n\t\t\t\terror: ({ message }) => ({ type: 'error', message: interpolateWithData(message, { submissions, context }) }),\n\t\t\t\tinfo: ({ message }) => ({ type: 'info', message: interpolateWithData(message, { submissions, context }) }),\n\t\t\t\tsuccess: ({ message }) => ({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tmessage: interpolateWithData(message, { submissions, context }),\n\t\t\t\t}),\n\t\t\t\ttext: ({ message, author }) => ({\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tauthor,\n\t\t\t\t\tmessage: interpolateWithData(message, { submissions, context }),\n\t\t\t\t}),\n\t\t\t\timage: ({ url, height, width }) => ({\n\t\t\t\t\ttype: 'image',\n\t\t\t\t\turl: interpolateWithData(url, { submissions, context }),\n\t\t\t\t\theight,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t\tstate: state => ({ type: 'state', state }),\n\t\t\t\tlink: ({ href, message }) => ({\n\t\t\t\t\ttype: 'link',\n\t\t\t\t\thref: interpolateWithData(href, { submissions, context }),\n\t\t\t\t\tmessage: interpolateWithData(message, { submissions, context }),\n\t\t\t\t}),\n\t\t\t\tsubmissions: submissions => ({ type: 'submissions', submissions }),\n\t\t\t\tinput: (type, params) => {\n\t\t\t\t\treturn { type: 'input', input: { type, config: params.config, validate: params.validate } as any };\n\t\t\t\t},\n\t\t\t};\n\t\t\tif (!nodes.headId) return { type: 'error', message: 'No head node found' };\n\t\t\tlet node: LinkedListItem<FlowNode> | undefined = nodes.items[nodes.headId];\n\t\t\tconst next = (nextId: string | undefined): { type: 'next'; nodeId: string | undefined } => {\n\t\t\t\tif (!nextId) {\n\t\t\t\t\tnode = undefined;\n\t\t\t\t\treturn { type: 'next', nodeId: undefined };\n\t\t\t\t}\n\t\t\t\tconst nextNode = nodes.items[nextId];\n\t\t\t\tif (!nextNode) throw new Error(`Next node with id ${nextId} not found`);\n\t\t\t\tnode = nextNode;\n\t\t\t\treturn { type: 'next', nodeId: nextId };\n\t\t\t};\n\t\t\tconst config = { ...params, context, submissions, next, actions };\n\n\t\t\twhile (node) {\n\t\t\t\tswitch (node.type) {\n\t\t\t\t\tcase 'text':\n\t\t\t\t\t\tyield actions.text({ author: 'bot', message: node.data.text });\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'image':\n\t\t\t\t\t\tyield actions.image(node.data);\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'link':\n\t\t\t\t\t\tyield actions.link({ href: node.data.href, message: node.data.cta });\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'add-submission':\n\t\t\t\t\t\tsubmissions[node.data.key] = { type: 'string', value: node.data.value };\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'jump':\n\t\t\t\t\t\tnext(node.data.targetId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-text':\n\t\t\t\t\t\tyield* interpretQuestionTextNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-phone':\n\t\t\t\t\t\tyield* interpretQuestionPhoneNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-boolean':\n\t\t\t\t\t\tyield* interpretQuestionBooleanNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-number':\n\t\t\t\t\t\tyield* interpretQuestionNumberNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-address':\n\t\t\t\t\t\tyield* interpretQuestionAddressNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-enum':\n\t\t\t\t\t\tyield* interpretQuestionEnumNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-file':\n\t\t\t\t\t\tyield* interpretQuestionFileNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'identify': {\n\t\t\t\t\t\tyield* interpretIdentifyNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'if-block': {\n\t\t\t\t\t\tconst nextNodeId =\n\t\t\t\t\t\t\tisIfBlockConditionMet(node, { context: config.context, submissions }) ? node.branchId : node.nextId;\n\t\t\t\t\t\tnext(nextNodeId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'integration-application-submit':\n\t\t\t\t\t\tyield* interpretIntegrationApplicationSubmitNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'feedback':\n\t\t\t\t\t\tyield actions.error({ message: 'Not implemented' });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'integration-workflow-get':\n\t\t\t\t\t\tyield actions.error({ message: 'This message should never be reached' });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'end-flow':\n\t\t\t\t\t\tnode = undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tyield actions.submissions(submissions);\n\t\t\t}\n\t\t\tyield { type: 'end' };\n\t\t},\n\t};\n};\n\nexport type InterpretNodeParams<TNodeType extends FlowNode['type']> = {\n\tnode: FlowNode & { type: TNodeType };\n\tconfig: FlowInterpreterParams & {\n\t\tsubmissions: FlowSubmissions;\n\t\tcontext: Record<string, unknown>;\n\t\tnext: (nextId: string | undefined) => { type: 'next'; nodeId: string | undefined };\n\t\tactions: FlowActions;\n\t};\n};\n\nexport type InterpretNodeReturn = AsyncGenerator<FlowInterpreterYield, { type: 'next'; nodeId: string | undefined }>;\n"],"mappings":"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","names":["import_get","isConditionMet","condition","context","submissions","ifBlock","firstSegment","path","answer","getSubmissionValueToCheck","value","get","newIfBlock","isIfBlockConditionMet","compareBoolean","compareNumber","conditions","import_get","HANDLEBARS_REGEXP","interpolateWithData","str","context","submissions","_","key","defaultValue","firstSegment","path","entity","getSubmissionValueToCheck","file","kbToReadableSize","line","formatPhoneNumber","value","get","i","interpretIdentifyNode","params","node","logger","analytics","submissions","next","getSubmissionValue","key","value","endpoint","typed","responseSchema","object","boolean","optional","string","number","unknown","nullable","submitEndpoint","endpoint","typed","interpretIntegrationApplicationSubmitNode","params","node","rpcClient","submissions","actions","next","analytics","logger","context","sessionInfo","tryCatch","response","getFlowSubmissionsPayload","parsed","safeParse","Err","Ok","e","issues","fieldValueSchema","pipe","nullable","optional","string","transform","i","getValidationSchema","node","keys","object","interpretQuestionAddressNode","params","submissions","actions","next","submission","Ok","schema","parsed","safeParse","Err","options","schema","picklist","interpretQuestionBooleanNode","params","node","submissions","actions","next","submission","Ok","parsed","safeParse","Err","interpretQuestionEnumNode","params","node","submissions","actions","next","schema","array","picklist","o","submission","Ok","parsed","safeParse","Err","interpretQuestionFileNode","params","node","submissions","actions","next","t","submission","Ok","minFiles","maxFiles","maxSize","allowedExtensions","ext","schema","pipe","array","object","string","check","filename","extension","getFileExtension","number","minLength","maxLength","files","acc","cur","kbToReadableSize","parsed","safeParse","Err","getValidationSchema","node","t","min","max","decimalCases","pipe","number","minValue","maxValue","check","value","interpretQuestionNumberNode","params","submissions","actions","next","thisSubmission","submission","Ok","schema","parsed","safeParse","Err","getValidationSchema","node","t","object","pipe","string","regex","minLength","transform","value","interpretQuestionPhoneNode","params","actions","next","submissions","thisSubmission","submission","Ok","schema","parsed","safeParse","Err","getValidationSchema","node","t","logger","errors","pipe","string","regex","email","minLength","maxLength","url","interpretQuestionTextNode","params","submissions","actions","next","thisSubmission","submission","Ok","schema","parsed","safeParse","Err","createFlowInterpreter","params","submissions","nodes","context","actions","message","interpolateWithData","author","url","height","width","state","href","type","node","next","nextId","nextNode","config","interpretQuestionTextNode","interpretQuestionPhoneNode","interpretQuestionBooleanNode","interpretQuestionNumberNode","interpretQuestionAddressNode","interpretQuestionEnumNode","interpretQuestionFileNode","interpretIdentifyNode","nextNodeId","isIfBlockConditionMet","interpretIntegrationApplicationSubmitNode"]}
|
package/dist/linked-list.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{y as f}from"./chunk-
|
|
1
|
+
import{y as f}from"./chunk-H5IXVEP2.mjs";import"./chunk-DKKJHDKM.mjs";var m={create:()=>({headId:null,items:{}}),addItem:(e,r,d={})=>{let t={id:f(),...r};if(!e.headId)return{...e,headId:t.id,items:{[t.id]:t}};if(d.afterId){let i=e.items[d.afterId];if(!i)throw new Error(`Item with afterId ${d.afterId} not found`);let s={...e.items};return t.prevId=d.afterId,t.nextId=i.nextId,s[d.afterId]={...i,nextId:t.id},i.nextId&&(s[i.nextId]={...s[i.nextId],prevId:t.id}),s[t.id]=t,{...e,items:s}}let I=e.headId;for(;I;){let i=e.items[I]?.nextId;if(!i)break;I=i}let n={...e.items[I],nextId:t.id};return t.prevId=I,{...e,items:{...e.items,[I]:n,[t.id]:t}}},removeItem:(e,r)=>{let d=e.items[r];if(!d)throw new Error(`Item with id ${r} not found`);let t={...e.items};return delete t[r],d.prevId&&d.nextId?(t[d.prevId]={...t[d.prevId],nextId:d.nextId},t[d.nextId]={...t[d.nextId],prevId:d.prevId}):d.prevId?t[d.prevId]={...t[d.prevId],nextId:void 0}:d.nextId&&(t[d.nextId]={...t[d.nextId],prevId:void 0}),{...e,headId:r===e.headId?d.nextId??null:e.headId,items:t}},moveItem:(e,r,d)=>{let t=e.items[r];if(!t)throw new Error(`Item with id ${r} not found`);let I=m.removeItem(e,r);if(d.beforeId){let n=e.items[d.beforeId];if(!n)throw new Error(`Target item with id ${d.beforeId} not found`);let i=I.items;return i[r]={...t,nextId:d.beforeId,prevId:n.prevId},i[d.beforeId]={...n,prevId:r,nextId:n.nextId===r?t.nextId:n.nextId},n.prevId&&(i[n.prevId]={...i[n.prevId],nextId:r}),{...e,headId:n.prevId?I.headId:r,items:i}}else if(d.afterId){let n=e.items[d.afterId];if(!n)throw new Error(`Target item with id ${d.afterId} not found`);let i={...I.items};return i[r]={...t,prevId:d.afterId,nextId:n.nextId},i[d.afterId]={...n,prevId:n.prevId===r?t.prevId:n.prevId,nextId:r},n.nextId&&(i[n.nextId]={...i[n.nextId],prevId:r}),{...e,headId:I.headId,items:i}}throw new Error("Invalid options")},asArray:e=>{let r=[];if(!("headId"in e)||e.headId===null)return r;let d=new Set,t=e.headId;for(;t;){if(d.has(t))throw new Error(`Circular reference detected: item ${t} was encountered twice`);let I=e.items[t];if(!I)throw new Error(`Invalid list structure: item with id ${t} not found`);d.add(t),r.push(I),t=I.nextId}return r},getInvalidItemKeys:e=>{let r=[],d=new Set,t=new Set;for(let[I,n]of Object.entries(e.items)){if(n.id!==I&&r.push(I),n.nextId&&!e.items[n.nextId]&&r.push(I),n.prevId&&!e.items[n.prevId]&&r.push(I),n.nextId){let i=e.items[n.nextId];i&&i.prevId!==n.id&&r.push(I)}if(n.prevId){let i=e.items[n.prevId];i&&i.nextId!==n.id&&r.push(I)}}if(e.headId)if(!e.items[e.headId])r.push(e.headId);else{let I=e.headId;for(;I;){if(t.has(I)){for(let n of t)r.push(n);break}t.add(I),d.add(I),I=e.items[I]?.nextId}}for(let I of Object.keys(e.items))d.has(I)||r.push(I);return[...new Set(r)]},isLinkedList:e=>e!==null&&typeof e=="object"&&"headId"in e&&"items"in e};export{m as LinkedList};
|
|
2
2
|
//# sourceMappingURL=linked-list.mjs.map
|
|
@@ -1567,7 +1567,7 @@ type TextInput = {
|
|
|
1567
1567
|
key: string;
|
|
1568
1568
|
optional: boolean;
|
|
1569
1569
|
placeholder?: string;
|
|
1570
|
-
format: 'text' | 'email' | 'url' | 'phone';
|
|
1570
|
+
format: 'text' | 'email' | 'url' | 'phone' | 'date';
|
|
1571
1571
|
defaultValue?: string;
|
|
1572
1572
|
maxChars: number | undefined;
|
|
1573
1573
|
minChars: number | undefined;
|
package/dist/utils.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { F as FlowSubmissions, E as Err, O as Ok, P as PhoneInput, I as InferOutput, b as ObjectSchema, L as LiteralSchema, S as StringSchema, c as OptionalSchema, N as NullableSchema } from './result-
|
|
1
|
+
import { F as FlowSubmissions, E as Err, O as Ok, P as PhoneInput, I as InferOutput, b as ObjectSchema, L as LiteralSchema, S as StringSchema, c as OptionalSchema, N as NullableSchema } from './result-e69ff761.js';
|
|
2
2
|
|
|
3
3
|
declare const genId: (size?: number) => string;
|
|
4
4
|
declare const getFlowSubmissionsPayload: (submissions: FlowSubmissions) => Record<string, unknown>;
|
package/dist/utils.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A as c,B as d,C as e,D as f,E as g,F as h,y as a,z as b}from"./chunk-
|
|
1
|
+
import{A as c,B as d,C as e,D as f,E as g,F as h,y as a,z as b}from"./chunk-H5IXVEP2.mjs";import"./chunk-DKKJHDKM.mjs";export{g as formatPhoneNumber,a as genId,e as getFileExtension,b as getFlowSubmissionsPayload,c as getSubmissionValue,d as getSubmissionValueToCheck,h as isRedirectResponse,f as kbToReadableSize};
|
|
2
2
|
//# sourceMappingURL=utils.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inploi/flows",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./interpreter": {
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
"tsup": "^7.2.0",
|
|
42
42
|
"valibot": "1.1.0",
|
|
43
43
|
"nanoid": "^5.1.5",
|
|
44
|
-
"@inploi/core": "1.16.1",
|
|
45
|
-
"@inploi/sdk": "1.17.0",
|
|
46
44
|
"@inploi/i18n": "0.1.5",
|
|
45
|
+
"@inploi/core": "1.16.2",
|
|
46
|
+
"@inploi/sdk": "1.17.0",
|
|
47
47
|
"eslint-config-custom": "0.1.0",
|
|
48
48
|
"tsconfig": "0.1.0"
|
|
49
49
|
},
|