Переопределение `tsconfig.json` для ts-node в mocha
Можно ли переопределить какие tsconfig.json
TS-узел использует при вызове из мокко?
Мой основной tsconfig.json
содержит "module": "es2015"
, но я хочу использовать "module": "commonjs"
только для ts-узла.
Я пробовал это
mocha --compilers ts:ts-node/register,tsx:ts-node/register \
--compilerOptions '{"module":"commonjs"}' \
--require ts-node/register test/**/*.spec.ts*
но это не сработало
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:387:25)
at Module.m._compile (/usr/lib/node_modules/ts-node/src/index.ts:406:23)
at Module._extensions..js (module.js:422:10)
at Object.require.extensions.(anonymous function) [as .tsx] (/usr/lib/node_modules/ts-node/src/index.ts:409:12)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Module.require (module.js:367:17)
at require (internal/module.js:16:19)
at /usr/lib/node_modules/mocha/lib/mocha.js:222:27
at Array.forEach (native)
at Mocha.loadFiles (/usr/lib/node_modules/mocha/lib/mocha.js:219:14)
at Mocha.run (/usr/lib/node_modules/mocha/lib/mocha.js:487:10)
at Object.<anonymous> (/usr/lib/node_modules/mocha/bin/_mocha:458:18)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:146:18)
at node.js:404:3
9 ответов
Вам нужно установить конфигурацию через TS_NODE_COMPILER_OPTIONS
переменная окружения
Пример кода на Unix-машине:
TS_NODE_COMPILER_OPTIONS='{"module":"commonjs"}' \
mocha --require ts-node/register 'test/**/*.spec.{ts,tsx}'
Пояснение извлечено из документации хранилища
CLI и программные опции
Переменная среды обозначена в скобках.
--typeCheck
Включить проверку типов для TypeScript (TS_NODE_TYPE_CHECK
)--cacheDirectory
Настройте каталог кэша выходного файла (TS_NODE_CACHE_DIRECTORY
)-I, --ignore [pattern]
Переопределить шаблоны пути, чтобы пропустить компиляцию (TS_NODE_IGNORE
)-P, --project [path]
Путь к файлу проекта JSON TypeScript (TS_NODE_PROJECT
)-C, --compiler [name]
Укажите пользовательский компилятор TypeScript (TS_NODE_COMPILER
)-D, --ignoreDiagnostics [code]
Игнорировать предупреждения TypeScript по диагностическому коду (TS_NODE_IGNORE_DIAGNOSTICS
)-O, --compilerOptions [opts]
Объект JSON для объединения с параметрами компилятора (TS_NODE_COMPILER_OPTIONS
)--no-cache
Отключить локальный кэш TypeScript Node (TS_NODE_CACHE
)--skip-project
Пропустить разрешение и загрузку конфигурации проекта (TS_NODE_SKIP_PROJECT
)--skip-ignore
Пропустить игнорировать проверки (TS_NODE_SKIP_IGNORE
)
Typescript
позволяет переопределить файл конфигурации. Вместо жесткого кодирования JSON в переменной среды, как упоминалось в других решениях, укажите переопределенный путь конфигурации в среде. TS_NODE_PROJECT
переменная окружения может быть использована для этого.
TS_NODE_PROJECT='./tsconfig.commonjs.json'
Так что, если ваш основной конфиг:
tsconfig.json
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
}
}
Вы можете создать другую конфигурацию, которая переопределяет module
установка.
tsconfig.commonjs.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs"
}
}
Когда вы запускаете mocha, укажите переопределенную конфигурацию для использования.
"test": "TS_NODE_PROJECT='./tsconfig.commonjs.json' mocha -r ts-node/register test/**/*.spec.ts*"
Это упрощает дальнейшую настройку вашего tsconfig
только для тестирования мокко. Вы даже можете запустить ts-node
(за пределами мокко) непосредственно указав этот путь.
ts-node -P tsconfig.commonjs.json -r myFile.ts
--compilerOptions
не будет работать.
Что вам нужно сделать, это настроить, как вы регистрируетесь ts-node
, Мой случай немного отличался от вашего, я хотел его использовать test/tsconfig.json
, который содержал настройки, необходимые для моего тестового кода. Если бы я просто использовал --require ts-node/register
, он использовал конфигурацию по умолчанию, которая не содержала параметров, необходимых для запуска моих тестов.
То, что я сделал, было:
Создать файл
test/tshook.js
, Это содержит:require("ts-node").register({ project: "test/tsconfig.json", });
Я отредактировал мой
test/mocha.opts
иметь:--require test/tshook.js test/**/*.ts
Это должно передать желаемую настройку ts-node
:
require("ts-node").register({
compilerOptions: {
module: "commonjs",
},
});
В package.json - раздел скриптов:
"test": "TS_NODE_PROJECT=src mocha"
забирает мой tsconfig.json в каталоге src моего проекта, переопределяя стандартный tsconfig.json.
OP может достичь того же, используя тест вместо src
Это работало для меня на окнах
set TS_NODE_COMPILER_OPTIONS={\"module\":\"commonjs\"} && mocha -r ts-node/register test/unit/*.test.ts
Это была ошибка, которая побудила меня использовать это решение
(function (exports, require, module, __filename, __dirname) { import 'mocha';
Вы также можете использовать ts-mocha (https://www.npmjs.com/package/ts-mocha)
пример
package.json
"test": "ts-mocha -p test/tsconfig.cjs.json test/**/*.test.ts"
test / tsconfig.cjs.json
{
"extends": "../tsconfig.json",
"compilerOptions": {
"module": "commonjs"
}
}
Хотя, похоже, не существует единой формулировки командной строки linux/windows, которая работает, вы можете установить compiler-options
из командной строки. В моем случае, как и в OP, у меня естьtsconfig.json
с module: esnext
. Мне удалось переопределить в командной строке:
Бегал на винде, ж / бts-node
установлен глобально, но в разных типах оболочки:
bash / mingw64:ts-node --compiler-options={"module":"commonJS"} xxx.ts
cmd:ts-node --compiler-options={\"module\":\"commonJS\"} xxx.ts
На Mac
"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha --require ts-node/register test/**/*.ts",
Это не затрагивает основной исходный вопрос, но затрагивает суть работы мокко с машинописным текстом, поэтому я опубликую его здесь на случай, если он поможет другим.
Мы обнаружили, что для того, чтобы это работало в Windows, необходимо какое-то нелепое экранирование обратной косой черты. Он отлично работает и на Mac, хотя Mac не нуждается в таком же экранировании.
Затем, доп.ts-node require
директивы были критическими.
Файлpackage.json
:
{
"scripts": {
...
"test": "cross-env TS_NODE_COMPILER_OPTIONS={\\\"module\\\":\\\"commonjs\\\"} mocha"
},
...
"mocha": {
"require": [
"ts-node/register",
"tsconfig-paths/register"
],
"watch-files": [
"./src/**/*.ts",
"./tests/**/*.spec.ts"
],
"spec": "./tests/**/*.spec.ts"
}