Auteur: GLM_Audit
Date: 26 octobre 2025
Version: 1.0.0
Ce document présente les recommandations, normes de codage et conventions stylistiques basées sur l'analyse complète de l'environnement de développement de Cheik Kone. Il sert de référence pour maintenir la cohérence et la qualité du code à travers tous les projets.
- 25 projets dans
~/Documents/Projets/Developpement/ - 13 projets avec Git activé
- 9 nouveaux dépôts GitHub créés récemment
- Projets principaux: Accor (4.5GB), Center (451MB), Core (276MB)
- Frontend: TypeScript, JavaScript, React, Vue.js
- Backend: NestJS, Node.js, Express
- Mobile: Chrome Extensions, WebXR
- Base de données: SQLite, PostgreSQL
- CI/CD: GitLab CI, GitHub Actions
- Outils: Docker, Nix Darwin, Homebrew
project-name/
├── 📁 src/ ← Code source
│ ├── 📁 components/ ← Composants réutilisables
│ ├── 📁 services/ ← Logique métier
│ ├── 📁 utils/ ← Utilitaires
│ ├── 📁 types/ ← Types TypeScript
│ └── 📁 config/ ← Configuration
├── 📁 tests/ ← Tests unitaires/intégration
├── 📁 docs/ ← Documentation
├── 📁 scripts/ ← Scripts de build/déploiement
├── 📄 package.json ← Dépendances npm
├── 📄 tsconfig.json ← Configuration TypeScript
├── 📄 .eslintrc.js ← Règles ESLint
├── 📄 .prettierrc ← Formatage Prettier
├── 📄 .gitignore ← Fichiers ignorés
└── 📄 README.md ← Documentation du projet
tsconfig.json recommandé:
{
"compilerOptions": {
"module": "nodenext",
"moduleResolution": "nodenext",
"target": "ES2023",
"strictNullChecks": true,
"forceConsistentCasingInFileNames": true,
"noImplicitAny": false,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"skipLibCheck": true,
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./",
"incremental": true
},
"exclude": ["node_modules", "dist", "frontend"]
}.eslintrc.js recommandé:
module.exports = {
root: true,
parserOptions: {
ecmaVersion: 2023,
sourceType: 'module'
},
env: {
browser: true,
node: true,
es6: true
},
extends: [
'eslint:recommended',
'@typescript-eslint/recommended',
'prettier'
],
rules: {
'no-console': ['error', { allow: ['warn', 'error'] }],
'no-debugger': 'error',
'prefer-const': 'error',
'no-var': 'error',
'prefer-arrow-callback': 'error',
'prefer-template': 'error',
'object-curly-spacing': ['error', 'always'],
'quotes': ['error', 'single'],
'semi': ['error', 'always']
}
};.prettierrc recommandé:
{
"singleQuote": true,
"trailingComma": "all",
"tabWidth": 2,
"useTabs": false,
"printWidth": 80,
"arrowParens": "avoid",
"bracketSameLine": false
}{
"scripts": {
"dev": "nest start --watch",
"build": "nest build",
"start": "node dist/main",
"test": "jest",
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\"",
"prepare": "husky install"
}
}.github/workflows/ci.yml:
name: CI/CD Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linting
run: npm run lint
- name: Run tests
run: npm run test:cov
- name: Upload coverage
uses: codecov/codecov-action@v3
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build.gitlab-ci.yml:
stages:
- lint
- test
- build
- deploy
variables:
NODE_VERSION: "20"
CACHE_KEY: "$CI_COMMIT_REF_SLUG"
cache:
key: ${CACHE_KEY}
paths:
- node_modules/
lint:
stage: lint
image: node:${NODE_VERSION}
script:
- npm ci
- npm run lint
test:
stage: test
image: node:${NODE_VERSION}
script:
- npm ci
- npm run test:cov
coverage: '/Lines\s*:\s*(\d+\.\d+)%/'
build:
stage: build
image: node:${NODE_VERSION}
script:
- npm ci
- npm run build
artifacts:
paths:
- dist/- Components:
PascalCase.tsx(ex:UserProfile.tsx) - Services:
camelCase.service.ts(ex:userService.ts) - Utils:
camelCase.util.ts(ex:dateFormatter.util.ts) - Types:
camelCase.types.ts(ex:user.types.ts) - Constants:
UPPER_SNAKE_CASE.ts(ex:API_ENDPOINTS.ts) - Tests:
*.spec.tsou*.test.ts
- Variables:
camelCase(ex:userName,isActive) - Fonctions:
camelCase(ex:getUserById(),handleSubmit()) - Classes:
PascalCase(ex:UserService,DataRepository) - Interfaces:
PascalCaseavec préfixeI(ex:IUser,IRepository) - Types:
PascalCase(ex:UserType,ApiResponse)
// ✅ Bon
const API_BASE_URL = 'https://api.example.com';
const MAX_RETRY_ATTEMPTS = 3;
// ❌ Éviter
const apiUrl = 'https://api.example.com';
const maxRetry = 3;// 1. Node.js imports
import { join } from 'path';
import { readFileSync } from 'fs';
// 2. Third-party imports
import express from 'express';
import { Controller, Get } from '@nestjs/common';
// 3. Internal imports
import { UserService } from './services/user.service';
import { UserEntity } from './entities/user.entity';
import { IUser } from './types/user.types';// ✅ Fonction fléchée pour callbacks
const users = data.map(user => ({
id: user.id,
name: user.name
}));
// ✅ Fonction nommée pour logique métier
async function getUserById(id: string): Promise<IUser | null> {
return await this.userService.findById(id);
}
// ✅ Méthode de classe
class UserService {
async createUser(userData: CreateUserDto): Promise<IUser> {
return await this.repository.save(userData);
}
}// ✅ Try-catch avec logging
try {
const result = await this.processData(data);
return result;
} catch (error) {
this.logger.error('Failed to process data', error);
throw new InternalServerErrorException('Processing failed');
}
// ✅ Validation personnalisée
if (!userData.email) {
throw new BadRequestException('Email is required');
}/**
* Calcule le prix total avec taxes incluses
* @param price - Prix de base
* @param taxRate - Taux de taxe (défaut: 0.2)
* @returns Prix total arrondi à 2 décimales
*/
function calculateTotalPrice(price: number, taxRate = 0.2): number {
return Math.round((price * (1 + taxRate)) * 100) / 100;
}
// TODO: Implémenter la validation des entrées utilisateur
// FIXME: Corriger la gestion des erreurs réseau
// NOTE: Cette fonction sera dépréciée dans la v2.0{
"devDependencies": {
"@types/node": "^20.0.0",
"@types/jest": "^29.0.0",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"eslint": "^8.0.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-prettier": "^5.0.0",
"prettier": "^3.0.0",
"husky": "^8.0.0",
"lint-staged": "^15.0.0",
"jest": "^29.0.0",
"ts-jest": "^29.0.0",
"typescript": "^5.0.0"
}
}package.json:
{
"lint-staged": {
"*.{ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"*.{json,md,yml,yaml}": [
"prettier --write"
]
}
}.husky/pre-commit:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
npm run testtests/
├── 📁 unit/ ← Tests unitaires
│ ├── 📁 services/
│ ├── 📁 controllers/
│ └── 📁 utils/
├── 📁 integration/ ← Tests d'intégration
├── 📁 e2e/ ← Tests end-to-end
└── 📄 fixtures/ ← Données de test
jest.config.js:
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
roots: ['<rootDir>/src', '<rootDir>/test'],
testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'],
transform: {
'^.+\\.ts$': 'ts-jest',
},
collectCoverageFrom: [
'src/**/*.ts',
'!src/**/*.d.ts',
'!src/**/*.spec.ts',
'!src/**/*.test.ts'
],
coverageDirectory: 'coverage',
coverageReporters: ['text', 'lcov', 'html'],
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: 80
}
}
};.env.example:
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
# API
API_PORT=3000
API_SECRET_KEY=your-secret-key-here
# External Services
REDIS_URL=redis://localhost:6379
JWT_SECRET=your-jwt-secret
# Development
NODE_ENV=development
LOG_LEVEL=debug# Dependencies
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Build outputs
dist/
build/
*.tsbuildinfo
# Environment variables
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# IDE
.vscode/
.idea/
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Logs
logs/
*.log
# Coverage
coverage/
# Temporary files
tmp/
temp/# Project Name
## Description
Brève description du projet et de ses objectifs.
## Installation
Instructions pour installer et configurer le projet.
## Usage
Exemples d'utilisation et commandes disponibles.
## API Documentation
Lien vers la documentation API (Swagger/Postman).
## Contributing
Guidelines pour contribuer au projet.
## License
Type de licence du projet./**
* Service de gestion des utilisateurs
*
* @class UserService
* @description Gère les opérations CRUD sur les utilisateurs
* @author Cheik Kone
* @since 1.0.0
*/
@Injectable()
export class UserService {
/**
* Crée un nouvel utilisateur
*
* @param {CreateUserDto} userData - Données de l'utilisateur à créer
* @returns {Promise<IUser>} Utilisateur créé
* @throws {BadRequestException} Si les données sont invalides
* @example
* ```typescript
* const user = await userService.createUser({
* email: 'user@example.com',
* name: 'John Doe'
* });
* ```
*/
async createUser(userData: CreateUserDto): Promise<IUser> {
// Implementation
}
}- Utiliser
async/awaitau lieu de callbacks - Implémenter le caching pour les requêtes fréquentes
- Optimiser les bundles avec lazy loading
- Surveiller les performances avec des outils appropriés
- Valider toutes les entrées utilisateur
- Utiliser HTTPS en production
- Implémenter rate limiting
- Ne jamais exposer de secrets dans le code
- Écrire du code auto-documenté
- Suivre le principe DRY (Don't Repeat Yourself)
- Utiliser des design patterns appropriés
- Maintenir une couverture de tests > 80%
- Utiliser des branches feature pour les nouvelles fonctionnalités
- Écrire des messages de commit clairs
- Faire des revues de code systématiques
- Documenter les décisions importantes
- Code linté avec ESLint
- Code formaté avec Prettier
- Tests passants (unitaires + intégration)
- Couverture de tests > 80%
- Documentation mise à jour
- Secrets non exposés
- Tests end-to-end passants
- Performance testée
- Sécurité validée
- Documentation complète
- Rollback plan préparé
- IDE: Cursor, VS Code, Claude Code
- Terminal: iTerm2, Tabby
- Version Control: Git + GitHub/GitLab
- Package Manager: npm, yarn, pnpm
- Container: Docker
- Monitoring: PM2, New Relic
Pour toute question sur ces normes et recommandations :
- Auteur: GLM_Audit
- Email: support@littech.com
- Repository: GitHub - LitTech/GLM-Toolkit
Dernière mise à jour: 26 octobre 2025
Version: 1.0.0
Prochaine révision: Q1 2026
Ce document est vivant et évolue avec les meilleures pratiques du développement logiciel. N'hésitez pas à proposer des améliorations via des Pull Requests.