@inploi/flows 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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","__spreadProps","__spreadValues","isIfBlockConditionMet","compareBoolean","compareNumber","e","conditions","import_get","HANDLEBARS_REGEXP","interpolateWithData","str","context","submissions","_","key","defaultValue","firstSegment","path","entity","getSubmissionValueToCheck","file","kbToReadableSize","line","formatPhoneNumber","value","get","i","interpretIdentifyNode","params","__asyncGenerator","node","logger","analytics","submissions","next","getSubmissionValue","key","value","_a","endpoint","typed","responseSchema","object","boolean","optional","string","number","unknown","nullable","submitEndpoint","endpoint","typed","interpretIntegrationApplicationSubmitNode","params","__asyncGenerator","_a","node","rpcClient","submissions","actions","next","analytics","logger","context","__async","sessionInfo","tryCatch","response","getFlowSubmissionsPayload","parsed","safeParse","Err","Ok","e","issues","fieldValueSchema","pipe","nullable","optional","string","transform","i","getValidationSchema","node","_a","_b","_c","_d","_e","_f","_g","keys","object","interpretQuestionAddressNode","params","__asyncGenerator","submissions","actions","next","submission","Ok","schema","parsed","safeParse","Err","options","schema","picklist","interpretQuestionBooleanNode","params","__asyncGenerator","node","submissions","actions","next","submission","Ok","parsed","safeParse","Err","interpretQuestionEnumNode","params","__asyncGenerator","node","submissions","actions","next","schema","array","picklist","o","submission","Ok","parsed","safeParse","Err","interpretQuestionFileNode","params","__asyncGenerator","node","submissions","actions","next","t","submission","_a","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","_a","_b","_c","min","max","decimalCases","pipe","number","minValue","maxValue","check","value","interpretQuestionNumberNode","params","__asyncGenerator","submissions","actions","next","thisSubmission","submission","Ok","schema","parsed","safeParse","Err","getValidationSchema","node","t","object","pipe","string","regex","minLength","transform","value","interpretQuestionPhoneNode","params","__asyncGenerator","actions","next","submissions","thisSubmission","submission","Ok","schema","parsed","safeParse","Err","getValidationSchema","node","t","logger","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","errors","pipe","string","email","minLength","maxLength","url","interpretQuestionTextNode","params","__asyncGenerator","submissions","actions","next","thisSubmission","submission","Ok","schema","parsed","safeParse","Err","createFlowInterpreter","params","submissions","_0","__asyncGenerator","nodes","context","actions","message","interpolateWithData","author","url","height","width","state","href","type","node","next","nextId","nextNode","config","__spreadProps","__spreadValues","__yieldStar","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\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"]}
@@ -9,19 +9,19 @@ type LinkedList<T> = {
9
9
  };
10
10
  declare const LinkedList: {
11
11
  create: <T>() => LinkedList<T>;
12
- addItem: <L extends LinkedList<any>>(list: L, payload: Omit<L['items'][keyof L['items']], 'id'>, options?: {
12
+ addItem: <L extends LinkedList<any>>(list: L, payload: Omit<L["items"][keyof L["items"]], "id">, options?: {
13
13
  afterId?: string;
14
14
  }) => L;
15
- removeItem: <L_1 extends LinkedList<any>>(list: L_1, id: string) => L_1;
16
- moveItem: <L_2 extends LinkedList<any>>(list: L_2, id: string, options: {
15
+ removeItem: <L extends LinkedList<any>>(list: L, id: string) => L;
16
+ moveItem: <L extends LinkedList<any>>(list: L, id: string, options: {
17
17
  beforeId?: never;
18
18
  afterId: string;
19
19
  } | {
20
20
  beforeId: string;
21
21
  afterId?: never;
22
- }) => L_2;
23
- asArray: <T_1>(list: LinkedList<T_1>) => LinkedListItem<T_1>[];
24
- getInvalidItemKeys: <T_2>(list: LinkedList<T_2>) => string[];
22
+ }) => L;
23
+ asArray: <T>(list: LinkedList<T>) => LinkedListItem<T>[];
24
+ getInvalidItemKeys: <T>(list: LinkedList<T>) => string[];
25
25
  isLinkedList: (list: unknown) => list is LinkedList<unknown>;
26
26
  };
27
27
 
@@ -1,2 +1,2 @@
1
- import{E as o,a as i,b as f}from"./chunk-VKMPK5WA.mjs";var h={create:()=>({headId:null,items:{}}),addItem:(e,r,d={})=>{var I;let t=i({id:o()},r);if(!e.headId)return f(i({},e),{headId:t.id,items:{[t.id]:t}});if(d.afterId){let m=e.items[d.afterId];if(!m)throw new Error(`Item with afterId ${d.afterId} not found`);let a=i({},e.items);return t.prevId=d.afterId,t.nextId=m.nextId,a[d.afterId]=f(i({},m),{nextId:t.id}),m.nextId&&(a[m.nextId]=f(i({},a[m.nextId]),{prevId:t.id})),a[t.id]=t,f(i({},e),{items:a})}let s=e.headId;for(;s;){let m=(I=e.items[s])==null?void 0:I.nextId;if(!m)break;s=m}let n=f(i({},e.items[s]),{nextId:t.id});return t.prevId=s,f(i({},e),{items:f(i({},e.items),{[s]:n,[t.id]:t})})},removeItem:(e,r)=>{var s;let d=e.items[r];if(!d)throw new Error(`Item with id ${r} not found`);let t=i({},e.items);return delete t[r],d.prevId&&d.nextId?(t[d.prevId]=f(i({},t[d.prevId]),{nextId:d.nextId}),t[d.nextId]=f(i({},t[d.nextId]),{prevId:d.prevId})):d.prevId?t[d.prevId]=f(i({},t[d.prevId]),{nextId:void 0}):d.nextId&&(t[d.nextId]=f(i({},t[d.nextId]),{prevId:void 0})),f(i({},e),{headId:r===e.headId?(s=d.nextId)!=null?s: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 s=h.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=s.items;return I[r]=f(i({},t),{nextId:d.beforeId,prevId:n.prevId}),I[d.beforeId]=f(i({},n),{prevId:r,nextId:n.nextId===r?t.nextId:n.nextId}),n.prevId&&(I[n.prevId]=f(i({},I[n.prevId]),{nextId:r})),f(i({},e),{headId:n.prevId?s.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({},s.items);return I[r]=f(i({},t),{prevId:d.afterId,nextId:n.nextId}),I[d.afterId]=f(i({},n),{prevId:n.prevId===r?t.prevId:n.prevId,nextId:r}),n.nextId&&(I[n.nextId]=f(i({},I[n.nextId]),{prevId:r})),f(i({},e),{headId:s.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 s=e.items[t];if(!s)throw new Error(`Invalid list structure: item with id ${t} not found`);d.add(t),r.push(s),t=s.nextId}return r},getInvalidItemKeys:e=>{var s;let r=[],d=new Set,t=new Set;for(let[n,I]of Object.entries(e.items)){if(I.id!==n&&r.push(n),I.nextId&&!e.items[I.nextId]&&r.push(n),I.prevId&&!e.items[I.prevId]&&r.push(n),I.nextId){let m=e.items[I.nextId];m&&m.prevId!==I.id&&r.push(n)}if(I.prevId){let m=e.items[I.prevId];m&&m.nextId!==I.id&&r.push(n)}}if(e.headId)if(!e.items[e.headId])r.push(e.headId);else{let n=e.headId;for(;n;){if(t.has(n)){for(let I of t)r.push(I);break}t.add(n),d.add(n),n=(s=e.items[n])==null?void 0:s.nextId}}for(let n of Object.keys(e.items))d.has(n)||r.push(n);return[...new Set(r)]},isLinkedList:e=>e!==null&&typeof e=="object"&&"headId"in e&&"items"in e};export{h as LinkedList};
1
+ import{y as f}from"./chunk-3HF7KDUR.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
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/linked-list.ts"],"sourcesContent":["import { genId } from './utils';\n\nexport type LinkedListItem<T> = T & { id: string; nextId?: string; prevId?: string };\nexport type LinkedList<T> = { headId: string | null; items: Record<string, LinkedListItem<T>> };\n\nexport const LinkedList = {\n\tcreate: <T>(): LinkedList<T> => {\n\t\treturn { headId: null, items: {} };\n\t},\n\n\taddItem: <L extends LinkedList<any>>(\n\t\tlist: L,\n\t\tpayload: Omit<L['items'][keyof L['items']], 'id'>,\n\t\toptions: { afterId?: string } = {},\n\t): L => {\n\t\tconst newItem = {\n\t\t\tid: genId(),\n\t\t\t...payload,\n\t\t} as L['items'][keyof L['items']];\n\n\t\t// If list is empty, create first item\n\t\tif (!list.headId) {\n\t\t\treturn {\n\t\t\t\t...list,\n\t\t\t\theadId: newItem.id,\n\t\t\t\titems: { [newItem.id]: newItem },\n\t\t\t};\n\t\t}\n\n\t\t// If afterId is specified, insert after that item\n\t\tif (options.afterId) {\n\t\t\tconst afterItem = list.items[options.afterId];\n\t\t\tif (!afterItem) {\n\t\t\t\tthrow new Error(`Item with afterId ${options.afterId} not found`);\n\t\t\t}\n\t\t\tconst newItems = { ...list.items };\n\n\t\t\t// Update the new item's links\n\t\t\tnewItem.prevId = options.afterId;\n\t\t\tnewItem.nextId = afterItem.nextId;\n\n\t\t\t// Update the item we're inserting after\n\t\t\tnewItems[options.afterId] = {\n\t\t\t\t...afterItem,\n\t\t\t\tnextId: newItem.id,\n\t\t\t};\n\n\t\t\t// If there was a next item, update its prevId\n\t\t\tif (afterItem.nextId) {\n\t\t\t\tnewItems[afterItem.nextId] = {\n\t\t\t\t\t...newItems[afterItem.nextId],\n\t\t\t\t\tprevId: newItem.id,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Add the new item\n\t\t\tnewItems[newItem.id] = newItem;\n\n\t\t\treturn {\n\t\t\t\t...list,\n\t\t\t\titems: newItems,\n\t\t\t};\n\t\t}\n\n\t\t// If no afterId specified, add to end of list\n\t\tlet currentId: string = list.headId;\n\t\twhile (currentId) {\n\t\t\tconst newId = list.items[currentId]?.nextId;\n\t\t\tif (!newId) break;\n\t\t\tcurrentId = newId;\n\t\t}\n\n\t\t// Update the last item's nextId\n\t\tconst updatedLastItem = {\n\t\t\t...list.items[currentId],\n\t\t\tnextId: newItem.id,\n\t\t};\n\n\t\t// Add the new item with prevId pointing to the last item\n\t\tnewItem.prevId = currentId;\n\n\t\treturn {\n\t\t\t...list,\n\t\t\titems: {\n\t\t\t\t...list.items,\n\t\t\t\t[currentId]: updatedLastItem,\n\t\t\t\t[newItem.id]: newItem,\n\t\t\t},\n\t\t};\n\t},\n\n\tremoveItem: <L extends LinkedList<any>>(list: L, id: string): L => {\n\t\tconst item = list.items[id];\n\t\tif (!item) throw new Error(`Item with id ${id} not found`);\n\n\t\tconst newItems = { ...list.items };\n\t\tdelete newItems[id];\n\n\t\t// Update surrounding items\n\t\tif (item.prevId && item.nextId) {\n\t\t\t// Middle item\n\t\t\tnewItems[item.prevId] = {\n\t\t\t\t...newItems[item.prevId],\n\t\t\t\tnextId: item.nextId,\n\t\t\t};\n\n\t\t\tnewItems[item.nextId] = {\n\t\t\t\t...newItems[item.nextId],\n\t\t\t\tprevId: item.prevId,\n\t\t\t};\n\t\t} else if (item.prevId) {\n\t\t\t// Last item\n\t\t\tnewItems[item.prevId] = {\n\t\t\t\t...newItems[item.prevId],\n\t\t\t\tnextId: undefined,\n\t\t\t};\n\t\t} else if (item.nextId) {\n\t\t\t// First item\n\t\t\tnewItems[item.nextId] = {\n\t\t\t\t...newItems[item.nextId],\n\t\t\t\tprevId: undefined,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t...list,\n\t\t\theadId: id === list.headId ? item.nextId ?? null : list.headId,\n\t\t\titems: newItems,\n\t\t};\n\t},\n\n\tmoveItem: <L extends LinkedList<any>>(\n\t\tlist: L,\n\t\tid: string,\n\t\toptions: { beforeId?: never; afterId: string } | { beforeId: string; afterId?: never },\n\t): L => {\n\t\tconst itemToMove = list.items[id];\n\t\tif (!itemToMove) throw new Error(`Item with id ${id} not found`);\n\n\t\t// First remove the item from its current position\n\t\tconst listWithoutItem = LinkedList.removeItem(list, id);\n\n\t\tif (options.beforeId) {\n\t\t\tconst targetItem = list.items[options.beforeId];\n\t\t\tif (!targetItem) throw new Error(`Target item with id ${options.beforeId} not found`);\n\t\t\tconst newItems = listWithoutItem.items;\n\n\t\t\t// Update the moved item\n\t\t\tnewItems[id] = {\n\t\t\t\t...itemToMove,\n\t\t\t\tnextId: options.beforeId,\n\t\t\t\tprevId: targetItem.prevId,\n\t\t\t};\n\n\t\t\t// Update the target item\n\t\t\tnewItems[options.beforeId] = {\n\t\t\t\t...targetItem,\n\t\t\t\tprevId: id,\n\t\t\t\tnextId: targetItem.nextId === id ? itemToMove.nextId : targetItem.nextId,\n\t\t\t};\n\n\t\t\t// Update the previous item if it exists\n\t\t\tif (targetItem.prevId) {\n\t\t\t\tnewItems[targetItem.prevId] = {\n\t\t\t\t\t...newItems[targetItem.prevId],\n\t\t\t\t\tnextId: id,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...list,\n\t\t\t\theadId: targetItem.prevId ? listWithoutItem.headId : id,\n\t\t\t\titems: newItems,\n\t\t\t};\n\t\t} else if (options.afterId) {\n\t\t\tconst targetItem = list.items[options.afterId];\n\t\t\tif (!targetItem) throw new Error(`Target item with id ${options.afterId} not found`);\n\t\t\tconst newItems = { ...listWithoutItem.items };\n\n\t\t\t// Update the moved item\n\t\t\tnewItems[id] = {\n\t\t\t\t...itemToMove,\n\t\t\t\tprevId: options.afterId,\n\t\t\t\tnextId: targetItem.nextId,\n\t\t\t};\n\n\t\t\t// Update the target item\n\t\t\tnewItems[options.afterId!] = {\n\t\t\t\t...targetItem,\n\t\t\t\tprevId: targetItem.prevId === id ? itemToMove.prevId : targetItem.prevId,\n\t\t\t\tnextId: id,\n\t\t\t};\n\n\t\t\t// Update the next item if it exists\n\t\t\tif (targetItem.nextId) {\n\t\t\t\tnewItems[targetItem.nextId] = {\n\t\t\t\t\t...newItems[targetItem.nextId],\n\t\t\t\t\tprevId: id,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...list,\n\t\t\t\theadId: listWithoutItem.headId,\n\t\t\t\titems: newItems,\n\t\t\t};\n\t\t}\n\n\t\tthrow new Error('Invalid options');\n\t},\n\n\tasArray: <T>(list: LinkedList<T>): LinkedListItem<T>[] => {\n\t\tconst result: LinkedListItem<T>[] = [];\n\t\tif ('headId' in list === false || list.headId === null) return result;\n\n\t\tconst visited = new Set<string>();\n\t\tlet currentId: string | undefined = list.headId;\n\n\t\twhile (currentId) {\n\t\t\tif (visited.has(currentId))\n\t\t\t\tthrow new Error(`Circular reference detected: item ${currentId} was encountered twice`);\n\n\t\t\tconst currentItem: LinkedListItem<T> | undefined = list.items[currentId];\n\t\t\tif (!currentItem) {\n\t\t\t\tthrow new Error(`Invalid list structure: item with id ${currentId} not found`);\n\t\t\t}\n\t\t\tvisited.add(currentId);\n\t\t\tresult.push(currentItem);\n\t\t\tcurrentId = currentItem.nextId;\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tgetInvalidItemKeys: <T>(list: LinkedList<T>): string[] => {\n\t\tconst invalidKeys: string[] = [];\n\t\tconst reachableIds = new Set<string>();\n\t\tconst visited = new Set<string>();\n\n\t\t// First pass: check for id mismatches and collect all ids\n\t\tfor (const [key, item] of Object.entries(list.items)) {\n\t\t\t// Check if item's id matches its key in the record\n\t\t\tif (item.id !== key) {\n\t\t\t\tinvalidKeys.push(key);\n\t\t\t}\n\n\t\t\t// Check for invalid nextId references\n\t\t\tif (item.nextId && !list.items[item.nextId]) {\n\t\t\t\tinvalidKeys.push(key);\n\t\t\t}\n\n\t\t\t// Check for invalid prevId references\n\t\t\tif (item.prevId && !list.items[item.prevId]) {\n\t\t\t\tinvalidKeys.push(key);\n\t\t\t}\n\n\t\t\t// Check for broken bidirectional links\n\t\t\tif (item.nextId) {\n\t\t\t\tconst nextItem = list.items[item.nextId];\n\t\t\t\tif (nextItem && nextItem.prevId !== item.id) {\n\t\t\t\t\tinvalidKeys.push(key);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (item.prevId) {\n\t\t\t\tconst prevItem = list.items[item.prevId];\n\t\t\t\tif (prevItem && prevItem.nextId !== item.id) {\n\t\t\t\t\tinvalidKeys.push(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check if headId is valid\n\t\tif (list.headId) {\n\t\t\tif (!list.items[list.headId]) {\n\t\t\t\tinvalidKeys.push(list.headId);\n\t\t\t} else {\n\t\t\t\t// Second pass: traverse the list from head to find reachable nodes\n\t\t\t\tlet currentId: string | undefined = list.headId;\n\t\t\t\twhile (currentId) {\n\t\t\t\t\tif (visited.has(currentId)) {\n\t\t\t\t\t\t// We found a cycle - mark all items in the cycle as invalid\n\t\t\t\t\t\tfor (const visitedId of visited) {\n\t\t\t\t\t\t\tinvalidKeys.push(visitedId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tvisited.add(currentId);\n\t\t\t\t\treachableIds.add(currentId);\n\t\t\t\t\tcurrentId = list.items[currentId]?.nextId;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Third pass: find items that aren't reachable from the head\n\t\tfor (const key of Object.keys(list.items)) {\n\t\t\tif (!reachableIds.has(key)) {\n\t\t\t\tinvalidKeys.push(key);\n\t\t\t}\n\t\t}\n\n\t\t// Remove duplicates and return\n\t\treturn [...new Set(invalidKeys)];\n\t},\n\n\tisLinkedList: (list: unknown): list is LinkedList<unknown> => {\n\t\treturn list !== null && typeof list === 'object' && 'headId' in list && 'items' in list;\n\t},\n};\n"],"mappings":"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","names":["LinkedList","list","payload","options","_a","newItem","__spreadValues","genId","__spreadProps","afterItem","newItems","currentId","newId","updatedLastItem","id","item","itemToMove","listWithoutItem","targetItem","result","visited","currentItem","invalidKeys","reachableIds","key","nextItem","prevItem","visitedId"]}
1
+ {"version":3,"sources":["../src/linked-list.ts"],"sourcesContent":["import { genId } from './utils';\n\nexport type LinkedListItem<T> = T & { id: string; nextId?: string; prevId?: string };\nexport type LinkedList<T> = { headId: string | null; items: Record<string, LinkedListItem<T>> };\n\nexport const LinkedList = {\n\tcreate: <T>(): LinkedList<T> => {\n\t\treturn { headId: null, items: {} };\n\t},\n\n\taddItem: <L extends LinkedList<any>>(\n\t\tlist: L,\n\t\tpayload: Omit<L['items'][keyof L['items']], 'id'>,\n\t\toptions: { afterId?: string } = {},\n\t): L => {\n\t\tconst newItem = {\n\t\t\tid: genId(),\n\t\t\t...payload,\n\t\t} as L['items'][keyof L['items']];\n\n\t\t// If list is empty, create first item\n\t\tif (!list.headId) {\n\t\t\treturn {\n\t\t\t\t...list,\n\t\t\t\theadId: newItem.id,\n\t\t\t\titems: { [newItem.id]: newItem },\n\t\t\t};\n\t\t}\n\n\t\t// If afterId is specified, insert after that item\n\t\tif (options.afterId) {\n\t\t\tconst afterItem = list.items[options.afterId];\n\t\t\tif (!afterItem) {\n\t\t\t\tthrow new Error(`Item with afterId ${options.afterId} not found`);\n\t\t\t}\n\t\t\tconst newItems = { ...list.items };\n\n\t\t\t// Update the new item's links\n\t\t\tnewItem.prevId = options.afterId;\n\t\t\tnewItem.nextId = afterItem.nextId;\n\n\t\t\t// Update the item we're inserting after\n\t\t\tnewItems[options.afterId] = {\n\t\t\t\t...afterItem,\n\t\t\t\tnextId: newItem.id,\n\t\t\t};\n\n\t\t\t// If there was a next item, update its prevId\n\t\t\tif (afterItem.nextId) {\n\t\t\t\tnewItems[afterItem.nextId] = {\n\t\t\t\t\t...newItems[afterItem.nextId],\n\t\t\t\t\tprevId: newItem.id,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Add the new item\n\t\t\tnewItems[newItem.id] = newItem;\n\n\t\t\treturn {\n\t\t\t\t...list,\n\t\t\t\titems: newItems,\n\t\t\t};\n\t\t}\n\n\t\t// If no afterId specified, add to end of list\n\t\tlet currentId: string = list.headId;\n\t\twhile (currentId) {\n\t\t\tconst newId = list.items[currentId]?.nextId;\n\t\t\tif (!newId) break;\n\t\t\tcurrentId = newId;\n\t\t}\n\n\t\t// Update the last item's nextId\n\t\tconst updatedLastItem = {\n\t\t\t...list.items[currentId],\n\t\t\tnextId: newItem.id,\n\t\t};\n\n\t\t// Add the new item with prevId pointing to the last item\n\t\tnewItem.prevId = currentId;\n\n\t\treturn {\n\t\t\t...list,\n\t\t\titems: {\n\t\t\t\t...list.items,\n\t\t\t\t[currentId]: updatedLastItem,\n\t\t\t\t[newItem.id]: newItem,\n\t\t\t},\n\t\t};\n\t},\n\n\tremoveItem: <L extends LinkedList<any>>(list: L, id: string): L => {\n\t\tconst item = list.items[id];\n\t\tif (!item) throw new Error(`Item with id ${id} not found`);\n\n\t\tconst newItems = { ...list.items };\n\t\tdelete newItems[id];\n\n\t\t// Update surrounding items\n\t\tif (item.prevId && item.nextId) {\n\t\t\t// Middle item\n\t\t\tnewItems[item.prevId] = {\n\t\t\t\t...newItems[item.prevId],\n\t\t\t\tnextId: item.nextId,\n\t\t\t};\n\n\t\t\tnewItems[item.nextId] = {\n\t\t\t\t...newItems[item.nextId],\n\t\t\t\tprevId: item.prevId,\n\t\t\t};\n\t\t} else if (item.prevId) {\n\t\t\t// Last item\n\t\t\tnewItems[item.prevId] = {\n\t\t\t\t...newItems[item.prevId],\n\t\t\t\tnextId: undefined,\n\t\t\t};\n\t\t} else if (item.nextId) {\n\t\t\t// First item\n\t\t\tnewItems[item.nextId] = {\n\t\t\t\t...newItems[item.nextId],\n\t\t\t\tprevId: undefined,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t...list,\n\t\t\theadId: id === list.headId ? item.nextId ?? null : list.headId,\n\t\t\titems: newItems,\n\t\t};\n\t},\n\n\tmoveItem: <L extends LinkedList<any>>(\n\t\tlist: L,\n\t\tid: string,\n\t\toptions: { beforeId?: never; afterId: string } | { beforeId: string; afterId?: never },\n\t): L => {\n\t\tconst itemToMove = list.items[id];\n\t\tif (!itemToMove) throw new Error(`Item with id ${id} not found`);\n\n\t\t// First remove the item from its current position\n\t\tconst listWithoutItem = LinkedList.removeItem(list, id);\n\n\t\tif (options.beforeId) {\n\t\t\tconst targetItem = list.items[options.beforeId];\n\t\t\tif (!targetItem) throw new Error(`Target item with id ${options.beforeId} not found`);\n\t\t\tconst newItems = listWithoutItem.items;\n\n\t\t\t// Update the moved item\n\t\t\tnewItems[id] = {\n\t\t\t\t...itemToMove,\n\t\t\t\tnextId: options.beforeId,\n\t\t\t\tprevId: targetItem.prevId,\n\t\t\t};\n\n\t\t\t// Update the target item\n\t\t\tnewItems[options.beforeId] = {\n\t\t\t\t...targetItem,\n\t\t\t\tprevId: id,\n\t\t\t\tnextId: targetItem.nextId === id ? itemToMove.nextId : targetItem.nextId,\n\t\t\t};\n\n\t\t\t// Update the previous item if it exists\n\t\t\tif (targetItem.prevId) {\n\t\t\t\tnewItems[targetItem.prevId] = {\n\t\t\t\t\t...newItems[targetItem.prevId],\n\t\t\t\t\tnextId: id,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...list,\n\t\t\t\theadId: targetItem.prevId ? listWithoutItem.headId : id,\n\t\t\t\titems: newItems,\n\t\t\t};\n\t\t} else if (options.afterId) {\n\t\t\tconst targetItem = list.items[options.afterId];\n\t\t\tif (!targetItem) throw new Error(`Target item with id ${options.afterId} not found`);\n\t\t\tconst newItems = { ...listWithoutItem.items };\n\n\t\t\t// Update the moved item\n\t\t\tnewItems[id] = {\n\t\t\t\t...itemToMove,\n\t\t\t\tprevId: options.afterId,\n\t\t\t\tnextId: targetItem.nextId,\n\t\t\t};\n\n\t\t\t// Update the target item\n\t\t\tnewItems[options.afterId!] = {\n\t\t\t\t...targetItem,\n\t\t\t\tprevId: targetItem.prevId === id ? itemToMove.prevId : targetItem.prevId,\n\t\t\t\tnextId: id,\n\t\t\t};\n\n\t\t\t// Update the next item if it exists\n\t\t\tif (targetItem.nextId) {\n\t\t\t\tnewItems[targetItem.nextId] = {\n\t\t\t\t\t...newItems[targetItem.nextId],\n\t\t\t\t\tprevId: id,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...list,\n\t\t\t\theadId: listWithoutItem.headId,\n\t\t\t\titems: newItems,\n\t\t\t};\n\t\t}\n\n\t\tthrow new Error('Invalid options');\n\t},\n\n\tasArray: <T>(list: LinkedList<T>): LinkedListItem<T>[] => {\n\t\tconst result: LinkedListItem<T>[] = [];\n\t\tif ('headId' in list === false || list.headId === null) return result;\n\n\t\tconst visited = new Set<string>();\n\t\tlet currentId: string | undefined = list.headId;\n\n\t\twhile (currentId) {\n\t\t\tif (visited.has(currentId))\n\t\t\t\tthrow new Error(`Circular reference detected: item ${currentId} was encountered twice`);\n\n\t\t\tconst currentItem: LinkedListItem<T> | undefined = list.items[currentId];\n\t\t\tif (!currentItem) {\n\t\t\t\tthrow new Error(`Invalid list structure: item with id ${currentId} not found`);\n\t\t\t}\n\t\t\tvisited.add(currentId);\n\t\t\tresult.push(currentItem);\n\t\t\tcurrentId = currentItem.nextId;\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tgetInvalidItemKeys: <T>(list: LinkedList<T>): string[] => {\n\t\tconst invalidKeys: string[] = [];\n\t\tconst reachableIds = new Set<string>();\n\t\tconst visited = new Set<string>();\n\n\t\t// First pass: check for id mismatches and collect all ids\n\t\tfor (const [key, item] of Object.entries(list.items)) {\n\t\t\t// Check if item's id matches its key in the record\n\t\t\tif (item.id !== key) {\n\t\t\t\tinvalidKeys.push(key);\n\t\t\t}\n\n\t\t\t// Check for invalid nextId references\n\t\t\tif (item.nextId && !list.items[item.nextId]) {\n\t\t\t\tinvalidKeys.push(key);\n\t\t\t}\n\n\t\t\t// Check for invalid prevId references\n\t\t\tif (item.prevId && !list.items[item.prevId]) {\n\t\t\t\tinvalidKeys.push(key);\n\t\t\t}\n\n\t\t\t// Check for broken bidirectional links\n\t\t\tif (item.nextId) {\n\t\t\t\tconst nextItem = list.items[item.nextId];\n\t\t\t\tif (nextItem && nextItem.prevId !== item.id) {\n\t\t\t\t\tinvalidKeys.push(key);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (item.prevId) {\n\t\t\t\tconst prevItem = list.items[item.prevId];\n\t\t\t\tif (prevItem && prevItem.nextId !== item.id) {\n\t\t\t\t\tinvalidKeys.push(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check if headId is valid\n\t\tif (list.headId) {\n\t\t\tif (!list.items[list.headId]) {\n\t\t\t\tinvalidKeys.push(list.headId);\n\t\t\t} else {\n\t\t\t\t// Second pass: traverse the list from head to find reachable nodes\n\t\t\t\tlet currentId: string | undefined = list.headId;\n\t\t\t\twhile (currentId) {\n\t\t\t\t\tif (visited.has(currentId)) {\n\t\t\t\t\t\t// We found a cycle - mark all items in the cycle as invalid\n\t\t\t\t\t\tfor (const visitedId of visited) {\n\t\t\t\t\t\t\tinvalidKeys.push(visitedId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tvisited.add(currentId);\n\t\t\t\t\treachableIds.add(currentId);\n\t\t\t\t\tcurrentId = list.items[currentId]?.nextId;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Third pass: find items that aren't reachable from the head\n\t\tfor (const key of Object.keys(list.items)) {\n\t\t\tif (!reachableIds.has(key)) {\n\t\t\t\tinvalidKeys.push(key);\n\t\t\t}\n\t\t}\n\n\t\t// Remove duplicates and return\n\t\treturn [...new Set(invalidKeys)];\n\t},\n\n\tisLinkedList: (list: unknown): list is LinkedList<unknown> => {\n\t\treturn list !== null && typeof list === 'object' && 'headId' in list && 'items' in list;\n\t},\n};\n"],"mappings":"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","names":["LinkedList","list","payload","options","newItem","genId","afterItem","newItems","currentId","newId","updatedLastItem","id","item","itemToMove","listWithoutItem","targetItem","result","visited","currentItem","invalidKeys","reachableIds","key","nextItem","prevItem","visitedId"]}
package/dist/utils.d.mts CHANGED
@@ -1,6 +1,6 @@
1
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-3e1b4efe.js';
2
2
 
3
- declare const genId: (size?: number | undefined) => string;
3
+ declare const genId: (size?: number) => string;
4
4
  declare const getFlowSubmissionsPayload: (submissions: FlowSubmissions) => Record<string, unknown>;
5
5
  declare const getSubmissionValue: ({ key, submissions }: {
6
6
  submissions: FlowSubmissions;
@@ -15,7 +15,7 @@ declare const getSubmissionValueToCheck: ({ key, path, submissions, context, }:
15
15
  }) => FlowSubmissions[string] | undefined;
16
16
  declare const getFileExtension: (fileName: string) => Err<"No file extension found"> | Ok<string>;
17
17
  declare const kbToReadableSize: (kb: number) => string;
18
- declare const formatPhoneNumber: (phoneNumber: PhoneInput['submission']['value']) => string;
18
+ declare const formatPhoneNumber: (phoneNumber: PhoneInput["submission"]["value"]) => string;
19
19
  declare const redirectResponseSchema: ObjectSchema<{
20
20
  readonly success: LiteralSchema<true, undefined>;
21
21
  readonly integration_response: ObjectSchema<{
@@ -27,15 +27,6 @@ declare const redirectResponseSchema: ObjectSchema<{
27
27
  }, undefined>;
28
28
  }, undefined>;
29
29
  type RedirectIntegrationResponse = InferOutput<typeof redirectResponseSchema>;
30
- declare const isRedirectResponse: (response: unknown) => response is {
31
- success: true;
32
- integration_response: {
33
- data: {
34
- redirect_url: string;
35
- message?: string | null | undefined;
36
- button_text?: string | null | undefined;
37
- };
38
- };
39
- };
30
+ declare const isRedirectResponse: (response: unknown) => response is RedirectIntegrationResponse;
40
31
 
41
32
  export { RedirectIntegrationResponse, formatPhoneNumber, genId, getFileExtension, getFlowSubmissionsPayload, getSubmissionValue, getSubmissionValueToCheck, isRedirectResponse, kbToReadableSize };
package/dist/utils.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{E as a,F as b,G as c,H as d,I as e,J as f,K as g,L as h}from"./chunk-VKMPK5WA.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};
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-3HF7KDUR.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": "2.0.0",
3
+ "version": "3.0.0",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  "./interpreter": {
@@ -17,6 +17,11 @@
17
17
  "require": "./dist/linked-list.mjs",
18
18
  "import": "./dist/linked-list.mjs",
19
19
  "types": "./dist/linked-list.d.mts"
20
+ },
21
+ "./i18n": {
22
+ "require": "./dist/i18n.mjs",
23
+ "import": "./dist/i18n.mjs",
24
+ "types": "./dist/i18n.d.mts"
20
25
  }
21
26
  },
22
27
  "files": [
@@ -24,7 +29,7 @@
24
29
  ],
25
30
  "peerDependencies": {
26
31
  "@inploi/core": "*",
27
- "@inploi/sdk": ">=1.15.0",
32
+ "@inploi/sdk": ">=1.16.0",
28
33
  "@inploi/i18n": "*"
29
34
  },
30
35
  "devDependencies": {
@@ -36,9 +41,9 @@
36
41
  "tsup": "^7.2.0",
37
42
  "valibot": "1.1.0",
38
43
  "nanoid": "^5.1.5",
39
- "@inploi/core": "1.16.0",
40
- "@inploi/sdk": "1.15.0",
41
- "@inploi/i18n": "0.1.3",
44
+ "@inploi/core": "1.16.1",
45
+ "@inploi/sdk": "1.16.0",
46
+ "@inploi/i18n": "0.1.5",
42
47
  "eslint-config-custom": "0.1.0",
43
48
  "tsconfig": "0.1.0"
44
49
  },
@@ -1,2 +0,0 @@
1
- var cn=Object.create;var C=Object.defineProperty,an=Object.defineProperties,fn=Object.getOwnPropertyDescriptor,pn=Object.getOwnPropertyDescriptors,yn=Object.getOwnPropertyNames,Q=Object.getOwnPropertySymbols,hn=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty,vn=Object.prototype.propertyIsEnumerable;var R=(e,r)=>{if(r=Symbol[e])return r;throw Error("Symbol."+e+" is not defined")};var ee=(e,r,n)=>r in e?C(e,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[r]=n,ne=(e,r)=>{for(var n in r||(r={}))re.call(r,n)&&ee(e,n,r[n]);if(Q)for(var n of Q(r))vn.call(r,n)&&ee(e,n,r[n]);return e},te=(e,r)=>an(e,pn(r));var s=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports);var mn=(e,r,n,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of yn(r))!re.call(e,i)&&i!==n&&C(e,i,{get:()=>r[i],enumerable:!(t=fn(r,i))||t.enumerable});return e};var dn=(e,r,n)=>(n=e!=null?cn(hn(e)):{},mn(r||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var gn=(e,r,n)=>new Promise((t,i)=>{var o=l=>{try{c(n.next(l))}catch(a){i(a)}},u=l=>{try{c(n.throw(l))}catch(a){i(a)}},c=l=>l.done?t(l.value):Promise.resolve(l.value).then(o,u);c((n=n.apply(e,r)).next())}),ie=function(e,r){this[0]=e,this[1]=r},js=(e,r,n)=>{var t=(u,c,l,a)=>{try{var p=n[u](c),v=(c=p.value)instanceof ie,j=p.done;Promise.resolve(v?c[0]:c).then(y=>v?t(u==="return"?u:"next",c[1]?{done:y.done,value:y.value}:y,l,a):l({value:y,done:j})).catch(y=>t("throw",y,l,a))}catch(y){a(y)}},i=u=>o[u]=c=>new Promise((l,a)=>t(u,c,l,a)),o={};return n=n.apply(e,r),o[Symbol.asyncIterator]=()=>o,i("next"),i("throw"),i("return"),o},As=e=>{var r=e[R("asyncIterator")],n=!1,t,i={};return r==null?(r=e[R("iterator")](),t=o=>i[o]=u=>r[o](u)):(r=r.call(e),t=o=>i[o]=u=>{if(n){if(n=!1,o==="throw")throw u;return u}return n=!0,{done:!1,value:new ie(new Promise(c=>{var l=r[o](u);if(!(l instanceof Object))throw TypeError("Object expected");c(l)}),1)}}),i[R("iterator")]=()=>i,t("next"),"throw"in r?t("throw"):i.throw=o=>{throw o},"return"in r&&t("return"),i};var A=s((Os,se)=>{"use strict";var bn=Array.isArray;se.exports=bn});var le=s((Is,ue)=>{"use strict";var kn=typeof global=="object"&&global&&global.Object===Object&&global;ue.exports=kn});var D=s((Ss,oe)=>{"use strict";var xn=le(),_n=typeof self=="object"&&self&&self.Object===Object&&self,En=xn||_n||Function("return this")();oe.exports=En});var O=s((Ps,ce)=>{"use strict";var wn=D(),$n=wn.Symbol;ce.exports=$n});var ye=s((Rs,pe)=>{"use strict";var ae=O(),fe=Object.prototype,qn=fe.hasOwnProperty,jn=fe.toString,x=ae?ae.toStringTag:void 0;function An(e){var r=qn.call(e,x),n=e[x];try{e[x]=void 0;var t=!0}catch(o){}var i=jn.call(e);return t&&(r?e[x]=n:delete e[x]),i}pe.exports=An});var ve=s((Cs,he)=>{"use strict";var Dn=Object.prototype,On=Dn.toString;function In(e){return On.call(e)}he.exports=In});var T=s((Ts,ge)=>{"use strict";var me=O(),Sn=ye(),Pn=ve(),Rn="[object Null]",Cn="[object Undefined]",de=me?me.toStringTag:void 0;function Tn(e){return e==null?e===void 0?Cn:Rn:de&&de in Object(e)?Sn(e):Pn(e)}ge.exports=Tn});var ke=s((Ms,be)=>{"use strict";function Mn(e){return e!=null&&typeof e=="object"}be.exports=Mn});var I=s((zs,xe)=>{"use strict";var zn=T(),Nn=ke(),Gn="[object Symbol]";function Fn(e){return typeof e=="symbol"||Nn(e)&&zn(e)==Gn}xe.exports=Fn});var Ee=s((Ns,_e)=>{"use strict";var Xn=A(),Vn=I(),Jn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ln=/^\w*$/;function Un(e,r){if(Xn(e))return!1;var n=typeof e;return n=="number"||n=="symbol"||n=="boolean"||e==null||Vn(e)?!0:Ln.test(e)||!Jn.test(e)||r!=null&&e in Object(r)}_e.exports=Un});var M=s((Gs,we)=>{"use strict";function Hn(e){var r=typeof e;return e!=null&&(r=="object"||r=="function")}we.exports=Hn});var qe=s((Fs,$e)=>{"use strict";var Kn=T(),Wn=M(),Bn="[object AsyncFunction]",Zn="[object Function]",Yn="[object GeneratorFunction]",Qn="[object Proxy]";function et(e){if(!Wn(e))return!1;var r=Kn(e);return r==Zn||r==Yn||r==Bn||r==Qn}$e.exports=et});var Ae=s((Xs,je)=>{"use strict";var rt=D(),nt=rt["__core-js_shared__"];je.exports=nt});var Ie=s((Vs,Oe)=>{"use strict";var z=Ae(),De=function(){var e=/[^.]+$/.exec(z&&z.keys&&z.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function tt(e){return!!De&&De in e}Oe.exports=tt});var Pe=s((Js,Se)=>{"use strict";var it=Function.prototype,st=it.toString;function ut(e){if(e!=null){try{return st.call(e)}catch(r){}try{return e+""}catch(r){}}return""}Se.exports=ut});var Ce=s((Ls,Re)=>{"use strict";var lt=qe(),ot=Ie(),ct=M(),at=Pe(),ft=/[\\^$.*+?()[\]{}|]/g,pt=/^\[object .+?Constructor\]$/,yt=Function.prototype,ht=Object.prototype,vt=yt.toString,mt=ht.hasOwnProperty,dt=RegExp("^"+vt.call(mt).replace(ft,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function gt(e){if(!ct(e)||ot(e))return!1;var r=lt(e)?dt:pt;return r.test(at(e))}Re.exports=gt});var Me=s((Us,Te)=>{"use strict";function bt(e,r){return e==null?void 0:e[r]}Te.exports=bt});var N=s((Hs,ze)=>{"use strict";var kt=Ce(),xt=Me();function _t(e,r){var n=xt(e,r);return kt(n)?n:void 0}ze.exports=_t});var _=s((Ks,Ne)=>{"use strict";var Et=N(),wt=Et(Object,"create");Ne.exports=wt});var Xe=s((Ws,Fe)=>{"use strict";var Ge=_();function $t(){this.__data__=Ge?Ge(null):{},this.size=0}Fe.exports=$t});var Je=s((Bs,Ve)=>{"use strict";function qt(e){var r=this.has(e)&&delete this.__data__[e];return this.size-=r?1:0,r}Ve.exports=qt});var Ue=s((Zs,Le)=>{"use strict";var jt=_(),At="__lodash_hash_undefined__",Dt=Object.prototype,Ot=Dt.hasOwnProperty;function It(e){var r=this.__data__;if(jt){var n=r[e];return n===At?void 0:n}return Ot.call(r,e)?r[e]:void 0}Le.exports=It});var Ke=s((Ys,He)=>{"use strict";var St=_(),Pt=Object.prototype,Rt=Pt.hasOwnProperty;function Ct(e){var r=this.__data__;return St?r[e]!==void 0:Rt.call(r,e)}He.exports=Ct});var Be=s((Qs,We)=>{"use strict";var Tt=_(),Mt="__lodash_hash_undefined__";function zt(e,r){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=Tt&&r===void 0?Mt:r,this}We.exports=zt});var Ye=s((eu,Ze)=>{"use strict";var Nt=Xe(),Gt=Je(),Ft=Ue(),Xt=Ke(),Vt=Be();function g(e){var r=-1,n=e==null?0:e.length;for(this.clear();++r<n;){var t=e[r];this.set(t[0],t[1])}}g.prototype.clear=Nt;g.prototype.delete=Gt;g.prototype.get=Ft;g.prototype.has=Xt;g.prototype.set=Vt;Ze.exports=g});var er=s((ru,Qe)=>{"use strict";function Jt(){this.__data__=[],this.size=0}Qe.exports=Jt});var nr=s((nu,rr)=>{"use strict";function Lt(e,r){return e===r||e!==e&&r!==r}rr.exports=Lt});var E=s((tu,tr)=>{"use strict";var Ut=nr();function Ht(e,r){for(var n=e.length;n--;)if(Ut(e[n][0],r))return n;return-1}tr.exports=Ht});var sr=s((iu,ir)=>{"use strict";var Kt=E(),Wt=Array.prototype,Bt=Wt.splice;function Zt(e){var r=this.__data__,n=Kt(r,e);if(n<0)return!1;var t=r.length-1;return n==t?r.pop():Bt.call(r,n,1),--this.size,!0}ir.exports=Zt});var lr=s((su,ur)=>{"use strict";var Yt=E();function Qt(e){var r=this.__data__,n=Yt(r,e);return n<0?void 0:r[n][1]}ur.exports=Qt});var cr=s((uu,or)=>{"use strict";var ei=E();function ri(e){return ei(this.__data__,e)>-1}or.exports=ri});var fr=s((lu,ar)=>{"use strict";var ni=E();function ti(e,r){var n=this.__data__,t=ni(n,e);return t<0?(++this.size,n.push([e,r])):n[t][1]=r,this}ar.exports=ti});var yr=s((ou,pr)=>{"use strict";var ii=er(),si=sr(),ui=lr(),li=cr(),oi=fr();function b(e){var r=-1,n=e==null?0:e.length;for(this.clear();++r<n;){var t=e[r];this.set(t[0],t[1])}}b.prototype.clear=ii;b.prototype.delete=si;b.prototype.get=ui;b.prototype.has=li;b.prototype.set=oi;pr.exports=b});var vr=s((cu,hr)=>{"use strict";var ci=N(),ai=D(),fi=ci(ai,"Map");hr.exports=fi});var gr=s((au,dr)=>{"use strict";var mr=Ye(),pi=yr(),yi=vr();function hi(){this.size=0,this.__data__={hash:new mr,map:new(yi||pi),string:new mr}}dr.exports=hi});var kr=s((fu,br)=>{"use strict";function vi(e){var r=typeof e;return r=="string"||r=="number"||r=="symbol"||r=="boolean"?e!=="__proto__":e===null}br.exports=vi});var w=s((pu,xr)=>{"use strict";var mi=kr();function di(e,r){var n=e.__data__;return mi(r)?n[typeof r=="string"?"string":"hash"]:n.map}xr.exports=di});var Er=s((yu,_r)=>{"use strict";var gi=w();function bi(e){var r=gi(this,e).delete(e);return this.size-=r?1:0,r}_r.exports=bi});var $r=s((hu,wr)=>{"use strict";var ki=w();function xi(e){return ki(this,e).get(e)}wr.exports=xi});var jr=s((vu,qr)=>{"use strict";var _i=w();function Ei(e){return _i(this,e).has(e)}qr.exports=Ei});var Dr=s((mu,Ar)=>{"use strict";var wi=w();function $i(e,r){var n=wi(this,e),t=n.size;return n.set(e,r),this.size+=n.size==t?0:1,this}Ar.exports=$i});var Ir=s((du,Or)=>{"use strict";var qi=gr(),ji=Er(),Ai=$r(),Di=jr(),Oi=Dr();function k(e){var r=-1,n=e==null?0:e.length;for(this.clear();++r<n;){var t=e[r];this.set(t[0],t[1])}}k.prototype.clear=qi;k.prototype.delete=ji;k.prototype.get=Ai;k.prototype.has=Di;k.prototype.set=Oi;Or.exports=k});var Rr=s((gu,Pr)=>{"use strict";var Sr=Ir(),Ii="Expected a function";function G(e,r){if(typeof e!="function"||r!=null&&typeof r!="function")throw new TypeError(Ii);var n=function(){var t=arguments,i=r?r.apply(this,t):t[0],o=n.cache;if(o.has(i))return o.get(i);var u=e.apply(this,t);return n.cache=o.set(i,u)||o,u};return n.cache=new(G.Cache||Sr),n}G.Cache=Sr;Pr.exports=G});var Tr=s((bu,Cr)=>{"use strict";var Si=Rr(),Pi=500;function Ri(e){var r=Si(e,function(t){return n.size===Pi&&n.clear(),t}),n=r.cache;return r}Cr.exports=Ri});var zr=s((ku,Mr)=>{"use strict";var Ci=Tr(),Ti=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Mi=/\\(\\)?/g,zi=Ci(function(e){var r=[];return e.charCodeAt(0)===46&&r.push(""),e.replace(Ti,function(n,t,i,o){r.push(i?o.replace(Mi,"$1"):t||n)}),r});Mr.exports=zi});var Gr=s((xu,Nr)=>{"use strict";function Ni(e,r){for(var n=-1,t=e==null?0:e.length,i=Array(t);++n<t;)i[n]=r(e[n],n,e);return i}Nr.exports=Ni});var Ur=s((_u,Lr)=>{"use strict";var Fr=O(),Gi=Gr(),Fi=A(),Xi=I(),Vi=1/0,Xr=Fr?Fr.prototype:void 0,Vr=Xr?Xr.toString:void 0;function Jr(e){if(typeof e=="string")return e;if(Fi(e))return Gi(e,Jr)+"";if(Xi(e))return Vr?Vr.call(e):"";var r=e+"";return r=="0"&&1/e==-Vi?"-0":r}Lr.exports=Jr});var Kr=s((Eu,Hr)=>{"use strict";var Ji=Ur();function Li(e){return e==null?"":Ji(e)}Hr.exports=Li});var Br=s((wu,Wr)=>{"use strict";var Ui=A(),Hi=Ee(),Ki=zr(),Wi=Kr();function Bi(e,r){return Ui(e)?e:Hi(e,r)?[e]:Ki(Wi(e))}Wr.exports=Bi});var Yr=s(($u,Zr)=>{"use strict";var Zi=I(),Yi=1/0;function Qi(e){if(typeof e=="string"||Zi(e))return e;var r=e+"";return r=="0"&&1/e==-Yi?"-0":r}Zr.exports=Qi});var en=s((qu,Qr)=>{"use strict";var es=Br(),rs=Yr();function ns(e,r){r=es(r,e);for(var n=0,t=r.length;e!=null&&n<t;)e=e[rs(r[n++])];return n&&n==t?e:void 0}Qr.exports=ns});var nn=s((ju,rn)=>{"use strict";var ts=en();function is(e,r,n){var t=e==null?void 0:ts(e,r);return t===void 0?n:t}rn.exports=is});var on=dn(nn());var tn=(e,r=21)=>(n=r)=>{let t="",i=n|0;for(;i--;)t+=e[Math.random()*e.length|0];return t};var m;function sn(e){var r,n,t;return{lang:(r=e==null?void 0:e.lang)!=null?r:m==null?void 0:m.lang,message:e==null?void 0:e.message,abortEarly:(n=e==null?void 0:e.abortEarly)!=null?n:m==null?void 0:m.abortEarly,abortPipeEarly:(t=e==null?void 0:e.abortPipeEarly)!=null?t:m==null?void 0:m.abortPipeEarly}}var F;function ss(e){return F==null?void 0:F.get(e)}var X;function us(e){return X==null?void 0:X.get(e)}var V;function ls(e,r){var n;return(n=V==null?void 0:V.get(e))==null?void 0:n.get(r)}function d(e){var n,t,i;let r=typeof e;return r==="string"?`"${e}"`:r==="number"||r==="bigint"||r==="boolean"?`${e}`:r==="object"||r==="function"?(i=e&&((t=(n=Object.getPrototypeOf(e))==null?void 0:n.constructor)==null?void 0:t.name))!=null?i:"null":r}function f(e,r,n,t,i){var v,j,y,K,W,B,Z,Y;let o=i&&"input"in i?i.input:n.value,u=(j=(v=i==null?void 0:i.expected)!=null?v:e.expects)!=null?j:null,c=(y=i==null?void 0:i.received)!=null?y:d(o),l={kind:e.kind,type:e.type,input:o,expected:u,received:c,message:`Invalid ${r}: ${u?`Expected ${u} but r`:"R"}eceived ${c}`,requirement:e.requirement,path:i==null?void 0:i.path,issues:i==null?void 0:i.issues,lang:t.lang,abortEarly:t.abortEarly,abortPipeEarly:t.abortPipeEarly},a=e.kind==="schema",p=(Y=(Z=(B=(W=(K=i==null?void 0:i.message)!=null?K:e.message)!=null?W:ls(e.reference,l.lang))!=null?B:a?us(l.lang):null)!=null?Z:t.message)!=null?Y:ss(l.lang);p!==void 0&&(l.message=typeof p=="function"?p(l):p),a&&(n.typed=!1),n.issues?n.issues.push(l):n.issues=[l]}function h(e){return{version:1,vendor:"valibot",validate(r){return e["~run"]({value:r},sn())}}}function os(e,r){var t;let n=[...new Set(e)];return n.length>1?`(${n.join(` ${r} `)})`:(t=n[0])!=null?t:"never"}var cs=/^[\w+-]+(?:\.[\w+-]+)*@[\da-z]+(?:[.-][\da-z]+)*\.[a-z]{2,}$/iu,Du=new RegExp("^(?:[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}))*)+$","u");function as(e,r){return{kind:"validation",type:"check",reference:as,async:!1,expects:null,requirement:e,message:r,"~run"(n,t){return n.typed&&!this.requirement(n.value)&&f(this,"input",n,t),n}}}function fs(e){return{kind:"validation",type:"email",reference:fs,expects:null,async:!1,requirement:cs,message:e,"~run"(r,n){return r.typed&&!this.requirement.test(r.value)&&f(this,"email",r,n),r}}}function ps(e,r){return{kind:"validation",type:"max_length",reference:ps,async:!1,expects:`<=${e}`,requirement:e,message:r,"~run"(n,t){return n.typed&&n.value.length>this.requirement&&f(this,"length",n,t,{received:`${n.value.length}`}),n}}}function ys(e,r){return{kind:"validation",type:"max_value",reference:ys,async:!1,expects:`<=${e instanceof Date?e.toJSON():d(e)}`,requirement:e,message:r,"~run"(n,t){return n.typed&&!(n.value<=this.requirement)&&f(this,"value",n,t,{received:n.value instanceof Date?n.value.toJSON():d(n.value)}),n}}}function hs(e,r){return{kind:"validation",type:"min_length",reference:hs,async:!1,expects:`>=${e}`,requirement:e,message:r,"~run"(n,t){return n.typed&&n.value.length<this.requirement&&f(this,"length",n,t,{received:`${n.value.length}`}),n}}}function vs(e,r){return{kind:"validation",type:"min_value",reference:vs,async:!1,expects:`>=${e instanceof Date?e.toJSON():d(e)}`,requirement:e,message:r,"~run"(n,t){return n.typed&&!(n.value>=this.requirement)&&f(this,"value",n,t,{received:n.value instanceof Date?n.value.toJSON():d(n.value)}),n}}}function ms(e,r){return{kind:"validation",type:"regex",reference:ms,async:!1,expects:`${e}`,requirement:e,message:r,"~run"(n,t){return n.typed&&!this.requirement.test(n.value)&&f(this,"format",n,t),n}}}function ds(e){return{kind:"transformation",type:"transform",reference:ds,async:!1,operation:e,"~run"(r){return r.value=this.operation(r.value),r}}}function gs(e){return{kind:"validation",type:"url",reference:gs,async:!1,expects:null,requirement(r){try{return new URL(r),!0}catch(n){return!1}},message:e,"~run"(r,n){return r.typed&&!this.requirement(r.value)&&f(this,"URL",r,n),r}}}function bs(e,r,n){return typeof e.fallback=="function"?e.fallback(r,n):e.fallback}function J(e,r,n){return typeof e.default=="function"?e.default(r,n):e.default}function ks(e,r){return{kind:"schema",type:"array",reference:ks,expects:"Array",async:!1,item:e,message:r,get"~standard"(){return h(this)},"~run"(n,t){var o;let i=n.value;if(Array.isArray(i)){n.typed=!0,n.value=[];for(let u=0;u<i.length;u++){let c=i[u],l=this.item["~run"]({value:c},t);if(l.issues){let a={type:"array",origin:"value",input:i,key:u,value:c};for(let p of l.issues)p.path?p.path.unshift(a):p.path=[a],(o=n.issues)==null||o.push(p);if(n.issues||(n.issues=l.issues),t.abortEarly){n.typed=!1;break}}l.typed||(n.typed=!1),n.value.push(l.value)}}else f(this,"type",n,t);return n}}}function xs(e){return{kind:"schema",type:"boolean",reference:xs,expects:"boolean",async:!1,message:e,get"~standard"(){return h(this)},"~run"(r,n){return typeof r.value=="boolean"?r.typed=!0:f(this,"type",r,n),r}}}function L(e,r){return{kind:"schema",type:"literal",reference:L,expects:d(e),async:!1,literal:e,message:r,get"~standard"(){return h(this)},"~run"(n,t){return n.value===this.literal?n.typed=!0:f(this,"type",n,t),n}}}function S(e,r){return{kind:"schema",type:"nullable",reference:S,expects:`(${e.expects} | null)`,async:!1,wrapped:e,default:r,get"~standard"(){return h(this)},"~run"(n,t){return n.value===null&&(this.default!==void 0&&(n.value=J(this,n,t)),n.value===null)?(n.typed=!0,n):this.wrapped["~run"](n,t)}}}function _s(e){return{kind:"schema",type:"number",reference:_s,expects:"number",async:!1,message:e,get"~standard"(){return h(this)},"~run"(r,n){return typeof r.value=="number"&&!isNaN(r.value)?r.typed=!0:f(this,"type",r,n),r}}}function $(e,r){return{kind:"schema",type:"object",reference:$,expects:"Object",async:!1,entries:e,message:r,get"~standard"(){return h(this)},"~run"(n,t){var o;let i=n.value;if(i&&typeof i=="object"){n.typed=!0,n.value={};for(let u in this.entries){let c=this.entries[u];if(u in i||(c.type==="exact_optional"||c.type==="optional"||c.type==="nullish")&&c.default!==void 0){let l=u in i?i[u]:J(c),a=c["~run"]({value:l},t);if(a.issues){let p={type:"object",origin:"value",input:i,key:u,value:l};for(let v of a.issues)v.path?v.path.unshift(p):v.path=[p],(o=n.issues)==null||o.push(v);if(n.issues||(n.issues=a.issues),t.abortEarly){n.typed=!1;break}}a.typed||(n.typed=!1),n.value[u]=a.value}else if(c.fallback!==void 0)n.value[u]=bs(c);else if(c.type!=="exact_optional"&&c.type!=="optional"&&c.type!=="nullish"&&(f(this,"key",n,t,{input:void 0,expected:`"${u}"`,path:[{type:"object",origin:"key",input:i,key:u,value:i[u]}]}),t.abortEarly))break}}else f(this,"type",n,t);return n}}}function P(e,r){return{kind:"schema",type:"optional",reference:P,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:r,get"~standard"(){return h(this)},"~run"(n,t){return n.value===void 0&&(this.default!==void 0&&(n.value=J(this,n,t)),n.value===void 0)?(n.typed=!0,n):this.wrapped["~run"](n,t)}}}function Es(e,r){return{kind:"schema",type:"picklist",reference:Es,expects:os(e.map(d),"|"),async:!1,options:e,message:r,get"~standard"(){return h(this)},"~run"(n,t){return this.options.includes(n.value)?n.typed=!0:f(this,"type",n,t),n}}}function q(e){return{kind:"schema",type:"string",reference:q,expects:"string",async:!1,message:e,get"~standard"(){return h(this)},"~run"(r,n){return typeof r.value=="string"?r.typed=!0:f(this,"type",r,n),r}}}function ws(){return{kind:"schema",type:"unknown",reference:ws,expects:"unknown",async:!1,get"~standard"(){return h(this)},"~run"(e){return e.typed=!0,e}}}function Ou(...e){return te(ne({},e[0]),{pipe:e,get"~standard"(){return h(this)},"~run"(r,n){for(let t of e)if(t.kind!=="metadata"){if(r.issues&&(t.kind==="schema"||t.kind==="transformation")){r.typed=!1;break}(!r.issues||!n.abortEarly&&!n.abortPipeEarly)&&(r=t["~run"](r,n))}return r}})}function un(e,r,n){let t=e["~run"]({value:r},sn(n));return{typed:t.typed,success:!t.issues,output:t.value,issues:t.issues}}var ln=e=>({ok:!0,err:!1,val:e}),H=e=>({err:!0,ok:!1,val:e}),U=class extends Error{constructor(n){super("Unhandled error");this.originalError=n,this.name="UnhandledError"}},Su=e=>(...r)=>{try{return e(...r)}catch(n){return H(new U(n))}};var Tu=tn("1234567890qwertyuiopasdfghjklzxcvbnm",8),Mu=e=>{let r={};for(let n in e){let t=e[n];t&&(r[n]=t.value)}return r},zu=({key:e,submissions:r})=>{var t;let n=(t=r[e])==null?void 0:t.value;if(typeof n!="string"&&typeof n!="number")throw new Error(`Submission at \u201C${e}\u201D is not a string or number`);return n},Nu=({key:e,path:r,submissions:n,context:t})=>{if(e==="$context"){if(!r)return;let i=(0,on.default)(t,r.join("."));switch(typeof i){case"string":return{type:"string",value:i};case"number":return{type:"number",value:i};case"boolean":return{type:"boolean",value:i};default:console.warn(`Unexpected type for $context.${r.join(".")}`,i);return}}return n[e]},Gu=e=>{let r=e.split(".").pop();return r?ln(r?"."+r:""):H("No file extension found")},Fu=e=>e<=1e3?`${Math.round(e)}KB`:e<1e3*10?`${(e/1e3).toFixed(1)}MB`:`${Math.round(e/1e3)}MB`,Xu=e=>typeof e=="string"?e:`+${e.countryCode} ${e.phoneNumber}`,qs=$({success:L(!0),integration_response:$({data:$({redirect_url:q(),message:P(S(q())),button_text:P(S(q()))})})}),Vu=e=>un(qs,e).success;export{ne as a,te as b,dn as c,gn as d,js as e,As as f,nn as g,as as h,fs as i,ps as j,ys as k,hs as l,vs as m,ms as n,ds as o,gs as p,ks as q,xs as r,S as s,_s as t,$ as u,P as v,Es as w,q as x,ws as y,Ou as z,un as A,ln as B,H as C,Su as D,Tu as E,Mu as F,zu as G,Nu as H,Gu as I,Fu as J,Xu as K,Vu as L};
2
- //# sourceMappingURL=chunk-VKMPK5WA.mjs.map