@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,148 +0,0 @@
1
- import { onCleanup, onMount } from "solid-js";
2
- import { FlowNode, type FlowReadonly, type FlowReadonlyAsync } from "../flow";
3
- import { FlowEffect } from "../flow/base";
4
- import type { FlowTracker } from "../flow/base/flowTracker";
5
- import { FlowNodeAsync } from "../flow/nodes/async/flowNodeAsync";
6
- import { SolidResource } from "./primitives";
7
- import type { NotPromise } from "../flow/base";
8
- /**
9
- * Converts an asynchronous FlowNodeAsync (Promise-based) into a SolidJS resource.
10
- *
11
- * @param node - The FlowNodeAsync to convert.
12
- * @returns A SolidResource that wraps the FlowNodeAsync's value.
13
- *
14
- * @remarks
15
- * This internal helper bridges PicoFlow's async reactive system with SolidJS by creating
16
- * a SolidResource that automatically tracks the FlowNodeAsync and updates when its value changes.
17
- * The resource is properly cleaned up when the Solid component unmounts.
18
- *
19
- * @internal
20
- */
21
- function fromNode<T>(node: FlowNodeAsync<T> | FlowNode<T>): SolidResource<T> {
22
- let initialized = false;
23
-
24
- const solidResource = new SolidResource<T>(async () => {
25
- let value: T;
26
- if (initialized) {
27
- value = await node.get(null); // don't request graph read
28
- } else {
29
- value = await node.pick();
30
- initialized = true;
31
- }
32
- return value;
33
- });
34
-
35
- let fx: FlowEffect;
36
-
37
- onMount(() => {
38
- fx = new FlowEffect(async (t) => {
39
- const watched = node.watch(t);
40
- if (watched instanceof Promise) {
41
- await watched;
42
- }
43
- solidResource.refetch();
44
- });
45
- });
46
-
47
- onCleanup(() => fx.dispose());
48
-
49
- return solidResource;
50
- }
51
-
52
- /**
53
- * Converts a getter function into a SolidResource.
54
- *
55
- * @param getter - A function that computes a value using a FlowTracker.
56
- * @returns A SolidResource that wraps the computed value.
57
- *
58
- * @remarks
59
- * This internal helper performs "deep" conversion by creating a FlowNodeAsync from
60
- * the getter function and then converting it to a SolidResource. This allows users
61
- * to pass computation functions directly to `from()` without manually creating a
62
- * FlowNodeAsync first.
63
- *
64
- * @internal
65
- */
66
- function fromGetter<T>(
67
- getter: (t: FlowTracker) => T | Promise<T>,
68
- ): SolidResource<T> {
69
- const derivation = new FlowNodeAsync<T>(async (t) => {
70
- return getter(t);
71
- });
72
-
73
- return fromNode(derivation);
74
- }
75
-
76
- /**
77
- * Utility type that excludes Promise types from T.
78
- * Used to ensure type safety for synchronous derivations/resources.
79
- *
80
- * @public
81
- */
82
- // export type NotPromise<T> = T extends Promise<unknown> ? never : T;
83
-
84
- /**
85
- * Converts a FlowNode, FlowNodeAsync, or getter function into a SolidResource.
86
- *
87
- * @param flow - The FlowNode, FlowNodeAsync, or getter function to convert.
88
- * @returns A SolidResource that wraps the value or computation.
89
- *
90
- * @remarks
91
- * This function bridges PicoFlow's reactive system with SolidJS, allowing you to use
92
- * PicoFlow nodes and computations within Solid components. All conversions return a
93
- * `SolidResource`, which can handle both synchronous and asynchronous values seamlessly.
94
- *
95
- * The conversion works with:
96
- * - **FlowNode**: Synchronous reactive nodes (e.g., from `state()` or `derivation()`)
97
- * - **FlowNodeAsync**: Asynchronous reactive nodes (e.g., from `resourceAsync()`)
98
- * - **Getter functions**: Computation functions that use a FlowTracker to access reactive values
99
- *
100
- * The created SolidResource automatically subscribes to the PicoFlow nodes and updates
101
- * when their values change. The subscription is properly cleaned up when the Solid
102
- * component unmounts.
103
- *
104
- * @example
105
- * ```typescript
106
- * import { from } from 'picoflow/solid';
107
- * import { state } from 'picoflow';
108
- *
109
- * // Convert a PicoFlow state to a Solid resource
110
- * const $count = state(0);
111
- * const solidCount = from($count);
112
- *
113
- * // Use in a Solid component
114
- * function Counter() {
115
- * return <div>Count: {solidCount.get()}</div>;
116
- * }
117
- *
118
- * // Or convert a computation function
119
- * const solidDerived = from((t) => {
120
- * return solidCount.get(t) * 2;
121
- * });
122
- * ```
123
- *
124
- * @public
125
- */
126
- export function from<T>(flow: FlowReadonlyAsync<T>): SolidResource<T>;
127
- export function from<T>(flow: FlowReadonly<T>): SolidResource<T>;
128
- export function from<T>(flow: (t: FlowTracker) => Promise<T>): SolidResource<T>;
129
- export function from<T>(
130
- flow: (t: FlowTracker) => NotPromise<T>,
131
- ): SolidResource<T>;
132
- export function from<T>(
133
- flow:
134
- | FlowReadonlyAsync<T>
135
- | FlowReadonly<T>
136
- | ((t: FlowTracker) => NotPromise<T>)
137
- | ((t: FlowTracker) => Promise<T>),
138
- ): SolidResource<T> {
139
- if (flow instanceof FlowNodeAsync || flow instanceof FlowNode) {
140
- return fromNode(flow);
141
- }
142
-
143
- if (typeof flow === "function") {
144
- return fromGetter(flow);
145
- }
146
-
147
- throw new Error("Invalid flow type");
148
- }
@@ -1,2 +0,0 @@
1
- export * from "./converters";
2
- export * from "./primitives";
@@ -1,215 +0,0 @@
1
- import {
2
- createMemo,
3
- createResource,
4
- createSignal,
5
- type ResourceFetcher,
6
- } from "solid-js";
7
-
8
- /**
9
- * A getter function or value for Solid state/derivation.
10
- *
11
- * @typeParam T - The value type.
12
- * @public
13
- */
14
- export type SolidGetter<T> = ((previous: T) => T) | T;
15
-
16
- /**
17
- * Interface for a Solid-style observable value.
18
- *
19
- * @typeParam T - The value type.
20
- * @public
21
- */
22
- export interface SolidObservable<T> {
23
- /**
24
- * Returns the current value.
25
- */
26
- get: () => T;
27
- }
28
-
29
- /**
30
- * Solid-style state container wrapping SolidJS's createSignal, providing a writable reactive signal.
31
- *
32
- * @remarks
33
- * SolidState is a thin wrapper around SolidJS's `createSignal` that provides a class-based
34
- * interface consistent with PicoFlow's API style. It's used internally by PicoFlow's Solid
35
- * integration but can also be used directly in Solid components.
36
- *
37
- * Unlike PicoFlow's {@link FlowState} which uses explicit tracking context, SolidState
38
- * relies on SolidJS's automatic dependency tracking within reactive contexts like
39
- * `createEffect` or component render functions.
40
- *
41
- * @example
42
- * ```typescript
43
- * const count = new SolidState(0);
44
- *
45
- * // In a Solid component
46
- * function Counter() {
47
- * return <div>{count.get()}</div>; // Automatically reactive
48
- * }
49
- *
50
- * // Update the value
51
- * count.set(1);
52
- * count.set(prev => prev + 1);
53
- * ```
54
- *
55
- * @typeParam T - The value type.
56
- * @public
57
- */
58
- export class SolidState<T> implements SolidObservable<T> {
59
- /**
60
- * Returns the current value.
61
- */
62
- readonly get: () => T;
63
- /**
64
- * Sets the value or updates it using a getter function.
65
- */
66
- readonly set: (param: SolidGetter<T>) => void;
67
-
68
- /**
69
- * Creates a new SolidState with the given initial value.
70
- * @param initialValue - The initial value.
71
- */
72
- constructor(initialValue: T) {
73
- const [get, set] = createSignal<T>(initialValue);
74
- this.get = get;
75
- this.set = set;
76
- }
77
- }
78
-
79
- type EffectFunction<Prev, Next extends Prev = Prev> = (v: Prev) => Next;
80
- /**
81
- * Solid-style derivation wrapping SolidJS's createMemo, providing a computed reactive value.
82
- *
83
- * @remarks
84
- * SolidDerivation is a thin wrapper around SolidJS's `createMemo` that provides a class-based
85
- * interface consistent with PicoFlow's API style. It creates a memoized computation that
86
- * automatically tracks its dependencies and recomputes only when they change.
87
- *
88
- * Unlike PicoFlow's {@link FlowDerivation} which uses explicit tracking context, SolidDerivation
89
- * relies on SolidJS's automatic dependency tracking. The computation function runs within
90
- * SolidJS's reactive scope and automatically subscribes to any signals accessed during execution.
91
- *
92
- * **Memoization:**
93
- * The computed value is cached and only recomputed when tracked dependencies change,
94
- * providing efficient derived state management.
95
- *
96
- * @example
97
- * ```typescript
98
- * const firstName = new SolidState('John');
99
- * const lastName = new SolidState('Doe');
100
- *
101
- * const fullName = new SolidDerivation(() => {
102
- * return `${firstName.get()} ${lastName.get()}`;
103
- * });
104
- *
105
- * // In a Solid component
106
- * function Display() {
107
- * return <div>{fullName.get()}</div>; // Automatically updates
108
- * }
109
- * ```
110
- *
111
- * @typeParam T - The value type.
112
- * @public
113
- */
114
- export class SolidDerivation<T> implements SolidObservable<T> {
115
- /**
116
- * Returns the current derived value.
117
- */
118
- readonly get: () => T;
119
-
120
- /**
121
- * Creates a new SolidDerivation from a getter function or value.
122
- * @param calculator - The getter function or value.
123
- */
124
- constructor(calculator: SolidGetter<T>) {
125
- const get = createMemo<T>(calculator as EffectFunction<T | undefined, T>);
126
- this.get = get;
127
- }
128
- }
129
-
130
- /**
131
- * Solid-style resource wrapping SolidJS's createResource, providing async data loading with reactive state.
132
- *
133
- * @remarks
134
- * SolidResource is a thin wrapper around SolidJS's `createResource` that provides a class-based
135
- * interface consistent with PicoFlow's API style. It manages asynchronous data fetching with
136
- * built-in loading states, error handling, and automatic reactivity.
137
- *
138
- * Unlike PicoFlow's {@link FlowResource} or {@link FlowResourceAsync}, SolidResource integrates
139
- * directly with SolidJS's Suspense and ErrorBoundary mechanisms, providing a first-class async
140
- * data loading experience in Solid applications.
141
- *
142
- * **Resource States:**
143
- * - `unresolved`: Initial state before first fetch
144
- * - `pending`: Fetch is in progress
145
- * - `ready`: Data has been successfully loaded
146
- * - `refreshing`: Refetching while previous data is still available
147
- * - `errored`: Fetch failed with an error
148
- *
149
- * **Properties:**
150
- * - `get()`: Returns the current value (or undefined if not ready)
151
- * - `state()`: Returns the current loading state
152
- * - `latest()`: Returns the most recent successfully loaded value
153
- * - `refetch()`: Triggers a new fetch operation
154
- *
155
- * @example
156
- * ```typescript
157
- * const user = new SolidResource(async () => {
158
- * const res = await fetch('/api/user');
159
- * return res.json();
160
- * });
161
- *
162
- * // In a Solid component
163
- * function UserProfile() {
164
- * return (
165
- * <div>
166
- * {user.state() === 'pending' && <p>Loading...</p>}
167
- * {user.state() === 'ready' && <p>Name: {user.get()?.name}</p>}
168
- * <button onClick={() => user.refetch()}>Refresh</button>
169
- * </div>
170
- * );
171
- * }
172
- * ```
173
- *
174
- * @typeParam T - The value type.
175
- * @public
176
- */
177
- export class SolidResource<T> implements SolidObservable<T | undefined> {
178
- /**
179
- * Returns the current value (or undefined if not yet loaded).
180
- */
181
- readonly get: () => T | undefined;
182
- /**
183
- * Returns the current resource state.
184
- */
185
- readonly state: () =>
186
- | "unresolved"
187
- | "pending"
188
- | "errored"
189
- | "ready"
190
- | "refreshing";
191
- /**
192
- * Returns the latest successfully loaded value (or undefined).
193
- */
194
- readonly latest: () => T | undefined;
195
- /**
196
- * Triggers a refetch of the resource.
197
- */
198
- readonly refetch: () => void;
199
-
200
- readonly set: (param: SolidGetter<T>) => void;
201
-
202
- /**
203
- * Creates a new SolidResource from a fetcher function.
204
- * @param fetcher - The async fetcher function.
205
- */
206
- constructor(fetcher: ResourceFetcher<true, T, unknown>) {
207
- const [get, set] = createResource<T>(fetcher);
208
- this.get = get;
209
- this.state = () => get.state;
210
- this.latest = () => get.latest;
211
- this.refetch = () => set.refetch();
212
- //@ts-expect-error - SolidGetter is not assignable to parameter of type 'Exclude<T, Function> | ((prev: T | undefined) => T)'
213
- this.set = (value: SolidGetter<T>) => set.mutate(value);
214
- }
215
- }
@@ -1,108 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { effect } from "#package";
3
-
4
- describe("FlowEffect", () => {
5
- describe("disposal", () => {
6
- it("should have disposed property set to false initially and true after disposal", () => {
7
- const effectFn = vi.fn();
8
- const $effect = effect(() => {
9
- effectFn();
10
- });
11
-
12
- expect($effect.disposed).toBe(false);
13
- $effect.dispose();
14
- expect($effect.disposed).toBe(true);
15
- });
16
-
17
- it("should throw error when disposed twice", () => {
18
- const effectFn = vi.fn();
19
- const $effect = effect(() => {
20
- effectFn();
21
- });
22
-
23
- $effect.dispose();
24
- expect(() => $effect.dispose()).toThrow("Effect is disposed");
25
- });
26
- });
27
-
28
- describe("execution", () => {
29
- it("should execute immediately upon creation", async () => {
30
- const effectFn = vi.fn();
31
- effect(() => {
32
- effectFn();
33
- });
34
-
35
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
36
- });
37
-
38
- it("should execute callback with tracking context as parameter", async () => {
39
- const effectFn = vi.fn();
40
- let receivedContext: unknown = null;
41
-
42
- const $effect = effect((t) => {
43
- receivedContext = t;
44
- effectFn();
45
- });
46
-
47
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
48
- expect(receivedContext).toBe($effect);
49
- });
50
- });
51
-
52
- describe("async support", () => {
53
- it("should support async callback functions", async () => {
54
- const effectFn = vi.fn();
55
- let asyncCompleted = false;
56
-
57
- effect(async () => {
58
- await new Promise((resolve) => setTimeout(resolve, 10));
59
- asyncCompleted = true;
60
- effectFn();
61
- });
62
-
63
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
64
- expect(asyncCompleted).toBe(true);
65
- });
66
-
67
- it("should await async callback before completing", async () => {
68
- const executionOrder: string[] = [];
69
- const effectFn = vi.fn();
70
-
71
- effect(async () => {
72
- executionOrder.push("start");
73
- await new Promise((resolve) => setTimeout(resolve, 10));
74
- executionOrder.push("async-complete");
75
- effectFn();
76
- });
77
-
78
- executionOrder.push("after-effect-creation");
79
-
80
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
81
- expect(executionOrder).toEqual([
82
- "start",
83
- "after-effect-creation",
84
- "async-complete",
85
- ]);
86
- });
87
- });
88
-
89
- describe("error handling", () => {
90
- it("should throw error when trying to execute after disposal", async () => {
91
- const effectFn = vi.fn();
92
- const $effect = effect(() => {
93
- effectFn();
94
- });
95
-
96
- await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
97
-
98
- $effect.dispose();
99
-
100
- // The internal _exec method should throw when called after disposal
101
- // This is tested indirectly - if we try to trigger execution after disposal,
102
- // it should fail. However, since we're testing in isolation without dependencies,
103
- // we verify that the disposed state prevents further execution
104
- expect($effect.disposed).toBe(true);
105
- expect(() => $effect.dispose()).toThrow("Effect is disposed");
106
- });
107
- });
108
- });