Laboratorio — Entorno de trabajo
Todo el trabajo práctico del curso (laboratorios, Kallpa y el proyecto) se
hace con las mismas herramientas para todos: un contenedor Docker con Node.js
26, TypeScript y las herramientas de calidad del curso, más Git y una cuenta
de GitHub. Así evitamos el “en mi computadora sí funciona”: si make check
pasa en el contenedor, pasa en la revisión y en el pipeline.
1. Requisitos
| Sistema | Qué instalar |
|---|---|
| Linux | Docker Engine y Git |
| Windows 10/11 | WSL2 + Docker Desktop con integración WSL, y Git dentro de WSL. Trabajen dentro del sistema de archivos de WSL (~/), no en C:\. |
| macOS (Intel o Apple Silicon) | Docker Desktop y Git (viene con las herramientas de línea de comandos de Xcode) |
Además, una cuenta de GitHub y un editor (VS Code o el que prefieran). La imagen es nativa: en una laptop ARM (Apple Silicon) corre como ARM y en una Intel o AMD como x86-64, sin emulación.
2. Levantar el contenedor
Desde la carpeta del repositorio del curso, o la de su proyecto:
./env/run.sh # la primera vez construye la imagen (unos minutos)
run.sh monta el directorio actual en /work: los archivos se editan con el
editor de siempre en su computadora y se ejecutan en el contenedor. El puerto
3000 del contenedor queda publicado en http://localhost:3000, para ver en el
navegador la aplicación que están desarrollando. También acepta un comando:
./env/run.sh make check # revisa el proyecto: tipos, linter y pruebas
./env/run.sh make test # corre las pruebas
./env/run.sh --rebuild # reconstruye la imagen (si cambió el Dockerfile)
Si el contenedor ya está abierto en otra terminal, run.sh abre una segunda
shell en el mismo (por ejemplo, una con el servidor corriendo y otra con las
pruebas).
3. Qué trae el contenedor
| Herramienta | Para qué | Semanas |
|---|---|---|
| Node.js 26 | Ejecuta TypeScript directamente: node src/server.ts |
todas |
node --test |
Runner de pruebas de Node (node:test, node:assert/strict) |
1, 9–11 |
tsc (TypeScript 6) |
Revisa los tipos: tsc --noEmit |
4, 11 |
| ESLint + typescript-eslint | Linter con reglas que usan los tipos | 11 |
| fast-check | Pruebas basadas en propiedades | 10 |
| StrykerJS | Pruebas de mutación | 10 |
| Redocly CLI | Valida especificaciones OpenAPI | 6 |
SQLite (node:sqlite y sqlite3) |
La base de datos de Kallpa | 5–6, 13 |
Git y la CLI de GitHub (gh) |
Control de versiones, pull requests, issues | todas |
Los paquetes de npm del curso están instalados en la imagen: un
import fc from 'fast-check' funciona en cualquier carpeta sin npm install.
4. Git dentro y fuera del contenedor
Git funciona igual en su computadora y en el contenedor. run.sh monta su
~/.gitconfig (solo lectura), así que los commits hechos dentro del
contenedor llevan su nombre y su correo. Configúrenlo una vez, en su
computadora:
git config --global user.name "Nombre Apellido"
git config --global user.email "su-correo@uni.pe"
git config --global init.defaultBranch main
Para subir y traer cambios de GitHub (git push, git pull), usen la
terminal de su computadora, donde ya tienen sus credenciales (SSH o
gh auth login). El contenedor no guarda credenciales entre sesiones.
5. Kallpa
kallpa/ es la aplicación de reservas del complejo deportivo
Kallpa, escrita para el curso. Casi todos los laboratorios trabajan sobre ella.
Su README explica las reglas de negocio y la estructura.
cd kallpa
make check # tsc, eslint y pruebas
make start # servidor en http://localhost:3000
Para los laboratorios y para P0 trabajen en su propio repositorio, creado a
partir de Kallpa (semana 1), no en la carpeta del curso. En ese repositorio,
main se queda igual a la Kallpa publicada en el curso: cada laboratorio
empieza en una rama nueva desde main y no se fusiona, así el laboratorio de
una semana no depende de cómo quedó el de otra. Si el curso publica una versión
nueva de Kallpa, se actualiza main con esa versión.
6. Pruebas con node --test
El runner de Node corre los archivos de prueba que se le indican. Cada
archivo usa node:test y node:assert/strict:
import { test } from 'node:test';
import assert from 'node:assert/strict';
test('suma', () => assert.equal(1 + 1, 2));
node --test "test/**/*.test.ts"corre todas las pruebas (es lo que hacemake testen Kallpa);node --test test/pricing.test.ts, un archivo. Sin argumentos,node --testtambién corre cualquier archivo dentro de una carpetatest/, incluidos los que no son pruebas (comotest/helpers.ts): por eso conviene pasarle el patrón.node --test --test-name-pattern="cancel"corre las pruebas cuyo nombre contienecancel.node --test --experimental-test-coverageagrega un reporte de cobertura (semana 9).
7. Editar el código
Cualquier editor sirve. Con VS Code, abran la carpeta del repositorio en su computadora: el editor usa su propio TypeScript para marcar errores mientras escriben, y el contenedor corre lo mismo que la revisión. Si instalan Node.js 26 en su computadora, también pueden correr las pruebas fuera del contenedor, pero la referencia es siempre el contenedor.
8. Alternativa: Node.js local
Si no pueden instalar Docker, instalen Node.js 26 y, en
la carpeta de su repositorio, las herramientas del curso con las mismas
versiones que usa la imagen (ver env/Dockerfile):
npm install --save-dev typescript@6.0.3 @types/node@26.6.6 eslint@10.14.0 \
@eslint/js@10.0.1 typescript-eslint@8.72.1 fast-check@4.10.2 \
@stryker-mutator/core@10.1.1 @stryker-mutator/tap-runner@10.1.1 @redocly/cli@2.72.1
y usen npx tsc, npx eslint, etc. Antes de entregar, comprueben en una
computadora del laboratorio que make check pasa en el contenedor.
9. Solución de problemas
| Síntoma | Causa probable |
|---|---|
Cannot connect to the Docker daemon |
Docker Desktop no está abierto. |
Bind for 0.0.0.0:3000 failed: port is already allocated |
Otro programa (u otro contenedor) usa el puerto 3000. Ciérrenlo, o cambien el puerto en env/run.sh. |
http://localhost:3000 no abre |
El servidor corre en el contenedor pero escucha solo en 127.0.0.1; tiene que escuchar en 0.0.0.0. Kallpa ya lo hace. |
ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX |
Usaron una construcción de TypeScript que genera código (enum, namespace, parámetros con private en el constructor). Node solo quita los tipos; vean la guía de estilo. |
ERR_MODULE_NOT_FOUND en un import relativo |
Falta la extensión: import { x } from './x.ts', no './x'. |
fatal: detected dubious ownership in repository |
Están corriendo una imagen vieja; reconstrúyanla con ./env/run.sh --rebuild. |
Author identity unknown al hacer commit en el contenedor |
No tienen ~/.gitconfig en su computadora; configúrenlo (sección 4) y vuelvan a abrir el contenedor. |
git push pide usuario y contraseña en el contenedor |
Hagan el push desde la terminal de su computadora (sección 4). |
Archivos con owner root en su computadora (Linux) |
Lo que se crea en el contenedor pertenece a root; corrijan con sudo chown -R "$USER" . en su carpeta. |
| Todo muy lento en Windows | El código está en C:\; muévanlo a ~/ dentro de WSL. |