Generate Registry
Script d'automatisation pour générer le fichier registry.json d'un registry shadcn/ui.
Installation
npx shadcn@latest add https://ui.oward.dev/r/registry.json generate-registryVue d'ensemble
Le script generate-registry.js est un outil d'automatisation Node.js qui génère et maintient le fichier registry.json pour un registry shadcn/ui. Il analyse automatiquement la structure de vos composants, utilitaires et styles pour créer un registry conforme au schéma officiel de shadcn/ui.
- Détection automatique des types disponibles (ui, lib, style, item, etc.)
- Extraction des dépendances npm depuis les imports ES6 et CommonJS
- Support des structures complexes avec sous-dossiers et fichiers multiples
Structure du projet
Le script s'attend à une structure de projet standard pour un registry shadcn/ui :
your-project/
├── registry.json # Fichier généré automatiquement
└── registry/ # Dossier source des composants
├── ui/ # Composants UI
├── lib/ # Utilitaires et hooks
├── style/ # Styles et tokens
└── item/ # Items complexes (blocks)Utilisation
Commande de base
Exécutez le script depuis le répertoire racine de votre registry :
node generate-registry.jsLe script va :
- Scanner le dossier
./registry/pour détecter les types disponibles - Pour chaque type, analyser les fichiers et extraire les métadonnées
- Générer automatiquement les entrées du registry avec leurs dépendances
- Sauvegarder le fichier
registry.json
Options CLI
Le script accepte plusieurs options pour personnaliser son comportement :
| Option | Alias | Description | Valeur par défaut |
|---|---|---|---|
--path <path> | -p | Chemin de base du projet | Répertoire courant |
--registry-path <path> | -r | Chemin vers le fichier registry.json | <path>/registry.json |
--registry-folder <path> | -f | Chemin vers le dossier des composants | <path>/registry |
--help | -h | Affiche l'aide | - |
Exemples d'utilisation
# Exécution depuis le répertoire courant
node generate-registry.js
# Avec un chemin spécifique
node generate-registry.js --path /path/to/project
# Avec vérification du code de sortie
node generate-registry.js || exit 1Les types
Le script détecte automatiquement les types de composants disponibles dans votre registry. Chaque type correspond à une catégorie de fichiers avec un rôle spécifique dans le registry shadcn/ui.
| Type | Dossier | Description |
|---|---|---|
registry:ui | ui/ | Composants UI et primitives mono-fichier |
registry:component | component/ | Composants simples |
registry:block | block/ | Composants complexes multi-fichiers |
registry:hook | hook/ | Hooks React |
registry:lib | lib/ | Bibliothèques utilitaires et helpers |
registry:page | page/ | Composants de page ou routes |
registry:style | style/ | Fichiers de styles (CSS, SCSS, LESS) |
registry:theme | theme/ | Configurations de thème |
registry:item | item/ | Items universels (supporte tous types de fichiers et multi-fichiers) |
registry:file | file/ | Fichiers divers |
Pour plus d'informations sur les types de registry, consultez la documentation officielle shadcn/ui.
Extraction des dépendances
Le script extrait automatiquement les dépendances npm depuis vos imports. Il supporte plusieurs syntaxes :
// Import simple
import { Button } from "lucide-react";
// Import type
import type { ButtonProps } from "lucide-react";
// Import tout
import \* as React from "react";Les modules built-in Node.js (fs, path, etc.) et les imports relatifs sont automatiquement exclus des dépendances du registry.
Spécifier des versions de dépendances
Par défaut, les dépendances sont extraites sans version. Pour spécifier des versions précises, vous avez deux options :
Pour les fichiers solo : Utilisez l'annotation @package dans les commentaires JSDoc :
/**
* @description My component with specific dependency versions
* @author Your Name <your.email@example.com>
* @package tailwind-merge@^3.4.0
* @package lucide-react@^0.400.0
*/
export function MyComponent() {
// ...
}Pour les items multi-fichiers : Créez un fichier meta-registry.json à la racine de l'item :
{
"description": "My complex component",
"author": "Your Name <your.email@example.com>",
"dependencies": {
"tailwind-merge": "^3.4.0",
"class-variance-authority": "^0.7.0"
}
}Vous n'avez besoin de spécifier que les dépendances nécessitant une version précise. Les autres dépendances seront auto-détectées sans version.
Métadonnées des items
Le script extrait automatiquement les métadonnées des composants de deux façons différentes :
Via JSDoc (fichier unique)
Pour les composants simples avec un seul fichier, ajoutez les métadonnées directement dans le code via les annotations JSDoc @description, @package et @author :
/**
* @description Un bouton personnalisable avec support des variantes et des tailles.
* @author Your Name <your.email@example.com>
* @package twailwind-merge@^3.4.0
*/
export function Button({ children, ...props }: ButtonProps) {
return <button {...props}>{children}</button>;
}Le script détectera automatiquement ces annotations et les ajoutera au registry.
Via meta-registry.json (items complexes)
Pour les items complexes avec plusieurs fichiers, créez un fichier meta-registry.json à la racine :
{
"description": "Script to generate tailwind-merge configuration from Tailwind CSS v4 @theme tokens",
"author": "Geoffrey From Oward <geoffrey@oward.fr>",
"dependencies": {
"tailwind-merge": "^3.4.0"
}
}Tous les champs de meta-registry.json sont optionnels. Seuls
description, author et dependencies sont supportés.
Structure d'un item
Composant simple (un seul fichier) :
registry/ui/button/
└── button.tsx # Avec @description, @author et @package en JSDocItem complexe (plusieurs fichiers) :
registry/item/dashboard/
├── dashboard.tsx # Fichier principal
├── components/
│ ├── header.tsx
│ └── sidebar.tsx
├── lib/
│ └── utils.ts
└── meta-registry.json # Métadonnées centralisées (description, author, dependencies)Ordre de priorité : meta-registry.json → annotations JSDoc → génération automatique.
Pour les items complexes multi-fichiers, utilisez meta-registry.json. Pour les fichiers uniques, vous pouvez utiliser les annotations JSDoc directement dans le code.
Exclure des fichiers de la génération
Le script supporte une métadonnée spéciale @registry-ignore qui permet d'exclure des fichiers de la génération du registry. C'est particulièrement utile pour les fichiers de base qui ne doivent pas être installables via la CLI shadcn.
// @registry-ignore
import { clsx, type ClassValue } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}Le fichier lib/utils.ts contenant la fonction cn() doit être ignoré car
il est automatiquement ajouté lors de npx shadcn@latest init. Tous les
composants shadcn supposent que cette fonction existe déjà dans le projet de
l'utilisateur à l'emplacement @/lib/utils.
Sortie du script
Le script génère un fichier registry.json conforme au schéma shadcn/ui :
{
"name": "my-registry",
"author": "Your Name",
"items": [
{
"name": "button",
"type": "registry:ui",
"description": "Un bouton personnalisable...",
"dependencies": ["class-variance-authority"],
"registryDependencies": ["utils"],
"files": [
{
"path": "ui/button.tsx",
"type": "registry:ui"
}
],
"meta": {
"author": "Your Name <your.email@example.com>"
}
}
]
}