@esportsplus/reactivity 0.4.8 → 0.6.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/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 +3 -3
- package/build/reactive/index.js +10 -6
- package/build/reactive/object.d.ts +12 -7
- package/build/reactive/object.js +55 -22
- package/build/reactive/promise.d.ts +13 -0
- package/build/reactive/promise.js +48 -0
- package/build/signal.d.ts +15 -31
- package/build/signal.js +270 -232
- 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 +18 -12
- package/src/reactive/object.ts +69 -26
- package/src/reactive/promise.ts +67 -0
- 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/build/constants.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
declare const
|
|
2
|
-
declare const
|
|
3
|
-
declare const
|
|
4
|
-
declare const
|
|
5
|
-
declare const
|
|
6
|
-
declare const
|
|
7
|
-
|
|
8
|
-
declare const SIGNAL = 3;
|
|
9
|
-
export { CHECK, CLEAN, COMPUTED, DIRTY, DISPOSED, EFFECT, ROOT, SIGNAL };
|
|
1
|
+
declare const REACTIVE: unique symbol;
|
|
2
|
+
declare const STATE_NONE = 0;
|
|
3
|
+
declare const STATE_CHECK: number;
|
|
4
|
+
declare const STATE_DIRTY: number;
|
|
5
|
+
declare const STATE_RECOMPUTING: number;
|
|
6
|
+
declare const STATE_IN_HEAP: number;
|
|
7
|
+
export { REACTIVE, STATE_CHECK, STATE_DIRTY, STATE_IN_HEAP, STATE_NONE, STATE_RECOMPUTING };
|
package/build/constants.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
const SIGNAL = 3;
|
|
9
|
-
export { CHECK, CLEAN, COMPUTED, DIRTY, DISPOSED, EFFECT, ROOT, SIGNAL };
|
|
1
|
+
const REACTIVE = Symbol('reactive');
|
|
2
|
+
const STATE_NONE = 0;
|
|
3
|
+
const STATE_CHECK = 1 << 0;
|
|
4
|
+
const STATE_DIRTY = 1 << 1;
|
|
5
|
+
const STATE_RECOMPUTING = 1 << 2;
|
|
6
|
+
const STATE_IN_HEAP = 1 << 3;
|
|
7
|
+
export { REACTIVE, STATE_CHECK, STATE_DIRTY, STATE_IN_HEAP, STATE_NONE, STATE_RECOMPUTING };
|
package/build/index.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export { default as macro } from './macro.js';
|
|
2
1
|
export { default as reactive } from './reactive/index.js';
|
|
3
|
-
export { computed, dispose,
|
|
4
|
-
export * from './constants.js';
|
|
2
|
+
export { computed, dispose, oncleanup, root, signal, stabilize } from './signal.js';
|
|
5
3
|
export * from './types.js';
|
package/build/index.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export { default as macro } from './macro.js';
|
|
2
1
|
export { default as reactive } from './reactive/index.js';
|
|
3
|
-
export { computed, dispose,
|
|
4
|
-
export * from './constants.js';
|
|
2
|
+
export { computed, dispose, oncleanup, root, signal, stabilize } from './signal.js';
|
|
5
3
|
export * from './types.js';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Infer } from '../types.js';
|
|
2
|
-
import {
|
|
1
|
+
import { Computed, Infer } from '../types.js';
|
|
2
|
+
import { ReactiveObject } from './object.js';
|
|
3
|
+
import { Disposable } from './disposable.js';
|
|
3
4
|
type API<T> = Infer<T>[] & ReactiveArray<T>;
|
|
4
5
|
type Events<T> = {
|
|
5
6
|
pop: {
|
|
@@ -26,30 +27,32 @@ type Events<T> = {
|
|
|
26
27
|
items: Item<T>[];
|
|
27
28
|
};
|
|
28
29
|
};
|
|
29
|
-
type Item<T> = T extends Record<PropertyKey, unknown> ?
|
|
30
|
-
|
|
30
|
+
type Item<T> = Computed<T> | ReactiveArray<T> | ReactiveObject<T extends Record<PropertyKey, unknown> ? T : never> | T;
|
|
31
|
+
type Listener<V> = {
|
|
32
|
+
once?: boolean;
|
|
33
|
+
(value: V): void;
|
|
34
|
+
};
|
|
35
|
+
type Value<T> = T extends Record<PropertyKey, unknown> ? ReactiveObject<T> : T extends Array<infer U> ? ReactiveArray<U> : T;
|
|
36
|
+
declare class ReactiveArray<T> extends Disposable {
|
|
31
37
|
private data;
|
|
32
|
-
private
|
|
38
|
+
private listeners;
|
|
33
39
|
private proxy;
|
|
34
|
-
|
|
35
|
-
constructor(data: Item<T>[], proxy: API<T>, options?: Options);
|
|
40
|
+
constructor(data: Item<T>[], proxy: API<T>);
|
|
36
41
|
get length(): number;
|
|
37
42
|
set length(n: number);
|
|
38
|
-
at(i: number):
|
|
39
|
-
dispatch<
|
|
43
|
+
at(i: number): ReactiveArray<T> | T | ReactiveObject<T extends Record<PropertyKey, unknown> ? T : never>;
|
|
44
|
+
dispatch<D>(event: keyof Events<T>, value?: D): void;
|
|
40
45
|
dispose(): void;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
once<E extends keyof Events<unknown>>(event: E, listener: Listener<Events<T>[E]>): void;
|
|
46
|
+
map<R>(fn: (this: API<T>, value: Value<T>, i: number) => R, i?: number, n?: number): R[];
|
|
47
|
+
on<T>(event: keyof Events<T>, listener: Listener<T>): void;
|
|
48
|
+
once<T>(event: keyof Events<T>, listener: Listener<T>): void;
|
|
45
49
|
pop(): Item<T> | undefined;
|
|
46
50
|
push(...input: T[]): number;
|
|
47
51
|
reverse(): this;
|
|
48
52
|
shift(): Item<T> | undefined;
|
|
49
|
-
sort(fn: (a: T
|
|
53
|
+
sort(fn: (a: Value<T>, b: Value<T>) => number): this;
|
|
50
54
|
splice(start: number, deleteCount?: number, ...input: T[]): Item<T>[];
|
|
51
55
|
unshift(...input: T[]): number;
|
|
52
56
|
}
|
|
53
|
-
|
|
54
|
-
export
|
|
55
|
-
export type { API as ReactiveArray };
|
|
57
|
+
export default function array<T>(input: T[]): API<T>;
|
|
58
|
+
export { ReactiveArray };
|
package/build/reactive/array.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { isInstanceOf, isNumber, isObject } from '@esportsplus/utilities';
|
|
2
|
-
import { dispose,
|
|
1
|
+
import { isArray, isFunction, isInstanceOf, isNumber, isObject } from '@esportsplus/utilities';
|
|
2
|
+
import { computed, dispose, isComputed, read } from '../signal.js';
|
|
3
3
|
import object from './object.js';
|
|
4
|
-
|
|
4
|
+
import { Disposable } from './disposable.js';
|
|
5
|
+
class ReactiveArray extends Disposable {
|
|
5
6
|
data;
|
|
6
|
-
|
|
7
|
+
listeners = null;
|
|
7
8
|
proxy;
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
constructor(data, proxy) {
|
|
10
|
+
super();
|
|
10
11
|
this.data = data;
|
|
11
|
-
this.options = options;
|
|
12
12
|
this.proxy = proxy;
|
|
13
|
-
this.signal = signal(false);
|
|
14
13
|
}
|
|
15
14
|
get length() {
|
|
16
15
|
return this.data.length;
|
|
@@ -23,26 +22,44 @@ class ReactiveArray {
|
|
|
23
22
|
}
|
|
24
23
|
at(i) {
|
|
25
24
|
let value = this.data[i];
|
|
26
|
-
if (
|
|
27
|
-
return value
|
|
25
|
+
if (isComputed(value)) {
|
|
26
|
+
return read(value);
|
|
28
27
|
}
|
|
29
28
|
return value;
|
|
30
29
|
}
|
|
31
|
-
dispatch(event,
|
|
32
|
-
this.
|
|
30
|
+
dispatch(event, value) {
|
|
31
|
+
if (this.listeners === null || this.listeners[event] === undefined) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
let listeners = this.listeners[event];
|
|
35
|
+
for (let i = 0, n = listeners.length; i < n; i++) {
|
|
36
|
+
let listener = listeners[i];
|
|
37
|
+
if (listener === null) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
listener(value);
|
|
42
|
+
if (listener.once !== undefined) {
|
|
43
|
+
listeners[i] = null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
listeners[i] = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
33
50
|
}
|
|
34
51
|
dispose() {
|
|
35
|
-
this.signal.dispose();
|
|
36
|
-
dispose(this.data);
|
|
37
|
-
}
|
|
38
|
-
indexOf(value, fromIndex) {
|
|
39
52
|
let data = this.data;
|
|
40
|
-
for (let i =
|
|
41
|
-
|
|
42
|
-
|
|
53
|
+
for (let i = 0, n = data.length; i < n; i++) {
|
|
54
|
+
let value = data[i];
|
|
55
|
+
if (isInstanceOf(value, Disposable)) {
|
|
56
|
+
value.dispose();
|
|
57
|
+
}
|
|
58
|
+
else if (isComputed(value)) {
|
|
59
|
+
dispose(value);
|
|
43
60
|
}
|
|
44
61
|
}
|
|
45
|
-
|
|
62
|
+
this.listeners = null;
|
|
46
63
|
}
|
|
47
64
|
map(fn, i, n) {
|
|
48
65
|
let { data, proxy } = this, values = [];
|
|
@@ -55,52 +72,79 @@ class ReactiveArray {
|
|
|
55
72
|
n = Math.min(n, data.length);
|
|
56
73
|
for (; i < n; i++) {
|
|
57
74
|
let item = data[i];
|
|
58
|
-
values.push(fn.call(proxy,
|
|
75
|
+
values.push(fn.call(proxy, (isComputed(item) ? item.value : item), i));
|
|
59
76
|
}
|
|
60
77
|
return values;
|
|
61
78
|
}
|
|
62
79
|
on(event, listener) {
|
|
63
|
-
this.
|
|
80
|
+
if (this.listeners === null) {
|
|
81
|
+
this.listeners = { [event]: [listener] };
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
let listeners = this.listeners[event];
|
|
85
|
+
if (listeners === undefined) {
|
|
86
|
+
this.listeners[event] = [listener];
|
|
87
|
+
}
|
|
88
|
+
else if (listeners.indexOf(listener) === -1) {
|
|
89
|
+
let i = listeners.indexOf(null);
|
|
90
|
+
if (i === -1) {
|
|
91
|
+
listeners.push(listener);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
listeners[i] = listener;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
64
98
|
}
|
|
65
99
|
once(event, listener) {
|
|
66
|
-
|
|
100
|
+
listener.once = true;
|
|
101
|
+
this.on(event, listener);
|
|
67
102
|
}
|
|
68
103
|
pop() {
|
|
69
104
|
let item = this.data.pop();
|
|
70
105
|
if (item !== undefined) {
|
|
71
|
-
|
|
72
|
-
|
|
106
|
+
if (isComputed(item)) {
|
|
107
|
+
dispose(item);
|
|
108
|
+
}
|
|
109
|
+
this.dispatch('pop', { item });
|
|
73
110
|
}
|
|
74
111
|
return item;
|
|
75
112
|
}
|
|
76
113
|
push(...input) {
|
|
77
|
-
let items = factory(input
|
|
78
|
-
this.
|
|
114
|
+
let items = factory(input), n = this.data.push(...items);
|
|
115
|
+
this.dispatch('push', { items });
|
|
79
116
|
return n;
|
|
80
117
|
}
|
|
81
118
|
reverse() {
|
|
82
119
|
this.data.reverse();
|
|
83
|
-
this.
|
|
120
|
+
this.dispatch('reverse');
|
|
84
121
|
return this;
|
|
85
122
|
}
|
|
86
123
|
shift() {
|
|
87
124
|
let item = this.data.shift();
|
|
88
125
|
if (item !== undefined) {
|
|
89
|
-
|
|
90
|
-
|
|
126
|
+
if (isComputed(item)) {
|
|
127
|
+
dispose(item);
|
|
128
|
+
}
|
|
129
|
+
this.dispatch('shift', { item });
|
|
91
130
|
}
|
|
92
131
|
return item;
|
|
93
132
|
}
|
|
94
133
|
sort(fn) {
|
|
95
|
-
this.data.sort((a, b) => fn(
|
|
96
|
-
this.
|
|
134
|
+
this.data.sort((a, b) => fn((isComputed(a) ? a.value : a), (isComputed(b) ? b.value : b)));
|
|
135
|
+
this.dispatch('sort');
|
|
97
136
|
return this;
|
|
98
137
|
}
|
|
99
138
|
splice(start, deleteCount = this.data.length, ...input) {
|
|
100
|
-
let items = factory(input
|
|
139
|
+
let items = factory(input), removed = this.data.splice(start, deleteCount, ...items);
|
|
101
140
|
if (items.length > 0 || removed.length > 0) {
|
|
102
|
-
|
|
103
|
-
|
|
141
|
+
for (let i = 0, n = removed.length; i < n; i++) {
|
|
142
|
+
let item = removed[i];
|
|
143
|
+
if (isComputed(item)) {
|
|
144
|
+
dispose(item);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
this.dispatch('splice', {
|
|
104
148
|
deleteCount,
|
|
105
149
|
items,
|
|
106
150
|
start
|
|
@@ -109,31 +153,37 @@ class ReactiveArray {
|
|
|
109
153
|
return removed;
|
|
110
154
|
}
|
|
111
155
|
unshift(...input) {
|
|
112
|
-
let items = factory(input
|
|
113
|
-
this.
|
|
156
|
+
let items = factory(input), length = this.data.unshift(...items);
|
|
157
|
+
this.dispatch('unshift', { items });
|
|
114
158
|
return length;
|
|
115
159
|
}
|
|
116
160
|
}
|
|
117
|
-
function factory(input
|
|
161
|
+
function factory(input) {
|
|
118
162
|
let items = [];
|
|
119
163
|
for (let i = 0, n = input.length; i < n; i++) {
|
|
120
164
|
let value = input[i];
|
|
121
|
-
if (
|
|
122
|
-
items[i] =
|
|
165
|
+
if (isArray(value)) {
|
|
166
|
+
items[i] = array(value);
|
|
167
|
+
}
|
|
168
|
+
else if (isFunction(value)) {
|
|
169
|
+
items[i] = computed(value);
|
|
170
|
+
}
|
|
171
|
+
else if (isObject(value)) {
|
|
172
|
+
items[i] = object(value);
|
|
123
173
|
}
|
|
124
174
|
else {
|
|
125
|
-
items[i] =
|
|
175
|
+
items[i] = value;
|
|
126
176
|
}
|
|
127
177
|
}
|
|
128
178
|
return items;
|
|
129
179
|
}
|
|
130
|
-
export default (input
|
|
131
|
-
let
|
|
180
|
+
export default function array(input) {
|
|
181
|
+
let proxy = new Proxy({}, {
|
|
132
182
|
get(_, key) {
|
|
133
183
|
if (isNumber(key)) {
|
|
134
184
|
let value = wrapped[key];
|
|
135
|
-
if (
|
|
136
|
-
return value
|
|
185
|
+
if (isComputed(value)) {
|
|
186
|
+
return read(value);
|
|
137
187
|
}
|
|
138
188
|
return value;
|
|
139
189
|
}
|
|
@@ -145,11 +195,8 @@ export default (input, options = {}) => {
|
|
|
145
195
|
set(_, key, value) {
|
|
146
196
|
if (isNumber(key)) {
|
|
147
197
|
let host = wrapped[key];
|
|
148
|
-
if (host === undefined) {
|
|
149
|
-
wrapped[key] = factory([value]
|
|
150
|
-
}
|
|
151
|
-
else if (isInstanceOf(host, Reactive)) {
|
|
152
|
-
host.set(value);
|
|
198
|
+
if (host === undefined || !isComputed(host)) {
|
|
199
|
+
wrapped[key] = factory([value])[0];
|
|
153
200
|
}
|
|
154
201
|
else {
|
|
155
202
|
return false;
|
|
@@ -161,7 +208,9 @@ export default (input, options = {}) => {
|
|
|
161
208
|
}
|
|
162
209
|
return false;
|
|
163
210
|
}
|
|
164
|
-
});
|
|
211
|
+
}), wrapped = factory(input);
|
|
165
212
|
let a = new ReactiveArray(wrapped, proxy);
|
|
166
213
|
return proxy;
|
|
167
|
-
}
|
|
214
|
+
}
|
|
215
|
+
;
|
|
216
|
+
export { ReactiveArray };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type Guard<T> = T extends {
|
|
1
|
+
import { Reactive } from '../types.js';
|
|
2
|
+
type Guard<T> = T extends (...args: unknown[]) => Promise<unknown> ? T : T extends {
|
|
3
3
|
dispose: any;
|
|
4
4
|
} | {
|
|
5
5
|
signals: any;
|
|
6
6
|
} ? {
|
|
7
7
|
never: '[ dispose, signals ] are reserved keys';
|
|
8
8
|
} : T extends Record<PropertyKey, unknown> | unknown[] ? T : never;
|
|
9
|
-
declare const _default: <T>(data: Guard<T
|
|
9
|
+
declare const _default: <T>(data: Guard<T>) => Reactive<T>;
|
|
10
10
|
export default _default;
|
package/build/reactive/index.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import { isArray, isObject } from '@esportsplus/utilities';
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
1
|
+
import { isArray, isObject, isPromise } from '@esportsplus/utilities';
|
|
2
|
+
import array from './array.js';
|
|
3
|
+
import object from './object.js';
|
|
4
|
+
import promise from './promise.js';
|
|
5
|
+
export default (data) => {
|
|
5
6
|
let value;
|
|
6
7
|
if (isArray(data)) {
|
|
7
|
-
value = array(data
|
|
8
|
+
value = array(data);
|
|
8
9
|
}
|
|
9
10
|
else if (isObject(data)) {
|
|
10
|
-
value = object(data
|
|
11
|
+
value = object(data);
|
|
12
|
+
}
|
|
13
|
+
else if (isPromise(data)) {
|
|
14
|
+
value = promise(data);
|
|
11
15
|
}
|
|
12
16
|
else {
|
|
13
17
|
throw new Error(`@esportsplus/reactivity: 'reactive' received invalid input - ${JSON.stringify(data)}`);
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Prettify } from '@esportsplus/utilities';
|
|
2
|
+
import { Infer } from '../types.js';
|
|
3
|
+
import { Disposable } from './disposable.js';
|
|
4
|
+
type API<T extends Record<PropertyKey, unknown>> = Prettify<{
|
|
3
5
|
[K in keyof T]: Infer<T[K]>;
|
|
4
|
-
} &
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
}> & ReactiveObject<T>;
|
|
7
|
+
declare class ReactiveObject<T extends Record<PropertyKey, unknown>> extends Disposable {
|
|
8
|
+
private disposable;
|
|
9
|
+
constructor(data: T);
|
|
10
|
+
dispose(): void;
|
|
11
|
+
}
|
|
12
|
+
export default function object<T extends Record<PropertyKey, unknown>>(input: T): API<T>;
|
|
13
|
+
export { ReactiveObject };
|
package/build/reactive/object.js
CHANGED
|
@@ -1,61 +1,94 @@
|
|
|
1
|
-
import { defineProperty, isArray, isFunction, isObject } from '@esportsplus/utilities';
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { defineProperty, isArray, isAsyncFunction, isFunction, isInstanceOf, isObject } from '@esportsplus/utilities';
|
|
2
|
+
import array from './array.js';
|
|
3
|
+
import { computed, dispose, read, signal } from '../signal.js';
|
|
4
|
+
import { Disposable } from './disposable.js';
|
|
5
|
+
import promise from './promise.js';
|
|
6
|
+
let { set } = signal;
|
|
7
|
+
class ReactiveObject extends Disposable {
|
|
8
|
+
disposable = {};
|
|
9
|
+
constructor(data) {
|
|
10
|
+
super();
|
|
11
|
+
let disposable = this.disposable, triggers = {};
|
|
8
12
|
for (let key in data) {
|
|
9
13
|
let value = data[key];
|
|
10
14
|
if (isArray(value)) {
|
|
11
|
-
let
|
|
15
|
+
let a = disposable[key] = array(value), t = triggers[key] = signal(false);
|
|
12
16
|
defineProperty(this, key, {
|
|
13
17
|
enumerable: true,
|
|
14
18
|
get() {
|
|
15
|
-
|
|
19
|
+
read(t);
|
|
20
|
+
return a;
|
|
21
|
+
},
|
|
22
|
+
set(v) {
|
|
23
|
+
set(t, !!t.value);
|
|
24
|
+
a = disposable[key] = array(v);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (isAsyncFunction(value)) {
|
|
29
|
+
let p = promise(value);
|
|
30
|
+
defineProperty(this, key, {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get() {
|
|
33
|
+
return p;
|
|
16
34
|
}
|
|
17
35
|
});
|
|
18
36
|
}
|
|
19
37
|
else if (isFunction(value)) {
|
|
20
|
-
let
|
|
38
|
+
let c = disposable[key] = computed(value);
|
|
21
39
|
defineProperty(this, key, {
|
|
22
40
|
enumerable: true,
|
|
23
41
|
get() {
|
|
24
|
-
return
|
|
42
|
+
return read(c);
|
|
25
43
|
}
|
|
26
44
|
});
|
|
27
45
|
}
|
|
28
46
|
else if (isObject(value)) {
|
|
29
|
-
let
|
|
47
|
+
let o = disposable[key] = new ReactiveObject(value), t = triggers[key] = signal(false);
|
|
30
48
|
defineProperty(this, key, {
|
|
31
49
|
enumerable: true,
|
|
32
50
|
get() {
|
|
33
|
-
|
|
51
|
+
read(t);
|
|
52
|
+
return o;
|
|
53
|
+
},
|
|
54
|
+
set(v) {
|
|
55
|
+
set(t, !!t.value);
|
|
56
|
+
o = disposable[key] = new ReactiveObject(v);
|
|
34
57
|
}
|
|
35
58
|
});
|
|
36
59
|
}
|
|
37
60
|
else {
|
|
38
|
-
let s =
|
|
61
|
+
let s = signal(value);
|
|
39
62
|
defineProperty(this, key, {
|
|
40
63
|
enumerable: true,
|
|
41
64
|
get() {
|
|
42
|
-
|
|
65
|
+
if (s === undefined) {
|
|
66
|
+
s = signal(value);
|
|
67
|
+
}
|
|
68
|
+
return read(s);
|
|
43
69
|
},
|
|
44
|
-
set(
|
|
45
|
-
|
|
70
|
+
set(v) {
|
|
71
|
+
set(s, v);
|
|
46
72
|
}
|
|
47
73
|
});
|
|
48
74
|
}
|
|
49
75
|
}
|
|
50
76
|
}
|
|
51
77
|
dispose() {
|
|
52
|
-
let
|
|
53
|
-
|
|
54
|
-
|
|
78
|
+
for (let key in this.disposable) {
|
|
79
|
+
let value = this.disposable[key];
|
|
80
|
+
if (isInstanceOf(value, Disposable)) {
|
|
81
|
+
value.dispose();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
dispose(value);
|
|
85
|
+
}
|
|
55
86
|
}
|
|
87
|
+
this.disposable = {};
|
|
56
88
|
}
|
|
57
89
|
}
|
|
58
|
-
export default function object(input
|
|
59
|
-
return new ReactiveObject(input
|
|
90
|
+
export default function object(input) {
|
|
91
|
+
return new ReactiveObject(input);
|
|
60
92
|
}
|
|
61
93
|
;
|
|
94
|
+
export { ReactiveObject };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import CustomFunction from '@esportsplus/custom-function';
|
|
2
|
+
declare class ReactivePromise<A extends unknown[], R extends Promise<unknown>> extends CustomFunction {
|
|
3
|
+
private arguments;
|
|
4
|
+
private okay;
|
|
5
|
+
private response;
|
|
6
|
+
stop: boolean | null;
|
|
7
|
+
constructor(fn: (...args: A) => R);
|
|
8
|
+
get data(): Awaited<R> | null;
|
|
9
|
+
get input(): A | null;
|
|
10
|
+
get ok(): boolean | null;
|
|
11
|
+
}
|
|
12
|
+
declare const _default: <A extends unknown[], R extends Promise<unknown>>(fn: (...args: A) => R) => ReactivePromise<A, R>;
|
|
13
|
+
export default _default;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import CustomFunction from '@esportsplus/custom-function';
|
|
2
|
+
import { read, root, signal } from '../signal.js';
|
|
3
|
+
let { set } = signal;
|
|
4
|
+
class ReactivePromise extends CustomFunction {
|
|
5
|
+
arguments;
|
|
6
|
+
okay;
|
|
7
|
+
response;
|
|
8
|
+
stop = null;
|
|
9
|
+
constructor(fn) {
|
|
10
|
+
super((...args) => {
|
|
11
|
+
this.stop = null;
|
|
12
|
+
set(this.arguments, args);
|
|
13
|
+
set(this.okay, null);
|
|
14
|
+
return root(() => {
|
|
15
|
+
return fn(...args)
|
|
16
|
+
.then((value) => {
|
|
17
|
+
if (this.stop === true) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
set(this.response, value);
|
|
21
|
+
set(this.okay, true);
|
|
22
|
+
})
|
|
23
|
+
.catch(() => {
|
|
24
|
+
if (this.stop === true) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
set(this.response, null);
|
|
28
|
+
set(this.okay, false);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
this.response = signal(null);
|
|
33
|
+
this.arguments = signal(null);
|
|
34
|
+
this.okay = signal(null);
|
|
35
|
+
}
|
|
36
|
+
get data() {
|
|
37
|
+
return read(this.response);
|
|
38
|
+
}
|
|
39
|
+
get input() {
|
|
40
|
+
return read(this.arguments);
|
|
41
|
+
}
|
|
42
|
+
get ok() {
|
|
43
|
+
return read(this.okay);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export default (fn) => {
|
|
47
|
+
return new ReactivePromise(fn);
|
|
48
|
+
};
|