@esportsplus/reactivity 0.4.7 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/dependabot.yml +2 -0
- package/.github/workflows/bump.yml +2 -0
- package/.github/workflows/dependabot.yml +12 -0
- package/.github/workflows/publish.yml +2 -0
- package/build/constants.d.ts +7 -9
- package/build/constants.js +7 -9
- package/build/index.d.ts +1 -3
- package/build/index.js +1 -3
- package/build/reactive/array.d.ts +20 -17
- package/build/reactive/array.js +101 -52
- package/build/reactive/disposable.d.ts +4 -0
- package/build/reactive/disposable.js +6 -0
- package/build/reactive/index.d.ts +2 -2
- package/build/reactive/index.js +3 -3
- package/build/reactive/object.d.ts +12 -7
- package/build/reactive/object.js +42 -19
- package/build/signal.d.ts +15 -31
- package/build/signal.js +273 -235
- package/build/types.d.ts +27 -37
- package/build/types.js +1 -1
- package/package.json +4 -4
- package/readme.md +2 -2
- package/src/constants.ts +7 -12
- package/src/index.ts +1 -3
- package/src/reactive/array.ts +143 -67
- package/src/reactive/disposable.ts +8 -0
- package/src/reactive/index.ts +4 -4
- package/src/reactive/object.ts +56 -24
- package/src/signal.ts +338 -263
- package/src/types.ts +36 -57
- package/build/macro.d.ts +0 -9
- package/build/macro.js +0 -17
- package/src/macro.ts +0 -26
package/src/constants.ts
CHANGED
|
@@ -1,19 +1,14 @@
|
|
|
1
|
-
const
|
|
1
|
+
const REACTIVE = Symbol('reactive');
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const STATE_NONE = 0;
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const STATE_CHECK = 1 << 0;
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const STATE_DIRTY = 1 << 1;
|
|
8
8
|
|
|
9
|
+
const STATE_RECOMPUTING = 1 << 2;
|
|
9
10
|
|
|
10
|
-
const
|
|
11
|
+
const STATE_IN_HEAP = 1 << 3;
|
|
11
12
|
|
|
12
|
-
const EFFECT = 1;
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const SIGNAL = 3;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export { CHECK, CLEAN, COMPUTED, DIRTY, DISPOSED, EFFECT, ROOT, SIGNAL };
|
|
14
|
+
export { REACTIVE, STATE_CHECK, STATE_DIRTY, STATE_IN_HEAP, STATE_NONE, STATE_RECOMPUTING };
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export { default as macro } from './macro';
|
|
2
1
|
export { default as reactive } from './reactive';
|
|
3
|
-
export { computed, dispose,
|
|
4
|
-
export * from './constants';
|
|
2
|
+
export { computed, dispose, oncleanup, root, signal, stabilize } from './signal';
|
|
5
3
|
export * from './types';
|
package/src/reactive/array.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
1
|
+
import { isArray, isFunction, isInstanceOf, isNumber, isObject } from '@esportsplus/utilities';
|
|
2
|
+
import { computed, dispose, isComputed, read } from '~/signal';
|
|
3
|
+
import { Computed, Infer } from '~/types';
|
|
4
|
+
import object, { ReactiveObject } from './object';
|
|
5
|
+
import { Disposable } from './disposable';
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
type API<T> = Infer<T>[] & ReactiveArray<T>;
|
|
@@ -33,21 +33,32 @@ type Events<T> = {
|
|
|
33
33
|
};
|
|
34
34
|
};
|
|
35
35
|
|
|
36
|
-
type Item<T> = T extends Record<PropertyKey, unknown> ?
|
|
36
|
+
type Item<T> = Computed<T> | ReactiveArray<T> | ReactiveObject<T extends Record<PropertyKey, unknown> ? T : never> | T;
|
|
37
|
+
|
|
38
|
+
type Listener<V> = {
|
|
39
|
+
once?: boolean;
|
|
40
|
+
(value: V): void;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
type Value<T> =
|
|
44
|
+
T extends Record<PropertyKey, unknown>
|
|
45
|
+
? ReactiveObject<T>
|
|
46
|
+
: T extends Array<infer U>
|
|
47
|
+
? ReactiveArray<U>
|
|
48
|
+
: T;
|
|
37
49
|
|
|
38
50
|
|
|
39
|
-
class ReactiveArray<T> {
|
|
40
|
-
private data: Item<T>[]
|
|
41
|
-
private
|
|
51
|
+
class ReactiveArray<T> extends Disposable {
|
|
52
|
+
private data: Item<T>[];
|
|
53
|
+
private listeners: Record<string, (Listener<any> | null)[]> | null = null;
|
|
42
54
|
private proxy: API<T>;
|
|
43
|
-
private signal: Signal<boolean>;
|
|
44
55
|
|
|
45
56
|
|
|
46
|
-
constructor(data: Item<T>[], proxy: API<T
|
|
57
|
+
constructor(data: Item<T>[], proxy: API<T>) {
|
|
58
|
+
super();
|
|
59
|
+
|
|
47
60
|
this.data = data;
|
|
48
|
-
this.options = options;
|
|
49
61
|
this.proxy = proxy;
|
|
50
|
-
this.signal = signal(false);
|
|
51
62
|
}
|
|
52
63
|
|
|
53
64
|
|
|
@@ -67,37 +78,64 @@ class ReactiveArray<T> {
|
|
|
67
78
|
at(i: number) {
|
|
68
79
|
let value = this.data[i];
|
|
69
80
|
|
|
70
|
-
if (
|
|
71
|
-
return value
|
|
81
|
+
if (isComputed(value)) {
|
|
82
|
+
return read(value);
|
|
72
83
|
}
|
|
73
84
|
|
|
74
85
|
return value;
|
|
75
86
|
}
|
|
76
87
|
|
|
77
|
-
dispatch<
|
|
78
|
-
this.
|
|
79
|
-
|
|
88
|
+
dispatch<D>(event: keyof Events<T>, value?: D) {
|
|
89
|
+
if (this.listeners === null || this.listeners[event] === undefined) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
80
92
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
93
|
+
let listeners = this.listeners[event];
|
|
94
|
+
|
|
95
|
+
for (let i = 0, n = listeners.length; i < n; i++) {
|
|
96
|
+
let listener = listeners[i];
|
|
97
|
+
|
|
98
|
+
if (listener === null) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
listener(value);
|
|
104
|
+
|
|
105
|
+
if (listener.once !== undefined) {
|
|
106
|
+
listeners[i] = null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
listeners[i] = null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
84
113
|
}
|
|
85
114
|
|
|
86
|
-
|
|
115
|
+
dispose() {
|
|
87
116
|
let data = this.data;
|
|
88
117
|
|
|
89
|
-
for (let i =
|
|
90
|
-
|
|
91
|
-
|
|
118
|
+
for (let i = 0, n = data.length; i < n; i++) {
|
|
119
|
+
let value = data[i];
|
|
120
|
+
|
|
121
|
+
if (isInstanceOf(value, Disposable)) {
|
|
122
|
+
value.dispose();
|
|
123
|
+
}
|
|
124
|
+
else if (isComputed(value)) {
|
|
125
|
+
dispose(value);
|
|
92
126
|
}
|
|
93
127
|
}
|
|
94
128
|
|
|
95
|
-
|
|
129
|
+
this.listeners = null;
|
|
96
130
|
}
|
|
97
131
|
|
|
98
|
-
map<
|
|
132
|
+
map<R>(
|
|
133
|
+
fn: (this: API<T>, value: Value<T>, i: number) => R,
|
|
134
|
+
i?: number,
|
|
135
|
+
n?: number
|
|
136
|
+
) {
|
|
99
137
|
let { data, proxy } = this,
|
|
100
|
-
values:
|
|
138
|
+
values: R[] = [];
|
|
101
139
|
|
|
102
140
|
if (i === undefined) {
|
|
103
141
|
i = 0;
|
|
@@ -113,44 +151,71 @@ class ReactiveArray<T> {
|
|
|
113
151
|
let item = data[i];
|
|
114
152
|
|
|
115
153
|
values.push(
|
|
116
|
-
fn.call(
|
|
154
|
+
fn.call(
|
|
155
|
+
proxy,
|
|
156
|
+
(isComputed(item) ? item.value : item) as Value<T>,
|
|
157
|
+
i
|
|
158
|
+
)
|
|
117
159
|
);
|
|
118
160
|
}
|
|
119
161
|
|
|
120
162
|
return values;
|
|
121
163
|
}
|
|
122
164
|
|
|
123
|
-
on<
|
|
124
|
-
this.
|
|
165
|
+
on<T>(event: keyof Events<T>, listener: Listener<T>) {
|
|
166
|
+
if (this.listeners === null) {
|
|
167
|
+
this.listeners = { [event]: [listener] };
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
let listeners = this.listeners[event];
|
|
171
|
+
|
|
172
|
+
if (listeners === undefined) {
|
|
173
|
+
this.listeners[event] = [listener];
|
|
174
|
+
}
|
|
175
|
+
else if (listeners.indexOf(listener) === -1) {
|
|
176
|
+
let i = listeners.indexOf(null);
|
|
177
|
+
|
|
178
|
+
if (i === -1) {
|
|
179
|
+
listeners.push(listener);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
listeners[i] = listener;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
125
186
|
}
|
|
126
187
|
|
|
127
|
-
once<
|
|
128
|
-
|
|
188
|
+
once<T>(event: keyof Events<T>, listener: Listener<T>) {
|
|
189
|
+
listener.once = true;
|
|
190
|
+
this.on(event, listener);
|
|
129
191
|
}
|
|
130
192
|
|
|
131
193
|
pop() {
|
|
132
194
|
let item = this.data.pop();
|
|
133
195
|
|
|
134
196
|
if (item !== undefined) {
|
|
135
|
-
|
|
136
|
-
|
|
197
|
+
if (isComputed(item)) {
|
|
198
|
+
dispose(item);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
this.dispatch('pop', { item });
|
|
137
202
|
}
|
|
138
203
|
|
|
139
204
|
return item;
|
|
140
205
|
}
|
|
141
206
|
|
|
142
207
|
push(...input: T[]) {
|
|
143
|
-
let items = factory(input
|
|
208
|
+
let items = factory(input),
|
|
144
209
|
n = this.data.push(...items);
|
|
145
210
|
|
|
146
|
-
this.
|
|
211
|
+
this.dispatch('push', { items });
|
|
147
212
|
|
|
148
213
|
return n;
|
|
149
214
|
}
|
|
150
215
|
|
|
151
216
|
reverse() {
|
|
152
217
|
this.data.reverse();
|
|
153
|
-
this.
|
|
218
|
+
this.dispatch('reverse');
|
|
154
219
|
|
|
155
220
|
return this;
|
|
156
221
|
}
|
|
@@ -159,30 +224,40 @@ class ReactiveArray<T> {
|
|
|
159
224
|
let item = this.data.shift();
|
|
160
225
|
|
|
161
226
|
if (item !== undefined) {
|
|
162
|
-
|
|
163
|
-
|
|
227
|
+
if (isComputed(item)) {
|
|
228
|
+
dispose(item);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
this.dispatch('shift', { item });
|
|
164
232
|
}
|
|
165
233
|
|
|
166
234
|
return item;
|
|
167
235
|
}
|
|
168
236
|
|
|
169
|
-
sort(fn: (a: T
|
|
237
|
+
sort(fn: (a: Value<T>, b: Value<T>) => number) {
|
|
170
238
|
this.data.sort((a, b) => fn(
|
|
171
|
-
|
|
172
|
-
|
|
239
|
+
(isComputed(a) ? a.value : a) as Value<T>,
|
|
240
|
+
(isComputed(b) ? b.value : b) as Value<T>
|
|
173
241
|
));
|
|
174
|
-
this.
|
|
242
|
+
this.dispatch('sort');
|
|
175
243
|
|
|
176
244
|
return this;
|
|
177
245
|
}
|
|
178
246
|
|
|
179
247
|
splice(start: number, deleteCount: number = this.data.length, ...input: T[]) {
|
|
180
|
-
let items = factory(input
|
|
248
|
+
let items = factory(input),
|
|
181
249
|
removed = this.data.splice(start, deleteCount, ...items);
|
|
182
250
|
|
|
183
251
|
if (items.length > 0 || removed.length > 0) {
|
|
184
|
-
|
|
185
|
-
|
|
252
|
+
for (let i = 0, n = removed.length; i < n; i++) {
|
|
253
|
+
let item = removed[i];
|
|
254
|
+
|
|
255
|
+
if (isComputed(item)) {
|
|
256
|
+
dispose(item);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
this.dispatch('splice', {
|
|
186
261
|
deleteCount,
|
|
187
262
|
items,
|
|
188
263
|
start
|
|
@@ -193,29 +268,33 @@ class ReactiveArray<T> {
|
|
|
193
268
|
}
|
|
194
269
|
|
|
195
270
|
unshift(...input: T[]) {
|
|
196
|
-
let items = factory(input
|
|
271
|
+
let items = factory(input),
|
|
197
272
|
length = this.data.unshift(...items);
|
|
198
273
|
|
|
199
|
-
this.
|
|
274
|
+
this.dispatch('unshift', { items });
|
|
200
275
|
|
|
201
276
|
return length;
|
|
202
277
|
}
|
|
203
278
|
}
|
|
204
279
|
|
|
205
280
|
|
|
206
|
-
function factory<T>(input: T[]
|
|
281
|
+
function factory<T>(input: T[]) {
|
|
207
282
|
let items: Item<T>[] = [];
|
|
208
283
|
|
|
209
284
|
for (let i = 0, n = input.length; i < n; i++) {
|
|
210
285
|
let value = input[i];
|
|
211
286
|
|
|
212
|
-
if (
|
|
213
|
-
|
|
214
|
-
|
|
287
|
+
if (isArray(value)) {
|
|
288
|
+
items[i] = array(value);
|
|
289
|
+
}
|
|
290
|
+
else if (isFunction(value)) {
|
|
291
|
+
items[i] = computed(value as Computed<T>['fn']);
|
|
292
|
+
}
|
|
293
|
+
else if (isObject(value)) {
|
|
294
|
+
items[i] = object(value);
|
|
215
295
|
}
|
|
216
296
|
else {
|
|
217
|
-
|
|
218
|
-
items[i] = signal(value);
|
|
297
|
+
items[i] = value;
|
|
219
298
|
}
|
|
220
299
|
}
|
|
221
300
|
|
|
@@ -223,15 +302,14 @@ function factory<T>(input: T[], options: Options = {}) {
|
|
|
223
302
|
}
|
|
224
303
|
|
|
225
304
|
|
|
226
|
-
export default <T>(input: T[]
|
|
227
|
-
let
|
|
228
|
-
proxy = new Proxy({}, {
|
|
305
|
+
export default function array<T>(input: T[]) {
|
|
306
|
+
let proxy = new Proxy({}, {
|
|
229
307
|
get(_: any, key: any) {
|
|
230
308
|
if (isNumber(key)) {
|
|
231
309
|
let value = wrapped[key];
|
|
232
310
|
|
|
233
|
-
if (
|
|
234
|
-
return value
|
|
311
|
+
if (isComputed(value)) {
|
|
312
|
+
return read(value);
|
|
235
313
|
}
|
|
236
314
|
|
|
237
315
|
return value;
|
|
@@ -246,11 +324,8 @@ export default <T>(input: T[], options: Options = {}) => {
|
|
|
246
324
|
if (isNumber(key)) {
|
|
247
325
|
let host = wrapped[key];
|
|
248
326
|
|
|
249
|
-
if (host === undefined) {
|
|
250
|
-
wrapped[key] = factory([value] as T[]
|
|
251
|
-
}
|
|
252
|
-
else if (isInstanceOf(host, Reactive)) {
|
|
253
|
-
host.set(value);
|
|
327
|
+
if (host === undefined || !isComputed(host)) {
|
|
328
|
+
wrapped[key] = factory([value] as T[])[0];
|
|
254
329
|
}
|
|
255
330
|
else {
|
|
256
331
|
return false;
|
|
@@ -264,10 +339,11 @@ export default <T>(input: T[], options: Options = {}) => {
|
|
|
264
339
|
|
|
265
340
|
return false;
|
|
266
341
|
}
|
|
267
|
-
}) as API<T
|
|
342
|
+
}) as API<T>,
|
|
343
|
+
wrapped = factory(input);
|
|
268
344
|
|
|
269
345
|
let a = new ReactiveArray(wrapped, proxy);
|
|
270
346
|
|
|
271
347
|
return proxy;
|
|
272
348
|
};
|
|
273
|
-
export
|
|
349
|
+
export { ReactiveArray };
|
package/src/reactive/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isArray, isObject } from '@esportsplus/utilities';
|
|
2
|
-
import {
|
|
2
|
+
import { Reactive } from '~/types';
|
|
3
3
|
import { default as array } from './array';
|
|
4
4
|
import { default as object } from './object';
|
|
5
5
|
|
|
@@ -12,14 +12,14 @@ type Guard<T> =
|
|
|
12
12
|
: never;
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
export default <T>(data: Guard<T
|
|
15
|
+
export default <T>(data: Guard<T>) => {
|
|
16
16
|
let value;
|
|
17
17
|
|
|
18
18
|
if (isArray(data)) {
|
|
19
|
-
value = array(data
|
|
19
|
+
value = array(data);
|
|
20
20
|
}
|
|
21
21
|
else if (isObject(data)) {
|
|
22
|
-
value = object(data as { [K in keyof T]: T[K] }
|
|
22
|
+
value = object(data as { [K in keyof T]: T[K] });
|
|
23
23
|
}
|
|
24
24
|
else {
|
|
25
25
|
throw new Error(`@esportsplus/reactivity: 'reactive' received invalid input - ${JSON.stringify(data)}`);
|
package/src/reactive/object.ts
CHANGED
|
@@ -1,63 +1,88 @@
|
|
|
1
|
-
import { defineProperty, isArray, isFunction, isObject } from '@esportsplus/utilities';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { defineProperty, isArray, isFunction, isInstanceOf, isObject, Prettify } from '@esportsplus/utilities';
|
|
2
|
+
import array, { ReactiveArray } from './array';
|
|
3
|
+
import { computed, dispose, isComputed, read, signal } from '~/signal';
|
|
4
|
+
import { Computed, Infer, Signal } from '~/types';
|
|
5
|
+
import { Disposable } from './disposable';
|
|
5
6
|
|
|
6
7
|
|
|
7
|
-
type API<T
|
|
8
|
+
type API<T extends Record<PropertyKey, unknown>> = Prettify<{ [K in keyof T]: Infer<T[K]> }> & ReactiveObject<T>;
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
signals: Record<PropertyKey, Computed<any> | ReactiveArray<any> | ReactiveObject<any> | Signal<any>> = {};
|
|
11
|
+
let { set } = signal;
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
class ReactiveObject<T extends Record<PropertyKey, unknown>> extends Disposable {
|
|
15
|
+
private signals: Record<
|
|
16
|
+
PropertyKey,
|
|
17
|
+
Computed<any> | ReactiveArray<any> | ReactiveObject<any> | Signal<any>
|
|
18
|
+
> = {};
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
constructor(data: T) {
|
|
22
|
+
super();
|
|
23
|
+
|
|
24
|
+
let signals = this.signals,
|
|
25
|
+
triggers: Record<string, Signal<boolean>> = {};
|
|
16
26
|
|
|
17
27
|
for (let key in data) {
|
|
18
28
|
let value = data[key];
|
|
19
29
|
|
|
20
30
|
if (isArray(value)) {
|
|
21
|
-
let s = signals[key] = array(value,
|
|
31
|
+
let s = signals[key] = array(value),
|
|
32
|
+
t = triggers[key] = signal(false);
|
|
22
33
|
|
|
23
34
|
defineProperty(this, key, {
|
|
24
35
|
enumerable: true,
|
|
25
36
|
get() {
|
|
37
|
+
read(t);
|
|
26
38
|
return s;
|
|
39
|
+
},
|
|
40
|
+
set(v: typeof value) {
|
|
41
|
+
set(t, !!t.value);
|
|
42
|
+
s = signals[key] = array(v);
|
|
27
43
|
}
|
|
28
44
|
});
|
|
29
45
|
}
|
|
30
46
|
else if (isFunction(value)) {
|
|
31
|
-
let s = signals[key] = computed(value as Computed<T>['fn']
|
|
47
|
+
let s = signals[key] = computed(value as Computed<T>['fn']);
|
|
32
48
|
|
|
33
49
|
defineProperty(this, key, {
|
|
34
50
|
enumerable: true,
|
|
35
51
|
get() {
|
|
36
|
-
return s
|
|
52
|
+
return read(s as Computed<T>);
|
|
37
53
|
}
|
|
38
54
|
});
|
|
39
55
|
}
|
|
40
56
|
else if (isObject(value)) {
|
|
41
|
-
|
|
42
|
-
|
|
57
|
+
let s = signals[key] = new ReactiveObject(value),
|
|
58
|
+
t = triggers[key] = signal(false);
|
|
43
59
|
|
|
44
60
|
defineProperty(this, key, {
|
|
45
61
|
enumerable: true,
|
|
46
62
|
get() {
|
|
63
|
+
read(t);
|
|
47
64
|
return s;
|
|
65
|
+
},
|
|
66
|
+
set(v: typeof value) {
|
|
67
|
+
set(t, !!t.value);
|
|
68
|
+
s = signals[key] = new ReactiveObject(v);
|
|
48
69
|
}
|
|
49
70
|
});
|
|
50
71
|
}
|
|
51
72
|
else {
|
|
52
|
-
let s = signals[key] = signal(value
|
|
73
|
+
let s = signals[key] = signal(value);
|
|
53
74
|
|
|
54
75
|
defineProperty(this, key, {
|
|
55
76
|
enumerable: true,
|
|
56
77
|
get() {
|
|
57
|
-
|
|
78
|
+
if (s === undefined) {
|
|
79
|
+
s = signals[key] = signal(value);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return read(s as Signal<typeof value>);
|
|
58
83
|
},
|
|
59
|
-
set(value) {
|
|
60
|
-
|
|
84
|
+
set(v: typeof value) {
|
|
85
|
+
set(s, v);
|
|
61
86
|
}
|
|
62
87
|
});
|
|
63
88
|
}
|
|
@@ -66,16 +91,23 @@ class ReactiveObject<T extends Record<PropertyKey, unknown>> {
|
|
|
66
91
|
|
|
67
92
|
|
|
68
93
|
dispose() {
|
|
69
|
-
let
|
|
94
|
+
for (let key in this.signals) {
|
|
95
|
+
let value = this.signals[key];
|
|
70
96
|
|
|
71
|
-
|
|
72
|
-
|
|
97
|
+
if (isInstanceOf(value, Disposable)) {
|
|
98
|
+
value.dispose();
|
|
99
|
+
}
|
|
100
|
+
else if (isComputed(value)) {
|
|
101
|
+
dispose(value);
|
|
102
|
+
}
|
|
73
103
|
}
|
|
104
|
+
|
|
105
|
+
this.signals = {};
|
|
74
106
|
}
|
|
75
107
|
}
|
|
76
108
|
|
|
77
109
|
|
|
78
|
-
export default function object<T extends Record<PropertyKey, unknown>>(input: T
|
|
79
|
-
return new ReactiveObject(input
|
|
110
|
+
export default function object<T extends Record<PropertyKey, unknown>>(input: T) {
|
|
111
|
+
return new ReactiveObject(input) as API<T>;
|
|
80
112
|
};
|
|
81
|
-
export
|
|
113
|
+
export { ReactiveObject };
|