@ersbeth/picoflow 1.1.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 (383) hide show
  1. package/.vscode/settings.json +3 -3
  2. package/CHANGELOG.md +43 -0
  3. package/README.md +2 -18
  4. package/biome.json +45 -35
  5. package/dist/picoflow.js +856 -1530
  6. package/dist/types/api/base/flowDisposable.d.ts +41 -0
  7. package/dist/types/api/base/flowDisposable.d.ts.map +1 -0
  8. package/dist/types/api/base/flowObservable.d.ts +27 -0
  9. package/dist/types/api/base/flowObservable.d.ts.map +1 -0
  10. package/dist/types/api/base/flowSubscribable.d.ts +79 -0
  11. package/dist/types/api/base/flowSubscribable.d.ts.map +1 -0
  12. package/dist/types/api/base/flowTracker.d.ts +8 -0
  13. package/dist/types/api/base/flowTracker.d.ts.map +1 -0
  14. package/dist/types/api/base/index.d.ts +5 -0
  15. package/dist/types/api/base/index.d.ts.map +1 -0
  16. package/dist/types/api/index.d.ts +3 -0
  17. package/dist/types/api/index.d.ts.map +1 -0
  18. package/dist/types/api/nodes/async/flowConstantAsync.d.ts +31 -0
  19. package/dist/types/api/nodes/async/flowConstantAsync.d.ts.map +1 -0
  20. package/dist/types/api/nodes/async/flowDerivationAsync.d.ts +37 -0
  21. package/dist/types/api/nodes/async/flowDerivationAsync.d.ts.map +1 -0
  22. package/dist/types/api/nodes/async/flowStateAsync.d.ts +41 -0
  23. package/dist/types/api/nodes/async/flowStateAsync.d.ts.map +1 -0
  24. package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts +30 -0
  25. package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts.map +1 -0
  26. package/dist/types/{flow → api}/nodes/async/index.d.ts +1 -2
  27. package/dist/types/api/nodes/async/index.d.ts.map +1 -0
  28. package/dist/types/api/nodes/collections/flowArray.d.ts +134 -0
  29. package/dist/types/api/nodes/collections/flowArray.d.ts.map +1 -0
  30. package/dist/types/api/nodes/collections/flowMap.d.ts +98 -0
  31. package/dist/types/api/nodes/collections/flowMap.d.ts.map +1 -0
  32. package/dist/types/api/nodes/collections/index.d.ts.map +1 -0
  33. package/dist/types/api/nodes/flowEffect.d.ts +28 -0
  34. package/dist/types/api/nodes/flowEffect.d.ts.map +1 -0
  35. package/dist/types/api/nodes/flowSignal.d.ts +25 -0
  36. package/dist/types/api/nodes/flowSignal.d.ts.map +1 -0
  37. package/dist/types/api/nodes/flowValue.d.ts +35 -0
  38. package/dist/types/api/nodes/flowValue.d.ts.map +1 -0
  39. package/dist/types/api/nodes/index.d.ts +8 -0
  40. package/dist/types/api/nodes/index.d.ts.map +1 -0
  41. package/dist/types/api/nodes/sync/flowConstant.d.ts +29 -0
  42. package/dist/types/api/nodes/sync/flowConstant.d.ts.map +1 -0
  43. package/dist/types/api/nodes/sync/flowDerivation.d.ts +36 -0
  44. package/dist/types/api/nodes/sync/flowDerivation.d.ts.map +1 -0
  45. package/dist/types/api/nodes/sync/flowState.d.ts +39 -0
  46. package/dist/types/api/nodes/sync/flowState.d.ts.map +1 -0
  47. package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts +28 -0
  48. package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts.map +1 -0
  49. package/dist/types/{flow → api}/nodes/sync/index.d.ts +1 -2
  50. package/dist/types/api/nodes/sync/index.d.ts.map +1 -0
  51. package/dist/types/api/nodes/utils.d.ts +22 -0
  52. package/dist/types/api/nodes/utils.d.ts.map +1 -0
  53. package/dist/types/base/disposable.d.ts +11 -0
  54. package/dist/types/base/disposable.d.ts.map +1 -0
  55. package/dist/types/base/executionStack.d.ts +14 -0
  56. package/dist/types/base/executionStack.d.ts.map +1 -0
  57. package/dist/types/base/index.d.ts +6 -0
  58. package/dist/types/base/index.d.ts.map +1 -0
  59. package/dist/types/base/node.d.ts +27 -0
  60. package/dist/types/base/node.d.ts.map +1 -0
  61. package/dist/types/base/observable.d.ts +37 -0
  62. package/dist/types/base/observable.d.ts.map +1 -0
  63. package/dist/types/base/observer.d.ts +25 -0
  64. package/dist/types/base/observer.d.ts.map +1 -0
  65. package/dist/types/converters/index.d.ts +2 -0
  66. package/dist/types/converters/index.d.ts.map +1 -0
  67. package/dist/types/converters/solid.d.ts +46 -0
  68. package/dist/types/converters/solid.d.ts.map +1 -0
  69. package/dist/types/index.d.ts +2 -63
  70. package/dist/types/index.d.ts.map +1 -1
  71. package/dist/types/nodes/arrayNode.d.ts +2 -0
  72. package/dist/types/nodes/arrayNode.d.ts.map +1 -0
  73. package/dist/types/nodes/effectNode.d.ts +2 -0
  74. package/dist/types/nodes/effectNode.d.ts.map +1 -0
  75. package/dist/types/nodes/index.d.ts +9 -0
  76. package/dist/types/nodes/index.d.ts.map +1 -0
  77. package/dist/types/nodes/mapNode.d.ts +2 -0
  78. package/dist/types/nodes/mapNode.d.ts.map +1 -0
  79. package/dist/types/nodes/signalNode.d.ts +2 -0
  80. package/dist/types/nodes/signalNode.d.ts.map +1 -0
  81. package/dist/types/nodes/valueAsyncNode.d.ts +2 -0
  82. package/dist/types/nodes/valueAsyncNode.d.ts.map +1 -0
  83. package/dist/types/nodes/valueNode.d.ts +2 -0
  84. package/dist/types/nodes/valueNode.d.ts.map +1 -0
  85. package/dist/types/nodes/valueSyncNode.d.ts +2 -0
  86. package/dist/types/nodes/valueSyncNode.d.ts.map +1 -0
  87. package/dist/types/schedulers/asyncResolver.d.ts +2 -0
  88. package/dist/types/schedulers/asyncResolver.d.ts.map +1 -0
  89. package/dist/types/schedulers/asyncScheduler.d.ts +2 -0
  90. package/dist/types/schedulers/asyncScheduler.d.ts.map +1 -0
  91. package/dist/types/schedulers/index.d.ts +5 -0
  92. package/dist/types/schedulers/index.d.ts.map +1 -0
  93. package/dist/types/schedulers/pendingError.d.ts +2 -0
  94. package/dist/types/schedulers/pendingError.d.ts.map +1 -0
  95. package/dist/types/schedulers/scheduler.d.ts +2 -0
  96. package/dist/types/schedulers/scheduler.d.ts.map +1 -0
  97. package/dist/types/schedulers/syncResolver.d.ts +2 -0
  98. package/dist/types/schedulers/syncResolver.d.ts.map +1 -0
  99. package/dist/types/schedulers/syncScheduler.d.ts +2 -0
  100. package/dist/types/schedulers/syncScheduler.d.ts.map +1 -0
  101. package/docs/.vitepress/config.mts +128 -93
  102. package/docs/api/functions/array.md +14 -37
  103. package/docs/api/functions/constant.md +13 -25
  104. package/docs/api/functions/constantAsync.md +69 -0
  105. package/docs/api/functions/derivation.md +14 -33
  106. package/docs/api/functions/derivationAsync.md +34 -0
  107. package/docs/api/functions/from.md +62 -153
  108. package/docs/api/functions/isDisposable.md +8 -30
  109. package/docs/api/functions/map.md +15 -36
  110. package/docs/api/functions/signal.md +8 -23
  111. package/docs/api/functions/state.md +43 -23
  112. package/docs/api/functions/stateAsync.md +69 -0
  113. package/docs/api/functions/subscribe.md +40 -0
  114. package/docs/api/functions/writableDerivation.md +33 -0
  115. package/docs/api/functions/writableDerivationAsync.md +34 -0
  116. package/docs/api/index.md +45 -102
  117. package/docs/api/interfaces/FlowArray.md +439 -0
  118. package/docs/api/interfaces/FlowConstant.md +220 -0
  119. package/docs/api/interfaces/FlowConstantAsync.md +221 -0
  120. package/docs/api/interfaces/FlowDerivation.md +241 -0
  121. package/docs/api/interfaces/FlowDerivationAsync.md +242 -0
  122. package/docs/api/interfaces/FlowDisposable.md +32 -38
  123. package/docs/api/interfaces/FlowEffect.md +64 -0
  124. package/docs/api/interfaces/FlowMap.md +374 -0
  125. package/docs/api/interfaces/FlowObservable.md +155 -0
  126. package/docs/api/interfaces/FlowSignal.md +156 -0
  127. package/docs/api/interfaces/FlowState.md +269 -0
  128. package/docs/api/interfaces/FlowStateAsync.md +268 -0
  129. package/docs/api/interfaces/FlowSubscribable.md +55 -0
  130. package/docs/api/interfaces/FlowTracker.md +61 -0
  131. package/docs/api/interfaces/FlowValue.md +222 -0
  132. package/docs/api/interfaces/FlowWritableDerivation.md +292 -0
  133. package/docs/api/interfaces/FlowWritableDerivationAsync.md +293 -0
  134. package/docs/api/type-aliases/DerivationFunction.md +28 -0
  135. package/docs/api/type-aliases/DerivationFunctionAsync.md +28 -0
  136. package/docs/api/type-aliases/FlowArrayAction.md +19 -8
  137. package/docs/api/type-aliases/FlowDataTracker.md +33 -0
  138. package/docs/api/type-aliases/FlowMapAction.md +48 -0
  139. package/docs/api/type-aliases/FlowOnDataListener.md +33 -0
  140. package/docs/api/type-aliases/FlowOnErrorListener.md +27 -0
  141. package/docs/api/type-aliases/FlowOnPendingListener.md +21 -0
  142. package/docs/api/type-aliases/FlowReadonly.md +22 -0
  143. package/docs/api/type-aliases/InitFunction.md +21 -0
  144. package/docs/api/type-aliases/InitFunctionAsync.md +21 -0
  145. package/docs/api/type-aliases/NotPromise.md +6 -3
  146. package/docs/api/type-aliases/UpdateFunction.md +27 -0
  147. package/docs/api/type-aliases/UpdateFunctionAsync.md +27 -0
  148. package/docs/api/typedoc-sidebar.json +1 -81
  149. package/docs/examples/examples.md +0 -2
  150. package/docs/guide/advanced/architecture.md +1234 -0
  151. package/docs/guide/advanced/migration-v2.md +204 -0
  152. package/docs/guide/advanced/solidjs.md +2 -88
  153. package/docs/guide/introduction/concepts.md +4 -3
  154. package/docs/guide/introduction/conventions.md +2 -33
  155. package/docs/guide/introduction/getting-started.md +28 -23
  156. package/docs/guide/introduction/lifecycle.md +16 -19
  157. package/docs/guide/primitives/array.md +102 -216
  158. package/docs/guide/primitives/constant.md +39 -212
  159. package/docs/guide/primitives/derivations.md +55 -122
  160. package/docs/guide/primitives/effects.md +155 -241
  161. package/docs/guide/primitives/map.md +64 -186
  162. package/docs/guide/primitives/overview.md +45 -128
  163. package/docs/guide/primitives/signal.md +51 -88
  164. package/docs/guide/primitives/state.md +34 -130
  165. package/package.json +56 -60
  166. package/src/api/base/flowDisposable.ts +44 -0
  167. package/src/api/base/flowObservable.ts +28 -0
  168. package/src/api/base/flowSubscribable.ts +87 -0
  169. package/src/api/base/flowTracker.ts +7 -0
  170. package/src/api/base/index.ts +4 -0
  171. package/src/{flow → api}/index.ts +0 -1
  172. package/src/api/nodes/async/flowConstantAsync.ts +36 -0
  173. package/src/api/nodes/async/flowDerivationAsync.ts +42 -0
  174. package/src/api/nodes/async/flowStateAsync.ts +47 -0
  175. package/src/api/nodes/async/flowWritableDerivationAsync.ts +33 -0
  176. package/src/{flow → api}/nodes/async/index.ts +1 -2
  177. package/src/api/nodes/collections/flowArray.ts +155 -0
  178. package/src/api/nodes/collections/flowMap.ts +115 -0
  179. package/src/api/nodes/flowEffect.ts +42 -0
  180. package/src/api/nodes/flowSignal.ts +28 -0
  181. package/src/api/nodes/flowValue.ts +36 -0
  182. package/src/api/nodes/index.ts +7 -0
  183. package/src/api/nodes/sync/flowConstant.ts +33 -0
  184. package/src/api/nodes/sync/flowDerivation.ts +41 -0
  185. package/src/api/nodes/sync/flowState.ts +45 -0
  186. package/src/api/nodes/sync/flowWritableDerivation.ts +31 -0
  187. package/src/{flow → api}/nodes/sync/index.ts +1 -2
  188. package/src/api/nodes/utils.ts +22 -0
  189. package/src/base/disposable.ts +18 -0
  190. package/src/base/executionStack.ts +42 -0
  191. package/src/base/index.ts +5 -0
  192. package/src/base/node.ts +98 -0
  193. package/src/base/observable.ts +87 -0
  194. package/src/base/observer.ts +51 -0
  195. package/src/converters/index.ts +1 -0
  196. package/src/converters/solid.ts +109 -0
  197. package/src/index.ts +2 -64
  198. package/src/nodes/arrayNode.ts +172 -0
  199. package/src/nodes/effectNode.ts +59 -0
  200. package/src/nodes/index.ts +8 -0
  201. package/src/nodes/mapNode.ts +127 -0
  202. package/src/nodes/signalNode.ts +21 -0
  203. package/src/nodes/valueAsyncNode.ts +88 -0
  204. package/src/nodes/valueNode.ts +144 -0
  205. package/src/nodes/valueSyncNode.ts +128 -0
  206. package/src/schedulers/asyncResolver.ts +78 -0
  207. package/src/schedulers/asyncScheduler.ts +66 -0
  208. package/src/schedulers/index.ts +4 -0
  209. package/src/schedulers/pendingError.ts +13 -0
  210. package/src/schedulers/scheduler.ts +9 -0
  211. package/src/schedulers/syncResolver.ts +69 -0
  212. package/src/schedulers/syncScheduler.ts +55 -0
  213. package/test/base/pendingError.test.ts +67 -0
  214. package/test/converters/solid.derivation.browser.test.tsx +69 -0
  215. package/test/converters/solid.node.test.ts +654 -0
  216. package/test/converters/solid.state.browser.test.tsx +1592 -0
  217. package/test/reactivity/flowSignal.test.ts +226 -0
  218. package/test/reactivity/nodes/async/asyncScheduler/asyncResolver.test.ts +593 -0
  219. package/test/reactivity/nodes/async/asyncScheduler/asyncScheduler.test.ts +317 -0
  220. package/test/reactivity/nodes/async/flowConstantAsync.test.ts +652 -0
  221. package/test/reactivity/nodes/async/flowDerivation.test.ts +898 -0
  222. package/test/reactivity/nodes/async/flowDerivationAsync.test.ts +1716 -0
  223. package/test/reactivity/nodes/async/flowStateAsync.test.ts +708 -0
  224. package/test/reactivity/nodes/async/flowWritableDerivationAsync.test.ts +614 -0
  225. package/test/reactivity/nodes/collections/flowArray.asyncStates.test.ts +1289 -0
  226. package/test/reactivity/nodes/collections/flowArray.scalars.test.ts +961 -0
  227. package/test/reactivity/nodes/collections/flowArray.states.test.ts +1035 -0
  228. package/test/reactivity/nodes/collections/flowMap.asyncStates.test.ts +960 -0
  229. package/test/reactivity/nodes/collections/flowMap.scalars.test.ts +775 -0
  230. package/test/reactivity/nodes/collections/flowMap.states.test.ts +958 -0
  231. package/test/reactivity/nodes/sync/flowConstant.test.ts +377 -0
  232. package/test/reactivity/nodes/sync/flowDerivation.test.ts +896 -0
  233. package/test/reactivity/nodes/sync/flowState.test.ts +341 -0
  234. package/test/reactivity/nodes/sync/flowWritableDerivation.test.ts +603 -0
  235. package/test/vitest.d.ts +10 -0
  236. package/tsconfig.json +31 -20
  237. package/typedoc.json +35 -35
  238. package/vite.config.ts +25 -23
  239. package/vitest.browser.config.ts +21 -0
  240. package/vitest.config.ts +12 -12
  241. package/.cursor/plans/unifier-flowresource-avec-flowderivation-c9506e24.plan.md +0 -372
  242. package/.cursor/plans/update-js-e795d61b.plan.md +0 -567
  243. package/dist/types/flow/base/flowDisposable.d.ts +0 -67
  244. package/dist/types/flow/base/flowDisposable.d.ts.map +0 -1
  245. package/dist/types/flow/base/flowEffect.d.ts +0 -127
  246. package/dist/types/flow/base/flowEffect.d.ts.map +0 -1
  247. package/dist/types/flow/base/flowGraph.d.ts +0 -97
  248. package/dist/types/flow/base/flowGraph.d.ts.map +0 -1
  249. package/dist/types/flow/base/flowSignal.d.ts +0 -134
  250. package/dist/types/flow/base/flowSignal.d.ts.map +0 -1
  251. package/dist/types/flow/base/flowTracker.d.ts +0 -15
  252. package/dist/types/flow/base/flowTracker.d.ts.map +0 -1
  253. package/dist/types/flow/base/index.d.ts +0 -7
  254. package/dist/types/flow/base/index.d.ts.map +0 -1
  255. package/dist/types/flow/base/utils.d.ts +0 -20
  256. package/dist/types/flow/base/utils.d.ts.map +0 -1
  257. package/dist/types/flow/collections/flowArray.d.ts +0 -148
  258. package/dist/types/flow/collections/flowArray.d.ts.map +0 -1
  259. package/dist/types/flow/collections/flowMap.d.ts +0 -224
  260. package/dist/types/flow/collections/flowMap.d.ts.map +0 -1
  261. package/dist/types/flow/collections/index.d.ts.map +0 -1
  262. package/dist/types/flow/index.d.ts +0 -4
  263. package/dist/types/flow/index.d.ts.map +0 -1
  264. package/dist/types/flow/nodes/async/flowConstantAsync.d.ts +0 -137
  265. package/dist/types/flow/nodes/async/flowConstantAsync.d.ts.map +0 -1
  266. package/dist/types/flow/nodes/async/flowDerivationAsync.d.ts +0 -137
  267. package/dist/types/flow/nodes/async/flowDerivationAsync.d.ts.map +0 -1
  268. package/dist/types/flow/nodes/async/flowNodeAsync.d.ts +0 -343
  269. package/dist/types/flow/nodes/async/flowNodeAsync.d.ts.map +0 -1
  270. package/dist/types/flow/nodes/async/flowReadonlyAsync.d.ts +0 -81
  271. package/dist/types/flow/nodes/async/flowReadonlyAsync.d.ts.map +0 -1
  272. package/dist/types/flow/nodes/async/flowStateAsync.d.ts +0 -111
  273. package/dist/types/flow/nodes/async/flowStateAsync.d.ts.map +0 -1
  274. package/dist/types/flow/nodes/async/index.d.ts.map +0 -1
  275. package/dist/types/flow/nodes/index.d.ts +0 -3
  276. package/dist/types/flow/nodes/index.d.ts.map +0 -1
  277. package/dist/types/flow/nodes/sync/flowConstant.d.ts +0 -108
  278. package/dist/types/flow/nodes/sync/flowConstant.d.ts.map +0 -1
  279. package/dist/types/flow/nodes/sync/flowDerivation.d.ts +0 -100
  280. package/dist/types/flow/nodes/sync/flowDerivation.d.ts.map +0 -1
  281. package/dist/types/flow/nodes/sync/flowNode.d.ts +0 -314
  282. package/dist/types/flow/nodes/sync/flowNode.d.ts.map +0 -1
  283. package/dist/types/flow/nodes/sync/flowReadonly.d.ts +0 -57
  284. package/dist/types/flow/nodes/sync/flowReadonly.d.ts.map +0 -1
  285. package/dist/types/flow/nodes/sync/flowState.d.ts +0 -96
  286. package/dist/types/flow/nodes/sync/flowState.d.ts.map +0 -1
  287. package/dist/types/flow/nodes/sync/index.d.ts.map +0 -1
  288. package/dist/types/solid/converters.d.ts +0 -57
  289. package/dist/types/solid/converters.d.ts.map +0 -1
  290. package/dist/types/solid/index.d.ts +0 -3
  291. package/dist/types/solid/index.d.ts.map +0 -1
  292. package/dist/types/solid/primitives.d.ts +0 -181
  293. package/dist/types/solid/primitives.d.ts.map +0 -1
  294. package/docs/api/classes/FlowArray.md +0 -489
  295. package/docs/api/classes/FlowConstant.md +0 -350
  296. package/docs/api/classes/FlowDerivation.md +0 -334
  297. package/docs/api/classes/FlowEffect.md +0 -100
  298. package/docs/api/classes/FlowMap.md +0 -512
  299. package/docs/api/classes/FlowObservable.md +0 -306
  300. package/docs/api/classes/FlowResource.md +0 -380
  301. package/docs/api/classes/FlowResourceAsync.md +0 -362
  302. package/docs/api/classes/FlowSignal.md +0 -160
  303. package/docs/api/classes/FlowState.md +0 -368
  304. package/docs/api/classes/FlowStream.md +0 -367
  305. package/docs/api/classes/FlowStreamAsync.md +0 -364
  306. package/docs/api/classes/SolidDerivation.md +0 -75
  307. package/docs/api/classes/SolidResource.md +0 -91
  308. package/docs/api/classes/SolidState.md +0 -71
  309. package/docs/api/classes/TrackingContext.md +0 -33
  310. package/docs/api/functions/effect.md +0 -49
  311. package/docs/api/functions/resource.md +0 -52
  312. package/docs/api/functions/resourceAsync.md +0 -50
  313. package/docs/api/functions/stream.md +0 -53
  314. package/docs/api/functions/streamAsync.md +0 -50
  315. package/docs/api/interfaces/SolidObservable.md +0 -19
  316. package/docs/api/type-aliases/FlowStreamDisposer.md +0 -15
  317. package/docs/api/type-aliases/FlowStreamSetter.md +0 -27
  318. package/docs/api/type-aliases/FlowStreamUpdater.md +0 -32
  319. package/docs/api/type-aliases/SolidGetter.md +0 -17
  320. package/docs/guide/primitives/resources.md +0 -858
  321. package/docs/guide/primitives/streams.md +0 -931
  322. package/src/flow/base/flowDisposable.ts +0 -71
  323. package/src/flow/base/flowEffect.ts +0 -171
  324. package/src/flow/base/flowGraph.ts +0 -288
  325. package/src/flow/base/flowSignal.ts +0 -207
  326. package/src/flow/base/flowTracker.ts +0 -17
  327. package/src/flow/base/index.ts +0 -6
  328. package/src/flow/base/utils.ts +0 -19
  329. package/src/flow/collections/flowArray.ts +0 -409
  330. package/src/flow/collections/flowMap.ts +0 -398
  331. package/src/flow/nodes/async/flowConstantAsync.ts +0 -142
  332. package/src/flow/nodes/async/flowDerivationAsync.ts +0 -143
  333. package/src/flow/nodes/async/flowNodeAsync.ts +0 -474
  334. package/src/flow/nodes/async/flowReadonlyAsync.ts +0 -81
  335. package/src/flow/nodes/async/flowStateAsync.ts +0 -116
  336. package/src/flow/nodes/await/advanced/index.ts +0 -5
  337. package/src/flow/nodes/await/advanced/resource.ts +0 -134
  338. package/src/flow/nodes/await/advanced/resourceAsync.ts +0 -109
  339. package/src/flow/nodes/await/advanced/stream.ts +0 -188
  340. package/src/flow/nodes/await/advanced/streamAsync.ts +0 -176
  341. package/src/flow/nodes/await/flowConstantAwait.ts +0 -154
  342. package/src/flow/nodes/await/flowDerivationAwait.ts +0 -154
  343. package/src/flow/nodes/await/flowNodeAwait.ts +0 -508
  344. package/src/flow/nodes/await/flowReadonlyAwait.ts +0 -89
  345. package/src/flow/nodes/await/flowStateAwait.ts +0 -130
  346. package/src/flow/nodes/await/index.ts +0 -5
  347. package/src/flow/nodes/index.ts +0 -3
  348. package/src/flow/nodes/sync/flowConstant.ts +0 -111
  349. package/src/flow/nodes/sync/flowDerivation.ts +0 -105
  350. package/src/flow/nodes/sync/flowNode.ts +0 -439
  351. package/src/flow/nodes/sync/flowReadonly.ts +0 -57
  352. package/src/flow/nodes/sync/flowState.ts +0 -101
  353. package/src/solid/converters.ts +0 -148
  354. package/src/solid/index.ts +0 -2
  355. package/src/solid/primitives.ts +0 -215
  356. package/test/base/flowEffect.test.ts +0 -108
  357. package/test/base/flowGraph.test.ts +0 -485
  358. package/test/base/flowSignal.test.ts +0 -372
  359. package/test/collections/flowArray.asyncStates.test.ts +0 -1553
  360. package/test/collections/flowArray.scalars.test.ts +0 -1129
  361. package/test/collections/flowArray.states.test.ts +0 -1365
  362. package/test/collections/flowMap.asyncStates.test.ts +0 -1105
  363. package/test/collections/flowMap.scalars.test.ts +0 -877
  364. package/test/collections/flowMap.states.test.ts +0 -1097
  365. package/test/nodes/async/flowConstantAsync.test.ts +0 -860
  366. package/test/nodes/async/flowDerivationAsync.test.ts +0 -1517
  367. package/test/nodes/async/flowStateAsync.test.ts +0 -1387
  368. package/test/nodes/await/advanced/resource.test.ts +0 -129
  369. package/test/nodes/await/advanced/resourceAsync.test.ts +0 -108
  370. package/test/nodes/await/advanced/stream.test.ts +0 -198
  371. package/test/nodes/await/advanced/streamAsync.test.ts +0 -196
  372. package/test/nodes/await/flowConstantAwait.test.ts +0 -643
  373. package/test/nodes/await/flowDerivationAwait.test.ts +0 -1583
  374. package/test/nodes/await/flowStateAwait.test.ts +0 -999
  375. package/test/nodes/mixed/derivation.test.ts +0 -1527
  376. package/test/nodes/sync/flowConstant.test.ts +0 -620
  377. package/test/nodes/sync/flowDerivation.test.ts +0 -1373
  378. package/test/nodes/sync/flowState.test.ts +0 -945
  379. package/test/solid/converters.test.ts +0 -721
  380. package/test/solid/primitives.test.ts +0 -1031
  381. /package/dist/types/{flow → api/nodes}/collections/index.d.ts +0 -0
  382. /package/docs/guide/advanced/{upgrading.md → migration-v1.md} +0 -0
  383. /package/src/{flow → api/nodes}/collections/index.ts +0 -0
@@ -1,71 +0,0 @@
1
- /**
2
- * Contract for objects that own resources and must be cleaned up explicitly.
3
- *
4
- * @remarks
5
- * Many PicoFlow primitives expose `dispose()` so you can tear down subscriptions,
6
- * listeners, or reactive links when they are no longer needed (e.g., component
7
- * unmount, feature teardown, test cleanup).
8
- *
9
- * Typical options:
10
- * - `{ self: true }` — dispose only this instance (dependents decide their own lifecycle).
11
- * - `{ self: false }` or omitted — also dispose dependents, if the implementation supports it.
12
- *
13
- * The exact cascade behavior depends on the concrete primitive; consult its docs.
14
- *
15
- * @example
16
- * ```typescript
17
- * const $state = state(0);
18
- * const fx = effect((t) => console.log($state.get(t)));
19
- *
20
- * $state.dispose(); // Common teardown path
21
- * $state.dispose({ self: true }); // Dispose only this instance if you want dependents to persist
22
- * ```
23
- *
24
- * @public
25
- */
26
- export interface FlowDisposable {
27
- /**
28
- * Disposes resources held by this object.
29
- *
30
- * @param options - Optional disposal behavior.
31
- * @param options.self - When true, dispose only this object. When false or
32
- * omitted, the implementation may also dispose dependents.
33
- *
34
- * @remarks
35
- * Use `dispose()` during teardown (unmount, test cleanup, feature shutdown).
36
- * Calling `dispose()` more than once may throw; behavior is defined by the
37
- * concrete implementation.
38
- *
39
- * @throws Error if the object has already been disposed (implementation-specific).
40
- */
41
- dispose(options?: { self: boolean }): void;
42
- }
43
-
44
- /**
45
- * Runtime type guard that checks whether an object is disposable.
46
- *
47
- * @param obj - Value to test.
48
- * @returns `true` if `obj` exposes a callable `dispose`; otherwise `false`.
49
- *
50
- * @remarks
51
- * Use this for defensive cleanup in mixed collections or optional resources.
52
- * It performs a runtime shape check; no assumptions about specific types are made.
53
- *
54
- * @example
55
- * ```typescript
56
- * function cleanup(items: unknown[]) {
57
- * for (const item of items) {
58
- * if (isDisposable(item)) item.dispose();
59
- * }
60
- * }
61
- * ```
62
- *
63
- * @public
64
- */
65
- export function isDisposable(obj: unknown): obj is FlowDisposable {
66
- return (
67
- obj !== null &&
68
- obj !== undefined &&
69
- typeof (obj as FlowDisposable).dispose === "function"
70
- );
71
- }
@@ -1,171 +0,0 @@
1
- import { FlowGraph } from "./flowGraph";
2
- import type { FlowSignal } from "./flowSignal";
3
- import type { FlowTracker } from "./flowTracker";
4
-
5
- /**
6
- * Runs side-effect code in response to reactive state changes.
7
- *
8
- * @remarks
9
- * A `FlowEffect` is the bridge between reactive data and the outside world
10
- * (UI updates, logging, network calls, timers, etc.). It executes a callback
11
- * with a tracking context so you can choose which observables/signals should
12
- * re-trigger the effect:
13
- *
14
- * - Use `observable.get(t)` or `signal.watch(t)` to create dependencies.
15
- * - Use `observable.pick()` for untracked reads that should not re-run the effect.
16
- *
17
- * The callback runs immediately when the effect is created and re-runs whenever
18
- * any tracked dependency changes. The effect itself is the tracking context
19
- * (it implements `FlowTracker`), so `t` in your callback is the effect instance.
20
- *
21
- * Async callbacks are supported: if the callback returns a promise, the effect
22
- * awaits it before finishing the current run. A later change can re-run the
23
- * effect even if a previous async run is still pending, so write idempotent
24
- * side effects when working with async flows.
25
- *
26
- * @example
27
- * ```typescript
28
- * // Mixed tracked/untracked reads
29
- * const fx = effect((t) => {
30
- * const tracked = $stateA.get(t); // tracked -> re-runs when $stateA changes
31
- * const snapshot = $config.pick(); // untracked -> does not re-run on changes
32
- * console.log(tracked, snapshot);
33
- * });
34
- *
35
- * // Async work
36
- * const fxAsync = effect(async (t) => {
37
- * const userId = $userId.get(t);
38
- * const profile = await fetchProfile(userId);
39
- * renderProfile(profile);
40
- * });
41
- * ```
42
- *
43
- * @public
44
- */
45
- export class FlowEffect {
46
- private _disposed = false;
47
- private _dependencies = new Set<FlowSignal>();
48
- private _apply: (t: FlowTracker) => void | Promise<void>;
49
- settled: Promise<void>;
50
-
51
- /**
52
- * Creates a new effect and runs it once immediately.
53
- *
54
- * @param apply - Side-effect function receiving the tracking context (`t`).
55
- * It can be sync or async (returning `Promise<void>`).
56
- *
57
- * @remarks
58
- * Use `t` to opt-in to reactive tracking:
59
- * - `observable.get(t)` / `signal.watch(t)` to re-run when they change
60
- * - `observable.pick()` for reads that should not re-run the effect
61
- *
62
- * The effect schedules its first run during construction. Each subsequent
63
- * change to a tracked dependency queues another run.
64
- *
65
- * @public
66
- */
67
- constructor(apply: (t: FlowTracker) => void | Promise<void>) {
68
- this._apply = apply;
69
- this.settled = FlowGraph.requestRead(() => this._exec());
70
- }
71
-
72
- /**
73
- * Stops the effect and detaches it from all tracked dependencies.
74
- *
75
- * @remarks
76
- * Call this when the effect's work is no longer needed (e.g., component
77
- * unmount, teardown of a feature). After disposal:
78
- * - The effect will not re-run.
79
- * - All dependency links are removed.
80
- * - Calling `dispose()` again throws an error.
81
- *
82
- * @example
83
- * ```typescript
84
- * const fx = effect((t) => $signal.watch(t));
85
- * // ... later
86
- * fx.dispose();
87
- * ```
88
- *
89
- * @public
90
- */
91
- public dispose(): void {
92
- if (this._disposed) throw new Error("[PicoFlow] Effect is disposed");
93
- Array.from(this._dependencies).forEach((dependency) => {
94
- this._unregisterDependency(dependency);
95
- });
96
- this._disposed = true;
97
- }
98
-
99
- /**
100
- * Whether the effect has been disposed.
101
- *
102
- * @returns `true` once disposal has run; `false` while the effect is active.
103
- *
104
- * @public
105
- */
106
- public get disposed(): boolean {
107
- return this._disposed;
108
- }
109
-
110
- /** @internal */ async _requestExec(): Promise<void> {
111
- this.settled = this._exec();
112
- return this.settled;
113
- }
114
-
115
- /** @internal */ _registerDependency(dependency: FlowSignal): void {
116
- this._dependencies.add(dependency);
117
- dependency._registerEffect(this);
118
- }
119
-
120
- /** @internal */ _unregisterDependency(dependency: FlowSignal): void {
121
- this._dependencies.delete(dependency);
122
- dependency._unregisterEffect(this);
123
- }
124
-
125
- private async _exec(): Promise<void> {
126
- if (this._disposed)
127
- /* v8 ignore next 1 */
128
- throw new Error("[PicoFlow] Effect is disposed");
129
-
130
- const result = this._apply(this);
131
- if (result instanceof Promise) {
132
- await result;
133
- }
134
- }
135
- }
136
-
137
- /**
138
- * Creates a reactive effect that runs now and re-runs when its tracked
139
- * dependencies change.
140
- *
141
- * @param fn - Side-effect function that receives the tracking context (`t`).
142
- * @returns A new {@link FlowEffect}.
143
- *
144
- * @remarks
145
- * Use an effect when you need to react to state changes with side effects
146
- * (UI updates, logging, network calls, timers). For computing derived values,
147
- * prefer derivations; for one-off work, use a normal function.
148
- *
149
- * - Track dependencies with `observable.get(t)` or `signal.watch(t)`.
150
- * - Read without tracking using `observable.pick()`.
151
- * - Async callbacks are supported; return a promise if you `await` inside.
152
- *
153
- * @example
154
- * ```typescript
155
- * const $count = state(0);
156
- *
157
- * const fx = effect((t) => {
158
- * console.log("Count is:", $count.get(t));
159
- * });
160
- *
161
- * $count.set(1); // Logs "Count is: 1"
162
- * $count.set(2); // Logs "Count is: 2"
163
- *
164
- * fx.dispose(); // Stop reacting
165
- * ```
166
- *
167
- * @public
168
- */
169
- export function effect(fn: (t: FlowTracker) => void): FlowEffect {
170
- return new FlowEffect(fn);
171
- }
@@ -1,288 +0,0 @@
1
- import type { FlowEffect } from "./flowEffect";
2
-
3
- /**
4
- * Represents a queued read operation in the reactive system.
5
- *
6
- * @remarks
7
- * This interface is used internally to coordinate read operations. Most users
8
- * will not interact with it directly.
9
- *
10
- * @internal
11
- */
12
- export interface ReadRequest<T> {
13
- type: "read";
14
- promise: Promise<T>;
15
- resolve: (value: T) => void;
16
- reject: (error: Error) => void;
17
- read: () => T;
18
- }
19
-
20
- /**
21
- * Represents a queued trigger notification in the reactive system.
22
- *
23
- * @remarks
24
- * This interface is used internally to coordinate signal triggers. Most users
25
- * will not interact with it directly.
26
- *
27
- * @internal
28
- */
29
- export interface TriggerRequest {
30
- type: "trigger";
31
- promise: Promise<void>;
32
- resolve: () => void;
33
- reject: (error: Error) => void;
34
- notify: () => void;
35
- }
36
-
37
- /**
38
- * Represents a queued write operation in the reactive system.
39
- *
40
- * @remarks
41
- * This interface is used internally to coordinate write operations with update
42
- * logic. Most users will not interact with it directly.
43
- *
44
- * @internal
45
- */
46
- export interface WriteRequest {
47
- type: "write";
48
- promise: Promise<void>;
49
- resolve: () => void;
50
- reject: (error: Error) => void;
51
- notify: () => void;
52
- update: () => boolean | Promise<boolean>;
53
- }
54
-
55
- /**
56
- * Union type representing any queued operation in the reactive system.
57
- *
58
- * @remarks
59
- * This type is used internally to coordinate different types of reactive
60
- * operations (reads, writes, triggers). Most users will not interact with it
61
- * directly.
62
- *
63
- * @internal
64
- */
65
- // biome-ignore lint/suspicious/noExplicitAny: we don't need to know the type of the value
66
- export type ActionRequest = ReadRequest<any> | TriggerRequest | WriteRequest;
67
-
68
- /**
69
- * Coordinates reactive operations (reads, writes, triggers, effects).
70
- *
71
- * @remarks
72
- * FlowGraph manages the execution order of reactive operations to ensure
73
- * consistent state updates. It queues operations and processes them in a
74
- * controlled sequence, executing effects after state changes complete.
75
- *
76
- * Most users will not interact with FlowGraph directly; reactive primitives
77
- * use it internally. The `clear()` method may be useful for testing scenarios
78
- * where you need to reset the internal state between tests.
79
- *
80
- * @public
81
- */
82
- export class FlowGraph {
83
- private static _effectsQueue: FlowEffect[] = [];
84
- private static _actionQueue: ActionRequest[] = [];
85
- private static _processingActionQueue = false;
86
-
87
- /**
88
- * Resets all internal queues and processing state.
89
- *
90
- * @remarks
91
- * Use this method primarily for testing scenarios where you need to ensure
92
- * a clean state between test runs. It clears pending effects and queued
93
- * operations.
94
- *
95
- * @example
96
- * ```typescript
97
- * beforeEach(() => {
98
- * FlowGraph.clear();
99
- * });
100
- * ```
101
- *
102
- * @public
103
- */
104
- static clear(): void {
105
- FlowGraph._effectsQueue = [];
106
- FlowGraph._actionQueue = [];
107
- FlowGraph._processingActionQueue = false;
108
- }
109
-
110
- /**
111
- * Queues a trigger notification for processing.
112
- *
113
- * @param notify - Function to call when the trigger is processed.
114
- * @returns A promise that resolves after the trigger is processed.
115
- *
116
- * @remarks
117
- * This method is used internally by reactive primitives to coordinate
118
- * signal triggers. The promise resolves after all associated effects
119
- * have been executed.
120
- *
121
- * @public
122
- */
123
- static requestTrigger(notify: () => void): Promise<void> {
124
- const promiseWithResolvers = Promise.withResolvers<void>();
125
- FlowGraph._actionQueue.push({
126
- ...promiseWithResolvers,
127
- type: "trigger",
128
- notify,
129
- });
130
- FlowGraph._processActionQueue();
131
- return promiseWithResolvers.promise;
132
- }
133
-
134
- /**
135
- * Queues a read operation for processing.
136
- *
137
- * @param read - Function that performs the read operation.
138
- * @returns A promise that resolves with the read value.
139
- *
140
- * @remarks
141
- * This method is used internally by reactive primitives to coordinate
142
- * read operations. The read function is executed and its result (or promise)
143
- * is returned.
144
- *
145
- * @public
146
- */
147
- static requestRead<T>(read: () => T | Promise<T>): Promise<T> {
148
- const promiseWithResolvers = Promise.withResolvers<T>();
149
- FlowGraph._actionQueue.push({
150
- ...promiseWithResolvers,
151
- type: "read",
152
- read,
153
- });
154
- FlowGraph._processActionQueue();
155
- return promiseWithResolvers.promise;
156
- }
157
-
158
- /**
159
- * Queues a write operation with update logic for processing.
160
- *
161
- * @param notify - Function to call if the update succeeds.
162
- * @param update - Function that performs the update and returns whether
163
- * it changed the value.
164
- * @returns A promise that resolves after the write is processed.
165
- *
166
- * @remarks
167
- * This method is used internally by reactive primitives to coordinate
168
- * write operations. The update function is executed, and if it returns true
169
- * (or a promise resolving to true), the notify function is called to
170
- * trigger dependent effects.
171
- *
172
- * @public
173
- */
174
- static requestWrite(
175
- notify: () => void,
176
- update: () => boolean | Promise<boolean>,
177
- ): Promise<void> {
178
- const promiseWithResolvers = Promise.withResolvers<void>();
179
- FlowGraph._actionQueue.push({
180
- ...promiseWithResolvers,
181
- type: "write",
182
- notify,
183
- update,
184
- });
185
- FlowGraph._processActionQueue();
186
- return promiseWithResolvers.promise;
187
- }
188
-
189
- /**
190
- * Queues effects for execution after the current operation completes.
191
- *
192
- * @param effects - Array of effects to queue for execution.
193
- *
194
- * @remarks
195
- * This method is used internally by reactive primitives to schedule effect
196
- * execution. Effects are executed after the current read/write/trigger
197
- * operation completes, ensuring proper ordering of reactive updates.
198
- *
199
- * @public
200
- */
201
- static pushEffects(effects: FlowEffect[]): void {
202
- FlowGraph._effectsQueue.push(...effects);
203
- }
204
-
205
- /** @internal */
206
- private static _processActionQueue = async () => {
207
- if (FlowGraph._processingActionQueue) return;
208
- FlowGraph._processingActionQueue = true;
209
-
210
- while (FlowGraph._actionQueue.length > 0) {
211
- const actionRequest = FlowGraph._actionQueue.shift();
212
- if (!actionRequest) break;
213
-
214
- // Process read operation
215
- if (actionRequest.type === "read") {
216
- try {
217
- const read = actionRequest.read();
218
-
219
- let value: unknown;
220
- if (read instanceof Promise) {
221
- value = await read;
222
- } else {
223
- value = read;
224
- }
225
- actionRequest.resolve(value);
226
- } catch (error: unknown) {
227
- const safeError =
228
- error instanceof Error ? error : new Error(String(error));
229
- actionRequest.reject(safeError);
230
- }
231
- continue; // stop here
232
- }
233
-
234
- // Process write operation
235
- if (actionRequest.type === "write") {
236
- try {
237
- const updateResult = actionRequest.update();
238
-
239
- let updated = false;
240
- if (updateResult instanceof Promise) {
241
- updated = await updateResult;
242
- } else {
243
- updated = updateResult;
244
- }
245
-
246
- if (!updated) {
247
- actionRequest.resolve();
248
- continue;
249
- }
250
-
251
- actionRequest.notify();
252
- } catch (error: unknown) {
253
- const safeError =
254
- error instanceof Error ? error : new Error(String(error));
255
- actionRequest.reject(safeError);
256
- continue;
257
- }
258
- }
259
-
260
- // Process trigger operation
261
- if (actionRequest.type === "trigger") {
262
- actionRequest.notify();
263
- }
264
-
265
- // Process effects
266
- let effectError: Error | null = null;
267
- for (const effect of FlowGraph._effectsQueue) {
268
- try {
269
- await effect._requestExec();
270
- } catch (error: unknown) {
271
- effectError =
272
- error instanceof Error ? error : new Error(String(error));
273
- break;
274
- }
275
- }
276
-
277
- FlowGraph._effectsQueue = [];
278
-
279
- if (effectError) {
280
- actionRequest.reject(effectError);
281
- } else {
282
- actionRequest.resolve();
283
- }
284
- }
285
-
286
- FlowGraph._processingActionQueue = false;
287
- };
288
- }