@buildspacestudio/cli 0.2.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +216 -0
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +3 -0
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +15 -0
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +3 -0
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +3 -0
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +132 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/telemetry.d.ts +2 -0
- package/dist/commands/telemetry.d.ts.map +1 -0
- package/dist/commands/telemetry.js +57 -0
- package/dist/commands/telemetry.js.map +1 -0
- package/dist/index.js +76 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +8 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +31 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/telemetry.d.ts +33 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +162 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { getTelemetryConfig, readConfig, resolveApiBaseUrl } from "./config.js";
|
|
2
|
+
const CLI_VERSION = "0.2.1";
|
|
3
|
+
const TELEMETRY_SEND_TIMEOUT_MS = 3000;
|
|
4
|
+
const TELEMETRY_ENV_VAR = "BUILDSPACE_TELEMETRY";
|
|
5
|
+
let _sessionId;
|
|
6
|
+
let _pendingEvents = [];
|
|
7
|
+
let _disabled;
|
|
8
|
+
let _hasLoggedTrackEventFailure = false;
|
|
9
|
+
function getSessionId() {
|
|
10
|
+
if (!_sessionId) {
|
|
11
|
+
const bytes = new Uint8Array(16);
|
|
12
|
+
crypto.getRandomValues(bytes);
|
|
13
|
+
_sessionId = Array.from(bytes)
|
|
14
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
15
|
+
.join("");
|
|
16
|
+
}
|
|
17
|
+
return _sessionId;
|
|
18
|
+
}
|
|
19
|
+
function getPlatform() {
|
|
20
|
+
return process.platform;
|
|
21
|
+
}
|
|
22
|
+
function getRuntime() {
|
|
23
|
+
if (typeof Bun !== "undefined") {
|
|
24
|
+
return "bun";
|
|
25
|
+
}
|
|
26
|
+
return "node";
|
|
27
|
+
}
|
|
28
|
+
function computeLatencyBucket(ms) {
|
|
29
|
+
if (ms < 100) {
|
|
30
|
+
return "lt_100ms";
|
|
31
|
+
}
|
|
32
|
+
if (ms < 500) {
|
|
33
|
+
return "100ms_500ms";
|
|
34
|
+
}
|
|
35
|
+
if (ms < 1000) {
|
|
36
|
+
return "500ms_1s";
|
|
37
|
+
}
|
|
38
|
+
if (ms < 5000) {
|
|
39
|
+
return "1s_5s";
|
|
40
|
+
}
|
|
41
|
+
if (ms < 15_000) {
|
|
42
|
+
return "5s_15s";
|
|
43
|
+
}
|
|
44
|
+
return "gt_15s";
|
|
45
|
+
}
|
|
46
|
+
function isDisabledByEnv() {
|
|
47
|
+
const value = process.env[TELEMETRY_ENV_VAR];
|
|
48
|
+
if (value === undefined || value === "") {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return value === "0" || value.toLowerCase() === "false" || value.toLowerCase() === "off";
|
|
52
|
+
}
|
|
53
|
+
async function isEnabled() {
|
|
54
|
+
if (_disabled !== undefined) {
|
|
55
|
+
return !_disabled;
|
|
56
|
+
}
|
|
57
|
+
if (isDisabledByEnv()) {
|
|
58
|
+
_disabled = true;
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const telemetryConfig = await getTelemetryConfig();
|
|
63
|
+
_disabled = !telemetryConfig.enabled;
|
|
64
|
+
return telemetryConfig.enabled;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
_disabled = true;
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function logTrackEventFailure(error) {
|
|
72
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
73
|
+
if (_hasLoggedTrackEventFailure) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
_hasLoggedTrackEventFailure = true;
|
|
77
|
+
console.error(`Telemetry error: ${message}`);
|
|
78
|
+
}
|
|
79
|
+
export function trackEvent(event, properties) {
|
|
80
|
+
return isEnabled()
|
|
81
|
+
.then((enabled) => {
|
|
82
|
+
if (!enabled) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
_pendingEvents.push({
|
|
86
|
+
event,
|
|
87
|
+
occurredAt: new Date().toISOString(),
|
|
88
|
+
properties: {
|
|
89
|
+
platform: getPlatform(),
|
|
90
|
+
runtime: getRuntime(),
|
|
91
|
+
version: CLI_VERSION,
|
|
92
|
+
...properties,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
})
|
|
96
|
+
.catch((error) => {
|
|
97
|
+
logTrackEventFailure(error);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
export function trackCommandStart(command, subcommand) {
|
|
101
|
+
const startedAt = Date.now();
|
|
102
|
+
trackEvent("cli.started", { command, subcommand });
|
|
103
|
+
return { startedAt };
|
|
104
|
+
}
|
|
105
|
+
export async function trackCommandEnd({ command, errorCode, startedAt, subcommand, success, }) {
|
|
106
|
+
const latencyBucket = computeLatencyBucket(Date.now() - startedAt);
|
|
107
|
+
const eventName = success ? "cli.command.completed" : "cli.command.failed";
|
|
108
|
+
await trackEvent(eventName, {
|
|
109
|
+
command,
|
|
110
|
+
errorCode: errorCode?.slice(0, 64),
|
|
111
|
+
latencyBucket,
|
|
112
|
+
subcommand,
|
|
113
|
+
success,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
export async function flushTelemetry() {
|
|
117
|
+
if (_pendingEvents.length === 0) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (!(await isEnabled())) {
|
|
121
|
+
_pendingEvents = [];
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const eventsToSend = [..._pendingEvents];
|
|
125
|
+
_pendingEvents = [];
|
|
126
|
+
try {
|
|
127
|
+
const config = await readConfig();
|
|
128
|
+
const pat = config.pat;
|
|
129
|
+
if (!pat) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const apiBaseUrl = resolveApiBaseUrl(config);
|
|
133
|
+
const anonymousId = config.telemetry?.anonymousId;
|
|
134
|
+
const body = JSON.stringify({
|
|
135
|
+
anonymousId,
|
|
136
|
+
events: eventsToSend,
|
|
137
|
+
sentAt: new Date().toISOString(),
|
|
138
|
+
sessionId: getSessionId(),
|
|
139
|
+
});
|
|
140
|
+
const controller = new AbortController();
|
|
141
|
+
const timeout = setTimeout(() => controller.abort(), TELEMETRY_SEND_TIMEOUT_MS);
|
|
142
|
+
try {
|
|
143
|
+
await fetch(`${apiBaseUrl}/api/v1/telemetry/cli`, {
|
|
144
|
+
body,
|
|
145
|
+
headers: {
|
|
146
|
+
Authorization: `Bearer ${pat}`,
|
|
147
|
+
"Content-Type": "application/json",
|
|
148
|
+
},
|
|
149
|
+
method: "POST",
|
|
150
|
+
signal: controller.signal,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
clearTimeout(timeout);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Best-effort delivery — silently discard on failure
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
export { computeLatencyBucket };
|
|
162
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/lib/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhF,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAmCjD,IAAI,UAA8B,CAAC;AACnC,IAAI,cAAc,GAAqB,EAAE,CAAC;AAC1C,IAAI,SAA8B,CAAC;AACnC,IAAI,2BAA2B,GAAG,KAAK,CAAC;AAExC,SAAS,YAAY;IACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9B,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,EAAU;IACtC,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;QACb,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;QACb,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACd,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACd,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;QAChB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC7C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;AAC3F,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC;IAED,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,SAAS,GAAG,IAAI,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACnD,SAAS,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;QACrC,OAAO,eAAe,CAAC,OAAO,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,IAAI,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvE,IAAI,2BAA2B,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,2BAA2B,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,KAAmB,EACnB,UAA+E;IAE/E,OAAO,SAAS,EAAE;SACf,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAChB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,cAAc,CAAC,IAAI,CAAC;YAClB,KAAK;YACL,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,UAAU,EAAE;gBACV,QAAQ,EAAE,WAAW,EAAE;gBACvB,OAAO,EAAE,UAAU,EAAE;gBACrB,OAAO,EAAE,WAAW;gBACpB,GAAG,UAAU;aACd;SACF,CAAC,CAAC;IACL,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,UAAmB;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,UAAU,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAEnD,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,OAAO,EACP,SAAS,EACT,SAAS,EACT,UAAU,EACV,OAAO,GAOR;IACC,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IACnE,MAAM,SAAS,GAAiB,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAEzF,MAAM,UAAU,CAAC,SAAS,EAAE;QAC1B,OAAO;QACP,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAClC,aAAa;QACb,UAAU;QACV,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,EAAE,CAAC;QACzB,cAAc,GAAG,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;IACzC,cAAc,GAAG,EAAE,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC;QAElD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,WAAW;YACX,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAChC,SAAS,EAAE,YAAY,EAAE;SAC1B,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAEhF,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,UAAU,uBAAuB,EAAE;gBAChD,IAAI;gBACJ,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,GAAG,EAAE;oBAC9B,cAAc,EAAE,kBAAkB;iBACnC;gBACD,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;AACH,CAAC;AAED,OAAO,EAAqB,oBAAoB,EAAuB,CAAC"}
|