1
1
mirror of https://github.com/theoludwig/eslint-config-conventions.git synced 2025-02-23 01:01:31 +01:00

Compare commits

..

157 Commits

Author SHA1 Message Date
029a8d1757
feat: add unicorn/consistent-existence-index-check
BREAKING CHANGE: New rule introduced
2025-02-23 00:02:40 +01:00
20f48f93aa
feat: add unicorn/no-named-default
BREAKING CHANGE: New rule introduced
2025-02-22 23:59:22 +01:00
d5903f0e22
feat: add unicorn/consistent-date-clone
BREAKING CHANGE: New rule introduced
2025-02-22 23:58:16 +01:00
1ce9bcb87e
feat: add unicorn/no-instanceof-builtins
BREAKING CHANGE: New rule introduced
2025-02-22 23:56:01 +01:00
51c17a84d4
build(deps): update peer dependencies
BREAKING CHANGE: peerDependencies:
`eslint@^9.21.0`
`eslint-plugin-promise@^7.2.1`
`eslint-plugin-unicorn@^57.0.0`
`eslint-plugin-import-x@^4.6.1`
`globals@^16.0.0`
`typescript-eslint@^8.24.1`
2025-02-22 23:50:22 +01:00
657b9a4bad
feat: add no-extra-boolean-cast
BREAKING CHANGE: New rule introduced
2025-02-22 23:43:23 +01:00
31ab3e70a8
feat: add no-implicit-coercion
BREAKING CHANGE: New rule introduced
2025-02-22 23:42:35 +01:00
ec16bb6eec
build(deps): update latest 2025-02-22 23:41:04 +01:00
fe7fddca13
fix: relax @typescript-eslint/unbound-method 2025-01-15 15:07:07 +01:00
42ae3ffe33
build(deps): update latest 2025-01-15 15:06:30 +01:00
8951ecc027
test: use describe and it 2025-01-06 23:17:18 +01:00
33c0f840ea
build(deps): update latest 2025-01-06 23:12:38 +01:00
d9733dc1c8
fix: relax @typescript-eslint/no-floating-promises for node:test
Ref: https://github.com/nodejs/node/issues/51292
2025-01-06 23:09:18 +01:00
5e63c17030
build(deps): update latest 2024-12-14 21:06:54 +01:00
9d91c09bea
fix: relax no-unused-vars to match TypeScript style of exempting names
Ref: https://typescript-eslint.io/rules/no-unused-vars/
2024-12-02 19:27:56 +01:00
e05233d429
fix: relax @typescript-eslint/array-type 2024-11-26 20:57:16 +01:00
c4c1a7f5dd
feat: add @typescript-eslint/explicit-member-accessibility
BREAKING CHANGE: New rule introduced
2024-11-23 15:44:42 +01:00
adb164f604
build(deps): update latest 2024-11-11 20:46:20 +01:00
8ae05c8bee
fix: relax unicorn/consistent-destructuring 2024-11-11 20:42:08 +01:00
ee4897153d
chore: remove not needed @ts-check 2024-11-11 20:40:36 +01:00
67ff8e18b2
ci: use Node.js lts/* 2024-11-11 20:39:36 +01:00
d41573f12c
docs: eslint.config.js 2024-10-29 23:48:40 +01:00
8efe22c23e
fix: relax @typescript-eslint/no-unnecessary-condition 2024-10-22 11:47:11 +02:00
57f419c44a
build(deps): update latest 2024-10-22 11:46:35 +02:00
a578bb80ba
docs: add // @ts-check to config example 2024-10-08 08:10:28 +02:00
e32847fa3d
chore: specify correct supported Node.js version
BREAKING CHANGE: Minimum supported Node.js >= 20.11.0

Ref: https://nodejs.org/api/esm.html#importmetadirname
2024-10-08 08:02:27 +02:00
1719cd18b3
ci: release beta 2024-10-07 17:46:08 +02:00
55a46104da
feat!: add eslint-plugin-import-x rules
BREAKING CHANGE:
peerDependencies: `eslint-plugin-import-x@^4.3.1`

Fixes #3
2024-10-07 17:42:09 +02:00
66044cc8eb
style: fix Prettier 2024-10-07 17:35:13 +02:00
d9536865d8
feat!: add support for ESLint v9
Fixes #2

BREAKING CHANGE: peerDependencies:
`eslint@^9.12.0`
`eslint-plugin-promise@^7.1.0`
`eslint-plugin-unicorn@^56.0.0`
`globals@^15.10.0`
`typescript-eslint@^8.8.0`

BREAKING CHANGE: Node.js >= 20.9.0
2024-10-07 17:28:54 +02:00
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
f243013173
feat: support eslint-plugin-unicorn@^50.0.0 2023-12-22 00:23:29 +01:00
d3d71f9a78
feat: add @typescript-eslint/no-unsafe-unary-minus
BREAKING CHANGE: New rule introduced
2023-11-14 12:52:10 +01:00
6a064c227e
fix: relax unicorn/no-array-push-push 2023-11-14 12:50:21 +01:00
113a469ac5
build(deps): update latest
BREAKING CHANGE: peerDependencies:
`eslint@^8.52.0`
`eslint-plugin-import@^2.28.1`
`eslint-plugin-promise@^6.1.1`
`eslint-plugin-unicorn@^49.0.0`
`@typescript-eslint/eslint-plugin@^6.11.0`
`@typescript-eslint/parser@^6.11.0`
2023-11-14 12:49:18 +01:00
0e2b2ae89d
chore: better Prettier config for easier reviews 2023-10-23 23:00:22 +02:00
d91b2a2538
feat: replace no-new-object (deprecated) rule with no-object-constructor
All checks were successful
Lint / lint (push) Successful in 1m9s
Test / test (push) Successful in 48s
2023-10-18 13:04:31 +02:00
d8b3ef6646
build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint@^8.51.0`
`eslint-plugin-import@^2.28.1`
`eslint-plugin-promise@^6.1.1`
`eslint-plugin-unicorn@^48.0.1`

BREAKING CHANGE: Bump minimum supported Node.js >= 18.0.0
2023-10-18 12:59:19 +02:00
d149fdd6ab
fix: relax unicorn/consistent-function-scoping
Some checks failed
Lint / lint (push) Successful in 49s
Test / test (push) Successful in 37s
Release / release (push) Failing after 1m2s
Rule not working well with typeof generic in TypeScript.
React.js component should have all the related functions in its scope.
2023-07-18 23:12:21 +02:00
6345bddd38
fix: relax @typescript-eslint/prefer-nullish-coalescing
Should ignore ternary tests.
2023-07-18 23:06:31 +02:00
4e99d69598
fix: relax no-duplicate-imports
Conflict with `@typescript-eslint/consistent-type-imports`
2023-07-18 22:31:59 +02:00
adf01e1e8c
feat: add unicorn/template-indent
BREAKING CHANGE: New rule introduced
2023-07-18 22:08:49 +02:00
8bfeaadf32
feat: add unicorn/prefer-modern-math-apis
BREAKING CHANGE: New rule introduced
2023-07-18 22:04:34 +02:00
807c201955
feat: add unicorn/prefer-number-properties
BREAKING CHANGE: New rule introduced
2023-07-18 22:02:15 +02:00
381f5cb9cf
feat: add unicorn/require-array-join-separator
BREAKING CHANGE: New rule introduced
2023-07-18 22:00:19 +02:00
c431a208e9
feat: add unicorn/number-literal-case
BREAKING CHANGE: New rule introduced
2023-07-18 21:58:04 +02:00
f622982fdb
feat: add unicorn/no-new-buffer
BREAKING CHANGE: New rule introduced
2023-07-18 21:54:53 +02:00
d59b088bff
feat: add unicorn/no-new-array
BREAKING CHANGE: New rule introduced
2023-07-18 21:53:56 +02:00
2fd4edbf5b
feat: add unicorn/no-empty-file
BREAKING CHANGE: New rule introduced
2023-07-18 21:51:51 +02:00
8837b8737b
feat: add unicorn/no-document-cookie
BREAKING CHANGE: New rule introduced
2023-07-18 21:50:47 +02:00
cbbb8dfe28
feat: add unicorn/no-array-push-push
BREAKING CHANGE: New rule introduced
2023-07-18 21:48:53 +02:00
2fcede3f0a
feat: add unicorn/no-array-method-this-argument
BREAKING CHANGE: New rule introduced
2023-07-18 21:48:07 +02:00
80c00f5fa8
feat: add unicorn/no-array-for-each
BREAKING CHANGE: New rule introduced
2023-07-18 21:46:32 +02:00
7f7ab46896
feat: add unicorn/no-array-callback-reference
BREAKING CHANGE: New rule introduced
2023-07-18 21:45:37 +02:00
eab075e291
feat: add unicorn/explicit-length-check
BREAKING CHANGE: New rule introduced
2023-07-18 21:43:06 +02:00
244b74679a
feat: add unicorn/consistent-function-scoping
BREAKING CHANGE: New rule introduced
2023-07-18 21:39:46 +02:00
07595ccb56
feat: add unicorn/consistent-destructuring
BREAKING CHANGE: New rule introduced
2023-07-18 21:37:00 +02:00
d0e9004ce3
docs: improve recommended usage/setup 2023-07-18 20:25:19 +02:00
1e29cef968
build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^48.0.0`
2023-07-18 20:17:06 +02:00
f89c4415cf
feat: add support for typescript-eslint v6.0.0 2023-07-14 23:19:09 +02:00
34ec74cff7
docs: simplify README 2023-07-02 16:02:28 +02:00
f5a69d69f5
fix: update author - Théo LUDWIG 2023-07-02 15:57:44 +02:00
e071e917f6
build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint@^8.44.0`
2023-07-02 15:54:50 +02:00
528a31316d
refactor: usage of node:test instead of tap 2023-07-02 15:46:14 +02:00
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
Divlo
387509a30f
chore: replace tape with tap 2022-03-19 14:28:00 +01:00
Divlo
4271efe20b
fix: relax require-await 2022-03-19 14:07:42 +01:00
Divlo
14145df9c7
fix: relax @typescript-eslint/no-misused-promises 2022-03-16 11:40:14 +01:00
Divlo
914e373058
fix: relax @typescript-eslint/await-thenable 2022-03-16 11:39:21 +01:00
Divlo
4240e21ce2
build(deps): update latest 2022-03-16 11:38:20 +01:00
Divlo
48061dd577
feat: support both JavaScript and TypeScript linting 2022-02-20 12:36:37 +01:00
Divlo
c026007f42
fix: disable no-undef using TypeScript 2022-02-19 22:08:50 +01:00
Divlo
f3feed70cb
fix: relax unicorn/no-array-callback-reference because of false positive 2022-02-19 19:00:26 +01:00
Divlo
8cadf4a235
fix: eqeqeq ignore usage of null 2022-02-19 16:42:47 +01:00
39 changed files with 5048 additions and 13149 deletions

View File

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

View File

@ -1,2 +0,0 @@
node_modules
test/fixtures

View File

@ -1,318 +0,0 @@
{
"root": true,
"plugins": ["@typescript-eslint", "import", "promise", "unicorn"],
"env": {
"browser": true,
"node": true,
"es2022": true
},
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 2022,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
},
"project": "./tsconfig.json"
},
"rules": {
"constructor-super": "error",
"for-direction": "error",
"getter-return": "error",
"no-async-promise-executor": "error",
"no-class-assign": "error",
"no-compare-neg-zero": "error",
"no-cond-assign": "error",
"no-const-assign": "error",
"no-constant-condition": "error",
"no-constructor-return": "error",
"no-control-regex": "error",
"no-debugger": "error",
"no-dupe-args": "error",
"no-dupe-class-members": "off",
"@typescript-eslint/no-dupe-class-members": "error",
"no-dupe-else-if": "error",
"no-dupe-keys": "error",
"no-duplicate-case": "error",
"no-duplicate-imports": "off",
"@typescript-eslint/no-duplicate-imports": "error",
"no-empty-character-class": "error",
"no-empty-pattern": "error",
"no-ex-assign": "error",
"no-fallthrough": "error",
"no-func-assign": "error",
"no-import-assign": "error",
"no-invalid-regexp": "error",
"no-irregular-whitespace": "error",
"no-loss-of-precision": "off",
"@typescript-eslint/no-loss-of-precision": "error",
"no-misleading-character-class": "error",
"no-new-symbol": "error",
"no-obj-calls": "error",
"no-promise-executor-return": "error",
"no-prototype-builtins": "error",
"no-self-assign": "error",
"no-self-compare": "error",
"no-setter-return": "error",
"no-this-before-super": "error",
"no-undef": "error",
"no-unexpected-multiline": "error",
"no-unmodified-loop-condition": "error",
"no-unreachable": "error",
"no-unreachable-loop": "error",
"no-unsafe-finally": "error",
"no-unsafe-negation": "error",
"no-unsafe-optional-chaining": "error",
"no-unused-private-class-members": "error",
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "error",
"no-use-before-define": "off",
"@typescript-eslint/no-use-before-define": [
"error",
{
"functions": false,
"classes": false,
"enums": false,
"variables": false,
"typedefs": false
}
],
"no-useless-backreference": "error",
"require-atomic-updates": "error",
"use-isnan": [
"error",
{
"enforceForSwitchCase": true,
"enforceForIndexOf": true
}
],
"valid-typeof": ["error", { "requireStringLiterals": true }],
"class-methods-use-this": "error",
"consistent-this": "error",
"default-param-last": "off",
"@typescript-eslint/default-param-last": "error",
"default-case-last": "error",
"dot-notation": "off",
"@typescript-eslint/dot-notation": ["error", { "allowKeywords": true }],
"eqeqeq": "error",
"grouped-accessor-pairs": "error",
"new-cap": [
"error",
{ "newIsCap": true, "capIsNew": false, "properties": true }
],
"no-array-constructor": "off",
"@typescript-eslint/no-array-constructor": "error",
"no-caller": "error",
"no-confusing-arrow": "error",
"no-delete-var": "error",
"no-empty": ["error", { "allowEmptyCatch": true }],
"no-eval": "error",
"no-floating-decimal": "error",
"no-global-assign": "error",
"no-implied-eval": "off",
"@typescript-eslint/no-implied-eval": "error",
"no-mixed-operators": [
"error",
{
"groups": [
["==", "!=", "===", "!==", ">", ">=", "<", "<="],
["&&", "||"],
["in", "instanceof"]
],
"allowSamePrecedence": true
}
],
"no-multi-str": "error",
"no-new-func": "error",
"no-new-object": "error",
"no-octal": "error",
"no-octal-escape": "error",
"no-proto": "error",
"no-redeclare": "off",
"@typescript-eslint/no-redeclare": ["error", { "builtinGlobals": false }],
"no-regex-spaces": "error",
"no-shadow-restricted-names": "error",
"no-throw-literal": "off",
"@typescript-eslint/no-throw-literal": "error",
"no-undef-init": "error",
"no-unused-expressions": "off",
"@typescript-eslint/no-unused-expressions": [
"error",
{
"allowShortCircuit": true,
"allowTernary": true,
"allowTaggedTemplates": true
}
],
"no-useless-call": "error",
"no-useless-computed-key": "error",
"no-useless-constructor": "off",
"@typescript-eslint/no-useless-constructor": "error",
"no-useless-escape": "error",
"no-useless-rename": "error",
"no-useless-return": "error",
"no-var": "error",
"no-void": "error",
"no-with": "error",
"object-shorthand": ["error", "properties"],
"one-var": ["error", { "initialized": "never" }],
"prefer-const": ["error", { "destructuring": "all" }],
"prefer-object-has-own": "error",
"prefer-promise-reject-errors": "error",
"prefer-regex-literals": ["error", { "disallowRedundantWrapping": true }],
"quote-props": ["error", "as-needed"],
"radix": "error",
"require-await": "off",
"@typescript-eslint/require-await": "error",
"spaced-comment": ["error", "always"],
"yoda": ["error", "never"],
"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",
"promise/param-names": "error",
"promise/no-new-statics": "error",
"unicorn/better-regex": "error",
"unicorn/catch-error-name": "error",
"unicorn/custom-error-definition": "error",
"unicorn/error-message": "error",
"unicorn/escape-case": "error",
"unicorn/new-for-builtins": "error",
"unicorn/no-array-callback-reference": "error",
"unicorn/no-hex-escape": "error",
"unicorn/no-instanceof-array": "error",
"unicorn/no-this-assignment": "error",
"unicorn/no-zero-fractions": "error",
"unicorn/prefer-node-protocol": "error",
"unicorn/throw-new-error": "error"
},
"overrides": [
{
"files": ["*.ts", "*.tsx"],
"rules": {
"@typescript-eslint/adjacent-overload-signatures": "error",
"@typescript-eslint/array-type": [
"error",
{ "default": "array-simple" }
],
"@typescript-eslint/consistent-type-assertions": [
"error",
{
"assertionStyle": "as",
"objectLiteralTypeAssertions": "never"
}
],
"@typescript-eslint/consistent-type-definitions": [
"error",
"interface"
],
"@typescript-eslint/explicit-function-return-type": [
"error",
{
"allowExpressions": true,
"allowHigherOrderFunctions": true,
"allowTypedFunctionExpressions": 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/naming-convention": [
"error",
{
"selector": "variableLike",
"leadingUnderscore": "allow",
"trailingUnderscore": "allow",
"format": ["camelCase", "PascalCase", "UPPER_CASE"]
}
],
"@typescript-eslint/no-base-to-string": "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-extraneous-class": [
"error",
{ "allowWithDecorator": true }
],
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-invalid-void-type": "error",
"@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-misused-promises": "error",
"@typescript-eslint/no-non-null-asserted-optional-chain": "error",
"@typescript-eslint/no-non-null-assertion": "error",
"@typescript-eslint/no-this-alias": [
"error",
{ "allowDestructuring": true }
],
"@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-var-requires": "error",
"@typescript-eslint/prefer-function-type": "error",
"@typescript-eslint/prefer-includes": "error",
"@typescript-eslint/prefer-nullish-coalescing": [
"error",
{
"ignoreConditionalTests": false,
"ignoreMixedLogicalExpressions": false
}
],
"@typescript-eslint/prefer-optional-chain": "error",
"@typescript-eslint/prefer-readonly": "error",
"@typescript-eslint/prefer-reduce-type-parameter": "error",
"@typescript-eslint/prefer-ts-expect-error": "error",
"@typescript-eslint/promise-function-async": "error",
"@typescript-eslint/require-array-sort-compare": [
"error",
{ "ignoreStringArrays": true }
],
"@typescript-eslint/restrict-plus-operands": [
"error",
{ "checkCompoundAssignments": true }
],
"@typescript-eslint/restrict-template-expressions": [
"error",
{ "allowNumber": true }
],
"@typescript-eslint/return-await": ["error", "always"],
"@typescript-eslint/strict-boolean-expressions": [
"error",
{
"allowString": false,
"allowNumber": false,
"allowNullableObject": false,
"allowNullableBoolean": false,
"allowNullableString": false,
"allowNullableNumber": false,
"allowAny": false
}
],
"@typescript-eslint/type-annotation-spacing": "error"
}
}
]
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,28 +1,33 @@
name: 'Lint' name: "Lint"
on: on:
push: push:
branches: [master, develop] branches: [develop]
pull_request: pull_request:
branches: [master, develop] branches: [main, develop]
jobs: jobs:
lint: lint:
runs-on: 'ubuntu-latest' runs-on: "ubuntu-latest"
steps: steps:
- uses: 'actions/checkout@v2.4.0' - uses: "actions/checkout@v4.2.2"
- name: 'Use Node.js' - name: "Setup Node.js"
uses: 'actions/setup-node@v2.5.1' uses: "actions/setup-node@v4.2.0"
with: with:
node-version: 'lts/*' node-version: "lts/*"
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:eslint"
- run: 'npm run lint:markdown' - run: "node --run lint:prettier"
- run: 'npm run lint:javascript'
- run: 'npm run lint:prettier' commitlint:
runs-on: "ubuntu-latest"
steps:
- uses: "actions/checkout@v4.2.2"
- uses: "wagoid/commitlint-github-action@v6.1.2"

View File

@ -1,29 +1,37 @@
name: 'Release' name: "Release"
on: on:
push: push:
branches: [master] branches: [main, beta]
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.2.2"
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.2.0"
with: with:
node-version: 'lts/*' node-version: "lts/*"
cache: 'npm' cache: "npm"
- name: 'Install' - name: "Install dependencies"
run: 'npm install' run: "npm clean-install"
- name: 'Release' - name: "Verify the integrity of provenance attestations and registry signatures for installed dependencies"
run: 'npm run release' run: "npm audit signatures"
- name: "Release"
run: "node --run release"
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

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

1
.gitignore vendored
View File

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

View File

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

View File

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

View File

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

View File

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

3
.npmrc
View File

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

View File

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

View File

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

View File

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

10
.vscode/settings.json vendored
View File

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

View File

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

View File

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

View File

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

View File

@ -4,15 +4,13 @@
<strong><a href="https://eslint.org/docs/developer-guide/shareable-configs">ESLint shareable config</a> to enforce strict conventions and good code quality.</strong> <strong><a href="https://eslint.org/docs/developer-guide/shareable-configs">ESLint shareable config</a> to enforce strict conventions and good code quality.</strong>
</p> </p>
</p>
<p align="center"> <p align="center">
<a href="./CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat" /></a> <a href="./CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat" alt="CONTRIBUTING" /></a>
<a href="./LICENSE"><img src="https://img.shields.io/badge/licence-MIT-blue.svg" alt="Licence MIT"/></a> <a href="./LICENSE"><img src="https://img.shields.io/badge/licence-MIT-blue.svg" alt="Licence MIT"/></a>
<a href="./CODE_OF_CONDUCT.md"><img src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg" alt="Contributor Covenant" /></a> <a href="./CODE_OF_CONDUCT.md"><img src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg" alt="Contributor Covenant" /></a>
<br /> <br />
<a href="https://github.com/Divlo/eslint-config-conventions/actions/workflows/lint.yml"><img src="https://github.com/Divlo/eslint-config-conventions/actions/workflows/lint.yml/badge.svg?branch=develop" /></a> <a href="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/lint.yml"><img src="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/lint.yml/badge.svg?branch=develop" alt="lint action" /></a>
<a href="https://github.com/Divlo/eslint-config-conventions/actions/workflows/test.yml"><img src="https://github.com/Divlo/eslint-config-conventions/actions/workflows/test.yml/badge.svg?branch=develop" /></a> <a href="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/test.yml"><img src="https://github.com/theoludwig/eslint-config-conventions/actions/workflows/test.yml/badge.svg?branch=develop" alt="test action" /></a>
<br /> <br />
<a href="https://conventionalcommits.org"><img src="https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg" alt="Conventional Commits" /></a> <a href="https://conventionalcommits.org"><img src="https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg" alt="Conventional Commits" /></a>
<a href="https://github.com/semantic-release/semantic-release"><img src="https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg" alt="semantic-release" /></a> <a href="https://github.com/semantic-release/semantic-release"><img src="https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg" alt="semantic-release" /></a>
@ -21,9 +19,9 @@
## 📜 About ## 📜 About
**eslint-config-conventions** is a [ESLint](https://eslint.org) configuration to enforce strict conventions and good code quality, it is highly inspired from [eslint-config-standard-with-typescript](https://github.com/standard/eslint-config-standard-with-typescript) but it is **stricter** and with **no formatting rules**, **only code-quality rules**. **eslint-config-conventions** is a [ESLint](https://eslint.org) configuration to enforce strict conventions and good code quality. It supports both **JavaScript** and **TypeScript**.
This configuration is mostly **for catching bugs** and **code-quality** so it is recommanded to use it with [Prettier](https://prettier.io/) for a consistent code style, it works with any `.prettierrc.json` configuration. This configuration is mostly **for catching bugs** and **code-quality** so it is recommended to use it with [Prettier](https://prettier.io/) for a consistent code style, it works with any `.prettierrc.json` configuration.
More information about **formatting rules** vs **code-quality rules** can be found on [Prettier vs. Linters](https://prettier.io/docs/en/comparison.html). More information about **formatting rules** vs **code-quality rules** can be found on [Prettier vs. Linters](https://prettier.io/docs/en/comparison.html).
@ -31,75 +29,75 @@ 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/) >= 20.11.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@^9.21.0 \
eslint-plugin-import@^2.25.4 \ eslint-plugin-promise@^7.2.1 \
eslint-plugin-promise@^6.0.0 \ eslint-plugin-unicorn@^57.0.0 \
eslint-plugin-unicorn@^41.0.0 \ eslint-plugin-import-x@^4.6.1 \
typescript@^4.4.0 \ globals@^16.0.0 \
@typescript-eslint/eslint-plugin@^5.12.0 \ typescript@^5.7.3 \
typescript-eslint@^8.24.1 \
eslint-config-conventions@latest eslint-config-conventions@latest
``` ```
Yes, this is a large number of packages. This is due to [a known limitation in ESLint](https://github.com/eslint/eslint/issues/3458). Dependencies are:
This list of dependencies are:
- [ESLint](https://github.com/eslint/eslint) - [ESLint](https://github.com/eslint/eslint)
- 3 [ESLint Plugins](https://eslint.org/docs/user-guide/configuring/plugins) - [ESLint Plugins](https://eslint.org/docs/user-guide/configuring/plugins)
- [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import)
- [eslint-plugin-promise](https://github.com/xjamundx/eslint-plugin-promise) - [eslint-plugin-promise](https://github.com/xjamundx/eslint-plugin-promise)
- [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) - [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn)
- [eslint-plugin-import-x](https://github.com/un-ts/eslint-plugin-import-x)
- [globals](https://github.com/sindresorhus/globals)
- [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](https://github.com/typescript-eslint/typescript-eslint): tooling which enables ESLint to support TypeScript.
- This package: `eslint-config-conventions` - This package: `eslint-config-conventions`
### Configuration with [Prettier](https://prettier.io/) (recommended) ### Configuration
You will need to install some dependencies in addition to those required: #### `eslint.config.js`
```js
import typescriptESLint from "typescript-eslint"
import configConventions from "eslint-config-conventions"
export default typescriptESLint.config(...configConventions, {
files: ["**/*.ts", "**/*.tsx"],
languageOptions: {
parser: typescriptESLint.parser,
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
})
```
#### 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 `eslint.config.js` 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"],
"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).
You must have a valid `tsconfig.json` file to specify `"parserOptions.project"`.
#### `package.json` #### `package.json`
```jsonc ```json
{ {
"scripts": { "scripts": {
"lint:typescript": "eslint \"**/*.{js,jsx,ts,tsx}\" --ignore-path \".gitignore\"", "lint:eslint": "eslint . --max-warnings 0",
"lint:prettier": "prettier \".\" --check --ignore-path \".gitignore\"" "lint:prettier": "prettier . --check"
} }
} }
``` ```
@ -107,12 +105,12 @@ You must have a valid `tsconfig.json` file to specify `"parserOptions.project"`.
### Usage ### Usage
```sh ```sh
npm run lint:typescript node --run lint:eslint
# or to apply automatic fixes to code # or to apply automatic fixes to code
npm run lint:typescript -- --fix node --run lint:eslint -- --fix
# Validate code formatting in all supported languages by Prettier # Validate code formatting in all supported languages by Prettier
npm run lint:prettier node --run lint:prettier
``` ```
## 💡 Contributing ## 💡 Contributing

484
eslint.config.js Normal file
View File

@ -0,0 +1,484 @@
import promise from "eslint-plugin-promise"
import unicorn from "eslint-plugin-unicorn"
import importX from "eslint-plugin-import-x"
import globals from "globals"
import typescriptESLint from "typescript-eslint"
export default typescriptESLint.config(
{
name: "eslint-config-conventions",
plugins: {
promise,
unicorn,
"import-x": importX,
},
linterOptions: {
reportUnusedDisableDirectives: "error",
},
languageOptions: {
globals: {
...globals.browser,
...globals.node,
},
ecmaVersion: "latest",
sourceType: "module",
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
rules: {
"constructor-super": "error",
"for-direction": "error",
"getter-return": "error",
"no-async-promise-executor": "error",
"no-class-assign": "error",
"no-compare-neg-zero": "error",
"no-cond-assign": "error",
"no-const-assign": "error",
"no-constant-binary-expression": "error",
"no-constant-condition": "error",
"no-constructor-return": "error",
"no-control-regex": "error",
"no-debugger": "error",
"no-dupe-args": "error",
"no-dupe-class-members": "error",
"no-dupe-else-if": "error",
"no-dupe-keys": "error",
"no-duplicate-case": "error",
"no-duplicate-imports": "error",
"no-empty-character-class": "error",
"no-empty-pattern": "error",
"no-ex-assign": "error",
"no-fallthrough": "error",
"no-func-assign": "error",
"no-import-assign": "error",
"no-invalid-regexp": "error",
"no-irregular-whitespace": "error",
"no-loss-of-precision": "error",
"no-misleading-character-class": "error",
"no-new-native-nonconstructor": "error",
"no-obj-calls": "error",
"no-promise-executor-return": "error",
"no-prototype-builtins": "error",
"no-self-assign": "error",
"no-self-compare": "error",
"no-setter-return": "error",
"no-sparse-arrays": "error",
"no-this-before-super": "error",
"no-undef": "error",
"no-unexpected-multiline": "error",
"no-unmodified-loop-condition": "error",
"no-unreachable": "error",
"no-unreachable-loop": "error",
"no-unsafe-finally": "error",
"no-unsafe-negation": "error",
"no-unsafe-optional-chaining": "error",
"no-unused-private-class-members": "error",
"no-unused-vars": [
"error",
{
args: "all",
argsIgnorePattern: "^_",
caughtErrors: "all",
caughtErrorsIgnorePattern: "^_",
destructuredArrayIgnorePattern: "^_",
varsIgnorePattern: "^_",
ignoreRestSiblings: true,
},
],
"no-use-before-define": [
"error",
{
functions: false,
classes: false,
variables: false,
},
],
"no-useless-backreference": "error",
"use-isnan": [
"error",
{
enforceForSwitchCase: true,
enforceForIndexOf: true,
},
],
"valid-typeof": [
"error",
{
requireStringLiterals: true,
},
],
"consistent-this": "error",
"default-param-last": "error",
"default-case-last": "error",
eqeqeq: [
"error",
"always",
{
null: "ignore",
},
],
"grouped-accessor-pairs": "error",
"new-cap": [
"error",
{
newIsCap: true,
capIsNew: false,
properties: true,
},
],
"no-array-constructor": "error",
"no-caller": "error",
"no-delete-var": "error",
"no-implicit-coercion": "error",
"no-extra-boolean-cast": ["error", { enforceForInnerExpressions: true }],
"no-empty": [
"error",
{
allowEmptyCatch: true,
},
],
"no-empty-static-block": "error",
"no-eval": "error",
"no-global-assign": "error",
"no-implied-eval": "error",
"no-multi-str": "error",
"no-new-func": "error",
"no-object-constructor": "error",
"no-octal": "error",
"no-octal-escape": "error",
"no-proto": "error",
"no-redeclare": [
"error",
{
builtinGlobals: false,
},
],
"no-regex-spaces": "error",
"no-shadow-restricted-names": "error",
"no-throw-literal": "error",
"no-undef-init": "error",
"no-unused-expressions": [
"error",
{
allowShortCircuit: true,
allowTernary: true,
allowTaggedTemplates: true,
},
],
"no-useless-call": "error",
"no-useless-concat": "error",
"no-useless-computed-key": "error",
"no-useless-constructor": "error",
"no-useless-escape": "error",
"no-useless-rename": "error",
"no-useless-return": "error",
"no-else-return": [
"error",
{
allowElseIf: false,
},
],
"no-var": "error",
"no-void": [
"error",
{
allowAsStatement: true,
},
],
"no-with": "error",
"object-shorthand": ["error", "properties"],
"one-var": [
"error",
{
initialized: "never",
},
],
"prefer-const": [
"error",
{
destructuring: "all",
},
],
"prefer-object-has-own": "error",
"prefer-promise-reject-errors": "error",
"prefer-regex-literals": [
"error",
{
disallowRedundantWrapping: true,
},
],
radix: "error",
yoda: ["error", "never"],
curly: ["error", "all"],
"func-style": ["error", "expression"],
"prefer-arrow-callback": "error",
"arrow-body-style": ["error", "always"],
"promise/param-names": "error",
"promise/no-new-statics": "error",
"promise/no-multiple-resolved": "error",
"promise/no-nesting": "error",
"unicorn/better-regex": "error",
"unicorn/catch-error-name": "error",
"unicorn/custom-error-definition": "error",
"unicorn/consistent-date-clone": "error",
"unicorn/error-message": "error",
"unicorn/escape-case": "error",
"unicorn/explicit-length-check": "error",
"unicorn/new-for-builtins": "error",
"unicorn/no-array-callback-reference": "error",
"unicorn/no-array-for-each": "error",
"unicorn/no-array-method-this-argument": "error",
"unicorn/no-document-cookie": "error",
"unicorn/no-named-default": "error",
"unicorn/no-empty-file": "error",
"unicorn/no-hex-escape": "error",
"unicorn/no-instanceof-builtins": "error",
"unicorn/no-new-array": "error",
"unicorn/no-new-buffer": "error",
"unicorn/no-this-assignment": "error",
"unicorn/no-zero-fractions": "error",
"unicorn/number-literal-case": "error",
"unicorn/prefer-node-protocol": "error",
"unicorn/throw-new-error": "error",
"unicorn/no-typeof-undefined": "error",
"unicorn/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",
"unicorn/consistent-existence-index-check": "error",
"import-x/no-absolute-path": "error",
"import-x/no-webpack-loader-syntax": "error",
"import-x/no-self-import": "error",
"import-x/no-useless-path-segments": "error",
"import-x/export": "error",
"import-x/no-duplicates": "error",
"import-x/no-named-default": "error",
"import-x/no-empty-named-blocks": "error",
"import-x/no-anonymous-default-export": "error",
"import-x/consistent-type-specifier-style": ["error", "prefer-top-level"],
},
},
{
name: "eslint-config-conventions/typescript",
files: ["**/*.ts", "**/*.tsx"],
plugins: {
"@typescript-eslint": typescriptESLint.plugin,
},
languageOptions: {
parser: typescriptESLint.parser,
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
rules: {
"no-undef": "off",
"no-dupe-class-members": "off",
"@typescript-eslint/no-dupe-class-members": "error",
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": [
"error",
{
args: "all",
argsIgnorePattern: "^_",
caughtErrors: "all",
caughtErrorsIgnorePattern: "^_",
destructuredArrayIgnorePattern: "^_",
varsIgnorePattern: "^_",
ignoreRestSiblings: true,
},
],
"no-use-before-define": "off",
"@typescript-eslint/no-use-before-define": [
"error",
{
functions: false,
classes: false,
enums: false,
variables: false,
typedefs: false,
},
],
"default-param-last": "off",
"@typescript-eslint/default-param-last": "error",
"no-array-constructor": "off",
"@typescript-eslint/no-array-constructor": "error",
"no-implied-eval": "off",
"@typescript-eslint/no-implied-eval": "error",
"no-redeclare": "off",
"@typescript-eslint/no-redeclare": [
"error",
{
builtinGlobals: false,
},
],
"no-throw-literal": "off",
"@typescript-eslint/only-throw-error": "error",
"no-unused-expressions": "off",
"@typescript-eslint/no-unused-expressions": [
"error",
{
allowShortCircuit: true,
allowTernary: true,
allowTaggedTemplates: true,
},
],
"no-useless-constructor": "off",
"@typescript-eslint/no-useless-constructor": "error",
"@typescript-eslint/no-unnecessary-template-expression": "error",
"@typescript-eslint/adjacent-overload-signatures": "error",
"@typescript-eslint/no-unsafe-function-type": "error",
"@typescript-eslint/no-wrapper-object-types": "error",
"@typescript-eslint/consistent-type-definitions": ["error", "interface"],
"no-duplicate-imports": "off",
"@typescript-eslint/consistent-type-imports": "error",
"@typescript-eslint/explicit-member-accessibility": "error",
"@typescript-eslint/explicit-function-return-type": [
"error",
{
allowExpressions: true,
allowHigherOrderFunctions: true,
allowTypedFunctionExpressions: true,
allowDirectConstAssertionInArrowFunctions: true,
},
],
"@typescript-eslint/method-signature-style": "error",
"@typescript-eslint/naming-convention": [
"error",
{
selector: "variableLike",
leadingUnderscore: "allow",
trailingUnderscore: "allow",
format: ["camelCase", "PascalCase", "UPPER_CASE"],
},
],
"@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,
},
],
"@typescript-eslint/no-floating-promises": [
"error",
{
allowForKnownSafeCalls: [
{
from: "package",
name: ["it", "describe"],
package: "node:test",
},
],
},
],
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-invalid-void-type": "error",
"@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-non-null-asserted-optional-chain": "error",
"@typescript-eslint/no-non-null-assertion": "error",
"@typescript-eslint/no-this-alias": [
"error",
{
allowDestructuring: true,
},
],
"@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-require-imports": "error",
"@typescript-eslint/no-unsafe-unary-minus": "error",
"@typescript-eslint/no-unsafe-declaration-merging": "error",
"@typescript-eslint/no-array-delete": "error",
"@typescript-eslint/prefer-as-const": "error",
"@typescript-eslint/prefer-function-type": "error",
"@typescript-eslint/prefer-find": "error",
"@typescript-eslint/prefer-includes": "error",
"@typescript-eslint/prefer-nullish-coalescing": [
"error",
{
ignoreTernaryTests: true,
ignoreConditionalTests: false,
ignoreMixedLogicalExpressions: false,
},
],
"@typescript-eslint/prefer-readonly": "error",
"@typescript-eslint/prefer-reduce-type-parameter": "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",
"@typescript-eslint/require-array-sort-compare": [
"error",
{
ignoreStringArrays: true,
},
],
"@typescript-eslint/restrict-plus-operands": [
"error",
{
skipCompoundAssignments: true,
},
],
"@typescript-eslint/restrict-template-expressions": [
"error",
{
allowNumber: true,
},
],
"@typescript-eslint/strict-boolean-expressions": [
"error",
{
allowString: false,
allowNumber: false,
allowNullableObject: false,
allowNullableBoolean: false,
allowNullableString: false,
allowNullableNumber: false,
allowAny: false,
},
],
},
},
)

6
eslint.config.mjs Normal file
View File

@ -0,0 +1,6 @@
import typescriptESLint from "typescript-eslint"
import configConventions from "./eslint.config.js"
export default typescriptESLint.config(...configConventions, {
ignores: ["test/fixtures/*"],
})

7
index.d.ts vendored Normal file
View File

@ -0,0 +1,7 @@
import type typescriptESLint from "typescript-eslint"
declare const eslintConfigConventions: ReturnType<
typeof typescriptESLint.config
>
export default eslintConfigConventions

View File

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

16806
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,16 +3,16 @@
"version": "0.0.0-development", "version": "0.0.0-development",
"public": true, "public": true,
"description": "ESLint shareable config to enforce strict conventions and good code quality.", "description": "ESLint shareable config to enforce strict conventions and good code quality.",
"author": "Divlo <contact@divlo.fr>", "author": "Théo LUDWIG <contact@theoludwig.fr>",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/Divlo/eslint-config-conventions.git" "url": "https://github.com/theoludwig/eslint-config-conventions.git"
}, },
"bugs": { "bugs": {
"url": "https://github.com/Divlo/eslint-config-conventions/issues" "url": "https://github.com/theoludwig/eslint-config-conventions/issues"
}, },
"homepage": "https://github.com/Divlo/eslint-config-conventions#readme", "homepage": "https://github.com/theoludwig/eslint-config-conventions#readme",
"keywords": [ "keywords": [
"eslintconfig", "eslintconfig",
"eslint", "eslint",
@ -22,51 +22,47 @@
"code quality", "code quality",
"conventions" "conventions"
], ],
"main": "index.js", "main": "eslint.config.js",
"types": "index.d.ts",
"type": "module",
"files": [
"eslint.config.js",
"index.d.ts"
],
"publishConfig": {
"access": "public",
"provenance": true
},
"engines": { "engines": {
"node": ">=16.0.0", "node": ">=20.11.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:eslint": "eslint . --max-warnings 0 --config eslint.config.mjs",
"lint:javascript": "eslint \"**/*.{js,jsx,ts,tsx}\"", "lint:prettier": "prettier . --check",
"lint:prettier": "prettier \".\" --check --ignore-path \".gitignore\"", "inspect": "eslint --inspect-config",
"lint:staged": "lint-staged", "test": "node --test",
"test": "tape \"test/**/*.js\"", "release": "semantic-release"
"release": "semantic-release",
"postinstall": "husky install",
"prepublishOnly": "pinst --disable",
"postpublish": "pinst --enable"
}, },
"peerDependencies": { "peerDependencies": {
"eslint": "^8.9.0", "eslint": "^9.21.0",
"eslint-plugin-import": "^2.25.4", "eslint-plugin-promise": "^7.2.1",
"eslint-plugin-promise": "^6.0.0", "eslint-plugin-unicorn": "^57.0.0",
"eslint-plugin-unicorn": "^41.0.0", "eslint-plugin-import-x": "^4.6.1",
"typescript": "^4.4.0", "globals": "^16.0.0",
"@typescript-eslint/eslint-plugin": "^5.12.0" "typescript-eslint": "^8.24.1"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "16.2.1", "@types/node": "22.13.5",
"@commitlint/config-conventional": "16.2.1", "globals": "16.0.0",
"editorconfig-checker": "4.0.2", "editorconfig-checker": "6.0.1",
"eslint": "8.9.0", "eslint": "9.21.0",
"@types/eslint": "8.4.1", "eslint-plugin-promise": "7.2.1",
"eslint-plugin-import": "2.25.4", "eslint-plugin-unicorn": "57.0.0",
"eslint-plugin-promise": "6.0.0", "eslint-plugin-import-x": "4.6.1",
"eslint-plugin-unicorn": "41.0.0", "typescript-eslint": "8.24.1",
"typescript": "4.5.5", "prettier": "3.5.2",
"@typescript-eslint/parser": "5.12.0", "semantic-release": "24.2.3",
"@typescript-eslint/eslint-plugin": "5.12.0", "typescript": "5.7.3"
"tape": "5.5.2",
"husky": "7.0.4",
"lint-staged": "12.3.4",
"markdownlint-cli": "0.31.1",
"@types/tape": "4.13.2",
"pinst": "2.1.6",
"prettier": "2.5.1",
"semantic-release": "19.0.2"
} }
} }

View File

@ -1,15 +0,0 @@
const test = require('tape')
const config = require('../index.js')
test('test basic properties of config', function (t) {
t.ok(isObject(config.parserOptions))
t.ok(isObject(config.env))
t.ok(isObject(config.rules))
t.ok(isObject(config.overrides))
t.end()
})
function isObject(object) {
return typeof object === 'object' && object !== null
}

View File

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

View File

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

View File

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

View File

@ -1,37 +0,0 @@
const { ESLint } = require('eslint')
const test = require('tape')
test('ensure we validate correctly JavaScript files', async (t) => {
const eslint = new ESLint({ ignore: false })
const [noErrors] = await eslint.lintFiles(
'test/fixtures/javascript-no-errors.js'
)
const [withErrors] = await eslint.lintFiles(
'test/fixtures/javascript-with-errors.js'
)
t.equal(noErrors.errorCount, 0)
t.equal(withErrors.errorCount, 3)
t.end()
})
test('ensure we validate correctly TypeScript files', async (t) => {
const eslint = new ESLint({ ignore: false })
const [noErrors] = await eslint.lintFiles(
'test/fixtures/typescript-no-errors.ts'
)
const [withErrors] = await eslint.lintFiles(
'test/fixtures/javascript-with-errors.js'
)
t.equal(noErrors.errorCount, 0)
t.equal(withErrors.errorCount, 3)
t.end()
})
test('ensure we allow top-level await', async (t) => {
const eslint = new ESLint({ ignore: false })
const [lintResult] = await eslint.lintFiles(
'test/fixtures/top-level-await.mjs'
)
t.equal(lintResult.errorCount, 0)
t.end()
})

View File

@ -0,0 +1,87 @@
import assert from "node:assert/strict"
import { describe, it } from "node:test"
import { ESLint } from "eslint"
const eslint = new ESLint()
describe("ESLint configuration", () => {
it("should validate correctly JavaScript files", async () => {
const [noErrors] = await eslint.lintFiles(
"test/fixtures/javascript-no-errors.js",
)
const [withErrors] = await eslint.lintFiles(
"test/fixtures/javascript-with-errors.js",
)
assert.strictEqual(
noErrors?.errorCount,
0,
JSON.stringify(noErrors, null, 2),
)
assert.strictEqual(
withErrors?.errorCount,
3,
JSON.stringify(withErrors, null, 2),
)
})
it("should validate correctly TypeScript files", async () => {
const [noErrors] = await eslint.lintFiles(
"test/fixtures/typescript-no-errors.ts",
)
const [withErrors] = await eslint.lintFiles(
"test/fixtures/javascript-with-errors.js",
)
assert.strictEqual(
noErrors?.errorCount,
0,
JSON.stringify(noErrors, null, 2),
)
assert.strictEqual(
withErrors?.errorCount,
3,
JSON.stringify(withErrors, null, 2),
)
})
it("should 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),
)
})
it("should allow top-level await", async () => {
const [lintResult] = await eslint.lintFiles(
"test/fixtures/top-level-await.mjs",
)
assert.strictEqual(
lintResult?.errorCount,
0,
JSON.stringify(lintResult, null, 2),
)
})
it("should 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,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
} }
} }