From 5a86675641bbc22e27a601b2ef462ed4c7afc47a Mon Sep 17 00:00:00 2001 From: klaviyo-nick Date: Thu, 2 Feb 2023 15:41:10 -0500 Subject: [PATCH 1/5] Support conditional export resolution with custom resolver --- lib/resolver-compat.js | 9 +++++++-- test/additional-modules/my-es-module/index.cjs | 1 + test/additional-modules/my-es-module/index.js | 1 + test/additional-modules/my-es-module/package.json | 11 +++++++++++ test/nodevm.js | 11 +++++++++++ 5 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 test/additional-modules/my-es-module/index.cjs create mode 100644 test/additional-modules/my-es-module/index.js create mode 100644 test/additional-modules/my-es-module/package.json 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: { From 1da44154eedaa3d25e68740e1435b191f07814ce Mon Sep 17 00:00:00 2001 From: klaviyo-nick Date: Thu, 2 Feb 2023 15:55:22 -0500 Subject: [PATCH 2/5] add missing semicolon --- test/nodevm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/nodevm.js b/test/nodevm.js index 18b1180..58addb3 100644 --- a/test/nodevm.js +++ b/test/nodevm.js @@ -248,7 +248,7 @@ describe('modules', () => { }); assert.ok(vm.run("require('my-es-module')", __filename)); - }) + }); it('allows for multiple root folders', () => { const vm = new NodeVM({ From 4659ce006e33d453fd25639ffb4656ace95f8a90 Mon Sep 17 00:00:00 2001 From: klaviyo-nick Date: Thu, 2 Feb 2023 16:00:51 -0500 Subject: [PATCH 3/5] add additional return type for resolve signature --- index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index 25f90fe..4c5bf30 100644 --- a/index.d.ts +++ b/index.d.ts @@ -82,7 +82,7 @@ export interface VMRequire { /** Collection of mock modules (both external or built-in). */ mock?: any; /* An additional lookup function in case a module wasn't found in one of the traditional node lookup paths. */ - resolve?: (moduleName: string, parentDirname: string) => string | undefined; + resolve?: (moduleName: string, parentDirname: string) => string | { path: string } | undefined; /** Custom require to require host and built-in modules. */ customRequire?: (id: string) => any; /** Load modules in strict mode. (default: true) */ From c70d945fc8ab01a6310efe76a3c1180168cc017f Mon Sep 17 00:00:00 2001 From: klaviyo-nick Date: Thu, 2 Feb 2023 16:07:01 -0500 Subject: [PATCH 4/5] add 'type':'module' in es module package.json --- test/additional-modules/my-es-module/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/test/additional-modules/my-es-module/package.json b/test/additional-modules/my-es-module/package.json index fbd4420..31b4500 100644 --- a/test/additional-modules/my-es-module/package.json +++ b/test/additional-modules/my-es-module/package.json @@ -1,5 +1,6 @@ { "main": "index.js", + "type": "module", "exports": { ".": { "default": { From eefe3f1eb1871d500c10c700feb735c730150f95 Mon Sep 17 00:00:00 2001 From: klaviyo-nick Date: Thu, 2 Feb 2023 16:28:16 -0500 Subject: [PATCH 5/5] update .eslintignore;update index.d.ts resolve return type --- .eslintignore | 3 ++- index.d.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.eslintignore b/.eslintignore index 7e0189b..51340c9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ /test.js /node-* -/lib/events.js \ No newline at end of file +/lib/events.js +/test/additional-modules/my-es-module/index.js \ No newline at end of file diff --git a/index.d.ts b/index.d.ts index 4c5bf30..ceb1c0d 100644 --- a/index.d.ts +++ b/index.d.ts @@ -82,7 +82,7 @@ export interface VMRequire { /** Collection of mock modules (both external or built-in). */ mock?: any; /* An additional lookup function in case a module wasn't found in one of the traditional node lookup paths. */ - resolve?: (moduleName: string, parentDirname: string) => string | { path: string } | undefined; + resolve?: (moduleName: string, parentDirname: string) => string | { path: string, module?: string } | undefined; /** Custom require to require host and built-in modules. */ customRequire?: (id: string) => any; /** Load modules in strict mode. (default: true) */