15.0.3 • Published 4 months ago

@anolilab/eslint-config v15.0.3

Weekly downloads
118
License
MIT
Repository
github
Last release
4 months ago

typescript-image npm-image license-image



Purpose

Our package serves as a valuable resource for JavaScript/Typescript-based projects, offering composable ESLint configurations. It encompasses a range of features, including performance optimization and the flexibility to extend pre-defined base configurations.

  • Tailored Configuration for Workspaces: With this package, each workspace within your monorepo gains the ability to have its own customized ESLint configuration. This ensures that individual projects can maintain their specific requirements while still adhering to the overall guidelines.

  • Configurability at Your Fingertips: Crafting your workspace's ESLint configuration is a breeze, thanks to the seamless composition of pre-defined base configurations. This empowers you to tailor the settings to suit your project's unique needs, without starting from scratch.

  • Streamlined Convenience: Say goodbye to the hassle of installing plugins for each workspace. Our package integrates @rushstack/eslint-patch, eliminating the need for repetitive plugin installations. Enjoy peace of mind as you focus on your work, knowing that the necessary plugins are automatically included.

  • Enhanced Efficiency: We've optimized the package's performance by intelligently enabling plugins based on file naming conventions. This streamlined approach ensures that your ESLint checks run efficiently, targeting the relevant files and maximizing productivity.

In summary, our package provides comprehensive and adaptable ESLint configurations for JavaScript and Typescript projects. It empowers you to achieve code quality while minimizing overhead and maximizing productivity throughout your workspaces.

Highlights

  • Zero-config, but configurable when needed.
  • Enforces readable code, because you read more code than you write.
  • No need to specify file paths to lint as it lints all JS/TS files except for commonly ignored paths.
  • Config overrides per files/globs.
  • TypeScript supported by default, if typescript was installed.
  • Includes many useful ESLint plugins, like unicorn, import and more.
  • Automatically enables rules based on the engines field in your package.json.
  • Specify indent and semicolon preferences easily without messing with the rule config.
  • Disables rules that conflict with Prettier.
  • Typesafe, because it's written in TypeScript and uses eslint-define-config to define the config.

Install

To install this config, run the following command.

Note: eslint-plugin-import@npm:eslint-plugin-i is needed to use the correct package.

npm install --save-dev eslint @anolilab/eslint-config eslint-plugin-import@npm:eslint-plugin-i@latest @babel/core @eslint-types/import @eslint-types/deprecation @eslint-types/jsdoc @eslint-types/typescript-eslint @eslint-types/unicorn
pnpm add -D eslint @anolilab/eslint-config eslint-plugin-import@npm:eslint-plugin-i@latest @babel/core @eslint-types/import @eslint-types/deprecation @eslint-types/jsdoc @eslint-types/typescript-eslint @eslint-types/unicorn
yarn add -D eslint @anolilab/eslint-config eslint-plugin-import@npm:eslint-plugin-i@latest @babel/core @eslint-types/import @eslint-types/deprecation @eslint-types/jsdoc @eslint-types/typescript-eslint @eslint-types/unicorn

Usage

If you don’t have a .eslintrc.js, we will create the file for you after installing @anolilab/eslint-config.

If you already have a .eslintrc.js, then you can extend the .eslintrc.js, with @anolilab/eslint-config.

Note: If the script detects an existing .eslintrc.js file, it will not overwrite it.

Note: It can happen that the postinstall script don't run, then you have to add the .eslintrc.js manually, or you will use bin command ./node_modules/bin/anolilab-eslint-config to generate it.

Note: Our default export contains all of our ESLint rules, including ECMAScript 6+. @anolilab/eslint-config use the ecmaVersion:2021 as default.

To change this configuration, change env: { es2021: false, then active you needed env } same for, parserOptions: { "ecmaVersion": 2021 change the version }

/** @ts-check */
const { defineConfig } = require('@anolilab/eslint-config/define-config');

/// <reference types="@eslint-types/unicorn" />
/// <reference types="@eslint-types/typescript-eslint" />
/// <reference types="@eslint-types/jsdoc" />
/// <reference types="@eslint-types/import" />
/// <reference types="@eslint-types/deprecation" />

module.exports = defineConfig({
    env: {
        // Your environments (which contains several predefined global variables)
        //
        // browser: true,
        // node: true,
        // mocha: true,
        // jest: true,
        // jquery: true
    },
    extends: ["@anolilab/eslint-config"],
    globals: {
        // Your global variables (setting to false means it's not allowed to be reassigned)
        //
        // myGlobal: false
    },
    root: true,
    rules: {
        // Customize your rules
    },
});

For more advanced use cases see the example configurations for Node, TypeScript, React or Prettier.

Note: @anolilab/eslint-config will handle the configuration for almost all eslint-plugins / eslint-configs automatically. With this you only need to install the needed plugins/configs for TypeScript or React and you done.

TypeScript

npm install --save-dev typescript

Please extend the .eslintrc.js file with the correct tsconfig.js path if you have a custom path.

module.exports = {
    parserOptions: {
        project: "./tsconfig.eslint.json",
    },
};

For projects that use TypeScript and want additional rules that require type information (rules using type information take longer to run).

Extend the .eslintrc.js file:

/** @ts-check */
const { defineConfig } = require('@anolilab/eslint-config/define-config');

/// <reference types="@eslint-types/unicorn" />
/// <reference types="@eslint-types/typescript-eslint" />
/// <reference types="@eslint-types/jsdoc" />
/// <reference types="@eslint-types/import" />
/// <reference types="@eslint-types/deprecation" />

module.exports = defineConfig({
    env: {
        // Your environments (which contains several predefined global variables)
        //
        // browser: true,
        // node: true,
        // mocha: true,
        // jest: true,
        // jquery: true
    },
    extends: ["@anolilab/eslint-config", "@anolilab/eslint-config/typescript-type-checking"],
    globals: {
        // Your global variables (setting to false means it's not allowed to be reassigned)
        //
        // myGlobal: false
    },
    root: true,
    rules: {
        // Customize your rules
    },
});

Tip: Run eslint with the TIMING=1 to identify slow rules.

TIMING=1 eslint . --ext .ts,.tsx

This is useful to identify rules that are slow because they require type information.

React

You need to have "react" and "react-dom" installed.

npm install --save-dev eslint-plugin-react eslint-plugin-react-hooks

yarn add -D eslint-plugin-react eslint-plugin-react-hooks

pnpm add -D eslint-plugin-react eslint-plugin-react-hooks

Or for the use of TypeScript in react install "typescript" as a dev dependency.

Please extend the .eslintrc.js file with the correct tsconfig.js path if you have a custom path.

module.exports = {
    parserOptions: {
        project: "./tsconfig.eslint.json",
    },
};

Or for the use of .jsx files install "@babel/plugin-syntax-jsx" as a dev dependency.

npm install --save-dev babel @babel/plugin-syntax-jsx

yarn add -D babel @babel/plugin-syntax-jsx

pnpm add -D babel @babel/plugin-syntax-jsx

In your babel.config.js file add the plugin.

const babelPluginSyntaxJSX = require("@babel/plugin-syntax-jsx");

module.exports = {
  plugins: [
    [
      babelPluginSyntaxJSX,
      {
        pragma: "React.createElement",
        pragmaFrag: "React.Fragment",
      },
    ],
  ],
};

MDX

npm install --save-dev eslint eslint-plugin-mdx

For more information about missing or optional to install rules see the eslint console output.

Config

You can configure @anolilab/eslint-config options with your package.json file.

Add this property to your package.json:

{
    anolilab: {
        "eslint-config": {
            // options
        },
    },
}

indent

Type: number

Default: 4

It will throw an error if the value is not numeric.

plugin

Type: object -> key: string value: boolean

Disable a plugin in your package.json config to turn it off globally in your project.

Example using package.json:

{
    "anolilab": {
        "eslint-config": {
            "plugin": {
                "unicorn": false
            }
        }
    }
}

warn_on_unsupported_typescript_version

Type: boolean

Default: undefined

To disable the warning, set the value to false.

{
    "anolilab": {
        "eslint-config": {
            "warn_on_unsupported_typescript_version": false
        }
    }
}

info_on_disabling_jsx_react_rule

Type: boolean

Default: undefined

To disable the info, set the value to false.

{
    "anolilab": {
        "eslint-config": {
            "info_on_disabling_jsx_react_rule": false
        }
    }
}

info_on_disabling_prettier_conflict_rule

Type: boolean

Default: undefined

To disable the info, set the value to false.

{
    "anolilab": {
        "eslint-config": {
            "info_on_disabling_prettier_conflict_rule": false
        }
    }
}

info_on_disabling_jsonc_sort_keys_rule

Type: boolean

Default: undefined

To disable the info, set the value to false.

{
    "anolilab": {
        "eslint-config": {
            "info_on_disabling_jsonc_sort_keys_rule": false
        }
    }
}

info_on_disabling_etc_no_deprecated

Type: boolean

Default: undefined

To disable the info, set the value to false.

{
    "anolilab": {
        "eslint-config": {
            "info_on_disabling_etc_no_deprecated": false
        }
    }
}

info_on_testing_library_framework

Type: boolean

Default: undefined

To disable the info, set the value to false.

{
    "anolilab": {
        "eslint-config": {
            "info_on_testing_library_framework": false
        }
    }
}

info_on_found_react_version

Type: boolean

Default: undefined

To disable the info, set the value to false.

{
    "anolilab": {
        "eslint-config": {
            "info_on_found_react_version": false
        }
    }
}

import_ignore_exports

Type: string[]

Default: []

An array with files/paths for which unused exports will not be reported (e.g module entry points in a published package).

{
    "anolilab": {
        "eslint-config": {
            "import_ignore_exports": []
        }
    }
}

Let Prettier handle style-related rules

Prettier is a code formatting tool that offers fewer options but is more professional than the style-related rules in ESLint.

Now that Prettier has become a necessary tool in front end projects, @anolilab/eslint-config does not need to maintain the style-related rules in ESLint anymore, so we completely removed all Prettier related rules, if prettier is found in your package.json and use ESLint to check logical errors which it’s good at.

As for whether two spaces or four spaces are used for indentation and whether there is a semicolon at the end, you can configure it in the project’s .prettierrc.js. Of course, we also provide a recommended Prettier configuration for your reference.

@anolilab/eslint-config does disable all included style-related rules, so there is no need to install eslint-config-prettier.

Using experimental features with JavaScript

If you are using experimental features such as class fields with JavaScript files you should install @babel/eslint-parser.

npm install --save-dev @babel/core

Plugins

Code Quality

This plugin provide a range of code quality rules:

Languages

The following plugins expand esLint to work with json files, and lint JavaScript contained in HTML, and MarkDown:

When linting code snippets in Markdown files, a few rules relating to globals and unused vars are disabled.

Library Plugins

If a supported library is part of your project then it’s related esLint plugins will be loaded. The following plugins are supported:

Practices

The following esLint plugins enforce good coding practices:

Security

These plugins add code security rules to esLint:

Test Libraries

The following test plugins are supported:

List of used plugins

  • eslint-plugin-security
  • @rushstack/eslint-plugin-security
  • @typescript-eslint/eslint-plugin
  • eslint-plugin-antfu
  • eslint-plugin-compat
  • eslint-plugin-es-x
  • eslint-plugin-eslint-comments
  • eslint-plugin-html
  • eslint-plugin-i
  • eslint-plugin-jsonc
  • eslint-plugin-markdown
  • eslint-plugin-mdx
  • eslint-plugin-no-loops
  • eslint-plugin-no-only-tests
  • eslint-plugin-no-secrets
  • eslint-plugin-no-use-extend-native
  • eslint-plugin-promise
  • eslint-plugin-regexp
  • eslint-plugin-simple-import-sort
  • eslint-plugin-sonarjs
  • eslint-plugin-toml
  • eslint-plugin-typescript-sort-keys
  • eslint-plugin-unicorn
  • eslint-plugin-yml

Troubleshooting

With VSCode

ESLint will not lint .vue, .ts or .tsx files in VSCode by default, you need to set your .vscode/settings.json like this:

{
    "eslint.validate": ["css", "html", "javascript", "javascriptreact", "json", "markdown", "typescript", "typescriptreact", "yaml"]
}

Autofix ESLint errors on save

If you want to enable auto-fix-on-save, you need to set your .vscode/settings.json like this:

{
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true
    },
    "editor.defaultFormatter": "dbaeumer.vscode-eslint",
    "editor.formatOnSave": true
}

Additionally, we found it that being explicit about which formatter you are using for each file improves DX:

{
    "[css]": {
        "editor.defaultFormatter": "dbaeumer.vscode-eslint"
    },
    "[html]": {
        "editor.defaultFormatter": "dbaeumer.vscode-eslint"
    },
    "[javascript]": {
        "editor.defaultFormatter": "dbaeumer.vscode-eslint"
    },
    "[javascriptreact]": {
        "editor.defaultFormatter": "dbaeumer.vscode-eslint"
    },
    "[json]": {
        "editor.defaultFormatter": "dbaeumer.vscode-eslint"
    },
    "[markdown]": {
        "editor.defaultFormatter": "dbaeumer.vscode-eslint"
    },
    "[typescript]": {
        "editor.defaultFormatter": "dbaeumer.vscode-eslint"
    },
    "[typescriptreact]": {
        "editor.defaultFormatter": "dbaeumer.vscode-eslint"
    },
    "[yaml]": {
        "editor.defaultFormatter": "dbaeumer.vscode-eslint"
    }
}

While not required if you've configured explicit formatter for each file type, I advise that you explicitly disable prettier extension in your project:

{
    "prettier.enable": false
}

Sharing these settings in your project should be sufficient to prevent local settings accidentally overriding the desired formatter behavior.

Q & A

Why not standard

The standard specification believes that everyone should not waste time in personalized specifications, but the entire community should unify a specification. This statement makes sense, but it runs against the ESLint’s design philosophy. Don’t you remember how ESLint defeated JSHint and became the most popular JS code inspection tool? It’s because of the plugin and configuration that ESLint advocates, which meets the individual needs of different technology stacks of different teams.

Therefore, @anolilab/eslint-config also inherits the philosophy of ESLint. It will not force you to use our config.

Supported Node.js Versions

Libraries in this ecosystem make the best effort to track Node.js’ release schedule. Here’s a post on why we think this is important.

Contributing

If you would like to help take a look at the list of issues and check our Contributing guild.

Note: please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

Credits

License

The anolilab javascript-style-guide is open-sourced software licensed under the MIT license

15.0.3

4 months ago

15.0.2

6 months ago

15.0.0

6 months ago

15.0.1

6 months ago

10.0.5

9 months ago

10.0.6

9 months ago

14.0.19

7 months ago

14.0.18

7 months ago

9.0.4

10 months ago

9.0.3

10 months ago

10.0.0

9 months ago

10.0.1

9 months ago

10.0.2

9 months ago

10.0.3

9 months ago

10.0.4

9 months ago

14.0.13

7 months ago

14.0.12

7 months ago

14.0.11

7 months ago

14.0.10

7 months ago

14.0.17

7 months ago

7.3.1

10 months ago

14.0.16

7 months ago

7.3.0

10 months ago

14.0.15

7 months ago

14.0.14

7 months ago

12.0.0

8 months ago

11.2.2

9 months ago

11.2.3

9 months ago

14.0.20

7 months ago

14.0.24

7 months ago

14.0.23

7 months ago

14.0.22

7 months ago

14.0.21

7 months ago

11.2.0

9 months ago

11.2.1

9 months ago

13.0.2

7 months ago

13.0.0

8 months ago

13.0.1

8 months ago

9.0.2

10 months ago

9.0.1

10 months ago

9.0.0

10 months ago

11.1.0

9 months ago

7.2.6

10 months ago

7.2.5

10 months ago

7.2.4

10 months ago

7.2.7

10 months ago

11.0.2

9 months ago

11.0.3

9 months ago

11.0.0

9 months ago

11.0.1

9 months ago

14.0.9

7 months ago

14.0.0

7 months ago

14.0.1

7 months ago

14.0.2

7 months ago

14.0.3

7 months ago

14.0.4

7 months ago

14.0.5

7 months ago

14.0.6

7 months ago

14.0.7

7 months ago

14.0.8

7 months ago

7.3.2

10 months ago

8.0.0

10 months ago

11.3.3

8 months ago

11.3.4

8 months ago

11.3.1

9 months ago

11.3.2

9 months ago

11.3.5

8 months ago

11.3.0

9 months ago

7.2.3

10 months ago

5.1.0

11 months ago

6.1.0

10 months ago

6.1.2

10 months ago

6.1.1

10 months ago

6.1.4

10 months ago

6.1.3

10 months ago

7.1.0

10 months ago

5.0.9

11 months ago

5.0.8

11 months ago

5.0.7

11 months ago

5.0.6

11 months ago

5.0.10

11 months ago

6.0.1

11 months ago

6.0.0

11 months ago

6.0.3

10 months ago

6.0.2

11 months ago

7.0.0

10 months ago

7.2.2

10 months ago

7.2.1

10 months ago

7.2.0

10 months ago

7.0.1

10 months ago

6.1.6

10 months ago

6.1.5

10 months ago

6.1.8

10 months ago

6.1.7

10 months ago

5.0.5

11 months ago

5.0.4

11 months ago

5.0.3

12 months ago

5.0.2

1 year ago

5.0.1

1 year ago

5.0.0

1 year ago

4.1.0

2 years ago

4.1.1

2 years ago

4.0.9

2 years ago

4.0.8

2 years ago

4.0.7

2 years ago

3.0.2

2 years ago

4.0.5

2 years ago

4.0.4

2 years ago

4.0.6

2 years ago

4.0.1

2 years ago

4.0.0

2 years ago

4.0.3

2 years ago

4.0.2

2 years ago

3.0.1

2 years ago

3.0.0

2 years ago

2.2.0

3 years ago

2.1.8

3 years ago

2.1.7

3 years ago

2.1.6

3 years ago

2.1.5

3 years ago

2.1.4

3 years ago

2.1.3

3 years ago

2.1.2

3 years ago

2.1.1

3 years ago

2.1.0

3 years ago

2.0.3

3 years ago

2.0.2

3 years ago

2.0.5

3 years ago

2.0.4

3 years ago

2.0.7

3 years ago

2.0.6

3 years ago

2.0.9

3 years ago

2.0.10

3 years ago

2.0.8

3 years ago

2.0.1

3 years ago

2.0.0

3 years ago

1.1.6

3 years ago

1.1.5

3 years ago

1.1.4

3 years ago

1.1.3

3 years ago

1.1.1

3 years ago

1.1.2

3 years ago

1.1.0

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago