@servicetitan/dte-unlayer 0.124.0 → 0.125.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nunjucks.d.ts","sourceRoot":"","sources":["../../src/display-conditions/nunjucks.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"nunjucks.d.ts","sourceRoot":"","sources":["../../src/display-conditions/nunjucks.ts"],"names":[],"mappings":"AAEA,OAAO,EAIH,qBAAqB,EAGrB,uBAAuB,EAE1B,MAAM,SAAS,CAAC;AAsKjB,wBAAgB,4BAA4B,CACxC,KAAK,EAAE,qBAAqB,GAC7B,uBAAuB,GAAG,IAAI,CAShC;AAoRD;;;GAGG;AACH,wBAAgB,4BAA4B,CACxC,SAAS,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,GACtD,qBAAqB,GAAG,IAAI,CA4C9B"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { buildFormFieldKey, parseFormFieldKey, toNunjucksFieldReference } from '../shared/forms';
|
|
2
2
|
import { generateId } from './constants';
|
|
3
|
-
import {
|
|
4
|
-
const OPERATOR_LABEL_MAP = new Map(CONDITION_OPERATORS.map((op)=>[
|
|
5
|
-
op.value,
|
|
6
|
-
op.label
|
|
7
|
-
]));
|
|
3
|
+
import { VALUE_LESS_OPERATORS } from './types';
|
|
8
4
|
function escapeNunjucksString(s) {
|
|
9
5
|
return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
10
6
|
}
|
|
@@ -118,30 +114,14 @@ function isValueLessOperator(operator) {
|
|
|
118
114
|
}
|
|
119
115
|
return combined;
|
|
120
116
|
}
|
|
121
|
-
function
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
function generateTypeAndLabel(state) {
|
|
126
|
-
const parts = [];
|
|
127
|
-
for (const group of state.groups){
|
|
128
|
-
for (const c of group.conditions){
|
|
129
|
-
if (!c.dataPointKey) {
|
|
130
|
-
continue;
|
|
131
|
-
}
|
|
132
|
-
if (isValueLessOperator(c.operator)) {
|
|
133
|
-
parts.push(`${c.dataPointKey} ${operatorLabel(c.operator)}`);
|
|
134
|
-
} else if (c.value.trim()) {
|
|
135
|
-
parts.push(`${c.dataPointKey} ${operatorLabel(c.operator)} ${c.value.trim()}`);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
const summary = parts.slice(0, 2).join('; ') + (parts.length > 2 ? '…' : '');
|
|
140
|
-
const type = state.behavior === 'show' ? 'Display when' : 'Hide when';
|
|
141
|
-
const label = summary || (state.behavior === 'show' ? 'Show when' : 'Hide when');
|
|
117
|
+
function generateConditionText(state) {
|
|
118
|
+
const conditionCount = state.groups.reduce((count, group)=>count + group.conditions.filter((c)=>c.dataPointKey && (isValueLessOperator(c.operator) || c.value.trim() !== '')).length, 0);
|
|
119
|
+
const label = state.behavior === 'show' ? 'Show condition configured' : 'Hide condition configured';
|
|
120
|
+
const description = conditionCount === 1 ? '1 condition is currently applied' : `${conditionCount} conditions are currently applied`;
|
|
142
121
|
return {
|
|
143
|
-
|
|
144
|
-
label
|
|
122
|
+
description,
|
|
123
|
+
label,
|
|
124
|
+
type: ''
|
|
145
125
|
};
|
|
146
126
|
}
|
|
147
127
|
export function buildUnlayerDisplayCondition(state) {
|
|
@@ -151,8 +131,7 @@ export function buildUnlayerDisplayCondition(state) {
|
|
|
151
131
|
}
|
|
152
132
|
const before = `{% if ${expr} %}`;
|
|
153
133
|
const after = '{% endif %}';
|
|
154
|
-
const { label, type } =
|
|
155
|
-
const description = state.groups.length > 1 ? `${state.groups.length} rules` : undefined;
|
|
134
|
+
const { description, label, type } = generateConditionText(state);
|
|
156
135
|
return {
|
|
157
136
|
after,
|
|
158
137
|
before,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/display-conditions/nunjucks.ts"],"sourcesContent":["import { buildFormFieldKey, parseFormFieldKey, toNunjucksFieldReference } from '../shared/forms';\nimport { generateId } from './constants';\nimport {\n CONDITION_OPERATORS,\n ConditionGroup,\n ConditionOperator,\n DisplayBehavior,\n DisplayConditionState,\n LogicalOperator,\n SingleCondition,\n UnlayerDisplayCondition,\n VALUE_LESS_OPERATORS,\n} from './types';\n\nconst OPERATOR_LABEL_MAP = new Map<string, string>(\n CONDITION_OPERATORS.map(op => [op.value, op.label]),\n);\n\nfunction escapeNunjucksString(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction nunjucksValueLiteral(value: string): string {\n return `'${escapeNunjucksString(value)}'`;\n}\n\nfunction isEscapedAt(s: string, index: number): boolean {\n let slashCount = 0;\n for (let i = index - 1; i >= 0 && s[i] === '\\\\'; i--) {\n slashCount++;\n }\n return slashCount % 2 === 1;\n}\n\nfunction isValueLessOperator(operator: string): boolean {\n return VALUE_LESS_OPERATORS.includes(operator as ConditionOperator);\n}\n\n/**\n * Build a single condition expression in Nunjucks.\n * Wrapped in () so splitting never breaks composite expressions.\n */\nfunction buildSingleConditionExpression(\n dataPointKey: string,\n operator: string,\n value: string,\n): string {\n const path = toNunjucksFieldReference(dataPointKey);\n const defaulted = `(${path} | default(''))`;\n const numDefaulted = `(${path} | default(0))`;\n const normalizedValue = value.trim();\n const literal = normalizedValue ? nunjucksValueLiteral(normalizedValue) : \"''\";\n const numLiteral =\n /^-?(?:\\d+\\.?\\d*|\\.\\d+)$/.test(normalizedValue) && normalizedValue !== '-'\n ? normalizedValue\n : '0';\n let inner: string;\n\n switch (operator) {\n case 'is_equal_to':\n inner = `${defaulted} == ${literal}`;\n break;\n case 'is_not_equal_to':\n inner = `${defaulted} != ${literal}`;\n break;\n case 'contains':\n inner = `${literal} in ${defaulted}`;\n break;\n case 'does_not_contain':\n inner = `not (${literal} in ${defaulted})`;\n break;\n case 'starts_with':\n inner = `(${defaulted} | startswith(${literal}))`;\n break;\n case 'ends_with':\n inner = `(${defaulted} | endswith(${literal}))`;\n break;\n case 'is_empty':\n inner = `${defaulted} == '' or (${defaulted} | length) == 0`;\n break;\n case 'is_not_empty':\n inner = `${defaulted} != '' and (${defaulted} | length) > 0`;\n break;\n case 'num_eq':\n inner = `${numDefaulted} == ${numLiteral}`;\n break;\n case 'num_neq':\n inner = `${numDefaulted} != ${numLiteral}`;\n break;\n case 'num_gt':\n inner = `${numDefaulted} > ${numLiteral}`;\n break;\n case 'num_lt':\n inner = `${numDefaulted} < ${numLiteral}`;\n break;\n case 'num_gte':\n inner = `${numDefaulted} >= ${numLiteral}`;\n break;\n case 'num_lte':\n inner = `${numDefaulted} <= ${numLiteral}`;\n break;\n default:\n inner = `${defaulted} == ${literal}`;\n }\n return `(${inner})`;\n}\n\n/**\n * Build group expression. Each condition is connected by its own logical operator.\n * E.g. (cond1) and (cond2) or (cond3)\n */\nfunction buildGroupExpression(group: ConditionGroup): string {\n const valid = group.conditions.filter(\n c => c.dataPointKey && (isValueLessOperator(c.operator) || c.value.trim() !== ''),\n );\n if (valid.length === 0) {\n return '';\n }\n let result = buildSingleConditionExpression(\n valid[0].dataPointKey,\n valid[0].operator,\n valid[0].value,\n );\n for (let i = 1; i < valid.length; i++) {\n const joiner = valid[i].logicalOperator === 'or' ? ' or ' : ' and ';\n result +=\n joiner +\n buildSingleConditionExpression(\n valid[i].dataPointKey,\n valid[i].operator,\n valid[i].value,\n );\n }\n // Wrap group in parens so top-level rule AND split works cleanly\n return valid.length > 1 ? `(${result})` : result;\n}\n\n/**\n * Build full condition expression.\n * Rules (groups) are connected by each group's logical operator.\n * hide behavior wraps everything in not().\n */\nfunction buildFullConditionExpression(state: DisplayConditionState): string {\n const validGroups = state.groups\n .map(group => ({ expression: buildGroupExpression(group), group }))\n .filter(item => !!item.expression);\n if (validGroups.length === 0) {\n return '';\n }\n let combined = validGroups[0].expression;\n for (let i = 1; i < validGroups.length; i++) {\n const joiner = validGroups[i].group.logicalOperator === 'or' ? ' or ' : ' and ';\n combined += `${joiner}${validGroups[i].expression}`;\n }\n if (state.behavior === 'hide') {\n return `not (${combined})`;\n }\n return combined;\n}\n\nfunction operatorLabel(operator: string): string {\n return OPERATOR_LABEL_MAP.get(operator) ?? operator;\n}\n\nfunction generateTypeAndLabel(state: DisplayConditionState): { type: string; label: string } {\n const parts: string[] = [];\n for (const group of state.groups) {\n for (const c of group.conditions) {\n if (!c.dataPointKey) {\n continue;\n }\n if (isValueLessOperator(c.operator)) {\n parts.push(`${c.dataPointKey} ${operatorLabel(c.operator)}`);\n } else if (c.value.trim()) {\n parts.push(`${c.dataPointKey} ${operatorLabel(c.operator)} ${c.value.trim()}`);\n }\n }\n }\n const summary = parts.slice(0, 2).join('; ') + (parts.length > 2 ? '…' : '');\n const type = state.behavior === 'show' ? 'Display when' : 'Hide when';\n const label = summary || (state.behavior === 'show' ? 'Show when' : 'Hide when');\n return { type, label };\n}\n\nexport function buildUnlayerDisplayCondition(\n state: DisplayConditionState,\n): UnlayerDisplayCondition | null {\n const expr = buildFullConditionExpression(state);\n if (!expr) {\n return null;\n }\n const before = `{% if ${expr} %}`;\n const after = '{% endif %}';\n const { label, type } = generateTypeAndLabel(state);\n const description = state.groups.length > 1 ? `${state.groups.length} rules` : undefined;\n return { after, before, description, label, type };\n}\n\n/*\n * ---------------------------------------------------------------------------\n * Parse helpers\n * ---------------------------------------------------------------------------\n */\n\nfunction stripOuterParens(s: string): string {\n const t = s.trim();\n if (t.length < 2 || !t.startsWith('(') || t.at(-1) !== ')') {\n return t;\n }\n let depth = 1;\n for (let i = 1; i < t.length - 1; i++) {\n if (t[i] === '(') {\n depth++;\n } else if (t[i] === ')') {\n depth--;\n if (depth === 0) {\n return t;\n }\n }\n }\n return depth === 1 ? t.slice(1, -1).trim() : t;\n}\n\n/**\n * Tokenize an expression into alternating tokens of (expr, operator).\n * Returns: [expr, 'and'|'or', expr, 'and'|'or', expr, ...]\n *\n * This scans for top-level \" and \" / \" or \" while respecting parens,\n * and records which separator was found between each pair.\n */\nfunction tokenizeGroupExpression(expr: string): {\n conditionExprs: string[];\n operators: LogicalOperator[];\n} {\n const conditionExprs: string[] = [];\n const operators: LogicalOperator[] = [];\n let depth = 0;\n let inSingleQuote = false;\n let start = 0;\n\n for (let i = 0; i < expr.length; i++) {\n const c = expr[i];\n if (c === \"'\" && !isEscapedAt(expr, i)) {\n inSingleQuote = !inSingleQuote;\n } else if (!inSingleQuote && c === '(') {\n depth++;\n } else if (!inSingleQuote && c === ')') {\n depth = Math.max(0, depth - 1);\n } else if (!inSingleQuote && depth === 0) {\n // Check for \" and \" or \" or \" at this position\n if (expr.slice(i, i + 5) === ' and ') {\n conditionExprs.push(expr.slice(start, i).trim());\n operators.push('and');\n start = i + 5;\n i += 4;\n continue;\n }\n if (expr.slice(i, i + 4) === ' or ') {\n conditionExprs.push(expr.slice(start, i).trim());\n operators.push('or');\n start = i + 4;\n i += 3;\n continue;\n }\n }\n }\n conditionExprs.push(expr.slice(start).trim());\n return { conditionExprs, operators };\n}\n\nfunction unescapeNunjucksString(s: string): string {\n return s.replaceAll('\\\\\\\\', '\\\\').replaceAll(String.raw`\\'`, \"'\");\n}\n\nconst SIMPLE_DATA_POINT_PATH = String.raw`[\\w.]+`;\nconst FORM_RUNTIME_DATA_POINT_PATH = String.raw`__submission_fields\\[\"\\d+\"\\]\\[\"[A-Za-z0-9]+\"\\]`;\nconst DATA_POINT_PATH = String.raw`(${SIMPLE_DATA_POINT_PATH}|${FORM_RUNTIME_DATA_POINT_PATH})`;\nconst RE_STR_DEFAULT = String.raw`\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)`;\nconst RE_NUM_DEFAULT = String.raw`\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*0\\s*\\)\\)`;\nconst QUOTED_CONTENT = String.raw`((?:[^'\\\\]|\\\\.)*)`;\n\nfunction toSingleCondition(\n operator: ConditionOperator,\n dataPointKey: string,\n value: string,\n logicalOp?: LogicalOperator,\n): SingleCondition {\n const normalizedDataPointKey = (() => {\n const parsed = parseFormFieldKey(dataPointKey.trim());\n if (!parsed) {\n return dataPointKey.trim();\n }\n return buildFormFieldKey(parsed.formId, parsed.fieldId);\n })();\n const condition: SingleCondition = {\n dataPointKey: normalizedDataPointKey,\n id: generateId(),\n operator,\n value,\n };\n if (logicalOp) {\n condition.logicalOperator = logicalOp;\n }\n return condition;\n}\n\nfunction parseQuotedValue(s: string): { value: string; rest: string } | null {\n if (!s.startsWith(\"'\")) {\n return null;\n }\n let i = 1;\n let value = '';\n while (i < s.length) {\n if (s[i] === '\\\\' && i + 1 < s.length) {\n value += s[i + 1] === \"'\" ? \"'\" : s[i + 1];\n i += 2;\n continue;\n }\n if (s[i] === \"'\") {\n return { rest: s.slice(i + 1).trim(), value: unescapeNunjucksString(value) };\n }\n value += s[i];\n i++;\n }\n return null;\n}\n\ninterface ParsePattern {\n getValue: (match: RegExpMatchArray) => string | null;\n operator: ConditionOperator;\n pathGroup: number;\n pattern: RegExp;\n}\n\nconst PARSE_PATTERNS: ParsePattern[] = [\n // value-less\n {\n getValue: () => '',\n operator: 'is_empty',\n pathGroup: 1,\n pattern: new RegExp(\n String.raw`^${RE_STR_DEFAULT}\\s*==\\s*''\\s+or\\s+\\(\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)\\s*\\|\\s*length\\)\\s*==\\s*0$`,\n ),\n },\n {\n getValue: () => '',\n operator: 'is_not_empty',\n pathGroup: 1,\n pattern: new RegExp(\n String.raw`^${RE_STR_DEFAULT}\\s*!=\\s*''\\s+and\\s+\\(\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)\\s*\\|\\s*length\\)\\s*>\\s*0$`,\n ),\n },\n // string with value\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'is_equal_to',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*==\\s+(.+)$`),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'is_not_equal_to',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*!=\\s+(.+)$`),\n },\n {\n getValue: m => unescapeNunjucksString(m[1]),\n operator: 'contains',\n pathGroup: 2,\n pattern: new RegExp(String.raw`^'${QUOTED_CONTENT}'\\s+in\\s+${RE_STR_DEFAULT}$`),\n },\n {\n getValue: m => unescapeNunjucksString(m[1]),\n operator: 'does_not_contain',\n pathGroup: 2,\n pattern: new RegExp(\n String.raw`^not\\s*\\(\\s*'${QUOTED_CONTENT}'\\s+in\\s+${RE_STR_DEFAULT}\\s*\\)\\s*$`,\n ),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'starts_with',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*\\|\\s*startswith\\s*\\(\\s*(.+)\\s*\\)\\s*$`),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'ends_with',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*\\|\\s*endswith\\s*\\(\\s*(.+)\\s*\\)\\s*$`),\n },\n // number operators (>= and <= before > and < to avoid partial match)\n {\n getValue: m => m[2].trim(),\n operator: 'num_gte',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*>=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_lte',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*<=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_eq',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*==\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_neq',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*!=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_gt',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*>\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_lt',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*<\\s*(.+)$`),\n },\n];\n\nfunction parseSingleConditionExpression(\n expr: string,\n logicalOp?: LogicalOperator,\n): SingleCondition | null {\n const trimmed = expr.trim();\n for (const { getValue, operator, pathGroup, pattern } of PARSE_PATTERNS) {\n const match = new RegExp(pattern).exec(trimmed);\n if (!match) {\n continue;\n }\n const value = getValue(match);\n if (value === null) {\n continue;\n }\n return toSingleCondition(operator, match[pathGroup], value, logicalOp);\n }\n return null;\n}\n\n/**\n * Parse a group expression into conditions with per-condition logical operators.\n */\nfunction parseGroupExpression(groupExpr: string): SingleCondition[] | null {\n const { conditionExprs, operators } = tokenizeGroupExpression(groupExpr);\n const conditions: SingleCondition[] = [];\n\n for (let i = 0; i < conditionExprs.length; i++) {\n const cs = conditionExprs[i];\n if (!cs) {\n continue;\n }\n const unwrapped = stripOuterParens(cs);\n const logicalOp = i > 0 ? operators[i - 1] : undefined;\n const single = parseSingleConditionExpression(unwrapped, logicalOp);\n if (single) {\n conditions.push(single);\n }\n }\n\n return conditions.length > 0 ? conditions : null;\n}\n\n/**\n * Parse a saved Unlayer display condition back into modal state for prefilling.\n * Returns null if the condition is missing or cannot be parsed.\n */\nexport function parseUnlayerDisplayCondition(\n condition: UnlayerDisplayCondition | null | undefined,\n): DisplayConditionState | null {\n if (!condition?.before) {\n return null;\n }\n const ifMatch = new RegExp(/\\{%\\s*if\\s+(.+)\\s*%\\}/s).exec(condition.before);\n if (!ifMatch) {\n return null;\n }\n let expr = ifMatch[1].trim();\n\n let behavior: DisplayBehavior = 'show';\n if (expr.startsWith('not (') && expr.endsWith(')')) {\n behavior = 'hide';\n expr = expr.slice(5, -1).trim();\n }\n\n const { conditionExprs: ruleStrings, operators: groupOperators } =\n tokenizeGroupExpression(expr);\n const groups: ConditionGroup[] = [];\n\n for (let i = 0; i < ruleStrings.length; i++) {\n const rs = ruleStrings[i];\n if (!rs) {\n continue;\n }\n const unwrapped = stripOuterParens(rs);\n const conditions = parseGroupExpression(unwrapped);\n if (conditions) {\n const group: ConditionGroup = {\n conditions,\n id: generateId(),\n };\n if (i > 0) {\n group.logicalOperator = groupOperators[i - 1] ?? 'and';\n }\n groups.push(group);\n }\n }\n\n if (groups.length === 0) {\n return null;\n }\n\n return { behavior, groups };\n}\n"],"names":["buildFormFieldKey","parseFormFieldKey","toNunjucksFieldReference","generateId","CONDITION_OPERATORS","VALUE_LESS_OPERATORS","OPERATOR_LABEL_MAP","Map","map","op","value","label","escapeNunjucksString","s","replace","nunjucksValueLiteral","isEscapedAt","index","slashCount","i","isValueLessOperator","operator","includes","buildSingleConditionExpression","dataPointKey","path","defaulted","numDefaulted","normalizedValue","trim","literal","numLiteral","test","inner","buildGroupExpression","group","valid","conditions","filter","c","length","result","joiner","logicalOperator","buildFullConditionExpression","state","validGroups","groups","expression","item","combined","behavior","operatorLabel","get","generateTypeAndLabel","parts","push","summary","slice","join","type","buildUnlayerDisplayCondition","expr","before","after","description","undefined","stripOuterParens","t","startsWith","at","depth","tokenizeGroupExpression","conditionExprs","operators","inSingleQuote","start","Math","max","unescapeNunjucksString","replaceAll","String","raw","SIMPLE_DATA_POINT_PATH","FORM_RUNTIME_DATA_POINT_PATH","DATA_POINT_PATH","RE_STR_DEFAULT","RE_NUM_DEFAULT","QUOTED_CONTENT","toSingleCondition","logicalOp","normalizedDataPointKey","parsed","formId","fieldId","condition","id","parseQuotedValue","rest","PARSE_PATTERNS","getValue","pathGroup","pattern","RegExp","m","parseSingleConditionExpression","trimmed","match","exec","parseGroupExpression","groupExpr","cs","unwrapped","single","parseUnlayerDisplayCondition","ifMatch","endsWith","ruleStrings","groupOperators","rs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/display-conditions/nunjucks.ts"],"sourcesContent":["import { buildFormFieldKey, parseFormFieldKey, toNunjucksFieldReference } from '../shared/forms';\nimport { generateId } from './constants';\nimport {\n ConditionGroup,\n ConditionOperator,\n DisplayBehavior,\n DisplayConditionState,\n LogicalOperator,\n SingleCondition,\n UnlayerDisplayCondition,\n VALUE_LESS_OPERATORS,\n} from './types';\n\nfunction escapeNunjucksString(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction nunjucksValueLiteral(value: string): string {\n return `'${escapeNunjucksString(value)}'`;\n}\n\nfunction isEscapedAt(s: string, index: number): boolean {\n let slashCount = 0;\n for (let i = index - 1; i >= 0 && s[i] === '\\\\'; i--) {\n slashCount++;\n }\n return slashCount % 2 === 1;\n}\n\nfunction isValueLessOperator(operator: string): boolean {\n return VALUE_LESS_OPERATORS.includes(operator as ConditionOperator);\n}\n\n/**\n * Build a single condition expression in Nunjucks.\n * Wrapped in () so splitting never breaks composite expressions.\n */\nfunction buildSingleConditionExpression(\n dataPointKey: string,\n operator: string,\n value: string,\n): string {\n const path = toNunjucksFieldReference(dataPointKey);\n const defaulted = `(${path} | default(''))`;\n const numDefaulted = `(${path} | default(0))`;\n const normalizedValue = value.trim();\n const literal = normalizedValue ? nunjucksValueLiteral(normalizedValue) : \"''\";\n const numLiteral =\n /^-?(?:\\d+\\.?\\d*|\\.\\d+)$/.test(normalizedValue) && normalizedValue !== '-'\n ? normalizedValue\n : '0';\n let inner: string;\n\n switch (operator) {\n case 'is_equal_to':\n inner = `${defaulted} == ${literal}`;\n break;\n case 'is_not_equal_to':\n inner = `${defaulted} != ${literal}`;\n break;\n case 'contains':\n inner = `${literal} in ${defaulted}`;\n break;\n case 'does_not_contain':\n inner = `not (${literal} in ${defaulted})`;\n break;\n case 'starts_with':\n inner = `(${defaulted} | startswith(${literal}))`;\n break;\n case 'ends_with':\n inner = `(${defaulted} | endswith(${literal}))`;\n break;\n case 'is_empty':\n inner = `${defaulted} == '' or (${defaulted} | length) == 0`;\n break;\n case 'is_not_empty':\n inner = `${defaulted} != '' and (${defaulted} | length) > 0`;\n break;\n case 'num_eq':\n inner = `${numDefaulted} == ${numLiteral}`;\n break;\n case 'num_neq':\n inner = `${numDefaulted} != ${numLiteral}`;\n break;\n case 'num_gt':\n inner = `${numDefaulted} > ${numLiteral}`;\n break;\n case 'num_lt':\n inner = `${numDefaulted} < ${numLiteral}`;\n break;\n case 'num_gte':\n inner = `${numDefaulted} >= ${numLiteral}`;\n break;\n case 'num_lte':\n inner = `${numDefaulted} <= ${numLiteral}`;\n break;\n default:\n inner = `${defaulted} == ${literal}`;\n }\n return `(${inner})`;\n}\n\n/**\n * Build group expression. Each condition is connected by its own logical operator.\n * E.g. (cond1) and (cond2) or (cond3)\n */\nfunction buildGroupExpression(group: ConditionGroup): string {\n const valid = group.conditions.filter(\n c => c.dataPointKey && (isValueLessOperator(c.operator) || c.value.trim() !== ''),\n );\n if (valid.length === 0) {\n return '';\n }\n let result = buildSingleConditionExpression(\n valid[0].dataPointKey,\n valid[0].operator,\n valid[0].value,\n );\n for (let i = 1; i < valid.length; i++) {\n const joiner = valid[i].logicalOperator === 'or' ? ' or ' : ' and ';\n result +=\n joiner +\n buildSingleConditionExpression(\n valid[i].dataPointKey,\n valid[i].operator,\n valid[i].value,\n );\n }\n // Wrap group in parens so top-level rule AND split works cleanly\n return valid.length > 1 ? `(${result})` : result;\n}\n\n/**\n * Build full condition expression.\n * Rules (groups) are connected by each group's logical operator.\n * hide behavior wraps everything in not().\n */\nfunction buildFullConditionExpression(state: DisplayConditionState): string {\n const validGroups = state.groups\n .map(group => ({ expression: buildGroupExpression(group), group }))\n .filter(item => !!item.expression);\n if (validGroups.length === 0) {\n return '';\n }\n let combined = validGroups[0].expression;\n for (let i = 1; i < validGroups.length; i++) {\n const joiner = validGroups[i].group.logicalOperator === 'or' ? ' or ' : ' and ';\n combined += `${joiner}${validGroups[i].expression}`;\n }\n if (state.behavior === 'hide') {\n return `not (${combined})`;\n }\n return combined;\n}\n\nfunction generateConditionText(state: DisplayConditionState): {\n description: string;\n label: string;\n type: string;\n} {\n const conditionCount = state.groups.reduce(\n (count, group) =>\n count +\n group.conditions.filter(\n c => c.dataPointKey && (isValueLessOperator(c.operator) || c.value.trim() !== ''),\n ).length,\n 0,\n );\n const label =\n state.behavior === 'show' ? 'Show condition configured' : 'Hide condition configured';\n const description =\n conditionCount === 1\n ? '1 condition is currently applied'\n : `${conditionCount} conditions are currently applied`;\n return { description, label, type: '' };\n}\n\nexport function buildUnlayerDisplayCondition(\n state: DisplayConditionState,\n): UnlayerDisplayCondition | null {\n const expr = buildFullConditionExpression(state);\n if (!expr) {\n return null;\n }\n const before = `{% if ${expr} %}`;\n const after = '{% endif %}';\n const { description, label, type } = generateConditionText(state);\n return { after, before, description, label, type };\n}\n\n/*\n * ---------------------------------------------------------------------------\n * Parse helpers\n * ---------------------------------------------------------------------------\n */\n\nfunction stripOuterParens(s: string): string {\n const t = s.trim();\n if (t.length < 2 || !t.startsWith('(') || t.at(-1) !== ')') {\n return t;\n }\n let depth = 1;\n for (let i = 1; i < t.length - 1; i++) {\n if (t[i] === '(') {\n depth++;\n } else if (t[i] === ')') {\n depth--;\n if (depth === 0) {\n return t;\n }\n }\n }\n return depth === 1 ? t.slice(1, -1).trim() : t;\n}\n\n/**\n * Tokenize an expression into alternating tokens of (expr, operator).\n * Returns: [expr, 'and'|'or', expr, 'and'|'or', expr, ...]\n *\n * This scans for top-level \" and \" / \" or \" while respecting parens,\n * and records which separator was found between each pair.\n */\nfunction tokenizeGroupExpression(expr: string): {\n conditionExprs: string[];\n operators: LogicalOperator[];\n} {\n const conditionExprs: string[] = [];\n const operators: LogicalOperator[] = [];\n let depth = 0;\n let inSingleQuote = false;\n let start = 0;\n\n for (let i = 0; i < expr.length; i++) {\n const c = expr[i];\n if (c === \"'\" && !isEscapedAt(expr, i)) {\n inSingleQuote = !inSingleQuote;\n } else if (!inSingleQuote && c === '(') {\n depth++;\n } else if (!inSingleQuote && c === ')') {\n depth = Math.max(0, depth - 1);\n } else if (!inSingleQuote && depth === 0) {\n // Check for \" and \" or \" or \" at this position\n if (expr.slice(i, i + 5) === ' and ') {\n conditionExprs.push(expr.slice(start, i).trim());\n operators.push('and');\n start = i + 5;\n i += 4;\n continue;\n }\n if (expr.slice(i, i + 4) === ' or ') {\n conditionExprs.push(expr.slice(start, i).trim());\n operators.push('or');\n start = i + 4;\n i += 3;\n continue;\n }\n }\n }\n conditionExprs.push(expr.slice(start).trim());\n return { conditionExprs, operators };\n}\n\nfunction unescapeNunjucksString(s: string): string {\n return s.replaceAll('\\\\\\\\', '\\\\').replaceAll(String.raw`\\'`, \"'\");\n}\n\nconst SIMPLE_DATA_POINT_PATH = String.raw`[\\w.]+`;\nconst FORM_RUNTIME_DATA_POINT_PATH = String.raw`__submission_fields\\[\"\\d+\"\\]\\[\"[A-Za-z0-9]+\"\\]`;\nconst DATA_POINT_PATH = String.raw`(${SIMPLE_DATA_POINT_PATH}|${FORM_RUNTIME_DATA_POINT_PATH})`;\nconst RE_STR_DEFAULT = String.raw`\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)`;\nconst RE_NUM_DEFAULT = String.raw`\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*0\\s*\\)\\)`;\nconst QUOTED_CONTENT = String.raw`((?:[^'\\\\]|\\\\.)*)`;\n\nfunction toSingleCondition(\n operator: ConditionOperator,\n dataPointKey: string,\n value: string,\n logicalOp?: LogicalOperator,\n): SingleCondition {\n const normalizedDataPointKey = (() => {\n const parsed = parseFormFieldKey(dataPointKey.trim());\n if (!parsed) {\n return dataPointKey.trim();\n }\n return buildFormFieldKey(parsed.formId, parsed.fieldId);\n })();\n const condition: SingleCondition = {\n dataPointKey: normalizedDataPointKey,\n id: generateId(),\n operator,\n value,\n };\n if (logicalOp) {\n condition.logicalOperator = logicalOp;\n }\n return condition;\n}\n\nfunction parseQuotedValue(s: string): { value: string; rest: string } | null {\n if (!s.startsWith(\"'\")) {\n return null;\n }\n let i = 1;\n let value = '';\n while (i < s.length) {\n if (s[i] === '\\\\' && i + 1 < s.length) {\n value += s[i + 1] === \"'\" ? \"'\" : s[i + 1];\n i += 2;\n continue;\n }\n if (s[i] === \"'\") {\n return { rest: s.slice(i + 1).trim(), value: unescapeNunjucksString(value) };\n }\n value += s[i];\n i++;\n }\n return null;\n}\n\ninterface ParsePattern {\n getValue: (match: RegExpMatchArray) => string | null;\n operator: ConditionOperator;\n pathGroup: number;\n pattern: RegExp;\n}\n\nconst PARSE_PATTERNS: ParsePattern[] = [\n // value-less\n {\n getValue: () => '',\n operator: 'is_empty',\n pathGroup: 1,\n pattern: new RegExp(\n String.raw`^${RE_STR_DEFAULT}\\s*==\\s*''\\s+or\\s+\\(\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)\\s*\\|\\s*length\\)\\s*==\\s*0$`,\n ),\n },\n {\n getValue: () => '',\n operator: 'is_not_empty',\n pathGroup: 1,\n pattern: new RegExp(\n String.raw`^${RE_STR_DEFAULT}\\s*!=\\s*''\\s+and\\s+\\(\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)\\s*\\|\\s*length\\)\\s*>\\s*0$`,\n ),\n },\n // string with value\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'is_equal_to',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*==\\s+(.+)$`),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'is_not_equal_to',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*!=\\s+(.+)$`),\n },\n {\n getValue: m => unescapeNunjucksString(m[1]),\n operator: 'contains',\n pathGroup: 2,\n pattern: new RegExp(String.raw`^'${QUOTED_CONTENT}'\\s+in\\s+${RE_STR_DEFAULT}$`),\n },\n {\n getValue: m => unescapeNunjucksString(m[1]),\n operator: 'does_not_contain',\n pathGroup: 2,\n pattern: new RegExp(\n String.raw`^not\\s*\\(\\s*'${QUOTED_CONTENT}'\\s+in\\s+${RE_STR_DEFAULT}\\s*\\)\\s*$`,\n ),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'starts_with',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*\\|\\s*startswith\\s*\\(\\s*(.+)\\s*\\)\\s*$`),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'ends_with',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*\\|\\s*endswith\\s*\\(\\s*(.+)\\s*\\)\\s*$`),\n },\n // number operators (>= and <= before > and < to avoid partial match)\n {\n getValue: m => m[2].trim(),\n operator: 'num_gte',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*>=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_lte',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*<=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_eq',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*==\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_neq',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*!=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_gt',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*>\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_lt',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*<\\s*(.+)$`),\n },\n];\n\nfunction parseSingleConditionExpression(\n expr: string,\n logicalOp?: LogicalOperator,\n): SingleCondition | null {\n const trimmed = expr.trim();\n for (const { getValue, operator, pathGroup, pattern } of PARSE_PATTERNS) {\n const match = new RegExp(pattern).exec(trimmed);\n if (!match) {\n continue;\n }\n const value = getValue(match);\n if (value === null) {\n continue;\n }\n return toSingleCondition(operator, match[pathGroup], value, logicalOp);\n }\n return null;\n}\n\n/**\n * Parse a group expression into conditions with per-condition logical operators.\n */\nfunction parseGroupExpression(groupExpr: string): SingleCondition[] | null {\n const { conditionExprs, operators } = tokenizeGroupExpression(groupExpr);\n const conditions: SingleCondition[] = [];\n\n for (let i = 0; i < conditionExprs.length; i++) {\n const cs = conditionExprs[i];\n if (!cs) {\n continue;\n }\n const unwrapped = stripOuterParens(cs);\n const logicalOp = i > 0 ? operators[i - 1] : undefined;\n const single = parseSingleConditionExpression(unwrapped, logicalOp);\n if (single) {\n conditions.push(single);\n }\n }\n\n return conditions.length > 0 ? conditions : null;\n}\n\n/**\n * Parse a saved Unlayer display condition back into modal state for prefilling.\n * Returns null if the condition is missing or cannot be parsed.\n */\nexport function parseUnlayerDisplayCondition(\n condition: UnlayerDisplayCondition | null | undefined,\n): DisplayConditionState | null {\n if (!condition?.before) {\n return null;\n }\n const ifMatch = new RegExp(/\\{%\\s*if\\s+(.+)\\s*%\\}/s).exec(condition.before);\n if (!ifMatch) {\n return null;\n }\n let expr = ifMatch[1].trim();\n\n let behavior: DisplayBehavior = 'show';\n if (expr.startsWith('not (') && expr.endsWith(')')) {\n behavior = 'hide';\n expr = expr.slice(5, -1).trim();\n }\n\n const { conditionExprs: ruleStrings, operators: groupOperators } =\n tokenizeGroupExpression(expr);\n const groups: ConditionGroup[] = [];\n\n for (let i = 0; i < ruleStrings.length; i++) {\n const rs = ruleStrings[i];\n if (!rs) {\n continue;\n }\n const unwrapped = stripOuterParens(rs);\n const conditions = parseGroupExpression(unwrapped);\n if (conditions) {\n const group: ConditionGroup = {\n conditions,\n id: generateId(),\n };\n if (i > 0) {\n group.logicalOperator = groupOperators[i - 1] ?? 'and';\n }\n groups.push(group);\n }\n }\n\n if (groups.length === 0) {\n return null;\n }\n\n return { behavior, groups };\n}\n"],"names":["buildFormFieldKey","parseFormFieldKey","toNunjucksFieldReference","generateId","VALUE_LESS_OPERATORS","escapeNunjucksString","s","replace","nunjucksValueLiteral","value","isEscapedAt","index","slashCount","i","isValueLessOperator","operator","includes","buildSingleConditionExpression","dataPointKey","path","defaulted","numDefaulted","normalizedValue","trim","literal","numLiteral","test","inner","buildGroupExpression","group","valid","conditions","filter","c","length","result","joiner","logicalOperator","buildFullConditionExpression","state","validGroups","groups","map","expression","item","combined","behavior","generateConditionText","conditionCount","reduce","count","label","description","type","buildUnlayerDisplayCondition","expr","before","after","stripOuterParens","t","startsWith","at","depth","slice","tokenizeGroupExpression","conditionExprs","operators","inSingleQuote","start","Math","max","push","unescapeNunjucksString","replaceAll","String","raw","SIMPLE_DATA_POINT_PATH","FORM_RUNTIME_DATA_POINT_PATH","DATA_POINT_PATH","RE_STR_DEFAULT","RE_NUM_DEFAULT","QUOTED_CONTENT","toSingleCondition","logicalOp","normalizedDataPointKey","parsed","formId","fieldId","condition","id","parseQuotedValue","rest","PARSE_PATTERNS","getValue","pathGroup","pattern","RegExp","m","parseSingleConditionExpression","trimmed","match","exec","parseGroupExpression","groupExpr","cs","unwrapped","undefined","single","parseUnlayerDisplayCondition","ifMatch","endsWith","ruleStrings","groupOperators","rs"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { buildFormFieldKey, parseFormFieldKey, toNunjucksFieldReference } from '../shared/forms';
|
|
2
2
|
import { generateId } from './constants';
|
|
3
3
|
import {
|
|
4
|
-
CONDITION_OPERATORS,
|
|
5
4
|
ConditionGroup,
|
|
6
5
|
ConditionOperator,
|
|
7
6
|
DisplayBehavior,
|
|
@@ -12,10 +11,6 @@ import {
|
|
|
12
11
|
VALUE_LESS_OPERATORS,
|
|
13
12
|
} from './types';
|
|
14
13
|
|
|
15
|
-
const OPERATOR_LABEL_MAP = new Map<string, string>(
|
|
16
|
-
CONDITION_OPERATORS.map(op => [op.value, op.label]),
|
|
17
|
-
);
|
|
18
|
-
|
|
19
14
|
function escapeNunjucksString(s: string): string {
|
|
20
15
|
return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
21
16
|
}
|
|
@@ -158,28 +153,26 @@ function buildFullConditionExpression(state: DisplayConditionState): string {
|
|
|
158
153
|
return combined;
|
|
159
154
|
}
|
|
160
155
|
|
|
161
|
-
function
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
const label = summary || (state.behavior === 'show' ? 'Show when' : 'Hide when');
|
|
182
|
-
return { type, label };
|
|
156
|
+
function generateConditionText(state: DisplayConditionState): {
|
|
157
|
+
description: string;
|
|
158
|
+
label: string;
|
|
159
|
+
type: string;
|
|
160
|
+
} {
|
|
161
|
+
const conditionCount = state.groups.reduce(
|
|
162
|
+
(count, group) =>
|
|
163
|
+
count +
|
|
164
|
+
group.conditions.filter(
|
|
165
|
+
c => c.dataPointKey && (isValueLessOperator(c.operator) || c.value.trim() !== ''),
|
|
166
|
+
).length,
|
|
167
|
+
0,
|
|
168
|
+
);
|
|
169
|
+
const label =
|
|
170
|
+
state.behavior === 'show' ? 'Show condition configured' : 'Hide condition configured';
|
|
171
|
+
const description =
|
|
172
|
+
conditionCount === 1
|
|
173
|
+
? '1 condition is currently applied'
|
|
174
|
+
: `${conditionCount} conditions are currently applied`;
|
|
175
|
+
return { description, label, type: '' };
|
|
183
176
|
}
|
|
184
177
|
|
|
185
178
|
export function buildUnlayerDisplayCondition(
|
|
@@ -191,8 +184,7 @@ export function buildUnlayerDisplayCondition(
|
|
|
191
184
|
}
|
|
192
185
|
const before = `{% if ${expr} %}`;
|
|
193
186
|
const after = '{% endif %}';
|
|
194
|
-
const { label, type } =
|
|
195
|
-
const description = state.groups.length > 1 ? `${state.groups.length} rules` : undefined;
|
|
187
|
+
const { description, label, type } = generateConditionText(state);
|
|
196
188
|
return { after, before, description, label, type };
|
|
197
189
|
}
|
|
198
190
|
|