Skip to content
This repository was archived by the owner on Sep 2, 2025. It is now read-only.

Commit 181c0a1

Browse files
authored
Merge pull request dougmoscrop#44 from seanmarthur/master
Support optional peer dependencies via `packageJson.peerDependenciesMeta`
2 parents fd156a8 + 1646f2b commit 181c0a1

File tree

5 files changed

+38
-5
lines changed

5 files changed

+38
-5
lines changed

__tests__/fixtures/node_modules/optional-dep-meta-parent/index.js

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

__tests__/fixtures/node_modules/optional-dep-meta-parent/package.json

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
require('optional-dep-meta-parent');

__tests__/get-dependency-list.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ test('should handle requires to a missing optionalDependency listed in dependenc
8383
t.true(log.called);
8484
});
8585

86+
test('should handle requires to a missing peerDependency listed in peerDependenciesMeta as optional', (t) => {
87+
const fileName = path.join(__dirname, 'fixtures', 'optional-dep-meta-missing.js');
88+
const log = sinon.stub();
89+
90+
const list = getDependencyList(fileName, Object.assign({ cli: { log } }, serverless));
91+
92+
t.true(list.some(item => item.indexOf(`optional-dep-meta-missing.js`) !== -1));
93+
t.true(list.some(item => item.indexOf(`node_modules/optional-dep-meta-parent/index.js`) !== -1));
94+
t.true(log.called);
95+
});
96+
8697
test('includes a dependency with peerDependencies', (t) => {
8798
const fileName = path.join(__dirname, 'fixtures', 'dep-with-peer.js');
8899

get-dependency-list.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ const readPkgUp = require('read-pkg-up');
88
const requirePackageName = require('require-package-name');
99
const glob = require('glob');
1010

11-
function ignoreMissing(dependency, optional) {
12-
return optional && dependency in optional;
11+
function ignoreMissing(dependency, optional, peerDependenciesMeta) {
12+
return optional && dependency in optional
13+
|| peerDependenciesMeta && dependency in peerDependenciesMeta && peerDependenciesMeta[dependency].optional;
1314
}
1415

1516
module.exports = function(filename, serverless) {
@@ -21,7 +22,7 @@ module.exports = function(filename, serverless) {
2122
const modulesToProcess = [];
2223
const localFilesToProcess = [filename];
2324

24-
function handle(name, basedir, optionalDependencies) {
25+
function handle(name, basedir, optionalDependencies, peerDependenciesMeta) {
2526
const moduleName = requirePackageName(name.replace(/\\/, '/'));
2627

2728
try {
@@ -35,7 +36,7 @@ module.exports = function(filename, serverless) {
3536
}
3637
} catch (e) {
3738
if (e.code === 'MODULE_NOT_FOUND') {
38-
if (ignoreMissing(moduleName, optionalDependencies)) {
39+
if (ignoreMissing(moduleName, optionalDependencies, peerDependenciesMeta)) {
3940
serverless.cli.log(`[serverless-plugin-include-dependencies]: WARNING missing optional dependency: ${moduleName}`);
4041
return null;
4142
}
@@ -90,7 +91,7 @@ module.exports = function(filename, serverless) {
9091

9192
if (dependencies) {
9293
Object.keys(dependencies).forEach(dependency => {
93-
handle(dependency, currentModulePath, packageJson.optionalDependencies);
94+
handle(dependency, currentModulePath, packageJson.optionalDependencies, packageJson.peerDependenciesMeta);
9495
});
9596
}
9697
});

0 commit comments

Comments
 (0)