Vendure E-Commerce Framework Skill
Assistance complète pour le développement Vendure, générée à partir de la documentation officielle (docs.vendure.io).
Quand utiliser ce Skill
Déclencher ce skill pour :
- Construction d'applications e-commerce headless avec Node.js/TypeScript
- Travail avec les APIs GraphQL pour produits, commandes ou gestion clients
- Implémentation d'intégrations de paiement (Stripe, handlers personnalisés)
- Création de plugins personnalisés ou extension des fonctionnalités Vendure
- Configuration de workflows de commande et machines à états
- Développement d'extensions Dashboard avec React
- Configuration de boutiques multi-devises ou multi-canaux
- Débogage de code Vendure ou résolution de problèmes e-commerce
- Apprentissage des bonnes pratiques Vendure pour le développement TypeScript
Concepts Clés
Concepts fondamentaux de l'architecture Vendure :
- Order State Machine - Workflow personnalisable (AddingItems → Delivered) via OrderProcess avec interceptors
- Custom Fields - Ajouter des propriétés aux entités via VendureConfig, extension automatique du schema GraphQL, support des relations et 10+ types de champs
- Plugins - Extensibilité via décorateur @VendurePlugin, hooks de cycle de vie, pattern InjectableStrategy pour comportement pluggable
Guide de Navigation
Ce skill est organisé en 3 sections principales pour une navigation optimale :
📚 references/Guides/ - Guides Pratiques (~16,000 lignes)
| Fichier |
Lignes |
Contenu |
Quand consulter |
getting-started.md |
619 |
Installation, création projet, premiers pas |
Démarrer un projet |
developer-guide.md |
5,247 |
Architecture, API Layer, Middleware, NestJS |
Comprendre l'architecture |
core-concepts.md |
1,502 |
Collections, Money, Assets, Taxes, Payment |
Concepts fondamentaux |
extending-the-dashboard.md |
2,362 |
Extensions React, routes, pages personnalisées |
Personnaliser l'admin |
how-to.md |
2,880 |
Custom fields, paiements, shipping calculators |
Tutoriels spécifiques |
storefront.md |
1,618 |
Next.js, Remix, connexion API, starters |
Créer un storefront |
deployment.md |
1,145 |
Docker, production, sécurité, HardenPlugin |
Déployer en production |
user-guide.md |
473 |
Utilisation Dashboard pour administrateurs |
Former les utilisateurs |
migrating-from-v1.md |
302 |
Breaking changes, guide de migration v1→v2 |
Migration de version |
Commandes grep utiles :
grep -n "OrderProcess" references/Guides/developer-guide.md
grep -n "Custom Fields" references/Guides/how-to.md
grep -n "Collections" references/Guides/core-concepts.md
📖 references/reference/ - Documentation API (~39,000 lignes)
| Fichier |
Lignes |
Contenu |
Quand consulter |
typescript-api.md |
21,561 |
TOUT : Classes, interfaces, strategies, services |
Recherche API TypeScript |
admin-ui-api.md |
5,712 |
API Angular (deprecated), composants legacy |
Maintenir code Angular |
core-plugins.md |
4,527 |
EmailPlugin, AssetServerPlugin, HardenPlugin, etc. |
Configurer plugins officiels |
dashboard.md |
3,585 |
React hooks, composants Dashboard, extensions |
Développer extensions React |
graphql-api.md |
4,078 |
Shop API, Admin API, queries, mutations |
Requêtes GraphQL |
reference.md |
35 |
Index/overview de la section |
Vue d'ensemble |
Fichier clé : typescript-api.md - Contient TOUTES les interfaces et classes Vendure.
Commandes grep utiles :
grep -n "^# " references/reference/typescript-api.md | head -50 # Liste des sections
grep -n "PaymentMethodHandler" references/reference/typescript-api.md
grep -n "OrderService" references/reference/typescript-api.md
grep -n "useDetailPage" references/reference/dashboard.md
🎨 references/UI/ - Composants Dashboard React (~4,500 lignes)
NOUVELLE SECTION - Composants UI pour extensions Dashboard
| Fichier |
Lignes |
Composants |
Quand consulter |
ui.md |
1,315 |
42 composants : Button, Dialog, Card, Badge, Popover, Tabs... |
Éléments UI de base |
form-inputs.md |
1,082 |
11 composants : TextInput, SelectInput, CheckboxInput, DatePicker... |
Formulaires |
layout.md |
862 |
DetailPage, ListPage, PageLayout, TabsLayout |
Structure de pages |
framework.md |
516 |
DataTable, AssetGallery, PaginationControls |
Affichage de données |
VENDURE_UI_COMPONENTS_BASE.md |
724 |
Documentation de base des composants |
Référence rapide |
Import standard :
import { Button, Card, Dialog, Badge } from "@vendure/dashboard";
import { TextInput, SelectInput } from "@vendure/dashboard";
import { DetailPage, ListPage } from "@vendure/dashboard";
Commandes grep utiles :
grep -A 20 "^## Button" references/UI/ui.md
grep -A 30 "TextInput" references/UI/form-inputs.md
grep -n "DetailPage" references/UI/layout.md
Workflows par Niveau
🟢 Débutant - Premier projet
- Démarrer →
references/Guides/getting-started.md
- Comprendre →
references/Guides/core-concepts.md (Money, Collections)
- Construire →
references/Guides/how-to.md
- Explorer → GraphQL Playground à
/shop-api
🟡 Intermédiaire - Fonctionnalités personnalisées
- Rechercher API →
references/reference/typescript-api.md
- Créer plugins →
references/Guides/developer-guide.md
- Paiements →
references/reference/core-plugins.md (StripePlugin)
- Emails →
references/reference/core-plugins.md (EmailPlugin)
🔴 Avancé - Architecture & Production
- Architecture →
references/Guides/developer-guide.md (API Layer, Middleware)
- Dashboard custom →
references/UI/ + references/Guides/extending-the-dashboard.md
- Sécurité →
references/Guides/deployment.md (HardenPlugin, OWASP)
- Performance → State machines, caching, optimisations
Liens Rapides par Tâche
| Tâche |
Fichier de référence |
| Démarrer un projet |
Guides/getting-started.md |
| Afficher des prix |
Guides/core-concepts.md |
| Accepter des paiements |
reference/core-plugins.md |
| Envoyer des emails |
reference/core-plugins.md |
| Créer un plugin |
Guides/developer-guide.md |
| Upload de fichiers |
Guides/developer-guide.md |
| Valider commandes |
reference/typescript-api.md |
| Requêtes GraphQL |
reference/graphql-api.md |
| Stocker des prix |
Guides/core-concepts.md |
| Installer Dashboard |
Guides/getting-started.md |
| Créer page Dashboard |
UI/layout.md + Guides/extending-the-dashboard.md |
| Composants formulaire |
UI/form-inputs.md |
| DataTable |
UI/framework.md |
Conseils de Navigation
Rechercher dans les fichiers
# Trouver une classe/interface
grep -rn "PaymentMethodHandler" references/
# Trouver un hook React
grep -rn "useDetailPage" references/reference/
# Trouver un composant UI
grep -n "Button" references/UI/ui.md
# Lister les sections d'un fichier
grep -n "^## " references/reference/typescript-api.md | head -30
Structure des chemins
references/
├── Guides/ # Tutoriels et guides pratiques
│ ├── getting-started.md
│ ├── developer-guide.md
│ ├── core-concepts.md
│ ├── extending-the-dashboard.md
│ ├── how-to.md
│ ├── storefront.md
│ ├── deployment.md
│ ├── user-guide.md
│ └── migrating-from-v1.md
├── reference/ # Documentation API technique
│ ├── typescript-api.md # ⭐ Le plus important (21k lignes)
│ ├── core-plugins.md
│ ├── dashboard.md
│ ├── graphql-api.md
│ ├── admin-ui-api.md
│ └── reference.md
└── UI/ # Composants Dashboard React
├── ui.md # 42 composants UI
├── form-inputs.md # 11 composants formulaire
├── layout.md # Pages et layouts
├── framework.md # DataTable, etc.
└── VENDURE_UI_COMPONENTS_BASE.md
Ressources Additionnelles
scripts/
Scripts utilitaires pour interagir avec les APIs GraphQL de Vendure.
Prérequis
curl - Requêtes HTTP
jq - Manipulation JSON
bash 5+ - Requis pour tableaux associatifs (macOS: brew install bash)
Scripts disponibles
| Script |
Description |
login.sh |
Authentification et aide aux requêtes curl |
query.sh |
Exécution simplifiée de requêtes GraphQL |
login.sh - Authentification et aide curl
Script d'authentification pour obtenir un token JWT et faciliter les requêtes curl.
| Option |
Alias |
Description |
--from-last |
-l |
Utilise last-account.json |
--superadmin |
-s |
Mode superadmin |
--email |
-e |
Email de connexion |
--password |
-p |
Mot de passe |
--env |
-E |
Chemin .env |
--export |
-x |
Affiche exports shell |
--curl-example |
-c |
Exemple curl complet |
--quiet |
-q |
Mode silencieux |
--verbose |
-v |
Mode verbeux |
./login.sh -l # Login avec last-account.json
./login.sh -l -c # Affiche exemple curl complet
./login.sh -l -x # Affiche exports shell
./login.sh -s -E /path/.env # Login superadmin
./login.sh -e x@y.com -p z # Login manuel
./login.sh -l -q # Mode silencieux (scripts)
query.sh - Requêtes GraphQL simplifiées
| Option |
Alias |
Description |
--vars |
-V |
Variables GraphQL JSON (remplace tout) |
--set |
- |
Modifier une variable (merge jq) |
--file |
-f |
Fichier .graphql |
--superadmin |
-s |
Mode superadmin |
--env |
-e |
Chemin .env |
--raw |
-r |
Sortie JSON brute |
--data |
-d |
Affiche seulement .data |
--clear-cache |
-c |
Force reconnexion |
--timeout |
-t |
Timeout en secondes |
--history |
-H |
Affiche les 10 dernières requêtes |
--last |
-L |
Ré-exécute la dernière requête |
--replay N |
-R |
Ré-exécute la requête #N de l'historique |
--inspect N |
-I |
Affiche query #N + variables (sans exécuter) |
--save NAME |
-S |
Sauvegarde dans queries/NAME.graphql |
--shop |
-p |
Utilise /shop-api au lieu de /admin-api |
--time |
-T |
Affiche le temps d'exécution |
--diff "OPTS" |
- |
Compare 2 exécutions (avant/après OPTS) |
--diff-only |
- |
Avec --diff: affiche uniquement les valeurs changées |
--no-fail |
- |
Ne pas exit 1 sur erreur GraphQL (continuer malgré les erreurs) |
--dry-run |
- |
Affiche la requête sans l'exécuter (pas d'auth) |
--curl |
- |
Génère la commande curl équivalente (copier-coller) |
--jq FILTER |
-j |
Appliquer un filtre jq sur le résultat |
--assert EXPR |
-a |
Valider une condition jq (exit 1 si fausse) |
--quiet |
-q |
Mode silencieux (supprime tous les logs stderr) |
--output FILE |
-o |
Écrire le résultat dans un fichier |
--verbose |
-v |
Mode verbeux |
./query.sh '{ me { id } }' # Requête simple
./query.sh -d '{ me { id } }' # Affiche seulement .data
./query.sh -s -e /path/.env '{ administrators { totalItems } }'
./query.sh -c '{ me { id } }' # Force reconnexion
./query.sh -t 60 '{ me { id } }' # Timeout 60s (défaut: 30s)
./query.sh -s -c -d '{ me { id } }' # Combinaison d'alias
# Historique et Replay (50 requêtes max, style Burp Repeater)
./query.sh -H # Affiche les 10 dernières
./query.sh -I 3 # Inspecte query #3 + variables (sans exécuter)
./query.sh -L # Ré-exécute la dernière
./query.sh -L -s # Dernière requête en superadmin
./query.sh -R 3 # Ré-exécute la requête #3
./query.sh -R 3 -s # Requête #3 en superadmin
./query.sh -R 3 --vars '{"take": 5}' # Requête #3 avec variables remplacées
./query.sh -R 3 --shop # Requête #3 sur shop-api
./query.sh -R 3 -T # Requête #3 avec timing
# Modifier des variables avec --set (merge intelligent)
./query.sh -R 3 --set '.take=10' # Modifier une variable
./query.sh -R 3 --set '.take=10 | .skip=20' # Modifier plusieurs (pipe jq)
./query.sh -R 3 --set '.filter.status="active"' # Objet imbriqué
./query.sh -R 3 --set '.take=10' --set '.id="99"' # Multiples --set
# Comparer deux exécutions avec --diff
./query.sh '{ me { id } }' --diff "--superadmin" # vendor vs superadmin
./query.sh -R 3 --diff "--set '.take=20'" # take=10 vs take=20
./query.sh '{ products { totalItems } }' --diff "--shop" # admin vs shop
# Mode compact avec --diff-only (affiche uniquement les chemins JSON modifiés)
./query.sh -R 3 --diff "--set '.take=1'" --diff-only
# Affiche: A .data.products.items[1].name = "Courgette"
# B .data.products.items[1].name = (absent)
# Prévisualiser sans exécuter avec --dry-run (pas d'authentification)
./query.sh '{ products { items { id } } }' --dry-run
./query.sh -R 3 --set '.take=10' --superadmin --dry-run
./query.sh --file queries/get-product.graphql --vars '{"id":"42"}' --shop --dry-run
# Affiche: 📝 Query, 📦 Variables, 🔑 Auth, 🌐 Endpoint + "(non exécuté)"
# Générer une commande curl équivalente (copier-coller)
./query.sh '{ me { id } }' --curl
./query.sh '{ products { items { id } } }' --superadmin --curl
./query.sh -R 3 --vars '{"take": 5}' --shop --curl
# Affiche:
# curl -X POST 'http://localhost:3000/admin-api' \
# -H 'Content-Type: application/json' \
# -H 'Authorization: Bearer eyJ...' \
# -d '{"query":"{ me { id } }","variables":{}}'
# Filtrer les résultats avec --jq
./query.sh '{ products { totalItems } }' --jq '.data.products.totalItems'
# → 42
./query.sh '{ products { items { name } } }' --jq '.data.products.items[].name'
# → Orange Sanguine
# → Courgette Longue verte
./query.sh '{ products { items { id name enabled } } }' \
--jq '.data.products.items[] | select(.enabled == true) | .name'
./query.sh '{ products { items { id } } }' -j '.data.products.items | length'
# → 5
# Valider avec --assert (exit 1 si condition fausse)
./query.sh '{ products { totalItems } }' --assert '.data.products.totalItems > 0'
./query.sh '{ product(id: "1") { id } }' -a '.data.product | type == "object"'
# Workflows conditionnels avec && / ||
./query.sh '{ products { totalItems } }' --assert '.data.products.totalItems > 0' \
&& echo "Catalogue OK" || echo "Catalogue vide!"
# Combiner --assert et --jq (valider puis extraire)
./query.sh '{ products { totalItems } }' \
--assert '.data.products.totalItems > 0' \
--jq '.data.products.totalItems'
# Mode silencieux avec --quiet (capture propre)
TOTAL=$(./query.sh -q '{ products { totalItems } }' -j '.data.products.totalItems')
echo "Total: $TOTAL"
# Écrire dans un fichier avec --output
./query.sh '{ products { items { id name } } }' --output /tmp/products.json
./query.sh '{ orders { items { id } } }' -o /tmp/orders.json
# Automatisation totale : --quiet + --output + --assert + --jq
./query.sh -q '{ products { totalItems } }' \
--assert '.data.products.totalItems > 0' \
--jq '.data.products.totalItems' \
-o /tmp/count.txt
# Sauvegarde
./query.sh -S get-me '{ me { id } }' # Sauvegarde dans queries/get-me.graphql
./query.sh -f queries/get-me.graphql # Charge et exécute
# Requête multi-lignes (guillemets simples)
./query.sh '
query {
products(options: { take: 5 }) {
items { id name }
}
}
'
# Avec variables (utiliser heredoc si la requête contient !)
./query.sh --vars '{"id": "42"}' <<'EOF'
query GetProduct($id: ID!) {
product(id: $id) { name }
}
EOF
# Depuis stdin
echo '{ me { id } }' | ./query.sh
# Shop API (storefront)
./query.sh --shop '{ products { items { id name } } }'
./query.sh --shop '{ activeCustomer { id emailAddress } }'
# Mesure du temps d'exécution
./query.sh -T '{ me { id } }' # Affiche "⏱ 74ms"
./query.sh -s -T '{ administrators { totalItems } }'
./query.sh --shop -T '{ products { items { id } } }'
⚠️ Limitation : Le caractère ! (ex: ID!) pose problème en inline à cause
du history expansion bash. Si erreur "Unexpected character", utiliser heredoc
(<<'EOF') ou fichier (--file query.graphql) à la place des guillemets simples.
Workflow de débogage (style Burp Repeater)
Le système d'historique et replay permet de déboguer efficacement les requêtes GraphQL :
# 1. Exécuter une requête qui échoue ou retourne des résultats inattendus
./query.sh '{ products(options: { take: 5 }) { items { id name } } }'
# 2. Consulter l'historique pour voir les requêtes récentes
./query.sh -H
# Affiche:
# [1] 14:23:01 { me { id } }...
# [2] 14:25:33 query GetProducts($take: Int)...
# [3] 14:28:45 { collections { items { id }...
# 3. Inspecter une requête AVANT de la rejouer (voir query + variables)
./query.sh -I 2
# ═══════════════════════════════════════════════════════════
# Query #2 (2025-12-30 14:25:33)
# ═══════════════════════════════════════════════════════════
# query GetProducts($take: Int) { products(options: { take: $take }) { ... } }
# ───────────────────────────────────────────────────────────
# Variables: {"take": 5}
# ═══════════════════════════════════════════════════════════
# 4. Rejouer une requête avec modifications
./query.sh -R 2 # Identique
./query.sh -R 2 -s # En superadmin (voir plus de données)
./query.sh -R 2 --vars '{"take": 10}' # Remplacer toutes les variables
./query.sh -R 2 --shop # Sur shop-api au lieu d'admin-api
# 5. Modifier des variables spécifiques avec --set (merge)
./query.sh -R 2 --set '.take=10' # Modifier une seule variable
./query.sh -R 2 --set '.filter.status="pending"' # Modifier un objet imbriqué
./query.sh -R 2 --set '.take=10' --set '.skip=5' # Modifier plusieurs variables
# 6. Comparer les résultats avec --diff
./query.sh -R 2 --diff "--superadmin" # vendor vs superadmin (diff coloré)
./query.sh -R 2 --diff "--set '.take=10'" # take=5 vs take=10
./query.sh -R 2 --diff "--shop" # admin-api vs shop-api
./query.sh -R 2 --diff "--set '.take=1'" --diff-only # Mode compact (chemins JSON)
Cas d'usage typiques :
- Inspecter avant de rejouer : voir la query complète et ses variables avec
-I
- Prévisualiser sans exécuter : utiliser
--dry-run pour voir query/variables/auth/endpoint sans connexion
- Générer curl : utiliser
--curl pour obtenir une commande curl copier-coller (Postman, CI/CD, partage)
- Modifier chirurgicalement : utiliser
--set pour changer une variable sans tout retaper
- Comparer rapidement : utiliser
--diff pour voir les différences, --diff-only pour le format compact
- Valider avant d'agir : utiliser
--assert pour vérifier des conditions (workflows conditionnels)
- Continuer malgré les erreurs : utiliser
--no-fail pour enchaîner plusieurs requêtes sans interruption
- Extraire et filtrer : utiliser
--jq pour extraire des valeurs spécifiques
- Capturer proprement : utiliser
--quiet pour supprimer les logs et capturer uniquement le résultat
- Sauvegarder les résultats : utiliser
--output pour écrire dans un fichier (JSON propre sans couleurs)
- Modifier des objets imbriqués facilement avec la syntaxe jq
- Basculer entre admin-api et shop-api pour comparer les comportements
- Analyser les erreurs de permission en comparant vendor vs superadmin
Fichiers générés
last-account.json : Credentials du dernier compte créé (email, password, vendorId)
.token-cache.vendor : Cache des tokens vendeur (30 min)
.token-cache.superadmin : Cache des tokens superadmin (30 min)
.query-history : Historique des 50 dernières requêtes GraphQL
queries/ : Requêtes GraphQL sauvegardées avec --save
Notes
- Ce skill est généré à partir de la documentation officielle Vendure (docs.vendure.io)
- Les exemples de code incluent la détection de langage pour le highlighting
- Toutes les valeurs monétaires sont représentées en entiers (diviser par 100 pour l'affichage)
- GraphQL est l'interface API principale (Shop API pour storefront, Admin API pour gestion)
- Le Dashboard utilise React et TailwindCSS - toujours importer depuis
@vendure/dashboard
Mise à jour
Pour rafraîchir ce skill avec une documentation mise à jour :
- Re-scraper la documentation officielle docs.vendure.io
- Réorganiser les fichiers dans la structure Guides/reference/UI
- Mettre à jour les compteurs de lignes dans ce SKILL.md
1---2name: vendure3description: Assiste au développement avec le framework e-commerce Vendure pour Node.js. Gère le commerce headless, les APIs GraphQL, la gestion des commandes, les catalogues produits, l'intégration des paiements et le développement TypeScript e-commerce. Utiliser lors du travail sur des projets Vendure, la création de plugins, ou l'intégration de storefronts.4---5
6# Vendure E-Commerce Framework Skill
7
8Assistance complète pour le développement Vendure, générée à partir de la documentation officielle (docs.vendure.io).
9
10## Quand utiliser ce Skill
11
12Déclencher ce skill pour :
13
14- **Construction d'applications e-commerce headless** avec Node.js/TypeScript
15- **Travail avec les APIs GraphQL** pour produits, commandes ou gestion clients
16- **Implémentation d'intégrations de paiement** (Stripe, handlers personnalisés)
17- **Création de plugins personnalisés** ou extension des fonctionnalités Vendure
18- **Configuration de workflows de commande** et machines à états
19- **Développement d'extensions Dashboard** avec React
20- **Configuration de boutiques multi-devises** ou multi-canaux
21- **Débogage de code Vendure** ou résolution de problèmes e-commerce
22- **Apprentissage des bonnes pratiques Vendure** pour le développement TypeScript
23
24## Concepts Clés
25
26Concepts fondamentaux de l'architecture Vendure :
27
28- **Order State Machine** - Workflow personnalisable (AddingItems → Delivered) via OrderProcess avec interceptors
29- **Custom Fields** - Ajouter des propriétés aux entités via VendureConfig, extension automatique du schema GraphQL, support des relations et 10+ types de champs
30- **Plugins** - Extensibilité via décorateur @VendurePlugin, hooks de cycle de vie, pattern InjectableStrategy pour comportement pluggable
31
32## Guide de Navigation
33
34Ce skill est organisé en **3 sections principales** pour une navigation optimale :
35
36### 📚 references/Guides/ - Guides Pratiques (~16,000 lignes)
37
38| Fichier | Lignes | Contenu | Quand consulter |
39| ---------------------------- | ------ | ---------------------------------------------- | ----------------------------- |
40| `getting-started.md` | 619 | Installation, création projet, premiers pas | **Démarrer un projet** |
41| `developer-guide.md` | 5,247 | Architecture, API Layer, Middleware, NestJS | **Comprendre l'architecture** |
42| `core-concepts.md` | 1,502 | Collections, Money, Assets, Taxes, Payment | **Concepts fondamentaux** |
43| `extending-the-dashboard.md` | 2,362 | Extensions React, routes, pages personnalisées | **Personnaliser l'admin** |
44| `how-to.md` | 2,880 | Custom fields, paiements, shipping calculators | **Tutoriels spécifiques** |
45| `storefront.md` | 1,618 | Next.js, Remix, connexion API, starters | **Créer un storefront** |
46| `deployment.md` | 1,145 | Docker, production, sécurité, HardenPlugin | **Déployer en production** |
47| `user-guide.md` | 473 | Utilisation Dashboard pour administrateurs | **Former les utilisateurs** |
48| `migrating-from-v1.md` | 302 | Breaking changes, guide de migration v1→v2 | **Migration de version** |
49
50**Commandes grep utiles :**
51
52```bash
53grep -n "OrderProcess" references/Guides/developer-guide.md
54grep -n "Custom Fields" references/Guides/how-to.md
55grep -n "Collections" references/Guides/core-concepts.md
56```
57
58---
59
60### 📖 references/reference/ - Documentation API (~39,000 lignes)
61
62| Fichier | Lignes | Contenu | Quand consulter |
63| ------------------- | ------ | ---------------------------------------------------- | -------------------------------- |
64| `typescript-api.md` | 21,561 | **TOUT** : Classes, interfaces, strategies, services | **Recherche API TypeScript** |
65| `admin-ui-api.md` | 5,712 | API Angular (deprecated), composants legacy | **Maintenir code Angular** |
66| `core-plugins.md` | 4,527 | EmailPlugin, AssetServerPlugin, HardenPlugin, etc. | **Configurer plugins officiels** |
67| `dashboard.md` | 3,585 | React hooks, composants Dashboard, extensions | **Développer extensions React** |
68| `graphql-api.md` | 4,078 | Shop API, Admin API, queries, mutations | **Requêtes GraphQL** |
69| `reference.md` | 35 | Index/overview de la section | Vue d'ensemble |
70
71**Fichier clé : `typescript-api.md`** - Contient TOUTES les interfaces et classes Vendure.
72
73**Commandes grep utiles :**
74
75```bash
76grep -n "^# " references/reference/typescript-api.md | head -50 # Liste des sections
77grep -n "PaymentMethodHandler" references/reference/typescript-api.md
78grep -n "OrderService" references/reference/typescript-api.md
79grep -n "useDetailPage" references/reference/dashboard.md
80```
81
82---
83
84### 🎨 references/UI/ - Composants Dashboard React (~4,500 lignes)
85
86**NOUVELLE SECTION** - Composants UI pour extensions Dashboard
87
88| Fichier | Lignes | Composants | Quand consulter |
89| ------------------------------- | ------ | -------------------------------------------------------------------- | ------------------------ |
90| `ui.md` | 1,315 | 42 composants : Button, Dialog, Card, Badge, Popover, Tabs... | **Éléments UI de base** |
91| `form-inputs.md` | 1,082 | 11 composants : TextInput, SelectInput, CheckboxInput, DatePicker... | **Formulaires** |
92| `layout.md` | 862 | DetailPage, ListPage, PageLayout, TabsLayout | **Structure de pages** |
93| `framework.md` | 516 | DataTable, AssetGallery, PaginationControls | **Affichage de données** |
94| `VENDURE_UI_COMPONENTS_BASE.md` | 724 | Documentation de base des composants | **Référence rapide** |
95
96**Import standard :**
97
98```tsx
99import { Button, Card, Dialog, Badge } from "@vendure/dashboard";
100import { TextInput, SelectInput } from "@vendure/dashboard";
101import { DetailPage, ListPage } from "@vendure/dashboard";
102```
103
104**Commandes grep utiles :**
105
106```bash
107grep -A 20 "^## Button" references/UI/ui.md
108grep -A 30 "TextInput" references/UI/form-inputs.md
109grep -n "DetailPage" references/UI/layout.md
110```
111
112## Workflows par Niveau
113
114### 🟢 Débutant - Premier projet
115
1161. **Démarrer** → `references/Guides/getting-started.md`
1172. **Comprendre** → `references/Guides/core-concepts.md` (Money, Collections)
1183. **Construire** → `references/Guides/how-to.md`
1194. **Explorer** → GraphQL Playground à `/shop-api`
120
121### 🟡 Intermédiaire - Fonctionnalités personnalisées
122
1231. **Rechercher API** → `references/reference/typescript-api.md`
1242. **Créer plugins** → `references/Guides/developer-guide.md`
1253. **Paiements** → `references/reference/core-plugins.md` (StripePlugin)
1264. **Emails** → `references/reference/core-plugins.md` (EmailPlugin)
127
128### 🔴 Avancé - Architecture & Production
129
1301. **Architecture** → `references/Guides/developer-guide.md` (API Layer, Middleware)
1312. **Dashboard custom** → `references/UI/` + `references/Guides/extending-the-dashboard.md`
1323. **Sécurité** → `references/Guides/deployment.md` (HardenPlugin, OWASP)
1334. **Performance** → State machines, caching, optimisations
134
135## Liens Rapides par Tâche
136
137| Tâche | Fichier de référence |
138| ---------------------- | ---------------------------------------------------- |
139| Démarrer un projet | `Guides/getting-started.md` |
140| Afficher des prix | `Guides/core-concepts.md` |
141| Accepter des paiements | `reference/core-plugins.md` |
142| Envoyer des emails | `reference/core-plugins.md` |
143| Créer un plugin | `Guides/developer-guide.md` |
144| Upload de fichiers | `Guides/developer-guide.md` |
145| Valider commandes | `reference/typescript-api.md` |
146| Requêtes GraphQL | `reference/graphql-api.md` |
147| Stocker des prix | `Guides/core-concepts.md` |
148| Installer Dashboard | `Guides/getting-started.md` |
149| Créer page Dashboard | `UI/layout.md` + `Guides/extending-the-dashboard.md` |
150| Composants formulaire | `UI/form-inputs.md` |
151| DataTable | `UI/framework.md` |
152
153## Conseils de Navigation
154
155### Rechercher dans les fichiers
156
157```bash
158# Trouver une classe/interface
159grep -rn "PaymentMethodHandler" references/
160
161# Trouver un hook React
162grep -rn "useDetailPage" references/reference/
163
164# Trouver un composant UI
165grep -n "Button" references/UI/ui.md
166
167# Lister les sections d'un fichier
168grep -n "^## " references/reference/typescript-api.md | head -30
169```
170
171### Structure des chemins
172
173```
174references/
175├── Guides/ # Tutoriels et guides pratiques
176│ ├── getting-started.md
177│ ├── developer-guide.md
178│ ├── core-concepts.md
179│ ├── extending-the-dashboard.md
180│ ├── how-to.md
181│ ├── storefront.md
182│ ├── deployment.md
183│ ├── user-guide.md
184│ └── migrating-from-v1.md
185├── reference/ # Documentation API technique
186│ ├── typescript-api.md # ⭐ Le plus important (21k lignes)
187│ ├── core-plugins.md
188│ ├── dashboard.md
189│ ├── graphql-api.md
190│ ├── admin-ui-api.md
191│ └── reference.md
192└── UI/ # Composants Dashboard React
193 ├── ui.md # 42 composants UI
194 ├── form-inputs.md # 11 composants formulaire
195 ├── layout.md # Pages et layouts
196 ├── framework.md # DataTable, etc.
197 └── VENDURE_UI_COMPONENTS_BASE.md
198```
199
200## Ressources Additionnelles
201
202### scripts/
203
204Scripts utilitaires pour interagir avec les APIs GraphQL de Vendure.
205
206#### Prérequis
207
208- `curl` - Requêtes HTTP
209- `jq` - Manipulation JSON
210- `bash` 5+ - Requis pour tableaux associatifs (macOS: `brew install bash`)
211
212#### Scripts disponibles
213
214| Script | Description |
215| ---------- | ------------------------------------------ |
216| `login.sh` | Authentification et aide aux requêtes curl |
217| `query.sh` | Exécution simplifiée de requêtes GraphQL |
218
219#### `login.sh` - Authentification et aide curl
220
221Script d'authentification pour obtenir un token JWT et faciliter les requêtes curl.
222
223| Option | Alias | Description |
224| ---------------- | ----- | ------------------------- |
225| `--from-last` | `-l` | Utilise last-account.json |
226| `--superadmin` | `-s` | Mode superadmin |
227| `--email` | `-e` | Email de connexion |
228| `--password` | `-p` | Mot de passe |
229| `--env` | `-E` | Chemin .env |
230| `--export` | `-x` | Affiche exports shell |
231| `--curl-example` | `-c` | Exemple curl complet |
232| `--quiet` | `-q` | Mode silencieux |
233| `--verbose` | `-v` | Mode verbeux |
234
235```bash
236./login.sh -l # Login avec last-account.json
237./login.sh -l -c # Affiche exemple curl complet
238./login.sh -l -x # Affiche exports shell
239./login.sh -s -E /path/.env # Login superadmin
240./login.sh -e x@y.com -p z # Login manuel
241./login.sh -l -q # Mode silencieux (scripts)
242```
243
244**`query.sh`** - Requêtes GraphQL simplifiées
245
246| Option | Alias | Description |
247| --------------- | ----- | --------------------------------------------------------------- |
248| `--vars` | `-V` | Variables GraphQL JSON (remplace tout) |
249| `--set` | - | Modifier une variable (merge jq) |
250| `--file` | `-f` | Fichier .graphql |
251| `--superadmin` | `-s` | Mode superadmin |
252| `--env` | `-e` | Chemin .env |
253| `--raw` | `-r` | Sortie JSON brute |
254| `--data` | `-d` | Affiche seulement .data |
255| `--clear-cache` | `-c` | Force reconnexion |
256| `--timeout` | `-t` | Timeout en secondes |
257| `--history` | `-H` | Affiche les 10 dernières requêtes |
258| `--last` | `-L` | Ré-exécute la dernière requête |
259| `--replay N` | `-R` | Ré-exécute la requête #N de l'historique |
260| `--inspect N` | `-I` | Affiche query #N + variables (sans exécuter) |
261| `--save NAME` | `-S` | Sauvegarde dans `queries/NAME.graphql` |
262| `--shop` | `-p` | Utilise `/shop-api` au lieu de `/admin-api` |
263| `--time` | `-T` | Affiche le temps d'exécution |
264| `--diff "OPTS"` | - | Compare 2 exécutions (avant/après OPTS) |
265| `--diff-only` | - | Avec --diff: affiche uniquement les valeurs changées |
266| `--no-fail` | - | Ne pas exit 1 sur erreur GraphQL (continuer malgré les erreurs) |
267| `--dry-run` | - | Affiche la requête sans l'exécuter (pas d'auth) |
268| `--curl` | - | Génère la commande curl équivalente (copier-coller) |
269| `--jq FILTER` | `-j` | Appliquer un filtre jq sur le résultat |
270| `--assert EXPR` | `-a` | Valider une condition jq (exit 1 si fausse) |
271| `--quiet` | `-q` | Mode silencieux (supprime tous les logs stderr) |
272| `--output FILE` | `-o` | Écrire le résultat dans un fichier |
273| `--verbose` | `-v` | Mode verbeux |
274
275```bash
276./query.sh '{ me { id } }' # Requête simple
277./query.sh -d '{ me { id } }' # Affiche seulement .data
278./query.sh -s -e /path/.env '{ administrators { totalItems } }'
279./query.sh -c '{ me { id } }' # Force reconnexion
280./query.sh -t 60 '{ me { id } }' # Timeout 60s (défaut: 30s)
281./query.sh -s -c -d '{ me { id } }' # Combinaison d'alias
282
283# Historique et Replay (50 requêtes max, style Burp Repeater)
284./query.sh -H # Affiche les 10 dernières
285./query.sh -I 3 # Inspecte query #3 + variables (sans exécuter)
286./query.sh -L # Ré-exécute la dernière
287./query.sh -L -s # Dernière requête en superadmin
288./query.sh -R 3 # Ré-exécute la requête #3
289./query.sh -R 3 -s # Requête #3 en superadmin
290./query.sh -R 3 --vars '{"take": 5}' # Requête #3 avec variables remplacées
291./query.sh -R 3 --shop # Requête #3 sur shop-api
292./query.sh -R 3 -T # Requête #3 avec timing
293
294# Modifier des variables avec --set (merge intelligent)
295./query.sh -R 3 --set '.take=10' # Modifier une variable
296./query.sh -R 3 --set '.take=10 | .skip=20' # Modifier plusieurs (pipe jq)
297./query.sh -R 3 --set '.filter.status="active"' # Objet imbriqué
298./query.sh -R 3 --set '.take=10' --set '.id="99"' # Multiples --set
299
300# Comparer deux exécutions avec --diff
301./query.sh '{ me { id } }' --diff "--superadmin" # vendor vs superadmin
302./query.sh -R 3 --diff "--set '.take=20'" # take=10 vs take=20
303./query.sh '{ products { totalItems } }' --diff "--shop" # admin vs shop
304
305# Mode compact avec --diff-only (affiche uniquement les chemins JSON modifiés)
306./query.sh -R 3 --diff "--set '.take=1'" --diff-only
307# Affiche: A .data.products.items[1].name = "Courgette"
308# B .data.products.items[1].name = (absent)
309
310# Prévisualiser sans exécuter avec --dry-run (pas d'authentification)
311./query.sh '{ products { items { id } } }' --dry-run
312./query.sh -R 3 --set '.take=10' --superadmin --dry-run
313./query.sh --file queries/get-product.graphql --vars '{"id":"42"}' --shop --dry-run
314# Affiche: 📝 Query, 📦 Variables, 🔑 Auth, 🌐 Endpoint + "(non exécuté)"
315
316# Générer une commande curl équivalente (copier-coller)
317./query.sh '{ me { id } }' --curl
318./query.sh '{ products { items { id } } }' --superadmin --curl
319./query.sh -R 3 --vars '{"take": 5}' --shop --curl
320# Affiche:
321# curl -X POST 'http://localhost:3000/admin-api' \
322# -H 'Content-Type: application/json' \
323# -H 'Authorization: Bearer eyJ...' \
324# -d '{"query":"{ me { id } }","variables":{}}'
325
326# Filtrer les résultats avec --jq
327./query.sh '{ products { totalItems } }' --jq '.data.products.totalItems'
328# → 42
329./query.sh '{ products { items { name } } }' --jq '.data.products.items[].name'
330# → Orange Sanguine
331# → Courgette Longue verte
332./query.sh '{ products { items { id name enabled } } }' \
333 --jq '.data.products.items[] | select(.enabled == true) | .name'
334./query.sh '{ products { items { id } } }' -j '.data.products.items | length'
335# → 5
336
337# Valider avec --assert (exit 1 si condition fausse)
338./query.sh '{ products { totalItems } }' --assert '.data.products.totalItems > 0'
339./query.sh '{ product(id: "1") { id } }' -a '.data.product | type == "object"'
340
341# Workflows conditionnels avec && / ||
342./query.sh '{ products { totalItems } }' --assert '.data.products.totalItems > 0' \
343 && echo "Catalogue OK" || echo "Catalogue vide!"
344
345# Combiner --assert et --jq (valider puis extraire)
346./query.sh '{ products { totalItems } }' \
347 --assert '.data.products.totalItems > 0' \
348 --jq '.data.products.totalItems'
349
350# Mode silencieux avec --quiet (capture propre)
351TOTAL=$(./query.sh -q '{ products { totalItems } }' -j '.data.products.totalItems')
352echo "Total: $TOTAL"
353
354# Écrire dans un fichier avec --output
355./query.sh '{ products { items { id name } } }' --output /tmp/products.json
356./query.sh '{ orders { items { id } } }' -o /tmp/orders.json
357
358# Automatisation totale : --quiet + --output + --assert + --jq
359./query.sh -q '{ products { totalItems } }' \
360 --assert '.data.products.totalItems > 0' \
361 --jq '.data.products.totalItems' \
362 -o /tmp/count.txt
363
364# Sauvegarde
365./query.sh -S get-me '{ me { id } }' # Sauvegarde dans queries/get-me.graphql
366./query.sh -f queries/get-me.graphql # Charge et exécute
367
368# Requête multi-lignes (guillemets simples)
369./query.sh '
370query {
371 products(options: { take: 5 }) {
372 items { id name }
373 }
374}
375'
376
377# Avec variables (utiliser heredoc si la requête contient !)
378./query.sh --vars '{"id": "42"}' <<'EOF'
379query GetProduct($id: ID!) {
380 product(id: $id) { name }
381}
382EOF
383
384# Depuis stdin
385echo '{ me { id } }' | ./query.sh
386
387# Shop API (storefront)
388./query.sh --shop '{ products { items { id name } } }'
389./query.sh --shop '{ activeCustomer { id emailAddress } }'
390
391# Mesure du temps d'exécution
392./query.sh -T '{ me { id } }' # Affiche "⏱ 74ms"
393./query.sh -s -T '{ administrators { totalItems } }'
394./query.sh --shop -T '{ products { items { id } } }'
395```
396
397> **⚠️ Limitation** : Le caractère `!` (ex: `ID!`) pose problème en inline à cause
398> du history expansion bash. Si erreur "Unexpected character", utiliser **heredoc**
399> (`<<'EOF'`) ou **fichier** (`--file query.graphql`) à la place des guillemets simples.
400
401#### Workflow de débogage (style Burp Repeater)
402
403Le système d'historique et replay permet de déboguer efficacement les requêtes GraphQL :
404
405```bash
406# 1. Exécuter une requête qui échoue ou retourne des résultats inattendus
407./query.sh '{ products(options: { take: 5 }) { items { id name } } }'
408
409# 2. Consulter l'historique pour voir les requêtes récentes
410./query.sh -H
411# Affiche:
412# [1] 14:23:01 { me { id } }...
413# [2] 14:25:33 query GetProducts($take: Int)...
414# [3] 14:28:45 { collections { items { id }...
415
416# 3. Inspecter une requête AVANT de la rejouer (voir query + variables)
417./query.sh -I 2
418# ═══════════════════════════════════════════════════════════
419# Query #2 (2025-12-30 14:25:33)
420# ═══════════════════════════════════════════════════════════
421# query GetProducts($take: Int) { products(options: { take: $take }) { ... } }
422# ───────────────────────────────────────────────────────────
423# Variables: {"take": 5}
424# ═══════════════════════════════════════════════════════════
425
426# 4. Rejouer une requête avec modifications
427./query.sh -R 2 # Identique
428./query.sh -R 2 -s # En superadmin (voir plus de données)
429./query.sh -R 2 --vars '{"take": 10}' # Remplacer toutes les variables
430./query.sh -R 2 --shop # Sur shop-api au lieu d'admin-api
431
432# 5. Modifier des variables spécifiques avec --set (merge)
433./query.sh -R 2 --set '.take=10' # Modifier une seule variable
434./query.sh -R 2 --set '.filter.status="pending"' # Modifier un objet imbriqué
435./query.sh -R 2 --set '.take=10' --set '.skip=5' # Modifier plusieurs variables
436
437# 6. Comparer les résultats avec --diff
438./query.sh -R 2 --diff "--superadmin" # vendor vs superadmin (diff coloré)
439./query.sh -R 2 --diff "--set '.take=10'" # take=5 vs take=10
440./query.sh -R 2 --diff "--shop" # admin-api vs shop-api
441./query.sh -R 2 --diff "--set '.take=1'" --diff-only # Mode compact (chemins JSON)
442```
443
444**Cas d'usage typiques :**
445
446- **Inspecter avant de rejouer** : voir la query complète et ses variables avec `-I`
447- **Prévisualiser sans exécuter** : utiliser `--dry-run` pour voir query/variables/auth/endpoint sans connexion
448- **Générer curl** : utiliser `--curl` pour obtenir une commande curl copier-coller (Postman, CI/CD, partage)
449- **Modifier chirurgicalement** : utiliser `--set` pour changer une variable sans tout retaper
450- **Comparer rapidement** : utiliser `--diff` pour voir les différences, `--diff-only` pour le format compact
451- **Valider avant d'agir** : utiliser `--assert` pour vérifier des conditions (workflows conditionnels)
452- **Continuer malgré les erreurs** : utiliser `--no-fail` pour enchaîner plusieurs requêtes sans interruption
453- **Extraire et filtrer** : utiliser `--jq` pour extraire des valeurs spécifiques
454- **Capturer proprement** : utiliser `--quiet` pour supprimer les logs et capturer uniquement le résultat
455- **Sauvegarder les résultats** : utiliser `--output` pour écrire dans un fichier (JSON propre sans couleurs)
456- Modifier des objets imbriqués facilement avec la syntaxe jq
457- Basculer entre admin-api et shop-api pour comparer les comportements
458- Analyser les erreurs de permission en comparant vendor vs superadmin
459
460#### Fichiers générés
461
462- `last-account.json` : Credentials du dernier compte créé (email, password, vendorId)
463- `.token-cache.vendor` : Cache des tokens vendeur (30 min)
464- `.token-cache.superadmin` : Cache des tokens superadmin (30 min)
465- `.query-history` : Historique des 50 dernières requêtes GraphQL
466- `queries/` : Requêtes GraphQL sauvegardées avec `--save`
467
468## Notes
469
470- Ce skill est généré à partir de la documentation officielle Vendure (docs.vendure.io)
471- Les exemples de code incluent la détection de langage pour le highlighting
472- Toutes les valeurs monétaires sont représentées en entiers (diviser par 100 pour l'affichage)
473- GraphQL est l'interface API principale (Shop API pour storefront, Admin API pour gestion)
474- Le Dashboard utilise React et TailwindCSS - toujours importer depuis `@vendure/dashboard`
475
476## Mise à jour
477
478Pour rafraîchir ce skill avec une documentation mise à jour :
479
4801. Re-scraper la documentation officielle docs.vendure.io
4812. Réorganiser les fichiers dans la structure Guides/reference/UI
4823. Mettre à jour les compteurs de lignes dans ce SKILL.md