Wasp Framework
Section titled “Wasp Framework”Wasp es un DSL (Domain Specific Language) que compila configuracion declarativa en una aplicacion full-stack completa.
Conceptos Clave
Section titled “Conceptos Clave”main.wasp
Section titled “main.wasp”El archivo main.wasp es la fuente de verdad de la aplicacion. Define:
- App Config: Nombre, titulo, auth settings
- Routes & Pages: Rutas y paginas de la aplicacion
- Operations: Queries y Actions (comunicacion cliente-servidor)
- Entities: Referencias a modelos de Prisma
- Jobs: Tareas programadas (cron)
- APIs: Endpoints HTTP personalizados
Ejemplo de Estructura
Section titled “Ejemplo de Estructura”app TalentBricksAI { wasp: { version: "^0.20.0" }, title: "TalentBricksAI", auth: { userEntity: User, methods: { email: { ... } } }}
// Rutasroute CoursesRoute { path: "/cursos", to: CoursesPage }page CoursesPage { component: import { CoursesPage } from "@src/courses/CoursesPage" }
// Operacionesquery getCourses { fn: import { getCourses } from "@src/courses/operations", entities: [Course, Lesson]}
action enrollInCourse { fn: import { enrollInCourse } from "@src/courses/operations", entities: [Enrollment, User, Course]}Entities
Section titled “Entities”Los modelos definidos en schema.prisma automaticamente se convierten en “entities” de Wasp:
model Course { id Int @id @default(autoincrement()) title String lessons Lesson[]}// main.wasp - referencia automaticaquery getCourses { entities: [Course] // Wasp sabe que Course existe}Operations
Section titled “Operations”Queries (Lecturas)
Section titled “Queries (Lecturas)”import type { GetCourses } from 'wasp/server/operations';import type { Course } from 'wasp/entities';
export const getCourses: GetCourses<void, Course[]> = async (args, context) => { return context.entities.Course.findMany({ where: { isPublished: true }, include: { lessons: true } });};import { useQuery, getCourses } from 'wasp/client/operations';
export function CoursesPage() { const { data: courses, isLoading } = useQuery(getCourses); // ...}Actions (Escrituras)
Section titled “Actions (Escrituras)”import type { EnrollInCourse } from 'wasp/server/operations';
export const enrollInCourse: EnrollInCourse<{ courseId: number }, void> = async ({ courseId }, context) => { if (!context.user) throw new HttpError(401);
await context.entities.Enrollment.create({ data: { userId: context.user.id, courseId } }); };import { enrollInCourse } from 'wasp/client/operations';
async function handleEnroll(courseId: number) { await enrollInCourse({ courseId });}Autenticacion
Section titled “Autenticacion”Wasp maneja la autenticacion automaticamente:
app TalentBricksAI { auth: { userEntity: User, methods: { email: { fromField: { name: "TalentBricksAI" }, emailVerification: { ... }, passwordReset: { ... } } } }}En el cliente:
import { useAuth, logout } from 'wasp/client/auth';
function NavBar() { const { data: user } = useAuth();
if (user) { return <button onClick={logout}>Cerrar Sesion</button>; } return <Link to="/login">Iniciar Sesion</Link>;}Reglas de Importacion
Section titled “Reglas de Importacion”En archivos TypeScript/React
Section titled “En archivos TypeScript/React”// Imports de Waspimport { useQuery } from 'wasp/client/operations';import { useAuth } from 'wasp/client/auth';import type { Course } from 'wasp/entities';import { HttpError } from 'wasp/server';
// Imports de Prisma (solo para enums)import { Difficulty } from '@prisma/client';
// Imports locales - RUTAS RELATIVASimport { CourseCard } from './components/CourseCard';En main.wasp
Section titled “En main.wasp”// SIEMPRE usar @src/ para importspage CoursesPage { component: import { CoursesPage } from "@src/courses/CoursesPage"}Generacion de Codigo
Section titled “Generacion de Codigo”Wasp genera codigo en el directorio .wasp/ (gitignored):
- Tipos TypeScript
- Codigo de conexion cliente-servidor
- Configuracion de Prisma
Importante: Despues de cambiar main.wasp o schema.prisma, reiniciar wasp start para regenerar tipos.