From 996802d07e9ea0836098a0bfd3347a252ee4e014 Mon Sep 17 00:00:00 2001 From: Jonathan Goldwasser Date: Mon, 28 Dec 2020 10:25:02 +0100 Subject: [PATCH 1/2] fix(stepfunctions-tasks): EvaluateExpression does not support JSON paths with dash Closes #12221 --- .../lib/evaluate-expression.ts | 2 +- .../test/eval-nodejs10.x-handler.test.ts | 14 +++++++++++ .../test/evaluate-expression.test.ts | 25 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) 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..f7c89d2efd9da 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..dd8f84428077a 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,17 @@ test('with duplicated entries', async () => { const evaluated = await handler(event); expect(evaluated).toBe(2); }); + +test('with dash in path', async () => { + // GIVEN + const event: Event = { + expression: '`${$.detail-type}`.trim()', + expressionAttributeValues: { + '$.detail-type': ' hello ', + }, + }; + + // THEN + const evaluated = await handler(event); + expect(evaluated).toBe('hello'); +}); 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..4035448e0a7ff 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 in path', () => { + // WHEN + const task = new tasks.EvaluateExpression(stack, 'Task', { + expression: '`${$.detail-type}`.trim()', + }); + 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":"`${$.detail-type}`.trim()","expressionAttributeValues":{"$.detail-type.$":"$.detail-type"}}}}}', + ], + ], + }, + }); +}); From c66af21d5f77ed6967fbb1556e76a7fbfd8fdbd6 Mon Sep 17 00:00:00 2001 From: Jonathan Goldwasser Date: Mon, 28 Dec 2020 10:43:31 +0100 Subject: [PATCH 2/2] support underscore --- .../aws-stepfunctions-tasks/lib/evaluate-expression.ts | 2 +- .../test/eval-nodejs10.x-handler.test.ts | 10 ++++++---- .../test/evaluate-expression.test.ts | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) 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 f7c89d2efd9da..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 dd8f84428077a..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 @@ -59,16 +59,18 @@ test('with duplicated entries', async () => { expect(evaluated).toBe(2); }); -test('with dash in path', async () => { +test('with dash and underscore in path', async () => { // GIVEN const event: Event = { - expression: '`${$.detail-type}`.trim()', + expression: '$.a_b + $.c-d + $[_e]', expressionAttributeValues: { - '$.detail-type': ' hello ', + '$.a_b': 1, + '$.c-d': 2, + '$[_e]': 3, }, }; // THEN const evaluated = await handler(event); - expect(evaluated).toBe('hello'); + 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 4035448e0a7ff..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 @@ -63,10 +63,10 @@ test('expression does not contain paths', () => { }); }); -test('with dash in path', () => { +test('with dash and underscore in path', () => { // WHEN const task = new tasks.EvaluateExpression(stack, 'Task', { - expression: '`${$.detail-type}`.trim()', + expression: '$.a_b + $.c-d + $[_e]', }); new sfn.StateMachine(stack, 'SM', { definition: task, @@ -81,7 +81,7 @@ test('with dash in path', () => { { 'Fn::GetAtt': ['Evala0d2ce44871b4e7487a1f5e63d7c3bdc4DAC06E1', 'Arn'], }, - '","Parameters":{"expression":"`${$.detail-type}`.trim()","expressionAttributeValues":{"$.detail-type.$":"$.detail-type"}}}}}', + '","Parameters":{"expression":"$.a_b + $.c-d + $[_e]","expressionAttributeValues":{"$.a_b.$":"$.a_b","$.c-d.$":"$.c-d","$[_e].$":"$[_e]"}}}}}', ], ], },