@esportsplus/reactivity 0.0.21 → 0.0.23
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/core.d.ts +30 -0
- package/build/core.js +218 -0
- package/build/index.d.ts +3 -12
- package/build/index.js +3 -4
- package/build/primitives/closure.d.ts +3 -0
- package/build/primitives/closure.js +10 -0
- package/build/primitives/computed.d.ts +3 -0
- package/build/primitives/computed.js +11 -0
- package/build/primitives/dispatch.d.ts +3 -0
- package/build/primitives/dispatch.js +13 -0
- package/build/primitives/dispose.d.ts +3 -0
- package/build/primitives/dispose.js +13 -0
- package/build/primitives/effect.d.ts +7 -0
- package/build/primitives/effect.js +9 -0
- package/build/primitives/index.d.ts +8 -0
- package/build/primitives/index.js +8 -0
- package/build/primitives/reactive.d.ts +3 -0
- package/build/primitives/reactive.js +35 -0
- package/build/primitives/reset.d.ts +3 -0
- package/build/primitives/reset.js +13 -0
- package/build/primitives/signal.d.ts +8 -0
- package/build/primitives/signal.js +14 -0
- package/build/signal.d.ts +16 -0
- package/build/signal.js +22 -0
- package/build/symbols.d.ts +10 -1
- package/build/symbols.js +10 -1
- package/build/types.d.ts +27 -13
- package/build/types.js +1 -1
- package/package.json +2 -2
- package/readme.md +2 -0
- package/src/core.ts +295 -0
- package/src/index.ts +3 -6
- package/src/primitives/closure.ts +15 -0
- package/src/primitives/computed.ts +16 -0
- package/src/primitives/dispatch.ts +17 -0
- package/src/primitives/dispose.ts +17 -0
- package/src/primitives/effect.ts +13 -0
- package/src/primitives/index.ts +8 -0
- package/src/primitives/reactive.ts +43 -0
- package/src/primitives/reset.ts +17 -0
- package/src/primitives/signal.ts +18 -0
- package/src/signal.ts +30 -0
- package/src/symbols.ts +22 -1
- package/src/types.ts +34 -13
- package/build/index.browser.js +0 -277
- package/src/methods/effect.ts +0 -6
- package/src/methods/index.ts +0 -5
- package/src/methods/reactive.ts +0 -71
- package/src/reactive.ts +0 -266
package/build/core.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Computed, Effect, Fn, Listener, Options, Scheduler } from './types';
|
|
2
|
+
import Signal from './signal';
|
|
3
|
+
declare const computed: <T>(fn: Fn<T>, options?: Options) => Computed<unknown>;
|
|
4
|
+
declare const dispose: (node: Signal) => void;
|
|
5
|
+
declare const effect: <T>(fn: Fn<T>, options?: Options) => Effect<unknown>;
|
|
6
|
+
declare const dispatch: (event: symbol, node: Signal) => void;
|
|
7
|
+
declare const on: (event: symbol, listener: Listener, node: Signal) => void;
|
|
8
|
+
declare const read: (node: Signal) => unknown;
|
|
9
|
+
declare const reset: (node: Signal) => void;
|
|
10
|
+
declare const root: <T>(fn: () => T, properties?: {
|
|
11
|
+
scheduler?: Scheduler;
|
|
12
|
+
}) => T;
|
|
13
|
+
declare const signal: <T>(data: T, options?: Options) => Signal<T>;
|
|
14
|
+
declare const write: (node: Signal, value: unknown) => unknown;
|
|
15
|
+
declare const _default: {
|
|
16
|
+
computed: <T>(fn: Fn<T>, options?: Options) => Computed<unknown>;
|
|
17
|
+
dispatch: (event: symbol, node: Signal<unknown>) => void;
|
|
18
|
+
dispose: (node: Signal<unknown>) => void;
|
|
19
|
+
effect: <T_1>(fn: Fn<T_1>, options?: Options) => Effect<unknown>;
|
|
20
|
+
on: (event: symbol, listener: Listener, node: Signal<unknown>) => void;
|
|
21
|
+
read: (node: Signal<unknown>) => unknown;
|
|
22
|
+
reset: (node: Signal<unknown>) => void;
|
|
23
|
+
root: <T_2>(fn: () => T_2, properties?: {
|
|
24
|
+
scheduler?: Scheduler | undefined;
|
|
25
|
+
}) => T_2;
|
|
26
|
+
signal: <T_3>(data: T_3, options?: Options) => Signal<T_3>;
|
|
27
|
+
write: (node: Signal<unknown>, value: unknown) => unknown;
|
|
28
|
+
};
|
|
29
|
+
export default _default;
|
|
30
|
+
export { computed, dispatch, dispose, effect, on, read, reset, root, signal, write };
|
package/build/core.js
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { CHECK, CLEAN, COMPUTED, DIRTY, DISPOSED, DISPOSE, EFFECT, RESET, SIGNAL, UPDATE } from './symbols';
|
|
2
|
+
import Signal from './signal';
|
|
3
|
+
let index = 0, observer = null, observers = null, scope = null;
|
|
4
|
+
function changed(a, b) {
|
|
5
|
+
return a !== b;
|
|
6
|
+
}
|
|
7
|
+
function notify(nodes, state) {
|
|
8
|
+
for (let i = 0, n = nodes.length; i < n; i++) {
|
|
9
|
+
let node = nodes[i];
|
|
10
|
+
if (node.state < state) {
|
|
11
|
+
if (node.type === EFFECT && node.state === CLEAN) {
|
|
12
|
+
node.root.scheduler(node.task);
|
|
13
|
+
}
|
|
14
|
+
node.state = state;
|
|
15
|
+
if (node.observers) {
|
|
16
|
+
notify(node.observers, CHECK);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function removeSourceObservers(node, start) {
|
|
22
|
+
if (!node.sources) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
for (let i = start, n = node.sources.length; i < n; i++) {
|
|
26
|
+
let source = node.sources[i];
|
|
27
|
+
if (!source?.observers) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
source.observers[source.observers.indexOf(node)] = source.observers[source.observers.length - 1];
|
|
31
|
+
source.observers.pop();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function sync(node) {
|
|
35
|
+
if (node.state === CHECK && node.sources) {
|
|
36
|
+
for (let i = 0, n = node.sources.length; i < n; i++) {
|
|
37
|
+
sync(node.sources[i]);
|
|
38
|
+
if (node.state === DIRTY) {
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (node.state === DIRTY) {
|
|
44
|
+
update(node);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
node.state = CLEAN;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function update(node) {
|
|
51
|
+
let i = index, o = observer, os = observers;
|
|
52
|
+
index = 0;
|
|
53
|
+
observer = node;
|
|
54
|
+
observers = null;
|
|
55
|
+
try {
|
|
56
|
+
if (node.listeners) {
|
|
57
|
+
dispatch(UPDATE, node);
|
|
58
|
+
}
|
|
59
|
+
let value = node.fn.call(node.context);
|
|
60
|
+
if (observers) {
|
|
61
|
+
if (node.sources) {
|
|
62
|
+
removeSourceObservers(node, index);
|
|
63
|
+
}
|
|
64
|
+
if (node.sources && index > 0) {
|
|
65
|
+
node.sources.length = index + observers.length;
|
|
66
|
+
for (let i = 0, n = observers.length; i < n; i++) {
|
|
67
|
+
node.sources[index + i] = observers[i];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
node.sources = observers;
|
|
72
|
+
}
|
|
73
|
+
for (let i = index, n = node.sources.length; i < n; i++) {
|
|
74
|
+
let source = node.sources[i];
|
|
75
|
+
if (!source.observers) {
|
|
76
|
+
source.observers = [node];
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
source.observers.push(node);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else if (node.sources && index < node.sources.length) {
|
|
84
|
+
removeSourceObservers(node, index);
|
|
85
|
+
node.sources.length = index;
|
|
86
|
+
}
|
|
87
|
+
if (node.type === COMPUTED) {
|
|
88
|
+
write(node, value);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
if (node.state === DIRTY && node.sources) {
|
|
93
|
+
removeSourceObservers(node, 0);
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
index = i;
|
|
99
|
+
observer = o;
|
|
100
|
+
observers = os;
|
|
101
|
+
}
|
|
102
|
+
node.state = CLEAN;
|
|
103
|
+
}
|
|
104
|
+
const computed = (fn, options = {}) => {
|
|
105
|
+
let node = new Signal(undefined, DIRTY, COMPUTED, options);
|
|
106
|
+
node.fn = fn;
|
|
107
|
+
return node;
|
|
108
|
+
};
|
|
109
|
+
const dispose = (node) => {
|
|
110
|
+
if (node.state === DISPOSED) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
node.state = DISPOSED;
|
|
114
|
+
if (node.listeners) {
|
|
115
|
+
dispatch(DISPOSE, node);
|
|
116
|
+
}
|
|
117
|
+
if (node.sources) {
|
|
118
|
+
removeSourceObservers(node, 0);
|
|
119
|
+
}
|
|
120
|
+
node.observers = null;
|
|
121
|
+
node.sources = null;
|
|
122
|
+
};
|
|
123
|
+
const effect = (fn, options = {}) => {
|
|
124
|
+
if (!scope) {
|
|
125
|
+
throw new Error('Reactivity: effects cannot be created without a reactive root');
|
|
126
|
+
}
|
|
127
|
+
let node = new Signal(undefined, DIRTY, EFFECT, options);
|
|
128
|
+
node.fn = fn;
|
|
129
|
+
node.root = scope;
|
|
130
|
+
node.task = () => read(node);
|
|
131
|
+
update(node);
|
|
132
|
+
return node;
|
|
133
|
+
};
|
|
134
|
+
const dispatch = (event, node) => {
|
|
135
|
+
if (!node.listeners?.[event]) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
let listeners = node.listeners[event], value = node.value;
|
|
139
|
+
for (let i = 0, n = listeners.length; i < n; i++) {
|
|
140
|
+
listeners[i](value);
|
|
141
|
+
}
|
|
142
|
+
node.listeners = null;
|
|
143
|
+
};
|
|
144
|
+
const on = (event, listener, node) => {
|
|
145
|
+
if (!node.listeners?.[event]) {
|
|
146
|
+
node.listeners ??= {};
|
|
147
|
+
node.listeners[event] = [listener];
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
node.listeners[event].push(listener);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const read = (node) => {
|
|
154
|
+
if (node.state === DISPOSED) {
|
|
155
|
+
return node.value;
|
|
156
|
+
}
|
|
157
|
+
if (observer) {
|
|
158
|
+
if (!observers) {
|
|
159
|
+
if (observer?.sources?.[index] == node) {
|
|
160
|
+
index++;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
observers = [node];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
observers.push(node);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (node.fn) {
|
|
171
|
+
sync(node);
|
|
172
|
+
}
|
|
173
|
+
return node.value;
|
|
174
|
+
};
|
|
175
|
+
const reset = (node) => {
|
|
176
|
+
if (node.listeners) {
|
|
177
|
+
dispatch(RESET, node);
|
|
178
|
+
}
|
|
179
|
+
if (node.sources) {
|
|
180
|
+
removeSourceObservers(node, 0);
|
|
181
|
+
}
|
|
182
|
+
node.observers = null;
|
|
183
|
+
node.sources = null;
|
|
184
|
+
if (node.type === COMPUTED) {
|
|
185
|
+
node.state = DIRTY;
|
|
186
|
+
node.value = undefined;
|
|
187
|
+
}
|
|
188
|
+
else if (node.type === SIGNAL) {
|
|
189
|
+
node.state = CLEAN;
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
const root = (fn, properties = {}) => {
|
|
193
|
+
let o = observer, s = scope;
|
|
194
|
+
properties.scheduler = properties?.scheduler || scope?.scheduler;
|
|
195
|
+
if (!properties.scheduler) {
|
|
196
|
+
throw new Error('Reactivity: root cannot be created without a task scheduler');
|
|
197
|
+
}
|
|
198
|
+
observer = null;
|
|
199
|
+
scope = properties;
|
|
200
|
+
let result = fn();
|
|
201
|
+
observer = o;
|
|
202
|
+
scope = s;
|
|
203
|
+
return result;
|
|
204
|
+
};
|
|
205
|
+
const signal = (data, options = {}) => {
|
|
206
|
+
return new Signal(data, CLEAN, SIGNAL, options);
|
|
207
|
+
};
|
|
208
|
+
const write = (node, value) => {
|
|
209
|
+
if ((node?.changed || changed)(node.value, value)) {
|
|
210
|
+
node.value = value;
|
|
211
|
+
if (node.observers) {
|
|
212
|
+
notify(node.observers, DIRTY);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return node.value;
|
|
216
|
+
};
|
|
217
|
+
export default { computed, dispatch, dispose, effect, on, read, reset, root, signal, write };
|
|
218
|
+
export { computed, dispatch, dispose, effect, on, read, reset, root, signal, write };
|
package/build/index.d.ts
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
effect: <T>(fn: () => T) => void;
|
|
5
|
-
reactive: <T_1>(value: T_1) => import("./types").Infer<T_1>;
|
|
6
|
-
scheduler: {
|
|
7
|
-
add: (scheduler: import("./types").Scheduler) => void;
|
|
8
|
-
delete: (scheduler: import("./types").Scheduler) => void;
|
|
9
|
-
};
|
|
10
|
-
};
|
|
11
|
-
export default _default;
|
|
12
|
-
export { effect, reactive, scheduler };
|
|
1
|
+
export * from './primitives';
|
|
2
|
+
export { default as core } from './core';
|
|
3
|
+
export { DISPOSE, RESET, UPDATE } from './symbols';
|
package/build/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
export { effect, reactive, scheduler };
|
|
1
|
+
export * from './primitives';
|
|
2
|
+
export { default as core } from './core';
|
|
3
|
+
export { DISPOSE, RESET, UPDATE } from './symbols';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { computed, read } from '../core';
|
|
2
|
+
import { NODE } from '../symbols';
|
|
3
|
+
export default (fn, options = {}) => {
|
|
4
|
+
let node = computed(fn, options);
|
|
5
|
+
node.context = function (...args) {
|
|
6
|
+
return read(node)(...args);
|
|
7
|
+
};
|
|
8
|
+
node.context[NODE] = node;
|
|
9
|
+
return node.context;
|
|
10
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { computed, on, read } from '../core';
|
|
2
|
+
import { NODE } from '../symbols';
|
|
3
|
+
export default (fn, options = {}) => {
|
|
4
|
+
let node = computed(fn, options);
|
|
5
|
+
node.context = function () {
|
|
6
|
+
return read(node);
|
|
7
|
+
};
|
|
8
|
+
node.context[NODE] = node;
|
|
9
|
+
node.context.on = (event, listener) => on(event, listener, node);
|
|
10
|
+
return node.context;
|
|
11
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { dispatch } from '../core';
|
|
2
|
+
import { NODE, NODES } from '../symbols';
|
|
3
|
+
export default (key, wrapper) => {
|
|
4
|
+
if (wrapper[NODE]) {
|
|
5
|
+
dispatch(key, wrapper[NODE]);
|
|
6
|
+
}
|
|
7
|
+
else if (wrapper[NODES]) {
|
|
8
|
+
let nodes = wrapper[NODES];
|
|
9
|
+
for (let i = 0, n = nodes.length; i < n; i++) {
|
|
10
|
+
dispatch(key, nodes[i]);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { dispose } from '../core';
|
|
2
|
+
import { NODE, NODES } from '../symbols';
|
|
3
|
+
export default (wrapper) => {
|
|
4
|
+
if (wrapper[NODE]) {
|
|
5
|
+
dispose(wrapper[NODE]);
|
|
6
|
+
}
|
|
7
|
+
else if (wrapper[NODES]) {
|
|
8
|
+
let nodes = wrapper[NODES];
|
|
9
|
+
for (let i = 0, n = nodes.length; i < n; i++) {
|
|
10
|
+
dispose(nodes[i]);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NODE } from '../symbols';
|
|
2
|
+
import { Listener, Options } from '../types';
|
|
3
|
+
declare const _default: (fn: () => unknown, options?: Options) => {
|
|
4
|
+
[NODE]: import("../types").Effect<unknown>;
|
|
5
|
+
on: (event: symbol, listener: Listener) => void;
|
|
6
|
+
};
|
|
7
|
+
export default _default;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default as closure } from './closure';
|
|
2
|
+
export { default as computed } from './computed';
|
|
3
|
+
export { default as dispatch } from './dispatch';
|
|
4
|
+
export { default as dispose } from './dispose';
|
|
5
|
+
export { default as effect } from './effect';
|
|
6
|
+
export { default as reactive } from './reactive';
|
|
7
|
+
export { default as reset } from './reset';
|
|
8
|
+
export { default as signal } from './signal';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default as closure } from './closure';
|
|
2
|
+
export { default as computed } from './computed';
|
|
3
|
+
export { default as dispatch } from './dispatch';
|
|
4
|
+
export { default as dispose } from './dispose';
|
|
5
|
+
export { default as effect } from './effect';
|
|
6
|
+
export { default as reactive } from './reactive';
|
|
7
|
+
export { default as reset } from './reset';
|
|
8
|
+
export { default as signal } from './signal';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { computed as c, read, signal as s, write } from '../core';
|
|
2
|
+
import { NODES } from '../symbols';
|
|
3
|
+
import computed from './computed';
|
|
4
|
+
import signal from './signal';
|
|
5
|
+
export default (value, options = {}) => {
|
|
6
|
+
if (typeof value === 'object' && value !== null && (value.constructor === Object)) {
|
|
7
|
+
let nodes = {}, properties = {};
|
|
8
|
+
for (let key in value) {
|
|
9
|
+
if (typeof value[key] === 'function') {
|
|
10
|
+
nodes[key] = c(value[key], options);
|
|
11
|
+
properties[key] = {
|
|
12
|
+
get() {
|
|
13
|
+
return read(nodes[key]);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
nodes[key] = s(value[key], options);
|
|
19
|
+
properties[key] = {
|
|
20
|
+
get() {
|
|
21
|
+
return read(nodes[key]);
|
|
22
|
+
},
|
|
23
|
+
set(value) {
|
|
24
|
+
write(nodes[key], value);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return Object.defineProperties({ [NODES]: Object.values(nodes) }, properties);
|
|
30
|
+
}
|
|
31
|
+
if (typeof value === 'function') {
|
|
32
|
+
return computed(value, options);
|
|
33
|
+
}
|
|
34
|
+
return signal(value, options);
|
|
35
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { reset } from '../core';
|
|
2
|
+
import { NODE, NODES } from '../symbols';
|
|
3
|
+
export default (wrapper) => {
|
|
4
|
+
if (wrapper[NODE]) {
|
|
5
|
+
reset(wrapper[NODE]);
|
|
6
|
+
}
|
|
7
|
+
else if (wrapper[NODES]) {
|
|
8
|
+
let nodes = wrapper[NODES];
|
|
9
|
+
for (let i = 0, n = nodes.length; i < n; i++) {
|
|
10
|
+
reset(nodes[i]);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { read, signal, write } from '../core';
|
|
2
|
+
import { NODE } from '../symbols';
|
|
3
|
+
export default (data, options = {}) => {
|
|
4
|
+
let node = signal(data, options);
|
|
5
|
+
return node.context = {
|
|
6
|
+
[NODE]: node,
|
|
7
|
+
get: () => {
|
|
8
|
+
return read(node);
|
|
9
|
+
},
|
|
10
|
+
set: (value) => {
|
|
11
|
+
write(node, value);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Changed, Fn, Listener, Options, Root, Scheduler, State, Type, Wrapper } from './types';
|
|
2
|
+
declare class Signal<T = unknown> {
|
|
3
|
+
changed: Changed | null;
|
|
4
|
+
context: any & Wrapper | null;
|
|
5
|
+
fn: Fn<T> | null;
|
|
6
|
+
listeners: Record<symbol, Listener[]> | null;
|
|
7
|
+
observers: Signal[] | null;
|
|
8
|
+
root: Root | null;
|
|
9
|
+
sources: Signal[] | null;
|
|
10
|
+
task: Parameters<Scheduler>[0] | null;
|
|
11
|
+
type: Type;
|
|
12
|
+
state: State;
|
|
13
|
+
value: T;
|
|
14
|
+
constructor(data: T, state: Signal['state'], type: Signal['type'], options?: Options);
|
|
15
|
+
}
|
|
16
|
+
export default Signal;
|
package/build/signal.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class Signal {
|
|
2
|
+
changed = null;
|
|
3
|
+
context = null;
|
|
4
|
+
fn = null;
|
|
5
|
+
listeners = null;
|
|
6
|
+
observers = null;
|
|
7
|
+
root = null;
|
|
8
|
+
sources = null;
|
|
9
|
+
task = null;
|
|
10
|
+
type;
|
|
11
|
+
state;
|
|
12
|
+
value;
|
|
13
|
+
constructor(data, state, type, options = {}) {
|
|
14
|
+
if (options?.changed) {
|
|
15
|
+
this.changed = options.changed;
|
|
16
|
+
}
|
|
17
|
+
this.state = state;
|
|
18
|
+
this.type = type;
|
|
19
|
+
this.value = data;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export default Signal;
|
package/build/symbols.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
declare const CLEAN = 0;
|
|
2
2
|
declare const CHECK = 1;
|
|
3
3
|
declare const DIRTY = 2;
|
|
4
|
-
|
|
4
|
+
declare const DISPOSED = 3;
|
|
5
|
+
declare const COMPUTED = 0;
|
|
6
|
+
declare const EFFECT = 1;
|
|
7
|
+
declare const SIGNAL = 2;
|
|
8
|
+
declare const NODE: unique symbol;
|
|
9
|
+
declare const NODES: unique symbol;
|
|
10
|
+
declare const DISPOSE: unique symbol;
|
|
11
|
+
declare const RESET: unique symbol;
|
|
12
|
+
declare const UPDATE: unique symbol;
|
|
13
|
+
export { CHECK, CLEAN, COMPUTED, DIRTY, DISPOSED, DISPOSE, EFFECT, NODE, NODES, RESET, SIGNAL, UPDATE };
|
package/build/symbols.js
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
const CLEAN = 0;
|
|
2
2
|
const CHECK = 1;
|
|
3
3
|
const DIRTY = 2;
|
|
4
|
-
|
|
4
|
+
const DISPOSED = 3;
|
|
5
|
+
const COMPUTED = 0;
|
|
6
|
+
const EFFECT = 1;
|
|
7
|
+
const SIGNAL = 2;
|
|
8
|
+
const NODE = Symbol();
|
|
9
|
+
const NODES = Symbol();
|
|
10
|
+
const DISPOSE = Symbol();
|
|
11
|
+
const RESET = Symbol();
|
|
12
|
+
const UPDATE = Symbol();
|
|
13
|
+
export { CHECK, CLEAN, COMPUTED, DIRTY, DISPOSED, DISPOSE, EFFECT, NODE, NODES, RESET, SIGNAL, UPDATE };
|
package/build/types.d.ts
CHANGED
|
@@ -1,16 +1,30 @@
|
|
|
1
|
-
import { CLEAN,
|
|
2
|
-
|
|
3
|
-
type
|
|
1
|
+
import { CHECK, CLEAN, COMPUTED, DIRTY, DISPOSED, EFFECT, NODE, NODES, SIGNAL } from './symbols';
|
|
2
|
+
import S from './signal';
|
|
3
|
+
type Changed = (a: unknown, b: unknown) => boolean;
|
|
4
|
+
type Computed<T = unknown> = {
|
|
5
|
+
fn: NonNullable<Signal<T>['fn']>;
|
|
6
|
+
} & Signal<T>;
|
|
7
|
+
type Effect<T = unknown> = {
|
|
8
|
+
root: NonNullable<Signal<T>['root']>;
|
|
9
|
+
task: NonNullable<Signal<T>['task']>;
|
|
10
|
+
} & Computed<T>;
|
|
11
|
+
type Fn<T> = () => T;
|
|
12
|
+
type Infer<T> = T extends (...args: any[]) => any ? ReturnType<T> : T extends Record<string, unknown> ? {
|
|
4
13
|
[K in keyof T]: Infer<T[K]>;
|
|
5
14
|
} : T;
|
|
6
|
-
type
|
|
7
|
-
type
|
|
8
|
-
|
|
9
|
-
schedule(): void;
|
|
10
|
-
tasks: {
|
|
11
|
-
add: (fn: Fn) => void;
|
|
12
|
-
delete: (fn: Fn) => void;
|
|
13
|
-
};
|
|
15
|
+
type Listener = <T>(value: T) => void;
|
|
16
|
+
type Options = {
|
|
17
|
+
changed?: Changed;
|
|
14
18
|
};
|
|
15
|
-
type
|
|
16
|
-
|
|
19
|
+
type Root = {
|
|
20
|
+
scheduler: Scheduler;
|
|
21
|
+
};
|
|
22
|
+
type Scheduler = (fn: (...args: unknown[]) => Promise<unknown> | unknown) => unknown;
|
|
23
|
+
type Signal<T = unknown> = S<T>;
|
|
24
|
+
type State = typeof CHECK | typeof CLEAN | typeof DIRTY | typeof DISPOSED;
|
|
25
|
+
type Type = typeof COMPUTED | typeof EFFECT | typeof SIGNAL;
|
|
26
|
+
type Wrapper = {
|
|
27
|
+
[NODE]?: Signal;
|
|
28
|
+
[NODES]?: Signal[];
|
|
29
|
+
};
|
|
30
|
+
export { Changed, Computed, Effect, Fn, Infer, Listener, Options, Root, Scheduler, Signal, State, Type, Wrapper };
|
package/build/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import { NODE, NODES } from './symbols';
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"author": "ICJR",
|
|
3
3
|
"description": "Reactivity",
|
|
4
4
|
"devDependencies": {
|
|
5
|
-
"@esportsplus/webpack": "^0.0.
|
|
5
|
+
"@esportsplus/webpack": "^0.0.81"
|
|
6
6
|
},
|
|
7
7
|
"main": "build/index.js",
|
|
8
8
|
"name": "@esportsplus/reactivity",
|
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
"prepublishOnly": "npm run build"
|
|
15
15
|
},
|
|
16
16
|
"types": "build/index.d.ts",
|
|
17
|
-
"version": "0.0.
|
|
17
|
+
"version": "0.0.23"
|
|
18
18
|
}
|
package/readme.md
ADDED