@esportsplus/reactivity 0.16.6 → 0.17.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/reactive/array.d.ts +20 -156
- package/build/reactive/array.js +98 -173
- package/build/reactive/index.d.ts +13 -4
- package/build/reactive/index.js +6 -6
- package/build/reactive/object.d.ts +1 -14
- package/build/reactive/object.js +23 -23
- package/build/system.js +27 -24
- package/package.json +1 -1
- package/src/reactive/array.ts +106 -200
- package/src/reactive/index.ts +24 -11
- package/src/reactive/object.ts +30 -41
- package/src/system.ts +28 -24
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type ReactiveArray<T> = Prettify<T[] & {
|
|
3
|
-
clear: () => void;
|
|
4
|
-
dispose: () => void;
|
|
5
|
-
dispatch: <K extends keyof Events<T>, V>(event: K, value?: V) => void;
|
|
6
|
-
map: <R>(fn: (this: ReactiveArray<T>, value: T, i: number) => R) => R[];
|
|
7
|
-
on: <K extends keyof Events<T>>(event: K, listener: Listener<Events<T>[K]>) => void;
|
|
8
|
-
once: <K extends keyof Events<T>>(event: K, listener: Listener<Events<T>[K]>) => void;
|
|
9
|
-
}>;
|
|
1
|
+
import { REACTIVE_ARRAY } from '../constants.js';
|
|
10
2
|
type Events<T> = {
|
|
11
3
|
clear: undefined;
|
|
12
4
|
pop: {
|
|
@@ -37,150 +29,22 @@ type Listener<V> = {
|
|
|
37
29
|
once?: boolean;
|
|
38
30
|
(value: V): void;
|
|
39
31
|
};
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
clear: () => void;
|
|
60
|
-
dispose: () => void;
|
|
61
|
-
dispatch: <K extends keyof Events<T_1>, V>(event: K, value?: V | undefined) => void;
|
|
62
|
-
map: <R>(fn: (this: any, value: T, i: number) => R) => R[];
|
|
63
|
-
on: <K extends keyof Events<T_1>>(event: K, listener: Listener<Events<T>[K]>) => void;
|
|
64
|
-
once: <K extends keyof Events<T_1>>(event: K, listener: Listener<Events<T>[K]>) => void;
|
|
65
|
-
};
|
|
66
|
-
splice: {
|
|
67
|
-
(start: number, deleteCount?: number): T[];
|
|
68
|
-
(start: number, deleteCount: number, ...items: T[]): T[];
|
|
69
|
-
};
|
|
70
|
-
unshift: (...items: T[]) => number;
|
|
71
|
-
indexOf: (searchElement: T, fromIndex?: number) => number;
|
|
72
|
-
lastIndexOf: (searchElement: T, fromIndex?: number) => number;
|
|
73
|
-
every: {
|
|
74
|
-
<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is S[];
|
|
75
|
-
(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;
|
|
76
|
-
};
|
|
77
|
-
some: (predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any) => boolean;
|
|
78
|
-
forEach: (callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any) => void;
|
|
79
|
-
map: (<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any) => U[]) & (<R>(fn: (this: any, value: T, i: number) => R) => R[]);
|
|
80
|
-
filter: {
|
|
81
|
-
<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];
|
|
82
|
-
(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];
|
|
83
|
-
};
|
|
84
|
-
reduce: {
|
|
85
|
-
(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T;
|
|
86
|
-
(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T;
|
|
87
|
-
<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
|
|
88
|
-
};
|
|
89
|
-
reduceRight: {
|
|
90
|
-
(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T;
|
|
91
|
-
(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T;
|
|
92
|
-
<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
|
|
93
|
-
};
|
|
94
|
-
find: {
|
|
95
|
-
<S extends T>(predicate: (value: T, index: number, obj: T[]) => value is S, thisArg?: any): S | undefined;
|
|
96
|
-
(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T | undefined;
|
|
97
|
-
};
|
|
98
|
-
findIndex: (predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any) => number;
|
|
99
|
-
fill: (value: T, start?: number, end?: number) => T[] & {
|
|
100
|
-
clear: () => void;
|
|
101
|
-
dispose: () => void;
|
|
102
|
-
dispatch: <K extends keyof Events<T_1>, V>(event: K, value?: V | undefined) => void;
|
|
103
|
-
map: <R>(fn: (this: any, value: T, i: number) => R) => R[];
|
|
104
|
-
on: <K extends keyof Events<T_1>>(event: K, listener: Listener<Events<T>[K]>) => void;
|
|
105
|
-
once: <K extends keyof Events<T_1>>(event: K, listener: Listener<Events<T>[K]>) => void;
|
|
106
|
-
};
|
|
107
|
-
copyWithin: (target: number, start: number, end?: number) => T[] & {
|
|
108
|
-
clear: () => void;
|
|
109
|
-
dispose: () => void;
|
|
110
|
-
dispatch: <K extends keyof Events<T_1>, V>(event: K, value?: V | undefined) => void;
|
|
111
|
-
map: <R>(fn: (this: any, value: T, i: number) => R) => R[];
|
|
112
|
-
on: <K extends keyof Events<T_1>>(event: K, listener: Listener<Events<T>[K]>) => void;
|
|
113
|
-
once: <K extends keyof Events<T_1>>(event: K, listener: Listener<Events<T>[K]>) => void;
|
|
114
|
-
};
|
|
115
|
-
entries: () => ArrayIterator<[number, T]>;
|
|
116
|
-
keys: () => ArrayIterator<number>;
|
|
117
|
-
values: () => ArrayIterator<T>;
|
|
118
|
-
includes: (searchElement: T, fromIndex?: number) => boolean;
|
|
119
|
-
flatMap: <U, This = undefined>(callback: (this: This, value: T, index: number, array: T[]) => U | readonly U[], thisArg?: This | undefined) => U[];
|
|
120
|
-
flat: <A, D extends number = 1>(this: A, depth?: D | undefined) => FlatArray<A, D>[];
|
|
121
|
-
at: (index: number) => T | undefined;
|
|
122
|
-
findLast: {
|
|
123
|
-
<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S | undefined;
|
|
124
|
-
(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T | undefined;
|
|
125
|
-
};
|
|
126
|
-
findLastIndex: (predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any) => number;
|
|
127
|
-
toReversed: () => T[];
|
|
128
|
-
toSorted: (compareFn?: ((a: T, b: T) => number) | undefined) => T[];
|
|
129
|
-
toSpliced: {
|
|
130
|
-
(start: number, deleteCount: number, ...items: T[]): T[];
|
|
131
|
-
(start: number, deleteCount?: number): T[];
|
|
132
|
-
};
|
|
133
|
-
with: (index: number, value: T) => T[];
|
|
134
|
-
[Symbol.iterator]: () => ArrayIterator<T>;
|
|
135
|
-
readonly [Symbol.unscopables]: {
|
|
136
|
-
[x: number]: boolean | undefined;
|
|
137
|
-
length?: boolean | undefined;
|
|
138
|
-
toString?: boolean | undefined;
|
|
139
|
-
toLocaleString?: boolean | undefined;
|
|
140
|
-
pop?: boolean | undefined;
|
|
141
|
-
push?: boolean | undefined;
|
|
142
|
-
concat?: boolean | undefined;
|
|
143
|
-
join?: boolean | undefined;
|
|
144
|
-
reverse?: boolean | undefined;
|
|
145
|
-
shift?: boolean | undefined;
|
|
146
|
-
slice?: boolean | undefined;
|
|
147
|
-
sort?: boolean | undefined;
|
|
148
|
-
splice?: boolean | undefined;
|
|
149
|
-
unshift?: boolean | undefined;
|
|
150
|
-
indexOf?: boolean | undefined;
|
|
151
|
-
lastIndexOf?: boolean | undefined;
|
|
152
|
-
every?: boolean | undefined;
|
|
153
|
-
some?: boolean | undefined;
|
|
154
|
-
forEach?: boolean | undefined;
|
|
155
|
-
map?: boolean | undefined;
|
|
156
|
-
filter?: boolean | undefined;
|
|
157
|
-
reduce?: boolean | undefined;
|
|
158
|
-
reduceRight?: boolean | undefined;
|
|
159
|
-
find?: boolean | undefined;
|
|
160
|
-
findIndex?: boolean | undefined;
|
|
161
|
-
fill?: boolean | undefined;
|
|
162
|
-
copyWithin?: boolean | undefined;
|
|
163
|
-
entries?: boolean | undefined;
|
|
164
|
-
keys?: boolean | undefined;
|
|
165
|
-
values?: boolean | undefined;
|
|
166
|
-
includes?: boolean | undefined;
|
|
167
|
-
flatMap?: boolean | undefined;
|
|
168
|
-
flat?: boolean | undefined;
|
|
169
|
-
at?: boolean | undefined;
|
|
170
|
-
findLast?: boolean | undefined;
|
|
171
|
-
findLastIndex?: boolean | undefined;
|
|
172
|
-
toReversed?: boolean | undefined;
|
|
173
|
-
toSorted?: boolean | undefined;
|
|
174
|
-
toSpliced?: boolean | undefined;
|
|
175
|
-
with?: boolean | undefined;
|
|
176
|
-
[Symbol.iterator]?: boolean | undefined;
|
|
177
|
-
readonly [Symbol.unscopables]?: boolean | undefined;
|
|
178
|
-
};
|
|
179
|
-
clear: () => void;
|
|
180
|
-
dispose: () => void;
|
|
181
|
-
dispatch: <K extends keyof Events<T_1>, V>(event: K, value?: V | undefined) => void;
|
|
182
|
-
on: <K extends keyof Events<T_1>>(event: K, listener: Listener<Events<T>[K]>) => void;
|
|
183
|
-
once: <K extends keyof Events<T_1>>(event: K, listener: Listener<Events<T>[K]>) => void;
|
|
184
|
-
};
|
|
185
|
-
export default _default;
|
|
186
|
-
export type { ReactiveArray };
|
|
32
|
+
type Listeners = Record<string, (Listener<any> | null)[]>;
|
|
33
|
+
declare class ReactiveArray<T> extends Array<T> {
|
|
34
|
+
[REACTIVE_ARRAY]: boolean;
|
|
35
|
+
listeners: Listeners;
|
|
36
|
+
constructor(...items: T[]);
|
|
37
|
+
clear(): void;
|
|
38
|
+
dispatch<K extends keyof Events<T>, V>(event: K, value?: V): void;
|
|
39
|
+
dispose(): void;
|
|
40
|
+
on<K extends keyof Events<T>>(event: K, listener: Listener<Events<T>[K]>): void;
|
|
41
|
+
once<K extends keyof Events<T>>(event: K, listener: Listener<Events<T>[K]>): void;
|
|
42
|
+
pop(): T | undefined;
|
|
43
|
+
push(...items: T[]): number;
|
|
44
|
+
reverse(): this;
|
|
45
|
+
shift(): T | undefined;
|
|
46
|
+
sort(fn: (a: T, b: T) => number): this;
|
|
47
|
+
splice(start: number, deleteCount?: number, ...items: T[]): T[];
|
|
48
|
+
unshift(...items: T[]): number;
|
|
49
|
+
}
|
|
50
|
+
export { ReactiveArray };
|
package/build/reactive/array.js
CHANGED
|
@@ -1,194 +1,119 @@
|
|
|
1
|
-
import { isNumber } from '@esportsplus/utilities';
|
|
2
1
|
import { REACTIVE_ARRAY } from '../constants.js';
|
|
3
2
|
import { isReactiveObject } from './object.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
class ReactiveArray extends Array {
|
|
4
|
+
[REACTIVE_ARRAY] = true;
|
|
5
|
+
listeners = {};
|
|
6
|
+
constructor(...items) {
|
|
7
|
+
super(...items);
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
dispatch(listeners, 'clear');
|
|
12
|
-
}
|
|
13
|
-
function dispatch(listeners, event, value) {
|
|
14
|
-
if (listeners === null || listeners[event] === undefined) {
|
|
15
|
-
return;
|
|
9
|
+
clear() {
|
|
10
|
+
this.dispose();
|
|
11
|
+
this.dispatch('clear');
|
|
16
12
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
continue;
|
|
13
|
+
dispatch(event, value) {
|
|
14
|
+
let listeners = this.listeners[event];
|
|
15
|
+
if (!listeners) {
|
|
16
|
+
return;
|
|
22
17
|
}
|
|
23
|
-
|
|
24
|
-
listener
|
|
25
|
-
if (listener
|
|
26
|
-
|
|
18
|
+
for (let i = 0, n = listeners.length; i < n; i++) {
|
|
19
|
+
let listener = listeners[i];
|
|
20
|
+
if (listener === null) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
listener(value);
|
|
25
|
+
if (listener.once !== undefined) {
|
|
26
|
+
listeners[i] = null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
listeners[i] = null;
|
|
27
31
|
}
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
bucket[i] = null;
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
dispose() {
|
|
35
|
+
let item;
|
|
36
|
+
while (item = super.pop()) {
|
|
37
|
+
if (isReactiveObject(item)) {
|
|
38
|
+
item.dispose();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
38
41
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
on(event, listener) {
|
|
43
|
+
let listeners = this.listeners[event];
|
|
44
|
+
if (listeners === undefined) {
|
|
45
|
+
this.listeners[event] = [listener];
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
let hole = listeners.length;
|
|
49
|
+
for (let i = 0, n = hole; i < n; i++) {
|
|
50
|
+
let l = listeners[i];
|
|
51
|
+
if (l === listener) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
else if (l === null && hole === n) {
|
|
55
|
+
hole = i;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
listeners[hole] = listener;
|
|
59
|
+
}
|
|
44
60
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
let bucket = listeners[event];
|
|
49
|
-
if (bucket === undefined) {
|
|
50
|
-
listeners[event] = [listener];
|
|
61
|
+
once(event, listener) {
|
|
62
|
+
listener.once = true;
|
|
63
|
+
this.on(event, listener);
|
|
51
64
|
}
|
|
52
|
-
|
|
53
|
-
let
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
else if (l === null && hole === n) {
|
|
60
|
-
hole = i;
|
|
65
|
+
pop() {
|
|
66
|
+
let item = super.pop();
|
|
67
|
+
if (item !== undefined) {
|
|
68
|
+
if (isReactiveObject(item)) {
|
|
69
|
+
item.dispose();
|
|
61
70
|
}
|
|
71
|
+
this.dispatch('pop', { item });
|
|
62
72
|
}
|
|
63
|
-
|
|
73
|
+
return item;
|
|
64
74
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
function pop(data, listeners) {
|
|
71
|
-
let item = data.pop();
|
|
72
|
-
if (item !== undefined) {
|
|
73
|
-
cleanup(item);
|
|
74
|
-
dispatch(listeners, 'pop', { item });
|
|
75
|
+
push(...items) {
|
|
76
|
+
let length = super.push(...items);
|
|
77
|
+
this.dispatch('push', { items });
|
|
78
|
+
return length;
|
|
75
79
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
dispatch(listeners, 'push', { items });
|
|
81
|
-
return n;
|
|
82
|
-
}
|
|
83
|
-
function reverse(data, listeners) {
|
|
84
|
-
data.reverse();
|
|
85
|
-
dispatch(listeners, 'reverse');
|
|
86
|
-
}
|
|
87
|
-
function shift(data, listeners) {
|
|
88
|
-
let item = data.shift();
|
|
89
|
-
if (item !== undefined) {
|
|
90
|
-
cleanup(item);
|
|
91
|
-
dispatch(listeners, 'shift', { item });
|
|
80
|
+
reverse() {
|
|
81
|
+
super.reverse();
|
|
82
|
+
this.dispatch('reverse');
|
|
83
|
+
return this;
|
|
92
84
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
let removed = data.splice(start, deleteCount, ...items);
|
|
101
|
-
if (items.length > 0 || removed.length > 0) {
|
|
102
|
-
for (let i = 0, n = removed.length; i < n; i++) {
|
|
103
|
-
cleanup(removed[i]);
|
|
85
|
+
shift() {
|
|
86
|
+
let item = super.shift();
|
|
87
|
+
if (item !== undefined) {
|
|
88
|
+
if (isReactiveObject(item)) {
|
|
89
|
+
item.dispose();
|
|
90
|
+
}
|
|
91
|
+
this.dispatch('shift', { item });
|
|
104
92
|
}
|
|
105
|
-
|
|
106
|
-
deleteCount,
|
|
107
|
-
items,
|
|
108
|
-
start
|
|
109
|
-
});
|
|
93
|
+
return item;
|
|
110
94
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
else if (key in wrapper) {
|
|
125
|
-
return wrapper[key];
|
|
126
|
-
}
|
|
127
|
-
else if (key === 'length') {
|
|
128
|
-
return data.length;
|
|
129
|
-
}
|
|
130
|
-
return data[key];
|
|
131
|
-
},
|
|
132
|
-
set(_, key, value) {
|
|
133
|
-
if (isNumber(key)) {
|
|
134
|
-
splice(data, listeners, key, 1, value);
|
|
135
|
-
}
|
|
136
|
-
else if (key === 'length') {
|
|
137
|
-
if (value >= data.length) {
|
|
138
|
-
}
|
|
139
|
-
else if (value === 0) {
|
|
140
|
-
clear(data, listeners);
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
splice(data, listeners, value);
|
|
95
|
+
sort(fn) {
|
|
96
|
+
super.sort(fn);
|
|
97
|
+
this.dispatch('sort');
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
splice(start, deleteCount = this.length, ...items) {
|
|
101
|
+
let removed = super.splice(start, deleteCount, ...items);
|
|
102
|
+
if (items.length > 0 || removed.length > 0) {
|
|
103
|
+
for (let i = 0, n = removed.length; i < n; i++) {
|
|
104
|
+
let item = removed[i];
|
|
105
|
+
if (isReactiveObject(item)) {
|
|
106
|
+
item.dispose();
|
|
144
107
|
}
|
|
145
108
|
}
|
|
146
|
-
|
|
147
|
-
return false;
|
|
148
|
-
}
|
|
149
|
-
return true;
|
|
109
|
+
this.dispatch('splice', { deleteCount, items, start });
|
|
150
110
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return proxy;
|
|
161
|
-
},
|
|
162
|
-
dispose: () => {
|
|
163
|
-
dispose(data);
|
|
164
|
-
return proxy;
|
|
165
|
-
},
|
|
166
|
-
map: (fn) => {
|
|
167
|
-
return map(data, proxy, fn);
|
|
168
|
-
},
|
|
169
|
-
on: (event, listener) => {
|
|
170
|
-
on(listeners, event, listener);
|
|
171
|
-
return proxy;
|
|
172
|
-
},
|
|
173
|
-
once: (event, listener) => {
|
|
174
|
-
once(listeners, event, listener);
|
|
175
|
-
return proxy;
|
|
176
|
-
},
|
|
177
|
-
pop: () => pop(data, listeners),
|
|
178
|
-
push: (...items) => push(data, listeners, items),
|
|
179
|
-
reverse: () => {
|
|
180
|
-
reverse(data, listeners);
|
|
181
|
-
return proxy;
|
|
182
|
-
},
|
|
183
|
-
shift: () => shift(data, listeners),
|
|
184
|
-
sort: (fn) => {
|
|
185
|
-
sort(data, listeners, fn);
|
|
186
|
-
return proxy;
|
|
187
|
-
},
|
|
188
|
-
splice: (start, deleteCount, ...items) => {
|
|
189
|
-
return splice(data, listeners, start, deleteCount, items);
|
|
190
|
-
},
|
|
191
|
-
unshift: (...items) => unshift(data, listeners, items),
|
|
192
|
-
};
|
|
193
|
-
return proxy;
|
|
194
|
-
};
|
|
111
|
+
return removed;
|
|
112
|
+
}
|
|
113
|
+
unshift(...items) {
|
|
114
|
+
let length = super.unshift(...items);
|
|
115
|
+
this.dispatch('unshift', { items });
|
|
116
|
+
return length;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export { ReactiveArray };
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
+
import { Prettify } from '@esportsplus/utilities';
|
|
1
2
|
import { ReactiveArray } from './array.js';
|
|
2
3
|
import { ReactiveObject } from './object.js';
|
|
3
|
-
type API<T> = T extends Record<PropertyKey, unknown> ?
|
|
4
|
-
|
|
4
|
+
type API<T> = T extends Record<PropertyKey, unknown> ? Prettify<{
|
|
5
|
+
[K in keyof T]: Infer<T[K]>;
|
|
6
|
+
} & {
|
|
7
|
+
dispose: VoidFunction;
|
|
8
|
+
}> : T extends (infer U)[] ? ReactiveArray<U> : never;
|
|
9
|
+
type Guard<T> = T extends {
|
|
5
10
|
dispose: any;
|
|
6
11
|
} ? {
|
|
7
|
-
never:
|
|
8
|
-
} : T
|
|
12
|
+
never: '[ dispose ] are reserved keys';
|
|
13
|
+
} : T;
|
|
14
|
+
type Infer<T> = T extends (...args: unknown[]) => Promise<infer R> ? R | undefined : T extends (...args: any[]) => infer R ? R : T extends (infer U)[] ? ReactiveArray<U> : T extends ReactiveObject<any> ? T : T extends Record<PropertyKey, unknown> ? {
|
|
15
|
+
[K in keyof T]: T[K];
|
|
16
|
+
} : T;
|
|
17
|
+
declare const _default: <T extends Record<PropertyKey, any> | unknown[]>(input: Guard<T>) => API<T>;
|
|
9
18
|
export default _default;
|
package/build/reactive/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { isArray, isObject } from '@esportsplus/utilities';
|
|
2
2
|
import { onCleanup, root } from '../system.js';
|
|
3
|
-
import
|
|
4
|
-
import
|
|
3
|
+
import { ReactiveArray } from './array.js';
|
|
4
|
+
import { ReactiveObject } from './object.js';
|
|
5
5
|
export default (input) => {
|
|
6
6
|
let dispose = false, value = root(() => {
|
|
7
7
|
let response;
|
|
8
|
-
if (
|
|
9
|
-
response =
|
|
8
|
+
if (isObject(input)) {
|
|
9
|
+
response = new ReactiveObject(input);
|
|
10
10
|
}
|
|
11
|
-
else if (
|
|
12
|
-
response =
|
|
11
|
+
else if (isArray(input)) {
|
|
12
|
+
response = new ReactiveArray(...input);
|
|
13
13
|
}
|
|
14
14
|
if (response) {
|
|
15
15
|
if (root.disposables) {
|
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
import { Prettify } from '@esportsplus/utilities';
|
|
2
1
|
import { REACTIVE_OBJECT } from '../constants.js';
|
|
3
|
-
import { ReactiveArray } from './array.js';
|
|
4
|
-
type API<T> = Prettify<{
|
|
5
|
-
[K in keyof T]: Infer<T[K]>;
|
|
6
|
-
} & {
|
|
7
|
-
dispose: VoidFunction;
|
|
8
|
-
}>;
|
|
9
|
-
type Infer<T> = T extends (...args: unknown[]) => Promise<infer R> ? R | undefined : T extends (...args: any[]) => infer R ? R : T extends unknown[] ? ReactiveArray<T> : T extends ReactiveObject<any> ? T : T extends Record<PropertyKey, unknown> ? {
|
|
10
|
-
[K in keyof T]: T[K];
|
|
11
|
-
} : T;
|
|
12
2
|
declare class ReactiveObject<T extends Record<PropertyKey, unknown>> {
|
|
13
3
|
[REACTIVE_OBJECT]: boolean;
|
|
14
4
|
private disposers;
|
|
@@ -16,7 +6,4 @@ declare class ReactiveObject<T extends Record<PropertyKey, unknown>> {
|
|
|
16
6
|
dispose(): void;
|
|
17
7
|
}
|
|
18
8
|
declare const isReactiveObject: (value: any) => value is ReactiveObject<any>;
|
|
19
|
-
|
|
20
|
-
export default _default;
|
|
21
|
-
export { isReactiveObject };
|
|
22
|
-
export type { API as ReactiveObject };
|
|
9
|
+
export { isReactiveObject, ReactiveObject };
|
package/build/reactive/object.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { defineProperty, isArray,
|
|
1
|
+
import { defineProperty, isArray, isObject, isPromise } from '@esportsplus/utilities';
|
|
2
2
|
import { computed, dispose, effect, read, root, set, signal } from '../system.js';
|
|
3
3
|
import { REACTIVE_OBJECT } from '../constants.js';
|
|
4
|
-
import
|
|
4
|
+
import { ReactiveArray } from './array.js';
|
|
5
5
|
class ReactiveObject {
|
|
6
6
|
[REACTIVE_OBJECT] = true;
|
|
7
7
|
disposers = null;
|
|
@@ -9,15 +9,8 @@ class ReactiveObject {
|
|
|
9
9
|
let keys = Object.keys(data);
|
|
10
10
|
for (let i = 0, n = keys.length; i < n; i++) {
|
|
11
11
|
let key = keys[i], value = data[key];
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
(this.disposers ??= []).push(() => node.dispose());
|
|
15
|
-
defineProperty(this, key, {
|
|
16
|
-
enumerable: true,
|
|
17
|
-
value: node
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
else if (isFunction(value)) {
|
|
12
|
+
let type = typeof value;
|
|
13
|
+
if (type === 'function') {
|
|
21
14
|
let node;
|
|
22
15
|
defineProperty(this, key, {
|
|
23
16
|
enumerable: true,
|
|
@@ -46,19 +39,29 @@ class ReactiveObject {
|
|
|
46
39
|
return read(node);
|
|
47
40
|
}
|
|
48
41
|
});
|
|
42
|
+
continue;
|
|
49
43
|
}
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
if (value == null || type !== 'object') {
|
|
45
|
+
}
|
|
46
|
+
else if (isArray(value)) {
|
|
47
|
+
let node = new ReactiveArray(value);
|
|
48
|
+
(this.disposers ??= []).push(() => node.dispose());
|
|
52
49
|
defineProperty(this, key, {
|
|
53
50
|
enumerable: true,
|
|
54
|
-
|
|
55
|
-
return read(node);
|
|
56
|
-
},
|
|
57
|
-
set(v) {
|
|
58
|
-
set(node, v);
|
|
59
|
-
}
|
|
51
|
+
value: node
|
|
60
52
|
});
|
|
53
|
+
continue;
|
|
61
54
|
}
|
|
55
|
+
let node = signal(value);
|
|
56
|
+
defineProperty(this, key, {
|
|
57
|
+
enumerable: true,
|
|
58
|
+
get() {
|
|
59
|
+
return read(node);
|
|
60
|
+
},
|
|
61
|
+
set(v) {
|
|
62
|
+
set(node, v);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
62
65
|
}
|
|
63
66
|
}
|
|
64
67
|
dispose() {
|
|
@@ -74,7 +77,4 @@ class ReactiveObject {
|
|
|
74
77
|
const isReactiveObject = (value) => {
|
|
75
78
|
return isObject(value) && REACTIVE_OBJECT in value;
|
|
76
79
|
};
|
|
77
|
-
export
|
|
78
|
-
return new ReactiveObject(input);
|
|
79
|
-
};
|
|
80
|
-
export { isReactiveObject };
|
|
80
|
+
export { isReactiveObject, ReactiveObject };
|