From 433d15f9cb3f1625e0520bea89fb794c47c9feed Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 18 Aug 2023 10:19:21 -0500 Subject: [PATCH 01/17] chore: enable telemetry notice --- packages/astro/src/cli/index.ts | 13 ++++++++----- packages/astro/src/cli/telemetry/index.ts | 8 ++++++++ packages/astro/src/core/messages.ts | 7 ++++--- packages/telemetry/src/index.ts | 18 ++++++++++++++---- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/packages/astro/src/cli/index.ts b/packages/astro/src/cli/index.ts index fdf43201fb37..0421258a51ae 100644 --- a/packages/astro/src/cli/index.ts +++ b/packages/astro/src/cli/index.ts @@ -109,6 +109,11 @@ async function runCommand(cmd: string, flags: yargs.Arguments) { await update(subcommand, { flags }); return; } + case 'sync': { + const { sync } = await import('./sync/index.js'); + const exitCode = await sync({ flags }); + return process.exit(exitCode); + } } // In verbose/debug mode, we log the debug logs asap before any potential errors could appear @@ -122,6 +127,9 @@ async function runCommand(cmd: string, flags: yargs.Arguments) { process.env.NODE_ENV = cmd === 'dev' ? 'development' : 'production'; } + const { notify } = await import('./telemetry/index.js'); + await notify(); + // These commands uses the logging and user config. All commands are assumed to have been handled // by the end of this switch statement. switch (cmd) { @@ -161,11 +169,6 @@ async function runCommand(cmd: string, flags: yargs.Arguments) { return process.exit(checkServer ? 1 : 0); } } - case 'sync': { - const { sync } = await import('./sync/index.js'); - const exitCode = await sync({ flags }); - return process.exit(exitCode); - } } // No command handler matched! This is unexpected. diff --git a/packages/astro/src/cli/telemetry/index.ts b/packages/astro/src/cli/telemetry/index.ts index 5ff71f5bf781..51f93d1eab7b 100644 --- a/packages/astro/src/cli/telemetry/index.ts +++ b/packages/astro/src/cli/telemetry/index.ts @@ -2,11 +2,19 @@ import type yargs from 'yargs-parser'; import * as msg from '../../core/messages.js'; import { telemetry } from '../../events/index.js'; +import prompts from 'prompts'; interface TelemetryOptions { flags: yargs.Arguments; } +export async function notify() { + await telemetry.notify(async () => { + console.log(msg.telemetryNotice() + '\n'); + return true; + }) +} + export async function update(subcommand: string, { flags }: TelemetryOptions) { const isValid = ['enable', 'disable', 'reset'].includes(subcommand); diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index d0c5a5e88404..6c57b3846854 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -107,10 +107,11 @@ export function serverStart({ } export function telemetryNotice() { - const headline = yellow(`Astro now collects ${bold('anonymous')} usage data.`); - const why = `This ${bold('optional program')} will help shape our roadmap.`; + const headline = yellow(`Astro collects ${bold('anonymous')} usage data during development.`); + const why = `${dim('This ')}optional program${dim(' helps shape our roadmap.')}`; + const no = `${dim('Run ')}astro telemetry disable${dim(' to opt-out.')}`; const more = `For more info, visit ${underline('https://astro.build/telemetry')}`; - const box = boxen([headline, why, '', more].join('\n'), { + const box = boxen([headline, why, '', no, '', more].join('\n'), { margin: 0, padding: 1, borderStyle: 'round', diff --git a/packages/telemetry/src/index.ts b/packages/telemetry/src/index.ts index 3d08cd52914e..44ebbacaf393 100644 --- a/packages/telemetry/src/index.ts +++ b/packages/telemetry/src/index.ts @@ -10,6 +10,9 @@ import { getSystemInfo, type SystemInfo } from './system-info.js'; export type AstroTelemetryOptions = { astroVersion: string; viteVersion: string }; export type TelemetryEvent = { eventName: string; payload: Record }; +// In the event of significant policy changes, update this! +const VALID_TELEMETRY_NOTICE_DATE = '2023-08-18'; + type EventMeta = SystemInfo; interface EventContext extends ProjectInfo { anonymousId: string; @@ -94,18 +97,25 @@ export class AstroTelemetry { return this.config.clear(); } - async notify(callback: () => Promise) { + isValidNotice() { + if (!this.notifyDate) return false; + const current = Number(this.notifyDate); + const valid = new Date(VALID_TELEMETRY_NOTICE_DATE).valueOf(); + + return current > valid; + } + + async notify(callback: () => boolean | Promise) { if (this.isDisabled || isCI) { return; } // The end-user has already been notified about our telemetry integration! // Don't bother them about it again. - // In the event of significant changes, we should invalidate old dates. - if (this.notifyDate) { + if (this.isValidNotice()) { return; } const enabled = await callback(); - this.config.set(KEY.TELEMETRY_NOTIFY_DATE, Date.now().toString()); + this.config.set(KEY.TELEMETRY_NOTIFY_DATE, new Date().valueOf().toString()); this.config.set(KEY.TELEMETRY_ENABLED, enabled); } From 601d3c3bf3515b2e0fe7840d5ae209d3efe2e260 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 12:57:35 -0500 Subject: [PATCH 02/17] chore: update telemetry date, notify --- packages/astro/src/cli/telemetry/index.ts | 2 +- packages/telemetry/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/astro/src/cli/telemetry/index.ts b/packages/astro/src/cli/telemetry/index.ts index 51f93d1eab7b..af441a55ff23 100644 --- a/packages/astro/src/cli/telemetry/index.ts +++ b/packages/astro/src/cli/telemetry/index.ts @@ -9,7 +9,7 @@ interface TelemetryOptions { } export async function notify() { - await telemetry.notify(async () => { + await telemetry.notify(() => { console.log(msg.telemetryNotice() + '\n'); return true; }) diff --git a/packages/telemetry/src/index.ts b/packages/telemetry/src/index.ts index 44ebbacaf393..35eb208d10a9 100644 --- a/packages/telemetry/src/index.ts +++ b/packages/telemetry/src/index.ts @@ -11,7 +11,7 @@ export type AstroTelemetryOptions = { astroVersion: string; viteVersion: string export type TelemetryEvent = { eventName: string; payload: Record }; // In the event of significant policy changes, update this! -const VALID_TELEMETRY_NOTICE_DATE = '2023-08-18'; +const VALID_TELEMETRY_NOTICE_DATE = '2023-08-25'; type EventMeta = SystemInfo; interface EventContext extends ProjectInfo { From b9241254f2e9f14c25aa18db5b380c65ca4001f3 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 13:31:47 -0500 Subject: [PATCH 03/17] chore(telemetry): refactor telemetry notices --- packages/astro/src/cli/telemetry/index.ts | 1 - packages/astro/src/core/messages.ts | 28 +++++++++-------------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/packages/astro/src/cli/telemetry/index.ts b/packages/astro/src/cli/telemetry/index.ts index af441a55ff23..1c9703a9c658 100644 --- a/packages/astro/src/cli/telemetry/index.ts +++ b/packages/astro/src/cli/telemetry/index.ts @@ -2,7 +2,6 @@ import type yargs from 'yargs-parser'; import * as msg from '../../core/messages.js'; import { telemetry } from '../../events/index.js'; -import prompts from 'prompts'; interface TelemetryOptions { flags: yargs.Arguments; diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index 6c57b3846854..0bc44c29cbe9 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -107,35 +107,29 @@ export function serverStart({ } export function telemetryNotice() { - const headline = yellow(`Astro collects ${bold('anonymous')} usage data during development.`); - const why = `${dim('This ')}optional program${dim(' helps shape our roadmap.')}`; - const no = `${dim('Run ')}astro telemetry disable${dim(' to opt-out.')}`; - const more = `For more info, visit ${underline('https://astro.build/telemetry')}`; - const box = boxen([headline, why, '', no, '', more].join('\n'), { - margin: 0, - padding: 1, - borderStyle: 'round', - borderColor: 'yellow', - }); - return box; + const headline = `${cyan('◆')} Astro collects completely anonymous usage data.`; + const why = dim(' This optional program helps shape our roadmap.') + const disable = dim(' Run `npm run astro telemetry disable` to opt-out.'); + const more = ` Questions? See ${underline('https://astro.build/telemetry')}`; + return [headline, why, disable, more, ''].map(v => ' ' + v).join('\n'); } export function telemetryEnabled() { - return `\n ${green('◉')} Anonymous telemetry is ${bgGreen( + return `${green('◉')} Anonymous telemetry is now ${bgGreen( black(' enabled ') - )}. Thank you for improving Astro!\n`; + )}\n ${dim('Thank you for improving Astro!')}\n`; } export function telemetryDisabled() { - return `\n ${yellow('◯')} Anonymous telemetry is ${bgYellow( + return `${yellow('◯')} Anonymous telemetry is now ${bgYellow( black(' disabled ') - )}. We won't share any usage data.\n`; + )}\n ${dim('We won\'t ever record your usage data.')}\n`; } export function telemetryReset() { - return `\n ${cyan('◆')} Anonymous telemetry has been ${bgCyan( + return `${cyan('◆')} Anonymous telemetry has been ${bgCyan( black(' reset ') - )}. You may be prompted again.\n`; + )}\n ${dim('You may be prompted again.')}\n`; } export function fsStrictWarning() { From e71db1b410105461e248aa51d024ff6fc03b3d7c Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 13:33:05 -0500 Subject: [PATCH 04/17] chore: add changeset --- .changeset/breezy-books-notice.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/breezy-books-notice.md diff --git a/.changeset/breezy-books-notice.md b/.changeset/breezy-books-notice.md new file mode 100644 index 000000000000..586b405ea6f1 --- /dev/null +++ b/.changeset/breezy-books-notice.md @@ -0,0 +1,6 @@ +--- +'@astrojs/telemetry': patch +'astro': patch +--- + +Update telemetry notice From 24075948a230ae6044f049bc2ac637c364260649 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 13:53:35 -0500 Subject: [PATCH 05/17] chore: improve debugging --- packages/telemetry/src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/telemetry/src/index.ts b/packages/telemetry/src/index.ts index 35eb208d10a9..c6887de2176f 100644 --- a/packages/telemetry/src/index.ts +++ b/packages/telemetry/src/index.ts @@ -107,6 +107,7 @@ export class AstroTelemetry { async notify(callback: () => boolean | Promise) { if (this.isDisabled || isCI) { + this.debug('telemetry has been disabled'); return; } // The end-user has already been notified about our telemetry integration! @@ -127,7 +128,7 @@ export class AstroTelemetry { // Skip recording telemetry if the feature is disabled if (this.isDisabled) { - this.debug('telemetry disabled'); + this.debug('telemetry has been disabled'); return Promise.resolve(); } From 82b6e1543c4e6528f4adeba6f2b8c269abf9edd1 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 14:03:40 -0500 Subject: [PATCH 06/17] chore: update debug --- packages/telemetry/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/telemetry/src/index.ts b/packages/telemetry/src/index.ts index c6887de2176f..af8e23054323 100644 --- a/packages/telemetry/src/index.ts +++ b/packages/telemetry/src/index.ts @@ -107,7 +107,7 @@ export class AstroTelemetry { async notify(callback: () => boolean | Promise) { if (this.isDisabled || isCI) { - this.debug('telemetry has been disabled'); + this.debug(`[notify] telemetry has been disabled`); return; } // The end-user has already been notified about our telemetry integration! @@ -128,7 +128,7 @@ export class AstroTelemetry { // Skip recording telemetry if the feature is disabled if (this.isDisabled) { - this.debug('telemetry has been disabled'); + this.debug('[record] telemetry has been disabled'); return Promise.resolve(); } From 0ddc2a96620ca024325bceac9dde1d904623ea23 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 14:03:54 -0500 Subject: [PATCH 07/17] fix: logical error --- packages/telemetry/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/telemetry/src/index.ts b/packages/telemetry/src/index.ts index af8e23054323..632eac6cadbb 100644 --- a/packages/telemetry/src/index.ts +++ b/packages/telemetry/src/index.ts @@ -50,7 +50,7 @@ export class AstroTelemetry { */ private getConfigWithFallback(key: string, getValue: () => T): T { const currentValue = this.config.get(key); - if (currentValue) { + if (currentValue !== undefined) { return currentValue; } const newValue = getValue(); From e7114fa994c7690495d1317641ab5414e9301305 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 14:18:49 -0500 Subject: [PATCH 08/17] chore(lint): remove unused input --- packages/astro/src/core/messages.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index 0bc44c29cbe9..a7e71ba80ec3 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -1,4 +1,3 @@ -import boxen from 'boxen'; import { bgCyan, bgGreen, From c85a848be110f2f956aaf773300fd4d87b861f74 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 16:28:35 -0500 Subject: [PATCH 09/17] chore: improve telemetry debug --- packages/telemetry/src/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/telemetry/src/index.ts b/packages/telemetry/src/index.ts index 632eac6cadbb..02992e18ab08 100644 --- a/packages/telemetry/src/index.ts +++ b/packages/telemetry/src/index.ts @@ -113,11 +113,13 @@ export class AstroTelemetry { // The end-user has already been notified about our telemetry integration! // Don't bother them about it again. if (this.isValidNotice()) { + this.debug(`[notify] last notified on ${this.notifyDate}`) return; } const enabled = await callback(); this.config.set(KEY.TELEMETRY_NOTIFY_DATE, new Date().valueOf().toString()); this.config.set(KEY.TELEMETRY_ENABLED, enabled); + this.debug(`[notify] telemetry has been ${enabled ? 'enabled' : 'disabled'}`) } async record(event: TelemetryEvent | TelemetryEvent[] = []) { From c63e0d2f149443f3b1ffb3a562dbe1d03470ef7e Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 16:28:41 -0500 Subject: [PATCH 10/17] chore: improve telemetry tests --- packages/telemetry/test/index.test.js | 62 ++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/packages/telemetry/test/index.test.js b/packages/telemetry/test/index.test.js index 29ade53f90e8..4283f7ce0462 100644 --- a/packages/telemetry/test/index.test.js +++ b/packages/telemetry/test/index.test.js @@ -1,9 +1,67 @@ import { expect } from 'chai'; import { AstroTelemetry } from '../dist/index.js'; -describe('AstroTelemetry', () => { +function setup() { + const config = new Map(); + const telemetry = new AstroTelemetry({ version: '0.0.0-test.1' }); + const logs = []; + telemetry.config = config; + telemetry.debug.enabled = true; + telemetry.debug.log = (...args) => logs.push(args); + return { telemetry, config, logs } +} +describe('AstroTelemetry', () => { it('initializes when expected arguments are given', () => { - const telemetry = new AstroTelemetry({ version: '0.0.0-test.1' }); + const { telemetry } = setup(); expect(telemetry).to.be.instanceOf(AstroTelemetry); }); + it('does not record event if disabled', async () => { + const { telemetry, config, logs } = setup(); + telemetry.setEnabled(false); + const [key] = Array.from(config.keys()); + expect(key).not.to.be.undefined; + expect(config.get(key)).to.be.false; + expect(telemetry.enabled).to.be.false; + expect(telemetry.isDisabled).to.be.true; + const result = await telemetry.record(['TEST']); + expect(result).to.be.undefined; + const [log] = logs; + expect(log).not.to.be.undefined; + expect(logs.join('')).to.match(/disabled/); + }); + it('records event if enabled', async () => { + const { telemetry, config, logs } = setup(); + telemetry.setEnabled(true); + const [key] = Array.from(config.keys()); + expect(key).not.to.be.undefined; + expect(config.get(key)).to.be.true; + expect(telemetry.enabled).to.be.true; + expect(telemetry.isDisabled).to.be.false; + await telemetry.record(['TEST']); + expect(logs.length).to.equal(2); + }); + it('respects disable from notify', async () => { + const { telemetry, config, logs } = setup(); + await telemetry.notify(() => false); + const [key] = Array.from(config.keys()); + expect(key).not.to.be.undefined; + expect(config.get(key)).to.be.false; + expect(telemetry.enabled).to.be.false; + expect(telemetry.isDisabled).to.be.true; + const [log] = logs; + expect(log).not.to.be.undefined; + expect(logs.join('')).to.match(/disabled/); + }); + it('respects enable from notify', async () => { + const { telemetry, config, logs } = setup(); + await telemetry.notify(() => true); + const [key] = Array.from(config.keys()); + expect(key).not.to.be.undefined; + expect(config.get(key)).to.be.true; + expect(telemetry.enabled).to.be.true; + expect(telemetry.isDisabled).to.be.false; + const [log] = logs; + expect(log).not.to.be.undefined; + expect(logs.join('')).to.match(/enabled/); + }); }); From 74e006af14bddbf1b7ba7515509152c89cf47256 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 16:37:01 -0500 Subject: [PATCH 11/17] chore: allow isCI to be stubbed --- packages/telemetry/src/index.ts | 5 +++-- packages/telemetry/test/index.test.js | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/telemetry/src/index.ts b/packages/telemetry/src/index.ts index 02992e18ab08..2327b77b16e3 100644 --- a/packages/telemetry/src/index.ts +++ b/packages/telemetry/src/index.ts @@ -23,6 +23,7 @@ export class AstroTelemetry { private _anonymousProjectInfo: ProjectInfo | undefined; private config = new GlobalConfig({ name: 'astro' }); private debug = debug('astro:telemetry'); + private isCI = isCI; private get astroVersion() { return this.opts.astroVersion; @@ -78,7 +79,7 @@ export class AstroTelemetry { private get anonymousProjectInfo(): ProjectInfo { // NOTE(fks): this value isn't global, so it can't use getConfigWithFallback(). - this._anonymousProjectInfo = this._anonymousProjectInfo || getProjectInfo(isCI); + this._anonymousProjectInfo = this._anonymousProjectInfo || getProjectInfo(this.isCI); return this._anonymousProjectInfo; } @@ -106,7 +107,7 @@ export class AstroTelemetry { } async notify(callback: () => boolean | Promise) { - if (this.isDisabled || isCI) { + if (this.isDisabled || this.isCI) { this.debug(`[notify] telemetry has been disabled`); return; } diff --git a/packages/telemetry/test/index.test.js b/packages/telemetry/test/index.test.js index 4283f7ce0462..c5028a620b24 100644 --- a/packages/telemetry/test/index.test.js +++ b/packages/telemetry/test/index.test.js @@ -5,6 +5,8 @@ function setup() { const config = new Map(); const telemetry = new AstroTelemetry({ version: '0.0.0-test.1' }); const logs = []; + // Stub isCI to false so we can test user-facing behavior + telemetry.isCI = false; telemetry.config = config; telemetry.debug.enabled = true; telemetry.debug.log = (...args) => logs.push(args); From 465979ce347f3ef56c5235defb58fe5b1c6bbe07 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 16:47:07 -0500 Subject: [PATCH 12/17] chore: stub process.env --- packages/telemetry/test/index.test.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/telemetry/test/index.test.js b/packages/telemetry/test/index.test.js index c5028a620b24..ec8f66f1ec7c 100644 --- a/packages/telemetry/test/index.test.js +++ b/packages/telemetry/test/index.test.js @@ -3,13 +3,19 @@ import { AstroTelemetry } from '../dist/index.js'; function setup() { const config = new Map(); + // Stub both of these to false for Astro's own CI + process.env.ASTRO_TELEMETRY_DISABLED = undefined; + process.env.TELEMETRY_DISABLED = undefined; const telemetry = new AstroTelemetry({ version: '0.0.0-test.1' }); const logs = []; // Stub isCI to false so we can test user-facing behavior telemetry.isCI = false; + // Override config so we can inspect it telemetry.config = config; + // Override debug so we can inspect it telemetry.debug.enabled = true; telemetry.debug.log = (...args) => logs.push(args); + return { telemetry, config, logs } } describe('AstroTelemetry', () => { From 8f83cac9415514ead3980d04083b58cc828f05fa Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 16:47:57 -0500 Subject: [PATCH 13/17] chore: stub process.env --- packages/telemetry/test/index.test.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/telemetry/test/index.test.js b/packages/telemetry/test/index.test.js index ec8f66f1ec7c..230cf211aec9 100644 --- a/packages/telemetry/test/index.test.js +++ b/packages/telemetry/test/index.test.js @@ -3,9 +3,6 @@ import { AstroTelemetry } from '../dist/index.js'; function setup() { const config = new Map(); - // Stub both of these to false for Astro's own CI - process.env.ASTRO_TELEMETRY_DISABLED = undefined; - process.env.TELEMETRY_DISABLED = undefined; const telemetry = new AstroTelemetry({ version: '0.0.0-test.1' }); const logs = []; // Stub isCI to false so we can test user-facing behavior @@ -19,6 +16,14 @@ function setup() { return { telemetry, config, logs } } describe('AstroTelemetry', () => { + before(() => { + process.env.ASTRO_TELEMETRY_DISABLED = undefined; + process.env.TELEMETRY_DISABLED = undefined; + }) + after(() => { + process.env.ASTRO_TELEMETRY_DISABLED = true; + process.env.TELEMETRY_DISABLED = true; + }) it('initializes when expected arguments are given', () => { const { telemetry } = setup(); expect(telemetry).to.be.instanceOf(AstroTelemetry); From 4b74dfca905d686c2c8d4077e7fb67f2cdf069b5 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 16:56:32 -0500 Subject: [PATCH 14/17] chore: add env to class --- packages/telemetry/test/index.test.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/telemetry/test/index.test.js b/packages/telemetry/test/index.test.js index 230cf211aec9..020d1b815be9 100644 --- a/packages/telemetry/test/index.test.js +++ b/packages/telemetry/test/index.test.js @@ -7,6 +7,8 @@ function setup() { const logs = []; // Stub isCI to false so we can test user-facing behavior telemetry.isCI = false; + // Stub process.env to properly test in Astro's own CI + telemetry.env = {}; // Override config so we can inspect it telemetry.config = config; // Override debug so we can inspect it @@ -16,14 +18,6 @@ function setup() { return { telemetry, config, logs } } describe('AstroTelemetry', () => { - before(() => { - process.env.ASTRO_TELEMETRY_DISABLED = undefined; - process.env.TELEMETRY_DISABLED = undefined; - }) - after(() => { - process.env.ASTRO_TELEMETRY_DISABLED = true; - process.env.TELEMETRY_DISABLED = true; - }) it('initializes when expected arguments are given', () => { const { telemetry } = setup(); expect(telemetry).to.be.instanceOf(AstroTelemetry); From d8bd3db18bb8e3f6d0ebdb6d1eb40991e0f86178 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 17:09:00 -0500 Subject: [PATCH 15/17] chore: act like we're not on CI --- packages/telemetry/test/index.test.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/telemetry/test/index.test.js b/packages/telemetry/test/index.test.js index 020d1b815be9..a8929329e795 100644 --- a/packages/telemetry/test/index.test.js +++ b/packages/telemetry/test/index.test.js @@ -18,6 +18,15 @@ function setup() { return { telemetry, config, logs } } describe('AstroTelemetry', () => { + let oldCI; + before(() => { + oldCI = process.env.CI; + // Stub process.env.CI to `false` + process.env.CI = 'false'; + }) + after(() => { + process.env.CI = oldCI; + }) it('initializes when expected arguments are given', () => { const { telemetry } = setup(); expect(telemetry).to.be.instanceOf(AstroTelemetry); From 16faaab9756506996d98298948d288a9509e4743 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 25 Aug 2023 17:26:35 -0500 Subject: [PATCH 16/17] test: didn't commit the env stub properly --- packages/telemetry/src/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/telemetry/src/index.ts b/packages/telemetry/src/index.ts index 2327b77b16e3..b63ff9c233e3 100644 --- a/packages/telemetry/src/index.ts +++ b/packages/telemetry/src/index.ts @@ -24,6 +24,7 @@ export class AstroTelemetry { private config = new GlobalConfig({ name: 'astro' }); private debug = debug('astro:telemetry'); private isCI = isCI; + private env = process.env; private get astroVersion() { return this.opts.astroVersion; @@ -32,10 +33,10 @@ export class AstroTelemetry { return this.opts.viteVersion; } private get ASTRO_TELEMETRY_DISABLED() { - return process.env.ASTRO_TELEMETRY_DISABLED; + return this.env.ASTRO_TELEMETRY_DISABLED; } private get TELEMETRY_DISABLED() { - return process.env.TELEMETRY_DISABLED; + return this.env.TELEMETRY_DISABLED; } constructor(private opts: AstroTelemetryOptions) { From 832f114e5f2454d165e9bd40155348376bac8621 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Mon, 28 Aug 2023 15:49:52 -0500 Subject: [PATCH 17/17] chore: tweak wording --- packages/astro/src/core/messages.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index a7e71ba80ec3..9feecb26adb9 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -109,8 +109,8 @@ export function telemetryNotice() { const headline = `${cyan('◆')} Astro collects completely anonymous usage data.`; const why = dim(' This optional program helps shape our roadmap.') const disable = dim(' Run `npm run astro telemetry disable` to opt-out.'); - const more = ` Questions? See ${underline('https://astro.build/telemetry')}`; - return [headline, why, disable, more, ''].map(v => ' ' + v).join('\n'); + const details = ` Details: ${underline('https://astro.build/telemetry')}`; + return [headline, why, disable, details].map(v => ' ' + v).join('\n'); } export function telemetryEnabled() {