From bb8f34a31a96e92678349965f30951709b230a8e Mon Sep 17 00:00:00 2001 From: David Bretaud Date: Sat, 31 Jan 2026 20:14:40 +0100 Subject: [PATCH 1/6] chore(prettier): Install and configure prettier --- webapp/.prettierignore | 4 ++++ webapp/.prettierrc | 22 ++++++++++++++++++++++ webapp/package-lock.json | 17 +++++++++++++++++ webapp/package.json | 3 +++ 4 files changed, 46 insertions(+) create mode 100644 webapp/.prettierignore create mode 100644 webapp/.prettierrc diff --git a/webapp/.prettierignore b/webapp/.prettierignore new file mode 100644 index 00000000..f6455c6b --- /dev/null +++ b/webapp/.prettierignore @@ -0,0 +1,4 @@ +# Ignore artifacts: +build +coverage +node_modules diff --git a/webapp/.prettierrc b/webapp/.prettierrc new file mode 100644 index 00000000..aef6c03f --- /dev/null +++ b/webapp/.prettierrc @@ -0,0 +1,22 @@ +{ + "arrowParens": "always", + "bracketSameLine": false, + "objectWrap": "preserve", + "bracketSpacing": true, + "semi": true, + "experimentalOperatorPosition": "end", + "experimentalTernaries": false, + "singleQuote": false, + "jsxSingleQuote": false, + "quoteProps": "as-needed", + "trailingComma": "all", + "singleAttributePerLine": true, + "htmlWhitespaceSensitivity": "css", + "vueIndentScriptAndStyle": false, + "proseWrap": "preserve", + "endOfLine": "lf", + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "embeddedLanguageFormatting": "auto" +} diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 7be9d5d8..eef8a5af 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -42,6 +42,7 @@ "eslint-plugin-react": "^7.37.5", "globals": "^17.2.0", "jiti": "^2.6.1", + "prettier": "3.8.1", "tailwind-merge": "^3.4.0", "tailwindcss": "^4.1.18", "tailwindcss-animate": "^1.0.7", @@ -6337,6 +6338,22 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", diff --git a/webapp/package.json b/webapp/package.json index 8e0cde34..32623a69 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -9,6 +9,8 @@ "preview": "vite preview", "check:arch": "node ./scripts/check-architecture.cjs", "arch:tree": "node ./scripts/generate-tree.cjs ./src webappTree.md", + "format": "prettier . --write", + "format:check": "prettier . --check", "lint": "eslint ./src", "lint:fix": "eslint ./src --fix" }, @@ -47,6 +49,7 @@ "eslint-plugin-react": "^7.37.5", "globals": "^17.2.0", "jiti": "^2.6.1", + "prettier": "3.8.1", "tailwind-merge": "^3.4.0", "tailwindcss": "^4.1.18", "tailwindcss-animate": "^1.0.7", From 5c77bb7e3cc9267b03a068c506a7edf648f92111 Mon Sep 17 00:00:00 2001 From: David Bretaud Date: Sat, 31 Jan 2026 20:17:47 +0100 Subject: [PATCH 2/6] chore(eslint): Add prettier plugin o avoid conflicts --- webapp/eslint.config.ts | 2 ++ webapp/package-lock.json | 17 +++++++++++++++++ webapp/package.json | 1 + 3 files changed, 20 insertions(+) diff --git a/webapp/eslint.config.ts b/webapp/eslint.config.ts index 87658d7f..1bc49517 100644 --- a/webapp/eslint.config.ts +++ b/webapp/eslint.config.ts @@ -4,10 +4,12 @@ import tseslint from "typescript-eslint"; import pluginReact from "eslint-plugin-react"; import json from "@eslint/json"; import { defineConfig } from "eslint/config"; +import pluginPrettier from "eslint-config-prettier/flat"; export default defineConfig([ { files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], plugins: { js }, extends: ["js/recommended"], languageOptions: { globals: globals.browser } }, tseslint.configs.recommended, + pluginPrettier, { ...pluginReact.configs.flat.recommended, rules: { diff --git a/webapp/package-lock.json b/webapp/package-lock.json index eef8a5af..54827b1e 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -39,6 +39,7 @@ "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^5.1.1", "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-react": "^7.37.5", "globals": "^17.2.0", "jiti": "^2.6.1", @@ -4404,6 +4405,22 @@ } } }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", diff --git a/webapp/package.json b/webapp/package.json index 32623a69..3623a3f1 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -46,6 +46,7 @@ "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^5.1.1", "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-react": "^7.37.5", "globals": "^17.2.0", "jiti": "^2.6.1", From 7666583c1363eaa6a877ab96b63b2d7975ba3e4c Mon Sep 17 00:00:00 2001 From: David Bretaud Date: Sat, 31 Jan 2026 20:22:06 +0100 Subject: [PATCH 3/6] chore(prettier-sort): Add plugin to sort imports with prettier --- webapp/.prettierrc | 26 ++++++++++- webapp/eslint.config.ts | 2 +- webapp/package-lock.json | 99 ++++++++++++++++++++++++++++++++++++++++ webapp/package.json | 1 + 4 files changed, 126 insertions(+), 2 deletions(-) diff --git a/webapp/.prettierrc b/webapp/.prettierrc index aef6c03f..2444c377 100644 --- a/webapp/.prettierrc +++ b/webapp/.prettierrc @@ -18,5 +18,29 @@ "printWidth": 80, "tabWidth": 2, "useTabs": false, - "embeddedLanguageFormatting": "auto" + "embeddedLanguageFormatting": "auto", + "plugins": ["@trivago/prettier-plugin-sort-imports"], + "importOrder": [ + "", + "", + "^@/(.*)$", + "^@app/(.*)$", + "^@providers", + "^@providers/(.*)$", + "^@components", + "^@components/(.*)$", + "^@widgets", + "^@widgets/(.*)$", + "^@assets", + "^@assets/(.*)$", + "^@pages", + "^@pages/(.*)$", + "^@ui", + "^@ui/(.*)$", + "[../]", + "[./]" + ], + "importOrderSeparation": true, + "importOrderSortSpecifiers": true, + "importOrderCaseInsensitive": false } diff --git a/webapp/eslint.config.ts b/webapp/eslint.config.ts index 1bc49517..93b060aa 100644 --- a/webapp/eslint.config.ts +++ b/webapp/eslint.config.ts @@ -9,7 +9,6 @@ import pluginPrettier from "eslint-config-prettier/flat"; export default defineConfig([ { files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], plugins: { js }, extends: ["js/recommended"], languageOptions: { globals: globals.browser } }, tseslint.configs.recommended, - pluginPrettier, { ...pluginReact.configs.flat.recommended, rules: { @@ -29,4 +28,5 @@ export default defineConfig([ { files: ["**/*.json"], plugins: { json }, language: "json/json", extends: ["json/recommended"] }, /** @ts-expect-error json plugin not typed well*/ { files: ["**/*.jsonc"], plugins: { json }, language: "json/jsonc", extends: ["json/recommended"] }, + pluginPrettier, ]); diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 54827b1e..5b02d463 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -33,6 +33,7 @@ "@eslint/js": "^9.39.2", "@eslint/json": "^1.0.0", "@tailwindcss/vite": "^4.1.18", + "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/chart.js": "^2.9.41", "@types/node": "^24.10.1", "@types/react": "^19.2.5", @@ -2788,6 +2789,73 @@ "vite": "^5.2.0 || ^6 || ^7" } }, + "node_modules/@trivago/prettier-plugin-sort-imports": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-6.0.2.tgz", + "integrity": "sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/generator": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "javascript-natural-sort": "^0.7.1", + "lodash-es": "^4.17.21", + "minimatch": "^9.0.0", + "parse-imports-exports": "^0.2.4" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@vue/compiler-sfc": "3.x", + "prettier": "2.x - 3.x", + "prettier-plugin-ember-template-tag": ">= 2.0.0", + "prettier-plugin-svelte": "3.x", + "svelte": "4.x || 5.x" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "prettier-plugin-ember-template-tag": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + }, + "svelte": { + "optional": true + } + } + }, + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -5467,6 +5535,13 @@ "node": ">= 0.4" } }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", + "dev": true, + "license": "MIT" + }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -5878,6 +5953,13 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -6240,6 +6322,23 @@ "node": ">=6" } }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-statements": "1.0.11" + } + }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", diff --git a/webapp/package.json b/webapp/package.json index 3623a3f1..e1b0b280 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -40,6 +40,7 @@ "@eslint/js": "^9.39.2", "@eslint/json": "^1.0.0", "@tailwindcss/vite": "^4.1.18", + "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/chart.js": "^2.9.41", "@types/node": "^24.10.1", "@types/react": "^19.2.5", From a1462d8b3b93f4c558f0b4e87d507fe4a699c8f0 Mon Sep 17 00:00:00 2001 From: David Bretaud Date: Sat, 31 Jan 2026 21:39:23 +0100 Subject: [PATCH 4/6] chore(tsc): Add script to run typescript compiler --- webapp/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp/package.json b/webapp/package.json index e1b0b280..769e7f9a 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -8,7 +8,9 @@ "build": "tsc -b && vite build", "preview": "vite preview", "check:arch": "node ./scripts/check-architecture.cjs", + "check:code": "npm run compile && npm run format && npm run lint", "arch:tree": "node ./scripts/generate-tree.cjs ./src webappTree.md", + "compile": "tsc -b", "format": "prettier . --write", "format:check": "prettier . --check", "lint": "eslint ./src", From 5bba0e244715e31f658140094fb0d55cb6def073 Mon Sep 17 00:00:00 2001 From: David Bretaud Date: Sat, 7 Feb 2026 13:55:12 +0100 Subject: [PATCH 5/6] docs(commands): Document new commands (tsc, lint, format) --- webapp/README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/webapp/README.md b/webapp/README.md index 254a5f0f..6d1e89e1 100644 --- a/webapp/README.md +++ b/webapp/README.md @@ -8,11 +8,13 @@ Plus d'infos ici : [https://feature-sliced.github.io/documentation/docs/get-star - Avoir Node.js installé sur votre machine [voir comment faire](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm#using-a-node-version-manager-to-install-nodejs-and-npm) ## Installer les packages + ``` npm ci ``` ## Démarrer le serveur + ``` npm run dev ``` @@ -21,5 +23,11 @@ npm run dev - `npm run build` : package l'application pour la mise en production (dossier [dist](./dist)) - `npm run preview` : Démarre le serveur à partir du build pour la production (dans le dist) -- `npm run check:arch` : Vérifier si les imports du projet respectent le principe de l'architecture FSD. -- `npm run arch:tree` : Génère un fichier text contenant l'arborescence du projet. \ No newline at end of file +- `npm run check:arch` : Vérifie si les imports du projet respectent le principe de l'architecture FSD. +- `npm run check:code` : Applique les 3 commandes de vérification de code: Linter, TS Compiler, Formatter. +- `npm run arch:tree` : Génère un fichier text contenant l'arborescence du projet. +- `npm run compile` : Vérifie que TypeScript compile correctement +- `npm run format` : Applique le formattage de prettier à l'ensemble du projet +- `npm run format:check` : Détermine les fichiers où le formattage de prettier aurait des effets (fichiers non formattés correctement) +- `npm run lint` : Vérifie que le code ./src respecte les règles de Lint +- `npm run lint:fix` : Fix si possible les problèmes de Linter dans ./src From 5a807e571a4a865d136a5c8fb6f3b1ba037512b9 Mon Sep 17 00:00:00 2001 From: David Bretaud Date: Sat, 7 Feb 2026 13:55:28 +0100 Subject: [PATCH 6/6] fix(prettier): Align prettier order import with FSD --- webapp/.prettierrc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/webapp/.prettierrc b/webapp/.prettierrc index 2444c377..bcfd781f 100644 --- a/webapp/.prettierrc +++ b/webapp/.prettierrc @@ -27,16 +27,16 @@ "^@app/(.*)$", "^@providers", "^@providers/(.*)$", - "^@components", - "^@components/(.*)$", - "^@widgets", - "^@widgets/(.*)$", - "^@assets", - "^@assets/(.*)$", "^@pages", "^@pages/(.*)$", + "^@widgets", + "^@widgets/(.*)$", + "^@components", + "^@components/(.*)$", "^@ui", "^@ui/(.*)$", + "^@assets", + "^@assets/(.*)$", "[../]", "[./]" ],