signalium 0.3.7 → 1.0.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.
Files changed (287) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/CHANGELOG.md +21 -0
  3. package/build/react.js +19 -0
  4. package/build/transform.js +19 -0
  5. package/dist/cjs/config.d.ts +8 -3
  6. package/dist/cjs/config.d.ts.map +1 -1
  7. package/dist/cjs/config.js +14 -8
  8. package/dist/cjs/config.js.map +1 -1
  9. package/dist/cjs/debug.d.ts +2 -2
  10. package/dist/cjs/debug.d.ts.map +1 -1
  11. package/dist/cjs/debug.js +3 -3
  12. package/dist/cjs/debug.js.map +1 -1
  13. package/dist/cjs/hooks.d.ts +14 -42
  14. package/dist/cjs/hooks.d.ts.map +1 -1
  15. package/dist/cjs/hooks.js +19 -240
  16. package/dist/cjs/hooks.js.map +1 -1
  17. package/dist/cjs/index.d.ts +5 -3
  18. package/dist/cjs/index.d.ts.map +1 -1
  19. package/dist/cjs/index.js +18 -18
  20. package/dist/cjs/index.js.map +1 -1
  21. package/dist/cjs/internals/async.d.ts +50 -0
  22. package/dist/cjs/internals/async.d.ts.map +1 -0
  23. package/dist/cjs/internals/async.js +390 -0
  24. package/dist/cjs/internals/async.js.map +1 -0
  25. package/dist/cjs/internals/connect.d.ts +4 -0
  26. package/dist/cjs/internals/connect.d.ts.map +1 -0
  27. package/dist/cjs/internals/connect.js +37 -0
  28. package/dist/cjs/internals/connect.js.map +1 -0
  29. package/dist/cjs/internals/consumer.d.ts +6 -0
  30. package/dist/cjs/internals/consumer.d.ts.map +1 -0
  31. package/dist/cjs/internals/consumer.js +13 -0
  32. package/dist/cjs/internals/consumer.js.map +1 -0
  33. package/dist/cjs/internals/contexts.d.ts +33 -0
  34. package/dist/cjs/internals/contexts.d.ts.map +1 -0
  35. package/dist/cjs/internals/contexts.js +103 -0
  36. package/dist/cjs/internals/contexts.js.map +1 -0
  37. package/dist/cjs/internals/derived.d.ts +66 -0
  38. package/dist/cjs/internals/derived.d.ts.map +1 -0
  39. package/dist/cjs/internals/derived.js +128 -0
  40. package/dist/cjs/internals/derived.js.map +1 -0
  41. package/dist/cjs/internals/dirty.d.ts +5 -0
  42. package/dist/cjs/internals/dirty.d.ts.map +1 -0
  43. package/dist/cjs/internals/dirty.js +79 -0
  44. package/dist/cjs/internals/dirty.js.map +1 -0
  45. package/dist/cjs/internals/edge.d.ts +32 -0
  46. package/dist/cjs/internals/edge.d.ts.map +1 -0
  47. package/dist/cjs/internals/edge.js +59 -0
  48. package/dist/cjs/internals/edge.js.map +1 -0
  49. package/dist/cjs/internals/get.d.ts +10 -0
  50. package/dist/cjs/internals/get.d.ts.map +1 -0
  51. package/dist/cjs/internals/get.js +255 -0
  52. package/dist/cjs/internals/get.js.map +1 -0
  53. package/dist/cjs/internals/scheduling.d.ts +12 -0
  54. package/dist/cjs/internals/scheduling.d.ts.map +1 -0
  55. package/dist/cjs/internals/scheduling.js +117 -0
  56. package/dist/cjs/internals/scheduling.js.map +1 -0
  57. package/dist/cjs/internals/state.d.ts +18 -0
  58. package/dist/cjs/internals/state.d.ts.map +1 -0
  59. package/dist/cjs/internals/state.js +88 -0
  60. package/dist/cjs/internals/state.js.map +1 -0
  61. package/dist/cjs/internals/utils/debug-name.d.ts +2 -0
  62. package/dist/cjs/internals/utils/debug-name.d.ts.map +1 -0
  63. package/dist/cjs/internals/utils/debug-name.js +14 -0
  64. package/dist/cjs/internals/utils/debug-name.js.map +1 -0
  65. package/dist/cjs/internals/utils/equals.d.ts +3 -0
  66. package/dist/cjs/internals/utils/equals.d.ts.map +1 -0
  67. package/dist/cjs/internals/utils/equals.js +13 -0
  68. package/dist/cjs/internals/utils/equals.js.map +1 -0
  69. package/dist/cjs/internals/utils/hash.d.ts +7 -0
  70. package/dist/cjs/internals/utils/hash.d.ts.map +1 -0
  71. package/dist/cjs/internals/utils/hash.js +181 -0
  72. package/dist/cjs/internals/utils/hash.js.map +1 -0
  73. package/dist/cjs/internals/utils/stringify.d.ts +3 -0
  74. package/dist/cjs/internals/utils/stringify.d.ts.map +1 -0
  75. package/dist/cjs/{utils.js → internals/utils/stringify.js} +5 -27
  76. package/dist/cjs/internals/utils/stringify.js.map +1 -0
  77. package/dist/cjs/internals/utils/type-utils.d.ts +6 -0
  78. package/dist/cjs/internals/utils/type-utils.d.ts.map +1 -0
  79. package/dist/cjs/internals/utils/type-utils.js +22 -0
  80. package/dist/cjs/internals/utils/type-utils.js.map +1 -0
  81. package/dist/cjs/react/context.d.ts +1 -1
  82. package/dist/cjs/react/context.d.ts.map +1 -1
  83. package/dist/cjs/react/provider.d.ts +4 -3
  84. package/dist/cjs/react/provider.d.ts.map +1 -1
  85. package/dist/cjs/react/provider.js +7 -3
  86. package/dist/cjs/react/provider.js.map +1 -1
  87. package/dist/cjs/react/setup.d.ts.map +1 -1
  88. package/dist/cjs/react/setup.js +2 -1
  89. package/dist/cjs/react/setup.js.map +1 -1
  90. package/dist/cjs/react/signal-value.d.ts +5 -1
  91. package/dist/cjs/react/signal-value.d.ts.map +1 -1
  92. package/dist/cjs/react/signal-value.js +35 -45
  93. package/dist/cjs/react/signal-value.js.map +1 -1
  94. package/dist/cjs/trace.d.ts +32 -28
  95. package/dist/cjs/trace.d.ts.map +1 -1
  96. package/dist/cjs/trace.js +14 -16
  97. package/dist/cjs/trace.js.map +1 -1
  98. package/dist/cjs/transform.d.ts +6 -0
  99. package/dist/cjs/transform.d.ts.map +1 -0
  100. package/dist/cjs/transform.js +92 -0
  101. package/dist/cjs/transform.js.map +1 -0
  102. package/dist/cjs/types.d.ts +32 -40
  103. package/dist/cjs/types.d.ts.map +1 -1
  104. package/dist/esm/config.d.ts +8 -3
  105. package/dist/esm/config.d.ts.map +1 -1
  106. package/dist/esm/config.js +12 -7
  107. package/dist/esm/config.js.map +1 -1
  108. package/dist/esm/debug.d.ts +2 -2
  109. package/dist/esm/debug.d.ts.map +1 -1
  110. package/dist/esm/debug.js +2 -2
  111. package/dist/esm/debug.js.map +1 -1
  112. package/dist/esm/hooks.d.ts +14 -42
  113. package/dist/esm/hooks.d.ts.map +1 -1
  114. package/dist/esm/hooks.js +17 -226
  115. package/dist/esm/hooks.js.map +1 -1
  116. package/dist/esm/index.d.ts +5 -3
  117. package/dist/esm/index.d.ts.map +1 -1
  118. package/dist/esm/index.js +5 -3
  119. package/dist/esm/index.js.map +1 -1
  120. package/dist/esm/internals/async.d.ts +50 -0
  121. package/dist/esm/internals/async.d.ts.map +1 -0
  122. package/dist/esm/internals/async.js +383 -0
  123. package/dist/esm/internals/async.js.map +1 -0
  124. package/dist/esm/internals/connect.d.ts +4 -0
  125. package/dist/esm/internals/connect.d.ts.map +1 -0
  126. package/dist/esm/internals/connect.js +33 -0
  127. package/dist/esm/internals/connect.js.map +1 -0
  128. package/dist/esm/internals/consumer.d.ts +6 -0
  129. package/dist/esm/internals/consumer.d.ts.map +1 -0
  130. package/dist/esm/internals/consumer.js +9 -0
  131. package/dist/esm/internals/consumer.js.map +1 -0
  132. package/dist/esm/internals/contexts.d.ts +33 -0
  133. package/dist/esm/internals/contexts.d.ts.map +1 -0
  134. package/dist/esm/internals/contexts.js +92 -0
  135. package/dist/esm/internals/contexts.js.map +1 -0
  136. package/dist/esm/internals/derived.d.ts +66 -0
  137. package/dist/esm/internals/derived.d.ts.map +1 -0
  138. package/dist/esm/internals/derived.js +118 -0
  139. package/dist/esm/internals/derived.js.map +1 -0
  140. package/dist/esm/internals/dirty.d.ts +5 -0
  141. package/dist/esm/internals/dirty.d.ts.map +1 -0
  142. package/dist/esm/internals/dirty.js +75 -0
  143. package/dist/esm/internals/dirty.js.map +1 -0
  144. package/dist/esm/internals/edge.d.ts +32 -0
  145. package/dist/esm/internals/edge.d.ts.map +1 -0
  146. package/dist/esm/internals/edge.js +54 -0
  147. package/dist/esm/internals/edge.js.map +1 -0
  148. package/dist/esm/internals/get.d.ts +10 -0
  149. package/dist/esm/internals/get.d.ts.map +1 -0
  150. package/dist/esm/internals/get.js +247 -0
  151. package/dist/esm/internals/get.js.map +1 -0
  152. package/dist/esm/internals/scheduling.d.ts +12 -0
  153. package/dist/esm/internals/scheduling.d.ts.map +1 -0
  154. package/dist/esm/internals/scheduling.js +106 -0
  155. package/dist/esm/internals/scheduling.js.map +1 -0
  156. package/dist/esm/internals/state.d.ts +18 -0
  157. package/dist/esm/internals/state.d.ts.map +1 -0
  158. package/dist/esm/internals/state.js +82 -0
  159. package/dist/esm/internals/state.js.map +1 -0
  160. package/dist/esm/internals/utils/debug-name.d.ts +2 -0
  161. package/dist/esm/internals/utils/debug-name.d.ts.map +1 -0
  162. package/dist/esm/internals/utils/debug-name.js +11 -0
  163. package/dist/esm/internals/utils/debug-name.js.map +1 -0
  164. package/dist/esm/internals/utils/equals.d.ts +3 -0
  165. package/dist/esm/internals/utils/equals.d.ts.map +1 -0
  166. package/dist/esm/internals/utils/equals.js +9 -0
  167. package/dist/esm/internals/utils/equals.js.map +1 -0
  168. package/dist/esm/internals/utils/hash.d.ts +7 -0
  169. package/dist/esm/internals/utils/hash.d.ts.map +1 -0
  170. package/dist/esm/internals/utils/hash.js +174 -0
  171. package/dist/esm/internals/utils/hash.js.map +1 -0
  172. package/dist/esm/internals/utils/stringify.d.ts +3 -0
  173. package/dist/esm/internals/utils/stringify.d.ts.map +1 -0
  174. package/dist/esm/{utils.js → internals/utils/stringify.js} +4 -25
  175. package/dist/esm/internals/utils/stringify.js.map +1 -0
  176. package/dist/esm/internals/utils/type-utils.d.ts +6 -0
  177. package/dist/esm/internals/utils/type-utils.d.ts.map +1 -0
  178. package/dist/esm/internals/utils/type-utils.js +15 -0
  179. package/dist/esm/internals/utils/type-utils.js.map +1 -0
  180. package/dist/esm/react/context.d.ts +1 -1
  181. package/dist/esm/react/context.d.ts.map +1 -1
  182. package/dist/esm/react/provider.d.ts +4 -3
  183. package/dist/esm/react/provider.d.ts.map +1 -1
  184. package/dist/esm/react/provider.js +6 -2
  185. package/dist/esm/react/provider.js.map +1 -1
  186. package/dist/esm/react/setup.d.ts.map +1 -1
  187. package/dist/esm/react/setup.js +3 -2
  188. package/dist/esm/react/setup.js.map +1 -1
  189. package/dist/esm/react/signal-value.d.ts +5 -1
  190. package/dist/esm/react/signal-value.d.ts.map +1 -1
  191. package/dist/esm/react/signal-value.js +34 -45
  192. package/dist/esm/react/signal-value.js.map +1 -1
  193. package/dist/esm/trace.d.ts +32 -28
  194. package/dist/esm/trace.d.ts.map +1 -1
  195. package/dist/esm/trace.js +13 -15
  196. package/dist/esm/trace.js.map +1 -1
  197. package/dist/esm/transform.d.ts +6 -0
  198. package/dist/esm/transform.d.ts.map +1 -0
  199. package/dist/esm/transform.js +89 -0
  200. package/dist/esm/transform.js.map +1 -0
  201. package/dist/esm/types.d.ts +32 -40
  202. package/dist/esm/types.d.ts.map +1 -1
  203. package/package.json +23 -4
  204. package/src/__tests__/__snapshots__/context.test.ts.snap +2101 -0
  205. package/src/__tests__/__snapshots__/nesting.test.ts.snap +16201 -0
  206. package/src/__tests__/__snapshots__/params-and-state.test.ts.snap +1879 -0
  207. package/src/__tests__/async-task.test.ts +327 -0
  208. package/src/__tests__/context.test.ts +517 -0
  209. package/src/__tests__/nesting.test.ts +298 -0
  210. package/src/__tests__/params-and-state.test.ts +230 -0
  211. package/src/__tests__/reactive-async.test.ts +548 -0
  212. package/src/__tests__/reactive-sync.test.ts +130 -0
  213. package/src/__tests__/subscription.test.ts +510 -0
  214. package/src/__tests__/utils/async.ts +1 -1
  215. package/src/__tests__/utils/instrumented-hooks.ts +229 -124
  216. package/src/__tests__/utils/permute.ts +25 -14
  217. package/src/config.ts +19 -9
  218. package/src/debug.ts +2 -2
  219. package/src/hooks.ts +46 -380
  220. package/src/index.ts +7 -24
  221. package/src/internals/async.ts +556 -0
  222. package/src/internals/connect.ts +41 -0
  223. package/src/internals/consumer.ts +13 -0
  224. package/src/internals/contexts.ts +133 -0
  225. package/src/internals/derived.ts +208 -0
  226. package/src/internals/dirty.ts +91 -0
  227. package/src/internals/edge.ts +109 -0
  228. package/src/internals/get.ts +298 -0
  229. package/src/internals/scheduling.ts +140 -0
  230. package/src/internals/state.ts +111 -0
  231. package/src/internals/utils/debug-name.ts +14 -0
  232. package/src/internals/utils/equals.ts +12 -0
  233. package/src/internals/utils/hash.ts +221 -0
  234. package/src/{utils.ts → internals/utils/stringify.ts} +3 -29
  235. package/src/internals/utils/type-utils.ts +19 -0
  236. package/src/react/__tests__/async.test.tsx +704 -0
  237. package/src/react/__tests__/basic.test.tsx +95 -0
  238. package/src/react/__tests__/contexts.test.tsx +99 -0
  239. package/src/react/__tests__/subscriptions.test.tsx +49 -0
  240. package/src/react/__tests__/utils.tsx +40 -0
  241. package/src/react/context.ts +1 -1
  242. package/src/react/provider.tsx +12 -4
  243. package/src/react/setup.ts +3 -2
  244. package/src/react/signal-value.ts +47 -67
  245. package/src/trace.ts +43 -38
  246. package/src/transform.ts +113 -0
  247. package/src/types.ts +56 -46
  248. package/transform.js +19 -0
  249. package/vitest.workspace.ts +38 -2
  250. package/dist/cjs/scheduling.d.ts +0 -11
  251. package/dist/cjs/scheduling.d.ts.map +0 -1
  252. package/dist/cjs/scheduling.js +0 -108
  253. package/dist/cjs/scheduling.js.map +0 -1
  254. package/dist/cjs/signals.d.ts +0 -73
  255. package/dist/cjs/signals.d.ts.map +0 -1
  256. package/dist/cjs/signals.js +0 -632
  257. package/dist/cjs/signals.js.map +0 -1
  258. package/dist/cjs/utils.d.ts +0 -4
  259. package/dist/cjs/utils.d.ts.map +0 -1
  260. package/dist/cjs/utils.js.map +0 -1
  261. package/dist/esm/scheduling.d.ts +0 -11
  262. package/dist/esm/scheduling.d.ts.map +0 -1
  263. package/dist/esm/scheduling.js +0 -97
  264. package/dist/esm/scheduling.js.map +0 -1
  265. package/dist/esm/signals.d.ts +0 -73
  266. package/dist/esm/signals.d.ts.map +0 -1
  267. package/dist/esm/signals.js +0 -614
  268. package/dist/esm/signals.js.map +0 -1
  269. package/dist/esm/utils.d.ts +0 -4
  270. package/dist/esm/utils.d.ts.map +0 -1
  271. package/dist/esm/utils.js.map +0 -1
  272. package/src/__tests__/hooks/async-computed.test.ts +0 -190
  273. package/src/__tests__/hooks/async-task.test.ts +0 -334
  274. package/src/__tests__/hooks/computed.test.ts +0 -126
  275. package/src/__tests__/hooks/context.test.ts +0 -527
  276. package/src/__tests__/hooks/nesting.test.ts +0 -303
  277. package/src/__tests__/hooks/params-and-state.test.ts +0 -168
  278. package/src/__tests__/hooks/subscription.test.ts +0 -97
  279. package/src/__tests__/signals/async.test.ts +0 -416
  280. package/src/__tests__/signals/basic.test.ts +0 -399
  281. package/src/__tests__/signals/subscription.test.ts +0 -632
  282. package/src/__tests__/signals/watcher.test.ts +0 -253
  283. package/src/__tests__/utils/builders.ts +0 -22
  284. package/src/__tests__/utils/instrumented-signals.ts +0 -291
  285. package/src/react/__tests__/react.test.tsx +0 -227
  286. package/src/scheduling.ts +0 -130
  287. package/src/signals.ts +0 -824
@@ -0,0 +1,66 @@
1
+ import { Tracer, TracerMeta } from '../trace.js';
2
+ import { ReactiveValue, Signal, SignalEquals, SignalListener, SignalOptionsWithInit } from '../types.js';
3
+ import { SignalScope } from './contexts.js';
4
+ import { Edge } from './edge.js';
5
+ /**
6
+ * This file contains computed signal base types and struct definitions.
7
+ *
8
+ * Computed signals are monomorphic to make them more efficient, but this also
9
+ * means that multiple fields differ based on the type of the signal. Defining
10
+ * them using this pattern rather than a class allows us to switch on the `type`
11
+ * field to get strong typing in branches everywhere else.
12
+ *
13
+ * "Methods" for this struct are defined in other files for better organization.
14
+ */
15
+ export type SignalId = number;
16
+ export declare const enum SignalState {
17
+ Clean = 0,
18
+ Pending = 1,
19
+ Dirty = 2,
20
+ MaybeDirty = 3
21
+ }
22
+ export declare const enum SignalFlags {
23
+ State = 3,
24
+ isSubscription = 4,
25
+ isListener = 8
26
+ }
27
+ interface ListenerMeta {
28
+ updatedAt: number;
29
+ current: Set<SignalListener>;
30
+ cachedBoundAdd: (listener: SignalListener) => () => void;
31
+ }
32
+ export declare class DerivedSignal<T, Args extends unknown[]> implements Signal<ReactiveValue<T>> {
33
+ private flags;
34
+ scope: SignalScope | undefined;
35
+ subs: Map<WeakRef<DerivedSignal<any, any>>, Edge>;
36
+ deps: Map<DerivedSignal<any, any>, Edge>;
37
+ ref: WeakRef<DerivedSignal<T, Args>>;
38
+ equals: SignalEquals<any>;
39
+ dirtyHead: Edge | undefined;
40
+ updatedCount: number;
41
+ computedCount: number;
42
+ watchCount: number;
43
+ _listeners: ListenerMeta | null;
44
+ compute: (...args: Args) => T;
45
+ args: Args;
46
+ value: ReactiveValue<T> | undefined;
47
+ tracerMeta?: TracerMeta;
48
+ constructor(isSubscription: boolean, compute: (...args: Args) => T, args: Args, key?: SignalId, scope?: SignalScope, opts?: Partial<SignalOptionsWithInit<T, Args>> & {
49
+ tracer?: Tracer;
50
+ });
51
+ get _state(): SignalState;
52
+ set _state(state: SignalState);
53
+ get _isListener(): boolean;
54
+ set _isListener(isListener: boolean);
55
+ get listeners(): ListenerMeta;
56
+ get(): ReactiveValue<T>;
57
+ addListener(listener: SignalListener): () => void;
58
+ addListenerLazy(): (listener: SignalListener) => () => void;
59
+ }
60
+ export declare const runListeners: (signal: DerivedSignal<any, any>) => void;
61
+ export declare const isSubscription: (signal: unknown) => boolean;
62
+ export declare function createDerivedSignal<T, Args extends unknown[]>(compute: (...args: Args) => T, args?: Args, key?: SignalId, scope?: SignalScope, opts?: Partial<SignalOptionsWithInit<T, Args>> & {
63
+ tracer?: Tracer;
64
+ }, isSubscription?: boolean): DerivedSignal<T, Args>;
65
+ export {};
66
+ //# sourceMappingURL=derived.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived.d.ts","sourceRoot":"","sources":["../../../src/internals/derived.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import WeakRef from '../weakref.js';
2
+ import { TRACER } from '../trace.js';
3
+ import { getUnknownSignalFnName } from './utils/debug-name.js';
4
+ import { getSignal } from './get.js';
5
+ import { schedulePull, scheduleUnwatch } from './scheduling.js';
6
+ import { hashValue } from './utils/hash.js';
7
+ import { stringifyValue } from './utils/stringify.js';
8
+ import { equalsFrom } from './utils/equals.js';
9
+ let ID = 0;
10
+ export class DerivedSignal {
11
+ // Bitmask containing state in the first 2 bits and boolean properties in the remaining bits
12
+ flags;
13
+ scope = undefined;
14
+ subs = new Map();
15
+ deps = new Map();
16
+ ref = new WeakRef(this);
17
+ equals;
18
+ dirtyHead = undefined;
19
+ updatedCount = 0;
20
+ computedCount = 0;
21
+ watchCount = 0;
22
+ _listeners = null;
23
+ compute;
24
+ args;
25
+ value;
26
+ tracerMeta;
27
+ constructor(isSubscription, compute, args, key, scope, opts) {
28
+ this.flags = (isSubscription ? 4 /* SignalFlags.isSubscription */ : 0) | 2 /* SignalState.Dirty */;
29
+ this.scope = scope;
30
+ this.compute = compute;
31
+ this.args = args;
32
+ this.equals = equalsFrom(opts?.equals);
33
+ this.value = opts?.initValue;
34
+ if (TRACER) {
35
+ this.tracerMeta = {
36
+ id: opts?.id ?? key ?? hashValue([compute, ID++]),
37
+ desc: opts?.desc ?? compute.name ?? getUnknownSignalFnName(compute),
38
+ params: args.map(arg => stringifyValue(arg)).join(', '),
39
+ tracer: opts?.tracer,
40
+ };
41
+ }
42
+ }
43
+ get _state() {
44
+ return this.flags & 3 /* SignalFlags.State */;
45
+ }
46
+ set _state(state) {
47
+ this.flags = (this.flags & ~3 /* SignalFlags.State */) | state;
48
+ }
49
+ get _isListener() {
50
+ return (this.flags & 8 /* SignalFlags.isListener */) !== 0;
51
+ }
52
+ set _isListener(isListener) {
53
+ if (isListener) {
54
+ this.flags |= 8 /* SignalFlags.isListener */;
55
+ }
56
+ else {
57
+ this.flags &= ~8 /* SignalFlags.isListener */;
58
+ }
59
+ }
60
+ get listeners() {
61
+ return (this._listeners ??
62
+ (this._listeners = {
63
+ updatedAt: 0,
64
+ current: new Set(),
65
+ cachedBoundAdd: this.addListener.bind(this),
66
+ }));
67
+ }
68
+ get() {
69
+ return getSignal(this);
70
+ }
71
+ addListener(listener) {
72
+ const { current } = this.listeners;
73
+ if (!current.has(listener)) {
74
+ if (!this._isListener) {
75
+ this.watchCount++;
76
+ this.flags |= 8 /* SignalFlags.isListener */;
77
+ }
78
+ schedulePull(this);
79
+ current.add(listener);
80
+ }
81
+ return () => {
82
+ if (current.has(listener)) {
83
+ current.delete(listener);
84
+ if (current.size === 0) {
85
+ scheduleUnwatch(this);
86
+ this.flags &= ~8 /* SignalFlags.isListener */;
87
+ }
88
+ }
89
+ };
90
+ }
91
+ // This method is used in React hooks specifically. It returns a bound add method
92
+ // that is cached to avoid creating a new one on each call, and it eagerly sets
93
+ // the listener as watched so that subscriptions that are accessed will be activated.
94
+ addListenerLazy() {
95
+ if (!this._isListener) {
96
+ this.watchCount++;
97
+ this.flags |= 8 /* SignalFlags.isListener */;
98
+ }
99
+ return this.listeners.cachedBoundAdd;
100
+ }
101
+ }
102
+ export const runListeners = (signal) => {
103
+ const { listeners } = signal;
104
+ if (listeners === null) {
105
+ return;
106
+ }
107
+ const { current } = listeners;
108
+ for (const listener of current) {
109
+ listener();
110
+ }
111
+ };
112
+ export const isSubscription = (signal) => {
113
+ return (signal.flags & 4 /* SignalFlags.isSubscription */) !== 0;
114
+ };
115
+ export function createDerivedSignal(compute, args = [], key, scope, opts, isSubscription = false) {
116
+ return new DerivedSignal(isSubscription, compute, args, key, scope, opts);
117
+ }
118
+ //# sourceMappingURL=derived.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived.js","sourceRoot":"","sources":["../../../src/internals/derived.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { DerivedSignal } from './derived.js';
2
+ import { Edge } from './edge.js';
3
+ export declare function dirtySignal(signal: DerivedSignal<any, any>): void;
4
+ export declare function dirtySignalConsumers(map: Map<WeakRef<DerivedSignal<any, any>>, Edge>): void;
5
+ //# sourceMappingURL=dirty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dirty.d.ts","sourceRoot":"","sources":["../../../src/internals/dirty.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA+B,MAAM,cAAc,CAAC;AAE1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,QAY1D;AAyBD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAgDpF"}
@@ -0,0 +1,75 @@
1
+ import { scheduleAsyncPull, schedulePull } from './scheduling.js';
2
+ import { isSubscription } from './derived.js';
3
+ import { CURRENT_CONSUMER } from './get.js';
4
+ export function dirtySignal(signal) {
5
+ const prevState = signal._state;
6
+ if (prevState === 2 /* SignalState.Dirty */) {
7
+ return;
8
+ }
9
+ signal._state = 2 /* SignalState.Dirty */;
10
+ if (prevState !== 3 /* SignalState.MaybeDirty */) {
11
+ propagateDirty(signal);
12
+ }
13
+ }
14
+ function propagateDirty(signal) {
15
+ if (CURRENT_CONSUMER === signal) {
16
+ throw new Error('A signal was dirtied after it was consumed by the current function. This can cause race conditions and infinite rerenders and is not allowed.');
17
+ }
18
+ if (isSubscription(signal)) {
19
+ if (signal.watchCount > 0) {
20
+ scheduleAsyncPull(signal);
21
+ }
22
+ // else do nothing, only schedule if connected
23
+ }
24
+ else {
25
+ if (signal._isListener) {
26
+ schedulePull(signal);
27
+ }
28
+ dirtySignalConsumers(signal.subs);
29
+ signal.subs = new Map();
30
+ }
31
+ }
32
+ export function dirtySignalConsumers(map) {
33
+ for (const [subRef, edge] of map) {
34
+ const sub = subRef.deref();
35
+ if (sub === undefined || sub.computedCount !== edge.consumedAt)
36
+ continue;
37
+ const dirtyState = sub._state;
38
+ switch (dirtyState) {
39
+ case 0 /* SignalState.Clean */:
40
+ sub._state = 3 /* SignalState.MaybeDirty */;
41
+ sub.dirtyHead = edge;
42
+ edge.nextDirty = undefined;
43
+ propagateDirty(sub);
44
+ break;
45
+ case 1 /* SignalState.Pending */:
46
+ case 3 /* SignalState.MaybeDirty */: {
47
+ let subEdge = sub.dirtyHead;
48
+ const ord = edge.ord;
49
+ if (subEdge.ord > ord) {
50
+ sub.dirtyHead = edge;
51
+ edge.nextDirty = subEdge;
52
+ if (dirtyState === 1 /* SignalState.Pending */) {
53
+ // If the signal is pending, the first edge is the halt edge. If the
54
+ // new dirty edge is BEFORE the halt edge, then it means that something
55
+ // changed before the current halt, so we need to cancel the current computation
56
+ // and recompute.
57
+ sub._state = 3 /* SignalState.MaybeDirty */;
58
+ propagateDirty(sub);
59
+ }
60
+ }
61
+ else {
62
+ let nextDirty = subEdge.nextDirty;
63
+ while (nextDirty !== undefined && nextDirty.ord < ord) {
64
+ subEdge = nextDirty;
65
+ nextDirty = subEdge.nextDirty;
66
+ }
67
+ edge.nextDirty = nextDirty;
68
+ subEdge.nextDirty = edge;
69
+ }
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=dirty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dirty.js","sourceRoot":"","sources":["../../../src/internals/dirty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { ReactivePromise } from './async.js';
2
+ import type { DerivedSignal } from './derived.js';
3
+ export declare const enum EdgeType {
4
+ Signal = 0,
5
+ Promise = 1
6
+ }
7
+ export interface EdgeTypeDep {
8
+ [EdgeType.Signal]: DerivedSignal<any, any>;
9
+ [EdgeType.Promise]: ReactivePromise<any>;
10
+ }
11
+ interface BaseEdge {
12
+ type: EdgeType;
13
+ dep: EdgeTypeDep[EdgeType];
14
+ ord: number;
15
+ updatedAt: number;
16
+ consumedAt: number;
17
+ nextDirty: Edge | undefined;
18
+ }
19
+ export interface SignalEdge extends BaseEdge {
20
+ type: EdgeType.Signal;
21
+ dep: DerivedSignal<any, any>;
22
+ }
23
+ export interface PromiseEdge extends BaseEdge {
24
+ type: EdgeType.Promise;
25
+ dep: ReactivePromise<any>;
26
+ }
27
+ export type Edge = SignalEdge | PromiseEdge;
28
+ export declare function createEdge<T extends EdgeType, R extends T extends EdgeType.Signal ? SignalEdge : PromiseEdge>(prevEdge: Edge | undefined, type: T, dep: EdgeTypeDep[T], updatedAt: number, consumedAt: number): R;
29
+ export declare function insertDirty(node: DerivedSignal<any, any>, edge: Edge): void;
30
+ export declare function findAndRemoveDirty(sub: DerivedSignal<any, any>, dep: DerivedSignal<any, any> | ReactivePromise<any>): Edge | undefined;
31
+ export {};
32
+ //# sourceMappingURL=edge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../../../src/internals/edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,0BAAkB,QAAQ;IACxB,MAAM,IAAI;IACV,OAAO,IAAI;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAC1C;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;IACtB,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;IACvB,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG,WAAW,CAAC;AAE5C,wBAAgB,UAAU,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,QAAQ,CAAC,MAAM,GAAG,UAAU,GAAG,WAAW,EAC3G,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,IAAI,EAAE,CAAC,EACP,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,CAAC,CAiBH;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,QAgBpE;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAC5B,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,GAClD,IAAI,GAAG,SAAS,CAyBlB"}
@@ -0,0 +1,54 @@
1
+ let CURRENT_ORD = 0;
2
+ export function createEdge(prevEdge, type, dep, updatedAt, consumedAt) {
3
+ if (prevEdge === undefined) {
4
+ return {
5
+ type,
6
+ dep,
7
+ ord: CURRENT_ORD++,
8
+ updatedAt,
9
+ consumedAt,
10
+ nextDirty: undefined,
11
+ };
12
+ }
13
+ prevEdge.ord = CURRENT_ORD++;
14
+ prevEdge.updatedAt = updatedAt;
15
+ prevEdge.consumedAt = consumedAt;
16
+ prevEdge.nextDirty = undefined;
17
+ return prevEdge;
18
+ }
19
+ export function insertDirty(node, edge) {
20
+ const ord = edge.ord;
21
+ let currentEdge = node.dirtyHead;
22
+ if (currentEdge === undefined || currentEdge.ord > ord) {
23
+ node.dirtyHead = edge;
24
+ }
25
+ else {
26
+ let nextEdge = currentEdge.nextDirty;
27
+ while (nextEdge !== undefined && nextEdge.ord < ord) {
28
+ currentEdge = nextEdge;
29
+ nextEdge = currentEdge.nextDirty;
30
+ }
31
+ currentEdge.nextDirty = edge;
32
+ }
33
+ }
34
+ export function findAndRemoveDirty(sub, dep) {
35
+ let edge = sub.dirtyHead;
36
+ if (edge === undefined) {
37
+ return undefined;
38
+ }
39
+ if (edge.dep === dep) {
40
+ sub.dirtyHead = edge.nextDirty;
41
+ return edge;
42
+ }
43
+ let nextLink = edge.nextDirty;
44
+ while (nextLink !== undefined) {
45
+ if (nextLink.dep === dep) {
46
+ edge.nextDirty = nextLink.nextDirty;
47
+ return nextLink;
48
+ }
49
+ edge = nextLink;
50
+ nextLink = edge.nextDirty;
51
+ }
52
+ return undefined;
53
+ }
54
+ //# sourceMappingURL=edge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge.js","sourceRoot":"","sources":["../../../src/internals/edge.ts"],"names":[],"mappings":"AAGA,IAAI,WAAW,GAAG,CAAC,CAAC;AAkCpB,MAAM,UAAU,UAAU,CACxB,QAA0B,EAC1B,IAAO,EACP,GAAmB,EACnB,SAAiB,EACjB,UAAkB;IAElB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI;YACJ,GAAG;YACH,GAAG,EAAE,WAAW,EAAE;YAClB,SAAS;YACT,UAAU;YACV,SAAS,EAAE,SAAS;SAChB,CAAC;IACT,CAAC;IAED,QAAQ,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC;IAC7B,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,OAAO,QAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAA6B,EAAE,IAAU;IACnE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;IAEjC,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,IAAI,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC;QAErC,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;YACpD,WAAW,GAAG,QAAQ,CAAC;YACvB,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC;QACnC,CAAC;QAED,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAA4B,EAC5B,GAAmD;IAEnD,IAAI,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC;IAEzB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;IAE9B,OAAO,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;YACpC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,GAAG,QAAQ,CAAC;QAChB,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;IAC5B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { DerivedSignal } from './derived.js';
2
+ import { ReactiveValue } from '../types.js';
3
+ export declare let CURRENT_CONSUMER: DerivedSignal<any, any> | undefined;
4
+ export declare function getSignal<T, Args extends unknown[]>(signal: DerivedSignal<T, Args>): ReactiveValue<T>;
5
+ export declare function checkSignal(signal: DerivedSignal<any, any>): number;
6
+ export declare function runSignal(signal: DerivedSignal<any, any[]>): void;
7
+ export declare function checkAndRunListeners(signal: DerivedSignal<any, any>, willWatch?: boolean): number;
8
+ export declare function callback<T, Args extends unknown[]>(fn: (...args: Args) => T): (...args: Args) => T;
9
+ export declare function generatorResultToPromise<T, Args extends unknown[]>(generator: Generator<any, T>, savedConsumer: DerivedSignal<any, any> | undefined): Promise<T>;
10
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/internals/get.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAA4B,MAAM,cAAc,CAAC;AAIvE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,eAAO,IAAI,gBAAgB,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;AAEjE,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAkCrG;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAiEnE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QA8F1D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,UAAQ,UAiBtF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,CAmBlG;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,EAChE,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,EAC5B,aAAa,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,GACjD,OAAO,CAAC,CAAC,CAAC,CA4CZ"}
@@ -0,0 +1,247 @@
1
+ import { scheduleListeners, scheduleTracer, scheduleUnwatch } from './scheduling.js';
2
+ import { SignalType, TRACER as TRACER, TracerEventType } from '../trace.js';
3
+ import { createEdge } from './edge.js';
4
+ import { watchSignal } from './connect.js';
5
+ import { ReactivePromise } from './async.js';
6
+ import { isGeneratorResult, isPromise, isReactivePromise } from './utils/type-utils.js';
7
+ export let CURRENT_CONSUMER;
8
+ export function getSignal(signal) {
9
+ if (CURRENT_CONSUMER !== undefined) {
10
+ const { ref, computedCount, deps } = CURRENT_CONSUMER;
11
+ const prevEdge = deps.get(signal);
12
+ const prevConsumedAt = prevEdge?.consumedAt;
13
+ if (prevConsumedAt !== computedCount) {
14
+ if (prevEdge === undefined) {
15
+ TRACER?.emit({
16
+ type: TracerEventType.Connected,
17
+ id: CURRENT_CONSUMER.tracerMeta.id,
18
+ childId: signal.tracerMeta.id,
19
+ name: signal.tracerMeta.desc,
20
+ params: signal.tracerMeta.params,
21
+ nodeType: SignalType.Reactive,
22
+ });
23
+ if (CURRENT_CONSUMER.watchCount > 0) {
24
+ watchSignal(signal);
25
+ }
26
+ }
27
+ const updatedAt = checkSignal(signal);
28
+ const newEdge = createEdge(prevEdge, 0 /* EdgeType.Signal */, signal, updatedAt, computedCount);
29
+ signal.subs.set(ref, newEdge);
30
+ deps.set(signal, newEdge);
31
+ }
32
+ }
33
+ else {
34
+ checkSignal(signal);
35
+ }
36
+ return signal.value;
37
+ }
38
+ export function checkSignal(signal) {
39
+ let { ref, _state: state } = signal;
40
+ if (state < 2 /* SignalState.Dirty */) {
41
+ return signal.updatedCount;
42
+ }
43
+ if (state === 3 /* SignalState.MaybeDirty */) {
44
+ let edge = signal.dirtyHead;
45
+ while (edge !== undefined) {
46
+ if (edge.type === 1 /* EdgeType.Promise */) {
47
+ const dep = edge.dep;
48
+ // If the dependency is pending, then we need to propagate the pending state to the
49
+ // parent signal, and we halt the computation here.
50
+ if (dep.isPending) {
51
+ const value = signal.value;
52
+ if (value instanceof ReactivePromise) {
53
+ // Propagate the pending state to the parent signal
54
+ value._setPending();
55
+ }
56
+ // Add the signal to the awaitSubs map to be notified when the promise is resolved
57
+ dep._awaitSubs.set(ref, edge);
58
+ state = 1 /* SignalState.Pending */;
59
+ signal.dirtyHead = edge;
60
+ // Early return to prevent the signal from being computed and to preserve the dirty state
61
+ return signal.updatedCount;
62
+ }
63
+ edge = edge.nextDirty;
64
+ continue;
65
+ }
66
+ const dep = edge.dep;
67
+ const updatedAt = checkSignal(dep);
68
+ dep.subs.set(ref, edge);
69
+ if (edge.updatedAt !== updatedAt) {
70
+ signal.dirtyHead = edge.nextDirty;
71
+ state = 2 /* SignalState.Dirty */;
72
+ break;
73
+ }
74
+ edge = edge.nextDirty;
75
+ }
76
+ }
77
+ if (state === 2 /* SignalState.Dirty */) {
78
+ runSignal(signal);
79
+ }
80
+ signal._state = 0 /* SignalState.Clean */;
81
+ signal.dirtyHead = undefined;
82
+ if (TRACER !== undefined && signal.tracerMeta?.tracer) {
83
+ scheduleTracer(signal.tracerMeta.tracer);
84
+ }
85
+ return signal.updatedCount;
86
+ }
87
+ export function runSignal(signal) {
88
+ TRACER?.emit({
89
+ type: TracerEventType.StartUpdate,
90
+ id: signal.tracerMeta.id,
91
+ });
92
+ const prevConsumer = CURRENT_CONSUMER;
93
+ const updatedCount = signal.updatedCount;
94
+ const computedCount = ++signal.computedCount;
95
+ try {
96
+ CURRENT_CONSUMER = signal;
97
+ const initialized = updatedCount !== 0;
98
+ const prevValue = signal.value;
99
+ let nextValue = signal.compute(...signal.args);
100
+ let valueIsPromise = false;
101
+ if (nextValue !== null && typeof nextValue === 'object') {
102
+ if (isGeneratorResult(nextValue)) {
103
+ nextValue = generatorResultToPromise(nextValue, signal);
104
+ valueIsPromise = true;
105
+ }
106
+ else if (isPromise(nextValue)) {
107
+ valueIsPromise = true;
108
+ }
109
+ }
110
+ if (valueIsPromise) {
111
+ if (TRACER !== undefined) {
112
+ TRACER.emit({
113
+ type: TracerEventType.StartLoading,
114
+ id: signal.tracerMeta.id,
115
+ });
116
+ nextValue.finally(() => {
117
+ TRACER.emit({
118
+ type: TracerEventType.EndLoading,
119
+ id: signal.tracerMeta.id,
120
+ value: signal.value,
121
+ });
122
+ });
123
+ }
124
+ TRACER?.emit({
125
+ type: TracerEventType.StartLoading,
126
+ id: signal.tracerMeta.id,
127
+ });
128
+ if (prevValue !== null && typeof prevValue === 'object' && isReactivePromise(prevValue)) {
129
+ // Update the ReactivePromise with the new promise. Since the value
130
+ // returned from the function is the same ReactivePromise instance,
131
+ // we don't need to increment the updatedCount, because the returned
132
+ // value is the same. _setPromise will update the nested values on the
133
+ // ReactivePromise instance, and consumers of those values will be notified
134
+ // of the change through that.
135
+ prevValue._setPromise(nextValue);
136
+ }
137
+ else {
138
+ // If the signal has not been computed yet, we then the initValue was assigned
139
+ // in the constructor. Otherwise, we don't know what the initial value was, so
140
+ // we don't pass it to the ReactivePromise constructor.
141
+ const initValue = !initialized ? prevValue : undefined;
142
+ signal.value = ReactivePromise.createPromise(nextValue, signal, initValue);
143
+ signal.updatedCount = updatedCount + 1;
144
+ }
145
+ }
146
+ else if (!initialized || !signal.equals(prevValue, nextValue)) {
147
+ signal.value = nextValue;
148
+ signal.updatedCount = updatedCount + 1;
149
+ }
150
+ }
151
+ finally {
152
+ CURRENT_CONSUMER = prevConsumer;
153
+ TRACER?.emit({
154
+ type: TracerEventType.EndUpdate,
155
+ id: signal.tracerMeta.id,
156
+ value: signal.value,
157
+ });
158
+ const { ref, deps } = signal;
159
+ for (const [dep, edge] of deps) {
160
+ if (edge.consumedAt !== computedCount) {
161
+ scheduleUnwatch(dep);
162
+ dep.subs.delete(ref);
163
+ deps.delete(dep);
164
+ TRACER?.emit({
165
+ type: TracerEventType.Disconnected,
166
+ id: signal.tracerMeta.id,
167
+ childId: dep.tracerMeta.id,
168
+ });
169
+ }
170
+ }
171
+ }
172
+ }
173
+ export function checkAndRunListeners(signal, willWatch = false) {
174
+ const listeners = signal.listeners;
175
+ if (willWatch && (listeners === null || listeners.current.size === 0)) {
176
+ signal.watchCount++;
177
+ signal['flags'] |= 8 /* SignalFlags.isListener */;
178
+ }
179
+ let updatedCount = checkSignal(signal);
180
+ if (listeners !== null && listeners.updatedAt !== updatedCount) {
181
+ listeners.updatedAt = updatedCount;
182
+ scheduleListeners(signal);
183
+ }
184
+ return updatedCount;
185
+ }
186
+ export function callback(fn) {
187
+ const savedConsumer = CURRENT_CONSUMER;
188
+ return (...args) => {
189
+ const prevConsumer = CURRENT_CONSUMER;
190
+ CURRENT_CONSUMER = savedConsumer;
191
+ try {
192
+ const result = fn(...args);
193
+ if (result !== null && typeof result === 'object' && isGeneratorResult(result)) {
194
+ return generatorResultToPromise(result, savedConsumer);
195
+ }
196
+ return result;
197
+ }
198
+ finally {
199
+ CURRENT_CONSUMER = prevConsumer;
200
+ }
201
+ };
202
+ }
203
+ export function generatorResultToPromise(generator, savedConsumer) {
204
+ function adopt(value) {
205
+ return typeof value === 'object' && value !== null && (isPromise(value) || isReactivePromise(value))
206
+ ? value
207
+ : Promise.resolve(value);
208
+ }
209
+ return new Promise((resolve, reject) => {
210
+ function step(result) {
211
+ if (result.done) {
212
+ resolve(result.value);
213
+ }
214
+ else {
215
+ adopt(result.value).then(fulfilled, rejected);
216
+ }
217
+ }
218
+ function fulfilled(value) {
219
+ const prevConsumer = CURRENT_CONSUMER;
220
+ try {
221
+ CURRENT_CONSUMER = savedConsumer;
222
+ step(generator.next(value));
223
+ }
224
+ catch (e) {
225
+ reject(e);
226
+ }
227
+ finally {
228
+ CURRENT_CONSUMER = prevConsumer;
229
+ }
230
+ }
231
+ function rejected(value) {
232
+ const prevConsumer = CURRENT_CONSUMER;
233
+ try {
234
+ CURRENT_CONSUMER = savedConsumer;
235
+ step(generator['throw'](value));
236
+ }
237
+ catch (e) {
238
+ reject(e);
239
+ }
240
+ finally {
241
+ CURRENT_CONSUMER = prevConsumer;
242
+ }
243
+ }
244
+ step(generator.next());
245
+ });
246
+ }
247
+ //# sourceMappingURL=get.js.map