diff --git a/lib/resolver-compat.js b/lib/resolver-compat.js index c903118..a6d6ffc 100644 --- a/lib/resolver-compat.js +++ b/lib/resolver-compat.js @@ -322,8 +322,13 @@ function resolverFromOptions(vm, options, override, compiler) { } const resolved = customResolver(x, path); if (!resolved) return undefined; - if (externals) externals.push(new RegExp('^' + escapeRegExp(resolved))); - return resolver.loadAsFileOrDirecotry(resolved, extList); + if (typeof resolved === 'string') { + if (externals) externals.push(new RegExp('^' + escapeRegExp(resolved))); + return resolver.loadAsFileOrDirecotry(resolved, extList); + } + const {module=x, path: resolvedPath} = resolved; + if (externals) externals.push(new RegExp('^' + escapeRegExp(resolvedPath))); + return resolver.loadNodeModules(module, [resolvedPath], extList); }; } diff --git a/test/additional-modules/my-es-module/index.cjs b/test/additional-modules/my-es-module/index.cjs new file mode 100644 index 0000000..3ce63b7 --- /dev/null +++ b/test/additional-modules/my-es-module/index.cjs @@ -0,0 +1 @@ +module.exports = {additional_cjs_module: true}; \ No newline at end of file diff --git a/test/additional-modules/my-es-module/index.js b/test/additional-modules/my-es-module/index.js new file mode 100644 index 0000000..d64be1d --- /dev/null +++ b/test/additional-modules/my-es-module/index.js @@ -0,0 +1 @@ +export default {additional_es_module: true}; \ No newline at end of file diff --git a/test/additional-modules/my-es-module/package.json b/test/additional-modules/my-es-module/package.json new file mode 100644 index 0000000..fbd4420 --- /dev/null +++ b/test/additional-modules/my-es-module/package.json @@ -0,0 +1,11 @@ +{ + "main": "index.js", + "exports": { + ".": { + "default": { + "require": "./index.cjs", + "default": "./index.js" + } + } + } +} diff --git a/test/nodevm.js b/test/nodevm.js index 9d450d2..18b1180 100644 --- a/test/nodevm.js +++ b/test/nodevm.js @@ -239,6 +239,17 @@ describe('modules', () => { assert.ok(vm.run("require('my-module')", __filename)); }); + it('can resolve conditional exports with a custom resolver', () => { + const vm = new NodeVM({ + require: { + external: ['my-es-module'], + resolve: () => ({ path: path.resolve(__dirname, 'additional-modules') }) + } + }); + + assert.ok(vm.run("require('my-es-module')", __filename)); + }) + it('allows for multiple root folders', () => { const vm = new NodeVM({ require: {