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
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)--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:
Créez un fichier test/tshook.js
. Il contient:
require("ts-node").register({
project: "test/tsconfig.json",
});
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",
},
});
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
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';
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
Sur mac
"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha --require ts-node/register test/**/*.ts",