Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
watson opened this issue Mar 20, 2019 · 9 comments
Open

Comments

@watson
Copy link

watson commented Mar 20, 2019

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 🤔

@ljharb
Copy link
Member

ljharb commented Mar 20, 2019

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)

@watson
Copy link
Author

watson commented Mar 21, 2019

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
Copy link
Author

watson commented Mar 31, 2019

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
Copy link
Author

watson commented Mar 31, 2019

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

@watson
Copy link
Author

watson commented Mar 31, 2019

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?

@ljharb
Copy link
Member

ljharb commented Apr 6, 2019

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?

@wclr
Copy link

wclr commented Aug 24, 2020

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.

@ljharb
Copy link
Member

ljharb commented Aug 25, 2020

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

@ljharb
Copy link
Member

ljharb commented Jan 4, 2022

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

3 participants