resolve icon indicating copy to clipboard operation
resolve copied to clipboard

Does the require.resolve `paths` option work just like the `baseDir` option?

Open watson opened this issue 6 years ago • 10 comments
trafficstars

Since Node.js v8.9.0, a new paths option was made available to the core Node.js require.resolve function:

paths <string[]> Paths to resolve module location from. If present, these paths are used instead of the default resolution paths, with the exception of GLOBAL_FOLDERS like $HOME/.node_modules, which are always included. Note that each of these paths is used as a starting point for the module resolution algorithm, meaning that the node_modules hierarchy is checked from this location.

As far as I can see, if just given a single element in the paths array, this works identical to the baseDir option of this module. The new paths features does however take into account the GLOBAL_FOLDERS, which I'm not sure if this module does?

I ask because I would like to feature detect this and use the internal Node.js function if available, but fall back to this module if not. But I wasn't sure if the behavior was 100% identical 🤔

watson avatar Mar 20 '19 08:03 watson

Since it's relatively new, this package hasn't adapted to it yet, no.

Would you be willing to make a PR with test cases, comparing require.resolve's paths option to the basedir option?

Another possibility might be, adding a paths option to resolve itself.

(do you need the GLOBAL_FOLDERS? requiring things from there is widely considered an antipattern)

ljharb avatar Mar 20 '19 23:03 ljharb

I don't mind taking a stab at it.

I don't personally use GLOBAL_FOLDERS no, but I'm the maintainer of a popular module which is used to patch the require function where I depend on being able to resolve modules. And I can't rule out if any of their apps depend on the GLOBAL_FOLDERS environment variable unfortunately.

watson avatar Mar 21 '19 08:03 watson

I somehow can't get the normal test suite to run in master. Is it because I have cloned this repo into a folder whos path already contain a node_modules folder? Usually that's where I keep my all the Node modules I'm working on which makes working on multiple modules with inter-dependencies much easier.

image

watson avatar Mar 31 '19 08:03 watson

Installed in /tmp and it worked. So I guess it's related to the node_modules folder in the path

watson avatar Mar 31 '19 09:03 watson

As far as I can see, no where in the current tests do you validate that require.sync returns the same result as require.resolve. Is this on purpose?

watson avatar Mar 31 '19 10:03 watson

Not that I know of; I've always found that a bit confusing but haven't taken the time to fix it.

It sounds like there's a few action items here:

  1. file an issue about the repo not working properly with a sibling node_modules (if i've understood the problem correctly)
  2. make a PR that adds a test suite comparing both resolve and resolve.sync with require.resolve, to ensure consistency and/or illustrate the differences
  3. make a PR for adding the paths option

Thoughts?

ljharb avatar Apr 06 '19 07:04 ljharb

resolve definitely does not mimic require.resolve behavior in terms of paths option. In require.resolve it works as multiple basedir. But also require includes there dirs from NODE_PATH which is rarely desired behavior.

wclr avatar Aug 24 '20 09:08 wclr

@watson are you interested in doing any of the steps I outlined above?

ljharb avatar Aug 25 '20 05:08 ljharb

I've added bullet point 2 in 067db38.

If you could give me some examples of test cases for paths with more than one item, i can look into supporting it in resolve.

ljharb avatar Jan 04 '22 06:01 ljharb