From fcb4421c8da230b8ccdc81b7c9f9e7a71a28dc9f Mon Sep 17 00:00:00 2001 From: Travis Prescott Date: Fri, 31 Jan 2025 12:56:32 -0800 Subject: [PATCH] `tsp init` to automatically run `tsp install` (#5824) Close #5766. Per discussion from https://github.com/microsoft/typespec/pull/5796 and Teams, this PR: - automatically runs `tsp install` as part of `tsp init` if the template created a `package.json` file - skips running or mentioning `tsp install` if `package.json` is not created - does NOT provide a flag for opt in/out - does NOT provide a confirmation dialogue ![image](https://github.com/user-attachments/assets/53a656d8-c795-419b-92a2-034883a94bcc) --- .../tspInitUpdate-2025-0-31-9-41-10.md | 7 ++++++ packages/compiler/src/init/init.ts | 23 +++++++++++++++---- packages/compiler/src/init/scaffold.ts | 2 +- 3 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 .chronus/changes/tspInitUpdate-2025-0-31-9-41-10.md diff --git a/.chronus/changes/tspInitUpdate-2025-0-31-9-41-10.md b/.chronus/changes/tspInitUpdate-2025-0-31-9-41-10.md new file mode 100644 index 0000000000..1a13083dea --- /dev/null +++ b/.chronus/changes/tspInitUpdate-2025-0-31-9-41-10.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@typespec/compiler" +--- + +`tsp init` will not automatically run `tsp install` if a `package.json` file is created. \ No newline at end of file diff --git a/packages/compiler/src/init/init.ts b/packages/compiler/src/init/init.ts index 4af843d430..de083f6cd3 100644 --- a/packages/compiler/src/init/init.ts +++ b/packages/compiler/src/init/init.ts @@ -2,6 +2,8 @@ import { readdir } from "fs/promises"; import pc from "picocolors"; import prompts from "prompts"; import * as semver from "semver"; +import { CliCompilerHost } from "../core/cli/types.js"; +import { installTypeSpecDependencies } from "../core/install.js"; import { createDiagnostic } from "../core/messages.js"; import { getBaseFileName, getDirectoryPath } from "../core/path-utils.js"; import { CompilerHost, Diagnostic, NoTarget, SourceFile } from "../core/types.js"; @@ -10,7 +12,12 @@ import { readUrlOrPath } from "../utils/misc.js"; import { getTypeSpecCoreTemplates } from "./core-templates.js"; import { validateTemplateDefinitions, ValidationResult } from "./init-template-validate.js"; import { EmitterTemplate, InitTemplate, InitTemplateLibrarySpec } from "./init-template.js"; -import { makeScaffoldingConfig, normalizeLibrary, scaffoldNewProject } from "./scaffold.js"; +import { + isFileSkipGeneration, + makeScaffoldingConfig, + normalizeLibrary, + scaffoldNewProject, +} from "./scaffold.js"; export interface InitTypeSpecProjectOptions { templatesUrl?: string; @@ -18,7 +25,7 @@ export interface InitTypeSpecProjectOptions { } export async function initTypeSpecProject( - host: CompilerHost, + host: CliCompilerHost, directory: string, options: InitTypeSpecProjectOptions = {}, ) { @@ -80,15 +87,23 @@ export async function initTypeSpecProject( }); await scaffoldNewProject(host, scaffoldingConfig); + const projectJsonCreated = !isFileSkipGeneration( + "package.json", + scaffoldingConfig.template.files ?? [], + ); // eslint-disable-next-line no-console console.log(""); - // eslint-disable-next-line no-console - console.log("TypeSpec init completed. You can run `tsp install` now to install dependencies."); // eslint-disable-next-line no-console console.log(pc.green("Project created successfully.")); + if (projectJsonCreated) { + // eslint-disable-next-line no-console + console.log(pc.green("Installing dependencies...")); + await installTypeSpecDependencies(host, directory); + } + if (Object.values(emitters).some((emitter) => emitter.message !== undefined)) { // eslint-disable-next-line no-console console.log(pc.yellow("\nPlease review the following messages from emitters:")); diff --git a/packages/compiler/src/init/scaffold.ts b/packages/compiler/src/init/scaffold.ts index 4eb49c83df..1ffc489b9f 100644 --- a/packages/compiler/src/init/scaffold.ts +++ b/packages/compiler/src/init/scaffold.ts @@ -97,7 +97,7 @@ export async function scaffoldNewProject(host: CompilerHost, config: Scaffolding await writeFiles(host, config); } -function isFileSkipGeneration(fileName: string, files: InitTemplateFile[]): boolean { +export function isFileSkipGeneration(fileName: string, files: InitTemplateFile[]): boolean { for (const file of files) { if (file.destination === fileName) { return file.skipGeneration ?? false;