refactor: move telemetry to single package (#5152)

This commit is contained in:
Alex Yang
2025-10-07 12:08:19 -07:00
committed by GitHub
parent 6f2f29a96e
commit 613747ef8e
21 changed files with 150 additions and 22 deletions

View File

@@ -706,6 +706,7 @@
},
"dependencies": {
"@better-auth/core": "workspace:*",
"@better-auth/telemetry": "workspace:*",
"@better-auth/utils": "0.3.0",
"@better-fetch/fetch": "catalog:",
"@noble/ciphers": "^2.0.0",

View File

@@ -17,7 +17,9 @@ export type * from "./types/helper";
// export this as we are referencing OAuth2Tokens in the `refresh-token` api as return type
// telemetry exports for CLI and consumers
export { createTelemetry } from "./telemetry";
export { getTelemetryAuthConfig } from "./telemetry/detectors/detect-auth-config";
export type { TelemetryEvent } from "./telemetry/types";
export {
createTelemetry,
getTelemetryAuthConfig,
type TelemetryEvent,
} from "@better-auth/telemetry";
export { APIError } from "./api";

View File

@@ -26,8 +26,7 @@ import { checkPassword } from "./utils/password";
import { getBaseURL } from "./utils/url";
import type { LiteralUnion } from "./types/helper";
import { BetterAuthError } from "./error";
import { createTelemetry } from "./telemetry";
import type { TelemetryEvent } from "./telemetry/types";
import { createTelemetry, type TelemetryEvent } from "@better-auth/telemetry";
import { getKyselyDatabaseType } from "./adapters/kysely-adapter";
import { checkEndpointConflicts } from "./api";
import { isPromise } from "./utils/is-promise";

View File

@@ -0,0 +1,10 @@
import { defineBuildConfig } from "unbuild";
export default defineBuildConfig({
entries: ["src/index"],
declaration: true,
clean: true,
rollup: {
emitCJS: true,
},
});

View File

@@ -0,0 +1,41 @@
{
"name": "@better-auth/telemetry",
"version": "1.4.0-beta.8",
"description": "Telemetry package for Better Auth",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
"exports": {
".": {
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.mjs"
},
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
}
},
"typesVersions": {
"*": {
"index": [
"dist/index.d.ts"
]
}
},
"scripts": {
"build": "unbuild --clean",
"stub": "unbuild --stub",
"typecheck": "tsc --project tsconfig.json"
},
"devDependencies": {
"unbuild": "catalog:",
"type-fest": "^4.31.0"
},
"dependencies": {
"@better-auth/core": "workspace:*",
"@better-auth/utils": "0.3.0",
"@better-fetch/fetch": "catalog:"
}
}

View File

@@ -1,6 +1,4 @@
import type { SocialProviders } from "../../social-providers";
import type { BetterAuthOptions } from "../../types";
import type { TelemetryContext } from "../types";
import type { TelemetryContext, BetterAuthOptions } from "../types";
export function getTelemetryAuthConfig(
options: BetterAuthOptions,
@@ -40,7 +38,7 @@ export function getTelemetryAuthConfig(
!!options.emailAndPassword?.revokeSessionsOnPasswordReset,
},
socialProviders: Object.keys(options.socialProviders || {}).map((p) => {
const provider = options.socialProviders?.[p as keyof SocialProviders];
const provider = options.socialProviders?.[p];
if (!provider) return {};
return {
id: p,

View File

@@ -1,4 +1,4 @@
import { getPackageVersion } from "../../utils/package-json";
import { getPackageVersion } from "../utils/package-json";
import type { DetectionInfo } from "../types";
const DATABASES: Record<string, string> = {

View File

@@ -1,4 +1,4 @@
import { getPackageVersion } from "../../utils/package-json";
import { getPackageVersion } from "../utils/package-json";
const FRAMEWORKS: Record<string, string> = {
next: "next",

View File

@@ -1,5 +1,5 @@
import { env } from "@better-auth/core/env";
import { importRuntime } from "../../utils/import-util";
import { importRuntime } from "../utils/import-util";
function getVendor() {
const hasAny = (...keys: string[]) =>

View File

@@ -1,6 +1,6 @@
import { ENV, getBooleanEnvVar, isTest } from "@better-auth/core/env";
import { getProjectId } from "./project-id";
import type { BetterAuthOptions } from "../types";
import type { BetterAuthOptions } from "./types";
import { detectEnvironment, detectRuntime } from "./detectors/detect-runtime";
import { detectDatabase } from "./detectors/detect-database";
import { detectFramework } from "./detectors/detect-framework";
@@ -11,6 +11,9 @@ import type { TelemetryContext, TelemetryEvent } from "./types";
import { logger } from "@better-auth/core/env";
import { getTelemetryAuthConfig } from "./detectors/detect-auth-config";
export * from "./types";
export { getTelemetryAuthConfig } from "./detectors/detect-auth-config";
export async function createTelemetry(
options: BetterAuthOptions,
context?: TelemetryContext,

View File

@@ -1,6 +1,6 @@
import { generateId } from "../utils";
import { hashToBase64 } from "../crypto";
import { getNameFromLocalPackageJson } from "../utils/package-json";
import { generateId } from "./utils/id";
import { hashToBase64 } from "./utils/hash";
import { getNameFromLocalPackageJson } from "./utils/package-json";
let projectIdCached: string | null = null;

View File

@@ -44,3 +44,29 @@ export interface TelemetryContext {
adapter?: string;
skipTestCheck?: boolean;
}
// Minimal interface for BetterAuth options to avoid circular dependencies
export interface BetterAuthOptions {
baseURL?: string;
appName?: string;
telemetry?: {
enabled?: boolean;
debug?: boolean;
};
emailVerification?: any;
emailAndPassword?: any;
socialProviders?: Record<string, any>;
plugins?: Array<{ id: string | symbol }>;
user?: any;
verification?: any;
session?: any;
account?: any;
hooks?: any;
secondaryStorage?: any;
advanced?: any;
trustedOrigins?: any;
rateLimit?: any;
onAPIError?: any;
logger?: any;
databaseHooks?: any;
}

View File

@@ -0,0 +1,9 @@
import { createHash } from "@better-auth/utils/hash";
import { base64 } from "@better-auth/utils/base64";
export async function hashToBase64(
data: string | ArrayBuffer,
): Promise<string> {
const buffer = await createHash("SHA-256").digest(data);
return base64.encode(buffer);
}

View File

@@ -0,0 +1,5 @@
import { createRandomStringGenerator } from "@better-auth/utils/random";
export const generateId = (size?: number) => {
return createRandomStringGenerator("a-z", "A-Z", "0-9")(size || 32);
};

View File

@@ -0,0 +1,3 @@
export const importRuntime = <T>(m: string): Promise<T> => {
return (Function("mm", "return import(mm)") as any)(m);
};

View File

@@ -0,0 +1,9 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}

34
pnpm-lock.yaml generated
View File

@@ -843,6 +843,9 @@ importers:
'@better-auth/core':
specifier: workspace:*
version: link:../core
'@better-auth/telemetry':
specifier: workspace:*
version: link:../telemetry
'@better-auth/utils':
specifier: 0.3.0
version: 0.3.0
@@ -1213,6 +1216,25 @@ importers:
specifier: 'catalog:'
version: 3.6.1(sass@1.90.0)(typescript@5.9.2)(vue@3.5.19(typescript@5.9.2))
packages/telemetry:
dependencies:
'@better-auth/core':
specifier: workspace:*
version: link:../core
'@better-auth/utils':
specifier: 0.3.0
version: 0.3.0
'@better-fetch/fetch':
specifier: 'catalog:'
version: 1.1.18
devDependencies:
type-fest:
specifier: ^4.31.0
version: 4.41.0
unbuild:
specifier: 'catalog:'
version: 3.6.1(sass@1.90.0)(typescript@5.9.2)(vue@3.5.19(typescript@5.9.2))
packages:
'@0no-co/graphql.web@1.2.0':
@@ -15254,7 +15276,7 @@ snapshots:
postcss: 8.4.49
resolve-from: 5.0.0
optionalDependencies:
expo: 54.0.10(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(expo-router@6.0.8)(graphql@16.11.0)(react-native@0.80.2(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)
expo: 54.0.10(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(expo-router@6.0.8)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.2))(@react-native/metro-config@0.81.0(@babel/core@7.28.4))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -15339,7 +15361,7 @@ snapshots:
'@expo/json-file': 10.0.7
'@react-native/normalize-colors': 0.81.4
debug: 4.4.1
expo: 54.0.10(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(expo-router@6.0.8)(graphql@16.11.0)(react-native@0.80.2(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)
expo: 54.0.10(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(expo-router@6.0.8)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.2))(@react-native/metro-config@0.81.0(@babel/core@7.28.4))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)
resolve-from: 5.0.0
semver: 7.7.2
xml2js: 0.6.0
@@ -19502,7 +19524,7 @@ snapshots:
resolve-from: 5.0.0
optionalDependencies:
'@babel/runtime': 7.28.4
expo: 54.0.10(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(expo-router@6.0.8)(graphql@16.11.0)(react-native@0.80.2(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)
expo: 54.0.10(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(expo-router@6.0.8)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.2))(@react-native/metro-config@0.81.0(@babel/core@7.28.4))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)
transitivePeerDependencies:
- '@babel/core'
- supports-color
@@ -21102,7 +21124,7 @@ snapshots:
expo-keep-awake@15.0.7(expo@54.0.10)(react@19.1.1):
dependencies:
expo: 54.0.10(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(expo-router@6.0.8)(graphql@16.11.0)(react-native@0.80.2(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)
expo: 54.0.10(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(expo-router@6.0.8)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.2))(@react-native/metro-config@0.81.0(@babel/core@7.28.4))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)
react: 19.1.1
expo-linking@7.1.7(expo@54.0.10)(react-native@0.80.2(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1):
@@ -24012,7 +24034,7 @@ snapshots:
citty: 0.1.6
cssnano: 7.0.7(postcss@8.5.6)
defu: 6.1.4
esbuild: 0.25.9
esbuild: 0.25.10
jiti: 1.21.7
mlly: 1.7.4
pathe: 2.0.3
@@ -26988,7 +27010,7 @@ snapshots:
citty: 0.1.6
consola: 3.4.2
defu: 6.1.4
esbuild: 0.25.9
esbuild: 0.25.10
fix-dts-default-cjs-exports: 1.0.1
hookable: 5.5.3
jiti: 2.6.0