sysrot-hub
Version:
CLI de nueva generación para proyectos Next.js 14+ con IA multi-modelo, Web3 integration, internacionalización completa y roadmap realista 2025-2026
790 lines (601 loc) • 19.2 kB
Markdown
# Documentación de RotosaurioApp
Este documento proporciona una guía detallada sobre todas las características y herramientas incluidas en tu proyecto creado con `create-rotosaurio-app`.
## Índice
1. [Estructura del Proyecto](#estructura-del-proyecto)
2. [Características Principales](#características-principales)
3. [Sistema de Autenticación](#sistema-de-autenticación)
4. [Integración con OpenAI](#integración-con-openai)
5. [Carga de Imágenes](#carga-de-imágenes)
6. [Blog con MDX](#blog-con-mdx)
7. [Formularios y Validación](#formularios-y-validación)
8. [Temas Claro/Oscuro](#temas-clarooscuro)
9. [Variables de Entorno](#variables-de-entorno)
10. [Navegación y Rutas](#navegación-y-rutas)
11. [Mejores Prácticas](#mejores-prácticas)
12. [Solución de Problemas](#solución-de-problemas)
13. [Despliegue](#despliegue)
## Estructura del Proyecto
El proyecto sigue la estructura del Pages Router de Next.js 14:
```
├── components/ # Componentes reutilizables
│ ├── ai/ # Componentes relacionados con IA
│ ├── auth/ # Componentes de autenticación
│ ├── ui/ # Componentes de interfaz de usuario
│ └── upload/ # Componentes de carga de archivos
├── lib/ # Funciones y utilidades
├── pages/ # Rutas y páginas de la aplicación
│ ├── api/ # Endpoints de API
│ ├── blog/ # Páginas de blog
│ └── ejemplos/ # Ejemplos de uso
├── public/ # Activos públicos
└── styles/ # Hojas de estilo CSS
```
### Archivos Clave
- **package.json**: Configuración del proyecto y dependencias
- **next.config.js**: Configuración de Next.js
- **tsconfig.json**: Configuración de TypeScript
- **tailwind.config.js**: Configuración de TailwindCSS
- **middleware.ts**: Middleware para autenticación y roles (si está habilitado)
- **.env.local**: Variables de entorno (debes crear este archivo basado en .env.example)
## Características Principales
### Next.js 14 con Pages Router
Tu proyecto utiliza Next.js 14 con el sistema Pages Router, ofreciendo:
- Renderizado del lado del servidor (SSR)
- Generación estática (SSG)
- API Routes
- Optimización de imágenes
- Fast Refresh
Para crear nuevas páginas, simplemente añade archivos `.tsx` dentro del directorio `pages/`. Por ejemplo:
```tsx
// pages/about.tsx
import { Layout } from '@/components/ui/layout';
export default function AboutPage() {
return (
<div className="container mx-auto py-12">
<h1 className="text-3xl font-bold mb-6">Acerca de nosotros</h1>
<p className="text-lg">
Esta es una página de ejemplo creada con Next.js y TailwindCSS.
</p>
</div>
);
}
```
### Obtención de Datos
Next.js ofrece varias formas de obtener datos:
#### getServerSideProps (SSR)
```tsx
// pages/users.tsx
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/users');
const users = await res.json();
return {
props: { users },
};
}
export default function UsersPage({ users }) {
return (
<div>
<h1>Usuarios</h1>
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
</div>
);
}
```
#### getStaticProps (SSG)
```tsx
// pages/products.tsx
export async function getStaticProps() {
const res = await fetch('https://api.example.com/products');
const products = await res.json();
return {
props: { products },
revalidate: 60, // Revalidar cada 60 segundos
};
}
```
### TypeScript
El proyecto está configurado con TypeScript para un desarrollo más seguro y productivo. Los tipos están predefinidos para la mayoría de los componentes y funciones.
Para crear tus propios tipos:
```tsx
// types/index.ts
export interface User {
id: string;
name: string;
email: string;
role: 'user' | 'admin';
}
export interface Product {
id: string;
name: string;
price: number;
description?: string;
}
```
## Sistema de Autenticación
La autenticación está implementada utilizando NextAuth.js, permitiendo a los usuarios registrarse e iniciar sesión.
### Configuración
1. Configura tus proveedores en `.env.local`:
```
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=tu_secreto_aqui
# Para Google OAuth
GOOGLE_CLIENT_ID=tu_client_id
GOOGLE_CLIENT_SECRET=tu_client_secret
# Para GitHub OAuth
GITHUB_ID=tu_github_id
GITHUB_SECRET=tu_github_secret
# Para autenticación con credenciales
DATABASE_URL=tu_url_de_base_de_datos
```
2. El componente de formulario de autenticación está listo para usar:
```tsx
import { AuthForm } from '@/components/auth/auth-form';
export default function LoginPage() {
return (
<div>
<h1>Iniciar Sesión</h1>
<AuthForm />
</div>
);
}
```
### Protección de Rutas
Para proteger rutas, utiliza la función `getServerSideProps`:
```tsx
import { getSession } from "next-auth/react";
export async function getServerSideProps(context) {
const session = await getSession(context);
if (!session) {
return {
redirect: {
destination: '/login',
permanent: false,
},
};
}
return {
props: { session }
};
}
```
### Acceso al Usuario Actual
En el lado del cliente:
```tsx
import { useSession } from "next-auth/react";
export default function ProfilePage() {
const { data: session, status } = useSession();
if (status === "loading") {
return <p>Cargando...</p>;
}
if (status === "unauthenticated") {
return <p>Acceso denegado</p>;
}
return (
<div>
<h1>Perfil</h1>
<p>Bienvenido, {session.user.name}</p>
<p>Email: {session.user.email}</p>
</div>
);
}
```
### Sistema de Roles
Si habilitaste el sistema de roles, puedes verificar roles usando el middleware:
```tsx
// middleware.ts ya está configurado para verificar roles
// Para verificar roles en componentes:
import { useSession } from "next-auth/react";
import { UserRole } from "@/lib/roles";
export default function AdminPanel() {
const { data: session } = useSession();
const isAdmin = session?.user?.role === UserRole.ADMIN;
if (!isAdmin) {
return <p>Acceso denegado</p>;
}
return <div>Panel de Administración</div>;
}
```
## Integración con OpenAI
Tu proyecto incluye integración con la API de OpenAI, permitiendo incorporar IA en tu aplicación.
### Configuración
1. Configura tu clave API en `.env.local`:
```
OPENAI_API_KEY=tu_clave_api_de_openai
```
2. Utiliza el componente `OpenAIPrompt` para interactuar con la IA:
```tsx
import { OpenAIPrompt } from '@/components/ai/openai-prompt';
export default function AIPage() {
const handleResponse = (response) => {
console.log("Respuesta de IA:", response);
};
return (
<div>
<h1>Asistente IA</h1>
<OpenAIPrompt
placeholder="Pregunta algo..."
buttonText="Enviar"
onResponse={handleResponse}
/>
</div>
);
}
```
### Personalización del Modelo
Puedes personalizar el modelo y parámetros en `pages/api/openai.ts`:
```tsx
// Ejemplo de configuración avanzada
const completion = await openai.chat.completions.create({
model: "gpt-4-turbo", // Cambiar modelo
messages: [
{ role: "system", content: "Eres un asistente especializado en desarrollo web." },
{ role: "user", content: prompt }
],
temperature: 0.7, // Ajustar creatividad
max_tokens: 1000, // Ajustar longitud de respuesta
});
```
## Carga de Imágenes
El proyecto incluye un sistema de carga de imágenes que utiliza Cloudinary para almacenamiento.
### Configuración
1. Configura tus credenciales de Cloudinary en `.env.local`:
```
CLOUDINARY_CLOUD_NAME=tu_cloud_name
CLOUDINARY_API_KEY=tu_api_key
CLOUDINARY_API_SECRET=tu_api_secret
```
2. Utiliza el componente `ImageUpload` para permitir a los usuarios cargar imágenes:
```tsx
import { ImageUpload } from '@/components/upload/image-upload';
import { useState } from 'react';
export default function UploadPage() {
const [imageUrl, setImageUrl] = useState('');
const handleSuccess = (url) => {
setImageUrl(url);
console.log("Imagen cargada:", url);
};
return (
<div>
<h1>Subir Imagen</h1>
<ImageUpload
onSuccess={handleSuccess}
maxSizeMB={5}
acceptedFileTypes={['image/jpeg', 'image/png']}
/>
{imageUrl && (
<div>
<h2>Vista previa:</h2>
<img src={imageUrl} alt="Imagen cargada" width={300} />
</div>
)}
</div>
);
}
```
### Transformaciones de Imágenes
Puedes aplicar transformaciones a las imágenes de Cloudinary:
```tsx
// URL original
const imageUrl = "https://res.cloudinary.com/tu_cloud_name/image/upload/v1234567/ejemplo.jpg";
// Con transformaciones (redimensionar a 300x200, recortar)
const transformedUrl = imageUrl.replace("/upload/", "/upload/c_fill,w_300,h_200/");
```
## Blog con MDX
Tu proyecto incluye un sistema de blog completo utilizando MDX para contenido enriquecido.
### Creación de Contenido
1. Crea archivos MDX en el directorio `/content/blog/`:
```mdx
---
title: Mi Primer Post
date: '2023-12-25'
excerpt: Este es mi primer post de blog
coverImage: '/images/blog/cover.jpg'
---
# Hola Mundo
Este es mi primer post utilizando MDX.
## Características
- Soporte para Markdown
- Componentes React dentro del contenido
- Sintaxis resaltada para código
```jsx
function Ejemplo() {
return <div>¡Esto es un componente!</div>;
}
```
<SomeComponent />
```
2. Las páginas de blog están disponibles en `/blog` y `/blog/[slug]`.
3. Personaliza los componentes de MDX en `lib/mdx.ts`.
### Componentes Personalizados en MDX
Puedes añadir componentes personalizados para usar en tus archivos MDX:
```tsx
// lib/mdx-components.tsx
import Image from 'next/image';
import { CodeBlock } from '@/components/ui/code-block';
export const mdxComponents = {
img: (props) => (
<Image
{...props}
width={800}
height={450}
className="rounded-lg my-6"
alt={props.alt || 'Blog image'}
/>
),
code: (props) => <CodeBlock {...props} />,
};
// Usar en lib/mdx.ts
import { mdxComponents } from './mdx-components';
// ...
```
## Formularios y Validación
El proyecto utiliza react-hook-form y zod para crear formularios con validación.
### Ejemplo Básico
```tsx
import { useForm } from "react-hook-form";
import { z } from "zod";
import { zodResolver } from "@hookform/resolvers/zod";
import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
// Define el esquema de validación
const formSchema = z.object({
email: z.string().email("Email inválido"),
password: z.string().min(8, "La contraseña debe tener al menos 8 caracteres")
});
// Tipo derivado del esquema
type FormValues = z.infer<typeof formSchema>;
export default function ContactForm() {
const form = useForm<FormValues>({
resolver: zodResolver(formSchema),
defaultValues: {
email: "",
password: ""
}
});
function onSubmit(values: FormValues) {
// Manejar envío
console.log(values);
}
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl>
<Input placeholder="tu@email.com" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="password"
render={({ field }) => (
<FormItem>
<FormLabel>Contraseña</FormLabel>
<FormControl>
<Input type="password" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit">Enviar</Button>
</form>
</Form>
);
}
```
### Formularios Avanzados
Para campos más complejos o personalizados:
```tsx
// Ejemplo de esquema avanzado
const userSchema = z.object({
name: z.string().min(2, "El nombre debe tener al menos 2 caracteres"),
email: z.string().email("Email inválido"),
age: z.coerce.number().min(18, "Debes ser mayor de 18 años"),
website: z.string().url("URL inválida").optional(),
acceptTerms: z.boolean().refine(val => val === true, {
message: "Debes aceptar los términos y condiciones"
})
});
```
## Temas Claro/Oscuro
El proyecto incluye soporte para temas claro y oscuro utilizando next-themes.
### Uso Básico
El cambio de tema está disponible con el componente `ThemeToggle`:
```tsx
import { ThemeToggle } from '@/components/ui/theme-toggle';
export default function Layout({ children }) {
return (
<div>
<header>
<ThemeToggle />
</header>
<main>{children}</main>
</div>
);
}
```
### Personalización
1. Personaliza los colores del tema en `styles/globals.css`.
2. Para acceder al tema actual en componentes:
```tsx
import { useTheme } from 'next-themes';
export function MyComponent() {
const { theme, setTheme } = useTheme();
return (
<div>
<p>Tema actual: {theme}</p>
<button onClick={() => setTheme('light')}>Claro</button>
<button onClick={() => setTheme('dark')}>Oscuro</button>
<button onClick={() => setTheme('system')}>Sistema</button>
</div>
);
}
```
## Navegación y Rutas
### Navegación Básica
Para navegar entre páginas, usa el componente `Link`:
```tsx
import Link from 'next/link';
export default function Navigation() {
return (
<nav>
<Link href="/">Inicio</Link>
<Link href="/about">Acerca de</Link>
<Link href="/blog">Blog</Link>
<Link href="/contact">Contacto</Link>
</nav>
);
}
```
### Rutas Dinámicas
Para crear rutas dinámicas como `/products/[id]`:
```tsx
// pages/products/[id].tsx
import { useRouter } from 'next/router';
export default function ProductPage() {
const router = useRouter();
const { id } = router.query;
return <div>Producto ID: {id}</div>;
}
```
### Navegación Programática
```tsx
import { useRouter } from 'next/router';
export default function LoginPage() {
const router = useRouter();
const handleLogin = async (credentials) => {
// Lógica de login...
await login(credentials);
// Redirigir después del login
router.push('/dashboard');
};
return (
// Formulario de login...
);
}
```
## Variables de Entorno
Configura las siguientes variables en `.env.local` según las características que uses:
```
# NextAuth
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=
# Autenticación con proveedores
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GITHUB_ID=
GITHUB_SECRET=
# Base de datos
DATABASE_URL=
# OpenAI
OPENAI_API_KEY=
# Cloudinary
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
```
### Uso de Variables de Entorno
En el servidor (API Routes, getServerSideProps, etc.):
```tsx
// Acceso directo
const apiKey = process.env.OPENAI_API_KEY;
```
En el cliente (componentes, páginas):
```tsx
// Solo variables públicas con prefijo NEXT_PUBLIC_
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
```
## Mejores Prácticas
### Performance
1. **Imágenes optimizadas**: Usa el componente `Image` de Next.js para optimizar automáticamente las imágenes.
```tsx
import Image from 'next/image';
export default function ProfilePage() {
return (
<Image
src="/images/profile.jpg"
alt="Perfil de usuario"
width={200}
height={200}
priority
/>
);
}
```
2. **Code Splitting**: Next.js hace code splitting automáticamente por páginas, pero también puedes usar importaciones dinámicas:
```tsx
import dynamic from 'next/dynamic';
// Solo se carga cuando es necesario
const HeavyComponent = dynamic(() => import('@/components/HeavyComponent'), {
loading: () => <p>Cargando...</p>,
});
```
3. **Optimización de fuentes**: Usa `next/font` para optimizar las fuentes:
```tsx
import { Inter } from 'next/font/google';
const inter = Inter({ subsets: ['latin'] });
export default function Layout({ children }) {
return (
<div className={inter.className}>
{children}
</div>
);
}
```
### Seguridad
1. **Validación de datos**: Valida todos los datos de entrada, especialmente en API Routes.
2. **Content Security Policy**: Configura encabezados de seguridad.
3. **CSRF Protection**: NextAuth.js incluye protección CSRF automática.
## Solución de Problemas
### Errores Comunes
1. **Error "Module not found"**
- Verifica las rutas de importación
- Asegúrate de usar alias `@/` correctamente
2. **Errores con imágenes externas**
- Añade los dominios en `next.config.js` en la sección `images.domains`
3. **Problemas con la autenticación**
- Verifica que las variables de entorno estén correctamente configuradas
- Revisa los logs del servidor para ver errores específicos
4. **Errores de TypeScript**
- Ejecuta `npm run build` para ver errores de tipos
- Asegúrate de definir correctamente las interfaces
### Depuración
1. **Depuración del lado del cliente**:
- Usa React DevTools
- Utiliza `console.log()` o `debugger`
2. **Depuración del lado del servidor**:
- Añade logs en funciones del servidor
- Verifica la terminal donde ejecutas `npm run dev`
## Despliegue
La forma más sencilla de desplegar tu aplicación es utilizando Vercel:
1. Crea una cuenta en [Vercel](https://vercel.com)
2. Conecta tu repositorio
3. Configura las variables de entorno
4. ¡Despliega!
Para otros proveedores como Netlify o AWS Amplify, consulta sus respectivas documentaciones.
### Vercel CLI
```bash
# Instalar Vercel CLI
npm install -g vercel
# Iniciar sesión
vercel login
# Desplegar
vercel
# Desplegar a producción
vercel --prod
```
---
Esta documentación cubre las principales características y herramientas incluidas en tu proyecto creado con `create-rotosaurio-app`. Para cualquier duda o problema, visita el repositorio del proyecto o consulta la documentación oficial de Next.js.