From f746d6590206f3cfcc589ed1c3cd2003b0d5f1c2 Mon Sep 17 00:00:00 2001 From: Adam Chmara Date: Thu, 2 Oct 2025 12:02:47 +0200 Subject: [PATCH] fix(api): liquid digest step variable parsing --- .../template-parser/new-liquid-parser.spec.ts | 18 ++++++++++++++++++ .../utils/template-parser/new-liquid-parser.ts | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/apps/api/src/app/shared/utils/template-parser/new-liquid-parser.spec.ts b/apps/api/src/app/shared/utils/template-parser/new-liquid-parser.spec.ts index ab9a442b850..21c0d0fae89 100644 --- a/apps/api/src/app/shared/utils/template-parser/new-liquid-parser.spec.ts +++ b/apps/api/src/app/shared/utils/template-parser/new-liquid-parser.spec.ts @@ -261,6 +261,24 @@ describe('extractLiquidTemplateVariables', () => { expect(invalidVariables[0].name).to.equal('invalid'); }); + it('should handle variables with hyphens in if conditions', () => { + const template = '{% if steps.digest-step.events[0].id %}Hello{% endif %}'; + const variableSchema: JSONSchemaDto = { + type: JsonSchemaTypeEnum.OBJECT, + properties: { + steps: { + type: JsonSchemaTypeEnum.OBJECT, + additionalProperties: true, + }, + }, + }; + const { validVariables, invalidVariables } = extractLiquidTemplateVariables({ template, variableSchema }); + + expect(validVariables).to.have.lengthOf(1); + expect(invalidVariables).to.have.lengthOf(0); + expect(validVariables[0].name).to.equal('steps.digest-step.events[0].id'); + }); + it('should handle unless statements with invalid condition', () => { const template = '{% unless user.banned %}Show content{{invalid}}{% endunless %}'; const { validVariables, invalidVariables } = extractLiquidTemplateVariables({ template }); diff --git a/apps/api/src/app/shared/utils/template-parser/new-liquid-parser.ts b/apps/api/src/app/shared/utils/template-parser/new-liquid-parser.ts index 3c280c45910..dccf9698a79 100644 --- a/apps/api/src/app/shared/utils/template-parser/new-liquid-parser.ts +++ b/apps/api/src/app/shared/utils/template-parser/new-liquid-parser.ts @@ -788,7 +788,7 @@ function extractVariablesFromCondition(condition: string): string[] { processedCondition = processedCondition.replace(/\|\s*[a-zA-Z_][a-zA-Z0-9_]*(?:\s*:[^|%}]*)?/g, ''); // Now match variable patterns from the processed condition - const variableMatches = processedCondition.match(/[a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)*(?:\[\d+\])*/g); + const variableMatches = processedCondition.match(/[a-zA-Z_][a-zA-Z0-9_[\].-]+/g); if (variableMatches) { variables.push(