vendure

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.

$ 安裝

git clone https://github.com/niko91i/Skills-Vendure ~/.claude/skills/Skills-Vendure

// tip: Run this command in your terminal to install the skill


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)

FichierLignesContenuQuand consulter
getting-started.md619Installation, création projet, premiers pasDémarrer un projet
developer-guide.md5,247Architecture, API Layer, Middleware, NestJSComprendre l'architecture
core-concepts.md1,502Collections, Money, Assets, Taxes, PaymentConcepts fondamentaux
extending-the-dashboard.md2,362Extensions React, routes, pages personnaliséesPersonnaliser l'admin
how-to.md2,880Custom fields, paiements, shipping calculatorsTutoriels spécifiques
storefront.md1,618Next.js, Remix, connexion API, startersCréer un storefront
deployment.md1,145Docker, production, sécurité, HardenPluginDéployer en production
user-guide.md473Utilisation Dashboard pour administrateursFormer les utilisateurs
migrating-from-v1.md302Breaking changes, guide de migration v1→v2Migration 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)

FichierLignesContenuQuand consulter
typescript-api.md21,561TOUT : Classes, interfaces, strategies, servicesRecherche API TypeScript
admin-ui-api.md5,712API Angular (deprecated), composants legacyMaintenir code Angular
core-plugins.md4,527EmailPlugin, AssetServerPlugin, HardenPlugin, etc.Configurer plugins officiels
dashboard.md3,585React hooks, composants Dashboard, extensionsDévelopper extensions React
graphql-api.md4,078Shop API, Admin API, queries, mutationsRequêtes GraphQL
reference.md35Index/overview de la sectionVue 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

FichierLignesComposantsQuand consulter
ui.md1,31542 composants : Button, Dialog, Card, Badge, Popover, Tabs...Éléments UI de base
form-inputs.md1,08211 composants : TextInput, SelectInput, CheckboxInput, DatePicker...Formulaires
layout.md862DetailPage, ListPage, PageLayout, TabsLayoutStructure de pages
framework.md516DataTable, AssetGallery, PaginationControlsAffichage de données
VENDURE_UI_COMPONENTS_BASE.md724Documentation de base des composantsRé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

  1. Démarrerreferences/Guides/getting-started.md
  2. Comprendrereferences/Guides/core-concepts.md (Money, Collections)
  3. Construirereferences/Guides/how-to.md
  4. Explorer → GraphQL Playground à /shop-api

🟡 Intermédiaire - Fonctionnalités personnalisées

  1. Rechercher APIreferences/reference/typescript-api.md
  2. Créer pluginsreferences/Guides/developer-guide.md
  3. Paiementsreferences/reference/core-plugins.md (StripePlugin)
  4. Emailsreferences/reference/core-plugins.md (EmailPlugin)

🔴 Avancé - Architecture & Production

  1. Architecturereferences/Guides/developer-guide.md (API Layer, Middleware)
  2. Dashboard customreferences/UI/ + references/Guides/extending-the-dashboard.md
  3. Sécuritéreferences/Guides/deployment.md (HardenPlugin, OWASP)
  4. Performance → State machines, caching, optimisations

Liens Rapides par Tâche

TâcheFichier de référence
Démarrer un projetGuides/getting-started.md
Afficher des prixGuides/core-concepts.md
Accepter des paiementsreference/core-plugins.md
Envoyer des emailsreference/core-plugins.md
Créer un pluginGuides/developer-guide.md
Upload de fichiersGuides/developer-guide.md
Valider commandesreference/typescript-api.md
Requêtes GraphQLreference/graphql-api.md
Stocker des prixGuides/core-concepts.md
Installer DashboardGuides/getting-started.md
Créer page DashboardUI/layout.md + Guides/extending-the-dashboard.md
Composants formulaireUI/form-inputs.md
DataTableUI/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

ScriptDescription
login.shAuthentification et aide aux requêtes curl
query.shExé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.

OptionAliasDescription
--from-last-lUtilise last-account.json
--superadmin-sMode superadmin
--email-eEmail de connexion
--password-pMot de passe
--env-EChemin .env
--export-xAffiche exports shell
--curl-example-cExemple curl complet
--quiet-qMode silencieux
--verbose-vMode 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

OptionAliasDescription
--vars-VVariables GraphQL JSON (remplace tout)
--set-Modifier une variable (merge jq)
--file-fFichier .graphql
--superadmin-sMode superadmin
--env-eChemin .env
--raw-rSortie JSON brute
--data-dAffiche seulement .data
--clear-cache-cForce reconnexion
--timeout-tTimeout en secondes
--history-HAffiche les 10 dernières requêtes
--last-LRé-exécute la dernière requête
--replay N-RRé-exécute la requête #N de l'historique
--inspect N-IAffiche query #N + variables (sans exécuter)
--save NAME-SSauvegarde dans queries/NAME.graphql
--shop-pUtilise /shop-api au lieu de /admin-api
--time-TAffiche 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-jAppliquer un filtre jq sur le résultat
--assert EXPR-aValider une condition jq (exit 1 si fausse)
--quiet-qMode silencieux (supprime tous les logs stderr)
--output FILE-oÉcrire le résultat dans un fichier
--verbose-vMode 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 :

  1. Re-scraper la documentation officielle docs.vendure.io
  2. Réorganiser les fichiers dans la structure Guides/reference/UI
  3. Mettre à jour les compteurs de lignes dans ce SKILL.md