-
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?
Changes from 4 commits
bdab057
1b44b42
0a334bc
6d8ff39
dd5c9f5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
|
|
@@ -19,6 +19,7 @@ import { ResolveOptions, resolveData } from "./resolveData.js"; | |||||||
| import { resolveDataStore } from "./resolveDataStore.js"; | ||||||||
| import type { | ||||||||
| AsyncPropertyEntry, | ||||||||
| Dispose, | ||||||||
| RouteNode, | ||||||||
|
Comment on lines
+22
to
23
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. disposableMap 中重复存储同一 Dispose,可能导致长期悬挂引用 目前同一个
在路由销毁逻辑中,
建议把“订阅登记”和“所有者”解耦,避免重复存储同一个
|
||||||||
| RuntimeBrick, | ||||||||
| RuntimeContext, | ||||||||
|
|
@@ -71,6 +72,7 @@ export class DataStore<T extends DataStoreType = "CTX"> { | |||||||
| private readonly rendererContext?: RendererContext; | ||||||||
| private routeMap = new WeakMap<RouteConf, Set<string>>(); | ||||||||
| private routeStackMap = new WeakMap<RouteConf, Set<PendingStackItem>>(); | ||||||||
| private disposableMap = new Map<string, Dispose[]>(); | ||||||||
|
|
||||||||
| // 把 `rendererContext` 放在参数列表的最后,并作为可选,以减少测试文件的调整 | ||||||||
| constructor( | ||||||||
|
|
@@ -360,12 +362,14 @@ export class DataStore<T extends DataStoreType = "CTX"> { | |||||||
| } | ||||||||
| } | ||||||||
|
|
||||||||
| onChange(dataName: string, listener: EventListener): () => void { | ||||||||
| onChange(dataName: string, listener: EventListener): Dispose { | ||||||||
| const eventTarget = this.data.get(dataName)?.eventTarget; | ||||||||
| eventTarget?.addEventListener(this.changeEventType, listener); | ||||||||
| return () => { | ||||||||
| const disposable = () => { | ||||||||
| eventTarget?.removeEventListener(this.changeEventType, listener); | ||||||||
| }; | ||||||||
| this.addDisposable(dataName, disposable); | ||||||||
| return disposable; | ||||||||
| } | ||||||||
|
|
||||||||
| async waitFor(dataNames: string[] | Set<string>): Promise<void> { | ||||||||
|
|
@@ -509,7 +513,6 @@ export class DataStore<T extends DataStoreType = "CTX"> { | |||||||
| }; | ||||||||
|
|
||||||||
| if (resolvePolicy === "lazy") { | ||||||||
| // eslint-disable-next-line @typescript-eslint/no-non-null-assertion | ||||||||
| const { trigger } = dataConf.resolve!; | ||||||||
| if ( | ||||||||
| trigger && | ||||||||
|
|
@@ -539,7 +542,7 @@ export class DataStore<T extends DataStoreType = "CTX"> { | |||||||
| ); | ||||||||
| !load && (newData.deps = [...deps]); | ||||||||
| for (const dep of deps) { | ||||||||
| this.onChange( | ||||||||
| const disposable = this.onChange( | ||||||||
|
||||||||
| dep, | ||||||||
| this.batchAddListener(() => { | ||||||||
| newData.useResolve = trackConditionalResolve | ||||||||
|
|
@@ -556,6 +559,7 @@ export class DataStore<T extends DataStoreType = "CTX"> { | |||||||
| } | ||||||||
| }, dataConf) | ||||||||
| ); | ||||||||
| this.addDisposable(dataConf.name, disposable); | ||||||||
| } | ||||||||
| } | ||||||||
|
|
||||||||
|
|
@@ -579,6 +583,15 @@ export class DataStore<T extends DataStoreType = "CTX"> { | |||||||
| return true; | ||||||||
| } | ||||||||
|
|
||||||||
| private addDisposable(name: string, disposable: Dispose) { | ||||||||
| const existingDisposables = this.disposableMap.get(name); | ||||||||
| if (existingDisposables) { | ||||||||
| existingDisposables.push(disposable); | ||||||||
| } else { | ||||||||
| this.disposableMap.set(name, [disposable]); | ||||||||
| } | ||||||||
| } | ||||||||
|
|
||||||||
| /** | ||||||||
| * For sub-routes to be incrementally rendered, | ||||||||
| * dispose their data and pending tasks. | ||||||||
|
|
@@ -589,6 +602,13 @@ export class DataStore<T extends DataStoreType = "CTX"> { | |||||||
| if (names !== undefined) { | ||||||||
| for (const name of names) { | ||||||||
| this.data.delete(name); | ||||||||
| const disposables = this.disposableMap.get(name); | ||||||||
| if (disposables) { | ||||||||
| for (const disposable of disposables) { | ||||||||
| disposable(); | ||||||||
| } | ||||||||
|
||||||||
| } | |
| } | |
| 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.
🧩 Analysis chain
Script executed:
Repository: easyops-cn/next-core
<shell_result>
Repository: easyops-cn/next-core
Exit code: 0
stdout:
</shell_result>
Script executed:
Repository: easyops-cn/next-core
<shell_result>
Repository: easyops-cn/next-core
Exit code: 0
stdout:
</shell_result>
Script executed:
Repository: easyops-cn/next-core
<shell_result>
Repository: easyops-cn/next-core
Exit code: 0
stdout:
</shell_result>
Script executed:
Repository: easyops-cn/next-core
<shell_result>
Repository: easyops-cn/next-core
Exit code: 0
stdout:
</shell_result>
Script executed:
Repository: easyops-cn/next-core
<shell_result>
Repository: easyops-cn/next-core
Exit code: 0
stdout:
</shell_result>
Add Dispose type to entry point exports to resolve API Extractor warning
The warning is valid:
Disposeis used in the public API (MountUseBrickResultinterface exported via__secret_internals) but not exported from the main entry point. The type is imported from./internal/interfaces.tsintosecret_internals.tsbut never re-exported frompackages/runtime/src/index.ts. This prevents users from directly referencing theDisposetype despite encountering it in the public API.To fix this, add
Disposeto the exports inpackages/runtime/src/index.ts:Or add a separate export from
interfaces.tsifDisposeis not already exported fromRuntime.js.🤖 Prompt for AI Agents