signalium 1.2.1 → 2.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 (388) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/{build/transform.js → config.js} +1 -5
  3. package/{build/react.js → debug.js} +1 -5
  4. package/dist/cjs/config.d.ts +1 -21
  5. package/dist/cjs/config.d.ts.map +1 -1
  6. package/dist/cjs/config.js +3 -36
  7. package/dist/cjs/config.js.map +1 -1
  8. package/dist/cjs/debug.d.ts +1 -1
  9. package/dist/cjs/debug.d.ts.map +1 -1
  10. package/dist/cjs/debug.js +1 -1
  11. package/dist/cjs/debug.js.map +1 -1
  12. package/dist/cjs/index.d.ts +5 -6
  13. package/dist/cjs/index.d.ts.map +1 -1
  14. package/dist/cjs/index.js +17 -22
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/internals/async.d.ts +24 -19
  17. package/dist/cjs/internals/async.d.ts.map +1 -1
  18. package/dist/cjs/internals/async.js +264 -137
  19. package/dist/cjs/internals/async.js.map +1 -1
  20. package/dist/cjs/internals/callback.d.ts +13 -0
  21. package/dist/cjs/internals/callback.d.ts.map +1 -0
  22. package/dist/cjs/internals/callback.js +73 -0
  23. package/dist/cjs/internals/callback.js.map +1 -0
  24. package/dist/cjs/internals/config.d.ts +7 -0
  25. package/dist/cjs/internals/config.d.ts.map +1 -0
  26. package/dist/cjs/internals/config.js +17 -0
  27. package/dist/cjs/internals/config.js.map +1 -0
  28. package/dist/cjs/internals/consumer.d.ts +3 -3
  29. package/dist/cjs/internals/consumer.d.ts.map +1 -1
  30. package/dist/cjs/internals/consumer.js.map +1 -1
  31. package/dist/cjs/internals/contexts.d.ts +16 -15
  32. package/dist/cjs/internals/contexts.d.ts.map +1 -1
  33. package/dist/cjs/internals/contexts.js +58 -56
  34. package/dist/cjs/internals/contexts.js.map +1 -1
  35. package/dist/cjs/internals/core-api.d.ts +15 -0
  36. package/dist/cjs/internals/core-api.d.ts.map +1 -0
  37. package/dist/cjs/internals/core-api.js +83 -0
  38. package/dist/cjs/internals/core-api.js.map +1 -0
  39. package/dist/cjs/internals/dirty.d.ts +3 -3
  40. package/dist/cjs/internals/dirty.d.ts.map +1 -1
  41. package/dist/cjs/internals/dirty.js +13 -13
  42. package/dist/cjs/internals/dirty.js.map +1 -1
  43. package/dist/cjs/internals/edge.d.ts +5 -5
  44. package/dist/cjs/internals/edge.d.ts.map +1 -1
  45. package/dist/cjs/internals/edge.js.map +1 -1
  46. package/dist/cjs/internals/generators.d.ts +5 -0
  47. package/dist/cjs/internals/generators.d.ts.map +1 -0
  48. package/dist/cjs/internals/generators.js +83 -0
  49. package/dist/cjs/internals/generators.js.map +1 -0
  50. package/dist/cjs/internals/get.d.ts +5 -8
  51. package/dist/cjs/internals/get.d.ts.map +1 -1
  52. package/dist/cjs/internals/get.js +48 -107
  53. package/dist/cjs/internals/get.js.map +1 -1
  54. package/dist/cjs/internals/reactive.d.ts +77 -0
  55. package/dist/cjs/internals/reactive.d.ts.map +1 -0
  56. package/dist/cjs/internals/{derived.js → reactive.js} +45 -33
  57. package/dist/cjs/internals/reactive.js.map +1 -0
  58. package/dist/cjs/internals/scheduling.d.ts +7 -7
  59. package/dist/cjs/internals/scheduling.d.ts.map +1 -1
  60. package/dist/cjs/internals/scheduling.js +9 -9
  61. package/dist/cjs/internals/scheduling.js.map +1 -1
  62. package/dist/cjs/internals/signal.d.ts +20 -0
  63. package/dist/cjs/internals/signal.d.ts.map +1 -0
  64. package/dist/cjs/internals/{state.js → signal.js} +31 -27
  65. package/dist/cjs/internals/signal.js.map +1 -0
  66. package/dist/{esm → cjs/internals}/trace.d.ts +1 -1
  67. package/dist/cjs/internals/trace.d.ts.map +1 -0
  68. package/dist/cjs/{trace.js → internals/trace.js} +1 -1
  69. package/dist/cjs/internals/trace.js.map +1 -0
  70. package/dist/cjs/internals/utils/equals.d.ts +4 -4
  71. package/dist/cjs/internals/utils/equals.d.ts.map +1 -1
  72. package/dist/cjs/internals/utils/equals.js.map +1 -1
  73. package/dist/cjs/internals/utils/type-utils.d.ts +0 -2
  74. package/dist/cjs/internals/utils/type-utils.d.ts.map +1 -1
  75. package/dist/cjs/internals/utils/type-utils.js +0 -5
  76. package/dist/cjs/internals/utils/type-utils.js.map +1 -1
  77. package/dist/cjs/internals/watch.d.ts +4 -0
  78. package/dist/cjs/internals/watch.d.ts.map +1 -0
  79. package/dist/cjs/internals/{connect.js → watch.js} +7 -7
  80. package/dist/cjs/internals/watch.js.map +1 -0
  81. package/dist/cjs/internals/weakref.d.ts.map +1 -0
  82. package/dist/cjs/internals/weakref.js.map +1 -0
  83. package/dist/cjs/react/component.d.ts +2 -0
  84. package/dist/cjs/react/component.d.ts.map +1 -0
  85. package/dist/cjs/react/component.js +40 -0
  86. package/dist/cjs/react/component.js.map +1 -0
  87. package/dist/cjs/react/context.d.ts +2 -1
  88. package/dist/cjs/react/context.d.ts.map +1 -1
  89. package/dist/cjs/react/context.js +10 -5
  90. package/dist/cjs/react/context.js.map +1 -1
  91. package/dist/cjs/react/index.d.ts +4 -4
  92. package/dist/cjs/react/index.d.ts.map +1 -1
  93. package/dist/cjs/react/index.js +11 -8
  94. package/dist/cjs/react/index.js.map +1 -1
  95. package/dist/cjs/react/provider.d.ts.map +1 -1
  96. package/dist/cjs/react/provider.js +1 -1
  97. package/dist/cjs/react/provider.js.map +1 -1
  98. package/dist/cjs/react/rendering.d.ts +0 -6
  99. package/dist/cjs/react/rendering.d.ts.map +1 -1
  100. package/dist/cjs/react/rendering.js +1 -19
  101. package/dist/cjs/react/rendering.js.map +1 -1
  102. package/dist/cjs/react/use-reactive.d.ts +7 -0
  103. package/dist/cjs/react/use-reactive.d.ts.map +1 -0
  104. package/dist/cjs/react/use-reactive.js +67 -0
  105. package/dist/cjs/react/use-reactive.js.map +1 -0
  106. package/dist/cjs/react/use-signal.d.ts +3 -0
  107. package/dist/cjs/react/use-signal.d.ts.map +1 -0
  108. package/dist/cjs/react/{state.js → use-signal.js} +5 -5
  109. package/dist/cjs/react/use-signal.js.map +1 -0
  110. package/dist/cjs/{transform.d.ts → transform/async.d.ts} +1 -1
  111. package/dist/cjs/transform/async.d.ts.map +1 -0
  112. package/dist/cjs/{transform.js → transform/async.js} +22 -9
  113. package/dist/cjs/transform/async.js.map +1 -0
  114. package/dist/cjs/transform/callback.d.ts +6 -0
  115. package/dist/cjs/transform/callback.d.ts.map +1 -0
  116. package/dist/cjs/transform/callback.js +259 -0
  117. package/dist/cjs/transform/callback.js.map +1 -0
  118. package/dist/cjs/transform/index.d.ts +5 -0
  119. package/dist/cjs/transform/index.d.ts.map +1 -0
  120. package/dist/cjs/transform/index.js +12 -0
  121. package/dist/cjs/transform/index.js.map +1 -0
  122. package/dist/cjs/transform/preset.d.ts +7 -0
  123. package/dist/cjs/transform/preset.d.ts.map +1 -0
  124. package/dist/cjs/transform/preset.js +20 -0
  125. package/dist/cjs/transform/preset.js.map +1 -0
  126. package/dist/cjs/transform/promise.d.ts +6 -0
  127. package/dist/cjs/transform/promise.d.ts.map +1 -0
  128. package/dist/cjs/transform/promise.js +129 -0
  129. package/dist/cjs/transform/promise.js.map +1 -0
  130. package/dist/cjs/types.d.ts +44 -63
  131. package/dist/cjs/types.d.ts.map +1 -1
  132. package/dist/cjs/utils.d.ts +2 -0
  133. package/dist/cjs/utils.d.ts.map +1 -0
  134. package/dist/cjs/utils.js +7 -0
  135. package/dist/cjs/utils.js.map +1 -0
  136. package/dist/esm/config.d.ts +1 -21
  137. package/dist/esm/config.d.ts.map +1 -1
  138. package/dist/esm/config.js +1 -29
  139. package/dist/esm/config.js.map +1 -1
  140. package/dist/esm/debug.d.ts +1 -1
  141. package/dist/esm/debug.d.ts.map +1 -1
  142. package/dist/esm/debug.js +1 -1
  143. package/dist/esm/debug.js.map +1 -1
  144. package/dist/esm/index.d.ts +5 -6
  145. package/dist/esm/index.d.ts.map +1 -1
  146. package/dist/esm/index.js +5 -6
  147. package/dist/esm/index.js.map +1 -1
  148. package/dist/esm/internals/async.d.ts +24 -19
  149. package/dist/esm/internals/async.d.ts.map +1 -1
  150. package/dist/esm/internals/async.js +253 -128
  151. package/dist/esm/internals/async.js.map +1 -1
  152. package/dist/esm/internals/callback.d.ts +13 -0
  153. package/dist/esm/internals/callback.d.ts.map +1 -0
  154. package/dist/esm/internals/callback.js +67 -0
  155. package/dist/esm/internals/callback.js.map +1 -0
  156. package/dist/esm/internals/config.d.ts +7 -0
  157. package/dist/esm/internals/config.d.ts.map +1 -0
  158. package/dist/esm/internals/config.js +11 -0
  159. package/dist/esm/internals/config.js.map +1 -0
  160. package/dist/esm/internals/consumer.d.ts +3 -3
  161. package/dist/esm/internals/consumer.d.ts.map +1 -1
  162. package/dist/esm/internals/consumer.js.map +1 -1
  163. package/dist/esm/internals/contexts.d.ts +16 -15
  164. package/dist/esm/internals/contexts.d.ts.map +1 -1
  165. package/dist/esm/internals/contexts.js +52 -50
  166. package/dist/esm/internals/contexts.js.map +1 -1
  167. package/dist/esm/internals/core-api.d.ts +15 -0
  168. package/dist/esm/internals/core-api.d.ts.map +1 -0
  169. package/dist/esm/internals/core-api.js +74 -0
  170. package/dist/esm/internals/core-api.js.map +1 -0
  171. package/dist/esm/internals/dirty.d.ts +3 -3
  172. package/dist/esm/internals/dirty.d.ts.map +1 -1
  173. package/dist/esm/internals/dirty.js +12 -12
  174. package/dist/esm/internals/dirty.js.map +1 -1
  175. package/dist/esm/internals/edge.d.ts +5 -5
  176. package/dist/esm/internals/edge.d.ts.map +1 -1
  177. package/dist/esm/internals/edge.js.map +1 -1
  178. package/dist/esm/internals/generators.d.ts +5 -0
  179. package/dist/esm/internals/generators.d.ts.map +1 -0
  180. package/dist/esm/internals/generators.js +79 -0
  181. package/dist/esm/internals/generators.js.map +1 -0
  182. package/dist/esm/internals/get.d.ts +5 -8
  183. package/dist/esm/internals/get.d.ts.map +1 -1
  184. package/dist/esm/internals/get.js +43 -100
  185. package/dist/esm/internals/get.js.map +1 -1
  186. package/dist/esm/internals/reactive.d.ts +77 -0
  187. package/dist/esm/internals/reactive.d.ts.map +1 -0
  188. package/dist/esm/internals/{derived.js → reactive.js} +41 -29
  189. package/dist/esm/internals/reactive.js.map +1 -0
  190. package/dist/esm/internals/scheduling.d.ts +7 -7
  191. package/dist/esm/internals/scheduling.d.ts.map +1 -1
  192. package/dist/esm/internals/scheduling.js +6 -6
  193. package/dist/esm/internals/scheduling.js.map +1 -1
  194. package/dist/esm/internals/signal.d.ts +20 -0
  195. package/dist/esm/internals/signal.d.ts.map +1 -0
  196. package/dist/esm/internals/{state.js → signal.js} +25 -22
  197. package/dist/esm/internals/signal.js.map +1 -0
  198. package/dist/{cjs → esm/internals}/trace.d.ts +1 -1
  199. package/dist/esm/internals/trace.d.ts.map +1 -0
  200. package/dist/esm/{trace.js → internals/trace.js} +1 -1
  201. package/dist/esm/internals/trace.js.map +1 -0
  202. package/dist/esm/internals/utils/equals.d.ts +4 -4
  203. package/dist/esm/internals/utils/equals.d.ts.map +1 -1
  204. package/dist/esm/internals/utils/equals.js.map +1 -1
  205. package/dist/esm/internals/utils/type-utils.d.ts +0 -2
  206. package/dist/esm/internals/utils/type-utils.d.ts.map +1 -1
  207. package/dist/esm/internals/utils/type-utils.js +0 -4
  208. package/dist/esm/internals/utils/type-utils.js.map +1 -1
  209. package/dist/esm/internals/watch.d.ts +4 -0
  210. package/dist/esm/internals/watch.d.ts.map +1 -0
  211. package/dist/esm/internals/{connect.js → watch.js} +7 -7
  212. package/dist/esm/internals/watch.js.map +1 -0
  213. package/dist/esm/internals/weakref.d.ts.map +1 -0
  214. package/dist/esm/internals/weakref.js.map +1 -0
  215. package/dist/esm/react/component.d.ts +2 -0
  216. package/dist/esm/react/component.d.ts.map +1 -0
  217. package/dist/esm/react/component.js +37 -0
  218. package/dist/esm/react/component.js.map +1 -0
  219. package/dist/esm/react/context.d.ts +2 -1
  220. package/dist/esm/react/context.d.ts.map +1 -1
  221. package/dist/esm/react/context.js +10 -6
  222. package/dist/esm/react/context.js.map +1 -1
  223. package/dist/esm/react/index.d.ts +4 -4
  224. package/dist/esm/react/index.d.ts.map +1 -1
  225. package/dist/esm/react/index.js +4 -4
  226. package/dist/esm/react/index.js.map +1 -1
  227. package/dist/esm/react/provider.d.ts.map +1 -1
  228. package/dist/esm/react/provider.js +2 -2
  229. package/dist/esm/react/provider.js.map +1 -1
  230. package/dist/esm/react/rendering.d.ts +0 -6
  231. package/dist/esm/react/rendering.d.ts.map +1 -1
  232. package/dist/esm/react/rendering.js +1 -17
  233. package/dist/esm/react/rendering.js.map +1 -1
  234. package/dist/esm/react/use-reactive.d.ts +7 -0
  235. package/dist/esm/react/use-reactive.d.ts.map +1 -0
  236. package/dist/esm/react/use-reactive.js +64 -0
  237. package/dist/esm/react/use-reactive.js.map +1 -0
  238. package/dist/esm/react/use-signal.d.ts +3 -0
  239. package/dist/esm/react/use-signal.d.ts.map +1 -0
  240. package/dist/esm/react/use-signal.js +10 -0
  241. package/dist/esm/react/use-signal.js.map +1 -0
  242. package/dist/esm/{transform.d.ts → transform/async.d.ts} +1 -1
  243. package/dist/esm/transform/async.d.ts.map +1 -0
  244. package/dist/esm/{transform.js → transform/async.js} +22 -9
  245. package/dist/esm/transform/async.js.map +1 -0
  246. package/dist/esm/transform/callback.d.ts +6 -0
  247. package/dist/esm/transform/callback.d.ts.map +1 -0
  248. package/dist/esm/transform/callback.js +256 -0
  249. package/dist/esm/transform/callback.js.map +1 -0
  250. package/dist/esm/transform/index.d.ts +5 -0
  251. package/dist/esm/transform/index.d.ts.map +1 -0
  252. package/dist/esm/transform/index.js +5 -0
  253. package/dist/esm/transform/index.js.map +1 -0
  254. package/dist/esm/transform/preset.d.ts +7 -0
  255. package/dist/esm/transform/preset.d.ts.map +1 -0
  256. package/dist/esm/transform/preset.js +17 -0
  257. package/dist/esm/transform/preset.js.map +1 -0
  258. package/dist/esm/transform/promise.d.ts +6 -0
  259. package/dist/esm/transform/promise.d.ts.map +1 -0
  260. package/dist/esm/transform/promise.js +126 -0
  261. package/dist/esm/transform/promise.js.map +1 -0
  262. package/dist/esm/types.d.ts +44 -63
  263. package/dist/esm/types.d.ts.map +1 -1
  264. package/dist/esm/utils.d.ts +2 -0
  265. package/dist/esm/utils.d.ts.map +1 -0
  266. package/dist/esm/utils.js +2 -0
  267. package/dist/esm/utils.js.map +1 -0
  268. package/package.json +56 -58
  269. package/react.js +0 -4
  270. package/transform.js +1 -5
  271. package/utils.js +15 -0
  272. package/.turbo/turbo-build.log +0 -12
  273. package/dist/cjs/hooks.d.ts +0 -16
  274. package/dist/cjs/hooks.d.ts.map +0 -1
  275. package/dist/cjs/hooks.js +0 -44
  276. package/dist/cjs/hooks.js.map +0 -1
  277. package/dist/cjs/internals/connect.d.ts +0 -4
  278. package/dist/cjs/internals/connect.d.ts.map +0 -1
  279. package/dist/cjs/internals/connect.js.map +0 -1
  280. package/dist/cjs/internals/derived.d.ts +0 -76
  281. package/dist/cjs/internals/derived.d.ts.map +0 -1
  282. package/dist/cjs/internals/derived.js.map +0 -1
  283. package/dist/cjs/internals/state.d.ts +0 -18
  284. package/dist/cjs/internals/state.d.ts.map +0 -1
  285. package/dist/cjs/internals/state.js.map +0 -1
  286. package/dist/cjs/react/setup.d.ts +0 -2
  287. package/dist/cjs/react/setup.d.ts.map +0 -1
  288. package/dist/cjs/react/setup.js +0 -14
  289. package/dist/cjs/react/setup.js.map +0 -1
  290. package/dist/cjs/react/signal-value.d.ts +0 -6
  291. package/dist/cjs/react/signal-value.d.ts.map +0 -1
  292. package/dist/cjs/react/signal-value.js +0 -37
  293. package/dist/cjs/react/signal-value.js.map +0 -1
  294. package/dist/cjs/react/state.d.ts +0 -3
  295. package/dist/cjs/react/state.d.ts.map +0 -1
  296. package/dist/cjs/react/state.js.map +0 -1
  297. package/dist/cjs/trace.d.ts.map +0 -1
  298. package/dist/cjs/trace.js.map +0 -1
  299. package/dist/cjs/transform.d.ts.map +0 -1
  300. package/dist/cjs/transform.js.map +0 -1
  301. package/dist/cjs/weakref.d.ts.map +0 -1
  302. package/dist/cjs/weakref.js.map +0 -1
  303. package/dist/esm/hooks.d.ts +0 -16
  304. package/dist/esm/hooks.d.ts.map +0 -1
  305. package/dist/esm/hooks.js +0 -37
  306. package/dist/esm/hooks.js.map +0 -1
  307. package/dist/esm/internals/connect.d.ts +0 -4
  308. package/dist/esm/internals/connect.d.ts.map +0 -1
  309. package/dist/esm/internals/connect.js.map +0 -1
  310. package/dist/esm/internals/derived.d.ts +0 -76
  311. package/dist/esm/internals/derived.d.ts.map +0 -1
  312. package/dist/esm/internals/derived.js.map +0 -1
  313. package/dist/esm/internals/state.d.ts +0 -18
  314. package/dist/esm/internals/state.d.ts.map +0 -1
  315. package/dist/esm/internals/state.js.map +0 -1
  316. package/dist/esm/react/setup.d.ts +0 -2
  317. package/dist/esm/react/setup.d.ts.map +0 -1
  318. package/dist/esm/react/setup.js +0 -11
  319. package/dist/esm/react/setup.js.map +0 -1
  320. package/dist/esm/react/signal-value.d.ts +0 -6
  321. package/dist/esm/react/signal-value.d.ts.map +0 -1
  322. package/dist/esm/react/signal-value.js +0 -33
  323. package/dist/esm/react/signal-value.js.map +0 -1
  324. package/dist/esm/react/state.d.ts +0 -3
  325. package/dist/esm/react/state.d.ts.map +0 -1
  326. package/dist/esm/react/state.js +0 -10
  327. package/dist/esm/react/state.js.map +0 -1
  328. package/dist/esm/trace.d.ts.map +0 -1
  329. package/dist/esm/trace.js.map +0 -1
  330. package/dist/esm/transform.d.ts.map +0 -1
  331. package/dist/esm/transform.js.map +0 -1
  332. package/dist/esm/weakref.d.ts.map +0 -1
  333. package/dist/esm/weakref.js.map +0 -1
  334. package/src/__tests__/__snapshots__/context.test.ts.snap +0 -2101
  335. package/src/__tests__/__snapshots__/nesting.test.ts.snap +0 -16201
  336. package/src/__tests__/__snapshots__/params-and-state.test.ts.snap +0 -1879
  337. package/src/__tests__/async-task.test.ts +0 -327
  338. package/src/__tests__/context.test.ts +0 -619
  339. package/src/__tests__/gc.test.ts +0 -256
  340. package/src/__tests__/nesting.test.ts +0 -298
  341. package/src/__tests__/params-and-state.test.ts +0 -230
  342. package/src/__tests__/reactive-async.test.ts +0 -548
  343. package/src/__tests__/reactive-sync.test.ts +0 -130
  344. package/src/__tests__/subscription.test.ts +0 -510
  345. package/src/__tests__/utils/async.ts +0 -6
  346. package/src/__tests__/utils/instrumented-hooks.ts +0 -410
  347. package/src/__tests__/utils/permute.ts +0 -85
  348. package/src/config.ts +0 -54
  349. package/src/debug.ts +0 -14
  350. package/src/hooks.ts +0 -82
  351. package/src/index.ts +0 -20
  352. package/src/internals/async.ts +0 -563
  353. package/src/internals/connect.ts +0 -49
  354. package/src/internals/consumer.ts +0 -13
  355. package/src/internals/contexts.ts +0 -173
  356. package/src/internals/derived.ts +0 -217
  357. package/src/internals/dirty.ts +0 -91
  358. package/src/internals/edge.ts +0 -109
  359. package/src/internals/get.ts +0 -298
  360. package/src/internals/scheduling.ts +0 -160
  361. package/src/internals/state.ts +0 -111
  362. package/src/internals/utils/debug-name.ts +0 -14
  363. package/src/internals/utils/equals.ts +0 -12
  364. package/src/internals/utils/hash.ts +0 -221
  365. package/src/internals/utils/stringify.ts +0 -57
  366. package/src/internals/utils/type-utils.ts +0 -19
  367. package/src/react/__tests__/async.test.tsx +0 -704
  368. package/src/react/__tests__/basic.test.tsx +0 -95
  369. package/src/react/__tests__/contexts.test.tsx +0 -181
  370. package/src/react/__tests__/subscriptions.test.tsx +0 -49
  371. package/src/react/__tests__/utils.tsx +0 -40
  372. package/src/react/context.ts +0 -14
  373. package/src/react/index.ts +0 -6
  374. package/src/react/provider.tsx +0 -18
  375. package/src/react/rendering.ts +0 -43
  376. package/src/react/setup.ts +0 -11
  377. package/src/react/signal-value.ts +0 -50
  378. package/src/react/state.ts +0 -13
  379. package/src/trace.ts +0 -454
  380. package/src/transform.ts +0 -113
  381. package/src/types.ts +0 -115
  382. package/src/weakref.ts +0 -9
  383. package/tsconfig.json +0 -13
  384. package/vitest.workspace.ts +0 -61
  385. /package/dist/cjs/{weakref.d.ts → internals/weakref.d.ts} +0 -0
  386. /package/dist/cjs/{weakref.js → internals/weakref.js} +0 -0
  387. /package/dist/esm/{weakref.d.ts → internals/weakref.d.ts} +0 -0
  388. /package/dist/esm/{weakref.js → internals/weakref.js} +0 -0
@@ -1,704 +0,0 @@
1
- import { beforeEach, describe, expect, test } from 'vitest';
2
- import { render } from 'vitest-browser-react';
3
- import { state, reactive, ReactivePromise, subscription } from 'signalium';
4
- import { setupReact } from '../index.js';
5
- import React, { memo } from 'react';
6
- import { Locator } from '@vitest/browser/context';
7
- import { sleep } from '../../__tests__/utils/async.js';
8
- import { createRenderCounter, HOC, RenderCounter } from './utils.js';
9
-
10
- setupReact();
11
-
12
- const PROMISE_PROPS: (keyof ReactivePromise<string>)[] = [
13
- 'value',
14
- 'error',
15
- 'isPending',
16
- 'isRejected',
17
- 'isResolved',
18
- 'isSettled',
19
- 'isReady',
20
- ];
21
-
22
- function createPromisePropCounter(prop: keyof ReactivePromise<string>, wrapper?: HOC) {
23
- return createRenderCounter(({ promise }: { promise: ReactivePromise<string> }) => {
24
- return <>{String(promise[prop])}</>;
25
- }, wrapper);
26
- }
27
-
28
- type PromisePropsKey = keyof ReactivePromise<string> | 'parent';
29
-
30
- type PromisePropsRenderers = Record<PromisePropsKey, RenderCounter<{ promise: ReactivePromise<string> }>>;
31
-
32
- export const createPromisePropsCounter = (
33
- propWrapper?: HOC,
34
- parentWrapper?: HOC,
35
- ): [RenderCounter<{ promise: ReactivePromise<string> }>, PromisePropsRenderers] => {
36
- const PropRenderers = PROMISE_PROPS.reduce((acc, prop) => {
37
- acc[prop] = createPromisePropCounter(prop, propWrapper);
38
- return acc;
39
- }, {} as PromisePropsRenderers);
40
-
41
- const ParentRenderer = createRenderCounter(({ promise }: { promise: ReactivePromise<string> }) => {
42
- return (
43
- <>
44
- {PROMISE_PROPS.map(prop => {
45
- const PropRenderer = PropRenderers[prop];
46
-
47
- return <PropRenderer key={String(prop)} promise={promise} />;
48
- })}
49
- </>
50
- );
51
- }, parentWrapper);
52
-
53
- PropRenderers.parent = ParentRenderer;
54
-
55
- return [ParentRenderer, PropRenderers];
56
- };
57
-
58
- const getPromiseValuesAndCounts = (
59
- getByTestId: (id: string | RegExp) => Locator,
60
- PropRenderers: PromisePropsRenderers,
61
- ) => {
62
- return Object.fromEntries(
63
- Object.entries(PropRenderers).map(([prop, renderer]) => {
64
- const value = getByTestId(renderer.testId.toString());
65
-
66
- return prop === 'parent'
67
- ? [prop, renderer.renderCount]
68
- : [prop, [value.element().textContent, renderer.renderCount]];
69
- }),
70
- );
71
- };
72
-
73
- describe('React > async', () => {
74
- describe('reactive functions', () => {
75
- test('results can be passed down to children and grandchildren, and are updated when reactive promise resolves', async () => {
76
- const value = state('Hello');
77
-
78
- const derived = reactive(async () => {
79
- const v = value.get();
80
- await sleep(100);
81
- return `${v}, World`;
82
- });
83
-
84
- function GrandChild({ text }: { text: string }): React.ReactNode {
85
- return <span>{text}</span>;
86
- }
87
-
88
- function Child({
89
- asyncValue,
90
- }: {
91
- asyncValue: { isPending: boolean; value: string | undefined };
92
- }): React.ReactNode {
93
- return <div>{asyncValue.isPending ? 'Loading...' : <GrandChild text={asyncValue.value!} />}</div>;
94
- }
95
-
96
- function Parent(): React.ReactNode {
97
- const d = derived();
98
- return <Child asyncValue={d} />;
99
- }
100
-
101
- const { getByText } = render(<Parent />);
102
-
103
- await expect.element(getByText('Loading...')).toBeInTheDocument();
104
- await expect.element(getByText('Hello, World')).toBeInTheDocument();
105
-
106
- value.set('Hey');
107
-
108
- await expect.element(getByText('Loading...')).toBeInTheDocument();
109
- await expect.element(getByText('Hey, World')).toBeInTheDocument();
110
- });
111
-
112
- test('results will update all promise props together when used in unmemoized functions', async () => {
113
- const content = state('World');
114
-
115
- const derived1 = reactive(async () => {
116
- const v = `Hello, ${content.get()}`;
117
- await sleep(100);
118
- return v;
119
- });
120
-
121
- const [ParentRenderer, Renderers] = createPromisePropsCounter();
122
-
123
- const Parent = () => <ParentRenderer promise={derived1()} />;
124
-
125
- const { getByTestId } = render(<Parent />);
126
-
127
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
128
- parent: 1,
129
-
130
- isPending: ['true', 1],
131
- isReady: ['false', 1],
132
- isRejected: ['false', 1],
133
- isResolved: ['false', 1],
134
- isSettled: ['false', 1],
135
- value: ['undefined', 1],
136
- error: ['undefined', 1],
137
- });
138
-
139
- await sleep(200);
140
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
141
- parent: 2,
142
-
143
- isPending: ['false', 2],
144
- isReady: ['true', 2],
145
- isRejected: ['false', 2],
146
- isResolved: ['true', 2],
147
- isSettled: ['true', 2],
148
- value: ['Hello, World', 2],
149
- error: ['undefined', 2],
150
- });
151
-
152
- content.set('Galaxy');
153
- await sleep(0);
154
-
155
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
156
- parent: 3,
157
-
158
- isPending: ['true', 3],
159
- isReady: ['true', 3],
160
- isRejected: ['false', 3],
161
- isResolved: ['true', 3],
162
- isSettled: ['true', 3],
163
- value: ['Hello, World', 3],
164
- error: ['undefined', 3],
165
- });
166
-
167
- await sleep(200);
168
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
169
- parent: 4,
170
-
171
- isPending: ['false', 4],
172
- isReady: ['true', 4],
173
- isRejected: ['false', 4],
174
- isResolved: ['true', 4],
175
- isSettled: ['true', 4],
176
- value: ['Hello, Galaxy', 4],
177
- error: ['undefined', 4],
178
- });
179
- });
180
-
181
- test('it can transition back and forth between error and success states', async () => {
182
- const content = state('World');
183
-
184
- const derived1 = reactive(async () => {
185
- const value = content.get();
186
- const v = `Hello, ${value}`;
187
- await sleep(100);
188
- if (value === 'Galaxy') {
189
- throw new Error('Galaxy is not allowed');
190
- }
191
- return v;
192
- });
193
-
194
- const [ParentRenderer, Renderers] = createPromisePropsCounter();
195
-
196
- const Parent = () => <ParentRenderer promise={derived1()} />;
197
-
198
- const { getByTestId } = render(<Parent />);
199
-
200
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
201
- parent: 1,
202
-
203
- isPending: ['true', 1],
204
- isReady: ['false', 1],
205
- isRejected: ['false', 1],
206
- isResolved: ['false', 1],
207
- isSettled: ['false', 1],
208
- value: ['undefined', 1],
209
- error: ['undefined', 1],
210
- });
211
-
212
- await sleep(200);
213
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
214
- parent: 2,
215
-
216
- isPending: ['false', 2],
217
- isReady: ['true', 2],
218
- isRejected: ['false', 2],
219
- isResolved: ['true', 2],
220
- isSettled: ['true', 2],
221
- value: ['Hello, World', 2],
222
- error: ['undefined', 2],
223
- });
224
-
225
- content.set('Galaxy');
226
- await sleep(0);
227
-
228
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
229
- parent: 3,
230
-
231
- isPending: ['true', 3],
232
- isReady: ['true', 3],
233
- isRejected: ['false', 3],
234
- isResolved: ['true', 3],
235
- isSettled: ['true', 3],
236
- value: ['Hello, World', 3],
237
- error: ['undefined', 3],
238
- });
239
-
240
- await sleep(200);
241
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
242
- parent: 4,
243
-
244
- isPending: ['false', 4],
245
- isReady: ['true', 4],
246
- isRejected: ['true', 4],
247
- isResolved: ['false', 4],
248
- isSettled: ['true', 4],
249
- value: ['Hello, World', 4],
250
- error: ['Error: Galaxy is not allowed', 4],
251
- });
252
-
253
- content.set('Universe');
254
- await sleep(0);
255
-
256
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
257
- parent: 5,
258
-
259
- isPending: ['true', 5],
260
- isReady: ['true', 5],
261
- isRejected: ['true', 5],
262
- isResolved: ['false', 5],
263
- isSettled: ['true', 5],
264
- value: ['Hello, World', 5],
265
- error: ['Error: Galaxy is not allowed', 5],
266
- });
267
-
268
- await sleep(200);
269
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
270
- parent: 6,
271
-
272
- isPending: ['false', 6],
273
- isReady: ['true', 6],
274
- isRejected: ['false', 6],
275
- isResolved: ['true', 6],
276
- isSettled: ['true', 6],
277
- value: ['Hello, Universe', 6],
278
- error: ['undefined', 6],
279
- });
280
- });
281
-
282
- test('results can update when used in reactive functions', async () => {
283
- const value1 = state('Hello');
284
- let parentRenderCount = 0;
285
- let childRenderCount = 0;
286
-
287
- const derived1 = reactive(async () => {
288
- const v = value1.get();
289
- await sleep(100);
290
- return v;
291
- });
292
-
293
- const Child = reactive(({ promise }: { promise: ReactivePromise<string> }): React.ReactNode => {
294
- childRenderCount++;
295
- return <span data-testid="child">{promise.value}</span>;
296
- });
297
-
298
- const Parent = reactive((): React.ReactNode => {
299
- parentRenderCount++;
300
- const d1 = derived1();
301
- return (
302
- <div data-testid="parent">
303
- <Child promise={d1} />
304
- </div>
305
- );
306
- });
307
-
308
- const { getByTestId } = render(<Parent />);
309
-
310
- // Wait for both promises to resolve
311
- await sleep(200);
312
- await expect.element(getByTestId('parent')).toBeInTheDocument();
313
- await expect.element(getByTestId('child')).toBeInTheDocument();
314
-
315
- expect(parentRenderCount).toBe(1);
316
- expect(childRenderCount).toBe(2);
317
-
318
- // Update only value1, should re-render only the child
319
- value1.set('World');
320
- await sleep(200);
321
-
322
- expect(parentRenderCount).toBe(1);
323
- expect(childRenderCount).toBe(3);
324
- });
325
-
326
- test('results do not update when used in React.memo components when passed down directly', async () => {
327
- const value1 = state('Hello');
328
- let parentRenderCount = 0;
329
- let childRenderCount = 0;
330
-
331
- const derived1 = reactive(async () => {
332
- const v = value1.get();
333
- await sleep(100);
334
- return v;
335
- });
336
-
337
- const Child = memo(({ promise }: { promise: ReactivePromise<string> }): React.ReactNode => {
338
- childRenderCount++;
339
- return <span data-testid="child">{promise.value}</span>;
340
- });
341
-
342
- const Parent = memo((): React.ReactNode => {
343
- parentRenderCount++;
344
- const d1 = derived1();
345
- return (
346
- <div data-testid="parent">
347
- <Child promise={d1} />
348
- </div>
349
- );
350
- });
351
-
352
- const { getByTestId } = render(<Parent />);
353
-
354
- // Wait for both promises to resolve
355
- await sleep(200);
356
- await expect.element(getByTestId('parent')).toBeInTheDocument();
357
- await expect.element(getByTestId('child')).toBeInTheDocument();
358
-
359
- expect(parentRenderCount).toBe(2);
360
- expect(childRenderCount).toBe(1);
361
-
362
- // Update only value1, should re-render only the child
363
- value1.set('World');
364
- await sleep(200);
365
-
366
- expect(parentRenderCount).toBe(4);
367
- expect(childRenderCount).toBe(1);
368
- });
369
- });
370
-
371
- describe('subscriptions', () => {
372
- test('results can be passed down to children and grandchildren, and are updated when reactive promise resolves', async () => {
373
- const value = state('Hello');
374
-
375
- const derived = reactive(() => {
376
- const greeting = value.get();
377
-
378
- return subscription<string>(({ set }) => {
379
- const run = async () => {
380
- await sleep(100);
381
-
382
- return `${greeting}, World`;
383
- };
384
-
385
- set(run());
386
- });
387
- });
388
-
389
- function GrandChild({ text }: { text: string }): React.ReactNode {
390
- return <span>{text}</span>;
391
- }
392
-
393
- function Child({
394
- asyncValue,
395
- }: {
396
- asyncValue: { isPending: boolean; value: string | undefined };
397
- }): React.ReactNode {
398
- return <div>{asyncValue.isPending ? 'Loading...' : <GrandChild text={asyncValue.value!} />}</div>;
399
- }
400
-
401
- function Parent(): React.ReactNode {
402
- const d = derived();
403
- return <Child asyncValue={d} />;
404
- }
405
-
406
- const { getByText } = render(<Parent />);
407
-
408
- await expect.element(getByText('Loading...')).toBeInTheDocument();
409
- await expect.element(getByText('Hello, World')).toBeInTheDocument();
410
-
411
- value.set('Hey');
412
-
413
- await expect.element(getByText('Loading...')).toBeInTheDocument();
414
- await expect.element(getByText('Hey, World')).toBeInTheDocument();
415
- });
416
-
417
- test('results will update all promise props together when used in unmemoized functions', async () => {
418
- const content = state('World');
419
-
420
- const derived1 = reactive(() => {
421
- return subscription<string>(({ set }) => {
422
- const v = content.get();
423
-
424
- const run = async () => {
425
- await sleep(100);
426
- return `Hello, ${v}`;
427
- };
428
-
429
- set(run());
430
- });
431
- });
432
-
433
- const [ParentRenderer, Renderers] = createPromisePropsCounter();
434
-
435
- const Parent = () => <ParentRenderer promise={derived1()} />;
436
-
437
- const { getByTestId } = render(<Parent />);
438
-
439
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
440
- parent: 1,
441
-
442
- isPending: ['true', 1],
443
- isReady: ['false', 1],
444
- isRejected: ['false', 1],
445
- isResolved: ['false', 1],
446
- isSettled: ['false', 1],
447
- value: ['undefined', 1],
448
- error: ['undefined', 1],
449
- });
450
-
451
- await sleep(200);
452
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
453
- parent: 2,
454
-
455
- isPending: ['false', 2],
456
- isReady: ['true', 2],
457
- isRejected: ['false', 2],
458
- isResolved: ['true', 2],
459
- isSettled: ['true', 2],
460
- value: ['Hello, World', 2],
461
- error: ['undefined', 2],
462
- });
463
-
464
- content.set('Galaxy');
465
- // await sleep(10);
466
-
467
- // expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
468
- // parent: 3,
469
-
470
- // isPending: ['true', 3],
471
- // isReady: ['true', 3],
472
- // isRejected: ['false', 3],
473
- // isResolved: ['true', 3],
474
- // isSettled: ['true', 3],
475
- // value: ['Hello, World', 3],
476
- // error: ['undefined', 3],
477
- // });
478
-
479
- await sleep(200);
480
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
481
- parent: 4,
482
-
483
- isPending: ['false', 4],
484
- isReady: ['true', 4],
485
- isRejected: ['false', 4],
486
- isResolved: ['true', 4],
487
- isSettled: ['true', 4],
488
- value: ['Hello, Galaxy', 4],
489
- error: ['undefined', 4],
490
- });
491
- });
492
-
493
- test('it can transition back and forth between error and success states', async () => {
494
- const content = state('World');
495
-
496
- const derived1 = reactive(() => {
497
- return subscription<string>(({ set }) => {
498
- const value = content.get();
499
-
500
- const run = async () => {
501
- await sleep(100);
502
-
503
- if (value === 'Galaxy') {
504
- throw new Error('Galaxy is not allowed');
505
- }
506
-
507
- return `Hello, ${value}`;
508
- };
509
-
510
- set(run());
511
- });
512
- });
513
-
514
- const [ParentRenderer, Renderers] = createPromisePropsCounter();
515
-
516
- const Parent = () => <ParentRenderer promise={derived1()} />;
517
-
518
- const { getByTestId } = render(<Parent />);
519
-
520
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
521
- parent: 1,
522
-
523
- isPending: ['true', 1],
524
- isReady: ['false', 1],
525
- isRejected: ['false', 1],
526
- isResolved: ['false', 1],
527
- isSettled: ['false', 1],
528
- value: ['undefined', 1],
529
- error: ['undefined', 1],
530
- });
531
-
532
- await sleep(200);
533
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
534
- parent: 2,
535
-
536
- isPending: ['false', 2],
537
- isReady: ['true', 2],
538
- isRejected: ['false', 2],
539
- isResolved: ['true', 2],
540
- isSettled: ['true', 2],
541
- value: ['Hello, World', 2],
542
- error: ['undefined', 2],
543
- });
544
-
545
- content.set('Galaxy');
546
- await sleep(0);
547
-
548
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
549
- parent: 3,
550
-
551
- isPending: ['true', 3],
552
- isReady: ['true', 3],
553
- isRejected: ['false', 3],
554
- isResolved: ['true', 3],
555
- isSettled: ['true', 3],
556
- value: ['Hello, World', 3],
557
- error: ['undefined', 3],
558
- });
559
-
560
- await sleep(200);
561
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
562
- parent: 4,
563
-
564
- isPending: ['false', 4],
565
- isReady: ['true', 4],
566
- isRejected: ['true', 4],
567
- isResolved: ['false', 4],
568
- isSettled: ['true', 4],
569
- value: ['Hello, World', 4],
570
- error: ['Error: Galaxy is not allowed', 4],
571
- });
572
-
573
- content.set('Universe');
574
- await sleep(0);
575
-
576
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
577
- parent: 5,
578
-
579
- isPending: ['true', 5],
580
- isReady: ['true', 5],
581
- isRejected: ['true', 5],
582
- isResolved: ['false', 5],
583
- isSettled: ['true', 5],
584
- value: ['Hello, World', 5],
585
- error: ['Error: Galaxy is not allowed', 5],
586
- });
587
-
588
- await sleep(200);
589
- expect(getPromiseValuesAndCounts(getByTestId, Renderers)).toEqual({
590
- parent: 6,
591
-
592
- isPending: ['false', 6],
593
- isReady: ['true', 6],
594
- isRejected: ['false', 6],
595
- isResolved: ['true', 6],
596
- isSettled: ['true', 6],
597
- value: ['Hello, Universe', 6],
598
- error: ['undefined', 6],
599
- });
600
- });
601
-
602
- test('results can update when used in reactive functions', async () => {
603
- const value1 = state('Hello');
604
- let parentRenderCount = 0;
605
- let childRenderCount = 0;
606
-
607
- const derived1 = reactive(() => {
608
- return subscription<string>(({ set }) => {
609
- const v = value1.get();
610
-
611
- const run = async () => {
612
- await sleep(100);
613
- return v;
614
- };
615
-
616
- set(run());
617
- });
618
- });
619
-
620
- const Child = reactive(({ promise }: { promise: ReactivePromise<string> }): React.ReactNode => {
621
- childRenderCount++;
622
- return <span data-testid="child">{promise.value}</span>;
623
- });
624
-
625
- const Parent = reactive((): React.ReactNode => {
626
- parentRenderCount++;
627
- const d1 = derived1();
628
- return (
629
- <div data-testid="parent">
630
- <Child promise={d1} />
631
- </div>
632
- );
633
- });
634
-
635
- const { getByTestId } = render(<Parent />);
636
-
637
- // Wait for both promises to resolve
638
- await sleep(200);
639
- await expect.element(getByTestId('parent')).toBeInTheDocument();
640
- await expect.element(getByTestId('child')).toBeInTheDocument();
641
-
642
- expect(parentRenderCount).toBe(1);
643
- expect(childRenderCount).toBe(2);
644
-
645
- // Update only value1, should re-render only the child
646
- value1.set('World');
647
- await sleep(200);
648
-
649
- expect(parentRenderCount).toBe(1);
650
- expect(childRenderCount).toBe(3);
651
- });
652
-
653
- test('results do not update when used in React.memo components when passed down directly', async () => {
654
- const value1 = state('Hello');
655
- let parentRenderCount = 0;
656
- let childRenderCount = 0;
657
-
658
- const derived1 = reactive(() => {
659
- return subscription<string>(({ set }) => {
660
- const v = value1.get();
661
-
662
- const run = async () => {
663
- await sleep(100);
664
- return v;
665
- };
666
-
667
- set(run());
668
- });
669
- });
670
-
671
- const Child = memo(({ promise }: { promise: ReactivePromise<string> }): React.ReactNode => {
672
- childRenderCount++;
673
- return <span data-testid="child">{promise.value}</span>;
674
- });
675
-
676
- const Parent = memo((): React.ReactNode => {
677
- parentRenderCount++;
678
- const d1 = derived1();
679
- return (
680
- <div data-testid="parent">
681
- <Child promise={d1} />
682
- </div>
683
- );
684
- });
685
-
686
- const { getByTestId } = render(<Parent />);
687
-
688
- // Wait for both promises to resolve
689
- await sleep(200);
690
- await expect.element(getByTestId('parent')).toBeInTheDocument();
691
- await expect.element(getByTestId('child')).toBeInTheDocument();
692
-
693
- expect(parentRenderCount).toBe(2);
694
- expect(childRenderCount).toBe(1);
695
-
696
- // Update only value1, should re-render only the child
697
- value1.set('World');
698
- await sleep(200);
699
-
700
- expect(parentRenderCount).toBe(4);
701
- expect(childRenderCount).toBe(1);
702
- });
703
- });
704
- });