1
0
mirror of https://github.com/theoludwig/eslint-config-conventions.git synced 2026-04-13 14:31:05 +02:00

Compare commits

...

203 Commits

Author SHA1 Message Date
theoludwig 67057cdfff fix: update .oxlintrc.json 2026-04-07 11:18:24 +02:00
theoludwig 7f2ff2db1a feat: support eslint-plugin-unicorn@^64.0.0 2026-04-07 10:13:02 +02:00
theoludwig 23cba0a069 fix: relax @typescript-eslint/prefer-nullish-coalescing 2026-02-23 09:19:41 +01:00
theoludwig a0a8e24e1a fix: update .oxlintrc, @typescript-eslint/prefer-nullish-coalescing default config 2026-02-23 09:07:51 +01:00
theoludwig 6cbb2168a2 fix: correct env in .oxlintrc.json 2026-02-20 02:50:17 +01:00
theoludwig aeb606b81e fix: update .oxlintrc.json 2026-02-20 02:44:17 +01:00
theoludwig 7549e87974 build(deps): update latest 2026-02-10 23:06:48 +01:00
theoludwig 3afd26c1a9 fix: update .oxlintrc.json 2026-02-10 23:00:28 +01:00
theoludwig ce4c314fa5 ci: trusted npm package publishing (OIDC)
Ref: https://docs.npmjs.com/trusted-publishers
2026-01-14 23:36:26 +01:00
theoludwig 9cc2cd435c fix: update .oxlintrc.json 2026-01-14 23:18:33 +01:00
theoludwig 10f63cedae feat: support globals@^17.0.0 2026-01-14 23:17:56 +01:00
theoludwig 1ca98dd3cb build(deps): update latest 2026-01-14 23:17:34 +01:00
theoludwig f3eae972a5 fix: update .oxlintrc.json 2025-11-27 12:07:31 +01:00
theoludwig 0bcd75514b fix: relax @typescript-eslint/only-throw-error 2025-11-27 12:01:09 +01:00
theoludwig 7a98b2fe8c fix: relax @typescript-eslint/no-redundant-type-constituents 2025-11-27 11:59:15 +01:00
theoludwig d6ba808207 build(deps): update latest 2025-11-27 11:58:20 +01:00
theoludwig ede428ba5f ci: pin GitHub Actions by commit-hash
Ref: https://blog.rafaelgss.dev/why-you-should-pin-actions-by-commit-hash
2025-11-01 00:51:39 +01:00
theoludwig 977745dabb fix: update .oxlintrc.json 2025-10-26 15:37:34 +01:00
theoludwig 54392498cf feat: support eslint-plugin-unicorn@^62.0.0 2025-10-26 15:32:53 +01:00
theoludwig e59d48f713 build(deps): update latest 2025-10-08 17:00:11 +02:00
theoludwig b2f5a136f9 fix(oxlint): relax unicorn/no-array-sort 2025-10-04 19:17:18 +02:00
theoludwig fa724b4f97 fix(oxlint): relax import-x/no-named-as-default-member 2025-10-04 19:16:10 +02:00
theoludwig 1b70b62de1 fix(oxlint): relax import-x/no-unassigned-import 2025-09-26 19:59:58 +02:00
theoludwig 09493ef433 fix(oxlint): relax @typescript-eslint/no-unsafe-type-assertion 2025-09-25 07:59:20 +02:00
theoludwig a13aeadda8 fix(oxlint): enable back import rules
Ref: https://github.com/oxc-project/oxc/pull/14049
2025-09-25 07:58:02 +02:00
theoludwig 5817503919 fix: update .oxlintrc.json 2025-09-11 21:06:08 +02:00
theoludwig 23bb31949d fix: relax @typescript-eslint/no-dynamic-delete 2025-09-11 21:00:36 +02:00
theoludwig 911fadcf02 fix: relax @typescript-eslint/no-unnecessary-type-conversion 2025-09-11 20:57:39 +02:00
theoludwig 2d8260472a fix!: usage of eslint defineConfig()
Ref: https://typescript-eslint.io/packages/typescript-eslint/#migrating-to-defineconfig

BREAKING CHANGE: peerDependencies:
`eslint@^9.22.0`
`eslint-plugin-unicorn@^61.0.0`
2025-09-11 19:48:20 +02:00
theoludwig 929978af36 feat: support eslint-plugin-unicorn@^61.0.0 2025-09-08 08:27:35 +02:00
theoludwig 6f42dbcdbe fix: relax jsx-a11y rules in .oxlintrc.json 2025-08-28 12:41:17 +02:00
theoludwig 6cd0334469 fix: update .oxlintrc.json 2025-08-27 20:11:29 +02:00
theoludwig a014deeed6 fix: set peerDependencies as optional 2025-08-27 20:11:14 +02:00
theoludwig 91b66d24cd ci: remove commitlint (not useful) 2025-07-23 12:24:20 +02:00
theoludwig 6a11f2dbf6 fix: relax @typescript-eslint/no-floating-promises to include more allowForKnownSafeCalls for node:test
Ref: https://github.com/typescript-eslint/typescript-eslint/issues/11372
2025-07-23 12:21:59 +02:00
theoludwig 2876f22947 feat: support eslint-plugin-unicorn@^60.0.0 2025-07-22 11:06:33 +02:00
theoludwig 910050f30d feat: export .oxlintrc.json (#7) 2025-06-10 14:13:47 +02:00
theoludwig 8953d875b5 style: fix prettier 2025-05-10 20:50:44 +02:00
theoludwig f45ab1dcbb feat: add unicorn/no-accessor-recursion
BREAKING CHANGE: New rule introduced
2025-05-10 20:44:46 +02:00
theoludwig 7bbac61906 feat: add unicorn/consistent-assert
BREAKING CHANGE: New rule introduced
2025-05-10 20:43:16 +02:00
theoludwig 3aacbbeec4 feat: add unicorn/no-unnecessary-array-flat-depth
BREAKING CHANGE: New rule introduced
2025-05-10 20:41:18 +02:00
theoludwig c4340efc6f feat: add @typescript-eslint/no-unnecessary-type-conversion
BREAKING CHANGE: New rule introduced
2025-05-10 20:40:01 +02:00
theoludwig 851c468748 build(deps): update peer dependencies
BREAKING CHANGE: peerDependencies:
`eslint-plugin-unicorn@^59.0.0`
`typescript-eslint@^8.32.0`
2025-05-10 20:38:17 +02:00
theoludwig 892a3f8302 build(deps): update latest 2025-05-10 19:37:48 +02:00
theoludwig 620f6ce442 build(deps): update latest 2025-05-02 19:57:03 +02:00
theoludwig 1000c38cb2 feat: support eslint-plugin-unicorn@^59.0.0 2025-05-02 19:55:11 +02:00
theoludwig 517778ac50 build(deps): update latest 2025-03-26 12:28:16 +01:00
theoludwig af99632f51 feat: support eslint-plugin-unicorn@^58.0.0 2025-03-26 12:26:05 +01:00
theoludwig 029a8d1757 feat: add unicorn/consistent-existence-index-check
BREAKING CHANGE: New rule introduced
2025-02-23 00:02:40 +01:00
theoludwig 20f48f93aa feat: add unicorn/no-named-default
BREAKING CHANGE: New rule introduced
2025-02-22 23:59:22 +01:00
theoludwig d5903f0e22 feat: add unicorn/consistent-date-clone
BREAKING CHANGE: New rule introduced
2025-02-22 23:58:16 +01:00
theoludwig 1ce9bcb87e feat: add unicorn/no-instanceof-builtins
BREAKING CHANGE: New rule introduced
2025-02-22 23:56:01 +01:00
theoludwig 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
theoludwig 657b9a4bad feat: add no-extra-boolean-cast
BREAKING CHANGE: New rule introduced
2025-02-22 23:43:23 +01:00
theoludwig 31ab3e70a8 feat: add no-implicit-coercion
BREAKING CHANGE: New rule introduced
2025-02-22 23:42:35 +01:00
theoludwig ec16bb6eec build(deps): update latest 2025-02-22 23:41:04 +01:00
theoludwig fe7fddca13 fix: relax @typescript-eslint/unbound-method 2025-01-15 15:07:07 +01:00
theoludwig 42ae3ffe33 build(deps): update latest 2025-01-15 15:06:30 +01:00
theoludwig 8951ecc027 test: use describe and it 2025-01-06 23:17:18 +01:00
theoludwig 33c0f840ea build(deps): update latest 2025-01-06 23:12:38 +01:00
theoludwig 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
theoludwig 5e63c17030 build(deps): update latest 2024-12-14 21:06:54 +01:00
theoludwig 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
theoludwig e05233d429 fix: relax @typescript-eslint/array-type 2024-11-26 20:57:16 +01:00
theoludwig c4c1a7f5dd feat: add @typescript-eslint/explicit-member-accessibility
BREAKING CHANGE: New rule introduced
2024-11-23 15:44:42 +01:00
theoludwig adb164f604 build(deps): update latest 2024-11-11 20:46:20 +01:00
theoludwig 8ae05c8bee fix: relax unicorn/consistent-destructuring 2024-11-11 20:42:08 +01:00
theoludwig ee4897153d chore: remove not needed @ts-check 2024-11-11 20:40:36 +01:00
theoludwig 67ff8e18b2 ci: use Node.js lts/* 2024-11-11 20:39:36 +01:00
theoludwig d41573f12c docs: eslint.config.js 2024-10-29 23:48:40 +01:00
theoludwig 8efe22c23e fix: relax @typescript-eslint/no-unnecessary-condition 2024-10-22 11:47:11 +02:00
theoludwig 57f419c44a build(deps): update latest 2024-10-22 11:46:35 +02:00
theoludwig a578bb80ba docs: add // @ts-check to config example 2024-10-08 08:10:28 +02:00
theoludwig 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
theoludwig 1719cd18b3 ci: release beta 2024-10-07 17:46:08 +02:00
theoludwig 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
theoludwig 66044cc8eb style: fix Prettier 2024-10-07 17:35:13 +02:00
theoludwig 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
theoludwig f258d5ab41 fix: relax @typescript-eslint/dot-notation 2024-09-28 20:10:49 +02:00
theoludwig 424235bd4f docs: specify TypeScript version with ~ to avoid issues with semver 2024-09-28 18:52:46 +02:00
theoludwig 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
theoludwig 12f37d01b3 feat: add @typescript-eslint/no-unnecessary-condition
BREAKING CHANGE: New rule introduced
2024-09-25 18:02:43 +02:00
theoludwig 6af4b4f6ac feat: add @typescript-eslint/no-deprecated
BREAKING CHANGE: New rule introduced

Fixes #5
2024-09-25 17:52:28 +02:00
theoludwig b4f1c0b8dd feat: add @typescript-eslint/no-redundant-type-constituents
BREAKING CHANGE: New rule introduced
2024-09-25 16:44:52 +02:00
theoludwig 116c3c600a feat: add @typescript-eslint/no-unsafe-declaration-merging
BREAKING CHANGE: New rule introduced
2024-09-25 16:30:23 +02:00
theoludwig 4115843cc1 feat: add @typescript-eslint/unbound-method
BREAKING CHANGE: New rule introduced
2024-09-25 16:22:08 +02:00
theoludwig 14d3e0ba30 chore: usage of projectService for tsconfig.json 2024-09-18 00:32:33 +02:00
theoludwig 921aacdc9b test: easier to debug in case of failures 2024-09-18 00:29:14 +02:00
theoludwig a03e2bd109 fix: relax @typescript-eslint/return-await 2024-09-18 00:26:51 +02:00
theoludwig 2db017e805 test: ensure we do not use deprecated rules 2024-09-18 00:20:22 +02:00
theoludwig 19f74fc6a2 feat: add unicorn/prefer-structured-clone
BREAKING CHANGE: New rule introduced
2024-09-17 23:58:02 +02:00
theoludwig 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
theoludwig 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
theoludwig 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
theoludwig eac273c076 feat: add @typescript-eslint/prefer-return-this-type
BREAKING CHANGE: New rule introduced
2024-07-27 09:00:42 +02:00
theoludwig 0df1b867a4 docs: update README.md 2024-07-26 07:00:24 +02:00
theoludwig 92e6e56884 ci: usage of Node.js v22 2024-07-25 14:01:48 +02:00
theoludwig 305df380aa chore: remove usage of git hooks (husky, lint-staged, commitlint) + usage of node --run 2024-07-25 14:00:05 +02:00
theoludwig 8b3d9109d7 build(deps): update latest 2024-07-25 13:51:35 +02:00
theoludwig d0fa4e3688 feat: support eslint-plugin-unicorn@^55.0.0 2024-07-25 13:49:08 +02:00
theoludwig 9fa86e2133 feat: support eslint-plugin-promise@^7.0.0 2024-07-25 13:48:49 +02:00
theoludwig 6cb7af3a05 docs: import plugin is not used anymore 2024-07-10 13:34:28 +02:00
theoludwig b4de437548 fix: remove eslint-plugin-import rules
We'll consider using eslint-plugin-import-x in the next major version,
https://github.com/theoludwig/eslint-config-conventions/issues/3
We remove this plugin to avoid issues like this: https://github.com/pnpm/pnpm/issues/4619
(should be resolved when ESLint v9 is fully supported)
And because of the lack of features, that eslint-plugin-import-x implement:
(https://github.com/un-ts/eslint-plugin-import-x/issues/24#issuecomment-1991605123)
2024-07-10 13:02:54 +02:00
theoludwig c751162403 feat: support eslint-plugin-unicorn@^54.0.0 2024-07-10 12:44:40 +02:00
theoludwig 152ccba986 build(deps): update latest 2024-07-10 12:42:53 +02:00
theoludwig 10b5a0d8df fix: allow to ignore floating promise with void operator: @typescript-eslint/no-floating-promises 2024-05-21 19:35:36 +02:00
theoludwig 815518c613 chore: allow to publish pre-release beta version 2024-05-21 19:35:36 +02:00
theoludwig 860873aa4b ci: update GitHub actions 2024-05-21 19:35:36 +02:00
theoludwig 5eacace152 docs: stop recommending eslint-config-prettier and eslint-plugin-prettier to use Prettier 2024-05-21 19:35:36 +02:00
theoludwig 0dcde0af51 feat: support eslint-plugin-unicorn@^52.0.0 and eslint-plugin-unicorn@^53.0.0 2024-05-21 19:35:36 +02:00
theoludwig b0fa907559 build(deps): update latest 2024-05-21 19:35:36 +02:00
theoludwig d15df84a73 docs: delete additional </p> 2024-05-21 19:35:36 +02:00
theoludwig aa4da3f6e8 docs: stop mentioning eslint-config-standard-with-typescript as it is now very different 2024-05-21 19:35:36 +02:00
theoludwig b180eae455 fix: relax @typescript-eslint/member-delimiter-style
Deprecated stylistic rule.
2024-05-21 19:35:36 +02:00
theoludwig 31b226ffa4 docs: rename master branch to main 2024-02-16 20:04:49 +01:00
theoludwig 8403ef4254 build(deps): update latest 2024-02-16 20:03:29 +01:00
theoludwig dbe252f3b4 feat: add support for @typescript-eslint v7 2024-02-16 20:03:21 +01:00
theoludwig 6e6a8d7aa1 feat: add @typescript-eslint/no-require-imports
Not considered breaking, as `@typescript-eslint/no-var-requires` is already there.
You should already not use, `require` in your codebase.
It was a mistake to not include this rule.

However, the newly added rule, will now report an error for the following example code:
```tsx
const [loaded, error] = useFonts({
  CustomFont: require("../assets/fonts/CustomFont.ttf")
})
```

Must read: "Every change breaks someones workflow", https://xkcd.com/1172/
2024-02-16 20:02:41 +01:00
theoludwig 256a5024d6 feat: add @typescript-eslint/prefer-as-const
BREAKING CHANGE: New rule introduced
2024-02-08 22:56:43 +01:00
theoludwig 3d2e708e96 docs: update link to eslint-config-standard-with-typescript 2024-02-08 22:54:22 +01:00
theoludwig b0f6ef585f feat: add @typescript-eslint/prefer-promise-reject-errors
BREAKING CHANGE: New rule introduced
2024-02-08 22:53:25 +01:00
theoludwig 7abcc179e5 feat: add @typescript-eslint/no-useless-template-literals
BREAKING CHANGE: New rule introduced
2024-02-08 22:49:11 +01:00
theoludwig b72745bdbe feat: add @typescript-eslint/prefer-find
BREAKING CHANGE: New rule introduced
2024-02-08 22:47:38 +01:00
theoludwig 89c012cac2 feat: add @typescript-eslint/no-array-delete
BREAKING CHANGE: New rule introduced
2024-02-08 22:46:43 +01:00
theoludwig 00b7a2a89b feat: add promise/no-nesting
BREAKING CHANGE: New rule introduced
2024-02-08 22:34:10 +01:00
theoludwig a5036c8381 feat: add promise/no-multiple-resolved
BREAKING CHANGE: New rule introduced
2024-02-08 22:32:39 +01:00
theoludwig c9365be768 feat: add import/no-anonymous-default-export
BREAKING CHANGE: New rule introduced
2024-02-08 22:29:14 +01:00
theoludwig c1a524e31b feat: add no-useless-concat
BREAKING CHANGE: New rule introduced
2024-02-08 22:25:31 +01:00
theoludwig 8585574a70 feat: add no-else-return
BREAKING CHANGE: New rule introduced
2024-02-08 22:24:19 +01:00
theoludwig fce826e24a feat: add no-sparse-arrays
BREAKING CHANGE: New rule introduced
2024-02-08 22:09:31 +01:00
theoludwig 17e90bcc35 feat: add no-constant-binary-expression
BREAKING CHANGE: New rule introduced
2024-02-08 21:57:58 +01:00
theoludwig dab4433431 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint@^8.56.0`
`eslint-plugin-import@^2.29.1`
`eslint-plugin-unicorn@^51.0.1`
`typescript@^5.3.3`
`@typescript-eslint/eslint-plugin@^6.21.0`
`@typescript-eslint/parser@^6.21.0`
2024-02-08 21:50:33 +01:00
theoludwig b671018a00 chore: cleaner configs 2024-01-30 01:32:52 +01:00
theoludwig 17dea937eb docs(license): add email address 2024-01-30 01:28:25 +01:00
theoludwig 7f3c152e61 build(deps): update latest 2023-12-26 22:07:17 +01:00
theoludwig f243013173 feat: support eslint-plugin-unicorn@^50.0.0 2023-12-22 00:23:29 +01:00
theoludwig d3d71f9a78 feat: add @typescript-eslint/no-unsafe-unary-minus
BREAKING CHANGE: New rule introduced
2023-11-14 12:52:10 +01:00
theoludwig 6a064c227e fix: relax unicorn/no-array-push-push 2023-11-14 12:50:21 +01:00
theoludwig 113a469ac5 build(deps): update latest
BREAKING CHANGE: peerDependencies:
`eslint@^8.52.0`
`eslint-plugin-import@^2.28.1`
`eslint-plugin-promise@^6.1.1`
`eslint-plugin-unicorn@^49.0.0`
`@typescript-eslint/eslint-plugin@^6.11.0`
`@typescript-eslint/parser@^6.11.0`
2023-11-14 12:49:18 +01:00
theoludwig 0e2b2ae89d chore: better Prettier config for easier reviews 2023-10-23 23:00:22 +02:00
theoludwig d91b2a2538 feat: replace no-new-object (deprecated) rule with no-object-constructor 2023-10-18 13:04:31 +02:00
theoludwig d8b3ef6646 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint@^8.51.0`
`eslint-plugin-import@^2.28.1`
`eslint-plugin-promise@^6.1.1`
`eslint-plugin-unicorn@^48.0.1`

BREAKING CHANGE: Bump minimum supported Node.js >= 18.0.0
2023-10-18 12:59:19 +02:00
theoludwig d149fdd6ab fix: relax unicorn/consistent-function-scoping
Rule not working well with typeof generic in TypeScript.
React.js component should have all the related functions in its scope.
2023-07-18 23:12:21 +02:00
theoludwig 6345bddd38 fix: relax @typescript-eslint/prefer-nullish-coalescing
Should ignore ternary tests.
2023-07-18 23:06:31 +02:00
theoludwig 4e99d69598 fix: relax no-duplicate-imports
Conflict with `@typescript-eslint/consistent-type-imports`
2023-07-18 22:31:59 +02:00
theoludwig adf01e1e8c feat: add unicorn/template-indent
BREAKING CHANGE: New rule introduced
2023-07-18 22:08:49 +02:00
theoludwig 8bfeaadf32 feat: add unicorn/prefer-modern-math-apis
BREAKING CHANGE: New rule introduced
2023-07-18 22:04:34 +02:00
theoludwig 807c201955 feat: add unicorn/prefer-number-properties
BREAKING CHANGE: New rule introduced
2023-07-18 22:02:15 +02:00
theoludwig 381f5cb9cf feat: add unicorn/require-array-join-separator
BREAKING CHANGE: New rule introduced
2023-07-18 22:00:19 +02:00
theoludwig c431a208e9 feat: add unicorn/number-literal-case
BREAKING CHANGE: New rule introduced
2023-07-18 21:58:04 +02:00
theoludwig f622982fdb feat: add unicorn/no-new-buffer
BREAKING CHANGE: New rule introduced
2023-07-18 21:54:53 +02:00
theoludwig d59b088bff feat: add unicorn/no-new-array
BREAKING CHANGE: New rule introduced
2023-07-18 21:53:56 +02:00
theoludwig 2fd4edbf5b feat: add unicorn/no-empty-file
BREAKING CHANGE: New rule introduced
2023-07-18 21:51:51 +02:00
theoludwig 8837b8737b feat: add unicorn/no-document-cookie
BREAKING CHANGE: New rule introduced
2023-07-18 21:50:47 +02:00
theoludwig cbbb8dfe28 feat: add unicorn/no-array-push-push
BREAKING CHANGE: New rule introduced
2023-07-18 21:48:53 +02:00
theoludwig 2fcede3f0a feat: add unicorn/no-array-method-this-argument
BREAKING CHANGE: New rule introduced
2023-07-18 21:48:07 +02:00
theoludwig 80c00f5fa8 feat: add unicorn/no-array-for-each
BREAKING CHANGE: New rule introduced
2023-07-18 21:46:32 +02:00
theoludwig 7f7ab46896 feat: add unicorn/no-array-callback-reference
BREAKING CHANGE: New rule introduced
2023-07-18 21:45:37 +02:00
theoludwig eab075e291 feat: add unicorn/explicit-length-check
BREAKING CHANGE: New rule introduced
2023-07-18 21:43:06 +02:00
theoludwig 244b74679a feat: add unicorn/consistent-function-scoping
BREAKING CHANGE: New rule introduced
2023-07-18 21:39:46 +02:00
theoludwig 07595ccb56 feat: add unicorn/consistent-destructuring
BREAKING CHANGE: New rule introduced
2023-07-18 21:37:00 +02:00
theoludwig d0e9004ce3 docs: improve recommended usage/setup 2023-07-18 20:25:19 +02:00
theoludwig 1e29cef968 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^48.0.0`
2023-07-18 20:17:06 +02:00
theoludwig f89c4415cf feat: add support for typescript-eslint v6.0.0 2023-07-14 23:19:09 +02:00
theoludwig 34ec74cff7 docs: simplify README 2023-07-02 16:02:28 +02:00
theoludwig f5a69d69f5 fix: update author - Théo LUDWIG 2023-07-02 15:57:44 +02:00
theoludwig e071e917f6 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint@^8.44.0`
2023-07-02 15:54:50 +02:00
theoludwig 528a31316d refactor: usage of node:test instead of tap 2023-07-02 15:46:14 +02:00
Divlo b1bd574d42 feat: add npm package provenance
Ref: https://github.blog/2023-04-19-introducing-npm-package-provenance/
2023-05-13 15:41:12 +02:00
Divlo ca9b1db4bd build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^47.0.0`
2023-05-13 15:22:49 +02:00
Divlo 3222d42e67 build(deps): update latest 2023-04-02 21:16:48 +02:00
Divlo 08602b1c53 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^46.0.0`
2023-04-02 20:53:26 +02:00
Divlo 1779517f5c feat: add @typescript-eslint/ban-types
BREAKING CHANGE: New rule introduced
2023-02-06 23:52:11 +01:00
Divlo 81b37b523c feat: add import/no-empty-named-blocks
BREAKING CHANGE: New rule introduced
2023-02-06 23:48:24 +01:00
Divlo a95ac7ec8b fix: relax @typescript-eslint/consistent-type-assertions 2023-02-06 23:43:23 +01:00
Divlo 32481c316f fix: relax no-unused-vars ignore variable starting with _ 2023-02-06 23:42:09 +01:00
Divlo c3ddbc73b7 feat: add no-empty-static-block
Ref: https://eslint.org/docs/latest/rules/no-empty-static-block

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

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

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

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

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

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

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

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

BREAKING CHANGE: New rule introduced
2022-08-31 13:22:20 +02:00
Divlo 435d3e9e5f build(deps): update latest 2022-08-31 13:17:00 +02:00
Divlo 637a79a8e7 build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-unicorn@^43.0.0`
2022-07-12 13:52:53 +02:00
Divlo 61679195ee build(deps): update latest
BREAKING CHANGE: peerDependencies: `eslint-plugin-import@^2.26.0`, `eslint-plugin-unicorn@^42.0.0`
2022-04-06 19:14:13 +02:00
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
40 changed files with 6639 additions and 13759 deletions
-1
View File
@@ -1 +0,0 @@
{ "extends": ["@commitlint/config-conventional"] }
-2
View File
@@ -1,2 +0,0 @@
node_modules
test/fixtures
-316
View File
@@ -1,316 +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 }],
"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", "always", { "null": "ignore" }],
"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-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"
}
}
]
}
+4 -4
View File
@@ -1,8 +1,8 @@
--- ---
name: '🐛 Bug Report' name: "🐛 Bug Report"
about: 'Report an unexpected problem or unintended behavior.' about: "Report an unexpected problem or unintended behavior."
title: '[Bug]' title: "[Bug]"
labels: 'bug' labels: "bug"
--- ---
<!-- <!--
+4 -4
View File
@@ -1,8 +1,8 @@
--- ---
name: '📜 Documentation' name: "📜 Documentation"
about: 'Correct spelling errors, improvements or additions to documentation files (README, CONTRIBUTING...).' about: "Correct spelling errors, improvements or additions to documentation files (README, CONTRIBUTING...)."
title: '[Documentation]' title: "[Documentation]"
labels: 'documentation' labels: "documentation"
--- ---
<!-- Please make sure your issue has not already been fixed. --> <!-- Please make sure your issue has not already been fixed. -->
+4 -4
View File
@@ -1,8 +1,8 @@
--- ---
name: '✨ Feature Request' name: "✨ Feature Request"
about: 'Suggest a new feature idea.' about: "Suggest a new feature idea."
title: '[Feature]' title: "[Feature]"
labels: 'feature request' labels: "feature request"
--- ---
<!-- Please make sure your issue has not already been fixed. --> <!-- Please make sure your issue has not already been fixed. -->
+4 -4
View File
@@ -1,8 +1,8 @@
--- ---
name: '🔧 Improvement' name: "🔧 Improvement"
about: 'Improve structure/format/performance/refactor/tests of the code.' about: "Improve structure/format/performance/refactor/tests of the code."
title: '[Improvement]' title: "[Improvement]"
labels: 'improvement' labels: "improvement"
--- ---
<!-- Please make sure your issue has not already been fixed. --> <!-- Please make sure your issue has not already been fixed. -->
+4 -4
View File
@@ -1,8 +1,8 @@
--- ---
name: '🙋 Question' name: "🙋 Question"
about: 'Further information is requested.' about: "Further information is requested."
title: '[Question]' title: "[Question]"
labels: 'question' labels: "question"
--- ---
### Question ### Question
+1 -1
View File
@@ -1,6 +1,6 @@
<!-- Please first discuss the change you wish to make via issue before making a change. It might avoid a waste of your time. --> <!-- Please first discuss the change you wish to make via issue before making a change. It might avoid a waste of your time. -->
## What changes this PR introduce? # What changes this PR introduce?
## List any relevant issue numbers ## List any relevant issue numbers
+14 -16
View File
@@ -1,28 +1,26 @@
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@8e8c483db84b4bee98b60c0593521ed34d9990e8" # v6.0.1
- name: 'Use Node.js' - name: "Setup Node.js"
uses: 'actions/setup-node@v2.5.1' uses: "actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f" # v6.1.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'
+24 -13
View File
@@ -1,29 +1,40 @@
name: 'Release' name: "Release"
on: on:
push: push:
branches: [master] branches: [main, beta]
permissions:
id-token: "write" # OIDC
contents: "read"
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@8e8c483db84b4bee98b60c0593521ed34d9990e8" # v6.0.1
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@395ad3262231945c25e8478fd5baf05154b1d79f" # v6.1.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 }}
+13 -13
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@8e8c483db84b4bee98b60c0593521ed34d9990e8" # v6.0.1
- name: 'Use Node.js' - name: "Setup Node.js"
uses: 'actions/setup-node@v2.5.1' uses: "actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f" # v6.1.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"
+2
View File
@@ -4,6 +4,7 @@ node_modules
# testing # testing
coverage coverage
.nyc_output
# debug # debug
npm-debug.log* npm-debug.log*
@@ -26,3 +27,4 @@ npm-debug.log*
# misc # misc
.DS_Store .DS_Store
*.bak
-4
View File
@@ -1,4 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npm run lint:commit -- --edit
-5
View File
@@ -1,5 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npm run lint:staged
npm run test
-6
View File
@@ -1,6 +0,0 @@
{
"*": ["editorconfig-checker"],
"*.{js,jsx,ts,tsx}": ["prettier --write", "eslint --fix"],
"*.{json,jsonc,yml,yaml}": ["prettier --write"],
"*.{md,mdx}": ["prettier --write", "markdownlint --dot --fix"]
}
-6
View File
@@ -1,6 +0,0 @@
{
"default": true,
"MD013": false,
"MD033": false,
"MD041": false
}
+1
View File
@@ -1 +1,2 @@
save-exact = true save-exact = true
provenance = true
+276
View File
@@ -0,0 +1,276 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": [
"eslint",
"typescript",
"unicorn",
"react",
"oxc",
"import",
"promise"
],
"categories": {
"correctness": "error",
"suspicious": "error",
"pedantic": "error",
"perf": "error"
},
"env": {
"builtin": true,
"browser": true,
"node": true,
"shared-node-browser": true
},
"rules": {
"no-await-in-loop": "off",
"no-loop-func": "off",
"no-negated-condition": "off",
"no-inline-comments": "off",
"max-lines": "off",
"max-depth": "off",
"max-classes-per-file": "off",
"max-lines-per-function": "off",
"require-await": "off",
"no-lonely-if": "off",
"array-callback-return": "off",
"no-shadow": "off",
"no-throw-literal": "off",
"consistent-return": "off",
"getter-return": "error",
"no-undef": "error",
"no-unreachable": "error",
"use-isnan": [
"error",
{
"enforceForSwitchCase": true,
"enforceForIndexOf": true
}
],
"valid-typeof": [
"error",
{
"requireStringLiterals": true
}
],
"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-implicit-coercion": "error",
"no-extra-boolean-cast": [
"error",
{
"enforceForInnerExpressions": true
}
],
"no-empty": [
"error",
{
"allowEmptyCatch": true
}
],
"no-multi-str": "error",
"no-new-func": "error",
"no-proto": "error",
"no-regex-spaces": "error",
"no-useless-computed-key": "error",
"no-else-return": [
"error",
{
"allowElseIf": false
}
],
"no-var": "error",
"no-void": [
"error",
{
"allowAsStatement": true
}
],
"prefer-const": [
"error",
{
"destructuring": "all"
}
],
"prefer-object-has-own": "error",
"yoda": "error",
"curly": "error",
"func-style": "error",
"arrow-body-style": ["error", "always"],
"object-shorthand": ["error", "properties"],
"promise/param-names": "error",
"promise/no-nesting": "error",
"unicorn/catch-error-name": "error",
"unicorn/consistent-date-clone": "error",
"unicorn/error-message": "error",
"unicorn/no-array-for-each": "error",
"unicorn/no-array-method-this-argument": "error",
"unicorn/no-document-cookie": "error",
"unicorn/no-zero-fractions": "error",
"unicorn/number-literal-case": "error",
"unicorn/prefer-node-protocol": "error",
"unicorn/throw-new-error": "error",
"unicorn/require-array-join-separator": "error",
"unicorn/prefer-number-properties": "error",
"unicorn/prefer-modern-math-apis": "error",
"unicorn/prefer-structured-clone": "error",
"unicorn/consistent-existence-index-check": "error",
"unicorn/no-array-reverse": "off",
"unicorn/no-array-sort": "off",
"unicorn/no-lonely-if": "off",
"unicorn/prefer-string-replace-all": "off",
"unicorn/prefer-at": "off",
"unicorn/prefer-query-selector": "off",
"unicorn/prefer-top-level-await": "off",
"unicorn/prefer-string-slice": "off",
"unicorn/no-immediate-mutation": "off",
"unicorn/no-useless-undefined": "off",
"unicorn/no-object-as-default-parameter": "off",
"react/no-array-index-key": "off",
"react/no-unknown-property": "off",
"react/react-in-jsx-scope": "off",
"react/iframe-missing-sandbox": "off",
"react/self-closing-comp": "error",
"react/jsx-boolean-value": "error",
"react/jsx-no-target-blank": "off",
"react/jsx-no-useless-fragment": "off",
"import/no-webpack-loader-syntax": "error",
"import/export": "error",
"import/no-duplicates": "error",
"import/no-named-default": "error",
"import/no-anonymous-default-export": "error",
"import/consistent-type-specifier-style": "error",
"import/no-unassigned-import": "off",
"import/no-named-as-default-member": "off",
"import/max-dependencies": "off",
"typescript/ban-types": "off",
"typescript/no-unnecessary-type-arguments": "off",
"typescript/no-unsafe-type-assertion": "off",
"typescript/no-unsafe-member-access": "off",
"typescript/no-confusing-void-expression": "off",
"typescript/no-unsafe-assignment": "off",
"typescript/no-misused-promises": "off",
"typescript/return-await": ["error", "always"],
"typescript/require-await": "off",
"typescript/switch-exhaustiveness-check": "off",
"typescript/ban-ts-comment": "off",
"no-unused-vars": [
"error",
{
"args": "all",
"argsIgnorePattern": "^_",
"caughtErrors": "all",
"caughtErrorsIgnorePattern": "^_",
"destructuredArrayIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"ignoreRestSiblings": true
}
],
"no-use-before-define": [
"error",
{
"functions": false,
"classes": false,
"enums": false,
"variables": false,
"typedefs": false
}
],
"no-redeclare": [
"error",
{
"builtinGlobals": false
}
],
"typescript/only-throw-error": "off",
"no-unused-expressions": [
"error",
{
"allowShortCircuit": true,
"allowTernary": true,
"allowTaggedTemplates": true
}
],
"typescript/adjacent-overload-signatures": "error",
"typescript/consistent-type-definitions": "error",
"typescript/consistent-type-imports": "error",
"typescript/explicit-function-return-type": [
"error",
{
"allowExpressions": true,
"allowHigherOrderFunctions": true,
"allowTypedFunctionExpressions": true,
"allowDirectConstAssertionInArrowFunctions": true
}
],
"typescript/no-extraneous-class": [
"error",
{
"allowWithDecorator": true
}
],
"typescript/no-floating-promises": [
"error",
{
"allowForKnownSafeCalls": [
{
"from": "package",
"name": ["test", "it", "suite", "describe"],
"package": "node:test"
}
]
}
],
"typescript/no-non-null-assertion": "error",
"typescript/no-this-alias": "error",
"typescript/no-require-imports": "error",
"typescript/prefer-function-type": "error",
"typescript/prefer-find": "error",
"typescript/prefer-nullish-coalescing": "off",
"typescript/prefer-readonly": "error",
"typescript/prefer-reduce-type-parameter": "error",
"typescript/prefer-return-this-type": "error",
"typescript/promise-function-async": "error",
"typescript/require-array-sort-compare": "error",
"typescript/restrict-plus-operands": [
"error",
{
"skipCompoundAssignments": true
}
],
"typescript/restrict-template-expressions": "error",
"typescript/strict-boolean-expressions": [
"error",
{
"allowString": false,
"allowNumber": false,
"allowNullableObject": false,
"allowNullableBoolean": false,
"allowNullableString": false,
"allowNullableNumber": false,
"allowAny": false
}
]
}
}
+1 -4
View File
@@ -1,6 +1,3 @@
{ {
"singleQuote": true, "semi": false
"jsxSingleQuote": true,
"semi": false,
"trailingComma": "none"
} }
+1 -11
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"
] ]
-8
View File
@@ -1,8 +0,0 @@
{
"recommendations": [
"editorconfig.editorconfig",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"davidanson.vscode-markdownlint"
]
}
-10
View File
@@ -1,10 +0,0 @@
{
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.preferences.importModuleSpecifierEnding": "js",
"editor.defaultFormatter": "esbenp.prettier-vscode",
"prettier.configPath": ".prettierrc.json",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": true
}
}
+1 -1
View File
@@ -60,7 +60,7 @@ representative at an online or offline event.
Instances of abusive, harassing, or otherwise unacceptable behavior may be Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at reported to the community leaders responsible for enforcement at
contact@divlo.fr. <contact@theoludwig.fr>.
All complaints will be reviewed and investigated promptly and fairly. All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the All community leaders are obligated to respect the privacy and security of the
+12 -26
View File
@@ -1,6 +1,14 @@
# 💡 Contributing # Contributing
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
@@ -11,7 +19,7 @@ Thanks a lot for your interest in contributing to **eslint-config-conventions**!
## Pull Requests ## Pull Requests
- **Please first discuss** the change you wish to make via [issue](https://github.com/Divlo/eslint-config-conventions/issues) before making a change. It might avoid a waste of your time. - **Please first discuss** the change you wish to make via [issue](https://github.com/theoludwig/eslint-config-conventions/issues) before making a change. It might avoid a waste of your time.
- Ensure your code respect linting. - Ensure your code respect linting.
@@ -21,26 +29,4 @@ If you're adding new features to **eslint-config-conventions**, please include t
## Commits ## Commits
The commit message guidelines respect [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional) and [Semantic Versioning](https://semver.org/) for releases. The commit message guidelines adheres to [Conventional Commits](https://www.conventionalcommits.org/) and [Semantic Versioning](https://semver.org/) for releases.
### Types
Types define which kind of changes you made to the project.
| Types | Description |
| -------- | ------------------------------------------------------------------------------------------------------------ |
| feat | A new feature. |
| fix | A bug fix. |
| docs | Documentation only changes. |
| style | Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc). |
| refactor | A code change that neither fixes a bug nor adds a feature. |
| perf | A code change that improves performance. |
| test | Adding missing tests or correcting existing tests. |
| build | Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm). |
| ci | Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs). |
| chore | Other changes that don't modify src or test files. |
| revert | Reverts a previous commit. |
### Scopes
Scopes define what part of the code changed.
+2 -2
View File
@@ -1,6 +1,6 @@
MIT License # MIT License
Copyright (c) Divlo Copyright (c) Théo LUDWIG <contact@theoludwig.fr>
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
+67 -54
View File
@@ -4,102 +4,100 @@
<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>
<a href="https://www.npmjs.com/package/eslint-config-conventions"><img src="https://img.shields.io/npm/v/eslint-config-conventions.svg" alt="npm version"></a> <a href="https://www.npmjs.com/package/eslint-config-conventions"><img src="https://img.shields.io/npm/v/eslint-config-conventions.svg" alt="npm version"></a>
</p> </p>
## 📜 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).
## ⚙️ Getting Started ## Getting Started
### 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.22.0 \
eslint-plugin-import@^2.25.4 \ eslint-plugin-promise@^7.2.1 \
eslint-plugin-promise@^6.0.0 \ eslint-plugin-unicorn@^63.0.0 \
eslint-plugin-unicorn@^41.0.0 \ eslint-plugin-import-x@^4.6.1 \
typescript@^4.4.0 \ globals@^17.0.0 \
@typescript-eslint/eslint-plugin@^5.12.0 \ typescript@^5.9.3 \
typescript-eslint@^8.32.0 \
eslint-config-conventions@latest eslint-config-conventions@latest
``` ```
Yes, this is a large number of packages. This is due to [a known limitation in ESLint](https://github.com/eslint/eslint/issues/3458). Dependencies are:
This list of dependencies are:
- [ESLint](https://github.com/eslint/eslint) - [ESLint](https://github.com/eslint/eslint)
- 3 [ESLint Plugins](https://eslint.org/docs/user-guide/configuring/plugins) - [ESLint Plugins](https://eslint.org/docs/user-guide/configuring/plugins)
- [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import)
- [eslint-plugin-promise](https://github.com/xjamundx/eslint-plugin-promise) - [eslint-plugin-promise](https://github.com/xjamundx/eslint-plugin-promise)
- [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) - [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn)
- [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 { defineConfig } from "eslint/config"
import configConventions from "eslint-config-conventions"
export default defineConfig(...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,20 +105,35 @@ 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 ### `.oxlintrc.json` (if using [oxlint](https://oxc.rs/))
```json
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"extends": ["node_modules/eslint-config-conventions/.oxlintrc.json"],
"options": {
"typeAware": true,
"typeCheck": true,
"denyWarnings": true,
"reportUnusedDisableDirectives": "error"
}
}
```
## Contributing
Anyone can help to improve the project, submit a Feature Request, a bug report or even correct a simple spelling mistake. Anyone can help to improve the project, submit a Feature Request, a bug report or even correct a simple spelling mistake.
The steps to contribute can be found in the [CONTRIBUTING.md](./CONTRIBUTING.md) file. The steps to contribute can be found in the [CONTRIBUTING.md](./CONTRIBUTING.md) file.
## 📄 License ## License
[MIT](./LICENSE) [MIT](./LICENSE)
+479
View File
@@ -0,0 +1,479 @@
import importXPlugin from "eslint-plugin-import-x"
import promise from "eslint-plugin-promise"
import unicorn from "eslint-plugin-unicorn"
import { defineConfig } from "eslint/config"
import globals from "globals"
import typescriptESLint from "typescript-eslint"
export default defineConfig(
{
name: "eslint-config-conventions",
plugins: {
promise,
unicorn,
"import-x": importXPlugin,
},
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": "off",
"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",
"unicorn/no-unnecessary-array-flat-depth": "error",
"unicorn/consistent-assert": "error",
"unicorn/no-accessor-recursion": "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": "off",
"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-extra-non-null-assertion": "error",
"@typescript-eslint/no-redundant-type-constituents": "off",
"@typescript-eslint/no-extraneous-class": [
"error",
{
allowWithDecorator: true,
},
],
"@typescript-eslint/no-floating-promises": [
"error",
{
allowForKnownSafeCalls: [
{
from: "package",
name: ["test", "it", "suite", "describe"],
package: "node:test",
},
],
},
],
"@typescript-eslint/no-for-in-array": "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": "off",
"@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
View File
@@ -0,0 +1,6 @@
import { defineConfig } from "eslint/config"
import configConventions from "./eslint.config.js"
export default defineConfig(...configConventions, {
ignores: ["test/fixtures/*"],
})
Vendored
+5
View File
@@ -0,0 +1,5 @@
import type { defineConfig } from "eslint/config"
declare const eslintConfig: ReturnType<typeof defineConfig>
export default eslintConfig
-1
View File
@@ -1 +0,0 @@
module.exports = require('./.eslintrc.json')
+5518 -13100
View File
File diff suppressed because it is too large Load Diff
+62 -42
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,71 @@
"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",
".oxlintrc.json"
],
"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\"", "oxlint:migrate": "npx @oxlint/migrate@latest eslint.config.js --type-aware --details --with-nursery",
"lint:staged": "lint-staged", "inspect": "eslint --inspect-config",
"test": "tape \"test/**/*.js\"", "test": "node --test",
"release": "semantic-release", "release": "semantic-release"
"postinstall": "husky install",
"prepublishOnly": "pinst --disable",
"postpublish": "pinst --enable"
}, },
"peerDependencies": { "peerDependencies": {
"eslint": "^8.9.0", "eslint": "^9.22.0",
"eslint-plugin-import": "^2.25.4", "eslint-plugin-promise": "^7.2.1",
"eslint-plugin-promise": "^6.0.0", "eslint-plugin-unicorn": "^61.0.0 || ^62.0.0 || ^63.0.0 || ^64.0.0",
"eslint-plugin-unicorn": "^41.0.0", "eslint-plugin-import-x": "^4.6.1",
"typescript": "^4.4.0", "globals": "^16.0.0 || ^17.0.0",
"@typescript-eslint/eslint-plugin": "^5.12.0" "typescript-eslint": "^8.32.0"
},
"peerDependenciesMeta": {
"eslint": {
"optional": true
},
"eslint-plugin-promise": {
"optional": true
},
"eslint-plugin-unicorn": {
"optional": true
},
"eslint-plugin-import-x": {
"optional": true
},
"globals": {
"optional": true
},
"typescript-eslint": {
"optional": true
}
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "16.2.1", "@types/node": "25.5.2",
"@commitlint/config-conventional": "16.2.1", "globals": "17.4.0",
"editorconfig-checker": "4.0.2", "editorconfig-checker": "6.1.1",
"eslint": "8.9.0", "oxlint": "1.59.0",
"@types/eslint": "8.4.1", "@oxlint/migrate": "1.58.0",
"eslint-plugin-import": "2.25.4", "eslint": "9.39.4",
"eslint-plugin-promise": "6.0.0", "eslint-plugin-promise": "7.2.1",
"eslint-plugin-unicorn": "41.0.0", "eslint-plugin-unicorn": "64.0.0",
"typescript": "4.5.5", "eslint-plugin-import-x": "4.16.2",
"@typescript-eslint/parser": "5.12.0", "typescript-eslint": "8.58.0",
"@typescript-eslint/eslint-plugin": "5.12.0", "prettier": "3.8.1",
"tape": "5.5.2", "semantic-release": "25.0.3",
"husky": "7.0.4", "typescript": "6.0.2"
"lint-staged": "12.3.4",
"markdownlint-cli": "0.31.1",
"@types/tape": "4.13.2",
"pinst": "2.1.6",
"prettier": "2.5.1",
"semantic-release": "19.0.2"
} }
} }
-15
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
}
+1 -1
View File
@@ -1 +1 @@
'invalid eqeqeq' == 'invalid eqeqeq' "invalid eqeqeq" == "invalid eqeqeq"
+1 -1
View File
@@ -1,3 +1,3 @@
const foo = await 1 const foo = await 1
const bar = function () {} const bar = () => {}
await bar(foo) await bar(foo)
+3
View File
@@ -0,0 +1,3 @@
const returnsPromise = async (): Promise<void> => {}
void returnsPromise()
-37
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()
})
+87
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),
)
})
})
+3 -4
View File
@@ -1,12 +1,11 @@
{ {
"compilerOptions": { "compilerOptions": {
"resolveJsonModule": true,
"strict": true,
"target": "ESNext", "target": "ESNext",
"module": "commonjs", "module": "commonjs",
"lib": ["ESNext"], "lib": ["ESNext"],
"moduleResolution": "node", "moduleResolution": "node",
"rootDir": "./", "rootDir": "./"
"strict": true,
"skipLibCheck": true,
"esModuleInterop": true
} }
} }