Files
eSIM-Tools/.gitignore
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

125 lines
1.3 KiB
Plaintext

# Dependencies
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Coverage directory used by tools like istanbul
coverage/
*.lcov
# nyc test coverage
.nyc_output
# Dependency directories
jspm_packages/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
.env.production
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
dist
# Storybook build outputs
.out
.storybook-out
# Temporary folders
tmp/
temp/
# Logs
logs
*.log
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
.serena
.ace-tool/
.omc/
.omx/
# Build outputs
build/
dist/
# Netlify
.netlify/
# Development files
*.bak
*.orig
*.tmp
docs/superpowers/
.sdd/
# Editor files
*.sublime-project
*.sublime-workspace
# Local development
.env.local
.env.development
.env.test
# Postman
postman/
# Claude Code 本地配置
.claude/
# Gemini 剪贴板临时文件
.gemini-clipboard/
#context
.context/