-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
config.ts
138 lines (116 loc) · 3.56 KB
/
config.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import { readFileSync, writeFileSync } from "node:fs";
import { logger } from "@turbo/utils";
import chalk from "chalk";
import { defaultConfigPath, oneWayHashWithSalt } from "./utils";
const DEBUG_ENV_VAR = "TURBO_TELEMETRY_DEBUG";
const DISABLED_ENV_VAR = "TURBO_TELEMETRY_DISABLED";
const DISABLED_MESSAGE_ENV_VAR = "TURBO_TELEMETRY_MESSAGE_DISABLED";
const DO_NOT_TRACK_ENV_VAR = "DO_NOT_TRACK";
interface Config {
telemetry_enabled: boolean;
telemetry_id: string;
telemetry_salt: string;
telemetry_alerted?: Date;
}
/**
* NOTE: This package is a direct port of the telemetry config struct from the turbo-telemetry crate. Any changes
* made here should be reflected in the turbo-telemetry crate as well.
*
* https://github.com/vercel/turbo/blob/main/crates/turborepo-telemetry/src/config.rs
*/
export class TelemetryConfig {
config: Config;
private configPath: string;
constructor({ configPath, config }: { configPath: string; config: Config }) {
this.config = config;
this.configPath = configPath;
}
static async fromDefaultConfig(): Promise<TelemetryConfig | undefined> {
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() {
const json = JSON.stringify(this.config, null, 2);
writeFileSync(this.configPath, json);
}
hasSeenAlert(): boolean {
return this.config.telemetry_alerted !== undefined;
}
isEnabled(): boolean {
const doNotTrack = process.env[DO_NOT_TRACK_ENV_VAR] || "0";
const turboTelemetryDisabled = process.env[DISABLED_ENV_VAR] || "0";
if (
doNotTrack === "1" ||
doNotTrack.toLowerCase() === "true" ||
turboTelemetryDisabled === "1" ||
turboTelemetryDisabled.toLowerCase() === "true"
) {
return false;
}
return this.config.telemetry_enabled;
}
isTelemetryWarningEnabled(): boolean {
const turboTelemetryMsgDisabled =
process.env[DISABLED_MESSAGE_ENV_VAR] || "0";
const isDisabled =
turboTelemetryMsgDisabled === "1" ||
turboTelemetryMsgDisabled.toLowerCase() === "true";
return !isDisabled;
}
get id() {
return this.config.telemetry_id;
}
showAlert() {
if (
!this.hasSeenAlert() &&
this.isEnabled() &&
this.isTelemetryWarningEnabled()
) {
logger.log();
logger.bold("Attention:");
logger.grey(
"Turborepo now collects completely anonymous telemetry regarding usage."
);
logger.grey(
"This information is used to shape the Turborepo roadmap and prioritize features."
);
logger.grey(
"You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:"
);
logger.underline(chalk.grey("https://turbo.build/repo/docs/telemetry"));
}
this.alertShown();
}
enable() {
this.config.telemetry_enabled = true;
this.write();
}
disable() {
this.config.telemetry_enabled = false;
this.write();
}
alertShown() {
if (this.hasSeenAlert()) {
return true;
}
this.config.telemetry_alerted = new Date();
this.write();
return true;
}
oneWayHash(input: string) {
return oneWayHashWithSalt({
input,
salt: this.config.telemetry_salt,
});
}
static isDebug() {
const debug = process.env[DEBUG_ENV_VAR] || "0";
return debug === "1" || debug.toLowerCase() === "true";
}
}