Skip to content

Commit a999aac

Browse files
committed
Merge branch 'release/v1.6.0'
2 parents e4b24a8 + 9a11b18 commit a999aac

File tree

4 files changed

+85
-19
lines changed

4 files changed

+85
-19
lines changed

lib/index.js

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ class ServerlessAWSPseudoParameters {
88
'after:aws:package:finalize:mergeCustomProviderResources': this.addParameters.bind(this),
99
};
1010
this.skipRegionReplace = get(serverless.service, 'custom.pseudoParameters.skipRegionReplace', false)
11+
this.allowReferences = get(serverless.service, 'custom.pseudoParameters.allowReferences', false)
1112
}
1213

1314
addParameters() {
1415

1516
const template = this.serverless.service.provider.compiledCloudFormationTemplate;
1617
const skipRegionReplace = this.skipRegionReplace;
18+
const allowReferences = this.allowReferences;
1719
const consoleLog = this.serverless.cli.consoleLog;
1820

1921
consoleLog(yellow(underline('AWS Pseudo Parameters')));
@@ -39,16 +41,21 @@ class ServerlessAWSPseudoParameters {
3941

4042
function regions() {
4143
return [
42-
'eu-west-1',
43-
'eu-west-2',
44-
'us-east-1',
45-
'us-east-2',
46-
'us-west-2',
47-
'ap-south-1',
48-
'ap-northeast-2',
49-
'ap-southeast-2',
50-
'ap-northeast-1',
51-
'eu-central-1'
44+
"ap-northeast-1",
45+
"ap-northeast-2",
46+
"ap-south-1",
47+
"ap-southeast-1",
48+
"ap-southeast-2",
49+
"ca-central-1",
50+
"eu-central-1",
51+
"eu-west-1",
52+
"eu-west-2",
53+
"eu-west-3",
54+
"sa-east-1",
55+
"us-east-1",
56+
"us-east-2",
57+
"us-west-1",
58+
"us-west-2"
5259
]
5360
}
5461

@@ -66,18 +73,23 @@ class ServerlessAWSPseudoParameters {
6673
value = value.replace(regionFinder, '#{AWS::Region}');
6774
}
6875

69-
// we only want to possibly replace strings with an Fn::Sub
70-
if (typeof value === 'string' && value.search(/#{AWS::([a-zA-Z]+)}/) >= 0) {
71-
const aws_regex = /#{AWS::([a-zA-Z]+)}/g;
76+
var aws_regex;
77+
if (allowReferences) {
78+
aws_regex = /#{([^}]+)}/g;
79+
} else {
80+
aws_regex = /#{(AWS::[a-zA-Z]+)}/g
81+
}
7282

83+
// we only want to possibly replace strings with an Fn::Sub
84+
if (typeof value === 'string' && value.search(aws_regex) >= 0) {
7385
dictionary[key] = {
74-
"Fn::Sub": value.replace(aws_regex, '${AWS::$1}')
86+
"Fn::Sub": value.replace(aws_regex, '${$1}')
7587
};
7688

7789
// do some fancy logging
7890
let m = aws_regex.exec(value);
7991
while (m) {
80-
consoleLog('AWS Pseudo Parameter: ' + name + '::' + key + ' Replaced ' + yellow(m[1]) + ' with ' + yellow('${AWS::' + m[1] + '}'));
92+
consoleLog('AWS Pseudo Parameter: ' + name + '::' + key + ' Replaced ' + yellow(m[1]) + ' with ' + yellow('${' + m[1] + '}'));
8193
m = aws_regex.exec(value);
8294
}
8395
}

lib/index.spec.js

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,19 @@ describe('Plugin', () => {
3030
StackId: "#{AWS::StackId}",
3131
StackName: "#{AWS::StackName}",
3232
URLSuffix: "#{AWS::URLSuffix}",
33+
Reference: "#{SomeResource}",
3334
}
3435
}
3536
} };
3637
serverlessPseudoParamsPlugin = new Plugin(serverless);
3738
serverlessPseudoParamsPlugin.serverless.service.service = 'foo-service';
3839
serverlessPseudoParamsPlugin.addParameters();
3940
resultTemplate = serverlessPseudoParamsPlugin.serverless.service.provider.compiledCloudFormationTemplate;
40-
expect(Object.keys(resultTemplate.Resources.acmeResource.Properties).length).toEqual(8);
41+
expect(Object.keys(resultTemplate.Resources.acmeResource.Properties).length).toEqual(9);
4142
});
4243

4344
it('replaces #{AWS::[VAR]} with the correct CF pseudo parameter', () => {
44-
expect(Object.keys(resultTemplate.Resources.acmeResource.Properties).length).toEqual(8);
45+
expect(Object.keys(resultTemplate.Resources.acmeResource.Properties).length).toEqual(9);
4546
});
4647

4748
it('replaces #{AWS::AccountId} with the ${AWS::AccountId} pseudo parameter', () => {
@@ -68,6 +69,59 @@ describe('Plugin', () => {
6869
it('replaces #{AWS::URLSuffix} with the ${AWS::URLSuffix} pseudo parameter', () => {
6970
expect(resultTemplate.Resources.acmeResource.Properties.URLSuffix).toEqual({ 'Fn::Sub': '${AWS::URLSuffix}' });
7071
});
72+
it('does not replace #{SomeResource}', () => {
73+
expect(resultTemplate.Resources.acmeResource.Properties.Reference).toEqual("#{SomeResource}");
74+
});
75+
76+
});
77+
78+
describe('Using pseudo parameters with allowReferences', () => {
79+
let serverlessPseudoParamsPlugin;
80+
let resultTemplate;
81+
82+
beforeEach(() => {
83+
const serverless = {
84+
cli: {
85+
log: () => {},
86+
consoleLog: () => {}
87+
},
88+
service: {
89+
provider: {
90+
compiledCloudFormationTemplate: {},
91+
},
92+
custom: {
93+
pseudoParameters: {
94+
allowReferences: true
95+
}
96+
}
97+
},
98+
};
99+
serverless.service.provider.compiledCloudFormationTemplate = { Resources: {
100+
acmeResource: {
101+
Type: "AWS::Foo::Bar",
102+
Properties: {
103+
AccountId: "#{AWS::AccountId}",
104+
Reference: "#{SomeResource}",
105+
}
106+
}
107+
} };
108+
serverlessPseudoParamsPlugin = new Plugin(serverless);
109+
serverlessPseudoParamsPlugin.serverless.service.service = 'foo-service';
110+
serverlessPseudoParamsPlugin.addParameters();
111+
resultTemplate = serverlessPseudoParamsPlugin.serverless.service.provider.compiledCloudFormationTemplate;
112+
expect(Object.keys(resultTemplate.Resources.acmeResource.Properties).length).toEqual(2);
113+
});
114+
115+
it('replaces #{AWS::[VAR]} with the correct CF pseudo parameter', () => {
116+
expect(Object.keys(resultTemplate.Resources.acmeResource.Properties).length).toEqual(2);
117+
});
118+
119+
it('replaces #{AWS::AccountId} with the ${AWS::AccountId} pseudo parameter', () => {
120+
expect(resultTemplate.Resources.acmeResource.Properties.AccountId).toEqual({ 'Fn::Sub': '${AWS::AccountId}' });
121+
});
122+
it('replaces #{SomeResource} with ${SomeResource}', () => {
123+
expect(resultTemplate.Resources.acmeResource.Properties.Reference).toEqual({ 'Fn::Sub': '${SomeResource}' });
124+
});
71125

72126
});
73127

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "serverless-pseudo-parameters",
3-
"version": "1.5.0",
3+
"version": "1.6.0",
44
"devDependencies": {
55
"jest": "^22.4.2"
66
},

0 commit comments

Comments
 (0)