Skip to content

Commit 6ea6640

Browse files
Merge pull request #293 from duro/master
feat: support loading config from JS and JSON files
2 parents de4b4ad + 7329de6 commit 6ea6640

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

lib/yamlParser.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,18 @@ module.exports = {
1111
return BbPromise.resolve();
1212
}
1313

14+
const fromYamlFile = serverlessYmlPath => this.serverless.yamlParser.parse(serverlessYmlPath);
15+
16+
let parse = null;
1417
const serviceFileName = this.options.config || this.serverless.config.serverless.service.serviceFilename || 'serverless.yml';
1518
const serverlessYmlPath = path.join(servicePath, serviceFileName);
16-
return this.serverless.yamlParser
17-
.parse(serverlessYmlPath)
19+
20+
if (['.js', '.json'].includes(path.extname(serverlessYmlPath))) {
21+
parse = this.loadFromRequiredFile;
22+
} else {
23+
parse = fromYamlFile;
24+
}
25+
return parse(serverlessYmlPath)
1826
.then(serverlessFileParam => this.serverless.variables.populateObject(serverlessFileParam)
1927
.then((parsedObject) => {
2028
this.serverless.service.stepFunctions = {
@@ -44,6 +52,16 @@ module.exports = {
4452
}));
4553
},
4654

55+
// This function must be ignored since mocking the require system is more
56+
// dangerous than beneficial
57+
loadFromRequiredFile(serverlessYmlPath) {
58+
/* istanbul ignore next */
59+
// eslint-disable-next-line global-require, import/no-dynamic-require
60+
const fileContents = require(serverlessYmlPath);
61+
/* istanbul ignore next */
62+
return BbPromise.resolve(fileContents);
63+
},
64+
4765
getAllStateMachines() {
4866
if (Object.prototype.toString.call(this.serverless.service.stepFunctions.stateMachines)
4967
!== '[object Object]') {

lib/yamlParser.test.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,40 @@ describe('#yamlParse', () => {
114114
});
115115
});
116116

117+
it('should be able to load from a js file', () => {
118+
serverless.config.serverless.service.serviceFilename = 'serverless.js';
119+
const requireFileStub = sinon.stub(serverlessStepFunctions, 'loadFromRequiredFile')
120+
.returns(BbPromise.resolve({
121+
stepFunctions: {
122+
stateMachines: 'stepFunctions',
123+
activities: 'my-activity',
124+
},
125+
}));
126+
serverlessStepFunctions.yamlParse()
127+
.then(() => {
128+
expect(requireFileStub.calledOnce).to.be.equal(true);
129+
expect(serverless.service.stepFunctions.stateMachines).to.be.equal('stepFunctions');
130+
expect(serverless.service.stepFunctions.activities).to.be.equal('my-activity');
131+
});
132+
});
133+
134+
it('should be able to load from a json file', () => {
135+
serverless.config.serverless.service.serviceFilename = 'serverless.json';
136+
const requireFileStub = sinon.stub(serverlessStepFunctions, 'loadFromRequiredFile')
137+
.returns(BbPromise.resolve({
138+
stepFunctions: {
139+
stateMachines: 'stepFunctions',
140+
activities: 'my-activity',
141+
},
142+
}));
143+
serverlessStepFunctions.yamlParse()
144+
.then(() => {
145+
expect(requireFileStub.calledOnce).to.be.equal(true);
146+
expect(serverless.service.stepFunctions.stateMachines).to.be.equal('stepFunctions');
147+
expect(serverless.service.stepFunctions.activities).to.be.equal('my-activity');
148+
});
149+
});
150+
117151
it('should create empty object when stepfunctions param are not given', () => {
118152
serverlessStepFunctions.serverless.yamlParser.parse.restore();
119153
serverlessStepFunctions.serverless.variables.populateObject.restore();

0 commit comments

Comments
 (0)