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

Compare commits

..

24 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
18 changed files with 788 additions and 2385 deletions

View File

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

View File

@ -84,7 +84,6 @@
"consistent-this": "error",
"default-param-last": "error",
"default-case-last": "error",
"dot-notation": ["error", { "allowKeywords": true }],
"eqeqeq": ["error", "always", { "null": "ignore" }],
"grouped-accessor-pairs": "error",
"new-cap": [
@ -93,25 +92,12 @@
],
"no-array-constructor": "error",
"no-caller": "error",
"no-confusing-arrow": "error",
"no-delete-var": "error",
"no-empty": ["error", { "allowEmptyCatch": true }],
"no-empty-static-block": "error",
"no-eval": "error",
"no-floating-decimal": "error",
"no-global-assign": "error",
"no-implied-eval": "error",
"no-mixed-operators": [
"error",
{
"groups": [
["==", "!=", "===", "!==", ">", ">=", "<", "<="],
["&&", "||"],
["in", "instanceof"]
],
"allowSamePrecedence": true
}
],
"no-multi-str": "error",
"no-new-func": "error",
"no-object-constructor": "error",
@ -148,13 +134,11 @@
"prefer-object-has-own": "error",
"prefer-promise-reject-errors": "error",
"prefer-regex-literals": ["error", { "disallowRedundantWrapping": true }],
"quote-props": ["error", "as-needed"],
"radix": "error",
"yoda": ["error", "never"],
"curly": ["error", "all"],
"func-style": ["error", "expression"],
"prefer-arrow-callback": "error",
"arrow-parens": ["error", "always"],
"arrow-body-style": ["error", "always"],
"promise/param-names": "error",
@ -188,6 +172,7 @@
"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": [
@ -199,8 +184,6 @@
"no-undef": "off",
"no-dupe-class-members": "off",
"@typescript-eslint/no-dupe-class-members": "error",
"no-loss-of-precision": "off",
"@typescript-eslint/no-loss-of-precision": "error",
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": [
"error",
@ -219,8 +202,6 @@
],
"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",
@ -231,7 +212,7 @@
{ "builtinGlobals": false }
],
"no-throw-literal": "off",
"@typescript-eslint/no-throw-literal": "error",
"@typescript-eslint/only-throw-error": "error",
"no-unused-expressions": "off",
"@typescript-eslint/no-unused-expressions": [
"error",
@ -243,14 +224,21 @@
],
"no-useless-constructor": "off",
"@typescript-eslint/no-useless-constructor": "error",
"@typescript-eslint/no-useless-template-literals": "error",
"@typescript-eslint/no-unnecessary-template-expression": "error",
"@typescript-eslint/no-unnecessary-condition": [
"error",
{
"allowConstantLoopConditions": true
}
],
"@typescript-eslint/adjacent-overload-signatures": "error",
"@typescript-eslint/array-type": [
"error",
{ "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": [
"error",
"interface"
@ -267,6 +255,7 @@
}
],
"@typescript-eslint/method-signature-style": "error",
"@typescript-eslint/unbound-method": "error",
"@typescript-eslint/naming-convention": [
"error",
{
@ -277,8 +266,10 @@
}
],
"@typescript-eslint/no-base-to-string": "error",
"@typescript-eslint/no-deprecated": "error",
"@typescript-eslint/no-dynamic-delete": "error",
"@typescript-eslint/no-extra-non-null-assertion": "error",
"@typescript-eslint/no-redundant-type-constituents": "error",
"@typescript-eslint/no-extraneous-class": [
"error",
{ "allowWithDecorator": true }
@ -295,9 +286,9 @@
],
"@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-var-requires": "error",
"@typescript-eslint/no-require-imports": "error",
"@typescript-eslint/no-unsafe-unary-minus": "error",
"@typescript-eslint/no-unsafe-declaration-merging": "error",
"@typescript-eslint/no-array-delete": "error",
"@typescript-eslint/prefer-as-const": "error",
"@typescript-eslint/prefer-function-type": "error",
@ -313,7 +304,7 @@
],
"@typescript-eslint/prefer-readonly": "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",
"prefer-promise-reject-errors": "off",
"@typescript-eslint/prefer-promise-reject-errors": "error",
@ -329,7 +320,6 @@
"error",
{ "allowNumber": true }
],
"@typescript-eslint/return-await": ["error", "always"],
"@typescript-eslint/strict-boolean-expressions": [
"error",
{
@ -341,8 +331,7 @@
"allowNullableNumber": false,
"allowAny": false
}
],
"@typescript-eslint/type-annotation-spacing": "error"
]
}
}
]

View File

@ -15,14 +15,20 @@ jobs:
- name: "Setup Node.js"
uses: "actions/setup-node@v4.0.3"
with:
node-version: "lts/*"
node-version: "22.x"
cache: "npm"
- name: "Install dependencies"
run: "npm clean-install"
- run: 'npm run lint:commit -- --to "${{ github.sha }}"'
- run: "npm run lint:editorconfig"
- run: "npm run lint:markdown"
- run: "npm run lint:eslint"
- run: "npm run lint:prettier"
- run: "node --run lint:editorconfig"
- run: "node --run lint:markdown"
- run: "node --run lint:eslint"
- run: "node --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

@ -21,7 +21,7 @@ jobs:
- name: "Setup Node.js"
uses: "actions/setup-node@v4.0.3"
with:
node-version: "lts/*"
node-version: "22.x"
cache: "npm"
- name: "Install dependencies"
@ -31,7 +31,7 @@ jobs:
run: "npm audit signatures"
- name: "Release"
run: "npm run release"
run: "node --run release"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@ -15,11 +15,11 @@ jobs:
- name: "Setup Node.js"
uses: "actions/setup-node@v4.0.3"
with:
node-version: "lts/*"
node-version: "22.x"
cache: "npm"
- name: "Install dependencies"
run: "npm clean-install"
- name: "Test"
run: "npm run test"
run: "node --run test"

View File

@ -1,3 +0,0 @@
#!/usr/bin/env sh
npm run lint:commit -- --edit

View File

@ -1,4 +0,0 @@
#!/usr/bin/env sh
npm run lint:staged
npm run test

View File

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

4
.npmrc
View File

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

View File

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

@ -35,16 +35,16 @@ More information about **formatting rules** vs **code-quality rules** can be fou
```sh
npm install --save-dev \
eslint@^8.56.0 \
eslint-plugin-promise@^6.1.1 \
eslint-plugin-unicorn@^53.0.0 \
eslint@^8.57.0 \
eslint-plugin-promise@^7.0.0 \
eslint-plugin-unicorn@^55.0.0 \
eslint-config-conventions@latest
```
Dependencies are:
- [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-promise](https://github.com/xjamundx/eslint-plugin-promise)
- [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn)
- This package: `eslint-config-conventions`
@ -55,9 +55,9 @@ If you want to use **TypeScript**, you also need to install:
```sh
npm install --save-dev \
"typescript@^5.3.3" \
"@typescript-eslint/eslint-plugin@>=6.21.0" \
"@typescript-eslint/parser@>=6.21.0"
"typescript@~5.5.4" \
"@typescript-eslint/eslint-plugin@^8.3.0" \
"@typescript-eslint/parser@^8.3.0"
```
Dependencies are:
@ -72,8 +72,9 @@ Dependencies are:
```json
{
"root": true,
"extends": ["conventions"],
"plugins": ["import", "promise", "unicorn"]
"plugins": ["promise", "unicorn"]
}
```
@ -81,15 +82,16 @@ Dependencies are:
```json
{
"root": true,
"extends": ["conventions"],
"plugins": ["import", "promise", "unicorn"],
"plugins": ["promise", "unicorn"],
"overrides": [
{
"files": ["*.ts", "*.tsx"],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"parserOptions": {
"project": "./tsconfig.json"
"projectService": true
}
}
]
@ -124,12 +126,12 @@ We discourage usage of [eslint-config-prettier](https://github.com/prettier/esli
### Usage
```sh
npm run lint:eslint
node --run lint:eslint
# 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
npm run lint:prettier
node --run lint:prettier
```
## 💡 Contributing

View File

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

2931
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -35,42 +35,31 @@
"node": ">=18.0.0"
},
"scripts": {
"lint:commit": "commitlint",
"lint:editorconfig": "editorconfig-checker",
"lint:markdown": "markdownlint-cli2",
"lint:eslint": "eslint . --max-warnings 0 --report-unused-disable-directives --config eslintrc.json",
"lint:prettier": "prettier . --check",
"lint:staged": "lint-staged",
"test": "node --test",
"release": "semantic-release",
"postinstall": "husky",
"prepublishOnly": "pinst --disable",
"postpublish": "pinst --enable"
"release": "semantic-release"
},
"peerDependencies": {
"eslint": "^8.56.0",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-unicorn": "^51.0.1 || ^52.0.0 || ^53.0.0 || ^54.0.0"
"eslint": "^8.57.0",
"eslint-plugin-promise": "^7.0.0",
"eslint-plugin-unicorn": "^55.0.0"
},
"devDependencies": {
"@commitlint/cli": "19.2.2",
"@commitlint/config-conventional": "19.2.2",
"@tsconfig/strictest": "2.0.5",
"@types/eslint": "8.56.10",
"@types/node": "20.14.10",
"@typescript-eslint/eslint-plugin": "7.16.0",
"@typescript-eslint/parser": "7.16.0",
"editorconfig-checker": "5.1.8",
"eslint": "8.57.0",
"eslint-plugin-promise": "6.4.0",
"eslint-plugin-unicorn": "54.0.0",
"husky": "9.0.11",
"lint-staged": "15.2.7",
"markdownlint-cli2": "0.13.0",
"@types/eslint": "8.56.12",
"@types/node": "22.7.4",
"@typescript-eslint/eslint-plugin": "8.7.0",
"@typescript-eslint/parser": "8.7.0",
"editorconfig-checker": "6.0.0",
"eslint": "8.57.1",
"eslint-plugin-promise": "7.1.0",
"eslint-plugin-unicorn": "55.0.0",
"markdownlint-cli2": "0.14.0",
"markdownlint-rule-relative-links": "3.0.0",
"pinst": "3.0.0",
"prettier": "3.3.2",
"prettier": "3.3.3",
"semantic-release": "23.1.1",
"typescript": "5.5.3"
"typescript": "5.6.2"
}
}

View File

@ -16,8 +16,31 @@ test("ensure we validate correctly JavaScript files", async () => {
const [withErrors] = await eslint.lintFiles(
"test/fixtures/javascript-with-errors.js",
)
assert.strictEqual(noErrors?.errorCount, 0)
assert.strictEqual(withErrors?.errorCount, 3)
assert.strictEqual(noErrors?.errorCount, 0, JSON.stringify(noErrors, null, 2))
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 () => {
@ -27,20 +50,32 @@ test("ensure we validate correctly TypeScript files", async () => {
const [withErrors] = await eslint.lintFiles(
"test/fixtures/javascript-with-errors.js",
)
assert.strictEqual(noErrors?.errorCount, 0)
assert.strictEqual(withErrors?.errorCount, 3)
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(
"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)
assert.strictEqual(
lintResult?.errorCount,
0,
JSON.stringify(lintResult, null, 2),
)
})

View File

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