# Semana 11: revisión de código y análisis estático. Se usa dentro del
# contenedor del curso.
#
#   make           copia Kallpa en build/kallpa, para medirla sin tocar la
#                  original
#   make test      revisa los tipos (tsc), corre ESLint y las pruebas
#                  (*.test.ts), que comprueban lo que dice el apunte, y las del
#                  laboratorio si está la carpeta solution/
#   make medir     los números de Kallpa con las opciones estrictas de tsc y con
#                  strictTypeChecked, agrupados por regla
#   make fronteras los as de Kallpa por archivo, según el árbol sintáctico
#   make errores   el error de tsc de ejemplos/invented-method.ts, que falla a
#                  propósito
#   make busqueda  aplica busqueda-agente.diff a una copia de Kallpa en
#                  build/busqueda y corre su make check
#   make clean     borra build/
#
# Los ejemplos leen la Kallpa del curso (../../kallpa) sin modificarla. El pull
# request del paso 2 del laboratorio está en pr-generado.diff.

KALLPA ?= ../../kallpa
GIT = git -c user.name=Kallpa -c user.email=kallpa@example.com -c init.defaultBranch=main
HERE = $(CURDIR)

.PHONY: all test medir fronteras errores busqueda clean

all: build/kallpa

build/kallpa:
	mkdir -p build
	cp -r $(KALLPA) $@
	rm -f $@/data/*.db $@/data/*.db-*

test:
	tsc -p .
	eslint .
	node --test "*.test.ts"
	@if [ -d solution ]; then node --test "solution/*.test.ts"; fi

medir:
	rm -rf build/medir
	mkdir -p build
	cp -r $(KALLPA) build/medir
	rm -f build/medir/data/*.db build/medir/data/*.db-*
	@echo "--- noUncheckedIndexedAccess"
	@cd build/medir && sed 's/"strict": true,/"strict": true, "noUncheckedIndexedAccess": true,/' tsconfig.json > tsconfig.a.json && tsc -p tsconfig.a.json | grep -c 'error TS' || true
	@echo "--- exactOptionalPropertyTypes"
	@cd build/medir && sed 's/"strict": true,/"strict": true, "exactOptionalPropertyTypes": true,/' tsconfig.json > tsconfig.b.json && tsc -p tsconfig.b.json | grep -c 'error TS' || true
	@echo "--- strictTypeChecked, por regla"
	@cd build/medir && rm tsconfig.a.json tsconfig.b.json && cp $(HERE)/eslint.estricto.js eslint.config.js && (eslint . -f json || true) | jq -r '.[].messages[].ruleId' | sort | uniq -c | sort -rn

fronteras: all
	@cp eslint.fronteras.js build/kallpa/fronteras.config.js
	@cd build/kallpa && (eslint --no-config-lookup -c fronteras.config.js src -f json || true) | jq -r '.[] | .filePath as $$f | .messages[] | select(.message == "as") | $$f | sub(".*/src/"; "src/")' | sort | uniq -c

errores:
	-tsc --ignoreConfig --noEmit --strict --target es2024 --module nodenext --types node --skipLibCheck ejemplos/invented-method.ts

busqueda:
	rm -rf build/busqueda
	mkdir -p build
	cp -r $(KALLPA) build/busqueda
	rm -f build/busqueda/data/*.db build/busqueda/data/*.db-*
	cd build/busqueda && $(GIT) init -q && $(GIT) add -A && $(GIT) commit -qm "Kallpa publicada"
	cd build/busqueda && $(GIT) apply $(HERE)/busqueda-agente.diff
	$(MAKE) --no-print-directory -C build/busqueda check

clean:
	rm -rf build
