web-dev-qa-db-fra.com

Remplacer `tsconfig.json` pour ts-node dans mocha

Est-il possible de remplacer quel tsconfig.json ts-node utilise lorsqu'il est appelé depuis mocha?

Mon principal tsconfig.json contient "module": "es2015", mais je veux utiliser "module": "commonjs" pour ts-node uniquement.

J'ai essayé

mocha --compilers ts:ts-node/register,tsx:ts-node/register \
    --compilerOptions '{"module":"commonjs"}' \
    --require ts-node/register test/**/*.spec.ts*

mais cela n'a pas fonctionné:

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
35
Ralph

Vous devez définir la configuration via TS_NODE_COMPILER_OPTIONS variable d'environnement

Exemple de code sur une machine Unix:

TS_NODE_COMPILER_OPTIONS='{"module":"commonjs"}' \
mocha --require ts-node/register 'test/**/*.spec.{ts,tsx}'

Explication extraite de la documentation du référentiel


CLI et options de programmation

Variable d'environnement indiquée entre parenthèses.

  • -T, --transpile-only Utilisez le transpileModule plus rapide de TypeScript (TS_NODE_TRANSPILE_ONLY, par défaut: faux)
  • -I, --ignore [pattern] Remplacez les modèles de chemin pour ignorer la compilation (TS_NODE_IGNORE, par défaut:/node_modules /)
  • -P, --project [path] Chemin d'accès au fichier de projet JSON TypeScript (TS_NODE_PROJECT)
  • -C, --compiler [name] Spécifiez un compilateur TypeScript personnalisé (TS_NODE_COMPILER, par défaut: TypeScript)
  • -D, --ignore-diagnostics [code] Ignorer les avertissements TypeScript par code de diagnostic (TS_NODE_IGNORE_DIAGNOSTICS)
  • -O, --compiler-options [opts] Objet JSON à fusionner avec les options du compilateur (TS_NODE_COMPILER_OPTIONS)
  • --files Charger les fichiers depuis tsconfig.json au démarrage (TS_NODE_FILES, par défaut: faux)
  • --pretty Utilisez un joli formateur de diagnostic (TS_NODE_PRETTY, par défaut: faux)
  • --skip-project Ignorer la résolution et le chargement de la configuration du projet (TS_NODE_SKIP_PROJECT, par défaut: faux)
  • --skip-ignore Ignorer les chèques ignorés (TS_NODE_SKIP_IGNORE, par défaut: faux)
  • --log-error Enregistre les erreurs de types au lieu de quitter le processus (TS_NODE_LOG_ERROR, par défaut: faux)
  • --prefer-ts-exts Réorganisez les extensions de fichier pour privilégier les importations TypeScript (TS_NODE_PREFER_TS_EXTS, par défaut: faux)
37
lleon

--compilerOptions ne fonctionnera pas.

Ce que vous devez faire est de personnaliser la façon dont vous vous enregistrez ts-node. Mon cas était un peu différent du vôtre, je voulais qu'il utilise test/tsconfig.json, qui contenait les paramètres nécessaires à mon code de test. Si je viens d'utiliser --require ts-node/register, il utilisait une configuration par défaut qui ne contenait pas les paramètres nécessaires pour exécuter mes tests.

Ce que j'ai fait, c'est:

  1. Créez un fichier test/tshook.js. Il contient:

    require("ts-node").register({
      project: "test/tsconfig.json",
    });
    
  2. J'ai édité mon test/mocha.opts avoir:

    --require test/tshook.js
    test/**/*.ts
    

Cela devrait passer le paramètre souhaité à ts-node:

require("ts-node").register({
  compilerOptions: {
    module: "commonjs",
  },
});
16
Louis

Dans package.json - section scripts:

"test": "TS_NODE_PROJECT=src mocha"

récupère mon tsconfig.json dans le répertoire src de mon projet, remplaçant le tsconfig.json par défaut.

OP peut réaliser la même chose en utilisant test au lieu de src

7
Samir Seth

Cela a fonctionné pour moi sur Windows

set TS_NODE_COMPILER_OPTIONS={\"module\":\"commonjs\"} && mocha -r ts-node/register test/unit/*.test.ts 

Ce fut l'erreur qui m'a incité à utiliser cette solution

(function (exports, require, module, __filename, __dirname) { import 'mocha';

2
Wakeel

TypeScript vous permet de remplacer un fichier de configuration. Plutôt que de coder en dur JSON dans une variable d'environnement comme mentionné dans les autres solutions, spécifiez le chemin de configuration substitué dans l'environnement. Le TS_NODE_PROJECT La variable d'environnement peut être utilisée pour cela.

TS_NODE_PROJECT='./tsconfig.commonjs.json'

Donc, si votre configuration principale est:

tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
   }
}

Vous pouvez créer une autre configuration qui remplace le paramètre module.

tsconfig.commonjs.json

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "module": "commonjs"
  }
}

Lorsque vous exécutez mocha, spécifiez la configuration remplacée à utiliser.

    "test": "TS_NODE_PROJECT='./tsconfig.commonjs.json' mocha -r ts-node/register test/**/*.spec.ts*"

Il est ainsi très facile de personnaliser davantage votre tsconfig uniquement pour les tests mocha. Vous pouvez même exécuter ts-node (en dehors de mocha) spécifiant directement ce chemin.

ts-node -P tsconfig.commonjs.json -r myFile.ts 
2
Steven Spungin

Sur mac

"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha --require ts-node/register test/**/*.ts",
0
barath