Skip to content

Commit aeb9696

Browse files
update.
1 parent dd3c2e6 commit aeb9696

9 files changed

Lines changed: 118 additions & 137 deletions

File tree

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
"@shikijs/twoslash": "^1.22.2",
3434
"@shikijs/vitepress-twoslash": "^1.22.2",
3535
"@swc/core": "^1.10.15",
36-
"@types/lodash": "^4.17.15",
36+
"@types/lodash": "^4.17.17",
3737
"@types/node": "^22.13.1",
3838
"@types/react": "^18.2.79",
3939
"@types/react-dom": "^18.2.25",
@@ -53,6 +53,6 @@
5353
"typescript": "^5.3.3",
5454
"vitepress": "^1.3.4",
5555
"vue": "^3.5.16",
56-
"zustand": "^5.0.0"
56+
"zustand": "^5.0.5"
5757
}
5858
}

packages/r-store/index.d.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,47 @@
11
import type { DeepReadonly } from '@vue/reactivity';
22
import type { ReactElement } from 'react';
3+
import { ReactiveEffect } from '@vue/reactivity';
34
import type { ReactNode } from 'react';
45
import type { UnwrapNestedRefs } from '@vue/reactivity';
56

7+
export declare class Controller<T = any> {
8+
readonly _getState: () => T;
9+
readonly _compare: (prev: T, next: T) => boolean;
10+
readonly _lifeCycle: LifeCycle;
11+
readonly _namespace?: string;
12+
readonly _onUpdate?: () => void;
13+
readonly _listeners: Set<() => void>;
14+
readonly _list: Set<Controller>;
15+
_getStateSafe: () => T;
16+
_effect: ReactiveEffect<T>;
17+
_state: T;
18+
_devState: any;
19+
_devCompare: any;
20+
_devSelector: any;
21+
_devActions: any;
22+
_devWithDeep: any;
23+
_devWithStable: any;
24+
_devVersion: string;
25+
_devReduxOptions: any;
26+
_devPersistOptions: any;
27+
_devType: any;
28+
_devResult: any;
29+
_devRunCount: number;
30+
_updateCount: number;
31+
_isActive: boolean;
32+
constructor(_getState: () => T, _compare: (prev: T, next: T) => boolean, _lifeCycle: LifeCycle, _list: Set<Controller>, _namespace?: string, _onUpdate?: () => void);
33+
notify: () => void;
34+
_scheduler: () => void;
35+
subscribe: (listener: () => void) => () => boolean;
36+
getState: () => number;
37+
getEffect: () => ReactiveEffect<T>;
38+
getSelectorState: () => T;
39+
getLifeCycle: () => LifeCycle;
40+
run(): void;
41+
stop(): void;
42+
setActive(d: boolean): void;
43+
}
44+
645
/**
746
* @public
847
*
@@ -237,6 +276,8 @@ export declare type Creator<T extends Record<string, unknown>> = () => T;
237276
*/
238277
export declare const getBatch: () => (cb: () => void) => void;
239278

279+
export declare function getCurrentController(): Controller | null;
280+
240281
/**
241282
* @public
242283
*/

packages/r-store/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@
6060
"dependencies": {
6161
"@vue/reactivity": "~3.5.16",
6262
"@vue/shared": "~3.5.16",
63-
"use-sync-external-store": "^1.4.0"
63+
"use-sync-external-store": "^1.5.0"
6464
},
6565
"peerDependencies": {
6666
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
6767
},
6868
"devDependencies": {
69-
"@microsoft/api-extractor": "^7.49.2",
69+
"@microsoft/api-extractor": "^7.52.8",
7070
"@redux-devtools/extension": "^3.3.0",
7171
"@types/use-sync-external-store": "^0.0.6"
7272
}

packages/r-store/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ export { onBeforeMount, onBeforeUpdate, onBeforeUnmount, onMounted, onUpdated, o
22

33
export { withActions, withPersist, withNamespace, withDeepSelector, withSelectorOptions } from "./state/middleware";
44

5+
export { getCurrentController, Controller } from "./shared/controller";
6+
57
export * from "./store/createStoreWithComponent";
68

79
export * from "./store/createStore";

packages/r-store/src/shared/controller.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ import { queueJob } from "./queue";
66

77
import type { LifeCycle } from "./lifeCycle";
88

9+
let currentController: Controller | null = null;
10+
11+
export function getCurrentController(): Controller | null {
12+
return currentController;
13+
}
14+
915
class ControllerEffect<T = any> extends ReactiveEffect<T> {
1016
_devVersion: string;
1117

@@ -53,10 +59,6 @@ const catchError = <T>(cb: () => T, instance: Controller) => {
5359
};
5460
};
5561

56-
// TODO
57-
/**
58-
* @internal
59-
*/
6062
export class Controller<T = any> {
6163
readonly _listeners = new Set<() => void>();
6264

@@ -150,8 +152,15 @@ export class Controller<T = any> {
150152
};
151153

152154
_scheduler = () => {
155+
const p = getCurrentController();
156+
157+
// eslint-disable-next-line @typescript-eslint/no-this-alias
158+
currentController = this;
159+
153160
const newState = this._effect.run();
154161

162+
currentController = p;
163+
155164
if (!this._isActive) return;
156165

157166
const isSame = this._compare(this._state, newState);
@@ -193,7 +202,14 @@ export class Controller<T = any> {
193202

194203
// TODO move into constructor function?
195204
run() {
205+
const p = getCurrentController();
206+
207+
// eslint-disable-next-line @typescript-eslint/no-this-alias
208+
currentController = this;
209+
196210
this._state = this._effect.run();
211+
212+
currentController = p;
197213
}
198214

199215
stop() {

packages/r-store/src/shared/dev.ts

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import { isPromise } from "@vue/shared";
33

44
import { Controller } from "./controller";
5-
import { InternalNameSpace, isServer } from "./env";
5+
import { InternalNameSpace } from "./env";
66
import { createLifeCycle } from "./lifeCycle";
77
import { traverse, traverseShallow } from "./tools";
88

@@ -33,56 +33,6 @@ export const checkHasKey = (key: string) => {
3333
return key in namespaceMap;
3434
};
3535

36-
if (__DEV__ && !isServer) {
37-
try {
38-
globalThis["@reactivity-store"] = globalThis["@reactivity-store"] || new WeakMap();
39-
} catch {
40-
void 0;
41-
}
42-
}
43-
44-
/**
45-
* @internal
46-
*/
47-
export const setDevController = (controller: Controller, state: any) => {
48-
if (__DEV__ && !isServer) {
49-
if (!globalThis["@reactivity-store"]) return;
50-
try {
51-
const set = (globalThis["@reactivity-store"]?.get?.(state) || new Set()) as Set<Controller>;
52-
53-
set.add(controller);
54-
55-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
56-
// @ts-ignore
57-
set.name = controller._namespace || set?.name;
58-
59-
globalThis["@reactivity-store"]?.set?.(state, set);
60-
} catch {
61-
void 0;
62-
}
63-
}
64-
};
65-
66-
/**
67-
* @internal
68-
*/
69-
export const delDevController = (controller: Controller, state: any) => {
70-
if (__DEV__ && !isServer) {
71-
if (!globalThis["@reactivity-store"]) return;
72-
try {
73-
const set = globalThis["@reactivity-store"]?.get?.(state) as Set<Controller>;
74-
75-
set?.delete?.(controller);
76-
77-
if (set.size === 0) {
78-
globalThis["@reactivity-store"]?.delete?.(state);
79-
}
80-
} catch {
81-
void 0;
82-
}
83-
}
84-
};
85-
8636
// cache state which has connect to devtool
8737
const devToolMap: Record<string, any> = {};
8838

@@ -132,14 +82,10 @@ export const connectDevTool = (
13282

13383
globalDevTools = devTools;
13484

135-
const existState = devToolMap[name];
136-
13785
const existController = devController[name];
13886

13987
if (existController) {
14088
existController.stop();
141-
142-
delDevController(existController, existState);
14389
}
14490

14591
devToolMap[name] = readonlyState;
@@ -179,8 +125,6 @@ export const connectDevTool = (
179125

180126
controller.run();
181127

182-
setDevController(controller, readonlyState);
183-
184128
const obj = { ...devToolMap };
185129

186130
devTools.init(obj);

packages/r-store/src/shared/hook.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { useCallback, useEffect, useMemo, useRef } from "react";
66
import { useSyncExternalStore } from "use-sync-external-store/shim/index.js";
77

88
import { Controller } from "./controller";
9-
import { delDevController, delNamespace, setDevController, setNamespaceMap } from "./dev";
9+
import { delNamespace, setNamespaceMap } from "./dev";
1010
import { InternalNameSpace, isServer } from "./env";
1111
import { traverse, traverseShallow } from "./tools";
1212

@@ -173,14 +173,6 @@ export const createHook = <T extends Record<string, unknown>, C extends Record<s
173173
ControllerInstance._devState = initialState;
174174

175175
ControllerInstance._devResult = ref.current;
176-
177-
useEffect(() => {
178-
setDevController(ControllerInstance, readonlyState);
179-
180-
return () => {
181-
delDevController(ControllerInstance, readonlyState);
182-
};
183-
}, [ControllerInstance]);
184176
}
185177

186178
useEffect(() => {
@@ -275,16 +267,7 @@ export const createHook = <T extends Record<string, unknown>, C extends Record<s
275267

276268
controller.run();
277269

278-
if (__DEV__) {
279-
setDevController(controller, initialState);
280-
}
281-
282-
return () => {
283-
if (__DEV__) {
284-
delDevController(controller, initialState);
285-
}
286-
controller.stop();
287-
};
270+
return () => controller.stop();
288271
};
289272

290273
typedUseSelector.getIsActive = () => active;

packages/r-store/src/state/middleware/withPersist.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
/* eslint-disable @typescript-eslint/no-unsafe-function-type */
2-
import { reactive, readonly, toRaw } from "@vue/reactivity";
2+
import { reactive, toRaw } from "@vue/reactivity";
33
import { isPromise } from "@vue/shared";
44

55
import { Controller } from "../../shared/controller";
6-
import { setDevController } from "../../shared/dev";
76
import { InternalNameSpace, isServer } from "../../shared/env";
87
import { createLifeCycle } from "../../shared/lifeCycle";
98
import { checkHasReactive, traverse, traverseShallow } from "../../shared/tools";
@@ -155,11 +154,7 @@ export function withPersist<T extends Record<string, unknown>, P extends Record<
155154

156155
ControllerInstance.run();
157156

158-
const readonlyState = readonly(toRaw(re) as object);
159-
160157
if (__DEV__) {
161-
setDevController(ControllerInstance, readonlyState);
162-
163158
ControllerInstance._devPersistOptions = options;
164159
}
165160

0 commit comments

Comments
 (0)