signalium 1.2.2 → 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 +28 -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 -23
  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 +15 -14
  32. package/dist/cjs/internals/contexts.d.ts.map +1 -1
  33. package/dist/cjs/internals/contexts.js +52 -52
  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 +15 -14
  164. package/dist/esm/internals/contexts.d.ts.map +1 -1
  165. package/dist/esm/internals/contexts.js +46 -46
  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 -21
  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 -177
  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,177 +0,0 @@
1
- import { getFrameworkScope } from '../config.js';
2
- import { SignalOptionsWithInit } from '../types.js';
3
- import { DerivedSignal, DerivedSignalDefinition, createDerivedSignal } from './derived.js';
4
- import { CURRENT_CONSUMER } from './get.js';
5
- import { hashReactiveFn, hashValue } from './utils/hash.js';
6
- import { scheduleGcSweep } from './scheduling.js';
7
-
8
- export const CONTEXT_KEY = Symbol('signalium:context');
9
-
10
- export type Context<T> = {
11
- defaultValue: T;
12
- };
13
-
14
- export type ContextPair<T extends unknown[]> = {
15
- [K in keyof T]: [Context<T[K]>, NoInfer<T[K]>];
16
- };
17
-
18
- let CONTEXT_ID = 0;
19
-
20
- export class ContextImpl<T> {
21
- _key: symbol;
22
- _description: string;
23
-
24
- constructor(
25
- public readonly defaultValue: T,
26
- desc?: string,
27
- ) {
28
- this._description = desc ?? `context:${CONTEXT_ID++}`;
29
- this._key = Symbol(this._description);
30
- }
31
- }
32
-
33
- export const createContext = <T>(initialValue: T, description?: string): Context<T> => {
34
- return new ContextImpl(initialValue, description);
35
- };
36
-
37
- export class SignalScope {
38
- constructor(contexts: [ContextImpl<unknown>, unknown][], parent?: SignalScope) {
39
- this.contexts = Object.create(parent?.contexts || null);
40
-
41
- this.setContexts(contexts);
42
- }
43
-
44
- private contexts: Record<symbol, unknown>;
45
- private children = new Map<number, SignalScope>();
46
- private signals = new Map<number, DerivedSignal<any, any>>();
47
- private gcCandidates = new Set<DerivedSignal<any, any>>();
48
-
49
- setContexts(contexts: [ContextImpl<unknown>, unknown][]) {
50
- for (const [context, value] of contexts) {
51
- this.contexts[context._key] = value;
52
- }
53
-
54
- this.signals.clear();
55
- }
56
-
57
- getChild(contexts: [ContextImpl<unknown>, unknown][]) {
58
- const key = hashValue(contexts);
59
-
60
- let child = this.children.get(key);
61
-
62
- if (child === undefined) {
63
- child = new SignalScope(contexts, this);
64
- this.children.set(key, child);
65
- }
66
-
67
- return child;
68
- }
69
-
70
- getContext<T>(_context: Context<T>): T | undefined {
71
- const context = _context as unknown as ContextImpl<T>;
72
-
73
- return this.contexts[context._key] as T | undefined;
74
- }
75
-
76
- get<T, Args extends unknown[]>(
77
- def: DerivedSignalDefinition<T, Args>,
78
- args: Args,
79
- opts?: Partial<SignalOptionsWithInit<T, Args>>,
80
- ): DerivedSignal<T, Args> {
81
- const paramKey = opts?.paramKey?.(...args);
82
- const key = hashReactiveFn(def.compute, paramKey ? [paramKey] : args);
83
- let signal = this.signals.get(key) as DerivedSignal<T, Args> | undefined;
84
-
85
- if (signal === undefined) {
86
- signal = createDerivedSignal(def, args, key, this, opts);
87
- this.signals.set(key, signal);
88
- }
89
-
90
- return signal;
91
- }
92
-
93
- markForGc(signal: DerivedSignal<any, any>) {
94
- if (!this.gcCandidates.has(signal)) {
95
- this.gcCandidates.add(signal);
96
- scheduleGcSweep(this);
97
- }
98
- }
99
-
100
- removeFromGc(signal: DerivedSignal<any, any>) {
101
- this.gcCandidates.delete(signal);
102
- }
103
-
104
- forceGc(signal: DerivedSignal<any, any>) {
105
- this.signals.delete(signal.key!);
106
- }
107
-
108
- sweepGc() {
109
- for (const signal of this.gcCandidates) {
110
- if (signal.watchCount === 0) {
111
- const { shouldGC } = signal.def;
112
-
113
- if (!shouldGC || shouldGC(signal, signal.value, signal.args)) {
114
- this.signals.delete(signal.key!);
115
- }
116
- }
117
- }
118
-
119
- this.gcCandidates = new Set();
120
- }
121
- }
122
-
123
- export let ROOT_SCOPE = new SignalScope([]);
124
-
125
- export function setRootContexts<C extends unknown[], U>(contexts: [...ContextPair<C>]): void {
126
- ROOT_SCOPE.setContexts(contexts as [ContextImpl<unknown>, unknown][]);
127
- }
128
-
129
- export const clearRootContexts = () => {
130
- ROOT_SCOPE = new SignalScope([]);
131
- };
132
-
133
- let OVERRIDE_SCOPE: SignalScope | undefined;
134
-
135
- export const getCurrentScope = (): SignalScope => {
136
- return OVERRIDE_SCOPE ?? CURRENT_CONSUMER?.scope ?? getFrameworkScope() ?? ROOT_SCOPE;
137
- };
138
-
139
- export function withContexts<C extends unknown[], U>(contexts: [...ContextPair<C>], fn: () => U): U {
140
- const prevScope = OVERRIDE_SCOPE;
141
- const currentScope = getCurrentScope();
142
-
143
- try {
144
- OVERRIDE_SCOPE = currentScope.getChild(contexts as [ContextImpl<unknown>, unknown][]);
145
- return fn();
146
- } finally {
147
- OVERRIDE_SCOPE = prevScope;
148
- }
149
- }
150
-
151
- export const withScope = <T>(scope: SignalScope, fn: () => T) => {
152
- const prevScope = OVERRIDE_SCOPE;
153
-
154
- try {
155
- OVERRIDE_SCOPE = scope;
156
- return fn();
157
- } finally {
158
- OVERRIDE_SCOPE = prevScope;
159
- }
160
- };
161
-
162
- export const useContext = <T>(context: Context<T>): T => {
163
- const scope = OVERRIDE_SCOPE ?? CURRENT_CONSUMER?.scope ?? getFrameworkScope();
164
-
165
- if (scope === undefined) {
166
- throw new Error(
167
- 'useContext must be used within a signal hook, a withContext, or within a framework-specific context provider.',
168
- );
169
- }
170
-
171
- return scope.getContext(context) ?? (context as unknown as ContextImpl<T>).defaultValue;
172
- };
173
-
174
- export function forceGc(_signal: object) {
175
- const signal = _signal as DerivedSignal<any, any>;
176
- signal.scope?.forceGc(signal);
177
- }
@@ -1,217 +0,0 @@
1
- import WeakRef from '../weakref.js';
2
- import { Tracer, TRACER, TracerMeta } from '../trace.js';
3
- import { ReactiveValue, Signal, SignalEquals, SignalListener, SignalOptionsWithInit } from '../types.js';
4
- import { getUnknownSignalFnName } from './utils/debug-name.js';
5
- import { SignalScope } from './contexts.js';
6
- import { getSignal } from './get.js';
7
- import { Edge } from './edge.js';
8
- import { schedulePull, scheduleUnwatch } from './scheduling.js';
9
- import { hashValue } from './utils/hash.js';
10
- import { stringifyValue } from './utils/stringify.js';
11
-
12
- /**
13
- * This file contains computed signal base types and struct definitions.
14
- *
15
- * Computed signals are monomorphic to make them more efficient, but this also
16
- * means that multiple fields differ based on the type of the signal. Defining
17
- * them using this pattern rather than a class allows us to switch on the `type`
18
- * field to get strong typing in branches everywhere else.
19
- *
20
- * "Methods" for this struct are defined in other files for better organization.
21
- */
22
-
23
- export type SignalId = number;
24
-
25
- export const enum SignalState {
26
- Clean = 0,
27
- Pending = 1,
28
- Dirty = 2,
29
- MaybeDirty = 3,
30
- }
31
-
32
- export const enum SignalFlags {
33
- // State
34
- State = 0b11,
35
-
36
- // Properties
37
- isSubscription = 0b100,
38
- isListener = 0b1000,
39
- }
40
-
41
- let ID = 0;
42
-
43
- interface ListenerMeta {
44
- updatedAt: number;
45
- current: Set<SignalListener>;
46
-
47
- // Cached bound add method to avoid creating a new one on each call, this is
48
- // specifically for React hooks where useSyncExternalStore will resubscribe each
49
- // time if the method is not cached. This prevents us from having to add a
50
- // useCallback for the listener.
51
- cachedBoundAdd: (listener: SignalListener) => () => void;
52
- }
53
-
54
- /**
55
- * Shared definition for derived signals to reduce memory usage.
56
- * Contains configuration that's common across all instances of a reactive function.
57
- */
58
- export interface DerivedSignalDefinition<T, Args extends unknown[]> {
59
- compute: (...args: Args) => T;
60
- equals: SignalEquals<T>;
61
- shouldGC?: (signal: object, value: T, args: Args) => boolean;
62
- isSubscription: boolean;
63
- }
64
-
65
- export class DerivedSignal<T, Args extends unknown[]> implements Signal<ReactiveValue<T>> {
66
- // Bitmask containing state in the first 2 bits and boolean properties in the remaining bits
67
- private flags: number;
68
- scope: SignalScope | undefined = undefined;
69
-
70
- subs = new Map<WeakRef<DerivedSignal<any, any>>, Edge>();
71
- deps = new Map<DerivedSignal<any, any>, Edge>();
72
-
73
- ref: WeakRef<DerivedSignal<T, Args>> = new WeakRef(this);
74
-
75
- dirtyHead: Edge | undefined = undefined;
76
-
77
- updatedCount: number = 0;
78
- computedCount: number = 0;
79
-
80
- watchCount: number = 0;
81
-
82
- _listeners: ListenerMeta | null = null;
83
-
84
- key: SignalId | undefined;
85
- args: Args;
86
- value: ReactiveValue<T> | undefined;
87
-
88
- tracerMeta?: TracerMeta;
89
-
90
- // Reference to the shared definition
91
- def: DerivedSignalDefinition<T, Args>;
92
-
93
- constructor(
94
- definition: DerivedSignalDefinition<T, Args>,
95
- args: Args,
96
- key?: SignalId,
97
- scope?: SignalScope,
98
- opts?: Partial<SignalOptionsWithInit<T, Args>> & { tracer?: Tracer },
99
- ) {
100
- this.flags = (definition.isSubscription ? SignalFlags.isSubscription : 0) | SignalState.Dirty;
101
- this.scope = scope;
102
- this.key = key;
103
- this.args = args;
104
- this.def = definition;
105
- this.value = opts?.initValue as ReactiveValue<T>;
106
-
107
- if (TRACER) {
108
- this.tracerMeta = {
109
- id: opts?.id ?? key ?? hashValue([definition.compute, ID++]),
110
- desc: opts?.desc ?? definition.compute.name ?? getUnknownSignalFnName(definition.compute),
111
- params: args.map(arg => stringifyValue(arg)).join(', '),
112
- tracer: opts?.tracer,
113
- };
114
- }
115
- }
116
-
117
- get _state() {
118
- return this.flags & SignalFlags.State;
119
- }
120
-
121
- set _state(state: SignalState) {
122
- this.flags = (this.flags & ~SignalFlags.State) | state;
123
- }
124
-
125
- get _isListener() {
126
- return (this.flags & SignalFlags.isListener) !== 0;
127
- }
128
-
129
- set _isListener(isListener: boolean) {
130
- if (isListener) {
131
- this.flags |= SignalFlags.isListener;
132
- } else {
133
- this.flags &= ~SignalFlags.isListener;
134
- }
135
- }
136
-
137
- get listeners() {
138
- return (
139
- this._listeners ??
140
- (this._listeners = {
141
- updatedAt: 0,
142
- current: new Set(),
143
- cachedBoundAdd: this.addListener.bind(this),
144
- })
145
- );
146
- }
147
-
148
- get(): ReactiveValue<T> {
149
- return getSignal(this);
150
- }
151
-
152
- addListener(listener: SignalListener) {
153
- const { current } = this.listeners;
154
-
155
- if (!current.has(listener)) {
156
- if (!this._isListener) {
157
- this.watchCount++;
158
- this.flags |= SignalFlags.isListener;
159
- }
160
-
161
- schedulePull(this);
162
-
163
- current.add(listener);
164
- }
165
-
166
- return () => {
167
- if (current.has(listener)) {
168
- current.delete(listener);
169
-
170
- if (current.size === 0) {
171
- scheduleUnwatch(this);
172
- this.flags &= ~SignalFlags.isListener;
173
- }
174
- }
175
- };
176
- }
177
-
178
- // This method is used in React hooks specifically. It returns a bound add method
179
- // that is cached to avoid creating a new one on each call, and it eagerly sets
180
- // the listener as watched so that subscriptions that are accessed will be activated.
181
- addListenerLazy() {
182
- if (!this._isListener) {
183
- this.watchCount++;
184
- this.flags |= SignalFlags.isListener;
185
- }
186
-
187
- return this.listeners.cachedBoundAdd;
188
- }
189
- }
190
-
191
- export const runListeners = (signal: DerivedSignal<any, any>) => {
192
- const { listeners } = signal;
193
-
194
- if (listeners === null) {
195
- return;
196
- }
197
-
198
- const { current } = listeners;
199
-
200
- for (const listener of current) {
201
- listener();
202
- }
203
- };
204
-
205
- export const isSubscription = (signal: unknown): boolean => {
206
- return ((signal as any).flags & SignalFlags.isSubscription) !== 0;
207
- };
208
-
209
- export function createDerivedSignal<T, Args extends unknown[]>(
210
- def: DerivedSignalDefinition<T, Args>,
211
- args: Args = [] as any,
212
- key?: SignalId,
213
- scope?: SignalScope,
214
- opts?: Partial<SignalOptionsWithInit<T, Args>> & { tracer?: Tracer },
215
- ): DerivedSignal<T, Args> {
216
- return new DerivedSignal(def, args, key, scope, opts);
217
- }
@@ -1,91 +0,0 @@
1
- import { scheduleAsyncPull, schedulePull } from './scheduling.js';
2
- import { DerivedSignal, isSubscription, SignalState } from './derived.js';
3
- import { CURRENT_CONSUMER } from './get.js';
4
- import { Edge } from './edge.js';
5
-
6
- export function dirtySignal(signal: DerivedSignal<any, any>) {
7
- const prevState = signal._state;
8
-
9
- if (prevState === SignalState.Dirty) {
10
- return;
11
- }
12
-
13
- signal._state = SignalState.Dirty;
14
-
15
- if (prevState !== SignalState.MaybeDirty) {
16
- propagateDirty(signal);
17
- }
18
- }
19
-
20
- function propagateDirty(signal: DerivedSignal<any, any>) {
21
- if (CURRENT_CONSUMER === signal) {
22
- throw new Error(
23
- 'A signal was dirtied after it was consumed by the current function. This can cause race conditions and infinite rerenders and is not allowed.',
24
- );
25
- }
26
-
27
- if (isSubscription(signal)) {
28
- if (signal.watchCount > 0) {
29
- scheduleAsyncPull(signal);
30
- }
31
-
32
- // else do nothing, only schedule if connected
33
- } else {
34
- if (signal._isListener) {
35
- schedulePull(signal);
36
- }
37
-
38
- dirtySignalConsumers(signal.subs);
39
- signal.subs = new Map();
40
- }
41
- }
42
-
43
- export function dirtySignalConsumers(map: Map<WeakRef<DerivedSignal<any, any>>, Edge>) {
44
- for (const [subRef, edge] of map) {
45
- const sub = subRef.deref();
46
-
47
- if (sub === undefined || sub.computedCount !== edge.consumedAt) continue;
48
-
49
- const dirtyState = sub._state;
50
-
51
- switch (dirtyState) {
52
- case SignalState.Clean:
53
- sub._state = SignalState.MaybeDirty;
54
- sub.dirtyHead = edge;
55
- edge.nextDirty = undefined;
56
- propagateDirty(sub);
57
- break;
58
-
59
- case SignalState.Pending:
60
- case SignalState.MaybeDirty: {
61
- let subEdge = sub.dirtyHead!;
62
- const ord = edge.ord;
63
-
64
- if (subEdge.ord > ord) {
65
- sub.dirtyHead = edge;
66
- edge.nextDirty = subEdge;
67
-
68
- if (dirtyState === SignalState.Pending) {
69
- // If the signal is pending, the first edge is the halt edge. If the
70
- // new dirty edge is BEFORE the halt edge, then it means that something
71
- // changed before the current halt, so we need to cancel the current computation
72
- // and recompute.
73
- sub._state = SignalState.MaybeDirty;
74
- propagateDirty(sub);
75
- }
76
- } else {
77
- let nextDirty = subEdge.nextDirty;
78
-
79
- while (nextDirty !== undefined && nextDirty.ord < ord) {
80
- subEdge = nextDirty;
81
- nextDirty = subEdge.nextDirty;
82
- }
83
-
84
- edge.nextDirty = nextDirty;
85
- subEdge!.nextDirty = edge;
86
- }
87
- break;
88
- }
89
- }
90
- }
91
- }
@@ -1,109 +0,0 @@
1
- import { ReactivePromise } from './async.js';
2
- import type { DerivedSignal } from './derived.js';
3
-
4
- let CURRENT_ORD = 0;
5
-
6
- export const enum EdgeType {
7
- Signal = 0,
8
- Promise = 1,
9
- }
10
-
11
- export interface EdgeTypeDep {
12
- [EdgeType.Signal]: DerivedSignal<any, any>;
13
- [EdgeType.Promise]: ReactivePromise<any>;
14
- }
15
-
16
- interface BaseEdge {
17
- type: EdgeType;
18
- dep: EdgeTypeDep[EdgeType];
19
- ord: number;
20
- updatedAt: number;
21
- consumedAt: number;
22
-
23
- nextDirty: Edge | undefined;
24
- }
25
-
26
- export interface SignalEdge extends BaseEdge {
27
- type: EdgeType.Signal;
28
- dep: DerivedSignal<any, any>;
29
- }
30
-
31
- export interface PromiseEdge extends BaseEdge {
32
- type: EdgeType.Promise;
33
- dep: ReactivePromise<any>;
34
- }
35
-
36
- export type Edge = SignalEdge | PromiseEdge;
37
-
38
- export function createEdge<T extends EdgeType, R extends T extends EdgeType.Signal ? SignalEdge : PromiseEdge>(
39
- prevEdge: Edge | undefined,
40
- type: T,
41
- dep: EdgeTypeDep[T],
42
- updatedAt: number,
43
- consumedAt: number,
44
- ): R {
45
- if (prevEdge === undefined) {
46
- return {
47
- type,
48
- dep,
49
- ord: CURRENT_ORD++,
50
- updatedAt,
51
- consumedAt,
52
- nextDirty: undefined,
53
- } as R;
54
- }
55
-
56
- prevEdge.ord = CURRENT_ORD++;
57
- prevEdge.updatedAt = updatedAt;
58
- prevEdge.consumedAt = consumedAt;
59
- prevEdge.nextDirty = undefined;
60
- return prevEdge as R;
61
- }
62
-
63
- export function insertDirty(node: DerivedSignal<any, any>, edge: Edge) {
64
- const ord = edge.ord;
65
- let currentEdge = node.dirtyHead;
66
-
67
- if (currentEdge === undefined || currentEdge.ord > ord) {
68
- node.dirtyHead = edge;
69
- } else {
70
- let nextEdge = currentEdge.nextDirty;
71
-
72
- while (nextEdge !== undefined && nextEdge.ord < ord) {
73
- currentEdge = nextEdge;
74
- nextEdge = currentEdge.nextDirty;
75
- }
76
-
77
- currentEdge.nextDirty = edge;
78
- }
79
- }
80
-
81
- export function findAndRemoveDirty(
82
- sub: DerivedSignal<any, any>,
83
- dep: DerivedSignal<any, any> | ReactivePromise<any>,
84
- ): Edge | undefined {
85
- let edge = sub.dirtyHead;
86
-
87
- if (edge === undefined) {
88
- return undefined;
89
- }
90
-
91
- if (edge.dep === dep) {
92
- sub.dirtyHead = edge.nextDirty;
93
- return edge;
94
- }
95
-
96
- let nextLink = edge.nextDirty;
97
-
98
- while (nextLink !== undefined) {
99
- if (nextLink.dep === dep) {
100
- edge.nextDirty = nextLink.nextDirty;
101
- return nextLink;
102
- }
103
-
104
- edge = nextLink;
105
- nextLink = edge.nextDirty;
106
- }
107
-
108
- return undefined;
109
- }