-```
-
-### Les Layouts
-
-Nexy supporte les layouts imbriqués pour une meilleure organisation des vues.
-
-```html
-
-
-
-
- {% block title %}{% endblock %}
-
-
-
-
-
- {{children | safe}}
-
-
-
-
-
-```
-
-[Suite dans la prochaine partie...]
-
-## 🌟 **Nexy**
-
-> *Un framework Python conçu pour allier simplicité, performance et plaisir du développement.*
-
----
-
-## **📢 Un message de l'équipe Nexy**
-
-⚠️ *Cette documentation est en cours de création.*
-L'équipe de développement travaille activement sur un **site dédié**, pour offrir une documentation complète, claire et accessible. Notre objectif est de vous fournir une **expérience développeur exceptionnelle**, adaptée aussi bien aux débutants qu'aux experts.
-
----
-
-## **🐍 La philosophie Python au cœur de Nexy**
-
-Python est un langage qui se distingue par sa **simplicité, sa lisibilité** et sa grande efficacité. C'est cette philosophie qui a inspiré Nexy : rendre le développement **plus simple**, **plus rapide**, mais sans jamais sacrifier la performance.
-
-### **Un constat**
-
-Aujourd'hui, Python regorge de frameworks backend puissants, tels que :
-- **Flask**
-- **FastAPI**
-- **Starlette**, etc.
-
-Ces outils sont indéniablement **performants et modulaires**, mais leur **documentation** peut parfois être intimidante et les **configurations** complexes. Même un framework complet comme **Django** peut parfois sembler lourd et difficile à aborder, même pour les développeurs expérimentés.
-
-### **Nexy : simplicité et efficacité**
-
-Chez Nexy, nous croyons que **simple ne signifie pas limité**.
-Nous avons conçu Nexy pour que les développeurs puissent se concentrer sur l'essentiel sans avoir à se perdre dans des configurations complexes.
-
-**Ce que nous vous proposons :**
-- **Démarrage rapide** : Pas de longue configuration. Vous êtes opérationnel en quelques lignes de code.
-- **Code propre et modulaire** : Organisez vos projets de manière fluide et maintenez un code lisible, même pour des projets de grande envergure.
-- **Performance optimale** : Profitez de la rapidité de Python tout en préservant la simplicité.
-
-**Le code, c'est de l'art**. Chez Nexy, chaque ligne doit être un plaisir à écrire, et votre expérience développeur compte autant que la performance du code.
-
----
-
-## **🎯 Nos Objectifs**
-
-1. **Expérience développeur** : Rendre chaque étape du projet, du démarrage au déploiement, intuitive et agréable.
-2. **Performance** : Maximiser les performances sans sacrifier la simplicité.
-3. **Simplicité évolutive** : Débutez simplement et restez productif même lorsque votre projet se complexifie.
-
-### **Ce qui nous différencie :**
-
-- **Structure modulaire** : Organisez vos projets de manière claire et évolutive.
-- **Configuration automatique** : Nexy détecte automatiquement les routes et fichiers sans que vous ayez à vous en soucier.
-- **Philosophie "Plug & Play"** : Avancez rapidement sans perdre de temps dans des configurations compliquées.
-
----
-
-## **📂 Structure de Projet**
-
-Voici un exemple d'organisation typique avec Nexy :
-
-```plaintext
-nexy/
- ├── app/
- │ ├── controller.py # Contrôleur principal pour `/`
- │ ├── model.py # Gestion des données pour `/`
- │ ├── service.py # Logique métier pour `/`
- │ ├── documents/ # Endpoint `/documents`
- │ │ ├── controller.py # Contrôleur pour `/documents`
- │ │ ├── model.py # Gestion des données pour `/documents`
- │ │ ├── service.py # Logique métier pour `/documents`
- │ │ └── [documentId]/ # Endpoint dynamique `/documents/{documentId}`
- │ │ ├── controller.py
- │ │ ├── model.py
- │ │ └── service.py
- │ └── users/
- │ ├── controller.py # Contrôleur pour `/users`
- │ ├── model.py # Gestion des données pour `/users`
- │ └── service.py # Logique métier pour `/users`
- └── main.py # Point d'entrée de l'application
-```
-
-**💡 Astuce** : La structure des dossiers reflète vos routes, vous offrant ainsi une lisibilité immédiate et une organisation naturelle.
-
----
-
-# Pré-requis
-
-> Veuillez vous assurer que vous utilisez `Python >= 3.12`, car Nexy n'est **pas compatible** avec les versions `Python < 3.12`.
-
-## Comment vérifier votre version de Python ?
-Exécutez cette commande dans votre terminal :
-
-```shell
- python --version
-
-```
-
-
-
-----
-## **🚀 Installation et Démarrage**
-
-### Étape 1 : Créez un répertoire pour votre projet et placez-vous dedans
-
-
-1. Installez Nexy et ses dépendances :
- ```shell
- pip install nexy inquirerpy=="0.3.4"
- ```
-
-Votre API est maintenant accessible sur **http://127.0.0.1:8000** 🎉
-
-Une fois que l'application est en cours d'exécution, tu peux accéder à la documentation Swagger en naviguant vers **http://localhost:8000/docs** dans ton navigateur.
-
----
-
-## **🧩 Concepts Clés avec des Exemples**
-
-### 1. **Contrôleur de Base**
-
-Chaque route est définie dans un fichier `controller.py`. Exemple :
-```python
-# app/controller.py
-async def GET():
- return {"message": "Hello, world"}
-
-async def POST(data: dict):
- return {"message": "Voici vos données", "data": data}
-```
-
-### 2. **Routes Dynamiques**
-
-Les routes dynamiques sont automatiquement détectées :
-```plaintext
-app/documents/[documentId]/controller.py
-```
-```python
-# app/documents/[documentId]/controller.py
-async def GET(documentId: int):
- return {"documentId": documentId, "message": "Document trouvé"}
-```
-
-### 3. **Architecture Modulaire avec `model` et `service`**
-
-Séparez la logique métier et la gestion des données :
-```python
-# app/users/controller.py
-from .service import get_users, add_user
-
-async def GET():
- users = get_users()
- return {"users": users}
-
-async def POST(user: dict):
- return add_user(user)
-```
-
-```python
-# app/users/service.py
-from .model import User
-
-def get_users():
- return User.all()
-
-def add_user(data: dict):
- user = User(**data)
- user.save()
- return {"message": "Utilisateur ajouté", "user": user}
-```
-
----
-
-
-
-## **📚 Pourquoi Nexy ?**
-
-- **Pour les débutants** : Vous trouverez une approche simple, sans surcharge de concepts, pour apprendre à coder rapidement.
-- **Pour les experts** : La structure modulaire et la performance vous permettront de réaliser des projets de grande envergure tout en gardant un code propre et bien organisé.
-- **Pour tous les développeurs** : Profitez de la facilité d'utilisation tout en écrivant un code performant et élégant.
-
-Avec Nexy, vous allez découvrir un framework **simple, puissant et agréable à utiliser**. Ce n'est pas seulement un framework : c'est un outil pour **libérer votre créativité**, **accélérer votre développement**, et surtout, **vous faire apprécier chaque ligne de code**.
-
----
-
-
-## **📢 Contribuez à Nexy !**
-
-🚀 Nexy est open-source et vous attend sur [GitHub](https://github.com/NexyPy/Nexy). Partagez vos idées, améliorez le framework et faites partie de la révolution backend Python.
-
-**💡 Nexy : Plus qu'un framework, un outil pour vous.**
----
-
-
-## 🔄 Actions et Interactivité
-
-### Le Système d'Actions
-
-Nexy introduit un système d'actions puissant qui permet de créer des interfaces interactives sans écrire de JavaScript complexe.
-
-#### Actions Simples
-
-```html
-
-
-
-
-
-```
-
-### Gestion d'État
-
-Nexy permet de gérer l'état de votre application de manière simple et efficace.
-
-```python
-# app/state.py
-from nexy import State
-
-users = State([]) # État initial
-
-def add_user(name: str):
- users.set([*users.get(), {"name": name}])
- return users.get()
-
-def remove_user(id: int):
- users.set([u for u in users.get() if u.id != id])
- return users.get()
-```
-
-## 📦 Organisation du Code
-
-### Structure Recommandée
-
-```plaintext
-mon-projet/
- ├── app/
- │ ├── controller.py # Contrôleur principal
- │ ├── view.html # Vue principale
- │ ├── actions.py # Actions globales
- │ ├── components/ # Composants réutilisables
- │ │ ├── Button.html
- │ │ └── Card.html
- │ ├── users/ # Module Users
- │ │ ├── controller.py
- │ │ ├── view.html
- │ │ ├── actions.py
- │ │ └── service.py
- │ └── blog/ # Module Blog
- │ ├── controller.py
- │ ├── view.html
- │ └── [slug]/
- │ └── controller.py
- ├── public/ # Fichiers statiques
- │ ├── css/
- │ ├── js/
- │ └── images/
- ├── tests/ # Tests
- └── nexy-config.py # Configuration
-```
-
-### Bonnes Pratiques
-
-#### 1. Organisation Modulaire
-
-Regroupez les fonctionnalités liées dans des modules :
-
-```plaintext
-app/users/
- ├── controller.py # Gestion des requêtes
- ├── service.py # Logique métier
- ├── view.html # Interface utilisateur
- └── actions.py # Interactions utilisateur
-```
-
-#### 2. Séparation des Responsabilités
-
-```python
-# app/users/controller.py
-from .service import UserService
-
-service = UserService()
-
-async def GET():
- return service.get_users()
-
-# app/users/service.py
-class UserService:
- def get_users(self):
- # Logique métier isolée
- return [...]
-```
-
-## 🛠️ Outils de Développement
-
-### CLI Nexy
-
-```bash
-# Création
-nexy new mon-projet # Nouveau projet
-nexy g co users # Nouveau controller
-nexy g s users # Nouveau service
-
-# Développement
-nexy dev # Serveur de développement
-nexy build # Construction pour production
-```
-
-### Hot Reload
-
-Nexy inclut un système de rechargement automatique en développement :
-- Modifications de code Python
-- Changements dans les templates
-- Mise à jour des fichiers statiques
-
-## 🚀 Déploiement
-
-### Construction pour Production
-
-```bash
-nexy build
-```
-
-### Configuration de Production
-
-```python
-# nexy-config.py
-from nexy import Nexy
-
-app = Nexy(
- production=True,
- static_cache=True
-)
-```
-
-### Plateformes Supportées
-
-- Vercel
-- Heroku
-- Docker
-- VPS classique
-
-## 🎯 Exemples Complets
-
-### 1. Application Todo
-
-```python
-# app/todos/controller.py
-from nexy import HTMLResponse, CustomResponse
-
-todos = []
-
-@CustomResponse(type=HTMLResponse)
-async def GET():
- return {"todos": todos}
-
-async def POST(data: dict):
- todos.append(data)
- return {"status": "success"}
-```
-
-```html
-
-{% from "app/components/button.html" import Button %}
-
-
-
-
-
- {% for todo in todos %}
-
- {{todo.task}}
-
-
- {% endfor %}
-
-
-```
-
-### 2. API REST
-
-```python
-# app/api/users/controller.py
-from typing import List
-from pydantic import BaseModel
-
-class User(BaseModel):
- id: int
- name: str
- email: str
-
-users: List[User] = []
-
-async def GET():
- return {"users": users}
-
-async def POST(user: User):
- users.append(user)
- return {"status": "created", "user": user}
-```
-
-## 🤝 Contribution
-
-1. Fork le projet
-2. Créez votre branche (`git checkout -b feature/AmazingFeature`)
-3. Committez vos changements (`git commit -m 'Add AmazingFeature'`)
-4. Push vers la branche (`git push origin feature/AmazingFeature`)
-5. Ouvrez une Pull Request
-
-## 📚 Ressources
-
-- [Documentation Officielle](https://docs.nexy.py)
-- [Guide de Démarrage](https://docs.nexy.py/getting-started)
-- [Exemples](https://github.com/nexy/examples)
-- [Discord Community](https://discord.gg/nexy)
-
-## ❓ FAQ
-
-### Q: Nexy est-il prêt pour la production ?
-R: Oui ! Nexy est construit sur FastAPI et suit les meilleures pratiques de développement.
-
-### Q: Puis-je utiliser Nexy pour des APIs uniquement ?
-R: Absolument ! Bien que Nexy excelle dans les applications full-stack, il est parfait pour les APIs REST.
-
-### Q: Comment contribuer à Nexy ?
-R: Consultez notre guide de contribution et rejoignez notre Discord !
-
-## 🌟 Pour Finir
-
-Nexy est plus qu'un framework - c'est une nouvelle façon de penser le développement web en Python. Simple mais puissant, il vous permet de vous concentrer sur ce qui compte vraiment : créer des applications exceptionnelles.
-
----
-
-*Fait avec ❤️ par la communauté Python*
-
-
-
-## ✨ Features Clés
-- 🚀 Routing automatique basé sur la structure de fichiers
-- ⚡ Réactivité native sans JavaScript
-- 🔒 Sécurité intégrée avec JWT/OAuth2
-- 📦 Architecture modulaire prête pour l'entreprise
\ No newline at end of file
diff --git a/README.md b/README.md
index 40bc8941..552e437b 100644
--- a/README.md
+++ b/README.md
@@ -1,41 +1,16 @@
# Nexy
-Nexy is a modern, fast, and secure framework for building web applications with Python. It is a full-stack framework that allows you to build web applications with Python.
-
+Nexy is a modern, fast, and secure framework for building web applications with Python. It combines the power of Python with modern web development practices to create high-performance, scalable applications. With built-in support for async operations, type safety, and a rich ecosystem of plugins, Nexy makes it easy to build robust web applications.
+## Features
+- 🚀 **Fast**: Built on top of modern Python async capabilities
+- 🛡️ **Secure**: Built-in security features and best practices
+- 🔧 **Extensible**: Rich plugin ecosystem
+- 📦 **Full-stack**: Integrated frontend and backend solutions
+- 🎯 **Type-safe**: First-class TypeScript-like type support
+- 🔥 **Hot Reload**: Automatic reloading during development
## Getting Started
-First, run the development server:
-
-```bash
-npm run dev
-# or
-yarn dev
-# or
-pnpm dev
-# or
-bun dev
-```
-
-Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
-
-You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
-
-This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
-
-## Learn More
-
-To learn more about Next.js, take a look at the following resources:
-
-- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
-- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
-
-You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
-
-## Deploy on Vercel
-
-The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
-
-Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
+First, create a new Nexy project:
diff --git a/bun.lockb b/bun.lockb
index 3c1b39fd..deacbd68 100644
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/nexy.vs.others.md b/nexy.vs.others.md
deleted file mode 100644
index b88949e1..00000000
--- a/nexy.vs.others.md
+++ /dev/null
@@ -1,454 +0,0 @@
-# Nexy vs Autres Frameworks Python
-
-## Table des Matières
-
-1. [Routing & Réponses](#1-routing--réponses)
-2. [Templates & Layouts](#2-templates--layouts)
-3. [État & Réactivité](#3-état--réactivité)
-4. [WebSockets & Temps Réel](#4-websockets--temps-réel)
-5. [Formulaires & Validation](#5-formulaires--validation)
-6. [Middleware & Hooks](#6-middleware--hooks)
-7. [CLI & Développement](#7-cli--développement)
-8. [Sécurité & Performance](#8-sécurité--performance)
-9. [Déploiement & Production](#9-déploiement--production)
-
-## 1. Routing & Réponses
-
-### Django
-```python
-# urls.py
-urlpatterns = [
- path('users/', views.user_list),
- path('users//', views.user_detail),
-]
-
-# views.py
-def user_list(request):
- users = User.objects.all()
- return render(request, 'users/list.html', {'users': users})
-```
-➡️ **Limitations**:
-- Configuration manuelle des URLs
-- Séparation URLs/Vues
-- Pas de layouts imbriqués natifs
-
-
-
-
-
-### FastAPI
-```python
-@app.get("/users", response_class=HTMLResponse)
-async def get_users():
- return """..."""
-
-@app.get("/users/{id}")
-async def get_user(id: int):
- return {"user": get_user(id)}
-```
-➡️ **Limitations**:
-- Pas de système de templates intégré
-- Gestion manuelle du type de réponse
-
-### Nexy
-```python
-# app/users/controller.py
-from nexy import CustomResponse, HTMLResponse, JSONResponse
-
-@CustomResponse(type=HTMLResponse) # Cherche view.html automatiquement
-async def GET():
- """Route: /users"""
- return {"users": get_users()}
-
-@CustomResponse(type=JSONResponse)
-async def API():
- """Route: /users/api"""
- return {"users": get_users()}
-
-# app/users/[id]/controller.py
-from fastapi import Depends
-from .dependencies import get_user_or_404
-
-async def GET(
- id: int,
- user = Depends(get_user_or_404) # Fonctionnalités FastAPI
-):
- return {"user": user}
-```
-
-### Layouts Imbriqués Nexy
-```html
-
-
-
-
- {% block title %}{% endblock %}
-
-
-
- {{ children | safe }}
-
-
-
-
-{% extends "app/layout.html" %}
-
-
- {{ children | safe }}
-
-
-
-{% extends "app/users/layout.html" %}
-
- {% include "components/user-header.html" %}
- {{ children | safe }}
-
-```
-
-### Structure des Fichiers Nexy
-```plaintext
-app/
- ├── layout.html # Layout principal
- ├── controller.py # GET /
- ├── view.html # Vue principale
- ├── users/
- │ ├── layout.html # Layout users
- │ ├── controller.py # GET /users
- │ ├── view.html # Vue liste users
- │ └── [id]/
- │ ├── layout.html # Layout détail user
- │ ├── controller.py # GET /users/{id}
- │ └── view.html # Vue détail user
-```
-
-### Avantages Nexy
-1. **Convention Over Configuration**
- - Routes basées sur les dossiers
- - Détection automatique des templates
- - Types de réponses intelligents
-
-2. **Héritage FastAPI**
- - Dépendances
- - Validation Pydantic
- - OpenAPI/Swagger
-
-3. **Layouts Puissants**
- - Imbrication illimitée
- - Composants réutilisables
- - Héritage flexible
-
-[Suite dans la prochaine partie...]
-
-## La Révolution Nexy
-
-Nexy réinvente le développement web Python en combinant :
-- La **simplicité** que les développeurs méritent
-- La **performance** dont les applications modernes ont besoin
-- La **réactivité** que les utilisateurs attendent
-
-### 1. Routing Intelligent
-
-**Avant (Django/Flask/FastAPI)**
-```python
-# Django
-urlpatterns = [
- path('users/', views.users),
- path('users//', views.user_detail),
-]
-
-# Flask
-@app.route('/users/')
-def user_detail(id):
- pass
-
-# FastAPI
-@app.get('/users/{id}')
-def user_detail(id: int):
- pass
-```
-
-**Avec Nexy**
-```python
-# app/users/[id]/controller.py
-async def GET(id: int):
- return {"user": get_user(id)}
-```
-
-### 2. Templates Réactifs
-
-**Avant**
-```html
-
-
- {% for user in users %}
-
{{ user.name }}
- {% endfor %}
-
-
-```
-
-**Avec Nexy**
-```html
-
-
- {% for user in users %}
-
{{ user.name }}
- {% endfor %}
-
-```
-
-### 3. Actions Serveur
-
-**Avant**
-```javascript
-// JavaScript traditionnel
-async function deleteUser(id) {
- await fetch(`/api/users/${id}`, {
- method: 'DELETE'
- });
- await updateUI();
-}
-```
-
-**Avec Nexy**
-```html
-
-
-```
-
-### 4. Performance
-
-```plaintext
-Benchmark: 1000 requêtes simultanées
-
-Framework | Temps de Réponse | Mémoire
-----------|-----------------|----------
-Django | 180ms | 512MB
-Flask | 120ms | 128MB
-FastAPI | 45ms | 64MB
-Nexy | 45ms | 64MB
-```
-
-## Pourquoi Nexy ?
-
-### Pour les Startups
-- Développement rapide
-- De l'idée à la production en minutes
-- Scaling sans effort
-
-### Pour les Entreprises
-- Code maintenable
-- Performance optimale
-- Sécurité intégrée
-
-### Pour les Développeurs
-- DX exceptionnelle
-- Moins de code
-- Plus de fonctionnalités
-
-## L'Innovation Nexy
-
-1. **File-based Routing**
- - Structure intuitive
- - Zéro configuration
- - Routes dynamiques automatiques
-
-2. **Réactivité Native**
- - Pas de JavaScript complexe
- - État synchronisé automatiquement
- - Performance optimale
-
-3. **Actions Serveur**
- - Communication client-serveur simplifiée
- - Sécurité par défaut
- - Réactivité instantanée
-
-## En Résumé
-
-Nexy n'est pas juste un nouveau framework - c'est une nouvelle façon de penser le développement web en Python :
-
-- **Plus Rapide** que Django
-- **Plus Structuré** que Flask
-- **Plus Complet** que FastAPI
-- **Plus Moderne** que tous
-
-C'est le premier framework Python qui comprend vraiment les besoins des développeurs modernes.
-
----
-
-*"Nexy : Le framework Python qui aurait dû exister depuis le début."*
-
-## 2. Templates & Réactivité
-
-### Django
-```html
-
-{% extends "base.html" %}
-{% block content %}
-
- {% for user in users %}
- {{ UserCard(user=user) }}
- {% endfor %}
-
-
-
-```
-
-```python
-# app/users/actions.py
-from nexy import State
-
-users = State([])
-
-def add_user(name: str):
- """Action appelée par le formulaire"""
- current = users.get()
- new_user = {"id": len(current) + 1, "name": name}
- users.set([*current, new_user])
- return users.get() # Mise à jour automatique des zones 'response'
-
-def delete_user(id: int):
- """Action appelée par les boutons de suppression"""
- current = users.get()
- users.set([u for u in current if u['id'] != id])
- return users.get()
-```
-
-### Composants Réutilisables
-```html
-
-{% macro UserCard(user) %}
-
-
{{ user.name }}
-
-
-
-
-
-{% endmacro %}
-
-
-{% macro Modal(id) %}
-
- {% if content %}
-
- {{ content | safe }}
-
-
- {% endif %}
-
-{% endmacro %}
-```
-
-### État Réactif
-```python
-# state/users.py
-from nexy import State
-from typing import List, Optional
-from pydantic import BaseModel
-
-class User(BaseModel):
- id: int
- name: str
- email: Optional[str] = None
-
-class UsersState:
- def __init__(self):
- self.users: State[List[User]] = State([])
- self.selected_user: State[Optional[User]] = State(None)
- self.loading: State[bool] = State(False)
-
- def select_user(self, id: int):
- self.loading.set(True)
- user = self.users.get().find(lambda u: u.id == id)
- self.selected_user.set(user)
- self.loading.set(False)
- return {
- "user": self.selected_user.get(),
- "loading": self.loading.get()
- }
-
-users_state = UsersState()
-```
-
-### Avantages de la Réactivité Nexy
-
-1. **Réactivité Native**
- - Pas de JavaScript nécessaire
- - Mise à jour automatique du DOM
- - État synchronisé serveur/client
-
-2. **Actions Serveur**
- - Communication bidirectionnelle simple
- - Validation côté serveur
- - Retour d'erreurs intégré
-
-3. **Composants**
- - Réutilisables
- - Paramétrables
- - Réactifs
-
-4. **État**
- - Géré côté serveur
- - Type-safe avec Pydantic
- - Mises à jour atomiques
-
-[Suite dans la prochaine partie...]
-Je continue avec la partie sur les WebSockets et le temps réel ?
-
-| Caractéristique | Nexy | FastAPI | Django | Flask |
-|----------------|------|---------|--------|-------|
-| **Setup Rapide** | 🚀✅ | ⚠️ | ❌ | ✅ |
-| **Performance** | 🚀✅ | 🚀✅ | ⚠️ | ⚠️ |
\ No newline at end of file
diff --git a/package.json b/package.json
index 51ddd0fd..1e886e5a 100644
--- a/package.json
+++ b/package.json
@@ -4,36 +4,37 @@
"private": true,
"scripts": {
"dev": "next dev --turbopack",
- "build": "next build",
+ "build": "next build --turbopack",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"@mdx-js/loader": "^3.1.0",
"@mdx-js/react": "^3.1.0",
- "@next/mdx": "^15.1.6",
- "@tailwindcss/postcss": "^4.0.0",
- "@tailwindcss/typography": "latest",
- "@types/dompurify": "^3.0.5",
+ "@next/mdx": "^15.3.1",
+ "@tailwindcss/postcss": "^4.1.4",
+ "@tailwindcss/typography": "^0.5.16",
+ "@types/dompurify": "^3.2.0",
"@types/mdx": "^2.0.13",
- "dompurify": "^3.2.4",
+ "@vercel/analytics": "^1.5.0",
+ "dompurify": "^3.2.5",
"install": "^0.13.0",
- "motion": "^12.0.11",
- "next": "15.1.6",
- "react": "^19.0.0",
- "react-dom": "^19.0.0",
+ "motion": "^12.9.2",
+ "next": "^15.3.1",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0",
"zustand": "^5.0.3"
},
"devDependencies": {
- "@eslint/eslintrc": "^3.2.0",
- "@types/node": "^20.17.17",
- "@types/react": "^19.0.8",
- "@types/react-dom": "^19.0.3",
- "eslint": "^9.19.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@types/node": "^20.17.31",
+ "@types/react": "^19.1.2",
+ "@types/react-dom": "^19.1.2",
+ "eslint": "^9.25.1",
"eslint-config-next": "15.1.6",
- "postcss": "^8.5.1",
- "shiki": "^2.3.1",
- "tailwindcss": "^4.0.0",
- "typescript": "^5.7.3"
+ "postcss": "^8.5.3",
+ "shiki": "^2.5.0",
+ "tailwindcss": "^4.1.4",
+ "typescript": "^5.8.3"
}
}
diff --git a/public/ai.png b/public/ai.png
new file mode 100644
index 00000000..5c988be7
Binary files /dev/null and b/public/ai.png differ
diff --git a/public/maskot.png b/public/maskot.png
new file mode 100644
index 00000000..2a3fd2d3
Binary files /dev/null and b/public/maskot.png differ
diff --git a/read.md b/read.md
deleted file mode 100644
index 7585725c..00000000
--- a/read.md
+++ /dev/null
@@ -1,535 +0,0 @@
-# Nexy Framework
-
-> Un framework Python moderne qui transforme le développement web en une expérience agréable et productive, construit sur la puissance de FastAPI.
-
-## Table des Matières
-
-1. [Introduction](#introduction)
-2. [Installation](#installation)
-3. [Guide de Démarrage](#guide-de-démarrage)
-4. [Architecture](#architecture)
-5. [Fonctionnalités Principales](#fonctionnalités-principales)
-6. [Fonctionnalités Avancées](#fonctionnalités-avancées)
-7. [Sécurité](#sécurité)
-8. [Performance](#performance)
-9. [Déploiement](#déploiement)
-10. [Contribution](#contribution)
-11. [Ressources](#ressources)
-
-## Introduction
-
-### La Vision de Nexy
-
-Nexy est né d'une vision simple mais ambitieuse : créer un framework web Python qui allie la puissance de FastAPI avec une expérience développeur exceptionnelle. Notre objectif est de permettre aux développeurs de se concentrer sur la création de valeur plutôt que sur la configuration technique.
-
-### Pourquoi Nexy ?
-
-- **Simplicité d'Utilisation** : Architecture intuitive et conventions claires
-- **Performance Optimale** : Basé sur FastAPI et ses fondations asynchrones
-- **Productivité Maximale** : Génération automatique de code et outils CLI puissants
-- **Flexibilité** : S'adapte aussi bien aux petits projets qu'aux applications d'entreprise
-- **Sécurité Intégrée** : Bonnes pratiques de sécurité par défaut
-- **Documentation Complète** : Guides détaillés et exemples pratiques
-
-### Comparaison avec d'Autres Frameworks
-
-| Caractéristique | Nexy | FastAPI | Django | Flask |
-|----------------|------|----------|---------|-------|
-| Setup Rapide | ✅ | ⚠️ | ❌ | ✅ |
-| Performance | ✅ | ✅ | ⚠️ | ⚠️ |
-| Batteries Included | ✅ | ❌ | ✅ | ❌ |
-| Courbe d'Apprentissage | Faible | Moyenne | Élevée | Faible |
-
-## Installation
-
-### Prérequis Détaillés
-
-- Python 3.12 ou supérieur
-- pip version 21.0 ou supérieure
-- Virtualenv (recommandé)
-- Git (pour le contrôle de version)
-
-### Installation Pas à Pas
-
-```bash
-# 1. Créer un environnement virtuel
-python -m venv venv
-source venv/bin/activate # Linux/Mac
-venv\Scripts\activate # Windows
-
-# 2. Installer Nexy et ses dépendances
-pip install nexy inquirerpy=="0.3.4"
-
-# 3. Créer un nouveau projet
-nexy new mon-projet
-
-# 4. Initialiser Git (optionnel mais recommandé)
-cd mon-projet
-git init
-```
-
-### Structure Initiale Détaillée
-
-```plaintext
-mon-projet/
-├── app/
-│ ├── controller.py # Contrôleur principal
-│ ├── view.html # Vue principale
-│ ├── models/ # Modèles de données
-│ │ └── __init__.py
-│ ├── services/ # Services métier
-│ │ └── __init__.py
-│ └── utils/ # Utilitaires
-│ └── __init__.py
-├── public/ # Fichiers statiques
-│ ├── css/
-│ ├── js/
-│ └── images/
-├── tests/ # Tests unitaires et d'intégration
-│ └── __init__.py
-├── .env # Variables d'environnement
-├── .gitignore # Configuration Git
-└── nexy-config.py # Configuration de l'application
-```
-
-## Guide de Démarrage
-
-### Premier Contrôleur
-
-```python
-# app/controller.py
-from typing import Dict, Optional
-from pydantic import BaseModel
-
-class Response(BaseModel):
- status: str
- message: str
- data: Optional[Dict] = None
-
-async def GET():
- """
- Point d'entrée principal - GET /
-
- Returns:
- Response: Message de bienvenue avec statut
- """
- return Response(
- status="success",
- message="Bienvenue sur Nexy!",
- data={"version": "1.0.0"}
- )
-
-async def POST(data: dict):
- """
- Gestion des requêtes POST sur /
-
- Args:
- data (dict): Données reçues dans la requête
-
- Returns:
- Response: Confirmation de réception des données
- """
- return Response(
- status="success",
- message="Données reçues avec succès",
- data=data
- )
-```
-
-### Première Vue
-
-```html
-
-
-
-
-
-
- {{ title | default("Mon Application Nexy") }}
-
-
-
-
-
-
-
-
-
{{ title }}
-
-
- {% block content %}
-
{{ message }}
- {% endblock %}
-
-
-
-
-
-
-
-
-```
-
-## Architecture
-
-### Système de Routing Détaillé
-
-Le routing dans Nexy est basé sur la structure des dossiers, avec plusieurs options avancées :
-
-#### Routes Statiques
-
-```plaintext
-app/
-├── controller.py # /
-├── about/
-│ └── controller.py # /about
-└── contact/
- └── controller.py # /contact
-```
-
-#### Routes Dynamiques
-
-```python
-# app/users/[id]/controller.py
-from typing import Union
-from nexy import NotFoundError
-
-async def GET(id: int):
- """
- Récupère un utilisateur par son ID
-
- Args:
- id (int): ID de l'utilisateur
-
- Raises:
- NotFoundError: Si l'utilisateur n'existe pas
-
- Returns:
- dict: Données de l'utilisateur
- """
- user = await get_user_by_id(id)
- if not user:
- raise NotFoundError(f"Utilisateur {id} non trouvé")
- return user
-
-async def PUT(id: int, data: dict):
- """
- Met à jour un utilisateur
-
- Args:
- id (int): ID de l'utilisateur
- data (dict): Nouvelles données
-
- Returns:
- dict: Utilisateur mis à jour
- """
- return await update_user(id, data)
-
-async def DELETE(id: int):
- """
- Supprime un utilisateur
-
- Args:
- id (int): ID de l'utilisateur
-
- Returns:
- dict: Confirmation de suppression
- """
- await delete_user(id)
- return {"status": "success", "message": f"Utilisateur {id} supprimé"}
-```
-
-#### Routes avec Middleware
-
-```python
-# app/admin/middleware.py
-from nexy import Middleware
-from .auth import verify_admin_token
-
-class AdminMiddleware(Middleware):
- async def process_request(self, request):
- token = request.headers.get("Authorization")
- if not await verify_admin_token(token):
- raise UnauthorizedError("Accès non autorisé")
-```
-
-### Services et Logique Métier
-
-```python
-# app/services/user_service.py
-from typing import List, Optional
-from .database import Database
-from ..models.user import User
-
-class UserService:
- def __init__(self):
- self.db = Database()
-
- async def get_all(self) -> List[User]:
- """Récupère tous les utilisateurs"""
- users = await self.db.query("SELECT * FROM users")
- return [User(**user) for user in users]
-
- async def get_by_id(self, user_id: int) -> Optional[User]:
- """Récupère un utilisateur par son ID"""
- user = await self.db.query_one(
- "SELECT * FROM users WHERE id = ?",
- [user_id]
- )
- return User(**user) if user else None
-
- async def create(self, user_data: dict) -> User:
- """Crée un nouvel utilisateur"""
- user_id = await self.db.insert("users", user_data)
- return await self.get_by_id(user_id)
-
- async def update(self, user_id: int, user_data: dict) -> Optional[User]:
- """Met à jour un utilisateur"""
- success = await self.db.update(
- "users",
- user_data,
- {"id": user_id}
- )
- return await self.get_by_id(user_id) if success else None
-
- async def delete(self, user_id: int) -> bool:
- """Supprime un utilisateur"""
- return await self.db.delete("users", {"id": user_id})
-```
-
-## Fonctionnalités Principales
-
-### Système de Templates Avancé
-
-#### Layouts
-
-```html
-
-
-
-
- {% block title %}{% endblock %} - MonApp
- {% block head %}{% endblock %}
-
-
-
- {% include "components/nav.html" %}
-
-
-
- {% block content %}{% endblock %}
-
-
-
-
-
-```
-
-#### Composants Réutilisables
-
-```html
-
-{% macro Button(text, type="button", class="", disabled=false) %}
-
-{% endmacro %}
-
-
-{% from "components/button.html" import Button %}
-{{ Button("Envoyer", type="submit", class="btn-primary") }}
-```
-
-### Gestion d'État
-
-```python
-# app/state.py
-from nexy import State, StateManager
-
-# État global
-app_state = StateManager()
-
-# États spécifiques
-users = State([])
-settings = State({
- "theme": "light",
- "language": "fr"
-})
-
-# Actions
-@app_state.action
-def add_user(state, user):
- users.set([*users.get(), user])
- return users.get()
-
-@app_state.action
-def update_settings(state, new_settings):
- settings.set({**settings.get(), **new_settings})
- return settings.get()
-```
-
-## Fonctionnalités Avancées
-
-### Validation des Données
-
-```python
-# app/models/user.py
-from pydantic import BaseModel, EmailStr, Field
-from typing import Optional
-from datetime import datetime
-
-class UserBase(BaseModel):
- email: EmailStr
- username: str = Field(..., min_length=3, max_length=50)
- full_name: Optional[str] = None
-
-class UserCreate(UserBase):
- password: str = Field(..., min_length=8)
-
-class UserUpdate(UserBase):
- password: Optional[str] = Field(None, min_length=8)
-
-class User(UserBase):
- id: int
- created_at: datetime
- updated_at: datetime
- is_active: bool = True
-
- class Config:
- from_attributes = True
-```
-
-### WebSockets
-
-```python
-# app/websockets/chat.py
-from nexy import WebSocket
-from typing import List, Set
-from .models import Message
-
-class ChatWebSocket(WebSocket):
- clients: Set[WebSocket] = set()
-
- async def connect(self):
- await self.accept()
- self.clients.add(self)
- await self.broadcast({"type": "join", "user": self.user.username})
-
- async def disconnect(self, close_code):
- self.clients.remove(self)
- await self.broadcast({"type": "leave", "user": self.user.username})
-
- async def receive_json(self, content):
- message = Message(**content)
- await self.broadcast({
- "type": "message",
- "user": self.user.username,
- "content": message.content
- })
-
- @classmethod
- async def broadcast(cls, message: dict):
- for client in cls.clients:
- await client.send_json(message)
-```
-
-### Tâches en Arrière-plan
-
-```python
-# app/tasks/scheduler.py
-from nexy import Task
-from datetime import timedelta
-
-@Task.periodic(timedelta(minutes=15))
-async def cleanup_sessions():
- """Nettoie les sessions expirées toutes les 15 minutes"""
- await db.delete_expired_sessions()
-
-@Task.delayed
-async def send_welcome_email(user_id: int):
- """Envoie un email de bienvenue de façon asynchrone"""
- user = await User.get(user_id)
- await mailer.send(
- to=user.email,
- template="welcome",
- context={"user": user}
- )
-```
-
-## Sécurité
-
-### Authentification
-
-```python
-# app/auth/jwt.py
-from nexy import JWT, JWTConfig
-from datetime import timedelta
-
-jwt = JWT(
- config=JWTConfig(
- secret_key="votre-clé-secrète",
- algorithm="HS256",
- access_token_expire=timedelta(minutes=15),
- refresh_token_expire=timedelta(days=7)
- )
-)
-
-# Middleware d'authentification
-from nexy import Middleware
-
-class AuthMiddleware(Middleware):
- async def process_request(self, request):
- token = request.headers.get("Authorization")
- if not token:
- raise UnauthorizedError()
-
- try:
- payload = jwt.decode(token)
- request.user = await User.get(payload["user_id"])
- except JWTError:
- raise UnauthorizedError()
-```
-
-### CORS
-
-```python
-# nexy-config.py
-from nexy import Nexy, CORSConfig
-
-app = Nexy(
- cors=CORSConfig(
- allow_origins=["https://monapp.com"],
- allow_methods=["GET", "POST", "PUT", "DELETE"],
- allow_headers=["Authorization"],
- max_age=3600
- )
-)
-```
-
-## Performance
-
-### Cache
-
-```python
-# app/cache.py
-from nexy import Cache
-from datetime import timedelta
-
-cache = Cache()
-
-@cache.cached(ttl=timedelta(minutes=
\ No newline at end of file
diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx
deleted file mode 100644
index 75fbfad6..00000000
--- a/src/app/(home)/page.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { redirect } from "next/navigation";
-
-const HomePage = () => {
- const isServer = typeof window === "undefined";
-
- if (isServer) {
- redirect("/docs/started");
- }
- return null;
-};
-
-export default HomePage;
diff --git a/src/app/docs/(Introduction)/page.mdx b/src/app/docs/(Introduction)/page.mdx
new file mode 100644
index 00000000..7d5bb022
--- /dev/null
+++ b/src/app/docs/(Introduction)/page.mdx
@@ -0,0 +1,55 @@
+# Introduction
+
+Dans l'écosystème du développement moderne, un framework efficace doit répondre à un défi majeur :
+comment accélérer le développement tout en maintenant des standards de qualité élevés ?
+
+Nexy répond à cette problématique en combinant la puissance de FastAPI avec une approche simplifiée du développement web. Notre framework repose sur deux piliers essentiels : **des performances exceptionnelles** et **une expérience développeur optimisée**.
+
+___
+
+## Qu'est-ce que Nexy ?
+
+Nexy est un framework web moderne basé sur FastAPI, conçu pour démocratiser le développement d'applications web hautes performances.
+
+### Pourquoi Nexy ?
+
+
+- Rapidité de développement : Une architecture intuitive pour lancer vos projets efficacement
+- Performances natives : L'excellence technique de FastAPI, enrichie d'optimisations avancées
+- Simplicité d'usage : Une expérience développeur fluide et accessible
+- Flexibilité : Une adaptabilité totale, du projet personnel aux architectures complexes
+
+Que vous construisiez une API REST, une application web complète ou un microservice, Nexy vous accompagne avec des outils conçus pour maximiser votre productivité.
+
+___
+
+## Avant de commencer
+
+Pour une expérience optimale avec cette documentation, nous recommandons de maîtriser :
+
+- ① **Python** (niveau intermédiaire) - Syntaxe, programmation orientée objet
+- ② **FastAPI** (notions de base) - Concepts des API REST et décorateurs Python
+
+> **Note importante :** Débutant avec FastAPI ? Notre documentation détaillée vous guidera à travers chaque concept essentiel.
+
+___
+
+## Ce que vous allez apprendre
+
+Cette documentation vous permettra de :
+
+- Maîtriser l'installation et la configuration de Nexy rapidement
+- Comprendre les principes architecturaux fondamentaux
+- Développer vos premières applications avec des exemples concrets
+- Adopter les meilleures pratiques de développement
+
+
\ No newline at end of file
diff --git a/src/app/docs/(Introduction)/template.tsx b/src/app/docs/(Introduction)/template.tsx
new file mode 100644
index 00000000..9e97e07d
--- /dev/null
+++ b/src/app/docs/(Introduction)/template.tsx
@@ -0,0 +1,12 @@
+import { TemplateEffect } from "@/components/(home)/docs/templateEffect";
+
+type TemplateProps = {
+ children: React.ReactNode;
+}
+const Template = ({ children }: TemplateProps) => (
+
+ {children}
+
+)
+
+export default Template
\ No newline at end of file
diff --git a/src/app/docs/[...slug]/page.tsx b/src/app/docs/[...slug]/page.tsx
deleted file mode 100644
index f42be41d..00000000
--- a/src/app/docs/[...slug]/page.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import Build from "@/components/Build";
-
-export default function DocPage() {
- return (
-
- )
-}
diff --git a/src/app/docs/authentification/[...slug]/page.mdx b/src/app/docs/authentification/[...slug]/page.mdx
new file mode 100644
index 00000000..7858710d
--- /dev/null
+++ b/src/app/docs/authentification/[...slug]/page.mdx
@@ -0,0 +1,3 @@
+authentication:
+ - github
+---
\ No newline at end of file
diff --git a/src/app/docs/authentification/page.tsx b/src/app/docs/authentification/page.tsx
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/docs/basics/[...slug]/page.mdx b/src/app/docs/basics/[...slug]/page.mdx
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/docs/basics/controllers/main.py b/src/app/docs/basics/controllers/main.py
new file mode 100644
index 00000000..7bed3244
--- /dev/null
+++ b/src/app/docs/basics/controllers/main.py
@@ -0,0 +1,13 @@
+from nexy import Request, Depends
+from .service import AppService
+
+async def POST(
+ userId: int,
+ service: Depends(AppService),
+ request: Request,
+ ) -> Dict[str, str]:
+
+ comment_data = await request.json()
+ data = await service.add_comment(userId, comment_data)
+
+ return data
diff --git a/src/app/docs/basics/controllers/page.mdx b/src/app/docs/basics/controllers/page.mdx
new file mode 100644
index 00000000..af4ab7fd
--- /dev/null
+++ b/src/app/docs/basics/controllers/page.mdx
@@ -0,0 +1,297 @@
+# Contrôleurs
+
+Les contrôleurs sont responsables du traitement des demandes entrantes et de l'envoi des réponses au client.
+
+Le rôle d'un contrôleur est de gérer des requêtes spécifiques pour l'application. Le mécanisme de routage détermine quel contrôleur traitera chaque requête.
+
+
+ Dans Nexy, un contrôleur est simplement tout fichier controller.py situé dans le répertoire app ou ses sous-répertoires.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+___
+
+## Route
+
+Une route est une association entre un chemin URL et une action dans l'application. Lorsqu'un utilisateur accède à une URL spécifique, la route correspondante est identifiée et exécutée pour traiter la demande.
+
+Dans Nexy, une route est définie par la structure de répertoires dans le dossier app. Le répertoire app lui-même représente la route principale, et chaque sous-répertoire définit une route imbriquée.
+
+
+
+
+
+
+
+
+
+
+### Route dynamique
+
+Les routes dynamiques permettent d'identifier des ressources spécifiques en utilisant des paramètres de route. Ces paramètres sont définis dans le chemin de la route et peuvent être extraits par la fonction de traitement de la route.
+
+Dans Nexy, une route devient dynamique lorsque le nom du répertoire ou dossier est encadré par des crochets, comme ceci : [dossier].
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Les routes dynamiques fonctionnent de la même manière pour tous les types d'endpoints.
+
+
+___
+
+## Endpoint
+
+Un endpoint représente un point d'interface complet exposé par l'application qui permet l'interaction avec des services, des ressources ou des fonctionnalités spécifiques. Il comprend :
+
+- ① Le chemin d'accès URL qui identifie la ressource
+- ② Le protocole de communication (HTTP ou WebSocket)
+- ③ La fonction de traitement qui gère les requêtes entrantes
+
+Dans Nexy, le framework prend en charge deux types d'endpoints principaux :
+
+- ① Les endpoints HTTP
+- ② Les endpoints WebSocket
+
+___
+
+## Endpoints HTTP
+
+Les endpoints HTTP suivent le modèle requête-réponse traditionnel et sont utilisés pour effectuer des opérations CRUD (Create, Read, Update, Delete) sur des ressources.
+
+ Pour créer un endpoint HTTP dans Nexy, il suffit de définir une fonction ( asynchrone ou pas comme dans FastAPI ) dont le nom correspond à la méthode HTTP souhaitée (GET, POST, PUT, DELETE, etc.) dans un fichier controller.py.
+
+
+### GET
+
+La méthode GET est la méthode fondamentale de récupération de données. Elle permet de lire des informations sans modifier l'état du serveur,
+ce qui en fait la méthode la plus sécurisée et la plus utilisée.
+
+Son utilisation principale concerne l'affichage des pages et la consultation des ressources comme les profils utilisateurs ou les listes de produits.
+
+
+
+ Dict[str, str] :
+ return {"message":"Salut Espoir Loém"}
+`
+}
+/>
+
+
+
+Dans une route dynamique, il est possible d'extraire les paramètres de la route en utilisant le nom de la route dynamique comme paramètre de la fonction .
+
+
+
+
+
+
+
+
+
+
+
+ Dict[str, str] :
+ users = ["Espoir Loém", "Force Espoir","LOEMBA PACKA"]
+ return {"user": users[userId]}
+`
+}
+/>
+
+
+### POST
+
+Complémentaire à GET, la méthode POST est dédiée à la création de nouvelles ressources. Elle assure un transfert sécurisé des données vers le serveur, avec une validation systématique avant sauvegarde.
+
+Cette méthode est essentielle pour toutes les opérations d'ajout, que ce soit la création de comptes utilisateurs ou la publication de nouveaux contenus.
+
+
+ List[Dict[str, str]] :
+ userList.append({"name":"Espoir Loém", "nationality":"Congolese"})
+ return userList
+`
+}
+/>
+
+
+Dans une route dynamique
+
+
+
+
+
+
+
+
+
+
+
+ Dict[str, str]:
+
+ comment_data = await request.json()
+ data = await service.add_comment(userId, comment_data)
+
+ return data
+`
+}
+/>
+
+
+
+
+ Noté que Nexy supporte les Methode HTTP suivant :
+ GET
+ POST
+ PUT
+ DELETE
+ OPTIONS
+ HEAD
+ PATCH
+ TRACE
+
+
+Chaque endpoint HTTP est caractérisé par :
+- ① une communication ponctuelle et sans état
+- ② l'utilisation d'une méthode HTTP spécifique
+- ③ une structure de données d'entrée et de sortie bien définie
+
+___
+
+## Endpoints WebSocket
+
+Les endpoints WebSocket établissent une connexion persistante et bidirectionnelle entre le client et le serveur, permettant des communications en temps réel.
+
+Ces endpoints sont particulièrement adaptés pour :
+- ① Les applications nécessitant des mises à jour instantanées
+- ② Les fonctionnalités de chat et de messagerie
+- ③ Les tableaux de bord en temps réel
+- ④ Les notifications push
+
+Un endpoint WebSocket dans Nexy maintient un état de connexion et permet l'envoi de messages dans les deux sens à tout moment, contrairement aux endpoints HTTP qui suivent un strict modèle de requête-réponse.
+
+### Comment créer un endpoint WebSocket ?
+Tout comme pour les endpoints HTTP, il suffit de créer une fonction asynchrone nommée SOCKET dans un fichier controller.py.
+
+
+
+
+
+
+
+
+
+
+Tout comme pour les endpoints HTTP, il est possible d'extraire les paramètres de la route en utilisant le nom de la route dynamique comme paramètre de la fonction.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+___
+
+## 👌 Bravo !
+Maintenant que vous avez appris à propos des contrôleurs et des endpoints, vous pouvez commencer à construire la structure API de votre application !
+Découvrons comment faire cela dans la section suivante.
+
\ No newline at end of file
diff --git a/src/app/docs/basics/middleware/page.mdx b/src/app/docs/basics/middleware/page.mdx
new file mode 100644
index 00000000..011ca63d
--- /dev/null
+++ b/src/app/docs/basics/middleware/page.mdx
@@ -0,0 +1,7 @@
+# Middleware
+
+Middleware is a powerful feature in Nexy that allows you to intercept and modify requests before they reach your route handlers. This gives you fine-grained control over request processing and enables common functionality like authentication, logging, and request transformation.
+
+## Basic Usage
+
+To create middleware, define a function that takes a `Request` object and returns a modified request or response:
diff --git a/src/app/docs/basics/page.mdx b/src/app/docs/basics/page.mdx
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/docs/basics/request/page.mdx b/src/app/docs/basics/request/page.mdx
new file mode 100644
index 00000000..77a8e69a
--- /dev/null
+++ b/src/app/docs/basics/request/page.mdx
@@ -0,0 +1,604 @@
+# Request
+
+L'objet de la classe Request dans Nexy est votre interface principale pour accéder aux données des requêtes HTTP entrantes. Héritant directement de FastAPI, il vous offre un accès complet et simplifié aux en-têtes, paramètres, corps de requête et fichiers téléchargés.
+
+### Compatibilité FastAPI
+
+La classe Request dans Nexy hérite intégralement de FastAPI, garantissant une compatibilité totale avec l'écosystème FastAPI existant.
+
+
+ 💡 Astuce : Un objet de la classe Request est automatiquement injecté dans vos contrôleurs. Déclarez-le simplement comme paramètre typé !
+
+
+---
+
+## Accéder à `Request`
+
+Pour utiliser Request , il vous suffit de l'ajouter comme paramètre dans la définition de votre fonction de contrôleur. Voici comment faire :
+
+
+
+
+
+
+
+
+
+___
+
+## Accéder à l'URL de la Requête
+
+Vous pouvez obtenir l'URL complète de la requête en utilisant request.url.
+
+
+ Dict[str, str]:
+ return {"url_complete": str(request.url)}
+`
+}
+/>
+
+
+___
+
+## Connaître la Méthode HTTP
+
+La méthode HTTP utilisée pour la requête (GET, POST, etc.) est disponible via request.method.
+
+
+
+ Dict[str, str]:
+ return {"methode_http": request.method}
+`
+}
+/>
+
+
+___
+
+## Obtenir l'Adresse IP du Client
+
+L'adresse IP du client qui a envoyé la requête est accessible via request.client.host.
+
+
+
+ Dict[str, str]:
+ client_host = request.client.host if request.client else "Inconnu"
+ return {"adresse_ip_client": client_host}
+`
+}
+/>
+
+
+
+
+___
+
+## Récupérer les Paramètres de Chemin
+
+Les paramètres de chemin sont des valeurs qui font partie de l'URL elle-même (par exemple, /utilisateurs/123 où 123 est un paramètre). Nexy vous permet de les récupérer directement en les déclarant comme des paramètres de votre fonction de contrôleur.
+
+
+ Dict[str, str]:
+ # userId est automatiquement extrait de l'URL
+ users = {
+ 1: "Espoir Loém",
+ 2: "Force Espoir",
+ 3: "LOEMBA PACKA"
+ }
+ return {"user": users.get(userId, "Utilisateur non trouvé")}
+`
+}
+/>
+
+
+___
+
+## Récupérer les Paramètres de Requête (Query Parameters)
+
+Les paramètres de requête sont des paires clé-valeur ajoutées à la fin de l'URL après un point d'interrogation (par exemple, /items?name=chaise&quantity=2). Vous pouvez y accéder via l'objet request.query_params.
+
+
+ Dict[str, str]:
+ name = request.query_params.get("name")
+ quantity = request.query_params.get("quantity")
+ return {"nom": name, "quantite": quantity}
+`
+}
+/>
+
+
+Il est également possible de récupérer les paramètres de requête en les déclarant directement comme paramètres dans votre fonction de contrôleur.
+
+
+ Dict[str, str]:
+ return {"nom": name, "quantite": quantity}
+`
+}
+/>
+
+
+
+___
+
+## Lire le Corps de la Requête (JSON)
+
+Pour les requêtes POST, PUT, PATCH qui envoient des données au format JSON, vous pouvez lire le corps de la requête de manière asynchrone en utilisant await request.json().
+
+
+
+ Dict[str, str]:
+ data = await request.json() # Lit le corps de la requête comme du JSON
+ return {"message": "Données JSON reçues !", "donnees": data}
+`}/>
+
+
+___
+
+## Lire le Corps de la Requête (Données de Formulaire)
+
+Pour les requêtes qui envoient des données de formulaire (par exemple, application/x-www-form-urlencoded ou multipart/form-data), vous pouvez utiliser await request.form().
+
+
+
+ Dict[str, str]:
+ # Lit le corps de la requête comme des données de formulaire
+ form_data = await request.form()
+ username = form_data.get("username")
+ password = form_data.get("password")
+ return {
+ "message": "Données de formulaire reçues !",
+ "username": username,
+ "password": password
+ }
+`
+}
+/>
+
+
+___
+
+## Accéder aux En-têtes de Requête
+
+Les en-têtes HTTP sont accessibles via request.headers. C'est un dictionnaire insensible à la casse.
+
+
+
+ Dict[str, str]:
+ user_agent = request.headers.get("user-agent")
+ content_type = request.headers.get("content-type")
+ return {"user_agent": user_agent, "content_type": content_type}
+`
+}
+/>
+
+
+___
+
+## Accéder aux Cookies
+
+Les cookies envoyés avec la requête sont accessibles via request.cookies. C'est un dictionnaire simple.
+
+
+
+ Dict[str, str]:
+ session_id = request.cookies.get("session_id")
+ return {"session_id": session_id}
+`
+}
+/>
+
+
+___
+
+## Gérer les Fichiers Téléchargés
+
+Pour gérer les fichiers téléchargés via un formulaire multipart/form-data, vous pouvez accéder aux fichiers via l'objet form_data retourné par await request.form().
+
+ Dict[str, str]:
+ form_data = await request.form()
+ upload_file = form_data.get("upload_file")
+
+ if upload_file and upload_file.filename:
+ # Pour un fichier, vous pouvez lire son contenu
+ content = await upload_file.read()
+ filename = upload_file.filename
+ return {"nom": filename, "taille": len(content)}
+ return {"message": "Aucun fichier n'a été téléchargé"}
+`
+}
+/>
+
+
+---
+
+## Accéder au Contexte de la Requête ( request.scope )
+
+L'attribut request.scope est un dictionnaire qui contient le contexte de la requête ASGI (Asynchronous Server Gateway Interface). Il inclut des informations de bas niveau sur la connexion, telles que le type de protocole, l'adresse du client et du serveur, etc.
+
+
+ Dict[str, str]:
+ # Par exemple, vous pouvez obtenir le type de scope
+ scope_type = request.scope.get("type")
+ return {"scope_type": scope_type}
+`
+}
+/>
+
+
+---
+
+## Accéder à l'Application ASGI ( request.app )
+
+L'attribut request.app fait référence à l'application ASGI principale qui gère la requête. Dans la plupart des cas, il s'agit de votre instance d'application Nexy.
+
+
+ Dict[str, str]:
+ # Vous pouvez vérifier si l'objet app est présent
+ app_present = bool(request.app)
+ return {"app_instance_present": app_present}
+`
+}
+/>
+
+
+---
+
+## Obtenir l'URL de Base ( request.base_url )
+
+L'attribut request.base_url fournit l'URL de base de l'application, sans le chemin spécifique de la requête. C'est utile pour construire des URLs absolues.
+
+
+ Dict[str, str]:
+ base_url = str(request.base_url)
+ return {"base_url": base_url}
+`
+}
+/>
+
+
+---
+
+## Accéder aux Informations du Client (`request.client`)
+
+L'attribut request.client est un objet Host contenant l'adresse IP et le port du client. Nous avons déjà vu request.client.host.
+
+
+ Dict[str, str]:
+ client_port = request.client.port if request.client else "Inconnu"
+ return {"client_port": client_port}
+`
+}
+/>
+
+
+---
+
+## Gérer les Sessions ( request.session )
+
+Si vous utilisez une gestion de session (par exemple, via des middlewares), l'attribut request.session vous permet d'accéder aux données de la session en cours. Notez que cela nécessite une configuration de session.
+
+
+ Dict[str, str]:
+ # Accéder aux données de la session
+ user_id = request.session.get("user_id", "Non connecté")
+ return {"session_user_id": user_id}
+`
+}
+/>
+
+
+---
+
+## Informations d'Authentification (request.auth et request.user)
+
+Si vous utilisez un système d'authentification, request.auth et request.user contiendront les informations d'authentification et l'objet utilisateur authentifié, respectivement. Ces attributs sont généralement définis par des middlewares d'authentification.
+
+
+ Dict[str, str]:
+ # Vérifier si un utilisateur est authentifié
+ username = request.user.display_name if request.user else "Invité"
+ return {"current_user": username}
+`
+}
+/>
+
+
+---
+
+## État de la Requête ( request.state )
+
+L'attribut request.state est un dictionnaire que vous pouvez utiliser pour stocker des informations arbitraires liées à la requête, accessibles tout au long de son cycle de vie (par exemple, dans les middlewares ou les dépendances).
+
+
+ Dict[str, str]:
+ # Définir une valeur dans l'état de la requête
+ request.state.custom_data = "Ceci est une donnée personnalisée"
+ # Récupérer une valeur de l'état de la requête
+ data = request.state.get("custom_data")
+ return {"request_state_data": data}
+`
+}
+/>
+
+
+---
+
+## Recevoir des Données Brutes ( request.receive )
+
+La méthode request.receive() est une coroutine de bas niveau utilisée pour recevoir des événements ASGI. Elle est principalement utilisée en interne par Nexy / FastAPI / Starlette pour lire le corps de la requête, mais vous pouvez l'utiliser pour des cas d'utilisation avancés.
+
+
+ Dict[str, str]:
+ # Exemple très bas niveau de lecture du corps de la requête
+ # Préférer request.json() ou request.form() pour la plupart des cas
+ body_chunks = []
+ async for chunk in request.stream():
+ body_chunks.append(chunk)
+ raw_body = b"".join(body_chunks).decode("utf-8")
+ return {"raw_body_received": raw_body}
+`
+}
+/>
+
+
+---
+
+## Générer des URLs ( request.url_for )
+
+La méthode request.url_for() permet de générer des URLs pour des routes nommées. C'est très utile pour construire des liens dynamiques dans votre application.
+
+
+ Dict[str, str]:
+ # Générer une URL pour une route nommée
+ profile_url = request.url_for("user_profile", user_id=123)
+ # profile_url = "/users/123" Exemple statique pour l'illustration
+ return {"user_profile_url": profile_url}
+`
+}
+/>
+
+
+---
+
+## Lire le Corps de la Requête en Streaming ( request.stream )
+
+La méthode request.stream() est une coroutine asynchrone qui renvoie un itérateur asynchrone sur les morceaux (chunks) du corps de la requête. C'est utile pour gérer de très gros fichiers ou des flux de données.
+
+
+ Dict[str, str]:
+ total_size = 0
+ async for chunk in request.stream():
+ total_size += len(chunk)
+ return {"bytes_received_via_stream": total_size}
+`
+}
+/>
+
+
+---
+
+## Accéder au Corps de la Requête Brute ( request.body )
+
+La méthode request.body() est une coroutine qui lit l'intégralité du corps de la requête et le renvoie sous forme d'octets.
+Une fois lu, le corps ne peut pas être relu par d'autres méthodes comme request.json() ou request.form().
+
+
+ Dict[str, str]:
+ raw_body = await request.body()
+ reponse = {
+ "raw_body_length": len(raw_body),
+ "raw_body_preview": raw_body.decode("utf-8")[:50]
+ }
+ return reponse
+`
+}
+/>
+
+
+---
+
+## Vérifier la Déconnexion du Client ( request.is_disconnected )
+
+La méthode request.is_disconnected() permet de vérifier si le client s'est déconnecté pendant le traitement de la requête. C'est utile pour les opérations longues.
+
+
+ Dict[str, str]:
+ await asyncio.sleep(1) # Simuler un travail long
+ if await request.is_disconnected():
+ return {"status": "Client déconnecté"}
+ return {"status": "Client toujours connecté"}
+`
+}
+/>
+
+
+---
+
+## Fermer la Connexion ( request.close )
+
+La méthode request.close() est une coroutine qui peut être utilisée pour signaler que la connexion doit être fermée. Elle est rarement appelée directement par l'utilisateur.
+
+
+ Dict[str, str]:
+ La méthode request.close().
+ # Il est rare de devoir l'appeler manuellement
+ # dans votre code d'application.
+ return {"message": "La méthode close est gérée par le serveur ASGI."}
+`
+}
+/>
+
+
+---
+
+## 👌 Bravo !
+
+Vous avez maintenant une compréhension très complète de l'objet Request et de toutes ses fonctionnalités dans Nexy, grâce à son héritage de FastAPI. Vous êtes prêt à manipuler les données entrantes de vos applications de manière avancée !
+
+Pour aller plus loin : Consultez la documentation FastAPI pour découvrir toutes les fonctionnalités héritées disponibles dans Nexy.
+
+
+
diff --git a/src/app/docs/basics/response/page.mdx b/src/app/docs/basics/response/page.mdx
new file mode 100644
index 00000000..9356b19b
--- /dev/null
+++ b/src/app/docs/basics/response/page.mdx
@@ -0,0 +1,489 @@
+# Response
+
+Dans Nexy, l'objet de la classe Response est votre outil principal pour construire et envoyer des réponses HTTP personnalisées au client. Il vous offre un contrôle total sur le contenu, les en-têtes, les cookies et le code de statut de vos réponses.
+
+### Compatibilité FastAPI
+
+Nexy utilise directement les classes de Response de FastAPI. Cela signifie que vous avez accès à toutes les classes de réponse standard comme JSONResponse , HTMLResponse , PlainTextResponse , RedirectResponse , StreamingResponse , et FileResponse.
+Vous pouvez vous référer à la documentation officielle de FastAPI pour explorer toutes les possibilités.
+
+
+ Par défaut, si vous retournez un dictionnaire, une liste, ou un modèle Pydantic depuis votre fonction de contrôleur, Nexy le convertira automatiquement en une JSONResponse !
+
+
+---
+
+## Réponse JSON Simple
+
+La méthode la plus courante pour retourner des données. Nexy convertit automatiquement les dictionnaires et listes en JSON.
+
+
+
+ Dict[str, str]:
+ return {"message": "Bonjour le monde!", "status": "succès"}
+`
+}
+/>
+ JSONResponse:
+ content = {"message": "Données créées", "id": 123}
+ return JSONResponse(content=content, status_code=201)
+`
+}
+/>
+
+
+---
+
+## Réponse HTML
+
+Pour servir du contenu HTML directement depuis vos contrôleurs.
+
+
+ HTMLResponse:
+ html_content = """
+
+
+ Page Nexy
+
+
+
Bienvenue sur Nexy!
+
Votre application fonctionne parfaitement.
+
+
+ """
+ return HTMLResponse(content=html_content)
+`
+}
+/>
+
+
+---
+
+## Réponse Texte Brut
+
+Pour retourner du texte simple sans formatage HTML.
+
+
+ PlainTextResponse:
+ return PlainTextResponse("Ceci est un message en texte brut.")
+
+def POST() -> PlainTextResponse:
+ return PlainTextResponse(
+ "Données reçues et traitées avec succès",
+ status_code=201
+ )
+`
+}
+/>
+
+
+---
+
+## Redirection
+
+Pour rediriger les utilisateurs vers une autre URL.
+
+
+ RedirectResponse:
+ # Redirection temporaire (302)
+ return RedirectResponse(url="/dashboard", status_code=302)
+
+def POST() -> RedirectResponse:
+ # Redirection permanente (301)
+ return RedirectResponse(url="https://www.nexy.io", status_code=301)
+`
+}
+/>
+
+
+---
+
+## Téléchargement de Fichiers
+
+Pour permettre aux utilisateurs de télécharger des fichiers.
+
+
+ FileResponse:
+ # Assurez-vous que le fichier existe
+ file_path = "static/documents/rapport.pdf"
+ return FileResponse(
+ file_path,
+ media_type='application/pdf',
+ filename="rapport_mensuel.pdf"
+ )
+`}/>
+ FileResponse:
+ return FileResponse(
+ "static/images/logo.png",
+ media_type='image/png'
+ )
+`
+}
+/>
+
+
+---
+
+## Réponse en Streaming
+
+Pour envoyer de gros volumes de données ou des flux en temps réel.
+
+
+ StreamingResponse:
+ return StreamingResponse(generate_data(), media_type="text/plain")
+`}/>
+
+
+
+---
+
+## Personnaliser les Codes de Statut
+
+Définir des codes de statut HTTP appropriés pour vos réponses.
+
+
+ JSONResponse:
+ # Création réussie - 201 Created
+ return JSONResponse(
+ content={"message": "Ressource créée", "id": 123},
+ status_code=201
+ )
+
+def PUT() -> JSONResponse:
+ # Pas de contenu - 204 No Content
+ return JSONResponse(content=None, status_code=204)
+
+def GET() -> JSONResponse:
+ # Erreur client - 400 Bad Request
+ return JSONResponse(
+ content={"error": "Paramètres manquants"},
+ status_code=400
+ )
+`
+}
+/>
+
+
+---
+
+## Ajouter des En-têtes
+
+Personnaliser les en-têtes HTTP de vos réponses.
+
+
+ JSONResponse:
+ content = {"data": "informations sensibles"}
+ headers = {
+ "X-Custom-Header": "MaValeurPersonnalisée",
+ "Cache-Control": "no-cache, no-store, must-revalidate",
+ "X-Rate-Limit": "100",
+ "X-API-Version": "v1.2.0"
+ }
+ return JSONResponse(content=content, headers=headers)
+`}/>
+
+
+
+---
+
+## Gérer les Cookies
+
+Définir et supprimer des cookies dans vos réponses.
+
+
+
+ JSONResponse:
+ """Connexion utilisateur - définir un cookie de session"""
+ response = JSONResponse(content={"message": "Connexion réussie"})
+ response.set_cookie(
+ key="session_id",
+ value="abc123xyz789",
+ httponly=True, # Sécurité contre XSS
+ max_age=3600, # 1 heure
+ samesite="lax", # Protection CSRF
+ secure=True # HTTPS uniquement
+ )
+ return response
+
+def DELETE() -> JSONResponse:
+ """Déconnexion - supprimer le cookie de session"""
+ response = JSONResponse(content={"message": "Déconnexion réussie"})
+ response.delete_cookie("session_id")
+ return response
+`
+}
+/>
+
+
+---
+
+## Utiliser le Décorateur @HTTPResponse
+
+Le décorateur @HTTPResponse de Nexy simplifie la personnalisation des réponses et améliore la documentation automatique.
+
+
+
+
+