signalium 0.2.8 → 0.3.1

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 (161) hide show
  1. package/.turbo/turbo-build.log +12 -0
  2. package/CHANGELOG.md +12 -0
  3. package/dist/cjs/config.d.ts +14 -5
  4. package/dist/cjs/config.d.ts.map +1 -1
  5. package/dist/cjs/config.js +23 -14
  6. package/dist/cjs/config.js.map +1 -1
  7. package/dist/cjs/debug.d.ts +3 -0
  8. package/dist/cjs/debug.d.ts.map +1 -0
  9. package/dist/cjs/debug.js +16 -0
  10. package/dist/cjs/debug.js.map +1 -0
  11. package/dist/cjs/hooks.d.ts +45 -0
  12. package/dist/cjs/hooks.d.ts.map +1 -0
  13. package/dist/cjs/hooks.js +263 -0
  14. package/dist/cjs/hooks.js.map +1 -0
  15. package/dist/cjs/index.d.ts +5 -3
  16. package/dist/cjs/index.d.ts.map +1 -1
  17. package/dist/cjs/index.js +21 -8
  18. package/dist/cjs/index.js.map +1 -1
  19. package/dist/cjs/react/context.d.ts +4 -0
  20. package/dist/cjs/react/context.d.ts.map +1 -0
  21. package/dist/cjs/react/context.js +10 -0
  22. package/dist/cjs/react/context.js.map +1 -0
  23. package/dist/cjs/react/index.d.ts +5 -0
  24. package/dist/cjs/react/index.d.ts.map +1 -0
  25. package/dist/cjs/react/index.js +12 -0
  26. package/dist/cjs/react/index.js.map +1 -0
  27. package/dist/cjs/react/provider.d.ts +7 -0
  28. package/dist/cjs/react/provider.d.ts.map +1 -0
  29. package/dist/cjs/react/provider.js +13 -0
  30. package/dist/cjs/react/provider.js.map +1 -0
  31. package/dist/cjs/react/setup.d.ts +2 -0
  32. package/dist/cjs/react/setup.d.ts.map +1 -0
  33. package/dist/cjs/react/setup.js +13 -0
  34. package/dist/cjs/react/setup.js.map +1 -0
  35. package/dist/cjs/react/signal-value.d.ts +2 -0
  36. package/dist/cjs/react/signal-value.d.ts.map +1 -0
  37. package/dist/cjs/react/signal-value.js +35 -0
  38. package/dist/cjs/react/signal-value.js.map +1 -0
  39. package/dist/cjs/react/state.d.ts +3 -0
  40. package/dist/cjs/react/state.d.ts.map +1 -0
  41. package/dist/cjs/react/state.js +13 -0
  42. package/dist/cjs/react/state.js.map +1 -0
  43. package/dist/cjs/scheduling.d.ts +5 -0
  44. package/dist/cjs/scheduling.d.ts.map +1 -1
  45. package/dist/cjs/scheduling.js +59 -5
  46. package/dist/cjs/scheduling.js.map +1 -1
  47. package/dist/cjs/signals.d.ts +28 -68
  48. package/dist/cjs/signals.d.ts.map +1 -1
  49. package/dist/cjs/signals.js +223 -76
  50. package/dist/cjs/signals.js.map +1 -1
  51. package/dist/cjs/trace.d.ts +127 -0
  52. package/dist/cjs/trace.d.ts.map +1 -0
  53. package/dist/cjs/trace.js +319 -0
  54. package/dist/cjs/trace.js.map +1 -0
  55. package/dist/cjs/types.d.ts +66 -0
  56. package/dist/cjs/types.d.ts.map +1 -0
  57. package/dist/cjs/types.js +3 -0
  58. package/dist/cjs/types.js.map +1 -0
  59. package/dist/cjs/utils.d.ts +4 -0
  60. package/dist/cjs/utils.d.ts.map +1 -0
  61. package/dist/cjs/utils.js +80 -0
  62. package/dist/cjs/utils.js.map +1 -0
  63. package/dist/esm/config.d.ts +14 -5
  64. package/dist/esm/config.d.ts.map +1 -1
  65. package/dist/esm/config.js +19 -11
  66. package/dist/esm/config.js.map +1 -1
  67. package/dist/esm/debug.d.ts +3 -0
  68. package/dist/esm/debug.d.ts.map +1 -0
  69. package/dist/esm/debug.js +3 -0
  70. package/dist/esm/debug.js.map +1 -0
  71. package/dist/esm/hooks.d.ts +45 -0
  72. package/dist/esm/hooks.d.ts.map +1 -0
  73. package/dist/esm/hooks.js +246 -0
  74. package/dist/esm/hooks.js.map +1 -0
  75. package/dist/esm/index.d.ts +5 -3
  76. package/dist/esm/index.d.ts.map +1 -1
  77. package/dist/esm/index.js +4 -2
  78. package/dist/esm/index.js.map +1 -1
  79. package/dist/esm/react/context.d.ts +4 -0
  80. package/dist/esm/react/context.d.ts.map +1 -0
  81. package/dist/esm/react/context.js +6 -0
  82. package/dist/esm/react/context.js.map +1 -0
  83. package/dist/esm/react/index.d.ts +5 -0
  84. package/dist/esm/react/index.d.ts.map +1 -0
  85. package/dist/esm/react/index.js +5 -0
  86. package/dist/esm/react/index.js.map +1 -0
  87. package/dist/esm/react/provider.d.ts +7 -0
  88. package/dist/esm/react/provider.d.ts.map +1 -0
  89. package/dist/esm/react/provider.js +10 -0
  90. package/dist/esm/react/provider.js.map +1 -0
  91. package/dist/esm/react/setup.d.ts +2 -0
  92. package/dist/esm/react/setup.d.ts.map +1 -0
  93. package/dist/esm/react/setup.js +10 -0
  94. package/dist/esm/react/setup.js.map +1 -0
  95. package/dist/esm/react/signal-value.d.ts +2 -0
  96. package/dist/esm/react/signal-value.d.ts.map +1 -0
  97. package/dist/esm/react/signal-value.js +32 -0
  98. package/dist/esm/react/signal-value.js.map +1 -0
  99. package/dist/esm/react/state.d.ts +3 -0
  100. package/dist/esm/react/state.d.ts.map +1 -0
  101. package/dist/esm/react/state.js +10 -0
  102. package/dist/esm/react/state.js.map +1 -0
  103. package/dist/esm/scheduling.d.ts +5 -0
  104. package/dist/esm/scheduling.d.ts.map +1 -1
  105. package/dist/esm/scheduling.js +51 -1
  106. package/dist/esm/scheduling.js.map +1 -1
  107. package/dist/esm/signals.d.ts +28 -68
  108. package/dist/esm/signals.d.ts.map +1 -1
  109. package/dist/esm/signals.js +215 -72
  110. package/dist/esm/signals.js.map +1 -1
  111. package/dist/esm/trace.d.ts +127 -0
  112. package/dist/esm/trace.d.ts.map +1 -0
  113. package/dist/esm/trace.js +311 -0
  114. package/dist/esm/trace.js.map +1 -0
  115. package/dist/esm/types.d.ts +66 -0
  116. package/dist/esm/types.d.ts.map +1 -0
  117. package/dist/esm/types.js +2 -0
  118. package/dist/esm/types.js.map +1 -0
  119. package/dist/esm/utils.d.ts +4 -0
  120. package/dist/esm/utils.d.ts.map +1 -0
  121. package/dist/esm/utils.js +75 -0
  122. package/dist/esm/utils.js.map +1 -0
  123. package/package.json +43 -2
  124. package/src/__tests__/hooks/async-computed.test.ts +190 -0
  125. package/src/__tests__/hooks/async-task.test.ts +227 -0
  126. package/src/__tests__/hooks/computed.test.ts +126 -0
  127. package/src/__tests__/hooks/context.test.ts +527 -0
  128. package/src/__tests__/hooks/nesting.test.ts +303 -0
  129. package/src/__tests__/hooks/params-and-state.test.ts +168 -0
  130. package/src/__tests__/hooks/subscription.test.ts +97 -0
  131. package/src/__tests__/signals/async.test.ts +416 -0
  132. package/src/__tests__/signals/basic.test.ts +399 -0
  133. package/src/__tests__/signals/subscription.test.ts +632 -0
  134. package/src/__tests__/signals/watcher.test.ts +253 -0
  135. package/src/__tests__/utils/async.ts +6 -0
  136. package/src/__tests__/utils/builders.ts +22 -0
  137. package/src/__tests__/utils/instrumented-hooks.ts +309 -0
  138. package/src/__tests__/utils/instrumented-signals.ts +281 -0
  139. package/src/__tests__/utils/permute.ts +74 -0
  140. package/src/config.ts +32 -17
  141. package/src/debug.ts +14 -0
  142. package/src/hooks.ts +433 -0
  143. package/src/index.ts +28 -3
  144. package/src/react/__tests__/react.test.tsx +227 -0
  145. package/src/react/context.ts +8 -0
  146. package/src/react/index.ts +4 -0
  147. package/src/react/provider.tsx +18 -0
  148. package/src/react/setup.ts +10 -0
  149. package/src/react/signal-value.ts +49 -0
  150. package/src/react/state.ts +13 -0
  151. package/src/scheduling.ts +69 -1
  152. package/src/signals.ts +328 -169
  153. package/src/trace.ts +449 -0
  154. package/src/types.ts +86 -0
  155. package/src/utils.ts +83 -0
  156. package/tsconfig.json +2 -1
  157. package/vitest.workspace.ts +24 -0
  158. package/src/__tests__/async.test.ts +0 -426
  159. package/src/__tests__/basic.test.ts +0 -378
  160. package/src/__tests__/subscription.test.ts +0 -645
  161. package/src/__tests__/utils/instrumented.ts +0 -326
@@ -0,0 +1,45 @@
1
+ import { type AsyncTask, type AsyncReady, type AsyncResult, type Signal, type SignalOptions, type SignalOptionsWithInit, SignalSubscription, Watcher, WriteableSignal } from './types.js';
2
+ declare const CONTEXT_KEY: unique symbol;
3
+ export type Context<T> = symbol & {
4
+ [CONTEXT_KEY]: T;
5
+ };
6
+ export declare const state: <T>(value: T, opts?: Partial<SignalOptions<T, unknown[]>>) => WriteableSignal<T>;
7
+ export declare const createContext: <T>(initialValue: T, description?: string) => Context<T>;
8
+ export type SignalStoreMap = {
9
+ [K in Context<unknown>]: K extends Context<infer T> ? T : never;
10
+ };
11
+ export declare class SignalScope {
12
+ private parent?;
13
+ constructor(contexts: SignalStoreMap, parent?: SignalScope | undefined);
14
+ private contexts;
15
+ private children;
16
+ private contextMask;
17
+ private signals;
18
+ getChild(contexts: SignalStoreMap): SignalScope;
19
+ getContext<T>(context: Context<T>): T | undefined;
20
+ private getSignal;
21
+ private setSignal;
22
+ private deleteSignal;
23
+ run(fn: (...args: any[]) => any, args: any[], key: string, signal: Signal<unknown>, initialized: boolean): any;
24
+ get(makeSignal: (fn: (...args: any[]) => any, opts?: Partial<SignalOptionsWithInit<unknown, unknown[]>>) => Signal<unknown>, fn: (...args: any[]) => any, key: string, params: string, args: unknown[], opts?: Partial<SignalOptions<unknown, unknown[]>>): unknown;
25
+ }
26
+ export declare let ROOT_SCOPE: SignalScope;
27
+ export declare const clearRootScope: () => void;
28
+ export declare const withContext: <T>(contexts: SignalStoreMap, fn: () => T) => T;
29
+ export declare const useContext: <T>(context: Context<T>) => T;
30
+ export declare function computed<T, Args extends unknown[]>(fn: (...args: Args) => T, opts?: Partial<SignalOptions<T, Args>>): (...args: Args) => T;
31
+ export type AsyncAwaitableResult<T> = T | Promise<T>;
32
+ export declare function asyncComputed<T, Args extends unknown[]>(fn: (...args: Args) => T | Promise<T>, opts?: SignalOptions<T, Args>): (...args: Args) => AsyncResult<T>;
33
+ export declare function asyncComputed<T, Args extends unknown[]>(fn: (...args: Args) => T | Promise<T>, opts: SignalOptionsWithInit<T, Args>): (...args: Args) => AsyncReady<T>;
34
+ export interface SubscriptionState<T> {
35
+ get: () => T;
36
+ set: (value: T) => void;
37
+ }
38
+ export type SignalSubscribe<T, Args extends unknown[]> = (state: SubscriptionState<T>, ...args: Args) => SignalSubscription | (() => unknown) | undefined | void;
39
+ export declare function subscription<T, Args extends unknown[]>(fn: SignalSubscribe<T, Args>, opts?: Partial<SignalOptionsWithInit<T, Args>>): (...args: Args) => T;
40
+ export declare const asyncTask: <T, Args extends unknown[]>(fn: (...args: Args) => Promise<T>, opts?: Partial<SignalOptionsWithInit<T, Args>>) => ((...args: Args) => AsyncTask<T>);
41
+ export declare function watcher<T>(fn: (prev: T | undefined) => T, opts?: SignalOptions<T, unknown[]> & {
42
+ scope?: SignalScope;
43
+ }): Watcher<T>;
44
+ export {};
45
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ import { createComputedSignal, createAsyncComputedSignal, createSubscriptionSignal, getCurrentConsumer, createWatcherSignal, createStateSignal, createAsyncTaskSignal, } from './signals.js';
2
+ import { getObjectId, getUnknownSignalFnName, hashValue } from './utils.js';
3
+ import { getFrameworkScope, useSignalValue } from './config.js';
4
+ import WeakRef from './weakref.js';
5
+ const CONTEXT_DEFAULT_VALUES = new Map();
6
+ const CONTEXT_MASKS = new Map();
7
+ let CONTEXT_MASKS_COUNT = 0;
8
+ const COMPUTED_CONTEXT_MASKS = new Map();
9
+ const COMPUTED_OWNERS = new WeakMap();
10
+ let CURRENT_MASK = null;
11
+ export const state = (value, opts) => {
12
+ const signal = createStateSignal(value, opts);
13
+ return {
14
+ set(v) {
15
+ signal.set(v);
16
+ },
17
+ get() {
18
+ // eslint-disable-next-line react-hooks/rules-of-hooks
19
+ return useSignalValue(signal._desc, () => signal.get());
20
+ },
21
+ };
22
+ };
23
+ export const createContext = (initialValue, description) => {
24
+ const count = CONTEXT_MASKS_COUNT++;
25
+ const key = Symbol(description ?? `context:${count}`);
26
+ CONTEXT_DEFAULT_VALUES.set(key, initialValue);
27
+ CONTEXT_MASKS.set(key, BigInt(1) << BigInt(count));
28
+ return key;
29
+ };
30
+ export class SignalScope {
31
+ parent;
32
+ constructor(contexts, parent) {
33
+ this.parent = parent;
34
+ this.contexts = Object.create(parent?.contexts || null);
35
+ for (const key of Object.getOwnPropertySymbols(contexts)) {
36
+ this.contexts[key] = contexts[key];
37
+ this.contextMask |= CONTEXT_MASKS.get(key);
38
+ }
39
+ }
40
+ contexts;
41
+ children = new Map();
42
+ contextMask = 0n;
43
+ signals = new Map();
44
+ getChild(contexts) {
45
+ const key = hashValue(contexts);
46
+ let child = this.children.get(key);
47
+ if (child === undefined) {
48
+ child = new SignalScope(contexts, this);
49
+ this.children.set(key, child);
50
+ }
51
+ return child;
52
+ }
53
+ getContext(context) {
54
+ const value = this.contexts[context];
55
+ if (CURRENT_MASK !== null) {
56
+ CURRENT_MASK |= CONTEXT_MASKS.get(context);
57
+ }
58
+ return value;
59
+ }
60
+ getSignal(key, computedMask) {
61
+ return (this.contextMask & computedMask) === 0n && this.parent
62
+ ? this.parent.getSignal(key, computedMask)
63
+ : this.signals.get(key)?.deref();
64
+ }
65
+ setSignal(key, signal, mask, isPromoting) {
66
+ if ((this.contextMask & mask) === 0n && this.parent) {
67
+ this.parent.setSignal(key, signal, mask, isPromoting);
68
+ }
69
+ else {
70
+ this.signals.set(key, new WeakRef(signal));
71
+ if (isPromoting) {
72
+ this.parent?.deleteSignal(key);
73
+ }
74
+ }
75
+ }
76
+ deleteSignal(key) {
77
+ this.signals.delete(key);
78
+ this.parent?.deleteSignal(key);
79
+ }
80
+ run(fn, args, key, signal, initialized) {
81
+ const prevMask = CURRENT_MASK;
82
+ const fnMask = COMPUTED_CONTEXT_MASKS.get(fn) ?? 0n;
83
+ const signalMask = COMPUTED_CONTEXT_MASKS.get(signal) ?? 0n;
84
+ try {
85
+ CURRENT_MASK = signalMask | fnMask;
86
+ return fn(...args);
87
+ }
88
+ finally {
89
+ if (!initialized || signalMask !== CURRENT_MASK) {
90
+ COMPUTED_CONTEXT_MASKS.set(fn, CURRENT_MASK);
91
+ COMPUTED_CONTEXT_MASKS.set(signal, CURRENT_MASK);
92
+ getCurrentScope().setSignal(key, signal, CURRENT_MASK, initialized);
93
+ initialized = true;
94
+ }
95
+ CURRENT_MASK = prevMask;
96
+ }
97
+ }
98
+ get(makeSignal, fn, key, params, args, opts) {
99
+ const computedMask = COMPUTED_CONTEXT_MASKS.get(fn) ?? 0n;
100
+ const fnName = opts?.desc ?? fn.name ?? getUnknownSignalFnName(fn, makeSignal);
101
+ let signal = this.getSignal(key, computedMask);
102
+ if (signal === undefined) {
103
+ let initialized = false;
104
+ if (makeSignal === createSubscriptionSignal) {
105
+ signal = makeSignal((get, set) => {
106
+ const sub = this.run(fn, [{ get, set }, ...args], key, signal, initialized);
107
+ if (sub?.update) {
108
+ const originalUpdate = sub.update;
109
+ sub.update = (...args) => {
110
+ return this.run(originalUpdate, [], key, signal, initialized);
111
+ };
112
+ }
113
+ initialized = true;
114
+ return sub;
115
+ }, { ...opts, id: key, desc: fnName, params });
116
+ }
117
+ else {
118
+ signal = makeSignal(() => {
119
+ const result = this.run(fn, args, key, signal, initialized);
120
+ initialized = true;
121
+ return result;
122
+ }, { ...opts, id: key, desc: fnName, params });
123
+ }
124
+ }
125
+ COMPUTED_OWNERS.set(signal, this);
126
+ const value = signal.get();
127
+ if (CURRENT_MASK !== null) {
128
+ CURRENT_MASK |= COMPUTED_CONTEXT_MASKS.get(fn) ?? 0n;
129
+ }
130
+ return value;
131
+ }
132
+ }
133
+ export let ROOT_SCOPE = new SignalScope({});
134
+ export const clearRootScope = () => {
135
+ ROOT_SCOPE = new SignalScope({});
136
+ };
137
+ let OVERRIDE_SCOPE;
138
+ const getCurrentScope = () => {
139
+ if (OVERRIDE_SCOPE !== undefined) {
140
+ return OVERRIDE_SCOPE;
141
+ }
142
+ const currentConsumer = getCurrentConsumer();
143
+ if (currentConsumer) {
144
+ const scope = COMPUTED_OWNERS.get(currentConsumer);
145
+ return scope ?? ROOT_SCOPE;
146
+ }
147
+ return getFrameworkScope() ?? ROOT_SCOPE;
148
+ };
149
+ export const withContext = (contexts, fn) => {
150
+ const prevScope = OVERRIDE_SCOPE;
151
+ const currentScope = getCurrentScope();
152
+ try {
153
+ OVERRIDE_SCOPE = currentScope.getChild(contexts);
154
+ return fn();
155
+ }
156
+ finally {
157
+ OVERRIDE_SCOPE = prevScope;
158
+ }
159
+ };
160
+ export const useContext = (context) => {
161
+ let scope = OVERRIDE_SCOPE;
162
+ if (scope === undefined) {
163
+ const currentConsumer = getCurrentConsumer();
164
+ scope = currentConsumer ? COMPUTED_OWNERS.get(currentConsumer) : undefined;
165
+ }
166
+ if (scope === undefined) {
167
+ scope = getFrameworkScope();
168
+ }
169
+ if (scope === undefined) {
170
+ throw new Error('useContext must be used within a signal hook, a withContext, or within a framework-specific context provider.');
171
+ }
172
+ return scope.getContext(context) ?? CONTEXT_DEFAULT_VALUES.get(context);
173
+ };
174
+ const getParamsKey = (args, opts) => {
175
+ return opts?.paramKey ? opts.paramKey(...args) : args.map(arg => hashValue(arg)).join(', ');
176
+ };
177
+ const getComputedKey = (fn, params) => {
178
+ const fnId = getObjectId(fn);
179
+ return `${fnId}(${params})`;
180
+ };
181
+ export function computed(fn, opts) {
182
+ return (...args) => {
183
+ const params = getParamsKey(args, opts);
184
+ const key = getComputedKey(fn, params);
185
+ return useSignalValue(key, () => {
186
+ const scope = getCurrentScope();
187
+ return scope.get(createComputedSignal, fn, key, params, args, opts);
188
+ });
189
+ };
190
+ }
191
+ export function asyncComputed(fn, opts) {
192
+ return (...args) => {
193
+ const params = getParamsKey(args, opts);
194
+ const key = getComputedKey(fn, params);
195
+ return useSignalValue(key, () => {
196
+ const scope = getCurrentScope();
197
+ return scope.get(createAsyncComputedSignal, fn, key, params, args, opts);
198
+ });
199
+ };
200
+ }
201
+ export function subscription(fn, opts) {
202
+ const wrapper = (state, ...args) => {
203
+ let result = fn(state, ...args);
204
+ if (typeof result === 'function') {
205
+ return {
206
+ update() {
207
+ result();
208
+ result = fn(state, ...args);
209
+ },
210
+ unsubscribe() {
211
+ result();
212
+ },
213
+ };
214
+ }
215
+ return result;
216
+ };
217
+ Object.defineProperty(wrapper, 'name', {
218
+ value: fn.name,
219
+ writable: false,
220
+ });
221
+ return (...args) => {
222
+ const params = getParamsKey(args, opts);
223
+ const key = getComputedKey(fn, params);
224
+ return useSignalValue(key, () => {
225
+ const scope = getCurrentScope();
226
+ return scope.get(createSubscriptionSignal, wrapper, key, params, args, opts);
227
+ });
228
+ };
229
+ }
230
+ export const asyncTask = (fn, opts) => {
231
+ return (...args) => {
232
+ const params = getParamsKey(args, opts);
233
+ const key = getComputedKey(fn, params);
234
+ return useSignalValue(key, () => {
235
+ const scope = getCurrentScope();
236
+ return scope.get(createAsyncTaskSignal, fn, key, params, args, opts);
237
+ });
238
+ };
239
+ };
240
+ export function watcher(fn, opts) {
241
+ const scope = opts?.scope ?? ROOT_SCOPE;
242
+ const w = createWatcherSignal(fn, opts);
243
+ COMPUTED_OWNERS.set(w, scope);
244
+ return w;
245
+ }
246
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EAEnB,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,cAAc,CAAC;AAYtB,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,OAAO,MAAM,cAAc,CAAC;AAQnC,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAA6B,CAAC;AACpE,MAAM,aAAa,GAAG,IAAI,GAAG,EAA4B,CAAC;AAE1D,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAE5B,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAkB,CAAC;AACzD,MAAM,eAAe,GAAG,IAAI,OAAO,EAAwC,CAAC;AAE5E,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAI,KAAQ,EAAE,IAA2C,EAAsB,EAAE;IACpG,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAmB,CAAC;IAEhE,OAAO;QACL,GAAG,CAAC,CAAI;YACN,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;QAED,GAAG;YACD,sDAAsD;YACtD,OAAO,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAI,YAAe,EAAE,WAAoB,EAAE,EAAE;IACxE,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,IAAI,WAAW,KAAK,EAAE,CAAe,CAAC;IAEpE,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC9C,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAMF,MAAM,OAAO,WAAW;IAGZ;IAFV,YACE,QAAwB,EAChB,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;QAE5B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC;QAExD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,QAAQ,CAAC,GAAuB,CAAC,GAAG,QAAQ,CAAC,GAAuB,CAAC,CAAC;YAC3E,IAAI,CAAC,WAAW,IAAI,aAAa,CAAC,GAAG,CAAC,GAAuB,CAAE,CAAC;QAClE,CAAC;IACH,CAAC;IAEO,QAAQ,CAAiB;IACzB,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC1C,WAAW,GAAG,EAAE,CAAC;IACjB,OAAO,GAAG,IAAI,GAAG,EAAoC,CAAC;IAE9D,QAAQ,CAAC,QAAwB;QAC/B,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEhC,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,UAAU,CAAI,OAAmB;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,YAAY,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QAC9C,CAAC;QAED,OAAO,KAAsB,CAAC;IAChC,CAAC;IAEO,SAAS,CAAC,GAAW,EAAE,YAAoB;QACjD,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM;YAC5D,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAEO,SAAS,CAAC,GAAW,EAAE,MAAuB,EAAE,IAAY,EAAE,WAAoB;QACxF,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAE3C,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,GAAG,CAAC,EAA2B,EAAE,IAAW,EAAE,GAAW,EAAE,MAAuB,EAAE,WAAoB;QACtG,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC9B,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAE5D,IAAI,CAAC;YACH,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;YAEnC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;gBAChD,sBAAsB,CAAC,GAAG,CAAC,EAAE,EAAE,YAAa,CAAC,CAAC;gBAC9C,sBAAsB,CAAC,GAAG,CAAC,MAAM,EAAE,YAAa,CAAC,CAAC;gBAClD,eAAe,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,MAAO,EAAE,YAAa,EAAE,WAAW,CAAC,CAAC;gBACtE,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;YAED,YAAY,GAAG,QAAQ,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,GAAG,CACD,UAGoB,EACpB,EAA2B,EAC3B,GAAW,EACX,MAAc,EACd,IAAe,EACf,IAAiD;QAEjD,MAAM,YAAY,GAAG,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAE1D,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,sBAAsB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAE/E,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAE/C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,WAAW,GAAG,KAAK,CAAC;YAExB,IAAI,UAAU,KAAK,wBAAwB,EAAE,CAAC;gBAC5C,MAAM,GAAG,UAAU,CACjB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;oBACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,MAAO,EAAE,WAAW,CAE9D,CAAC;oBAEd,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;wBAChB,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC;wBAElC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE;4BACvB,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,MAAO,EAAE,WAAW,CAAC,CAAC;wBACjE,CAAC,CAAC;oBACJ,CAAC;oBAED,WAAW,GAAG,IAAI,CAAC;oBAEnB,OAAO,GAAG,CAAC;gBACb,CAAC,EACD,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAC3C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,UAAU,CACjB,GAAG,EAAE;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAO,EAAE,WAAW,CAAC,CAAC;oBAE7D,WAAW,GAAG,IAAI,CAAC;oBAEnB,OAAO,MAAM,CAAC;gBAChB,CAAC,EACD,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAC3C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,eAAe,CAAC,GAAG,CAAC,MAAiC,EAAE,IAAI,CAAC,CAAC;QAE7D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QAE3B,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,YAAY,IAAI,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACvD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,MAAM,CAAC,IAAI,UAAU,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,UAAU,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,IAAI,cAAuC,CAAC;AAE5C,MAAM,eAAe,GAAG,GAAgB,EAAE;IACxC,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAE7C,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAEnD,OAAO,KAAK,IAAI,UAAU,CAAC;IAC7B,CAAC;IAED,OAAO,iBAAiB,EAAE,IAAI,UAAU,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,QAAwB,EAAE,EAAW,EAAK,EAAE;IACzE,MAAM,SAAS,GAAG,cAAc,CAAC;IACjC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IAEvC,IAAI,CAAC;QACH,cAAc,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjD,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,cAAc,GAAG,SAAS,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAI,OAAmB,EAAK,EAAE;IACtD,IAAI,KAAK,GAAG,cAAc,CAAC;IAE3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;QAC7C,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,CAAC;IAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,+GAA+G,CAChH,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAK,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAO,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAe,EAAE,IAAyC,EAAE,EAAE;IAClF,OAAO,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9F,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,EAA2B,EAAE,MAAc,EAAE,EAAE;IACrE,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,OAAO,GAAG,IAAI,IAAI,MAAM,GAAG,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,UAAU,QAAQ,CACtB,EAAwB,EACxB,IAAsC;IAEtC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEvC,OAAO,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;YAC9B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,GAAG,CACd,oBAAoB,EACpB,EAAE,EACF,GAAG,EACH,MAAM,EACN,IAAI,EACJ,IAA0D,CACtD,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,aAAa,CAC3B,EAAqC,EACrC,IAA8C;IAE9C,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEvC,OAAO,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;YAC9B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,GAAG,CACd,yBAAyB,EACzB,EAAE,EACF,GAAG,EACH,MAAM,EACN,IAAI,EACJ,IAA0D,CACzC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,YAAY,CAC1B,EAA4B,EAC5B,IAA8C;IAE9C,MAAM,OAAO,GAAG,CAAC,KAA2B,EAAE,GAAG,IAAU,EAAE,EAAE;QAC7D,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;QAEhC,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,OAAO;gBACL,MAAM;oBACH,MAAqB,EAAE,CAAC;oBACzB,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC9B,CAAC;gBAED,WAAW;oBACR,MAAqB,EAAE,CAAC;gBAC3B,CAAC;aACF,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;QACrC,KAAK,EAAE,EAAE,CAAC,IAAI;QACd,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEvC,OAAO,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;YAC9B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,GAAG,CACd,wBAAwB,EACxB,OAAO,EACP,GAAG,EACH,MAAM,EACN,IAAI,EACJ,IAA0D,CACtD,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,EAAiC,EACjC,IAA8C,EACX,EAAE;IACrC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEvC,OAAO,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;YAC9B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,GAAG,CACd,qBAAqB,EACrB,EAAE,EACF,GAAG,EACH,MAAM,EACN,IAAI,EACJ,IAA0D,CAC3C,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,UAAU,OAAO,CACrB,EAA8B,EAC9B,IAA4D;IAE5D,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,UAAU,CAAC;IAExC,MAAM,CAAC,GAAG,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAExC,eAAe,CAAC,GAAG,CAAC,CAA4B,EAAE,KAAK,CAAC,CAAC;IAEzD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -1,4 +1,6 @@
1
- export type { Signal, AsyncSignal, WriteableSignal, SignalCompute, SignalAsyncCompute, SignalSubscribe, SignalEquals, SignalOptions, SignalOptionsWithInit, SignalSubscription, SignalWatcherEffect, AsyncPending, AsyncReady, AsyncResult, } from './signals.js';
2
- export { state, computed, asyncComputed, subscription, watcher } from './signals.js';
3
- export { setRunBatch, setScheduleFlush } from './config.js';
1
+ export type { Signal, AsyncSignal, WriteableSignal, SignalCompute, SignalAsyncCompute, SignalSubscribe, SignalEquals, SignalOptions, SignalOptionsWithInit, SignalSubscription, AsyncPending, AsyncReady, AsyncResult, Watcher, } from './types.js';
2
+ export { createStateSignal, createComputedSignal, createAsyncComputedSignal, createSubscriptionSignal, createWatcherSignal, createAsyncTaskSignal, getCurrentConsumer, } from './signals.js';
3
+ export { state, createContext, useContext, withContext, computed, asyncComputed, subscription, watcher, SignalScope, type Context, type SignalStoreMap, } from './hooks.js';
4
+ export { setConfig } from './config.js';
5
+ export { hashValue as stringifyArgs } from './utils.js';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,MAAM,EACN,WAAW,EACX,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,MAAM,EACN,WAAW,EACX,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,WAAW,EACX,OAAO,GACR,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,EACL,aAAa,EACb,UAAU,EACV,WAAW,EACX,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,OAAO,EACP,WAAW,EACX,KAAK,OAAO,EACZ,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,YAAY,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,3 +1,5 @@
1
- export { state, computed, asyncComputed, subscription, watcher } from './signals.js';
2
- export { setRunBatch, setScheduleFlush } from './config.js';
1
+ export { createStateSignal, createComputedSignal, createAsyncComputedSignal, createSubscriptionSignal, createWatcherSignal, createAsyncTaskSignal, getCurrentConsumer, } from './signals.js';
2
+ export { state, createContext, useContext, withContext, computed, asyncComputed, subscription, watcher, SignalScope, } from './hooks.js';
3
+ export { setConfig } from './config.js';
4
+ export { hashValue as stringifyArgs } from './utils.js';
3
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,EACL,aAAa,EACb,UAAU,EACV,WAAW,EACX,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,OAAO,EACP,WAAW,GAGZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { SignalScope } from '../hooks.js';
2
+ export declare const ScopeContext: import("react").Context<SignalScope | undefined>;
3
+ export declare function useScope(): SignalScope | undefined;
4
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/react/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,eAAO,MAAM,YAAY,kDAAoD,CAAC;AAE9E,wBAAgB,QAAQ,4BAEvB"}
@@ -0,0 +1,6 @@
1
+ import { createContext, useContext } from 'react';
2
+ export const ScopeContext = createContext(undefined);
3
+ export function useScope() {
4
+ return useContext(ScopeContext);
5
+ }
6
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/react/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGlD,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAA0B,SAAS,CAAC,CAAC;AAE9E,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { ContextProvider } from './provider.js';
2
+ export { useScope } from './context.js';
3
+ export { setupReact } from './setup.js';
4
+ export { useStateSignal } from './state.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { ContextProvider } from './provider.js';
2
+ export { useScope } from './context.js';
3
+ export { setupReact } from './setup.js';
4
+ export { useStateSignal } from './state.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { SignalStoreMap } from '../hooks.js';
2
+ export declare function ContextProvider({ children, contexts, inherit, }: {
3
+ children: React.ReactNode;
4
+ contexts: SignalStoreMap;
5
+ inherit?: boolean;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/react/provider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAG1D,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,QAAQ,EACR,OAAc,GACf,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,2CAKA"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useContext } from 'react';
3
+ import { SignalScope } from '../hooks.js';
4
+ import { ScopeContext } from './context.js';
5
+ export function ContextProvider({ children, contexts, inherit = true, }) {
6
+ const parentScope = useContext(ScopeContext);
7
+ const scope = new SignalScope(contexts, inherit ? parentScope : undefined);
8
+ return _jsx(ScopeContext.Provider, { value: scope, children: children });
9
+ }
10
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/react/provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,QAAQ,EACR,OAAO,GAAG,IAAI,GAKf;IACC,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE3E,OAAO,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAyB,CAAC;AACjF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function setupReact(): void;
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/react/setup.ts"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,SAKzB"}
@@ -0,0 +1,10 @@
1
+ import { setConfig } from '../config.js';
2
+ import { useScope } from './context.js';
3
+ import { useSignalValue } from './signal-value.js';
4
+ export function setupReact() {
5
+ setConfig({
6
+ useSignalValue,
7
+ getFrameworkScope: useScope,
8
+ });
9
+ }
10
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/react/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,UAAU;IACxB,SAAS,CAAC;QACR,cAAc;QACd,iBAAiB,EAAE,QAAQ;KAC5B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function useSignalValue<T>(key: string, fn: () => T): T;
2
+ //# sourceMappingURL=signal-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-value.d.ts","sourceRoot":"","sources":["../../../src/react/signal-value.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CA4C7D"}
@@ -0,0 +1,32 @@
1
+ import { useContext, useEffect, useRef, useState } from 'react';
2
+ import { ScopeContext } from './context.js';
3
+ import { watcher } from '../hooks.js';
4
+ export function useSignalValue(key, fn) {
5
+ const [, setVersion] = useState(0);
6
+ const scope = useContext(ScopeContext);
7
+ const ref = useRef({
8
+ value: undefined,
9
+ unsub: undefined,
10
+ key: undefined,
11
+ });
12
+ const currentKey = ref.current.key;
13
+ if (key !== currentKey) {
14
+ ref.current.unsub?.();
15
+ const w = watcher(fn, { scope });
16
+ let initialized = false;
17
+ ref.current.unsub = w.addListener(value => {
18
+ ref.current.value = value;
19
+ // Trigger an update to the component
20
+ if (initialized) {
21
+ setVersion(v => v + 1);
22
+ }
23
+ initialized = true;
24
+ }, {
25
+ immediate: true,
26
+ });
27
+ ref.current.key = key;
28
+ }
29
+ useEffect(() => ref.current.unsub, []);
30
+ return ref.current.value;
31
+ }
32
+ //# sourceMappingURL=signal-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-value.js","sourceRoot":"","sources":["../../../src/react/signal-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,cAAc,CAAI,GAAW,EAAE,EAAW;IACxD,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,CAIf;QACD,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;IAEnC,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAEtB,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAEjC,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,WAAW,CAC/B,KAAK,CAAC,EAAE;YACN,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YAE1B,qCAAqC;YACrC,IAAI,WAAW,EAAE,CAAC;gBAChB,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,CAAC;YAED,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC,EACD;YACE,SAAS,EAAE,IAAI;SAChB,CACF,CAAC;QAEF,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;IACxB,CAAC;IAED,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEvC,OAAO,GAAG,CAAC,OAAO,CAAC,KAAM,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { SignalOptions, WriteableSignal } from '../types.js';
2
+ export declare function useStateSignal<T>(value: T, opts?: SignalOptions<T, unknown[]>): WriteableSignal<T>;
3
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/react/state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAQlG"}
@@ -0,0 +1,10 @@
1
+ import { useRef } from 'react';
2
+ import { state } from '../hooks.js';
3
+ export function useStateSignal(value, opts) {
4
+ const ref = useRef(undefined);
5
+ if (!ref.current) {
6
+ ref.current = state(value, opts);
7
+ }
8
+ return ref.current;
9
+ }
10
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/react/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,UAAU,cAAc,CAAI,KAAQ,EAAE,IAAkC;IAC5E,MAAM,GAAG,GAAG,MAAM,CAAiC,SAAS,CAAC,CAAC;IAE9D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC"}
@@ -1,6 +1,11 @@
1
1
  import { ComputedSignal } from './signals.js';
2
+ import { Tracer } from './trace.js';
2
3
  export declare const scheduleWatcher: (watcher: ComputedSignal<any>) => void;
3
4
  export declare const scheduleDirty: (signal: ComputedSignal<any>) => void;
4
5
  export declare const schedulePull: (signal: ComputedSignal<any>) => void;
6
+ export declare const scheduleConnect: (connect: ComputedSignal<any>) => void;
5
7
  export declare const scheduleDisconnect: (disconnect: ComputedSignal<any>) => void;
8
+ export declare const scheduleEffect: (signal: ComputedSignal<any>) => void;
9
+ export declare const scheduleTracer: (tracer: Tracer) => void;
10
+ export declare const settled: () => Promise<void>;
6
11
  //# sourceMappingURL=scheduling.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scheduling.d.ts","sourceRoot":"","sources":["../../src/scheduling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAU9C,eAAO,MAAM,eAAe,YAAa,cAAc,CAAC,GAAG,CAAC,SAG3D,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,cAAc,CAAC,GAAG,CAAC,SAGxD,CAAC;AAEF,eAAO,MAAM,YAAY,WAAY,cAAc,CAAC,GAAG,CAAC,SAGvD,CAAC;AAEF,eAAO,MAAM,kBAAkB,eAAgB,cAAc,CAAC,GAAG,CAAC,SAMjE,CAAC"}
1
+ {"version":3,"file":"scheduling.d.ts","sourceRoot":"","sources":["../../src/scheduling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAyBpC,eAAO,MAAM,eAAe,YAAa,cAAc,CAAC,GAAG,CAAC,SAI3D,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,cAAc,CAAC,GAAG,CAAC,SAGxD,CAAC;AAEF,eAAO,MAAM,YAAY,WAAY,cAAc,CAAC,GAAG,CAAC,SAGvD,CAAC;AAEF,eAAO,MAAM,eAAe,YAAa,cAAc,CAAC,GAAG,CAAC,SAM3D,CAAC;AAEF,eAAO,MAAM,kBAAkB,eAAgB,cAAc,CAAC,GAAG,CAAC,SAMjE,CAAC;AAEF,eAAO,MAAM,cAAc,WAAY,cAAc,CAAC,GAAG,CAAC,SAGzD,CAAC;AAEF,eAAO,MAAM,cAAc,WAAY,MAAM,SAG5C,CAAC;AA0DF,eAAO,MAAM,OAAO,qBAInB,CAAC"}
@@ -1,9 +1,21 @@
1
- import { scheduleFlush, runBatch } from './config.js';
1
+ import { scheduleFlush as _scheduleFlush, runBatch } from './config.js';
2
2
  let PENDING_DIRTIES = [];
3
3
  let PENDING_PULLS = [];
4
4
  let PENDING_WATCHERS = [];
5
+ let PENDING_CONNECTS = new Map();
5
6
  let PENDING_DISCONNECTS = new Map();
7
+ let PENDING_EFFECTS = [];
8
+ let PENDING_TRACERS = [];
6
9
  const microtask = () => Promise.resolve();
10
+ let currentFlush = null;
11
+ const scheduleFlush = (fn) => {
12
+ if (currentFlush)
13
+ return;
14
+ let resolve;
15
+ const promise = new Promise(r => (resolve = r));
16
+ currentFlush = { promise, resolve: resolve };
17
+ _scheduleFlush(flushWatchers);
18
+ };
7
19
  export const scheduleWatcher = (watcher) => {
8
20
  PENDING_WATCHERS.push(watcher);
9
21
  scheduleFlush(flushWatchers);
@@ -16,12 +28,28 @@ export const schedulePull = (signal) => {
16
28
  PENDING_PULLS.push(signal);
17
29
  scheduleFlush(flushWatchers);
18
30
  };
31
+ export const scheduleConnect = (connect) => {
32
+ const current = PENDING_CONNECTS.get(connect) ?? 0;
33
+ PENDING_CONNECTS.set(connect, current + 1);
34
+ scheduleFlush(flushWatchers);
35
+ };
19
36
  export const scheduleDisconnect = (disconnect) => {
20
37
  const current = PENDING_DISCONNECTS.get(disconnect) ?? 0;
21
38
  PENDING_DISCONNECTS.set(disconnect, current + 1);
22
39
  scheduleFlush(flushWatchers);
23
40
  };
41
+ export const scheduleEffect = (signal) => {
42
+ PENDING_EFFECTS.push(signal);
43
+ scheduleFlush(flushWatchers);
44
+ };
45
+ export const scheduleTracer = (tracer) => {
46
+ PENDING_TRACERS.push(tracer);
47
+ scheduleFlush(flushWatchers);
48
+ };
24
49
  const flushWatchers = async () => {
50
+ const flush = currentFlush;
51
+ // Flush all the dirty signals and pulls recursively, clearing
52
+ // the microtask queue until they are all settled
25
53
  while (PENDING_DIRTIES.length > 0 || PENDING_PULLS.length > 0) {
26
54
  for (const dirty of PENDING_DIRTIES) {
27
55
  dirty._dirtyConsumers();
@@ -33,15 +61,37 @@ const flushWatchers = async () => {
33
61
  PENDING_PULLS = [];
34
62
  await microtask();
35
63
  }
64
+ // Clear the flush so that if any more watchers are scheduled,
65
+ // they will be flushed in the next tick
66
+ currentFlush = null;
36
67
  runBatch(() => {
37
68
  for (const watcher of PENDING_WATCHERS) {
38
69
  watcher._check();
39
70
  }
71
+ for (const [signal, count] of PENDING_CONNECTS) {
72
+ signal._check(true, count);
73
+ }
40
74
  for (const [signal, count] of PENDING_DISCONNECTS) {
41
75
  signal._disconnect(count);
42
76
  }
77
+ for (const signal of PENDING_EFFECTS) {
78
+ signal._runEffects();
79
+ }
80
+ for (const tracer of PENDING_TRACERS) {
81
+ tracer.flush();
82
+ }
43
83
  PENDING_WATCHERS = [];
84
+ PENDING_CONNECTS.clear();
44
85
  PENDING_DISCONNECTS.clear();
86
+ PENDING_EFFECTS = [];
87
+ PENDING_TRACERS = [];
45
88
  });
89
+ // resolve the flush promise
90
+ flush.resolve();
91
+ };
92
+ export const settled = async () => {
93
+ while (currentFlush) {
94
+ await currentFlush.promise;
95
+ }
46
96
  };
47
97
  //# sourceMappingURL=scheduling.js.map