1
0
mirror of https://github.com/theoludwig/eslint-config-conventions.git synced 2026-05-30 23:39:51 +02:00

Compare commits

...

100 Commits

Author SHA1 Message Date
theoludwig 92e6e56884 ci: usage of Node.js v22 2024-07-25 14:01:48 +02:00
theoludwig 305df380aa chore: remove usage of git hooks (husky, lint-staged, commitlint) + usage of node --run 2024-07-25 14:00:05 +02:00
theoludwig 8b3d9109d7 build(deps): update latest 2024-07-25 13:51:35 +02:00
theoludwig d0fa4e3688 feat: support eslint-plugin-unicorn@^55.0.0 2024-07-25 13:49:08 +02:00
theoludwig 9fa86e2133 feat: support eslint-plugin-promise@^7.0.0 2024-07-25 13:48:49 +02:00
theoludwig 6cb7af3a05 docs: import plugin is not used anymore 2024-07-10 13:34:28 +02:00
theoludwig 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
theoludwig c751162403 feat: support eslint-plugin-unicorn@^54.0.0 2024-07-10 12:44:40 +02:00
theoludwig 152ccba986 build(deps): update latest 2024-07-10 12:42:53 +02:00
theoludwig 10b5a0d8df fix: allow to ignore floating promise with void operator: @typescript-eslint/no-floating-promises 2024-05-21 19:35:36 +02:00
theoludwig 815518c613 chore: allow to publish pre-release beta version 2024-05-21 19:35:36 +02:00
theoludwig 860873aa4b ci: update GitHub actions 2024-05-21 19:35:36 +02:00
theoludwig 5eacace152 docs: stop recommending eslint-config-prettier and eslint-plugin-prettier to use Prettier 2024-05-21 19:35:36 +02:00
theoludwig 0dcde0af51 feat: support eslint-plugin-unicorn@^52.0.0 and eslint-plugin-unicorn@^53.0.0 2024-05-21 19:35:36 +02:00
theoludwig b0fa907559 build(deps): update latest 2024-05-21 19:35:36 +02:00
theoludwig d15df84a73 docs: delete additional </p> 2024-05-21 19:35:36 +02:00
theoludwig aa4da3f6e8 docs: stop mentioning eslint-config-standard-with-typescript as it is now very different 2024-05-21 19:35:36 +02:00
theoludwig b180eae455 fix: relax @typescript-eslint/member-delimiter-style
Deprecated stylistic rule.
2024-05-21 19:35:36 +02:00
theoludwig 31b226ffa4 docs: rename master branch to main 2024-02-16 20:04:49 +01:00
theoludwig 8403ef4254 build(deps): update latest 2024-02-16 20:03:29 +01:00
theoludwig dbe252f3b4 feat: add support for @typescript-eslint v7 2024-02-16 20:03:21 +01:00
theoludwig 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
theoludwig 256a5024d6 feat: add @typescript-eslint/prefer-as-const
BREAKING CHANGE: New rule introduced
2024-02-08 22:56:43 +01:00
theoludwig 3d2e708e96 docs: update link to eslint-config-standard-with-typescript 2024-02-08 22:54:22 +01:00
theoludwig b0f6ef585f feat: add @typescript-eslint/prefer-promise-reject-errors
BREAKING CHANGE: New rule introduced
2024-02-08 22:53:25 +01:00
theoludwig 7abcc179e5 feat: add @typescript-eslint/no-useless-template-literals
BREAKING CHANGE: New rule introduced
2024-02-08 22:49:11 +01:00
theoludwig b72745bdbe feat: add @typescript-eslint/prefer-find
BREAKING CHANGE: New rule introduced
2024-02-08 22:47:38 +01:00
theoludwig 89c012cac2 feat: add @typescript-eslint/no-array-delete
BREAKING CHANGE: New rule introduced
2024-02-08 22:46:43 +01:00
theoludwig 00b7a2a89b feat: add promise/no-nesting
BREAKING CHANGE: New rule introduced
2024-02-08 22:34:10 +01:00
theoludwig a5036c8381 feat: add promise/no-multiple-resolved
BREAKING CHANGE: New rule introduced
2024-02-08 22:32:39 +01:00
theoludwig c9365be768 feat: add import/no-anonymous-default-export
BREAKING CHANGE: New rule introduced
2024-02-08 22:29:14 +01:00
theoludwig c1a524e31b feat: add no-useless-concat
BREAKING CHANGE: New rule introduced
2024-02-08 22:25:31 +01:00
theoludwig 8585574a70 feat: add no-else-return
BREAKING CHANGE: New rule introduced
2024-02-08 22:24:19 +01:00
theoludwig fce826e24a feat: add no-sparse-arrays
BREAKING CHANGE: New rule introduced
2024-02-08 22:09:31 +01:00
theoludwig 17e90bcc35 feat: add no-constant-binary-expression
BREAKING CHANGE: New rule introduced
2024-02-08 21:57:58 +01:00
theoludwig 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
theoludwig b671018a00 chore: cleaner configs 2024-01-30 01:32:52 +01:00
theoludwig 17dea937eb docs(license): add email address 2024-01-30 01:28:25 +01:00
theoludwig 7f3c152e61 build(deps): update latest 2023-12-26 22:07:17 +01:00
theoludwig f243013173 feat: support eslint-plugin-unicorn@^50.0.0 2023-12-22 00:23:29 +01:00
theoludwig d3d71f9a78 feat: add @typescript-eslint/no-unsafe-unary-minus
BREAKING CHANGE: New rule introduced
2023-11-14 12:52:10 +01:00
theoludwig 6a064c227e fix: relax unicorn/no-array-push-push 2023-11-14 12:50:21 +01:00
theoludwig 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
theoludwig 0e2b2ae89d chore: better Prettier config for easier reviews 2023-10-23 23:00:22 +02:00
theoludwig d91b2a2538 feat: replace no-new-object (deprecated) rule with no-object-constructor 2023-10-18 13:04:31 +02:00
theoludwig 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
theoludwig d149fdd6ab fix: relax unicorn/consistent-function-scoping
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
theoludwig 6345bddd38 fix: relax @typescript-eslint/prefer-nullish-coalescing
Should ignore ternary tests.
2023-07-18 23:06:31 +02:00
theoludwig 4e99d69598 fix: relax no-duplicate-imports
Conflict with `@typescript-eslint/consistent-type-imports`
2023-07-18 22:31:59 +02:00
theoludwig adf01e1e8c feat: add unicorn/template-indent
BREAKING CHANGE: New rule introduced
2023-07-18 22:08:49 +02:00
theoludwig 8bfeaadf32 feat: add unicorn/prefer-modern-math-apis
BREAKING CHANGE: New rule introduced
2023-07-18 22:04:34 +02:00
theoludwig 807c201955 feat: add unicorn/prefer-number-properties
BREAKING CHANGE: New rule introduced
2023-07-18 22:02:15 +02:00
theoludwig 381f5cb9cf feat: add unicorn/require-array-join-separator
BREAKING CHANGE: New rule introduced
2023-07-18 22:00:19 +02:00
theoludwig c431a208e9 feat: add unicorn/number-literal-case
BREAKING CHANGE: New rule introduced
2023-07-18 21:58:04 +02:00
theoludwig f622982fdb feat: add unicorn/no-new-buffer
BREAKING CHANGE: New rule introduced
2023-07-18 21:54:53 +02:00
theoludwig d59b088bff feat: add unicorn/no-new-array
BREAKING CHANGE: New rule introduced
2023-07-18 21:53:56 +02:00
theoludwig 2fd4edbf5b feat: add unicorn/no-empty-file
BREAKING CHANGE: New rule introduced
2023-07-18 21:51:51 +02:00
theoludwig 8837b8737b feat: add unicorn/no-document-cookie
BREAKING CHANGE: New rule introduced
2023-07-18 21:50:47 +02:00
theoludwig cbbb8dfe28 feat: add unicorn/no-array-push-push
BREAKING CHANGE: New rule introduced
2023-07-18 21:48:53 +02:00
theoludwig 2fcede3f0a feat: add unicorn/no-array-method-this-argument
BREAKING CHANGE: New rule introduced
2023-07-18 21:48:07 +02:00
theoludwig 80c00f5fa8 feat: add unicorn/no-array-for-each
BREAKING CHANGE: New rule introduced
2023-07-18 21:46:32 +02:00
theoludwig 7f7ab46896 feat: add unicorn/no-array-callback-reference
BREAKING CHANGE: New rule introduced
2023-07-18 21:45:37 +02:00
theoludwig eab075e291 feat: add unicorn/explicit-length-check
BREAKING CHANGE: New rule introduced
2023-07-18 21:43:06 +02:00
theoludwig 244b74679a feat: add unicorn/consistent-function-scoping
BREAKING CHANGE: New rule introduced
2023-07-18 21:39:46 +02:00
theoludwig 07595ccb56 feat: add unicorn/consistent-destructuring
BREAKING CHANGE: New rule introduced
2023-07-18 21:37:00 +02:00
theoludwig d0e9004ce3 docs: improve recommended usage/setup 2023-07-18 20:25:19 +02:00
theoludwig 1e29cef968 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^48.0.0`
2023-07-18 20:17:06 +02:00
theoludwig f89c4415cf feat: add support for typescript-eslint v6.0.0 2023-07-14 23:19:09 +02:00
theoludwig 34ec74cff7 docs: simplify README 2023-07-02 16:02:28 +02:00
theoludwig f5a69d69f5 fix: update author - Théo LUDWIG 2023-07-02 15:57:44 +02:00
theoludwig e071e917f6 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint@^8.44.0`
2023-07-02 15:54:50 +02:00
theoludwig 528a31316d refactor: usage of node:test instead of tap 2023-07-02 15:46:14 +02:00
Divlo 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
Divlo ca9b1db4bd build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^47.0.0`
2023-05-13 15:22:49 +02:00
Divlo 3222d42e67 build(deps): update latest 2023-04-02 21:16:48 +02:00
Divlo 08602b1c53 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^46.0.0`
2023-04-02 20:53:26 +02:00
Divlo 1779517f5c feat: add @typescript-eslint/ban-types
BREAKING CHANGE: New rule introduced
2023-02-06 23:52:11 +01:00
Divlo 81b37b523c feat: add import/no-empty-named-blocks
BREAKING CHANGE: New rule introduced
2023-02-06 23:48:24 +01:00
Divlo a95ac7ec8b fix: relax @typescript-eslint/consistent-type-assertions 2023-02-06 23:43:23 +01:00
Divlo 32481c316f fix: relax no-unused-vars ignore variable starting with _ 2023-02-06 23:42:09 +01:00
Divlo 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
Divlo 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
Divlo 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
Divlo e24964a60a build(deps): update latest 2023-01-10 13:27:35 +01:00
Divlo fcc107bdec fix: relax @typescript-eslint/prefer-optional-chain 2022-11-21 09:09:06 +01:00
Divlo 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
Divlo 0ce46310ed build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^44.0.0`
2022-10-03 20:40:47 +02:00
Divlo e2b2c1c77f docs: fix typo 2022-09-20 23:08:10 +02:00
Divlo 846a25943d perf: reduce package size by publishing only needed files 2022-09-01 01:17:47 +02:00
Divlo e0f93343fe test: fix with new rules introduced 2022-08-31 14:00:08 +02:00
Divlo 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
Divlo 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
Divlo 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
Divlo 1f20fe89e8 fix: relax @typescript-eslint/no-empty-interface 2022-08-31 13:32:05 +02:00
Divlo 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
Divlo 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
Divlo 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
Divlo 435d3e9e5f build(deps): update latest 2022-08-31 13:17:00 +02:00
Divlo 637a79a8e7 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^43.0.0`
2022-07-12 13:52:53 +02:00
Divlo 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
35 changed files with 4349 additions and 17354 deletions
-1
View File
@@ -1 +0,0 @@
{ "extends": ["@commitlint/config-conventional"] }
+52 -46
View File
@@ -1,13 +1,13 @@
{ {
"root": true, "root": true,
"plugins": ["import", "promise", "unicorn"], "plugins": ["promise", "unicorn"],
"env": { "env": {
"browser": true, "browser": true,
"node": true, "node": true,
"es2022": true "es2024": true
}, },
"parserOptions": { "parserOptions": {
"ecmaVersion": 2022, "ecmaVersion": "latest",
"sourceType": "module", "sourceType": "module",
"ecmaFeatures": { "ecmaFeatures": {
"jsx": true "jsx": true
@@ -22,6 +22,7 @@
"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",
@@ -42,6 +43,7 @@
"no-irregular-whitespace": "error", "no-irregular-whitespace": "error",
"no-loss-of-precision": "error", "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",
@@ -49,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",
@@ -59,7 +62,7 @@
"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": "error", "no-unused-vars": ["error", { "varsIgnorePattern": "^_" }],
"no-use-before-define": [ "no-use-before-define": [
"error", "error",
{ {
@@ -93,6 +96,7 @@
"no-confusing-arrow": "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-floating-decimal": "error",
"no-global-assign": "error", "no-global-assign": "error",
@@ -110,7 +114,7 @@
], ],
"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",
@@ -128,13 +132,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": "error", "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" }],
@@ -145,38 +151,44 @@
"quote-props": ["error", "as-needed"], "quote-props": ["error", "as-needed"],
"radix": "error", "radix": "error",
"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-parens": ["error", "always"],
"import/no-useless-path-segments": "error", "arrow-body-style": ["error", "always"],
"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/template-indent": "error"
}, },
"overrides": [ "overrides": [
{ {
@@ -187,12 +199,13 @@
"no-undef": "off", "no-undef": "off",
"no-dupe-class-members": "off", "no-dupe-class-members": "off",
"@typescript-eslint/no-dupe-class-members": "error", "@typescript-eslint/no-dupe-class-members": "error",
"no-duplicate-imports": "off",
"@typescript-eslint/no-duplicate-imports": "error",
"no-loss-of-precision": "off", "no-loss-of-precision": "off",
"@typescript-eslint/no-loss-of-precision": "error", "@typescript-eslint/no-loss-of-precision": "error",
"no-unused-vars": "off", "no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "error", "@typescript-eslint/no-unused-vars": [
"error",
{ "varsIgnorePattern": "^_" }
],
"no-use-before-define": "off", "no-use-before-define": "off",
"@typescript-eslint/no-use-before-define": [ "@typescript-eslint/no-use-before-define": [
"error", "error",
@@ -230,23 +243,20 @@
], ],
"no-useless-constructor": "off", "no-useless-constructor": "off",
"@typescript-eslint/no-useless-constructor": "error", "@typescript-eslint/no-useless-constructor": "error",
"@typescript-eslint/no-useless-template-literals": "error",
"@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/ban-types": "error",
"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",
{ {
@@ -256,13 +266,6 @@
"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/naming-convention": [ "@typescript-eslint/naming-convention": [
"error", "error",
@@ -275,10 +278,6 @@
], ],
"@typescript-eslint/no-base-to-string": "error", "@typescript-eslint/no-base-to-string": "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-extraneous-class": [ "@typescript-eslint/no-extraneous-class": [
"error", "error",
@@ -297,27 +296,34 @@
"@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-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-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-ts-expect-error": "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",
+4 -4
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"
--- ---
<!-- <!--
+4 -4
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. -->
+4 -4
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. -->
+4 -4
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. -->
+4 -4
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
+1 -1
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
+21 -15
View File
@@ -1,28 +1,34 @@
name: 'Lint' name: "Lint"
on: on:
push: push:
branches: [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.0.1"
+20 -12
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 }}
+12 -12
View File
@@ -1,25 +1,25 @@
name: 'Test' name: "Test"
on: on:
push: push:
branches: [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"
-4
View File
@@ -1,4 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npm run lint:commit -- --edit
-5
View File
@@ -1,5 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npm run lint:staged
npm run test
-6
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
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"],
}
-6
View File
@@ -1,6 +0,0 @@
{
"default": true,
"MD013": false,
"MD033": false,
"MD041": false
}
+2 -1
View File
@@ -1 +1,2 @@
save-exact=true save-exact = true
provenance = true
+1 -4
View File
@@ -1,6 +1,3 @@
{ {
"singleQuote": true, "semi": false
"jsxSingleQuote": true,
"semi": false,
"trailingComma": "none"
} }
+3 -13
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"
] ]
-8
View File
@@ -1,8 +0,0 @@
ts: false
jsx: false
flow: false
check-coverage: true
coverage: true
test-ignore:
- 'test/fixtures'
-8
View File
@@ -1,8 +0,0 @@
{
"recommendations": [
"editorconfig.editorconfig",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"davidanson.vscode-markdownlint"
]
}
-10
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
}
}
+1 -1
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
+10 -24
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.
+2 -2
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
+58 -52
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**. 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 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,86 +29,94 @@ 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.56.0 \
eslint-plugin-import@^2.25.4 \ eslint-plugin-promise@^6.1.1 \
eslint-plugin-promise@^6.0.0 \ eslint-plugin-unicorn@^53.0.0 \
eslint-plugin-unicorn@^41.0.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) - 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-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)
- This package: `eslint-config-conventions` - This package: `eslint-config-conventions`
#### Installation with TypeScript
If you want to use **TypeScript**, you also need to install: If you want to use **TypeScript**, you also need to install:
```sh ```sh
npm install --save-dev \ npm install --save-dev \
typescript@^4.4.0 \ "typescript@^5.3.3" \
@typescript-eslint/eslint-plugin@^5.12.0 \ "@typescript-eslint/eslint-plugin@>=6.21.0" \
@typescript-eslint/parser@^5.12.0 "@typescript-eslint/parser@>=6.21.0"
``` ```
Dependencies are: Dependencies are:
- [TypeScript](https://github.com/Microsoft/TypeScript) - [TypeScript](https://github.com/Microsoft/TypeScript)
- [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint); ESLint rules for 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. - [@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)
```sh
npm install --save-dev prettier eslint-config-prettier eslint-plugin-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`
```json ```json
{ {
"extends": ["conventions", "prettier"], "extends": ["conventions"],
"plugins": ["prettier"], "plugins": ["promise", "unicorn"]
"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). #### `.eslintrc.json` (TypeScript)
`"parserOptions.project"` is only required if you use **TypeScript**. ```json
{
"extends": ["conventions"],
"plugins": ["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
# 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"
} }
} }
``` ```
@@ -118,12 +124,12 @@ echo {}> .prettierrc.json
### 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
+1 -1
View File
@@ -1 +1 @@
module.exports = require('./.eslintrc.json') module.exports = require("./.eslintrc.json")
+4050 -17030
View File
File diff suppressed because it is too large Load Diff
+34 -39
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,48 +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}\" -c \"eslintrc.json\"", "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": "tap", "release": "semantic-release"
"release": "semantic-release",
"postinstall": "husky install",
"prepublishOnly": "pinst --disable",
"postpublish": "pinst --enable"
}, },
"peerDependencies": { "peerDependencies": {
"eslint": "^8.9.0", "eslint": "^8.56.0",
"eslint-plugin-import": "^2.25.4", "eslint-plugin-promise": "^6.1.1 || ^7.0.0",
"eslint-plugin-promise": "^6.0.0", "eslint-plugin-unicorn": "^51.0.1 || ^52.0.0 || ^53.0.0 || ^54.0.0 || ^55.0.0"
"eslint-plugin-unicorn": "^41.0.0"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "16.2.3", "@types/eslint": "8.56.11",
"@commitlint/config-conventional": "16.2.1", "@types/node": "20.14.12",
"@types/eslint": "8.4.1", "@typescript-eslint/eslint-plugin": "7.17.0",
"@types/tap": "15.0.6", "@typescript-eslint/parser": "7.17.0",
"@typescript-eslint/eslint-plugin": "5.15.0", "editorconfig-checker": "5.1.8",
"@typescript-eslint/parser": "5.15.0", "eslint": "8.57.0",
"editorconfig-checker": "4.0.2", "eslint-plugin-promise": "7.0.0",
"eslint": "8.11.0", "eslint-plugin-unicorn": "55.0.0",
"eslint-plugin-import": "2.25.4", "markdownlint-cli2": "0.13.0",
"eslint-plugin-promise": "6.0.0", "markdownlint-rule-relative-links": "3.0.0",
"eslint-plugin-unicorn": "41.0.1", "prettier": "3.3.3",
"husky": "7.0.4", "semantic-release": "23.1.1",
"lint-staged": "12.3.7", "typescript": "5.5.4"
"markdownlint-cli": "0.31.1",
"pinst": "3.0.0",
"prettier": "2.6.0",
"semantic-release": "19.0.2",
"tap": "16.0.0",
"typescript": "4.6.2"
} }
} }
+17 -11
View File
@@ -1,14 +1,20 @@
const tap = require('tap') const test = require("node:test")
const assert = require("node:assert/strict")
const config = require('../index.js') const config = require("../index.js")
tap.test('test basic properties of config', async (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) => {
}) 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))
})
+1 -1
View File
@@ -1 +1 @@
'invalid eqeqeq' == 'invalid eqeqeq' "invalid eqeqeq" == "invalid eqeqeq"
+1 -1
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)
+3
View File
@@ -0,0 +1,3 @@
const returnsPromise = async (): Promise<void> => {}
void returnsPromise()
+25 -16
View File
@@ -1,37 +1,46 @@
const { ESLint } = require('eslint') const test = require("node:test")
const tap = require('tap') const assert = require("node:assert/strict")
const { ESLint } = require("eslint")
const eslint = new ESLint({ const eslint = new ESLint({
ignore: false, ignore: false,
useEslintrc: false, useEslintrc: false,
overrideConfigFile: 'eslintrc.json' overrideConfigFile: "eslintrc.json",
}) })
tap.test('ensure we validate correctly JavaScript files', async (t) => { test("ensure we validate correctly JavaScript files", async () => {
const [noErrors] = await eslint.lintFiles( const [noErrors] = await eslint.lintFiles(
'test/fixtures/javascript-no-errors.js' "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",
) )
t.equal(noErrors.errorCount, 0) assert.strictEqual(noErrors?.errorCount, 0)
t.equal(withErrors.errorCount, 3) assert.strictEqual(withErrors?.errorCount, 3)
}) })
tap.test('ensure we validate correctly TypeScript files', async (t) => { test("ensure we validate correctly TypeScript files", async () => {
const [noErrors] = await eslint.lintFiles( const [noErrors] = await eslint.lintFiles(
'test/fixtures/typescript-no-errors.ts' "test/fixtures/typescript-no-errors.ts",
) )
const [withErrors] = await eslint.lintFiles( const [withErrors] = await eslint.lintFiles(
'test/fixtures/javascript-with-errors.js' "test/fixtures/javascript-with-errors.js",
) )
t.equal(noErrors.errorCount, 0) assert.strictEqual(noErrors?.errorCount, 0)
t.equal(withErrors.errorCount, 3) assert.strictEqual(withErrors?.errorCount, 3)
}) })
tap.test('ensure we allow top-level await', async (t) => { 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",
) )
t.equal(lintResult.errorCount, 0) 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)
}) })
+3 -4
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
} }
} }