Как получить корректную позицию stack trace-а в .ts файле при работе с ts-node

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'

Интересно что вам есть сказать по этому вопросу. Может я что-то упускаю? Давайте обсуждать.