Skip to content

Commit 63045fd

Browse files
committed
Use the variable syntax present in the given variable string, extracting it from the given string that may contain embedded custom variables (i.e. `${{self:var.${{self:var.foo}}.bar}}`).
1 parent 524d04a commit 63045fd

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

lib/classes/Variables.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,15 @@ class Variables {
729729
if (index < 0) {
730730
index = this.deep.push(variable) - 1;
731731
}
732-
return `\${deep:${index}}`;
732+
let variableContainer = variable;
733+
let variableString = this.cleanVariable(variableContainer);
734+
while (variableString.match(this.variableSyntax)) {
735+
variableContainer = variableString;
736+
variableString = this.cleanVariable(variableContainer);
737+
}
738+
return variableContainer
739+
.replace(/\s/g, '')
740+
.replace(variableString, `deep:${index}`);
733741
}
734742
appendDeepVariable(variable, subProperty) {
735743
return `${variable.slice(0, variable.length - 1)}.${subProperty}}`;

lib/classes/Variables.test.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,44 @@ describe('Variables', () => {
586586
return serverless.variables.populateObject(service.custom)
587587
.should.become(expected);
588588
});
589+
it('should handle deep variables regardless of custom variableSyntax', () => {
590+
service.provider.variableSyntax = '\\${{([ ~:a-zA-Z0-9._\\\'",\\-\\/\\(\\)]+?)}}';
591+
serverless.variables.loadVariableSyntax();
592+
delete service.provider.variableSyntax;
593+
service.custom = {
594+
my0thStage: 'DEV',
595+
my1stStage: '${{self:custom.my0thStage}}',
596+
my2ndStage: '${{self:custom.my1stStage}}',
597+
};
598+
const expected = {
599+
my0thStage: 'DEV',
600+
my1stStage: 'DEV',
601+
my2ndStage: 'DEV',
602+
};
603+
return serverless.variables.populateObject(service.custom)
604+
.should.become(expected);
605+
});
606+
it('should handle deep variables regardless of recursion into custom variableSyntax', () => {
607+
service.provider.variableSyntax = '\\${{([ ~:a-zA-Z0-9._\\\'",\\-\\/\\(\\)]+?)}}';
608+
serverless.variables.loadVariableSyntax();
609+
delete service.provider.variableSyntax;
610+
service.custom = {
611+
my0thIndex: '0th',
612+
my1stIndex: '1st',
613+
my0thStage: 'DEV',
614+
my1stStage: '${{self:custom.my${{self:custom.my0thIndex}}Stage}}',
615+
my2ndStage: '${{self:custom.my${{self:custom.my1stIndex}}Stage}}',
616+
};
617+
const expected = {
618+
my0thIndex: '0th',
619+
my1stIndex: '1st',
620+
my0thStage: 'DEV',
621+
my1stStage: 'DEV',
622+
my2ndStage: 'DEV',
623+
};
624+
return serverless.variables.populateObject(service.custom)
625+
.should.become(expected);
626+
});
589627
describe('file reading cases', () => {
590628
let tmpDirPath;
591629
beforeEach(() => {

0 commit comments

Comments
 (0)