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

Compare commits

..

124 Commits

Author SHA1 Message Date
424235bd4f docs: specify TypeScript version with ~ to avoid issues with semver 2024-09-28 18:52:46 +02:00
7486e3aab6 build(deps): update latest
BREAKING CHANGE: peerDependencies:
`@typescript-eslint/eslint-plugin@^8.3.0`
`@typescript-eslint/parser@^8.3.0`
2024-09-28 18:50:44 +02:00
12f37d01b3 feat: add @typescript-eslint/no-unnecessary-condition
BREAKING CHANGE: New rule introduced
2024-09-25 18:02:43 +02:00
6af4b4f6ac feat: add @typescript-eslint/no-deprecated
BREAKING CHANGE: New rule introduced

Fixes #5
2024-09-25 17:52:28 +02:00
b4f1c0b8dd feat: add @typescript-eslint/no-redundant-type-constituents
BREAKING CHANGE: New rule introduced
2024-09-25 16:44:52 +02:00
116c3c600a feat: add @typescript-eslint/no-unsafe-declaration-merging
BREAKING CHANGE: New rule introduced
2024-09-25 16:30:23 +02:00
4115843cc1 feat: add @typescript-eslint/unbound-method
BREAKING CHANGE: New rule introduced
2024-09-25 16:22:08 +02:00
14d3e0ba30 chore: usage of projectService for tsconfig.json 2024-09-18 00:32:33 +02:00
921aacdc9b test: easier to debug in case of failures 2024-09-18 00:29:14 +02:00
a03e2bd109 fix: relax @typescript-eslint/return-await 2024-09-18 00:26:51 +02:00
2db017e805 test: ensure we do not use deprecated rules 2024-09-18 00:20:22 +02:00
19f74fc6a2 feat: add unicorn/prefer-structured-clone
BREAKING CHANGE: New rule introduced
2024-09-17 23:58:02 +02:00
bcd9fe10d3 fix: remove deprecated TypeScript ESLint rules
`@typescript-eslint/no-loss-of-precision`
`@typescript-eslint/no-var-requires`
`@typescript-eslint/prefer-ts-expect-error`
`@typescript-eslint/no-throw-literal`
`@typescript-eslint/no-useless-template-literals`
`@typescript-eslint/ban-types`
`@typescript-eslint/type-annotation-spacing`

Fixes #4
2024-09-17 23:43:56 +02:00
c2147dbc7a fix: remove deprecated ESLint rules
`no-confusing-arrow`
`no-floating-decimal`
`no-mixed-operators`
`quote-props`
`arrow-parens`
2024-09-17 23:17:45 +02:00
e6a222d01f build(deps): update latest
BREAKING CHANGE: peerDependencies:
`eslint@^8.57.0`
`eslint-plugin-promise@^7.0.0`
`eslint-plugin-unicorn@^55.0.0`
`@typescript-eslint/eslint-plugin@^8.0.0`
`@typescript-eslint/parser@^8.0.0`
2024-09-17 23:11:38 +02:00
eac273c076 feat: add @typescript-eslint/prefer-return-this-type
BREAKING CHANGE: New rule introduced
2024-07-27 09:00:42 +02:00
0df1b867a4 docs: update README.md 2024-07-26 07:00:24 +02:00
92e6e56884 ci: usage of Node.js v22 2024-07-25 14:01:48 +02:00
305df380aa chore: remove usage of git hooks (husky, lint-staged, commitlint) + usage of node --run 2024-07-25 14:00:05 +02:00
8b3d9109d7 build(deps): update latest 2024-07-25 13:51:35 +02:00
d0fa4e3688 feat: support eslint-plugin-unicorn@^55.0.0 2024-07-25 13:49:08 +02:00
9fa86e2133 feat: support eslint-plugin-promise@^7.0.0 2024-07-25 13:48:49 +02:00
6cb7af3a05 docs: import plugin is not used anymore 2024-07-10 13:34:28 +02:00
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
34ec74cff7 docs: simplify README 2023-07-02 16:02:28 +02:00
f5a69d69f5 fix: update author - Théo LUDWIG 2023-07-02 15:57:44 +02:00
e071e917f6 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint@^8.44.0`
2023-07-02 15:54:50 +02:00
528a31316d refactor: usage of node:test instead of tap 2023-07-02 15:46:14 +02:00
b1bd574d42 feat: add npm package provenance
Ref: https://github.blog/2023-04-19-introducing-npm-package-provenance/
2023-05-13 15:41:12 +02:00
ca9b1db4bd build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^47.0.0`
2023-05-13 15:22:49 +02:00
3222d42e67 build(deps): update latest 2023-04-02 21:16:48 +02:00
08602b1c53 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^46.0.0`
2023-04-02 20:53:26 +02:00
1779517f5c feat: add @typescript-eslint/ban-types
BREAKING CHANGE: New rule introduced
2023-02-06 23:52:11 +01:00
81b37b523c feat: add import/no-empty-named-blocks
BREAKING CHANGE: New rule introduced
2023-02-06 23:48:24 +01:00
a95ac7ec8b fix: relax @typescript-eslint/consistent-type-assertions 2023-02-06 23:43:23 +01:00
32481c316f fix: relax no-unused-vars ignore variable starting with _ 2023-02-06 23:42:09 +01:00
c3ddbc73b7 feat: add no-empty-static-block
Ref: https://eslint.org/docs/latest/rules/no-empty-static-block

BREAKING CHANGE: New rule introduced
2023-02-06 23:37:55 +01:00
1934d3525a feat: add no-new-native-nonconstructor
Ref: https://eslint.org/docs/latest/rules/no-new-native-nonconstructor

BREAKING CHANGE: New rule introduced
2023-02-06 23:36:21 +01:00
4f625c3b88 build(deps): update latest
BREAKING CHANGE: peerDependencies:
`eslint@^8.33.0`, `eslint-plugin-import@^2.27.5`,
`eslint-plugin-promise@^6.1.1`, `eslint-plugin-unicorn@^45.0.2`
2023-02-06 23:33:28 +01:00
e24964a60a build(deps): update latest 2023-01-10 13:27:35 +01:00
fcc107bdec fix: relax @typescript-eslint/prefer-optional-chain 2022-11-21 09:09:06 +01:00
666a3dee2d feat: add unicorn/no-typeof-undefined
BREAKING CHANGE: New rule introduced

BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^45.0.0`
2022-11-21 09:08:19 +01:00
0ce46310ed build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^44.0.0`
2022-10-03 20:40:47 +02:00
e2b2c1c77f docs: fix typo 2022-09-20 23:08:10 +02:00
846a25943d perf: reduce package size by publishing only needed files 2022-09-01 01:17:47 +02:00
e0f93343fe test: fix with new rules introduced 2022-08-31 14:00:08 +02:00
c3b46debe6 feat: add @typescript-eslint/consistent-type-imports
Ref: https://typescript-eslint.io/rules/consistent-type-imports

BREAKING CHANGE: New rule introduced
2022-08-31 13:56:16 +02:00
c0ec89ed0c feat: add prefer-arrow-callback
Ref: https://eslint.org/docs/latest/rules/prefer-arrow-callback

BREAKING CHANGE: New rule introduced
2022-08-31 13:49:03 +02:00
099a3388a1 feat: add func-style: "expression"
Ref: https://eslint.org/docs/latest/rules/func-style

BREAKING CHANGE: New rule introduced
2022-08-31 13:44:54 +02:00
1f20fe89e8 fix: relax @typescript-eslint/no-empty-interface 2022-08-31 13:32:05 +02:00
3f1d1921ba feat: add arrow-body-style: "always"
Ref: https://eslint.org/docs/latest/rules/arrow-body-style

BREAKING CHANGE: New rule introduced
2022-08-31 13:27:37 +02:00
b743c94430 feat: add arrow-parens: "always"
Ref: https://eslint.org/docs/latest/rules/arrow-parens

BREAKING CHANGE: New rule introduced
2022-08-31 13:25:38 +02:00
f138acaf53 feat: add curly: "all"
Ref: https://eslint.org/docs/latest/rules/curly

BREAKING CHANGE: New rule introduced
2022-08-31 13:22:20 +02:00
435d3e9e5f build(deps): update latest 2022-08-31 13:17:00 +02:00
637a79a8e7 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^43.0.0`
2022-07-12 13:52:53 +02:00
61679195ee build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-import@^2.26.0`, `eslint-plugin-unicorn@^42.0.0`
2022-04-06 19:14:13 +02:00
387509a30f chore: replace tape with tap 2022-03-19 14:28:00 +01:00
4271efe20b fix: relax require-await 2022-03-19 14:07:42 +01:00
14145df9c7 fix: relax @typescript-eslint/no-misused-promises 2022-03-16 11:40:14 +01:00
914e373058 fix: relax @typescript-eslint/await-thenable 2022-03-16 11:39:21 +01:00
4240e21ce2 build(deps): update latest 2022-03-16 11:38:20 +01:00
48061dd577 feat: support both JavaScript and TypeScript linting 2022-02-20 12:36:37 +01:00
c026007f42 fix: disable no-undef using TypeScript 2022-02-19 22:08:50 +01:00
36 changed files with 4522 additions and 12406 deletions

View File

@ -1 +0,0 @@
{ "extends": ["@commitlint/config-conventional"] }

View File

@ -1,19 +1,17 @@
{ {
"root": true, "root": true,
"plugins": ["@typescript-eslint", "import", "promise", "unicorn"], "plugins": ["promise", "unicorn"],
"env": { "env": {
"browser": true, "browser": true,
"node": true, "node": true,
"es2022": true "es2024": true
}, },
"parser": "@typescript-eslint/parser",
"parserOptions": { "parserOptions": {
"ecmaVersion": 2022, "ecmaVersion": "latest",
"sourceType": "module", "sourceType": "module",
"ecmaFeatures": { "ecmaFeatures": {
"jsx": true "jsx": true
}, }
"project": "./tsconfig.json"
}, },
"rules": { "rules": {
"constructor-super": "error", "constructor-super": "error",
@ -24,18 +22,17 @@
"no-compare-neg-zero": "error", "no-compare-neg-zero": "error",
"no-cond-assign": "error", "no-cond-assign": "error",
"no-const-assign": "error", "no-const-assign": "error",
"no-constant-binary-expression": "error",
"no-constant-condition": "error", "no-constant-condition": "error",
"no-constructor-return": "error", "no-constructor-return": "error",
"no-control-regex": "error", "no-control-regex": "error",
"no-debugger": "error", "no-debugger": "error",
"no-dupe-args": "error", "no-dupe-args": "error",
"no-dupe-class-members": "off", "no-dupe-class-members": "error",
"@typescript-eslint/no-dupe-class-members": "error",
"no-dupe-else-if": "error", "no-dupe-else-if": "error",
"no-dupe-keys": "error", "no-dupe-keys": "error",
"no-duplicate-case": "error", "no-duplicate-case": "error",
"no-duplicate-imports": "off", "no-duplicate-imports": "error",
"@typescript-eslint/no-duplicate-imports": "error",
"no-empty-character-class": "error", "no-empty-character-class": "error",
"no-empty-pattern": "error", "no-empty-pattern": "error",
"no-ex-assign": "error", "no-ex-assign": "error",
@ -44,9 +41,9 @@
"no-import-assign": "error", "no-import-assign": "error",
"no-invalid-regexp": "error", "no-invalid-regexp": "error",
"no-irregular-whitespace": "error", "no-irregular-whitespace": "error",
"no-loss-of-precision": "off", "no-loss-of-precision": "error",
"@typescript-eslint/no-loss-of-precision": "error",
"no-misleading-character-class": "error", "no-misleading-character-class": "error",
"no-new-native-nonconstructor": "error",
"no-new-symbol": "error", "no-new-symbol": "error",
"no-obj-calls": "error", "no-obj-calls": "error",
"no-promise-executor-return": "error", "no-promise-executor-return": "error",
@ -54,6 +51,7 @@
"no-self-assign": "error", "no-self-assign": "error",
"no-self-compare": "error", "no-self-compare": "error",
"no-setter-return": "error", "no-setter-return": "error",
"no-sparse-arrays": "error",
"no-this-before-super": "error", "no-this-before-super": "error",
"no-undef": "error", "no-undef": "error",
"no-unexpected-multiline": "error", "no-unexpected-multiline": "error",
@ -64,21 +62,16 @@
"no-unsafe-negation": "error", "no-unsafe-negation": "error",
"no-unsafe-optional-chaining": "error", "no-unsafe-optional-chaining": "error",
"no-unused-private-class-members": "error", "no-unused-private-class-members": "error",
"no-unused-vars": "off", "no-unused-vars": ["error", { "varsIgnorePattern": "^_" }],
"@typescript-eslint/no-unused-vars": "error", "no-use-before-define": [
"no-use-before-define": "off",
"@typescript-eslint/no-use-before-define": [
"error", "error",
{ {
"functions": false, "functions": false,
"classes": false, "classes": false,
"enums": false, "variables": false
"variables": false,
"typedefs": false
} }
], ],
"no-useless-backreference": "error", "no-useless-backreference": "error",
"require-atomic-updates": "error",
"use-isnan": [ "use-isnan": [
"error", "error",
{ {
@ -89,54 +82,35 @@
"valid-typeof": ["error", { "requireStringLiterals": true }], "valid-typeof": ["error", { "requireStringLiterals": true }],
"consistent-this": "error", "consistent-this": "error",
"default-param-last": "off", "default-param-last": "error",
"@typescript-eslint/default-param-last": "error",
"default-case-last": "error", "default-case-last": "error",
"dot-notation": "off", "dot-notation": ["error", { "allowKeywords": true }],
"@typescript-eslint/dot-notation": ["error", { "allowKeywords": true }],
"eqeqeq": ["error", "always", { "null": "ignore" }], "eqeqeq": ["error", "always", { "null": "ignore" }],
"grouped-accessor-pairs": "error", "grouped-accessor-pairs": "error",
"new-cap": [ "new-cap": [
"error", "error",
{ "newIsCap": true, "capIsNew": false, "properties": true } { "newIsCap": true, "capIsNew": false, "properties": true }
], ],
"no-array-constructor": "off", "no-array-constructor": "error",
"@typescript-eslint/no-array-constructor": "error",
"no-caller": "error", "no-caller": "error",
"no-confusing-arrow": "error",
"no-delete-var": "error", "no-delete-var": "error",
"no-empty": ["error", { "allowEmptyCatch": true }], "no-empty": ["error", { "allowEmptyCatch": true }],
"no-empty-static-block": "error",
"no-eval": "error", "no-eval": "error",
"no-floating-decimal": "error",
"no-global-assign": "error", "no-global-assign": "error",
"no-implied-eval": "off", "no-implied-eval": "error",
"@typescript-eslint/no-implied-eval": "error",
"no-mixed-operators": [
"error",
{
"groups": [
["==", "!=", "===", "!==", ">", ">=", "<", "<="],
["&&", "||"],
["in", "instanceof"]
],
"allowSamePrecedence": true
}
],
"no-multi-str": "error", "no-multi-str": "error",
"no-new-func": "error", "no-new-func": "error",
"no-new-object": "error", "no-object-constructor": "error",
"no-octal": "error", "no-octal": "error",
"no-octal-escape": "error", "no-octal-escape": "error",
"no-proto": "error", "no-proto": "error",
"no-redeclare": "off", "no-redeclare": ["error", { "builtinGlobals": false }],
"@typescript-eslint/no-redeclare": ["error", { "builtinGlobals": false }],
"no-regex-spaces": "error", "no-regex-spaces": "error",
"no-shadow-restricted-names": "error", "no-shadow-restricted-names": "error",
"no-throw-literal": "off", "no-throw-literal": "error",
"@typescript-eslint/no-throw-literal": "error",
"no-undef-init": "error", "no-undef-init": "error",
"no-unused-expressions": "off", "no-unused-expressions": [
"@typescript-eslint/no-unused-expressions": [
"error", "error",
{ {
"allowShortCircuit": true, "allowShortCircuit": true,
@ -145,14 +119,15 @@
} }
], ],
"no-useless-call": "error", "no-useless-call": "error",
"no-useless-concat": "error",
"no-useless-computed-key": "error", "no-useless-computed-key": "error",
"no-useless-constructor": "off", "no-useless-constructor": "error",
"@typescript-eslint/no-useless-constructor": "error",
"no-useless-escape": "error", "no-useless-escape": "error",
"no-useless-rename": "error", "no-useless-rename": "error",
"no-useless-return": "error", "no-useless-return": "error",
"no-else-return": ["error", { "allowElseIf": false }],
"no-var": "error", "no-var": "error",
"no-void": "error", "no-void": ["error", { "allowAsStatement": true }],
"no-with": "error", "no-with": "error",
"object-shorthand": ["error", "properties"], "object-shorthand": ["error", "properties"],
"one-var": ["error", { "initialized": "never" }], "one-var": ["error", { "initialized": "never" }],
@ -160,65 +135,119 @@
"prefer-object-has-own": "error", "prefer-object-has-own": "error",
"prefer-promise-reject-errors": "error", "prefer-promise-reject-errors": "error",
"prefer-regex-literals": ["error", { "disallowRedundantWrapping": true }], "prefer-regex-literals": ["error", { "disallowRedundantWrapping": true }],
"quote-props": ["error", "as-needed"],
"radix": "error", "radix": "error",
"require-await": "off",
"@typescript-eslint/require-await": "error",
"spaced-comment": ["error", "always"],
"yoda": ["error", "never"], "yoda": ["error", "never"],
"curly": ["error", "all"],
"import/no-absolute-path": "error", "func-style": ["error", "expression"],
"import/no-webpack-loader-syntax": "error", "prefer-arrow-callback": "error",
"import/no-self-import": "error", "arrow-body-style": ["error", "always"],
"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",
"promise/param-names": "error", "promise/param-names": "error",
"promise/no-new-statics": "error", "promise/no-new-statics": "error",
"promise/no-multiple-resolved": "error",
"promise/no-nesting": "error",
"unicorn/better-regex": "error", "unicorn/better-regex": "error",
"unicorn/catch-error-name": "error", "unicorn/catch-error-name": "error",
"unicorn/consistent-destructuring": "error",
"unicorn/custom-error-definition": "error", "unicorn/custom-error-definition": "error",
"unicorn/error-message": "error", "unicorn/error-message": "error",
"unicorn/escape-case": "error", "unicorn/escape-case": "error",
"unicorn/explicit-length-check": "error",
"unicorn/new-for-builtins": "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-hex-escape": "error",
"unicorn/no-instanceof-array": "error", "unicorn/no-instanceof-array": "error",
"unicorn/no-new-array": "error",
"unicorn/no-new-buffer": "error",
"unicorn/no-this-assignment": "error", "unicorn/no-this-assignment": "error",
"unicorn/no-zero-fractions": "error", "unicorn/no-zero-fractions": "error",
"unicorn/number-literal-case": "error",
"unicorn/prefer-node-protocol": "error", "unicorn/prefer-node-protocol": "error",
"unicorn/throw-new-error": "error" "unicorn/throw-new-error": "error",
"unicorn/no-typeof-undefined": "error",
"unicorn/require-array-join-separator": "error",
"unicorn/prefer-number-properties": "error",
"unicorn/prefer-modern-math-apis": "error",
"unicorn/prefer-structured-clone": "error",
"unicorn/template-indent": "error"
}, },
"overrides": [ "overrides": [
{ {
"files": ["*.ts", "*.tsx"], "files": ["*.ts", "*.tsx"],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"rules": { "rules": {
"no-undef": "off",
"no-dupe-class-members": "off",
"@typescript-eslint/no-dupe-class-members": "error",
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": [
"error",
{ "varsIgnorePattern": "^_" }
],
"no-use-before-define": "off",
"@typescript-eslint/no-use-before-define": [
"error",
{
"functions": false,
"classes": false,
"enums": false,
"variables": false,
"typedefs": false
}
],
"default-param-last": "off",
"@typescript-eslint/default-param-last": "error",
"dot-notation": "off",
"@typescript-eslint/dot-notation": ["error", { "allowKeywords": true }],
"no-array-constructor": "off",
"@typescript-eslint/no-array-constructor": "error",
"no-implied-eval": "off",
"@typescript-eslint/no-implied-eval": "error",
"no-redeclare": "off",
"@typescript-eslint/no-redeclare": [
"error",
{ "builtinGlobals": false }
],
"no-throw-literal": "off",
"@typescript-eslint/only-throw-error": "error",
"no-unused-expressions": "off",
"@typescript-eslint/no-unused-expressions": [
"error",
{
"allowShortCircuit": true,
"allowTernary": true,
"allowTaggedTemplates": true
}
],
"no-useless-constructor": "off",
"@typescript-eslint/no-useless-constructor": "error",
"@typescript-eslint/no-unnecessary-template-expression": "error",
"@typescript-eslint/no-unnecessary-condition": [
"error",
{
"allowConstantLoopConditions": true
}
],
"@typescript-eslint/adjacent-overload-signatures": "error", "@typescript-eslint/adjacent-overload-signatures": "error",
"@typescript-eslint/array-type": [ "@typescript-eslint/array-type": [
"error", "error",
{ "default": "array-simple" } { "default": "array-simple" }
], ],
"@typescript-eslint/consistent-type-assertions": [ "@typescript-eslint/no-unsafe-function-type": "error",
"error", "@typescript-eslint/no-wrapper-object-types": "error",
{
"assertionStyle": "as",
"objectLiteralTypeAssertions": "never"
}
],
"@typescript-eslint/consistent-type-definitions": [ "@typescript-eslint/consistent-type-definitions": [
"error", "error",
"interface" "interface"
], ],
"no-duplicate-imports": "off",
"@typescript-eslint/consistent-type-imports": "error",
"@typescript-eslint/explicit-function-return-type": [ "@typescript-eslint/explicit-function-return-type": [
"error", "error",
{ {
@ -228,14 +257,8 @@
"allowDirectConstAssertionInArrowFunctions": true "allowDirectConstAssertionInArrowFunctions": true
} }
], ],
"@typescript-eslint/member-delimiter-style": [
"error",
{
"multiline": { "delimiter": "none" },
"singleline": { "delimiter": "comma", "requireLast": false }
}
],
"@typescript-eslint/method-signature-style": "error", "@typescript-eslint/method-signature-style": "error",
"@typescript-eslint/unbound-method": "error",
"@typescript-eslint/naming-convention": [ "@typescript-eslint/naming-convention": [
"error", "error",
{ {
@ -246,12 +269,10 @@
} }
], ],
"@typescript-eslint/no-base-to-string": "error", "@typescript-eslint/no-base-to-string": "error",
"@typescript-eslint/no-deprecated": "error",
"@typescript-eslint/no-dynamic-delete": "error", "@typescript-eslint/no-dynamic-delete": "error",
"@typescript-eslint/no-empty-interface": [
"error",
{ "allowSingleExtends": true }
],
"@typescript-eslint/no-extra-non-null-assertion": "error", "@typescript-eslint/no-extra-non-null-assertion": "error",
"@typescript-eslint/no-redundant-type-constituents": "error",
"@typescript-eslint/no-extraneous-class": [ "@typescript-eslint/no-extraneous-class": [
"error", "error",
{ "allowWithDecorator": true } { "allowWithDecorator": true }
@ -260,7 +281,6 @@
"@typescript-eslint/no-for-in-array": "error", "@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-invalid-void-type": "error", "@typescript-eslint/no-invalid-void-type": "error",
"@typescript-eslint/no-misused-new": "error", "@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-misused-promises": "error",
"@typescript-eslint/no-non-null-asserted-optional-chain": "error", "@typescript-eslint/no-non-null-asserted-optional-chain": "error",
"@typescript-eslint/no-non-null-assertion": "error", "@typescript-eslint/no-non-null-assertion": "error",
"@typescript-eslint/no-this-alias": [ "@typescript-eslint/no-this-alias": [
@ -269,34 +289,40 @@
], ],
"@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "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-unsafe-declaration-merging": "error",
"@typescript-eslint/no-array-delete": "error",
"@typescript-eslint/prefer-as-const": "error",
"@typescript-eslint/prefer-function-type": "error", "@typescript-eslint/prefer-function-type": "error",
"@typescript-eslint/prefer-find": "error",
"@typescript-eslint/prefer-includes": "error", "@typescript-eslint/prefer-includes": "error",
"@typescript-eslint/prefer-nullish-coalescing": [ "@typescript-eslint/prefer-nullish-coalescing": [
"error", "error",
{ {
"ignoreTernaryTests": true,
"ignoreConditionalTests": false, "ignoreConditionalTests": false,
"ignoreMixedLogicalExpressions": false "ignoreMixedLogicalExpressions": false
} }
], ],
"@typescript-eslint/prefer-optional-chain": "error",
"@typescript-eslint/prefer-readonly": "error", "@typescript-eslint/prefer-readonly": "error",
"@typescript-eslint/prefer-reduce-type-parameter": "error", "@typescript-eslint/prefer-reduce-type-parameter": "error",
"@typescript-eslint/prefer-ts-expect-error": "error", "@typescript-eslint/prefer-return-this-type": "error",
"@typescript-eslint/promise-function-async": "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": [ "@typescript-eslint/require-array-sort-compare": [
"error", "error",
{ "ignoreStringArrays": true } { "ignoreStringArrays": true }
], ],
"@typescript-eslint/restrict-plus-operands": [ "@typescript-eslint/restrict-plus-operands": [
"error", "error",
{ "checkCompoundAssignments": true } { "skipCompoundAssignments": true }
], ],
"@typescript-eslint/restrict-template-expressions": [ "@typescript-eslint/restrict-template-expressions": [
"error", "error",
{ "allowNumber": true } { "allowNumber": true }
], ],
"@typescript-eslint/return-await": ["error", "always"],
"@typescript-eslint/strict-boolean-expressions": [ "@typescript-eslint/strict-boolean-expressions": [
"error", "error",
{ {
@ -308,8 +334,7 @@
"allowNullableNumber": false, "allowNullableNumber": false,
"allowAny": false "allowAny": false
} }
], ]
"@typescript-eslint/type-annotation-spacing": "error"
} }
} }
] ]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
<!-- Please first discuss the change you wish to make via issue before making a change. It might avoid a waste of your time. --> <!-- Please first discuss the change you wish to make via issue before making a change. It might avoid a waste of your time. -->
## What changes this PR introduce? # What changes this PR introduce?
## List any relevant issue numbers ## List any relevant issue numbers

View File

@ -1,28 +1,34 @@
name: 'Lint' name: "Lint"
on: on:
push: push:
branches: [master, develop] branches: [develop]
pull_request: pull_request:
branches: [master, develop] branches: [main, develop]
jobs: jobs:
lint: lint:
runs-on: 'ubuntu-latest' runs-on: "ubuntu-latest"
steps: steps:
- uses: 'actions/checkout@v2.4.0' - uses: "actions/checkout@v4.1.7"
- name: 'Use Node.js' - name: "Setup Node.js"
uses: 'actions/setup-node@v2.5.1' uses: "actions/setup-node@v4.0.3"
with: with:
node-version: 'lts/*' node-version: "22.x"
cache: 'npm' cache: "npm"
- name: 'Install' - name: "Install dependencies"
run: 'npm install' run: "npm clean-install"
- run: 'npm run lint:commit -- --to "${{ github.sha }}"' - run: "node --run lint:editorconfig"
- run: 'npm run lint:editorconfig' - run: "node --run lint:markdown"
- run: 'npm run lint:markdown' - run: "node --run lint:eslint"
- run: 'npm run lint:javascript' - run: "node --run lint:prettier"
- run: 'npm run lint:prettier'
commitlint:
runs-on: "ubuntu-latest"
steps:
- uses: "actions/checkout@v4.1.7"
- uses: "wagoid/commitlint-github-action@v6.1.2"

View File

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

View File

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

1
.gitignore vendored
View File

@ -4,6 +4,7 @@ node_modules
# testing # testing
coverage coverage
.nyc_output
# debug # debug
npm-debug.log* npm-debug.log*

View File

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

View File

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

View File

@ -1,6 +0,0 @@
{
"*": ["editorconfig-checker"],
"*.{js,jsx,ts,tsx}": ["prettier --write", "eslint --fix"],
"*.{json,jsonc,yml,yaml}": ["prettier --write"],
"*.{md,mdx}": ["prettier --write", "markdownlint --dot --fix"]
}

11
.markdownlint-cli2.jsonc Normal file
View File

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

View File

@ -1,6 +0,0 @@
{
"default": true,
"MD013": false,
"MD033": false,
"MD041": false
}

3
.npmrc
View File

@ -1 +1,2 @@
save-exact=true save-exact = true
provenance = true

View File

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

View File

@ -1,18 +1,8 @@
{ {
"branches": ["master"], "branches": ["main", { "name": "beta", "prerelease": true }],
"plugins": [ "plugins": [
[ "@semantic-release/commit-analyzer",
"@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator",
{
"preset": "conventionalcommits"
}
],
[
"@semantic-release/release-notes-generator",
{
"preset": "conventionalcommits"
}
],
"@semantic-release/npm", "@semantic-release/npm",
"@semantic-release/github" "@semantic-release/github"
] ]

View File

@ -1,8 +0,0 @@
{
"recommendations": [
"editorconfig.editorconfig",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"davidanson.vscode-markdownlint"
]
}

10
.vscode/settings.json vendored
View File

@ -1,10 +0,0 @@
{
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.preferences.importModuleSpecifierEnding": "js",
"editor.defaultFormatter": "esbenp.prettier-vscode",
"prettier.configPath": ".prettierrc.json",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": true
}
}

View File

@ -60,7 +60,7 @@ representative at an online or offline event.
Instances of abusive, harassing, or otherwise unacceptable behavior may be Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at reported to the community leaders responsible for enforcement at
contact@divlo.fr. <contact@theoludwig.fr>.
All complaints will be reviewed and investigated promptly and fairly. All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the All community leaders are obligated to respect the privacy and security of the

View File

@ -2,6 +2,14 @@
Thanks a lot for your interest in contributing to **eslint-config-conventions**! 🎉 Thanks a lot for your interest in contributing to **eslint-config-conventions**! 🎉
## Code of Conduct
**eslint-config-conventions** adopted the [Contributor Covenant](https://www.contributor-covenant.org/) as its Code of Conduct, and we expect project participants to adhere to it. Please read [the full text](./CODE_OF_CONDUCT.md) so that you can understand what actions will and will not be tolerated.
## Open Development
All work on **eslint-config-conventions** happens directly on this repository. Both core team members and external contributors send pull requests which go through the same review process.
## Types of contributions ## Types of contributions
- Reporting a bug. - Reporting a bug.
@ -11,7 +19,7 @@ Thanks a lot for your interest in contributing to **eslint-config-conventions**!
## Pull Requests ## Pull Requests
- **Please first discuss** the change you wish to make via [issue](https://github.com/Divlo/eslint-config-conventions/issues) before making a change. It might avoid a waste of your time. - **Please first discuss** the change you wish to make via [issue](https://github.com/theoludwig/eslint-config-conventions/issues) before making a change. It might avoid a waste of your time.
- Ensure your code respect linting. - Ensure your code respect linting.
@ -21,26 +29,4 @@ If you're adding new features to **eslint-config-conventions**, please include t
## Commits ## Commits
The commit message guidelines respect [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional) and [Semantic Versioning](https://semver.org/) for releases. The commit message guidelines adheres to [Conventional Commits](https://www.conventionalcommits.org/) and [Semantic Versioning](https://semver.org/) for releases.
### Types
Types define which kind of changes you made to the project.
| Types | Description |
| -------- | ------------------------------------------------------------------------------------------------------------ |
| feat | A new feature. |
| fix | A bug fix. |
| docs | Documentation only changes. |
| style | Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc). |
| refactor | A code change that neither fixes a bug nor adds a feature. |
| perf | A code change that improves performance. |
| test | Adding missing tests or correcting existing tests. |
| build | Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm). |
| ci | Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs). |
| chore | Other changes that don't modify src or test files. |
| revert | Reverts a previous commit. |
### Scopes
Scopes define what part of the code changed.

View File

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

115
README.md
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> <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>
<p align="center"> <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="./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> <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 /> <br />
<a href="https://github.com/Divlo/eslint-config-conventions/actions/workflows/lint.yml"><img src="https://github.com/Divlo/eslint-config-conventions/actions/workflows/lint.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/Divlo/eslint-config-conventions/actions/workflows/test.yml"><img src="https://github.com/Divlo/eslint-config-conventions/actions/workflows/test.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" alt="test action" /></a>
<br /> <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://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> <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,9 +19,9 @@
## 📜 About ## 📜 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**. **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 recommanded to use it with [Prettier](https://prettier.io/) for a consistent code style, it works with any `.prettierrc.json` configuration. 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.
More information about **formatting rules** vs **code-quality rules** can be found on [Prettier vs. Linters](https://prettier.io/docs/en/comparison.html). More information about **formatting rules** vs **code-quality rules** can be found on [Prettier vs. Linters](https://prettier.io/docs/en/comparison.html).
@ -31,75 +29,96 @@ More information about **formatting rules** vs **code-quality rules** can be fou
### Prerequisites ### Prerequisites
- [Node.js](https://nodejs.org/) >= 16.0.0 [Node.js](https://nodejs.org/) >= 18.0.0
### Installation ### Installation
`npm@<7` does not automatically install `peerDependencies`, so if that's what you're using, install them manually.
Here is an example, but use it only for reference, because your decisions regarding version ranges and range specifiers may vary.
```sh ```sh
npm install --save-dev \ npm install --save-dev \
eslint@^8.9.0 \ eslint@^8.57.0 \
eslint-plugin-import@^2.25.4 \ eslint-plugin-promise@^7.0.0 \
eslint-plugin-promise@^6.0.0 \ eslint-plugin-unicorn@^55.0.0 \
eslint-plugin-unicorn@^41.0.0 \
typescript@^4.4.0 \
@typescript-eslint/eslint-plugin@^5.12.0 \
eslint-config-conventions@latest eslint-config-conventions@latest
``` ```
Yes, this is a large number of packages. This is due to [a known limitation in ESLint](https://github.com/eslint/eslint/issues/3458). Dependencies are:
This list of dependencies are:
- [ESLint](https://github.com/eslint/eslint) - [ESLint](https://github.com/eslint/eslint)
- 3 [ESLint Plugins](https://eslint.org/docs/user-guide/configuring/plugins) - [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-promise](https://github.com/xjamundx/eslint-plugin-promise)
- [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) - [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn)
- [TypeScript](https://github.com/Microsoft/TypeScript)
- [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint); ESLint rules for TypeScript.
- This package: `eslint-config-conventions` - This package: `eslint-config-conventions`
### Configuration with [Prettier](https://prettier.io/) (recommended) #### Installation with TypeScript
You will need to install some dependencies in addition to those required: If you want to use **TypeScript**, you also need to install:
```sh ```sh
npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier npm install --save-dev \
"typescript@~5.5.4" \
# Create an empty config file to let editors and other tools know you are using Prettier "@typescript-eslint/eslint-plugin@^8.3.0" \
# You can personalize it with your own rules "@typescript-eslint/parser@^8.3.0"
echo {}> .prettierrc.json
``` ```
#### `.eslintrc.json` Dependencies are:
- [TypeScript](https://github.com/Microsoft/TypeScript)
- [@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
#### `.eslintrc.json` (JavaScript)
```json ```json
{ {
"extends": ["conventions", "prettier"], "root": true,
"plugins": ["prettier"], "extends": ["conventions"],
"parserOptions": { "plugins": ["promise", "unicorn"]
"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). #### `.eslintrc.json` (TypeScript)
You must have a valid `tsconfig.json` file to specify `"parserOptions.project"`. ```json
{
"root": true,
"extends": ["conventions"],
"plugins": ["promise", "unicorn"],
"overrides": [
{
"files": ["*.ts", "*.tsx"],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"parserOptions": {
"projectService": true
}
}
]
}
```
#### Configuration with [Prettier](https://prettier.io/) (recommended)
```sh
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
```
That's all! No need to update the `.eslintrc.json` configuration.
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` #### `package.json`
```jsonc ```json
{ {
"scripts": { "scripts": {
"lint:typescript": "eslint \"**/*.{js,jsx,ts,tsx}\" --ignore-path \".gitignore\"", "lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --ignore-path .gitignore",
"lint:prettier": "prettier \".\" --check --ignore-path \".gitignore\"" "lint:prettier": "prettier . --check"
} }
} }
``` ```
@ -107,12 +126,12 @@ You must have a valid `tsconfig.json` file to specify `"parserOptions.project"`.
### Usage ### Usage
```sh ```sh
npm run lint:typescript node --run lint:eslint
# or to apply automatic fixes to code # or to apply automatic fixes to code
npm run lint:typescript -- --fix node --run lint:eslint -- --fix
# Validate code formatting in all supported languages by Prettier # Validate code formatting in all supported languages by Prettier
npm run lint:prettier node --run lint:prettier
``` ```
## 💡 Contributing ## 💡 Contributing

6
eslintrc.json Normal file
View File

@ -0,0 +1,6 @@
{
"extends": "./index.js",
"parserOptions": {
"projectService": true
}
}

View File

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

16118
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,16 +3,16 @@
"version": "0.0.0-development", "version": "0.0.0-development",
"public": true, "public": true,
"description": "ESLint shareable config to enforce strict conventions and good code quality.", "description": "ESLint shareable config to enforce strict conventions and good code quality.",
"author": "Divlo <contact@divlo.fr>", "author": "Théo LUDWIG <contact@theoludwig.fr>",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/Divlo/eslint-config-conventions.git" "url": "https://github.com/theoludwig/eslint-config-conventions.git"
}, },
"bugs": { "bugs": {
"url": "https://github.com/Divlo/eslint-config-conventions/issues" "url": "https://github.com/theoludwig/eslint-config-conventions/issues"
}, },
"homepage": "https://github.com/Divlo/eslint-config-conventions#readme", "homepage": "https://github.com/theoludwig/eslint-config-conventions#readme",
"keywords": [ "keywords": [
"eslintconfig", "eslintconfig",
"eslint", "eslint",
@ -23,50 +23,43 @@
"conventions" "conventions"
], ],
"main": "index.js", "main": "index.js",
"files": [
"index.js",
".eslintrc.json"
],
"publishConfig": {
"access": "public",
"provenance": true
},
"engines": { "engines": {
"node": ">=16.0.0", "node": ">=18.0.0"
"npm": ">=8.0.0"
}, },
"scripts": { "scripts": {
"lint:commit": "commitlint",
"lint:editorconfig": "editorconfig-checker", "lint:editorconfig": "editorconfig-checker",
"lint:markdown": "markdownlint \"**/*.md\" --dot --ignore-path \".gitignore\"", "lint:markdown": "markdownlint-cli2",
"lint:javascript": "eslint \"**/*.{js,jsx,ts,tsx}\"", "lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --config eslintrc.json",
"lint:prettier": "prettier \".\" --check --ignore-path \".gitignore\"", "lint:prettier": "prettier . --check",
"lint:staged": "lint-staged", "test": "node --test",
"test": "tape \"test/**/*.js\"", "release": "semantic-release"
"release": "semantic-release",
"postinstall": "husky install",
"prepublishOnly": "pinst --disable",
"postpublish": "pinst --enable"
}, },
"peerDependencies": { "peerDependencies": {
"eslint": "^8.9.0", "eslint": "^8.57.0",
"eslint-plugin-import": "^2.25.4", "eslint-plugin-promise": "^7.0.0",
"eslint-plugin-promise": "^6.0.0", "eslint-plugin-unicorn": "^55.0.0"
"eslint-plugin-unicorn": "^41.0.0",
"typescript": "^4.4.0",
"@typescript-eslint/eslint-plugin": "^5.12.0"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "16.2.1", "@types/eslint": "8.56.12",
"@commitlint/config-conventional": "16.2.1", "@types/node": "22.7.4",
"editorconfig-checker": "4.0.2", "@typescript-eslint/eslint-plugin": "8.7.0",
"eslint": "8.9.0", "@typescript-eslint/parser": "8.7.0",
"@types/eslint": "8.4.1", "editorconfig-checker": "6.0.0",
"eslint-plugin-import": "2.25.4", "eslint": "8.57.1",
"eslint-plugin-promise": "6.0.0", "eslint-plugin-promise": "7.1.0",
"eslint-plugin-unicorn": "41.0.0", "eslint-plugin-unicorn": "55.0.0",
"typescript": "4.5.5", "markdownlint-cli2": "0.14.0",
"@typescript-eslint/parser": "5.12.0", "markdownlint-rule-relative-links": "3.0.0",
"@typescript-eslint/eslint-plugin": "5.12.0", "prettier": "3.3.3",
"tape": "5.5.2", "semantic-release": "23.1.1",
"husky": "7.0.4", "typescript": "5.6.2"
"lint-staged": "12.3.4",
"markdownlint-cli": "0.31.1",
"@types/tape": "4.13.2",
"pinst": "2.1.6",
"prettier": "2.5.1",
"semantic-release": "19.0.2"
} }
} }

View File

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

View File

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

View File

@ -1,3 +1,3 @@
const foo = await 1 const foo = await 1
const bar = function () {} const bar = () => {}
await bar(foo) await bar(foo)

View File

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

View File

@ -1,37 +1,81 @@
const { ESLint } = require('eslint') const test = require("node:test")
const test = require('tape') const assert = require("node:assert/strict")
test('ensure we validate correctly JavaScript files', async (t) => { const { ESLint } = require("eslint")
const eslint = new ESLint({ ignore: false })
const [noErrors] = await eslint.lintFiles( const eslint = new ESLint({
'test/fixtures/javascript-no-errors.js' ignore: false,
) useEslintrc: false,
const [withErrors] = await eslint.lintFiles( overrideConfigFile: "eslintrc.json",
'test/fixtures/javascript-with-errors.js'
)
t.equal(noErrors.errorCount, 0)
t.equal(withErrors.errorCount, 3)
t.end()
}) })
test('ensure we validate correctly TypeScript files', async (t) => { test("ensure we validate correctly JavaScript files", async () => {
const eslint = new ESLint({ ignore: false })
const [noErrors] = await eslint.lintFiles( const [noErrors] = await eslint.lintFiles(
'test/fixtures/typescript-no-errors.ts' "test/fixtures/javascript-no-errors.js",
) )
const [withErrors] = await eslint.lintFiles( const [withErrors] = await eslint.lintFiles(
'test/fixtures/javascript-with-errors.js' "test/fixtures/javascript-with-errors.js",
)
assert.strictEqual(noErrors?.errorCount, 0, JSON.stringify(noErrors, null, 2))
assert.strictEqual(
withErrors?.errorCount,
3,
JSON.stringify(withErrors, null, 2),
) )
t.equal(noErrors.errorCount, 0)
t.equal(withErrors.errorCount, 3)
t.end()
}) })
test('ensure we allow top-level await', async (t) => { test("ensure we do not use deprecated rules", async () => {
const eslint = new ESLint({ ignore: false }) const [javascriptLintResult] = await eslint.lintFiles(
"test/fixtures/javascript-no-errors.js",
)
const [typescriptLintResult] = await eslint.lintFiles(
"test/fixtures/typescript-no-errors.ts",
)
assert.strictEqual(
javascriptLintResult.usedDeprecatedRules.length,
0,
JSON.stringify(javascriptLintResult, null, 2),
)
assert.strictEqual(
typescriptLintResult.usedDeprecatedRules.length,
0,
JSON.stringify(typescriptLintResult, null, 2),
)
})
test("ensure we validate correctly TypeScript files", async () => {
const [noErrors] = await eslint.lintFiles(
"test/fixtures/typescript-no-errors.ts",
)
const [withErrors] = await eslint.lintFiles(
"test/fixtures/javascript-with-errors.js",
)
assert.strictEqual(noErrors?.errorCount, 0, JSON.stringify(noErrors, null, 2))
assert.strictEqual(
withErrors?.errorCount,
3,
JSON.stringify(withErrors, null, 2),
)
})
test("ensure we allow top-level await", async () => {
const [lintResult] = await eslint.lintFiles( const [lintResult] = await eslint.lintFiles(
'test/fixtures/top-level-await.mjs' "test/fixtures/top-level-await.mjs",
)
assert.strictEqual(
lintResult?.errorCount,
0,
JSON.stringify(lintResult, null, 2),
)
})
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,
JSON.stringify(lintResult, null, 2),
) )
t.equal(lintResult.errorCount, 0)
t.end()
}) })

View File

@ -1,12 +1,11 @@
{ {
"compilerOptions": { "compilerOptions": {
"resolveJsonModule": true,
"strict": true,
"target": "ESNext", "target": "ESNext",
"module": "commonjs", "module": "commonjs",
"lib": ["ESNext"], "lib": ["ESNext"],
"moduleResolution": "node", "moduleResolution": "node",
"rootDir": "./", "rootDir": "./"
"strict": true,
"skipLibCheck": true,
"esModuleInterop": true
} }
} }