From cd1611941617c0cacaca49961a97f35d17d9657b Mon Sep 17 00:00:00 2001 From: gcch Date: Sat, 27 Sep 2025 11:24:04 +0200 Subject: [PATCH] 0.0.3 --- bun.lock | 15 +++++++++++++-- dist/index.d.ts | 2 +- dist/index.js | 2 +- eslint.config.ts | 44 ++++++++++++++++++++++++++++++++++++++++++-- index.ts | 47 ++++++++++++++++++++++++++++++++++++++++++++--- package.json | 13 ++++++------- 6 files changed, 107 insertions(+), 16 deletions(-) diff --git a/bun.lock b/bun.lock index 7845402..8b4451f 100644 --- a/bun.lock +++ b/bun.lock @@ -4,6 +4,8 @@ "": { "name": "configuration-eslint", "dependencies": { + "@eslint/js": "^9.36.0", + "eslint-plugin-functional": "^9.0.2", "eslint-plugin-perfectionist": "^4.15.0", "globals": "^16.4.0", "typescript-eslint": "^8.44.1", @@ -12,7 +14,6 @@ "@arethetypeswrong/core": "^0.18.2", "@gcch/configuration-eslint": "^0.0.1", "@gcch/configuration-prettier": "^1.0.6", - "eslint": "^9.36.0", "publint": "^0.3.13", "tsdown": "^0.15.4", "typescript": "^5.9.2", @@ -249,6 +250,8 @@ "deep-is": ["deep-is@0.1.4", "http://localhost:4873/deep-is/-/deep-is-0.1.4.tgz", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + "deepmerge-ts": ["deepmerge-ts@7.1.5", "http://localhost:4873/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", {}, "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw=="], + "defu": ["defu@6.1.4", "http://localhost:4873/defu/-/defu-6.1.4.tgz", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], "dequal": ["dequal@2.0.3", "http://localhost:4873/dequal/-/dequal-2.0.3.tgz", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], @@ -263,10 +266,12 @@ "empathic": ["empathic@2.0.0", "http://localhost:4873/empathic/-/empathic-2.0.0.tgz", {}, "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA=="], - "escape-string-regexp": ["escape-string-regexp@4.0.0", "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "escape-string-regexp": ["escape-string-regexp@5.0.0", "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "eslint": ["eslint@9.36.0", "http://localhost:4873/eslint/-/eslint-9.36.0.tgz", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.36.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ=="], + "eslint-plugin-functional": ["eslint-plugin-functional@9.0.2", "http://localhost:4873/eslint-plugin-functional/-/eslint-plugin-functional-9.0.2.tgz", { "dependencies": { "@typescript-eslint/utils": "^8.26.0", "deepmerge-ts": "^7.1.5", "escape-string-regexp": "^5.0.0", "is-immutable-type": "^5.0.1", "ts-api-utils": "^2.0.1", "ts-declaration-location": "^1.0.6" }, "peerDependencies": { "eslint": "^9.0.0", "typescript": ">=4.7.4" }, "optionalPeers": ["typescript"] }, "sha512-N8kP9HX1CJ2HrufPHLzsKNJ81O1IB25jw2mxOc1H1z3CamEu8MYTn9dOo/FPfQwsqHZVuf7wyDCBcL8r8H7N0w=="], + "eslint-plugin-perfectionist": ["eslint-plugin-perfectionist@4.15.0", "http://localhost:4873/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.15.0.tgz", { "dependencies": { "@typescript-eslint/types": "^8.34.1", "@typescript-eslint/utils": "^8.34.1", "natural-orderby": "^5.0.0" }, "peerDependencies": { "eslint": ">=8.45.0" } }, "sha512-pC7PgoXyDnEXe14xvRUhBII8A3zRgggKqJFx2a82fjrItDs1BSI7zdZnQtM2yQvcyod6/ujmzb7ejKPx8lZTnw=="], "eslint-scope": ["eslint-scope@8.4.0", "http://localhost:4873/eslint-scope/-/eslint-scope-8.4.0.tgz", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], @@ -355,6 +360,8 @@ "is-glob": ["is-glob@4.0.3", "http://localhost:4873/is-glob/-/is-glob-4.0.3.tgz", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-immutable-type": ["is-immutable-type@5.0.1", "http://localhost:4873/is-immutable-type/-/is-immutable-type-5.0.1.tgz", { "dependencies": { "@typescript-eslint/type-utils": "^8.0.0", "ts-api-utils": "^2.0.0", "ts-declaration-location": "^1.0.4" }, "peerDependencies": { "eslint": "*", "typescript": ">=4.7.4" } }, "sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg=="], + "is-number": ["is-number@7.0.0", "http://localhost:4873/is-number/-/is-number-7.0.0.tgz", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "isexe": ["isexe@2.0.0", "http://localhost:4873/isexe/-/isexe-2.0.0.tgz", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -581,6 +588,8 @@ "ts-api-utils": ["ts-api-utils@2.1.0", "http://localhost:4873/ts-api-utils/-/ts-api-utils-2.1.0.tgz", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + "ts-declaration-location": ["ts-declaration-location@1.0.7", "http://localhost:4873/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", { "dependencies": { "picomatch": "^4.0.2" }, "peerDependencies": { "typescript": ">=4.0.0" } }, "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA=="], + "tsdown": ["tsdown@0.15.4", "http://localhost:4873/tsdown/-/tsdown-0.15.4.tgz", { "dependencies": { "ansis": "^4.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.3", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.16.7", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-aoFE8disBg8BgYcOgradr/5Yd+QDBRQ+6z8mXo/Ib7+GIaJwJsI5l/ppve05CZGcSDqwdhF4gdrA0HPHBtbBqA=="], "tslib": ["tslib@2.8.1", "http://localhost:4873/tslib/-/tslib-2.8.1.tgz", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -639,6 +648,8 @@ "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "http://localhost:4873/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "eslint/escape-string-regexp": ["escape-string-regexp@4.0.0", "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "fast-glob/glob-parent": ["glob-parent@5.1.2", "http://localhost:4873/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "micromatch/picomatch": ["picomatch@2.3.1", "http://localhost:4873/picomatch/-/picomatch-2.3.1.tgz", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], diff --git a/dist/index.d.ts b/dist/index.d.ts index 91aa19b..095c368 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,6 +1,6 @@ import { Linter } from "eslint"; //#region index.d.ts -declare const configTypescriptNavigateur: Linter.Config[]; +declare const configTypescriptNavigateur: ReadonlyArray; //#endregion export { configTypescriptNavigateur }; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 68dc5a4..7e94a85 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1 +1 @@ -import{Linter as e}from"eslint";import t from"eslint-plugin-perfectionist";import{defineConfig as n}from"eslint/config";import r from"globals";import i from"typescript-eslint";const a=n(i.configs.strictTypeChecked,i.configs.stylisticTypeChecked,{languageOptions:{ecmaVersion:`latest`,globals:{...r.browser,...r.es2026},parserOptions:{ecmaVersion:`latest`,projectService:!0,sourceType:`module`,tsconfigRootDir:import.meta.dirname}}},t.configs[`recommended-natural`]);export{a as configTypescriptNavigateur}; \ No newline at end of file +import e from"@eslint/js";import{Linter as t}from"eslint";import n from"eslint-plugin-functional";import r from"eslint-plugin-perfectionist";import{defineConfig as i,globalIgnores as a}from"eslint/config";import o from"globals";import s from"typescript-eslint";const c=i([a([`dist/**/*`],`Ignore le Dossier de Compilation`),{files:[`**/*.js`,`**/*.ts`],name:`Fichiers à analyser`},e.configs.recommended,s.configs.strictTypeChecked,s.configs.stylisticTypeChecked,{languageOptions:{ecmaVersion:`latest`,globals:{...o.browser,...o.es2026},parserOptions:{ecmaVersion:`latest`,projectService:!0,sourceType:`module`,tsconfigRootDir:import.meta.dirname}},name:`Configuration du projet`},{name:`Programmation fonctionnelle`,plugins:{functional:n},rules:{...n.configs.noExceptions.rules,...n.configs.noMutations.rules,...n.configs.externalTypeScriptRecommended.rules,...n.configs.stylistic.rules,"@typescript-eslint/array-type":[`error`,{default:`generic`,readonly:`generic`}],"functional/prefer-immutable-types":[`error`,{enforcement:`ReadonlyShallow`}],"functional/readonly-type":[`error`,`generic`],"functional/type-declaration-immutability":[`error`,{ignoreInterfaces:!1,rules:[{comparator:`AtLeast`,fixer:!1,identifiers:`^(?!I?Mutable).+`,immutability:`ReadonlyShallow`,suggestions:!1}]}]}},r.configs[`recommended-natural`]]);export{c as configTypescriptNavigateur}; \ No newline at end of file diff --git a/eslint.config.ts b/eslint.config.ts index 418b21c..d81ce5f 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,10 +1,17 @@ +import javascriptEslint from "@eslint/js"; +import functional from "eslint-plugin-functional"; import perfectionist from "eslint-plugin-perfectionist"; import { defineConfig, globalIgnores } from "eslint/config"; import globals from "globals"; import typescriptEslint from "typescript-eslint"; -export default defineConfig( +export default defineConfig([ globalIgnores(["dist/**/*"], "Ignore le Dossier de Compilation"), + { + files: ["**/*.js", "**/*.ts"], + name: "Fichiers à analyser", + }, + javascriptEslint.configs.recommended, typescriptEslint.configs.strictTypeChecked, typescriptEslint.configs.stylisticTypeChecked, { @@ -18,6 +25,39 @@ export default defineConfig( tsconfigRootDir: import.meta.dirname, }, }, + name: "Configuration du projet", + }, + { + name: "Programmation fonctionnelle", + plugins: { functional: functional as typeof typescriptEslint.plugin }, + rules: { + ...functional.configs.noExceptions.rules, + ...functional.configs.noMutations.rules, + ...functional.configs.externalTypeScriptRecommended.rules, + ...functional.configs.stylistic.rules, + // Choix stylistique. + "@typescript-eslint/array-type": ["error", { default: "generic", readonly: "generic" }], + // L'imposition d'une immutabilité plus importante est extrêmement contraignante. + "functional/prefer-immutable-types": ["error", { enforcement: "ReadonlyShallow" }], + // Choix stylistique. + "functional/readonly-type": ["error", "generic"], + // L'imposition d'une immutabilité plus importante est extrêmement contraignante. + "functional/type-declaration-immutability": [ + "error", + { + ignoreInterfaces: false, + rules: [ + { + comparator: "AtLeast", + fixer: false, + identifiers: "^(?!I?Mutable).+", + immutability: "ReadonlyShallow", + suggestions: false, + }, + ], + }, + ], + }, }, perfectionist.configs["recommended-natural"], -); +]); diff --git a/index.ts b/index.ts index 4a5ef8f..ba93259 100644 --- a/index.ts +++ b/index.ts @@ -1,10 +1,18 @@ +import javascriptEslint from "@eslint/js"; import { Linter } from "eslint"; +import functional from "eslint-plugin-functional"; import perfectionist from "eslint-plugin-perfectionist"; -import { defineConfig } from "eslint/config"; +import { defineConfig, globalIgnores } from "eslint/config"; import globals from "globals"; import typescriptEslint from "typescript-eslint"; -export const configTypescriptNavigateur: Linter.Config[] = defineConfig( +export const configTypescriptNavigateur: ReadonlyArray = defineConfig([ + globalIgnores(["dist/**/*"], "Ignore le Dossier de Compilation"), + { + files: ["**/*.js", "**/*.ts"], + name: "Fichiers à analyser", + }, + javascriptEslint.configs.recommended, typescriptEslint.configs.strictTypeChecked, typescriptEslint.configs.stylisticTypeChecked, { @@ -18,6 +26,39 @@ export const configTypescriptNavigateur: Linter.Config[] = defineConfig( tsconfigRootDir: import.meta.dirname, }, }, + name: "Configuration du projet", + }, + { + name: "Programmation fonctionnelle", + plugins: { functional: functional as typeof typescriptEslint.plugin }, + rules: { + ...functional.configs.noExceptions.rules, + ...functional.configs.noMutations.rules, + ...functional.configs.externalTypeScriptRecommended.rules, + ...functional.configs.stylistic.rules, + // Choix stylistique. + "@typescript-eslint/array-type": ["error", { default: "generic", readonly: "generic" }], + // L'imposition d'une immutabilité plus importante est extrêmement contraignante. + "functional/prefer-immutable-types": ["error", { enforcement: "ReadonlyShallow" }], + // Choix stylistique. + "functional/readonly-type": ["error", "generic"], + // L'imposition d'une immutabilité plus importante est extrêmement contraignante. + "functional/type-declaration-immutability": [ + "error", + { + ignoreInterfaces: false, + rules: [ + { + comparator: "AtLeast", + fixer: false, + identifiers: "^(?!I?Mutable).+", + immutability: "ReadonlyShallow", + suggestions: false, + }, + ], + }, + ], + }, }, perfectionist.configs["recommended-natural"], -); +]); diff --git a/package.json b/package.json index 44bc954..f9e25d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gcch/configuration-eslint", - "version": "0.0.2", + "version": "0.0.3", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -14,21 +14,20 @@ ], "peerDependencies": { "eslint": "^9.36.0", - "jiti": "^2.6.0" + "typescript": "^5.9.2" }, "dependencies": { + "@eslint/js": "^9.36.0", + "eslint-plugin-functional": "^9.0.2", "eslint-plugin-perfectionist": "^4.15.0", "globals": "^16.4.0", "typescript-eslint": "^8.44.1" }, "devDependencies": { "@arethetypeswrong/core": "^0.18.2", - "@gcch/configuration-eslint": "^0.0.1", - "@gcch/configuration-prettier": "^1.0.6", - "eslint": "^9.36.0", + "@gcch/configuration-prettier": "^0.0.6", "publint": "^0.3.13", "tsdown": "^0.15.4", - "typescript": "^5.9.2", "unplugin-unused": "^0.5.3" } -} \ No newline at end of file +}