mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
feat: display the tsconfig generated when running tsc --init (#45930)
* feat: display the tsconfig generated when running tsc --init * fix: fix lint issues * refactor: minor changes
This commit is contained in:
@@ -2351,6 +2351,47 @@ namespace ts {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a list of the compiler options whose value is not the default.
|
||||
* @param options compilerOptions to be evaluated.
|
||||
/** @internal */
|
||||
export function getCompilerOptionsDiffValue(options: CompilerOptions, newLine: string): string {
|
||||
const compilerOptionsMap = getSerializedCompilerOption(options);
|
||||
return getOverwrittenDefaultOptions();
|
||||
|
||||
function makePadding(paddingLength: number): string {
|
||||
return Array(paddingLength + 1).join(" ");
|
||||
}
|
||||
|
||||
function getOverwrittenDefaultOptions() {
|
||||
const result: string[] = [];
|
||||
const tab = makePadding(2);
|
||||
commandOptionsWithoutBuild.forEach(cmd => {
|
||||
if (!compilerOptionsMap.has(cmd.name)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const newValue = compilerOptionsMap.get(cmd.name);
|
||||
const defaultValue = getDefaultValueForOption(cmd);
|
||||
if (newValue !== defaultValue) {
|
||||
result.push(`${tab}${cmd.name}: ${newValue}`);
|
||||
}
|
||||
else if (hasProperty(defaultInitCompilerOptions, cmd.name)) {
|
||||
result.push(`${tab}${cmd.name}: ${defaultValue}`);
|
||||
}
|
||||
});
|
||||
return result.join(newLine) + newLine;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the compiler options to be written into the tsconfig.json.
|
||||
* @param options commandlineOptions to be included in the compileOptions.
|
||||
*/
|
||||
function getSerializedCompilerOption(options: CompilerOptions): ESMap<string, CompilerOptionsValue> {
|
||||
const compilerOptions = extend(options, defaultInitCompilerOptions);
|
||||
return serializeCompilerOptions(compilerOptions);
|
||||
}
|
||||
/**
|
||||
* Generate tsconfig configuration when running command line "--init"
|
||||
* @param options commandlineOptions to be generated into tsconfig.json
|
||||
@@ -2358,29 +2399,9 @@ namespace ts {
|
||||
*/
|
||||
/* @internal */
|
||||
export function generateTSConfig(options: CompilerOptions, fileNames: readonly string[], newLine: string): string {
|
||||
const compilerOptions = extend(options, defaultInitCompilerOptions);
|
||||
const compilerOptionsMap = serializeCompilerOptions(compilerOptions);
|
||||
const compilerOptionsMap = getSerializedCompilerOption(options);
|
||||
return writeConfigurations();
|
||||
|
||||
function getDefaultValueForOption(option: CommandLineOption) {
|
||||
switch (option.type) {
|
||||
case "number":
|
||||
return 1;
|
||||
case "boolean":
|
||||
return true;
|
||||
case "string":
|
||||
return option.isFilePath ? "./" : "";
|
||||
case "list":
|
||||
return [];
|
||||
case "object":
|
||||
return {};
|
||||
default:
|
||||
const iterResult = option.type.keys().next();
|
||||
if (!iterResult.done) return iterResult.value;
|
||||
return Debug.fail("Expected 'option.type' to have entries.");
|
||||
}
|
||||
}
|
||||
|
||||
function makePadding(paddingLength: number): string {
|
||||
return Array(paddingLength + 1).join(" ");
|
||||
}
|
||||
@@ -3542,4 +3563,24 @@ namespace ts {
|
||||
})!; // TODO: GH#18217
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function getDefaultValueForOption(option: CommandLineOption) {
|
||||
switch (option.type) {
|
||||
case "number":
|
||||
return 1;
|
||||
case "boolean":
|
||||
return true;
|
||||
case "string":
|
||||
return option.isFilePath ? "./" : "";
|
||||
case "list":
|
||||
return [];
|
||||
case "object":
|
||||
return {};
|
||||
default:
|
||||
const iterResult = option.type.keys().next();
|
||||
if (!iterResult.done) return iterResult.value;
|
||||
return Debug.fail("Expected 'option.type' to have entries.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -354,7 +354,7 @@ namespace ts {
|
||||
|
||||
function printEasyHelp(sys: System, simpleOptions: readonly CommandLineOption[]) {
|
||||
const colors = createColors(sys);
|
||||
let output: string[] = [...getHelpHeader(sys)];
|
||||
let output: string[] = [...getHeader(sys,`${getDiagnosticText(Diagnostics.tsc_Colon_The_TypeScript_Compiler)} - ${getDiagnosticText(Diagnostics.Version_0, version)}`)];
|
||||
output.push(colors.bold(getDiagnosticText(Diagnostics.COMMON_COMMANDS)) + sys.newLine + sys.newLine);
|
||||
|
||||
example("tsc", Diagnostics.Compiles_the_current_project_tsconfig_json_in_the_working_directory);
|
||||
@@ -388,7 +388,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
function printAllHelp(sys: System, compilerOptions: readonly CommandLineOption[], buildOptions: readonly CommandLineOption[], watchOptions: readonly CommandLineOption[]) {
|
||||
let output: string[] = [...getHelpHeader(sys)];
|
||||
let output: string[] = [...getHeader(sys,`${getDiagnosticText(Diagnostics.tsc_Colon_The_TypeScript_Compiler)} - ${getDiagnosticText(Diagnostics.Version_0, version)}`)];
|
||||
output = [...output, ...generateSectionOptionsOutput(sys, getDiagnosticText(Diagnostics.ALL_COMPILER_OPTIONS), compilerOptions, /*subCategory*/ true, /* beforeOptionsDescription */ undefined, formatMessage(/*_dummy*/ undefined, Diagnostics.You_can_learn_about_all_of_the_compiler_options_at_0, "https://aka.ms/tsconfig-reference"))];
|
||||
output = [...output, ...generateSectionOptionsOutput(sys, getDiagnosticText(Diagnostics.WATCH_OPTIONS), watchOptions, /*subCategory*/ false, getDiagnosticText(Diagnostics.Including_watch_w_will_start_watching_the_current_project_for_the_file_changes_Once_set_you_can_config_watch_mode_with_Colon))];
|
||||
output = [...output, ...generateSectionOptionsOutput(sys, getDiagnosticText(Diagnostics.BUILD_OPTIONS), buildOptions, /*subCategory*/ false, formatMessage(/*_dummy*/ undefined, Diagnostics.Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_trigger_building_composite_projects_which_you_can_learn_more_about_at_0, "https://aka.ms/tsc-composite-builds"))];
|
||||
@@ -398,32 +398,31 @@ namespace ts {
|
||||
}
|
||||
|
||||
function printBuildHelp(sys: System, buildOptions: readonly CommandLineOption[]) {
|
||||
let output: string[] = [...getHelpHeader(sys)];
|
||||
let output: string[] = [...getHeader(sys,`${getDiagnosticText(Diagnostics.tsc_Colon_The_TypeScript_Compiler)} - ${getDiagnosticText(Diagnostics.Version_0, version)}`)];
|
||||
output = [...output, ...generateSectionOptionsOutput(sys, getDiagnosticText(Diagnostics.BUILD_OPTIONS), buildOptions, /*subCategory*/ false, formatMessage(/*_dummy*/ undefined, Diagnostics.Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_trigger_building_composite_projects_which_you_can_learn_more_about_at_0, "https://aka.ms/tsc-composite-builds"))];
|
||||
for (const line of output) {
|
||||
sys.write(line);
|
||||
}
|
||||
}
|
||||
|
||||
function getHelpHeader(sys: System) {
|
||||
function getHeader(sys: System, message: string) {
|
||||
const colors = createColors(sys);
|
||||
const header: string[] = [];
|
||||
const tscExplanation = `${getDiagnosticText(Diagnostics.tsc_Colon_The_TypeScript_Compiler)} - ${getDiagnosticText(Diagnostics.Version_0, version)}`;
|
||||
const terminalWidth = sys.getWidthOfTerminal?.() ?? 0;;
|
||||
const tsIconLength = 5;
|
||||
|
||||
const tsIconFirstLine = colors.blueBackground(padLeft("", tsIconLength));
|
||||
const tsIconSecondLine = colors.blueBackground(colors.brightWhite(padLeft("TS ", tsIconLength)));
|
||||
// If we have enough space, print TS icon.
|
||||
if (terminalWidth >= tscExplanation.length + tsIconLength) {
|
||||
if (terminalWidth >= message.length + tsIconLength) {
|
||||
// right align of the icon is 120 at most.
|
||||
const rightAlign = terminalWidth > 120 ? 120 : terminalWidth;
|
||||
const leftAlign = rightAlign - tsIconLength;
|
||||
header.push(padRight(tscExplanation, leftAlign) + tsIconFirstLine + sys.newLine);
|
||||
header.push(padRight(message, leftAlign) + tsIconFirstLine + sys.newLine);
|
||||
header.push(padLeft("", leftAlign) + tsIconSecondLine + sys.newLine);
|
||||
}
|
||||
else {
|
||||
header.push(tscExplanation + sys.newLine);
|
||||
header.push(message + sys.newLine);
|
||||
header.push(sys.newLine);
|
||||
}
|
||||
return header;
|
||||
@@ -1035,7 +1034,12 @@ namespace ts {
|
||||
}
|
||||
else {
|
||||
sys.writeFile(file, generateTSConfig(options, fileNames, sys.newLine));
|
||||
reportDiagnostic(createCompilerDiagnostic(Diagnostics.Successfully_created_a_tsconfig_json_file));
|
||||
const output: string[] = [sys.newLine, ...getHeader(sys,"Created a new tsconfig.json with:")];
|
||||
output.push(getCompilerOptionsDiffValue(options, sys.newLine) + sys.newLine + sys.newLine);
|
||||
output.push(`You can learn more at https://aka.ms/tsconfig.json` + sys.newLine);
|
||||
for (const line of output) {
|
||||
sys.write(line);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user