- 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.
See most active contributors on hexlet-friends.
