- Discuss the project on Telegram: https://t.me/hexletcommunity/12
- docker
- docker compose V2
- make
# setup
make
# run
make compose
# check
make ci-check
# run tests
make compose-test
# run linters and validators
make code-lint
make compose-type-check
make compose-description-lint
make compose-schema-validateType checking is a separate step from the tests, in two places:
make type-checkrunstsc --noEmitover the whole course. It is a prerequisite ofmake test, somake checkand CI pick it up.bin/test2.shtype-checks a single lesson alongside its tests. This script — notmake check— is what the platform runs against a student's solution, so a wrongly typed solution has to be rejected here.
Both are needed because vitest strips types with esbuild and never checks them: without a compiler step, expectTypeOf(...) assertions and @ts-expect-error directives in lesson tests silently pass no matter what the lesson exports.
Three settings in tsconfig.json are load-bearing for these steps, since nothing compiled the course before them:
"moduleResolution": "bundler"— the oldnode10value is a hard error in TypeScript 6, andbundlermatches how vitest resolves the extensionless imports lessons use."types": ["node"]— TypeScript 6 no longer picks upnode_modules/@typeson its own, and lessons useconsoleandnode:path. A lesson needing other ambient types has to add them here."noEmit": true— so a baretscnever drops.jsfiles next to lessons.
This repository is created and maintained by the team and the community of Hexlet, an educational project. Read more about Hexlet.
