darraghoriordan / eslint-plugin-nestjs-typed

Some eslint rules for working with NestJs projects
http://www.darraghoriordan.com
171 stars 34 forks source link

error with `injectable-should-be-provided` #26

Closed vic1707 closed 2 years ago

vic1707 commented 2 years ago

First I have to say "Amazing plugin !!"

Get this error in the VSCode ESlint output when running your plugin with the recommended settings. Error while loading rule '@darraghor/nestjs-typed/injectable-should-be-provided': No files matching 'src/**/*.ts' were found. Occurred while linting /Users/vic1707/Desktop/TESTS/monorepo/apps/monorepo-api/src/app.controller.spec.ts

here are my configs:

{
  "$schema": "https://json.schemastore.org/eslintrc",
  "parserOptions": {
    "sourceType": "module",
    "ecmaVersion": "latest",
    "project": ["tsconfig.json"]
  },
  "plugins": [
    "@darraghor/nestjs-typed"
  ],
  "extends": [
    "../.eslintrc",
    "plugin:@darraghor/nestjs-typed/recommended"
  ],
  "rules": {
    "@darraghor/nestjs-typed/injectable-should-be-provided": "off" // <- only way to prevent the error
  }
}

the .eslintrc it's extending

{
  "$schema": "https://json.schemastore.org/eslintrc",
  "parser": "@typescript-eslint/parser",
  "plugins": [
    "@typescript-eslint",
    "import",
    "prettier",
    "simple-import-sort",
    "unused-imports"
  ],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:prettier/recommended",
    "prettier"
  ],
  "env": {
    "browser": false,
    "jest": true,
    "es6": true
  },
  "rules": {
    "@typescript-eslint/explicit-function-return-type": "off",
    "@typescript-eslint/explicit-module-boundary-types": "off",
    "@typescript-eslint/indent": "off",
    "@typescript-eslint/interface-name-prefix": "off",
    "@typescript-eslint/no-explicit-any": "error",
    "@typescript-eslint/no-unused-vars": [
      "error",
      {
        "varsIgnorePattern": "_"
      }
    ],
    "import/no-deprecated": "error",
    "import/no-duplicates": [
      "error",
      {
        "considerQueryString": true
      }
    ],
    "no-duplicate-imports": "off",
    "prettier/prettier": "error",
    "simple-import-sort/exports": "error",
    "simple-import-sort/imports": "error",
    "unused-imports/no-unused-imports": "error"
  }
}

the file structure in case you need it

.
├── .eslintrc
├── .gitignore
├── README.md
├── nest-cli.json
├── package.json
├── src
│   ├── app.controller.spec.ts
│   ├── app.controller.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   └── main.ts
├── test
│   ├── app.e2e-spec.ts
│   └── jest-e2e.json
├── tsconfig.build.json
└── tsconfig.json
darraghoriordan commented 2 years ago

thanks for the report, i'll look into this soon!

darraghoriordan commented 2 years ago

i'm trying to reproduce this but I can't. I've created a new project using nest new my-project. It creates a similar structure to above. I add the eslint plugin, class-validator to get it working. Then yarn lint - I don't get that error about files matching.

The only thing I can think of is that you're not running the lint command in the same "level" as the root level described in the program structure there? There is an overridable option for this rule to specify an alternative src directory path but i would probably just change to the dir where the project is and yarn lint in the there if i was scripting somethign for monorepo or similar.

Let me know if i'm missing some step in my reproduction 👍

vic1707 commented 2 years ago

Hello, thanks for your time.

The error message comes both from vscode itself as well as tu lint script of my nest project so I don't think I'm running it from the wrong place 🤔 The strange thing to me is that it's the only rule causing trouble so for now I have disabled it.

I'll go back and try again asap

darraghoriordan commented 2 years ago

hey sorry i should have described it better. And my thoughts here are just a guess, the issue could be something completely different.

========

There is a bit of code in that rule that actually scans the file system for things decorated with @Module. This is outside of the files you pass to eslint for linting (it has to be).

The default search location is src/**/*.ts. It is relative to the place that you run eslint from. If you have <projectroot>/src/.... and you run eslint from the root then you're all good.

However if you had something like <projectroot>/packages/backend/src/... and you run eslint from projectroot then the specific rule wouldn't find anything at src/**/*.ts.

The rule is configurable though. So in the case above you could have

    "@darraghor/nestjs-typed/injectable-should-be-provided": [
            "error",
            {
                src: ["packages/backend/src/**/*.ts"],
                filterFromPaths: ["node_modules", ".test.", ".spec."],
            },
        ],

Again, this is a wild guess as to what the issue is. But something is preventing the rule from finding your project module files at the relative path src/**/*

vic1707 commented 2 years ago

oh, I understand.

i should have described it better

Not necessarly, it can also be my non native english which is not that great.

Adding the override works like a charm, that's perfect !