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

Commit e4a2f18

Browse files
committed
Use caching to reduce redundant work
1 parent c1e0d41 commit e4a2f18

File tree

8 files changed

+36
-9
lines changed

8 files changed

+36
-9
lines changed

__tests__/fixtures/bar/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
require('../babel');
12
module.exports = require('./baz');
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
require('local/named');

__tests__/fixtures/foo/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
require('../babel');
12
module.exports = require('./baz');

__tests__/get-dependency-list.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,17 @@ test('understands local named dependencies', (t) => {
119119
t.true(list.some(item => item.endsWith('dep-local-named.js')));
120120
t.true(list.some(item => item.endsWith('local/named/index.js')));
121121
});
122+
123+
test('caches lookups', (t) => {
124+
const fileName = path.join(__dirname, 'fixtures', 'dep-local-named.js');
125+
const fileName2 = path.join(__dirname, 'fixtures', 'dep-local-named-2.js');
126+
127+
const cache = new Set();
128+
const list1 = getDependencyList(fileName, serverless, cache);
129+
const list2 = getDependencyList(fileName2, serverless, cache);
130+
131+
t.true(list1.some(item => item.endsWith('dep-local-named.js')));
132+
t.true(list1.some(item => item.endsWith('local/named/index.js')));
133+
t.true(list2.some(item => item.endsWith('dep-local-named-2.js')));
134+
t.false(list2.some(item => item.endsWith('local/named/index.js')));
135+
});

get-dependency-list.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,23 @@ function ignoreMissing(dependency, optional, peerDependenciesMeta) {
1313
|| peerDependenciesMeta && dependency in peerDependenciesMeta && peerDependenciesMeta[dependency].optional;
1414
}
1515

16-
module.exports = function(filename, serverless) {
16+
module.exports = function(filename, serverless, _cache) {
1717
const servicePath = serverless.config.servicePath;
18-
19-
const filePaths = new Set();
2018
const modulePaths = new Set();
21-
19+
const filePaths = new Set();
20+
const cache = _cache || new Set();
2221
const modulesToProcess = [];
2322
const localFilesToProcess = [filename];
2423

2524
function handle(name, basedir, optionalDependencies, peerDependenciesMeta) {
2625
const moduleName = requirePackageName(name.replace(/\\/, '/'));
2726

27+
if (cache.has(`${basedir}:${name}`)) {
28+
return;
29+
}
30+
31+
cache.add(`${basedir}:${name}`);
32+
2833
try {
2934
const pathToModule = resolve.sync(path.join(moduleName, 'package.json'), { basedir });
3035
const pkg = readPkgUp.sync({ cwd: pathToModule });

include-dependencies.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ module.exports = class IncludeDependencies {
2323

2424
this.serverless = serverless;
2525
this.options = options;
26+
this.globalCache = new Set();
27+
28+
const service = this.serverless.service;
29+
this.individually = service.package && service.package.individually;
2630

2731
this.hooks = {
2832
'before:deploy:function:packageFunction': this.functionDeploy.bind(this),
@@ -93,7 +97,7 @@ module.exports = class IncludeDependencies {
9397
return;
9498
}
9599
const include = union(options.always, []);
96-
if (service.package && service.package.individually) {
100+
if (this.individually) {
97101
const exclude = union(service.package.exclude, functionObject.package.exclude);
98102
this.includeGlobs(functionObject, include, exclude);
99103
} else {
@@ -107,7 +111,7 @@ module.exports = class IncludeDependencies {
107111

108112
const fileName = this.getHandlerFilename(functionObject.handler);
109113

110-
if (service.package && service.package.individually) {
114+
if (this.individually) {
111115
const exclude = union(service.package.exclude, functionObject.package.exclude);
112116
const dependencies = this.getDependencies(fileName, exclude);
113117

@@ -149,7 +153,8 @@ module.exports = class IncludeDependencies {
149153
}
150154

151155
getDependencyList(fileName) {
152-
return getDependencyList(fileName, this.serverless);
156+
const cache = this.individually ? new Set() : this.globalCache;
157+
return getDependencyList(fileName, this.serverless, cache);
153158
}
154159

155160
include(target, dependencies) {

package-lock.json

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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "serverless-plugin-include-dependencies",
3-
"version": "4.1.0",
3+
"version": "4.1.1",
44
"engines": {
55
"node": ">=4.0"
66
},

0 commit comments

Comments
 (0)