@esportsplus/reactivity 0.1.19 → 0.1.20

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/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
- export { default as macro } from './macro';
2
- export { default as resource } from './resource';
3
- export { default as reactive } from './reactive';
4
- export { computed, dispose, effect, root, signal } from './signal';
5
- export * from './constants';
1
+ export { default as macro } from './macro';
2
+ export { default as resource } from './resource';
3
+ export { default as reactive } from './reactive';
4
+ export { computed, dispose, effect, root, signal } from './signal';
5
+ export * from './constants';
6
6
  export * from './types';
package/src/macro.ts CHANGED
@@ -1,29 +1,29 @@
1
- import CustomFunction from '@esportsplus/custom-function';
2
- import { computed } from './signal';
3
- import { Computed, Options } from './types';
4
-
5
-
6
- type Function<A extends unknown[], R> = Computed<(...args: A) => R>['fn'];
7
-
8
-
9
- class Macro<A extends unknown[], R> extends CustomFunction {
10
- #factory: Computed<(...args: A) => R>;
11
-
12
-
13
- constructor(fn: Function<A,R>, options: Options = {}) {
14
- super((...args: A) => {
15
- return this.#factory.get()(...args);
16
- });
17
- this.#factory = computed(fn, options);
18
- }
19
-
20
-
21
- dispose() {
22
- this.#factory.dispose();
23
- }
24
- }
25
-
26
-
27
- export default <A extends unknown[], R>(fn: Function<A,R>, options: Options = {}) => {
28
- return new Macro(fn, options);
1
+ import CustomFunction from '@esportsplus/custom-function';
2
+ import { computed } from './signal';
3
+ import { Computed, Options } from './types';
4
+
5
+
6
+ type Function<A extends unknown[], R> = Computed<(...args: A) => R>['fn'];
7
+
8
+
9
+ class Macro<A extends unknown[], R> extends CustomFunction {
10
+ #factory: Computed<(...args: A) => R>;
11
+
12
+
13
+ constructor(fn: Function<A,R>, options: Options = {}) {
14
+ super((...args: A) => {
15
+ return this.#factory.get()(...args);
16
+ });
17
+ this.#factory = computed(fn, options);
18
+ }
19
+
20
+
21
+ dispose() {
22
+ this.#factory.dispose();
23
+ }
24
+ }
25
+
26
+
27
+ export default <A extends unknown[], R>(fn: Function<A,R>, options: Options = {}) => {
28
+ return new Macro(fn, options);
29
29
  };
@@ -1,215 +1,213 @@
1
- import { dispose, signal } from '~/signal';
2
- import { Listener, Object, Options, Signal } from '~/types';
3
- import { ReactiveObject } from './object';
4
-
5
-
6
- type Events<T> = {
7
- fill: { value: T };
8
- pop: { item: T };
9
- push: { items: T[] };
10
- reverse: undefined;
11
- shift: { item: T };
12
- sort: undefined;
13
- splice: { deleteCount: number, items: T[], start: number };
14
- unshift: { items: T[] };
15
- };
16
-
17
- type Node<T extends Object> = ReactiveObject<T>;
18
-
19
-
20
- function factory<T extends Object>(data: T[], options: Options = {}) {
21
- let signals = [];
22
-
23
- for (let i = 0, n = data.length; i < n; i++) {
24
- signals.push( new ReactiveObject(data[i], options) );
25
- }
26
-
27
- return signals;
28
- }
29
-
30
- function unsupported(method: string): never {
31
- throw new Error(`Reactivity: '${method}' is not supported on reactive object array`);
32
- }
33
-
34
-
35
- // TODO:
36
- // - patch method ( diff )
37
- class ReactiveArray<T> extends Array<T> {
38
- #signal: Signal<boolean>;
39
-
40
-
41
- constructor(data: T[]) {
42
- super(...data);
43
- this.#signal = signal(false);
44
- }
45
-
46
-
47
- set length(n: number) {
48
- if (n > this.length) {
49
- return;
50
- }
51
-
52
- this.splice(n);
53
- }
54
-
55
-
56
- private trigger() {
57
- this.#signal.set(!this.#signal.value);
58
- }
59
-
60
-
61
- dispatch<E extends keyof Events<T>>(event: E, data?: Events<T>[E]) {
62
- this.#signal.dispatch(event, data);
63
- }
64
-
65
- dispose() {
66
- this.#signal.dispose();
67
- }
68
-
69
- fill(value: T, start?: number, end?: number) {
70
- super.fill(value, start, end);
71
-
72
- this.dispatch('fill', { value });
73
- this.trigger();
74
-
75
- return this;
76
- }
77
-
78
- on<E extends keyof Events<T>>(event: E, listener: Listener<Events<T>[E]>) {
79
- this.#signal.on(event, listener);
80
- }
81
-
82
- once<E extends keyof Events<T>>(event: E, listener: Listener<Events<T>[E]>) {
83
- this.#signal.once(event, listener);
84
- }
85
-
86
- pop() {
87
- let item = super.pop();
88
-
89
- if (item !== undefined) {
90
- this.dispatch('pop', { item });
91
- this.trigger();
92
- }
93
-
94
- return item;
95
- }
96
-
97
- push(...items: T[]) {
98
- let n = super.push(...items);
99
-
100
- this.dispatch('push', { items });
101
- this.trigger();
102
-
103
- return n;
104
- }
105
-
106
- reverse() {
107
- super.reverse();
108
-
109
- this.dispatch('reverse');
110
- this.trigger();
111
-
112
- return this;
113
- }
114
-
115
- shift() {
116
- let item = super.shift();
117
-
118
- if (item !== undefined) {
119
- this.dispatch('shift', { item });
120
- this.trigger();
121
- }
122
-
123
- return item;
124
- }
125
-
126
- sort() {
127
- super.sort();
128
-
129
- this.dispatch('sort');
130
- this.trigger();
131
-
132
- return this;
133
- }
134
-
135
- splice(start: number, deleteCount: number = super.length, ...items: T[]) {
136
- let removed = super.splice(start, deleteCount, ...items);
137
-
138
- if (items.length > 0 || removed.length > 0) {
139
- this.dispatch('splice', {
140
- deleteCount,
141
- items,
142
- start
143
- });
144
- this.trigger();
145
- }
146
-
147
- return removed;
148
- }
149
-
150
- track() {
151
- this.#signal.get();
152
- }
153
-
154
- unshift(...items: T[]) {
155
- let length = super.unshift(...items);
156
-
157
- this.dispatch('unshift', { items });
158
- this.trigger();
159
-
160
- return length;
161
- }
162
- }
163
-
164
-
165
- // REMINDER:
166
- // - @ts-ignore flags are supressing a type mismatch error
167
- // - Input values are being transformed by this class into nodes
168
- class ReactiveObjectArray<T extends Object> extends ReactiveArray<Node<T>> {
169
- #options: Options;
170
-
171
-
172
- constructor(data: T[], options: Options = {}) {
173
- super( factory(data, options) );
174
- this.#options = options;
175
- }
176
-
177
-
178
- fill() {
179
- return unsupported('fill');
180
- }
181
-
182
- reverse() {
183
- return unsupported('reverse');
184
- }
185
-
186
- pop() {
187
- return dispose(super.pop()) as Node<T> | undefined;
188
- }
189
-
190
- // @ts-ignore
191
- push(...values: T[]) {
192
- return super.push(...factory(values, this.#options));
193
- }
194
-
195
- shift() {
196
- return dispose(super.shift()) as Node<T> | undefined;
197
- }
198
-
199
- sort() {
200
- return unsupported('sort');
201
- }
202
-
203
- // @ts-ignore
204
- splice(start: number, deleteCount: number = super.length, ...values: T[]) {
205
- return dispose( super.splice(start, deleteCount, ...factory(values, this.#options)) );
206
- }
207
-
208
- // @ts-ignore
209
- unshift(...values: T[]) {
210
- return super.unshift(...factory(values, this.#options));
211
- }
212
- }
213
-
214
-
1
+ import { dispose, signal } from '~/signal';
2
+ import { Listener, Object, Options, Signal } from '~/types';
3
+ import { ReactiveObject } from './object';
4
+
5
+
6
+ type Events<T> = {
7
+ fill: { value: T };
8
+ pop: { item: T };
9
+ push: { items: T[] };
10
+ reverse: undefined;
11
+ shift: { item: T };
12
+ sort: undefined;
13
+ splice: { deleteCount: number, items: T[], start: number };
14
+ unshift: { items: T[] };
15
+ };
16
+
17
+ type Node<T extends Object> = ReactiveObject<T>;
18
+
19
+
20
+ function factory<T extends Object>(data: T[], options: Options = {}) {
21
+ let signals = [];
22
+
23
+ for (let i = 0, n = data.length; i < n; i++) {
24
+ signals.push( new ReactiveObject(data[i], options) );
25
+ }
26
+
27
+ return signals;
28
+ }
29
+
30
+ function unsupported(method: string): never {
31
+ throw new Error(`Reactivity: '${method}' is not supported on reactive object array`);
32
+ }
33
+
34
+
35
+ class ReactiveArray<T> extends Array<T> {
36
+ #signal: Signal<boolean>;
37
+
38
+
39
+ constructor(data: T[]) {
40
+ super(...data);
41
+ this.#signal = signal(false);
42
+ }
43
+
44
+
45
+ set length(n: number) {
46
+ if (n > this.length) {
47
+ return;
48
+ }
49
+
50
+ this.splice(n);
51
+ }
52
+
53
+
54
+ private trigger() {
55
+ this.#signal.set(!this.#signal.value);
56
+ }
57
+
58
+
59
+ dispatch<E extends keyof Events<T>>(event: E, data?: Events<T>[E]) {
60
+ this.#signal.dispatch(event, data);
61
+ }
62
+
63
+ dispose() {
64
+ this.#signal.dispose();
65
+ }
66
+
67
+ fill(value: T, start?: number, end?: number) {
68
+ super.fill(value, start, end);
69
+
70
+ this.dispatch('fill', { value });
71
+ this.trigger();
72
+
73
+ return this;
74
+ }
75
+
76
+ on<E extends keyof Events<T>>(event: E, listener: Listener<Events<T>[E]>) {
77
+ this.#signal.on(event, listener);
78
+ }
79
+
80
+ once<E extends keyof Events<T>>(event: E, listener: Listener<Events<T>[E]>) {
81
+ this.#signal.once(event, listener);
82
+ }
83
+
84
+ pop() {
85
+ let item = super.pop();
86
+
87
+ if (item !== undefined) {
88
+ this.dispatch('pop', { item });
89
+ this.trigger();
90
+ }
91
+
92
+ return item;
93
+ }
94
+
95
+ push(...items: T[]) {
96
+ let n = super.push(...items);
97
+
98
+ this.dispatch('push', { items });
99
+ this.trigger();
100
+
101
+ return n;
102
+ }
103
+
104
+ reverse() {
105
+ super.reverse();
106
+
107
+ this.dispatch('reverse');
108
+ this.trigger();
109
+
110
+ return this;
111
+ }
112
+
113
+ shift() {
114
+ let item = super.shift();
115
+
116
+ if (item !== undefined) {
117
+ this.dispatch('shift', { item });
118
+ this.trigger();
119
+ }
120
+
121
+ return item;
122
+ }
123
+
124
+ sort() {
125
+ super.sort();
126
+
127
+ this.dispatch('sort');
128
+ this.trigger();
129
+
130
+ return this;
131
+ }
132
+
133
+ splice(start: number, deleteCount: number = super.length, ...items: T[]) {
134
+ let removed = super.splice(start, deleteCount, ...items);
135
+
136
+ if (items.length > 0 || removed.length > 0) {
137
+ this.dispatch('splice', {
138
+ deleteCount,
139
+ items,
140
+ start
141
+ });
142
+ this.trigger();
143
+ }
144
+
145
+ return removed;
146
+ }
147
+
148
+ track() {
149
+ this.#signal.get();
150
+ }
151
+
152
+ unshift(...items: T[]) {
153
+ let length = super.unshift(...items);
154
+
155
+ this.dispatch('unshift', { items });
156
+ this.trigger();
157
+
158
+ return length;
159
+ }
160
+ }
161
+
162
+
163
+ // REMINDER:
164
+ // - @ts-ignore flags are supressing a type mismatch error
165
+ // - Input values are being transformed by this class into nodes
166
+ class ReactiveObjectArray<T extends Object> extends ReactiveArray<Node<T>> {
167
+ #options: Options;
168
+
169
+
170
+ constructor(data: T[], options: Options = {}) {
171
+ super( factory(data, options) );
172
+ this.#options = options;
173
+ }
174
+
175
+
176
+ fill() {
177
+ return unsupported('fill');
178
+ }
179
+
180
+ reverse() {
181
+ return unsupported('reverse');
182
+ }
183
+
184
+ pop() {
185
+ return dispose(super.pop()) as Node<T> | undefined;
186
+ }
187
+
188
+ // @ts-ignore
189
+ push(...values: T[]) {
190
+ return super.push(...factory(values, this.#options));
191
+ }
192
+
193
+ shift() {
194
+ return dispose(super.shift()) as Node<T> | undefined;
195
+ }
196
+
197
+ sort() {
198
+ return unsupported('sort');
199
+ }
200
+
201
+ // @ts-ignore
202
+ splice(start: number, deleteCount: number = super.length, ...values: T[]) {
203
+ return dispose( super.splice(start, deleteCount, ...factory(values, this.#options)) );
204
+ }
205
+
206
+ // @ts-ignore
207
+ unshift(...values: T[]) {
208
+ return super.unshift(...factory(values, this.#options));
209
+ }
210
+ }
211
+
212
+
215
213
  export { ReactiveArray, ReactiveObjectArray };
@@ -1,38 +1,38 @@
1
- import { Computed, Object, Options, Prettify, Signal } from '~/types';
2
- import { ReactiveArray, ReactiveObjectArray } from './array';
3
- import { ReactiveObject } from './object';
4
-
5
-
6
- type Guard<T> =
7
- T extends Object
8
- ? { [K in keyof T]: Never<K, Guard<T[K]>> }
9
- : T extends unknown[]
10
- ? Guard<T[number]>[]
11
- : T;
12
-
13
- type Infer<T> =
14
- T extends (...args: unknown[]) => unknown
15
- ? ReturnType<T>
16
- : T extends unknown[]
17
- ? Infer<T[number]>[]
18
- : T extends Object
19
- ? { [K in keyof T]: T[K] }
20
- : T;
21
-
22
- type Never<K,V> = K extends keyof ReactiveObject<Object> ? never : V;
23
-
24
- type Node<T> =
25
- T extends (...args: unknown[]) => unknown
26
- ? Computed<T>
27
- : T extends unknown[]
28
- ? T extends Object[] ? ReactiveObjectArray<T[0]> : ReactiveArray<T>
29
- : Signal<T>;
30
-
31
- type Nodes<T extends Object> = { [K in keyof T]: Node<T[K]> };
32
-
33
-
34
- export default <T extends Object>(data: Guard<T>, options?: Options) => {
35
- return new ReactiveObject(data, options) as any as Prettify<
36
- { [K in keyof T]: Infer<T[K]> } & Omit<ReactiveObject<T>, 'nodes'> & { nodes: Nodes<T> }
37
- >;
1
+ import { Computed, Object, Options, Prettify, Signal } from '~/types';
2
+ import { ReactiveArray, ReactiveObjectArray } from './array';
3
+ import { ReactiveObject } from './object';
4
+
5
+
6
+ type Guard<T> =
7
+ T extends Object
8
+ ? { [K in keyof T]: Never<K, Guard<T[K]>> }
9
+ : T extends unknown[]
10
+ ? Guard<T[number]>[]
11
+ : T;
12
+
13
+ type Infer<T> =
14
+ T extends (...args: unknown[]) => unknown
15
+ ? ReturnType<T>
16
+ : T extends unknown[]
17
+ ? Infer<T[number]>[]
18
+ : T extends Object
19
+ ? { [K in keyof T]: T[K] }
20
+ : T;
21
+
22
+ type Never<K,V> = K extends keyof ReactiveObject<Object> ? never : V;
23
+
24
+ type Node<T> =
25
+ T extends (...args: unknown[]) => unknown
26
+ ? Computed<T>
27
+ : T extends unknown[]
28
+ ? T extends Object[] ? ReactiveObjectArray<T[0]> : ReactiveArray<T>
29
+ : Signal<T>;
30
+
31
+ type Nodes<T extends Object> = { [K in keyof T]: Node<T[K]> };
32
+
33
+
34
+ export default <T extends Object>(data: Guard<T>, options?: Options) => {
35
+ return new ReactiveObject(data, options) as any as Prettify<
36
+ { [K in keyof T]: Infer<T[K]> } & Omit<ReactiveObject<T>, 'nodes'> & { nodes: Nodes<T> }
37
+ >;
38
38
  };