@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,485 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from "vitest";
2
- import { effect, FlowGraph } from "#package";
3
-
4
- describe("FlowGraph", () => {
5
- beforeEach(() => {
6
- FlowGraph.clear();
7
- });
8
-
9
- describe("unit", () => {
10
- describe("clear", () => {
11
- it("should reset all internal queues and processing state", () => {
12
- // Use FlowGraph methods to populate queues
13
- const notify = vi.fn();
14
- FlowGraph.requestTrigger(notify);
15
- FlowGraph.requestRead(() => 42);
16
-
17
- // Clear should reset everything
18
- FlowGraph.clear();
19
-
20
- // After clear, new operations should work without interference
21
- const newNotify = vi.fn();
22
- const promise = FlowGraph.requestTrigger(newNotify);
23
- expect(promise).toBeInstanceOf(Promise);
24
- });
25
-
26
- it("should allow multiple clear calls without errors", () => {
27
- expect(() => {
28
- FlowGraph.clear();
29
- FlowGraph.clear();
30
- FlowGraph.clear();
31
- }).not.toThrow();
32
- });
33
- });
34
- });
35
-
36
- describe("integration", () => {
37
- describe("requestRead", () => {
38
- it("should process read operations synchronously", async () => {
39
- const readFn = vi.fn(() => 42);
40
- const promise = FlowGraph.requestRead(readFn);
41
-
42
- expect(readFn).toHaveBeenCalled();
43
- const result = await promise;
44
- expect(result).toBe(42);
45
- });
46
-
47
- it("should process read operations asynchronously", async () => {
48
- const readFn = vi.fn(async () => {
49
- await new Promise((resolve) => setTimeout(resolve, 10));
50
- return 100;
51
- });
52
- const promise = FlowGraph.requestRead(readFn);
53
-
54
- const result = await promise;
55
- expect(result).toBe(100);
56
- });
57
-
58
- it("should resolve promise with read value", async () => {
59
- const value = "test-value";
60
- const promise = FlowGraph.requestRead(() => value);
61
-
62
- await expect(promise).resolves.toBe(value);
63
- });
64
-
65
- it("should process read operations in order", async () => {
66
- const executionOrder: number[] = [];
67
-
68
- const promise1 = FlowGraph.requestRead(() => {
69
- executionOrder.push(1);
70
- return 1;
71
- });
72
-
73
- const promise2 = FlowGraph.requestRead(() => {
74
- executionOrder.push(2);
75
- return 2;
76
- });
77
-
78
- const promise3 = FlowGraph.requestRead(() => {
79
- executionOrder.push(3);
80
- return 3;
81
- });
82
-
83
- await Promise.all([promise1, promise2, promise3]);
84
-
85
- expect(executionOrder).toEqual([1, 2, 3]);
86
- });
87
-
88
- it("should stop processing after read operation", async () => {
89
- const effectFn = vi.fn();
90
- const $effect = effect(() => {
91
- effectFn();
92
- });
93
-
94
- FlowGraph.pushEffects([$effect]);
95
-
96
- // Read should stop processing, so effects shouldn't execute
97
- await FlowGraph.requestRead(() => 42);
98
-
99
- // Wait a bit to ensure effects don't execute
100
- await new Promise((resolve) => setTimeout(resolve, 50));
101
-
102
- // Effect should not have been executed by the read operation
103
- expect(effectFn).toHaveBeenCalledTimes(1); // Only initial execution
104
- });
105
- });
106
-
107
- describe("requestTrigger", () => {
108
- it("should process trigger operations", async () => {
109
- const notify = vi.fn();
110
- const promise = FlowGraph.requestTrigger(notify);
111
-
112
- await promise;
113
- expect(notify).toHaveBeenCalled();
114
- });
115
-
116
- it("should call notify function when processing trigger", async () => {
117
- const notify = vi.fn();
118
- await FlowGraph.requestTrigger(notify);
119
-
120
- expect(notify).toHaveBeenCalledTimes(1);
121
- });
122
-
123
- it("should resolve promise after trigger is processed", async () => {
124
- const notify = vi.fn();
125
- const promise = FlowGraph.requestTrigger(notify);
126
-
127
- await expect(promise).resolves.toBeUndefined();
128
- expect(notify).toHaveBeenCalled();
129
- });
130
-
131
- it("should process multiple triggers in order", async () => {
132
- const executionOrder: string[] = [];
133
- const notify1 = vi.fn(() => executionOrder.push("trigger1"));
134
- const notify2 = vi.fn(() => executionOrder.push("trigger2"));
135
- const notify3 = vi.fn(() => executionOrder.push("trigger3"));
136
-
137
- const promise1 = FlowGraph.requestTrigger(notify1);
138
- const promise2 = FlowGraph.requestTrigger(notify2);
139
- const promise3 = FlowGraph.requestTrigger(notify3);
140
-
141
- await Promise.all([promise1, promise2, promise3]);
142
-
143
- expect(executionOrder).toEqual(["trigger1", "trigger2", "trigger3"]);
144
- });
145
-
146
- it("should execute effects after trigger notification", async () => {
147
- const notify = vi.fn();
148
- const effectFn = vi.fn();
149
- const $effect = effect(() => {
150
- effectFn();
151
- });
152
-
153
- FlowGraph.pushEffects([$effect]);
154
-
155
- await FlowGraph.requestTrigger(notify);
156
-
157
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2)); // Initial + after trigger
158
- });
159
- });
160
-
161
- describe("requestWrite", () => {
162
- it("should process write operations with sync update", async () => {
163
- const notify = vi.fn();
164
- const update = vi.fn(() => true);
165
- const promise = FlowGraph.requestWrite(notify, update);
166
-
167
- await promise;
168
- expect(update).toHaveBeenCalled();
169
- expect(notify).toHaveBeenCalled();
170
- });
171
-
172
- it("should process write operations with async update", async () => {
173
- const notify = vi.fn();
174
- const update = vi.fn(async () => {
175
- await new Promise((resolve) => setTimeout(resolve, 10));
176
- return true;
177
- });
178
- const promise = FlowGraph.requestWrite(notify, update);
179
-
180
- await promise;
181
- expect(update).toHaveBeenCalled();
182
- expect(notify).toHaveBeenCalled();
183
- });
184
-
185
- it("should call notify only when update returns true", async () => {
186
- const notify1 = vi.fn();
187
- const notify2 = vi.fn();
188
- const notify3 = vi.fn();
189
-
190
- await FlowGraph.requestWrite(notify1, () => true);
191
- await FlowGraph.requestWrite(notify2, () => false);
192
- await FlowGraph.requestWrite(notify3, () => true);
193
-
194
- expect(notify1).toHaveBeenCalledTimes(1);
195
- expect(notify2).not.toHaveBeenCalled();
196
- expect(notify3).toHaveBeenCalledTimes(1);
197
- });
198
-
199
- it("should not call notify when update returns false", async () => {
200
- const notify = vi.fn();
201
- await FlowGraph.requestWrite(notify, () => false);
202
-
203
- expect(notify).not.toHaveBeenCalled();
204
- });
205
-
206
- it("should resolve promise after write is processed", async () => {
207
- const notify = vi.fn();
208
- const update = vi.fn(() => true);
209
- const promise = FlowGraph.requestWrite(notify, update);
210
-
211
- await expect(promise).resolves.toBeUndefined();
212
- });
213
-
214
- it("should execute effects after write notification", async () => {
215
- const notify = vi.fn();
216
- const effectFn = vi.fn();
217
- const $effect = effect(() => {
218
- effectFn();
219
- });
220
-
221
- FlowGraph.pushEffects([$effect]);
222
-
223
- await FlowGraph.requestWrite(notify, () => true);
224
-
225
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2)); // Initial + after write
226
- });
227
-
228
- it("should not execute effects when update returns false", async () => {
229
- const notify = vi.fn();
230
- const effectFn = vi.fn();
231
- const $effect = effect(() => {
232
- effectFn();
233
- });
234
-
235
- FlowGraph.pushEffects([$effect]);
236
-
237
- await FlowGraph.requestWrite(notify, () => false);
238
-
239
- // Wait to ensure effects don't execute
240
- await new Promise((resolve) => setTimeout(resolve, 50));
241
-
242
- expect(effectFn).toHaveBeenCalledTimes(1); // Only initial execution
243
- });
244
- });
245
-
246
- describe("pushEffects", () => {
247
- it("should queue effects for execution", async () => {
248
- const effectFn1 = vi.fn();
249
- const effectFn2 = vi.fn();
250
- const $effect1 = effect(() => {
251
- effectFn1();
252
- });
253
- const $effect2 = effect(() => {
254
- effectFn2();
255
- });
256
-
257
- FlowGraph.pushEffects([$effect1, $effect2]);
258
-
259
- const notify = vi.fn();
260
- await FlowGraph.requestTrigger(notify);
261
-
262
- await vi.waitFor(() => {
263
- expect(effectFn1).toHaveBeenCalledTimes(2); // Initial + queued
264
- expect(effectFn2).toHaveBeenCalledTimes(2); // Initial + queued
265
- });
266
- });
267
-
268
- it("should execute queued effects after current operation", async () => {
269
- const effectFn = vi.fn();
270
- const $effect = effect(() => {
271
- effectFn();
272
- });
273
-
274
- FlowGraph.pushEffects([$effect]);
275
-
276
- const notify = vi.fn();
277
- await FlowGraph.requestTrigger(notify);
278
-
279
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
280
- });
281
-
282
- it("should execute multiple effects in order", async () => {
283
- const executionOrder: string[] = [];
284
- const $effect1 = effect(() => {
285
- executionOrder.push("effect1");
286
- });
287
- const $effect2 = effect(() => {
288
- executionOrder.push("effect2");
289
- });
290
- const $effect3 = effect(() => {
291
- executionOrder.push("effect3");
292
- });
293
-
294
- FlowGraph.pushEffects([$effect1, $effect2, $effect3]);
295
-
296
- const notify = vi.fn();
297
- await FlowGraph.requestTrigger(notify);
298
-
299
- await vi.waitFor(() =>
300
- expect(executionOrder.length).toBeGreaterThan(3),
301
- );
302
-
303
- // Check that effects execute in order (after initial executions)
304
- const lastThree = executionOrder.slice(-3);
305
- expect(lastThree).toEqual(["effect1", "effect2", "effect3"]);
306
- });
307
-
308
- it("should clear effects queue after execution", async () => {
309
- const effectFn1 = vi.fn();
310
- const effectFn2 = vi.fn();
311
- const $effect1 = effect(() => {
312
- effectFn1();
313
- });
314
- const $effect2 = effect(() => {
315
- effectFn2();
316
- });
317
-
318
- FlowGraph.pushEffects([$effect1, $effect2]);
319
-
320
- const notify1 = vi.fn();
321
- await FlowGraph.requestTrigger(notify1);
322
-
323
- await vi.waitFor(() => {
324
- expect(effectFn1).toHaveBeenCalledTimes(2);
325
- expect(effectFn2).toHaveBeenCalledTimes(2);
326
- });
327
-
328
- // Push effects again and trigger - should execute again
329
- FlowGraph.pushEffects([$effect1, $effect2]);
330
-
331
- const notify2 = vi.fn();
332
- await FlowGraph.requestTrigger(notify2);
333
-
334
- await vi.waitFor(() => {
335
- expect(effectFn1).toHaveBeenCalledTimes(3);
336
- expect(effectFn2).toHaveBeenCalledTimes(3);
337
- });
338
- });
339
-
340
- it("should handle async effects", async () => {
341
- const executionOrder: string[] = [];
342
- const $effect = effect(async () => {
343
- executionOrder.push("effect-start");
344
- await new Promise((resolve) => setTimeout(resolve, 10));
345
- executionOrder.push("effect-end");
346
- });
347
-
348
- FlowGraph.pushEffects([$effect]);
349
-
350
- const notify = vi.fn();
351
- const promise = FlowGraph.requestTrigger(notify);
352
-
353
- executionOrder.push("trigger-called");
354
-
355
- await promise;
356
- executionOrder.push("trigger-resolved");
357
-
358
- await vi.waitFor(() => expect(executionOrder).toContain("effect-end"));
359
-
360
- expect(executionOrder).toContain("effect-start");
361
- expect(executionOrder).toContain("effect-end");
362
- });
363
- });
364
-
365
- describe("operation ordering", () => {
366
- it("should process operations in correct order (read stops, write/trigger continue)", async () => {
367
- const executionOrder: string[] = [];
368
- const effectFn = vi.fn(() => executionOrder.push("effect"));
369
- const $effect = effect(() => {
370
- effectFn();
371
- });
372
-
373
- FlowGraph.pushEffects([$effect]);
374
-
375
- // Read should stop processing
376
- await FlowGraph.requestRead(() => {
377
- executionOrder.push("read");
378
- return 1;
379
- });
380
-
381
- executionOrder.push("after-read");
382
-
383
- // Write should continue and execute effects
384
- await FlowGraph.requestWrite(
385
- () => executionOrder.push("write-notify"),
386
- () => {
387
- executionOrder.push("write-update");
388
- return true;
389
- },
390
- );
391
-
392
- executionOrder.push("after-write");
393
-
394
- await vi.waitFor(() =>
395
- expect(executionOrder.length).toBeGreaterThan(5),
396
- );
397
-
398
- // Read should not trigger effects
399
- expect(
400
- executionOrder.filter((x) => x === "effect").length,
401
- ).toBeGreaterThan(1); // At least initial + after write
402
- });
403
-
404
- it("should handle mixed operation types in queue", async () => {
405
- const executionOrder: string[] = [];
406
-
407
- const read1 = FlowGraph.requestRead(() => {
408
- executionOrder.push("read1");
409
- return 1;
410
- });
411
-
412
- const trigger1 = FlowGraph.requestTrigger(() => {
413
- executionOrder.push("trigger1");
414
- });
415
-
416
- const write1 = FlowGraph.requestWrite(
417
- () => executionOrder.push("write1-notify"),
418
- () => {
419
- executionOrder.push("write1-update");
420
- return true;
421
- },
422
- );
423
-
424
- const read2 = FlowGraph.requestRead(() => {
425
- executionOrder.push("read2");
426
- return 2;
427
- });
428
-
429
- await Promise.all([read1, trigger1, write1, read2]);
430
-
431
- // Reads should execute first (stopping processing), then trigger/write
432
- expect(executionOrder).toContain("read1");
433
- expect(executionOrder).toContain("read2");
434
- expect(executionOrder).toContain("trigger1");
435
- expect(executionOrder).toContain("write1-update");
436
- });
437
-
438
- it("should prevent concurrent queue processing", async () => {
439
- const executionOrder: string[] = [];
440
-
441
- // Start multiple operations rapidly
442
- const promises = [];
443
- for (let i = 0; i < 5; i++) {
444
- promises.push(
445
- FlowGraph.requestTrigger(() => {
446
- executionOrder.push(`trigger-${i}`);
447
- }),
448
- );
449
- }
450
-
451
- await Promise.all(promises);
452
-
453
- // All triggers should have been processed sequentially
454
- expect(executionOrder.length).toBe(5);
455
- for (let i = 0; i < 5; i++) {
456
- expect(executionOrder).toContain(`trigger-${i}`);
457
- }
458
- });
459
-
460
- it("should execute effects after each write/trigger but not after read", async () => {
461
- const effectFn = vi.fn();
462
- const $effect = effect(() => {
463
- effectFn();
464
- });
465
-
466
- // Initial execution
467
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
468
-
469
- // Read should not trigger effects
470
- FlowGraph.pushEffects([$effect]);
471
- await FlowGraph.requestRead(() => 1);
472
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
473
-
474
- // Write should trigger effects
475
- await FlowGraph.requestWrite(vi.fn(), () => true);
476
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
477
-
478
- // Trigger should trigger effects
479
- FlowGraph.pushEffects([$effect]);
480
- await FlowGraph.requestTrigger(vi.fn());
481
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
482
- });
483
- });
484
- });
485
- });