From 5f641c623fcbeed455047b75a9e6c51f40268f44 Mon Sep 17 00:00:00 2001 From: Andrew Hyndman Date: Wed, 9 Feb 2022 15:13:44 -0800 Subject: [PATCH 1/8] [node-resolve] Implement new modulePaths option --- packages/node-resolve/src/index.js | 3 ++- packages/node-resolve/src/resolveImportSpecifiers.js | 12 +++++++++++- packages/node-resolve/types/index.d.ts | 9 ++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/node-resolve/src/index.js b/packages/node-resolve/src/index.js index 7e717a018..9a73b5cfb 100644 --- a/packages/node-resolve/src/index.js +++ b/packages/node-resolve/src/index.js @@ -44,7 +44,7 @@ export function nodeResolve(opts = {}) { const { warnings } = handleDeprecatedOptions(opts); const options = { ...defaults, ...opts }; - const { extensions, jail, moduleDirectories, ignoreSideEffectsForRoot } = options; + const { extensions, jail, moduleDirectories, modulePaths, ignoreSideEffectsForRoot } = options; const conditionsEsm = [...baseConditionsEsm, ...(options.exportConditions || [])]; const conditionsCjs = [...baseConditionsCjs, ...(options.exportConditions || [])]; const packageInfoCache = new Map(); @@ -167,6 +167,7 @@ export function nodeResolve(opts = {}) { useBrowserOverrides, baseDir, moduleDirectories, + modulePaths, rootDir, ignoreSideEffectsForRoot }); diff --git a/packages/node-resolve/src/resolveImportSpecifiers.js b/packages/node-resolve/src/resolveImportSpecifiers.js index e0a5b0466..39563ad0b 100644 --- a/packages/node-resolve/src/resolveImportSpecifiers.js +++ b/packages/node-resolve/src/resolveImportSpecifiers.js @@ -43,6 +43,7 @@ async function resolveIdClassic({ useBrowserOverrides, baseDir, moduleDirectories, + modulePaths, rootDir, ignoreSideEffectsForRoot }) { @@ -77,6 +78,7 @@ async function resolveIdClassic({ extensions, includeCoreModules: false, moduleDirectory: moduleDirectories, + paths: modulePaths, preserveSymlinks, packageFilter: filter }; @@ -111,6 +113,7 @@ async function resolveWithExportMap({ useBrowserOverrides, baseDir, moduleDirectories, + modulePaths, rootDir, ignoreSideEffectsForRoot }) { @@ -130,7 +133,8 @@ async function resolveWithExportMap({ preserveSymlinks, useBrowserOverrides, baseDir, - moduleDirectories + moduleDirectories, + modulePaths }); } }); @@ -180,6 +184,7 @@ async function resolveWithExportMap({ extensions, includeCoreModules: false, moduleDirectory: moduleDirectories, + paths: modulePaths, preserveSymlinks, packageFilter: filter }; @@ -230,6 +235,7 @@ async function resolveWithClassic({ useBrowserOverrides, baseDir, moduleDirectories, + modulePaths, rootDir, ignoreSideEffectsForRoot }) { @@ -247,6 +253,7 @@ async function resolveWithClassic({ useBrowserOverrides, baseDir, moduleDirectories, + modulePaths, rootDir, ignoreSideEffectsForRoot }); @@ -275,6 +282,7 @@ export default async function resolveImportSpecifiers({ useBrowserOverrides, baseDir, moduleDirectories, + modulePaths, rootDir, ignoreSideEffectsForRoot }) { @@ -290,6 +298,7 @@ export default async function resolveImportSpecifiers({ useBrowserOverrides, baseDir, moduleDirectories, + modulePaths, rootDir, ignoreSideEffectsForRoot }); @@ -315,6 +324,7 @@ export default async function resolveImportSpecifiers({ useBrowserOverrides, baseDir, moduleDirectories, + modulePaths, rootDir, ignoreSideEffectsForRoot }); diff --git a/packages/node-resolve/types/index.d.ts b/packages/node-resolve/types/index.d.ts index 1b2228a37..11d5bfc18 100755 --- a/packages/node-resolve/types/index.d.ts +++ b/packages/node-resolve/types/index.d.ts @@ -31,11 +31,18 @@ export interface RollupNodeResolveOptions { browser?: boolean; /** - * One or more directories in which to recursively look for modules. + * A list of directory names in which to recursively look for modules. * @default ['node_modules'] */ moduleDirectories?: string[]; + /** + * A list of absolute paths to additional locations to search for modules. + * This is analogous to setting the `NODE_PATH` environment variable for node. + * @default [] + */ + modulePaths?: string[]; + /** * An `Array` of modules names, which instructs the plugin to force resolving for the * specified modules to the root `node_modules`. Helps to prevent bundling the same From b4b6bec269291fb701b3d59d178461af0be251af Mon Sep 17 00:00:00 2001 From: Andrew Hyndman Date: Wed, 9 Feb 2022 15:48:53 -0800 Subject: [PATCH 2/8] Add unit tests distinguishing modulePaths from moduleDirectories --- .../test/fixtures/custom-module-path/main.js | 3 ++ .../package-with-dependency/main.js | 3 ++ .../node_modules/dependency/main.js | 1 + .../node_modules/dependency/package.json | 3 ++ .../package-with-dependency/package.json | 3 ++ packages/node-resolve/test/test.js | 30 +++++++++++++++++++ 6 files changed, 43 insertions(+) create mode 100644 packages/node-resolve/test/fixtures/custom-module-path/main.js create mode 100644 packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/main.js create mode 100644 packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/node_modules/dependency/main.js create mode 100644 packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/node_modules/dependency/package.json create mode 100644 packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/package.json diff --git a/packages/node-resolve/test/fixtures/custom-module-path/main.js b/packages/node-resolve/test/fixtures/custom-module-path/main.js new file mode 100644 index 000000000..0bf020d0b --- /dev/null +++ b/packages/node-resolve/test/fixtures/custom-module-path/main.js @@ -0,0 +1,3 @@ +import PACKAGE, {dependency} from 'package-with-dependency'; + +export { PACKAGE, dependency }; diff --git a/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/main.js b/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/main.js new file mode 100644 index 000000000..3b8eea697 --- /dev/null +++ b/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/main.js @@ -0,0 +1,3 @@ +export { dependency } from 'dependency'; + +export default 'PACKAGE_WITH_DEPENDENCY'; diff --git a/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/node_modules/dependency/main.js b/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/node_modules/dependency/main.js new file mode 100644 index 000000000..65a4dacab --- /dev/null +++ b/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/node_modules/dependency/main.js @@ -0,0 +1 @@ +export const dependency = 'DEPENDENCY'; diff --git a/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/node_modules/dependency/package.json b/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/node_modules/dependency/package.json new file mode 100644 index 000000000..daef9fcad --- /dev/null +++ b/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/node_modules/dependency/package.json @@ -0,0 +1,3 @@ +{ + "main": "main.js" +} diff --git a/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/package.json b/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/package.json new file mode 100644 index 000000000..daef9fcad --- /dev/null +++ b/packages/node-resolve/test/fixtures/custom-module-path/node_modules/package-with-dependency/package.json @@ -0,0 +1,3 @@ +{ + "main": "main.js" +} diff --git a/packages/node-resolve/test/test.js b/packages/node-resolve/test/test.js index 5ab2843d5..dd3a7b975 100755 --- a/packages/node-resolve/test/test.js +++ b/packages/node-resolve/test/test.js @@ -273,6 +273,36 @@ test('allows custom moduleDirectories with legacy customResolveOptions.moduleDir t.snapshot(warnings); }); +test('custom moduleDirectories do not support nested dependencies', async (t) => { + const warnings = []; + const bundle = await rollup({ + input: 'custom-module-path/main.js', + onwarn: (warning) => warnings.push(warning), + plugins: [ + nodeResolve({ + moduleDirectories: [join(process.cwd(), 'custom-module-path/node_modules')] + }) + ] + }); + + t.is(warnings.length, 1); + t.is(bundle.cache.modules.length, 2); +}); + +test('allows custom modulePaths', async (t) => { + const bundle = await rollup({ + input: 'custom-module-path/main.js', + onwarn: failOnWarn(t), + plugins: [ + nodeResolve({ + modulePaths: [join(process.cwd(), 'custom-module-path/node_modules')] + }) + ] + }); + + t.is(bundle.cache.modules.length, 3); +}); + test('ignores deep-import non-modules', async (t) => { const warnings = []; const bundle = await rollup({ From 80ab484e542fdaa577f3f1acef20950281d3e6c6 Mon Sep 17 00:00:00 2001 From: Andrew Hyndman Date: Wed, 9 Feb 2022 15:52:48 -0800 Subject: [PATCH 3/8] Document new option --- packages/node-resolve/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/node-resolve/README.md b/packages/node-resolve/README.md index 2c8c4120e..48613f4e2 100755 --- a/packages/node-resolve/README.md +++ b/packages/node-resolve/README.md @@ -75,7 +75,14 @@ If `true`, instructs the plugin to use the browser module resolutions in `packag Type: `Array[...String]`
Default: `['node_modules']` -One or more directories in which to recursively look for modules. +A list of directory names in which to recursively look for modules. + +### `modulePaths` + +Type: `Array[...String]`
+Default: `[]` + +A list of absolute paths to additional locations to search for modules. This is analogous to setting the `NODE_PATH` environment variable for node. ### `dedupe` From 03258376e600b734a7860c4d1776bc5c3a36a2a5 Mon Sep 17 00:00:00 2001 From: Andrew Hyndman Date: Fri, 15 Apr 2022 11:40:58 -0700 Subject: [PATCH 4/8] Update packages/node-resolve/test/test.js Co-authored-by: Tom Jenkinson --- packages/node-resolve/test/test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node-resolve/test/test.js b/packages/node-resolve/test/test.js index dd3a7b975..0a203c3e1 100755 --- a/packages/node-resolve/test/test.js +++ b/packages/node-resolve/test/test.js @@ -300,7 +300,8 @@ test('allows custom modulePaths', async (t) => { ] }); - t.is(bundle.cache.modules.length, 3); + const { dependency } = await evaluateBundle(bundle); + t.is(dependency, 'DEPENDENCY'); }); test('ignores deep-import non-modules', async (t) => { From bbfcfdd3e6477781d7988b4b0f6df3545ab89875 Mon Sep 17 00:00:00 2001 From: Andrew Hyndman Date: Fri, 15 Apr 2022 11:41:05 -0700 Subject: [PATCH 5/8] Update packages/node-resolve/README.md Co-authored-by: Tom Jenkinson --- packages/node-resolve/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node-resolve/README.md b/packages/node-resolve/README.md index 48613f4e2..c2c9e60ea 100755 --- a/packages/node-resolve/README.md +++ b/packages/node-resolve/README.md @@ -82,7 +82,7 @@ A list of directory names in which to recursively look for modules. Type: `Array[...String]`
Default: `[]` -A list of absolute paths to additional locations to search for modules. This is analogous to setting the `NODE_PATH` environment variable for node. +A list of absolute paths to additional locations to search for modules. [This is analogous to setting the `NODE_PATH` environment variable for node](https://nodejs.org/api/modules.html#loading-from-the-global-folders). ### `dedupe` From 1708f30aca921e5493514159a8482caa923aa767 Mon Sep 17 00:00:00 2001 From: Andrew Hyndman Date: Sat, 30 Apr 2022 13:15:56 -0700 Subject: [PATCH 6/8] fixup! Update packages/node-resolve/test/test.js --- packages/node-resolve/test/test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node-resolve/test/test.js b/packages/node-resolve/test/test.js index 0a203c3e1..15bec442d 100755 --- a/packages/node-resolve/test/test.js +++ b/packages/node-resolve/test/test.js @@ -8,7 +8,7 @@ import { rollup } from 'rollup'; import { nodeResolve } from '..'; -import { getCode, getImports, testBundle } from '../../../util/test'; +import { evaluateBundle, getCode, getImports, testBundle } from '../../../util/test'; process.chdir(join(__dirname, 'fixtures')); From 0bc95744895ea2aeaa7bebc5de8d5d73572ea02e Mon Sep 17 00:00:00 2001 From: Andrew Hyndman Date: Sat, 30 Apr 2022 13:42:37 -0700 Subject: [PATCH 7/8] Reject moduleDirectories containing a slash --- packages/node-resolve/src/index.js | 6 ++++++ packages/node-resolve/test/test.js | 22 +++++++++------------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/node-resolve/src/index.js b/packages/node-resolve/src/index.js index 9a73b5cfb..0da8f54f2 100644 --- a/packages/node-resolve/src/index.js +++ b/packages/node-resolve/src/index.js @@ -57,6 +57,12 @@ export function nodeResolve(opts = {}) { let { dedupe } = options; let rollupOptions; + if (moduleDirectories.some((name) => name.includes('/'))) { + throw new Error( + '`moduleDirectories` option must only contain directory names. If you want to load modules from somewhere not supported by the default module resolution algorithm, see `modulePaths`.' + ); + } + if (typeof dedupe !== 'function') { dedupe = (importee) => options.dedupe.includes(importee) || options.dedupe.includes(getPackageName(importee)); diff --git a/packages/node-resolve/test/test.js b/packages/node-resolve/test/test.js index 15bec442d..a9faff3c7 100755 --- a/packages/node-resolve/test/test.js +++ b/packages/node-resolve/test/test.js @@ -273,20 +273,16 @@ test('allows custom moduleDirectories with legacy customResolveOptions.moduleDir t.snapshot(warnings); }); -test('custom moduleDirectories do not support nested dependencies', async (t) => { - const warnings = []; - const bundle = await rollup({ - input: 'custom-module-path/main.js', - onwarn: (warning) => warnings.push(warning), - plugins: [ +test('moduleDirectories option rejects paths that contain a slash', async (t) => { + t.throws( + () => nodeResolve({ - moduleDirectories: [join(process.cwd(), 'custom-module-path/node_modules')] - }) - ] - }); - - t.is(warnings.length, 1); - t.is(bundle.cache.modules.length, 2); + moduleDirectories: ['some/path'] + }), + { + message: /must only contain directory names/ + } + ); }); test('allows custom modulePaths', async (t) => { From d142bc66eb4816c49ae76faaa0197e6d46a1cf09 Mon Sep 17 00:00:00 2001 From: Andrew Powell Date: Fri, 10 Jun 2022 09:39:17 -0400 Subject: [PATCH 8/8] chore: arbitrary edit to kick github's actions ui --- packages/node-resolve/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node-resolve/README.md b/packages/node-resolve/README.md index c2c9e60ea..210925662 100755 --- a/packages/node-resolve/README.md +++ b/packages/node-resolve/README.md @@ -221,7 +221,7 @@ export default ({ }) ``` -## Resolving require statements +## Resolving Require Statements According to [NodeJS module resolution](https://nodejs.org/api/packages.html#packages_package_entry_points) `require` statements should resolve using the `require` condition in the package exports field, while es modules should use the `import` condition.