From 57579d28716cd29e22610ddcf9b9443ee53449aa Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Tue, 16 Jun 2026 17:39:18 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20@xuqm/rn-log=20=E2=86=92=20@xuqm/rn?= =?UTF-8?q?-bugcollect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - packages/log → packages/bugcollect - XLog → BugCollect - logApiUrl/logEnabled → bugCollectApiUrl/bugCollectEnabled - withXuqmLog → withBugCollect - typecheck 通过 Co-Authored-By: Claude --- package.json | 2 +- packages/{log => bugcollect}/README.md | 0 packages/{log => bugcollect}/metro/index.js | 10 +++++----- packages/{log => bugcollect}/package.json | 2 +- .../XLog.ts => bugcollect/src/BugCollect.ts} | 18 ++++++++--------- .../src/capture/ErrorCapture.ts | 2 +- .../{log => bugcollect}/src/fingerprint.ts | 0 .../src/funnel/FunnelTracker.ts | 2 +- packages/bugcollect/src/index.ts | 2 ++ .../src/interceptor/HttpInterceptor.ts | 4 ++-- .../src/native/NativeLogReporter.ts | 0 .../{log => bugcollect}/src/queue/LogQueue.ts | 20 +++++++++---------- packages/{log => bugcollect}/src/types.ts | 2 +- packages/{log => bugcollect}/tsconfig.json | 0 packages/common/src/api/globalErrorHandler.ts | 2 +- packages/common/src/config.ts | 14 ++++++------- packages/common/src/sdk.ts | 4 ++-- packages/log/src/index.ts | 2 -- tsconfig.json | 2 +- 19 files changed, 44 insertions(+), 44 deletions(-) rename packages/{log => bugcollect}/README.md (100%) rename packages/{log => bugcollect}/metro/index.js (76%) rename packages/{log => bugcollect}/package.json (95%) rename packages/{log/src/XLog.ts => bugcollect/src/BugCollect.ts} (87%) rename packages/{log => bugcollect}/src/capture/ErrorCapture.ts (94%) rename packages/{log => bugcollect}/src/fingerprint.ts (100%) rename packages/{log => bugcollect}/src/funnel/FunnelTracker.ts (96%) create mode 100644 packages/bugcollect/src/index.ts rename packages/{log => bugcollect}/src/interceptor/HttpInterceptor.ts (91%) rename packages/{log => bugcollect}/src/native/NativeLogReporter.ts (100%) rename packages/{log => bugcollect}/src/queue/LogQueue.ts (74%) rename packages/{log => bugcollect}/src/types.ts (93%) rename packages/{log => bugcollect}/tsconfig.json (100%) delete mode 100644 packages/log/src/index.ts diff --git a/package.json b/package.json index 36810ef..6d618d4 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@xuqm/rn-common": ">=0.4.0", "@xuqm/rn-im": ">=0.2.0", "@xuqm/rn-license": ">=0.3.0", - "@xuqm/rn-log": ">=0.1.0", + "@xuqm/rn-bugcollect": ">=0.1.0", "@xuqm/rn-push": ">=0.2.0", "@xuqm/rn-update": ">=0.4.0", "@xuqm/rn-xwebview": ">=0.2.0" diff --git a/packages/log/README.md b/packages/bugcollect/README.md similarity index 100% rename from packages/log/README.md rename to packages/bugcollect/README.md diff --git a/packages/log/metro/index.js b/packages/bugcollect/metro/index.js similarity index 76% rename from packages/log/metro/index.js rename to packages/bugcollect/metro/index.js index 9cc4a32..37a6177 100644 --- a/packages/log/metro/index.js +++ b/packages/bugcollect/metro/index.js @@ -1,11 +1,11 @@ 'use strict' /** - * withXuqmLog(metroConfig) + * withBugCollect(metroConfig) * 包裹 Metro 配置,打 Release 包时自动上传 SourceMap。 * 当前为存根实现,后续补全 SourceMap 上传逻辑。 */ -function withXuqmLog(metroConfig) { +function withBugCollect(metroConfig) { return { ...metroConfig, serializer: { @@ -20,9 +20,9 @@ function withXuqmLog(metroConfig) { // 仅 Release 包上传 SourceMap(dev 模式跳过) if (!options.dev) { // TODO: 补全 SourceMap 上传逻辑 - // 1. 读取 .xuqmconfig 或 xuqm.config.js 获取 logApiUrl + // 1. 读取 .xuqmconfig 或 xuqm.config.js 获取 bugCollectApiUrl // 2. 读取 sourceMapUrl 对应的 .map 文件 - // 3. 上传到 logApiUrl/log/v1/sourcemaps/upload + // 3. 上传到 bugCollectApiUrl/log/v1/sourcemaps/upload } return result @@ -31,4 +31,4 @@ function withXuqmLog(metroConfig) { } } -module.exports = { withXuqmLog } +module.exports = { withBugCollect } diff --git a/packages/log/package.json b/packages/bugcollect/package.json similarity index 95% rename from packages/log/package.json rename to packages/bugcollect/package.json index bf4bd9c..73d2d1b 100644 --- a/packages/log/package.json +++ b/packages/bugcollect/package.json @@ -1,5 +1,5 @@ { - "name": "@xuqm/rn-log", + "name": "@xuqm/rn-bugcollect", "version": "0.1.0", "description": "XuqmGroup RN SDK — log collection, error tracking, funnel analysis", "license": "UNLICENSED", diff --git a/packages/log/src/XLog.ts b/packages/bugcollect/src/BugCollect.ts similarity index 87% rename from packages/log/src/XLog.ts rename to packages/bugcollect/src/BugCollect.ts index 6f02f31..fdb2450 100644 --- a/packages/log/src/XLog.ts +++ b/packages/bugcollect/src/BugCollect.ts @@ -4,7 +4,7 @@ import { LogQueue } from './queue/LogQueue' import { ErrorCapture } from './capture/ErrorCapture' import { computeFingerprint } from './fingerprint' import { FunnelTracker } from './funnel/FunnelTracker' -import type { LogLevel, Environment, IssueEvent, LogEvent, XLogEvent } from './types' +import type { LogLevel, Environment, IssueEvent, LogEvent, BugCollectEvent } from './types' // ─── Internal state ─────────────────────────────────────────────────────────── @@ -35,18 +35,18 @@ function _getAppVersion(): string { return typeof v === 'string' ? v : String(v ?? '0.0.0') } -function _enqueue(event: XLogEvent): void { +function _enqueue(event: BugCollectEvent): void { if (!_queue) { const cfg = getConfig() - if (!cfg.logApiUrl || !cfg.logEnabled) return - _queue = new LogQueue({ logApiUrl: cfg.logApiUrl, appKey: cfg.appKey }) + if (!cfg.bugCollectApiUrl || !cfg.bugCollectEnabled) return + _queue = new LogQueue({ bugCollectApiUrl: cfg.bugCollectApiUrl, appKey: cfg.appKey }) } void _queue.push(event) } -// ─── XLog public API ────────────────────────────────────────────────────────── +// ─── BugCollect public API ──────────────────────────────────────────────────── -export const XLog = { +export const BugCollect = { /** Set the minimum log level. Events below this level are discarded. */ setLogLevel(level: LogLevel): void { _logLevel = level @@ -101,13 +101,13 @@ export const XLog = { /** Log a warning (if log level allows). */ warn(message: string, metadata?: Record): void { if (_levelNum(_logLevel) > _levelNum('warn')) return - XLog.captureError(new Error(message), { ...metadata, level: 'warn' }) + BugCollect.captureError(new Error(message), { ...metadata, level: 'warn' }) }, /** Log an informational event (if log level allows). */ info(message: string, metadata?: Record): void { if (_levelNum(_logLevel) > _levelNum('info')) return - XLog.event('__log_info', { message, ...metadata }) + BugCollect.event('__log_info', { message, ...metadata }) }, /** @@ -117,7 +117,7 @@ export const XLog = { startCapture(): void { if (_errorCaptureStarted) return _errorCaptureStarted = true - ErrorCapture.start(XLog.captureError.bind(XLog)) + ErrorCapture.start(BugCollect.captureError.bind(BugCollect)) }, /** Define a funnel for step-by-step conversion tracking. */ diff --git a/packages/log/src/capture/ErrorCapture.ts b/packages/bugcollect/src/capture/ErrorCapture.ts similarity index 94% rename from packages/log/src/capture/ErrorCapture.ts rename to packages/bugcollect/src/capture/ErrorCapture.ts index e958136..93796d5 100644 --- a/packages/log/src/capture/ErrorCapture.ts +++ b/packages/bugcollect/src/capture/ErrorCapture.ts @@ -1,6 +1,6 @@ /** * ErrorCapture — hooks into the RN global error handler and unhandled promise - * rejections to automatically forward errors to XLog.captureError. + * rejections to automatically forward errors to BugCollect.captureError. */ // React Native exposes ErrorUtils on the global object diff --git a/packages/log/src/fingerprint.ts b/packages/bugcollect/src/fingerprint.ts similarity index 100% rename from packages/log/src/fingerprint.ts rename to packages/bugcollect/src/fingerprint.ts diff --git a/packages/log/src/funnel/FunnelTracker.ts b/packages/bugcollect/src/funnel/FunnelTracker.ts similarity index 96% rename from packages/log/src/funnel/FunnelTracker.ts rename to packages/bugcollect/src/funnel/FunnelTracker.ts index 11697fb..ef2ac32 100644 --- a/packages/log/src/funnel/FunnelTracker.ts +++ b/packages/bugcollect/src/funnel/FunnelTracker.ts @@ -26,7 +26,7 @@ export const FunnelTracker = { }, /** - * Called automatically by XLog.event for each event. + * Called automatically by BugCollect.event for each event. * Advances any funnel whose next expected step matches eventName. */ track(eventName: string, _properties?: Record): void { diff --git a/packages/bugcollect/src/index.ts b/packages/bugcollect/src/index.ts new file mode 100644 index 0000000..2323589 --- /dev/null +++ b/packages/bugcollect/src/index.ts @@ -0,0 +1,2 @@ +export { BugCollect } from './BugCollect' +export type { LogLevel, Environment, LogEvent, IssueEvent, BugCollectEvent } from './types' diff --git a/packages/log/src/interceptor/HttpInterceptor.ts b/packages/bugcollect/src/interceptor/HttpInterceptor.ts similarity index 91% rename from packages/log/src/interceptor/HttpInterceptor.ts rename to packages/bugcollect/src/interceptor/HttpInterceptor.ts index 08e9e51..e289dff 100644 --- a/packages/log/src/interceptor/HttpInterceptor.ts +++ b/packages/bugcollect/src/interceptor/HttpInterceptor.ts @@ -1,9 +1,9 @@ /** * HttpInterceptor — wraps the global fetch to automatically report - * HTTP error responses (4xx / 5xx) through XLog.captureError. + * HTTP error responses (4xx / 5xx) through BugCollect.captureError. * * Usage: - * HttpInterceptor.start(XLog.captureError.bind(XLog)) + * HttpInterceptor.start(BugCollect.captureError.bind(BugCollect)) */ type OnError = (error: unknown, meta?: Record) => void diff --git a/packages/log/src/native/NativeLogReporter.ts b/packages/bugcollect/src/native/NativeLogReporter.ts similarity index 100% rename from packages/log/src/native/NativeLogReporter.ts rename to packages/bugcollect/src/native/NativeLogReporter.ts diff --git a/packages/log/src/queue/LogQueue.ts b/packages/bugcollect/src/queue/LogQueue.ts similarity index 74% rename from packages/log/src/queue/LogQueue.ts rename to packages/bugcollect/src/queue/LogQueue.ts index 75191be..803eb31 100644 --- a/packages/log/src/queue/LogQueue.ts +++ b/packages/bugcollect/src/queue/LogQueue.ts @@ -1,7 +1,7 @@ import AsyncStorage from '@react-native-async-storage/async-storage' -import type { XLogEvent } from '../types' +import type { BugCollectEvent } from '../types' -const QUEUE_KEY = '@xuqm_log:queue' +const QUEUE_KEY = '@xuqm_bugcollect:queue' const BATCH_SIZE = 30 const FLUSH_INTERVAL_MS = 10_000 // 10 seconds const MAX_QUEUE_SIZE = 500 @@ -11,13 +11,13 @@ export class LogQueue { private flushTimer: ReturnType | null = null private retryCount = 0 - constructor(private cfg: { logApiUrl: string; appKey: string }) { + constructor(private cfg: { bugCollectApiUrl: string; appKey: string }) { this.flushTimer = setInterval(() => { void this.flush() }, FLUSH_INTERVAL_MS) } - async push(event: XLogEvent): Promise { + async push(event: BugCollectEvent): Promise { const queue = await this._read() if (queue.length >= MAX_QUEUE_SIZE) queue.shift() // drop oldest queue.push(event) @@ -55,9 +55,9 @@ export class LogQueue { } } - private async _post(path: string, data: XLogEvent[]): Promise { + private async _post(path: string, data: BugCollectEvent[]): Promise { const body = JSON.stringify({ events: data }) - const res = await fetch(`${this.cfg.logApiUrl}${path}`, { + const res = await fetch(`${this.cfg.bugCollectApiUrl}${path}`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -66,16 +66,16 @@ export class LogQueue { body, }) if (!res.ok) { - throw new Error(`[XuqmLog] Upload failed: ${res.status}`) + throw new Error(`[BugCollect] Upload failed: ${res.status}`) } } - private async _read(): Promise { + private async _read(): Promise { const raw = await AsyncStorage.getItem(QUEUE_KEY) - return raw ? (JSON.parse(raw) as XLogEvent[]) : [] + return raw ? (JSON.parse(raw) as BugCollectEvent[]) : [] } - private async _write(queue: XLogEvent[]): Promise { + private async _write(queue: BugCollectEvent[]): Promise { await AsyncStorage.setItem(QUEUE_KEY, JSON.stringify(queue)) } } diff --git a/packages/log/src/types.ts b/packages/bugcollect/src/types.ts similarity index 93% rename from packages/log/src/types.ts rename to packages/bugcollect/src/types.ts index 9657d23..f224f12 100644 --- a/packages/log/src/types.ts +++ b/packages/bugcollect/src/types.ts @@ -29,4 +29,4 @@ export interface IssueEvent { metadata?: Record } -export type XLogEvent = LogEvent | IssueEvent +export type BugCollectEvent = LogEvent | IssueEvent diff --git a/packages/log/tsconfig.json b/packages/bugcollect/tsconfig.json similarity index 100% rename from packages/log/tsconfig.json rename to packages/bugcollect/tsconfig.json diff --git a/packages/common/src/api/globalErrorHandler.ts b/packages/common/src/api/globalErrorHandler.ts index 10cdc37..d7a5f08 100644 --- a/packages/common/src/api/globalErrorHandler.ts +++ b/packages/common/src/api/globalErrorHandler.ts @@ -4,7 +4,7 @@ type ApiErrorHandler = (error: RequestError) => void let _handler: ApiErrorHandler | null = null -/** 注册全局 API 错误处理器(宿主在初始化时注入,通常将错误转发给 rn-log)。*/ +/** 注册全局 API 错误处理器(宿主在初始化时注入,通常将错误转发给 rn-bugcollect)。*/ export function setGlobalApiErrorHandler(handler: ApiErrorHandler): void { _handler = handler } diff --git a/packages/common/src/config.ts b/packages/common/src/config.ts index 3ca4636..fde7546 100644 --- a/packages/common/src/config.ts +++ b/packages/common/src/config.ts @@ -15,9 +15,9 @@ export interface XuqmConfig { imEnabled: boolean pushEnabled: boolean licenseEnabled: boolean - // 日志服务(rn-log 使用) - logApiUrl: string - logEnabled: boolean + // 崩溃采集服务(rn-bugcollect 使用) + bugCollectApiUrl: string + bugCollectEnabled: boolean } export interface XuqmUserInfo { @@ -47,8 +47,8 @@ export interface XuqmRemoteConfig { imEnabled?: boolean pushEnabled?: boolean licenseEnabled?: boolean - logApiUrl?: string - logEnabled?: boolean + bugCollectApiUrl?: string + bugCollectEnabled?: boolean } export function initConfigFromRemote( @@ -66,8 +66,8 @@ export function initConfigFromRemote( imEnabled: remote.imEnabled ?? !!remote.imWsUrl, pushEnabled: remote.pushEnabled ?? true, licenseEnabled: remote.licenseEnabled ?? false, - logApiUrl: remote.logApiUrl ?? '', - logEnabled: remote.logEnabled ?? false, + bugCollectApiUrl: remote.bugCollectApiUrl ?? '', + bugCollectEnabled: remote.bugCollectEnabled ?? false, } } diff --git a/packages/common/src/sdk.ts b/packages/common/src/sdk.ts index e95e2c2..2ff569c 100644 --- a/packages/common/src/sdk.ts +++ b/packages/common/src/sdk.ts @@ -63,8 +63,8 @@ export const XuqmSDK = { imEnabled: remote.imEnabled as boolean | undefined, pushEnabled: remote.pushEnabled as boolean | undefined, licenseEnabled: remote.licenseEnabled as boolean | undefined, - logApiUrl: remote.logApiUrl as string | undefined, - logEnabled: remote.logEnabled as boolean | undefined, + bugCollectApiUrl: remote.bugCollectApiUrl as string | undefined, + bugCollectEnabled: remote.bugCollectEnabled as boolean | undefined, }) configureHttp({ baseUrl: (remote.apiUrl as string | undefined) ?? baseUrl, diff --git a/packages/log/src/index.ts b/packages/log/src/index.ts deleted file mode 100644 index 256344a..0000000 --- a/packages/log/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { XLog } from './XLog' -export type { LogLevel, Environment, LogEvent, IssueEvent, XLogEvent } from './types' diff --git a/tsconfig.json b/tsconfig.json index 7f7bf3e..00ca038 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,7 @@ "@xuqm/rn-common": ["packages/common/src"], "@xuqm/rn-im": ["packages/im/src"], "@xuqm/rn-license": ["packages/license/src"], - "@xuqm/rn-log": ["packages/log/src"], + "@xuqm/rn-bugcollect": ["packages/bugcollect/src"], "@xuqm/rn-push": ["packages/push/src"], "@xuqm/rn-update": ["packages/update/src"], "@xuqm/rn-xwebview": ["packages/xwebview/src"]