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

Compare commits

..

57 Commits

Author SHA1 Message Date
f258d5ab41 fix: relax @typescript-eslint/dot-notation 2024-09-28 20:10:49 +02:00
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
21 changed files with 2268 additions and 4890 deletions

View File

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

View File

@ -1,6 +1,6 @@
{ {
"root": true, "root": true,
"plugins": ["import", "promise", "unicorn"], "plugins": ["promise", "unicorn"],
"env": { "env": {
"browser": true, "browser": true,
"node": true, "node": 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",
@ -34,7 +35,6 @@
"no-duplicate-imports": "error", "no-duplicate-imports": "error",
"no-empty-character-class": "error", "no-empty-character-class": "error",
"no-empty-pattern": "error", "no-empty-pattern": "error",
"no-empty-static-block": "error",
"no-ex-assign": "error", "no-ex-assign": "error",
"no-fallthrough": "error", "no-fallthrough": "error",
"no-func-assign": "error", "no-func-assign": "error",
@ -51,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",
@ -83,7 +84,6 @@
"consistent-this": "error", "consistent-this": "error",
"default-param-last": "error", "default-param-last": "error",
"default-case-last": "error", "default-case-last": "error",
"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": [
@ -92,24 +92,12 @@
], ],
"no-array-constructor": "error", "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": "error", "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-object-constructor": "error", "no-object-constructor": "error",
@ -130,13 +118,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" }],
@ -144,34 +134,17 @@
"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",
"yoda": ["error", "never"], "yoda": ["error", "never"],
"curly": ["error", "all"], "curly": ["error", "all"],
"func-style": ["error", "expression"], "func-style": ["error", "expression"],
"prefer-arrow-callback": "error", "prefer-arrow-callback": "error",
"arrow-parens": ["error", "always"],
"arrow-body-style": ["error", "always"], "arrow-body-style": ["error", "always"],
"import/no-absolute-path": "error",
"import/no-webpack-loader-syntax": "error",
"import/no-self-import": "error",
"import/no-useless-path-segments": "error",
"import/export": "error",
"import/first": "error",
"import/no-duplicates": "error",
"import/order": [
"error",
{
"groups": ["builtin", "external", "internal"],
"newlines-between": "always"
}
],
"import/no-named-default": "error",
"import/no-empty-named-blocks": "error",
"promise/param-names": "error", "promise/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",
@ -199,6 +172,7 @@
"unicorn/require-array-join-separator": "error", "unicorn/require-array-join-separator": "error",
"unicorn/prefer-number-properties": "error", "unicorn/prefer-number-properties": "error",
"unicorn/prefer-modern-math-apis": "error", "unicorn/prefer-modern-math-apis": "error",
"unicorn/prefer-structured-clone": "error",
"unicorn/template-indent": "error" "unicorn/template-indent": "error"
}, },
"overrides": [ "overrides": [
@ -210,8 +184,6 @@
"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-loss-of-precision": "off",
"@typescript-eslint/no-loss-of-precision": "error",
"no-unused-vars": "off", "no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": [ "@typescript-eslint/no-unused-vars": [
"error", "error",
@ -230,8 +202,6 @@
], ],
"default-param-last": "off", "default-param-last": "off",
"@typescript-eslint/default-param-last": "error", "@typescript-eslint/default-param-last": "error",
"dot-notation": "off",
"@typescript-eslint/dot-notation": ["error", { "allowKeywords": true }],
"no-array-constructor": "off", "no-array-constructor": "off",
"@typescript-eslint/no-array-constructor": "error", "@typescript-eslint/no-array-constructor": "error",
"no-implied-eval": "off", "no-implied-eval": "off",
@ -242,7 +212,7 @@
{ "builtinGlobals": false } { "builtinGlobals": false }
], ],
"no-throw-literal": "off", "no-throw-literal": "off",
"@typescript-eslint/no-throw-literal": "error", "@typescript-eslint/only-throw-error": "error",
"no-unused-expressions": "off", "no-unused-expressions": "off",
"@typescript-eslint/no-unused-expressions": [ "@typescript-eslint/no-unused-expressions": [
"error", "error",
@ -254,13 +224,21 @@
], ],
"no-useless-constructor": "off", "no-useless-constructor": "off",
"@typescript-eslint/no-useless-constructor": "error", "@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/ban-types": "error", "@typescript-eslint/no-unsafe-function-type": "error",
"@typescript-eslint/no-wrapper-object-types": "error",
"@typescript-eslint/consistent-type-definitions": [ "@typescript-eslint/consistent-type-definitions": [
"error", "error",
"interface" "interface"
@ -276,14 +254,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",
{ {
@ -294,8 +266,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-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 }
@ -312,9 +286,13 @@
], ],
"@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-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",
@ -326,8 +304,10 @@
], ],
"@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 }
@ -340,7 +320,6 @@
"error", "error",
{ "allowNumber": true } { "allowNumber": true }
], ],
"@typescript-eslint/return-await": ["error", "always"],
"@typescript-eslint/strict-boolean-expressions": [ "@typescript-eslint/strict-boolean-expressions": [
"error", "error",
{ {
@ -352,8 +331,7 @@
"allowNullableNumber": false, "allowNullableNumber": false,
"allowAny": false "allowAny": false
} }
], ]
"@typescript-eslint/type-annotation-spacing": "error"
} }
} }
] ]

View File

@ -4,25 +4,31 @@ 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@v4.1.1" - uses: "actions/checkout@v4.1.7"
- name: "Setup Node.js" - name: "Setup Node.js"
uses: "actions/setup-node@v4.0.1" uses: "actions/setup-node@v4.0.3"
with: with:
node-version: "lts/*" node-version: "22.x"
cache: "npm" cache: "npm"
- name: "Install dependencies" - name: "Install dependencies"
run: "npm clean-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:eslint" - 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

@ -2,7 +2,7 @@ name: "Release"
on: on:
push: push:
branches: [master] branches: [main]
jobs: jobs:
release: release:
@ -13,15 +13,15 @@ jobs:
pull-requests: "write" pull-requests: "write"
id-token: "write" id-token: "write"
steps: steps:
- uses: "actions/checkout@v4.1.1" - uses: "actions/checkout@v4.1.7"
with: with:
fetch-depth: 0 fetch-depth: 0
persist-credentials: false persist-credentials: false
- name: "Setup Node.js" - name: "Setup Node.js"
uses: "actions/setup-node@v4.0.1" uses: "actions/setup-node@v4.0.3"
with: with:
node-version: "lts/*" node-version: "22.x"
cache: "npm" cache: "npm"
- name: "Install dependencies" - name: "Install dependencies"
@ -31,7 +31,7 @@ jobs:
run: "npm audit signatures" run: "npm audit signatures"
- name: "Release" - name: "Release"
run: "npm run 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

@ -4,22 +4,22 @@ 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@v4.1.1" - uses: "actions/checkout@v4.1.7"
- name: "Setup Node.js" - name: "Setup Node.js"
uses: "actions/setup-node@v4.0.1" uses: "actions/setup-node@v4.0.3"
with: with:
node-version: "lts/*" node-version: "22.x"
cache: "npm" cache: "npm"
- name: "Install dependencies" - name: "Install dependencies"
run: "npm clean-install" run: "npm clean-install"
- name: "Test" - name: "Test"
run: "npm run test" run: "node --run test"

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-cli2 --fix"]
}

View File

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

View File

@ -1,18 +1,8 @@
{ {
"branches": ["master"], "branches": ["main", { "name": "beta", "prerelease": true }],
"plugins": [ "plugins": [
[
"@semantic-release/commit-analyzer", "@semantic-release/commit-analyzer",
{
"preset": "conventionalcommits"
}
],
[
"@semantic-release/release-notes-generator", "@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": "explicit"
}
}

View File

@ -1,6 +1,6 @@
MIT License # MIT License
Copyright (c) Théo LUDWIG Copyright (c) Théo LUDWIG <contact@theoludwig.fr>
Permission is hereby granted, free of charge, to any person obtaining a copy 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

View File

@ -4,10 +4,8 @@
<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" alt="Contributing" /></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 />
@ -21,7 +19,7 @@
## 📜 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 recommended 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.
@ -37,29 +35,29 @@ More information about **formatting rules** vs **code-quality rules** can be fou
```sh ```sh
npm install --save-dev \ npm install --save-dev \
eslint@^8.53.0 \ eslint@^8.57.0 \
eslint-plugin-import@^2.29.0 \ eslint-plugin-promise@^7.0.0 \
eslint-plugin-promise@^6.1.1 \ eslint-plugin-unicorn@^55.0.0 \
eslint-plugin-unicorn@^50.0.0 \
eslint-config-conventions@latest eslint-config-conventions@latest
``` ```
This list of dependencies are: 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)
- 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@^5.2.2 \ "typescript@~5.5.4" \
@typescript-eslint/eslint-plugin@^6.11.0 \ "@typescript-eslint/eslint-plugin@^8.3.0" \
@typescript-eslint/parser@^6.11.0 "@typescript-eslint/parser@^8.3.0"
``` ```
Dependencies are: Dependencies are:
@ -68,41 +66,55 @@ Dependencies are:
- [@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)
```json
{
"root": true,
"extends": ["conventions"],
"plugins": ["promise", "unicorn"]
}
```
#### `.eslintrc.json` (TypeScript)
```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 ```sh
npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier npm install --save-dev prettier
# Create an empty config file to let editors and other tools know you are using Prettier # Create an empty config file to let editors and other tools know you are using Prettier
# You can personalize it with your own rules # You can personalize it with your own rules
echo "{}" > .prettierrc.json echo "{}" > .prettierrc.json
``` ```
#### `.eslintrc.json` That's all! No need to update the `.eslintrc.json` configuration.
```json 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.
{
"extends": ["conventions", "prettier"],
"plugins": ["prettier"],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": "./tsconfig.json"
},
"rules": {
"prettier/prettier": "error"
}
}
```
**Note:** Please read some important instructions regarding the `project` option [here](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/README.md#configuration).
`"parserOptions.project"` is only required if you use **TypeScript**.
#### `package.json` #### `package.json`
```jsonc ```json
{ {
"scripts": { "scripts": {
"lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --ignore-path .gitignore", "lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --ignore-path .gitignore",
@ -114,12 +126,12 @@ echo "{}" > .prettierrc.json
### Usage ### Usage
```sh ```sh
npm run lint:eslint node --run lint:eslint
# or to apply automatic fixes to code # or to apply automatic fixes to code
npm run lint:eslint -- --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

View File

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

6759
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -32,48 +32,34 @@
"provenance": true "provenance": true
}, },
"engines": { "engines": {
"node": ">=18.0.0", "node": ">=18.0.0"
"npm": ">=9.0.0"
}, },
"scripts": { "scripts": {
"lint:commit": "commitlint",
"lint:editorconfig": "editorconfig-checker", "lint:editorconfig": "editorconfig-checker",
"lint:markdown": "markdownlint-cli2", "lint:markdown": "markdownlint-cli2",
"lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --config eslintrc.json", "lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --config eslintrc.json",
"lint:prettier": "prettier . --check", "lint:prettier": "prettier . --check",
"lint:staged": "lint-staged", "test": "node --test",
"test": "node --test test/", "release": "semantic-release"
"release": "semantic-release",
"postinstall": "husky install",
"prepublishOnly": "pinst --disable",
"postpublish": "pinst --enable"
}, },
"peerDependencies": { "peerDependencies": {
"eslint": "^8.53.0", "eslint": "^8.57.0",
"eslint-plugin-import": "^2.29.0", "eslint-plugin-promise": "^7.0.0",
"eslint-plugin-promise": "^6.1.1", "eslint-plugin-unicorn": "^55.0.0"
"eslint-plugin-unicorn": "^49.0.0 || ^50.0.0"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "18.4.3", "@types/eslint": "8.56.12",
"@commitlint/config-conventional": "18.4.3", "@types/node": "22.7.4",
"@tsconfig/strictest": "2.0.2", "@typescript-eslint/eslint-plugin": "8.7.0",
"@types/eslint": "8.56.0", "@typescript-eslint/parser": "8.7.0",
"@types/node": "20.10.5", "editorconfig-checker": "6.0.0",
"@typescript-eslint/eslint-plugin": "6.15.0", "eslint": "8.57.1",
"@typescript-eslint/parser": "6.15.0", "eslint-plugin-promise": "7.1.0",
"editorconfig-checker": "5.1.2", "eslint-plugin-unicorn": "55.0.0",
"eslint": "8.56.0", "markdownlint-cli2": "0.14.0",
"eslint-plugin-import": "2.29.1", "markdownlint-rule-relative-links": "3.0.0",
"eslint-plugin-promise": "6.1.1", "prettier": "3.3.3",
"eslint-plugin-unicorn": "50.0.1", "semantic-release": "23.1.1",
"husky": "8.0.3", "typescript": "5.6.2"
"lint-staged": "15.2.0",
"markdownlint-cli2": "0.11.0",
"markdownlint-rule-relative-links": "2.1.1",
"pinst": "3.0.0",
"prettier": "3.1.1",
"semantic-release": "22.0.12",
"typescript": "5.3.3"
} }
} }

View File

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

View File

@ -16,8 +16,31 @@ test("ensure we validate correctly JavaScript files", async () => {
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) assert.strictEqual(noErrors?.errorCount, 0, JSON.stringify(noErrors, null, 2))
assert.strictEqual(withErrors?.errorCount, 3) assert.strictEqual(
withErrors?.errorCount,
3,
JSON.stringify(withErrors, null, 2),
)
})
test("ensure we do not use deprecated rules", async () => {
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 () => { test("ensure we validate correctly TypeScript files", async () => {
@ -27,13 +50,32 @@ test("ensure we validate correctly TypeScript files", async () => {
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) assert.strictEqual(noErrors?.errorCount, 0, JSON.stringify(noErrors, null, 2))
assert.strictEqual(withErrors?.errorCount, 3) assert.strictEqual(
withErrors?.errorCount,
3,
JSON.stringify(withErrors, null, 2),
)
}) })
test("ensure we allow top-level await", async () => { 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) 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),
)
}) })

View File

@ -1,7 +1,7 @@
{ {
"extends": "@tsconfig/strictest/tsconfig.json",
"compilerOptions": { "compilerOptions": {
"resolveJsonModule": true, "resolveJsonModule": true,
"strict": true,
"target": "ESNext", "target": "ESNext",
"module": "commonjs", "module": "commonjs",
"lib": ["ESNext"], "lib": ["ESNext"],