From 638529fc57f80899068c692aeabe113245e533a2 Mon Sep 17 00:00:00 2001 From: gcch Date: Mon, 30 Mar 2026 15:50:50 +0200 Subject: [PATCH] =?UTF-8?q?en=20cours:=20r=C3=A8gles=20ESLint/Oxlint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - eslint --- dist/index.mjs | 225 +++++++++++++++++++++++++------------ index.ts | 12 +- justfile | 26 +++-- rules/eslint.ts | 266 +++++++++++++++++++++++++++++++++----------- rules/old-eslint.ts | 87 +++++++++++++++ 5 files changed, 461 insertions(+), 155 deletions(-) create mode 100644 rules/old-eslint.ts diff --git a/dist/index.mjs b/dist/index.mjs index ed323c0..8f66209 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -82,71 +82,156 @@ const functionalRules = { //#endregion //#region ../rules/eslint.ts const esLintRules = { - "array-callback-return": [ - "error", + "eslint/accessor-pairs": ["deny", { enforceForTSTypes: true }], + "eslint/array-callback-return": ["deny", { checkForEach: true }], + "eslint/arrow-body-style": ["deny", "as-needed", { requireReturnForObjectLiteral: false }], + "eslint/block-scoped-var": "deny", + "eslint/capitalized-comments": [ + "deny", + "always", { - allowVoid: true, - checkForEach: true, + block: { ignoreConsecutiveComments: true }, + line: { ignoreConsecutiveComments: true }, }, ], - "for-direction": "error", - "max-params": ["error", { max: 3 }], - "no-array-constructor": "error", - "no-async-promise-executor": "error", - "no-case-declarations": "error", - "no-compare-neg-zero": "error", - "no-cond-assign": "error", - "no-constant-binary-expression": "error", - "no-constant-condition": "error", - "no-control-regex": "error", - "no-debugger": "error", - "no-delete-var": "error", - "no-dupe-else-if": "error", - "no-duplicate-case": "error", - "no-duplicate-imports": ["error", { allowSeparateTypeImports: true }], - "no-empty": "error", - "no-empty-character-class": "error", - "no-empty-function": "error", - "no-empty-pattern": "error", - "no-empty-static-block": "error", - "no-ex-assign": "error", - "no-extra-boolean-cast": "error", - "no-fallthrough": "error", - "no-global-assign": "error", - "no-invalid-regexp": "error", - "no-irregular-whitespace": "error", - "no-loss-of-precision": "error", - "no-misleading-character-class": "error", - "no-nonoctal-decimal-escape": "error", - "no-param-reassign": "error", - "no-prototype-builtins": "error", - "no-regex-spaces": "error", - "no-self-assign": "error", - "no-shadow-restricted-names": "error", - "no-sparse-arrays": "error", - "no-unassigned-vars": "error", - "no-unexpected-multiline": "error", - "no-unneeded-ternary": ["error", { defaultAssignment: false }], - "no-unsafe-finally": "error", - "no-unsafe-optional-chaining": "error", - "no-unused-expressions": "error", - "no-unused-labels": "error", - "no-unused-private-class-members": "error", - "no-unused-vars": "error", - "no-useless-backreference": "error", - "no-useless-catch": "error", - "no-useless-constructor": "error", - "no-useless-escape": "error", - "no-var": "error", - "prefer-const": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - "preserve-caught-error": "error", - "require-yield": "error", - "sort-imports": "off", - "use-isnan": "error", - "valid-typeof": "error", - yoda: ["error", "never"], + "eslint/constructor-super": "deny", + "eslint/curly": ["deny", "all"], + "eslint/default-case": "deny", + "eslint/default-case-last": "deny", + "eslint/default-param-last": "deny", + "eslint/eqeqeq": "deny", + "eslint/for-direction": "deny", + "eslint/func-names": "allow", + "eslint/func-style": ["deny", "expression", { allowArrowFunctions: true }], + "eslint/getter-return": "deny", + "eslint/grouped-accessor-pairs": ["deny", "setBeforeGet", { enforceForTSTypes: true }], + "eslint/guard-for-in": "deny", + "eslint/id-length": "deny", + "eslint/init-declarations": ["deny", "always"], + "eslint/new-cap": [ + "deny", + { + capIsNew: false, + newIsCap: true, + properties: true, + }, + ], + "eslint/no-alert": "deny", + "eslint/no-array-constructor": "deny", + "eslint/no-async-promise-executor": "deny", + "eslint/no-await-in-loop": "deny", + "eslint/no-bitwise": "deny", + "eslint/no-caller": "deny", + "eslint/no-case-declarations": "deny", + "eslint/no-class-assign": "deny", + "eslint/no-compare-neg-zero": "deny", + "eslint/no-cond-assign": "deny", + "eslint/no-console": "allow", + "eslint/no-const-assign": "deny", + "eslint/no-constant-binary-expression": "deny", + "eslint/no-constant-condition": ["deny", { checkLoops: "allExceptWhileTrue" }], + "eslint/no-constructor-return": "deny", + "eslint/no-continue": "allow", + "eslint/no-control-regex": "deny", + "eslint/no-debugger": "deny", + "eslint/no-delete-var": "deny", + "eslint/no-div-regex": "allow", + "eslint/no-dupe-class-members": "deny", + "eslint/no-dupe-else-if": "deny", + "eslint/no-dupe-keys": "deny", + "eslint/no-duplicate-case": "deny", + "eslint/no-duplicate-imports": [ + "deny", + { + allowSeparateTypeImports: true, + includeExports: false, + }, + ], + "eslint/no-else-return": "allow", + "eslint/no-empty": ["deny", { allowEmptyCatch: false }], + "eslint/no-empty-character-class": "deny", + "eslint/no-empty-function": ["deny", { allow: [] }], + "eslint/no-empty-pattern": "deny", + "eslint/no-empty-static-block": "deny", + "eslint/no-eq-null": "deny", + "eslint/no-eval": "deny", + "eslint/no-ex-assign": "deny", + "eslint/no-extend-native": "deny", + "eslint/no-extra-bind": "deny", + "eslint/no-extra-boolean-cast": ["deny", { enforceForInnerExpressions: true }], + "eslint/no-extra-label": "deny", + "eslint/no-fallthrough": [ + "deny", + { + allowEmptyCase: false, + reportUnusedFallthroughComment: true, + }, + ], + "eslint/no-func-assign": "deny", + "eslint/no-global-assign": "deny", + "eslint/no-implicit-coercion": [ + "deny", + { + allow: [], + boolean: true, + disallowTemplateShorthand: false, + number: true, + string: true, + }, + ], + "eslint/no-import-assign": "deny", + "eslint/no-inline-comments": "deny", + "eslint/no-inner-declarations": ["deny", "both", "disallow"], + "eslint/no-invalid-regexp": "deny", + "eslint/no-irregular-whitespace": "deny", + "eslint/no-iterator": "deny", + "eslint/no-label-var": "deny", + "eslint/no-labels": "deny", + "eslint/no-lone-blocks": "deny", + "eslint/no-lonely-if": "deny", + "eslint/no-loop-func": "deny", + "eslint/no-loss-of-precision": "deny", + "eslint/no-magic-numbers": [ + "warn", + { + detectObjects: true, + enforceConst: true, + ignoreEnums: true, + ignoreNumericLiteralTypes: true, + ignoreTypeIndexes: true, + }, + ], + "eslint/no-misleading-character-class": "deny", + "eslint/no-multi-assign": "deny", + "eslint/no-multi-str": "deny", + "eslint/no-negated-condition": "deny", + "eslint/no-nested-ternary": "deny", + "eslint/no-new": "deny", + "eslint/no-new-func": "deny", + "eslint/no-new-native-nonconstructor": "deny", + "eslint/no-new-wrappers": "deny", + "eslint/no-nonoctal-decimal-escape": "deny", + "eslint/no-obj-calls": "deny", + "eslint/no-object-constructor": "deny", + "eslint/no-param-reassign": [ + "deny", + { + ignorePropertyModificationsFor: [], + props: true, + }, + ], + "eslint/no-plusplus": "deny", + "eslint/no-promise-executor-return": "deny", + "eslint/no-proto": "deny", + "eslint/no-prototype-builtins": "deny", + "eslint/no-redeclare": ["deny", { builtinGlobals: true }], + "eslint/no-regex-spaces": "deny", + "eslint/no-return-assign": ["deny", "always"], + "eslint/no-script-url": "deny", + "eslint/no-self-assign": ["deny", { props: true }], + "eslint/no-self-compare": "deny", + "eslint/no-sequences": ["deny", { allowInParentheses: false }], + "eslint/no-setter-return": "deny", }; //#endregion @@ -752,7 +837,7 @@ const unicornRules = { "unicorn/prefer-string-starts-ends-with": "error", "unicorn/prefer-string-trim-start-end": "error", "unicorn/prefer-structured-clone": "error", - "unicorn/prefer-ternary": "error", + "unicorn/prefer-ternary": "off", "unicorn/prefer-top-level-await": "error", "unicorn/prefer-type-error": "error", "unicorn/relative-url-style": "error", @@ -768,12 +853,12 @@ const unicornRules = { //#region ../index.ts const config = defineConfig({ categories: { - correctness: "warn", - nursery: "warn", - pedantic: "warn", - perf: "error", - style: "error", - suspicious: "error", + correctness: "off", + nursery: "off", + pedantic: "off", + perf: "off", + style: "off", + suspicious: "off", }, env: { browser: true, @@ -781,7 +866,7 @@ const config = defineConfig({ es2026: true, node: true, }, - ignorePatterns: ["dist/**/*"], + ignorePatterns: [".astro", ".cache", "dist/**/*"], jsPlugins: ["eslint-plugin-functional", "eslint-plugin-perfectionist", "eslint-plugin-sonarjs"], options: { reportUnusedDisableDirectives: "warn", diff --git a/index.ts b/index.ts index 7bc9a60..cf0b2fe 100644 --- a/index.ts +++ b/index.ts @@ -11,12 +11,12 @@ import unicornRules from "./rules/unicorn"; const config: OxlintConfig = defineConfig({ categories: { - correctness: "warn", - nursery: "warn", - pedantic: "warn", - perf: "error", - style: "error", - suspicious: "error", + correctness: "off", + nursery: "off", + pedantic: "off", + perf: "off", + style: "off", + suspicious: "off", }, env: { browser: true, diff --git a/justfile b/justfile index 29dd6c8..5fe63b9 100644 --- a/justfile +++ b/justfile @@ -15,16 +15,26 @@ format: update: bun update --interactive -# Analyse le code TypeScript avec Oxlint. +# Reporte les soucis du code TypeScript avec Oxlint. lint-js: + bun --bun oxlint \ + --config cfg/oxlint.config.ts + +# Fixe le code TypeScript avec Oxlint. +fix-js: bun --bun oxlint \ --config cfg/oxlint.config.ts \ --fix-dangerously # Analyse le code mort et les dépendances inutilisées du projet. find-dead-code: - -bun --bun knip --cache --cache-location ".cache/knipcache" --strict - -bun --bun knip --cache --cache-location ".cache/knipcache" --production --strict + -bun --bun knip \ + --cache --cache-location ".cache/knipcache" \ + --strict + -bun --bun knip \ + --cache --cache-location ".cache/knipcache" \ + --production \ + --strict # Compile le projet. build: @@ -32,17 +42,9 @@ build: --config "cfg/tsdown.config.ts" \ --attw --publint -# Nettoie le dosiser de compilation. +# Nettoie le dossier de compilation. clean: rm -rf .cache/ rm -rf bun.lock rm -rf node_modules/ rm -rfv dist/ - -# Nettoie le dossier de cache. -clean-cache: - rm -rf .cache/ - -# Publie le paquet sur le registre local. -publish: - npm publish --registry http://localhost:4873 diff --git a/rules/eslint.ts b/rules/eslint.ts index 672d087..4a700bc 100644 --- a/rules/eslint.ts +++ b/rules/eslint.ts @@ -1,87 +1,219 @@ import type { DummyRuleMap } from "oxlint"; const esLintRules: DummyRuleMap = { - "array-callback-return": [ - "error", + "eslint/accessor-pairs": ["deny", { enforceForTSTypes: true }], + "eslint/array-callback-return": [ + "deny", { - allowVoid: true, checkForEach: true, }, ], - "for-direction": "error", - "max-params": [ - "error", + "eslint/arrow-body-style": [ + "deny", + "as-needed", { - max: 3, + requireReturnForObjectLiteral: false, }, ], - "no-array-constructor": "error", - "no-async-promise-executor": "error", - "no-case-declarations": "error", - "no-compare-neg-zero": "error", - "no-cond-assign": "error", - "no-constant-binary-expression": "error", - "no-constant-condition": "error", - "no-control-regex": "error", - "no-debugger": "error", - "no-delete-var": "error", - "no-dupe-else-if": "error", - "no-duplicate-case": "error", - "no-duplicate-imports": [ - "error", + "eslint/block-scoped-var": "deny", + "eslint/capitalized-comments": [ + "deny", + "always", + { + block: { + ignoreConsecutiveComments: true, + }, + line: { + ignoreConsecutiveComments: true, + }, + }, + ], + "eslint/constructor-super": "deny", + "eslint/curly": ["deny", "all"], + "eslint/default-case": "deny", + "eslint/default-case-last": "deny", + "eslint/default-param-last": "deny", + "eslint/eqeqeq": "deny", + "eslint/for-direction": "deny", + "eslint/func-names": "allow", + "eslint/func-style": [ + "deny", + "expression", + { + allowArrowFunctions: true, + }, + ], + "eslint/getter-return": "deny", + "eslint/grouped-accessor-pairs": [ + "deny", + "setBeforeGet", + { + enforceForTSTypes: true, + }, + ], + "eslint/guard-for-in": "deny", + "eslint/id-length": "deny", + "eslint/init-declarations": ["deny", "always"], + "eslint/new-cap": [ + "deny", + { + capIsNew: false, + newIsCap: true, + properties: true, + }, + ], + "eslint/no-alert": "deny", + "eslint/no-array-constructor": "deny", + "eslint/no-async-promise-executor": "deny", + "eslint/no-await-in-loop": "deny", + "eslint/no-bitwise": "deny", + "eslint/no-caller": "deny", + "eslint/no-case-declarations": "deny", + "eslint/no-class-assign": "deny", + "eslint/no-compare-neg-zero": "deny", + "eslint/no-cond-assign": "deny", + "eslint/no-console": "allow", + "eslint/no-const-assign": "deny", + "eslint/no-constant-binary-expression": "deny", + "eslint/no-constant-condition": [ + "deny", + { + checkLoops: "allExceptWhileTrue", + }, + ], + "eslint/no-constructor-return": "deny", + "eslint/no-continue": "allow", + "eslint/no-control-regex": "deny", + "eslint/no-debugger": "deny", + "eslint/no-delete-var": "deny", + "eslint/no-div-regex": "allow", + "eslint/no-dupe-class-members": "deny", + "eslint/no-dupe-else-if": "deny", + "eslint/no-dupe-keys": "deny", + "eslint/no-duplicate-case": "deny", + "eslint/no-duplicate-imports": [ + "deny", { allowSeparateTypeImports: true, + includeExports: false, }, ], - "no-empty": "error", - "no-empty-character-class": "error", - "no-empty-function": "error", - "no-empty-pattern": "error", - "no-empty-static-block": "error", - "no-ex-assign": "error", - "no-extra-boolean-cast": "error", - "no-fallthrough": "error", - "no-global-assign": "error", - "no-invalid-regexp": "error", - "no-irregular-whitespace": "error", - "no-loss-of-precision": "error", - "no-misleading-character-class": "error", - "no-nonoctal-decimal-escape": "error", - "no-param-reassign": "error", - "no-prototype-builtins": "error", - "no-regex-spaces": "error", - "no-self-assign": "error", - "no-shadow-restricted-names": "error", - "no-sparse-arrays": "error", - "no-unassigned-vars": "error", - "no-unexpected-multiline": "error", - "no-unneeded-ternary": [ - "error", + "eslint/no-else-return": "allow", + "eslint/no-empty": [ + "deny", { - defaultAssignment: false, + allowEmptyCatch: false, }, ], - "no-unsafe-finally": "error", - "no-unsafe-optional-chaining": "error", - "no-unused-expressions": "error", - "no-unused-labels": "error", - "no-unused-private-class-members": "error", - "no-unused-vars": "error", - "no-useless-backreference": "error", - "no-useless-catch": "error", - "no-useless-constructor": "error", - "no-useless-escape": "error", - "no-var": "error", - "prefer-const": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - "preserve-caught-error": "error", - "require-yield": "error", - // Rentre en conflit avec perfectionnist. - "sort-imports": "off", - "use-isnan": "error", - "valid-typeof": "error", - yoda: ["error", "never"], + "eslint/no-empty-character-class": "deny", + "eslint/no-empty-function": [ + "deny", + { + allow: [], + }, + ], + "eslint/no-empty-pattern": "deny", + "eslint/no-empty-static-block": "deny", + "eslint/no-eq-null": "deny", + "eslint/no-eval": "deny", + "eslint/no-ex-assign": "deny", + "eslint/no-extend-native": "deny", + "eslint/no-extra-bind": "deny", + "eslint/no-extra-boolean-cast": [ + "deny", + { + enforceForInnerExpressions: true, + }, + ], + "eslint/no-extra-label": "deny", + "eslint/no-fallthrough": [ + "deny", + { + allowEmptyCase: false, + reportUnusedFallthroughComment: true, + }, + ], + "eslint/no-func-assign": "deny", + "eslint/no-global-assign": "deny", + "eslint/no-implicit-coercion": [ + "deny", + { + allow: [], + boolean: true, + disallowTemplateShorthand: false, + number: true, + string: true, + }, + ], + "eslint/no-import-assign": "deny", + "eslint/no-inline-comments": "deny", + "eslint/no-inner-declarations": ["deny", "both", "disallow"], + "eslint/no-invalid-regexp": "deny", + "eslint/no-irregular-whitespace": "deny", + "eslint/no-iterator": "deny", + "eslint/no-label-var": "deny", + "eslint/no-labels": "deny", + "eslint/no-lone-blocks": "deny", + "eslint/no-lonely-if": "deny", + "eslint/no-loop-func": "deny", + "eslint/no-loss-of-precision": "deny", + "eslint/no-magic-numbers": [ + "warn", + { + detectObjects: true, + enforceConst: true, + ignoreEnums: true, + ignoreNumericLiteralTypes: true, + ignoreTypeIndexes: true, + }, + ], + "eslint/no-misleading-character-class": "deny", + "eslint/no-multi-assign": "deny", + "eslint/no-multi-str": "deny", + "eslint/no-negated-condition": "deny", + "eslint/no-nested-ternary": "deny", + "eslint/no-new": "deny", + "eslint/no-new-func": "deny", + "eslint/no-new-native-nonconstructor": "deny", + "eslint/no-new-wrappers": "deny", + "eslint/no-nonoctal-decimal-escape": "deny", + "eslint/no-obj-calls": "deny", + "eslint/no-object-constructor": "deny", + "eslint/no-param-reassign": [ + "deny", + { + // Sera mis à jour avec les propriétés concernées (p. ex. modifications d'objets DOM). + ignorePropertyModificationsFor: [], + props: true, + }, + ], + "eslint/no-plusplus": "deny", + "eslint/no-promise-executor-return": "deny", + "eslint/no-proto": "deny", + "eslint/no-prototype-builtins": "deny", + "eslint/no-redeclare": [ + "deny", + { + builtinGlobals: true, + }, + ], + "eslint/no-regex-spaces": "deny", + "eslint/no-return-assign": ["deny", "always"], + "eslint/no-script-url": "deny", + "eslint/no-self-assign": [ + "deny", + { + props: true, + }, + ], + "eslint/no-self-compare": "deny", + "eslint/no-sequences": [ + "deny", + { + allowInParentheses: false, + }, + ], + "eslint/no-setter-return": "deny", }; export default esLintRules; diff --git a/rules/old-eslint.ts b/rules/old-eslint.ts new file mode 100644 index 0000000..672d087 --- /dev/null +++ b/rules/old-eslint.ts @@ -0,0 +1,87 @@ +import type { DummyRuleMap } from "oxlint"; + +const esLintRules: DummyRuleMap = { + "array-callback-return": [ + "error", + { + allowVoid: true, + checkForEach: true, + }, + ], + "for-direction": "error", + "max-params": [ + "error", + { + max: 3, + }, + ], + "no-array-constructor": "error", + "no-async-promise-executor": "error", + "no-case-declarations": "error", + "no-compare-neg-zero": "error", + "no-cond-assign": "error", + "no-constant-binary-expression": "error", + "no-constant-condition": "error", + "no-control-regex": "error", + "no-debugger": "error", + "no-delete-var": "error", + "no-dupe-else-if": "error", + "no-duplicate-case": "error", + "no-duplicate-imports": [ + "error", + { + allowSeparateTypeImports: true, + }, + ], + "no-empty": "error", + "no-empty-character-class": "error", + "no-empty-function": "error", + "no-empty-pattern": "error", + "no-empty-static-block": "error", + "no-ex-assign": "error", + "no-extra-boolean-cast": "error", + "no-fallthrough": "error", + "no-global-assign": "error", + "no-invalid-regexp": "error", + "no-irregular-whitespace": "error", + "no-loss-of-precision": "error", + "no-misleading-character-class": "error", + "no-nonoctal-decimal-escape": "error", + "no-param-reassign": "error", + "no-prototype-builtins": "error", + "no-regex-spaces": "error", + "no-self-assign": "error", + "no-shadow-restricted-names": "error", + "no-sparse-arrays": "error", + "no-unassigned-vars": "error", + "no-unexpected-multiline": "error", + "no-unneeded-ternary": [ + "error", + { + defaultAssignment: false, + }, + ], + "no-unsafe-finally": "error", + "no-unsafe-optional-chaining": "error", + "no-unused-expressions": "error", + "no-unused-labels": "error", + "no-unused-private-class-members": "error", + "no-unused-vars": "error", + "no-useless-backreference": "error", + "no-useless-catch": "error", + "no-useless-constructor": "error", + "no-useless-escape": "error", + "no-var": "error", + "prefer-const": "error", + "prefer-rest-params": "error", + "prefer-spread": "error", + "preserve-caught-error": "error", + "require-yield": "error", + // Rentre en conflit avec perfectionnist. + "sort-imports": "off", + "use-isnan": "error", + "valid-typeof": "error", + yoda: ["error", "never"], +}; + +export default esLintRules;