Skip to content

Commit dc62243

Browse files
committed
feat: adapt to new Framework variables resolver
BREAKING CHANGE: Drop support for old Serverless Framework variables resolver.
1 parent 7d8c61d commit dc62243

File tree

3 files changed

+48
-234
lines changed

3 files changed

+48
-234
lines changed

lib/yamlParser.js

Lines changed: 21 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,33 @@
11
'use strict';
22

3-
const BbPromise = require('bluebird');
4-
const path = require('path');
53
const _ = require('lodash');
64

75
module.exports = {
86
yamlParse() {
9-
const servicePath = this.serverless.config.servicePath;
10-
if (!servicePath) {
11-
return BbPromise.resolve();
7+
const parsedObject = this.serverless.configurationInput;
8+
9+
this.serverless.service.stepFunctions = {
10+
validate: parsedObject.stepFunctions ? parsedObject.stepFunctions.validate : false,
11+
noOutput: parsedObject.stepFunctions ? parsedObject.stepFunctions.noOutput : false,
12+
};
13+
this.serverless.service.stepFunctions.stateMachines = parsedObject.stepFunctions
14+
&& parsedObject.stepFunctions.stateMachines
15+
? parsedObject.stepFunctions.stateMachines : {};
16+
this.serverless.service.stepFunctions.activities = parsedObject.stepFunctions
17+
&& parsedObject.stepFunctions.activities
18+
? parsedObject.stepFunctions.activities : [];
19+
20+
if (!this.serverless.pluginManager.cliOptions.stage) {
21+
this.serverless.pluginManager.cliOptions.stage = this.options.stage
22+
|| (this.serverless.service.provider && this.serverless.service.provider.stage)
23+
|| 'dev';
1224
}
1325

14-
const fromYamlFile = serverlessYmlPath => this.serverless.yamlParser.parse(serverlessYmlPath);
15-
16-
let parse = null;
17-
const serviceFileName = this.options.config || this.serverless.config.serverless.service.serviceFilename || 'serverless.yml';
18-
const serverlessYmlPath = path.join(servicePath, serviceFileName);
19-
20-
if (['.js', '.json', '.ts'].includes(path.extname(serverlessYmlPath))) {
21-
parse = this.loadFromRequiredFile;
22-
} else {
23-
parse = fromYamlFile;
26+
if (!this.serverless.pluginManager.cliOptions.region) {
27+
this.serverless.pluginManager.cliOptions.region = this.options.region
28+
|| (this.serverless.service.provider && this.serverless.service.provider.region)
29+
|| 'us-east-1';
2430
}
25-
return parse(serverlessYmlPath)
26-
.then(serverlessFileParam => this.serverless.variables.populateObject(serverlessFileParam)
27-
.then((parsedObject) => {
28-
this.serverless.service.stepFunctions = {
29-
validate: parsedObject.stepFunctions ? parsedObject.stepFunctions.validate : false,
30-
noOutput: parsedObject.stepFunctions ? parsedObject.stepFunctions.noOutput : false,
31-
};
32-
this.serverless.service.stepFunctions.stateMachines = parsedObject.stepFunctions
33-
&& parsedObject.stepFunctions.stateMachines
34-
? parsedObject.stepFunctions.stateMachines : {};
35-
this.serverless.service.stepFunctions.activities = parsedObject.stepFunctions
36-
&& parsedObject.stepFunctions.activities
37-
? parsedObject.stepFunctions.activities : [];
38-
39-
if (!this.serverless.pluginManager.cliOptions.stage) {
40-
this.serverless.pluginManager.cliOptions.stage = this.options.stage
41-
|| (this.serverless.service.provider && this.serverless.service.provider.stage)
42-
|| 'dev';
43-
}
44-
45-
if (!this.serverless.pluginManager.cliOptions.region) {
46-
this.serverless.pluginManager.cliOptions.region = this.options.region
47-
|| (this.serverless.service.provider && this.serverless.service.provider.region)
48-
|| 'us-east-1';
49-
}
50-
51-
this.serverless.variables.populateService(this.serverless.pluginManager.cliOptions);
52-
return BbPromise.resolve();
53-
}));
54-
},
55-
56-
// This function must be ignored since mocking the require system is more
57-
// dangerous than beneficial
58-
loadFromRequiredFile(serverlessYmlPath) {
59-
/* istanbul ignore next */
60-
// eslint-disable-next-line global-require, import/no-dynamic-require
61-
const fileContents = require(serverlessYmlPath);
62-
/* istanbul ignore next */
63-
return BbPromise.resolve(fileContents);
6431
},
6532

6633
getAllStateMachines() {

lib/yamlParser.test.js

Lines changed: 24 additions & 180 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
'use strict';
22

33
const expect = require('chai').expect;
4-
const sinon = require('sinon');
5-
const path = require('path');
6-
const BbPromise = require('bluebird');
74
const Serverless = require('serverless/lib/Serverless');
85
const AwsProvider = require('serverless/lib/plugins/aws/provider');
96
const ServerlessStepFunctions = require('./index');
@@ -13,7 +10,19 @@ describe('#yamlParse', () => {
1310
let serverlessStepFunctions;
1411

1512
beforeEach(() => {
16-
serverless = new Serverless();
13+
serverless = new Serverless({
14+
configuration: {
15+
service: 'test',
16+
provider: 'aws',
17+
},
18+
serviceDir: __dirname,
19+
configurationFilename: 'serverless.yml',
20+
isConfigurationResolved: true,
21+
hasResovledCommandsExternally: true,
22+
isTelemetryReportedExternally: true,
23+
commands: ['info'],
24+
options: {},
25+
});
1726
serverless.servicePath = true;
1827
serverless.service.service = 'step-functions';
1928
serverless.configSchemaHandler = {
@@ -25,201 +34,36 @@ describe('#yamlParse', () => {
2534
});
2635

2736
describe('#yamlParse()', () => {
28-
let yamlParserStub;
29-
let populateServiceStub;
30-
let yamlObjectParserStub;
31-
beforeEach(() => {
32-
populateServiceStub = sinon.stub(serverlessStepFunctions.serverless.variables,
33-
'populateService').returns(BbPromise.resolve());
34-
yamlObjectParserStub = sinon.stub(serverlessStepFunctions.serverless.variables,
35-
'populateObject').returns(BbPromise.resolve({
36-
stepFunctions: {
37-
stateMachines: 'stepFunctions',
38-
activities: 'my-activity',
39-
},
40-
}));
41-
yamlParserStub = sinon.stub(serverlessStepFunctions.serverless.yamlParser, 'parse')
42-
.returns(BbPromise.resolve({
43-
stepFunctions: {
44-
stateMachines: 'stepFunctions',
45-
activities: 'my-activity',
46-
},
47-
}));
48-
serverlessStepFunctions.serverless.config.servicePath = 'servicePath';
49-
});
50-
51-
afterEach(() => {
52-
serverlessStepFunctions.serverless.yamlParser.parse.restore();
53-
serverlessStepFunctions.serverless.variables.populateService.restore();
54-
serverlessStepFunctions.serverless.variables.populateObject.restore();
55-
});
56-
5737
it('should default to dev when stage and provider are not defined', () => {
5838
serverlessStepFunctions.serverless.pluginManager.cliOptions.stage = null;
5939
serverlessStepFunctions.serverless.service.provider = null;
60-
serverlessStepFunctions.yamlParse()
61-
.then(() => {
62-
expect(serverless.pluginManager.cliOptions.stage).to.be.equal('dev');
63-
});
40+
serverlessStepFunctions.yamlParse();
41+
expect(serverless.pluginManager.cliOptions.stage).to.be.equal('dev');
6442
});
6543

6644
it('should default to us-east-1 when region and provider are not defined', () => {
6745
serverlessStepFunctions.serverless.pluginManager.cliOptions.region = null;
6846
serverlessStepFunctions.serverless.service.provider = null;
69-
serverlessStepFunctions.yamlParse()
70-
.then(() => {
71-
expect(serverless.pluginManager.cliOptions.region).to.be.equal('us-east-1');
72-
});
47+
serverlessStepFunctions.yamlParse();
48+
expect(serverless.pluginManager.cliOptions.region).to.be.equal('us-east-1');
7349
});
7450

7551
it('should not default to dev when stage is defined', () => {
7652
serverlessStepFunctions.serverless.pluginManager.cliOptions.stage = 'my-stage';
77-
serverlessStepFunctions.yamlParse()
78-
.then(() => {
79-
expect(serverless.pluginManager.cliOptions.stage).to.be.equal('my-stage');
80-
});
53+
serverlessStepFunctions.yamlParse();
54+
expect(serverless.pluginManager.cliOptions.stage).to.be.equal('my-stage');
8155
});
8256

8357
it('should not default to us-east-1 when region is defined', () => {
8458
serverlessStepFunctions.serverless.pluginManager.cliOptions.region = 'my-region';
85-
serverlessStepFunctions.yamlParse()
86-
.then(() => {
87-
expect(serverless.pluginManager.cliOptions.region).to.be.equal('my-region');
88-
});
89-
});
90-
91-
it('should throw error if servicePath is not given', () => {
92-
serverlessStepFunctions.serverless.config.servicePath = null;
93-
serverlessStepFunctions.yamlParse()
94-
.then(() => {
95-
expect(yamlParserStub.calledOnce).to.be.equal(false);
96-
expect(yamlObjectParserStub.calledOnce).to.be.equal(false);
97-
expect(populateServiceStub.calledOnce).to.be.equal(false);
98-
expect(serverless.service.stepFunctions).to.be.undefined; // eslint-disable-line
99-
});
100-
});
101-
102-
it('should create corresponding when stepfunctions param are given', () => {
103-
serverlessStepFunctions.serverless.variables.populateObject.restore();
104-
yamlObjectParserStub = sinon.stub(serverlessStepFunctions.serverless.variables,
105-
'populateObject').returns(BbPromise.resolve({
106-
stepFunctions: {
107-
stateMachines: 'stepFunctions',
108-
activities: 'my-activity',
109-
},
110-
}));
111-
serverlessStepFunctions.yamlParse()
112-
.then(() => {
113-
expect(yamlParserStub.calledOnce).to.be.equal(true);
114-
expect(yamlObjectParserStub.calledOnce).to.be.equal(true);
115-
expect(populateServiceStub.calledOnce).to.be.equal(true);
116-
expect(serverless.service.stepFunctions.stateMachines).to.be.equal('stepFunctions');
117-
expect(serverless.service.stepFunctions.activities).to.be.equal('my-activity');
118-
});
119-
});
120-
121-
it('should be able to load from a js file', () => {
122-
serverless.config.serverless.service.serviceFilename = 'serverless.js';
123-
const requireFileStub = sinon.stub(serverlessStepFunctions, 'loadFromRequiredFile')
124-
.returns(BbPromise.resolve({
125-
stepFunctions: {
126-
stateMachines: 'stepFunctions',
127-
activities: 'my-activity',
128-
},
129-
}));
130-
serverlessStepFunctions.yamlParse()
131-
.then(() => {
132-
expect(requireFileStub.calledOnce).to.be.equal(true);
133-
expect(serverless.service.stepFunctions.stateMachines).to.be.equal('stepFunctions');
134-
expect(serverless.service.stepFunctions.activities).to.be.equal('my-activity');
135-
});
136-
});
137-
138-
it('should be able to load from a json file', () => {
139-
serverless.config.serverless.service.serviceFilename = 'serverless.json';
140-
const requireFileStub = sinon.stub(serverlessStepFunctions, 'loadFromRequiredFile')
141-
.returns(BbPromise.resolve({
142-
stepFunctions: {
143-
stateMachines: 'stepFunctions',
144-
activities: 'my-activity',
145-
},
146-
}));
147-
serverlessStepFunctions.yamlParse()
148-
.then(() => {
149-
expect(requireFileStub.calledOnce).to.be.equal(true);
150-
expect(serverless.service.stepFunctions.stateMachines).to.be.equal('stepFunctions');
151-
expect(serverless.service.stepFunctions.activities).to.be.equal('my-activity');
152-
});
153-
});
154-
155-
it('should be able to load from a ts file', () => {
156-
serverless.config.serverless.service.serviceFilename = 'serverless.ts';
157-
const requireFileStub = sinon.stub(serverlessStepFunctions, 'loadFromRequiredFile')
158-
.returns(BbPromise.resolve({
159-
stepFunctions: {
160-
stateMachines: 'stepFunctions',
161-
activities: 'my-activity',
162-
},
163-
}));
164-
serverlessStepFunctions.yamlParse()
165-
.then(() => {
166-
expect(requireFileStub.calledOnce).to.be.equal(true);
167-
expect(serverless.service.stepFunctions.stateMachines).to.be.equal('stepFunctions');
168-
expect(serverless.service.stepFunctions.activities).to.be.equal('my-activity');
169-
});
59+
serverlessStepFunctions.yamlParse();
60+
expect(serverless.pluginManager.cliOptions.region).to.be.equal('my-region');
17061
});
17162

17263
it('should create empty object when stepfunctions param are not given', () => {
173-
serverlessStepFunctions.serverless.yamlParser.parse.restore();
174-
serverlessStepFunctions.serverless.variables.populateObject.restore();
175-
yamlParserStub = sinon.stub(serverlessStepFunctions.serverless.yamlParser, 'parse')
176-
.returns(BbPromise.resolve({
177-
stepFunctions: {},
178-
}));
179-
yamlObjectParserStub = sinon.stub(serverless.variables,
180-
'populateObject').returns(BbPromise.resolve({
181-
stepFunctions: {},
182-
}));
183-
serverlessStepFunctions.yamlParse()
184-
.then(() => {
185-
expect(yamlParserStub.calledOnce).to.be.equal(true);
186-
expect(yamlObjectParserStub.calledOnce).to.be.equal(true);
187-
expect(populateServiceStub.calledOnce).to.be.equal(true);
188-
expect(serverless.service.stepFunctions.stateMachines).to.be.deep.equal({});
189-
expect(serverless.service.stepFunctions.activities).to.be.deep.equal([]);
190-
});
191-
});
192-
193-
it('should default to serverless.yml if serviceFileName (--config option) is not passed', () => {
194-
const servicePath = serverlessStepFunctions.serverless.config.servicePath;
195-
serverlessStepFunctions.serverless.config.serverless.service.serviceFilename = undefined;
196-
197-
serverlessStepFunctions.yamlParse()
198-
.then(() => {
199-
expect(yamlParserStub.calledWith(`${servicePath}/serverless.yml`)).to.be.equal(true);
200-
});
201-
});
202-
203-
it('should read serviceFileName if passed as --config option', () => {
204-
const servicePath = serverlessStepFunctions.serverless.config.servicePath;
205-
const fileName = 'other_config.yml';
206-
serverlessStepFunctions.serverless.config.serverless.service.serviceFilename = fileName;
207-
208-
serverlessStepFunctions.yamlParse()
209-
.then(() => {
210-
expect(yamlParserStub.calledWith(`${servicePath}/${fileName}`)).to.be.equal(true);
211-
});
212-
});
213-
214-
it('should read relative serviceFileName path if passed as --config option', () => {
215-
const servicePath = serverlessStepFunctions.serverless.config.servicePath;
216-
const relativeFilename = './some_folder/other_config.yml';
217-
serverlessStepFunctions.options.config = relativeFilename;
218-
const serviceFilePath = path.normalize(`${servicePath}/${relativeFilename}`);
219-
serverlessStepFunctions.yamlParse()
220-
.then(() => {
221-
expect(yamlParserStub.calledWith(serviceFilePath)).to.be.equal(true);
222-
});
64+
serverlessStepFunctions.yamlParse();
65+
expect(serverless.service.stepFunctions.stateMachines).to.be.deep.equal({});
66+
expect(serverless.service.stepFunctions.activities).to.be.deep.equal([]);
22367
});
22468
});
22569

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@
5050
"chalk": "^1.1.1",
5151
"lodash": "^4.17.11"
5252
},
53+
"peerDependencies": {
54+
"serverless": "^2.32.0"
55+
},
5356
"husky": {
5457
"hooks": {
5558
"pre-commit": "lint-staged",

0 commit comments

Comments
 (0)