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
61 changes: 61 additions & 0 deletions .github/CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Code de conduite — Contributor Covenant

## Notre engagement

En tant que membres, contributrices, contributeurs et responsables de ce projet, nous nous
engageons à faire de la participation à notre communauté une expérience exempte de harcèlement,
quels que soient l'âge, la taille, le handicap visible ou invisible, l'origine ethnique, les
caractéristiques sexuelles, l'identité et l'expression de genre, le niveau d'expérience,
l'éducation, le statut socio-économique, la nationalité, l'apparence personnelle, la race, la
religion ou l'identité et l'orientation sexuelle.

Nous nous engageons à agir et interagir de manière à contribuer à une communauté ouverte,
accueillante, diverse, inclusive et saine.

## Nos critères

Exemples de comportements qui contribuent à un environnement positif :

- faire preuve d'empathie et de bienveillance envers les autres ;
- respecter les opinions, points de vue et expériences divergents ;
- donner et accepter avec grâce les critiques constructives ;
- assumer ses erreurs, s'en excuser auprès des personnes affectées et en tirer les leçons ;
- se concentrer sur ce qui est le mieux pour la communauté, pas seulement pour soi.

Exemples de comportements inacceptables :

- langage ou imagerie sexualisés, et avances sexuelles de quelque nature que ce soit ;
- trolling, commentaires insultants ou désobligeants, attaques personnelles ou politiques ;
- harcèlement public ou privé ;
- publication d'informations privées de tiers (adresse physique ou électronique) sans autorisation
explicite ;
- toute conduite qui pourrait raisonnablement être considérée comme inappropriée dans un cadre
professionnel.

## Responsabilités d'application

Les responsables du projet doivent clarifier et faire respecter ces critères, et prendront des
mesures correctives appropriées et équitables en réponse à tout comportement jugé inapproprié,
menaçant, offensant ou nuisible.

Ils ont le droit et la responsabilité de supprimer, modifier ou rejeter les commentaires, commits,
code, modifications du wiki, issues et autres contributions non alignés sur ce code de conduite,
et communiqueront les raisons de leurs décisions de modération le cas échéant.

## Portée

Ce code de conduite s'applique à tous les espaces du projet — issues, pull requests, discussions,
code et documentation — ainsi qu'aux espaces publics où une personne représente le projet.

## Application

Les comportements abusifs, harcelants ou autrement inacceptables peuvent être signalés aux
responsables du projet à l'adresse **alban.pasquelin@gmail.com**. Toutes les plaintes seront
examinées et instruites rapidement et équitablement. Les responsables sont tenus au respect de la
vie privée et de la sécurité de la personne ayant signalé un incident.

## Attribution

Ce code de conduite est adapté du [Contributor Covenant](https://www.contributor-covenant.org),
version 2.1, disponible à l'adresse
<https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.
96 changes: 96 additions & 0 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# Contribuer à plugingsMap3D

Merci de l'intérêt porté aux plugins officiels de [map3D](https://github.com/pasquelin/map3D) !
Ce document décrit le strict nécessaire pour qu'une contribution soit fusionnable.

Le projet est **francophone** : code, commentaires, JSDoc, docs et messages de commit sont
rédigés **en français**. Les identifiants restent en anglais (`enrichBuilding`, `apiKey`…).

## Prérequis

- **Node 22** et **pnpm** (la version est épinglée par `packageManager` dans le `package.json` racine)
- `pnpm install` à la racine — le monorepo couvre `packages/*` et `packages/*/example`

## Le garde-fou : `pnpm validater`

```bash
pnpm validater # typecheck + lint + format:check + test
```

C'est **exactement** ce que rejoue la CI sur chaque PR. Une PR dont `validater` échoue ne peut pas
être fusionnée — lance-le en local avant de pousser.

| Commande | Effet |
|---|---|
| `pnpm build` | build lib de chaque package (`dist/` : ESM + CJS + `.d.ts`) |
| `pnpm typecheck` | `tsc --noEmit` par package |
| `pnpm test` | Vitest (tests colocalisés `*.test.ts`) |
| `pnpm lint` / `pnpm format` | ESLint / Prettier |
| `pnpm --filter @pasquelin/map3d-plugin-<nom>-example dev` | lance l'exemple d'un plugin |

## Modèle de branches

- **`develop`** est la base d'intégration : une feature part de `develop` et y retourne **par PR**.
- **`main`** est la branche de release : elle ne reçoit que les fusions de release et les tags `vX.Y.Z`.

Une feature = une branche = un **`git worktree` isolé**. Jamais deux sessions dans le même
working tree : les index se marchent dessus.

```bash
git worktree add ../plugingsMap3D-feat-x -b feat/x develop
# … commits sur feat/x … → PR vers develop
git worktree remove ../plugingsMap3D-feat-x
```

Ajoute les fichiers **par chemin explicite** (`git add packages/windy/src/index.ts`), pas `git add -A`.

## Messages de commit

Convention [Conventional Commits](https://www.conventionalcommits.org/fr/), en français :

```
feat(windy): filtre les webcams hors service
fix(geopf): gère la réponse WFS vide
docs(readme): tableau des plugins
chore(release): 0.2.0
```

Portées usuelles : `geopf`, `windy`, `plan-3d`, `template`, `ci`, `docs`, `build`, `release`.

## Conventions de code

- **Point d'entrée public** de chaque package : `src/index.ts`.
- **Style Prettier** : pas de `;`, guillemets simples, `printWidth: 120`, `trailingComma: all`.
- **`any` interdit** (`@typescript-eslint/no-explicit-any: error`), **`type` jamais `interface`**,
`strict` + `noUncheckedIndexedAccess`. Paramètre volontairement ignoré : préfixe `_`.
- Les peerDependencies (`react`, `react-dom`, `three`, `@pasquelin/map3d`) sont **externalisées** —
ne rien en embarquer dans un `dist/`.
- Tests **colocalisés** `*.test.ts`. Commentaires courts, qui expliquent le *pourquoi*.
- **Aucun secret committé** : une clé d'API vit dans l'`example/.env` (gitignoré), documentée sans
valeur réelle dans `example/.env.example`.

## Ajouter un plugin

1. `cp -r packages/plugin-template packages/mon-plugin`, puis renommer `name` et `meta.id`.
2. Choisir **une** voie du contrat (`enrich`, `markers` ou `layer`) — voir le
[contrat de plugin](https://github.com/pasquelin/map3D/blob/main/docs/fr/PLUGINS.md).
3. Écrire son `README.md`, son exemple exécutable dans `example/` et ses tests.
4. Le laisser **`private: true`** par défaut. Pour le rendre publiable : retirer `private`,
compléter le packaging (`exports`, `files` slim, `publishConfig.provenance`, `LICENSE` MIT),
l'intégrer à la version unifiée et aux étapes `publish` de `.github/workflows/release.yml`.

> Le tout premier publish d'un paquet neuf ne peut pas passer par l'OIDC seul (le trusted publisher
> s'attache à un paquet **existant**) : il faut un `NPM_TOKEN` temporaire, puis configurer le
> trusted publisher et retirer le token.

## Ouvrir une PR

- Cible **`develop`**, titre au format Conventional Commits.
- Décris le *pourquoi*, pas seulement le *quoi* ; capture d'écran ou GIF si l'effet est visuel.
- `pnpm validater` vert, CHANGELOG mis à jour sous `## [Non publié]` si le changement est visible.
- Une PR = un sujet. Les refactos opportunistes vont dans leur propre PR.

## Signaler un bug ou proposer une idée

Passe par les [issues](https://github.com/pasquelin/plugingsMap3D/issues) et leurs gabarits.
Pour une **faille de sécurité**, ne pas ouvrir d'issue publique : voir [SECURITY.md](SECURITY.md).
73 changes: 73 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
name: 🐛 Bug
description: Signaler un comportement incorrect d'un plugin
labels: ["bug", "à trier"]
body:
- type: markdown
attributes:
value: |
Merci pour le signalement ! Pour une **faille de sécurité**, n'ouvrez pas d'issue publique :
voir [SECURITY.md](https://github.com/pasquelin/plugingsMap3D/blob/main/.github/SECURITY.md).

- type: dropdown
id: package
attributes:
label: Plugin concerné
options:
- "@pasquelin/map3d-plugin-geopf"
- "@pasquelin/map3d-plugin-windy"
- "@pasquelin/map3d-plugin-plan-3d"
- "@pasquelin/map3d-plugin-template"
- Monorepo (build, CI, outillage)
validations:
required: true

- type: textarea
id: description
attributes:
label: Ce qui se passe
description: Décrivez le comportement observé, et ce que vous attendiez à la place.
validations:
required: true

- type: textarea
id: reproduction
attributes:
label: Étapes de reproduction
description: |
Idéalement à partir de l'exemple du plugin :
`pnpm --filter @pasquelin/map3d-plugin-<nom>-example dev`
placeholder: |
1. Lancer l'exemple …
2. Activer le plugin depuis le hub …
3. Cliquer sur …
4. Observer …
validations:
required: true

- type: textarea
id: versions
attributes:
label: Versions
description: Sortie de `npm ls @pasquelin/map3d @pasquelin/map3d-plugin-<nom> react three`, plus Node et le navigateur.
render: text
validations:
required: true

- type: textarea
id: logs
attributes:
label: Console / réseau
description: Erreurs de la console, et la réponse du service tiers (WFS Géoplateforme, API Windy) si l'appel est en cause.
render: text

- type: checkboxes
id: checks
attributes:
label: Vérifications
options:
- label: J'ai cherché une issue existante sur le même sujet.
required: true
- label: Je suis sur la dernière version publiée du plugin.
required: true
- label: Mon rapport ne contient aucune clé d'API ni secret.
required: true
11 changes: 11 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
blank_issues_enabled: false
contact_links:
- name: 📖 Contrat de plugin map3D
url: https://github.com/pasquelin/map3D/blob/main/docs/fr/PLUGINS.md
about: Comment écrire un plugin — voies enrich / markers / layer, definePlugin.
- name: 🗺️ Question sur la lib map3D
url: https://github.com/pasquelin/map3D/issues
about: Le bug concerne la carte elle-même (caméra, tuiles, markers, thème) et non un plugin.
- name: 🔒 Faille de sécurité
url: https://github.com/pasquelin/plugingsMap3D/security/advisories/new
about: Signalement privé — n'ouvrez jamais d'issue publique pour une vulnérabilité.
45 changes: 45 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: 💡 Évolution
description: Proposer une amélioration d'un plugin existant
labels: ["enhancement", "à trier"]
body:
- type: dropdown
id: package
attributes:
label: Plugin concerné
options:
- "@pasquelin/map3d-plugin-geopf"
- "@pasquelin/map3d-plugin-windy"
- "@pasquelin/map3d-plugin-plan-3d"
- "@pasquelin/map3d-plugin-template"
- Monorepo (build, CI, outillage)
validations:
required: true

- type: textarea
id: probleme
attributes:
label: Le problème
description: Quel besoin réel n'est pas couvert aujourd'hui ? Décrivez l'usage, pas la solution.
validations:
required: true

- type: textarea
id: solution
attributes:
label: La solution envisagée
description: API souhaitée, option de configuration, exemple de code.
validations:
required: true

- type: textarea
id: alternatives
attributes:
label: Alternatives et contournements
description: Ce que vous faites en attendant, et pourquoi ça ne suffit pas.

- type: checkboxes
id: rupture
attributes:
label: Compatibilité
options:
- label: Cette évolution casserait l'API publique existante.
55 changes: 55 additions & 0 deletions .github/ISSUE_TEMPLATE/new_plugin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: 🧩 Nouveau plugin
description: Proposer un nouveau plugin officiel map3D
labels: ["nouveau plugin", "à trier"]
body:
- type: markdown
attributes:
value: |
Avant de proposer, lire le
[contrat de plugin](https://github.com/pasquelin/map3D/blob/main/docs/fr/PLUGINS.md) et
[CONTRIBUTING.md](https://github.com/pasquelin/plugingsMap3D/blob/main/.github/CONTRIBUTING.md).
Un plugin **tiers** n'a pas besoin de vivre ici : ce gabarit sert aux plugins **officiels**.

- type: input
id: nom
attributes:
label: Nom proposé
placeholder: "@pasquelin/map3d-plugin-…"
validations:
required: true

- type: dropdown
id: voie
attributes:
label: Voie du contrat
options:
- "enrich — complète un objet après une interaction"
- "markers — pose des markers depuis une source distante"
- "layer — pose sa propre 3D dans engine.scene"
validations:
required: true

- type: textarea
id: valeur
attributes:
label: Ce qu'il apporte
description: Quelle donnée, pour quel usage, pour qui ?
validations:
required: true

- type: textarea
id: source
attributes:
label: Source de données
description: Service interrogé, licence des données, conditions d'utilisation, quotas, et si une clé d'API est nécessaire.
validations:
required: true

- type: checkboxes
id: checks
attributes:
label: Faisabilité
options:
- label: La licence de la source autorise cet usage.
- label: Le plugin tient dans une seule voie du contrat.
- label: Je suis prêt·e à en assurer la maintenance.
36 changes: 36 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
## Ce que fait cette PR

<!-- Le *pourquoi* avant le *quoi*. Une PR = un sujet. -->

Closes #

## Plugin(s) concerné(s)

- [ ] `@pasquelin/map3d-plugin-geopf`
- [ ] `@pasquelin/map3d-plugin-windy`
- [ ] `@pasquelin/map3d-plugin-plan-3d`
- [ ] `@pasquelin/map3d-plugin-template`
- [ ] Monorepo (build, CI, docs, outillage)

## Type

- [ ] `feat` — nouvelle fonctionnalité
- [ ] `fix` — correction de bug
- [ ] `docs` — documentation seule
- [ ] `refactor` / `perf` / `test` / `chore` / `ci`
- [ ] ⚠️ **Rupture d'API** (documentée dans le CHANGELOG)

## Vérifications

- [ ] La PR cible **`develop`** (et non `main`).
- [ ] Le titre suit les [Conventional Commits](https://www.conventionalcommits.org/fr/).
- [ ] `pnpm validater` passe en local (typecheck + lint + format:check + test).
- [ ] Des tests couvrent le changement (`*.test.ts` colocalisés).
- [ ] L'exemple du plugin tourne toujours : `pnpm --filter @pasquelin/map3d-plugin-<nom>-example dev`.
- [ ] `CHANGELOG.md` mis à jour sous `## [Non publié]` si le changement est visible pour l'utilisateur.
- [ ] Aucune clé d'API ni secret committé ; aucun `any` introduit.
- [ ] Aucune peerDependency (`react`, `react-dom`, `three`, `@pasquelin/map3d`) ajoutée aux `dependencies`.

## Comment tester

<!-- Étapes concrètes pour rejouer le changement. Capture ou GIF si l'effet est visuel. -->
Loading