Description
What package is covered by this investigations?
ESLint
Describe the goal of the investigation
I'd like ESLint to support PnP painlessly. It currently works, but requires a specific logic on our side, which is slightly suboptimal. This investigation aims to figure out how to improve this state.
Investigation report
ESLint currently loads its plugins using a raw
require.resolve
- meaning that from PnP's point of view,eslint
is the package that needs to list the plugins in its dependencies (instead of the package that contains the ESLint configuration file).This problem is compounded by the fact that ESLint bugs out on absolute paths, meaning that the ESLint configuration files cannot call
require.resolve
themselves in order to explicitly tell ESLint what's the actual location of the plugins they use.
Because of the PnP fallback mechanism, this problem doesn't occur in most cases (ie when the ESLint configuration file is your own). In this case even is ESLint doesn't list the plugin in its dependency PnP will still check which dependencies are listed at the top-level of your application.
This problem only happens when the ESLint configuration is part of a package you depend on. For example react-scripts
, created by create-react-app
. In this instance, the plugins aren't listed in the application package.json, meaning that the fallback cannot kick in and do its job.
In order to fix this, a temporary solution has been put into place: react-scripts
and gatsby
(which are two of the most popular packages using this pattern) are used as secondary fallbacks if the top-level isn't enough. This is but a bandaid, since it causes other problems (other packages can forget to list their own dependencies if react-scripts
or gatsby
happen to depend on them), but should do the trick for now.
The real fix is eslint/eslint#11388, which is expected to land in ESLint 6.