@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.
- package/dist/chunk-3HF7KDUR.mjs +2 -0
- package/dist/{chunk-VKMPK5WA.mjs.map → chunk-3HF7KDUR.mjs.map} +1 -1
- package/dist/chunk-DKKJHDKM.mjs +2 -0
- package/dist/chunk-DKKJHDKM.mjs.map +1 -0
- package/dist/i18n.d.mts +392 -0
- package/dist/i18n.mjs +2 -0
- package/dist/i18n.mjs.map +1 -0
- package/dist/interpreter.d.mts +3 -113
- package/dist/interpreter.mjs +1 -1
- package/dist/interpreter.mjs.map +1 -1
- package/dist/linked-list.d.mts +6 -6
- package/dist/linked-list.mjs +1 -1
- package/dist/linked-list.mjs.map +1 -1
- package/dist/utils.d.mts +3 -12
- package/dist/utils.mjs +1 -1
- package/package.json +10 -5
- package/dist/chunk-VKMPK5WA.mjs +0 -2
package/dist/interpreter.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/conditions.ts","../src/interpolation.ts","../src/interpreter.identify.ts","../src/interpreter.integration-application-submit.ts","../src/interpreter.question-address.ts","../src/interpreter.question-boolean.ts","../src/interpreter.question-enum.ts","../src/interpreter.question-file.ts","../src/interpreter.question-number.ts","../src/interpreter.question-phone.ts","../src/interpreter.question-text.ts","../src/interpreter.ts"],"sourcesContent":["import { IfBlockNode, IfBlockNodeCondition } from '@inploi/core/flows';\nimport get from 'lodash/get';\n\nimport { FlowSubmissions } from './flow.types';\nimport { getSubmissionValueToCheck } from './utils';\n\nconst isConditionMet = ({\n\tcondition,\n\tcontext,\n\tsubmissions,\n\tifBlock,\n}: {\n\tcontext: Record<string, unknown>;\n\tcondition: IfBlockNodeCondition;\n\tsubmissions: FlowSubmissions;\n\tifBlock: IfBlockNode;\n}) => {\n\tconst [firstSegment, ...path] = condition.compareKey.split('.');\n\tif (!firstSegment) return false;\n\n\tconst answer = getSubmissionValueToCheck({ context, key: firstSegment, path, submissions });\n\tif (!answer) return false;\n\n\tswitch (answer.type) {\n\t\tcase 'address': {\n\t\t\tconst value = get(answer.value, path.join('.'));\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn value === condition.compareValue;\n\t\t\t\tcase 'contains':\n\t\t\t\t\tif (!value) return false;\n\t\t\t\t\treturn value.includes(condition.compareValue);\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn value !== condition.compareValue;\n\t\t\t\tcase 'notContains':\n\t\t\t\t\tif (!value) return true;\n\t\t\t\t\treturn !value.includes(condition.compareValue);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'integration': {\n\t\t\t/** We only handle objects as integration submissions for now. */\n\t\t\tif (typeof answer.value !== 'object') return false;\n\t\t\tif (Array.isArray(answer.value)) return false;\n\n\t\t\tconst value = get(answer.value, path.join('.'));\n\t\t\tconst newIfBlock = { ...ifBlock, data: { ...ifBlock.data, compareKey: '_temp' } };\n\t\t\tswitch (typeof value) {\n\t\t\t\tcase 'boolean':\n\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'boolean' } },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t});\n\t\t\t\tcase 'string':\n\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'string' } },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t});\n\t\t\t\tcase 'number':\n\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'number' } },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t});\n\t\t\t\tcase 'object':\n\t\t\t\t\t/** We only handle enums if the result is an array of strings */\n\t\t\t\t\tif (Array.isArray(value) && value.every((value): value is string => typeof value === 'string')) {\n\t\t\t\t\t\treturn isIfBlockConditionMet(newIfBlock, {\n\t\t\t\t\t\t\tsubmissions: { ['_temp']: { value: value, type: 'enum' } },\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'boolean': {\n\t\t\tconst compareBoolean = condition.compareValue === 'true';\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn answer.value === compareBoolean;\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn answer.value !== compareBoolean;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'phone':\n\t\tcase 'string': {\n\t\t\tconst value = answer.type === 'phone' ? answer.value.countryCode + answer.value.phoneNumber : answer.value;\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn value === condition.compareValue;\n\t\t\t\tcase 'contains':\n\t\t\t\t\tif (!value) return false;\n\t\t\t\t\treturn value.includes(condition.compareValue);\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn value !== condition.compareValue;\n\t\t\t\tcase 'notContains':\n\t\t\t\t\tif (!value) return true;\n\t\t\t\t\treturn !value.includes(condition.compareValue);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'number': {\n\t\t\ttry {\n\t\t\t\tconst compareNumber = Number(condition.compareValue);\n\t\t\t\tswitch (condition.compare) {\n\t\t\t\t\tcase 'equals':\n\t\t\t\t\t\treturn answer.value === compareNumber;\n\t\t\t\t\tcase 'notEquals':\n\t\t\t\t\t\treturn answer.value !== compareNumber;\n\t\t\t\t\tcase 'greaterThan':\n\t\t\t\t\t\treturn answer.value > compareNumber;\n\t\t\t\t\tcase 'greaterThanOrEqualTo':\n\t\t\t\t\t\treturn answer.value >= compareNumber;\n\t\t\t\t\tcase 'lessThan':\n\t\t\t\t\t\treturn answer.value < compareNumber;\n\t\t\t\t\tcase 'lessThanOrEqualTo':\n\t\t\t\t\t\treturn answer.value <= compareNumber;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.error(`Failed to parse number in if-block ${ifBlock.id}`, answer.value);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'enum':\n\t\t\tswitch (condition.compare) {\n\t\t\t\tcase 'equals':\n\t\t\t\t\treturn answer.value.length === 1 && answer.value[0] === condition.compareValue;\n\t\t\t\tcase 'notEquals':\n\t\t\t\t\treturn answer.value.length === 1 && answer.value[0] !== condition.compareValue;\n\t\t\t\tcase 'contains':\n\t\t\t\t\treturn answer.value.includes(condition.compareValue);\n\t\t\t\tcase 'notContains':\n\t\t\t\t\treturn !answer.value.includes(condition.compareValue);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'file':\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tanswer satisfies never;\n\t\t\tbreak;\n\t}\n};\n\nexport const isIfBlockConditionMet = (\n\tifBlock: IfBlockNode,\n\t{ context, submissions }: { submissions: FlowSubmissions; context: Record<string, unknown> },\n): boolean => {\n\tconst conditions = 'combinator' in ifBlock.data ? ifBlock.data.conditions : [ifBlock.data];\n\tconst combinator = 'combinator' in ifBlock.data ? ifBlock.data.combinator : 'and';\n\n\tif (combinator === 'or') {\n\t\tfor (const condition of conditions) {\n\t\t\tconst isMet = isConditionMet({ condition, context, submissions, ifBlock });\n\t\t\tif (isMet) return true;\n\t\t}\n\t\treturn false;\n\t} else {\n\t\tfor (const condition of conditions) {\n\t\t\tconst isMet = isConditionMet({ condition, context, submissions, ifBlock });\n\t\t\tif (!isMet) return false;\n\t\t}\n\t\treturn true;\n\t}\n};\n","import get from 'lodash/get';\n\nimport { FlowSubmissions } from './flow.types';\nimport { formatPhoneNumber, getSubmissionValueToCheck, kbToReadableSize } from './utils';\n\nconst HANDLEBARS_REGEXP = /{{\\s*([^}]+?)\\s*(?:\\|\\s*([^}]+?)\\s*)?}}/g;\n\nexport const interpolateWithData = (\n\tstr: string,\n\t{ context, submissions }: { submissions: FlowSubmissions; context: Record<string, unknown> },\n) => {\n\treturn str.replace(HANDLEBARS_REGEXP, (_, key, defaultValue = '') => {\n\t\tconst [firstSegment, ...path] = key.trim().split('.');\n\t\tconst entity = getSubmissionValueToCheck({ key: firstSegment, path, submissions, context });\n\t\tif (!entity) return defaultValue;\n\n\t\tswitch (entity.type) {\n\t\t\tcase 'boolean':\n\t\t\t\treturn entity.value === true ? 'true' : 'false';\n\t\t\tcase 'file':\n\t\t\t\treturn entity.value.map(file => `${file.name} (${kbToReadableSize(file.sizeKb)})`).join(', ');\n\t\t\tcase 'enum':\n\t\t\t\treturn entity.value.join(', ');\n\t\t\tcase 'address':\n\t\t\t\treturn Object.values(entity.value)\n\t\t\t\t\t.filter(line => line && line.trim().length > 0)\n\t\t\t\t\t.join(', ');\n\t\t\tcase 'number':\n\t\t\tcase 'string':\n\t\t\t\tif (!entity.value) return defaultValue;\n\t\t\t\treturn entity.value.toString();\n\t\t\tcase 'phone':\n\t\t\t\treturn formatPhoneNumber(entity.value);\n\t\t\tcase 'integration': {\n\t\t\t\t/** We only handle objects as integration submissions for now. */\n\t\t\t\tif (typeof entity.value !== 'object') break;\n\t\t\t\tif (Array.isArray(entity.value)) break;\n\n\t\t\t\tconst value = get(entity.value, path.join('.'));\n\t\t\t\tswitch (typeof value) {\n\t\t\t\t\tcase 'boolean':\n\t\t\t\t\t\treturn value === true ? 'true' : 'false';\n\t\t\t\t\tcase 'string':\n\t\t\t\t\t\treturn value;\n\t\t\t\t\tcase 'number':\n\t\t\t\t\t\treturn value.toString();\n\t\t\t\t\tcase 'object':\n\t\t\t\t\t\t/** We only handle enums if the result is an array of strings */\n\t\t\t\t\t\tif (Array.isArray(value) && value.every((i): i is string => typeof i === 'string')) {\n\t\t\t\t\t\t\treturn value.join(', ');\n\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tentity satisfies never;\n\t\t}\n\t\treturn defaultValue;\n\t});\n};\n","import { InterpretNodeParams } from './interpreter';\nimport { getSubmissionValue } from './utils';\n\nexport async function* interpretIdentifyNode(params: InterpretNodeParams<'identify'>) {\n\tconst {\n\t\tnode,\n\t\tconfig: { logger, analytics, submissions, next },\n\t} = params;\n\n\tanalytics.service\n\t\t.log({\n\t\t\tevent: 'IDENTIFY',\n\t\t\tproperties: {\n\t\t\t\tidentifier: getSubmissionValue({ key: node.data.key, submissions }).toString(),\n\t\t\t\tfirst_name:\n\t\t\t\t\tnode.data.firstName ? getSubmissionValue({ key: node.data.firstName, submissions }).toString() : undefined,\n\t\t\t\tlast_name:\n\t\t\t\t\tnode.data.lastName ? getSubmissionValue({ key: node.data.lastName, submissions }).toString() : undefined,\n\t\t\t\temail: node.data.email ? getSubmissionValue({ key: node.data.email, submissions }).toString() : undefined,\n\t\t\t\tphone_number:\n\t\t\t\t\tnode.data.phoneNumber ?\n\t\t\t\t\t\tgetSubmissionValue({ key: node.data.phoneNumber, submissions }).toString()\n\t\t\t\t\t:\tundefined,\n\t\t\t\tcustom_traits:\n\t\t\t\t\tnode.data.customTraits ?\n\t\t\t\t\t\tObject.fromEntries(node.data.customTraits.map(({ key, value }) => [key, submissions[value]?.value]))\n\t\t\t\t\t:\tundefined,\n\t\t\t},\n\t\t})\n\t\t.catch(logger.error);\n\n\treturn next(node.nextId);\n}\n","import { endpoint, typed } from '@inploi/sdk';\nimport * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok, tryCatch } from './result';\nimport { getFlowSubmissionsPayload } from './utils';\n\nconst responseSchema = v.object({\n\t/** Not necessarily true when we receive a positive response because the API considers only 200 as success */\n\tsuccess: v.boolean(),\n\tintegration_response: v.object({\n\t\tservice: v.optional(v.string()),\n\t\tstatus: v.number(),\n\t\tdata: v.unknown(),\n\t\terror: v.nullable(v.object({ message: v.string(), data: v.unknown() })),\n\t}),\n});\nexport type IntegrationResponse = v.InferOutput<typeof responseSchema>;\n\nconst submitEndpoint = endpoint({\n\tpathname: '/flow/submit',\n\tmethod: 'POST',\n\tschema: {\n\t\tresponse: responseSchema,\n\t\tbody: typed<{\n\t\t\tlog_submit: boolean;\n\t\t\tintegration_id: string;\n\t\t\tanonymous_id: string | null | undefined;\n\t\t\tsession_id: string | null | undefined;\n\t\t\tjob: unknown;\n\t\t\tsubmissions: Record<string, unknown>;\n\t\t}>(),\n\t},\n});\n\nexport async function* interpretIntegrationApplicationSubmitNode(\n\tparams: InterpretNodeParams<'integration-application-submit'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { rpcClient, submissions, actions, next, analytics, logger, context },\n\t} = params;\n\n\tif (node.data.skipConfirmation !== true) {\n\t\tyield actions.input('submit', {\n\t\t\tconfig: {\n\t\t\t\tkey: node.data.key ?? '_SUBMIT',\n\t\t\t\tlabel: node.data.submitLabel,\n\t\t\t},\n\t\t\t/** for submit node, validating _is_ submitting */\n\t\t\tvalidate: async () => {\n\t\t\t\tconst getSessionInfoSafe = tryCatch(analytics.service.getSessionInfo);\n\t\t\t\tconst sessionInfo = getSessionInfoSafe();\n\t\t\t\tif (sessionInfo.err) logger.error(sessionInfo.val.originalError);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await rpcClient.request(submitEndpoint, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tlog_submit: false,\n\t\t\t\t\t\t\tintegration_id: node.data.integrationId,\n\t\t\t\t\t\t\tanonymous_id: sessionInfo.ok ? sessionInfo.val.anonymous_id : undefined,\n\t\t\t\t\t\t\tsession_id: sessionInfo.ok ? sessionInfo.val.session_id : undefined,\n\t\t\t\t\t\t\tjob: context.job,\n\t\t\t\t\t\t\tsubmissions: getFlowSubmissionsPayload(submissions),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tconst parsed = v.safeParse(responseSchema, response);\n\t\t\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\t\t\treturn Ok(parsed.output);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconst issues: v.ValiError<any>['issues'] = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinput: e,\n\t\t\t\t\t\t\torigin: 'value',\n\t\t\t\t\t\t\treason: 'unknown',\n\t\t\t\t\t\t\tvalidation: 'API error',\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\te instanceof Error ? e.message\n\t\t\t\t\t\t\t\t: 'toString' in (e as any) ? (e as any).toString()\n\t\t\t\t\t\t\t\t: 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t\treturn Err(issues);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst fieldValueSchema = v.pipe(\n\tv.nullable(v.optional(v.string())),\n\tv.transform(i => (i === null ? undefined : i)),\n);\nconst getValidationSchema = ({ node }: InterpretNodeParams<'question-address'>) => {\n\tconst keys = node.data.keys;\n\treturn v.object({\n\t\t[keys.line1 ?? 'line1']: fieldValueSchema,\n\t\t[keys.line2 ?? 'line2']: fieldValueSchema,\n\t\t[keys.line3 ?? 'line3']: fieldValueSchema,\n\t\t[keys.city ?? 'city']: fieldValueSchema,\n\t\t[keys.country ?? 'country']: fieldValueSchema,\n\t\t[keys.postcode ?? 'postcode']: fieldValueSchema,\n\t\t[keys.state ?? 'state']: fieldValueSchema,\n\t});\n};\n\nexport async function* interpretQuestionAddressNode(\n\tparams: InterpretNodeParams<'question-address'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tyield actions.input('address', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tkeys: node.data.keys,\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'address', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst options = ['true', 'false'] as const;\nconst schema = v.picklist(options);\n\nexport async function* interpretQuestionBooleanNode(\n\tparams: InterpretNodeParams<'question-boolean'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tyield actions.input('boolean', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tlabels: {\n\t\t\t\tfalse: node.data.falseLabel,\n\t\t\t\ttrue: node.data.trueLabel,\n\t\t\t},\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'boolean', value: parsed.output === 'true' };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import { NonEmptyArray } from '@inploi/core/common';\nimport * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nexport async function* interpretQuestionEnumNode(params: InterpretNodeParams<'question-enum'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst schema = v.array(v.picklist(node.data.options.map(o => o.value) as NonEmptyArray<string>));\n\tyield actions.input('multiple-choice', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\toptions: node.data.options,\n\t\t\tmaxSelected: node.data.maxSelected,\n\t\t\tminSelected: node.data.minSelected,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.minSelected === 0 && submission === null) return Ok(submission);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'enum', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\nimport { getFileExtension, kbToReadableSize } from './utils';\n\nexport async function* interpretQuestionFileNode(params: InterpretNodeParams<'question-file'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next, t },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tyield actions.input('file', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tallowMultiple: node.data.multiple === true,\n\t\t\textensions: node.data.extensions,\n\t\t\tfileSizeLimitKib: node.data.maxSizeKb,\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst minFiles = node.data.optional ? 0 : 1;\n\t\t\tconst maxFiles = node.data.multiple ? Number.POSITIVE_INFINITY : 1;\n\t\t\tconst maxSize = node.data.maxSizeKb ?? 0;\n\t\t\tconst allowedExtensions = node.data.extensions.map(ext => ext.toLowerCase());\n\t\t\tconst schema = v.pipe(\n\t\t\t\tv.array(\n\t\t\t\t\tv.object({\n\t\t\t\t\t\tname: v.pipe(\n\t\t\t\t\t\t\tv.string(t('validation_empty')),\n\t\t\t\t\t\t\tv.check(\n\t\t\t\t\t\t\t\tfilename => {\n\t\t\t\t\t\t\t\t\tconst extension = getFileExtension(filename);\n\t\t\t\t\t\t\t\t\tif (extension.ok === false) return false;\n\t\t\t\t\t\t\t\t\treturn allowedExtensions.includes(extension.val.toLowerCase());\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tt('validation_file_ext', { ext: allowedExtensions.join(', ') }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tdata: v.string(),\n\t\t\t\t\t\tsizeKb: v.number(),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\tv.minLength(minFiles, t('validation_file_min', { count: minFiles })),\n\t\t\t\tv.maxLength(maxFiles, t('validation_file_max', { count: maxFiles })),\n\t\t\t\tv.check(\n\t\t\t\t\tfiles => {\n\t\t\t\t\t\tconst totalSize = files.reduce((acc, cur) => acc + cur.sizeKb, 0);\n\t\t\t\t\t\treturn totalSize <= maxSize;\n\t\t\t\t\t},\n\t\t\t\t\tt('validation_file_size', { size: kbToReadableSize(maxSize) }),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'file', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst getValidationSchema = ({ node, config: { t } }: InterpretNodeParams<'question-number'>) => {\n\tconst min = node.data.min ?? Number.MIN_SAFE_INTEGER;\n\tconst max = node.data.max ?? Number.MAX_SAFE_INTEGER;\n\tconst decimalCases = node.data.decimalCases ?? 0;\n\n\treturn v.pipe(\n\t\tv.number(t('validation_number')),\n\t\tv.minValue(min, t('validation_number_min', { min })),\n\t\tv.maxValue(max, t('validation_number_max', { max })),\n\t\tv.check(\n\t\t\tvalue => {\n\t\t\t\treturn value === Number(value.toFixed(decimalCases));\n\t\t\t},\n\t\t\tt('validation_number_decimal_cases', { count: decimalCases }),\n\t\t),\n\t);\n};\n\nexport async function* interpretQuestionNumberNode(\n\tparams: InterpretNodeParams<'question-number'>,\n): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst thisSubmission = submissions[node.data.key];\n\tyield actions.input('number', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\toptional: node.data.optional,\n\t\t\tdecimalCases: node.data.decimalCases,\n\t\t\tmax: node.data.max,\n\t\t\tmin: node.data.min,\n\t\t\tdefaultValue: thisSubmission?.type === 'number' ? thisSubmission.value.toString() : undefined,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'number', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst getValidationSchema = ({ node, config: { t } }: InterpretNodeParams<'question-phone'>) => {\n\treturn v.object({\n\t\tcountryCode: v.pipe(v.string(t('validation_country_code')), v.regex(/^\\+?[0-9 -]+$/, t('validation_country_code'))),\n\t\tphoneNumber: v.pipe(\n\t\t\tv.string(t('validation_phone')),\n\t\t\tv.regex(/^\\+?[0-9 -]+$/, t('validation_phone')),\n\t\t\tv.minLength(node.data.minChars, t('validation_min_chars', { count: node.data.minChars })),\n\t\t\tv.transform(value => value.replace(/[^0-9]/g, '')),\n\t\t),\n\t});\n};\n\nexport async function* interpretQuestionPhoneNode(params: InterpretNodeParams<'question-phone'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { actions, next, submissions },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst thisSubmission = submissions[node.data.key];\n\tyield actions.input('phone', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tminChars: node.data.minChars,\n\t\t\tdefaultValue:\n\t\t\t\tthisSubmission?.type === 'phone' ?\n\t\t\t\t\tthisSubmission.value\n\t\t\t\t:\t{\n\t\t\t\t\t\tcountryCode: node.data.defaultCountryCode,\n\t\t\t\t\t},\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\tsubmissionFormat: 'phone',\n\t\t\toptional: node.data.optional,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'address', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import * as v from 'valibot';\n\nimport { InterpretNodeParams, InterpretNodeReturn } from './interpreter';\nimport { Err, Ok } from './result';\n\nconst getValidationSchema = ({ node, config: { t, logger } }: InterpretNodeParams<'question-text'>) => {\n\tconst errors = {\n\t\temail: t('validation_email'),\n\t\turl: t('validation_url'),\n\t\tmaxLength: t('validation_max_chars', { count: node.data.maxChars ?? 999 }),\n\t\tminLength: t('validation_min_chars', { count: node.data.minChars ?? 1 }),\n\t};\n\n\tswitch (node.data.format) {\n\t\tcase 'email':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(errors.email),\n\t\t\t\tv.email(errors.email),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\n\t\tcase 'text':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\t\tcase 'url':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(),\n\t\t\t\tv.url(errors.url),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\t\tcase 'phone':\n\t\t\treturn v.pipe(\n\t\t\t\tv.string(),\n\t\t\t\tv.minLength(node.data.minChars ?? 1, errors.minLength),\n\t\t\t\tv.maxLength(node.data.maxChars ?? Infinity, errors.maxLength),\n\t\t\t);\n\t\tdefault:\n\t\t\tnode.data.format satisfies never;\n\t\t\tlogger.error(`Unsupported question-text format: ${node.data.format}`);\n\t\t\treturn null;\n\t}\n};\n\nexport async function* interpretQuestionTextNode(params: InterpretNodeParams<'question-text'>): InterpretNodeReturn {\n\tconst {\n\t\tnode,\n\t\tconfig: { submissions, actions, next },\n\t} = params;\n\tyield actions.text({ author: 'bot', message: node.data.question });\n\n\tconst thisSubmission = submissions[node.data.key];\n\tyield actions.input('text', {\n\t\tconfig: {\n\t\t\tkey: node.data.key,\n\t\t\tmaxChars: node.data.maxChars,\n\t\t\tminChars: node.data.minChars,\n\t\t\tplaceholder: node.data.placeholder,\n\t\t\tformat: node.data.format,\n\t\t\toptional: node.data.optional,\n\t\t\tdefaultValue: thisSubmission?.type === 'string' ? thisSubmission.value : undefined,\n\t\t},\n\t\tvalidate: submission => {\n\t\t\tif (node.data.optional && submission === null) return Ok(submission);\n\t\t\tconst schema = getValidationSchema(params);\n\t\t\tif (schema === null) return Ok(submission);\n\t\t\tconst parsed = v.safeParse(schema, submission);\n\t\t\tif (parsed.success === false) return Err(parsed.issues);\n\t\t\tsubmissions[node.data.key] = { type: 'string', value: parsed.output };\n\t\t\treturn Ok(submission);\n\t\t},\n\t});\n\n\treturn next(node.nextId);\n}\n","import { FlowNode } from '@inploi/core/flows';\nimport { AnalyticsService, InploiRpcClient, Logger } from '@inploi/sdk';\nimport { ValiError } from 'valibot';\n\nimport { isIfBlockConditionMet } from './conditions';\nimport { FlowSubmissions } from './flow.types';\nimport { TFunction } from './i18n';\nimport { FlowInput } from './inputs';\nimport { interpolateWithData } from './interpolation';\nimport { interpretIdentifyNode } from './interpreter.identify';\nimport { interpretIntegrationApplicationSubmitNode } from './interpreter.integration-application-submit';\nimport { interpretQuestionAddressNode } from './interpreter.question-address';\nimport { interpretQuestionBooleanNode } from './interpreter.question-boolean';\nimport { interpretQuestionEnumNode } from './interpreter.question-enum';\nimport { interpretQuestionFileNode } from './interpreter.question-file';\nimport { interpretQuestionNumberNode } from './interpreter.question-number';\nimport { interpretQuestionPhoneNode } from './interpreter.question-phone';\nimport { interpretQuestionTextNode } from './interpreter.question-text';\nimport { LinkedList, LinkedListItem } from './linked-list';\nimport { Result } from './result';\n\ntype MaybePromise<T> = T | Promise<T>;\ntype FlowInterpreterYield =\n\t| { type: 'submissions'; submissions: FlowSubmissions }\n\t| { type: 'state'; state: 'loading' | 'idle' }\n\t| { type: 'error'; message: string }\n\t| { type: 'info'; message: string }\n\t| { type: 'success'; message: string }\n\t| { type: 'text'; author: 'user' | 'bot'; message: string }\n\t| { type: 'image'; url: string; height: number; width: number }\n\t| { type: 'link'; href: string; message: string }\n\t| { type: 'end' }\n\t| {\n\t\t\ttype: 'input';\n\t\t\tinput: {\n\t\t\t\t[I in FlowInput['type']]: {\n\t\t\t\t\ttype: I;\n\t\t\t\t\tconfig: (FlowInput & { type: I })['config'];\n\t\t\t\t\tvalidate: (\n\t\t\t\t\t\tinput: NonNullable<(FlowInput & { type: I })['submission']>['value'] | null,\n\t\t\t\t\t) => MaybePromise<\n\t\t\t\t\t\tResult<NonNullable<(FlowInput & { type: I })['submission']>['value'] | null, ValiError<any>['issues']>\n\t\t\t\t\t>;\n\t\t\t\t};\n\t\t\t}[FlowInput['type']];\n\t };\n\nexport type FlowInterpreterParams = {\n\trpcClient: InploiRpcClient;\n\tanalytics: {\n\t\tservice: AnalyticsService;\n\t\tcustomProperties?: Record<string, unknown>;\n\t};\n\tlogger: Logger;\n\tt: TFunction;\n};\n\nexport type FlowActions = {\n\terror: ({ message }: { message: string }) => FlowInterpreterYield;\n\tinfo: ({ message }: { message: string }) => FlowInterpreterYield;\n\tsuccess: ({ message }: { message: string }) => FlowInterpreterYield;\n\ttext: ({ message, author }: { message: string; author: 'bot' | 'user' }) => FlowInterpreterYield;\n\timage: ({ url, height, width }: { url: string; height: number; width: number }) => FlowInterpreterYield;\n\tlink: ({ href, message }: { href: string; message: string }) => FlowInterpreterYield;\n\tsubmissions: (submissions: FlowSubmissions) => FlowInterpreterYield;\n\tstate: (state: 'loading' | 'idle') => FlowInterpreterYield;\n\tinput: <T extends FlowInput['type'], Input extends FlowInput & { type: T }>(\n\t\ttype: T,\n\t\tparams: {\n\t\t\tconfig: Input['config'];\n\t\t\tvalidate: (\n\t\t\t\tinput: NonNullable<Input['submission']>['value'] | null,\n\t\t\t) => MaybePromise<Result<NonNullable<Input['submission']>['value'] | null, ValiError<any>['issues']>>;\n\t\t},\n\t) => FlowInterpreterYield;\n};\n\nexport const createFlowInterpreter = (params: FlowInterpreterParams) => {\n\tconst submissions: FlowSubmissions = {};\n\n\treturn {\n\t\tinterpret: async function* interpret({\n\t\t\tnodes,\n\t\t\tcontext,\n\t\t}: {\n\t\t\tnodes: LinkedList<FlowNode>;\n\t\t\tcontext: Record<string, unknown>;\n\t\t}): AsyncGenerator<FlowInterpreterYield> {\n\t\t\tconst actions: FlowActions = {\n\t\t\t\terror: ({ message }) => ({ type: 'error', message: interpolateWithData(message, { submissions, context }) }),\n\t\t\t\tinfo: ({ message }) => ({ type: 'info', message: interpolateWithData(message, { submissions, context }) }),\n\t\t\t\tsuccess: ({ message }) => ({\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tmessage: interpolateWithData(message, { submissions, context }),\n\t\t\t\t}),\n\t\t\t\ttext: ({ message, author }) => ({\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tauthor,\n\t\t\t\t\tmessage: interpolateWithData(message, { submissions, context }),\n\t\t\t\t}),\n\t\t\t\timage: ({ url, height, width }) => ({\n\t\t\t\t\ttype: 'image',\n\t\t\t\t\turl: interpolateWithData(url, { submissions, context }),\n\t\t\t\t\theight,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t\tstate: state => ({ type: 'state', state }),\n\t\t\t\tlink: ({ href, message }) => ({\n\t\t\t\t\ttype: 'link',\n\t\t\t\t\thref: interpolateWithData(href, { submissions, context }),\n\t\t\t\t\tmessage: interpolateWithData(message, { submissions, context }),\n\t\t\t\t}),\n\t\t\t\tsubmissions: submissions => ({ type: 'submissions', submissions }),\n\t\t\t\tinput: (type, params) => {\n\t\t\t\t\treturn { type: 'input', input: { type, config: params.config, validate: params.validate } as any };\n\t\t\t\t},\n\t\t\t};\n\t\t\tif (!nodes.headId) return { type: 'error', message: 'No head node found' };\n\t\t\tlet node: LinkedListItem<FlowNode> | undefined = nodes.items[nodes.headId];\n\t\t\tconst next = (nextId: string | undefined): { type: 'next'; nodeId: string | undefined } => {\n\t\t\t\tif (!nextId) {\n\t\t\t\t\tnode = undefined;\n\t\t\t\t\treturn { type: 'next', nodeId: undefined };\n\t\t\t\t}\n\t\t\t\tconst nextNode = nodes.items[nextId];\n\t\t\t\tif (!nextNode) throw new Error(`Next node with id ${nextId} not found`);\n\t\t\t\tnode = nextNode;\n\t\t\t\treturn { type: 'next', nodeId: nextId };\n\t\t\t};\n\t\t\tconst config = { ...params, context, submissions, next, actions };\n\n\t\t\twhile (node) {\n\t\t\t\tswitch (node.type) {\n\t\t\t\t\tcase 'text':\n\t\t\t\t\t\tyield actions.text({ author: 'bot', message: node.data.text });\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'image':\n\t\t\t\t\t\tyield actions.image(node.data);\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'link':\n\t\t\t\t\t\tyield actions.link({ href: node.data.href, message: node.data.cta });\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'add-submission':\n\t\t\t\t\t\tsubmissions[node.data.key] = { type: 'string', value: node.data.value };\n\t\t\t\t\t\tnext(node.nextId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'jump':\n\t\t\t\t\t\tnext(node.data.targetId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-text':\n\t\t\t\t\t\tyield* interpretQuestionTextNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-phone':\n\t\t\t\t\t\tyield* interpretQuestionPhoneNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-boolean':\n\t\t\t\t\t\tyield* interpretQuestionBooleanNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-number':\n\t\t\t\t\t\tyield* interpretQuestionNumberNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-address':\n\t\t\t\t\t\tyield* interpretQuestionAddressNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-enum':\n\t\t\t\t\t\tyield* interpretQuestionEnumNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'question-file':\n\t\t\t\t\t\tyield* interpretQuestionFileNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'identify': {\n\t\t\t\t\t\tyield* interpretIdentifyNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'if-block': {\n\t\t\t\t\t\tconst nextNodeId =\n\t\t\t\t\t\t\tisIfBlockConditionMet(node, { context: config.context, submissions }) ? node.branchId : node.nextId;\n\t\t\t\t\t\tnext(nextNodeId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'integration-application-submit':\n\t\t\t\t\t\tyield* interpretIntegrationApplicationSubmitNode({ config, node });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'feedback':\n\t\t\t\t\t\tyield actions.error({ message: 'Not implemented' });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'integration-workflow-get':\n\t\t\t\t\t\tyield actions.error({ message: 'This message should never be reached' });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'end-flow':\n\t\t\t\t\t\tnode = undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tyield actions.submissions(submissions);\n\t\t\t}\n\t\t\tyield { type: 'end' };\n\t\t},\n\t};\n};\n\nexport type InterpretNodeParams<TNodeType extends FlowNode['type']> = {\n\tnode: FlowNode & { type: TNodeType };\n\tconfig: FlowInterpreterParams & {\n\t\tsubmissions: FlowSubmissions;\n\t\tcontext: Record<string, unknown>;\n\t\tnext: (nextId: string | undefined) => { type: 'next'; nodeId: string | undefined };\n\t\tactions: FlowActions;\n\t};\n};\n\nexport type InterpretNodeReturn = AsyncGenerator<FlowInterpreterYield, { type: 'next'; nodeId: string | undefined }>;\n"],"mappings":"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","names":["import_get","isConditionMet","condition","context","submissions","ifBlock","firstSegment","path","answer","getSubmissionValueToCheck","value","get","newIfBlock","__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"]}
|
package/dist/linked-list.d.mts
CHANGED
|
@@ -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[
|
|
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: <
|
|
16
|
-
moveItem: <
|
|
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
|
-
}) =>
|
|
23
|
-
asArray: <
|
|
24
|
-
getInvalidItemKeys: <
|
|
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
|
|
package/dist/linked-list.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
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
|
package/dist/linked-list.mjs.map
CHANGED
|
@@ -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
|
|
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[
|
|
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{
|
|
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": "
|
|
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.
|
|
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.
|
|
40
|
-
"@inploi/sdk": "1.
|
|
41
|
-
"@inploi/i18n": "0.1.
|
|
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
|
},
|
package/dist/chunk-VKMPK5WA.mjs
DELETED
|
@@ -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
|