alchemy 0.69.1 → 0.70.0

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.
Files changed (227) hide show
  1. package/bin/alchemy.js +3797 -3857
  2. package/bin/trpc.ts +4 -9
  3. package/lib/alchemy.d.ts +3 -3
  4. package/lib/alchemy.d.ts.map +1 -1
  5. package/lib/alchemy.js +2 -15
  6. package/lib/alchemy.js.map +1 -1
  7. package/lib/apply.js +24 -9
  8. package/lib/apply.js.map +1 -1
  9. package/lib/aws/utils.d.ts +2 -1
  10. package/lib/aws/utils.d.ts.map +1 -1
  11. package/lib/aws/utils.js.map +1 -1
  12. package/lib/clickhouse/api/client.gen.d.ts +13 -0
  13. package/lib/clickhouse/api/client.gen.d.ts.map +1 -0
  14. package/lib/clickhouse/api/client.gen.js +7 -0
  15. package/lib/clickhouse/api/client.gen.js.map +1 -0
  16. package/lib/clickhouse/api/sdk.gen.d.ts +322 -0
  17. package/lib/clickhouse/api/sdk.gen.d.ts.map +1 -0
  18. package/lib/clickhouse/api/sdk.gen.js +683 -0
  19. package/lib/clickhouse/api/sdk.gen.js.map +1 -0
  20. package/lib/clickhouse/api/types.gen.d.ts +5030 -0
  21. package/lib/clickhouse/api/types.gen.d.ts.map +1 -0
  22. package/lib/clickhouse/api/types.gen.js +2 -0
  23. package/lib/clickhouse/api/types.gen.js.map +1 -0
  24. package/lib/clickhouse/api-key.d.ts +29 -0
  25. package/lib/clickhouse/api-key.d.ts.map +1 -0
  26. package/lib/clickhouse/api-key.js +83 -0
  27. package/lib/clickhouse/api-key.js.map +1 -0
  28. package/lib/clickhouse/api.d.ts +36 -0
  29. package/lib/clickhouse/api.d.ts.map +1 -0
  30. package/lib/clickhouse/api.js +48 -0
  31. package/lib/clickhouse/api.js.map +1 -0
  32. package/lib/clickhouse/index.d.ts +4 -0
  33. package/lib/clickhouse/index.d.ts.map +1 -0
  34. package/lib/clickhouse/index.js +4 -0
  35. package/lib/clickhouse/index.js.map +1 -0
  36. package/lib/clickhouse/organization.d.ts +16 -0
  37. package/lib/clickhouse/organization.d.ts.map +1 -0
  38. package/lib/clickhouse/organization.js +21 -0
  39. package/lib/clickhouse/organization.js.map +1 -0
  40. package/lib/clickhouse/service.d.ts +275 -0
  41. package/lib/clickhouse/service.d.ts.map +1 -0
  42. package/lib/clickhouse/service.js +274 -0
  43. package/lib/clickhouse/service.js.map +1 -0
  44. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  45. package/lib/cloudflare/account-api-token.js +1 -1
  46. package/lib/cloudflare/account-api-token.js.map +1 -1
  47. package/lib/cloudflare/bun-spa/bun-spa.d.ts +15 -0
  48. package/lib/cloudflare/bun-spa/bun-spa.d.ts.map +1 -0
  49. package/lib/cloudflare/bun-spa/bun-spa.js +95 -0
  50. package/lib/cloudflare/bun-spa/bun-spa.js.map +1 -0
  51. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  52. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  53. package/lib/cloudflare/container.d.ts +11 -1
  54. package/lib/cloudflare/container.d.ts.map +1 -1
  55. package/lib/cloudflare/container.js.map +1 -1
  56. package/lib/cloudflare/index.d.ts +1 -0
  57. package/lib/cloudflare/index.d.ts.map +1 -1
  58. package/lib/cloudflare/index.js +1 -0
  59. package/lib/cloudflare/index.js.map +1 -1
  60. package/lib/cloudflare/miniflare/build-worker-options.d.ts.map +1 -1
  61. package/lib/cloudflare/miniflare/build-worker-options.js +3 -3
  62. package/lib/cloudflare/miniflare/build-worker-options.js.map +1 -1
  63. package/lib/cloudflare/miniflare/miniflare-controller.d.ts.map +1 -1
  64. package/lib/cloudflare/miniflare/miniflare-controller.js +2 -0
  65. package/lib/cloudflare/miniflare/miniflare-controller.js.map +1 -1
  66. package/lib/cloudflare/miniflare/miniflare-worker-proxy.d.ts +1 -1
  67. package/lib/cloudflare/miniflare/miniflare-worker-proxy.d.ts.map +1 -1
  68. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +36 -49
  69. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  70. package/lib/cloudflare/permission-groups.d.ts +2 -3
  71. package/lib/cloudflare/permission-groups.d.ts.map +1 -1
  72. package/lib/cloudflare/permission-groups.js +10 -15
  73. package/lib/cloudflare/permission-groups.js.map +1 -1
  74. package/lib/cloudflare/redwood/redwood.d.ts +1 -1
  75. package/lib/cloudflare/redwood/redwood.js +1 -1
  76. package/lib/cloudflare/util/filter-env-bindings.d.ts +62 -0
  77. package/lib/cloudflare/util/filter-env-bindings.d.ts.map +1 -0
  78. package/lib/cloudflare/util/filter-env-bindings.js +81 -0
  79. package/lib/cloudflare/util/filter-env-bindings.js.map +1 -0
  80. package/lib/cloudflare/website.d.ts +2 -2
  81. package/lib/cloudflare/website.d.ts.map +1 -1
  82. package/lib/cloudflare/website.js +6 -18
  83. package/lib/cloudflare/website.js.map +1 -1
  84. package/lib/cloudflare/worker-metadata.d.ts +1 -0
  85. package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
  86. package/lib/cloudflare/worker-metadata.js +1 -0
  87. package/lib/cloudflare/worker-metadata.js.map +1 -1
  88. package/lib/cloudflare/worker.d.ts +11 -1
  89. package/lib/cloudflare/worker.d.ts.map +1 -1
  90. package/lib/cloudflare/worker.js.map +1 -1
  91. package/lib/cloudflare/wrangler.json.d.ts +8 -0
  92. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  93. package/lib/cloudflare/wrangler.json.js +3 -4
  94. package/lib/cloudflare/wrangler.json.js.map +1 -1
  95. package/lib/coinbase/client.d.ts +54 -0
  96. package/lib/coinbase/client.d.ts.map +1 -0
  97. package/lib/coinbase/client.js +89 -0
  98. package/lib/coinbase/client.js.map +1 -0
  99. package/lib/coinbase/evm-account.d.ts +118 -0
  100. package/lib/coinbase/evm-account.d.ts.map +1 -0
  101. package/lib/coinbase/evm-account.js +198 -0
  102. package/lib/coinbase/evm-account.js.map +1 -0
  103. package/lib/coinbase/evm-smart-account.d.ts +122 -0
  104. package/lib/coinbase/evm-smart-account.d.ts.map +1 -0
  105. package/lib/coinbase/evm-smart-account.js +213 -0
  106. package/lib/coinbase/evm-smart-account.js.map +1 -0
  107. package/lib/coinbase/faucet.d.ts +11 -0
  108. package/lib/coinbase/faucet.d.ts.map +1 -0
  109. package/lib/coinbase/faucet.js +146 -0
  110. package/lib/coinbase/faucet.js.map +1 -0
  111. package/lib/coinbase/index.d.ts +4 -0
  112. package/lib/coinbase/index.d.ts.map +1 -0
  113. package/lib/coinbase/index.js +4 -0
  114. package/lib/coinbase/index.js.map +1 -0
  115. package/lib/coinbase/types.d.ts +28 -0
  116. package/lib/coinbase/types.d.ts.map +1 -0
  117. package/lib/coinbase/types.js +4 -0
  118. package/lib/{util/telemetry → coinbase}/types.js.map +1 -1
  119. package/lib/coinbase/utils.d.ts +13 -0
  120. package/lib/coinbase/utils.d.ts.map +1 -0
  121. package/lib/coinbase/utils.js +17 -0
  122. package/lib/coinbase/utils.js.map +1 -0
  123. package/lib/neon/api/types.gen.d.ts +7 -2
  124. package/lib/neon/api/types.gen.d.ts.map +1 -1
  125. package/lib/planetscale/api/types.gen.d.ts +20 -4
  126. package/lib/planetscale/api/types.gen.d.ts.map +1 -1
  127. package/lib/planetscale/api.d.ts.map +1 -1
  128. package/lib/planetscale/api.js +1 -0
  129. package/lib/planetscale/api.js.map +1 -1
  130. package/lib/planetscale/password.d.ts.map +1 -1
  131. package/lib/planetscale/password.js +1 -13
  132. package/lib/planetscale/password.js.map +1 -1
  133. package/lib/resource.d.ts.map +1 -1
  134. package/lib/resource.js +7 -3
  135. package/lib/resource.js.map +1 -1
  136. package/lib/scope.d.ts +4 -9
  137. package/lib/scope.d.ts.map +1 -1
  138. package/lib/scope.js +16 -37
  139. package/lib/scope.js.map +1 -1
  140. package/lib/state/instrumented-state-store.d.ts +1 -3
  141. package/lib/state/instrumented-state-store.d.ts.map +1 -1
  142. package/lib/state/instrumented-state-store.js +19 -21
  143. package/lib/state/instrumented-state-store.js.map +1 -1
  144. package/lib/test/bun.d.ts.map +1 -1
  145. package/lib/test/bun.js +1 -2
  146. package/lib/test/bun.js.map +1 -1
  147. package/lib/test/vitest.d.ts.map +1 -1
  148. package/lib/test/vitest.js +1 -2
  149. package/lib/test/vitest.js.map +1 -1
  150. package/lib/util/diff.d.ts +5 -0
  151. package/lib/util/diff.d.ts.map +1 -0
  152. package/lib/util/diff.js +14 -0
  153. package/lib/util/diff.js.map +1 -0
  154. package/lib/util/telemetry.d.ts +52 -0
  155. package/lib/util/telemetry.d.ts.map +1 -0
  156. package/lib/util/telemetry.js +191 -0
  157. package/lib/util/telemetry.js.map +1 -0
  158. package/package.json +19 -1
  159. package/src/alchemy.ts +5 -20
  160. package/src/apply.ts +29 -12
  161. package/src/aws/utils.ts +2 -1
  162. package/src/clickhouse/api/client.gen.ts +28 -0
  163. package/src/clickhouse/api/sdk.gen.ts +1286 -0
  164. package/src/clickhouse/api/types.gen.ts +5898 -0
  165. package/src/clickhouse/api-key.ts +136 -0
  166. package/src/clickhouse/api.ts +84 -0
  167. package/src/clickhouse/index.ts +3 -0
  168. package/src/clickhouse/organization.ts +31 -0
  169. package/src/clickhouse/service.ts +668 -0
  170. package/src/cloudflare/account-api-token.ts +1 -4
  171. package/src/cloudflare/bun-spa/bun-spa.ts +139 -0
  172. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  173. package/src/cloudflare/container.ts +20 -1
  174. package/src/cloudflare/index.ts +1 -0
  175. package/src/cloudflare/miniflare/build-worker-options.ts +6 -4
  176. package/src/cloudflare/miniflare/miniflare-controller.ts +2 -0
  177. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +41 -58
  178. package/src/cloudflare/permission-groups.ts +21 -49
  179. package/src/cloudflare/redwood/redwood.ts +1 -1
  180. package/src/cloudflare/util/filter-env-bindings.ts +96 -0
  181. package/src/cloudflare/website.ts +11 -24
  182. package/src/cloudflare/worker-metadata.ts +2 -0
  183. package/src/cloudflare/worker.ts +12 -1
  184. package/src/cloudflare/wrangler.json.ts +12 -8
  185. package/src/coinbase/client.ts +146 -0
  186. package/src/coinbase/evm-account.ts +317 -0
  187. package/src/coinbase/evm-smart-account.ts +339 -0
  188. package/src/coinbase/faucet.ts +173 -0
  189. package/src/coinbase/index.ts +3 -0
  190. package/src/coinbase/types.ts +33 -0
  191. package/src/coinbase/utils.ts +19 -0
  192. package/src/neon/api/types.gen.ts +13 -1
  193. package/src/planetscale/api/types.gen.ts +22 -2
  194. package/src/planetscale/api.ts +1 -0
  195. package/src/planetscale/password.ts +1 -14
  196. package/src/resource.ts +11 -4
  197. package/src/scope.ts +22 -45
  198. package/src/state/instrumented-state-store.ts +27 -26
  199. package/src/test/bun.ts +1 -2
  200. package/src/test/vitest.ts +1 -2
  201. package/src/util/diff.ts +14 -0
  202. package/src/util/telemetry.ts +297 -0
  203. package/workers/tunnel-proxy.js +1 -1
  204. package/lib/util/telemetry/client.d.ts +0 -31
  205. package/lib/util/telemetry/client.d.ts.map +0 -1
  206. package/lib/util/telemetry/client.js +0 -121
  207. package/lib/util/telemetry/client.js.map +0 -1
  208. package/lib/util/telemetry/constants.d.ts +0 -5
  209. package/lib/util/telemetry/constants.d.ts.map +0 -1
  210. package/lib/util/telemetry/constants.js +0 -8
  211. package/lib/util/telemetry/constants.js.map +0 -1
  212. package/lib/util/telemetry/context.d.ts +0 -15
  213. package/lib/util/telemetry/context.d.ts.map +0 -1
  214. package/lib/util/telemetry/context.js +0 -128
  215. package/lib/util/telemetry/context.js.map +0 -1
  216. package/lib/util/telemetry/index.d.ts +0 -3
  217. package/lib/util/telemetry/index.d.ts.map +0 -1
  218. package/lib/util/telemetry/index.js +0 -3
  219. package/lib/util/telemetry/index.js.map +0 -1
  220. package/lib/util/telemetry/types.d.ts +0 -68
  221. package/lib/util/telemetry/types.d.ts.map +0 -1
  222. package/lib/util/telemetry/types.js +0 -1
  223. package/src/util/telemetry/client.ts +0 -156
  224. package/src/util/telemetry/constants.ts +0 -13
  225. package/src/util/telemetry/context.ts +0 -154
  226. package/src/util/telemetry/index.ts +0 -2
  227. package/src/util/telemetry/types.ts +0 -105
@@ -1,31 +0,0 @@
1
- import type { Phase } from "../../alchemy.ts";
2
- import type { Telemetry } from "./types.ts";
3
- export interface TelemetryClientOptions {
4
- sessionId: string;
5
- phase?: Phase;
6
- enabled: boolean;
7
- quiet: boolean;
8
- }
9
- export interface ITelemetryClient {
10
- ready: Promise<unknown>;
11
- record(event: Telemetry.EventInput): void;
12
- finalize(): Promise<void>;
13
- }
14
- export declare class NoopTelemetryClient implements ITelemetryClient {
15
- ready: Promise<void>;
16
- record(_: Telemetry.EventInput): void;
17
- finalize(): Promise<void>;
18
- }
19
- export declare class TelemetryClient implements ITelemetryClient {
20
- readonly options: TelemetryClientOptions;
21
- private context;
22
- private events;
23
- constructor(options: TelemetryClientOptions);
24
- get ready(): Promise<Telemetry.Context>;
25
- record(event: Telemetry.EventInput, timestamp?: number): void;
26
- private serializeError;
27
- finalize(): Promise<void>;
28
- private send;
29
- static create({ phase, enabled, quiet, }: Omit<TelemetryClientOptions, "sessionId">): ITelemetryClient;
30
- }
31
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/util/telemetry/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAO9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC;IAC1C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,qBAAa,mBAAoB,YAAW,gBAAgB;IAC1D,KAAK,gBAAqB;IAC1B,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,UAAU;IAC9B,QAAQ;CAGT;AAED,qBAAa,eAAgB,YAAW,gBAAgB;IAI1C,QAAQ,CAAC,OAAO,EAAE,sBAAsB;IAHpD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAAyB;gBAElB,OAAO,EAAE,sBAAsB;IAUpD,IAAI,KAAK,+BAER;IAED,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,SAAa;IAS1D,OAAO,CAAC,cAAc;IAiBhB,QAAQ;YAQA,IAAI;IAsDlB,MAAM,CAAC,MAAM,CAAC,EACZ,KAAK,EACL,OAAO,EACP,KAAK,GACN,EAAE,IAAI,CAAC,sBAAsB,EAAE,WAAW,CAAC,GAAG,gBAAgB;CAchE"}
@@ -1,121 +0,0 @@
1
- import os from "node:os";
2
- import { POSTHOG_CLIENT_API_HOST, POSTHOG_PROJECT_ID, TELEMETRY_DISABLED, } from "./constants.js";
3
- import { context } from "./context.js";
4
- export class NoopTelemetryClient {
5
- ready = Promise.resolve();
6
- record(_) { }
7
- finalize() {
8
- return Promise.resolve();
9
- }
10
- }
11
- export class TelemetryClient {
12
- options;
13
- context;
14
- events = [];
15
- constructor(options) {
16
- this.options = options;
17
- this.context = context({
18
- sessionId: this.options.sessionId,
19
- phase: this.options.phase,
20
- });
21
- this.record({
22
- event: "app.start",
23
- });
24
- }
25
- get ready() {
26
- return this.context;
27
- }
28
- record(event, timestamp = Date.now()) {
29
- const payload = {
30
- ...event,
31
- error: this.serializeError(event.error),
32
- timestamp,
33
- };
34
- this.events.push(payload);
35
- }
36
- serializeError(error) {
37
- if (!error) {
38
- return undefined;
39
- }
40
- if (error instanceof Error) {
41
- return {
42
- ...error, // include additional properties from error object
43
- name: error.name,
44
- message: error.message?.replaceAll(os.homedir(), "~"), // redact home directory
45
- stack: error.stack?.replaceAll(os.homedir(), "~"),
46
- };
47
- }
48
- return error;
49
- }
50
- async finalize() {
51
- await this.send(this.events).catch((error) => {
52
- if (!this.options.quiet) {
53
- console.warn(error);
54
- }
55
- });
56
- }
57
- async send(events) {
58
- if (events.length === 0) {
59
- return;
60
- }
61
- const { userId, projectId, ...context } = await this.context;
62
- const safeProjectId = projectId ?? `temp_${userId}`;
63
- const groupResponse = await fetch(`${POSTHOG_CLIENT_API_HOST}/i/v0/e/`, {
64
- method: "POST",
65
- headers: {
66
- "Content-Type": "application/json",
67
- },
68
- body: JSON.stringify({
69
- api_key: POSTHOG_PROJECT_ID,
70
- event: "$groupidentify",
71
- distinct_id: "project-identify",
72
- properties: {
73
- $group_type: "project",
74
- $group_key: safeProjectId,
75
- },
76
- }),
77
- });
78
- if (!groupResponse.ok) {
79
- throw new Error(`Failed to send group identify: ${groupResponse.status} ${groupResponse.statusText} - ${await groupResponse.text()}`);
80
- }
81
- const response = await fetch(`${POSTHOG_CLIENT_API_HOST}/batch`, {
82
- method: "POST",
83
- headers: {
84
- "Content-Type": "application/json",
85
- },
86
- body: JSON.stringify({
87
- api_key: POSTHOG_PROJECT_ID,
88
- historical_migration: false,
89
- batch: events.map(({ event, timestamp, ...properties }) => ({
90
- event,
91
- properties: {
92
- distinct_id: userId,
93
- ...context,
94
- ...properties,
95
- projectId: safeProjectId,
96
- $groups: { project: safeProjectId },
97
- },
98
- timestamp: new Date(timestamp).toISOString(),
99
- })),
100
- }),
101
- });
102
- if (!response.ok) {
103
- throw new Error(`Failed to send telemetry: ${response.status} ${response.statusText} - ${await response.text()}`);
104
- }
105
- }
106
- static create({ phase, enabled, quiet, }) {
107
- if (!enabled || TELEMETRY_DISABLED) {
108
- if (!quiet) {
109
- console.warn("[Alchemy] Telemetry is disabled.");
110
- }
111
- return new NoopTelemetryClient();
112
- }
113
- return new TelemetryClient({
114
- sessionId: crypto.randomUUID(),
115
- phase,
116
- enabled,
117
- quiet,
118
- });
119
- }
120
- }
121
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/util/telemetry/client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- export declare const CONFIG_DIR: string;
2
- export declare const TELEMETRY_DISABLED: boolean;
3
- export declare const POSTHOG_CLIENT_API_HOST: string;
4
- export declare const POSTHOG_PROJECT_ID: string;
5
- //# sourceMappingURL=constants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/util/telemetry/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,QAA6C,CAAC;AAErE,eAAO,MAAM,kBAAkB,SACyC,CAAC;AAGzE,eAAO,MAAM,uBAAuB,QACqC,CAAC;AAC1E,eAAO,MAAM,kBAAkB,QAEoB,CAAC"}
@@ -1,8 +0,0 @@
1
- import envPaths from "env-paths";
2
- export const CONFIG_DIR = envPaths("alchemy", { suffix: "" }).config;
3
- export const TELEMETRY_DISABLED = !!process.env.ALCHEMY_TELEMETRY_DISABLED || !!process.env.DO_NOT_TRACK;
4
- // TODO(sam): replace with permanent URL
5
- export const POSTHOG_CLIENT_API_HOST = process.env.ALCHEMY_POSTHOG_CLIENT_API_HOST ?? "https://ph.alchemy.run";
6
- export const POSTHOG_PROJECT_ID = process.env.ALCHEMY_POSTHOG_PROJECT_ID ??
7
- "phc_A51Mi7Q63TvnNrvRMgvBxE1il0DAL66rVg4LdWPRsfK";
8
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/util/telemetry/constants.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AAErE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAEzE,wCAAwC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAClC,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,wBAAwB,CAAC;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAC7B,OAAO,CAAC,GAAG,CAAC,0BAA0B;IACtC,iDAAiD,CAAC"}
@@ -1,15 +0,0 @@
1
- import type { Phase } from "../../alchemy.ts";
2
- import type { Telemetry } from "./types.ts";
3
- declare global {
4
- var Deno: {
5
- version: {
6
- deno: string;
7
- };
8
- } | undefined;
9
- var EdgeRuntime: Record<string, unknown> | undefined;
10
- }
11
- export declare function context(input: {
12
- sessionId: string;
13
- phase?: Phase;
14
- }): Promise<Telemetry.Context>;
15
- //# sourceMappingURL=context.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/util/telemetry/context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAmD5C,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,IAAI,EACJ;QACE,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,GACD,SAAS,CAAC;IACd,IAAI,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CACtD;AAiED,wBAAsB,OAAO,CAAC,KAAK,EAAE;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAkB7B"}
@@ -1,128 +0,0 @@
1
- import { exec } from "node:child_process";
2
- import { mkdir, readFile, writeFile } from "node:fs/promises";
3
- import os from "node:os";
4
- import { join } from "node:path";
5
- import pkg from "../../../package.json" with { type: "json" };
6
- import { CONFIG_DIR } from "./constants.js";
7
- async function userId() {
8
- const path = join(CONFIG_DIR, "id");
9
- try {
10
- return (await readFile(path, "utf-8")).trim();
11
- }
12
- catch { }
13
- try {
14
- await mkdir(CONFIG_DIR, { recursive: true });
15
- }
16
- catch { }
17
- const id = crypto.randomUUID();
18
- try {
19
- await writeFile(path, id);
20
- console.warn([
21
- "Attention: To help improve Alchemy, we now collect anonymous usage, performance, and error data.",
22
- "You can opt out by setting the ALCHEMY_TELEMETRY_DISABLED or DO_NOT_TRACK environment variable to a truthy value.",
23
- ].join("\n"));
24
- }
25
- catch {
26
- return null;
27
- }
28
- return id;
29
- }
30
- function projectId() {
31
- return new Promise((resolve) => {
32
- exec("git rev-list --max-parents=0 HEAD", (err, stdout) => {
33
- if (err) {
34
- resolve(null);
35
- return;
36
- }
37
- resolve(stdout.trim());
38
- });
39
- });
40
- }
41
- function system() {
42
- return {
43
- platform: os.platform(),
44
- osVersion: os.release(),
45
- arch: os.arch(),
46
- cpus: os.cpus().length,
47
- memory: os.totalmem() / 1024 / 1024,
48
- };
49
- }
50
- const RUNTIMES = [
51
- {
52
- name: "bun",
53
- detect: () => !!globalThis.Bun,
54
- version: () => globalThis.Bun?.version,
55
- },
56
- {
57
- name: "deno",
58
- detect: () => !!globalThis.Deno,
59
- version: () => globalThis.Deno?.version?.deno,
60
- },
61
- {
62
- name: "workerd",
63
- detect: () => !!globalThis.EdgeRuntime,
64
- version: () => null,
65
- },
66
- {
67
- name: "node",
68
- detect: () => !!globalThis.process?.versions?.node,
69
- version: () => process.versions.node,
70
- },
71
- ];
72
- function runtime() {
73
- for (const runtime of RUNTIMES) {
74
- if (runtime.detect()) {
75
- return {
76
- name: runtime.name,
77
- version: runtime.version() ?? null,
78
- };
79
- }
80
- }
81
- return {
82
- name: null,
83
- version: null,
84
- };
85
- }
86
- const PROVIDERS = [
87
- { env: "GITHUB_ACTIONS", provider: "GitHub Actions", isCI: true },
88
- { env: "GITLAB_CI", provider: "GitLab CI", isCI: true },
89
- { env: "CIRCLECI", provider: "CircleCI", isCI: true },
90
- { env: "JENKINS_URL", provider: "Jenkins", isCI: true },
91
- { env: "TRAVIS", provider: "Travis CI", isCI: true },
92
- { env: "NOW_BUILDER", provider: "Vercel", isCI: true },
93
- { env: "VERCEL", provider: "Vercel", isCI: false },
94
- ];
95
- function environment() {
96
- for (const provider of PROVIDERS) {
97
- if (process.env[provider.env]) {
98
- return {
99
- provider: provider.provider,
100
- isCI: provider.isCI,
101
- };
102
- }
103
- }
104
- return {
105
- provider: null,
106
- isCI: !!process.env.CI,
107
- };
108
- }
109
- export async function context(input) {
110
- const env = environment();
111
- const [uid, pid] = await Promise.all([
112
- env.isCI ? null : userId(),
113
- projectId(),
114
- ]);
115
- return {
116
- userId: uid,
117
- projectId: pid,
118
- sessionId: input.sessionId,
119
- system: system(),
120
- runtime: runtime(),
121
- environment: env,
122
- alchemy: {
123
- version: pkg.version,
124
- phase: input.phase,
125
- },
126
- };
127
- }
128
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/util/telemetry/context.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export * from "./client.ts";
2
- export * from "./types.ts";
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/util/telemetry/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -1,3 +0,0 @@
1
- export * from "./client.js";
2
- export * from "./types.js";
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/telemetry/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -1,68 +0,0 @@
1
- import type { Phase } from "../../alchemy.ts";
2
- export declare namespace Telemetry {
3
- interface Context {
4
- /** Random UUID generated once per machine and stored in XDG config directory (e.g. `~/Library/Preferences/alchemy` on Mac). Null for CI environments. */
5
- userId: string | null;
6
- /** Root commit hash for the git repository. Anonymous, stable identifier for anyone using git. */
7
- projectId: string | null;
8
- /** UUID generated once per application run. */
9
- sessionId: string;
10
- system: {
11
- platform: string;
12
- osVersion: string;
13
- arch: string;
14
- cpus: number;
15
- memory: number;
16
- };
17
- runtime: {
18
- name: string | null;
19
- version: string | null;
20
- };
21
- environment: {
22
- provider: string | null;
23
- isCI: boolean;
24
- };
25
- alchemy: {
26
- version: string;
27
- phase?: Phase;
28
- };
29
- }
30
- interface BaseEvent {
31
- event: string;
32
- timestamp: number;
33
- }
34
- interface SerializedError {
35
- name?: string;
36
- message: string;
37
- stack?: string;
38
- }
39
- type ErrorInput = Error | SerializedError;
40
- interface AppEvent extends BaseEvent {
41
- event: "app.start" | "app.success" | "app.error";
42
- elapsed?: number;
43
- error?: SerializedError;
44
- }
45
- interface ResourceEvent extends BaseEvent {
46
- event: "resource.start" | "resource.success" | "resource.error" | "resource.skip" | "resource.read";
47
- resource: string;
48
- status?: "creating" | "created" | "updating" | "updated" | "deleting" | "deleted";
49
- elapsed?: number;
50
- error?: SerializedError;
51
- replaced?: boolean;
52
- }
53
- interface CliEvent extends BaseEvent {
54
- event: "cli.start" | "cli.success" | "cli.error";
55
- command: string;
56
- }
57
- interface StateStoreEvent extends BaseEvent {
58
- event: "stateStore.init" | "stateStore.deinit" | "stateStore.list" | "stateStore.count" | "stateStore.get" | "stateStore.getBatch" | "stateStore.all" | "stateStore.set" | "stateStore.delete";
59
- stateStoreClass: string;
60
- elapsed?: number;
61
- error?: SerializedError;
62
- }
63
- type Event = AppEvent | ResourceEvent | StateStoreEvent | CliEvent;
64
- type EventInput = (Omit<AppEvent, "timestamp" | "error"> | Omit<ResourceEvent, "timestamp" | "error"> | Omit<StateStoreEvent, "timestamp" | "error"> | Omit<CliEvent, "timestamp" | "error">) & {
65
- error?: ErrorInput;
66
- };
67
- }
68
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/util/telemetry/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,yBAAiB,SAAS,CAAC;IACzB,UAAiB,OAAO;QACtB,yJAAyJ;QACzJ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,kGAAkG;QAClG,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,+CAA+C;QAC/C,SAAS,EAAE,MAAM,CAAC;QAElB,MAAM,EAAE;YACN,QAAQ,EAAE,MAAM,CAAC;YACjB,SAAS,EAAE,MAAM,CAAC;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QAEF,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;YACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;SACxB,CAAC;QAEF,WAAW,EAAE;YACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;YACxB,IAAI,EAAE,OAAO,CAAC;SACf,CAAC;QAEF,OAAO,EAAE;YACP,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,CAAC,EAAE,KAAK,CAAC;SACf,CAAC;KACH;IAED,UAAiB,SAAS;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB;IAED,UAAiB,eAAe;QAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAED,KAAY,UAAU,GAAG,KAAK,GAAG,eAAe,CAAC;IAEjD,UAAiB,QAAS,SAAQ,SAAS;QACzC,KAAK,EAAE,WAAW,GAAG,aAAa,GAAG,WAAW,CAAC;QACjD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,eAAe,CAAC;KACzB;IAED,UAAiB,aAAc,SAAQ,SAAS;QAC9C,KAAK,EACD,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,eAAe,GACf,eAAe,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EACH,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,eAAe,CAAC;QACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB;IAED,UAAiB,QAAS,SAAQ,SAAS;QACzC,KAAK,EAAE,WAAW,GAAG,aAAa,GAAG,WAAW,CAAC;QACjD,OAAO,EAAE,MAAM,CAAC;KACjB;IAED,UAAiB,eAAgB,SAAQ,SAAS;QAChD,KAAK,EACD,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,GAChB,gBAAgB,GAChB,mBAAmB,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,eAAe,CAAC;KACzB;IAED,KAAY,KAAK,GAAG,QAAQ,GAAG,aAAa,GAAG,eAAe,GAAG,QAAQ,CAAC;IAC1E,KAAY,UAAU,GAAG,CACrB,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,GACrC,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,OAAO,CAAC,GAC1C,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,OAAO,CAAC,GAC5C,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,CACxC,GAAG;QACF,KAAK,CAAC,EAAE,UAAU,CAAC;KACpB,CAAC;CACH"}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=types.js.map
@@ -1,156 +0,0 @@
1
- import os from "node:os";
2
- import type { Phase } from "../../alchemy.ts";
3
- import {
4
- POSTHOG_CLIENT_API_HOST,
5
- POSTHOG_PROJECT_ID,
6
- TELEMETRY_DISABLED,
7
- } from "./constants.ts";
8
- import { context } from "./context.ts";
9
- import type { Telemetry } from "./types.ts";
10
-
11
- export interface TelemetryClientOptions {
12
- sessionId: string;
13
- phase?: Phase;
14
- enabled: boolean;
15
- quiet: boolean;
16
- }
17
-
18
- export interface ITelemetryClient {
19
- ready: Promise<unknown>;
20
- record(event: Telemetry.EventInput): void;
21
- finalize(): Promise<void>;
22
- }
23
-
24
- export class NoopTelemetryClient implements ITelemetryClient {
25
- ready = Promise.resolve();
26
- record(_: Telemetry.EventInput) {}
27
- finalize() {
28
- return Promise.resolve();
29
- }
30
- }
31
-
32
- export class TelemetryClient implements ITelemetryClient {
33
- private context: Promise<Telemetry.Context>;
34
- private events: Telemetry.Event[] = [];
35
-
36
- constructor(readonly options: TelemetryClientOptions) {
37
- this.context = context({
38
- sessionId: this.options.sessionId,
39
- phase: this.options.phase,
40
- });
41
- this.record({
42
- event: "app.start",
43
- });
44
- }
45
-
46
- get ready() {
47
- return this.context;
48
- }
49
-
50
- record(event: Telemetry.EventInput, timestamp = Date.now()) {
51
- const payload = {
52
- ...event,
53
- error: this.serializeError(event.error),
54
- timestamp,
55
- } as Telemetry.Event;
56
- this.events.push(payload);
57
- }
58
-
59
- private serializeError(
60
- error: Telemetry.ErrorInput | undefined,
61
- ): Telemetry.SerializedError | undefined {
62
- if (!error) {
63
- return undefined;
64
- }
65
- if (error instanceof Error) {
66
- return {
67
- ...error, // include additional properties from error object
68
- name: error.name,
69
- message: error.message?.replaceAll(os.homedir(), "~"), // redact home directory
70
- stack: error.stack?.replaceAll(os.homedir(), "~"),
71
- };
72
- }
73
- return error;
74
- }
75
-
76
- async finalize() {
77
- await this.send(this.events).catch((error) => {
78
- if (!this.options.quiet) {
79
- console.warn(error);
80
- }
81
- });
82
- }
83
-
84
- private async send(events: Telemetry.Event[]) {
85
- if (events.length === 0) {
86
- return;
87
- }
88
- const { userId, projectId, ...context } = await this.context;
89
- const safeProjectId = projectId ?? `temp_${userId}`;
90
- const groupResponse = await fetch(`${POSTHOG_CLIENT_API_HOST}/i/v0/e/`, {
91
- method: "POST",
92
- headers: {
93
- "Content-Type": "application/json",
94
- },
95
- body: JSON.stringify({
96
- api_key: POSTHOG_PROJECT_ID,
97
- event: "$groupidentify",
98
- distinct_id: "project-identify",
99
- properties: {
100
- $group_type: "project",
101
- $group_key: safeProjectId,
102
- },
103
- }),
104
- });
105
- if (!groupResponse.ok) {
106
- throw new Error(
107
- `Failed to send group identify: ${groupResponse.status} ${groupResponse.statusText} - ${await groupResponse.text()}`,
108
- );
109
- }
110
- const response = await fetch(`${POSTHOG_CLIENT_API_HOST}/batch`, {
111
- method: "POST",
112
- headers: {
113
- "Content-Type": "application/json",
114
- },
115
- body: JSON.stringify({
116
- api_key: POSTHOG_PROJECT_ID,
117
- historical_migration: false,
118
- batch: events.map(({ event, timestamp, ...properties }) => ({
119
- event,
120
- properties: {
121
- distinct_id: userId,
122
- ...context,
123
- ...properties,
124
- projectId: safeProjectId,
125
- $groups: { project: safeProjectId },
126
- },
127
- timestamp: new Date(timestamp).toISOString(),
128
- })),
129
- }),
130
- });
131
- if (!response.ok) {
132
- throw new Error(
133
- `Failed to send telemetry: ${response.status} ${response.statusText} - ${await response.text()}`,
134
- );
135
- }
136
- }
137
-
138
- static create({
139
- phase,
140
- enabled,
141
- quiet,
142
- }: Omit<TelemetryClientOptions, "sessionId">): ITelemetryClient {
143
- if (!enabled || TELEMETRY_DISABLED) {
144
- if (!quiet) {
145
- console.warn("[Alchemy] Telemetry is disabled.");
146
- }
147
- return new NoopTelemetryClient();
148
- }
149
- return new TelemetryClient({
150
- sessionId: crypto.randomUUID(),
151
- phase,
152
- enabled,
153
- quiet,
154
- });
155
- }
156
- }
@@ -1,13 +0,0 @@
1
- import envPaths from "env-paths";
2
-
3
- export const CONFIG_DIR = envPaths("alchemy", { suffix: "" }).config;
4
-
5
- export const TELEMETRY_DISABLED =
6
- !!process.env.ALCHEMY_TELEMETRY_DISABLED || !!process.env.DO_NOT_TRACK;
7
-
8
- // TODO(sam): replace with permanent URL
9
- export const POSTHOG_CLIENT_API_HOST =
10
- process.env.ALCHEMY_POSTHOG_CLIENT_API_HOST ?? "https://ph.alchemy.run";
11
- export const POSTHOG_PROJECT_ID =
12
- process.env.ALCHEMY_POSTHOG_PROJECT_ID ??
13
- "phc_A51Mi7Q63TvnNrvRMgvBxE1il0DAL66rVg4LdWPRsfK";