提交图

90 次代码提交

作者 SHA1 备注 提交日期
XuqmGroup
198574546b feat(security): trust production config signer 2026-07-27 10:42:59 +08:00
XuqmGroup
1e130deaa1 test(update): compare generated paths portably 2026-07-27 10:24:12 +08:00
XuqmGroup
56fb6efccc test(common): run TypeScript compiler cross-platform 2026-07-27 10:17:07 +08:00
XuqmGroup
daa96302dd feat(update): secure signed plugin release sets 2026-07-27 00:39:26 +08:00
XuqmGroup
3d2134e08a feat(sdk): harden automatic config and plugin releases 2026-07-26 23:47:30 +08:00
XuqmGroup
10977341d1 feat(xwebview): 收敛 WebView 宿主与桥接 2026-07-26 19:41:03 +08:00
XuqmGroup
d009c3b616 fix(common): ValidationError 改为继承 Error 修复 Hermes 校验崩溃
- Babel 转译子类 apply 调用原生 ZodError 在 Hermes 抛 TypeError,掩盖真实校验失败
- unexpected 分支补安全诊断日志(构造名+截断消息)
- xuqm-bundles.gradle 将 file: 依赖的 src/metro 纳入任务输入
2026-07-21 01:10:41 +08:00
XuqmGroup
507ce3d2ee feat(update): release-set 事务制品与原生层职责拆分
- 插件包改为 .xuqm.zip 事务制品,manifest/bundle/资源/SHA-256 统一校验
- 原生层拆分为桥接编排、插件包暂存、底层存储三个单一职责类
- 状态查询改为纯读取,不再误触发安装;新增 NATIVE_BASELINE_INCOMPATIBLE 拒绝
- SemVer 解析拆分为独立原生类并补原生测试
- XWebView 收口唯一内核,错误态统一中文层与重试
- common 增加请求头/运行时契约收口与 http 测试
2026-07-20 19:31:43 +08:00
XuqmGroup
d677a9ee52 feat(update): centralize Metro module builds 2026-07-18 08:59:40 +08:00
XuqmGroup
a2d3a27d80 fix(rn-common): redact API diagnostics 2026-07-18 08:35:36 +08:00
XuqmGroup
04fc964a92 test(rn-update): run real Hermes compiler on Windows 2026-07-18 07:08:18 +08:00
XuqmGroup
aacfbf0edd refactor(rn-sdk): unify host runtime and webview contracts 2026-07-18 06:59:57 +08:00
XuqmGroup
144a3bcb2d feat(update): gate plugins on runtime baseline changes 2026-07-17 14:43:05 +08:00
XuqmGroup
4cfcbb3aa2 fix(test): normalize CLI paths on Windows 2026-07-17 14:18:46 +08:00
XuqmGroup
e06f3f9877 fix(test): support Windows Metro paths 2026-07-17 14:14:19 +08:00
XuqmGroup
e7b31d7fc6 feat(update): support safe plugin bundle reload 2026-07-17 14:12:02 +08:00
XuqmGroup
a902e30e0a feat: rebuild RN sdk runtime and plugin updates 2026-07-17 13:50:30 +08:00
XuqmGroup
ac7e941744 fix(metro): 取消 withBugCollect 自动链式,避免破坏 Metro 0.84 dev 打包
- common/metro: withXuqmConfig 不再自动链式 withBugCollect(保留 .xuqmconfig 单点同步)。
  customSerializer 方式的 sourcemap 上传在 Metro 0.84 下不可靠:覆盖默认 serializer 后
  无法经 package exports 取回默认序列化,dev 打包会报 "Cannot read properties of undefined (reading 'code')"。
- bugcollect/metro: 还原 customSerializer 回退实现;该插件仅建议显式包裹在已有 serializer 之上。
- sourcemap 上传后续改为 react-native bundle 后独立脚本上传。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 19:04:55 +08:00
XuqmGroup
d51d3c934d feat(common/metro): .xuqmconfig 单点放置——自动同步到原生 Android/iOS
宿主只需在 RN 侧放置一份 .xuqmconfig;构建/运行时 withXuqmConfig 自动比对并
复制到 android assets/config(供 XuqmMergedProvider 自动初始化)及 iOS 资源目录,
缺失或内容不一致才写入(幂等)。免去 RN/Android/iOS 三处分别放置。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 18:45:17 +08:00
XuqmGroup
4d5adf447a fix(bugcollect): HttpInterceptor 用 globalThis 替代 global,修复消费端 TS 找不到 global
BugCollect.startCapture 自动启用 HttpInterceptor 后,该文件进入消费端类型检查图;
部分 RN 工程 tsconfig 未提供 `global` 类型,改用 globalThis(可移植)。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 18:26:40 +08:00
XuqmGroup
4d2b834f96 feat(sdk): 下载相册/进度、XWebView内联config、上报限频采样、版本忽略、push桥接原生sdk-push
- xwebview: 下载支持公共Downloads/相册(CameraRoll懒加载)/JS进度/openFile;XWebViewView 新增内联 config prop(同屏多实例不污染全局)
- bugcollect: startCapture 自动启用 HttpInterceptor + 按指纹滑动窗口限频 + setSampleRate 采样(降低服务端存储压力)
- update: ignoreAppVersion/clearIgnoredAppVersion/getIgnoredAppVersion 客户端忽略版本(强制更新除外)
- common/metro: withXuqmConfig 自动链式 withBugCollect(Release 包 sourcemap 自动上传)
- push: 桥接完整原生 sdk-push(Android Kotlin + iOS Swift + JS 薄层),删除旧反射实现;单一 XuqmSDK.setUserInfo 驱动厂商检测/token/绑定

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 17:50:29 +08:00
XuqmGroup
1567c673ea feat(bugcollect): 集成符号化服务支持移动端堆栈解析
- 添加 symbolicator 服务配置到 docker-compose.yml
- 配置 bugcollect-service 连接 symbolicator URL
- 设置 symbolicator 端口映射和资源限制
- 添加源码映射文件挂载目录
- 为 RN/Android/iOS/Flutter 堆栈符号化提供支持

docs(xwebview): 更新已知问题文档

- 记录 RN 0.85 Bridgeless 模式下 react-native-blob-util 崩溃问题
- 说明 react-native-blob-util 在 JSI/TurboModule 下初始化失败原因
- 提供宿主 app 使用 XWebViewContent 替代方案
- 添加待修复方案说明
2026-06-22 17:43:00 +08:00
XuqmGroup
988582e9df fix(common): useRequest.fetchAsync 不再重复包装响应拦截器已处理的 RequestError
响应拦截器(如 useApi.ts 中的错误转换)产生的 RequestError 会被
fetchAsync 的 catch 块再次包装为 RequestError('网络请求失败', 'OtherError'),
导致原始的服务器错误消息(如"系统异常")丢失。

现在当 catch 块收到的错误已经是 RequestError 时,直接透传而不重新包装,
保留拦截器中已经提取好的错误消息。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-21 15:35:49 +08:00
XuqmGroup
51e016e185 fix(xwebview): 将 react-native-blob-util 改为懒加载以兼容 RN 0.85 Bridgeless 模式
静态 import 会在模块评估时触发 fs.js:14 调用 ReactNativeBlobUtil.getConstants(),
在 Bridgeless 模式下 TurboModule 未注册时返回 null 导致崩溃。
改为在函数体内 require() 延迟至实际下载时才初始化。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-21 09:23:17 +08:00
XuqmGroup
ff8f34e5a4 fix(common): 修复 useRequest data 字段类型推断 2026-06-20 18:36:09 +08:00
XuqmGroup
1143224194 fix(common): 对齐 @szyx-mobile useRequest 行为并修复 POST body 丢失
- 修复 useRequest POST/PUT/UPLOAD/POSTFORM 请求忽略 fetchAsync data 的问题
- RequestOptions 增加 tag/log 字段,与旧项目兼容
- 导出 ValidationError,供宿主二次封装使用 instanceof 判断
- usePageApi 支持 list 与 records 两种分页字段
- 升级 devDependencies 版本(axios 1.18.0、zod 3.25.76 等)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-20 18:26:45 +08:00
XuqmGroup
1f72b415dc feat: RN Metro 插件实现 Sourcemap 自动上传
- 读取 xuqm.config.js 或环境变量获取 API URL
- Release 构建时自动上传 .map 文件
- 支持自定义 sourcemap 路径
- 异步上传不阻塞构建

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 02:58:27 +08:00
XuqmGroup
6a43e5e560 fix: rn-bugcollect package.json 包含 metro 目录
Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 02:28:25 +08:00
XuqmGroup
0cf264cdf6 feat(core): 添加请求签名功能并扩展更新接口
- 在 SDKConfig 中新增 signingKey 配置项
- 在 ConfigFile 中添加 signingKey 序列化支持
- 实现 API 客户端请求签名拦截器,支持 HMAC-SHA256 签名
- 在 XuqmSDK 中管理 signingKey 的存储和读取
- 扩展 UpdateApi 接口增加 currentVersionName 参数
- 在 UpdateSDK 中集成设备信息和版本号上报功能
- 为 RN SDK 添加签名密钥管理和 HTTP 请求签名注入
- 实现跨平台的 HMAC-SHA256 签名算法支持
2026-06-19 01:27:56 +08:00
XuqmGroup
a9f320db63 docs: 更新 README + 配置文件规范 + 架构总览(BugCollect/withXuqmConfig)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 15:34:48 +08:00
XuqmGroup
4f5739da1f feat(common): Metro 插件自动发现 .xuqmconfig 配置文件
新增 withXuqmConfig(metroConfig) Metro 插件:
- 扫描 src/assets/config/ 下的 *.xuqmconfig 文件
- 通过 resolveRequest 拦截 @xuqm/autoinit-config 模块
- 宿主只需放入下载的 .xuqmconfig 文件,无需重命名

对齐 Android SDK 的 ConfigFileReader 逻辑。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 15:01:39 +08:00
XuqmGroup
d6c42ecf56 fix(bugcollect-rn): 修复 BugCollect-API-v1-Review RN SDK 问题
- types.ts: 新增 BreadcrumbItem 类型;DeviceInfo 补全 brand/sdkVersion/screen/locale/timezone/isEmulator;UserInfo 补全 username/email;IssueEvent 新增 breadcrumbs 字段
- BugCollect.ts: 新增 addBreadcrumb API;新增 captureFatal API;_getPlatform() 支持 harmonyos;_getDeviceInfo() 采集完整设备信息;版本号改为常量;sessionId 加长
- LogQueue.ts: 按 level 分级持久化——fatal/error 写 AsyncStorage(进程崩溃后仍可重传),其余仅内存;重试时只重新入队 fatal/error 事件

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 09:26:26 +08:00
XuqmGroup
76099d897e feat(bugcollect): 更新 API 端点并改进数据结构
- 将 Android SDK 的 mapping 上传端点从 /log/v1/sourcemaps/upload 更改为 /bugcollect/v1/sourcemaps/upload
- 将 RN SDK 的 API 端点从 /log/v1/ 统一更改为 /bugcollect/v1/
- 在 LogQueue.ts 的请求体中添加 sentAt 时间戳和 SDK 信息
- 重构 BugCollect.ts 中的事件结构,将 appVersion 重命名为 release,添加 environment 和 sdk 字段
- 将 JS 错误上报的类型从 js_error 改为 issue,并调整错误级别分类
- 为 warn 和 info 方法添加完整的 issue 事件结构
- 在 types.ts 中添加新的数据类型定义,包括 Level、Platform、SdkInfo、ExceptionInfo 等
- 为 IssueEvent 添加详细的异常信息结构,包括类型、值和堆栈跟踪
- 添加完整的错误收集 API v1 规范审阅报告文档
- 在数据库迁移脚本中为日志表添加新字段,包括级别、环境、设备信息、SDK 信息等
2026-06-17 18:02:10 +08:00
XuqmGroup
57579d2871 refactor: @xuqm/rn-log → @xuqm/rn-bugcollect
- packages/log → packages/bugcollect
- XLog → BugCollect
- logApiUrl/logEnabled → bugCollectApiUrl/bugCollectEnabled
- withXuqmLog → withBugCollect
- typecheck 通过

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-16 17:39:18 +08:00
XuqmGroup
a53438a3f0 docs: rn-log → rn-bugcollect 重命名
Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-16 17:18:35 +08:00
XuqmGroup
b6581adc51 fix: 代码质量清理 — XWebView Pressable/Clipboard、configCrypto 消除 any、UpdateSDK AsyncStorage 优化
- XWebViewView/XWebViewScreen: TouchableOpacity → Pressable
- XWebViewView/XWebViewScreen: Clipboard 改用 @react-native-clipboard/clipboard
- configCrypto.ts: 6 处 any 替换为 SubtleCryptoLike 接口
- UpdateSDK: CachedRnBundle 移除 source 字段,AsyncStorage 仅存版本元数据
- xwebview 添加 @react-native-clipboard/clipboard peerDependency
2026-06-16 14:48:47 +08:00
XuqmGroup
611f2ba95d fix: 功能缺陷修复 — ImSDK login await WebSocket、fetchHistory 支持 GROUP、License 改用 apiRequest、LogQueue 重试上限 2026-06-16 13:49:30 +08:00
XuqmGroup
a0c54ae191 fix(update): 移除不存在的 NativeApkInstall 引用 + 下载 bundle 后校验 MD5 2026-06-16 13:37:45 +08:00
XuqmGroup
2a40d6200b fix: @xuqm/rn-common 从 dependencies 移到 peerDependencies,避免宿主项目嵌套安装旧版 2026-06-16 13:27:23 +08:00
XuqmGroup
8f0a940830 feat: xwebview handleDownloadRequest + README 更新
- 新增 handleDownloadRequest() 统一下载处理函数
- 导出 download 相关工具函数
- 更新 rn-update 和 rn-xwebview README

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-16 13:25:46 +08:00
XuqmGroup
0431b3d694 fix: 所有包添加 files=[src],排除 tsconfig.json 等开发文件不发布到 npm 2026-06-16 13:22:54 +08:00
XuqmGroup
e5130c4627 chore: 版本号恢复为 base(Jenkins 发版时自动处理 SNAPSHOT/Release 后缀) 2026-06-16 13:14:46 +08:00
XuqmGroup
4e80b0bf4e fix: rn-log ErrorCapture 类型修复 + 依赖版本对齐
- ErrorCapture.ts: global → globalThis,移除 declare global 冲突
- index.ts: 移除不存在的 UpdateDownloadProgress 导出
- 各 package.json 版本号对齐

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-16 13:10:16 +08:00
XuqmGroup
b2058840bc feat(rn-log): 添加 metro plugin 存根 — withXuqmLog
打 Release 包时自动包裹 Metro config,后续补全 SourceMap 上传逻辑。
2026-06-16 12:20:04 +08:00
XuqmGroup
4c3019edab docs: 添加 CLAUDE.md + 各 package README + 架构总览 + 模块待开发说明
Agent 8 文档生成:
- CLAUDE.md 项目上下文
- 各 package README (common/update/push/im/xwebview/license/log)
- docs/架构总览.md
- docs/模块待开发说明.md
2026-06-16 12:14:52 +08:00
XuqmGroup
16750b0421 feat: rn-update 进度回调 + rn-xwebview JSBridge + rn-log v0.1.0 新建
Agent 3 — rn-update:
- downloadPlugin/downloadApk 新增 onProgress 进度回调
- checkAppUpdate/checkPluginUpdate 版本缓存(30分钟 TTL)
- 新增 UpdateDownloadProgress 类型导出

Agent 3 — rn-xwebview:
- XWebViewBridge 补全标准 JSBridge handler
- getDeviceInfo/getToken/getUserInfo/openNativePage/closeWebView/showToast

Agent 4 — rn-log v0.1.0:
- XLog 主入口:event/captureError/warn/info/startCapture
- LogQueue:AsyncStorage 本地队列 + 批量上报
- ErrorCapture:JS global error + unhandledRejection
- FunnelTracker:漏斗分析
- fingerprint:SHA-256 指纹去重
- HttpInterceptor:rn-common HTTP 错误自动上报
- NativeLogReporter:TurboModule spec
2026-06-16 12:10:28 +08:00
XuqmGroup
97d4d9498a feat(rn-common): v0.4.0 — api/ui 子模块 + config 扩展 + autoInit 修复
- 新增 api/ 子模块:useRequest、useApi、usePageApi(替换 @szyx-mobile)
- 新增 ui/ 子模块:showToast、showAlert、showConfirm、configureToast
- 新增 globalErrorHandler:setGlobalApiErrorHandler
- config.ts 新增 logApiUrl、logEnabled 字段
- device.ts 新增 manufacturer、vendorVersion 可选字段
- autoInit.ts 修复静默降级,__DEV__ 模式下 re-throw
- index.ts 补全 api/ui 导出
- package.json 版本升至 0.4.0,新增 axios/react/zod 依赖
2026-06-16 12:01:44 +08:00
XuqmGroup
b1e8e307d2 feat(sdk): 按跨平台规范重构所有 SDK 包接口
- common: setUserInfo 成为认证枢纽,分发订阅者;移除 init()/initializeFromLicense();
  initWithConfigFile 解密后调用 initialize() 拉取远程服务配置;XuqmConfig 增加服务开通标志
- push: 移除独立 initialize/registerToken/unregisterToken 等方法;
  改由 _registerUserInfoHandler 订阅,setUserInfo 时自动完成厂商检测+设备注册+token上报
- im: 新增 refreshToken();注册 setUserInfo 订阅,自动登录/断连;移除对 PushSDK 的直接调用
- update: 支持 registerPlugins(批量) + registerPlugin(向后兼容);
  版本号自动从 AsyncStorage 读取,移除 version 字段;新增 updatePlugin(一步完成)、
  downloadAndInstallApk、setBundleCallbacks 注入宿主写入/重载能力
- license: 移除独立 initialize/initializeFromFile;依赖 getConfig() 获取 appKey/licenseUrl
- 顶层 src/sdk.ts: 移除旧 login/logout 包装层,直接重导出 CommonXuqmSDK

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 10:57:55 +08:00
XuqmGroup
8fb59bb5f2 fix(common): platformUrl 可选,不传使用默认公有平台
XuqmInitOptions.platformUrl 改为可选字段。
initialize() 内部:platformUrl ?? DEFAULT_TENANT_PLATFORM_URL。
公有云用户无需传 platformUrl,私有化部署传自有平台地址。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 10:37:57 +08:00
XuqmGroup
90ba1f9de3 fix(common): XuqmSDK.initialize() must not fall back to defaults on failure
Remove the silent fallback that used DEFAULT_TENANT_PLATFORM_URL on fetch errors.
Failure now propagates: rejects awaitInitialization() callers and throws to the
caller of initialize(). State is reset so initialize() can be retried.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 10:04:37 +08:00