ota-meshi / eslint-plugin-jsonc

ESLint plugin for JSON(C|5)? files
https://ota-meshi.github.io/eslint-plugin-jsonc/
MIT License
181 stars 17 forks source link

Resolve other plugins as siblings to this plugin #342

Closed onlywei closed 1 month ago

onlywei commented 1 month ago

Why do I want this? I have a monorepo with the current file structure:

apps/
-  app1/
  -  package.json
   .............
-  app127/
  -  package.json
packages/
-  package1/
  -  package.json
   ............
-  package453/
  -  package.json
repotools/
-  central-linter/
  -  package.json
.eslintrc.json
.eslintignore

I want to install eslint and all of its configs and plugins into the repotools/central-linter/node_modules. I do not want to install a separate copy of eslint and its plugins in each app/package. Also note that there is no package.json file at the root of the repo because I have lots of issues with npm workspaces.

I also want to keep the .eslintrc.json and .eslintignore files at the root of the monorepo for better IDE integration.

I am able to accomplish all of this except for this eslint-plugin-jsonc since this plugin keeps trying to load plugins relative to the root of the monorepo, rather than the resolvePluginsRelativeTo that I passed to my central linter.

This PR should modify the behavior of eslint-plugin-jsonc to always resolve plugins relative to itself.

P.S. I cannot upgrade to ESLint v9 yet because nx and eslint-plugin-react does not support ESLint v9 yet.

changeset-bot[bot] commented 1 month ago

🦋 Changeset detected

Latest commit: b6a1cb48d1ba718f246a6f4f0f6d2d4c4b4f8913

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package | Name | Type | | ------------------- | ----- | | eslint-plugin-jsonc | Minor |

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

onlywei commented 1 month ago

@ota-meshi Whenever you get a chance, could you please take a look at this PR? Thank you!

ota-meshi commented 1 month ago

Hmm. I'm not sure if this PR change will work in anyone's environment. Can you please explain that it's not just your environment that works?

onlywei commented 1 month ago

Hmm. I'm not sure if this PR change will work in anyone's environment. Can you please explain that it's not just your environment that works?

@ota-meshi My thinking is this: two scenarios:

Scenario One: with --resolve-plugins-relative-to

In this scenario, the folder structure is as follows:

some/other/path/
  node_modules/
    eslint-plugin-prettier/
    eslint-plugin-jsonc/
      dist/
        utils/
          get-auto-jsonc-rules-config/
            index.ts
.eslintrc.cjs

Eslint is executed on the CLI using:

eslint --resolve-plugins-relative-to=some/other/path/ .

We want to resolve the eslint-plugin-prettier that is a sibling of eslint-plugin-jsonc. From dist/utils/get-auto-jsonc-rules-config/, we need to navigate up five directories in order to be at another-path/. Once we are there, require('eslint-plugin-prettier') should work and find the correct path.

Scenario One: WITHOUT --resolve-plugins-relative-to

In this scenario, which is how most people use eslint, the folder structure is as follows:

node_modules/
  eslint-plugin-prettier/
  eslint-plugin-jsonc/
    dist/
      utils/
        get-auto-jsonc-rules-config/
          index.ts
.eslintrc.cjs

Eslint is executed on the CLI using:

eslint .

From dist/utils/get-auto-jsonc-rules-config/, if we navigate up five directories, we will be at the root of this folder structure. The behavior here should be the exact same as if I had not submitted this PR at all.

Therefore, I believe this PR should work in both scenarios.

ota-meshi commented 1 month ago

Thank you for the explanation! I think that explanation makes sense!