| name | vendure |
| description | 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. |
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
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
grep -rn "PaymentMethodHandler" references/
grep -rn "useDetailPage" references/reference/
grep -n "Button" references/UI/ui.md
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.sh -l -c
./login.sh -l -x
./login.sh -s -E /path/.env
./login.sh -e x@y.com -p z
./login.sh -l -q
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 } }'
./query.sh -d '{ me { id } }'
./query.sh -s -e /path/.env '{ administrators { totalItems } }'
./query.sh -c '{ me { id } }'
./query.sh -t 60 '{ me { id } }'
./query.sh -s -c -d '{ me { id } }'
./query.sh -H
./query.sh -I 3
./query.sh -L
./query.sh -L -s
./query.sh -R 3
./query.sh -R 3 -s
./query.sh -R 3 --vars '{"take": 5}'
./query.sh -R 3 --shop
./query.sh -R 3 -T
./query.sh -R 3 --set '.take=10'
./query.sh -R 3 --set '.take=10 | .skip=20'
./query.sh -R 3 --set '.filter.status="active"'
./query.sh -R 3 --set '.take=10' --set '.id="99"'
./query.sh '{ me { id } }' --diff "--superadmin"
./query.sh -R 3 --diff "--set '.take=20'"
./query.sh '{ products { totalItems } }' --diff "--shop"
./query.sh -R 3 --diff "--set '.take=1'" --diff-only
./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
./query.sh '{ me { id } }' --curl
./query.sh '{ products { items { id } } }' --superadmin --curl
./query.sh -R 3 --vars '{"take": 5}' --shop --curl
./query.sh '{ products { totalItems } }' --jq '.data.products.totalItems'
./query.sh '{ products { items { name } } }' --jq '.data.products.items[].name'
./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'
./query.sh '{ products { totalItems } }' --assert '.data.products.totalItems > 0'
./query.sh '{ product(id: "1") { id } }' -a '.data.product | type == "object"'
./query.sh '{ products { totalItems } }' --assert '.data.products.totalItems > 0' \
&& echo "Catalogue OK" || echo "Catalogue vide!"
./query.sh '{ products { totalItems } }' \
--assert '.data.products.totalItems > 0' \
--jq '.data.products.totalItems'
TOTAL=$(./query.sh -q '{ products { totalItems } }' -j '.data.products.totalItems')
echo "Total: $TOTAL"
./query.sh '{ products { items { id name } } }' --output /tmp/products.json
./query.sh '{ orders { items { id } } }' -o /tmp/orders.json
./query.sh -q '{ products { totalItems } }' \
--assert '.data.products.totalItems > 0' \
--jq '.data.products.totalItems' \
-o /tmp/count.txt
./query.sh -S get-me '{ me { id } }'
./query.sh -f queries/get-me.graphql
./query.sh '
query {
products(options: { take: 5 }) {
items { id name }
}
}
'
./query.sh --vars '{"id": "42"}' <<'EOF'
query GetProduct($id: ID!) {
product(id: $id) { name }
}
EOF
echo '{ me { id } }' | ./query.sh
./query.sh --shop '{ products { items { id name } } }'
./query.sh --shop '{ activeCustomer { id emailAddress } }'
./query.sh -T '{ me { id } }'
./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 :
./query.sh '{ products(options: { take: 5 }) { items { id name } } }'
./query.sh -H
./query.sh -I 2
./query.sh -R 2
./query.sh -R 2 -s
./query.sh -R 2 --vars '{"take": 10}'
./query.sh -R 2 --shop
./query.sh -R 2 --set '.take=10'
./query.sh -R 2 --set '.filter.status="pending"'
./query.sh -R 2 --set '.take=10' --set '.skip=5'
./query.sh -R 2 --diff "--superadmin"
./query.sh -R 2 --diff "--set '.take=10'"
./query.sh -R 2 --diff "--shop"
./query.sh -R 2 --diff "--set '.take=1'" --diff-only
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