TLDR никак. Я решил задачу альтернативным путем.
В итоге я разбил запуск программы на шаги компиляции и выполнения, обмазался вспомагательным пакетом source-map-support
, и получил желаемое. Плюс обернул шаги в nodemon
так чтобы компиляция и перезапуск дергались на каждое изменение исходного кода. Приятный бонус от такого сетапа в том что в отличии от запуска ts-node
ts-ошибки не давали программе запускаться, а сейчас я получу бегущее приложение даже когда в коде остались нерешенные “хвосты” с типами.
Альтернативные рантаймы не предлагать. Мне хватает разбирательства с нюансами nodejs
и npm
, и ковыряться новых can-of-worms которые приносят с собой deno
или bun
пока что не хочется. Хочется фокусироваться на коде а не на обхождении новых, неизвестных проблем.
Я обожаю typescript. Это лучшее изобретение со времен nodejs. Однако typescript в nodejs так просто не запустить. Нужно добавлять шаг компиляции, на что я морально не всегда готов (хочется писать код и не париться). ts-node
, вроде решает задачу, но приносит новые проблемы-нюансы: при налиичии ts ошибки в коде типа несоответствия типов проект не запустится, а стектрейсы при ошибках не указывают в точное место файла где произошла ошибка.
Покрутив разные варианты, пошурстив интернет и chatgpt я в итоге пришел к тому что разделил запуск проекта на шаг компиляции и запуска, и обернут все в nodemon
чтобы дергать эти шаги на изменения.
Бонус: недостаточно просто включить source maps в tsconfig.json
, нужно включить поддержку source maps в самом node чтобы и console.trace
и трейсы ошибок давали точные позиции в .ts файле.
Итого сетап выглядит так:
Файловая система:
src/
main.ts
...
compiled/
main.js
main.js.map
... сюда скопируется скомпилированная структура из src
package.json
tsconfig.json
Команда запуска обернута в nodemon
, который выполняет компиляцию и запуск скомпилированного кода npm run compile; node ./compiled/src/main.js
// package.json
"scripts": {
"start": "nodemon -x 'npm run compile; node ./compiled/src/main.js' -w ./src --ext js,ts,json",
"compile": "tsc"
...
}
"dependencies": {
"source-map-support": "^0.5.21",
"typescript": "~5.0.3",
"nodemon": "^3.0.1",
...
}
// tsconfig.json
{
"compilerOptions": {
...
"sourceMap": true,
"outDir": "./compiled"
А в файле-точке входа в программу src/main.ts
подключение source maps
import 'source-map-support/register'
Интересно что вам есть сказать по этому вопросу. Может я что-то упускаю? Давайте обсуждать.