diff --git a/README.md b/README.md index 77cb48f..f3d9b7a 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,21 @@ custom: handlerRoot: ../../ ``` +## Suppress "missing optional dependency" warning +When building you may have missing optional dependencies that are not installed. In this case you will receive messages like: + +``` +Serverless: [serverless-plugin-include-dependencies]: WARNING missing optional dependency: aws-crt +``` + +To suppress these messages, add a list of the optional dependencies to ignore + +```yaml +custom: + ignoreOptionalDependenciesList: + - aws-crt +``` + ## New In 2.0 - Exclusion Support Rather than including module folders (e.g. `node_modules/foo/**`, it now includes a list of actual files (e.g. `node_modules/foo/package.json`, `node_modules/foo/index.js`) and *uses the serverless package patterns* to filter these files. Patterns *must* start with `!node_modules` to be considered by this plugin. diff --git a/__tests__/get-dependency-list.js b/__tests__/get-dependency-list.js index 65f1f0f..e6534e4 100644 --- a/__tests__/get-dependency-list.js +++ b/__tests__/get-dependency-list.js @@ -87,6 +87,18 @@ test('should handle requires to a missing optionalDependency listed in dependenc t.true(log.called); }); +test('should suppress missing optionalDependency warning', (t) => { + const fileName = path.join(__dirname, 'fixtures', 'optional-dep-missing.js'); + const log = sinon.stub(); + const ignoreOptionalDependenciesList = ['optional-dep-wont-be-found']; + + const list = getDependencyList(fileName, Object.assign({ cli: { log } }, serverless), ignoreOptionalDependenciesList); + + t.true(list.some(item => item.indexOf(`optional-dep-missing.js`) !== -1)); + t.true(list.some(item => item.indexOf(`node_modules/optional-dep-parent/index.js`) !== -1)); + t.true(log.notCalled); +}); + test('should handle requires to a missing peerDependency listed in peerDependenciesMeta as optional', (t) => { const fileName = path.join(__dirname, 'fixtures', 'optional-dep-meta-missing.js'); const log = sinon.stub(); @@ -129,8 +141,8 @@ test('caches lookups', (t) => { const fileName2 = path.join(__dirname, 'fixtures', 'redundancies-2.js'); const cache = new Set(); - const list1 = getDependencyList(fileName, serverless, cache); - const list2 = getDependencyList(fileName2, serverless, cache); + const list1 = getDependencyList(fileName, serverless, [], cache); + const list2 = getDependencyList(fileName2, serverless, [], cache); t.true(list1.some(item => item.endsWith('local/named/index.js'))); t.true(list1.some(item => item.endsWith('symlinked.js'))); diff --git a/get-dependency-list.js b/get-dependency-list.js index 8b06137..1cf0757 100644 --- a/get-dependency-list.js +++ b/get-dependency-list.js @@ -13,7 +13,7 @@ function ignoreMissing(dependency, optional, peerDependenciesMeta) { || peerDependenciesMeta && dependency in peerDependenciesMeta && peerDependenciesMeta[dependency].optional; } -module.exports = function(filename, serverless, cache) { +module.exports = function(filename, serverless, ignoreOptionalDependenciesList = [], cache) { const servicePath = serverless.config.servicePath; const modulePaths = new Set(); const filePaths = new Set(); @@ -44,6 +44,10 @@ module.exports = function(filename, serverless, cache) { } catch (e) { if (e.code === 'MODULE_NOT_FOUND') { if (ignoreMissing(moduleName, optionalDependencies, peerDependenciesMeta)) { + if (ignoreOptionalDependenciesList.includes(moduleName)) { + return null; + } + serverless.cli.log(`[serverless-plugin-include-dependencies]: WARNING missing optional dependency: ${moduleName}`); return null; } diff --git a/include-dependencies.js b/include-dependencies.js index 234f5f4..023d074 100644 --- a/include-dependencies.js +++ b/include-dependencies.js @@ -145,7 +145,8 @@ module.exports = class IncludeDependencies { getDependencies(fileName, patterns, useCache = false) { const servicePath = this.serverless.config.servicePath; - const dependencies = getDependencyList(fileName, this.serverless, useCache && this.cache) || []; + const ignoreOptionalDependenciesList = this.getPluginOptions().ignoreOptionalDependenciesList || []; + const dependencies = getDependencyList(fileName, this.serverless, ignoreOptionalDependenciesList, useCache && this.cache) || []; const relativeDependencies = dependencies.map(p => path.relative(servicePath, p)); const exclusions = patterns.filter(p => p.startsWith('!') && p.includes('node_modules'));