From 860a54c56929482063b6f1f30354d84db7aac61e Mon Sep 17 00:00:00 2001 From: Ty Hopp Date: Fri, 14 Jan 2022 18:31:11 +0800 Subject: [PATCH] fix(create-gatsby): Respect telemetry disable --- .../create-gatsby/src/__tests__/tracking.ts | 59 +++++++++++++++++++ packages/create-gatsby/src/is-truthy.ts | 24 ++++++++ packages/create-gatsby/src/tracking.ts | 32 ++++++++++ 3 files changed, 115 insertions(+) create mode 100644 packages/create-gatsby/src/__tests__/tracking.ts create mode 100644 packages/create-gatsby/src/is-truthy.ts diff --git a/packages/create-gatsby/src/__tests__/tracking.ts b/packages/create-gatsby/src/__tests__/tracking.ts new file mode 100644 index 0000000000000..13f7e935a7bcb --- /dev/null +++ b/packages/create-gatsby/src/__tests__/tracking.ts @@ -0,0 +1,59 @@ +import { getConfigStore } from "../get-config-store" + +const mockGetFunction = jest.fn() +const mockSetFunction = jest.fn() + +jest.mock(`../get-config-store`, () => { + return { + getConfigStore: (): unknown => { + return { + items: {}, + set(key: string, value: unknown): void { + mockSetFunction(key, value) + ;(this as any).items[key] = value + }, + get(key: string): unknown { + mockGetFunction(key) + return (this as any).items[key] + }, + + __reset(): void { + ;(this as any).items = {} + }, + } + }, + } +}) + +let isTrackingEnabled + +describe(`isTrackingEnabled`, () => { + beforeEach(() => { + jest.resetModules() + isTrackingEnabled = require(`../tracking`).isTrackingEnabled + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it(`is enabled by default`, async () => { + const enabled = isTrackingEnabled() + expect(enabled).toBe(true) + expect(mockGetFunction).toHaveBeenCalledWith(`telemetry.enabled`) + expect(mockSetFunction).toHaveBeenCalledWith(`telemetry.enabled`, true) + }) + + // TODO - Implement remaining tests + + it.skip(`respects the setting of the config store`, async () => { + const store = getConfigStore() + store.set(`telemetry.enabled`, false) + const enabled = isTrackingEnabled() + expect(enabled).toBe(false) + }) + + it.skip(`respects the setting of the environment variable`, async () => {}) + + it.skip(`caches the setting for all calls in create-gatsby`, async () => {}) +}) diff --git a/packages/create-gatsby/src/is-truthy.ts b/packages/create-gatsby/src/is-truthy.ts new file mode 100644 index 0000000000000..ee55e27826a5d --- /dev/null +++ b/packages/create-gatsby/src/is-truthy.ts @@ -0,0 +1,24 @@ +// TODO - Check if we want to add core utils as a dependency or not, +// that's where this is taken from. + +// Returns true for `true`, true, positive numbers +// Returns false for `false`, false, 0, negative integers and anything else +export function isTruthy(value: any): boolean { + // Return if Boolean + if (typeof value === `boolean`) return value + + // Return false if null or undefined + if (value === undefined || value === null) return false + + // If the String is true or false + if (value.toLowerCase() === `true`) return true + if (value.toLowerCase() === `false`) return false + + // Now check if it's a number + const number = parseInt(value, 10) + if (isNaN(number)) return false + if (number > 0) return true + + // Default to false + return false +} diff --git a/packages/create-gatsby/src/tracking.ts b/packages/create-gatsby/src/tracking.ts index d0c2d60801895..d5d878540c856 100644 --- a/packages/create-gatsby/src/tracking.ts +++ b/packages/create-gatsby/src/tracking.ts @@ -1,11 +1,16 @@ import fetch from "node-fetch" import { v4 as uuidv4 } from "@lukeed/uuid" import { getConfigStore } from "./get-config-store" +import { isTruthy } from "./is-truthy" const store = getConfigStore() const gatsbyCliVersion = require(`../package.json`).version const analyticsApi = process.env.GATSBY_TELEMETRY_API || `https://analytics.gatsbyjs.com/events` +let trackingEnabled: boolean | undefined +const trackingDisabledFromEnvVar: boolean | undefined = isTruthy( + process.env.GATSBY_TELEMETRY_DISABLED +) const getMachineId = (): string => { let machineId = store.get(`telemetry.machineId`) @@ -28,7 +33,34 @@ export interface ITrackCliArgs { const sessionId = uuidv4() +// Adapted from gatsby-telemetry +export function isTrackingEnabled(): boolean { + // Cache the result + if (trackingEnabled !== undefined) { + return trackingEnabled + } + + let enabled = store.get(`telemetry.enabled`) as boolean | null + + if (enabled === undefined || enabled === null) { + enabled = true + store.set(`telemetry.enabled`, enabled) + } + trackingEnabled = enabled + + if (trackingDisabledFromEnvVar) { + enabled = false + trackingEnabled = enabled + } + + return enabled +} + export const trackCli = (eventType: string, args?: ITrackCliArgs): void => { + if (!isTrackingEnabled()) { + return + } + fetch(analyticsApi, { method: `POST`, headers: {