Abner
|
d297fa9f55
|
⚡ perf: 提高二维码生成图像清晰度的放大倍率
- 本地生成二维码时将 `createDataURL` 的第二个参数从 `cellSize * 2` 调整为 `cellSize * 4`,提升生成图片清晰度
- 边缘函数生成二维码时同步将 `createDataURL` 的第二个参数从 `cellSize * 2` 调整为 `cellSize * 4`,保证本地与线上效果一致
- 维持原有 `cellSize` 计算逻辑不变,确保二维码模块数与边距的适配策略一致
|
2026-06-25 22:25:41 +08:00 |
|
Neo Vern
|
7298ae4a0d
|
✨ feat: QR 码本地打包 + Edge Function 直接生成 (#86)
* ✨ feat: 打包 qrcode-generator@1.4.4 到本地 ES 模块
* ♻️ refactor(qrcode): 移除 CDN 加载逻辑,改用本地 import 引入 qrcode-generator
* 🔧 chore: 移除 CDN preconnect 提示,QR 码库已内联
* 🔧 chore: 清理 CSP 配置,移除不再需要的 CDN 域名
* ✨ feat: 将 QR 码生成迁移到 Edge Function,消除后端冷启动延迟
- 在 Edge Function 中内联 qrcode-generator 库(~20KB),直接生成 QR 码
- 删除废弃的 Netlify Function (qrcode-generate.js)
- 更新 server.js 移除对已删除函数的引用
- 更新测试文件适配新的 Edge 内联架构
* ♻️ refactor: 代码质量修复 — 移除死代码、消除变量遮蔽、添加交叉引用注释
* 🔧 chore: 修复非阻塞风险 — 补充 strict 模式、移除废弃 qrcode 依赖
- Edge Function qrcode-lib.js 补充 'use strict' 声明,与浏览器版保持一致
- 移除已废弃的 qrcode npm 依赖(原用于已删除的 Netlify Function)
* ♻️ refactor: 消除魔法数字、补充脆耦合和 async 技术债注释
- Edge Function 中 QR margin 魔法数字 8 替换为 QR_MARGIN_MODULES 常量
- generateQRCodeLocal 补充 async 无 await 的技术债说明
- error.message.startsWith 条件补充校验函数耦合关系注释
* 🐛 fix: 修复边界条件 — null JSON body、vendor 字符串异常、CDN preconnect 残留
- Edge Function: null JSON body 解构移到 try/catch 内,添加 null/非对象检查
- qrcode-generator: 库 throw 字符串时统一转换为 Error 对象,避免 .startsWith 崩溃
- index.html: 移除不再需要的 CDN preconnect 提示(jsdelivr/cdnjs)
* ♻️ refactor: 修复 CSP 恢复、异常归一化、自定义 Error 类、负面路径测试
- netlify.toml: 恢复 script-src 中 cdn.jsdelivr.net(Bootstrap JS 仍依赖)
- Edge Function catch: 归一化非 Error 异常(库可能 throw 字符串)
- Edge Function QR margin: createDataURL(cellSize, 2) → createDataURL(cellSize, cellSize * 2) 对齐模块边距
- Edge Function: 补充认证模型和 QR 格式变更注释
- qrcode-generator.js: 引入 QRCodeValidationError 替代 error.message.startsWith 脆耦合
- tests/bff-proxy: 添加 6 个 Edge QR 负面路径测试(无效 JSON、空/超长/非字符串 data、超范围 size)
- tests/qrcode-generator: 添加库 throw 字符串异常的测试
- scripts/sync-qrcode-lib.js: 新增库代码同步验证脚本
* 🐛 fix: 修复 server.js CSP 缺少 jsdelivr、同步脚本 CRLF 归一化、fallback 拦截校验错误
- server.js: 恢复 script-src 中 cdn.jsdelivr.net(本地开发 Bootstrap JS 依赖)
- sync-qrcode-lib.js: 归一化 CRLF 换行符避免跨平台误报
- qrcode-generator.js: generateQRCodeWithFallback 入口处拦截 QRCodeValidationError,避免无效输入触发无意义的后端降级
|
2026-06-25 22:15:17 +08:00 |
|
Abner
|
0dee45b71b
|
🐛 fix: 重构健康检查功能以支持分层认证与环境变量监控
- 将健康检查从单一响应优化为公开/私有分层架构,通过 `detail=true` 参数控制是否返回详细环境变量检查状态
- 引入 `CRITICAL_ENV_VARS` 和 `OPTIONAL_ENV_VARS` 配置列表,统一环境变量健康检查逻辑,增强可维护性与可扩展性
- 移除 `notifications-internal.js` 废弃文件,保持函数目录结构清晰,避免路由冗余
- 在 BFF Edge Function 中将 `health` 路由加入 `ALLOWED_ORIGIN` 免验证白名单,支持前端直接调用健康检查接口
|
2026-06-24 23:57:45 +08:00 |
|
Abner
|
7221eb2e49
|
🐛 fix(qrcode): 添加 loadQRCodeLibrary 返回值防御性验证
解决 ESIM-TOOLS-15:浏览器扩展污染或缓存竞态导致 qrCodeLib 不是函数的极端情况。
新增重试机制:清除缓存后重新加载 CDN,避免用户看到 QR 码生成失败。
|
2026-06-24 23:03:30 +08:00 |
|
Abner
|
8bdc983959
|
🐛 fix(sentry): 修复 CSP connect-src 缺少 sentry.io 基础域名
- 所有 CSP 的 connect-src 添加 https://sentry.io
- *.sentry.io 通配符不匹配基础域名 sentry.io
- showReportDialog 提交反馈时 XHR 被阻止,已修复
|
2026-06-24 19:24:39 +08:00 |
|
Abner
|
2fc303d4ff
|
✨ feat: 暴露 Sentry 健康状态并补全 CSP 域名
- 在 src/js/sentry-loader.js 新增 getSentryHealth 方法,返回 sdkLoaded、initialized、isDev、dsnConfigured、environment、release 等健康信息
- 将 getSentryHealth 挂载到 window.getSentryHealth,便于运行时诊断 Sentry 是否加载与初始化成功
- 更新 server.js 的 CSP script-src,补充允许 https://sentry.io 域名以匹配 Sentry 脚本加载需求
- 更新 netlify.toml 以及 index.html、giffgaff_modular.html、simyo_modular.html 中的生产/页面 CSP 策略,在 script-src 中加入 https://sentry.io,并相应调整元信息中的域名白名单
|
2026-06-24 19:20:00 +08:00 |
|
Abner
|
0e1e21651a
|
🐛 fix(sentry): 修复 CSP 和截图安全问题
- server.js scriptSrc 补充 browser.sentry-cdn.com
- 禁用 feedbackIntegration 截图功能,避免泄露 eSIM 凭据
|
2026-06-24 19:07:38 +08:00 |
|
Neo Vern
|
bb80d3dc0a
|
✨ feat(sentry): 添加用户反馈功能 (#83)
* ✨ feat(sentry): 添加用户反馈功能
- 升级 CDN bundle 以支持 feedback 模块
- 添加 feedbackIntegration 内置 Widget(主动反馈)
- 实现错误后自动弹窗(Crash-Report Modal)
- 添加冷却机制防止频繁弹窗(60秒冷却 + 同一错误不重复)
* ♻️ refactor(sentry): 修复审查发现的问题
- 消除指纹计算重复(DRY 违反)
- 统一使用 const/let 替代 var
- 复用已有 showReportDialog 函数
- 添加 beforeSend UI 副作用设计说明注释
* 🐛 fix(sentry): 修复 SentryMock 缺失方法
- 添加 feedbackIntegration 和 replayIntegration 到 SentryMock
- 修复 CDN 加载失败时 TypeError
- 删除多余空行
* 🐛 fix(sentry): 修复代码质量问题
- sentry-loader.js 添加 replayIntegration 和 feedbackIntegration 配置
- sentry-loader.js 添加错误后自动弹窗逻辑(冷却机制 + try-catch)
- sentry-init.js 添加 showReportDialog try-catch 保护
- 弹窗延迟从 100ms 改为 500ms(弱网兼容)
* ✨ feat(sentry): 修复所有代码质量问题
- H1: CSP 添加 *.sentry.io 到 script-src(4 个文件)
- M1: Feedback Widget 和自动弹窗添加中文文案
- M2: 同步两套初始化路径配置(tracing、脱敏、ignoreErrors)
- M3: sentry-entry.js 添加 feedbackIntegration 导出
- M4: 新增专项测试(13 个测试用例)
- L1: SentryMock 补齐 showReportDialog/lastEventId
- L2: 空事件对象防御
* ✨ feat(sentry): 修复 PR 审查发现的全部问题
功能正确性:
- query_string 添加类型检查(字符串/对象兼容)
- 指纹计算移到脱敏前(避免不同错误被误判为重复)
- 冷却状态更新移到 setTimeout 内部(避免空转)
- subtitleLine2 改为 subtitle2(修正字段名)
CSP 修复:
- script-src 移除 *.sentry.io(减少攻击面)
- frame-src 添加 *.sentry.io(支持弹窗 iframe)
- 添加 worker-src/child-src blob:(支持 Session Replay)
- server.js helmet CSP 同步更新
- netlify.toml 注释与实际策略对齐
配置/架构:
- sentry-entry.js 添加 lastEventId 导出
- tracePropagationTargets 添加 CORS 风险注释
- CDN 架构添加说明注释
代码质量:
- URL 参数脱敏支持大小写不敏感
- 移除过宽的 ignoreErrors 规则
- 测试文件添加 use strict
- 添加 i18n 和漂移风险注释
* fix: apply CodeRabbit auto-fixes (#85)
Fixed 3 file(s) based on 5 unresolved review comments.
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
* ✨ feat(sentry): 修复新一轮审查意见
CSP 修复:
- script-src 恢复 *.sentry.io(showReportDialog 需要)
- netlify.toml Header CSP 同步 Cloudflare/Google
- server.js helmet CSP 同步
冷却竞态修复:
- 状态预留移到 setTimeout 之前(防止 500ms 内重复弹窗)
- 弹窗失败时回滚冷却状态
脱敏修复:
- query_string 对象分支改为大小写不敏感
- sanitizeQueryString 迭代改为安全模式(先收集键再遍历)
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
|
2026-06-24 19:04:38 +08:00 |
|
Abner
|
782f36e0ed
|
🐛 fix: 增强 QRCode 库加载时的全局变量类型检查
- 修改 `loadQRCodeLibrary` 函数中全局变量检测逻辑,从 `if (window.qrcode)` 改为 `typeof window.qrcode === 'function'`,防止非函数值污染导致逻辑错误
- 同步更新对 `window.QRCode` 的严格类型检查,确保大写字母变体的加载路径同样具备防护机制
- 优化错误提示信息,当库加载完成但全局变量不是函数时,明确抛出 `'global variable is not a function'` 错误便于排查
- 更新代码注释,说明引入严格类型检查的原因是为了兼容浏览器扩展或其他脚本可能覆盖全局变量的场景
|
2026-06-23 23:23:42 +08:00 |
|
Abner
|
6379bbef90
|
♻️ refactor: 移除外部二维码服务依赖,改用本地生成方案
- 将前端二维码生成从 `qrcode.show` 远程服务切换为 `qrcode-generator` 本地库(UMD 格式),消除对外部 CDN 渲染服务的依赖,降低隐私风险和第三方服务不可用时的故障点
- 重写 `generateQRCodeLocal` 函数适配 `qrcode-generator` API,使用 `qrcode(typeNumber, errorCorrectionLevel).addData().make().createDataURL()` 模式,并基于 QR 码模块数动态计算 `cellSize`,新增大尺寸预览图支持(400px)
- 移除所有页面中的 `qrcode.show` 域名引用,包括 CSP `connectSrc` 策略、preconnect 标签、resource-hints DNS 预解析配置及 Simyo/Giffgaff API 配置中的 `qrcode` 端点
- 完善二维码生成的日志与监控:在 CDN 加载成功后输出 `console.log`,本地/后端生成成功及失败时分别输出对应级别日志,并在 `trackQRCodeEvent` 中增加 `isBrowser` 守卫避免非浏览器环境报错
- 增加生成耗时和 QR 码长度(不含内容)到后端 BFF 日志,同时统一使用 `Date.now()` 计算请求耗时,避免 LPA 激活码等敏感信息进入日志
- 全面更新所有相关测试用例,适配新的 `window.qrcode` 工厂函数 mock,新增日志输出和 Sentry 上报断言,验证本地成功、本地失败降级、后端成功、后端失败四种场景的可观测性
|
2026-06-23 21:22:16 +08:00 |
|
Abner
|
1f001e36f1
|
🐛 fix: 修复 QR 码生成库 CDN 加载失败及全局变量检测问题
- 将 jsdelivr 源从 `qrcode@1.5.4/lib/browser.js`(CommonJS 格式,浏览器不可用)替换为 `qrcode-generator@1.4.4/qrcode.min.js`(UMD 格式,设置 `window.qrcode` 全局变量)
- 在 `loadQRCodeLibrary` 和 `loadSingleCDN` 中新增对 `window.qrcode`(小写)全局变量的检测,兼容 qrcode-generator 包的 UMD 导出方式
- 将 `payload?.success` 和 `payload?.error` 的可选链操作符替换为兼容写法 `payload && payload.success`,避免低版本环境语法不支持问题
- 更新注释说明,明确标注 jsdelivr 的 qrcode 包为 CommonJS 模块不适用于浏览器环境
|
2026-06-23 17:39:16 +08:00 |
|
Abner
|
511cfc793c
|
🐛 fix(qrcode): 修复 CDN 源 URL 全部 404,替换为已验证可用源
- jsdelivr 主源 build/qrcode.min.js 返回 404,改用 lib/browser.js
- 移除无效的 unpkg.zhimg.com 源
- 添加 bootcdn.net 中国镜像源(已验证 HTTP 200)
- 所有 3 个 CDN 源均已验证可用
|
2026-06-23 16:43:01 +08:00 |
|
Abner
|
9c2a5bb18d
|
🐛 fix: 兼容 Chrome 77 等旧浏览器,移除 ES2020 语法(可选链/空值合并)
- ESIM-TOOLS-G: 替换所有 ?. 和 ?? 为 ES5 兼容写法
- ESIM-TOOLS-15: 添加中国 CDN 源(unpkg.zhimg.com/bootcdn.net)
- 涉及 8 个文件,覆盖 giffgaff/simyo 全部业务模块
|
2026-06-23 16:35:05 +08:00 |
|
dependabot[bot]
|
04b77f59b8
|
build(deps-dev): bump @babel/core from 7.29.0 to 7.29.6 (#82)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.29.0 to 7.29.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.29.6/packages/babel-core)
---
updated-dependencies:
- dependency-name: "@babel/core"
dependency-version: 7.29.6
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
|
2026-06-23 12:32:02 +08:00 |
|
Neo Vern
|
e506906f75
|
Merge pull request #78 from Silentely/dependabot/npm_and_yarn/multi-a23dd1c932
build(deps): bump @opentelemetry/core and @sentry/node
|
2026-06-23 12:29:07 +08:00 |
|
dependabot[bot]
|
30f5def8b2
|
build(deps): bump undici from 7.24.1 to 7.28.0 (#80)
Bumps [undici](https://github.com/nodejs/undici) from 7.24.1 to 7.28.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.24.1...v7.28.0)
---
updated-dependencies:
- dependency-name: undici
dependency-version: 7.28.0
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
|
2026-06-23 12:28:28 +08:00 |
|
Neo Vern
|
f2f80359c3
|
Merge pull request #79 from Silentely/dependabot/npm_and_yarn/http-proxy-middleware-3.0.7
build(deps-dev): bump http-proxy-middleware from 3.0.5 to 3.0.7
|
2026-06-23 12:27:32 +08:00 |
|
dependabot[bot]
|
3019c0e89f
|
build(deps): bump form-data from 4.0.5 to 4.0.6 (#81)
Bumps [form-data](https://github.com/form-data/form-data) from 4.0.5 to 4.0.6.
- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v4.0.5...v4.0.6)
---
updated-dependencies:
- dependency-name: form-data
dependency-version: 4.0.6
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
|
2026-06-23 12:26:57 +08:00 |
|
Abner
|
a19264cc01
|
♻️ refactor: QR 码加载多源重试与超时优化,降低生成失败与 Sentry 噪音
- 前端二维码生成改为两级加载:优先复用 window.QRCode,未加载则按多 CDN 源顺序重试加载,避免单一 CDN 故障导致失败(ESIM-TOOLS-15)
- 重构 CDN 动态加载逻辑:为每个 CDN 加入 5s 超时与单源错误处理,确保 Promise 不会卡死,并在窗口全局缺失时正确清理失效脚本重试
- Netlify 函数二维码生成超时从 10s 提升到 15s,兼容冷启动与生成耗时波动,减少超时失败(ESIM-TOOLS-16)
- Sentry 噪音过滤补充 Google Tag Manager 相关域名/脚本与 `Unexpected token '<'` 等异常规则,降低监控告警干扰(ESIM-TOOLS-18)
|
2026-06-23 12:19:57 +08:00 |
|
dependabot[bot]
|
f94269ecd3
|
build(deps-dev): bump http-proxy-middleware from 3.0.5 to 3.0.7
Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 3.0.5 to 3.0.7.
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v3.0.7/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v3.0.5...v3.0.7)
---
updated-dependencies:
- dependency-name: http-proxy-middleware
dependency-version: 3.0.7
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
|
2026-06-20 10:31:01 +00:00 |
|
dependabot[bot]
|
943901a567
|
build(deps): bump @opentelemetry/core and @sentry/node
Bumps [@opentelemetry/core](https://github.com/open-telemetry/opentelemetry-js) to 2.8.0 and updates ancestor dependency [@sentry/node](https://github.com/getsentry/sentry-javascript). These dependencies need to be updated together.
Updates `@opentelemetry/core` from 2.5.1 to 2.8.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-js/compare/v2.5.1...v2.8.0)
Updates `@sentry/node` from 10.39.0 to 10.58.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.39.0...10.58.0)
---
updated-dependencies:
- dependency-name: "@opentelemetry/core"
dependency-version: 2.8.0
dependency-type: indirect
- dependency-name: "@sentry/node"
dependency-version: 10.58.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
|
2026-06-17 16:02:37 +00:00 |
|
Abner
|
22db18f831
|
Merge pull request #77 from Silentely/dependabot/npm_and_yarn/esbuild-0.28.1
build(deps-dev): bump esbuild from 0.25.12 to 0.28.1
|
2026-06-15 21:32:23 +08:00 |
|
Abner
|
c8ea3005ab
|
🎨 style: 修复 README 列表中 emoji 前缀格式一致性
- 为 Giffgaff 和 Simyo 用户适用场景中的每个列表项统一添加 `- ` 前缀,使格式与同级内容保持一致
- 同步更新 `README.md` 和 `README_EN.md` 中英文版本的列表格式,确保同一结构在两份文档中完全对齐
- 移除之前两行之间的冗余空行合并,规范列表项间距,提升 Markdown 渲染兼容性
|
2026-06-14 14:37:11 +08:00 |
|
Abner
|
3c38176efd
|
📝 docs: 优化 README 文档结构与内容展示方式
- 将新用户优惠区块从文档末尾移至功能介绍下方,提升新用户引导的可见性和位置合理性
- 移除界面预览图片的 `<details>` 折叠包裹,改为直接展示,方便用户快速浏览项目界面
- 将语言切换链接从纯文本 emoji 改为带国旗图标的超链接形式,提升可点击性和视觉辨识度
- 精简数据安全 FAQ 描述,统一表述风格,使内容更加简洁清晰
- 调整许可证和免责声明部分的排版格式,增加贡献者公约章节,完善文档合规性
|
2026-06-13 22:29:20 +08:00 |
|
Abner
|
07e048679f
|
🐛 fix: 修复 Google Tag Manager 脚本标签重复闭合导致的加载错误
- 移除 index.html 中 Google gtag.js script 标签末尾多余的 `</script>`,避免 DOM 结构异常
- 保留原有 `defer`、`src`、`crossorigin` 配置,确保延迟加载逻辑不被破坏
- 删除冲突的属性 `integrity` 相关内容,配合当前实际加载方式恢复正常请求行为
|
2026-06-13 22:14:21 +08:00 |
|
Abner
|
0b6103a96a
|
♻️ refactor: 提取通知系统初始化代码为独立模块
- 新增 `src/js/init-notification.js` 模块,将原本内联在 HTML 中的通知系统初始化逻辑独立封装,便于维护和测试
- 在 `index.html` 中移除内联的 `<script type="module">` 代码块,改用 `<script>` 标签引用新模块,保持 DOM 加载后自动初始化行为不变
- 调整内容安全策略(CSP),移除无用的 `sha256-*` 哈希值,同时添加 `fonts.googleapis.com` 和 `fonts.gstatic.com` 以支持网络字体加载,提升资源兼容性
- 保持功能完全一致,仅进行代码结构重组和 CSP 规则细化,不引入任何新功能或逻辑变更
|
2026-06-13 22:03:06 +08:00 |
|
Abner
|
8bd2bdb8a4
|
♻️ refactor: 提取初始化脚本为独立模块并清理过时架构文档
- 将 giffgaff 和 Simyo 页面的国际化初始化内联脚本提取为独立的 `init-i18n.js` 模块
- 将通知系统初始化内联脚本提取为独立的 `init-notification.js` 模块
- 移除 docs 目录下的 ARCHITECTURE.md 和 FUTURE_ARCHITECTURE.md 过期架构文档
- 更新 giffgaff_modular.html 和 simyo_modular.html 以引用新的独立脚本模块
|
2026-06-13 21:58:09 +08:00 |
|
Abner
|
3eb8550631
|
📝 docs: 精简用户文档并移除冗余技术参考
- 精简 README.md/README_EN.md 技术架构部分(-74%)
- 移除详细技术栈列表(Webpack、Babel、Jest 等)
- 改为 6 个用户友好的特性卖点
- 保留开发者文档引导链接
- 修复中英文切换链接(添加 ./ 前缀)
- 更新 docs/CLAUDE.md 文档索引(根据实际存在文件)
- 移除冗余技术参考文档
- 删除 docs/ARCHITECTURE.md
- 删除 docs/FUTURE_ARCHITECTURE.md
- 删除 docs/reference/ 目录(4 个文件)
- 删除 docs/guides/CORS_SOLUTION.md
- 删除 docs/fixes/ 目录(3 个文件)
变更影响:
- 用户 README 更简洁,聚焦功能价值
- docs/ 目录仅保留必要的用户教程和开发者指南
- 文档定位更清晰(用户文档 vs 开发者文档)
|
2026-06-13 21:57:13 +08:00 |
|
Abner
|
83bfe204f6
|
🐛 fix: 修复对 process.env.NODE_ENV 的访问以避免在浏览器环境报错
- 在 `performance-monitor.js` 中增加 `typeof process !== 'undefined'` 前置检查,防止浏览器中 `process` 未定义导致引用错误
- 在 `logger.js` 中移除 `process.env?.NODE_ENV` 的可选链,改为直接访问 `process.env.NODE_ENV`,与已有的 `typeof process` 检查保持一致
- 统一两模块中对 `process` 的判断逻辑,提高代码在非 Node.js 环境下的稳健性
|
2026-06-13 21:25:25 +08:00 |
|
Abner
|
44b05221f7
|
♻️ refactor: 提取公共脚本为独立文件并移除内联 JS
- 将 Giffgaff 和 Simyo 页面中的内联 Bootstrap 错误守卫脚本提取为独立的 `bootstrap-guard.js` 文件,减少 HTML 体积并避免重复代码
- 将内联的入场动画(IntersectionObserver 滚动触发 `.reveal` 效果)提取为独立的 `reveal-animation.js` 文件,两个站点共用同一模块
- Giffgaff 页面中复制激活码和 SSN 按钮从 `onclick` 内联事件改为通过 `data-target` 属性与 `bindCopyCodeButtons` 方法绑定,支持安全上下文 Clipboard API 及降级方案
- 移除 `design-system.css` 和 `animations.css` 的 preload 预加载逻辑,改为直接引用静态样式表,简化 HTML 头部复杂度
- CSP 策略中将 `'unsafe-inline'` 从 Simyo 的 `script-src` 中移除,改用 hash 白名单替代,提升安全性
|
2026-06-13 21:23:03 +08:00 |
|
Abner
|
4286069759
|
✨ feat: 调整 Sentry 与 CSP 以满足更严格的安全策略
- 将内联 Sentry DSN 配置改为外链脚本(/src/js/sentry-config.js),避免 CSP 限制导致初始化失败
- 更新 index.html 的 Content-Security-Policy,新增脚本 hash 以允许必要的内嵌代码,同时保留对 Sentry/Google 等域的连接权限
- 移除 CSP 触发风险较高的 preload+onload 写法,改为直接加载 Bootstrap 与本地样式文件,确保样式在受限环境下可用
- README 与 README_EN 的语言切换入口顺序调整,统一中英文版本跳转位置以提升可读性
|
2026-06-13 21:13:54 +08:00 |
|
Abner
|
5779d53995
|
🐛 fix: 修复异步生成二维码前未清空旧容器导致的显示不一致问题
- 在调用 generateQRCode 前先清空旧二维码容器
- 防止异步生成期间旧二维码和新 LPA 字符串不一致
- 修复 Session 恢复或重试时可能扫描到错误二维码的问题
影响模块:
- src/giffgaff/js/modules/ui-controller.js (showESimResult)
- src/simyo/js/modules/ui-controller.js (showQRResult)
问题来源:Bot 代码审查 (coderabbitai + cubic-dev-ai) P2 级别问题
|
2026-06-13 20:36:32 +08:00 |
|
dependabot[bot]
|
8c779bbc03
|
build(deps-dev): bump esbuild from 0.25.12 to 0.28.1
Bumps [esbuild](https://github.com/evanw/esbuild) from 0.25.12 to 0.28.1.
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2025.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.12...v0.28.1)
---
updated-dependencies:
- dependency-name: esbuild
dependency-version: 0.28.1
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
|
2026-06-13 12:35:27 +00:00 |
|
Abner
|
7651972cab
|
Merge pull request #76 from Silentely/fix/qrcode-local-generation
fix: 修复 Session 恢复后二维码和 LPA 不显示的问题
|
2026-06-13 20:34:31 +08:00 |
|
Abner
|
51e50b62ff
|
🐛 fix: 修复 QR 码生成中的标签解构与错误处理问题,增强安全性
- 修复 `createQRCodeContainer` 函数中 `labels` 参数为 `undefined` 时导致解构崩溃的问题,添加默认空对象
- 简化 QR 码库加载逻辑,移除脚本已存在且加载完成时直接返回的冗余检查
- 移除 `showQRResult` 方法中冗余的 `.catch()` 处理,错误已由 `generateQRCode` 内部统一处理
- 在 Netlify 函数中创建 sanitizedError 对象,避免包含 LPA 字符串的错误信息泄露到 Sentry 日志
- 更新测试用例以匹配重构后的函数名和错误消息,并移除无效的 jest mock 配置
|
2026-06-13 20:15:23 +08:00 |
|
Abner
|
5450a0ddb5
|
✅ test: 增强二维码生成参数校验与错误处理测试,优化UI错误提示
- 为客户端 `generateQRCodeLocal` 增加非整数/越界size、非字符串data的输入校验测试用例
- 为后端 `qrcode-generate` 函数增加size整性、越界及非字符串data的测试用例
- 为后端 `qrcode-generate` 增加QRCode生成失败返回500的测试用例,并重构测试中Mock方式为全局Mock
- 在两个UI控制器移除废弃的 `qrTimeoutId` 字段,避免未捕获Promise拒绝并改用DOM API安全创建错误提示
- 前端 `generateQRCodeWithFallback` 增加后端超时(AbortError)和无效响应JSON的降级错误测试
|
2026-06-13 19:57:03 +08:00 |
|
Abner
|
0152277b4d
|
🐛 fix: 修复二维码生成 Promise 挂起、XSS 风险和 i18n 硬编码问题
- 修复 loadQRCodeLibrary Promise 永久挂起(Issue #75 根因)
- 检测已存在脚本标签,移除失效脚本并重新加载
- 添加 5 秒超时保护,防止 Session 恢复后二维码冻结
- 统一 cleanup 函数清理监听器和定时器
- 修复 XSS 风险
- 使用 DOM API 创建错误提示,避免 innerHTML 注入
- 移除模板字符串 ${t(...)} 直接注入
- 修复 i18n 硬编码
- createQRCodeContainer 接受 labels 参数支持多语言
- generateQRCode* 函数支持 labels 透传
- UIController 传入 tl() 翻译后的可访问性标签
- Schema 验证优化
- qrcode-generate 保留手动验证,确保 405 优先级
- 添加注释说明设计意图
- 代码规范
- tests/security/qrcode-generate.test.js 添加 'use strict'
✅ 测试: 8 passed, 0 failed
|
2026-06-13 19:43:50 +08:00 |
|
Abner
|
d694944e22
|
✨ feat(qrcode): 添加二维码生成监控指标
- 新增 trackQRCodeEvent() 函数统一上报事件
- 上报到 Sentry(失败事件)
- 上报到 window.__esimAnalytics(成功和失败)
- 追踪指标:
* 二维码生成成功率
* 本地生成 vs 后端降级比例
* 错误率和耗时
|
2026-06-13 19:31:35 +08:00 |
|
dosubot[bot]
|
0a6473c2a2
|
docs: Dosu updates for PR #76
|
2026-06-13 11:27:07 +00:00 |
|
Abner
|
f5c5dee5ab
|
🐛 fix: 修复 Session 恢复后二维码和 LPA 不显示的问题
问题:
- 用户完成 eSIM 激活后,因外部二维码服务不可用导致页面空白
- Session 恢复时未调用 showESimResult() 显示二维码和 LPA 信息
解决方案:
1. 新增通用二维码生成模块 (src/js/modules/qrcode-generator.js)
- 实现三层降级策略:本地 CDN → 后端 Function → 文本提示
- 消除对外部服务的依赖,提升隐私保护
2. 新增后端 Function (netlify/functions/qrcode-generate.js)
- POST /bff/qrcode-generate 接口
- 返回 base64 编码的 PNG 二维码
- withAuth 中间件保护 + 输入验证
3. 重构前端二维码生成逻辑
- Giffgaff/Simyo 统一使用 generateQRCodeWithFallback()
- 保留并发调用防护和 tooltip 交互
- 使用 i18n 翻译替代硬编码错误提示
4. 修复 Session 恢复逻辑
- 在 handleSessionRestore() 中调用 showESimResult()
- 确保刷新页面后二维码和 LPA 正常显示
技术改进:
- 懒加载 qrcode.js(~13KB gzip),仅在首次调用时加载
- 完整的测试覆盖(前端单元测试 + 后端安全测试)
- 更新 BFF 路由配置(Edge Function + 本地开发服务器)
Closes #75
|
2026-06-13 19:20:22 +08:00 |
|
Abner
|
4a7e842d40
|
🐛 fix: 修复 giffgaff session 恢复后 LPA 和二维码不显示的问题(Issue #75)
- `showESimResult` 中移除 `!state.lpaString` 的提前返回,即使 lpaString 为空也显示结果容器,确保用户看到明确的错误提示和可能的排查信息
- 在 session 恢复流程(`giffgaff-app.js`)中显式调用 `uiController.showESimResult()`,使刷新页面后能正确显示二维码和 LPA 字符串,而不再跳过关键渲染步骤
- 为 `showESimResult` 添加完整的 try-catch 包裹及防御性 DOM 元素校验,在二维码生成失败时降级显示错误提示,避免页面静默失败
- 新增 i18n 键 `giffgaff.app.error.lpaStringMissing`(中英文),用于替代硬编码的错误文案,保持国际化一致性
- 新增 `tests/giffgaff/session-restore-lpa.test.js`,覆盖正常 LPA 展示、空 lpaString 错误降级、二维码生成、状态不一致降级以及延迟显示等场景
|
2026-06-12 23:54:05 +08:00 |
|
Abner
|
2ff08dafae
|
🐛 fix: 扩展注入 require 到纯 ES Module 环境的异常过滤
- 在 sentry-loader 的噪音过滤规则中新增 `require is not defined` 的正则匹配
- 专门针对浏览器扩展将 CommonJS `require` 注入纯 ES Module 环境导致的报错提示进行降噪
- 保持原有已知浏览器噪音与第三方噪音规则不变,避免影响其他错误捕获
- 仅增加过滤项,降低对现有 Sentry 上报链路的改动范围
|
2026-06-11 09:22:40 +08:00 |
|
Abner
|
af2b024d99
|
📝 docs: 补充表单占位符及卡片的 i18n 翻译条目
- 为 DOM_TRANSLATIONS 新增多个表单输入框的 `placeholder` 属性翻译选择器,包括邮箱验证码、短信验证码、回调 URL、Cookie、手动激活码和 SSN 输入框
- 为 DOM_TRANSLATIONS 新增 `.current-time-card`、`.step-indicator` 及多个步骤卡片的 `aria-label` 翻译选择器,提升无障碍访问支持
- 在中文和英文 TRANSLATIONS 对象中分别新增对应的 12 条翻译键值,涵盖表单占位符文案和卡片无障碍标签
- 新增日语区段的留空占位结构,保持与中英文结构一致性(已通过 MASKED_FALLBACK 处理)
|
2026-06-08 18:39:23 +08:00 |
|
Abner
|
37923b523f
|
🎨 style: 更新 eSIM 激活文案以更准确描述流程
- 调整“短信验证码校验成功”的提示语,将“开始自动预订与激活”改为“正在自动更换 SIM 卡”,提升流程描述一致性
- 更新英文文案中“预订空 eSIM”部分的表述结构为“Reserves an empty eSIM”,使含义更明确
- 保持中文“实体卡转 eSIM 或设备更换…手动前往官网确认激活”的原文不变,仅对英文翻译与相关状态文案进行精修
- 影响范围限定在 i18n 数据文件内的文本替换,不涉及业务逻辑改动
|
2026-06-08 18:19:27 +08:00 |
|
Abner
|
e669b96f28
|
📝 docs: 完善 CLAUDE.md 检索指南并更新激活方式描述文案
- 在 CLAUDE.md 中新增基础检索章节,明确交叉验证策略、工具调用顺序、使用场景优先级及参数调优指南
- 新增网络检索章节,定义 smart-search-cli 工具路由矩阵、执行策略、错误恢复机制和核心约束
- 更新手动激活和短信验证码激活的中文及英文描述文案,明确说明适用场景为实体卡转 eSIM 或设备更换
- 同步更新 i18n-data.js 和 giffgaff_modular.html 中的对应文案,保持中英文翻译一致
|
2026-06-08 18:11:16 +08:00 |
|
Abner
|
5d77272f92
|
🐛 fix: 过滤 Sentry 中的钱包扩展序列化噪音
- 在 `beforeSend` 中新增对 `event.extra.__serialized__` 的检查,补充拦截非 `Error` 类型 rejection 被 SDK 序列化后的原始内容
- 通过统一的扩展关键词匹配逻辑识别钱包扩展相关噪音,避免仅依赖 `exception.value` 导致漏过滤
- 分别在 `sentry-init` 和 `sentry-loader` 两条初始化链路中同步新增处理,保证不同加载方式下行为一致
- 记录被过滤事件的来源、截断后的消息内容和机制类型,便于后续排查与统计
|
2026-06-07 17:49:14 +08:00 |
|
Abner
|
274d825ae8
|
🔧 chore: 更新 AI 使用指引的上下文检索要求
- 将任务开始前的检索要求调整为必须同时调用 `mcp__ace-tool__search_context` 和 `mcp__fast-context__fast_context_search`,提升上下文确认的可靠性
- 明确两个检索工具需要交叉对比结果并取交集作为有效上下文,减少单一检索带来的偏差
- 补充当两边结果不一致时的处理方式,要求进一步加深检索或调整查询词重新搜索
- 保留并顺延原有的 Giffgaff OAuth 说明,避免前端跳转地址与服务端环境变量的职责混淆
|
2026-06-05 17:08:51 +08:00 |
|
Abner
|
de0ca5b0df
|
✨ feat: 扩展关键词检测增强,兼容嵌套 reason 对象
- 在 sentry 事件处理流程中新增 `allReasonText` 收集逻辑,通过 `JSON.stringify(reason)` 获取嵌套错误对象的完整内容用于关键词检测
- 为 `JSON.stringify` 失败场景(如循环引用)增加降级方案:遍历 reason 的值并拼接字符串,尽量保留关键词覆盖范围
- 在 `message/stack` 检测失败后,增加对 `reason` 全量属性值的二次 `includesExtensionKeyword` 判断,提升钱包扩展错误识别准确性
- 分别在 `src/js/sentry-loader.js` 与 `src/js/modules/sentry-init.js` 中同步实现,保证不同初始化/加载路径的行为一致
|
2026-06-02 23:22:59 +08:00 |
|
Abner
|
af98d0339a
|
Merge pull request #71 from Silentely/cv-main-gv6ncr
🐛 fix: 增强钱包扩展冲突检测 [skip ci]
|
2026-06-02 23:12:00 +08:00 |
|
Abner
|
8e6227e746
|
📝 docs: 为 giffgaff 和 simyo 模块新增 CLAUDE.md 文档并更新根目录索引
- 新增 `src/giffgaff/CLAUDE.md`(151 行),完整记录 Giffgaff 模块职责、模块结构、对外接口、OAuth PKCE 和 eSIM 激活数据模型、配置与状态结构
- 新增 `src/simyo/CLAUDE.md`(154 行),完整记录 Simyo 模块职责、模块结构、登录与设备更换流程、与 Giffgaff 模块的差异对比、配置与状态结构
- 更新根目录 `CLAUDE.md` 变更记录,新增 2026-06-02 增量扫描条目,修正构建脚本数量从 23 更新为 22
- 修复模块结构图中 giffgaff 和 simyo 节点的 click 链接,从 `MODULE_ARCHITECTURE.md` 重定向到新建的 `CLAUDE.md`
|
2026-06-02 23:06:48 +08:00 |
|