UNPKG

create-vite-rubaine-react-ts

Version:

Template Vite + React + TypeScript avec système d'authentification et utilitaires API

681 lines (530 loc) 17.6 kB
# 🚀 Vite React TypeScript Core Template <div align="center"> **Template production-ready avec authentification JWT, routes protégées et client API complet.** [![React](https://img.shields.io/badge/React-19-61dafb?logo=react)](https://reactjs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178c6?logo=typescript)](https://www.typescriptlang.org/) [![Vite](https://img.shields.io/badge/Vite-5.0+-646cff?logo=vite)](https://vitejs.dev/) [![Bootstrap](https://img.shields.io/badge/Bootstrap-5.3-7952b3?logo=bootstrap)](https://getbootstrap.com/) [![MIT License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) [![GitHub release](https://img.shields.io/github/v/release/username/vite-react-core-template?logo=github)](../../releases) [🚀 Use Template](../../generate) • [📖 Documentation](#-utilisation) • [🐛 Issues](../../issues) • [💡 Discussions](../../discussions) </div> --- ## ⚡ Quick Start ### 🎯 Méthode 1: NPM Create (Recommandé) ⚡ ```bash # Nouvelle méthode officielle avec npm create npm create vite-rubaine-react-ts@latest mon-projet cd mon-projet npm install cp .env.example .env # Configurer votre API_URL npm run dev # Démarrer le serveur ⚡ ``` ### 🎯 Méthode 2: GitHub Template ```bash # Cliquez sur "Use this template" ↗️ en haut de cette page GitHub # puis clonez votre nouveau repo et lancez : npm install cp .env.example .env # Configurer votre API_URL npm run dev # Démarrer le serveur ⚡ ``` ### 🎯 Méthode 3: Clone Git ```bash git clone https://github.com/Rubaine/vite-react-typescript-template.git mon-projet cd mon-projet rm -rf .git && git init # Initialiser votre nouveau repo npm install cp .env.example .env npm run dev ``` ### 🎯 Méthode 4: Degit ```bash npx degit Rubaine/vite-react-typescript-template mon-projet cd mon-projet npm install cp .env.example .env npm run dev ``` ✨ **Votre app est prête !** → `http://localhost:5173` avec authentification JWT fonctionnelle. > 💡 **Méthode recommandée** : Utilisez `npm create vite-rubaine-react-ts@latest` pour la création la plus rapide ! > 💡 **Astuce** : Le template inclut une page d'accueil avec des explications détaillées et exemples d'usage ## 📋 Table des matières - [✨ Fonctionnalités](#-fonctionnalités) - [🏗️ Structure du projet](#-structure-du-projet) - [🚀 Installation](#-installation) - [⚙️ Configuration](#-configuration) - [🔧 Utilisation](#-utilisation) - [📚 API Reference](#-api-reference) - [💡 Exemples pratiques](#-exemples-pratiques) - [🛠️ Scripts & Build](#-scripts--build) - [🤝 Contribution](#-contribution) - [📝 Changelog](#-changelog) ## ✨ Fonctionnalités <table> <tr> <td> **🎯 Core Features** - ⚛️ React 19 + TypeScript + Vite - 🔐 Authentification JWT complète - 🛡️ Routes protégées automatiques - 🌐 Client API avec gestion d'erreurs - 💾 Persistance localStorage - 🎨 Bootstrap 5 intégré </td> <td> **🚀 Developer Experience** - 📁 Architecture modulaire claire - 🔧 Configuration flexible - 📝 Types TypeScript complets - 🔄 Refresh tokens automatique - 📖 Documentation complète - 🧪 Exemples d'usage inclus </td> </tr> </table> ## 🏗️ Structure du projet ``` 📦 src/ ├── 🎯 core/ # Fonctionnalités réutilisables │ ├── 🌐 api/ # Client API et utilitaires fetch │ │ └── fetch.tsx # GET, POST, PUT, DELETE + withAuth() │ ├── 🔐 auth/ # Système d'authentification │ │ └── AuthContext.tsx # Context React + hooks │ └── ⚙️ config/ # Configuration globale │ ├── global.tsx # Config app (URLs, etc.) │ ├── protectedRoute.tsx # HOC route protégée │ └── types.ts # Types TypeScript ├── 🧩 components/ # Composants réutilisables ├── 📱 views/ # Vues/Pages de l'application │ └── Home/ # Page d'accueil avec documentation │ ├── Home.tsx # Composant page d'accueil │ └── Home.css # Styles de la page ├── App.tsx # Composant principal + routing └── main.tsx # Point d'entrée ``` > 💡 **Note** : Le dossier `views/` contient vos pages principales. Organisez vos composants selon vos préférences ! > 💡 **Le dossier `core/` est le cœur du template** - copiez-le dans vos nouveaux projets ! ## 🚀 Installation <details> <summary><strong>🎯 Méthode 1 : NPM Create (Recommandée)</strong></summary> ```bash # Nouvelle méthode officielle npm create vite-rubaine-react-ts@latest mon-projet cd mon-projet npm install ``` Cette méthode utilise votre package npm publié et clone automatiquement le template. </details> <details> <summary><strong>📦 Méthode 2 : Template GitHub</strong></summary> 1. Cliquez sur **"Use this template"** en haut de cette page 2. Créez votre nouveau repository 3. Clonez votre nouveau repo : ```bash git clone https://github.com/votre-username/votre-projet.git cd votre-projet npm install ``` </details> <details> <summary><strong>📥 Méthode 3 : Clone direct</strong></summary> ```bash git clone https://github.com/Rubaine/vite-react-typescript-template.git mon-projet cd mon-projet rm -rf .git # Supprimer l'historique git git init # Initialiser votre propre repo npm install ``` </details> <details> <summary><strong>🚀 Méthode 4 : Degit</strong></summary> ```bash npx degit Rubaine/vite-react-typescript-template mon-projet cd mon-projet npm install ``` </details> <details> <summary><strong>🔧 Setup complet après installation</strong></summary> ```bash # 1. Configuration environnement cp .env.example .env nano .env # Éditer VITE_API_URL # 2. Personnalisation package.json nano package.json # Changer name, description, author # 3. Initialiser Git (si clone direct) rm -rf .git git init git add . git commit -m "🎉 Initial commit from vite-react-core-template" # 4. Premier build de test npm run build npm run preview ``` </details> ## ⚙️ Configuration ### 1. Variables d'environnement Créer un fichier `.env` à la racine : ```env # URL de votre API backend VITE_API_URL=http://localhost:5000 # Optionnel : autres variables VITE_APP_NAME=MonApp ``` ### 2. Configuration de l'authentification Personnaliser la configuration dans `App.tsx` : ```tsx <AuthProvider config={{ endpoints: { verify: "/api/auth/me", // Endpoint de vérification refresh: "/api/auth/refresh", // Endpoint de refresh token }, storage: { tokenKey: "access_token", // Clé localStorage pour le token userKey: "current_user", // Clé localStorage pour l'utilisateur }, autoVerify: false, // Désactiver la vérification auto }} > <App /> </AuthProvider> ``` ### 3. Configuration de l'API Modifier `src/core/config/global.tsx` : ```tsx export const Config = { Urls: { API: import.meta.env.VITE_API_URL || "http://localhost:3000/api", }, App: { Name: "Mon Application", Version: "1.0.0", }, }; ``` ## 🔧 Utilisation ### Authentification ```tsx import { useAuth } from "./core/auth/AuthContext"; function LoginForm() { const { login, logout, isAuthenticated, user, loading } = useAuth(); // Vérifier l'état de chargement if (loading) return <div>Chargement...</div>; // Connecter un utilisateur const handleLogin = async (credentials) => { const response = await postFetch("/auth/login", credentials); if (response.success) { login( response.data.token, response.data.refreshToken, response.data.user ); } }; // Interface conditionnelle return isAuthenticated ? ( <div> <h1>Bonjour {user?.name}!</h1> <button onClick={logout}>Se déconnecter</button> </div> ) : ( <LoginForm onSubmit={handleLogin} /> ); } ``` ### Organisation des vues Le template utilise une organisation claire des vues dans le dossier `src/views/` : ```tsx // src/views/Home/Home.tsx - Page d'accueil avec documentation export default function Home() { return ( <div className="container mt-4"> {/* Documentation intégrée du template */} <h1>🚀 Template React + TypeScript + Vite</h1> {/* Explications et exemples d'usage */} </div> ); } // Créez vos nouvelles vues de la même manière : // src/views/Dashboard/Dashboard.tsx // src/views/Profile/Profile.tsx // etc. ``` > 💡 **Conseil** : La page `Home` actuelle contient toute la documentation du template. Remplacez-la par votre vraie page d'accueil une fois familiarisé avec le template. ### Requêtes API ```tsx import { getFetch, postFetch, withAuth } from "./core/api/fetch"; import { useAuth } from "./core/auth/AuthContext"; function UserProfile() { const { token } = useAuth(); const [user, setUser] = useState(null); // GET avec authentification const fetchProfile = async () => { const response = await getFetch<User>("/profile", withAuth(token)); if (response.success) { setUser(response.data); } else { console.error(response.error); } }; // POST avec données const updateProfile = async (data) => { const response = await postFetch<User>("/profile", data, withAuth(token)); if (response.success) { setUser(response.data); } }; // Upload de fichier const uploadAvatar = async (file) => { const formData = new FormData(); formData.append("avatar", file); const response = await postFetch<User>( "/profile/avatar", formData, withAuth(token) ); // La détection FormData est automatique }; } ``` ### Routes protégées ```tsx import { Routes, Route } from "react-router-dom"; import ProtectedRoute from "./core/config/protectedRoute"; import Home from "./views/Home/Home"; function App() { return ( <Routes> {/* Routes publiques */} <Route path="/" element={<Home />} /> <Route path="/login" element={<Login />} /> <Route path="/register" element={<Register />} /> {/* Routes protégées */} <Route element={<ProtectedRoute />}> <Route path="/dashboard" element={<Dashboard />} /> <Route path="/profile" element={<Profile />} /> <Route path="/settings" element={<Settings />} /> </Route> </Routes> ); } ``` > 💡 **Structure recommandée** : Placez vos nouvelles pages dans `src/views/` et vos composants réutilisables dans `src/components/` ## 📚 API Reference ### Fonctions Fetch #### `getFetch<T>(route, headers?)` ```tsx const response = await getFetch<User[]>("/users"); // response: ApiResponse<User[]> ``` #### `postFetch<T>(route, data, headers?)` ```tsx const response = await postFetch<User>("/users", { name: "John" }); // Support automatique FormData et JSON ``` #### `putFetch<T>(route, data, headers?)` ```tsx const response = await putFetch<User>("/users/123", updateData); ``` #### `deleteFetch<T>(route, headers?)` ```tsx const response = await deleteFetch("/users/123"); ``` #### `withAuth(token, headers?)` ```tsx const headers = withAuth(userToken, { "Custom-Header": "value" }); // Retourne: { Authorization: 'Bearer token', 'Custom-Header': 'value' } ``` ### Hook useAuth ```tsx const { isAuthenticated, // boolean - État d'authentification token, // string | null - Token d'accès refreshToken, // string | null - Token de refresh user, // User | null - Données utilisateur login, // (token, refreshToken?, user?) => void logout, // () => void verifyToken, // (token?) => Promise<boolean> refreshAccessToken, // () => Promise<boolean> updateUser, // (user) => void loading, // boolean - État de chargement config, // AuthConfig - Configuration actuelle } = useAuth(); ``` ### Types principaux ```tsx interface ApiResponse<T> { status: number; data: T | null; error?: string; success: boolean; } interface User { id: string; email: string; name?: string; [key: string]: any; } interface AuthConfig { endpoints: { verify: string; refresh?: string; }; storage: { tokenKey: string; refreshTokenKey?: string; userKey?: string; }; autoVerify: boolean; } ``` ## 💡 Exemples pratiques ### Gestion d'erreurs robuste ```tsx const handleApiCall = async () => { const response = await getFetch<Data>("/data"); if (response.success) { // Succès - response.data est typé setData(response.data); } else { // Erreur - afficher le message setError(response.error); // Gestion spécifique par code de statut switch (response.status) { case 401: // Token expiré - redirection login logout(); break; case 403: // Pas d'autorisation setError("Accès refusé"); break; default: setError("Erreur serveur"); } } }; ``` ### Refresh automatique des tokens ```tsx // Le refresh est automatique, mais peut être manuel const { refreshAccessToken } = useAuth(); const handleExpiredToken = async () => { const success = await refreshAccessToken(); if (success) { // Token renouvelé, refaire la requête await retryApiCall(); } else { // Échec du refresh, déconnexion logout(); } }; ``` ### Configuration pour différents backends ```tsx // Pour une API REST classique <AuthProvider config={{ endpoints: { verify: "/api/auth/me", refresh: "/api/auth/refresh" } }} /> // Pour Firebase ou services tiers <AuthProvider config={{ endpoints: { verify: "/api/user/profile" }, autoVerify: false // Gérer manuellement }} /> // Pour des clés de stockage personnalisées <AuthProvider config={{ storage: { tokenKey: "jwt_token", userKey: "user_data" } }} /> ``` ## 🛠️ Scripts & Build | Script | Description | Usage | | ------------------ | ---------------------- | ------------------- | | `npm run dev` | 🚀 Dev server avec HMR | Développement local | | `npm run build` | 📦 Build optimisé | Production build | | `npm run preview` | 👀 Preview du build | Test avant deploy | | `npm run lint` | 🔍 ESLint check | Code quality | | `npm run lint:fix` | 🔧 Fix ESLint auto | Correction auto | <details> <summary><strong>📦 Guide de déploiement</strong></summary> ### Netlify ```bash npm run build # Drag & drop du dossier `dist/` sur Netlify ``` ### Vercel ```bash npm i -g vercel vercel --prod ``` ### GitHub Pages ```bash npm run build # Configurer GitHub Actions avec le workflow .github/workflows/deploy.yml ``` ### Docker ```dockerfile FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY dist/ ./dist/ EXPOSE 3000 CMD ["npx", "serve", "-s", "dist", "-l", "3000"] ``` </details> ## 🤝 Contribution Les contributions sont les bienvenues ! 🎉 <details> <summary><strong>🛠️ Comment contribuer</strong></summary> 1. **Fork** le projet 2. Créer une branche feature ```bash git checkout -b feature/amazing-feature ``` 3. **Développer** et tester ```bash npm run dev # Test local npm run build # Vérifier le build npm run lint # Code quality ``` 4. **Commit** avec un message descriptif ```bash git commit -m "✨ Add amazing feature" ``` 5. **Push** et créer une **Pull Request** ```bash git push origin feature/amazing-feature ``` </details> ### 🐛 Signaler un problème - **Bug** : [Créer une issue](../../issues/new?template=bug_report.md) - **Feature Request** : [Proposer une amélioration](../../issues/new?template=feature_request.md) - **Question** : [Démarrer une discussion](../../discussions) ## 📝 Changelog ### v1.0.0 (Latest) - ✨ Initial release - 🔐 JWT Authentication system - 🌐 Complete API client with TypeScript - 🛡️ Protected routes HOC - 📖 Comprehensive documentation - 🎨 Bootstrap 5 integration ## 📄 Licence MIT License - voir le fichier [LICENSE](LICENSE) pour plus de détails. --- <div align="center"> ## 🌟 Star ce projet si il vous aide ! **✨ Template créé avec ❤️ pour accélérer le développement React/TypeScript** [![GitHub stars](https://img.shields.io/github/stars/username/vite-react-core-template?style=social)](../../stargazers) [![GitHub forks](https://img.shields.io/github/forks/username/vite-react-core-template?style=social)](../../forks) [📖 Documentation](https://github.com/username/vite-react-core-template/wiki) • [💬 Discord Community](#) • [🐦 Twitter Updates](#) _Built with Vite ⚡ • Powered by React ⚛️ • Made with TypeScript 💙_ </div>