From 6c701ad7a662a34ea92b673a1c7b292bfed50af4 Mon Sep 17 00:00:00 2001 From: Thomas Knickman Date: Tue, 2 Apr 2024 09:46:43 -0400 Subject: [PATCH] fix(telemetry): support bad init (#7881) ### Description If something goes wrong with telemetry init (bad file, bad perms etc.) we shouldn't error, just proceed without. Fixes https://github.com/vercel/turbo/issues/7880 ### Testing Instructions Closes TURBO-2744 --- .../create-turbo/src/commands/create/index.ts | 22 +++++++------- .../create-turbo/src/commands/create/types.ts | 2 +- packages/turbo-telemetry/src/config.test.ts | 2 +- packages/turbo-telemetry/src/config.ts | 14 +++++---- packages/turbo-telemetry/src/init.ts | 30 +++++++++++-------- 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/packages/create-turbo/src/commands/create/index.ts b/packages/create-turbo/src/commands/create/index.ts index 2db5490727f67..7920a1f41cd28 100644 --- a/packages/create-turbo/src/commands/create/index.ts +++ b/packages/create-turbo/src/commands/create/index.ts @@ -24,19 +24,19 @@ import type { CreateCommandArgument, CreateCommandOptions } from "./types"; const { turboGradient, turboLoader, info, error, warn } = logger; function trackOptions(opts: CreateCommandOptions) { - opts.telemetry.trackOptionPackageManager(opts.packageManager); - opts.telemetry.trackOptionSkipInstall(opts.skipInstall); - opts.telemetry.trackOptionSkipTransforms(opts.skipTransforms); - opts.telemetry.trackOptionExample(opts.example); - opts.telemetry.trackOptionTurboVersion(opts.turboVersion); - opts.telemetry.trackOptionExamplePath(opts.examplePath); + opts.telemetry?.trackOptionPackageManager(opts.packageManager); + opts.telemetry?.trackOptionSkipInstall(opts.skipInstall); + opts.telemetry?.trackOptionSkipTransforms(opts.skipTransforms); + opts.telemetry?.trackOptionExample(opts.example); + opts.telemetry?.trackOptionTurboVersion(opts.turboVersion); + opts.telemetry?.trackOptionExamplePath(opts.examplePath); } function handleErrors( err: unknown, telemetry: CreateCommandOptions["telemetry"] ) { - telemetry.trackCommandStatus({ command: "create", status: "error" }); + telemetry?.trackCommandStatus({ command: "create", status: "error" }); // handle errors from ../../transforms if (err instanceof TransformError) { error(chalk.bold(err.transform), chalk.red(err.message)); @@ -73,9 +73,9 @@ export async function create( opts: CreateCommandOptions ) { // track CLI command start - opts.telemetry.trackCommandStatus({ command: "create", status: "start" }); - opts.telemetry.trackArgumentPackageManager(packageManagerCmd); - opts.telemetry.trackArgumentDirectory(Boolean(directory)); + opts.telemetry?.trackCommandStatus({ command: "create", status: "start" }); + opts.telemetry?.trackArgumentPackageManager(packageManagerCmd); + opts.telemetry?.trackArgumentDirectory(Boolean(directory)); trackOptions(opts); const { @@ -290,5 +290,5 @@ export async function create( logger.log(chalk.cyan(` ${packageManagerMeta.executable} turbo login`)); logger.log(); } - opts.telemetry.trackCommandStatus({ command: "create", status: "end" }); + opts.telemetry?.trackCommandStatus({ command: "create", status: "end" }); } diff --git a/packages/create-turbo/src/commands/create/types.ts b/packages/create-turbo/src/commands/create/types.ts index 1666ef9c29a71..94f7fba365217 100644 --- a/packages/create-turbo/src/commands/create/types.ts +++ b/packages/create-turbo/src/commands/create/types.ts @@ -10,5 +10,5 @@ export interface CreateCommandOptions { turboVersion?: string; example?: string; examplePath?: string; - telemetry: CreateTurboTelemetry; + telemetry: CreateTurboTelemetry | undefined; } diff --git a/packages/turbo-telemetry/src/config.test.ts b/packages/turbo-telemetry/src/config.test.ts index 60d5590b2ac03..448e5026eec35 100644 --- a/packages/turbo-telemetry/src/config.test.ts +++ b/packages/turbo-telemetry/src/config.test.ts @@ -49,7 +49,7 @@ describe("TelemetryConfig", () => { expect(mockDefaultConfigPath).toHaveBeenCalled(); expect(mockReadFileSync).toHaveBeenCalledWith(mockConfigPath, "utf-8"); expect(result).toBeInstanceOf(TelemetryConfig); - expect(result.id).toEqual("654321"); + expect(result?.id).toEqual("654321"); }); }); diff --git a/packages/turbo-telemetry/src/config.ts b/packages/turbo-telemetry/src/config.ts index 3b7569dccc96f..eec400280623f 100644 --- a/packages/turbo-telemetry/src/config.ts +++ b/packages/turbo-telemetry/src/config.ts @@ -30,11 +30,15 @@ export class TelemetryConfig { this.configPath = configPath; } - static async fromDefaultConfig() { - const configPath = await defaultConfigPath(); - const file = readFileSync(configPath, "utf-8"); - const config = JSON.parse(file) as Config; - return new TelemetryConfig({ configPath, config }); + static async fromDefaultConfig(): Promise { + try { + const configPath = await defaultConfigPath(); + const file = readFileSync(configPath, "utf-8"); + const config = JSON.parse(file) as Config; + return new TelemetryConfig({ configPath, config }); + } catch (e) { + return undefined; + } } write() { diff --git a/packages/turbo-telemetry/src/init.ts b/packages/turbo-telemetry/src/init.ts index c1b3038406fe6..86a4545fcc1f2 100644 --- a/packages/turbo-telemetry/src/init.ts +++ b/packages/turbo-telemetry/src/init.ts @@ -17,22 +17,28 @@ export async function initTelemetry({ }: { packageInfo: PackageInfo; opts?: Args["opts"]; -}): Promise<{ telemetry: InstanceType }> { +}): Promise<{ + telemetry: InstanceType | undefined; +}> { // lookup the correct client const Client = telemetryClients[packageInfo.name]; // read the config const config = await TelemetryConfig.fromDefaultConfig(); - config.showAlert(); - // initialize the given client - const telemetry = new Client({ - api: TELEMETRY_API, - packageInfo, - config, - opts, - }); + if (config) { + config.showAlert(); + // initialize the given client + const telemetry = new Client({ + api: TELEMETRY_API, + packageInfo, + config, + opts, + }); - return { telemetry } as { - telemetry: InstanceType; - }; + return { telemetry } as { + telemetry: InstanceType; + }; + } + + return { telemetry: undefined }; }