@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.
Files changed (76) hide show
  1. package/build/api/effect.d.ts +2 -0
  2. package/build/api/effect.js +3 -0
  3. package/build/api/index.d.ts +4 -0
  4. package/build/api/index.js +4 -0
  5. package/build/api/macro.d.ts +4 -0
  6. package/build/api/macro.js +8 -0
  7. package/build/api/promise.d.ts +3 -0
  8. package/build/api/promise.js +38 -0
  9. package/build/api/reactive.d.ts +16 -0
  10. package/build/api/reactive.js +27 -0
  11. package/build/context/index.d.ts +5 -0
  12. package/build/context/index.js +3 -0
  13. package/build/context/node.d.ts +7 -0
  14. package/build/context/node.js +21 -0
  15. package/build/context/nodes.d.ts +7 -0
  16. package/build/context/nodes.js +33 -0
  17. package/build/index.d.ts +2 -2
  18. package/build/index.js +2 -2
  19. package/build/signal.d.ts +25 -10
  20. package/build/signal.js +236 -2
  21. package/build/symbols.d.ts +2 -2
  22. package/build/symbols.js +2 -2
  23. package/build/types.d.ts +22 -16
  24. package/build/types.js +2 -1
  25. package/package.json +2 -2
  26. package/src/api/effect.ts +5 -0
  27. package/src/api/index.ts +4 -0
  28. package/src/api/macro.ts +15 -0
  29. package/src/api/promise.ts +45 -0
  30. package/src/api/reactive.ts +42 -0
  31. package/src/context/index.ts +5 -0
  32. package/src/context/node.ts +36 -0
  33. package/src/context/nodes.ts +52 -0
  34. package/src/index.ts +2 -2
  35. package/src/signal.ts +325 -11
  36. package/src/symbols.ts +5 -5
  37. package/src/types.ts +24 -18
  38. package/tsconfig.json +1 -1
  39. package/build/core.d.ts +0 -30
  40. package/build/core.js +0 -218
  41. package/build/methods/effect.d.ts +0 -2
  42. package/build/methods/effect.js +0 -4
  43. package/build/methods/index.d.ts +0 -3
  44. package/build/methods/index.js +0 -3
  45. package/build/methods/reactive.d.ts +0 -3
  46. package/build/methods/reactive.js +0 -52
  47. package/build/primitives/closure.d.ts +0 -3
  48. package/build/primitives/closure.js +0 -10
  49. package/build/primitives/computed.d.ts +0 -3
  50. package/build/primitives/computed.js +0 -11
  51. package/build/primitives/dispatch.d.ts +0 -3
  52. package/build/primitives/dispatch.js +0 -13
  53. package/build/primitives/dispose.d.ts +0 -3
  54. package/build/primitives/dispose.js +0 -13
  55. package/build/primitives/effect.d.ts +0 -7
  56. package/build/primitives/effect.js +0 -9
  57. package/build/primitives/index.d.ts +0 -8
  58. package/build/primitives/index.js +0 -8
  59. package/build/primitives/reactive.d.ts +0 -3
  60. package/build/primitives/reactive.js +0 -35
  61. package/build/primitives/reset.d.ts +0 -3
  62. package/build/primitives/reset.js +0 -13
  63. package/build/primitives/signal.d.ts +0 -8
  64. package/build/primitives/signal.js +0 -14
  65. package/build/reactive.d.ts +0 -22
  66. package/build/reactive.js +0 -190
  67. package/src/core.ts +0 -295
  68. package/src/primitives/closure.ts +0 -15
  69. package/src/primitives/computed.ts +0 -16
  70. package/src/primitives/dispatch.ts +0 -17
  71. package/src/primitives/dispose.ts +0 -17
  72. package/src/primitives/effect.ts +0 -13
  73. package/src/primitives/index.ts +0 -8
  74. package/src/primitives/reactive.ts +0 -43
  75. package/src/primitives/reset.ts +0 -17
  76. 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 };
@@ -1,2 +0,0 @@
1
- declare const _default: <T>(fn: () => T) => void;
2
- export default _default;
@@ -1,4 +0,0 @@
1
- import Reactive from '../reactive';
2
- export default (fn) => {
3
- new Reactive(fn, true);
4
- };
@@ -1,3 +0,0 @@
1
- import effect from './effect';
2
- import reactive from './reactive';
3
- export { effect, reactive };
@@ -1,3 +0,0 @@
1
- import effect from './effect';
2
- import reactive from './reactive';
3
- export { effect, reactive };
@@ -1,3 +0,0 @@
1
- import { Infer } from '../types';
2
- declare const _default: <T>(value: T) => Infer<T>;
3
- export default _default;
@@ -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,3 +0,0 @@
1
- import { Options } from '../types';
2
- declare const _default: (fn: () => (...args: unknown[]) => unknown, options?: Options) => any;
3
- export default _default;
@@ -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,3 +0,0 @@
1
- import { Fn, Options } from '../types';
2
- declare const _default: <T>(fn: Fn<T>, options?: Options) => any;
3
- export default _default;
@@ -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,3 +0,0 @@
1
- import { Wrapper } from '../types';
2
- declare const _default: (key: symbol, wrapper: Wrapper) => void;
3
- export default _default;
@@ -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,3 +0,0 @@
1
- import { Wrapper } from '../types';
2
- declare const _default: (wrapper: Wrapper) => void;
3
- export default _default;
@@ -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,9 +0,0 @@
1
- import { effect, on } from '../core';
2
- import { NODE } from '../symbols';
3
- export default (fn, options = {}) => {
4
- let node = effect(fn, options);
5
- return node.context = {
6
- [NODE]: node,
7
- on: (event, listener) => on(event, listener, node)
8
- };
9
- };
@@ -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,3 +0,0 @@
1
- import { Fn, Options } from '../types';
2
- declare const _default: <T>(value: T | Fn<T>, options?: Options) => any;
3
- export default _default;
@@ -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,3 +0,0 @@
1
- import { Wrapper } from '../types';
2
- declare const _default: (wrapper: Wrapper) => void;
3
- export default _default;
@@ -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,8 +0,0 @@
1
- import { NODE } from '../symbols';
2
- import { Options } from '../types';
3
- declare const _default: <T>(data: T, options?: Options) => {
4
- [NODE]: import("../signal").default<T>;
5
- get: () => unknown;
6
- set: (value: T) => void;
7
- };
8
- export default _default;
@@ -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
- };
@@ -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 };