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,563 +0,0 @@
1
- import {
2
- BaseReactivePromise,
3
- ReactiveSubscription,
4
- ReactiveTask,
5
- ReactivePromise as IReactivePromise,
6
- SignalEquals,
7
- SignalOptionsWithInit,
8
- SignalSubscribe,
9
- SignalSubscription,
10
- } from '../types.js';
11
- import { createDerivedSignal, DerivedSignal, DerivedSignalDefinition, SignalState } from './derived.js';
12
- import { CURRENT_CONSUMER, generatorResultToPromise, getSignal } from './get.js';
13
- import { dirtySignal, dirtySignalConsumers } from './dirty.js';
14
- import { scheduleAsyncPull, schedulePull, setResolved } from './scheduling.js';
15
- import { createEdge, Edge, EdgeType, findAndRemoveDirty, PromiseEdge } from './edge.js';
16
- import { getCurrentScope, ROOT_SCOPE, SignalScope, withScope } from './contexts.js';
17
- import { createStateSignal } from './state.js';
18
- import { useStateSignal } from '../config.js';
19
- import { isGeneratorResult, isPromise } from './utils/type-utils.js';
20
- import { DEFAULT_EQUALS, equalsFrom, FALSE_EQUALS } from './utils/equals.js';
21
-
22
- const enum AsyncFlags {
23
- // ======= Notifiers ========
24
-
25
- Pending = 1,
26
- Rejected = 1 << 1,
27
- Resolved = 1 << 2,
28
- Ready = 1 << 3,
29
-
30
- Value = 1 << 4,
31
- Error = 1 << 5,
32
-
33
- // ======= Properties ========
34
-
35
- isRunnable = 1 << 6,
36
- isSubscription = 1 << 7,
37
-
38
- // ======= Helpers ========
39
-
40
- Settled = Resolved | Rejected,
41
- }
42
-
43
- interface PendingResolve<T> {
44
- ref: WeakRef<DerivedSignal<unknown, unknown[]>> | undefined;
45
- edge: PromiseEdge | undefined;
46
- resolve: ((value: T) => void) | undefined | null;
47
- reject: ((error: unknown) => void) | undefined | null;
48
- }
49
-
50
- type TaskFn<T, Args extends unknown[]> = (...args: Args) => Promise<T>;
51
-
52
- export class ReactivePromise<T, Args extends unknown[] = unknown[]> implements BaseReactivePromise<T> {
53
- private _value: T | undefined = undefined;
54
-
55
- private _error: unknown | undefined = undefined;
56
- private _flags = 0;
57
-
58
- private _signal: DerivedSignal<any, any> | TaskFn<T, Args> | undefined = undefined;
59
- private _equals!: SignalEquals<T>;
60
- private _promise: Promise<T> | undefined;
61
-
62
- private _pending: PendingResolve<T>[] = [];
63
-
64
- private _stateSubs = new Map<WeakRef<DerivedSignal<unknown, unknown[]>>, number>();
65
- _awaitSubs = new Map<WeakRef<DerivedSignal<unknown, unknown[]>>, PromiseEdge>();
66
-
67
- // Version is not really needed in a pure signal world, but when integrating
68
- // with non-signal code, it's sometimes needed to entangle changes to the promise.
69
- // For example, in React we need to entangle each promise immediately after it
70
- // was used because we can't dynamically call hooks.
71
- private _version = createStateSignal(0);
72
- private _boundRun: ((...args: Args) => ReactivePromise<T, Args>) | undefined;
73
-
74
- static createPromise<T>(promise: Promise<T>, signal?: DerivedSignal<T, unknown[]>, initValue?: T | undefined) {
75
- const p = new ReactivePromise<T>();
76
-
77
- p._signal = signal;
78
- p._equals = signal?.def.equals ?? DEFAULT_EQUALS;
79
-
80
- p._initFlags(AsyncFlags.Pending, initValue);
81
-
82
- if (promise) {
83
- p._setPromise(promise);
84
- }
85
-
86
- return p;
87
- }
88
-
89
- static createSubscription<T>(
90
- subscribe: SignalSubscribe<T>,
91
- scope: SignalScope,
92
- opts?: Partial<SignalOptionsWithInit<T, unknown[]>>,
93
- ) {
94
- const p = new ReactivePromise<T>();
95
- const initValue = opts?.initValue;
96
-
97
- let active = false;
98
- let currentSub: SignalSubscription | (() => void) | undefined | void;
99
-
100
- const unsubscribe = () => {
101
- if (typeof currentSub === 'function') {
102
- currentSub();
103
- } else if (currentSub !== undefined) {
104
- currentSub.unsubscribe?.();
105
- }
106
-
107
- const signal = p._signal as DerivedSignal<any, any>;
108
-
109
- // Reset the signal state, preparing it for next activation
110
- signal.subs = new Map();
111
- signal._state = SignalState.Dirty;
112
- signal.watchCount = 0;
113
- active = false;
114
- currentSub = undefined;
115
- };
116
-
117
- const state = {
118
- get: () => p._value as T,
119
-
120
- set: (value: T | Promise<T>) => {
121
- if (value !== null && typeof value === 'object' && isPromise(value)) {
122
- p._setPromise(value);
123
- } else {
124
- p._setValue(value as T);
125
- }
126
- },
127
-
128
- setError: (error: unknown) => {
129
- p._setError(error);
130
- },
131
- };
132
-
133
- const def: DerivedSignalDefinition<() => void, unknown[]> = {
134
- compute: () => {
135
- if (active === false) {
136
- currentSub = subscribe(state);
137
- active = true;
138
- } else if (typeof currentSub === 'function' || currentSub === undefined) {
139
- currentSub?.();
140
- currentSub = subscribe(state);
141
- } else {
142
- currentSub.update?.();
143
- }
144
-
145
- return unsubscribe;
146
- },
147
- equals: DEFAULT_EQUALS,
148
- isSubscription: true,
149
- };
150
-
151
- p._signal = createDerivedSignal<() => void, unknown[]>(
152
- def,
153
- [],
154
- undefined,
155
- scope,
156
- opts as Omit<SignalOptionsWithInit<T, unknown[]>, 'equals' | 'initValue' | 'paramKey' | 'shouldGC'>,
157
- );
158
-
159
- p._equals = equalsFrom(opts?.equals);
160
- p._initFlags(AsyncFlags.isSubscription | AsyncFlags.Pending, initValue as T);
161
-
162
- return p;
163
- }
164
-
165
- static createTask<T, Args extends unknown[]>(
166
- task: (...args: Args) => Promise<T>,
167
- scope: SignalScope,
168
- opts?: Partial<SignalOptionsWithInit<T, Args>>,
169
- ): ReactiveTask<T, Args> {
170
- const p = new ReactivePromise<T, Args>();
171
- const initValue = opts?.initValue;
172
-
173
- p._signal = (...args) => {
174
- return withScope(scope, () => {
175
- const result = task(...args);
176
-
177
- return typeof result === 'object' && result !== null && isGeneratorResult(result)
178
- ? generatorResultToPromise(result, undefined)
179
- : result;
180
- });
181
- };
182
-
183
- p._equals = equalsFrom(opts?.equals);
184
- p._initFlags(AsyncFlags.isRunnable, initValue as T);
185
-
186
- return p as ReactiveTask<T, Args>;
187
- }
188
-
189
- private _initFlags(baseFlags: number, initValue?: T) {
190
- let flags = baseFlags;
191
-
192
- if (initValue !== undefined) {
193
- flags |= AsyncFlags.Ready;
194
- }
195
-
196
- this._flags = flags;
197
- this._value = initValue as T;
198
- }
199
-
200
- private _consumeFlags(flags: number) {
201
- if (CURRENT_CONSUMER === undefined) return;
202
-
203
- if ((this._flags & AsyncFlags.isSubscription) !== 0) {
204
- this._connect();
205
- }
206
-
207
- const ref = CURRENT_CONSUMER.ref;
208
-
209
- const subs = this._stateSubs;
210
-
211
- const subbedFlags = subs.get(ref) ?? 0;
212
- subs.set(ref, subbedFlags | flags);
213
- }
214
-
215
- private _connect() {
216
- const signal = this._signal as DerivedSignal<any, any>;
217
-
218
- if (CURRENT_CONSUMER?.watchCount === 0) {
219
- const { ref, computedCount, deps } = CURRENT_CONSUMER!;
220
- const prevEdge = deps.get(signal);
221
-
222
- if (prevEdge?.consumedAt !== computedCount) {
223
- const newEdge = createEdge(prevEdge, EdgeType.Signal, signal, signal.updatedCount, computedCount);
224
-
225
- signal.subs.set(ref, newEdge);
226
- deps.set(signal, newEdge);
227
- }
228
- } else {
229
- getSignal(signal);
230
- }
231
- }
232
-
233
- private _setFlags(setTrue: number, setFalse = 0, notify = 0) {
234
- const prevFlags = this._flags;
235
-
236
- const nextFlags = (prevFlags & ~setFalse) | setTrue;
237
- const allChanged = (prevFlags ^ nextFlags) | notify;
238
-
239
- this._flags = nextFlags;
240
-
241
- if (allChanged === 0) {
242
- return;
243
- }
244
-
245
- const subs = this._stateSubs;
246
-
247
- for (const [signalRef, subbedFlags] of subs) {
248
- if ((subbedFlags & allChanged) !== 0) {
249
- const signal = signalRef.deref();
250
-
251
- if (signal) {
252
- dirtySignal(signal);
253
- }
254
-
255
- subs.delete(signalRef);
256
- }
257
- }
258
-
259
- this._version.update(v => v + 1);
260
- }
261
-
262
- _setPending() {
263
- this._setFlags(AsyncFlags.Pending);
264
- }
265
-
266
- async _setPromise(promise: Promise<T>) {
267
- // Store the current promise so we can check if it's the same promise in the
268
- // then handlers. If it's not the same promise, it means that the promise has
269
- // been recomputed and replaced, so we should not update state.
270
- this._promise = promise;
271
-
272
- const flags = this._flags;
273
- let awaitSubs = this._awaitSubs;
274
-
275
- // If we were not already pending, we need to propagate the dirty state to any
276
- // consumers that were added since the promise was resolved last.
277
- if ((flags & AsyncFlags.Pending) === 0) {
278
- this._setPending();
279
- dirtySignalConsumers(awaitSubs);
280
- this._awaitSubs = awaitSubs = new Map();
281
- }
282
-
283
- try {
284
- const nextValue = await promise;
285
-
286
- if (promise !== this._promise) {
287
- return;
288
- }
289
-
290
- this._setValue(nextValue, awaitSubs);
291
- } catch (nextError) {
292
- if (promise !== this._promise) {
293
- return;
294
- }
295
-
296
- this._setError(nextError, awaitSubs);
297
- }
298
- }
299
-
300
- private _setValue(nextValue: T, awaitSubs = this._awaitSubs) {
301
- let flags = this._flags;
302
- let value = this._value;
303
-
304
- let notifyFlags = 0;
305
-
306
- if ((flags & AsyncFlags.Ready) === 0 || this._equals(value!, nextValue) === false) {
307
- this._value = value = nextValue;
308
- notifyFlags = AsyncFlags.Value;
309
- }
310
-
311
- if (flags & AsyncFlags.Rejected) {
312
- notifyFlags = AsyncFlags.Error;
313
- this._error = undefined;
314
- }
315
-
316
- this._scheduleSubs(awaitSubs, notifyFlags !== 0);
317
-
318
- this._setFlags(AsyncFlags.Resolved | AsyncFlags.Ready, AsyncFlags.Pending | AsyncFlags.Rejected, notifyFlags);
319
-
320
- for (const { ref, edge, resolve } of this._pending) {
321
- resolve?.(value!);
322
-
323
- if (ref !== undefined) {
324
- awaitSubs.set(ref, edge!);
325
- }
326
- }
327
-
328
- this._pending = [];
329
- }
330
-
331
- private _setError(nextError: unknown, awaitSubs = this._awaitSubs) {
332
- let error = this._error;
333
-
334
- let notifyFlags = 0;
335
-
336
- if (error !== nextError) {
337
- this._error = error = nextError;
338
- notifyFlags = AsyncFlags.Error;
339
- }
340
-
341
- this._scheduleSubs(awaitSubs, notifyFlags !== 0);
342
-
343
- this._setFlags(AsyncFlags.Rejected, AsyncFlags.Pending | AsyncFlags.Resolved, notifyFlags);
344
-
345
- for (const { ref, edge, reject } of this._pending) {
346
- reject?.(error);
347
-
348
- if (ref !== undefined) {
349
- awaitSubs.set(ref, edge!);
350
- }
351
- }
352
-
353
- this._pending = [];
354
- }
355
-
356
- private _scheduleSubs(awaitSubs: Map<WeakRef<DerivedSignal<unknown, unknown[]>>, PromiseEdge>, dirty: boolean) {
357
- // Await subscribers that have been added since the promise was set are specifically
358
- // subscribers that were previously notified and MaybeDirty, were removed from the
359
- // signal, and then were checked (e.g. checkSignal was called on them) and they
360
- // halted and added themselves back as dependencies.
361
- //
362
- // If the value actually changed, then these consumers are Dirty and will notify and
363
- // schedule themselves the standard way here. If the value did not change, then the
364
- // consumers are not notified and end up back in the same state as before the promise
365
- // was set (because nothing changed), and instead they will be scheduled to continue
366
- // the computation from where they left off.
367
- const newState = dirty ? SignalState.Dirty : SignalState.MaybeDirty;
368
-
369
- for (const ref of awaitSubs.keys()) {
370
- const signal = ref.deref();
371
-
372
- if (signal === undefined) {
373
- continue;
374
- }
375
-
376
- signal._state = newState;
377
-
378
- scheduleAsyncPull(signal);
379
- }
380
- }
381
-
382
- get value() {
383
- this._consumeFlags(AsyncFlags.Value);
384
-
385
- return this._value;
386
- }
387
-
388
- get error() {
389
- this._consumeFlags(AsyncFlags.Error);
390
-
391
- return this._error;
392
- }
393
-
394
- get isPending() {
395
- this._consumeFlags(AsyncFlags.Pending);
396
-
397
- return (this._flags & AsyncFlags.Pending) !== 0;
398
- }
399
-
400
- get isRejected() {
401
- this._consumeFlags(AsyncFlags.Rejected);
402
-
403
- return (this._flags & AsyncFlags.Rejected) !== 0;
404
- }
405
-
406
- get isResolved() {
407
- this._consumeFlags(AsyncFlags.Resolved);
408
-
409
- return (this._flags & AsyncFlags.Resolved) !== 0;
410
- }
411
-
412
- get isReady() {
413
- this._consumeFlags(AsyncFlags.Ready);
414
-
415
- return (this._flags & AsyncFlags.Ready) !== 0;
416
- }
417
-
418
- get isSettled() {
419
- this._consumeFlags(AsyncFlags.Settled);
420
-
421
- return (this._flags & AsyncFlags.Settled) !== 0;
422
- }
423
-
424
- // Aliases for backwards compatibility (TODO: Figure out how to do this better)
425
- get data() {
426
- return this.value;
427
- }
428
-
429
- get isFetching() {
430
- return this.isPending;
431
- }
432
-
433
- get isSuccess() {
434
- return this.isResolved;
435
- }
436
-
437
- get isError() {
438
- return this.isRejected;
439
- }
440
-
441
- get isFetched() {
442
- return this.isSettled;
443
- }
444
-
445
- _run(...args: Args) {
446
- const flags = this._flags;
447
- const signal = this._signal;
448
-
449
- if ((flags & AsyncFlags.isRunnable) !== 0) {
450
- this._setPromise((signal as TaskFn<T, Args>)(...args));
451
- } else if (signal) {
452
- dirtySignal(signal as DerivedSignal<any, any>);
453
- } else {
454
- throw new Error(
455
- 'ReactivePromise is not runnable. If you are using run() on a ReactivePromise, make sure you used `task` to create this promise. If you are using rerun(), make sure its a promise that was generated by a reactive async function.',
456
- );
457
- }
458
-
459
- return this;
460
- }
461
-
462
- run = this._run.bind(this);
463
-
464
- get rerun() {
465
- return this.run as () => ReactivePromise<T, Args>;
466
- }
467
-
468
- then<TResult1 = T, TResult2 = never>(
469
- onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
470
- onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,
471
- ): Promise<TResult1 | TResult2> {
472
- const flags = this._flags;
473
-
474
- // Create a new Promise that will be returned
475
- return new Promise<TResult1 | TResult2>((resolve, reject) => {
476
- let ref, edge;
477
-
478
- if (CURRENT_CONSUMER !== undefined) {
479
- if ((flags & AsyncFlags.isSubscription) !== 0) {
480
- this._connect();
481
- }
482
-
483
- ref = CURRENT_CONSUMER.ref;
484
-
485
- const prevEdge =
486
- this._awaitSubs.get(ref!) ?? findAndRemoveDirty(CURRENT_CONSUMER, this as ReactivePromise<any>);
487
-
488
- edge = createEdge(prevEdge, EdgeType.Promise, this as ReactivePromise<any>, -1, CURRENT_CONSUMER.computedCount);
489
- }
490
- // Create wrapper functions that will call the original callbacks and then resolve/reject the new Promise
491
- const wrappedFulfilled = onfulfilled
492
- ? (value: T) => {
493
- try {
494
- const result = onfulfilled(value);
495
- resolve(result);
496
- } catch (error) {
497
- reject(error);
498
- }
499
- }
500
- : (resolve as unknown as (value: T) => void);
501
-
502
- const wrappedRejected = onrejected
503
- ? (reason: unknown) => {
504
- try {
505
- const result = onrejected(reason);
506
- resolve(result);
507
- } catch (error) {
508
- reject(error);
509
- }
510
- }
511
- : reject;
512
-
513
- if (flags & AsyncFlags.Pending) {
514
- this._pending.push({ ref, edge, resolve: wrappedFulfilled, reject: wrappedRejected });
515
- } else {
516
- if (flags & AsyncFlags.Resolved) {
517
- wrappedFulfilled(this._value!);
518
- } else if (flags & AsyncFlags.Rejected) {
519
- wrappedRejected(this._error);
520
- }
521
-
522
- if (ref) {
523
- this._awaitSubs.set(ref, edge!);
524
- }
525
- }
526
- });
527
- }
528
-
529
- catch<TResult = never>(
530
- onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,
531
- ): Promise<T | TResult> {
532
- return this.then(null, onrejected);
533
- }
534
-
535
- finally(onfinally?: (() => void) | null): Promise<T> {
536
- return this.then(
537
- value => {
538
- onfinally?.();
539
- return value;
540
- },
541
- reason => {
542
- onfinally?.();
543
- throw reason;
544
- },
545
- );
546
- }
547
-
548
- get [Symbol.toStringTag](): string {
549
- return 'ReactivePromise';
550
- }
551
- }
552
-
553
- export function isReactivePromise(obj: unknown): obj is IReactivePromise<unknown> {
554
- return obj instanceof ReactivePromise && (obj['_flags'] & (AsyncFlags.isSubscription & AsyncFlags.isRunnable)) === 0;
555
- }
556
-
557
- export function isReactiveTask(obj: unknown): obj is ReactiveTask<unknown, unknown[]> {
558
- return obj instanceof ReactivePromise && (obj['_flags'] & AsyncFlags.isRunnable) !== 0;
559
- }
560
-
561
- export function isReactiveSubscription<T, Args extends unknown[]>(obj: unknown): obj is ReactiveSubscription<T> {
562
- return obj instanceof ReactivePromise && (obj['_flags'] & AsyncFlags.isSubscription) !== 0;
563
- }
@@ -1,49 +0,0 @@
1
- import { DerivedSignal, isSubscription } from './derived.js';
2
- import { checkSignal } from './get.js';
3
-
4
- export function watchSignal(signal: DerivedSignal<any, any>): void {
5
- const { watchCount } = signal;
6
- const newWatchCount = watchCount + 1;
7
-
8
- signal.watchCount = newWatchCount;
9
-
10
- // If > 0, already watching, return
11
- if (watchCount > 0) return;
12
-
13
- // If signal is being watched again, remove from GC candidates
14
- signal.scope?.removeFromGc(signal);
15
-
16
- for (const dep of signal.deps.keys()) {
17
- watchSignal(dep);
18
- }
19
-
20
- if (isSubscription(signal)) {
21
- // Bootstrap the subscription
22
- checkSignal(signal);
23
- }
24
- }
25
-
26
- export function unwatchSignal(signal: DerivedSignal<any, any>, count = 1) {
27
- const { watchCount } = signal;
28
- const newWatchCount = Math.max(watchCount - count, 0);
29
-
30
- signal.watchCount = newWatchCount;
31
-
32
- if (newWatchCount > 0) {
33
- return;
34
- }
35
-
36
- for (const dep of signal.deps.keys()) {
37
- unwatchSignal(dep);
38
- }
39
-
40
- if (isSubscription(signal)) {
41
- // teardown the subscription
42
- signal.value?.();
43
- }
44
-
45
- // If watchCount is now zero, mark the signal for GC
46
- if (newWatchCount === 0 && signal.scope) {
47
- signal.scope.markForGc(signal);
48
- }
49
- }
@@ -1,13 +0,0 @@
1
- import { DerivedSignal } from './derived.js';
2
-
3
- export let CURRENT_CONSUMER: DerivedSignal<any, any> | undefined;
4
-
5
- export let IS_WATCHING = false;
6
-
7
- export const setIsWatching = (isWatching: boolean) => {
8
- IS_WATCHING = isWatching;
9
- };
10
-
11
- export const setCurrentConsumer = (consumer: DerivedSignal<any, any> | undefined) => {
12
- CURRENT_CONSUMER = consumer;
13
- };