feat: jsdoc rules and remove old config

This commit is contained in:
Guz013
2023-09-02 06:20:45 -03:00
parent 10c4155283
commit a2cc881053
13 changed files with 122 additions and 66 deletions

View File

@@ -2,24 +2,24 @@
import type { ESLint, Linter } from 'eslint'; import type { ESLint, Linter } from 'eslint';
/** /**
* @see {@link https://www.npmjs.com/package/eslint-plugin-import npm package}
* @summary ESLint plugin with rules that help validate proper imports. * @summary ESLint plugin with rules that help validate proper imports.
* *
* --- * ---
* **Note:** Types in this project where overridden to be compatible with ESLint new flat * **Note:** Types in this project where overridden to be compatible with ESLint new flat
* config types. ESlint already has backwards compatibility for plugins not created in the * config types. ESlint already has backwards compatibility for plugins not created in the
* new flat config. * new flat config.
* @see {@link https://www.npmjs.com/package/eslint-plugin-import npm package}
*/ */
declare module 'eslint-plugin-i' { declare module 'eslint-plugin-i' {
interface importEslintPlugin extends ESLint.Plugin { interface importEslintPlugin extends ESLint.Plugin {
configs: { configs: {
recommended: { recommended: {
rules: Linter.RulesRecord rules: Linter.RulesRecord,
} },
typescript: { typescript: {
rules: Linter.RulesRecord rules: Linter.RulesRecord,
} },
} },
} }
declare const plugin: importEslintPlugin; declare const plugin: importEslintPlugin;
export default plugin; export default plugin;

View File

@@ -1,25 +1,25 @@
import type { ESLint } from 'eslint'; import type { ESLint } from 'eslint';
/** /**
* @see {@link https://www.npmjs.org/package/eslint-plugin-jsdoc npm package}
* @summary JSDoc specific linting rules for ESLint. * @summary JSDoc specific linting rules for ESLint.
* *
* --- * ---
* **Note:** Types in this project where overridden to be compatible with ESLint new flat * **Note:** Types in this project where overridden to be compatible with ESLint new flat
* config types. ESlint already has backwards compatibility for plugins not created in the * config types. ESlint already has backwards compatibility for plugins not created in the
* new flat config. * new flat config.
* @see {@link https://www.npmjs.org/package/eslint-plugin-jsdoc npm package}
*/ */
declare module 'eslint-plugin-jsdoc' { declare module 'eslint-plugin-jsdoc' {
// eslint-disable-next-line unicorn/prevent-abbreviations // eslint-disable-next-line unicorn/prevent-abbreviations
interface jsDocESlintPlugin extends ESLint.Plugin { interface jsDocESlintPlugin extends ESLint.Plugin {
configs: ESLint.Plugin['configs'] & { configs: ESLint.Plugin['configs'] & {
recommended: ESLint.ConfigData recommended: ESLint.ConfigData,
'recommended-error': ESLint.ConfigData 'recommended-error': ESLint.ConfigData,
'recommended-typescript': ESLint.ConfigData 'recommended-typescript': ESLint.ConfigData,
'recommended-typescript-error': ESLint.ConfigData 'recommended-typescript-error': ESLint.ConfigData,
'recommended-typescript-flavor': ESLint.ConfigData 'recommended-typescript-flavor': ESLint.ConfigData,
'recommended-typescript-flavor-error': ESLint.ConfigData 'recommended-typescript-flavor-error': ESLint.ConfigData,
} },
} }
declare const plugin: jsDocESlintPlugin; declare const plugin: jsDocESlintPlugin;
export default plugin; export default plugin;

View File

@@ -1,10 +1,10 @@
declare module 'globals' { declare module 'globals' {
const globals: { const globals: {
browser: { [rule: string]: boolean } browser: { [rule: string]: boolean, },
builtin: { [rule: string]: boolean } builtin: { [rule: string]: boolean, },
commonjs: { [rule: string]: boolean } commonjs: { [rule: string]: boolean, },
node: { [rule: string]: boolean } node: { [rule: string]: boolean, },
nodeBuiltin: { [rule: string]: boolean } nodeBuiltin: { [rule: string]: boolean, },
}; };
export default globals; export default globals;
} }

View File

@@ -1,37 +1,36 @@
import type { ESLint, Linter } from 'eslint'; import type { ESLint, Linter } from 'eslint';
/** /**
* @see {@link https://www.npmjs.com/package/@typescript-eslint/eslint-plugin npm package}
* @summary An ESLint plugin which provides lint rules for TypeScript codebases. * @summary An ESLint plugin which provides lint rules for TypeScript codebases.
* *
* --- * ---
* **Note:** Types in this project where overridden to be compatible with ESLint new flat * **Note:** Types in this project where overridden to be compatible with ESLint new flat
* config types. ESlint already has backwards compatibility for plugins not created in the * config types. ESlint already has backwards compatibility for plugins not created in the
* new flat config. * new flat config.
* @see {@link https://www.npmjs.com/package/@typescript-eslint/eslint-plugin npm package}
*/ */
declare module '@typescript-eslint/eslint-plugin' { declare module '@typescript-eslint/eslint-plugin' {
interface typescriptEslintPlugin extends ESLint.Plugin { interface typescriptEslintPlugin extends ESLint.Plugin {
configs: { configs: {
'eslint-recommended': { 'eslint-recommended': {
rules: Linter.RulesRecord rules: Linter.RulesRecord,
} },
recommended: { recommended: {
rules: Linter.RulesRecord rules: Linter.RulesRecord,
} },
'recommended-requiring-type-checking': { 'recommended-requiring-type-checking': {
rules: Linter.RulesRecord rules: Linter.RulesRecord,
} },
strict: { strict: {
rules: Linter.RulesRecord rules: Linter.RulesRecord,
} },
} },
} }
declare const plugin: typescriptEslintPlugin; declare const plugin: typescriptEslintPlugin;
export default plugin; export default plugin;
} }
/** /**
* @see {@link https://www.npmjs.com/package/@typescript-eslint/parser npm package}
* @summary An ESLint parser which leverages TypeScript ESTree to allow for ESLint * @summary An ESLint parser which leverages TypeScript ESTree to allow for ESLint
* to lint TypeScript source code. * to lint TypeScript source code.
* *
@@ -39,6 +38,7 @@ declare module '@typescript-eslint/eslint-plugin' {
* **Note:** Types in this project where overridden to be compatible with ESLint new flat * **Note:** Types in this project where overridden to be compatible with ESLint new flat
* config types. ESlint already has backwards compatibility for parsers not created in the * config types. ESlint already has backwards compatibility for parsers not created in the
* new flat config. * new flat config.
* @see {@link https://www.npmjs.com/package/@typescript-eslint/parser npm package}
*/ */
declare module '@typescript-eslint/parser' { declare module '@typescript-eslint/parser' {
declare const parser: Linter.ParserModule; declare const parser: Linter.ParserModule;

View File

@@ -9,7 +9,7 @@ import process from 'node:process';
/** /**
* This config adds necessary plugins and configuration for ESLint to use in the other configs * This config adds necessary plugins and configuration for ESLint to use in the other configs
* **This should always be in the top of the configuration array** * **This should always be in the top of the configuration array**.
* @type {import('eslint').Linter.FlatConfig} * @type {import('eslint').Linter.FlatConfig}
*/ */
const config = { const config = {

View File

@@ -0,0 +1,32 @@
/* eslint-disable unicorn/no-useless-spread */
// eslint-disable-next-line import/no-relative-parent-imports
import { jsFiles, tsFiles } from '../constants.js';
/** @type {import('eslint').Linter.FlatConfig} */
const recommended = {
files: [...tsFiles, ...jsFiles],
rules: {
...{}, // Plugin: eslint-plugin-jsdoc
'jsdoc/match-description': 'error',
'jsdoc/require-description-complete-sentence': 'error',
'jsdoc/require-hyphen-before-param-description': ['error', 'always'],
'jsdoc/require-param-description': 'error',
'jsdoc/require-property-description': 'error',
'jsdoc/require-returns-check': 'error',
},
};
/** @type {import('eslint').Linter.FlatConfig} */
const strict = {
...recommended,
rules: {
...recommended.rules,
...{}, // Plugin: eslint-plugin-jsdoc
'jsdoc/require-description': 'error',
'jsdoc/require-file-overview': 'error',
},
};
const documentation = { recommended, strict };
export default documentation;

View File

@@ -2,6 +2,10 @@ import type { Linter } from 'eslint';
const configs: Readonly<{ const configs: Readonly<{
core: Linter.FlatConfig, core: Linter.FlatConfig,
documentation: {
recommended: Linter.FlatConfig,
strict: Linter.FlatConfig,
},
environments: { environments: {
browser: { browser: {
recommended: Linter.FlatConfig, recommended: Linter.FlatConfig,

View File

@@ -1,18 +1,18 @@
import typescript from './suggestions-typescript.js'; import typescript from './suggestions-typescript.js';
import environments from './environments/index.js'; import environments from './environments/index.js';
import documentation from './documentation.js';
import suggestions from './suggestions.js'; import suggestions from './suggestions.js';
import formatting from './formatting.js'; import formatting from './formatting.js';
import javascript from './javascript.js';
import overrides from './overrides.js'; import overrides from './overrides.js';
import naming from './naming.js'; import naming from './naming.js';
import core from './core.js'; import core from './core.js';
const configs = { const configs = {
core, core,
documentation,
environments, environments,
formatting, formatting,
javascript,
naming, naming,
overrides, overrides,
suggestions, suggestions,

View File

@@ -1,26 +0,0 @@
import tsESLint from '@typescript-eslint/eslint-plugin';
import jsdocPlugin from 'eslint-plugin-jsdoc';
import importPlugin from 'eslint-plugin-i';
import js from '@eslint/js';
/** @type {import('eslint').Linter.FlatConfig} */
const recommended = {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
rules: {
...js.configs.recommended.rules,
...tsESLint.configs.recommended.rules,
...tsESLint.configs['recommended-requiring-type-checking'].rules,
...tsESLint.configs['eslint-recommended'].rules,
...tsESLint.configs.strict.rules,
...importPlugin.configs.recommended.rules,
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
...jsdocPlugin.configs['recommended-typescript-flavor-error'].rules,
},
};
/** @type {import('eslint').Linter.FlatConfig} */
const strict = {
...recommended,
};
const javascript = { recommended, strict };
export default javascript;

View File

@@ -1,3 +1,4 @@
/* eslint-disable unicorn/no-useless-spread */
// eslint-disable-next-line import/no-relative-parent-imports // eslint-disable-next-line import/no-relative-parent-imports
import { tsFiles } from '../constants.js'; import { tsFiles } from '../constants.js';
@@ -6,7 +7,15 @@ import { tsFiles } from '../constants.js';
const recommended = { const recommended = {
files: [...tsFiles], files: [...tsFiles],
rules: { rules: {
...{}, // Plugin: @typescript-eslint/eslint-plugin
'@typescript-eslint/explicit-function-return-type': 'error', '@typescript-eslint/explicit-function-return-type': 'error',
...{}, // Plugin: eslint-plugin-jsdoc
'jsdoc/check-tag-names': ['error', { typed: true }],
'jsdoc/no-types': 'error',
'jsdoc/require-param-type': 'off',
'jsdoc/require-property-type': 'off',
'jsdoc/require-returns-type': 'off',
}, },
}; };
@@ -15,6 +24,8 @@ const strict = {
...recommended, ...recommended,
rules: { rules: {
...recommended.rules, ...recommended.rules,
...{}, // Plugin: @typescript-eslint/eslint-plugin
'@typescript-eslint/explicit-member-accessibility': 'error', '@typescript-eslint/explicit-member-accessibility': 'error',
'@typescript-eslint/explicit-module-boundary-types': 'error', '@typescript-eslint/explicit-module-boundary-types': 'error',
}, },

View File

@@ -192,7 +192,7 @@ const recommended = {
'unicorn/text-encoding-identifier-case': 'error', 'unicorn/text-encoding-identifier-case': 'error',
'unicorn/throw-new-error': 'error', 'unicorn/throw-new-error': 'error',
...{}, // Plugin: eslint-plugin-import'error', ...{}, // Plugin: eslint-plugin-import
'import/no-amd': 'error', 'import/no-amd': 'error',
'import/no-commonjs': 'error', 'import/no-commonjs': 'error',
'import/no-deprecated': 'error', 'import/no-deprecated': 'error',
@@ -202,6 +202,36 @@ const recommended = {
'import/no-named-as-default-member': 'error', 'import/no-named-as-default-member': 'error',
'import/no-self-import': 'error', 'import/no-self-import': 'error',
'import/no-useless-path-segments': 'error', 'import/no-useless-path-segments': 'error',
...{}, // Plugin: eslint-plugin-jsdoc
'jsdoc/check-alignment': 'error',
'jsdoc/check-param-names': 'error',
'jsdoc/check-property-names': 'error',
'jsdoc/check-syntax': 'error',
'jsdoc/check-tag-names': 'error',
'jsdoc/check-types': 'error',
'jsdoc/check-values': 'error',
'jsdoc/empty-tags': 'error',
'jsdoc/implements-on-classes': 'error',
'jsdoc/multiline-blocks': 'error',
'jsdoc/no-multi-asterisks': ['error', { allowWhitespace: true }],
'jsdoc/require-asterisk-prefix': ['error', 'always'],
'jsdoc/require-jsdoc': 'error',
'jsdoc/require-param': 'error',
'jsdoc/require-param-name': 'error',
'jsdoc/require-param-type': 'error',
'jsdoc/require-property': 'error',
'jsdoc/require-property-name': 'error',
'jsdoc/require-property-type': 'error',
'jsdoc/require-returns': 'error',
'jsdoc/require-returns-check': 'error',
'jsdoc/require-returns-type': 'error',
'jsdoc/require-throws': 'error',
'jsdoc/require-yields': 'error',
'jsdoc/require-yields-check': 'error',
'jsdoc/sort-tags': 'error',
'jsdoc/valid-types': 'error',
}, },
}; };
@@ -359,6 +389,15 @@ const strict = {
'import/prefer-default-export': 'error', 'import/prefer-default-export': 'error',
'import/unambiguous': 'error', 'import/unambiguous': 'error',
...{}, // Plugin: eslint-plugin-jsdoc
'jsdoc/check-access': 'error',
'jsdoc/check-indentation': 'error',
'jsdoc/informative-docs': 'error',
'jsdoc/multiline-blocks': ['error', { noSingleLineBlocks: true }],
'jsdoc/no-bad-blocks': 'error',
'jsdoc/no-blank-block-descriptions': 'error',
'jsdoc/no-blank-blocks': 'error',
}, },
}; };

View File

@@ -4,12 +4,10 @@ import configs from '../configs/index.js';
/** @type {import('eslint').Linter.FlatConfig[]} */ /** @type {import('eslint').Linter.FlatConfig[]} */
const recommended = [ const recommended = [
configs.core, configs.core,
// TODO [>=1.0.0]: remove .javascript and .typescript configs
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
configs.javascript.recommended,
configs['suggestions-typescript'].recommended, configs['suggestions-typescript'].recommended,
configs.suggestions.recommended, configs.suggestions.recommended,
configs.formatting.recommended, configs.formatting.recommended,
configs.naming.recommended, configs.naming.recommended,
configs.documentation.recommended,
]; ];
export default recommended; export default recommended;

View File

@@ -4,12 +4,10 @@ import configs from '../configs/index.js';
/** @type {import('eslint').Linter.FlatConfig[]} */ /** @type {import('eslint').Linter.FlatConfig[]} */
const strict = [ const strict = [
configs.core, configs.core,
// TODO [>=1.0.0]: remove .javascript and .typescript configs
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
configs.javascript.strict,
configs['suggestions-typescript'].strict, configs['suggestions-typescript'].strict,
configs.suggestions.strict, configs.suggestions.strict,
configs.formatting.strict, configs.formatting.strict,
configs.naming.strict, configs.naming.strict,
configs.documentation.recommended,
]; ];
export default strict; export default strict;