diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/lib/evaluate-expression.ts b/packages/@aws-cdk/aws-stepfunctions-tasks/lib/evaluate-expression.ts index 6fe1a11e34723..45457a1c377c8 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/lib/evaluate-expression.ts +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/lib/evaluate-expression.ts @@ -72,7 +72,7 @@ export class EvaluateExpression extends sfn.TaskStateBase { * @internal */ protected _renderTask(): any { - const matches = this.props.expression.match(/\$[.\[][.a-zA-Z[\]0-9]+/g); + const matches = this.props.expression.match(/\$[.\[][.a-zA-Z[\]0-9-_]+/g); let expressionAttributeValues = {}; if (matches) { diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/test/eval-nodejs10.x-handler.test.ts b/packages/@aws-cdk/aws-stepfunctions-tasks/test/eval-nodejs10.x-handler.test.ts index d110f97f47002..d42be11d7aaa4 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/test/eval-nodejs10.x-handler.test.ts +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/test/eval-nodejs10.x-handler.test.ts @@ -58,3 +58,19 @@ test('with duplicated entries', async () => { const evaluated = await handler(event); expect(evaluated).toBe(2); }); + +test('with dash and underscore in path', async () => { + // GIVEN + const event: Event = { + expression: '$.a_b + $.c-d + $[_e]', + expressionAttributeValues: { + '$.a_b': 1, + '$.c-d': 2, + '$[_e]': 3, + }, + }; + + // THEN + const evaluated = await handler(event); + expect(evaluated).toBe(6); +}); diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/test/evaluate-expression.test.ts b/packages/@aws-cdk/aws-stepfunctions-tasks/test/evaluate-expression.test.ts index 0bcc3cc3e98c3..679e817dfbead 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/test/evaluate-expression.test.ts +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/test/evaluate-expression.test.ts @@ -62,3 +62,28 @@ test('expression does not contain paths', () => { }, }); }); + +test('with dash and underscore in path', () => { + // WHEN + const task = new tasks.EvaluateExpression(stack, 'Task', { + expression: '$.a_b + $.c-d + $[_e]', + }); + new sfn.StateMachine(stack, 'SM', { + definition: task, + }); + + expect(stack).toHaveResource('AWS::StepFunctions::StateMachine', { + DefinitionString: { + 'Fn::Join': [ + '', + [ + '{"StartAt":"Task","States":{"Task":{"End":true,"Type":"Task","Resource":"', + { + 'Fn::GetAtt': ['Evala0d2ce44871b4e7487a1f5e63d7c3bdc4DAC06E1', 'Arn'], + }, + '","Parameters":{"expression":"$.a_b + $.c-d + $[_e]","expressionAttributeValues":{"$.a_b.$":"$.a_b","$.c-d.$":"$.c-d","$[_e].$":"$[_e]"}}}}}', + ], + ], + }, + }); +});