# Entorno del curso de Ingeniería de Software: Node.js 26 (LTS), que ejecuta
# TypeScript directamente, más las herramientas del curso (tsc, ESLint,
# fast-check, Stryker, Redocly, yaml) instaladas una sola vez en la imagen.
# Imagen nativa (amd64 o arm64): funciona igual en Linux, Windows (WSL2) y
# macOS, incluido Apple Silicon, sin emulación.
FROM node:26-trixie-slim

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y --no-install-recommends \
        make git gh sqlite3 jq ca-certificates curl vim nano less tree man-db procps \
    && rm -rf /var/lib/apt/lists/*

# Herramientas del curso en /opt/course. Los binarios quedan en el PATH y los
# paquetes en /node_modules: Node busca paquetes subiendo de carpeta en carpeta
# hasta la raíz, así que `import fc from 'fast-check'` funciona en cualquier
# carpeta de /work sin npm install.
# TypeScript queda en 6.0: typescript-eslint todavía no soporta la 7.
RUN mkdir -p /opt/course && cd /opt/course \
    && npm init -y >/dev/null \
    && npm install --no-audit --no-fund \
        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 yaml@2.9.1 \
    && ln -s /opt/course/node_modules /node_modules \
    && npm cache clean --force
ENV PATH="/opt/course/node_modules/.bin:${PATH}"

# Node puede quedarse colgado dentro de process.exit() si un hilo de V8 espera una
# recolección de basura que el hilo principal ya no va a hacer (nodejs/node#54918,
# aún sin corregir en Node 26). tsc termina siempre con process.exit(), así que su
# comando carga un archivo que lo cambia por un final normal del programa.
COPY env/salida-natural.cjs /opt/course/salida-natural.cjs
RUN rm /opt/course/node_modules/.bin/tsc \
    && printf '%s\n' '#!/bin/sh' \
        'exec node --require /opt/course/salida-natural.cjs /opt/course/node_modules/typescript/bin/tsc "$@"' \
        > /opt/course/node_modules/.bin/tsc \
    && chmod +x /opt/course/node_modules/.bin/tsc

# En Linux y WSL2 los repositorios montados pertenecen a otro usuario; sin esto,
# git los rechaza por "dubious ownership". Rama principal por defecto: main.
RUN git config --system --add safe.directory '*' \
    && git config --system init.defaultBranch main

WORKDIR /work
CMD ["bash"]
