diff --git a/packages/amplify-cli-core/src/__tests__/cfnUtilities.test.ts b/packages/amplify-cli-core/src/__tests__/cfnUtilities.test.ts index 3d1c352adfa..82c77049e2f 100644 --- a/packages/amplify-cli-core/src/__tests__/cfnUtilities.test.ts +++ b/packages/amplify-cli-core/src/__tests__/cfnUtilities.test.ts @@ -1,5 +1,4 @@ import * as fs from 'fs-extra'; -import * as path from 'path'; import { CFNTemplateFormat, JSONUtilities, readCFNTemplate, writeCFNTemplate } from '../../lib'; jest.mock('fs-extra'); @@ -48,6 +47,23 @@ describe('readCFNTemplate', () => { expect(result.templateFormat).toEqual(CFNTemplateFormat.YAML); expect(result.cfnTemplate).toEqual(testTemplate); }); + + it('reads yaml template with nested GetAtt refs', async () => { + const yamlContent = ` + !GetAtt myResource.output.someProp + `; + ((fs_mock.readFile as unknown) as jest.MockedFunction).mockResolvedValueOnce(yamlContent); + + const result = await readCFNTemplate(testPath); + expect(result.cfnTemplate).toMatchInlineSnapshot(` + Object { + "Fn::GetAtt": Array [ + "myResource", + "output.someProp", + ], + } + `); + }); }); describe('writeCFNTemplate', () => { diff --git a/packages/amplify-cli-core/src/cfnUtilities.ts b/packages/amplify-cli-core/src/cfnUtilities.ts index 387c2049b33..3b0765da572 100644 --- a/packages/amplify-cli-core/src/cfnUtilities.ts +++ b/packages/amplify-cli-core/src/cfnUtilities.ts @@ -112,13 +112,31 @@ const CF_SCHEMA = new yaml.Schema([ new yaml.Type('!GetAtt', { kind: 'scalar', construct: function (data) { - return { 'Fn::GetAtt': Array.isArray(data) ? data : data.split('.') }; + if (Array.isArray(data)) { + return { + 'Fn::GetAtt': data, + }; + } + // data is a string + const firstPeriodIdx = data.indexOf('.'); + return { + 'Fn::GetAtt': [data.slice(0, firstPeriodIdx), data.slice(firstPeriodIdx + 1)], + }; }, }), new yaml.Type('!GetAtt', { kind: 'sequence', construct: function (data) { - return { 'Fn::GetAtt': Array.isArray(data) ? data : data.split('.') }; + if (Array.isArray(data)) { + return { + 'Fn::GetAtt': data, + }; + } + // data is a string + const firstPeriodIdx = data.indexOf('.'); + return { + 'Fn::GetAtt': [data.slice(0, firstPeriodIdx), data.slice(firstPeriodIdx + 1)], + }; }, }), new yaml.Type('!GetAZs', {