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

Claims I haven't provided a value for parserOptions.project #215

Open
ghost opened this issue Jun 2, 2021 · 5 comments
Open

Claims I haven't provided a value for parserOptions.project #215

ghost opened this issue Jun 2, 2021 · 5 comments

Comments

@ghost
Copy link

ghost commented Jun 2, 2021

I'm setting up a NextJS project and am encountering an unexpected issue with your eslint plugin. First, here's my .eslintrc.json:

{
	"settings": {
		"react": {
			"version": "detect"
		}
	},
	"env": {
		"shared-node-browser": true,
		"es2021": true
	},
	"extends": [
		"eslint:recommended",
		"plugin:@typescript-eslint/recommended",
		"airbnb",
		"airbnb-typescript", // sandwich airbnb-typescript between the standard airbnb config to override non-ts rules, but inherit react hook rules
		"airbnb/hooks",
		"plugin:jsonc/recommended-with-jsonc",
		"plugin:json-schema-validator/recommended",
		"plugin:jsonc/prettier",
		"plugin:prettier/recommended"
	],
	"overrides": [
		{
			"files": ["*.json", "*.json5"],
			"parser": "jsonc-eslint-parser"
		}
	],
	"parser": "@typescript-eslint/parser",
	"parserOptions": {
		"project": "./tsconfig.eslint.json",
		"sourceType": "module",
		"ecmaFeatures": {
			"jsx": true,
			"impliedStrict": true
		}
	},
	"plugins": [
		"react",
		"react-hooks",
		"jsx-a11y",
		"html",
		"import",
		"sort-keys-fix",
		"sort-imports-es6-autofix",
		"@typescript-eslint"
	],
	"root": true,
	"rules": {
		// [...]
	}
}

If I run eslint, I receive the following error:

Error while loading rule '@typescript-eslint/naming-convention': You have used a rule which requires parserServices to be generated. You must therefore provide a value for the "parserOptions.project" property for @typescript-eslint/parser.
Occurred while linting /home/<path>/.eslintrc.json

I believe my tsconfig.json and tsconfig.eslint.json are fine (I've already used them in some other projects). What am I doing wrong?

@emil-wearealldigital
Copy link

emil-wearealldigital commented Jun 4, 2021

Check your tsconfig.eslint.json, it has to include that specific file you're trying to lint. Just make sure your pattern matches it, that's all. The best StackOverflow answer to the problem - https://stackoverflow.com/a/64283139

Also, ESLint ignores hidden files by default. So, when using the glob (* - asterisk) operator alone, it doesn't track POSIX hidden files (the ones that start with a dot). Here is how I track "hidden" JS files that start with a dot (in the root folder only).

{
  "extends": "./tsconfig.json",
  "include": [".*.js", "path/to/your/file.js"]
}

I also edit .eslintignore to not ignore all project config files (including .eslintrc.js itself):

!/.*.js

@ghost
Copy link
Author

ghost commented Jun 5, 2021

I already did that.
full .eslintrc.json:

{
	"settings": {
		"react": {
			"version": "detect"
		}
	},
	"env": {
		"shared-node-browser": true,
		"es2021": true
	},
	"extends": [
		"eslint:recommended",
		"plugin:@typescript-eslint/recommended",
		"airbnb",
		"airbnb-typescript", // sandwich airbnb-typescript between the standard airbnb config to override non-ts rules, but inherit react hook rules
		"airbnb/hooks",
		"plugin:jsonc/recommended-with-jsonc",
		"plugin:json-schema-validator/recommended",
		"plugin:jsonc/prettier",
		"plugin:prettier/recommended"
	],
	"overrides": [
		{
			"files": ["*.json", "*.json5"],
			"parser": "jsonc-eslint-parser"
		}
	],
	"parser": "@typescript-eslint/parser",
	"parserOptions": {
		"project": "./tsconfig.eslint.json",
		"sourceType": "module",
		"ecmaFeatures": {
			"jsx": true,
			"impliedStrict": true
		}
	},
	"plugins": [
		"react",
		"react-hooks",
		"jsx-a11y",
		"html",
		"import",
		"sort-keys-fix",
		"sort-imports-es6-autofix",
		"@typescript-eslint"
	],
	"root": true,
	"rules": {
		"react/react-in-jsx-scope": 0, // nextjs: recommendation
		"react/jsx-filename-extension": [2, { "extensions": [".jsx", ".tsx"] }], // airbnb: allow .tsx
		"react/jsx-props-no-spreading": 0, // airbnb: allow spread
		"import/order": "off", // airbnb: we use autofix
		"no-console": "off", // airbnb: annoyance
		"no-debugger": "off", // airbnb: annoyance
		"no-dupe-else-if": "warn", // airbnb: not enabled yet
		"no-empty": ["error", { "allowEmptyCatch": true }], // airbnb: added allowEmptyCatch option
		"no-import-assign": "warn", // airbnb: not enabled yet
		"sort-imports-es6-autofix/sort-imports-es6": [
			// sort-imports-es6-autofix: automatically sort imports
			"warn",
			{
				// allowSeparatedGroups: false, // sort-imports-es6-autofix: incompatible argument
				"ignoreCase": false,
				// ignoreDeclarationSort: false, // sort-imports-es6-autofix: incompatible argument
				"ignoreMemberSort": false,
				"memberSyntaxSortOrder": ["all", "multiple", "single", "none"]
			}
		],
		"sort-keys": ["warn", "asc", { "caseSensitive": true, "minKeys": 2, "natural": true }], // sort-keys: warn about wrong order
		"sort-keys-fix/sort-keys-fix": "warn", // sort-keys-fix: automatically sort object keys
		"sort-vars": "warn" // sort-vars: warn about wrong order
	}
}

tsconfig.eslint.json:

{
	"extends": "./tsconfig.json",
	"exclude": [],
	"include": ["**/*", "**/.*"]
}

tsconfig.json:

{
	"compilerOptions": {
		/* Next.js preset Options */
		"noEmit": true,
		"jsx": "preserve",
		/* Basic Options */
		"incremental": true /* Enable incremental compilation */,
		"target": "ESNext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,
		"module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
		"lib": ["DOM", "DOM.Iterable", "ESNext"] /* Specify library files to be included in the compilation. */,
		"allowJs": true /* Allow javascript files to be compiled. */,
		"checkJs": true /* Report errors in .js files. */,
		// "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
		"declaration": true /* Generates corresponding '.d.ts' file. */,
		"declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */,
		"sourceMap": true /* Generates corresponding '.map' file. */,
		// "outFile": "./",                       /* Concatenate and emit output to single file. */
		"outDir": "./lib" /* Redirect output structure to the directory. */,
		// "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
		// "composite": true,                     /* Enable project compilation */
		// "tsBuildInfoFile": "./" /* Specify file to store incremental compilation information */,
		"removeComments": true /* Do not emit comments to output. */,
		// "noEmit": true,                        /* Do not emit outputs. */
		"importHelpers": true /* Import emit helpers from 'tslib'. */,
		"downlevelIteration": true /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */,
		"isolatedModules": true /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */,

		/* Strict Type-Checking Options */
		"strict": true /* Enable all strict type-checking options. */,
		"noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
		"strictNullChecks": true /* Enable strict null checks. */,
		"strictFunctionTypes": true /* Enable strict checking of function types. */,
		"strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */,
		"strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */,
		"noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */,
		"alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */,

		/* Additional Checks */
		"noUnusedLocals": true /* Report errors on unused locals. */,
		"noUnusedParameters": true /* Report errors on unused parameters. */,
		"noImplicitReturns": true /* Report error when not all code paths in function return a value. */,
		"noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */,

		/* Module Resolution Options */
		"moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */,
		"baseUrl": "." /* Base directory to resolve non-absolute module names. */,
		// "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
		// "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
		// "typeRoots": [],                       /* List of folders to include type definitions from. */
		// "types": [],                           /* Type declaration files to be included in compilation. */
		// "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
		"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
		// "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
		// "allowUmdGlobalAccess": true,          /* Allow accessing UMD globals from modules. */

		/* Source Map Options */
		// "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
		// "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */
		// "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
		// "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */

		/* Experimental Options */
		// "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
		// "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */

		/* Advanced Options */
		"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */,
		"resolveJsonModule": true /* Enable importing .json files */,
		"pretty": false /* Enable color and formatting in output to make compiler errors easier to read */,
		"skipLibCheck": true /* Skip type-checking all .d.ts files */,
		"importsNotUsedAsValues": "error" /* Specify emit/checking behavior for imports that are only used for types */
	},
	"compileOnSave": true,
	"watchOptions": {
		"watchFile": "useFsEvents",
		"watchDirectory": "useFsEvents",
		"fallbackPolling": "dynamicPriority"
	},
	"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
	"exclude": ["node_modules"]
}

.gitignore:

!*
!.*
# [...] ignores

ESLint command: eslint --cache --report-unused-disable-directives --no-error-on-unmatched-pattern --max-warnings 0 --ignore-path .gitignore --ext .tsx,.ts,.jsx,.js,.mjs,.cjs,.html,.xhtml,.xml,.json,.json5 "."
It only fails when linting .json files, not when linting JavaScript or TypeScript.

@emil-wearealldigital
Copy link

This is really specific to the eslint-plugin-jsonc, you should talk to them first. I tried with an older plugin (eslint-plugin-json) just in case and it's working fine for me.

image

@mrjackyliang
Copy link

It's also an odd glitch for me as well. I'm using nextjs, and this error only appears for me in the next.config.js file. Everywhere else is fine.

@Jared0430
Copy link

I've noticed this with NextJS & Tailwind too. It seems to happen in next.config.js and tailwind.config.js

One thing they both have in common is a comment denoting the type

/** @type {import('next').NextConfig} */ and /** @type {import('tailwindcss').Config} */ respectively

Haven't yet figured out how to fix it though

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

No branches or pull requests

3 participants