Skip to content

Wasp es un DSL (Domain Specific Language) que compila configuracion declarativa en una aplicacion full-stack completa.

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
app TalentBricksAI {
wasp: { version: "^0.20.0" },
title: "TalentBricksAI",
auth: {
userEntity: User,
methods: { email: { ... } }
}
}
// Rutas
route CoursesRoute { path: "/cursos", to: CoursesPage }
page CoursesPage { component: import { CoursesPage } from "@src/courses/CoursesPage" }
// Operaciones
query getCourses {
fn: import { getCourses } from "@src/courses/operations",
entities: [Course, Lesson]
}
action enrollInCourse {
fn: import { enrollInCourse } from "@src/courses/operations",
entities: [Enrollment, User, Course]
}

Los modelos definidos en schema.prisma automaticamente se convierten en “entities” de Wasp:

schema.prisma
model Course {
id Int @id @default(autoincrement())
title String
lessons Lesson[]
}
// main.wasp - referencia automatica
query getCourses {
entities: [Course] // Wasp sabe que Course existe
}
operations.ts
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 }
});
};
CoursesPage.tsx
import { useQuery, getCourses } from 'wasp/client/operations';
export function CoursesPage() {
const { data: courses, isLoading } = useQuery(getCourses);
// ...
}
operations.ts
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
}
});
};
Component.tsx
import { enrollInCourse } from 'wasp/client/operations';
async function handleEnroll(courseId: number) {
await enrollInCourse({ courseId });
}

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>;
}
// Imports de Wasp
import { 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 RELATIVAS
import { CourseCard } from './components/CourseCard';
// SIEMPRE usar @src/ para imports
page CoursesPage {
component: import { CoursesPage } from "@src/courses/CoursesPage"
}

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.