@ersbeth/picoflow 0.2.4 → 1.0.1

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 (248) hide show
  1. package/.cursor/plans/update-js-e795d61b.plan.md +567 -0
  2. package/.gitlab-ci.yml +24 -0
  3. package/.vscode/settings.json +3 -3
  4. package/CHANGELOG.md +51 -0
  5. package/IMPLEMENTATION_GUIDE.md +1578 -0
  6. package/README.md +9 -134
  7. package/biome.json +32 -32
  8. package/dist/picoflow.js +610 -436
  9. package/dist/types/advanced/array.d.ts +0 -6
  10. package/dist/types/advanced/array.d.ts.map +1 -1
  11. package/dist/types/advanced/index.d.ts +5 -5
  12. package/dist/types/advanced/index.d.ts.map +1 -1
  13. package/dist/types/advanced/map.d.ts +114 -23
  14. package/dist/types/advanced/map.d.ts.map +1 -1
  15. package/dist/types/advanced/resource.d.ts +51 -12
  16. package/dist/types/advanced/resource.d.ts.map +1 -1
  17. package/dist/types/advanced/resourceAsync.d.ts +28 -13
  18. package/dist/types/advanced/resourceAsync.d.ts.map +1 -1
  19. package/dist/types/advanced/stream.d.ts +74 -16
  20. package/dist/types/advanced/stream.d.ts.map +1 -1
  21. package/dist/types/advanced/streamAsync.d.ts +69 -15
  22. package/dist/types/advanced/streamAsync.d.ts.map +1 -1
  23. package/dist/types/basic/constant.d.ts +44 -16
  24. package/dist/types/basic/constant.d.ts.map +1 -1
  25. package/dist/types/basic/derivation.d.ts +73 -24
  26. package/dist/types/basic/derivation.d.ts.map +1 -1
  27. package/dist/types/basic/disposable.d.ts +65 -6
  28. package/dist/types/basic/disposable.d.ts.map +1 -1
  29. package/dist/types/basic/effect.d.ts +27 -16
  30. package/dist/types/basic/effect.d.ts.map +1 -1
  31. package/dist/types/basic/index.d.ts +7 -8
  32. package/dist/types/basic/index.d.ts.map +1 -1
  33. package/dist/types/basic/observable.d.ts +62 -13
  34. package/dist/types/basic/observable.d.ts.map +1 -1
  35. package/dist/types/basic/signal.d.ts +35 -6
  36. package/dist/types/basic/signal.d.ts.map +1 -1
  37. package/dist/types/basic/state.d.ts +25 -4
  38. package/dist/types/basic/state.d.ts.map +1 -1
  39. package/dist/types/basic/trackingContext.d.ts +33 -0
  40. package/dist/types/basic/trackingContext.d.ts.map +1 -0
  41. package/dist/types/creators.d.ts +271 -26
  42. package/dist/types/creators.d.ts.map +1 -1
  43. package/dist/types/index.d.ts +60 -7
  44. package/dist/types/index.d.ts.map +1 -1
  45. package/dist/types/solid/converters.d.ts +5 -5
  46. package/dist/types/solid/converters.d.ts.map +1 -1
  47. package/dist/types/solid/index.d.ts +2 -2
  48. package/dist/types/solid/index.d.ts.map +1 -1
  49. package/dist/types/solid/primitives.d.ts +96 -4
  50. package/dist/types/solid/primitives.d.ts.map +1 -1
  51. package/docs/.vitepress/config.mts +110 -0
  52. package/docs/api/classes/FlowArray.md +489 -0
  53. package/docs/api/classes/FlowConstant.md +350 -0
  54. package/docs/api/classes/FlowDerivation.md +334 -0
  55. package/docs/api/classes/FlowEffect.md +100 -0
  56. package/docs/api/classes/FlowMap.md +512 -0
  57. package/docs/api/classes/FlowObservable.md +306 -0
  58. package/docs/api/classes/FlowResource.md +380 -0
  59. package/docs/api/classes/FlowResourceAsync.md +362 -0
  60. package/docs/api/classes/FlowSignal.md +160 -0
  61. package/docs/api/classes/FlowState.md +368 -0
  62. package/docs/api/classes/FlowStream.md +367 -0
  63. package/docs/api/classes/FlowStreamAsync.md +364 -0
  64. package/docs/api/classes/SolidDerivation.md +75 -0
  65. package/docs/api/classes/SolidResource.md +91 -0
  66. package/docs/api/classes/SolidState.md +71 -0
  67. package/docs/api/classes/TrackingContext.md +33 -0
  68. package/docs/api/functions/array.md +58 -0
  69. package/docs/api/functions/constant.md +45 -0
  70. package/docs/api/functions/derivation.md +53 -0
  71. package/docs/api/functions/effect.md +49 -0
  72. package/docs/api/functions/from.md +220 -0
  73. package/docs/api/functions/isDisposable.md +49 -0
  74. package/docs/api/functions/map.md +57 -0
  75. package/docs/api/functions/resource.md +52 -0
  76. package/docs/api/functions/resourceAsync.md +50 -0
  77. package/docs/api/functions/signal.md +36 -0
  78. package/docs/api/functions/state.md +47 -0
  79. package/docs/api/functions/stream.md +53 -0
  80. package/docs/api/functions/streamAsync.md +50 -0
  81. package/docs/api/index.md +118 -0
  82. package/docs/api/interfaces/FlowDisposable.md +65 -0
  83. package/docs/api/interfaces/SolidObservable.md +19 -0
  84. package/docs/api/type-aliases/FlowArrayAction.md +49 -0
  85. package/docs/api/type-aliases/FlowStreamDisposer.md +15 -0
  86. package/docs/api/type-aliases/FlowStreamSetter.md +27 -0
  87. package/docs/api/type-aliases/FlowStreamUpdater.md +32 -0
  88. package/docs/api/type-aliases/NotPromise.md +18 -0
  89. package/docs/api/type-aliases/SolidGetter.md +17 -0
  90. package/docs/api/typedoc-sidebar.json +1 -0
  91. package/docs/examples/examples.md +2313 -0
  92. package/docs/examples/patterns.md +649 -0
  93. package/docs/guide/advanced/disposal.md +426 -0
  94. package/docs/guide/advanced/solidjs.md +221 -0
  95. package/docs/guide/advanced/upgrading.md +464 -0
  96. package/docs/guide/introduction/concepts.md +56 -0
  97. package/docs/guide/introduction/conventions.md +61 -0
  98. package/docs/guide/introduction/getting-started.md +134 -0
  99. package/docs/guide/introduction/lifecycle.md +371 -0
  100. package/docs/guide/primitives/array.md +400 -0
  101. package/docs/guide/primitives/constant.md +380 -0
  102. package/docs/guide/primitives/derivations.md +348 -0
  103. package/docs/guide/primitives/effects.md +458 -0
  104. package/docs/guide/primitives/map.md +387 -0
  105. package/docs/guide/primitives/overview.md +175 -0
  106. package/docs/guide/primitives/resources.md +858 -0
  107. package/docs/guide/primitives/signal.md +259 -0
  108. package/docs/guide/primitives/state.md +368 -0
  109. package/docs/guide/primitives/streams.md +931 -0
  110. package/docs/index.md +47 -0
  111. package/docs/public/logo.svg +1 -0
  112. package/package.json +57 -41
  113. package/src/advanced/array.ts +208 -210
  114. package/src/advanced/index.ts +7 -7
  115. package/src/advanced/map.ts +178 -68
  116. package/src/advanced/resource.ts +87 -43
  117. package/src/advanced/resourceAsync.ts +62 -42
  118. package/src/advanced/stream.ts +113 -50
  119. package/src/advanced/streamAsync.ts +120 -61
  120. package/src/basic/constant.ts +82 -49
  121. package/src/basic/derivation.ts +128 -84
  122. package/src/basic/disposable.ts +74 -15
  123. package/src/basic/effect.ts +85 -77
  124. package/src/basic/index.ts +7 -8
  125. package/src/basic/observable.ts +94 -36
  126. package/src/basic/signal.ts +133 -105
  127. package/src/basic/state.ts +46 -25
  128. package/src/basic/trackingContext.ts +45 -0
  129. package/src/creators.ts +297 -54
  130. package/src/index.ts +96 -43
  131. package/src/solid/converters.ts +186 -67
  132. package/src/solid/index.ts +8 -2
  133. package/src/solid/primitives.ts +167 -65
  134. package/test/array.test.ts +592 -612
  135. package/test/constant.test.ts +31 -33
  136. package/test/derivation.test.ts +531 -536
  137. package/test/effect.test.ts +21 -21
  138. package/test/map.test.ts +233 -137
  139. package/test/resource.test.ts +119 -121
  140. package/test/resourceAsync.test.ts +98 -100
  141. package/test/signal.test.ts +51 -55
  142. package/test/state.test.ts +186 -168
  143. package/test/stream.test.ts +189 -189
  144. package/test/streamAsync.test.ts +186 -186
  145. package/tsconfig.json +19 -18
  146. package/typedoc.json +37 -0
  147. package/vite.config.ts +23 -23
  148. package/vitest.config.ts +7 -7
  149. package/api/doc/index.md +0 -31
  150. package/api/doc/picoflow.array.md +0 -55
  151. package/api/doc/picoflow.constant.md +0 -55
  152. package/api/doc/picoflow.derivation.md +0 -55
  153. package/api/doc/picoflow.effect.md +0 -55
  154. package/api/doc/picoflow.flowarray._constructor_.md +0 -49
  155. package/api/doc/picoflow.flowarray._lastaction.md +0 -13
  156. package/api/doc/picoflow.flowarray.clear.md +0 -17
  157. package/api/doc/picoflow.flowarray.dispose.md +0 -55
  158. package/api/doc/picoflow.flowarray.get.md +0 -19
  159. package/api/doc/picoflow.flowarray.length.md +0 -13
  160. package/api/doc/picoflow.flowarray.md +0 -273
  161. package/api/doc/picoflow.flowarray.pop.md +0 -17
  162. package/api/doc/picoflow.flowarray.push.md +0 -53
  163. package/api/doc/picoflow.flowarray.set.md +0 -53
  164. package/api/doc/picoflow.flowarray.setitem.md +0 -69
  165. package/api/doc/picoflow.flowarray.shift.md +0 -17
  166. package/api/doc/picoflow.flowarray.splice.md +0 -85
  167. package/api/doc/picoflow.flowarray.unshift.md +0 -53
  168. package/api/doc/picoflow.flowarrayaction.md +0 -37
  169. package/api/doc/picoflow.flowconstant._constructor_.md +0 -49
  170. package/api/doc/picoflow.flowconstant.get.md +0 -25
  171. package/api/doc/picoflow.flowconstant.md +0 -88
  172. package/api/doc/picoflow.flowderivation._constructor_.md +0 -49
  173. package/api/doc/picoflow.flowderivation.get.md +0 -23
  174. package/api/doc/picoflow.flowderivation.md +0 -86
  175. package/api/doc/picoflow.flowdisposable.dispose.md +0 -55
  176. package/api/doc/picoflow.flowdisposable.md +0 -43
  177. package/api/doc/picoflow.floweffect._constructor_.md +0 -54
  178. package/api/doc/picoflow.floweffect.dispose.md +0 -21
  179. package/api/doc/picoflow.floweffect.disposed.md +0 -13
  180. package/api/doc/picoflow.floweffect.md +0 -131
  181. package/api/doc/picoflow.flowgetter.md +0 -15
  182. package/api/doc/picoflow.flowmap._lastdeleted.md +0 -21
  183. package/api/doc/picoflow.flowmap._lastset.md +0 -21
  184. package/api/doc/picoflow.flowmap.delete.md +0 -61
  185. package/api/doc/picoflow.flowmap.md +0 -133
  186. package/api/doc/picoflow.flowmap.setat.md +0 -77
  187. package/api/doc/picoflow.flowobservable.get.md +0 -19
  188. package/api/doc/picoflow.flowobservable.md +0 -68
  189. package/api/doc/picoflow.flowobservable.subscribe.md +0 -55
  190. package/api/doc/picoflow.flowresource._constructor_.md +0 -49
  191. package/api/doc/picoflow.flowresource.fetch.md +0 -27
  192. package/api/doc/picoflow.flowresource.get.md +0 -23
  193. package/api/doc/picoflow.flowresource.md +0 -100
  194. package/api/doc/picoflow.flowresourceasync._constructor_.md +0 -49
  195. package/api/doc/picoflow.flowresourceasync.fetch.md +0 -27
  196. package/api/doc/picoflow.flowresourceasync.get.md +0 -23
  197. package/api/doc/picoflow.flowresourceasync.md +0 -100
  198. package/api/doc/picoflow.flowsignal.dispose.md +0 -59
  199. package/api/doc/picoflow.flowsignal.disposed.md +0 -18
  200. package/api/doc/picoflow.flowsignal.md +0 -112
  201. package/api/doc/picoflow.flowsignal.trigger.md +0 -21
  202. package/api/doc/picoflow.flowstate.md +0 -52
  203. package/api/doc/picoflow.flowstate.set.md +0 -61
  204. package/api/doc/picoflow.flowstream._constructor_.md +0 -49
  205. package/api/doc/picoflow.flowstream.dispose.md +0 -21
  206. package/api/doc/picoflow.flowstream.get.md +0 -23
  207. package/api/doc/picoflow.flowstream.md +0 -100
  208. package/api/doc/picoflow.flowstreamasync._constructor_.md +0 -54
  209. package/api/doc/picoflow.flowstreamasync.dispose.md +0 -21
  210. package/api/doc/picoflow.flowstreamasync.get.md +0 -23
  211. package/api/doc/picoflow.flowstreamasync.md +0 -100
  212. package/api/doc/picoflow.flowstreamdisposer.md +0 -13
  213. package/api/doc/picoflow.flowstreamsetter.md +0 -13
  214. package/api/doc/picoflow.flowstreamupdater.md +0 -19
  215. package/api/doc/picoflow.flowwatcher.md +0 -15
  216. package/api/doc/picoflow.from.md +0 -55
  217. package/api/doc/picoflow.from_1.md +0 -55
  218. package/api/doc/picoflow.from_2.md +0 -55
  219. package/api/doc/picoflow.from_3.md +0 -55
  220. package/api/doc/picoflow.from_4.md +0 -55
  221. package/api/doc/picoflow.from_5.md +0 -55
  222. package/api/doc/picoflow.isdisposable.md +0 -55
  223. package/api/doc/picoflow.map.md +0 -59
  224. package/api/doc/picoflow.md +0 -544
  225. package/api/doc/picoflow.resource.md +0 -55
  226. package/api/doc/picoflow.resourceasync.md +0 -55
  227. package/api/doc/picoflow.signal.md +0 -19
  228. package/api/doc/picoflow.solidderivation._constructor_.md +0 -49
  229. package/api/doc/picoflow.solidderivation.get.md +0 -13
  230. package/api/doc/picoflow.solidderivation.md +0 -94
  231. package/api/doc/picoflow.solidgetter.md +0 -13
  232. package/api/doc/picoflow.solidobservable.get.md +0 -13
  233. package/api/doc/picoflow.solidobservable.md +0 -57
  234. package/api/doc/picoflow.solidresource._constructor_.md +0 -49
  235. package/api/doc/picoflow.solidresource.get.md +0 -13
  236. package/api/doc/picoflow.solidresource.latest.md +0 -13
  237. package/api/doc/picoflow.solidresource.md +0 -157
  238. package/api/doc/picoflow.solidresource.refetch.md +0 -13
  239. package/api/doc/picoflow.solidresource.state.md +0 -13
  240. package/api/doc/picoflow.solidstate._constructor_.md +0 -49
  241. package/api/doc/picoflow.solidstate.get.md +0 -13
  242. package/api/doc/picoflow.solidstate.md +0 -115
  243. package/api/doc/picoflow.solidstate.set.md +0 -13
  244. package/api/doc/picoflow.state.md +0 -55
  245. package/api/doc/picoflow.stream.md +0 -55
  246. package/api/doc/picoflow.streamasync.md +0 -55
  247. package/api/picoflow.public.api.md +0 -244
  248. package/api-extractor.json +0 -61
@@ -2,128 +2,126 @@ import { describe, expect, test, vi } from "vitest";
2
2
  import { effect, resource } from "#package";
3
3
 
4
4
  describe("resource", () => {
5
- test("is updated", async () => {
6
- let resourceCounter = 0;
7
- const fetchResource = async () => {
8
- resourceCounter++;
9
- return resourceCounter;
10
- };
11
-
12
- const $resource = resource(fetchResource);
13
- expect($resource.get()).toBe(undefined);
14
-
15
- await $resource.fetch();
16
- expect($resource.get()).toBe(1);
17
-
18
- await $resource.fetch();
19
- expect($resource.get()).toBe(2);
20
- });
21
-
22
- test("fetch throws when disposed", async () => {
23
- let resourceCounter = 0;
24
- const fetchResource = async () => {
25
- resourceCounter++;
26
- return resourceCounter;
27
- };
28
-
29
- const $resource = resource(fetchResource);
30
- expect($resource.get()).toBe(undefined);
31
-
32
- await $resource.fetch();
33
- expect($resource.get()).toBe(1);
34
-
35
- $resource.dispose();
36
- await expect(() => $resource.fetch()).rejects.toThrow(
37
- "[PicoFlow] Primitive is disposed",
38
- );
39
- });
40
-
41
- test("get throws when disposed", async () => {
42
- let resourceCounter = 0;
43
- const fetchResource = async () => {
44
- resourceCounter++;
45
- return resourceCounter;
46
- };
47
-
48
- const $resource = resource(fetchResource);
49
- expect($resource.get()).toBe(undefined);
50
-
51
- await $resource.fetch();
52
- expect($resource.get()).toBe(1);
53
-
54
- $resource.dispose();
55
- expect(() => $resource.get()).toThrow(
56
- "[PicoFlow] Primitive is disposed",
57
- );
58
- });
5
+ test("is updated", async () => {
6
+ let resourceCounter = 0;
7
+ const fetchResource = async () => {
8
+ resourceCounter++;
9
+ return resourceCounter;
10
+ };
11
+
12
+ const $resource = resource(fetchResource);
13
+ expect($resource.pick()).toBe(undefined);
14
+
15
+ await $resource.fetch();
16
+ expect($resource.pick()).toBe(1);
17
+
18
+ await $resource.fetch();
19
+ expect($resource.pick()).toBe(2);
20
+ });
21
+
22
+ test("fetch throws when disposed", async () => {
23
+ let resourceCounter = 0;
24
+ const fetchResource = async () => {
25
+ resourceCounter++;
26
+ return resourceCounter;
27
+ };
28
+
29
+ const $resource = resource(fetchResource);
30
+ expect($resource.pick()).toBe(undefined);
31
+
32
+ await $resource.fetch();
33
+ expect($resource.pick()).toBe(1);
34
+
35
+ $resource.dispose();
36
+ await expect(() => $resource.fetch()).rejects.toThrow(
37
+ "[PicoFlow] Primitive is disposed",
38
+ );
39
+ });
40
+
41
+ test("get throws when disposed", async () => {
42
+ let resourceCounter = 0;
43
+ const fetchResource = async () => {
44
+ resourceCounter++;
45
+ return resourceCounter;
46
+ };
47
+
48
+ const $resource = resource(fetchResource);
49
+ expect($resource.pick()).toBe(undefined);
50
+
51
+ await $resource.fetch();
52
+ expect($resource.pick()).toBe(1);
53
+
54
+ $resource.dispose();
55
+ expect(() => $resource.pick()).toThrow("[PicoFlow] Primitive is disposed");
56
+ });
59
57
  });
60
58
 
61
59
  describe("effect", () => {
62
- test("called when resource updated", async () => {
63
- let resourceCounter = 0;
64
- const fetchResource = async () => {
65
- resourceCounter++;
66
- return resourceCounter;
67
- };
68
-
69
- const $resource = resource(fetchResource);
70
- const effectFn = vi.fn();
71
- effect((get) => effectFn(get($resource)));
72
-
73
- expect(effectFn).toHaveBeenCalledTimes(1);
74
- expect(effectFn).toHaveBeenLastCalledWith(undefined);
75
-
76
- await $resource.fetch();
77
- expect(effectFn).toHaveBeenCalledTimes(2);
78
- expect(effectFn).toHaveBeenLastCalledWith(1);
79
-
80
- await $resource.fetch();
81
- expect(effectFn).toHaveBeenCalledTimes(3);
82
- expect(effectFn).toHaveBeenLastCalledWith(2);
83
- });
84
-
85
- test("NOT updated when value don't change", async () => {
86
- const fetchResource = async () => {
87
- return 0;
88
- };
89
-
90
- const $resource = resource(fetchResource);
91
- const effectFn = vi.fn();
92
- effect((get) => effectFn(get($resource)));
93
-
94
- expect(effectFn).toHaveBeenCalledTimes(1);
95
- expect(effectFn).toHaveBeenLastCalledWith(undefined);
96
-
97
- await $resource.fetch();
98
- expect(effectFn).toHaveBeenCalledTimes(2);
99
- expect(effectFn).toHaveBeenLastCalledWith(0);
100
-
101
- await $resource.fetch();
102
- expect(effectFn).toHaveBeenCalledTimes(2);
103
- expect(effectFn).toHaveBeenLastCalledWith(0);
104
- });
105
-
106
- test("NOT called when disposed", async () => {
107
- let resourceCounter = 0;
108
- const fetchResource = async () => {
109
- resourceCounter++;
110
- return resourceCounter;
111
- };
112
-
113
- const $resource = resource(fetchResource);
114
- const effectFn = vi.fn();
115
- const $effect = effect((get) => effectFn(get($resource)));
116
-
117
- expect(effectFn).toHaveBeenCalledTimes(1);
118
- expect(effectFn).toHaveBeenLastCalledWith(undefined);
119
-
120
- await $resource.fetch();
121
- expect(effectFn).toHaveBeenCalledTimes(2);
122
- expect(effectFn).toHaveBeenLastCalledWith(1);
123
-
124
- $effect.dispose();
125
- await $resource.fetch();
126
- expect(effectFn).toHaveBeenCalledTimes(2);
127
- expect(effectFn).toHaveBeenLastCalledWith(1);
128
- });
60
+ test("called when resource updated", async () => {
61
+ let resourceCounter = 0;
62
+ const fetchResource = async () => {
63
+ resourceCounter++;
64
+ return resourceCounter;
65
+ };
66
+
67
+ const $resource = resource(fetchResource);
68
+ const effectFn = vi.fn();
69
+ effect((t) => effectFn($resource.get(t)));
70
+
71
+ expect(effectFn).toHaveBeenCalledTimes(1);
72
+ expect(effectFn).toHaveBeenLastCalledWith(undefined);
73
+
74
+ await $resource.fetch();
75
+ expect(effectFn).toHaveBeenCalledTimes(2);
76
+ expect(effectFn).toHaveBeenLastCalledWith(1);
77
+
78
+ await $resource.fetch();
79
+ expect(effectFn).toHaveBeenCalledTimes(3);
80
+ expect(effectFn).toHaveBeenLastCalledWith(2);
81
+ });
82
+
83
+ test("NOT updated when value don't change", async () => {
84
+ const fetchResource = async () => {
85
+ return 0;
86
+ };
87
+
88
+ const $resource = resource(fetchResource);
89
+ const effectFn = vi.fn();
90
+ effect((t) => effectFn($resource.get(t)));
91
+
92
+ expect(effectFn).toHaveBeenCalledTimes(1);
93
+ expect(effectFn).toHaveBeenLastCalledWith(undefined);
94
+
95
+ await $resource.fetch();
96
+ expect(effectFn).toHaveBeenCalledTimes(2);
97
+ expect(effectFn).toHaveBeenLastCalledWith(0);
98
+
99
+ await $resource.fetch();
100
+ expect(effectFn).toHaveBeenCalledTimes(2);
101
+ expect(effectFn).toHaveBeenLastCalledWith(0);
102
+ });
103
+
104
+ test("NOT called when disposed", async () => {
105
+ let resourceCounter = 0;
106
+ const fetchResource = async () => {
107
+ resourceCounter++;
108
+ return resourceCounter;
109
+ };
110
+
111
+ const $resource = resource(fetchResource);
112
+ const effectFn = vi.fn();
113
+ const $effect = effect((t) => effectFn($resource.get(t)));
114
+
115
+ expect(effectFn).toHaveBeenCalledTimes(1);
116
+ expect(effectFn).toHaveBeenLastCalledWith(undefined);
117
+
118
+ await $resource.fetch();
119
+ expect(effectFn).toHaveBeenCalledTimes(2);
120
+ expect(effectFn).toHaveBeenLastCalledWith(1);
121
+
122
+ $effect.dispose();
123
+ await $resource.fetch();
124
+ expect(effectFn).toHaveBeenCalledTimes(2);
125
+ expect(effectFn).toHaveBeenLastCalledWith(1);
126
+ });
129
127
  });
@@ -2,107 +2,105 @@ import { describe, expect, test, vi } from "vitest";
2
2
  import { effect, resourceAsync } from "#package";
3
3
 
4
4
  describe("resourceAsync", () => {
5
- test("is updated", async () => {
6
- let resourceCounter = 0;
7
- const fetchResource = async () => {
8
- resourceCounter++;
9
- return resourceCounter;
10
- };
11
-
12
- const $resource = resourceAsync(fetchResource);
13
- expect(await $resource.get()).toBe(1);
14
-
15
- $resource.fetch();
16
- expect(await $resource.get()).toBe(2);
17
-
18
- $resource.fetch();
19
- expect(await $resource.get()).toBe(3);
20
- });
21
-
22
- test("fetch throws when disposed", async () => {
23
- let resourceCounter = 0;
24
- const fetchResource = async () => {
25
- resourceCounter++;
26
- return resourceCounter;
27
- };
28
-
29
- const $resource = resourceAsync(fetchResource);
30
- expect(await $resource.get()).toBe(1);
31
-
32
- $resource.fetch();
33
- expect(await $resource.get()).toBe(2);
34
-
35
- $resource.dispose();
36
- await expect(() => $resource.fetch()).rejects.toThrow(
37
- "[PicoFlow] Primitive is disposed",
38
- );
39
- });
40
-
41
- test("get throws when disposed", async () => {
42
- let resourceCounter = 0;
43
- const fetchResource = async () => {
44
- resourceCounter++;
45
- return resourceCounter;
46
- };
47
-
48
- const $resource = resourceAsync(fetchResource);
49
- expect(await $resource.get()).toBe(1);
50
-
51
- $resource.fetch();
52
- expect(await $resource.get()).toBe(2);
53
-
54
- $resource.dispose();
55
- expect(() => $resource.get()).toThrow(
56
- "[PicoFlow] Primitive is disposed",
57
- );
58
- });
5
+ test("is updated", async () => {
6
+ let resourceCounter = 0;
7
+ const fetchResource = async () => {
8
+ resourceCounter++;
9
+ return resourceCounter;
10
+ };
11
+
12
+ const $resource = resourceAsync(fetchResource);
13
+ expect(await $resource.pick()).toBe(1);
14
+
15
+ $resource.fetch();
16
+ expect(await $resource.pick()).toBe(2);
17
+
18
+ $resource.fetch();
19
+ expect(await $resource.pick()).toBe(3);
20
+ });
21
+
22
+ test("fetch throws when disposed", async () => {
23
+ let resourceCounter = 0;
24
+ const fetchResource = async () => {
25
+ resourceCounter++;
26
+ return resourceCounter;
27
+ };
28
+
29
+ const $resource = resourceAsync(fetchResource);
30
+ expect(await $resource.pick()).toBe(1);
31
+
32
+ $resource.fetch();
33
+ expect(await $resource.pick()).toBe(2);
34
+
35
+ $resource.dispose();
36
+ await expect(() => $resource.fetch()).rejects.toThrow(
37
+ "[PicoFlow] Primitive is disposed",
38
+ );
39
+ });
40
+
41
+ test("get throws when disposed", async () => {
42
+ let resourceCounter = 0;
43
+ const fetchResource = async () => {
44
+ resourceCounter++;
45
+ return resourceCounter;
46
+ };
47
+
48
+ const $resource = resourceAsync(fetchResource);
49
+ expect(await $resource.pick()).toBe(1);
50
+
51
+ $resource.fetch();
52
+ expect(await $resource.pick()).toBe(2);
53
+
54
+ $resource.dispose();
55
+ expect(() => $resource.pick()).toThrow("[PicoFlow] Primitive is disposed");
56
+ });
59
57
  });
60
58
 
61
59
  describe("effect", () => {
62
- test("called when resource updated", async () => {
63
- let resourceCounter = 0;
64
- const fetchResource = async () => {
65
- resourceCounter++;
66
- return resourceCounter;
67
- };
68
-
69
- const $resource = resourceAsync(fetchResource);
70
- const effectFn = vi.fn();
71
- effect((get) => effectFn(get($resource)));
72
-
73
- expect(effectFn).toHaveBeenCalledTimes(1);
74
- expect(await effectFn.mock.calls[0][0]).toBe(1);
75
-
76
- $resource.fetch();
77
- expect(effectFn).toHaveBeenCalledTimes(2);
78
- expect(await effectFn.mock.calls[1][0]).toBe(2);
79
-
80
- await $resource.fetch();
81
- expect(effectFn).toHaveBeenCalledTimes(3);
82
- expect(await effectFn.mock.calls[2][0]).toBe(3);
83
- });
84
-
85
- test("NOT called when disposed", async () => {
86
- let resourceCounter = 0;
87
- const fetchResource = async () => {
88
- resourceCounter++;
89
- return resourceCounter;
90
- };
91
-
92
- const $resource = resourceAsync(fetchResource);
93
- const effectFn = vi.fn();
94
- const $effect = effect((get) => effectFn(get($resource)));
95
-
96
- expect(effectFn).toHaveBeenCalledTimes(1);
97
- expect(await effectFn.mock.calls[0][0]).toBe(1);
98
-
99
- await $resource.fetch();
100
- expect(effectFn).toHaveBeenCalledTimes(2);
101
- expect(await effectFn.mock.calls[1][0]).toBe(2);
102
-
103
- $effect.dispose();
104
- await $resource.fetch();
105
- expect(effectFn).toHaveBeenCalledTimes(2);
106
- expect(await effectFn.mock.calls[1][0]).toBe(2);
107
- });
60
+ test("called when resource updated", async () => {
61
+ let resourceCounter = 0;
62
+ const fetchResource = async () => {
63
+ resourceCounter++;
64
+ return resourceCounter;
65
+ };
66
+
67
+ const $resource = resourceAsync(fetchResource);
68
+ const effectFn = vi.fn();
69
+ effect((t) => effectFn($resource.get(t)));
70
+
71
+ expect(effectFn).toHaveBeenCalledTimes(1);
72
+ expect(await effectFn.mock.calls[0][0]).toBe(1);
73
+
74
+ $resource.fetch();
75
+ expect(effectFn).toHaveBeenCalledTimes(2);
76
+ expect(await effectFn.mock.calls[1][0]).toBe(2);
77
+
78
+ await $resource.fetch();
79
+ expect(effectFn).toHaveBeenCalledTimes(3);
80
+ expect(await effectFn.mock.calls[2][0]).toBe(3);
81
+ });
82
+
83
+ test("NOT called when disposed", async () => {
84
+ let resourceCounter = 0;
85
+ const fetchResource = async () => {
86
+ resourceCounter++;
87
+ return resourceCounter;
88
+ };
89
+
90
+ const $resource = resourceAsync(fetchResource);
91
+ const effectFn = vi.fn();
92
+ const $effect = effect((t) => effectFn($resource.get(t)));
93
+
94
+ expect(effectFn).toHaveBeenCalledTimes(1);
95
+ expect(await effectFn.mock.calls[0][0]).toBe(1);
96
+
97
+ await $resource.fetch();
98
+ expect(effectFn).toHaveBeenCalledTimes(2);
99
+ expect(await effectFn.mock.calls[1][0]).toBe(2);
100
+
101
+ $effect.dispose();
102
+ await $resource.fetch();
103
+ expect(effectFn).toHaveBeenCalledTimes(2);
104
+ expect(await effectFn.mock.calls[1][0]).toBe(2);
105
+ });
108
106
  });
@@ -2,75 +2,71 @@ import { describe, expect, test, vi } from "vitest";
2
2
  import { effect, signal } from "#package";
3
3
 
4
4
  describe("signal", () => {
5
- test("disposed is correct", () => {
6
- const $signal = signal();
7
- expect($signal.disposed).toBe(false);
8
- $signal.dispose();
9
- expect($signal.disposed).toBe(true);
10
- });
5
+ test("disposed is correct", () => {
6
+ const $signal = signal();
7
+ expect($signal.disposed).toBe(false);
8
+ $signal.dispose();
9
+ expect($signal.disposed).toBe(true);
10
+ });
11
11
 
12
- test("throws when disposed", () => {
13
- const $signal = signal();
14
- const effectFn = vi.fn();
15
- effect((_, watch) => {
16
- watch($signal);
17
- effectFn();
18
- });
12
+ test("throws when disposed", () => {
13
+ const $signal = signal();
14
+ const effectFn = vi.fn();
15
+ effect((t) => {
16
+ $signal.watch(t);
17
+ effectFn();
18
+ });
19
19
 
20
- expect(effectFn).toHaveBeenCalledTimes(1);
20
+ expect(effectFn).toHaveBeenCalledTimes(1);
21
21
 
22
- $signal.trigger();
23
- expect(effectFn).toHaveBeenCalledTimes(2);
22
+ $signal.trigger();
23
+ expect(effectFn).toHaveBeenCalledTimes(2);
24
24
 
25
- $signal.dispose();
26
- expect(() => $signal.trigger()).toThrow(
27
- "[PicoFlow] Primitive is disposed",
28
- );
29
- });
25
+ $signal.dispose();
26
+ expect(() => $signal.trigger()).toThrow("[PicoFlow] Primitive is disposed");
27
+ });
30
28
 
31
- test("throws when disposed twice", () => {
32
- const $signal = signal();
33
- $signal.dispose();
34
- expect(() => $signal.dispose()).toThrow(
35
- "[PicoFlow] Primitive is disposed",
36
- );
37
- });
29
+ test("throws when disposed twice", () => {
30
+ const $signal = signal();
31
+ $signal.dispose();
32
+ expect(() => $signal.dispose()).toThrow("[PicoFlow] Primitive is disposed");
33
+ });
38
34
  });
39
35
 
40
36
  describe("effect", () => {
41
- test("called when signal triggered", () => {
42
- const $signal = signal();
43
- const effectFn = vi.fn();
44
- effect((_, watch) => {
45
- watch($signal);
46
- effectFn();
47
- });
37
+ test("called when signal triggered", () => {
38
+ const $signal = signal();
39
+ const effectFn = vi.fn();
40
+ effect((t) => {
41
+ $signal.watch(t);
42
+ effectFn();
43
+ });
48
44
 
49
- expect(effectFn).toHaveBeenCalledTimes(1);
45
+ expect(effectFn).toHaveBeenCalledTimes(1);
50
46
 
51
- $signal.trigger();
52
- expect(effectFn).toHaveBeenCalledTimes(2);
47
+ $signal.trigger();
48
+ expect(effectFn).toHaveBeenCalledTimes(2);
53
49
 
54
- $signal.trigger();
55
- expect(effectFn).toHaveBeenCalledTimes(3);
56
- });
50
+ $signal.trigger();
51
+ expect(effectFn).toHaveBeenCalledTimes(3);
52
+ });
57
53
 
58
- test("NOT called when disposed", () => {
59
- const $signal = signal();
60
- const effectFn = vi.fn();
61
- const $effect = effect((_, watch) => {
62
- watch($signal);
63
- effectFn();
64
- });
54
+ test("NOT called when disposed", () => {
55
+ const $signal = signal();
56
+ const effectFn = vi.fn();
57
+ const $effect = effect((t) => {
58
+ $signal.watch(t);
59
+ effectFn();
60
+ });
65
61
 
66
- expect(effectFn).toHaveBeenCalledTimes(1);
62
+ expect(effectFn).toHaveBeenCalledTimes(1);
67
63
 
68
- $signal.trigger();
69
- expect(effectFn).toHaveBeenCalledTimes(2);
64
+ $signal.trigger();
65
+ expect(effectFn).toHaveBeenCalledTimes(2);
70
66
 
71
- $effect.dispose();
67
+ $effect.dispose();
72
68
 
73
- $signal.trigger();
74
- expect(effectFn).toHaveBeenCalledTimes(2);
75
- });
69
+ $signal.trigger();
70
+ expect(effectFn).toHaveBeenCalledTimes(2);
71
+ });
76
72
  });