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
package/src/trace.ts CHANGED
@@ -1,23 +1,22 @@
1
- import { scheduleTracer } from './scheduling.js';
2
- import { ComputedSignal } from './signals.js';
3
- import { Signal, Watcher } from './types.js';
1
+ import { scheduleTracer } from './internals/scheduling.js';
2
+ import { DerivedSignal, SignalId } from './internals/derived.js';
3
+ import { Signal } from './types.js';
4
4
 
5
5
  export let TRACER: TracerProxy | undefined;
6
6
 
7
- export enum VisualizerNodeType {
8
- State,
9
- Computed,
10
- AsyncComputed,
11
- Subscription,
12
- Watcher,
13
- }
14
-
15
7
  export interface VisualizerLink {
16
8
  connected: boolean;
17
9
  version: number;
18
10
  node: VisualizerNode;
19
11
  }
20
12
 
13
+ export interface TracerMeta {
14
+ id: string | number;
15
+ desc: string;
16
+ params: string;
17
+ tracer?: Tracer;
18
+ }
19
+
21
20
  export enum TracerEventType {
22
21
  StartUpdate = 'StartUpdate',
23
22
  EndUpdate = 'EndUpdate',
@@ -32,46 +31,46 @@ export enum TracerEventType {
32
31
 
33
32
  type StartUpdateEvent = {
34
33
  type: TracerEventType.StartUpdate;
35
- id: string;
34
+ id: string | number;
36
35
  };
37
36
 
38
37
  type EndUpdateEvent = {
39
38
  type: TracerEventType.EndUpdate;
40
- id: string;
39
+ id: string | number;
41
40
  value: unknown;
42
41
  preserveChildren?: boolean;
43
42
  };
44
43
 
45
44
  type StartLoadingEvent = {
46
45
  type: TracerEventType.StartLoading;
47
- id: string;
46
+ id: string | number;
48
47
  };
49
48
 
50
49
  type EndLoadingEvent = {
51
50
  type: TracerEventType.EndLoading;
52
- id: string;
51
+ id: string | number;
53
52
  value: unknown;
54
53
  };
55
54
 
56
55
  type ConnectedEvent = {
57
56
  type: TracerEventType.Connected;
58
- id: string;
59
- childId: string;
60
- nodeType: VisualizerNodeType;
57
+ id: string | number;
58
+ childId: string | number;
59
+ nodeType: SignalType;
61
60
  name?: string;
62
61
  params?: string;
63
62
  };
64
63
 
65
64
  type DisconnectedEvent = {
66
65
  type: TracerEventType.Disconnected;
67
- id: string;
68
- childId: string;
66
+ id: string | number;
67
+ childId: string | number;
69
68
  };
70
69
 
71
70
  type ConsumeStateEvent = {
72
71
  type: TracerEventType.ConsumeState;
73
- id: string;
74
- childId: string;
72
+ id: string | number;
73
+ childId: string | number;
75
74
  value: unknown;
76
75
  setValue: (value: unknown) => void;
77
76
  };
@@ -85,6 +84,12 @@ type TracerEvent =
85
84
  | DisconnectedEvent
86
85
  | ConsumeStateEvent;
87
86
 
87
+ export enum SignalType {
88
+ State = 'state',
89
+ Reactive = 'reactive',
90
+ Watcher = 'watcher',
91
+ }
92
+
88
93
  export class VisualizerNode {
89
94
  private subscribers: (() => void)[] = [];
90
95
 
@@ -102,8 +107,8 @@ export class VisualizerNode {
102
107
  constructor(
103
108
  private tracer: Tracer,
104
109
  public depth: number,
105
- public type: VisualizerNodeType,
106
- public id: string,
110
+ public type: SignalType,
111
+ public id: string | number,
107
112
  public value: unknown,
108
113
  public name?: string,
109
114
  public params?: string,
@@ -125,7 +130,7 @@ export class VisualizerNode {
125
130
  }
126
131
 
127
132
  setValue(value: unknown) {
128
- if (this.type !== VisualizerNodeType.State) {
133
+ if (this.type !== SignalType.State) {
129
134
  throw new Error('setValue is only allowed on state nodes');
130
135
  }
131
136
 
@@ -168,7 +173,7 @@ export class VisualizerNode {
168
173
  return shouldSkip;
169
174
  }
170
175
 
171
- disconnectChild(childId: string) {
176
+ disconnectChild(childId: string | number) {
172
177
  const childLink = this.children.find(link => link.node.id === childId);
173
178
 
174
179
  if (!childLink) {
@@ -208,7 +213,7 @@ export class VisualizerNode {
208
213
  this.notify();
209
214
  }
210
215
 
211
- consumeState(id: string, value: unknown, setValue: (value: unknown) => void) {
216
+ consumeState(id: string | number, value: unknown, setValue: (value: unknown) => void) {
212
217
  const existing = this.stateChildren.find(child => child.id === id);
213
218
 
214
219
  if (existing) {
@@ -219,7 +224,7 @@ export class VisualizerNode {
219
224
  const node = new VisualizerNode(
220
225
  this.tracer,
221
226
  this.depth + 1,
222
- VisualizerNodeType.State,
227
+ SignalType.State,
223
228
  id,
224
229
  value,
225
230
  undefined,
@@ -281,7 +286,7 @@ class TraceFlush {
281
286
  }
282
287
 
283
288
  export class Tracer {
284
- private nodeMap = new Map<string, VisualizerNode>();
289
+ private nodeMap = new Map<string | number, VisualizerNode>();
285
290
 
286
291
  delay = 200;
287
292
  maxDepth = 0;
@@ -289,7 +294,7 @@ export class Tracer {
289
294
  private initialized = false;
290
295
 
291
296
  constructor(
292
- id: string,
297
+ id: string | number,
293
298
  immediate = false,
294
299
  public showParams = true,
295
300
  public showValue = true,
@@ -298,7 +303,7 @@ export class Tracer {
298
303
  // If it's immediate, we should run the first flush immediately, skipping animations
299
304
  this.initialized = !immediate;
300
305
 
301
- const node = new VisualizerNode(this, 0, VisualizerNodeType.Watcher, id, '');
306
+ const node = new VisualizerNode(this, 0, SignalType.Watcher, id, '');
302
307
 
303
308
  this.rootNode = node;
304
309
  this.nodeMap.set(id, node);
@@ -313,14 +318,14 @@ export class Tracer {
313
318
  if (event.type === TracerEventType.Connected || event.type === TracerEventType.ConsumeState) {
314
319
  const node = this.nodeMap.get(event.id);
315
320
 
316
- if (!node) {
321
+ if (!node || (event.type === TracerEventType.Connected && !event.name)) {
317
322
  return;
318
323
  }
319
324
 
320
325
  if (!this.nodeMap.has(event.childId)) {
321
326
  const name = event.type === TracerEventType.Connected ? event.name : undefined;
322
327
  const params = event.type === TracerEventType.Connected ? event.params : undefined;
323
- const nodeType = event.type === TracerEventType.Connected ? event.nodeType : VisualizerNodeType.State;
328
+ const nodeType = event.type === TracerEventType.Connected ? event.nodeType : SignalType.State;
324
329
 
325
330
  this.nodeMap.set(
326
331
  event.childId,
@@ -402,7 +407,7 @@ class TracerProxy {
402
407
  this.tracers.forEach(tracer => tracer.emit(event));
403
408
  }
404
409
 
405
- createTracer(id: string, immediate = false): Tracer {
410
+ createTracer(id: string | number, immediate = false): Tracer {
406
411
  const tracer = new Tracer(id, immediate);
407
412
 
408
413
  this.tracers.push(tracer);
@@ -427,12 +432,12 @@ export function setTracing(enabled: boolean) {
427
432
  }
428
433
  }
429
434
 
430
- export function createTracer(_signal: Signal<unknown> | Watcher<unknown>, immediate = false) {
431
- const signal = _signal as ComputedSignal<unknown>;
432
- return createTracerFromId(signal._opts.id, immediate);
435
+ export function createTracer(_signal: Signal<unknown>, immediate = false) {
436
+ const signal = _signal as unknown as DerivedSignal<unknown, unknown[]>;
437
+ return createTracerFromId(signal.tracerMeta!.id, immediate);
433
438
  }
434
439
 
435
- export function createTracerFromId(id: string, immediate = false) {
440
+ export function createTracerFromId(id: string | number, immediate = false) {
436
441
  if (!TRACER) {
437
442
  throw new Error('Tracing is not enabled');
438
443
  }
@@ -0,0 +1,113 @@
1
+ import type { NodePath, PluginObj, types as t } from '@babel/core';
2
+
3
+ export interface SignaliumAsyncTransformOptions {
4
+ transformedImports: [string, string | RegExp][];
5
+ }
6
+
7
+ export function signaliumAsyncTransform(opts?: SignaliumAsyncTransformOptions): (api: any) => PluginObj {
8
+ const transformedImports: Record<string, [string | RegExp]> = {
9
+ callback: ['signalium'],
10
+ reactive: ['signalium'],
11
+ subscription: ['signalium'],
12
+ task: ['signalium'],
13
+ };
14
+
15
+ for (const [name, path] of opts?.transformedImports ?? []) {
16
+ const existing = transformedImports[name];
17
+
18
+ if (existing) {
19
+ existing.push(path);
20
+ } else {
21
+ transformedImports[name] = [path];
22
+ }
23
+ }
24
+
25
+ return api => {
26
+ const t = api.types;
27
+
28
+ const isReactiveCall = (path: any) => {
29
+ if (!t.isCallExpression(path.node)) return false;
30
+ const callee = path.node.callee;
31
+
32
+ const importPath = transformedImports[callee.name];
33
+
34
+ if (!importPath) return false;
35
+
36
+ // Check if reactive is imported from signalium
37
+ const binding = path.scope.getBinding(callee.name);
38
+ if (!binding || !t.isImportSpecifier(binding.path.node)) return false;
39
+
40
+ const importDecl = binding.path.parent;
41
+
42
+ if (!t.isImportDeclaration(importDecl)) return false;
43
+
44
+ return importPath.some(p =>
45
+ typeof p === 'string' ? importDecl.source.value === p : p.test(importDecl.source.value),
46
+ );
47
+ };
48
+
49
+ function convertReactiveToGenerator(path: NodePath<t.FunctionExpression | t.ArrowFunctionExpression>) {
50
+ // Only transform if parent is a reactive() call
51
+ const parentPath = path.parentPath;
52
+ if (!isReactiveCall(parentPath)) return;
53
+ if (!path.node.async) return;
54
+
55
+ // Transform all await expressions to yields
56
+ path.traverse({
57
+ AwaitExpression(awaitPath) {
58
+ const funcParent = awaitPath.getFunctionParent();
59
+ if (funcParent?.node !== path.node) return;
60
+
61
+ awaitPath.replaceWith(t.yieldExpression(awaitPath.node.argument));
62
+ },
63
+ });
64
+
65
+ // Remove async keyword
66
+ path.node.async = false;
67
+
68
+ if (t.isArrowFunctionExpression(path.node)) {
69
+ // Convert arrow function to regular function expression
70
+ let hasThis = false;
71
+
72
+ // Scan for this keywords
73
+ path.traverse({
74
+ ThisExpression() {
75
+ hasThis = true;
76
+ },
77
+ });
78
+
79
+ const functionBody = t.isBlockStatement(path.node.body)
80
+ ? path.node.body
81
+ : t.blockStatement([t.returnStatement(path.node.body)]);
82
+
83
+ const newFunction = t.functionExpression(
84
+ null,
85
+ path.node.params,
86
+ functionBody,
87
+ true, // generator
88
+ false, // async
89
+ );
90
+
91
+ // If we found 'this' usage, wrap in bind call
92
+ if (hasThis) {
93
+ path.replaceWith(
94
+ t.callExpression(t.memberExpression(newFunction, t.identifier('bind')), [t.thisExpression()]),
95
+ );
96
+ } else {
97
+ path.replaceWith(newFunction);
98
+ }
99
+ } else {
100
+ // Regular function - just set generator flag
101
+ path.node.generator = true;
102
+ }
103
+ }
104
+
105
+ return {
106
+ name: 'transform-reactive-async',
107
+ visitor: {
108
+ FunctionExpression: convertReactiveToGenerator,
109
+ ArrowFunctionExpression: convertReactiveToGenerator,
110
+ },
111
+ };
112
+ };
113
+ }
package/src/types.ts CHANGED
@@ -1,91 +1,101 @@
1
- import type { SignalScope } from './hooks.js';
1
+ import { SignalScope } from './internals/contexts.js';
2
2
 
3
3
  export interface Signal<T = unknown> {
4
4
  get(): T;
5
+ addListener(listener: SignalListener): () => void;
5
6
  }
6
7
 
7
8
  export interface WriteableSignal<T> extends Signal<T> {
8
9
  set(value: T): void;
9
10
  }
10
11
 
11
- export type AsyncSignal<T> = Signal<AsyncResult<T>>;
12
-
13
- export type SignalCompute<T> = (prev: T | undefined) => T;
14
-
15
- export type SignalAsyncCompute<T> = (prev: T | undefined) => T | Promise<T>;
16
-
17
12
  export type SignalEquals<T> = (prev: T, next: T) => boolean;
18
13
 
14
+ export type SignalListener = () => void;
15
+
19
16
  export type SignalSubscription = {
20
17
  update?(): void;
21
18
  unsubscribe?(): void;
22
19
  };
23
20
 
24
21
  export interface SubscriptionState<T> {
25
- get: () => T;
26
- set: (value: T) => void;
22
+ get: () => T | undefined;
23
+ set: (value: T | Promise<T>) => void;
24
+ setError: (error: unknown) => void;
27
25
  }
28
26
 
29
- export type SignalSubscribe<T, Args extends unknown[]> = (
27
+ export type SignalSubscribe<T> = (
30
28
  state: SubscriptionState<T>,
31
- ...args: Args
32
29
  ) => SignalSubscription | (() => unknown) | undefined | void;
33
30
 
34
31
  export interface SignalOptions<T, Args extends unknown[]> {
35
32
  equals?: SignalEquals<T> | false;
36
33
  id?: string;
37
34
  desc?: string;
38
- params?: string;
39
35
  scope?: SignalScope;
40
36
  paramKey?: (...args: Args) => string;
41
37
  }
42
38
 
43
39
  export interface SignalOptionsWithInit<T, Args extends unknown[]> extends SignalOptions<T, Args> {
44
- initValue: T;
45
- }
46
-
47
- export interface AsyncBaseResult<T> {
48
- invalidate(): void;
49
- await(): T;
40
+ initValue: T extends Promise<infer U> ? U : T extends Generator<any, infer U, any> ? U : T;
50
41
  }
51
42
 
52
- export interface AsyncPending<T> extends AsyncBaseResult<T> {
53
- result: undefined;
54
- error: unknown;
55
- isPending: boolean;
56
- isReady: false;
57
- isError: boolean;
58
- isSuccess: boolean;
59
- didResolve: boolean;
43
+ export interface Thenable<T> {
44
+ then(onfulfilled?: (value: T) => void, onrejected?: (reason: unknown) => void): void;
45
+ finally: any;
46
+ catch: any;
47
+ [Symbol.toStringTag]: string;
60
48
  }
61
49
 
62
- export interface AsyncReady<T> extends AsyncBaseResult<T> {
63
- result: T;
50
+ export interface BaseReactivePromise<T> extends Promise<T> {
51
+ value: T | undefined;
64
52
  error: unknown;
65
- isPending: boolean;
66
- isReady: true;
67
- isError: boolean;
68
- isSuccess: boolean;
69
- didResolve: boolean;
70
- }
71
-
72
- export type AsyncResult<T> = AsyncPending<T> | AsyncReady<T>;
73
53
 
74
- export interface AsyncTask<T, RunArgs extends unknown[] = unknown[]> {
75
- result: T | undefined;
76
- error: unknown;
77
54
  isPending: boolean;
78
- isSuccess: boolean;
79
- isError: boolean;
55
+ isRejected: boolean;
56
+ isResolved: boolean;
57
+ isSettled: boolean;
80
58
  isReady: boolean;
81
59
 
82
- run(...args: RunArgs): Promise<T>;
60
+ rerun(): void;
83
61
  }
84
62
 
85
- export interface WatcherListenerOptions {
86
- immediate?: boolean;
63
+ export interface PendingReactivePromise<T> extends BaseReactivePromise<T> {
64
+ value: undefined;
65
+ isReady: false;
87
66
  }
88
67
 
89
- export interface Watcher<T> {
90
- addListener(listener: (value: T) => void, opts?: WatcherListenerOptions): () => void;
68
+ export interface ReadyReactivePromise<T> extends BaseReactivePromise<T> {
69
+ value: T;
70
+ isReady: true;
91
71
  }
72
+
73
+ export type ReactivePromise<T> = PendingReactivePromise<T> | ReadyReactivePromise<T>;
74
+
75
+ export type ReactiveTask<T, Args extends unknown[]> = Omit<ReactivePromise<T>, 'notify'> & {
76
+ run(...args: Args): ReactivePromise<T>;
77
+ };
78
+
79
+ export type ReactiveSubscription<T> = Omit<ReactivePromise<T>, 'rerun'>;
80
+
81
+ export type ReactiveValue<T> =
82
+ // We have to first check if T is a ReactiveTask, because it will also match Promise<T>
83
+ T extends ReactiveTask<infer U, infer Args>
84
+ ? ReactiveTask<U, Args>
85
+ : T extends Promise<infer U>
86
+ ? ReactivePromise<U>
87
+ : T extends Generator<any, infer U>
88
+ ? ReactivePromise<U>
89
+ : T;
90
+
91
+ // This type is used when initial values are provided to async functions and
92
+ // subscriptions. It allows us to skip checking `isReady` when there is always
93
+ // a guaranteed value to return.
94
+ export type ReadyReactiveValue<T> =
95
+ T extends ReactiveTask<infer U, infer Args>
96
+ ? ReactiveTask<U, Args>
97
+ : T extends Promise<infer U>
98
+ ? ReadyReactivePromise<U>
99
+ : T extends Generator<any, infer U>
100
+ ? ReadyReactivePromise<U>
101
+ : T;
package/transform.js ADDED
@@ -0,0 +1,19 @@
1
+ // This file is for backwards compatibility with non-module build systems
2
+ //
3
+ // TODO: Generate this automatically on build/publish
4
+
5
+ 'use strict';
6
+ Object.defineProperty(exports, '__esModule', {
7
+ value: true,
8
+ });
9
+ var _index = require('./dist/cjs/transform.js');
10
+ Object.keys(_index).forEach(function (key) {
11
+ if (key === 'default' || key === '__esModule') return;
12
+ if (key in exports && exports[key] === _index[key]) return;
13
+ Object.defineProperty(exports, key, {
14
+ enumerable: true,
15
+ get: function () {
16
+ return _index[key];
17
+ },
18
+ });
19
+ });
@@ -2,9 +2,32 @@
2
2
 
3
3
  import { defineWorkspace } from 'vitest/config';
4
4
  import react from '@vitejs/plugin-react';
5
+ import babel from 'vite-plugin-babel';
6
+ import { signaliumAsyncTransform } from './src/transform.js';
5
7
 
6
8
  export default defineWorkspace([
7
9
  {
10
+ plugins: [
11
+ (babel as any)({
12
+ filter: /\.(j|t)sx?$/,
13
+ babelConfig: {
14
+ babelrc: false,
15
+ configFile: false,
16
+ sourceMaps: true,
17
+ plugins: [
18
+ signaliumAsyncTransform({
19
+ transformedImports: [
20
+ ['reactive', /instrumented-hooks.js$/],
21
+ ['task', /instrumented-hooks.js$/],
22
+ ],
23
+ }),
24
+ ],
25
+ parserOpts: {
26
+ plugins: ['typescript'],
27
+ },
28
+ },
29
+ }),
30
+ ],
8
31
  test: {
9
32
  include: ['src/__tests__/**/*.test.ts'],
10
33
  name: 'unit',
@@ -12,9 +35,22 @@ export default defineWorkspace([
12
35
  },
13
36
  },
14
37
  {
15
- plugins: [react()],
38
+ plugins: [
39
+ react({
40
+ babel: {
41
+ plugins: [
42
+ signaliumAsyncTransform({
43
+ transformedImports: [
44
+ ['reactive', /instrumented-hooks.js$/],
45
+ ['task', /instrumented-hooks.js$/],
46
+ ],
47
+ }),
48
+ ],
49
+ },
50
+ }),
51
+ ],
16
52
  test: {
17
- include: ['src/**/*.test.ts'],
53
+ include: ['src/react/__tests__/**/*.test.ts(x)'],
18
54
  browser: {
19
55
  enabled: true,
20
56
  provider: 'playwright',
@@ -1,11 +0,0 @@
1
- import { ComputedSignal } from './signals.js';
2
- import { Tracer } from './trace.js';
3
- export declare const scheduleWatcher: (watcher: ComputedSignal<any>) => void;
4
- export declare const scheduleDirty: (signal: ComputedSignal<any>) => void;
5
- export declare const schedulePull: (signal: ComputedSignal<any>) => void;
6
- export declare const scheduleConnect: (connect: ComputedSignal<any>) => void;
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>;
11
- //# sourceMappingURL=scheduling.d.ts.map
@@ -1 +0,0 @@
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,108 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.settled = exports.scheduleTracer = exports.scheduleEffect = exports.scheduleDisconnect = exports.scheduleConnect = exports.schedulePull = exports.scheduleDirty = exports.scheduleWatcher = void 0;
4
- const config_js_1 = require("./config.js");
5
- let PENDING_DIRTIES = [];
6
- let PENDING_PULLS = [];
7
- let PENDING_WATCHERS = [];
8
- let PENDING_CONNECTS = new Map();
9
- let PENDING_DISCONNECTS = new Map();
10
- let PENDING_EFFECTS = [];
11
- let PENDING_TRACERS = [];
12
- const microtask = () => Promise.resolve();
13
- let currentFlush = null;
14
- const scheduleFlush = (fn) => {
15
- if (currentFlush)
16
- return;
17
- let resolve;
18
- const promise = new Promise(r => (resolve = r));
19
- currentFlush = { promise, resolve: resolve };
20
- (0, config_js_1.scheduleFlush)(flushWatchers);
21
- };
22
- const scheduleWatcher = (watcher) => {
23
- PENDING_WATCHERS.push(watcher);
24
- scheduleFlush(flushWatchers);
25
- };
26
- exports.scheduleWatcher = scheduleWatcher;
27
- const scheduleDirty = (signal) => {
28
- PENDING_DIRTIES.push(signal);
29
- scheduleFlush(flushWatchers);
30
- };
31
- exports.scheduleDirty = scheduleDirty;
32
- const schedulePull = (signal) => {
33
- PENDING_PULLS.push(signal);
34
- scheduleFlush(flushWatchers);
35
- };
36
- exports.schedulePull = schedulePull;
37
- const scheduleConnect = (connect) => {
38
- const current = PENDING_CONNECTS.get(connect) ?? 0;
39
- PENDING_CONNECTS.set(connect, current + 1);
40
- scheduleFlush(flushWatchers);
41
- };
42
- exports.scheduleConnect = scheduleConnect;
43
- const scheduleDisconnect = (disconnect) => {
44
- const current = PENDING_DISCONNECTS.get(disconnect) ?? 0;
45
- PENDING_DISCONNECTS.set(disconnect, current + 1);
46
- scheduleFlush(flushWatchers);
47
- };
48
- exports.scheduleDisconnect = scheduleDisconnect;
49
- const scheduleEffect = (signal) => {
50
- PENDING_EFFECTS.push(signal);
51
- scheduleFlush(flushWatchers);
52
- };
53
- exports.scheduleEffect = scheduleEffect;
54
- const scheduleTracer = (tracer) => {
55
- PENDING_TRACERS.push(tracer);
56
- scheduleFlush(flushWatchers);
57
- };
58
- exports.scheduleTracer = scheduleTracer;
59
- const flushWatchers = async () => {
60
- const flush = currentFlush;
61
- // Flush all the dirty signals and pulls recursively, clearing
62
- // the microtask queue until they are all settled
63
- while (PENDING_DIRTIES.length > 0 || PENDING_PULLS.length > 0) {
64
- for (const dirty of PENDING_DIRTIES) {
65
- dirty._dirtyConsumers();
66
- }
67
- for (const pull of PENDING_PULLS) {
68
- pull._check();
69
- }
70
- PENDING_DIRTIES = [];
71
- PENDING_PULLS = [];
72
- await microtask();
73
- }
74
- // Clear the flush so that if any more watchers are scheduled,
75
- // they will be flushed in the next tick
76
- currentFlush = null;
77
- (0, config_js_1.runBatch)(() => {
78
- for (const watcher of PENDING_WATCHERS) {
79
- watcher._check();
80
- }
81
- for (const [signal, count] of PENDING_CONNECTS) {
82
- signal._check(true, count);
83
- }
84
- for (const [signal, count] of PENDING_DISCONNECTS) {
85
- signal._disconnect(count);
86
- }
87
- for (const signal of PENDING_EFFECTS) {
88
- signal._runEffects();
89
- }
90
- for (const tracer of PENDING_TRACERS) {
91
- tracer.flush();
92
- }
93
- PENDING_WATCHERS = [];
94
- PENDING_CONNECTS.clear();
95
- PENDING_DISCONNECTS.clear();
96
- PENDING_EFFECTS = [];
97
- PENDING_TRACERS = [];
98
- });
99
- // resolve the flush promise
100
- flush.resolve();
101
- };
102
- const settled = async () => {
103
- while (currentFlush) {
104
- await currentFlush.promise;
105
- }
106
- };
107
- exports.settled = settled;
108
- //# sourceMappingURL=scheduling.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scheduling.js","sourceRoot":"","sources":["../../src/scheduling.ts"],"names":[],"mappings":"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"}