Files
MetonaToast/CHANGELOG.md
T
tianhao 1f718c4ef8 release: v0.5.0 — 覆盖率96.42%达标、lint零警告、覆盖率门禁、CI强化、发布自动化
- 覆盖率 96.42%(行):新增 59 测试共 385 个,覆盖 DOM 交互事件、对话框按钮交互、Intl/localStorage 异常路径、React 渲染生命周期
- 测试环境重构:SSR 分支用 defineProperty 真正覆盖 document/window;新增 tests/dom.test.ts、tests/setup.ts
- jest 覆盖率门禁 lines >= 95%;CI lint 改必过;新增 publish.yml(v* tag 自动发布到 Gitea registry)
- 修复:Toast.off 空数组残留、Toast.on 取消函数 this 绑定、action close:false 冒泡关闭、use() 重复注册钩子、i18n catch 引用错误
- 删除死代码 autoApplySystemTheme;lint 零警告(no-console 策略 + caughtErrorsIgnorePattern)
2026-08-08 15:02:51 +08:00

125 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
All notable changes to MetonaToast will be documented in this file.
## [0.5.0] - 2026-08-08
### Changed
- **覆盖率 96.42%(行)**:新增 59 个测试用例(共 385),覆盖 DOM 交互事件(click/drag/hover/animation)、confirm/prompt/action 按钮交互、Intl/localStorage 异常路径、React 渲染生命周期
- **测试环境重构**:SSR 分支测试用 `Object.defineProperty` 真正覆盖 document/windowjsdom getter 使此前赋值无效);新增 `tests/dom.test.ts`(jsdom 真实 DOM 事件驱动)、`tests/setup.ts`TextEncoder 补丁)
- **jest 覆盖率门禁**`lines >= 95%`,未达标测试即失败
### Fixed
- **`Toast.off` 空数组残留**:移除全部钩子后删除 Map key(此前空数组残留导致 `_hooks.has()` 误报 true
- **`Toast.on` 返回的取消函数 this 绑定**:改用类名引用,任意调用上下文可用
- **action 按钮 `close:false` 失效**:按钮 click 冒泡到 toast 的 closeOnClick 处理器导致总是关闭,已 stopPropagation 修复
- **`use()` 重复注册钩子**accessibility/persistence 预设的钩子注册改为防重复(先卸载旧钩子),并在插件 `uninstall` 中一并清理
- **i18n catch 引用错误**`catch {}` 中残留 `e` 引用导致的 ReferenceErrorsaveLocale/loadLocale/notifyLocaleListeners
- **删除残缺死代码**`styles.autoApplySystemTheme`(无实际效果的占位实现)
### Removed
- **lint 零警告**`no-console` 规则关闭(库的错误报告依赖 console,生产构建已由 terser `drop_console` 剥离);catch 变量通过 `caughtErrorsIgnorePattern` 豁免
### Added
- **Gitea Actions 发布自动化**`publish.yml` — 推送 `v*` tag 时自动 测试+构建+发布到 Gitea npm registry(需配置 `PACKAGES_TOKEN` secret
- **CI 强化**lint 改为必过(移除 continue-on-error);测试命令带覆盖率门禁
## [0.4.0] - 2026-08-08
### Added
- **React 适配器子包**`@metona-team/metona-toast/react``useToast()` hook(组件卸载时自动移除本组件创建的 Toast)+ 声明式 `<Toast />` 组件(props 变化更新、卸载自动清理)。主包保持零依赖,`react` 为 optional peerDependency
- **`dedupe` 预设插件**:相同 type+message 的 Toast 自动去重(更新已有实例而非重复弹出),支持 uninstall
- **`dragThreshold` 配置项**:拖拽关闭阈值可配置(默认 120px,原为硬编码)
- **RTL 完整适配**:容器设置 `dir="rtl"`,进度条/side 条/类型色条/圆角正确镜像
- **`update({ duration })` 支持**:动态变更显示时长并自动重启/停止计时器(此前 update 忽略 duration
- **幽灵实例修复**`_emit` 检查 `create()` 结果,beforeShow 拦截后的 toast 不再注册到 `_toasts`(此前会残留幽灵记录,影响 count 与去重类插件)
### Changed
- **loading 链式转换 id 稳定**`loading.success/error/info/warning` 由"关闭旧 + 新建"改为原地 `update()` 同一实例,返回的 Toast id 与 loading id 一致;转换后 duration 自动恢复默认值(自动关闭)。注:转换不再产生新的入场动画,改为平滑更新;关闭按钮/进度条保持 loading 配置(如需默认外观,请通过 opts 覆盖)
## [0.3.0] - 2026-08-08
### Fixed
- **自定义动画真实生效**`animations.register()` 注册的动画此前仅写入内存 Map,实际渲染始终 fallback 到 slide。现在注册表驱动 `_buildClassName` 并动态注入对应 `@keyframes` + 类规则,README 的注册教程名实相符
- **`max` 超限真正关闭最早的 toast**:此前超限时仅从内存 Map 删除记录,DOM 上的旧 toast 依然显示。现在通过实例注册表找到最早的 toast 并真正 `close()`(触发离场动画与生命周期回调)
- **`destroy()` 全量清理**:新增清理 `Toast._hooks` 钩子、`Toast._registry` 实例注册表、`metona-toast-theme-css` / `metona-toast-custom-styles` / `metona-toast-anim-styles` 样式标签;动画注册表改为真正清空
- **`applyThemeVariables` 重复注入**:修复多次调用追加相同 id 的 style 标签问题(改为先移除旧元素)
- **`init()` 复活**`destroy()` 后调用 `init()` 重置 `_destroyed` 标志,恢复可初始化状态
- **失效脚本清理**:删除 `docs`typedoc 未安装)、`example`(examples/ 目录不存在)脚本,新增 `serve` 脚本
- **`AnimationConfig.enter/leave` 类型放宽**:支持 `opacity: 0` 等数值属性(此前仅 `string`,README 示例在 TS 严格模式下报错)
### Added
- **钩子系统完整化**:此前 `HOOK_NAMES` 声明 20+ 钩子但多数永不触发。现在全部声明均有触发点:
- 拦截语义:`beforeClose` / `beforeUpdate` 返回 `false` 可分别阻止关闭、更新
- 新触发点:`click` / `hover` / `dragStart` / `dragEnd` / `animationStart` / `animationEnd` / `progressStart` / `progressEnd` / `configChange` / `themeChange` / `localeChange` / `beforeInit` / `afterInit` / `beforeDestroy` / `afterDestroy`
- **`init({ plugins })` 支持插件对象**:与 `use()` 一致,可传 `string | Plugin`
### Changed
- **VERSION 唯一来源**:版本号统一在 `src/constants.ts` 维护,`api.ts` / `index.ts` 引用,消除三处硬编码漂移
- **`HOOK_NAMES` 收敛**:移除永不触发的 `progressUpdate` / `custom` 声明
- 版本升级至 **v0.3.0**(含行为增强,按 semver minor 处理)
## [0.2.1] - 2026-07-25
### Fixed
- **`auto` 主题配置死值**`THEMES.auto` 改为合法 CSS 值(复用 light 默认值),避免 `getThemeConfig('auto')` 返回无意义字符串
- **`resolveTheme` 循环逻辑**`resolveTheme('auto')` 始终检测系统主题,不再依赖 `currentTheme` 全局状态
- **`formatList` 国际化**:优先使用 `Intl.ListFormat`,降级到逗号拼接,支持各语言原生列表格式
- **RTL 容器定位**RTL 语言自动翻转 left/right 位置,容器创建时正确适配
- **`_containerCache` 泄露**`index.ts``destroy()` 中增加 `_containerCache.clear()`,与 `api.ts` 保持一致
### Changed
- **代码去重**:消除 `index.ts``api.ts` 之间 11 个方法的重复定义,统一在 `api.ts` 实现
- **Toast 回调注入**`Toast._onError` / `Toast._removeToast` 改为 `Toast.setCallbacks()` 静态方法,消除隐式契约
- **Stub 方法替换**`api.ts` 中 7 个 stub 方法替换为完整实现(init/use/destroy/getStatus/getConfig/updateConfig/resetConfig
- **ESLint 规则**:新增 `@typescript-eslint/no-explicit-any` (warn) 和 `prefer-const` (warn)
### Added
- **`beforeShow` 拦截**:钩子函数返回 `false` 可阻止 Toast 显示;配置 `onBeforeShow` 回调支持同样能力
- **`updatePosition()` 方法**:允许运行时移动 Toast 到不同位置容器
- **`remove()` + `removeToast()` 方法**:立即移除 Toast(不触发离场动画),提供无动画的快速清除 API
## [0.2.0] - 2026-07-25
### Changed
- **TypeScript 源码重构**:全部源码从 JavaScript 迁移到 TypeScript
- 删除手动维护的 `types/index.d.ts`,类型由源码自动生成
- `core.js` (1244行) 拆分为 `toast.ts` + `api.ts` + `templates.ts`
- 构建工具链:Babel → `ts-jest`,新增 `@rollup/plugin-typescript`
- 测试迁移至 TypeScript (`tests/index.test.ts`)
### Added
- `tsconfig.json` (strict: true)
- `src/types.ts` 核心类型模块
- `.eslintrc.json` ESLint 配置
- `.gitea/workflows/ci.yml` CI 工作流
- `CHANGELOG.md`
### Removed
- `babel.config.js`
- `types/` 目录
## [0.1.2] - 2026-07-24
### Fixed
- 补全和修正 TypeScript 类型声明
- 全面修复、优化与增强
## [0.1.1] - 2026-07-23
### Changed
- 版本号重置,更新文档页面
## [0.1.0] - 2026-07-22
### Added
- 初始发布
- 107 种内置图标
- 11 种动画效果
- 4 种主题(light/dark/auto/warm
- 国际化支持 (zh-CN/en-US)
- 插件系统 (keyboard/persistence/accessibility)
- 拖拽关闭、进度条、倒计时等高级特性
- TypeScript 类型声明
- 零依赖