- 覆盖率 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)
7.9 KiB
7.9 KiB
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/window(jsdom 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引用导致的 ReferenceError(saveLocale/loadLocale/notifyLocaleListeners) - 删除残缺死代码:
styles.autoApplySystemTheme(无实际效果的占位实现)
Removed
- lint 零警告:
no-console规则关闭(库的错误报告依赖 console,生产构建已由 terserdrop_console剥离);catch 变量通过caughtErrorsIgnorePattern豁免
Added
- Gitea Actions 发布自动化:
publish.yml— 推送v*tag 时自动 测试+构建+发布到 Gitea npm registry(需配置PACKAGES_TOKENsecret) - 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 自动去重(更新已有实例而非重复弹出),支持 uninstalldragThreshold配置项:拖拽关闭阈值可配置(默认 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.jsonESLint 配置.gitea/workflows/ci.ymlCI 工作流CHANGELOG.md
Removed
babel.config.jstypes/目录
[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 类型声明
- 零依赖