Skip to content

Commit 70c87ba

Browse files
author
Gareth Jones
committed
handle missing modules in submodules required from sandboxed modules
1 parent 5f3cac4 commit 70c87ba

4 files changed

Lines changed: 26 additions & 12 deletions

File tree

lib/sandboxed_module.js

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,11 @@ SandboxedModule.prototype._createRecursiveRequireProxy = function() {
169169
cache[this.filename] = this.exports;
170170
var globals = this.globals;
171171

172-
var options;
172+
var options = {};
173173
if(!this._options.sourceTransformersSingleOnly && this._options.sourceTransformers){
174-
options = {
175-
sourceTransformers: this._options.sourceTransformers
176-
};
174+
options.sourceTransformers = this._options.sourceTransformers;
177175
}
176+
options.ignoreMissing = this._options.ignoreMissing;
178177

179178
function createInnerSandboxedModule(requestedFilename){
180179
// load nested dependency in sandboxed module
@@ -214,11 +213,17 @@ SandboxedModule.prototype._createRecursiveRequireProxy = function() {
214213
if (request in cache) return cache[request];
215214
return require(request);
216215
}
216+
217217
// cached modules
218-
var requestedFilename = requireLike(this.filename).resolve(request);
219-
if (requestedFilename in cache) return cache[requestedFilename];
220-
var sandboxedModule = createInnerSandboxedModule(requestedFilename)
221-
return sandboxedModule.exports;
218+
try {
219+
var requestedFilename = requireLike(this.filename).resolve(request);
220+
if (requestedFilename in cache) return cache[requestedFilename];
221+
var sandboxedModule = createInnerSandboxedModule(requestedFilename)
222+
return sandboxedModule.exports;
223+
} catch (e) {
224+
if (this._options.ignoreMissing && request in cache) return cache[request];
225+
throw e;
226+
}
222227
}
223228
return RecursiveRequireProxy.bind(this);
224229
}

test/fixture/loads-missing.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
exports.doesNotExist = require('doesNotExist');
2+
exports.alsoDoesNotExist = require('./alsoDoesNotExist');
3+
exports.subModule = require('./subModule');

test/fixture/subModule.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
exports.requiredFromSubModule = require('requiredFromSubModule');
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
var assert = require('assert');
22
var SandboxedModule = require('../..');
33

4-
var foo = SandboxedModule.require('../fixture/foo', {
5-
"requires": {"doesNotExist": {}},
4+
var foo = SandboxedModule.require('../fixture/loads-missing', {
5+
"requires": {
6+
"doesNotExist": { fake: true },
7+
"./alsoDoesNotExist": { cheese: 'gouda' },
8+
"requiredFromSubModule": { didItWork: 'yes' }
9+
},
610
"ignoreMissing": true
711
});
8-
assert.strictEqual(foo.foo, 'foo');
9-
assert.strictEqual(foo.bar, 'bar');
12+
assert.ok(foo.doesNotExist.fake);
13+
assert.strictEqual(foo.alsoDoesNotExist.cheese, 'gouda');
14+
assert.strictEqual(foo.subModule.requiredFromSubModule.didItWork, 'yes');

0 commit comments

Comments
 (0)