@esportsplus/reactivity 0.4.7 → 0.5.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.
@@ -4,11 +4,13 @@
4
4
  # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
5
5
 
6
6
  version: 2
7
+
7
8
  registries:
8
9
  npm-npmjs:
9
10
  token: ${{secrets.NPM_TOKEN}}
10
11
  type: npm-registry
11
12
  url: https://registry.npmjs.org
13
+
12
14
  updates:
13
15
  - package-ecosystem: "npm"
14
16
  directory: "/"
@@ -1,7 +1,9 @@
1
1
  name: bump
2
+
2
3
  on:
3
4
  push:
4
5
  branches: '**' # only trigger on branches, not on tags
6
+
5
7
  jobs:
6
8
  bump:
7
9
  uses: esportsplus/workflows/.github/workflows/bump.yml@main
@@ -0,0 +1,12 @@
1
+ name: dependabot automerge
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize, labeled]
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ automerge:
10
+ secrets:
11
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
12
+ uses: esportsplus/workflows/.github/workflows/dependabot.yml@main
@@ -1,4 +1,5 @@
1
1
  name: publish to npm
2
+
2
3
  on:
3
4
  release:
4
5
  types: [published]
@@ -7,6 +8,7 @@ on:
7
8
  workflows: [bump]
8
9
  types:
9
10
  - completed
11
+
10
12
  jobs:
11
13
  publish:
12
14
  secrets:
@@ -1,9 +1,7 @@
1
- declare const CLEAN = 0;
2
- declare const CHECK = 1;
3
- declare const DIRTY = 2;
4
- declare const DISPOSED = 3;
5
- declare const COMPUTED = 0;
6
- declare const EFFECT = 1;
7
- declare const ROOT = 2;
8
- declare const SIGNAL = 3;
9
- export { CHECK, CLEAN, COMPUTED, DIRTY, DISPOSED, EFFECT, ROOT, SIGNAL };
1
+ declare const REACTIVE: unique symbol;
2
+ declare const STATE_NONE = 0;
3
+ declare const STATE_CHECK: number;
4
+ declare const STATE_DIRTY: number;
5
+ declare const STATE_RECOMPUTING: number;
6
+ declare const STATE_IN_HEAP: number;
7
+ export { REACTIVE, STATE_CHECK, STATE_DIRTY, STATE_IN_HEAP, STATE_NONE, STATE_RECOMPUTING };
@@ -1,9 +1,7 @@
1
- const CLEAN = 0;
2
- const CHECK = 1;
3
- const DIRTY = 2;
4
- const DISPOSED = 3;
5
- const COMPUTED = 0;
6
- const EFFECT = 1;
7
- const ROOT = 2;
8
- const SIGNAL = 3;
9
- export { CHECK, CLEAN, COMPUTED, DIRTY, DISPOSED, EFFECT, ROOT, SIGNAL };
1
+ const REACTIVE = Symbol('reactive');
2
+ const STATE_NONE = 0;
3
+ const STATE_CHECK = 1 << 0;
4
+ const STATE_DIRTY = 1 << 1;
5
+ const STATE_RECOMPUTING = 1 << 2;
6
+ const STATE_IN_HEAP = 1 << 3;
7
+ export { REACTIVE, STATE_CHECK, STATE_DIRTY, STATE_IN_HEAP, STATE_NONE, STATE_RECOMPUTING };
package/build/index.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- export { default as macro } from './macro.js';
2
1
  export { default as reactive } from './reactive/index.js';
3
- export { computed, dispose, effect, root, signal } from './signal.js';
4
- export * from './constants.js';
2
+ export { computed, dispose, oncleanup, root, signal, stabilize } from './signal.js';
5
3
  export * from './types.js';
package/build/index.js CHANGED
@@ -1,5 +1,3 @@
1
- export { default as macro } from './macro.js';
2
1
  export { default as reactive } from './reactive/index.js';
3
- export { computed, dispose, effect, root, signal } from './signal.js';
4
- export * from './constants.js';
2
+ export { computed, dispose, oncleanup, root, signal, stabilize } from './signal.js';
5
3
  export * from './types.js';
@@ -1,5 +1,6 @@
1
- import { Infer } from '../types.js';
2
- import { Listener, Options, ReactiveObject, Signal } from '../types.js';
1
+ import { Computed, Infer } from '../types.js';
2
+ import { ReactiveObject } from './object.js';
3
+ import { Disposable } from './disposable.js';
3
4
  type API<T> = Infer<T>[] & ReactiveArray<T>;
4
5
  type Events<T> = {
5
6
  pop: {
@@ -26,30 +27,32 @@ type Events<T> = {
26
27
  items: Item<T>[];
27
28
  };
28
29
  };
29
- type Item<T> = T extends Record<PropertyKey, unknown> ? ReactiveObject<T> : Signal<T>;
30
- declare class ReactiveArray<T> {
30
+ type Item<T> = Computed<T> | ReactiveArray<T> | ReactiveObject<T extends Record<PropertyKey, unknown> ? T : never> | T;
31
+ type Listener<V> = {
32
+ once?: boolean;
33
+ (value: V): void;
34
+ };
35
+ type Value<T> = T extends Record<PropertyKey, unknown> ? ReactiveObject<T> : T extends Array<infer U> ? ReactiveArray<U> : T;
36
+ declare class ReactiveArray<T> extends Disposable {
31
37
  private data;
32
- private options;
38
+ private listeners;
33
39
  private proxy;
34
- private signal;
35
- constructor(data: Item<T>[], proxy: API<T>, options?: Options);
40
+ constructor(data: Item<T>[], proxy: API<T>);
36
41
  get length(): number;
37
42
  set length(n: number);
38
- at(i: number): any;
39
- dispatch<E extends keyof Events<unknown>>(event: E, data?: Events<T>[E]): void;
43
+ at(i: number): ReactiveArray<T> | T | ReactiveObject<T extends Record<PropertyKey, unknown> ? T : never>;
44
+ dispatch<D>(event: keyof Events<T>, value?: D): void;
40
45
  dispose(): void;
41
- indexOf(value: T, fromIndex?: number): number;
42
- map<U>(fn: (this: API<T>, value: T, i: number) => U, i?: number, n?: number): U[];
43
- on<E extends keyof Events<unknown>>(event: E, listener: Listener<Events<T>[E]>): void;
44
- once<E extends keyof Events<unknown>>(event: E, listener: Listener<Events<T>[E]>): void;
46
+ map<R>(fn: (this: API<T>, value: Value<T>, i: number) => R, i?: number, n?: number): R[];
47
+ on<T>(event: keyof Events<T>, listener: Listener<T>): void;
48
+ once<T>(event: keyof Events<T>, listener: Listener<T>): void;
45
49
  pop(): Item<T> | undefined;
46
50
  push(...input: T[]): number;
47
51
  reverse(): this;
48
52
  shift(): Item<T> | undefined;
49
- sort(fn: (a: T, b: T) => number): this;
53
+ sort(fn: (a: Value<T>, b: Value<T>) => number): this;
50
54
  splice(start: number, deleteCount?: number, ...input: T[]): Item<T>[];
51
55
  unshift(...input: T[]): number;
52
56
  }
53
- declare const _default: <T>(input: T[], options?: Options) => API<T>;
54
- export default _default;
55
- export type { API as ReactiveArray };
57
+ export default function array<T>(input: T[]): API<T>;
58
+ export { ReactiveArray };
@@ -1,16 +1,15 @@
1
- import { isInstanceOf, isNumber, isObject } from '@esportsplus/utilities';
2
- import { dispose, signal, Reactive } from '../signal.js';
1
+ import { isArray, isFunction, isInstanceOf, isNumber, isObject } from '@esportsplus/utilities';
2
+ import { computed, dispose, isComputed, read } from '../signal.js';
3
3
  import object from './object.js';
4
- class ReactiveArray {
4
+ import { Disposable } from './disposable.js';
5
+ class ReactiveArray extends Disposable {
5
6
  data;
6
- options;
7
+ listeners = null;
7
8
  proxy;
8
- signal;
9
- constructor(data, proxy, options = {}) {
9
+ constructor(data, proxy) {
10
+ super();
10
11
  this.data = data;
11
- this.options = options;
12
12
  this.proxy = proxy;
13
- this.signal = signal(false);
14
13
  }
15
14
  get length() {
16
15
  return this.data.length;
@@ -23,26 +22,44 @@ class ReactiveArray {
23
22
  }
24
23
  at(i) {
25
24
  let value = this.data[i];
26
- if (isInstanceOf(value, Reactive)) {
27
- return value.get();
25
+ if (isComputed(value)) {
26
+ return read(value);
28
27
  }
29
28
  return value;
30
29
  }
31
- dispatch(event, data) {
32
- this.signal.dispatch(event, data);
30
+ dispatch(event, value) {
31
+ if (this.listeners === null || this.listeners[event] === undefined) {
32
+ return;
33
+ }
34
+ let listeners = this.listeners[event];
35
+ for (let i = 0, n = listeners.length; i < n; i++) {
36
+ let listener = listeners[i];
37
+ if (listener === null) {
38
+ continue;
39
+ }
40
+ try {
41
+ listener(value);
42
+ if (listener.once !== undefined) {
43
+ listeners[i] = null;
44
+ }
45
+ }
46
+ catch {
47
+ listeners[i] = null;
48
+ }
49
+ }
33
50
  }
34
51
  dispose() {
35
- this.signal.dispose();
36
- dispose(this.data);
37
- }
38
- indexOf(value, fromIndex) {
39
52
  let data = this.data;
40
- for (let i = fromIndex ?? 0, n = data.length; i < n; i++) {
41
- if (data[i].value === value) {
42
- return i;
53
+ for (let i = 0, n = data.length; i < n; i++) {
54
+ let value = data[i];
55
+ if (isInstanceOf(value, Disposable)) {
56
+ value.dispose();
57
+ }
58
+ else if (isComputed(value)) {
59
+ dispose(value);
43
60
  }
44
61
  }
45
- return -1;
62
+ this.listeners = null;
46
63
  }
47
64
  map(fn, i, n) {
48
65
  let { data, proxy } = this, values = [];
@@ -55,52 +72,79 @@ class ReactiveArray {
55
72
  n = Math.min(n, data.length);
56
73
  for (; i < n; i++) {
57
74
  let item = data[i];
58
- values.push(fn.call(proxy, isInstanceOf(item, Reactive) ? item.value : item, i));
75
+ values.push(fn.call(proxy, (isComputed(item) ? item.value : item), i));
59
76
  }
60
77
  return values;
61
78
  }
62
79
  on(event, listener) {
63
- this.signal.on(event, listener);
80
+ if (this.listeners === null) {
81
+ this.listeners = { [event]: [listener] };
82
+ }
83
+ else {
84
+ let listeners = this.listeners[event];
85
+ if (listeners === undefined) {
86
+ this.listeners[event] = [listener];
87
+ }
88
+ else if (listeners.indexOf(listener) === -1) {
89
+ let i = listeners.indexOf(null);
90
+ if (i === -1) {
91
+ listeners.push(listener);
92
+ }
93
+ else {
94
+ listeners[i] = listener;
95
+ }
96
+ }
97
+ }
64
98
  }
65
99
  once(event, listener) {
66
- this.signal.once(event, listener);
100
+ listener.once = true;
101
+ this.on(event, listener);
67
102
  }
68
103
  pop() {
69
104
  let item = this.data.pop();
70
105
  if (item !== undefined) {
71
- dispose(item);
72
- this.signal.dispatch('pop', { item });
106
+ if (isComputed(item)) {
107
+ dispose(item);
108
+ }
109
+ this.dispatch('pop', { item });
73
110
  }
74
111
  return item;
75
112
  }
76
113
  push(...input) {
77
- let items = factory(input, this.options), n = this.data.push(...items);
78
- this.signal.dispatch('push', { items });
114
+ let items = factory(input), n = this.data.push(...items);
115
+ this.dispatch('push', { items });
79
116
  return n;
80
117
  }
81
118
  reverse() {
82
119
  this.data.reverse();
83
- this.signal.dispatch('reverse');
120
+ this.dispatch('reverse');
84
121
  return this;
85
122
  }
86
123
  shift() {
87
124
  let item = this.data.shift();
88
125
  if (item !== undefined) {
89
- dispose(item);
90
- this.signal.dispatch('shift', { item });
126
+ if (isComputed(item)) {
127
+ dispose(item);
128
+ }
129
+ this.dispatch('shift', { item });
91
130
  }
92
131
  return item;
93
132
  }
94
133
  sort(fn) {
95
- this.data.sort((a, b) => fn(isInstanceOf(a, Reactive) ? a.value : a, isInstanceOf(b, Reactive) ? b.value : b));
96
- this.signal.dispatch('sort');
134
+ this.data.sort((a, b) => fn((isComputed(a) ? a.value : a), (isComputed(b) ? b.value : b)));
135
+ this.dispatch('sort');
97
136
  return this;
98
137
  }
99
138
  splice(start, deleteCount = this.data.length, ...input) {
100
- let items = factory(input, this.options), removed = this.data.splice(start, deleteCount, ...items);
139
+ let items = factory(input), removed = this.data.splice(start, deleteCount, ...items);
101
140
  if (items.length > 0 || removed.length > 0) {
102
- dispose(removed);
103
- this.signal.dispatch('splice', {
141
+ for (let i = 0, n = removed.length; i < n; i++) {
142
+ let item = removed[i];
143
+ if (isComputed(item)) {
144
+ dispose(item);
145
+ }
146
+ }
147
+ this.dispatch('splice', {
104
148
  deleteCount,
105
149
  items,
106
150
  start
@@ -109,31 +153,37 @@ class ReactiveArray {
109
153
  return removed;
110
154
  }
111
155
  unshift(...input) {
112
- let items = factory(input, this.options), length = this.data.unshift(...items);
113
- this.signal.dispatch('unshift', { items });
156
+ let items = factory(input), length = this.data.unshift(...items);
157
+ this.dispatch('unshift', { items });
114
158
  return length;
115
159
  }
116
160
  }
117
- function factory(input, options = {}) {
161
+ function factory(input) {
118
162
  let items = [];
119
163
  for (let i = 0, n = input.length; i < n; i++) {
120
164
  let value = input[i];
121
- if (isObject(value)) {
122
- items[i] = object(value, options);
165
+ if (isArray(value)) {
166
+ items[i] = array(value);
167
+ }
168
+ else if (isFunction(value)) {
169
+ items[i] = computed(value);
170
+ }
171
+ else if (isObject(value)) {
172
+ items[i] = object(value);
123
173
  }
124
174
  else {
125
- items[i] = signal(value);
175
+ items[i] = value;
126
176
  }
127
177
  }
128
178
  return items;
129
179
  }
130
- export default (input, options = {}) => {
131
- let wrapped = factory(input, options), proxy = new Proxy({}, {
180
+ export default function array(input) {
181
+ let proxy = new Proxy({}, {
132
182
  get(_, key) {
133
183
  if (isNumber(key)) {
134
184
  let value = wrapped[key];
135
- if (isInstanceOf(value, Reactive)) {
136
- return value.get();
185
+ if (isComputed(value)) {
186
+ return read(value);
137
187
  }
138
188
  return value;
139
189
  }
@@ -145,11 +195,8 @@ export default (input, options = {}) => {
145
195
  set(_, key, value) {
146
196
  if (isNumber(key)) {
147
197
  let host = wrapped[key];
148
- if (host === undefined) {
149
- wrapped[key] = factory([value], options)[0];
150
- }
151
- else if (isInstanceOf(host, Reactive)) {
152
- host.set(value);
198
+ if (host === undefined || !isComputed(host)) {
199
+ wrapped[key] = factory([value])[0];
153
200
  }
154
201
  else {
155
202
  return false;
@@ -161,7 +208,9 @@ export default (input, options = {}) => {
161
208
  }
162
209
  return false;
163
210
  }
164
- });
211
+ }), wrapped = factory(input);
165
212
  let a = new ReactiveArray(wrapped, proxy);
166
213
  return proxy;
167
- };
214
+ }
215
+ ;
216
+ export { ReactiveArray };
@@ -0,0 +1,4 @@
1
+ declare class Disposable {
2
+ dispose(): void;
3
+ }
4
+ export { Disposable };
@@ -0,0 +1,6 @@
1
+ class Disposable {
2
+ dispose() {
3
+ throw new Error('@esportsplus/reactivity: Disposable should not be instantiated directly.');
4
+ }
5
+ }
6
+ export { Disposable };
@@ -1,4 +1,4 @@
1
- import { Options, Reactive } from '../types.js';
1
+ import { Reactive } from '../types.js';
2
2
  type Guard<T> = T extends {
3
3
  dispose: any;
4
4
  } | {
@@ -6,5 +6,5 @@ type Guard<T> = T extends {
6
6
  } ? {
7
7
  never: '[ dispose, signals ] are reserved keys';
8
8
  } : T extends Record<PropertyKey, unknown> | unknown[] ? T : never;
9
- declare const _default: <T>(data: Guard<T>, options?: Options) => Reactive<T>;
9
+ declare const _default: <T>(data: Guard<T>) => Reactive<T>;
10
10
  export default _default;
@@ -1,13 +1,13 @@
1
1
  import { isArray, isObject } from '@esportsplus/utilities';
2
2
  import { default as array } from './array.js';
3
3
  import { default as object } from './object.js';
4
- export default (data, options = {}) => {
4
+ export default (data) => {
5
5
  let value;
6
6
  if (isArray(data)) {
7
- value = array(data, options);
7
+ value = array(data);
8
8
  }
9
9
  else if (isObject(data)) {
10
- value = object(data, options);
10
+ value = object(data);
11
11
  }
12
12
  else {
13
13
  throw new Error(`@esportsplus/reactivity: 'reactive' received invalid input - ${JSON.stringify(data)}`);
@@ -1,8 +1,13 @@
1
- import { Infer, Options, Prettify } from '../types.js';
2
- type API<T> = Prettify<{
1
+ import { Prettify } from '@esportsplus/utilities';
2
+ import { Infer } from '../types.js';
3
+ import { Disposable } from './disposable.js';
4
+ type API<T extends Record<PropertyKey, unknown>> = Prettify<{
3
5
  [K in keyof T]: Infer<T[K]>;
4
- } & {
5
- dispose: VoidFunction;
6
- }>;
7
- export default function object<T extends Record<PropertyKey, unknown>>(input: T, options?: Options): API<T>;
8
- export type { API as ReactiveObject };
6
+ }> & ReactiveObject<T>;
7
+ declare class ReactiveObject<T extends Record<PropertyKey, unknown>> extends Disposable {
8
+ private signals;
9
+ constructor(data: T);
10
+ dispose(): void;
11
+ }
12
+ export default function object<T extends Record<PropertyKey, unknown>>(input: T): API<T>;
13
+ export { ReactiveObject };
@@ -1,61 +1,84 @@
1
- import { defineProperty, isArray, isFunction, isObject } from '@esportsplus/utilities';
2
- import { computed, signal } from '../signal.js';
3
- import { default as array } from './array.js';
4
- class ReactiveObject {
1
+ import { defineProperty, isArray, isFunction, isInstanceOf, isObject } from '@esportsplus/utilities';
2
+ import array from './array.js';
3
+ import { computed, dispose, isComputed, read, signal } from '../signal.js';
4
+ import { Disposable } from './disposable.js';
5
+ let { set } = signal;
6
+ class ReactiveObject extends Disposable {
5
7
  signals = {};
6
- constructor(data, options = {}) {
7
- let signals = this.signals;
8
+ constructor(data) {
9
+ super();
10
+ let signals = this.signals, triggers = {};
8
11
  for (let key in data) {
9
12
  let value = data[key];
10
13
  if (isArray(value)) {
11
- let s = signals[key] = array(value, options);
14
+ let s = signals[key] = array(value), t = triggers[key] = signal(false);
12
15
  defineProperty(this, key, {
13
16
  enumerable: true,
14
17
  get() {
18
+ read(t);
15
19
  return s;
20
+ },
21
+ set(v) {
22
+ set(t, !!t.value);
23
+ s = signals[key] = array(v);
16
24
  }
17
25
  });
18
26
  }
19
27
  else if (isFunction(value)) {
20
- let s = signals[key] = computed(value, options);
28
+ let s = signals[key] = computed(value);
21
29
  defineProperty(this, key, {
22
30
  enumerable: true,
23
31
  get() {
24
- return s.get();
32
+ return read(s);
25
33
  }
26
34
  });
27
35
  }
28
36
  else if (isObject(value)) {
29
- let s = signals[key] = new ReactiveObject(value, options);
37
+ let s = signals[key] = new ReactiveObject(value), t = triggers[key] = signal(false);
30
38
  defineProperty(this, key, {
31
39
  enumerable: true,
32
40
  get() {
41
+ read(t);
33
42
  return s;
43
+ },
44
+ set(v) {
45
+ set(t, !!t.value);
46
+ s = signals[key] = new ReactiveObject(v);
34
47
  }
35
48
  });
36
49
  }
37
50
  else {
38
- let s = signals[key] = signal(value, options);
51
+ let s = signals[key] = signal(value);
39
52
  defineProperty(this, key, {
40
53
  enumerable: true,
41
54
  get() {
42
- return s.get();
55
+ if (s === undefined) {
56
+ s = signals[key] = signal(value);
57
+ }
58
+ return read(s);
43
59
  },
44
- set(value) {
45
- s.set(value);
60
+ set(v) {
61
+ set(s, v);
46
62
  }
47
63
  });
48
64
  }
49
65
  }
50
66
  }
51
67
  dispose() {
52
- let signals = this.signals;
53
- for (let key in signals) {
54
- signals[key].dispose();
68
+ for (let key in this.signals) {
69
+ let value = this.signals[key];
70
+ if (isInstanceOf(value, Disposable)) {
71
+ value.dispose();
72
+ }
73
+ else if (isComputed(value)) {
74
+ dispose(value);
75
+ }
55
76
  }
77
+ this.signals = {};
56
78
  }
57
79
  }
58
- export default function object(input, options = {}) {
59
- return new ReactiveObject(input, options);
80
+ export default function object(input) {
81
+ return new ReactiveObject(input);
60
82
  }
61
83
  ;
84
+ export { ReactiveObject };
package/build/signal.d.ts CHANGED
@@ -1,31 +1,15 @@
1
- import { Computed, Changed, Effect, Event, Function, Listener, NeverAsync, Options, Root, Scheduler, Signal, State, Type } from './types.js';
2
- declare class Reactive<T> {
3
- changed: Changed | null;
4
- fn: Computed<T>['fn'] | Effect['fn'] | null;
5
- listeners: Record<Event, (Listener<any> | null)[]> | null;
6
- observers: Reactive<any>[] | null;
7
- root: Root | null;
8
- scheduler: Scheduler | null;
9
- sources: Reactive<any>[] | null;
10
- state: State;
11
- task: Function | null;
12
- tracking: boolean | null;
13
- type: Type;
14
- value: T;
15
- constructor(state: State, type: Type, value: T);
16
- dispatch<D>(event: Event, data?: D): void;
17
- dispose(): void;
18
- get(): T;
19
- on<T>(event: Event, listener: Listener<T>): void;
20
- once<T>(event: Event, listener: Listener<T>): void;
21
- set(value: T): T;
22
- }
23
- declare const computed: <T>(fn: Computed<T>["fn"], options?: Options) => Computed<T>;
24
- declare const dispose: <T extends {
25
- dispose: VoidFunction;
26
- }>(dispose?: T[] | T | null) => T | T[] | null | undefined;
27
- declare const effect: (fn: Effect["fn"]) => Effect;
28
- declare const root: <T>(fn: NeverAsync<(instance: Root) => T>, scheduler?: Scheduler) => T;
29
- declare const signal: <T>(value: T, options?: Options) => Signal<T>;
30
- export { computed, dispose, effect, root, signal };
31
- export { Reactive };
1
+ import { Computed, Signal } from './types.js';
2
+ declare const computed: <T>(fn: Computed<T>["fn"]) => Computed<T>;
3
+ declare const dispose: (el: Computed<unknown>) => void;
4
+ declare const isComputed: (value: unknown) => value is Computed<unknown>;
5
+ declare const isReactive: (value: unknown) => value is Computed<unknown> | Signal<unknown>;
6
+ declare const isSignal: (value: unknown) => value is Signal<unknown>;
7
+ declare const oncleanup: (fn: VoidFunction) => typeof fn;
8
+ declare const read: <T>(el: Signal<T> | Computed<T>) => T;
9
+ declare const root: <T>(fn: () => T) => T;
10
+ declare const signal: {
11
+ <T>(value: T): Signal<T>;
12
+ set(el: Signal<unknown>, v: unknown): void;
13
+ };
14
+ declare const stabilize: () => void;
15
+ export { computed, dispose, isComputed, isReactive, isSignal, oncleanup, read, root, signal, stabilize };