danger-js icon indicating copy to clipboard operation
danger-js copied to clipboard

[BUG] tsconfig.json "extends" field not parsed by transpiler

Open zacharyliu opened this issue 3 years ago • 4 comments

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

  1. Create a tsconfig.json extending that config:
{
  "extends": "@tsconfig/node16/tsconfig.json"
}
  1. Create a Dangerfile which tries to use non-commonjs features:
import { exec } from "child_process";
  1. Try to run Danger with danger ci. It will report an error like "cannot use import outside a module", as the module: "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:

https://github.com/danger/danger-js/blob/630f2a49cfa1e7e4b87173ee9754278e00452ac3/source/runner/runners/utils/transpiler.ts#L128-L134

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.

zacharyliu avatar Jun 08 '22 17:06 zacharyliu

Thanks for filing @zacharyliu -- this seems pretty important! Do you feel comfortable filing a PR for this?

@orta -- is there any reason (compatibility, peril, …) @zacharyliu's proposed change of using lookupTSConfig and parseJsonConfigFileContent wouldn't work?

https://github.com/microsoft/TypeScript/blob/b8f648832379005fc8c3c9b34cc5e4acd01653e4/src/compiler/commandLineParser.ts#L2679-L2688

fbartho avatar Jun 08 '22 18:06 fbartho

Nope, that change should be fine I think 👍🏻

orta avatar Jun 08 '22 18:06 orta

Yep, I got it working locally with a patch, so I'll try to clean it up for a PR.

@orta Do you happen to know which TypeScript APIs are best to use for this? ts-node uses ts.readConfigFile and ts.parseJsonConfigFileContent, but there's also a few other similar APIs like ts.getParsedCommandLineOfConfigFile.

zacharyliu avatar Jun 08 '22 18:06 zacharyliu

Off-hand, no, I'd follow ts-node - given the amount of traffic they've seen, it should be a reasonable pattern to replicate

orta avatar Jun 08 '22 21:06 orta