From 209c7910317403a7d5a45b41cf8316b6c145e757 Mon Sep 17 00:00:00 2001 From: Bereket Engida <86073083+Bekacru@users.noreply.github.com> Date: Wed, 13 Aug 2025 16:37:34 -0700 Subject: [PATCH] chore(telemetry): refactor config file path handling and add runtime import utility (#3989) --- packages/better-auth/src/telemetry/index.ts | 39 ++++++++++++------- packages/better-auth/src/utils/import-util.ts | 3 ++ 2 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 packages/better-auth/src/utils/import-util.ts diff --git a/packages/better-auth/src/telemetry/index.ts b/packages/better-auth/src/telemetry/index.ts index 217ec5ac61..0816c17e2c 100644 --- a/packages/better-auth/src/telemetry/index.ts +++ b/packages/better-auth/src/telemetry/index.ts @@ -10,6 +10,7 @@ import { betterFetch } from "@better-fetch/fetch"; import type { TelemetryContext, TelemetryEvent } from "./types"; import { logger } from "../utils"; import { getTelemetryAuthConfig } from "./detectors/detect-auth-config"; +import { importRuntime } from "../utils/import-util"; const message = `\n\n\x1b[36mBetter Auth\x1b[0m — Anonymous telemetry notice \nWe collect minimal, completely anonymous usage telemetry to help improve Better Auth. @@ -24,16 +25,23 @@ You can also debug what would be sent by setting: Learn more in the docs: https://www.better-auth.com/docs/reference/telemetry\n\n`; async function configFilePath() { - const path = await import("path"); - const os = await import("os"); - const baseDir = - typeof process !== "undefined" && process.platform === "win32" - ? process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming") - : path.join(os.homedir(), ".config"); - const dir = path.join(baseDir, "better-auth"); - const file = path.join(dir, "telemetry.json"); + try { + const path = await importRuntime("path"); + const os = await importRuntime("os"); + const baseDir = + typeof process !== "undefined" && process.platform === "win32" + ? process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming") + : path.join(os.homedir(), ".config"); + const dir = path.join(baseDir, "better-auth"); + const file = path.join(dir, "telemetry.json"); - return { file, dir }; + return { file, dir }; + } catch { + return { + file: null, + dir: null, + }; + } } const shownNoticeInProcess = new Set(); @@ -42,7 +50,11 @@ async function hasShownNoticeBefore(anonymousId: string) { try { const { file } = await configFilePath(); - const fs = await import("fs/promises"); + if (!file) { + return true; + } + + const fs = await importRuntime("fs/promises"); const raw = await fs.readFile(file, "utf-8"); const json = JSON.parse(raw) as { seen?: string[] }; @@ -58,20 +70,21 @@ async function hasShownNoticeBefore(anonymousId: string) { return false; } - // an unknown error happend + // an unknown error happened return true; } } async function markNoticeShown(anonymousId: string) { try { - const fs = await import("fs/promises"); + const fs = await importRuntime("fs/promises"); const { file, dir } = await configFilePath(); - + if (!file || !dir) return; await fs.mkdir(dir, { recursive: true }); let json: { seen: string[] } = { seen: [] }; try { + if (!file) return; const raw = await fs.readFile(file, "utf-8"); const parsed = JSON.parse(raw) as { seen?: string[] }; json.seen = Array.isArray(parsed.seen) ? parsed.seen : []; diff --git a/packages/better-auth/src/utils/import-util.ts b/packages/better-auth/src/utils/import-util.ts new file mode 100644 index 0000000000..2fe75f5507 --- /dev/null +++ b/packages/better-auth/src/utils/import-util.ts @@ -0,0 +1,3 @@ +export const importRuntime = (m: string): Promise => { + return (Function("mm", "return import(mm)") as any)(m); +};