-
-
Couldn't load subscription status.
- Fork 375
Description
Describe the bug
When using the built-in native TypeScript transpiler, the extends field is not supported and only the explicit compilerOptions are used. This field is sometimes used in monorepos to extend a shared config, or to extend one of the official "base" templates.
To Reproduce
Steps to reproduce the behavior:
0. Install a base config: npm install @tsconfig/node16
- Create a
tsconfig.jsonextending that config:
{
"extends": "@tsconfig/node16/tsconfig.json"
}- Create a Dangerfile which tries to use non-commonjs features:
import { exec } from "child_process";- Try to run Danger with
danger ci. It will report an error like "cannot use import outside a module", as themodule: "commonjs"option from the base config does not get inherited correctly.
Expected behavior
Danger should support all official methods of configuring tsconfig.json.
| software | version |
|---|---|
| danger.js | 11.0.7 |
| node | v16.15.0 |
| npm | 8.5.5 |
| Operating System | macOS 12.4 |
Additional context
I believe the bug is because Danger's transpiler directly loads the tsconfig file contents and passes it to ts.transpileModule:
danger-js/source/runner/runners/utils/transpiler.ts
Lines 128 to 134 in 630f2a4
| if (tsConfigPath) { | |
| compilerOptions = JSON5.parse(fs.readFileSync(tsConfigPath, "utf8")) | |
| } else { | |
| compilerOptions = ts.getDefaultCompilerOptions() | |
| } | |
| let result = ts.transpileModule(content, sanitizeTSConfig(compilerOptions)) |
This can be fixed by using the TypeScript APIs for parsing the config options. For example, in ts-node:
https://github.com/TypeStrong/ts-node/blob/14323f9d00d5c7051ac09b944c7f423e442145ea/src/configuration.ts#L301-L317
Some of the other functions in this file, like lookupTSConfig, can also use the native APIs instead.