@esportsplus/reactivity 0.0.23 → 0.0.24
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/api/effect.d.ts +2 -0
- package/build/api/effect.js +3 -0
- package/build/api/index.d.ts +4 -0
- package/build/api/index.js +4 -0
- package/build/api/macro.d.ts +4 -0
- package/build/api/macro.js +8 -0
- package/build/api/promise.d.ts +3 -0
- package/build/api/promise.js +38 -0
- package/build/api/reactive.d.ts +16 -0
- package/build/api/reactive.js +27 -0
- package/build/context/index.d.ts +5 -0
- package/build/context/index.js +3 -0
- package/build/context/node.d.ts +7 -0
- package/build/context/node.js +21 -0
- package/build/context/nodes.d.ts +7 -0
- package/build/context/nodes.js +33 -0
- package/build/index.d.ts +2 -2
- package/build/index.js +2 -2
- package/build/signal.d.ts +25 -10
- package/build/signal.js +236 -2
- package/build/symbols.d.ts +2 -2
- package/build/symbols.js +2 -2
- package/build/types.d.ts +22 -16
- package/build/types.js +2 -1
- package/package.json +2 -2
- package/src/api/effect.ts +5 -0
- package/src/api/index.ts +4 -0
- package/src/api/macro.ts +15 -0
- package/src/api/promise.ts +45 -0
- package/src/api/reactive.ts +42 -0
- package/src/context/index.ts +5 -0
- package/src/context/node.ts +36 -0
- package/src/context/nodes.ts +52 -0
- package/src/index.ts +2 -2
- package/src/signal.ts +325 -11
- package/src/symbols.ts +5 -5
- package/src/types.ts +24 -18
- package/tsconfig.json +1 -1
- package/build/core.d.ts +0 -30
- package/build/core.js +0 -218
- package/build/methods/effect.d.ts +0 -2
- package/build/methods/effect.js +0 -4
- package/build/methods/index.d.ts +0 -3
- package/build/methods/index.js +0 -3
- package/build/methods/reactive.d.ts +0 -3
- package/build/methods/reactive.js +0 -52
- package/build/primitives/closure.d.ts +0 -3
- package/build/primitives/closure.js +0 -10
- package/build/primitives/computed.d.ts +0 -3
- package/build/primitives/computed.js +0 -11
- package/build/primitives/dispatch.d.ts +0 -3
- package/build/primitives/dispatch.js +0 -13
- package/build/primitives/dispose.d.ts +0 -3
- package/build/primitives/dispose.js +0 -13
- package/build/primitives/effect.d.ts +0 -7
- package/build/primitives/effect.js +0 -9
- package/build/primitives/index.d.ts +0 -8
- package/build/primitives/index.js +0 -8
- package/build/primitives/reactive.d.ts +0 -3
- package/build/primitives/reactive.js +0 -35
- package/build/primitives/reset.d.ts +0 -3
- package/build/primitives/reset.js +0 -13
- package/build/primitives/signal.d.ts +0 -8
- package/build/primitives/signal.js +0 -14
- package/build/reactive.d.ts +0 -22
- package/build/reactive.js +0 -190
- package/src/core.ts +0 -295
- package/src/primitives/closure.ts +0 -15
- package/src/primitives/computed.ts +0 -16
- package/src/primitives/dispatch.ts +0 -17
- package/src/primitives/dispose.ts +0 -17
- package/src/primitives/effect.ts +0 -13
- package/src/primitives/index.ts +0 -8
- package/src/primitives/reactive.ts +0 -43
- package/src/primitives/reset.ts +0 -17
- package/src/primitives/signal.ts +0 -18
package/build/core.js
DELETED
|
@@ -1,218 +0,0 @@
|
|
|
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/methods/effect.js
DELETED
package/build/methods/index.d.ts
DELETED
package/build/methods/index.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import Reactive from '../reactive';
|
|
2
|
-
function factory(value) {
|
|
3
|
-
if (typeof value === 'object' && value !== null && (value.constructor === Object)) {
|
|
4
|
-
return obj(value);
|
|
5
|
-
}
|
|
6
|
-
return new Reactive(value);
|
|
7
|
-
}
|
|
8
|
-
function fn(value) {
|
|
9
|
-
let fn = new Reactive(value);
|
|
10
|
-
return (...args) => {
|
|
11
|
-
let value = fn.get();
|
|
12
|
-
if (args.length && typeof value === 'function') {
|
|
13
|
-
value = value(...args);
|
|
14
|
-
}
|
|
15
|
-
return value;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
function obj(values) {
|
|
19
|
-
let lazy = {}, properties = {};
|
|
20
|
-
for (let key in values) {
|
|
21
|
-
properties[key] = {
|
|
22
|
-
get() {
|
|
23
|
-
if (!lazy[key]) {
|
|
24
|
-
lazy[key] = factory(values[key]);
|
|
25
|
-
}
|
|
26
|
-
if (lazy[key] instanceof Reactive) {
|
|
27
|
-
return lazy[key].get();
|
|
28
|
-
}
|
|
29
|
-
return lazy[key];
|
|
30
|
-
},
|
|
31
|
-
set(value) {
|
|
32
|
-
if (!lazy[key]) {
|
|
33
|
-
lazy[key] = factory(values[key]);
|
|
34
|
-
}
|
|
35
|
-
if (lazy[key] instanceof Reactive) {
|
|
36
|
-
lazy[key].set(value);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
lazy[key] = factory(value);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
return Object.defineProperties({}, properties);
|
|
45
|
-
}
|
|
46
|
-
;
|
|
47
|
-
export default (value) => {
|
|
48
|
-
if (typeof value === 'function') {
|
|
49
|
-
return fn(value);
|
|
50
|
-
}
|
|
51
|
-
return factory(value);
|
|
52
|
-
};
|
|
@@ -1,10 +0,0 @@
|
|
|
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
|
-
};
|
|
@@ -1,11 +0,0 @@
|
|
|
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
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
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
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
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
|
-
};
|
|
@@ -1,7 +0,0 @@
|
|
|
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;
|
|
@@ -1,8 +0,0 @@
|
|
|
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';
|
|
@@ -1,8 +0,0 @@
|
|
|
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';
|
|
@@ -1,35 +0,0 @@
|
|
|
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
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
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
|
-
};
|
|
@@ -1,14 +0,0 @@
|
|
|
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
|
-
};
|
package/build/reactive.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { ReactiveFn, Scheduler, State } from './types';
|
|
2
|
-
declare class Reactive<T> {
|
|
3
|
-
private fn?;
|
|
4
|
-
private value;
|
|
5
|
-
effect: boolean;
|
|
6
|
-
cleanup: ((old: T) => void)[] | null;
|
|
7
|
-
observers: Reactive<any>[] | null;
|
|
8
|
-
sources: Reactive<any>[] | null;
|
|
9
|
-
state: State;
|
|
10
|
-
constructor(data: ReactiveFn<T> | T, effect?: boolean);
|
|
11
|
-
get(): T extends (...args: any[]) => any ? ReturnType<T> : T;
|
|
12
|
-
set(value: T): void;
|
|
13
|
-
private removeParentObservers;
|
|
14
|
-
private sync;
|
|
15
|
-
private update;
|
|
16
|
-
}
|
|
17
|
-
declare const scheduler: {
|
|
18
|
-
add: (scheduler: Scheduler) => void;
|
|
19
|
-
delete: (scheduler: Scheduler) => void;
|
|
20
|
-
};
|
|
21
|
-
export default Reactive;
|
|
22
|
-
export { scheduler };
|