Skip to content

Commit 68104f6

Browse files
authored
Add and include peer dependencies (#231)
* Add and include 2nd level peer dependencies * Only inspect peers for direct dependencies * Added unit tests for peer dependencies
1 parent 60680f4 commit 68104f6

File tree

6 files changed

+406
-2
lines changed

6 files changed

+406
-2
lines changed

lib/packExternalModules.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,24 @@ function getProdModules(externalModules, packagePath, dependencyGraph) {
2424

2525
if (moduleVersion) {
2626
prodModules.push(`${module.external}@${moduleVersion}`);
27+
28+
// Check if the module has any peer dependencies and include them too
29+
try {
30+
const modulePackagePath = path.join(
31+
path.dirname(path.join(process.cwd(), packagePath)),
32+
'node_modules',
33+
module.external,
34+
'package.json'
35+
);
36+
const peerDependencies = require(modulePackagePath).peerDependencies;
37+
if (!_.isEmpty(peerDependencies)) {
38+
this.options.verbose && this.serverless.cli.log(`Adding explicit peers for dependency ${module.external}`);
39+
const peerModules = getProdModules.call(this, _.map(peerDependencies, (value, key) => ({ external: key })), packagePath, dependencyGraph);
40+
Array.prototype.push.apply(prodModules, peerModules);
41+
}
42+
} catch (e) {
43+
this.serverless.cli.log(`WARNING: Could not check for peer dependencies of ${module.external}`);
44+
}
2745
} else if (!_.has(packageJson, `devDependencies.${module.external}`)) {
2846
// Add transient dependencies if they appear not in the service's dev dependencies
2947
const originInfo = _.get(dependencyGraph, `dependencies.${module.origin}`, {});

tests/data/npm-ls-peerdeps.json

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
{
2+
"name": "serverless-webpack-babel-example",
3+
"version": "1.0.0",
4+
"dependencies": {
5+
"bluebird": {
6+
"version": "3.5.0",
7+
"from": "bluebird",
8+
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz"
9+
},
10+
"request": {
11+
"version": "2.82.0",
12+
"from": "request@^2.34",
13+
"resolved": "https://registry.npmjs.org/request/-/request-2.82.0.tgz",
14+
"dependencies": {
15+
"aws-sign2": {
16+
"version": "0.7.0",
17+
"from": "aws-sign2@~0.7.0",
18+
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz"
19+
},
20+
"aws4": {
21+
"version": "1.6.0",
22+
"from": "aws4@^1.6.0",
23+
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz"
24+
},
25+
"caseless": {
26+
"version": "0.12.0",
27+
"from": "caseless@~0.12.0",
28+
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
29+
},
30+
"combined-stream": {
31+
"version": "1.0.5",
32+
"from": "combined-stream@^1.0.5",
33+
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz"
34+
},
35+
"extend": {
36+
"version": "3.0.1",
37+
"from": "extend@3",
38+
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz"
39+
},
40+
"forever-agent": {
41+
"version": "0.6.1",
42+
"from": "forever-agent@~0.6.1",
43+
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
44+
},
45+
"form-data": {
46+
"version": "2.3.1",
47+
"from": "form-data@^2.1.1",
48+
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz"
49+
},
50+
"har-validator": {
51+
"version": "5.0.3",
52+
"from": "har-validator@~5.0.3",
53+
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz"
54+
},
55+
"hawk": {
56+
"version": "6.0.2",
57+
"from": "hawk@~6.0.2",
58+
"resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz"
59+
},
60+
"http-signature": {
61+
"version": "1.2.0",
62+
"from": "http-signature@~1.2.0",
63+
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz"
64+
},
65+
"is-typedarray": {
66+
"version": "1.0.0",
67+
"from": "is-typedarray@~1.0.0",
68+
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
69+
},
70+
"isstream": {
71+
"version": "0.1.2",
72+
"from": "isstream@~0.1.2",
73+
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
74+
},
75+
"json-stringify-safe": {
76+
"version": "5.0.1",
77+
"from": "[email protected]",
78+
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
79+
},
80+
"mime-types": {
81+
"version": "2.1.17",
82+
"from": "mime-types@^2.1.12",
83+
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz"
84+
},
85+
"oauth-sign": {
86+
"version": "0.8.2",
87+
"from": "oauth-sign@~0.8.2",
88+
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz"
89+
},
90+
"performance-now": {
91+
"version": "2.1.0",
92+
"from": "performance-now@^2.1.0",
93+
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz"
94+
},
95+
"qs": {
96+
"version": "6.5.1",
97+
"from": "qs@^6.4.0",
98+
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz"
99+
},
100+
"uuid": {
101+
"version": "3.1.0",
102+
"from": "uuid@^3.1.0",
103+
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz"
104+
},
105+
"safe-buffer": {
106+
"version": "5.1.1",
107+
"from": "safe-buffer@~5.1.1",
108+
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz"
109+
},
110+
"stringstream": {
111+
"version": "0.0.5",
112+
"from": "stringstream@~0.0.5",
113+
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz"
114+
},
115+
"tough-cookie": {
116+
"version": "2.3.2",
117+
"from": "tough-cookie@>=2.3.0",
118+
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz"
119+
},
120+
"tunnel-agent": {
121+
"version": "0.6.0",
122+
"from": "tunnel-agent@^0.6.0",
123+
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz"
124+
}
125+
}
126+
},
127+
"request-promise": {
128+
"version": "4.2.1",
129+
"from": "request-promise",
130+
"resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.1.tgz",
131+
"dependencies": {
132+
"bluebird": {
133+
"version": "3.5.0",
134+
"from": "bluebird",
135+
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz"
136+
},
137+
"request-promise-core": {
138+
"version": "1.1.1",
139+
"from": "[email protected]",
140+
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz"
141+
},
142+
"stealthy-require": {
143+
"version": "1.1.1",
144+
"from": "stealthy-require@^1.1.0",
145+
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz"
146+
},
147+
"tough-cookie": {
148+
"version": "2.3.2",
149+
"from": "tough-cookie@>=2.3.0",
150+
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz"
151+
}
152+
}
153+
}
154+
}
155+
}

tests/data/package-peerdeps.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"name": "serverless-webpack-babel-example",
3+
"version": "1.0.0",
4+
"description": "Serverless webpack example using Babel",
5+
"scripts": {
6+
"test": "echo \"Error: no test specified\" && exit 1"
7+
},
8+
"author": "Nicola Peduzzi <[email protected]> (http://nikso.net)",
9+
"license": "MIT",
10+
"devDependencies": {
11+
"babel-core": "^6.25.0",
12+
"babel-loader": "^7.1.1",
13+
"babel-plugin-transform-runtime": "^6.23.0",
14+
"babel-polyfill": "^6.26.0",
15+
"babel-preset-env": "^1.6.0",
16+
"serverless": "^1.22.0",
17+
"serverless-webpack": "^3.0.0",
18+
"webpack": "^3.3.0",
19+
"webpack-node-externals": "^1.6.0"
20+
},
21+
"dependencies": {
22+
"bluebird": "^3.5.0",
23+
"request": "^2.82.0",
24+
"request-promise": "^4.2.1"
25+
}
26+
}

tests/data/rp-package.json

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
{
2+
"_from": "request-promise",
3+
4+
"_inBundle": false,
5+
"_integrity": "sha1-fuxWyJMXqCLL/qmbA5zlQ8LhX2c=",
6+
"_location": "/request-promise",
7+
"_phantomChildren": {},
8+
"_requested": {
9+
"type": "tag",
10+
"registry": true,
11+
"raw": "request-promise",
12+
"name": "request-promise",
13+
"escapedName": "request-promise",
14+
"rawSpec": "",
15+
"saveSpec": null,
16+
"fetchSpec": "latest"
17+
},
18+
"_requiredBy": [
19+
"#USER",
20+
"/"
21+
],
22+
"_resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.1.tgz",
23+
"_shasum": "7eec56c89317a822cbfea99b039ce543c2e15f67",
24+
"_spec": "request-promise",
25+
"_where": "C:\\Projects\\serverless\\test\\babel-dynamically-entries",
26+
"author": {
27+
"name": "Nicolai Kamenzky",
28+
"url": "https://github.com/analog-nico"
29+
},
30+
"bugs": {
31+
"url": "https://github.com/request/request-promise/issues"
32+
},
33+
"bundleDependencies": false,
34+
"dependencies": {
35+
"bluebird": "^3.5.0",
36+
"request-promise-core": "1.1.1",
37+
"stealthy-require": "^1.1.0",
38+
"tough-cookie": ">=2.3.0"
39+
},
40+
"deprecated": false,
41+
"description": "The simplified HTTP request client 'request' with Promise support. Powered by Bluebird.",
42+
"devDependencies": {
43+
"body-parser": "~1.15.2",
44+
"chai": "~3.5.0",
45+
"chalk": "~1.1.3",
46+
"gulp": "~3.9.1",
47+
"gulp-coveralls": "~0.1.4",
48+
"gulp-eslint": "~2.1.0",
49+
"gulp-istanbul": "~1.0.0",
50+
"gulp-mocha": "~2.2.0",
51+
"lodash": "~4.13.1",
52+
"publish-please": "~2.1.4",
53+
"request": "^2.34.0",
54+
"rimraf": "~2.5.3",
55+
"run-sequence": "~1.2.2"
56+
},
57+
"engines": {
58+
"node": ">=0.10.0"
59+
},
60+
"homepage": "https://github.com/request/request-promise#readme",
61+
"keywords": [
62+
"xhr",
63+
"http",
64+
"https",
65+
"promise",
66+
"request",
67+
"then",
68+
"thenable",
69+
"bluebird"
70+
],
71+
"license": "ISC",
72+
"main": "./lib/rp.js",
73+
"name": "request-promise",
74+
"peerDependencies": {
75+
"request": "^2.34"
76+
},
77+
"repository": {
78+
"type": "git",
79+
"url": "git+https://github.com/request/request-promise.git"
80+
},
81+
"scripts": {
82+
"prepublish": "publish-please guard",
83+
"publish-please": "publish-please",
84+
"test": "gulp ci",
85+
"test-publish": "gulp ci-no-cov"
86+
},
87+
"version": "4.2.1"
88+
}

tests/data/stats-peerdeps.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
const _ = require('lodash');
2+
3+
module.exports = {
4+
stats: [
5+
{
6+
compilation: {
7+
chunks: [
8+
{
9+
modules: [
10+
{
11+
identifier: _.constant('"crypto"')
12+
},
13+
{
14+
identifier: _.constant('"uuid/v4"')
15+
},
16+
{
17+
identifier: _.constant('"mockery"')
18+
},
19+
{
20+
identifier: _.constant('"@scoped/vendor/module1"')
21+
},
22+
{
23+
identifier: _.constant('external "bluebird"')
24+
},
25+
{
26+
identifier: _.constant('external "request-promise"')
27+
}
28+
]
29+
}
30+
],
31+
compiler: {
32+
outputPath: '/my/Service/Path/.webpack/service'
33+
}
34+
}
35+
}
36+
]
37+
};

0 commit comments

Comments
 (0)