@esportsplus/reactivity 0.16.7 → 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.
@@ -1,12 +1,4 @@
1
- import { Prettify } from '@esportsplus/utilities';
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
- declare const _default: <T>(data: T[]) => {
41
- [x: number]: T;
42
- length: number;
43
- toString: () => string;
44
- toLocaleString: {
45
- (): string;
46
- (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string;
47
- };
48
- pop: () => T | undefined;
49
- push: (...items: T[]) => number;
50
- concat: {
51
- (...items: ConcatArray<T>[]): T[];
52
- (...items: (T | ConcatArray<T>)[]): T[];
53
- };
54
- join: (separator?: string) => string;
55
- reverse: () => T[];
56
- shift: () => T | undefined;
57
- slice: (start?: number, end?: number) => T[];
58
- sort: (compareFn?: ((a: T, b: T) => number) | undefined) => T[] & {
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 };
@@ -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
- function cleanup(item) {
5
- if (isReactiveObject(item)) {
6
- item.dispose();
3
+ class ReactiveArray extends Array {
4
+ [REACTIVE_ARRAY] = true;
5
+ listeners = {};
6
+ constructor(...items) {
7
+ super(...items);
7
8
  }
8
- }
9
- function clear(data, listeners) {
10
- dispose(data);
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
- let bucket = listeners[event];
18
- for (let i = 0, n = bucket.length; i < n; i++) {
19
- let listener = bucket[i];
20
- if (listener === null) {
21
- continue;
13
+ dispatch(event, value) {
14
+ let listeners = this.listeners[event];
15
+ if (!listeners) {
16
+ return;
22
17
  }
23
- try {
24
- listener(value);
25
- if (listener.once !== undefined) {
26
- bucket[i] = null;
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
- function dispose(data) {
35
- let item;
36
- while (item = data.pop()) {
37
- cleanup(item);
34
+ dispose() {
35
+ let item;
36
+ while (item = super.pop()) {
37
+ if (isReactiveObject(item)) {
38
+ item.dispose();
39
+ }
40
+ }
38
41
  }
39
- }
40
- function map(data, proxy, fn) {
41
- let n = data.length, values = new Array(n);
42
- for (let i = 0; i < n; i++) {
43
- values[i] = fn.call(proxy, data[i], i);
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
- return values;
46
- }
47
- function on(listeners, event, listener) {
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
- else {
53
- let hole = bucket.length;
54
- for (let i = 0, n = hole; i < n; i++) {
55
- let l = bucket[i];
56
- if (l === listener) {
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
- bucket[hole] = listener;
73
+ return item;
64
74
  }
65
- }
66
- function once(listeners, event, listener) {
67
- listener.once = true;
68
- on(listeners, event, listener);
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
- return item;
77
- }
78
- function push(data, listeners, items) {
79
- let n = data.push(...items);
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
- return item;
94
- }
95
- function sort(data, listeners, fn) {
96
- data.sort((a, b) => fn(a, b));
97
- dispatch(listeners, 'sort');
98
- }
99
- function splice(data, listeners, start, deleteCount = data.length, items = []) {
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
- dispatch(listeners, 'splice', {
106
- deleteCount,
107
- items,
108
- start
109
- });
93
+ return item;
110
94
  }
111
- return removed;
112
- }
113
- function unshift(data, listeners, items) {
114
- let length = data.unshift(...items);
115
- dispatch(listeners, 'unshift', { items });
116
- return length;
117
- }
118
- export default (data) => {
119
- let listeners = {}, proxy = new Proxy({}, {
120
- get(_, key) {
121
- if (isNumber(key)) {
122
- return data[key];
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
- else {
147
- return false;
148
- }
149
- return true;
109
+ this.dispatch('splice', { deleteCount, items, start });
150
110
  }
151
- }), wrapper = {
152
- [REACTIVE_ARRAY]: true,
153
- at: (i) => data[i],
154
- clear: () => {
155
- clear(data, listeners);
156
- return proxy;
157
- },
158
- dispatch: (event, value) => {
159
- dispatch(listeners, event, value);
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> ? ReactiveObject<T> : T extends (infer U)[] ? ReactiveArray<U> : never;
4
- declare const _default: <T extends Record<PropertyKey, any> | unknown[]>(input: T extends {
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: "[ dispose ] are reserved keys";
8
- } : T) => API<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;
@@ -1,15 +1,15 @@
1
1
  import { isArray, isObject } from '@esportsplus/utilities';
2
2
  import { onCleanup, root } from '../system.js';
3
- import array from './array.js';
4
- import object from './object.js';
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 (isArray(input)) {
9
- response = array(input);
8
+ if (isObject(input)) {
9
+ response = new ReactiveObject(input);
10
10
  }
11
- else if (isObject(input)) {
12
- response = object(input);
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 (infer U)[] ? ReactiveArray<U> : 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
- declare const _default: <T extends Record<PropertyKey, unknown>>(input: T) => API<T>;
20
- export default _default;
21
- export { isReactiveObject };
22
- export type { API as ReactiveObject };
9
+ export { isReactiveObject, ReactiveObject };
@@ -1,7 +1,7 @@
1
- import { defineProperty, isArray, isFunction, isObject, isPromise } from '@esportsplus/utilities';
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 array from './array.js';
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
- if (isArray(value)) {
13
- let node = array(value);
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
- else {
51
- let node = signal(value);
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
- get() {
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 default (input) => {
78
- return new ReactiveObject(input);
79
- };
80
- export { isReactiveObject };
80
+ export { isReactiveObject, ReactiveObject };