-
Notifications
You must be signed in to change notification settings - Fork 11
test(): fix test error reporting #4828
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: v3
Are you sure you want to change the base?
Conversation
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. Walkthrough在运行时多处引入统一的 Dispose 清理函数模式:mountTree、bindListeners、DataStore.onChange 等改为返回可调用的 disposer,相关调用方保存并在卸载或重定向时调用;接口和类型同步新增 Changes
Estimated code review effort🎯 3 (中等) | ⏱️ ~20-30 分钟 需特别关注:
Pre-merge checks and finishing touches❌ Failed checks (3 warnings)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro Cache: Disabled due to data retention organization setting Knowledge base: Disabled due to data retention organization setting 📒 Files selected for processing (8)
🚧 Files skipped from review as they are similar to previous changes (1)
🧰 Additional context used🧬 Code graph analysis (4)packages/runtime/src/internal/Router.ts (3)
packages/runtime/src/internal/data/DataStore.ts (2)
packages/runtime/src/internal/RendererContext.ts (1)
packages/runtime/src/internal/bindListeners.ts (2)
🪛 GitHub Actions: CIpackages/runtime/src/internal/Router.ts[error] 1-1: Lifecycle script 'docs:build' failed. Command 'api-extractor run' exited with code 1. API Extractor completed with warnings (e.g., API signature changes). packages/runtime/src/internal/data/DataStore.ts[error] 1-1: Lifecycle script 'docs:build' failed. Command 'api-extractor run' exited with code 1. API Extractor completed with warnings (e.g., API signature changes). packages/runtime/src/internal/RendererContext.ts[error] 1-1: Lifecycle script 'docs:build' failed. Command 'api-extractor run' exited with code 1. API Extractor completed with warnings (e.g., API signature changes). packages/runtime/src/internal/bindListeners.ts[error] 1-1: Lifecycle script 'docs:build' failed. Command 'api-extractor run' exited with code 1. API Extractor completed with warnings (e.g., API signature changes). ⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
🔇 Additional comments (10)
Tip 📝 Customizable high-level summaries are now available in beta!You can now customize how CodeRabbit generates the high-level summary in your pull requests — including its content, structure, tone, and formatting.
Example instruction:
Note: This feature is currently in beta for Pro-tier users, and pricing will be announced later. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (2)
packages/runtime/src/createRoot.ts (1)
22-26: 建议在二次 render 前也调用上一次的 disposeMount当前只在
unmount()里调用disposeMount?.(),多次调用render()时,上一次mountTree的 disposer 会被新的覆盖而从未执行,虽然 DOM 已被unmountTree(container)清空,但某些监听可能仍持有跨 DOM 引用或外部资源。可以考虑在每次新渲染前先释放上一次的 disposer,例如:
async render( /* ... */ ) { if (unmounted) { throw new Error( "The root is unmounted and cannot be rendered any more" ); } + // 先清理上一轮的 mount + if (disposeMount) { + disposeMount(); + disposeMount = undefined; + } const bricks = ([] as BrickConf[]).concat(brick); // ... - disposeMount = mountTree(renderRoot); + disposeMount = mountTree(renderRoot);这样行为与 Router 的清理逻辑更一致,避免长生命周期 root 在频繁 render 场景下潜在的资源残留。
Also applies to: 114-116, 261-262, 291-293
packages/runtime/src/internal/interfaces.ts (1)
208-209: Dispose 类型别名定义清晰,可考虑后续统一使用
- 新增
export type Dispose = () => void;让各处清理函数有了统一类型,便于复用(mountTree、bindListeners、DataStore 等已依赖该别名)。- 目前接口内仍有
disposes?: (() => void)[];这样的写法,后续可以视情况逐步替换为Dispose[]提升可读性和一致性,但不是现在必须要改。
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Cache: Disabled due to data retention organization setting
Knowledge base: Disabled due to data retention organization setting
📒 Files selected for processing (8)
packages/runtime/src/createRoot.ts(4 hunks)packages/runtime/src/internal/Router.ts(4 hunks)packages/runtime/src/internal/bindListeners.spec.ts(3 hunks)packages/runtime/src/internal/bindListeners.ts(2 hunks)packages/runtime/src/internal/data/DataStore.ts(7 hunks)packages/runtime/src/internal/interfaces.ts(1 hunks)packages/runtime/src/internal/mount.ts(4 hunks)packages/runtime/src/internal/secret_internals.ts(5 hunks)
🧰 Additional context used
🧬 Code graph analysis (5)
packages/runtime/src/createRoot.ts (2)
packages/runtime/src/internal/interfaces.ts (1)
Dispose(209-209)packages/runtime/src/internal/mount.ts (1)
mountTree(17-141)
packages/runtime/src/internal/bindListeners.ts (1)
packages/runtime/src/internal/interfaces.ts (1)
Dispose(209-209)
packages/runtime/src/internal/mount.ts (2)
packages/runtime/src/internal/interfaces.ts (2)
Dispose(209-209)RuntimeBrickElement(113-120)packages/runtime/src/internal/bindListeners.ts (1)
bindListeners(45-74)
packages/runtime/src/internal/data/DataStore.ts (1)
packages/runtime/src/internal/interfaces.ts (1)
Dispose(209-209)
packages/runtime/src/internal/Router.ts (2)
packages/runtime/src/internal/interfaces.ts (1)
Dispose(209-209)packages/runtime/src/internal/mount.ts (1)
mountTree(17-141)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (5)
packages/runtime/src/internal/secret_internals.ts (1)
39-40: useBrick 的 Dispose 接入整体合理
- 引入
Dispose类型并在MountUseBrickResult中强制要求dispose字段,使mountUseBrick/unmountUseBrick生命周期和 Router/createRoot 保持一致。unmountUseBrick先调用mountResult.dispose()再卸载 portal 与rendererContext,清理顺序也符合预期。Also applies to: 134-138, 153-167, 170-178
packages/runtime/src/internal/Router.ts (1)
42-46: Router 中新增的 Dispose 流程设计合理
- 通过
disposeMount?: Dispose配合cleanUpPreviousRender在每次新渲染前主动执行上一次mountTree的清理函数,之后再unmountTree(main/portal),可以避免事件监听、订阅等资源在路由切换间累积。- 错误页分支同样用
disposeMount = mountTree(renderRoot);,确保后续再次渲染时也能统一释放。Also applies to: 380-385, 554-556, 614-615
packages/runtime/src/internal/bindListeners.spec.ts (1)
676-689: 针对 event. 的 consoleError mock 调整是合理的*
- 在
event.preventDefault/event.stopPropagation以及 “non-Event object” 三个用例中显式mockReturnValue并在断言后mockReset,可以避免控制台噪声,也让这些用例对console.error的依赖范围更清晰可控。- 不影响原有断言语义,整体测试可读性和隔离性都有提升。
Also applies to: 691-723
packages/runtime/src/internal/mount.ts (1)
7-11: mountTree 返回 Dispose 的实现与监听绑定逻辑匹配良好
- 通过
const disposables: Dispose[] = []收集每个bindListeners返回的清理函数,并在返回的总 disposer 中统一执行,保证所有事件监听在上层调用dispose()时被正确移除。setTimeout中恢复window.DISABLE_REACT_FLUSH_SYNC的逻辑保持不变,签名从void改为Dispose对现有调用者(Router/createRoot/useBrick)是向后兼容的增强。Also applies to: 17-21, 25-26, 61-63, 135-140
packages/runtime/src/internal/bindListeners.ts (1)
28-32: bindListeners 返回 Dispose 的实现清晰且易于与 mountTree 集成
- 当无事件配置时直接返回一个 noop
Dispose,避免调用方做额外判空。- 为每个
addEventListener创建对应的移除函数并收集到disposables中,最终由总的 disposer 统一执行,外部(如mountTree)只需持有并调用一次即可完成全部解绑。- 这种“返回清理函数”的模式比之前依赖 element 内部状态(如
$$listeners)更可预测,也更便于测试。Also applies to: 45-52, 54-55, 63-65, 68-73
| Dispose, | ||
| RouteNode, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
disposableMap 中重复存储同一 Dispose,可能导致长期悬挂引用
目前同一个 Dispose 会被存储两次:
onChange(dataName, listener)内部调用this.addDisposable(dataName, disposable);(key 为依赖名dataName)。dataConf.track分支中再次调用this.addDisposable(dataConf.name, disposable);(key 为当前 data 名)。
在路由销毁逻辑中,disposeDataInRoutes 只按将要删除的 data 名(来自 routeMap)去查询 disposableMap.get(name) 并执行其中的 disposables,然后删除该 key。这样会产生两个问题:
- 对于作为“依赖”的 data(例如全局 CTX),其 key 下的
Dispose[]永远不会被disposeDataInRoutes删除,即使这些Dispose已经在以dataConf.name为 key 的数组中被执行过,仍然会在disposableMap中保留,持有闭包引用,长期运行有内存上涨风险。 - 同一个
disposable被存入两个数组,遇到同时销毁依赖和被依赖 data 的场景时会被调用两次(虽然 DOM/EventTarget 层面是幂等的,但这是不必要的重复工作,也让状态变得更难推理)。
建议把“订阅登记”和“所有者”解耦,避免重复存储同一个 Dispose,比如采取更简单的策略:
-
让
onChange仅负责注册监听并返回Dispose,不在内部调用addDisposable:onChange(dataName: string, listener: EventListener): Dispose { const eventTarget = this.data.get(dataName)?.eventTarget; eventTarget?.addEventListener(this.changeEventType, listener); -
const disposable = () => {
- const disposable = () => {
eventTarget?.removeEventListener(this.changeEventType, listener);
};
- this.addDisposable(dataName, disposable);
return disposable;
}
- 由真正需要 route 级自动清理的调用方(如 `dataConf.track` 那段)根据“拥有者”名字显式调用 `addDisposable(dataConf.name, disposable)`,避免再按依赖名重复登记。
如果确实有其它地方依赖“按依赖名自动登记”的行为,也可以考虑为 `onChange` 增加一个可选 ownerName 参数,仅以 ownerName 作为 `disposableMap` 的 key 来管理清理。
Also applies to: 75-76, 365-373, 545-563, 586-593, 603-612
<!-- fingerprinting:phantom:poseidon:olive -->
<!-- This is an auto-generated comment by CodeRabbit -->
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This pull request refactors the runtime's resource cleanup mechanism by introducing a Dispose pattern for managing event listeners and other disposable resources. The changes improve memory management and lifecycle handling by ensuring proper cleanup of event listeners when components are unmounted or routes change.
Key changes:
- Introduced
Disposetype and refactored event listener binding to return cleanup functions - Modified
mountTreeto collect and return all disposables for later cleanup - Updated
DataStoreto track and dispose event listeners associated with data items
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/runtime/src/internal/interfaces.ts | Added Dispose type definition and removed unused $$eventListeners and $$listeners properties |
| packages/runtime/src/internal/bindListeners.ts | Refactored bindListeners to return a dispose function instead of storing listeners on elements |
| packages/runtime/src/internal/mount.ts | Modified mountTree to collect disposables and return cleanup function |
| packages/runtime/src/internal/secret_internals.ts | Updated mountUseBrick to propagate dispose function through mount result |
| packages/runtime/src/internal/data/DataStore.ts | Added disposable tracking for data change listeners with cleanup in route disposal |
| packages/runtime/src/internal/Router.ts | Added dispose function storage and invocation in cleanup flow |
| packages/runtime/src/createRoot.ts | Added dispose function storage and invocation in unmount flow |
| packages/runtime/src/internal/bindListeners.spec.ts | Fixed test error reporting by mocking console.error |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| !load && (newData.deps = [...deps]); | ||
| for (const dep of deps) { | ||
| this.onChange( | ||
| const disposable = this.onChange( |
Copilot
AI
Nov 26, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[nitpick] The variable name disposable is inconsistent with the naming in the onChange method which also uses disposable. Consider renaming this to depDisposable or dependencyDisposable to clarify it's a disposable for a dependency listener, distinguishing it from the general disposable in the onChange method.
| if (disposables) { | ||
| for (const disposable of disposables) { | ||
| disposable(); | ||
| } |
Copilot
AI
Nov 26, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The disposables array cleanup is missing. After calling all dispose functions, the array should be cleared (e.g., disposables.length = 0) before deleting the map entry, similar to the pattern used in bindListeners.ts:72 and mount.ts:139. While the map entry is deleted, this could leave dangling references if the array is still referenced elsewhere.
| } | |
| } | |
| disposables.length = 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Cache: Disabled due to data retention organization setting
Knowledge base: Disabled due to data retention organization setting
📒 Files selected for processing (1)
etc/runtime.api.md(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: build (20.x)
- GitHub Check: Analyze (javascript-typescript)
| // Warning: (ae-forgotten-export) The symbol "Dispose" needs to be exported by the entry point index.d.ts | ||
| // | ||
| // (undocumented) | ||
| dispose: Dispose; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Script executed:
#!/bin/bash
# Find the entry point file for the runtime package
find . -path "*/packages/runtime/*" -type f \( -name "index.ts" -o -name "index.d.ts" \) | head -10Repository: easyops-cn/next-core
<shell_result>
Repository: easyops-cn/next-core
Exit code: 0
stdout:
./packages/runtime/src/index.ts
</shell_result>
Script executed:
#!/bin/bash
# Read the entry point file to check current exports
cat -n ./packages/runtime/src/index.tsRepository: easyops-cn/next-core
<shell_result>
Repository: easyops-cn/next-core
Exit code: 0
stdout:
1 export * from "./auth.js";
2 export * from "./CustomEditors.js";
3 export * from "./CustomProcessors.js";
4 export { customTemplates } from "./CustomTemplates.js";
5 export * from "./fetchByProvider.js";
6 export * from "./getBasePath.js";
7 export * from "./getPageInfo.js";
8 export * from "./handleHttpError.js";
9 export * from "./history.js";
10 export * from "./createRoot.js";
11 export * from "./getRealValue.js";
12 export {
13 createRuntime,
14 getRuntime,
15 type RuntimeOptions,
16 type RuntimeHooks,
17 type RuntimeHooksMenuHelpers,
18 type ImagesFactory,
19 type PageViewInfo,
20 } from "./internal/Runtime.js";
21 import * as __secret_internals from "./internal/secret_internals.js";
22 export { __secret_internals };
23 export { __test_only } from "./internal/test_only.js";
24 export {
25 getCssPropertyValue,
26 getCurrentTheme,
27 getCurrentMode,
28 getThemeVariant,
29 batchSetAppsLocalTheme,
30 applyTheme,
31 } from "./themeAndMode.js";
32 export {
33 checkIfOfComputed,
34 checkIfByTransform,
35 } from "./internal/compute/checkIf.js";
36 export { registerWidgetFunctions } from "./internal/compute/WidgetFunctions.js";
37 export { registerWidgetI18n } from "./internal/compute/WidgetI18n.js";
38 export { StoryboardFunctionRegistryFactory } from "./StoryboardFunctionRegistry.js";
39 export { matchPath, type MatchOptions } from "./internal/matchPath.js";
40 export { Notification, type NotificationOptions } from "./Notification.js";
41 export { Dialog, type DialogOptions } from "./Dialog.js";
42 export * from "./getV2RuntimeFromDll.js";
43 export { setUIVersion } from "./setUIVersion.js";
44 export * from "./ModalStack.js";
45 export * from "./isNetworkError.js";
46 export * from "./shouldReloadForError.js";
</shell_result>
Script executed:
#!/bin/bash
# Search for MountUseBrickResult to see where it's defined and exported
rg -n "MountUseBrickResult" --type ts -A 2 -B 2 | head -40Repository: easyops-cn/next-core
<shell_result>
Repository: easyops-cn/next-core
Exit code: 0
stdout:
packages/runtime/src/internal/secret_internals.ts-132-}
packages/runtime/src/internal/secret_internals.ts-133-
packages/runtime/src/internal/secret_internals.ts:134:export interface MountUseBrickResult {
packages/runtime/src/internal/secret_internals.ts-135- portal?: HTMLElement;
packages/runtime/src/internal/secret_internals.ts-136- dispose: Dispose;
--
packages/runtime/src/internal/secret_internals.ts-140- { renderRoot, rendererContext, scopedStores }: RenderUseBrickResult,
packages/runtime/src/internal/secret_internals.ts-141- element: HTMLElement
packages/runtime/src/internal/secret_internals.ts:142:): MountUseBrickResult {
packages/runtime/src/internal/secret_internals.ts-143- let portal: HTMLElement | undefined;
packages/runtime/src/internal/secret_internals.ts-144- renderRoot.createPortal = () => {
--
packages/runtime/src/internal/secret_internals.ts-170-export function unmountUseBrick(
packages/runtime/src/internal/secret_internals.ts-171- { rendererContext }: RenderUseBrickResult,
packages/runtime/src/internal/secret_internals.ts:172: mountResult: MountUseBrickResult
packages/runtime/src/internal/secret_internals.ts-173-): void {
packages/runtime/src/internal/secret_internals.ts-174- // if (mountResult.mainBrick) {
--
packages/runtime/src/internal/Renderer.spec.ts-108- "my-use-brick",
packages/runtime/src/internal/Renderer.spec.ts-109- class MyUseBrick extends HTMLElement {
packages/runtime/src/internal/Renderer.spec.ts:110: #mountResult: __secret_internals.MountUseBrickResult | undefined;
packages/runtime/src/internal/Renderer.spec.ts-111- #renderResult: __secret_internals.RenderUseBrickResult | undefined;
packages/runtime/src/internal/Renderer.spec.ts-112- async connectedCallback() {
--
packages/react-runtime/src/ReactUseBrick.tsx-35- const [renderResult, setRenderResult] =
packages/react-runtime/src/ReactUseBrick.tsx-36- useState<__secret_internals.RenderUseBrickResult | null>(null);
packages/react-runtime/src/ReactUseBrick.tsx:37: const mountResult = useRef<__secret_internals.MountUseBrickResult>();
packages/react-runtime/src/ReactUseBrick.tsx-38- const [renderKey, setRenderKey] = useState<number>();
packages/react-runtime/src/ReactUseBrick.tsx-39- const IdCounterRef = useRef(0);
</shell_result>
Script executed:
#!/bin/bash
# Check the import of Dispose in secret_internals.ts
head -50 ./packages/runtime/src/internal/secret_internals.ts | grep -n "Dispose\|import"Repository: easyops-cn/next-core
<shell_result>
Repository: easyops-cn/next-core
Exit code: 0
stdout:
1:import type {
12:import { pick } from "lodash";
13:import {
19:import {
24:import { RendererContext } from "./RendererContext.js";
25:import type { DataStore } from "./data/DataStore.js";
26:import { resolveData } from "./data/resolveData.js";
27:import { asyncComputeRealValue } from "./compute/computeRealValue.js";
28:import type {
39: Dispose,
41:import { mountTree, unmountTree } from "./mount.js";
42:import { RenderTag } from "./enums.js";
43:import { isStrictMode } from "../isStrictMode.js";
44:import { customTemplates } from "../CustomTemplates.js";
45:import { registerAppI18n } from "./registerAppI18n.js";
46:import { getTplStateStore } from "./CustomTemplates/utils.js";
47:import {
</shell_result>
Script executed:
#!/bin/bash
# Verify the full import statement for Dispose
sed -n '1,45p' ./packages/runtime/src/internal/secret_internals.ts | grep -A 15 "^import type {"Repository: easyops-cn/next-core
<shell_result>
Repository: easyops-cn/next-core
Exit code: 0
stdout:
import type {
BrickConf,
CustomTemplate,
RouteConf,
Storyboard,
UseSingleBrickConf,
RuntimeSnippet,
ContextConf,
BrickPackage,
RouteConfOfBricks,
} from "@next-core/types";
import { pick } from "lodash";
import {
_internalApiGetRenderId,
_internalApiGetRuntimeContext,
_internalApiGetStoryboardInBootstrapData,
--
import type { DataStore } from "./data/DataStore.js";
import { resolveData } from "./data/resolveData.js";
import { asyncComputeRealValue } from "./compute/computeRealValue.js";
import type {
DataValueOption,
PreviewOption,
PreviewStoryboardPatch,
RenderRoot,
RuntimeContext,
DebugDataValue,
RuntimeDataVale,
RuntimeDataValueOption,
RenderBrick,
RenderChildNode,
Dispose,
} from "./interfaces.js";
import { mountTree, unmountTree } from "./mount.js";
import { RenderTag } from "./enums.js";
import { isStrictMode } from "../isStrictMode.js";
</shell_result>
Add Dispose type to entry point exports to resolve API Extractor warning
The warning is valid: Dispose is used in the public API (MountUseBrickResult interface exported via __secret_internals) but not exported from the main entry point. The type is imported from ./internal/interfaces.ts into secret_internals.ts but never re-exported from packages/runtime/src/index.ts. This prevents users from directly referencing the Dispose type despite encountering it in the public API.
To fix this, add Dispose to the exports in packages/runtime/src/index.ts:
export {
createRuntime,
getRuntime,
type RuntimeOptions,
type RuntimeHooks,
type RuntimeHooksMenuHelpers,
type ImagesFactory,
type PageViewInfo,
type Dispose, // Add this line
} from "./internal/Runtime.js";Or add a separate export from interfaces.ts if Dispose is not already exported from Runtime.js.
🤖 Prompt for AI Agents
In etc/runtime.api.md around lines 335 to 338, the API Extractor warning shows
the Dispose type is referenced in the public API but not exported from the
package entry point; fix by exporting Dispose from the runtime entry
(packages/runtime/src/index.ts) — add Dispose to the export list (or if Dispose
is only declared in interfaces.ts, re-export it from Runtime.js or directly from
interfaces.ts) so the public surface exposes the Dispose type alongside the
other exported runtime types.
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## v3 #4828 +/- ##
==========================================
+ Coverage 95.16% 95.20% +0.03%
==========================================
Files 212 212
Lines 9357 9376 +19
Branches 1802 1801 -1
==========================================
+ Hits 8905 8926 +21
+ Misses 332 329 -3
- Partials 120 121 +1
🚀 New features to boost your workflow:
|
next-core
|
||||||||||||||||||||||||||||
| Project |
next-core
|
| Branch Review |
steve/v3-dispose
|
| Run status |
|
| Run duration | 00m 24s |
| Commit |
|
| Committer | Shenwei Wang |
| View all properties for this run ↗︎ | |
| Test results | |
|---|---|
|
|
0
|
|
|
0
|
|
|
0
|
|
|
0
|
|
|
17
|
| View all changes introduced in this branch ↗︎ | |
依赖检查
组件之间的依赖声明,是微服务组件架构下的重要信息,请确保其正确性。
请勾选以下两组选项其中之一:
或者:
提交信息检查
Git 提交信息将决定包的版本发布及自动生成的 CHANGELOG,请检查工作内容与提交信息是否相符,并在以下每组选项中都依次确认。
破坏性变更:
feat作为提交类型。BREAKING CHANGE: 你的变更说明。新特性:
feat作为提交类型。问题修复:
fix作为提交类型。杂项工作:
即所有对下游使用者无任何影响、且没有必要显示在 CHANGELOG 中的改动,例如修改注释、测试用例、开发文档等:
chore,docs,test等作为提交类型。Summary by CodeRabbit
重构
新功能
✏️ Tip: You can customize this high-level summary in your review settings.