@ersbeth/picoflow 2.0.2 → 2.1.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 (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -0
  3. package/SKILL.md +106 -0
  4. package/dist/picoflow.js +204 -60
  5. package/dist/types/api/base/flowObservable.d.ts +3 -3
  6. package/dist/types/api/base/flowObservable.d.ts.map +1 -1
  7. package/dist/types/api/base/flowSubscribable.d.ts +2 -2
  8. package/dist/types/api/base/flowSubscribable.d.ts.map +1 -1
  9. package/dist/types/api/base/flowTracker.d.ts +1 -1
  10. package/dist/types/api/base/flowTracker.d.ts.map +1 -1
  11. package/dist/types/api/base/index.d.ts +4 -4
  12. package/dist/types/api/base/index.d.ts.map +1 -1
  13. package/dist/types/api/index.d.ts +2 -2
  14. package/dist/types/api/index.d.ts.map +1 -1
  15. package/dist/types/api/nodes/async/flowConstantAsync.d.ts +1 -1
  16. package/dist/types/api/nodes/async/flowConstantAsync.d.ts.map +1 -1
  17. package/dist/types/api/nodes/async/flowDerivationAsync.d.ts +3 -3
  18. package/dist/types/api/nodes/async/flowDerivationAsync.d.ts.map +1 -1
  19. package/dist/types/api/nodes/async/flowStateAsync.d.ts +3 -3
  20. package/dist/types/api/nodes/async/flowStateAsync.d.ts.map +1 -1
  21. package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts +2 -2
  22. package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts.map +1 -1
  23. package/dist/types/api/nodes/async/index.d.ts +4 -4
  24. package/dist/types/api/nodes/async/index.d.ts.map +1 -1
  25. package/dist/types/api/nodes/collections/flowArray.d.ts +7 -4
  26. package/dist/types/api/nodes/collections/flowArray.d.ts.map +1 -1
  27. package/dist/types/api/nodes/collections/flowMap.d.ts +3 -2
  28. package/dist/types/api/nodes/collections/flowMap.d.ts.map +1 -1
  29. package/dist/types/api/nodes/collections/index.d.ts +2 -2
  30. package/dist/types/api/nodes/collections/index.d.ts.map +1 -1
  31. package/dist/types/api/nodes/flowEffect.d.ts +2 -2
  32. package/dist/types/api/nodes/flowEffect.d.ts.map +1 -1
  33. package/dist/types/api/nodes/flowSignal.d.ts +1 -1
  34. package/dist/types/api/nodes/flowSignal.d.ts.map +1 -1
  35. package/dist/types/api/nodes/flowValue.d.ts +2 -2
  36. package/dist/types/api/nodes/flowValue.d.ts.map +1 -1
  37. package/dist/types/api/nodes/index.d.ts +7 -7
  38. package/dist/types/api/nodes/index.d.ts.map +1 -1
  39. package/dist/types/api/nodes/sync/flowConstant.d.ts +2 -2
  40. package/dist/types/api/nodes/sync/flowConstant.d.ts.map +1 -1
  41. package/dist/types/api/nodes/sync/flowDerivation.d.ts +3 -3
  42. package/dist/types/api/nodes/sync/flowDerivation.d.ts.map +1 -1
  43. package/dist/types/api/nodes/sync/flowState.d.ts +3 -3
  44. package/dist/types/api/nodes/sync/flowState.d.ts.map +1 -1
  45. package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts +2 -2
  46. package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts.map +1 -1
  47. package/dist/types/api/nodes/sync/index.d.ts +4 -4
  48. package/dist/types/api/nodes/sync/index.d.ts.map +1 -1
  49. package/dist/types/api/nodes/utils.d.ts +1 -1
  50. package/dist/types/api/nodes/utils.d.ts.map +1 -1
  51. package/dist/types/base/disposable.d.ts +1 -1
  52. package/dist/types/base/disposable.d.ts.map +1 -1
  53. package/dist/types/base/executionStack.d.ts +22 -1
  54. package/dist/types/base/executionStack.d.ts.map +1 -1
  55. package/dist/types/base/index.d.ts +5 -5
  56. package/dist/types/base/index.d.ts.map +1 -1
  57. package/dist/types/base/node.d.ts +4 -4
  58. package/dist/types/base/node.d.ts.map +1 -1
  59. package/dist/types/base/observable.d.ts +3 -3
  60. package/dist/types/base/observable.d.ts.map +1 -1
  61. package/dist/types/base/observer.d.ts +2 -2
  62. package/dist/types/base/observer.d.ts.map +1 -1
  63. package/dist/types/converters/index.d.ts +1 -1
  64. package/dist/types/converters/index.d.ts.map +1 -1
  65. package/dist/types/converters/solid.d.ts +12 -8
  66. package/dist/types/converters/solid.d.ts.map +1 -1
  67. package/dist/types/index.d.ts +2 -2
  68. package/dist/types/index.d.ts.map +1 -1
  69. package/dist/types/nodes/actionNode.d.ts +23 -0
  70. package/dist/types/nodes/actionNode.d.ts.map +1 -0
  71. package/dist/types/nodes/arrayNode.d.ts +4 -3
  72. package/dist/types/nodes/arrayNode.d.ts.map +1 -1
  73. package/dist/types/nodes/effectNode.d.ts +18 -2
  74. package/dist/types/nodes/effectNode.d.ts.map +1 -1
  75. package/dist/types/nodes/index.d.ts +8 -7
  76. package/dist/types/nodes/index.d.ts.map +1 -1
  77. package/dist/types/nodes/mapNode.d.ts +4 -3
  78. package/dist/types/nodes/mapNode.d.ts.map +1 -1
  79. package/dist/types/nodes/signalNode.d.ts +2 -2
  80. package/dist/types/nodes/signalNode.d.ts.map +1 -1
  81. package/dist/types/nodes/valueAsyncNode.d.ts +3 -3
  82. package/dist/types/nodes/valueAsyncNode.d.ts.map +1 -1
  83. package/dist/types/nodes/valueNode.d.ts +3 -3
  84. package/dist/types/nodes/valueNode.d.ts.map +1 -1
  85. package/dist/types/nodes/valueSyncNode.d.ts +3 -3
  86. package/dist/types/nodes/valueSyncNode.d.ts.map +1 -1
  87. package/dist/types/schedulers/asyncScheduler.d.ts +2 -1
  88. package/dist/types/schedulers/asyncScheduler.d.ts.map +1 -1
  89. package/dist/types/schedulers/index.d.ts +4 -4
  90. package/dist/types/schedulers/index.d.ts.map +1 -1
  91. package/dist/types/schedulers/syncResolver.d.ts +1 -2
  92. package/dist/types/schedulers/syncResolver.d.ts.map +1 -1
  93. package/dist/types/schedulers/syncScheduler.d.ts +1 -1
  94. package/dist/types/schedulers/syncScheduler.d.ts.map +1 -1
  95. package/package.json +24 -1
  96. package/.gitlab-ci.yml +0 -24
  97. package/.vscode/settings.json +0 -5
  98. package/CHANGELOG.md +0 -94
  99. package/biome.json +0 -47
  100. package/docs/.vitepress/config.mts +0 -145
  101. package/docs/api/functions/array.md +0 -35
  102. package/docs/api/functions/constant.md +0 -33
  103. package/docs/api/functions/constantAsync.md +0 -69
  104. package/docs/api/functions/derivation.md +0 -34
  105. package/docs/api/functions/derivationAsync.md +0 -34
  106. package/docs/api/functions/from.md +0 -129
  107. package/docs/api/functions/isDisposable.md +0 -27
  108. package/docs/api/functions/map.md +0 -36
  109. package/docs/api/functions/signal.md +0 -21
  110. package/docs/api/functions/state.md +0 -67
  111. package/docs/api/functions/stateAsync.md +0 -69
  112. package/docs/api/functions/subscribe.md +0 -40
  113. package/docs/api/functions/writableDerivation.md +0 -33
  114. package/docs/api/functions/writableDerivationAsync.md +0 -34
  115. package/docs/api/index.md +0 -61
  116. package/docs/api/interfaces/FlowArray.md +0 -439
  117. package/docs/api/interfaces/FlowConstant.md +0 -220
  118. package/docs/api/interfaces/FlowConstantAsync.md +0 -221
  119. package/docs/api/interfaces/FlowDerivation.md +0 -241
  120. package/docs/api/interfaces/FlowDerivationAsync.md +0 -242
  121. package/docs/api/interfaces/FlowDisposable.md +0 -59
  122. package/docs/api/interfaces/FlowEffect.md +0 -64
  123. package/docs/api/interfaces/FlowMap.md +0 -374
  124. package/docs/api/interfaces/FlowObservable.md +0 -155
  125. package/docs/api/interfaces/FlowSignal.md +0 -156
  126. package/docs/api/interfaces/FlowState.md +0 -269
  127. package/docs/api/interfaces/FlowStateAsync.md +0 -268
  128. package/docs/api/interfaces/FlowSubscribable.md +0 -55
  129. package/docs/api/interfaces/FlowTracker.md +0 -61
  130. package/docs/api/interfaces/FlowValue.md +0 -222
  131. package/docs/api/interfaces/FlowWritableDerivation.md +0 -292
  132. package/docs/api/interfaces/FlowWritableDerivationAsync.md +0 -293
  133. package/docs/api/type-aliases/DerivationFunction.md +0 -28
  134. package/docs/api/type-aliases/DerivationFunctionAsync.md +0 -28
  135. package/docs/api/type-aliases/FlowArrayAction.md +0 -60
  136. package/docs/api/type-aliases/FlowDataTracker.md +0 -33
  137. package/docs/api/type-aliases/FlowMapAction.md +0 -48
  138. package/docs/api/type-aliases/FlowOnDataListener.md +0 -33
  139. package/docs/api/type-aliases/FlowOnErrorListener.md +0 -27
  140. package/docs/api/type-aliases/FlowOnPendingListener.md +0 -21
  141. package/docs/api/type-aliases/FlowReadonly.md +0 -22
  142. package/docs/api/type-aliases/InitFunction.md +0 -21
  143. package/docs/api/type-aliases/InitFunctionAsync.md +0 -21
  144. package/docs/api/type-aliases/NotPromise.md +0 -21
  145. package/docs/api/type-aliases/UpdateFunction.md +0 -27
  146. package/docs/api/type-aliases/UpdateFunctionAsync.md +0 -27
  147. package/docs/api/typedoc-sidebar.json +0 -65
  148. package/docs/examples/examples.md +0 -2311
  149. package/docs/examples/patterns.md +0 -649
  150. package/docs/guide/advanced/architecture.md +0 -1234
  151. package/docs/guide/advanced/disposal.md +0 -426
  152. package/docs/guide/advanced/migration-v1.md +0 -464
  153. package/docs/guide/advanced/migration-v2.md +0 -204
  154. package/docs/guide/advanced/solidjs.md +0 -135
  155. package/docs/guide/introduction/concepts.md +0 -57
  156. package/docs/guide/introduction/conventions.md +0 -30
  157. package/docs/guide/introduction/getting-started.md +0 -139
  158. package/docs/guide/introduction/lifecycle.md +0 -368
  159. package/docs/guide/primitives/array.md +0 -286
  160. package/docs/guide/primitives/constant.md +0 -207
  161. package/docs/guide/primitives/derivations.md +0 -281
  162. package/docs/guide/primitives/effects.md +0 -372
  163. package/docs/guide/primitives/map.md +0 -265
  164. package/docs/guide/primitives/overview.md +0 -92
  165. package/docs/guide/primitives/signal.md +0 -222
  166. package/docs/guide/primitives/state.md +0 -272
  167. package/docs/index.md +0 -47
  168. package/docs/public/logo.svg +0 -1
  169. package/src/api/base/flowDisposable.ts +0 -44
  170. package/src/api/base/flowObservable.ts +0 -28
  171. package/src/api/base/flowSubscribable.ts +0 -87
  172. package/src/api/base/flowTracker.ts +0 -7
  173. package/src/api/base/index.ts +0 -4
  174. package/src/api/index.ts +0 -2
  175. package/src/api/nodes/async/flowConstantAsync.ts +0 -36
  176. package/src/api/nodes/async/flowDerivationAsync.ts +0 -42
  177. package/src/api/nodes/async/flowStateAsync.ts +0 -47
  178. package/src/api/nodes/async/flowWritableDerivationAsync.ts +0 -33
  179. package/src/api/nodes/async/index.ts +0 -4
  180. package/src/api/nodes/collections/flowArray.ts +0 -155
  181. package/src/api/nodes/collections/flowMap.ts +0 -115
  182. package/src/api/nodes/collections/index.ts +0 -2
  183. package/src/api/nodes/flowEffect.ts +0 -42
  184. package/src/api/nodes/flowSignal.ts +0 -28
  185. package/src/api/nodes/flowValue.ts +0 -37
  186. package/src/api/nodes/index.ts +0 -7
  187. package/src/api/nodes/sync/flowConstant.ts +0 -33
  188. package/src/api/nodes/sync/flowDerivation.ts +0 -41
  189. package/src/api/nodes/sync/flowState.ts +0 -45
  190. package/src/api/nodes/sync/flowWritableDerivation.ts +0 -31
  191. package/src/api/nodes/sync/index.ts +0 -4
  192. package/src/api/nodes/utils.ts +0 -24
  193. package/src/base/disposable.ts +0 -18
  194. package/src/base/executionStack.ts +0 -42
  195. package/src/base/index.ts +0 -5
  196. package/src/base/node.ts +0 -98
  197. package/src/base/observable.ts +0 -92
  198. package/src/base/observer.ts +0 -51
  199. package/src/converters/index.ts +0 -1
  200. package/src/converters/solid.ts +0 -109
  201. package/src/index.ts +0 -2
  202. package/src/nodes/arrayNode.ts +0 -180
  203. package/src/nodes/effectNode.ts +0 -58
  204. package/src/nodes/index.ts +0 -7
  205. package/src/nodes/mapNode.ts +0 -125
  206. package/src/nodes/signalNode.ts +0 -19
  207. package/src/nodes/valueAsyncNode.ts +0 -85
  208. package/src/nodes/valueNode.ts +0 -148
  209. package/src/nodes/valueSyncNode.ts +0 -125
  210. package/src/schedulers/asyncResolver.ts +0 -78
  211. package/src/schedulers/asyncScheduler.ts +0 -66
  212. package/src/schedulers/index.ts +0 -4
  213. package/src/schedulers/pendingError.ts +0 -13
  214. package/src/schedulers/scheduler.ts +0 -9
  215. package/src/schedulers/syncResolver.ts +0 -69
  216. package/src/schedulers/syncScheduler.ts +0 -55
  217. package/test/base/pendingError.test.ts +0 -67
  218. package/test/converters/solid.derivation.browser.test.tsx +0 -69
  219. package/test/converters/solid.node.test.ts +0 -654
  220. package/test/converters/solid.state.browser.test.tsx +0 -1592
  221. package/test/reactivity/flowSignal.test.ts +0 -226
  222. package/test/reactivity/nodes/async/asyncScheduler/asyncResolver.test.ts +0 -593
  223. package/test/reactivity/nodes/async/asyncScheduler/asyncScheduler.test.ts +0 -317
  224. package/test/reactivity/nodes/async/flowConstantAsync.test.ts +0 -652
  225. package/test/reactivity/nodes/async/flowDerivation.test.ts +0 -898
  226. package/test/reactivity/nodes/async/flowDerivationAsync.test.ts +0 -1716
  227. package/test/reactivity/nodes/async/flowStateAsync.test.ts +0 -708
  228. package/test/reactivity/nodes/async/flowWritableDerivationAsync.test.ts +0 -614
  229. package/test/reactivity/nodes/collections/flowArray.asyncStates.test.ts +0 -1289
  230. package/test/reactivity/nodes/collections/flowArray.scalars.test.ts +0 -961
  231. package/test/reactivity/nodes/collections/flowArray.states.test.ts +0 -1035
  232. package/test/reactivity/nodes/collections/flowMap.asyncStates.test.ts +0 -960
  233. package/test/reactivity/nodes/collections/flowMap.scalars.test.ts +0 -775
  234. package/test/reactivity/nodes/collections/flowMap.states.test.ts +0 -958
  235. package/test/reactivity/nodes/sync/flowConstant.test.ts +0 -377
  236. package/test/reactivity/nodes/sync/flowDerivation.test.ts +0 -896
  237. package/test/reactivity/nodes/sync/flowState.test.ts +0 -341
  238. package/test/reactivity/nodes/sync/flowWritableDerivation.test.ts +0 -603
  239. package/test/vitest.d.ts +0 -10
  240. package/tsconfig.json +0 -37
  241. package/typedoc.json +0 -37
  242. package/vite.config.ts +0 -31
  243. package/vitest.browser.config.ts +0 -21
  244. package/vitest.config.ts +0 -17
@@ -1,135 +0,0 @@
1
- # Use with SolidJS
2
-
3
- PicoFlow provides seamless integration with SolidJS through the `@ersbeth/picoflow/solid` module. This integration allows you to use PicoFlow's reactive primitives within SolidJS components, combining PicoFlow's explicit tracking model with SolidJS's automatic dependency tracking.
4
-
5
- ## Why Use PicoFlow with SolidJS?
6
-
7
- PicoFlow and SolidJS complement each other well:
8
-
9
- - **PicoFlow** provides explicit control over reactivity with fine-grained tracking
10
- - **SolidJS** offers automatic dependency tracking within components
11
- - **Together** you get the best of both worlds: explicit control in your business logic and automatic reactivity in your UI
12
-
13
- ### When to Use This Integration
14
-
15
- Use PicoFlow with SolidJS when:
16
-
17
- - ✅ You want explicit control over reactivity in shared business logic
18
- - ✅ You need fine-grained tracking (e.g., specific array operations)
19
- - ✅ You're building a library that should work with multiple frameworks
20
- - ✅ You want to share reactive logic between different UI frameworks
21
- - ✅ You prefer PicoFlow's explicit tracking model for complex state management
22
-
23
- Use pure SolidJS when:
24
-
25
- - ✅ Your reactive logic is tightly coupled to components
26
- - ✅ You prefer automatic dependency tracking everywhere
27
- - ✅ You don't need fine-grained control over reactivity
28
-
29
- ## Installation
30
-
31
- First, ensure you have both PicoFlow and SolidJS installed:
32
-
33
- ::: code-group
34
-
35
- ```bash [pnpm]
36
- pnpm add @ersbeth/picoflow solid-js
37
- ```
38
-
39
- ```bash [npm]
40
- npm install @ersbeth/picoflow solid-js
41
- ```
42
-
43
- ```bash [yarn]
44
- yarn add @ersbeth/picoflow solid-js
45
- ```
46
-
47
- :::
48
-
49
- Then import the integration utilities:
50
-
51
- ```typescript
52
- import { from } from '@ersbeth/picoflow/solid'
53
- import { state, derivation, resource } from '@ersbeth/picoflow'
54
- ```
55
-
56
- ## PicoFlow to SolidJS
57
-
58
- The `from()` function converts PicoFlow observables into SolidJS primitives that work seamlessly in Solid components.
59
-
60
- ### Basic Conversion
61
-
62
- Convert any PicoFlow observable to a Solid primitive:
63
-
64
- ```typescript
65
- import { from } from '@ersbeth/picoflow/solid'
66
- import { state } from '@ersbeth/picoflow'
67
-
68
- // Create PicoFlow state
69
- const $count = state(0)
70
-
71
-
72
- // Use in Solid component
73
- function Counter() {
74
- // Convert to Solid primitive
75
- const count = from($count)
76
- return <div>Count: {count()}</div>
77
- }
78
- ```
79
-
80
- The `from()` function uses SolidJS's `onMount` and `onCleanup` to properly dispose of the internal PicoFlow effects when the component unmounts. You don't need to manually dispose of converted primitives.
81
-
82
- ### Conversion Rules
83
-
84
- The `from()` function automatically determines the right Solid primitive based on the value type:
85
-
86
- | PicoFlow Input | Solid Output | When |
87
- |----------------|--------------|------|
88
- | `FlowObservable<T>` (non-Promise) | `SolidDerivation<T>` | Synchronous values |
89
- | `FlowObservable<Promise<T>>` | `SolidResource<T>` | Asynchronous values |
90
- | `(t) => T` (getter function) | `SolidDerivation<T>` | Synchronous computation |
91
- | `(t) => Promise<T>` (getter function) | `SolidResource<T>` | Asynchronous computation |
92
-
93
-
94
- ## Complete Examples
95
-
96
- ```typescript
97
- import { from } from '@ersbeth/picoflow/solid'
98
- import { state, derivation } from '@ersbeth/picoflow'
99
-
100
- // Create PicoFlow global state and derivation
101
- const $count = state(0)
102
- const $isEven = derivation((t) => $count.get(t) % 2 === 0)
103
-
104
- // Use in component
105
- function Counter() {
106
-
107
- // Convert to Solid primitives
108
- const count = from($count)
109
- const isEven = from($isEven)
110
-
111
- return (
112
- <div>
113
- <p>Count: {count()}</p>
114
- <p>{isEven.get() ? 'Even' : 'Odd'}</p>
115
- <button onClick={() => $count.set(prev => prev + 1)}>Increment</button>
116
- <button onClick={() => $count.set(prev => prev - 1)}>Decrement</button>
117
- </div>
118
- )
119
- }
120
- ```
121
-
122
- ## Best Practices
123
-
124
- ### When to Convert vs Use Directly
125
-
126
- **Convert PicoFlow observables (`from()`) when:**
127
- - ✅ You have existing PicoFlow state/logic to reuse
128
- - ✅ You want to share reactive logic between frameworks
129
- - ✅ You need fine-grained PicoFlow features (arrays, maps, streams)
130
- - ✅ Your business logic is framework-agnostic
131
-
132
- **Use Solid primitives directly when:**
133
- - ✅ The state is only used in Solid components
134
- - ✅ You don't need PicoFlow's advanced features
135
- - ✅ You prefer SolidJS's automatic tracking for simple cases
@@ -1,57 +0,0 @@
1
- # Concepts
2
-
3
- Understand the fundamentals of reactive programming and how it simplifies managing your application's state and behavior.
4
-
5
- ## What is Reactive Programming?
6
-
7
- Imagine a **spreadsheet** where you write `=A1 + B1` in cell C1. When you change A1 or B1, C1 automatically updates. That's reactive programming - values that automatically update when their dependencies change.
8
-
9
- ## Imperative Approach
10
-
11
- In traditional programming, you manually update everything:
12
-
13
- ```typescript
14
- // Imperative approach
15
- let count = 0
16
- let doubledCount = count * 2
17
-
18
- function increment() {
19
- count++
20
- doubledCount = count * 2 // Must remember to update!
21
- updateUI(count, doubledCount) // Must remember to update UI!
22
- }
23
- ```
24
-
25
-
26
- ```mermaid
27
- flowchart LR
28
- A[count = 5] --> B[Manually update doubled]
29
- B --> C[Manually update UI]
30
- ```
31
-
32
- ## Reactive Approach
33
-
34
- With reactive programming, dependencies update automatically:
35
-
36
- ```typescript
37
- // Reactive approach with PicoFlow
38
- const $count = state(0)
39
- const $doubled = derivation((t) => $count.get(t) * 2)
40
-
41
- subscribe(
42
- (t) => ({ count: $count.get(t), doubled: $doubled.get(t) }),
43
- (data) => updateUI(data.count, data.doubled) // Runs automatically!
44
- )
45
-
46
- function increment() {
47
- $count.set(n => n + 1) // Everything else updates automatically!
48
- }
49
- ```
50
-
51
- ```mermaid
52
- flowchart LR
53
- A2[$count.set 5] --> C2[$doubled updates]
54
- C2 --> D2[UI effect runs]
55
- ```
56
-
57
- **The benefit:** You define relationships once, and they stay synchronized automatically!
@@ -1,30 +0,0 @@
1
- # Naming Convention
2
-
3
- You'll see variables prefixed with `$` throughout PicoFlow examples:
4
-
5
- ```typescript
6
- const $count = state(0)
7
- const $double = derivation((t) => $count.get(t) * 2)
8
- ```
9
-
10
- This is a **naming convention** to make reactive values stand out. It helps you quickly identify:
11
- - Which values are reactive
12
- - Which values will cause re-executions when changed
13
- - Where your state lives
14
-
15
- Think of `$` as a visual marker: "This value is special - it's reactive!"
16
-
17
- ### Examples
18
-
19
- ```typescript
20
- // Reactive values - use $ prefix
21
- const $userName = state('Alice')
22
- const $userAge = state(25)
23
- const $isAdult = derivation((t) => $userAge.get(t) >= 18)
24
-
25
- // Plain values - no $ prefix
26
- const currentName = await $userName.pick() // Snapshot of current value
27
- const maxAge = 100 // Constant
28
- ```
29
-
30
-
@@ -1,139 +0,0 @@
1
- # Getting Started
2
-
3
- Welcome to PicoFlow! This guide will help you install PicoFlow and build your first reactive application in just a few minutes.
4
-
5
- ## Why PicoFlow?
6
-
7
- PicoFlow is a lightweight reactive library with a focus on **explicit control** and **simplicity**. Unlike some reactive libraries that track everything automatically, PicoFlow gives you precise control over what is reactive and what isn't.
8
-
9
- ### Key Philosophy
10
-
11
- 1. **Explicit Tracking** - You decide what to track with `.get(t)`
12
- 2. **Fine-grained Control** - React to specific operations, not just "something changed"
13
- 3. **No Magic** - Simple, predictable behavior
14
- 4. **TypeScript First** - Full type safety and inference
15
-
16
- ## Installation
17
-
18
- Install PicoFlow using your preferred package manager:
19
-
20
- ::: code-group
21
-
22
- ```bash [pnpm]
23
- pnpm add @ersbeth/picoflow
24
- ```
25
-
26
- ```bash [npm]
27
- npm install @ersbeth/picoflow
28
- ```
29
-
30
- ```bash [yarn]
31
- yarn add @ersbeth/picoflow
32
- ```
33
-
34
- :::
35
-
36
- If you plan to use the SolidJS integration, install SolidJS as a peer dependency:
37
-
38
- ::: code-group
39
-
40
- ```bash [pnpm]
41
- pnpm add solid-js
42
- ```
43
-
44
- ```bash [npm]
45
- npm install solid-js
46
- ```
47
-
48
- ```bash [yarn]
49
- yarn add solid-js
50
- ```
51
-
52
- :::
53
-
54
- Import the primitives you need:
55
-
56
- ```typescript
57
- import { state, derivation, subscribe } from '@ersbeth/picoflow'
58
- ```
59
-
60
- For SolidJS integration:
61
-
62
- ```typescript
63
- import { from } from '@ersbeth/picoflow'
64
- ```
65
-
66
- ## Your First PicoFlow App
67
-
68
- Let's build a simple counter with PicoFlow:
69
-
70
- ```typescript
71
- import { state, derivation, subscribe } from '@ersbeth/picoflow'
72
-
73
- // Create reactive state (prefix with $ by convention)
74
- const $count = state(0)
75
-
76
- // Create a computed value
77
- const $isEven = derivation((t) => {
78
- return $count.get(t) % 2 === 0
79
- })
80
-
81
- // React to changes
82
- subscribe(
83
- (t) => ({ count:$count.get(t), even:$isEven.get(t)}),
84
- (data) => {
85
- console.log(`Count is ${data.count}, which is ${data.even ? 'even' : 'odd'}`)
86
- }
87
- )
88
- // Logs "Count is 0, which is even"
89
-
90
- // Update the state
91
- $count.set(1) // Logs: "Count is 1, which is odd"
92
- $count.set(2) // Logs: "Count is 2, which is even"
93
- $count.set(3) // Logs: "Count is 3, which is odd"
94
- ```
95
-
96
- ### What Just Happened?
97
-
98
- 1. **State** (`$count`) - Holds a mutable value
99
- 2. **Derivation** (`$isEven`) - Computes a value based on state
100
- 3. **Subscribe** - Creates an effect that runs automatically when dependencies change
101
- 4. **Data function** `(t) => ...` - Tracks dependencies and returns data
102
- 5. **Callback** `(data) => ...` - Performs side effects with the data
103
- 6. **`.get(t)`** - Reads a value AND creates a dependency
104
- 7. **`.set()`** - Updates state, triggering subscribers
105
-
106
- ### Data Flow
107
-
108
- Here's what happens when you call `$count.set(1)`:
109
-
110
- ```mermaid
111
- sequenceDiagram
112
- participant User
113
- participant $count
114
- participant $isEven
115
- participant Subscribe
116
-
117
- User->>$count: set(1)
118
- activate $count
119
- Note over $count: Updates value 0 → 1
120
- $count->>$isEven: notify()
121
- Note over $isEven: Marks as dirty (lazy recompute)
122
- $count->>Subscribe: notify()
123
- deactivate $count
124
-
125
- activate Subscribe
126
- Note over Subscribe: Execute data function
127
- Subscribe->>$count: get(t)
128
- $count-->>Subscribe: 1
129
- Subscribe->>$isEven: get(t)
130
- activate $isEven
131
- Note over $isEven: Recomputes because dirty
132
- $isEven->>$count: get(t)
133
- $count-->>$isEven: 1
134
- $isEven-->>Subscribe: false
135
- deactivate $isEven
136
- Note over Subscribe: Call callback with {count: 1, even: false}
137
- Note over Subscribe: Logs: "Count is 1, which is odd"
138
- deactivate Subscribe
139
- ```