Переопределение `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, он использовал конфигурацию по умолчанию, которая не содержала параметров, необходимых для запуска моих тестов.

То, что я сделал, было:

  1. Создать файл test/tshook.js, Это содержит:

    require("ts-node").register({
      project: "test/tsconfig.json",
    });
    
  2. Я отредактировал мой 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"
  }
Другие вопросы по тегам