Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .env.local.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Copie ce fichier en `.env.local` puis mets ton vrai token.
# `.env.local` est ignoré par git — ne committe JAMAIS de secret.

# Personal Access Token GitHub (scope: public_repo / read:user).
PAT_1=ghp_xxxxxxxxxxxxxxxxxxxx

# Optionnel : plusieurs tokens pour la rotation (PAT_2, PAT_3, ...).
# PAT_2=

# Cache HTTP en secondes (0 = désactivé).
CACHE_SECONDS=21600

# Usernames autorisés (séparés par des virgules). Vide = tous autorisés.
WHITELIST=

# Port interne (défaut 9000).
# PORT=9000
37 changes: 37 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
name: Rapport de bug
about: Signaler un problème pour nous aider à l'améliorer
title: "[Bug] "
labels: bug
assignees: ""
---

## Description

Description claire et concise du bug.

## Reproduction

Étapes pour reproduire :

1. Appeler l'URL '...'
2. Avec les paramètres '...'
3. Voir l'erreur

## Comportement attendu

Ce à quoi tu t'attendais.

## Capture / SVG

Si possible, joins la carte générée ou une capture.

## Environnement

- Node.js : [ex. 20.11]
- OS : [ex. Windows 11]
- Version / commit : [ex. `dev` @ abc123]

## Contexte additionnel

Tout autre élément utile.
23 changes: 23 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
name: Demande de fonctionnalité
about: Proposer une idée pour ce projet
title: "[Feat] "
labels: enhancement
assignees: ""
---

## Problème lié

Le problème que ça résout. Ex. « Je suis frustré quand [...] ».

## Solution souhaitée

Description claire de ce que tu aimerais voir.

## Alternatives envisagées

Autres pistes que tu as considérées.

## Contexte additionnel

Maquettes, exemples d'URL, liens vers github-readme-stats, etc.
20 changes: 20 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
## Description

Que fait cette PR et pourquoi ?

Closes #(numéro d'issue si applicable)

## Type de changement

- [ ] Correction de bug
- [ ] Nouvelle fonctionnalité
- [ ] Refactoring / technique
- [ ] Documentation

## Checklist

- [ ] `npm run lint` passe
- [ ] `npm test` passe
- [ ] `npm run smoke` passe
- [ ] J'ai ajouté / mis à jour les tests si nécessaire
- [ ] Aucun secret ni `.env.local` n'est committé
68 changes: 68 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: CI

on:
push:
branches: [dev, preprod, prod]
pull_request:
branches: [dev, preprod, prod]

jobs:
quality:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [20, 22, 24]
steps:
- uses: actions/checkout@v4

- name: Setup Node ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm

- name: Install dependencies
run: npm ci

- name: Lint
run: npm run lint

- name: Format check
run: npm run format:check

- name: Tests
run: npm test

- name: Smoke test (rendu hors-ligne)
run: npm run smoke

sonarcloud:
name: SonarCloud
runs-on: ubuntu-latest
needs: quality
# Le scan ne tourne pas sur les PR issues d'un fork (le secret SONAR_TOKEN
# n'y est pas exposé).
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Sonar a besoin de l'historique complet (blame).

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm

- name: Install dependencies
run: npm ci

- name: Coverage (LCOV)
run: npm run coverage:lcov

- name: SonarCloud Scan
uses: SonarSource/sonarqube-scan-action@v5
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: https://sonarcloud.io
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@ scripts/preview-*.png
logs/
*.log

# Couverture de code (générée par les tests / la CI)
coverage/

# Divers
.DS_Store
5 changes: 5 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules/
assets/
logs/
package-lock.json
scripts/preview-*
7 changes: 7 additions & 0 deletions .prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"semi": true,
"singleQuote": false,
"trailingComma": "all",
"printWidth": 80,
"tabWidth": 2
}
36 changes: 36 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Code de conduite

## Notre engagement

Dans l'intérêt de favoriser un environnement ouvert et accueillant, nous nous
engageons, en tant que contributeurs et responsables, à faire de la
participation à ce projet une expérience exempte de harcèlement pour tout le
monde, quel que soit l'âge, la corpulence, le handicap, l'origine ethnique,
l'identité et l'expression de genre, le niveau d'expérience, la nationalité,
l'apparence, la religion ou l'orientation sexuelle.

## Nos standards

Exemples de comportements qui contribuent à un environnement positif :

- Faire preuve d'empathie et de bienveillance.
- Respecter les opinions et expériences différentes.
- Accepter les critiques constructives avec grâce.
- Se concentrer sur ce qui est le mieux pour la communauté.

Exemples de comportements inacceptables :

- Propos ou images à caractère sexuel, et avances non sollicitées.
- Trolling, insultes, commentaires désobligeants, attaques personnelles ou
politiques.
- Harcèlement public ou privé.
- Publication d'informations privées d'autrui sans autorisation.

## Application

Les cas de comportement abusif peuvent être signalés au responsable du projet
via une issue ou par email. Toutes les plaintes seront examinées et traitées
de manière équitable.

Ce code de conduite est adapté du [Contributor Covenant](https://www.contributor-covenant.org),
version 2.1.
52 changes: 52 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Contribuer à my-git-stats

Merci de vouloir contribuer ! Ce projet est ouvert : **aucun accès en écriture n'est nécessaire**. Tout passe par un _fork_ et une _pull request_.

## En bref

1. **Forke** le dépôt (bouton _Fork_ en haut à droite sur GitHub).
2. **Clone** ton fork puis crée une branche :
```bash
git clone https://github.com/<ton-compte>/my-git-stats.git
cd my-git-stats
git checkout -b feat/ma-fonctionnalite
```
3. **Installe et lance** :
```bash
npm install
cp .env.local.example .env.local # ajoute ton PAT GitHub dans .env.local
npm run dev
```
4. **Vérifie** avant de pousser :
```bash
npm run lint # style + erreurs
npm run format # applique Prettier
npm test # tests unitaires
```
5. **Pousse** ta branche et ouvre une **Pull Request** vers `dev`.

## Prérequis

- Node.js >= 20 (la CI teste aussi sur 22).
- Un _Personal Access Token_ GitHub pour les tests contre l'API réelle. Il va **uniquement** dans `.env.local` (ignoré par git). Ne committe jamais de token.

## Conventions

- **Branches** : `feat/...`, `fix/...`, `docs/...`, `chore/...`.
- **Commits** : messages clairs à l'impératif. Les [Conventional Commits](https://www.conventionalcommits.org/) sont appréciés mais pas obligatoires.
- **Signature** : les commits doivent être signés (GPG/SSH) pour apparaître « Verified ». Configure `git config commit.gpgsign true` et ta `user.signingkey`. Voir la [doc GitHub](https://docs.github.com/authentication/managing-commit-signature-verification).
- **Style** : ESLint + Prettier gèrent le formatage. Ne te bats pas contre eux, lance `npm run format`.
- **Tests** : ajoute ou mets à jour les tests quand tu changes une logique (`test/`). Le smoke test hors-ligne (`npm run smoke`) doit toujours passer.

## Que peut-on faire ?

Regarde les _issues_ ouvertes, en particulier celles étiquetées `good first issue`. Des idées d'évolution sont listées dans le README (nouvelles cartes, cache, pagination…). Pour un changement important, ouvre d'abord une issue pour en discuter avant de coder.

## Checklist de PR

- [ ] `npm run lint` passe.
- [ ] `npm test` passe.
- [ ] La description explique le _quoi_ et le _pourquoi_.
- [ ] Pas de secret ni de `.env.local` committé.

Toute PR est relue avant d'être fusionnée. Merci !
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Mathbech

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
27 changes: 18 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# my-git-stats

[![CI](https://github.com/Mathbech/my-git-stats/actions/workflows/ci.yml/badge.svg)](https://github.com/Mathbech/my-git-stats/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
[![Node](https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg)](https://nodejs.org)
[![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](./CONTRIBUTING.md)

[![Quality gate status](https://sonarcloud.io/api/project_badges/measure?project=Mathbech_my-git-stats&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=Mathbech_my-git-stats)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=Mathbech_my-git-stats&metric=coverage)](https://sonarcloud.io/summary/new_code?id=Mathbech_my-git-stats)
[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=Mathbech_my-git-stats&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=Mathbech_my-git-stats)

Ton propre service de cartes de stats GitHub en SVG, écrit de zéro — **aucun fork**. Node + Express interrogent l'API GraphQL de GitHub et génèrent les images. L'API reproduit les URLs de github-readme-stats, donc tu remplaces juste `...vercel.app` par ton domaine dans tes READMEs.

```
Expand All @@ -12,21 +21,21 @@ Aperçus générés avec des données factices (`node scripts/gen-previews.js`).

### Carte de stats — `/api`

| Thème | Aperçu | URL |
| --- | --- | --- |
| `default` | ![](./assets/stats-default.png) | `https://my-git-stats.bebech.fr/api?username=Mathbech` |
| `dark` | ![](./assets/stats-dark.png) | `https://my-git-stats.bebech.fr/api?username=Mathbech&theme=dark` |
| `radical` | ![](./assets/stats-radical.png) | `https://my-git-stats.bebech.fr/api?username=Mathbech&theme=radical` |
| Thème | Aperçu | URL |
| ------------ | ---------------------------------- | ----------------------------------------------------------------------- |
| `default` | ![](./assets/stats-default.png) | `https://my-git-stats.bebech.fr/api?username=Mathbech` |
| `dark` | ![](./assets/stats-dark.png) | `https://my-git-stats.bebech.fr/api?username=Mathbech&theme=dark` |
| `radical` | ![](./assets/stats-radical.png) | `https://my-git-stats.bebech.fr/api?username=Mathbech&theme=radical` |
| `ocean_dark` | ![](./assets/stats-ocean_dark.png) | `https://my-git-stats.bebech.fr/api?username=Mathbech&theme=ocean_dark` |
| `tokyonight` | ![](./assets/stats-tokyonight.png) | `https://my-git-stats.bebech.fr/api?username=Mathbech&theme=tokyonight` |

### Top langages — `/api/top-langs`

| Layout / thème | Aperçu | URL |
| --- | --- | --- |
| `normal` / `default` | ![](./assets/langs-normal-default.png) | `https://my-git-stats.bebech.fr/api/top-langs?username=Mathbech` |
| Layout / thème | Aperçu | URL |
| ------------------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| `normal` / `default` | ![](./assets/langs-normal-default.png) | `https://my-git-stats.bebech.fr/api/top-langs?username=Mathbech` |
| `compact` / `tokyonight` | ![](./assets/langs-compact-tokyonight.png) | `https://my-git-stats.bebech.fr/api/top-langs?username=Mathbech&layout=compact&theme=tokyonight` |
| `compact` / `ocean_dark` | ![](./assets/langs-compact-ocean.png) | `https://my-git-stats.bebech.fr/api/top-langs?username=Mathbech&layout=compact&theme=ocean_dark` |
| `compact` / `ocean_dark` | ![](./assets/langs-compact-ocean.png) | `https://my-git-stats.bebech.fr/api/top-langs?username=Mathbech&layout=compact&theme=ocean_dark` |

### Paramètres d'URL

Expand Down
30 changes: 30 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Politique de sécurité

## Versions supportées

Le projet est en développement actif ; seule la dernière version de la branche
par défaut reçoit des correctifs de sécurité.

## Signaler une vulnérabilité

**Merci de ne pas ouvrir d'issue publique pour une faille de sécurité.**

Signale-la en privé via l'onglet **Security → Report a vulnerability** du dépôt
GitHub ([Private vulnerability reporting](https://github.com/Mathbech/my-git-stats/security/advisories/new)),
ou par email à **contact@bebech.fr**.

Merci d'inclure, si possible :

- une description du problème et de son impact ;
- les étapes pour le reproduire (URL, paramètres, payload) ;
- la version / le commit concerné.

Tu peux t'attendre à un premier retour sous quelques jours. Une fois le correctif
disponible, ta contribution au signalement sera créditée si tu le souhaites.

## Bonnes pratiques rappelées

- Aucun secret (token GitHub, etc.) ne doit être committé : ils vivent dans
`.env.local`, ignoré par git.
- Le token utilisé en production reste sur le serveur ; il n'est jamais exposé
dans le code ni dans les logs.
Loading
Loading