Repository: TypeScript
Issue: Suggestion: an option to make --showConfig more verbose
Labels: Suggestion,Help Wanted,Experience Enhancement

## Search Terms

`showConfig`, `verbose`, `verbosity`

## Suggestion

Currently, the `--showConfig` option will only print the compiler options that are provided by the given `tsconfig.json`.

The suggestion is to introduce another command line option to use together with `--showConfig`, for example `--verbose`, that would additionally print out the default values of all of the missing compiler options.

## Use Cases

This new option hopes to make debugging configuration files easier by explicitly displaying the value of every compiler option.

## Examples

Given the following folder structure:

```
.
├── main.ts
└── tsconfig.json
```

And the following `tsconfig.json`:

```json
{
  "compilerOptions": {
    "target": "es5"
  },
  "include": ["**/*.ts"]
}
```

Running the command `tsc --showConfig` produces:

```json
{
    "compilerOptions": {
        "target": "es5"
    },
    "files": [
        "./main.ts"
    ],
    "include": [
        "**/*.ts"
    ]
}
```

Here's an example output of `tsc --showConfig --verbose`. It was derived in the following way:

1. Use the Typescript Handbook's [table of compiler options and their defaults](https://www.typescriptlang.org/docs/handbook/compiler-options.html#compiler-options) as a reference.
2. Exclude deprecated options (`out`, `reactNamespace`, and `skipDefaultLibCheck`)
3. Also exclude any options that are missing a default value in the table, since JSON doesn't have a notion of `undefined`.

```json5
{
    "compilerOptions": {
        "allowJs": false,
        "allowSyntheticDefaultImports": false,
        "allowUmdGlobalAccess": false,
        "allowUnreachableCode": false,
        "allowUnusedLabels": false,
        "alwaysStrict": false,
        "build": false,
        "charset": "utf8",
        "checkJs": false,
        "composite": true,
        "declaration": false,
        "declarationMap": false,
        "diagnostics": false,
        "disableSizeLimit": false,
        "downlevelIteration": false,
        "emitBOM": false,
        "emitDeclarationOnly": false,
        "emitDecoratorMetadata": false,
        "esModuleInterop": false,
        "experimentalDecorators": false,
        "extendedDiagnostics": false,
        "forceConsistentCasingInFileNames": false,
        "importHelpers": false,
        "incremental": false,
        "inlineSourceMap": false,
        "inlineSources": false,
        "isolatedModules": false,
        "jsx": "preserve",
        "jsxFactory": "React.createElement",
        "keyofStringsOnly": false,
        "listEmittedFiles": false,
        "listFiles": false,
        "locale": "en", // [2]
        "module": "commonjs",
        "moduleResolution": "classic",
        "newLine": "lf", // [2]
        "noEmit": false,
        "noEmitHelpers": false,
        "noEmitOnError": false,
        "noErrorTruncation": false,
        "noFallthroughCasesInSwitch": false,
        "noImplicitAny": false,
        "noImplicitReturns": false,
        "noImplicitThis": false,
        "noImplicitUseStrict": false,
        "noLib": false,
        "noResolve": false,
        "noStrictGenericChecks": false,
        "noUnusedLocals": false,
        "noUnusedParameters": false,
        "preserveConstEnums": false,
        "preserveSymlinks": false,
        "preserveWatchOutput": false,
        "pretty": true, // [1]
        "removeComments": false,
        "resolveJsonModule": false,
        "rootDir": "(computed from the list of input files)", // [3]
        "showConfig": false,
        "skipLibCheck": false,
        "sourceMap": false,
        "strict": false,
        "strictBindCallApply": false,
        "strictFunctionTypes": false,
        "strictPropertyInitialization": false,
        "strictNullChecks": false,
        "suppressExcessPropertyErrors": false,
        "suppressImplicitAnyIndexErrors": false,
        "target": "es5",
        "traceResolution": false,
        "tsBuildInfoFile": ".tsbuildinfo"
    },
    "files": [
        "./main.ts"
    ],
    "include": [
        "**/*.ts"
    ]
}
```

<sup>[1]</sup> The Handbook says `pretty` should be `true` unless piping or redirecting output to file, so the desired value here may be ambiguous?

<sup>[2]</sup> `locale` and `newLine` are platform-specific.

<sup>[3]</sup> `rootDir` would need to be calculated so it can be displayed.

## Checklist

My suggestion meets these guidelines:

* [x] This wouldn't be a breaking change in existing TypeScript/JavaScript code
* [x] This wouldn't change the runtime behavior of existing JavaScript code
* [x] This could be implemented without emitting different JS based on the types of the expressions
* [x] This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
* [x] This feature would agree with the rest of [TypeScript's Design Goals](https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals).