datakeen-session-react 1.1.174 → 1.1.176
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/CLAUDE.md +233 -0
- package/dist/cjs/components/legal-consent/LegalConsentNode.js +6 -11
- package/dist/cjs/components/legal-consent/LegalConsentNode.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm/CustomFormFields.js +41 -1
- package/dist/cjs/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/cjs/components/signature-electronic/SignatureElectronic.js +4 -5
- package/dist/cjs/components/signature-electronic/SignatureElectronic.js.map +1 -1
- package/dist/cjs/components/template/ConditionNodeHandler.js +1 -1
- package/dist/cjs/components/template/ConditionNodeHandler.js.map +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +2 -0
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +2 -0
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/conditionEvaluator.js +27 -2
- package/dist/cjs/utils/conditionEvaluator.js.map +1 -1
- package/dist/cjs/utils/renderInlineMarkdown.js +75 -0
- package/dist/cjs/utils/renderInlineMarkdown.js.map +1 -0
- package/dist/esm/components/legal-consent/LegalConsentNode.js +6 -11
- package/dist/esm/components/legal-consent/LegalConsentNode.js.map +1 -1
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js +42 -2
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/esm/components/signature-electronic/SignatureElectronic.js +4 -5
- package/dist/esm/components/signature-electronic/SignatureElectronic.js.map +1 -1
- package/dist/esm/components/template/ConditionNodeHandler.js +1 -1
- package/dist/esm/components/template/ConditionNodeHandler.js.map +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/esm/i18n/en.json.js +2 -0
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +2 -0
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/types/session.js.map +1 -1
- package/dist/esm/utils/conditionEvaluator.js +27 -2
- package/dist/esm/utils/conditionEvaluator.js.map +1 -1
- package/dist/esm/utils/renderInlineMarkdown.js +73 -0
- package/dist/esm/utils/renderInlineMarkdown.js.map +1 -0
- package/package.json +1 -1
|
@@ -75,7 +75,7 @@ var ConditionNodeHandler = function (_a) {
|
|
|
75
75
|
stepObject.goToNextStep(node.id, freshSession.template, "true");
|
|
76
76
|
return [2 /*return*/];
|
|
77
77
|
}
|
|
78
|
-
if (node.conditionFalseMode
|
|
78
|
+
if (node.conditionFalseMode !== "retry") {
|
|
79
79
|
stepObject.goToNextStep(node.id, freshSession.template, "false");
|
|
80
80
|
return [2 /*return*/];
|
|
81
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionNodeHandler.js","sources":["../../../../../src/components/template/ConditionNodeHandler.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport LoadingState from \"../states/LoadingState\";\nimport type { SessionData, SessionTemplateNode } from \"../../types/session\";\nimport type { stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\nimport type { ContactInfo } from \"../../types/contactInfo\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n evaluateConditionTokens,\n parseConditionExpression,\n} from \"../../utils/conditionEvaluator\";\nimport {\n fetchSessionById,\n findOutgoingEdge,\n} from \"../../services/sessionService\";\nimport {\n getNodeRetryCount,\n updateNodeRetryCount,\n} from \"../../services/retryService\";\nimport {\n hasExceededConditionMaxRetries,\n normalizeConditionMaxRetries,\n normalizeConditionMaxRetryAction,\n} from \"./conditionNodePolicy\";\n\ninterface ConditionNodeHandlerProps {\n node: SessionTemplateNode;\n session: SessionData;\n templateNodes: SessionTemplateNode[];\n stepObject: stepObject;\n userInput: UserInput;\n contactInfo: ContactInfo;\n}\n\ninterface FalseConditionState {\n message: string;\n retryCount: number;\n maxRetries: number;\n template: SessionData[\"template\"];\n}\n\nconst ConditionNodeHandler: React.FC<ConditionNodeHandlerProps> = ({\n node,\n session,\n templateNodes,\n stepObject,\n userInput,\n contactInfo,\n}) => {\n const { t } = useI18n();\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [isLoadingSession, setIsLoadingSession] = useState(false);\n const [falseConditionState, setFalseConditionState] =\n useState<FalseConditionState | null>(null);\n const hasEvaluatedRef = useRef(false);\n\n const tokens = useMemo(() => {\n return (\n (node.conditionTokens && node.conditionTokens.length > 0\n ? node.conditionTokens\n : parseConditionExpression(node.conditionExpression || \"\")) || []\n );\n }, [node.conditionExpression, node.conditionTokens]);\n\n useEffect(() => {\n hasEvaluatedRef.current = false;\n setErrorMessage(null);\n setFalseConditionState(null);\n }, [node.id]);\n\n useEffect(() => {\n if (hasEvaluatedRef.current) {\n return;\n }\n hasEvaluatedRef.current = true;\n\n const evaluateCondition = async () => {\n if (!session?.template) {\n setErrorMessage(\n t(\n \"condition_node.error_missing_template\",\n \"Aucun template disponible pour évaluer la condition.\",\n ),\n );\n return;\n }\n\n if (tokens.length === 0) {\n setErrorMessage(\n t(\n \"condition_node.error_missing_tokens\",\n \"Aucune expression de condition n'est définie pour ce nœud.\",\n ),\n );\n return;\n }\n\n setIsLoadingSession(true);\n let freshSession: SessionData;\n try {\n freshSession = await fetchSessionById(session.id);\n } catch (error) {\n console.error(\"[ConditionNodeHandler] Error fetching fresh session:\", error);\n freshSession = session;\n } finally {\n setIsLoadingSession(false);\n }\n\n try {\n const evaluationResult = evaluateConditionTokens(tokens, {\n session: freshSession,\n userInput,\n contactInfo,\n });\n\n if (evaluationResult) {\n stepObject.goToNextStep(node.id, freshSession.template, \"true\");\n return;\n }\n\n if (node.conditionFalseMode === \"loop\") {\n stepObject.goToNextStep(node.id, freshSession.template, \"false\");\n return;\n }\n\n const maxRetries = normalizeConditionMaxRetries(node.conditionMaxRetries);\n const maxRetryAction = normalizeConditionMaxRetryAction(\n node.conditionMaxRetryAction,\n );\n const currentRetryCount = getNodeRetryCount(freshSession, node.id);\n const retryCountAfterFailure = currentRetryCount + 1;\n\n try {\n await updateNodeRetryCount(\n session.id,\n node.id,\n retryCountAfterFailure,\n );\n } catch (retryError) {\n console.error(\n \"[ConditionNodeHandler] Failed to persist retry count:\",\n retryError,\n );\n }\n\n if (\n hasExceededConditionMaxRetries(retryCountAfterFailure, maxRetries)\n ) {\n if (maxRetryAction === \"force-true\") {\n stepObject.goToNextStep(node.id, freshSession.template, \"true\");\n return;\n }\n stepObject.goToNextStep(node.id, freshSession.template, \"false\");\n return;\n }\n\n const falseEdge = findOutgoingEdge(node.id, freshSession.template, \"false\");\n if (!falseEdge) {\n throw new Error(\"No outgoing false edge defined for condition node\");\n }\n\n setFalseConditionState({\n message:\n node.conditionFalseErrorMessage?.trim() ||\n t(\n \"condition_node.false_error_default\",\n \"Les informations ne respectent pas les conditions demandées.\",\n ),\n retryCount: retryCountAfterFailure,\n maxRetries,\n template: freshSession.template,\n });\n } catch (error) {\n console.error(\"Failed to evaluate condition node\", error);\n setErrorMessage(\n t(\n \"condition_node.error_evaluation\",\n \"Impossible d'évaluer cette condition. Vous pouvez poursuivre manuellement.\",\n ),\n );\n }\n };\n\n evaluateCondition();\n }, [contactInfo, node, session, stepObject, t, tokens, userInput, templateNodes]);\n\n const handleRetry = () => {\n if (!falseConditionState) {\n return;\n }\n stepObject.goToNextStep(node.id, falseConditionState.template, \"false\");\n };\n\n if (isLoadingSession) {\n return (\n <LoadingState\n message={t(\n \"condition_node.loading_analysis\",\n \"Chargement des données d'analyse...\",\n )}\n subtitle={t(\n \"condition_node.loading_description\",\n \"Récupération des informations nécessaires pour évaluer la condition.\",\n )}\n />\n );\n }\n\n if (falseConditionState) {\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n <div className=\"flex-1 px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n <div className=\"text-center\">\n <div className=\"mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4\">\n <div className=\"w-8 h-8 bg-red-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-lg\">✕</span>\n </div>\n </div>\n </div>\n\n <div className=\"text-center space-y-4\">\n <h2 className=\"text-xl font-bold text-red-600\">\n {t(\"condition_node.false_error_title\", \"Condition non remplie\")}\n </h2>\n <p className=\"text-sm text-gray-600 leading-relaxed\">\n {falseConditionState.message}\n </p>\n </div>\n\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <p className=\"text-sm text-orange-800\">\n {t(\n \"condition_node.retry_counter\",\n \"Tentative {{current}}/{{max}}\",\n {\n current: falseConditionState.retryCount,\n max: falseConditionState.maxRetries,\n },\n )}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"sticky bottom-0 md:static bg-white border-t md:border-t-0 p-4 md:p-0 md:pb-8\">\n <div className=\"w-full max-w-md mx-auto\">\n <button\n className=\"w-full px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={handleRetry}\n >\n {t(\"condition_node.buttons.retry\", \"Réessayer\")}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n if (errorMessage) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"condition_node.title\", \"Condition\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{errorMessage}</p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(stepObject.step + 1)}\n >\n {t(\"condition_node.buttons.skip\", \"Continuer\")}\n </button>\n </div>\n );\n }\n\n return (\n <LoadingState\n message={t(\n \"condition_node.evaluating\",\n \"Évaluation de la condition en cours...\",\n )}\n subtitle={t(\n \"condition_node.evaluating_description\",\n \"Merci de patienter pendant que nous déterminons la prochaine étape.\",\n )}\n />\n );\n};\n\nexport default ConditionNodeHandler;\n"],"names":["useI18n","useState","useRef","useMemo","parseConditionExpression","useEffect","__awaiter","fetchSessionById","evaluateConditionTokens","normalizeConditionMaxRetries","normalizeConditionMaxRetryAction","getNodeRetryCount","updateNodeRetryCount","hasExceededConditionMaxRetries","findOutgoingEdge","_jsx","LoadingState","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConditionNodeHandler.js","sources":["../../../../../src/components/template/ConditionNodeHandler.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport LoadingState from \"../states/LoadingState\";\nimport type { SessionData, SessionTemplateNode } from \"../../types/session\";\nimport type { stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\nimport type { ContactInfo } from \"../../types/contactInfo\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n evaluateConditionTokens,\n parseConditionExpression,\n} from \"../../utils/conditionEvaluator\";\nimport {\n fetchSessionById,\n findOutgoingEdge,\n} from \"../../services/sessionService\";\nimport {\n getNodeRetryCount,\n updateNodeRetryCount,\n} from \"../../services/retryService\";\nimport {\n hasExceededConditionMaxRetries,\n normalizeConditionMaxRetries,\n normalizeConditionMaxRetryAction,\n} from \"./conditionNodePolicy\";\n\ninterface ConditionNodeHandlerProps {\n node: SessionTemplateNode;\n session: SessionData;\n templateNodes: SessionTemplateNode[];\n stepObject: stepObject;\n userInput: UserInput;\n contactInfo: ContactInfo;\n}\n\ninterface FalseConditionState {\n message: string;\n retryCount: number;\n maxRetries: number;\n template: SessionData[\"template\"];\n}\n\nconst ConditionNodeHandler: React.FC<ConditionNodeHandlerProps> = ({\n node,\n session,\n templateNodes,\n stepObject,\n userInput,\n contactInfo,\n}) => {\n const { t } = useI18n();\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [isLoadingSession, setIsLoadingSession] = useState(false);\n const [falseConditionState, setFalseConditionState] =\n useState<FalseConditionState | null>(null);\n const hasEvaluatedRef = useRef(false);\n\n const tokens = useMemo(() => {\n return (\n (node.conditionTokens && node.conditionTokens.length > 0\n ? node.conditionTokens\n : parseConditionExpression(node.conditionExpression || \"\")) || []\n );\n }, [node.conditionExpression, node.conditionTokens]);\n\n useEffect(() => {\n hasEvaluatedRef.current = false;\n setErrorMessage(null);\n setFalseConditionState(null);\n }, [node.id]);\n\n useEffect(() => {\n if (hasEvaluatedRef.current) {\n return;\n }\n hasEvaluatedRef.current = true;\n\n const evaluateCondition = async () => {\n if (!session?.template) {\n setErrorMessage(\n t(\n \"condition_node.error_missing_template\",\n \"Aucun template disponible pour évaluer la condition.\",\n ),\n );\n return;\n }\n\n if (tokens.length === 0) {\n setErrorMessage(\n t(\n \"condition_node.error_missing_tokens\",\n \"Aucune expression de condition n'est définie pour ce nœud.\",\n ),\n );\n return;\n }\n\n setIsLoadingSession(true);\n let freshSession: SessionData;\n try {\n freshSession = await fetchSessionById(session.id);\n } catch (error) {\n console.error(\"[ConditionNodeHandler] Error fetching fresh session:\", error);\n freshSession = session;\n } finally {\n setIsLoadingSession(false);\n }\n\n try {\n const evaluationResult = evaluateConditionTokens(tokens, {\n session: freshSession,\n userInput,\n contactInfo,\n });\n\n if (evaluationResult) {\n stepObject.goToNextStep(node.id, freshSession.template, \"true\");\n return;\n }\n\n if (node.conditionFalseMode !== \"retry\") {\n stepObject.goToNextStep(node.id, freshSession.template, \"false\");\n return;\n }\n\n const maxRetries = normalizeConditionMaxRetries(node.conditionMaxRetries);\n const maxRetryAction = normalizeConditionMaxRetryAction(\n node.conditionMaxRetryAction,\n );\n const currentRetryCount = getNodeRetryCount(freshSession, node.id);\n const retryCountAfterFailure = currentRetryCount + 1;\n\n try {\n await updateNodeRetryCount(\n session.id,\n node.id,\n retryCountAfterFailure,\n );\n } catch (retryError) {\n console.error(\n \"[ConditionNodeHandler] Failed to persist retry count:\",\n retryError,\n );\n }\n\n if (\n hasExceededConditionMaxRetries(retryCountAfterFailure, maxRetries)\n ) {\n if (maxRetryAction === \"force-true\") {\n stepObject.goToNextStep(node.id, freshSession.template, \"true\");\n return;\n }\n stepObject.goToNextStep(node.id, freshSession.template, \"false\");\n return;\n }\n\n const falseEdge = findOutgoingEdge(node.id, freshSession.template, \"false\");\n if (!falseEdge) {\n throw new Error(\"No outgoing false edge defined for condition node\");\n }\n\n setFalseConditionState({\n message:\n node.conditionFalseErrorMessage?.trim() ||\n t(\n \"condition_node.false_error_default\",\n \"Les informations ne respectent pas les conditions demandées.\",\n ),\n retryCount: retryCountAfterFailure,\n maxRetries,\n template: freshSession.template,\n });\n } catch (error) {\n console.error(\"Failed to evaluate condition node\", error);\n setErrorMessage(\n t(\n \"condition_node.error_evaluation\",\n \"Impossible d'évaluer cette condition. Vous pouvez poursuivre manuellement.\",\n ),\n );\n }\n };\n\n evaluateCondition();\n }, [contactInfo, node, session, stepObject, t, tokens, userInput, templateNodes]);\n\n const handleRetry = () => {\n if (!falseConditionState) {\n return;\n }\n stepObject.goToNextStep(node.id, falseConditionState.template, \"false\");\n };\n\n if (isLoadingSession) {\n return (\n <LoadingState\n message={t(\n \"condition_node.loading_analysis\",\n \"Chargement des données d'analyse...\",\n )}\n subtitle={t(\n \"condition_node.loading_description\",\n \"Récupération des informations nécessaires pour évaluer la condition.\",\n )}\n />\n );\n }\n\n if (falseConditionState) {\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n <div className=\"flex-1 px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n <div className=\"text-center\">\n <div className=\"mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4\">\n <div className=\"w-8 h-8 bg-red-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-lg\">✕</span>\n </div>\n </div>\n </div>\n\n <div className=\"text-center space-y-4\">\n <h2 className=\"text-xl font-bold text-red-600\">\n {t(\"condition_node.false_error_title\", \"Condition non remplie\")}\n </h2>\n <p className=\"text-sm text-gray-600 leading-relaxed\">\n {falseConditionState.message}\n </p>\n </div>\n\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <p className=\"text-sm text-orange-800\">\n {t(\n \"condition_node.retry_counter\",\n \"Tentative {{current}}/{{max}}\",\n {\n current: falseConditionState.retryCount,\n max: falseConditionState.maxRetries,\n },\n )}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"sticky bottom-0 md:static bg-white border-t md:border-t-0 p-4 md:p-0 md:pb-8\">\n <div className=\"w-full max-w-md mx-auto\">\n <button\n className=\"w-full px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={handleRetry}\n >\n {t(\"condition_node.buttons.retry\", \"Réessayer\")}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n if (errorMessage) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"condition_node.title\", \"Condition\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{errorMessage}</p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(stepObject.step + 1)}\n >\n {t(\"condition_node.buttons.skip\", \"Continuer\")}\n </button>\n </div>\n );\n }\n\n return (\n <LoadingState\n message={t(\n \"condition_node.evaluating\",\n \"Évaluation de la condition en cours...\",\n )}\n subtitle={t(\n \"condition_node.evaluating_description\",\n \"Merci de patienter pendant que nous déterminons la prochaine étape.\",\n )}\n />\n );\n};\n\nexport default ConditionNodeHandler;\n"],"names":["useI18n","useState","useRef","useMemo","parseConditionExpression","useEffect","__awaiter","fetchSessionById","evaluateConditionTokens","normalizeConditionMaxRetries","normalizeConditionMaxRetryAction","getNodeRetryCount","updateNodeRetryCount","hasExceededConditionMaxRetries","findOutgoingEdge","_jsx","LoadingState","_jsxs"],"mappings":"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"}
|
|
@@ -114,7 +114,7 @@ var TemplateNodeRenderer = function (_a) {
|
|
|
114
114
|
case "selfie-capture":
|
|
115
115
|
return (jsxRuntime.jsx(Selfie.default, { stepObject: stepObject, sessionId: sessionId, node: node, template: session.template }, "selfie-".concat(templateIndex)));
|
|
116
116
|
case "signature-electronic":
|
|
117
|
-
return (jsxRuntime.jsx(SignatureElectronic.default, { sessionId: sessionId, stepObject: stepObject, title: node.title, description: node.description,
|
|
117
|
+
return (jsxRuntime.jsx(SignatureElectronic.default, { sessionId: sessionId, stepObject: stepObject, node: node, session: session, title: node.title, description: node.description,
|
|
118
118
|
// Always pass a stable node identifier so backend can resolve
|
|
119
119
|
// either a static DocuSeal template OR a generated PDF source.
|
|
120
120
|
external_id: node.templateId || node.external_id || node.id, fieldMappings: node.fieldMappings, userInput: userInput, contactInfo: contactInfo }, "signature-".concat(templateIndex)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateNodeRenderer.js","sources":["../../../../../src/components/template/TemplateNodeRenderer.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport Selfie from \"../session/Selfie\";\nimport VideoWorkInProgress from \"../session/VideoWorkInProgress\";\nimport DocumentCheck, { NodeIdentityControl } from \"../session/DocumentCheck\";\nimport DocumentCollection, {\n DocumentTypeSide,\n NodeDocumentCollection,\n} from \"../document-collection/DocumentCollection\";\nimport EndFlow from \"../session/EndFlow\";\nimport LoadingState from \"../states/LoadingState\";\nimport JDDWorkInProgress from \"../jdi/JDDWorkInProgress\";\nimport { getOrderedJourneySteps, getRunPrefillData } from \"../../services/sessionService\";\nimport type { SessionData, stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\nimport type { ContactInfo } from \"../../types/contactInfo\";\nimport UserInputForm from \"../session/UserInputForm\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport ConditionNodeHandler from \"./ConditionNodeHandler\";\nimport SignatureElectronic from \"../signature-electronic/SignatureElectronic\";\nimport ExternalVerificationNodeHandler from \"./ExternalVerificationNodeHandler\";\nimport PdfGeneration from \"../session/PdfGeneration\";\nimport LegalConsentNode from \"../legal-consent/LegalConsentNode\";\n\ninterface TemplateNodeRendererProps {\n session: SessionData;\n sessionId: string;\n stepObject: stepObject;\n stepHistory: number[];\n templateIndex: number;\n onContinueOnPC: () => void;\n userInput: UserInput;\n setUserInput: React.Dispatch<React.SetStateAction<UserInput>>;\n contactInfo: ContactInfo;\n setContactInfo: React.Dispatch<React.SetStateAction<ContactInfo>>;\n isMobileTemplate: boolean;\n}\n\nconst TemplateNodeRenderer: React.FC<TemplateNodeRendererProps> = ({\n session,\n sessionId,\n stepObject,\n stepHistory,\n templateIndex,\n onContinueOnPC,\n userInput,\n setUserInput,\n contactInfo,\n setContactInfo,\n isMobileTemplate,\n}) => {\n const { t } = useI18n();\n\n if (!session?.template) {\n console.error(t(\"template.error.console_no_template\"));\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"template.error.configuration\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{t(\"template.error.no_template\")}</p>\n </div>\n );\n }\n\n // Check if session is ended before rendering nodes\n if (session.status === \"ended\") {\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session.status}\n callbackURL={session.callbackURL}\n compliantCase={session.template?.endScreenConfig?.compliant}\n nonCompliantCase={session.template?.endScreenConfig?.nonCompliant}\n />\n );\n }\n\n // Use getOrderedWorkflowSteps to get sorted and filtered nodes\n const templateNodes = useMemo(\n () => getOrderedJourneySteps(session.template),\n [session.template],\n );\n\n // Check if index is valid\n if (templateNodes.length === 0) {\n console.warn(\"No valid template nodes found after filtering\");\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n />\n );\n }\n\n if (templateIndex < 0 || templateIndex >= templateNodes.length) {\n console.warn(\n `Invalid template index: ${templateIndex}, max index: ${templateNodes.length - 1\n }`,\n );\n\n // If we're beyond the maximum index, it means we've completed all nodes\n if (templateIndex >= templateNodes.length) {\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n compliantCase={session?.template?.endScreenConfig?.compliant}\n nonCompliantCase={session?.template?.endScreenConfig?.nonCompliant}\n />\n );\n }\n\n // If index is negative, redirect to start\n if (templateIndex < 0) {\n setTimeout(() => stepObject.setStep(0), 0);\n return <LoadingState message={t(\"loading.step\")} subtitle=\"\" />;\n }\n }\n\n // At this point, we should have a valid node\n const node = templateNodes[templateIndex];\n if (!node) {\n console.error(\n `Node at index ${templateIndex} is undefined. Available nodes:`,\n templateNodes,\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"template.error.render\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\"template.error.node_not_found\")}\n </p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(0)}\n >\n {t(\"template.buttons.restart\")}\n </button>\n </div>\n );\n }\n\n switch (node.type) {\n case \"end\":\n console.log(\"📄 Rendering EndFlow component\");\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n endNodeId={node.id}\n expectedResult={node.expectedResult}\n compliantCase={session?.template?.endScreenConfig?.compliant}\n nonCompliantCase={session?.template?.endScreenConfig?.nonCompliant}\n />\n );\n\n case \"information-input\": {\n // runIndex = nombre de fois que ce step a déjà été visité dans l'historique\n // (0 = premier passage, 1 = deuxième, …).\n // On compte les occurrences de (templateIndex + 1) dans stepHistory,\n // minus 1 car le step courant est déjà dans l'historique.\n const currentStep = templateIndex + 1;\n const visitCount = stepHistory.filter((s) => s === currentStep).length;\n const runIndex = Math.max(0, visitCount - 1);\n\n // Pré-remplissage multi-ENTITÉS : si _list présent, utiliser _list[runIndex]\n // (ou {} hors borne). L'énumération de plusieurs entités successives passe\n // exclusivement par _list (cf. docs/multi-runs.md).\n // Sans _list : on pré-remplit TOUJOURS depuis le userInput persisté — y compris\n // sur une ré-entrée (boucle condition de correction, retour arrière, bouton\n // \"Corriger ma saisie\"). Une ré-entrée sans _list = corriger les MÊMES données,\n // pas en saisir de nouvelles → on ne doit pas vider le formulaire.\n const hasList = Array.isArray(\n (session.userInput as Record<string, unknown>)?._list,\n );\n let initialUserInput: UserInput;\n if (hasList) {\n const prefill = getRunPrefillData(\n session.userInput as Record<string, unknown>,\n runIndex,\n );\n initialUserInput = (prefill ?? {}) as UserInput;\n } else {\n initialUserInput = userInput;\n }\n return (\n // key={node.id} : remonte le formulaire à chaque changement de nœud, pour\n // qu'il se ré-initialise depuis initialUserInput (comportement \"refresh sans\n // refresh\"). Évite la réutilisation d'instance qui laissait customFormData\n // périmé au retour arrière entre deux nœuds information-input.\n <UserInputForm\n key={node.id}\n stepObject={stepObject}\n node={node}\n template={session.template}\n setUserInput={setUserInput}\n initialUserInput={initialUserInput}\n contactInfo={contactInfo}\n setContactInfo={setContactInfo}\n sessionId={sessionId}\n />\n );\n }\n\n case \"document-collection\": {\n return (\n <DocumentCollection\n key={`doc-collection-${templateIndex}`}\n node={node as NodeDocumentCollection}\n stepObject={stepObject}\n sessionId={sessionId}\n template={session.template}\n onContinueOnPC={onContinueOnPC}\n allowedDocumentTypes={(node.allowedDocumentTypes || []).map(\n (docType: any) => ({\n ...docType,\n side:\n typeof docType.side === \"string\" ||\n typeof docType.side === \"number\"\n ? (docType.side as DocumentTypeSide)\n : undefined,\n }),\n )}\n allowedAddingMethods={node.allowedAddingMethods || [\"download\"]}\n introductionPage={node.introductionPage}\n documentSelection={node.documentSelection}\n allowResubmission={node.allowResubmission}\n maxResubmissionAttempts={node.maxResubmissionAttempts}\n />\n );\n }\n\n case \"document-selection\":\n case \"controle-jdi\": {\n if (!node.requiredDocumentType) {\n console.error(\n \"Missing requiredDocumentType in document-selection node:\",\n node,\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n Erreur de configuration\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Le type de document requis n'est pas spécifié dans le template.\n </p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(0)}\n >\n Recommencer\n </button>\n </div>\n );\n }\n\n // Determine if current device is mobile for capture method\n const isMobile =\n /Android|iPhone|iPad|iPod|Opera Mini|IEMobile|WPDesktop/i.test(\n navigator.userAgent,\n );\n\n return (\n <DocumentCheck\n key={`doc-check-${templateIndex}`}\n stepObject={stepObject}\n node={node as NodeIdentityControl}\n sessionId={sessionId}\n documentTypeId={node.requiredDocumentType}\n acceptedCountries={node.acceptedCountries}\n onContinueOnPC={onContinueOnPC}\n isMobileCapture={isMobileTemplate && isMobile}\n allowedAddingMethods={\n node.allowedAddingMethods || [\"download\", \"picture\"]\n }\n template={session.template}\n templateIndex={templateIndex}\n setUserInput={setUserInput}\n />\n );\n // }\n }\n\n case \"biometric-capture\":\n case \"selfie-capture\":\n return (\n <Selfie\n key={`selfie-${templateIndex}`}\n stepObject={stepObject}\n sessionId={sessionId}\n node={node}\n template={session.template}\n />\n );\n\n case \"signature-electronic\":\n return (\n <SignatureElectronic\n key={`signature-${templateIndex}`}\n sessionId={sessionId}\n stepObject={stepObject}\n title={node.title}\n description={node.description}\n // Always pass a stable node identifier so backend can resolve\n // either a static DocuSeal template OR a generated PDF source.\n external_id={node.templateId || node.external_id || node.id}\n fieldMappings={node.fieldMappings}\n userInput={userInput}\n contactInfo={contactInfo}\n />\n );\n\n case \"video-capture\":\n console.log(\"🎥 Rendering Video Work in Progress component\");\n return <VideoWorkInProgress onContinue={onContinueOnPC} />;\n\n case \"jdd\":\n console.log(\"🚧 Rendering JDD Work in Progress component\");\n return <JDDWorkInProgress onContinue={onContinueOnPC} />;\n\n case \"condition\":\n console.debug(\"🔀 Rendering Condition Node Handler component and well\");\n return (\n <ConditionNodeHandler\n node={node}\n session={session}\n templateNodes={templateNodes}\n stepObject={stepObject}\n userInput={userInput}\n contactInfo={contactInfo}\n />\n );\n\n case \"external-verification\":\n console.debug(\"🔍 Rendering External Verification Node Handler\");\n return (\n <ExternalVerificationNodeHandler\n node={node}\n session={session}\n userInput={userInput}\n setUserInput={setUserInput}\n onNext={() => stepObject.goToNextStep(node.id, session.template)}\n onPrevious={() => stepObject.goBack()}\n onNavigateToNode={(nodeId: string) => {\n const idx = templateNodes.findIndex((n: any) => n.id === nodeId);\n // idx est 0-based, les steps sont 1-based → idx + 1.\n // goBackToStep tronque l'historique pour que le nœud corrigé\n // redevienne runIndex 0 (formulaire pré-rempli).\n if (idx !== -1) stepObject.goBackToStep(idx + 1);\n else stepObject.goBack();\n }}\n />\n );\n\n case \"pdf-generation\":\n console.debug(\"📄 Rendering PDF Generation component\");\n return (\n <PdfGeneration\n key={`pdf-generation-${templateIndex}`}\n node={node}\n session={session}\n sessionId={sessionId}\n stepObject={stepObject}\n userInput={userInput}\n />\n );\n\n case \"legal-consent\":\n return (\n <LegalConsentNode\n node={node}\n session={session}\n sessionId={sessionId}\n stepObject={stepObject}\n />\n );\n\n case \"custom\":\n // For custom nodes, we provide a basic structure that can be extended\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-blue-500 text-4xl mb-4\">🔧</div>\n <h2 className=\"text-xl font-bold text-blue-600 mb-2\">\n Nœud personnalisé\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Implémentation personnalisée requise pour: \"{node.title || node.id}\"\n </p>\n <div className=\"bg-blue-50 border border-blue-200 rounded p-3 text-left text-sm mb-4 max-w-md\">\n <p className=\"font-semibold text-blue-700 mb-2\">\n Configuration du nœud:\n </p>\n <pre className=\"text-xs overflow-auto max-h-32\">\n {JSON.stringify(\n {\n id: node.id,\n title: node.title,\n description: node.description,\n options: node.options,\n selectedOptions: node.selectedOptions,\n },\n null,\n 2,\n )}\n </pre>\n </div>\n <button\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n onClick={() => {\n console.log(\"Custom node action:\", node);\n stepObject.goToNextStep(node.id, session.template);\n }}\n >\n {t(\"template.buttons.continue\")}\n </button>\n </div>\n );\n\n default:\n console.warn(`❌ Type de nœud non supporté: ${node.type}`, node);\n console.log(\"❓ Available supported types:\", [\n \"end\",\n \"information-input\",\n \"document-collection\",\n \"document-selection\",\n \"document-upload\",\n \"controle-jdi\",\n \"selfie-capture\",\n \"video-capture\",\n \"country-selection\",\n \"identity-control\",\n \"jdd\",\n \"condition\",\n \"custom\",\n ]);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-yellow-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-yellow-600 mb-2\">\n Étape non supportée\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Le type d'étape \"{node.type}\" n'est pas pris en charge.\n </p>\n <div className=\"bg-gray-100 p-4 rounded mb-4 text-left text-xs overflow-auto max-h-32\">\n <pre>{JSON.stringify(node, null, 2)}</pre>\n </div>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => {\n stepObject.goToNextStep(node.id, session.template);\n }}\n >\n {t(\"template.buttons.continue\")}\n </button>\n </div>\n );\n }\n};\n\nexport default TemplateNodeRenderer;\n"],"names":["useI18n","_jsxs","_jsx","EndFlow","useMemo","getOrderedJourneySteps","LoadingState","getRunPrefillData","UserInputForm","DocumentCollection","__assign","DocumentCheck","Selfie","SignatureElectronic","VideoWorkInProgress","JDDWorkInProgress","ConditionNodeHandler","ExternalVerificationNodeHandler","PdfGeneration","LegalConsentNode"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAqCA,IAAM,oBAAoB,GAAwC,UAAC,EAYlE,EAAA;;AAXC,IAAA,IAAA,OAAO,GAAA,EAAA,CAAA,OAAA,EACP,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,UAAU,GAAA,EAAA,CAAA,UAAA,EACV,WAAW,GAAA,EAAA,CAAA,WAAA,EACX,aAAa,mBAAA,EACb,cAAc,GAAA,EAAA,CAAA,cAAA,EACd,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,YAAY,GAAA,EAAA,CAAA,YAAA,EACZ,WAAW,GAAA,EAAA,CAAA,WAAA,EACX,cAAc,GAAA,EAAA,CAAA,cAAA,EACd,gBAAgB,GAAA,EAAA,CAAA,gBAAA;AAER,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;IAET,IAAI,EAAC,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,QAAQ,CAAA,EAAE;QACtB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC;AACtD,QAAA,QACEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC/EC,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,cAAA,EAAA,CAAS,EACpDA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAChD,CAAC,CAAC,8BAA8B,CAAC,EAAA,CAC/B,EACLA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAE,CAAC,CAAC,4BAA4B,CAAC,EAAA,CAAK,CAAA,EAAA,CACnE;IAEV;;AAGA,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;QAC9B,QACEA,eAACC,eAAO,EAAA,EACN,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,OAAO,CAAC,MAAM,EAC7B,WAAW,EAAE,OAAO,CAAC,WAAW,EAChC,aAAa,EAAE,MAAA,CAAA,EAAA,GAAA,OAAO,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,eAAe,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,EAC3D,gBAAgB,EAAE,MAAA,CAAA,EAAA,GAAA,OAAO,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,eAAe,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,YAAY,EAAA,CACjE;IAEN;;IAGA,IAAM,aAAa,GAAGC,aAAO,CAC3B,cAAM,OAAAC,qCAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAxC,CAAwC,EAC9C,CAAC,OAAO,CAAC,QAAQ,CAAC,CACnB;;AAGD,IAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,QAAA,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC;AAC7D,QAAA,QACEH,cAAA,CAACC,eAAO,EAAA,EACN,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,MAAM,EAC9B,WAAW,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,WAAW,EAAA,CACjC;IAEN;IAEA,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,EAAE;AAC9D,QAAA,OAAO,CAAC,IAAI,CACV,0BAAA,CAAA,MAAA,CAA2B,aAAa,EAAA,eAAA,CAAA,CAAA,MAAA,CAAgB,aAAa,CAAC,MAAM,GAAG,CAAC,CAC9E,CACH;;AAGD,QAAA,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,EAAE;AACzC,YAAA,QACED,cAAA,CAACC,eAAO,EAAA,EACN,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,MAAM,EAC9B,WAAW,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,WAAW,EACjC,aAAa,EAAE,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,eAAe,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,EAC5D,gBAAgB,EAAE,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,eAAe,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,YAAY,EAAA,CAClE;QAEN;;AAGA,QAAA,IAAI,aAAa,GAAG,CAAC,EAAE;AACrB,YAAA,UAAU,CAAC,YAAA,EAAM,OAAA,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAArB,CAAqB,EAAE,CAAC,CAAC;AAC1C,YAAA,OAAOD,cAAA,CAACI,oBAAY,EAAA,EAAC,OAAO,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAC,EAAE,GAAG;QACjE;IACF;;AAGA,IAAA,IAAM,IAAI,GAAG,aAAa,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,CAAC,KAAK,CACX,gBAAA,CAAA,MAAA,CAAiB,aAAa,EAAA,iCAAA,CAAiC,EAC/D,aAAa,CACd;QACD,QACEL,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC/EC,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,cAAA,EAAA,CAAS,EACpDA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAChD,CAAC,CAAC,uBAAuB,CAAC,EAAA,CACxB,EACLA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAC9B,CAAC,CAAC,+BAA+B,CAAC,EAAA,CACjC,EACJA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,iFAAiF,EAC3F,OAAO,EAAE,YAAA,EAAM,OAAA,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAArB,CAAqB,EAAA,QAAA,EAEnC,CAAC,CAAC,0BAA0B,CAAC,EAAA,CACvB,CAAA,EAAA,CACL;IAEV;AAEA,IAAA,QAAQ,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;AAC7C,YAAA,QACEA,cAAA,CAACC,eAAO,EAAA,EACN,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,MAAM,EAC9B,WAAW,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,EACjC,SAAS,EAAE,IAAI,CAAC,EAAE,EAClB,cAAc,EAAE,IAAI,CAAC,cAAc,EACnC,aAAa,EAAE,MAAA,CAAA,EAAA,GAAA,OAAO,KAAA,IAAA,IAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,eAAe,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,EAC5D,gBAAgB,EAAE,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,QAAQ,0CAAE,eAAe,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,YAAY,EAAA,CAClE;QAGN,KAAK,mBAAmB,EAAE;;;;;AAKxB,YAAA,IAAM,aAAW,GAAG,aAAa,GAAG,CAAC;AACrC,YAAA,IAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,UAAC,CAAC,EAAA,EAAK,OAAA,CAAC,KAAK,aAAW,CAAA,CAAjB,CAAiB,CAAC,CAAC,MAAM;AACtE,YAAA,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;;;;;;;;AAS5C,YAAA,IAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAC3B,CAAA,EAAA,GAAC,OAAO,CAAC,SAAqC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,CACtD;YACD,IAAI,gBAAgB,SAAW;YAC/B,IAAI,OAAO,EAAE;gBACX,IAAM,OAAO,GAAGI,gCAAiB,CAC/B,OAAO,CAAC,SAAoC,EAC5C,QAAQ,CACT;gBACD,gBAAgB,IAAI,OAAO,KAAA,IAAA,IAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAc;YACjD;iBAAO;gBACL,gBAAgB,GAAG,SAAS;YAC9B;YACA;;;;;AAKE,YAAAL,cAAA,CAACM,qBAAa,EAAA,EAEZ,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EAAA,EARf,IAAI,CAAC,EAAE,CASZ;QAEN;QAEA,KAAK,qBAAqB,EAAE;YAC1B,QACEN,cAAA,CAACO,0BAAkB,EAAA,EAEjB,IAAI,EAAE,IAA8B,EACpC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,cAAc,EAAE,cAAc,EAC9B,oBAAoB,EAAE,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,EAAE,GAAG,CACzD,UAAC,OAAY,IAAK,QAAAC,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EACb,OAAO,CAAA,EAAA,EACV,IAAI,EACF,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;AAC9B,wBAAA,OAAO,OAAO,CAAC,IAAI,KAAK;0BACrB,OAAO,CAAC;0BACT,SAAS,EAAA,CAAA,EACf,CAPgB,CAOhB,CACH,EACD,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,IAAI,CAAC,UAAU,CAAC,EAC/D,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EACzC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EACzC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB,EAAA,EApBhD,yBAAkB,aAAa,CAAE,CAqBtC;QAEN;AAEA,QAAA,KAAK,oBAAoB;QACzB,KAAK,cAAc,EAAE;AACnB,YAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC9B,gBAAA,OAAO,CAAC,KAAK,CACX,0DAA0D,EAC1D,IAAI,CACL;gBACD,QACET,yBAAK,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC/EC,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,6BAAS,EACpDA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,qCAAqC,wCAE9C,EACLA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oBAAoB,0FAE7B,EACJA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,iFAAiF,EAC3F,OAAO,EAAE,cAAM,OAAA,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAArB,CAAqB,EAAA,QAAA,EAAA,aAAA,EAAA,CAG7B,CAAA,EAAA,CACL;YAEV;;YAGA,IAAM,QAAQ,GACZ,yDAAyD,CAAC,IAAI,CAC5D,SAAS,CAAC,SAAS,CACpB;AAEH,YAAA,QACEA,cAAA,CAACS,qBAAa,EAAA,EAEZ,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAA2B,EACjC,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,IAAI,CAAC,oBAAoB,EACzC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EACzC,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,gBAAgB,IAAI,QAAQ,EAC7C,oBAAoB,EAClB,IAAI,CAAC,oBAAoB,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EAEtD,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,IAbrB,YAAA,CAAA,MAAA,CAAa,aAAa,CAAE,CAcjC;;QAGN;AAEA,QAAA,KAAK,mBAAmB;AACxB,QAAA,KAAK,gBAAgB;YACnB,QACET,cAAA,CAACU,cAAM,EAAA,EAEL,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAA,EAJrB,SAAA,CAAA,MAAA,CAAU,aAAa,CAAE,CAK9B;AAGN,QAAA,KAAK,sBAAsB;YACzB,QACEV,eAACW,2BAAmB,EAAA,EAElB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,WAAW,EAAE,IAAI,CAAC,WAAW;;;AAG7B,gBAAA,WAAW,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,EAAE,EAC3D,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EAAA,EAVnB,YAAA,CAAA,MAAA,CAAa,aAAa,CAAE,CAWjC;AAGN,QAAA,KAAK,eAAe;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC;AAC5D,YAAA,OAAOX,eAACY,2BAAmB,EAAA,EAAC,UAAU,EAAE,cAAc,GAAI;AAE5D,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC;AAC1D,YAAA,OAAOZ,eAACa,yBAAiB,EAAA,EAAC,UAAU,EAAE,cAAc,GAAI;AAE1D,QAAA,KAAK,WAAW;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC;AACvE,YAAA,QACEb,cAAA,CAACc,4BAAoB,EAAA,EACnB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EAAA,CACxB;AAGN,QAAA,KAAK,uBAAuB;AAC1B,YAAA,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC;YAChE,QACEd,cAAA,CAACe,uCAA+B,EAAA,EAC9B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,YAAA,EAAM,OAAA,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAlD,CAAkD,EAChE,UAAU,EAAE,YAAA,EAAM,OAAA,UAAU,CAAC,MAAM,EAAE,CAAA,CAAnB,CAAmB,EACrC,gBAAgB,EAAE,UAAC,MAAc,EAAA;AAC/B,oBAAA,IAAM,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,UAAC,CAAM,EAAA,EAAK,OAAA,CAAC,CAAC,EAAE,KAAK,MAAM,CAAA,CAAf,CAAe,CAAC;;;;oBAIhE,IAAI,GAAG,KAAK,EAAE;AAAE,wBAAA,UAAU,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC;;wBAC3C,UAAU,CAAC,MAAM,EAAE;gBAC1B,CAAC,EAAA,CACD;AAGN,QAAA,KAAK,gBAAgB;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC;AACtD,YAAA,QACEf,cAAA,CAACgB,qBAAa,EAAA,EAEZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EAAA,EALf,iBAAA,CAAA,MAAA,CAAkB,aAAa,CAAE,CAMtC;AAGN,QAAA,KAAK,eAAe;YAClB,QACEhB,eAACiB,wBAAgB,EAAA,EACf,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EAAA,CACtB;AAGN,QAAA,KAAK,QAAQ;;YAEX,QACElB,yBAAK,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC/EC,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,cAAA,EAAA,CAAS,EACrDA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,sCAAsC,EAAA,QAAA,EAAA,6BAAA,EAAA,CAE/C,EACLD,uBAAG,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAA,CAAA,yDAAA,EACc,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,EAAA,IAAA,CAAA,EAAA,CAChE,EACJA,yBAAK,SAAS,EAAC,+EAA+E,EAAA,QAAA,EAAA,CAC5FC,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,6BAAA,EAAA,CAE3C,EACJA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAC5C,IAAI,CAAC,SAAS,CACb;oCACE,EAAE,EAAE,IAAI,CAAC,EAAE;oCACX,KAAK,EAAE,IAAI,CAAC,KAAK;oCACjB,WAAW,EAAE,IAAI,CAAC,WAAW;oCAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;oCACrB,eAAe,EAAE,IAAI,CAAC,eAAe;AACtC,iCAAA,EACD,IAAI,EACJ,CAAC,CACF,EAAA,CACG,CAAA,EAAA,CACF,EACNA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,8EAA8E,EACxF,OAAO,EAAE,YAAA;AACP,4BAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC;4BACxC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC;wBACpD,CAAC,EAAA,QAAA,EAEA,CAAC,CAAC,2BAA2B,CAAC,EAAA,CACxB,CAAA,EAAA,CACL;AAGV,QAAA;YACE,OAAO,CAAC,IAAI,CAAC,8CAAA,CAAA,MAAA,CAAgC,IAAI,CAAC,IAAI,CAAE,EAAE,IAAI,CAAC;AAC/D,YAAA,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE;gBAC1C,KAAK;gBACL,mBAAmB;gBACnB,qBAAqB;gBACrB,oBAAoB;gBACpB,iBAAiB;gBACjB,cAAc;gBACd,gBAAgB;gBAChB,eAAe;gBACf,mBAAmB;gBACnB,kBAAkB;gBAClB,KAAK;gBACL,WAAW;gBACX,QAAQ;AACT,aAAA,CAAC;YACF,QACED,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kEAAkE,aAC/EC,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAAA,cAAA,EAAA,CAAS,EACvDA,uBAAI,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAAA,+BAAA,EAAA,CAEjD,EACLD,eAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAA,CAAA,yBAAA,EACb,IAAI,CAAC,IAAI,oCACzB,EACJC,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uEAAuE,EAAA,QAAA,EACpFA,kCAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAA,CAAO,EAAA,CACtC,EACNA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,iFAAiF,EAC3F,OAAO,EAAE,YAAA;4BACP,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC;wBACpD,CAAC,EAAA,QAAA,EAEA,CAAC,CAAC,2BAA2B,CAAC,EAAA,CACxB,CAAA,EAAA,CACL;;AAGd;;;;"}
|
|
1
|
+
{"version":3,"file":"TemplateNodeRenderer.js","sources":["../../../../../src/components/template/TemplateNodeRenderer.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport Selfie from \"../session/Selfie\";\nimport VideoWorkInProgress from \"../session/VideoWorkInProgress\";\nimport DocumentCheck, { NodeIdentityControl } from \"../session/DocumentCheck\";\nimport DocumentCollection, {\n DocumentTypeSide,\n NodeDocumentCollection,\n} from \"../document-collection/DocumentCollection\";\nimport EndFlow from \"../session/EndFlow\";\nimport LoadingState from \"../states/LoadingState\";\nimport JDDWorkInProgress from \"../jdi/JDDWorkInProgress\";\nimport { getOrderedJourneySteps, getRunPrefillData } from \"../../services/sessionService\";\nimport type { SessionData, stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\nimport type { ContactInfo } from \"../../types/contactInfo\";\nimport UserInputForm from \"../session/UserInputForm\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport ConditionNodeHandler from \"./ConditionNodeHandler\";\nimport SignatureElectronic from \"../signature-electronic/SignatureElectronic\";\nimport ExternalVerificationNodeHandler from \"./ExternalVerificationNodeHandler\";\nimport PdfGeneration from \"../session/PdfGeneration\";\nimport LegalConsentNode from \"../legal-consent/LegalConsentNode\";\n\ninterface TemplateNodeRendererProps {\n session: SessionData;\n sessionId: string;\n stepObject: stepObject;\n stepHistory: number[];\n templateIndex: number;\n onContinueOnPC: () => void;\n userInput: UserInput;\n setUserInput: React.Dispatch<React.SetStateAction<UserInput>>;\n contactInfo: ContactInfo;\n setContactInfo: React.Dispatch<React.SetStateAction<ContactInfo>>;\n isMobileTemplate: boolean;\n}\n\nconst TemplateNodeRenderer: React.FC<TemplateNodeRendererProps> = ({\n session,\n sessionId,\n stepObject,\n stepHistory,\n templateIndex,\n onContinueOnPC,\n userInput,\n setUserInput,\n contactInfo,\n setContactInfo,\n isMobileTemplate,\n}) => {\n const { t } = useI18n();\n\n if (!session?.template) {\n console.error(t(\"template.error.console_no_template\"));\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"template.error.configuration\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{t(\"template.error.no_template\")}</p>\n </div>\n );\n }\n\n // Check if session is ended before rendering nodes\n if (session.status === \"ended\") {\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session.status}\n callbackURL={session.callbackURL}\n compliantCase={session.template?.endScreenConfig?.compliant}\n nonCompliantCase={session.template?.endScreenConfig?.nonCompliant}\n />\n );\n }\n\n // Use getOrderedWorkflowSteps to get sorted and filtered nodes\n const templateNodes = useMemo(\n () => getOrderedJourneySteps(session.template),\n [session.template],\n );\n\n // Check if index is valid\n if (templateNodes.length === 0) {\n console.warn(\"No valid template nodes found after filtering\");\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n />\n );\n }\n\n if (templateIndex < 0 || templateIndex >= templateNodes.length) {\n console.warn(\n `Invalid template index: ${templateIndex}, max index: ${templateNodes.length - 1\n }`,\n );\n\n // If we're beyond the maximum index, it means we've completed all nodes\n if (templateIndex >= templateNodes.length) {\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n compliantCase={session?.template?.endScreenConfig?.compliant}\n nonCompliantCase={session?.template?.endScreenConfig?.nonCompliant}\n />\n );\n }\n\n // If index is negative, redirect to start\n if (templateIndex < 0) {\n setTimeout(() => stepObject.setStep(0), 0);\n return <LoadingState message={t(\"loading.step\")} subtitle=\"\" />;\n }\n }\n\n // At this point, we should have a valid node\n const node = templateNodes[templateIndex];\n if (!node) {\n console.error(\n `Node at index ${templateIndex} is undefined. Available nodes:`,\n templateNodes,\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"template.error.render\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\"template.error.node_not_found\")}\n </p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(0)}\n >\n {t(\"template.buttons.restart\")}\n </button>\n </div>\n );\n }\n\n switch (node.type) {\n case \"end\":\n console.log(\"📄 Rendering EndFlow component\");\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n endNodeId={node.id}\n expectedResult={node.expectedResult}\n compliantCase={session?.template?.endScreenConfig?.compliant}\n nonCompliantCase={session?.template?.endScreenConfig?.nonCompliant}\n />\n );\n\n case \"information-input\": {\n // runIndex = nombre de fois que ce step a déjà été visité dans l'historique\n // (0 = premier passage, 1 = deuxième, …).\n // On compte les occurrences de (templateIndex + 1) dans stepHistory,\n // minus 1 car le step courant est déjà dans l'historique.\n const currentStep = templateIndex + 1;\n const visitCount = stepHistory.filter((s) => s === currentStep).length;\n const runIndex = Math.max(0, visitCount - 1);\n\n // Pré-remplissage multi-ENTITÉS : si _list présent, utiliser _list[runIndex]\n // (ou {} hors borne). L'énumération de plusieurs entités successives passe\n // exclusivement par _list (cf. docs/multi-runs.md).\n // Sans _list : on pré-remplit TOUJOURS depuis le userInput persisté — y compris\n // sur une ré-entrée (boucle condition de correction, retour arrière, bouton\n // \"Corriger ma saisie\"). Une ré-entrée sans _list = corriger les MÊMES données,\n // pas en saisir de nouvelles → on ne doit pas vider le formulaire.\n const hasList = Array.isArray(\n (session.userInput as Record<string, unknown>)?._list,\n );\n let initialUserInput: UserInput;\n if (hasList) {\n const prefill = getRunPrefillData(\n session.userInput as Record<string, unknown>,\n runIndex,\n );\n initialUserInput = (prefill ?? {}) as UserInput;\n } else {\n initialUserInput = userInput;\n }\n return (\n // key={node.id} : remonte le formulaire à chaque changement de nœud, pour\n // qu'il se ré-initialise depuis initialUserInput (comportement \"refresh sans\n // refresh\"). Évite la réutilisation d'instance qui laissait customFormData\n // périmé au retour arrière entre deux nœuds information-input.\n <UserInputForm\n key={node.id}\n stepObject={stepObject}\n node={node}\n template={session.template}\n setUserInput={setUserInput}\n initialUserInput={initialUserInput}\n contactInfo={contactInfo}\n setContactInfo={setContactInfo}\n sessionId={sessionId}\n />\n );\n }\n\n case \"document-collection\": {\n return (\n <DocumentCollection\n key={`doc-collection-${templateIndex}`}\n node={node as NodeDocumentCollection}\n stepObject={stepObject}\n sessionId={sessionId}\n template={session.template}\n onContinueOnPC={onContinueOnPC}\n allowedDocumentTypes={(node.allowedDocumentTypes || []).map(\n (docType: any) => ({\n ...docType,\n side:\n typeof docType.side === \"string\" ||\n typeof docType.side === \"number\"\n ? (docType.side as DocumentTypeSide)\n : undefined,\n }),\n )}\n allowedAddingMethods={node.allowedAddingMethods || [\"download\"]}\n introductionPage={node.introductionPage}\n documentSelection={node.documentSelection}\n allowResubmission={node.allowResubmission}\n maxResubmissionAttempts={node.maxResubmissionAttempts}\n />\n );\n }\n\n case \"document-selection\":\n case \"controle-jdi\": {\n if (!node.requiredDocumentType) {\n console.error(\n \"Missing requiredDocumentType in document-selection node:\",\n node,\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n Erreur de configuration\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Le type de document requis n'est pas spécifié dans le template.\n </p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(0)}\n >\n Recommencer\n </button>\n </div>\n );\n }\n\n // Determine if current device is mobile for capture method\n const isMobile =\n /Android|iPhone|iPad|iPod|Opera Mini|IEMobile|WPDesktop/i.test(\n navigator.userAgent,\n );\n\n return (\n <DocumentCheck\n key={`doc-check-${templateIndex}`}\n stepObject={stepObject}\n node={node as NodeIdentityControl}\n sessionId={sessionId}\n documentTypeId={node.requiredDocumentType}\n acceptedCountries={node.acceptedCountries}\n onContinueOnPC={onContinueOnPC}\n isMobileCapture={isMobileTemplate && isMobile}\n allowedAddingMethods={\n node.allowedAddingMethods || [\"download\", \"picture\"]\n }\n template={session.template}\n templateIndex={templateIndex}\n setUserInput={setUserInput}\n />\n );\n // }\n }\n\n case \"biometric-capture\":\n case \"selfie-capture\":\n return (\n <Selfie\n key={`selfie-${templateIndex}`}\n stepObject={stepObject}\n sessionId={sessionId}\n node={node}\n template={session.template}\n />\n );\n\n case \"signature-electronic\":\n return (\n <SignatureElectronic\n key={`signature-${templateIndex}`}\n sessionId={sessionId}\n stepObject={stepObject}\n node={node}\n session={session}\n title={node.title}\n description={node.description}\n // Always pass a stable node identifier so backend can resolve\n // either a static DocuSeal template OR a generated PDF source.\n external_id={node.templateId || node.external_id || node.id}\n fieldMappings={node.fieldMappings}\n userInput={userInput}\n contactInfo={contactInfo}\n />\n );\n\n case \"video-capture\":\n console.log(\"🎥 Rendering Video Work in Progress component\");\n return <VideoWorkInProgress onContinue={onContinueOnPC} />;\n\n case \"jdd\":\n console.log(\"🚧 Rendering JDD Work in Progress component\");\n return <JDDWorkInProgress onContinue={onContinueOnPC} />;\n\n case \"condition\":\n console.debug(\"🔀 Rendering Condition Node Handler component and well\");\n return (\n <ConditionNodeHandler\n node={node}\n session={session}\n templateNodes={templateNodes}\n stepObject={stepObject}\n userInput={userInput}\n contactInfo={contactInfo}\n />\n );\n\n case \"external-verification\":\n console.debug(\"🔍 Rendering External Verification Node Handler\");\n return (\n <ExternalVerificationNodeHandler\n node={node}\n session={session}\n userInput={userInput}\n setUserInput={setUserInput}\n onNext={() => stepObject.goToNextStep(node.id, session.template)}\n onPrevious={() => stepObject.goBack()}\n onNavigateToNode={(nodeId: string) => {\n const idx = templateNodes.findIndex((n: any) => n.id === nodeId);\n // idx est 0-based, les steps sont 1-based → idx + 1.\n // goBackToStep tronque l'historique pour que le nœud corrigé\n // redevienne runIndex 0 (formulaire pré-rempli).\n if (idx !== -1) stepObject.goBackToStep(idx + 1);\n else stepObject.goBack();\n }}\n />\n );\n\n case \"pdf-generation\":\n console.debug(\"📄 Rendering PDF Generation component\");\n return (\n <PdfGeneration\n key={`pdf-generation-${templateIndex}`}\n node={node}\n session={session}\n sessionId={sessionId}\n stepObject={stepObject}\n userInput={userInput}\n />\n );\n\n case \"legal-consent\":\n return (\n <LegalConsentNode\n node={node}\n session={session}\n sessionId={sessionId}\n stepObject={stepObject}\n />\n );\n\n case \"custom\":\n // For custom nodes, we provide a basic structure that can be extended\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-blue-500 text-4xl mb-4\">🔧</div>\n <h2 className=\"text-xl font-bold text-blue-600 mb-2\">\n Nœud personnalisé\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Implémentation personnalisée requise pour: \"{node.title || node.id}\"\n </p>\n <div className=\"bg-blue-50 border border-blue-200 rounded p-3 text-left text-sm mb-4 max-w-md\">\n <p className=\"font-semibold text-blue-700 mb-2\">\n Configuration du nœud:\n </p>\n <pre className=\"text-xs overflow-auto max-h-32\">\n {JSON.stringify(\n {\n id: node.id,\n title: node.title,\n description: node.description,\n options: node.options,\n selectedOptions: node.selectedOptions,\n },\n null,\n 2,\n )}\n </pre>\n </div>\n <button\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n onClick={() => {\n console.log(\"Custom node action:\", node);\n stepObject.goToNextStep(node.id, session.template);\n }}\n >\n {t(\"template.buttons.continue\")}\n </button>\n </div>\n );\n\n default:\n console.warn(`❌ Type de nœud non supporté: ${node.type}`, node);\n console.log(\"❓ Available supported types:\", [\n \"end\",\n \"information-input\",\n \"document-collection\",\n \"document-selection\",\n \"document-upload\",\n \"controle-jdi\",\n \"selfie-capture\",\n \"video-capture\",\n \"country-selection\",\n \"identity-control\",\n \"jdd\",\n \"condition\",\n \"custom\",\n ]);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-yellow-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-yellow-600 mb-2\">\n Étape non supportée\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Le type d'étape \"{node.type}\" n'est pas pris en charge.\n </p>\n <div className=\"bg-gray-100 p-4 rounded mb-4 text-left text-xs overflow-auto max-h-32\">\n <pre>{JSON.stringify(node, null, 2)}</pre>\n </div>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => {\n stepObject.goToNextStep(node.id, session.template);\n }}\n >\n {t(\"template.buttons.continue\")}\n </button>\n </div>\n );\n }\n};\n\nexport default TemplateNodeRenderer;\n"],"names":["useI18n","_jsxs","_jsx","EndFlow","useMemo","getOrderedJourneySteps","LoadingState","getRunPrefillData","UserInputForm","DocumentCollection","__assign","DocumentCheck","Selfie","SignatureElectronic","VideoWorkInProgress","JDDWorkInProgress","ConditionNodeHandler","ExternalVerificationNodeHandler","PdfGeneration","LegalConsentNode"],"mappings":"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"}
|
package/dist/cjs/i18n/en.json.js
CHANGED
|
@@ -335,6 +335,8 @@ var LEGAL_CONSENT = {
|
|
|
335
335
|
default_checkbox: "I accept the terms and conditions.",
|
|
336
336
|
default_cgu_url: "https://www.datakeen.co/conditions-generales-dutilisation/",
|
|
337
337
|
default_privacy_url: "https://www.datakeen.co/regles-de-confidentialite/",
|
|
338
|
+
default_cgu_link_label: "terms of use",
|
|
339
|
+
default_privacy_link_label: "privacy policy",
|
|
338
340
|
error: {
|
|
339
341
|
required: "You must accept the terms to continue.",
|
|
340
342
|
general: "An error occurred while updating the session. Please try again.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/cjs/i18n/fr.json.js
CHANGED
|
@@ -335,6 +335,8 @@ var LEGAL_CONSENT = {
|
|
|
335
335
|
default_checkbox: "J'accepte les conditions générales d'utilisation.",
|
|
336
336
|
default_cgu_url: "https://www.datakeen.co/conditions-generales-dutilisation/",
|
|
337
337
|
default_privacy_url: "https://www.datakeen.co/regles-de-confidentialite/",
|
|
338
|
+
default_cgu_link_label: "conditions générales d'utilisation",
|
|
339
|
+
default_privacy_link_label: "politique de confidentialité",
|
|
338
340
|
error: {
|
|
339
341
|
required: "Vous devez accepter les conditions pour continuer.",
|
|
340
342
|
general: "Une erreur est survenue lors de la mise à jour de la session. Veuillez réessayer.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sources":["../../../../src/types/session.ts"],"sourcesContent":["import type React from \"react\";\n\nexport interface SessionConfig {\n selfie?: boolean;\n requireMobile?: boolean;\n}\n\nexport interface DatakeenSessionProps {\n sessionId: string;\n sessionConfig?: SessionConfig;\n apiBaseUrl?: string; // Optional API base URL for dynamic environment configuration\n}\n\nexport interface UseSessionReturn {\n SessionComponent: React.ReactElement;\n}\n\nexport type stepObject = {\n setStep: (step: number) => void;\n goBack: () => void;\n /** Retour arrière vers un nœud précis (ex: \"Corriger ma saisie\") :\n * tronque l'historique jusqu'à `targetStep` au lieu de l'empiler. */\n goBackToStep: (targetStep: number) => void;\n goToNextStep: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n step: number;\n canGoBack: boolean;\n};\n\nexport interface ProcessingStep {\n title: string;\n subtitle: string;\n hasError?: boolean;\n}\n\nexport type ConditionTokenType = \"variable\" | \"control\" | \"operator\" | \"input\";\n\nexport interface ConditionToken {\n type: ConditionTokenType;\n value: string;\n label?: string;\n sourceNodeId?: string;\n}\n\n/**\n * Type for custom field value types\n */\nexport type CustomFieldValueType =\n | \"text\"\n | \"enum\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"email\"\n | \"address\"\n | \"list\";\n\n/**\n * Display formats supported for date fields (top-level and list columns).\n */\nexport type DateDisplayFormat = \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy-mm-dd\";\n\nexport const DEFAULT_DATE_DISPLAY_FORMAT: DateDisplayFormat = \"dd/mm/yyyy\";\n\n/**\n * Column definition for a list-type custom field\n */\nexport interface ListColumn {\n label: string;\n type: \"text\" | \"enum\" | \"date\" | \"email\";\n options?: string[]; // required when type === 'enum'\n placeholder?: string; // text/email/date — shown to the end user\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n}\n\n/**\n * Interface for custom field definition\n */\nexport interface CustomField {\n id: string;\n label: string;\n placeholder?: string;\n description?: string;\n valueType: CustomFieldValueType;\n enumOptions?: string[];\n listColumns?: ListColumn[]; // for list type: column definitions\n minRows?: number; // for list type: minimum rows expected\n required?: boolean;\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n lockedFromApi?: boolean;\n userInputKey?: string;\n}\n\n/**\n * Interface for session template node\n */\nexport interface SessionTemplateNode {\n id: string;\n type: string;\n title: string;\n description: string;\n informationType?:\n | \"identity\"\n | \"identity-legal\"\n | \"contact\"\n | \"address\"\n | \"nationality\"\n | \"custom\";\n position: {\n x: number;\n y: number;\n };\n options: unknown[];\n selectedOptions: string[];\n requiredDocumentType?: string;\n isRequired: boolean;\n order: number;\n optionalFields?: string[];\n requiredFields?: string[];\n pageTitle?: string;\n pageDescription?: string;\n // Properties for document-collection node type\n allowedDocumentTypes?: Array<{\n id: string;\n name: string;\n /**\n * Optional side information coming from the template.\n * When provided and equals to two (\"two\", 2, \"double\", \"recto-verso\"),\n * consumers should allow uploading two sides (front/back).\n */\n side?: string | number;\n }>;\n allowedAddingMethods?: string[];\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n // Start node specific properties\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n qrCodeTitle?: string;\n qrCodeDescription?: string;\n showLegacyCGU?: boolean; // default: true — rétrocompatibilité\n\n // Legal consent node specific properties\n consentDescription?: string;\n consentDescription2?: string;\n cguUrl?: string;\n privacyPolicyUrl?: string;\n checkboxText?: string;\n // Identity control specific properties\n automaticPhotoCapture?: boolean;\n acceptedCountries?: AcceptedCountry[];\n // End node specific properties\n callbackURL?: string | null;\n // Résultat forcé par le nœud `end` (configuré dans le builder). Sert au SDK à\n // afficher la variante « erreur conservée » de l'écran de fin quand la branche\n // fausse d'une condition pointe directement vers un end non_compliant.\n expectedResult?: string;\n // Condition node specific properties\n conditionExpression?: string;\n conditionTokens?: ConditionToken[];\n conditionFalseErrorMessage?: string;\n conditionMaxRetries?: number;\n conditionMaxRetryAction?: \"end-journey\" | \"force-true\";\n conditionFalseMode?: \"retry\" | \"loop\";\n\n // External verification specific properties\n targetApi?: \"INSEE\";\n referenceNodeId?: string;\n referenceNodeType?:\n | \"information-input\"\n | \"document-collection\"\n | \"identity-control\";\n referenceField?: \"siren\" | \"siret\";\n referenceVariable?: string;\n // Custom form fields (for information-input with type 'custom')\n customFields?: CustomField[];\n\n // Electronic signature specific properties\n templateId?: string;\n external_id?: string;\n fieldMappings?: Array<{\n sourceFieldId: string;\n label: string;\n docusealType: string;\n readonly: boolean;\n role?: string;\n sourceNodeId?: string;\n }>;\n /** If set, the generated PDF from this upstream pdf-generation node will be used as the document to sign */\n sourcePdfNodeId?: string;\n\n // PDF generation node specific properties\n // Note: htmlTemplate is intentionally NOT included — it is server-side only and never sent to the client\n pdfMode?: \"upload\" | \"html-template\";\n sourceNodeIds?: string[];\n\n // retry properties\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\n/**\n * Interface for accepted countries\n */\nexport interface AcceptedCountry {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n driverLicense: string[];\n residencePermit: string[];\n pinkDriverLicense: string[];\n };\n}\n\n/**\n * Interface for session template edge\n */\nexport interface SessionTemplateEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n conditionValue?: string;\n}\n\n/**\n * Interface for platform information\n */\nexport interface PlatformInfo {\n mobile: boolean;\n desktop: boolean;\n backoffice: boolean;\n}\n\n/**\n * Interface for session template\n */\n/** Clé du catalogue d'icônes des écrans de fin (mappée vers lucide-react au rendu). */\nexport type EndScreenIcon =\n | \"thanks\"\n | \"send\"\n | \"mail\"\n | \"check\"\n | \"clock\"\n | \"shield\"\n | \"user\"\n | \"info\";\n\nexport interface EndScreenItem {\n icon: EndScreenIcon;\n text: string;\n}\n\nexport interface EndScreenCase {\n title?: string;\n items: EndScreenItem[];\n}\n\n/** Textes de fin personnalisés (config globale du journey). Vide → fallback standard. */\nexport interface EndScreenConfig {\n compliant?: EndScreenCase;\n nonCompliant?: EndScreenCase;\n}\n\nexport interface SessionTemplate {\n id: string;\n name: string;\n description: string;\n version: string;\n languages: string[];\n nodes: SessionTemplateNode[];\n edges: SessionTemplateEdge[];\n groupId: string;\n userId: string | null;\n created_at: string;\n updated_at: string;\n platforms?: PlatformInfo;\n logo?: string;\n showQRCode?: boolean;\n buttonBgColor?: string;\n buttonTextColor?: string;\n endScreenConfig?: EndScreenConfig;\n}\n\n/**\n * Interface for session data\n */\nexport interface SessionData {\n id: string;\n userId: string | null;\n token: string;\n templateId: string;\n templateKey: string;\n expireTime: number;\n status: string;\n result: Record<string, unknown>;\n landingPage: unknown;\n withSelfie: boolean | null;\n groupId: string | null;\n userInput: Record<string, unknown>;\n contactInfo?: {\n email: string;\n phoneNumber: string;\n };\n callbackURL?: string | null;\n webhookURL: string;\n analysisTemplateId: string | null;\n userAgent: unknown[];\n mobile: boolean;\n analysisId: string | null;\n currentStep?: number;\n createdAt: string;\n updatedAt: string;\n auditTrail: unknown[];\n user: unknown | null;\n analysis: unknown[];\n documents: unknown[];\n template: SessionTemplate;\n retryCounts?: Record<string, number>; // nodeId -> retry count\n}\n\nexport interface ClientInfo {\n ip?: string;\n location?: string;\n device: string;\n browser: string;\n os: string;\n}\n"],"names":[],"mappings":";;AAiEO,IAAM,2BAA2B,GAAsB;;;;"}
|
|
1
|
+
{"version":3,"file":"session.js","sources":["../../../../src/types/session.ts"],"sourcesContent":["import type React from \"react\";\n\nexport interface SessionConfig {\n selfie?: boolean;\n requireMobile?: boolean;\n}\n\nexport interface DatakeenSessionProps {\n sessionId: string;\n sessionConfig?: SessionConfig;\n apiBaseUrl?: string; // Optional API base URL for dynamic environment configuration\n}\n\nexport interface UseSessionReturn {\n SessionComponent: React.ReactElement;\n}\n\nexport type stepObject = {\n setStep: (step: number) => void;\n goBack: () => void;\n /** Retour arrière vers un nœud précis (ex: \"Corriger ma saisie\") :\n * tronque l'historique jusqu'à `targetStep` au lieu de l'empiler. */\n goBackToStep: (targetStep: number) => void;\n goToNextStep: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n step: number;\n canGoBack: boolean;\n};\n\nexport interface ProcessingStep {\n title: string;\n subtitle: string;\n hasError?: boolean;\n}\n\nexport type ConditionTokenType = \"variable\" | \"control\" | \"operator\" | \"input\";\n\nexport interface ConditionToken {\n type: ConditionTokenType;\n value: string;\n label?: string;\n sourceNodeId?: string;\n}\n\n/**\n * Type for custom field value types\n */\nexport type CustomFieldValueType =\n | \"text\"\n | \"enum\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"email\"\n | \"address\"\n | \"list\";\n\n/**\n * Display formats supported for date fields (top-level and list columns).\n */\nexport type DateDisplayFormat = \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy-mm-dd\";\n\nexport const DEFAULT_DATE_DISPLAY_FORMAT: DateDisplayFormat = \"dd/mm/yyyy\";\n\n/**\n * Column definition for a list-type custom field\n */\nexport interface ListColumn {\n label: string;\n type: \"text\" | \"enum\" | \"date\" | \"email\";\n options?: string[]; // required when type === 'enum'\n placeholder?: string; // text/email/date — shown to the end user\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n}\n\n/**\n * Interface for custom field definition\n */\nexport interface CustomField {\n id: string;\n label: string;\n placeholder?: string;\n description?: string;\n valueType: CustomFieldValueType;\n enumOptions?: string[];\n listColumns?: ListColumn[]; // for list type: column definitions\n minRows?: number; // for list type: minimum rows expected\n required?: boolean;\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n lockedFromApi?: boolean;\n editableIfMissing?: boolean; // soft lock — éditable si la valeur API est absente\n userInputKey?: string;\n}\n\n/**\n * Interface for session template node\n */\nexport interface SessionTemplateNode {\n id: string;\n type: string;\n title: string;\n description: string;\n informationType?:\n | \"identity\"\n | \"identity-legal\"\n | \"contact\"\n | \"address\"\n | \"nationality\"\n | \"custom\";\n position: {\n x: number;\n y: number;\n };\n options: unknown[];\n selectedOptions: string[];\n requiredDocumentType?: string;\n isRequired: boolean;\n order: number;\n optionalFields?: string[];\n requiredFields?: string[];\n pageTitle?: string;\n pageDescription?: string;\n // Properties for document-collection node type\n allowedDocumentTypes?: Array<{\n id: string;\n name: string;\n /**\n * Optional side information coming from the template.\n * When provided and equals to two (\"two\", 2, \"double\", \"recto-verso\"),\n * consumers should allow uploading two sides (front/back).\n */\n side?: string | number;\n }>;\n allowedAddingMethods?: string[];\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n // Start node specific properties\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n qrCodeTitle?: string;\n qrCodeDescription?: string;\n showLegacyCGU?: boolean; // default: true — rétrocompatibilité\n\n // Legal consent node specific properties\n consentDescription?: string;\n consentDescription2?: string;\n cguUrl?: string;\n privacyPolicyUrl?: string;\n cguLinkLabel?: string;\n privacyLinkLabel?: string;\n checkboxText?: string;\n // Identity control specific properties\n automaticPhotoCapture?: boolean;\n acceptedCountries?: AcceptedCountry[];\n // End node specific properties\n callbackURL?: string | null;\n // Résultat forcé par le nœud `end` (configuré dans le builder). Sert au SDK à\n // afficher la variante « erreur conservée » de l'écran de fin quand la branche\n // fausse d'une condition pointe directement vers un end non_compliant.\n expectedResult?: string;\n // Condition node specific properties\n conditionExpression?: string;\n conditionTokens?: ConditionToken[];\n conditionFalseErrorMessage?: string;\n conditionMaxRetries?: number;\n conditionMaxRetryAction?: \"end-journey\" | \"force-true\";\n // Undefined is treated as \"loop\" by the SDK for legacy templates.\n conditionFalseMode?: \"retry\" | \"loop\";\n\n // External verification specific properties\n targetApi?: \"INSEE\";\n referenceNodeId?: string;\n referenceNodeType?:\n | \"information-input\"\n | \"document-collection\"\n | \"identity-control\";\n referenceField?: \"siren\" | \"siret\";\n referenceVariable?: string;\n // Custom form fields (for information-input with type 'custom')\n customFields?: CustomField[];\n\n // Electronic signature specific properties\n templateId?: string;\n external_id?: string;\n fieldMappings?: Array<{\n sourceFieldId: string;\n label: string;\n docusealType: string;\n readonly: boolean;\n role?: string;\n sourceNodeId?: string;\n }>;\n /** If set, the generated PDF from this upstream pdf-generation node will be used as the document to sign */\n sourcePdfNodeId?: string;\n\n // PDF generation node specific properties\n // Note: htmlTemplate is intentionally NOT included — it is server-side only and never sent to the client\n pdfMode?: \"upload\" | \"html-template\";\n sourceNodeIds?: string[];\n\n // retry properties\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\n/**\n * Interface for accepted countries\n */\nexport interface AcceptedCountry {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n driverLicense: string[];\n residencePermit: string[];\n pinkDriverLicense: string[];\n };\n}\n\n/**\n * Interface for session template edge\n */\nexport interface SessionTemplateEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n conditionValue?: string;\n}\n\n/**\n * Interface for platform information\n */\nexport interface PlatformInfo {\n mobile: boolean;\n desktop: boolean;\n backoffice: boolean;\n}\n\n/**\n * Interface for session template\n */\n/** Clé du catalogue d'icônes des écrans de fin (mappée vers lucide-react au rendu). */\nexport type EndScreenIcon =\n | \"thanks\"\n | \"send\"\n | \"mail\"\n | \"check\"\n | \"clock\"\n | \"shield\"\n | \"user\"\n | \"info\";\n\nexport interface EndScreenItem {\n icon: EndScreenIcon;\n text: string;\n}\n\nexport interface EndScreenCase {\n title?: string;\n items: EndScreenItem[];\n}\n\n/** Textes de fin personnalisés (config globale du journey). Vide → fallback standard. */\nexport interface EndScreenConfig {\n compliant?: EndScreenCase;\n nonCompliant?: EndScreenCase;\n}\n\nexport interface SessionTemplate {\n id: string;\n name: string;\n description: string;\n version: string;\n languages: string[];\n nodes: SessionTemplateNode[];\n edges: SessionTemplateEdge[];\n groupId: string;\n userId: string | null;\n created_at: string;\n updated_at: string;\n platforms?: PlatformInfo;\n logo?: string;\n showQRCode?: boolean;\n buttonBgColor?: string;\n buttonTextColor?: string;\n endScreenConfig?: EndScreenConfig;\n}\n\n/**\n * Interface for session data\n */\nexport interface SessionData {\n id: string;\n userId: string | null;\n token: string;\n templateId: string;\n templateKey: string;\n expireTime: number;\n status: string;\n result: Record<string, unknown>;\n landingPage: unknown;\n withSelfie: boolean | null;\n groupId: string | null;\n userInput: Record<string, unknown>;\n contactInfo?: {\n email: string;\n phoneNumber: string;\n };\n callbackURL?: string | null;\n webhookURL: string;\n analysisTemplateId: string | null;\n userAgent: unknown[];\n mobile: boolean;\n analysisId: string | null;\n currentStep?: number;\n createdAt: string;\n updatedAt: string;\n auditTrail: unknown[];\n user: unknown | null;\n analysis: unknown[];\n documents: unknown[];\n template: SessionTemplate;\n retryCounts?: Record<string, number>; // nodeId -> retry count\n}\n\nexport interface ClientInfo {\n ip?: string;\n location?: string;\n device: string;\n browser: string;\n os: string;\n}\n"],"names":[],"mappings":";;AAiEO,IAAM,2BAA2B,GAAsB;;;;"}
|
|
@@ -4,6 +4,9 @@ var tslib_es6 = require('../node_modules/tslib/tslib.es6.js');
|
|
|
4
4
|
|
|
5
5
|
var LOGICAL_OPERATORS = new Set(["&&", "||"]);
|
|
6
6
|
var COMPARISON_OPERATORS = new Set(["==", "===", "!=", "!==", ">", ">=", "<", "<="]);
|
|
7
|
+
// Valeurs sentinelles reconnues comme opérande droite pour tester la présence d'une valeur.
|
|
8
|
+
// Syntaxe builder : « variable == isEmpty » ou « variable != isEmpty »
|
|
9
|
+
var PRESENCE_SENTINELS = new Set(["isEmpty", "isNotEmpty"]);
|
|
7
10
|
var parseConditionExpression = function (expression) {
|
|
8
11
|
if (!expression) {
|
|
9
12
|
return [];
|
|
@@ -12,7 +15,7 @@ var parseConditionExpression = function (expression) {
|
|
|
12
15
|
if (!cleanedExpression) {
|
|
13
16
|
return [];
|
|
14
17
|
}
|
|
15
|
-
var regex = /(
|
|
18
|
+
var regex = /(===|!==|==|!=|<=|>=|&&|\|\||<|>)|("(?:[^"\\]|\\.)*")|([^\s]+)/g;
|
|
16
19
|
var tokens = [];
|
|
17
20
|
var match;
|
|
18
21
|
while ((match = regex.exec(cleanedExpression)) !== null) {
|
|
@@ -117,6 +120,19 @@ var evaluateComparison = function (term, context) {
|
|
|
117
120
|
return false;
|
|
118
121
|
}
|
|
119
122
|
var leftValue = resolveTokenValue(term.left, context);
|
|
123
|
+
// Sentinel « isEmpty » / « isNotEmpty » en opérande droite — teste la présence de la valeur gauche.
|
|
124
|
+
// Syntaxe : « variable == isEmpty » → vide ; « variable != isEmpty » → non vide.
|
|
125
|
+
// De même avec « variable == isNotEmpty » / « variable != isNotEmpty » (sens inversé).
|
|
126
|
+
if (term.right && PRESENCE_SENTINELS.has(term.right.value)) {
|
|
127
|
+
var empty = isEmptyValue(leftValue);
|
|
128
|
+
var sentinelMeansEmpty = term.right.value === "isEmpty";
|
|
129
|
+
if (term.operator === "==" || term.operator === "===") {
|
|
130
|
+
return sentinelMeansEmpty ? empty : !empty;
|
|
131
|
+
}
|
|
132
|
+
if (term.operator === "!=" || term.operator === "!==") {
|
|
133
|
+
return sentinelMeansEmpty ? !empty : empty;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
120
136
|
var rightValue = resolveTokenValue(term.right, context);
|
|
121
137
|
if (leftValue === undefined || rightValue === undefined) {
|
|
122
138
|
console.warn("[EvaluateComparison] Undefined value - left:", leftValue, "right:", rightValue);
|
|
@@ -179,6 +195,15 @@ var isTruthy = function (value) {
|
|
|
179
195
|
return false;
|
|
180
196
|
return true;
|
|
181
197
|
};
|
|
198
|
+
var isEmptyValue = function (value) {
|
|
199
|
+
if (value === null || value === undefined)
|
|
200
|
+
return true;
|
|
201
|
+
if (typeof value === "string")
|
|
202
|
+
return value.trim() === "";
|
|
203
|
+
if (Array.isArray(value))
|
|
204
|
+
return value.length === 0;
|
|
205
|
+
return false;
|
|
206
|
+
};
|
|
182
207
|
var resolveTokenValue = function (token, context) {
|
|
183
208
|
switch (token.type) {
|
|
184
209
|
case "input":
|
|
@@ -439,7 +464,7 @@ var compareValues = function (left, right, comparator) {
|
|
|
439
464
|
return false;
|
|
440
465
|
};
|
|
441
466
|
var determineOperandType = function (value) {
|
|
442
|
-
if (isBooleanLiteral(value) || isNumericLiteral(value)) {
|
|
467
|
+
if (isBooleanLiteral(value) || isNumericLiteral(value) || PRESENCE_SENTINELS.has(value)) {
|
|
443
468
|
return "input";
|
|
444
469
|
}
|
|
445
470
|
return "variable";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditionEvaluator.js","sources":["../../../../src/utils/conditionEvaluator.ts"],"sourcesContent":["import type { ConditionToken, ConditionTokenType, SessionData } from \"../types/session\";\nimport type { UserInput } from \"../types/userInput\";\nimport type { ContactInfo } from \"../types/contactInfo\";\n\nexport interface ConditionEvaluationContext {\n session: SessionData;\n userInput?: UserInput | Record<string, unknown>;\n contactInfo?: ContactInfo | Record<string, unknown>;\n}\n\nconst LOGICAL_OPERATORS = new Set([\"&&\", \"||\"]);\nconst COMPARISON_OPERATORS = new Set([\"==\", \"===\", \"!=\", \"!==\", \">\", \">=\", \"<\", \"<=\"]);\n\ninterface ComparisonTerm {\n left?: ConditionToken;\n operator?: string;\n right?: ConditionToken;\n}\n\nexport const parseConditionExpression = (expression?: string): ConditionToken[] => {\n if (!expression) {\n return [];\n }\n\n const cleanedExpression = expression.replace(/\\s+/g, \" \").trim();\n if (!cleanedExpression) {\n return [];\n }\n\n const regex = /(===|!==|==|!=|<=|>=|\\&\\&|\\|\\||<|>)|(\"(?:[^\"\\\\]|\\\\.)*\")|([^\\s]+)/g;\n const tokens: ConditionToken[] = [];\n let match: RegExpExecArray | null;\n while ((match = regex.exec(cleanedExpression)) !== null) {\n const value = match[0];\n\n if (LOGICAL_OPERATORS.has(value) || COMPARISON_OPERATORS.has(value)) {\n tokens.push({ type: \"operator\", value });\n } else {\n const isQuoted = value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\");\n const literal = isQuoted ? value.slice(1, -1) : value;\n const tokenType: ConditionTokenType = isQuoted\n ? \"input\"\n : determineOperandType(literal);\n tokens.push({ type: tokenType, value: literal });\n }\n }\n\n return tokens;\n};\n\nexport const evaluateConditionTokens = (\n tokens: ConditionToken[] = [],\n context: ConditionEvaluationContext\n): boolean => {\n if (!tokens || tokens.length === 0) {\n console.warn(\"[ConditionEvaluator] No tokens provided\");\n return false;\n }\n\n const { terms, logicalOperators } = buildComparisonTerms(tokens);\n\n if (terms.length === 0) {\n console.warn(\"[ConditionEvaluator] No comparison terms built\");\n return false;\n }\n\n const termResults = terms.map((term) => evaluateComparison(term, context));\n\n if (termResults.length === 1) {\n return termResults[0];\n }\n\n const finalResult = termResults.reduce((acc, result, index) => {\n if (index === 0) {\n return result;\n }\n const logicalOperator = logicalOperators[index - 1] || \"&&\";\n return logicalOperator === \"||\" ? acc || result : acc && result;\n }, true);\n\n return finalResult;\n};\n\nconst buildComparisonTerms = (tokens: ConditionToken[]) => {\n const terms: ComparisonTerm[] = [];\n const logicalOperators: string[] = [];\n let currentTerm: ComparisonTerm = {};\n\n tokens.forEach((token) => {\n if (token.type === \"operator\") {\n if (LOGICAL_OPERATORS.has(token.value)) {\n // If we have a left operand without comparison operator, treat it as a boolean term\n if (currentTerm.left && !currentTerm.operator) {\n terms.push({ left: currentTerm.left, operator: \"truthy\", right: undefined });\n logicalOperators.push(token.value);\n currentTerm = {};\n } else if (currentTerm.left && currentTerm.operator && currentTerm.right) {\n terms.push(currentTerm);\n logicalOperators.push(token.value);\n currentTerm = {};\n }\n } else if (COMPARISON_OPERATORS.has(token.value)) {\n currentTerm.operator = token.value;\n }\n } else {\n if (!currentTerm.left) {\n currentTerm.left = token;\n } else if (!currentTerm.right) {\n currentTerm.right = token;\n } else {\n currentTerm = { left: token };\n }\n }\n });\n\n // Handle the last term\n if (currentTerm.left) {\n if (!currentTerm.operator) {\n terms.push({ left: currentTerm.left, operator: \"truthy\", right: undefined });\n } else if (currentTerm.right) {\n terms.push(currentTerm);\n }\n }\n\n return { terms, logicalOperators };\n};\n\nconst evaluateComparison = (\n term: ComparisonTerm,\n context: ConditionEvaluationContext\n): boolean => {\n if (!term.left || !term.operator) {\n console.warn(\"[EvaluateComparison] Incomplete term - missing left or operator\");\n return false;\n }\n\n // Handle boolean/truthy evaluation (no right operand)\n if (term.operator === \"truthy\") {\n const leftValue = resolveTokenValue(term.left, context);\n return isTruthy(leftValue);\n }\n\n // Standard comparison requires both operands\n if (!term.right) {\n console.warn(\"[EvaluateComparison] Comparison operator requires right operand\");\n return false;\n }\n\n const leftValue = resolveTokenValue(term.left, context);\n const rightValue = resolveTokenValue(term.right, context);\n\n if (leftValue === undefined || rightValue === undefined) {\n console.warn(\"[EvaluateComparison] Undefined value - left:\", leftValue, \"right:\", rightValue);\n return false;\n }\n\n const trimIfString = (v: unknown) =>\n typeof v === \"string\" ? v.trim() : v;\n\n const leftComparable = trimIfString(coerceValue(leftValue));\n const rightComparable = trimIfString(coerceValue(rightValue));\n\n console.log(\"[EvaluateComparison]\", leftComparable, term.operator, rightComparable);\n\n let result: boolean;\n switch (term.operator) {\n case \"==\":\n result = leftComparable == rightComparable; // eslint-disable-line eqeqeq\n break;\n case \"===\":\n result = leftComparable === rightComparable;\n break;\n case \"!=\":\n result = leftComparable != rightComparable; // eslint-disable-line eqeqeq\n break;\n case \"!==\":\n result = leftComparable !== rightComparable;\n break;\n case \">\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a > b);\n break;\n case \">=\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a >= b);\n break;\n case \"<\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a < b);\n break;\n case \"<=\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a <= b);\n break;\n default:\n console.warn(\"[EvaluateComparison] Unknown operator:\", term.operator);\n result = false;\n }\n\n console.log(\"[EvaluateComparison] Result:\", result);\n return result;\n};\n\nconst isTruthy = (value: unknown): boolean => {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n if (typeof value === \"number\") return value !== 0;\n if (value === null || value === undefined) return false;\n if (value === \"\") return false;\n return true;\n};\n\nconst resolveTokenValue = (\n token: ConditionToken,\n context: ConditionEvaluationContext\n): unknown => {\n switch (token.type) {\n case \"input\":\n return parseLiteral(token.value);\n case \"variable\":\n case \"control\":\n return resolvePathValue(token.value, context, token.sourceNodeId);\n default:\n console.warn(\"[ResolveTokenValue] Unknown token type:\", token.type);\n return undefined;\n }\n};\n\nconst FIELD_ALIASES: Record<string, string[]> = {\n nom: [\"lastName\", \"companyName\"],\n prenom: [\"firstName\"],\n email: [\"email\"],\n sms: [\"phoneNumber\"],\n date_naissance: [\"birthDate\"],\n adresse: [\"addressLine1\"],\n ville: [\"city\"],\n code_postal: [\"postalCode\"],\n pays: [\"countryCode\", \"country\"],\n nationalite: [\"nationality\"],\n};\n\nconst resolvePathValue = (\n path: string,\n context: ConditionEvaluationContext,\n sourceNodeId?: string\n): unknown => {\n if (!path) {\n console.warn(\"[ResolvePathValue] Empty path provided\");\n return undefined;\n }\n\n const segments = path.split(\".\").filter(Boolean);\n\n if (segments.length === 0) {\n console.warn(\"[ResolvePathValue] No segments after splitting path\");\n return undefined;\n }\n\n const sources: Array<Record<string, unknown> | undefined> = [\n context.session?.result as Record<string, unknown>,\n context.session?.userInput as Record<string, unknown>,\n context.session?.contactInfo as Record<string, unknown>,\n context.userInput as Record<string, unknown>,\n context.contactInfo as Record<string, unknown>,\n context.session as unknown as Record<string, unknown>,\n ];\n\n // Helper to resolve aliases\n const getPossibleKeys = (key: string): string[] => {\n return [key, ...(FIELD_ALIASES[key] || [])];\n };\n\n // 1. Try direct/nested resolution with alias support for the last segment\n for (const source of sources) {\n if (!source) continue;\n\n const parentPath = segments.slice(0, -1);\n const lastSegment = segments[segments.length - 1];\n const parent = parentPath.length > 0 ? getNestedValue(source, parentPath) : source;\n\n if (parent && typeof parent === \"object\") {\n for (const key of getPossibleKeys(lastSegment)) {\n const value = (parent as Record<string, unknown>)[key];\n if (value !== undefined) {\n console.log(`[ResolvePathValue] Found ${path} (as ${key}) in direct sources`);\n return extractValue(value);\n }\n }\n }\n }\n\n // 2. Handle nodeId prefixes and fallbacks\n if (segments.length > 1) {\n const [root, ...rest] = segments;\n const lastSegment = segments[segments.length - 1];\n\n // Check in contextual userInput (structured by node or flat)\n if (context.userInput && typeof context.userInput === \"object\") {\n const userInput = context.userInput as Record<string, unknown>;\n\n // A. Try structured by nodeId\n const nodeData = userInput[root];\n if (nodeData && typeof nodeData === \"object\") {\n const value = getNestedValue(nodeData as Record<string, unknown>, rest);\n if (value !== undefined) {\n console.log(`[ResolvePathValue] Found ${path} in contextual userInput (nested)`);\n return extractValue(value);\n }\n }\n\n // B. Flat fallback: search for the property directly if it's a node-ID.property\n for (const key of getPossibleKeys(lastSegment)) {\n if (userInput[key] !== undefined) {\n console.log(`[ResolvePathValue] Found ${lastSegment} (as ${key}) in flat userInput`);\n return extractValue(userInput[key]);\n }\n\n // C. Check in customFormData\n const customFormData = userInput[\"customFormData\"] as Record<string, unknown> | undefined;\n if (customFormData && customFormData[key] !== undefined) {\n console.log(`[ResolvePathValue] Found ${lastSegment} (as ${key}) in customFormData`);\n return extractValue(customFormData[key]);\n }\n }\n }\n\n const analysisEntries = Array.isArray(context.session?.analysis)\n ? (context.session.analysis as Array<Record<string, unknown>>)\n : [];\n\n // If sourceNodeId is provided, use it to find the relevant analysis entry\n if (sourceNodeId || segments.length > 1) {\n const targetNodeId = sourceNodeId || root;\n const relevantEntries = analysisEntries.filter((entry) => {\n const entryRecord = entry as Record<string, unknown>;\n return entryRecord[\"nodeId\"] === targetNodeId || entryRecord[\"id\"] === targetNodeId;\n });\n\n if (relevantEntries.length > 0) {\n // Use the most recent entry (last one in array)\n const targetEntry = relevantEntries[relevantEntries.length - 1];\n\n // Check if the first segment is a hash/identifier that should be skipped\n const isHashLikeId = /^[a-f0-9]{24}$/i.test(root);\n const pathToResolve = isHashLikeId ? rest : [root, ...rest];\n\n // For control tokens, look in the documents array associated with this analysis entry\n if (pathToResolve.length > 0) {\n const propertyName = pathToResolve[pathToResolve.length - 1];\n const propertyKeys = getPossibleKeys(propertyName);\n\n const documents = Array.isArray(context.session?.documents)\n ? (context.session.documents as Array<Record<string, unknown>>)\n : [];\n\n if (documents.length > 0) {\n const analysisId = targetEntry[\"id\"] as string;\n const relevantDocs = documents.filter((doc) => doc[\"analysisId\"] === analysisId);\n\n if (relevantDocs.length > 0) {\n const doc = relevantDocs[0];\n\n // Look in controlCategories for control properties\n const controlCategories = doc[\"controlCategories\"] as Record<string, unknown> | undefined;\n if (controlCategories) {\n for (const categoryData of Object.values(controlCategories)) {\n const category = categoryData as Record<string, unknown>;\n const controls = category[\"controls\"] as Record<string, unknown> | undefined;\n\n if (controls) {\n for (const key of propertyKeys) {\n if (key in controls) {\n const control = controls[key] as Record<string, unknown>;\n return extractValue(control[\"value\"]);\n }\n }\n }\n }\n }\n\n // Also check in extractedInformations\n const extractedInformations = doc[\"extractedInformations\"] as Record<string, unknown> | undefined;\n if (extractedInformations) {\n for (const key of propertyKeys) {\n const valueFromExtracted = getNestedValue(extractedInformations, [key]);\n if (valueFromExtracted !== undefined) {\n return extractValue(valueFromExtracted);\n }\n }\n }\n }\n }\n }\n\n // Try direct access on analysis entry with aliases\n const propertyName = segments[segments.length - 1];\n for (const key of getPossibleKeys(propertyName)) {\n const valueFromEntry = (targetEntry as Record<string, unknown>)[key];\n if (valueFromEntry !== undefined) {\n return extractValue(valueFromEntry);\n }\n\n const extractedInfo = (targetEntry as Record<string, unknown>)[\n \"extractedInformation\"\n ] as Record<string, unknown> | undefined;\n if (extractedInfo && extractedInfo[key] !== undefined) {\n return extractValue(extractedInfo[key]);\n }\n\n const resultInfo = (targetEntry as Record<string, unknown>)[\n \"result\"\n ] as Record<string, unknown> | undefined;\n if (resultInfo && resultInfo[key] !== undefined) {\n return extractValue(resultInfo[key]);\n }\n }\n }\n }\n }\n\n console.warn(\"⚠️ [ResolvePathValue] Could not resolve path:\", path);\n return undefined;\n};\n\n/**\n * Extracts the actual value from objects with {confidence, value} structure.\n * This is common in extractedInformations from the API.\n */\nconst extractValue = (value: unknown): unknown => {\n // If it's an object with both 'value' and 'confidence' properties, extract the value\n if (\n value &&\n typeof value === \"object\" &&\n \"value\" in value &&\n \"confidence\" in value\n ) {\n return (value as Record<string, unknown>)[\"value\"];\n }\n return value;\n};\n\nconst getNestedValue = (\n source: Record<string, unknown> | undefined,\n path: string[]\n): unknown => {\n if (!source) {\n return undefined;\n }\n\n return path.reduce<unknown>((acc, key) => {\n if (acc === undefined || acc === null) {\n return undefined;\n }\n if (Array.isArray(acc)) {\n const index = Number(key);\n if (Number.isNaN(index)) {\n return undefined;\n }\n return acc[index];\n }\n if (typeof acc === \"object\") {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, source);\n};\n\nconst parseLiteral = (value: string): unknown => {\n const trimmed = value?.trim();\n if (!trimmed) {\n return \"\";\n }\n\n if (trimmed.toLowerCase() === \"true\") {\n return true;\n }\n if (trimmed.toLowerCase() === \"false\") {\n return false;\n }\n\n const numericValue = Number(trimmed);\n if (!Number.isNaN(numericValue)) {\n return numericValue;\n }\n\n const timestamp = Date.parse(trimmed);\n if (!Number.isNaN(timestamp)) {\n return new Date(timestamp).getTime();\n }\n return trimmed.replace(/\"/g, '');\n};\n\nconst coerceValue = (value: unknown): unknown => {\n if (value instanceof Date) {\n return value.getTime();\n }\n if (typeof value === \"string\") {\n const literal = parseLiteral(value);\n if (literal !== value) {\n return literal;\n }\n }\n return value;\n};\n\nconst compareValues = (\n left: unknown,\n right: unknown,\n comparator: (a: number | string, b: number | string) => boolean\n): boolean => {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return comparator(left, right);\n }\n\n if (typeof left === \"string\" && typeof right === \"string\") {\n // Normalize case for better string matching\n return comparator(left.trim().toLowerCase(), right.trim().toLowerCase());\n }\n\n console.warn(`[CompareValues] Type mismatch: left=${typeof left}, right=${typeof right}`);\n return false;\n};\n\nconst determineOperandType = (value: string): ConditionTokenType => {\n if (isBooleanLiteral(value) || isNumericLiteral(value)) {\n return \"input\";\n }\n\n return \"variable\";\n};\n\nconst isNumericLiteral = (value: string): boolean => {\n return /^-?\\d+(?:\\.\\d+)?$/.test(value);\n};\n\nconst isBooleanLiteral = (value: string): boolean => {\n return value.toLowerCase() === \"true\" || value.toLowerCase() === \"false\";\n};\n"],"names":["__spreadArray"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conditionEvaluator.js","sources":["../../../../src/utils/conditionEvaluator.ts"],"sourcesContent":["import type { ConditionToken, ConditionTokenType, SessionData } from \"../types/session\";\nimport type { UserInput } from \"../types/userInput\";\nimport type { ContactInfo } from \"../types/contactInfo\";\n\nexport interface ConditionEvaluationContext {\n session: SessionData;\n userInput?: UserInput | Record<string, unknown>;\n contactInfo?: ContactInfo | Record<string, unknown>;\n}\n\nconst LOGICAL_OPERATORS = new Set([\"&&\", \"||\"]);\nconst COMPARISON_OPERATORS = new Set([\"==\", \"===\", \"!=\", \"!==\", \">\", \">=\", \"<\", \"<=\"]);\n\n// Valeurs sentinelles reconnues comme opérande droite pour tester la présence d'une valeur.\n// Syntaxe builder : « variable == isEmpty » ou « variable != isEmpty »\nconst PRESENCE_SENTINELS = new Set([\"isEmpty\", \"isNotEmpty\"]);\n\ninterface ComparisonTerm {\n left?: ConditionToken;\n operator?: string;\n right?: ConditionToken;\n}\n\nexport const parseConditionExpression = (expression?: string): ConditionToken[] => {\n if (!expression) {\n return [];\n }\n\n const cleanedExpression = expression.replace(/\\s+/g, \" \").trim();\n if (!cleanedExpression) {\n return [];\n }\n\n const regex = /(===|!==|==|!=|<=|>=|&&|\\|\\||<|>)|(\"(?:[^\"\\\\]|\\\\.)*\")|([^\\s]+)/g;\n const tokens: ConditionToken[] = [];\n let match: RegExpExecArray | null;\n while ((match = regex.exec(cleanedExpression)) !== null) {\n const value = match[0];\n\n if (LOGICAL_OPERATORS.has(value) || COMPARISON_OPERATORS.has(value)) {\n tokens.push({ type: \"operator\", value });\n } else {\n const isQuoted = value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\");\n const literal = isQuoted ? value.slice(1, -1) : value;\n const tokenType: ConditionTokenType = isQuoted\n ? \"input\"\n : determineOperandType(literal);\n tokens.push({ type: tokenType, value: literal });\n }\n }\n\n return tokens;\n};\n\nexport const evaluateConditionTokens = (\n tokens: ConditionToken[] = [],\n context: ConditionEvaluationContext\n): boolean => {\n if (!tokens || tokens.length === 0) {\n console.warn(\"[ConditionEvaluator] No tokens provided\");\n return false;\n }\n\n const { terms, logicalOperators } = buildComparisonTerms(tokens);\n\n if (terms.length === 0) {\n console.warn(\"[ConditionEvaluator] No comparison terms built\");\n return false;\n }\n\n const termResults = terms.map((term) => evaluateComparison(term, context));\n\n if (termResults.length === 1) {\n return termResults[0];\n }\n\n const finalResult = termResults.reduce((acc, result, index) => {\n if (index === 0) {\n return result;\n }\n const logicalOperator = logicalOperators[index - 1] || \"&&\";\n return logicalOperator === \"||\" ? acc || result : acc && result;\n }, true);\n\n return finalResult;\n};\n\nconst buildComparisonTerms = (tokens: ConditionToken[]) => {\n const terms: ComparisonTerm[] = [];\n const logicalOperators: string[] = [];\n let currentTerm: ComparisonTerm = {};\n\n tokens.forEach((token) => {\n if (token.type === \"operator\") {\n if (LOGICAL_OPERATORS.has(token.value)) {\n // If we have a left operand without comparison operator, treat it as a boolean term\n if (currentTerm.left && !currentTerm.operator) {\n terms.push({ left: currentTerm.left, operator: \"truthy\", right: undefined });\n logicalOperators.push(token.value);\n currentTerm = {};\n } else if (currentTerm.left && currentTerm.operator && currentTerm.right) {\n terms.push(currentTerm);\n logicalOperators.push(token.value);\n currentTerm = {};\n }\n } else if (COMPARISON_OPERATORS.has(token.value)) {\n currentTerm.operator = token.value;\n }\n } else {\n if (!currentTerm.left) {\n currentTerm.left = token;\n } else if (!currentTerm.right) {\n currentTerm.right = token;\n } else {\n currentTerm = { left: token };\n }\n }\n });\n\n // Handle the last term\n if (currentTerm.left) {\n if (!currentTerm.operator) {\n terms.push({ left: currentTerm.left, operator: \"truthy\", right: undefined });\n } else if (currentTerm.right) {\n terms.push(currentTerm);\n }\n }\n\n return { terms, logicalOperators };\n};\n\nconst evaluateComparison = (\n term: ComparisonTerm,\n context: ConditionEvaluationContext\n): boolean => {\n if (!term.left || !term.operator) {\n console.warn(\"[EvaluateComparison] Incomplete term - missing left or operator\");\n return false;\n }\n\n // Handle boolean/truthy evaluation (no right operand)\n if (term.operator === \"truthy\") {\n const leftValue = resolveTokenValue(term.left, context);\n return isTruthy(leftValue);\n }\n\n // Standard comparison requires both operands\n if (!term.right) {\n console.warn(\"[EvaluateComparison] Comparison operator requires right operand\");\n return false;\n }\n\n const leftValue = resolveTokenValue(term.left, context);\n\n // Sentinel « isEmpty » / « isNotEmpty » en opérande droite — teste la présence de la valeur gauche.\n // Syntaxe : « variable == isEmpty » → vide ; « variable != isEmpty » → non vide.\n // De même avec « variable == isNotEmpty » / « variable != isNotEmpty » (sens inversé).\n if (term.right && PRESENCE_SENTINELS.has(term.right.value)) {\n const empty = isEmptyValue(leftValue);\n const sentinelMeansEmpty = term.right.value === \"isEmpty\";\n if (term.operator === \"==\" || term.operator === \"===\") {\n return sentinelMeansEmpty ? empty : !empty;\n }\n if (term.operator === \"!=\" || term.operator === \"!==\") {\n return sentinelMeansEmpty ? !empty : empty;\n }\n }\n\n const rightValue = resolveTokenValue(term.right, context);\n\n if (leftValue === undefined || rightValue === undefined) {\n console.warn(\"[EvaluateComparison] Undefined value - left:\", leftValue, \"right:\", rightValue);\n return false;\n }\n\n const trimIfString = (v: unknown) =>\n typeof v === \"string\" ? v.trim() : v;\n\n const leftComparable = trimIfString(coerceValue(leftValue));\n const rightComparable = trimIfString(coerceValue(rightValue));\n\n console.log(\"[EvaluateComparison]\", leftComparable, term.operator, rightComparable);\n\n let result: boolean;\n switch (term.operator) {\n case \"==\":\n result = leftComparable == rightComparable; // eslint-disable-line eqeqeq\n break;\n case \"===\":\n result = leftComparable === rightComparable;\n break;\n case \"!=\":\n result = leftComparable != rightComparable; // eslint-disable-line eqeqeq\n break;\n case \"!==\":\n result = leftComparable !== rightComparable;\n break;\n case \">\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a > b);\n break;\n case \">=\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a >= b);\n break;\n case \"<\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a < b);\n break;\n case \"<=\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a <= b);\n break;\n default:\n console.warn(\"[EvaluateComparison] Unknown operator:\", term.operator);\n result = false;\n }\n\n console.log(\"[EvaluateComparison] Result:\", result);\n return result;\n};\n\nconst isTruthy = (value: unknown): boolean => {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n if (typeof value === \"number\") return value !== 0;\n if (value === null || value === undefined) return false;\n if (value === \"\") return false;\n return true;\n};\n\nconst isEmptyValue = (value: unknown): boolean => {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n return false;\n};\n\nconst resolveTokenValue = (\n token: ConditionToken,\n context: ConditionEvaluationContext\n): unknown => {\n switch (token.type) {\n case \"input\":\n return parseLiteral(token.value);\n case \"variable\":\n case \"control\":\n return resolvePathValue(token.value, context, token.sourceNodeId);\n default:\n console.warn(\"[ResolveTokenValue] Unknown token type:\", token.type);\n return undefined;\n }\n};\n\nconst FIELD_ALIASES: Record<string, string[]> = {\n nom: [\"lastName\", \"companyName\"],\n prenom: [\"firstName\"],\n email: [\"email\"],\n sms: [\"phoneNumber\"],\n date_naissance: [\"birthDate\"],\n adresse: [\"addressLine1\"],\n ville: [\"city\"],\n code_postal: [\"postalCode\"],\n pays: [\"countryCode\", \"country\"],\n nationalite: [\"nationality\"],\n};\n\nconst resolvePathValue = (\n path: string,\n context: ConditionEvaluationContext,\n sourceNodeId?: string\n): unknown => {\n if (!path) {\n console.warn(\"[ResolvePathValue] Empty path provided\");\n return undefined;\n }\n\n const segments = path.split(\".\").filter(Boolean);\n\n if (segments.length === 0) {\n console.warn(\"[ResolvePathValue] No segments after splitting path\");\n return undefined;\n }\n\n const sources: Array<Record<string, unknown> | undefined> = [\n context.session?.result as Record<string, unknown>,\n context.session?.userInput as Record<string, unknown>,\n context.session?.contactInfo as Record<string, unknown>,\n context.userInput as Record<string, unknown>,\n context.contactInfo as Record<string, unknown>,\n context.session as unknown as Record<string, unknown>,\n ];\n\n // Helper to resolve aliases\n const getPossibleKeys = (key: string): string[] => {\n return [key, ...(FIELD_ALIASES[key] || [])];\n };\n\n // 1. Try direct/nested resolution with alias support for the last segment\n for (const source of sources) {\n if (!source) continue;\n\n const parentPath = segments.slice(0, -1);\n const lastSegment = segments[segments.length - 1];\n const parent = parentPath.length > 0 ? getNestedValue(source, parentPath) : source;\n\n if (parent && typeof parent === \"object\") {\n for (const key of getPossibleKeys(lastSegment)) {\n const value = (parent as Record<string, unknown>)[key];\n if (value !== undefined) {\n console.log(`[ResolvePathValue] Found ${path} (as ${key}) in direct sources`);\n return extractValue(value);\n }\n }\n }\n }\n\n // 2. Handle nodeId prefixes and fallbacks\n if (segments.length > 1) {\n const [root, ...rest] = segments;\n const lastSegment = segments[segments.length - 1];\n\n // Check in contextual userInput (structured by node or flat)\n if (context.userInput && typeof context.userInput === \"object\") {\n const userInput = context.userInput as Record<string, unknown>;\n\n // A. Try structured by nodeId\n const nodeData = userInput[root];\n if (nodeData && typeof nodeData === \"object\") {\n const value = getNestedValue(nodeData as Record<string, unknown>, rest);\n if (value !== undefined) {\n console.log(`[ResolvePathValue] Found ${path} in contextual userInput (nested)`);\n return extractValue(value);\n }\n }\n\n // B. Flat fallback: search for the property directly if it's a node-ID.property\n for (const key of getPossibleKeys(lastSegment)) {\n if (userInput[key] !== undefined) {\n console.log(`[ResolvePathValue] Found ${lastSegment} (as ${key}) in flat userInput`);\n return extractValue(userInput[key]);\n }\n\n // C. Check in customFormData\n const customFormData = userInput[\"customFormData\"] as Record<string, unknown> | undefined;\n if (customFormData && customFormData[key] !== undefined) {\n console.log(`[ResolvePathValue] Found ${lastSegment} (as ${key}) in customFormData`);\n return extractValue(customFormData[key]);\n }\n }\n }\n\n const analysisEntries = Array.isArray(context.session?.analysis)\n ? (context.session.analysis as Array<Record<string, unknown>>)\n : [];\n\n // If sourceNodeId is provided, use it to find the relevant analysis entry\n if (sourceNodeId || segments.length > 1) {\n const targetNodeId = sourceNodeId || root;\n const relevantEntries = analysisEntries.filter((entry) => {\n const entryRecord = entry as Record<string, unknown>;\n return entryRecord[\"nodeId\"] === targetNodeId || entryRecord[\"id\"] === targetNodeId;\n });\n\n if (relevantEntries.length > 0) {\n // Use the most recent entry (last one in array)\n const targetEntry = relevantEntries[relevantEntries.length - 1];\n\n // Check if the first segment is a hash/identifier that should be skipped\n const isHashLikeId = /^[a-f0-9]{24}$/i.test(root);\n const pathToResolve = isHashLikeId ? rest : [root, ...rest];\n\n // For control tokens, look in the documents array associated with this analysis entry\n if (pathToResolve.length > 0) {\n const propertyName = pathToResolve[pathToResolve.length - 1];\n const propertyKeys = getPossibleKeys(propertyName);\n\n const documents = Array.isArray(context.session?.documents)\n ? (context.session.documents as Array<Record<string, unknown>>)\n : [];\n\n if (documents.length > 0) {\n const analysisId = targetEntry[\"id\"] as string;\n const relevantDocs = documents.filter((doc) => doc[\"analysisId\"] === analysisId);\n\n if (relevantDocs.length > 0) {\n const doc = relevantDocs[0];\n\n // Look in controlCategories for control properties\n const controlCategories = doc[\"controlCategories\"] as Record<string, unknown> | undefined;\n if (controlCategories) {\n for (const categoryData of Object.values(controlCategories)) {\n const category = categoryData as Record<string, unknown>;\n const controls = category[\"controls\"] as Record<string, unknown> | undefined;\n\n if (controls) {\n for (const key of propertyKeys) {\n if (key in controls) {\n const control = controls[key] as Record<string, unknown>;\n return extractValue(control[\"value\"]);\n }\n }\n }\n }\n }\n\n // Also check in extractedInformations\n const extractedInformations = doc[\"extractedInformations\"] as Record<string, unknown> | undefined;\n if (extractedInformations) {\n for (const key of propertyKeys) {\n const valueFromExtracted = getNestedValue(extractedInformations, [key]);\n if (valueFromExtracted !== undefined) {\n return extractValue(valueFromExtracted);\n }\n }\n }\n }\n }\n }\n\n // Try direct access on analysis entry with aliases\n const propertyName = segments[segments.length - 1];\n for (const key of getPossibleKeys(propertyName)) {\n const valueFromEntry = (targetEntry as Record<string, unknown>)[key];\n if (valueFromEntry !== undefined) {\n return extractValue(valueFromEntry);\n }\n\n const extractedInfo = (targetEntry as Record<string, unknown>)[\n \"extractedInformation\"\n ] as Record<string, unknown> | undefined;\n if (extractedInfo && extractedInfo[key] !== undefined) {\n return extractValue(extractedInfo[key]);\n }\n\n const resultInfo = (targetEntry as Record<string, unknown>)[\n \"result\"\n ] as Record<string, unknown> | undefined;\n if (resultInfo && resultInfo[key] !== undefined) {\n return extractValue(resultInfo[key]);\n }\n }\n }\n }\n }\n\n console.warn(\"⚠️ [ResolvePathValue] Could not resolve path:\", path);\n return undefined;\n};\n\n/**\n * Extracts the actual value from objects with {confidence, value} structure.\n * This is common in extractedInformations from the API.\n */\nconst extractValue = (value: unknown): unknown => {\n // If it's an object with both 'value' and 'confidence' properties, extract the value\n if (\n value &&\n typeof value === \"object\" &&\n \"value\" in value &&\n \"confidence\" in value\n ) {\n return (value as Record<string, unknown>)[\"value\"];\n }\n return value;\n};\n\nconst getNestedValue = (\n source: Record<string, unknown> | undefined,\n path: string[]\n): unknown => {\n if (!source) {\n return undefined;\n }\n\n return path.reduce<unknown>((acc, key) => {\n if (acc === undefined || acc === null) {\n return undefined;\n }\n if (Array.isArray(acc)) {\n const index = Number(key);\n if (Number.isNaN(index)) {\n return undefined;\n }\n return acc[index];\n }\n if (typeof acc === \"object\") {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, source);\n};\n\nconst parseLiteral = (value: string): unknown => {\n const trimmed = value?.trim();\n if (!trimmed) {\n return \"\";\n }\n\n if (trimmed.toLowerCase() === \"true\") {\n return true;\n }\n if (trimmed.toLowerCase() === \"false\") {\n return false;\n }\n\n const numericValue = Number(trimmed);\n if (!Number.isNaN(numericValue)) {\n return numericValue;\n }\n\n const timestamp = Date.parse(trimmed);\n if (!Number.isNaN(timestamp)) {\n return new Date(timestamp).getTime();\n }\n return trimmed.replace(/\"/g, '');\n};\n\nconst coerceValue = (value: unknown): unknown => {\n if (value instanceof Date) {\n return value.getTime();\n }\n if (typeof value === \"string\") {\n const literal = parseLiteral(value);\n if (literal !== value) {\n return literal;\n }\n }\n return value;\n};\n\nconst compareValues = (\n left: unknown,\n right: unknown,\n comparator: (a: number | string, b: number | string) => boolean\n): boolean => {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return comparator(left, right);\n }\n\n if (typeof left === \"string\" && typeof right === \"string\") {\n // Normalize case for better string matching\n return comparator(left.trim().toLowerCase(), right.trim().toLowerCase());\n }\n\n console.warn(`[CompareValues] Type mismatch: left=${typeof left}, right=${typeof right}`);\n return false;\n};\n\nconst determineOperandType = (value: string): ConditionTokenType => {\n if (isBooleanLiteral(value) || isNumericLiteral(value) || PRESENCE_SENTINELS.has(value)) {\n return \"input\";\n }\n\n return \"variable\";\n};\n\nconst isNumericLiteral = (value: string): boolean => {\n return /^-?\\d+(?:\\.\\d+)?$/.test(value);\n};\n\nconst isBooleanLiteral = (value: string): boolean => {\n return value.toLowerCase() === \"true\" || value.toLowerCase() === \"false\";\n};\n"],"names":["__spreadArray"],"mappings":"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"}
|