Skip to content

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

Open
@zacharyliu

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

  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:

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.

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions