1
1
mirror of https://github.com/theoludwig/eslint-config-conventions.git synced 2025-05-18 12:02:33 +02:00

Compare commits

..

62 Commits

Author SHA1 Message Date
b4de437548 fix: remove eslint-plugin-import rules
We'll consider using eslint-plugin-import-x in the next major version,
https://github.com/theoludwig/eslint-config-conventions/issues/3
We remove this plugin to avoid issues like this: https://github.com/pnpm/pnpm/issues/4619
(should be resolved when ESLint v9 is fully supported)
And because of the lack of features, that eslint-plugin-import-x implement:
(https://github.com/un-ts/eslint-plugin-import-x/issues/24#issuecomment-1991605123)
2024-07-10 13:02:54 +02:00
c751162403 feat: support eslint-plugin-unicorn@^54.0.0 2024-07-10 12:44:40 +02:00
152ccba986 build(deps): update latest 2024-07-10 12:42:53 +02:00
10b5a0d8df fix: allow to ignore floating promise with void operator: @typescript-eslint/no-floating-promises 2024-05-21 19:35:36 +02:00
815518c613 chore: allow to publish pre-release beta version 2024-05-21 19:35:36 +02:00
860873aa4b ci: update GitHub actions 2024-05-21 19:35:36 +02:00
5eacace152 docs: stop recommending eslint-config-prettier and eslint-plugin-prettier to use Prettier 2024-05-21 19:35:36 +02:00
0dcde0af51 feat: support eslint-plugin-unicorn@^52.0.0 and eslint-plugin-unicorn@^53.0.0 2024-05-21 19:35:36 +02:00
b0fa907559 build(deps): update latest 2024-05-21 19:35:36 +02:00
d15df84a73 docs: delete additional </p> 2024-05-21 19:35:36 +02:00
aa4da3f6e8 docs: stop mentioning eslint-config-standard-with-typescript as it is now very different 2024-05-21 19:35:36 +02:00
b180eae455 fix: relax @typescript-eslint/member-delimiter-style
Deprecated stylistic rule.
2024-05-21 19:35:36 +02:00
31b226ffa4 docs: rename master branch to main 2024-02-16 20:04:49 +01:00
8403ef4254 build(deps): update latest 2024-02-16 20:03:29 +01:00
dbe252f3b4 feat: add support for @typescript-eslint v7 2024-02-16 20:03:21 +01:00
6e6a8d7aa1 feat: add @typescript-eslint/no-require-imports
Not considered breaking, as `@typescript-eslint/no-var-requires` is already there.
You should already not use, `require` in your codebase.
It was a mistake to not include this rule.

However, the newly added rule, will now report an error for the following example code:
```tsx
const [loaded, error] = useFonts({
  CustomFont: require("../assets/fonts/CustomFont.ttf")
})
```

Must read: "Every change breaks someones workflow", https://xkcd.com/1172/
2024-02-16 20:02:41 +01:00
256a5024d6 feat: add @typescript-eslint/prefer-as-const
BREAKING CHANGE: New rule introduced
2024-02-08 22:56:43 +01:00
3d2e708e96 docs: update link to eslint-config-standard-with-typescript 2024-02-08 22:54:22 +01:00
b0f6ef585f feat: add @typescript-eslint/prefer-promise-reject-errors
BREAKING CHANGE: New rule introduced
2024-02-08 22:53:25 +01:00
7abcc179e5 feat: add @typescript-eslint/no-useless-template-literals
BREAKING CHANGE: New rule introduced
2024-02-08 22:49:11 +01:00
b72745bdbe feat: add @typescript-eslint/prefer-find
BREAKING CHANGE: New rule introduced
2024-02-08 22:47:38 +01:00
89c012cac2 feat: add @typescript-eslint/no-array-delete
BREAKING CHANGE: New rule introduced
2024-02-08 22:46:43 +01:00
00b7a2a89b feat: add promise/no-nesting
BREAKING CHANGE: New rule introduced
2024-02-08 22:34:10 +01:00
a5036c8381 feat: add promise/no-multiple-resolved
BREAKING CHANGE: New rule introduced
2024-02-08 22:32:39 +01:00
c9365be768 feat: add import/no-anonymous-default-export
BREAKING CHANGE: New rule introduced
2024-02-08 22:29:14 +01:00
c1a524e31b feat: add no-useless-concat
BREAKING CHANGE: New rule introduced
2024-02-08 22:25:31 +01:00
8585574a70 feat: add no-else-return
BREAKING CHANGE: New rule introduced
2024-02-08 22:24:19 +01:00
fce826e24a feat: add no-sparse-arrays
BREAKING CHANGE: New rule introduced
2024-02-08 22:09:31 +01:00
17e90bcc35 feat: add no-constant-binary-expression
BREAKING CHANGE: New rule introduced
2024-02-08 21:57:58 +01:00
dab4433431 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint@^8.56.0`
`eslint-plugin-import@^2.29.1`
`eslint-plugin-unicorn@^51.0.1`
`typescript@^5.3.3`
`@typescript-eslint/eslint-plugin@^6.21.0`
`@typescript-eslint/parser@^6.21.0`
2024-02-08 21:50:33 +01:00
b671018a00 chore: cleaner configs 2024-01-30 01:32:52 +01:00
17dea937eb docs(license): add email address 2024-01-30 01:28:25 +01:00
7f3c152e61 build(deps): update latest 2023-12-26 22:07:17 +01:00
f243013173 feat: support eslint-plugin-unicorn@^50.0.0 2023-12-22 00:23:29 +01:00
d3d71f9a78 feat: add @typescript-eslint/no-unsafe-unary-minus
BREAKING CHANGE: New rule introduced
2023-11-14 12:52:10 +01:00
6a064c227e fix: relax unicorn/no-array-push-push 2023-11-14 12:50:21 +01:00
113a469ac5 build(deps): update latest
BREAKING CHANGE: peerDependencies:
`eslint@^8.52.0`
`eslint-plugin-import@^2.28.1`
`eslint-plugin-promise@^6.1.1`
`eslint-plugin-unicorn@^49.0.0`
`@typescript-eslint/eslint-plugin@^6.11.0`
`@typescript-eslint/parser@^6.11.0`
2023-11-14 12:49:18 +01:00
0e2b2ae89d chore: better Prettier config for easier reviews 2023-10-23 23:00:22 +02:00
d91b2a2538 feat: replace no-new-object (deprecated) rule with no-object-constructor
All checks were successful
Lint / lint (push) Successful in 1m9s
Test / test (push) Successful in 48s
2023-10-18 13:04:31 +02:00
d8b3ef6646 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint@^8.51.0`
`eslint-plugin-import@^2.28.1`
`eslint-plugin-promise@^6.1.1`
`eslint-plugin-unicorn@^48.0.1`

BREAKING CHANGE: Bump minimum supported Node.js >= 18.0.0
2023-10-18 12:59:19 +02:00
d149fdd6ab fix: relax unicorn/consistent-function-scoping
Some checks failed
Lint / lint (push) Successful in 49s
Test / test (push) Successful in 37s
Release / release (push) Failing after 1m2s
Rule not working well with typeof generic in TypeScript.
React.js component should have all the related functions in its scope.
2023-07-18 23:12:21 +02:00
6345bddd38 fix: relax @typescript-eslint/prefer-nullish-coalescing
Should ignore ternary tests.
2023-07-18 23:06:31 +02:00
4e99d69598 fix: relax no-duplicate-imports
Conflict with `@typescript-eslint/consistent-type-imports`
2023-07-18 22:31:59 +02:00
adf01e1e8c feat: add unicorn/template-indent
BREAKING CHANGE: New rule introduced
2023-07-18 22:08:49 +02:00
8bfeaadf32 feat: add unicorn/prefer-modern-math-apis
BREAKING CHANGE: New rule introduced
2023-07-18 22:04:34 +02:00
807c201955 feat: add unicorn/prefer-number-properties
BREAKING CHANGE: New rule introduced
2023-07-18 22:02:15 +02:00
381f5cb9cf feat: add unicorn/require-array-join-separator
BREAKING CHANGE: New rule introduced
2023-07-18 22:00:19 +02:00
c431a208e9 feat: add unicorn/number-literal-case
BREAKING CHANGE: New rule introduced
2023-07-18 21:58:04 +02:00
f622982fdb feat: add unicorn/no-new-buffer
BREAKING CHANGE: New rule introduced
2023-07-18 21:54:53 +02:00
d59b088bff feat: add unicorn/no-new-array
BREAKING CHANGE: New rule introduced
2023-07-18 21:53:56 +02:00
2fd4edbf5b feat: add unicorn/no-empty-file
BREAKING CHANGE: New rule introduced
2023-07-18 21:51:51 +02:00
8837b8737b feat: add unicorn/no-document-cookie
BREAKING CHANGE: New rule introduced
2023-07-18 21:50:47 +02:00
cbbb8dfe28 feat: add unicorn/no-array-push-push
BREAKING CHANGE: New rule introduced
2023-07-18 21:48:53 +02:00
2fcede3f0a feat: add unicorn/no-array-method-this-argument
BREAKING CHANGE: New rule introduced
2023-07-18 21:48:07 +02:00
80c00f5fa8 feat: add unicorn/no-array-for-each
BREAKING CHANGE: New rule introduced
2023-07-18 21:46:32 +02:00
7f7ab46896 feat: add unicorn/no-array-callback-reference
BREAKING CHANGE: New rule introduced
2023-07-18 21:45:37 +02:00
eab075e291 feat: add unicorn/explicit-length-check
BREAKING CHANGE: New rule introduced
2023-07-18 21:43:06 +02:00
244b74679a feat: add unicorn/consistent-function-scoping
BREAKING CHANGE: New rule introduced
2023-07-18 21:39:46 +02:00
07595ccb56 feat: add unicorn/consistent-destructuring
BREAKING CHANGE: New rule introduced
2023-07-18 21:37:00 +02:00
d0e9004ce3 docs: improve recommended usage/setup 2023-07-18 20:25:19 +02:00
1e29cef968 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^48.0.0`
2023-07-18 20:17:06 +02:00
f89c4415cf feat: add support for typescript-eslint v6.0.0 2023-07-14 23:19:09 +02:00
25 changed files with 4177 additions and 5394 deletions

View File

@ -1,6 +1,6 @@
{
"root": true,
"plugins": ["import", "promise", "unicorn"],
"plugins": ["promise", "unicorn"],
"env": {
"browser": true,
"node": true,
@ -22,6 +22,7 @@
"no-compare-neg-zero": "error",
"no-cond-assign": "error",
"no-const-assign": "error",
"no-constant-binary-expression": "error",
"no-constant-condition": "error",
"no-constructor-return": "error",
"no-control-regex": "error",
@ -34,7 +35,6 @@
"no-duplicate-imports": "error",
"no-empty-character-class": "error",
"no-empty-pattern": "error",
"no-empty-static-block": "error",
"no-ex-assign": "error",
"no-fallthrough": "error",
"no-func-assign": "error",
@ -51,6 +51,7 @@
"no-self-assign": "error",
"no-self-compare": "error",
"no-setter-return": "error",
"no-sparse-arrays": "error",
"no-this-before-super": "error",
"no-undef": "error",
"no-unexpected-multiline": "error",
@ -95,6 +96,7 @@
"no-confusing-arrow": "error",
"no-delete-var": "error",
"no-empty": ["error", { "allowEmptyCatch": true }],
"no-empty-static-block": "error",
"no-eval": "error",
"no-floating-decimal": "error",
"no-global-assign": "error",
@ -112,7 +114,7 @@
],
"no-multi-str": "error",
"no-new-func": "error",
"no-new-object": "error",
"no-object-constructor": "error",
"no-octal": "error",
"no-octal-escape": "error",
"no-proto": "error",
@ -130,13 +132,15 @@
}
],
"no-useless-call": "error",
"no-useless-concat": "error",
"no-useless-computed-key": "error",
"no-useless-constructor": "error",
"no-useless-escape": "error",
"no-useless-rename": "error",
"no-useless-return": "error",
"no-else-return": ["error", { "allowElseIf": false }],
"no-var": "error",
"no-void": "error",
"no-void": ["error", { "allowAsStatement": true }],
"no-with": "error",
"object-shorthand": ["error", "properties"],
"one-var": ["error", { "initialized": "never" }],
@ -153,39 +157,38 @@
"arrow-parens": ["error", "always"],
"arrow-body-style": ["error", "always"],
"import/no-absolute-path": "error",
"import/no-webpack-loader-syntax": "error",
"import/no-self-import": "error",
"import/no-useless-path-segments": "error",
"import/export": "error",
"import/first": "error",
"import/no-duplicates": "error",
"import/order": [
"error",
{
"groups": ["builtin", "external", "internal"],
"newlines-between": "always"
}
],
"import/no-named-default": "error",
"import/no-empty-named-blocks": "error",
"promise/param-names": "error",
"promise/no-new-statics": "error",
"promise/no-multiple-resolved": "error",
"promise/no-nesting": "error",
"unicorn/better-regex": "error",
"unicorn/catch-error-name": "error",
"unicorn/consistent-destructuring": "error",
"unicorn/custom-error-definition": "error",
"unicorn/error-message": "error",
"unicorn/escape-case": "error",
"unicorn/explicit-length-check": "error",
"unicorn/new-for-builtins": "error",
"unicorn/no-array-callback-reference": "error",
"unicorn/no-array-for-each": "error",
"unicorn/no-array-method-this-argument": "error",
"unicorn/no-document-cookie": "error",
"unicorn/no-empty-file": "error",
"unicorn/no-hex-escape": "error",
"unicorn/no-instanceof-array": "error",
"unicorn/no-new-array": "error",
"unicorn/no-new-buffer": "error",
"unicorn/no-this-assignment": "error",
"unicorn/no-zero-fractions": "error",
"unicorn/number-literal-case": "error",
"unicorn/prefer-node-protocol": "error",
"unicorn/throw-new-error": "error",
"unicorn/no-typeof-undefined": "error"
"unicorn/no-typeof-undefined": "error",
"unicorn/require-array-join-separator": "error",
"unicorn/prefer-number-properties": "error",
"unicorn/prefer-modern-math-apis": "error",
"unicorn/template-indent": "error"
},
"overrides": [
{
@ -196,8 +199,6 @@
"no-undef": "off",
"no-dupe-class-members": "off",
"@typescript-eslint/no-dupe-class-members": "error",
"no-duplicate-imports": "off",
"@typescript-eslint/no-duplicate-imports": "error",
"no-loss-of-precision": "off",
"@typescript-eslint/no-loss-of-precision": "error",
"no-unused-vars": "off",
@ -242,6 +243,7 @@
],
"no-useless-constructor": "off",
"@typescript-eslint/no-useless-constructor": "error",
"@typescript-eslint/no-useless-template-literals": "error",
"@typescript-eslint/adjacent-overload-signatures": "error",
"@typescript-eslint/array-type": [
@ -253,6 +255,7 @@
"error",
"interface"
],
"no-duplicate-imports": "off",
"@typescript-eslint/consistent-type-imports": "error",
"@typescript-eslint/explicit-function-return-type": [
"error",
@ -263,13 +266,6 @@
"allowDirectConstAssertionInArrowFunctions": true
}
],
"@typescript-eslint/member-delimiter-style": [
"error",
{
"multiline": { "delimiter": "none" },
"singleline": { "delimiter": "comma", "requireLast": false }
}
],
"@typescript-eslint/method-signature-style": "error",
"@typescript-eslint/naming-convention": [
"error",
@ -300,11 +296,17 @@
"@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-var-requires": "error",
"@typescript-eslint/no-require-imports": "error",
"@typescript-eslint/no-unsafe-unary-minus": "error",
"@typescript-eslint/no-array-delete": "error",
"@typescript-eslint/prefer-as-const": "error",
"@typescript-eslint/prefer-function-type": "error",
"@typescript-eslint/prefer-find": "error",
"@typescript-eslint/prefer-includes": "error",
"@typescript-eslint/prefer-nullish-coalescing": [
"error",
{
"ignoreTernaryTests": true,
"ignoreConditionalTests": false,
"ignoreMixedLogicalExpressions": false
}
@ -313,13 +315,15 @@
"@typescript-eslint/prefer-reduce-type-parameter": "error",
"@typescript-eslint/prefer-ts-expect-error": "error",
"@typescript-eslint/promise-function-async": "error",
"prefer-promise-reject-errors": "off",
"@typescript-eslint/prefer-promise-reject-errors": "error",
"@typescript-eslint/require-array-sort-compare": [
"error",
{ "ignoreStringArrays": true }
],
"@typescript-eslint/restrict-plus-operands": [
"error",
{ "checkCompoundAssignments": true }
{ "skipCompoundAssignments": true }
],
"@typescript-eslint/restrict-template-expressions": [
"error",

View File

@ -1,8 +1,8 @@
---
name: '🐛 Bug Report'
about: 'Report an unexpected problem or unintended behavior.'
title: '[Bug]'
labels: 'bug'
name: "🐛 Bug Report"
about: "Report an unexpected problem or unintended behavior."
title: "[Bug]"
labels: "bug"
---
<!--

View File

@ -1,8 +1,8 @@
---
name: '📜 Documentation'
about: 'Correct spelling errors, improvements or additions to documentation files (README, CONTRIBUTING...).'
title: '[Documentation]'
labels: 'documentation'
name: "📜 Documentation"
about: "Correct spelling errors, improvements or additions to documentation files (README, CONTRIBUTING...)."
title: "[Documentation]"
labels: "documentation"
---
<!-- Please make sure your issue has not already been fixed. -->

View File

@ -1,8 +1,8 @@
---
name: '✨ Feature Request'
about: 'Suggest a new feature idea.'
title: '[Feature]'
labels: 'feature request'
name: "✨ Feature Request"
about: "Suggest a new feature idea."
title: "[Feature]"
labels: "feature request"
---
<!-- Please make sure your issue has not already been fixed. -->

View File

@ -1,8 +1,8 @@
---
name: '🔧 Improvement'
about: 'Improve structure/format/performance/refactor/tests of the code.'
title: '[Improvement]'
labels: 'improvement'
name: "🔧 Improvement"
about: "Improve structure/format/performance/refactor/tests of the code."
title: "[Improvement]"
labels: "improvement"
---
<!-- Please make sure your issue has not already been fixed. -->

View File

@ -1,8 +1,8 @@
---
name: '🙋 Question'
about: 'Further information is requested.'
title: '[Question]'
labels: 'question'
name: "🙋 Question"
about: "Further information is requested."
title: "[Question]"
labels: "question"
---
### Question

View File

@ -1,28 +1,28 @@
name: 'Lint'
name: "Lint"
on:
push:
branches: [develop]
pull_request:
branches: [master, develop]
branches: [main, develop]
jobs:
lint:
runs-on: 'ubuntu-latest'
runs-on: "ubuntu-latest"
steps:
- uses: 'actions/checkout@v3.5.3'
- uses: "actions/checkout@v4.1.7"
- name: 'Setup Node.js'
uses: 'actions/setup-node@v3.6.0'
- name: "Setup Node.js"
uses: "actions/setup-node@v4.0.3"
with:
node-version: 'lts/*'
cache: 'npm'
node-version: "lts/*"
cache: "npm"
- name: 'Install dependencies'
run: 'npm clean-install'
- name: "Install dependencies"
run: "npm clean-install"
- run: 'npm run lint:commit -- --to "${{ github.sha }}"'
- run: 'npm run lint:editorconfig'
- run: 'npm run lint:markdown'
- run: 'npm run lint:eslint'
- run: 'npm run lint:prettier'
- run: "npm run lint:editorconfig"
- run: "npm run lint:markdown"
- run: "npm run lint:eslint"
- run: "npm run lint:prettier"

View File

@ -1,37 +1,37 @@
name: 'Release'
name: "Release"
on:
push:
branches: [master]
branches: [main]
jobs:
release:
runs-on: 'ubuntu-latest'
runs-on: "ubuntu-latest"
permissions:
contents: 'write'
issues: 'write'
pull-requests: 'write'
id-token: 'write'
contents: "write"
issues: "write"
pull-requests: "write"
id-token: "write"
steps:
- uses: 'actions/checkout@v3.5.3'
- uses: "actions/checkout@v4.1.7"
with:
fetch-depth: 0
persist-credentials: false
- name: 'Setup Node.js'
uses: 'actions/setup-node@v3.6.0'
- name: "Setup Node.js"
uses: "actions/setup-node@v4.0.3"
with:
node-version: 'lts/*'
cache: 'npm'
node-version: "lts/*"
cache: "npm"
- name: 'Install dependencies'
run: 'npm clean-install'
- name: "Install dependencies"
run: "npm clean-install"
- name: 'Verify the integrity of provenance attestations and registry signatures for installed dependencies'
run: 'npm audit signatures'
- name: "Verify the integrity of provenance attestations and registry signatures for installed dependencies"
run: "npm audit signatures"
- name: 'Release'
run: 'npm run release'
- name: "Release"
run: "npm run release"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@ -1,25 +1,25 @@
name: 'Test'
name: "Test"
on:
push:
branches: [develop]
pull_request:
branches: [master, develop]
branches: [main, develop]
jobs:
test:
runs-on: 'ubuntu-latest'
runs-on: "ubuntu-latest"
steps:
- uses: 'actions/checkout@v3.5.3'
- uses: "actions/checkout@v4.1.7"
- name: 'Setup Node.js'
uses: 'actions/setup-node@v3.6.0'
- name: "Setup Node.js"
uses: "actions/setup-node@v4.0.3"
with:
node-version: 'lts/*'
cache: 'npm'
node-version: "lts/*"
cache: "npm"
- name: 'Install dependencies'
run: 'npm clean-install'
- name: "Install dependencies"
run: "npm clean-install"
- name: 'Test'
run: 'npm run test'
- name: "Test"
run: "npm run test"

View File

@ -1,4 +1,3 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
#!/usr/bin/env sh
npm run lint:commit -- --edit

View File

@ -1,5 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
#!/usr/bin/env sh
npm run lint:staged
npm run test

View File

@ -1,6 +1,7 @@
{
"*": ["editorconfig-checker"],
"*.{js,jsx,ts,tsx}": ["prettier --write", "eslint --fix"],
"*.{json,jsonc,yml,yaml}": ["prettier --write"],
"*.{md,mdx}": ["prettier --write", "markdownlint-cli2 --fix"]
"**/*": ["editorconfig-checker", "prettier --write --ignore-unknown"],
"**/*.md": ["markdownlint-cli2 --fix --no-globs"],
"**/*.{js,jsx,ts,tsx}": [
"eslint --fix --max-warnings 0 --report-unused-disable-directives"
]
}

View File

@ -1,11 +1,11 @@
{
"config": {
"extends": "markdownlint/style/prettier",
"relative-links": true,
"default": true,
"MD033": false
"relative-links": true,
"no-inline-html": false,
},
"globs": ["**/*.{md,mdx}"],
"globs": ["**/*.md"],
"ignores": ["**/node_modules"],
"customRules": ["markdownlint-rule-relative-links"]
"customRules": ["markdownlint-rule-relative-links"],
}

View File

@ -1,6 +1,3 @@
{
"singleQuote": true,
"jsxSingleQuote": true,
"semi": false,
"trailingComma": "none"
"semi": false
}

View File

@ -1,5 +1,5 @@
{
"branches": ["master"],
"branches": ["main", { "name": "beta", "prerelease": true }],
"plugins": [
[
"@semantic-release/commit-analyzer",

View File

@ -5,6 +5,6 @@
"prettier.configPath": ".prettierrc.json",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": true
"source.fixAll": "explicit"
}
}

View File

@ -1,6 +1,6 @@
MIT License
# MIT License
Copyright (c) Théo LUDWIG
Copyright (c) Théo LUDWIG <contact@theoludwig.fr>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -4,15 +4,13 @@
<strong><a href="https://eslint.org/docs/developer-guide/shareable-configs">ESLint shareable config</a> to enforce strict conventions and good code quality.</strong>
</p>
</p>
<p align="center">
<a href="./CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat" /></a>
<a href="./CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat" alt="CONTRIBUTING" /></a>
<a href="./LICENSE"><img src="https://img.shields.io/badge/licence-MIT-blue.svg" alt="Licence MIT"/></a>
<a href="./CODE_OF_CONDUCT.md"><img src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg" alt="Contributor Covenant" /></a>
<br />
<a href="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/lint.yml"><img src="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/lint.yml/badge.svg?branch=develop" /></a>
<a href="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/test.yml"><img src="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/test.yml/badge.svg?branch=develop" /></a>
<a href="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/lint.yml"><img src="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/lint.yml/badge.svg?branch=develop" alt="lint action" /></a>
<a href="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/test.yml"><img src="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/test.yml/badge.svg?branch=develop" alt="test action" /></a>
<br />
<a href="https://conventionalcommits.org"><img src="https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg" alt="Conventional Commits" /></a>
<a href="https://github.com/semantic-release/semantic-release"><img src="https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg" alt="semantic-release" /></a>
@ -21,7 +19,7 @@
## 📜 About
**eslint-config-conventions** is a [ESLint](https://eslint.org) configuration to enforce strict conventions and good code quality, it is highly inspired from [eslint-config-standard-with-typescript](https://github.com/standard/eslint-config-standard-with-typescript) but it is **stricter** and with **no formatting rules**, **only code-quality rules**. It supports both **JavaScript** and **TypeScript**.
**eslint-config-conventions** is a [ESLint](https://eslint.org) configuration to enforce strict conventions and good code quality. It supports both **JavaScript** and **TypeScript**.
This configuration is mostly **for catching bugs** and **code-quality** so it is recommended to use it with [Prettier](https://prettier.io/) for a consistent code style, it works with any `.prettierrc.json` configuration.
@ -31,37 +29,35 @@ More information about **formatting rules** vs **code-quality rules** can be fou
### Prerequisites
- [Node.js](https://nodejs.org/) >= 16.0.0
[Node.js](https://nodejs.org/) >= 18.0.0
### Installation
```sh
npm install --save-dev \
eslint@^8.44.0 \
eslint-plugin-import@^2.27.5 \
eslint@^8.56.0 \
eslint-plugin-promise@^6.1.1 \
eslint-plugin-unicorn@^47.0.0 \
eslint-plugin-unicorn@^53.0.0 \
eslint-config-conventions@latest
```
This is a large number of packages due to [a known limitation in ESLint](https://github.com/eslint/eslint/issues/3458).
This list of dependencies are:
Dependencies are:
- [ESLint](https://github.com/eslint/eslint)
- 3 [ESLint Plugins](https://eslint.org/docs/user-guide/configuring/plugins)
- [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import)
- [eslint-plugin-promise](https://github.com/xjamundx/eslint-plugin-promise)
- [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn)
- This package: `eslint-config-conventions`
#### Installation with TypeScript
If you want to use **TypeScript**, you also need to install:
```sh
npm install --save-dev \
typescript@^5.0.4 \
@typescript-eslint/eslint-plugin@^5.60.1 \
@typescript-eslint/parser@^5.60.1
"typescript@^5.3.3" \
"@typescript-eslint/eslint-plugin@>=6.21.0" \
"@typescript-eslint/parser@>=6.21.0"
```
Dependencies are:
@ -70,44 +66,57 @@ Dependencies are:
- [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint): ESLint rules for TypeScript.
- [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint): ESLint parser for TypeScript.
### Configuration with [Prettier](https://prettier.io/) (recommended)
### Configuration
You will need to install some dependencies in addition to those required:
#### `.eslintrc.json` (JavaScript)
```json
{
"extends": ["conventions"],
"plugins": ["import", "promise", "unicorn"]
}
```
#### `.eslintrc.json` (TypeScript)
```json
{
"extends": ["conventions"],
"plugins": ["import", "promise", "unicorn"],
"overrides": [
{
"files": ["*.ts", "*.tsx"],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"parserOptions": {
"project": "./tsconfig.json"
}
}
]
}
```
#### Configuration with [Prettier](https://prettier.io/) (recommended)
```sh
npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier
npm install --save-dev prettier
# Create an empty config file to let editors and other tools know you are using Prettier
# You can personalize it with your own rules
echo "{}" > .prettierrc.json
```
#### `.eslintrc.json`
That's all! No need to update the `.eslintrc.json` configuration.
```json
{
"extends": ["conventions", "prettier"],
"plugins": ["prettier"],
"parserOptions": {
"project": "./tsconfig.json"
},
"rules": {
"prettier/prettier": "error"
}
}
```
**Note:** Please read some important instructions regarding the `project` option [here](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/README.md#configuration).
`"parserOptions.project"` is only required if you use **TypeScript**.
We discourage usage of [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier) and [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier), as `eslint-config-conventions` doesn't include any stylistic rules, and including these packages has several drawbacks (listed in [Integrating with Linters](https://prettier.io/docs/en/integrating-with-linters.html)) and brings no benefits for this configuration.
#### `package.json`
```jsonc
```json
{
"scripts": {
"lint:eslint": "eslint . --ignore-path .gitignore",
"lint:prettier": "prettier . --check --ignore-path .gitignore"
"lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --ignore-path .gitignore",
"lint:prettier": "prettier . --check"
}
}
```

View File

@ -1 +1 @@
module.exports = require('./.eslintrc.json')
module.exports = require("./.eslintrc.json")

9141
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -32,48 +32,45 @@
"provenance": true
},
"engines": {
"node": ">=16.0.0",
"npm": ">=9.0.0"
"node": ">=18.0.0"
},
"scripts": {
"lint:commit": "commitlint",
"lint:editorconfig": "editorconfig-checker",
"lint:markdown": "markdownlint-cli2",
"lint:eslint": "eslint . -c eslintrc.json",
"lint:prettier": "prettier . --check --ignore-path .gitignore",
"lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --config eslintrc.json",
"lint:prettier": "prettier . --check",
"lint:staged": "lint-staged",
"test": "node --test test/",
"test": "node --test",
"release": "semantic-release",
"postinstall": "husky install",
"postinstall": "husky",
"prepublishOnly": "pinst --disable",
"postpublish": "pinst --enable"
},
"peerDependencies": {
"eslint": "^8.44.0",
"eslint-plugin-import": "^2.27.5",
"eslint": "^8.56.0",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-unicorn": "^47.0.0"
"eslint-plugin-unicorn": "^51.0.1 || ^52.0.0 || ^53.0.0 || ^54.0.0"
},
"devDependencies": {
"@commitlint/cli": "17.6.6",
"@commitlint/config-conventional": "17.6.6",
"@tsconfig/strictest": "2.0.1",
"@types/eslint": "8.40.2",
"@types/node": "20.3.3",
"@typescript-eslint/eslint-plugin": "5.60.1",
"@typescript-eslint/parser": "5.60.1",
"editorconfig-checker": "5.1.1",
"eslint": "8.44.0",
"eslint-plugin-import": "2.27.5",
"eslint-plugin-promise": "6.1.1",
"eslint-plugin-unicorn": "47.0.0",
"husky": "8.0.3",
"lint-staged": "13.2.3",
"markdownlint-cli2": "0.8.1",
"markdownlint-rule-relative-links": "2.1.0",
"@commitlint/cli": "19.2.2",
"@commitlint/config-conventional": "19.2.2",
"@tsconfig/strictest": "2.0.5",
"@types/eslint": "8.56.10",
"@types/node": "20.14.10",
"@typescript-eslint/eslint-plugin": "7.16.0",
"@typescript-eslint/parser": "7.16.0",
"editorconfig-checker": "5.1.8",
"eslint": "8.57.0",
"eslint-plugin-promise": "6.4.0",
"eslint-plugin-unicorn": "54.0.0",
"husky": "9.0.11",
"lint-staged": "15.2.7",
"markdownlint-cli2": "0.13.0",
"markdownlint-rule-relative-links": "3.0.0",
"pinst": "3.0.0",
"prettier": "2.8.8",
"semantic-release": "21.0.6",
"typescript": "5.0.4"
"prettier": "3.3.2",
"semantic-release": "23.1.1",
"typescript": "5.5.3"
}
}

View File

@ -1,17 +1,17 @@
const test = require('node:test')
const assert = require('node:assert/strict')
const test = require("node:test")
const assert = require("node:assert/strict")
const config = require('../index.js')
const config = require("../index.js")
/**
* @param {unknown} object
* @returns {boolean}
*/
const isObject = (object) => {
return typeof object === 'object' && object !== null
return typeof object === "object" && object !== null
}
test('test basic properties of config', async () => {
test("test basic properties of config", async () => {
assert.ok(isObject(config))
assert.ok(isObject(config.parserOptions))
assert.ok(isObject(config.env))

View File

@ -1 +1 @@
'invalid eqeqeq' == 'invalid eqeqeq'
"invalid eqeqeq" == "invalid eqeqeq"

View File

@ -0,0 +1,3 @@
const returnsPromise = async (): Promise<void> => {}
void returnsPromise()

View File

@ -1,39 +1,46 @@
const test = require('node:test')
const assert = require('node:assert/strict')
const test = require("node:test")
const assert = require("node:assert/strict")
const { ESLint } = require('eslint')
const { ESLint } = require("eslint")
const eslint = new ESLint({
ignore: false,
useEslintrc: false,
overrideConfigFile: 'eslintrc.json'
overrideConfigFile: "eslintrc.json",
})
test('ensure we validate correctly JavaScript files', async () => {
test("ensure we validate correctly JavaScript files", async () => {
const [noErrors] = await eslint.lintFiles(
'test/fixtures/javascript-no-errors.js'
"test/fixtures/javascript-no-errors.js",
)
const [withErrors] = await eslint.lintFiles(
'test/fixtures/javascript-with-errors.js'
"test/fixtures/javascript-with-errors.js",
)
assert.strictEqual(noErrors?.errorCount, 0)
assert.strictEqual(withErrors?.errorCount, 3)
})
test('ensure we validate correctly TypeScript files', async () => {
test("ensure we validate correctly TypeScript files", async () => {
const [noErrors] = await eslint.lintFiles(
'test/fixtures/typescript-no-errors.ts'
"test/fixtures/typescript-no-errors.ts",
)
const [withErrors] = await eslint.lintFiles(
'test/fixtures/javascript-with-errors.js'
"test/fixtures/javascript-with-errors.js",
)
assert.strictEqual(noErrors?.errorCount, 0)
assert.strictEqual(withErrors?.errorCount, 3)
})
test('ensure we allow top-level await', async () => {
test("ensure we allow top-level await", async () => {
const [lintResult] = await eslint.lintFiles(
'test/fixtures/top-level-await.mjs'
"test/fixtures/top-level-await.mjs",
)
assert.strictEqual(lintResult?.errorCount, 0)
})
test("ensure we allow to ignore floating promise with void operator (@typescript-eslint/no-floating-promises)", async () => {
const [lintResult] = await eslint.lintFiles(
"test/fixtures/typescript-no-errors-ignore-promise.ts",
)
assert.strictEqual(lintResult?.errorCount, 0)
})