rexfect 0.0.7

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 (190) hide show
  1. package/README.md +1756 -0
  2. package/dist/abortableContext.d.ts +3 -0
  3. package/dist/abortableContext.d.ts.map +1 -0
  4. package/dist/abortableContext.js +48 -0
  5. package/dist/abortableContext.js.map +1 -0
  6. package/dist/action.d.ts +64 -0
  7. package/dist/action.d.ts.map +1 -0
  8. package/dist/action.js +208 -0
  9. package/dist/action.js.map +1 -0
  10. package/dist/action.test.d.ts +2 -0
  11. package/dist/action.test.d.ts.map +1 -0
  12. package/dist/action.test.js +189 -0
  13. package/dist/action.test.js.map +1 -0
  14. package/dist/async/abortable-guard.d.ts +25 -0
  15. package/dist/async/abortable-guard.d.ts.map +1 -0
  16. package/dist/async/abortable-guard.js +33 -0
  17. package/dist/async/abortable-guard.js.map +1 -0
  18. package/dist/async/abortable.d.ts +331 -0
  19. package/dist/async/abortable.d.ts.map +1 -0
  20. package/dist/async/abortable.js +410 -0
  21. package/dist/async/abortable.js.map +1 -0
  22. package/dist/async/abortable.test.d.ts +2 -0
  23. package/dist/async/abortable.test.d.ts.map +1 -0
  24. package/dist/async/abortable.test.js +535 -0
  25. package/dist/async/abortable.test.js.map +1 -0
  26. package/dist/async/abortable.typeCheck.d.ts +8 -0
  27. package/dist/async/abortable.typeCheck.d.ts.map +1 -0
  28. package/dist/async/abortable.typeCheck.js +138 -0
  29. package/dist/async/abortable.typeCheck.js.map +1 -0
  30. package/dist/async/async.d.ts +18 -0
  31. package/dist/async/async.d.ts.map +1 -0
  32. package/dist/async/async.js +20 -0
  33. package/dist/async/async.js.map +1 -0
  34. package/dist/async/index.d.ts +15 -0
  35. package/dist/async/index.d.ts.map +1 -0
  36. package/dist/async/index.js +13 -0
  37. package/dist/async/index.js.map +1 -0
  38. package/dist/async/loadable.d.ts +7 -0
  39. package/dist/async/loadable.d.ts.map +1 -0
  40. package/dist/async/loadable.js +52 -0
  41. package/dist/async/loadable.js.map +1 -0
  42. package/dist/async/loadable.test.d.ts +2 -0
  43. package/dist/async/loadable.test.d.ts.map +1 -0
  44. package/dist/async/loadable.test.js +322 -0
  45. package/dist/async/loadable.test.js.map +1 -0
  46. package/dist/async/promiseCache.d.ts +14 -0
  47. package/dist/async/promiseCache.d.ts.map +1 -0
  48. package/dist/async/promiseCache.js +29 -0
  49. package/dist/async/promiseCache.js.map +1 -0
  50. package/dist/async/read.d.ts +120 -0
  51. package/dist/async/read.d.ts.map +1 -0
  52. package/dist/async/read.js +286 -0
  53. package/dist/async/read.js.map +1 -0
  54. package/dist/async/read.test.d.ts +2 -0
  55. package/dist/async/read.test.d.ts.map +1 -0
  56. package/dist/async/read.test.js +419 -0
  57. package/dist/async/read.test.js.map +1 -0
  58. package/dist/async/read.typeCheck.d.ts +6 -0
  59. package/dist/async/read.typeCheck.d.ts.map +1 -0
  60. package/dist/async/read.typeCheck.js +101 -0
  61. package/dist/async/read.typeCheck.js.map +1 -0
  62. package/dist/async/safe.d.ts +230 -0
  63. package/dist/async/safe.d.ts.map +1 -0
  64. package/dist/async/safe.js +247 -0
  65. package/dist/async/safe.js.map +1 -0
  66. package/dist/async/safe.test.d.ts +2 -0
  67. package/dist/async/safe.test.d.ts.map +1 -0
  68. package/dist/async/safe.test.js +447 -0
  69. package/dist/async/safe.test.js.map +1 -0
  70. package/dist/async/utils.d.ts +17 -0
  71. package/dist/async/utils.d.ts.map +1 -0
  72. package/dist/async/utils.js +38 -0
  73. package/dist/async/utils.js.map +1 -0
  74. package/dist/async/wait.d.ts +120 -0
  75. package/dist/async/wait.d.ts.map +1 -0
  76. package/dist/async/wait.js +112 -0
  77. package/dist/async/wait.js.map +1 -0
  78. package/dist/async/wait.test.d.ts +2 -0
  79. package/dist/async/wait.test.d.ts.map +1 -0
  80. package/dist/async/wait.test.js +122 -0
  81. package/dist/async/wait.test.js.map +1 -0
  82. package/dist/async/wait.typeCheck.d.ts +6 -0
  83. package/dist/async/wait.typeCheck.d.ts.map +1 -0
  84. package/dist/async/wait.typeCheck.js +104 -0
  85. package/dist/async/wait.typeCheck.js.map +1 -0
  86. package/dist/atom.d.ts +46 -0
  87. package/dist/atom.d.ts.map +1 -0
  88. package/dist/atom.js +86 -0
  89. package/dist/atom.js.map +1 -0
  90. package/dist/atom.test.d.ts +2 -0
  91. package/dist/atom.test.d.ts.map +1 -0
  92. package/dist/atom.test.js +75 -0
  93. package/dist/atom.test.js.map +1 -0
  94. package/dist/batch.d.ts +15 -0
  95. package/dist/batch.d.ts.map +1 -0
  96. package/dist/batch.js +45 -0
  97. package/dist/batch.js.map +1 -0
  98. package/dist/defer.d.ts +56 -0
  99. package/dist/defer.d.ts.map +1 -0
  100. package/dist/defer.js +49 -0
  101. package/dist/defer.js.map +1 -0
  102. package/dist/effect.d.ts +91 -0
  103. package/dist/effect.d.ts.map +1 -0
  104. package/dist/effect.js +311 -0
  105. package/dist/effect.js.map +1 -0
  106. package/dist/effect.test.d.ts +2 -0
  107. package/dist/effect.test.d.ts.map +1 -0
  108. package/dist/effect.test.js +123 -0
  109. package/dist/effect.test.js.map +1 -0
  110. package/dist/emitter.d.ts +129 -0
  111. package/dist/emitter.d.ts.map +1 -0
  112. package/dist/emitter.js +164 -0
  113. package/dist/emitter.js.map +1 -0
  114. package/dist/emitter.test.d.ts +2 -0
  115. package/dist/emitter.test.d.ts.map +1 -0
  116. package/dist/emitter.test.js +259 -0
  117. package/dist/emitter.test.js.map +1 -0
  118. package/dist/equality.d.ts +66 -0
  119. package/dist/equality.d.ts.map +1 -0
  120. package/dist/equality.js +145 -0
  121. package/dist/equality.js.map +1 -0
  122. package/dist/event.d.ts +18 -0
  123. package/dist/event.d.ts.map +1 -0
  124. package/dist/event.js +166 -0
  125. package/dist/event.js.map +1 -0
  126. package/dist/event.test.d.ts +2 -0
  127. package/dist/event.test.d.ts.map +1 -0
  128. package/dist/event.test.js +167 -0
  129. package/dist/event.test.js.map +1 -0
  130. package/dist/hooks.d.ts +152 -0
  131. package/dist/hooks.d.ts.map +1 -0
  132. package/dist/hooks.js +122 -0
  133. package/dist/hooks.js.map +1 -0
  134. package/dist/hooks.test.d.ts +2 -0
  135. package/dist/hooks.test.d.ts.map +1 -0
  136. package/dist/hooks.test.js +99 -0
  137. package/dist/hooks.test.js.map +1 -0
  138. package/dist/index.d.ts +33 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +35 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/isPromiseLike.d.ts +10 -0
  143. package/dist/isPromiseLike.d.ts.map +1 -0
  144. package/dist/isPromiseLike.js +15 -0
  145. package/dist/isPromiseLike.js.map +1 -0
  146. package/dist/pick.d.ts +22 -0
  147. package/dist/pick.d.ts.map +1 -0
  148. package/dist/pick.js +46 -0
  149. package/dist/pick.js.map +1 -0
  150. package/dist/react/index.d.ts +8 -0
  151. package/dist/react/index.d.ts.map +1 -0
  152. package/dist/react/index.js +8 -0
  153. package/dist/react/index.js.map +1 -0
  154. package/dist/react/useRx.d.ts +14 -0
  155. package/dist/react/useRx.d.ts.map +1 -0
  156. package/dist/react/useRx.js +110 -0
  157. package/dist/react/useRx.js.map +1 -0
  158. package/dist/react/useRx.test.d.ts +2 -0
  159. package/dist/react/useRx.test.d.ts.map +1 -0
  160. package/dist/react/useRx.test.js +457 -0
  161. package/dist/react/useRx.test.js.map +1 -0
  162. package/dist/strictModeTest.d.ts +11 -0
  163. package/dist/strictModeTest.d.ts.map +1 -0
  164. package/dist/strictModeTest.js +41 -0
  165. package/dist/strictModeTest.js.map +1 -0
  166. package/dist/types.d.ts +606 -0
  167. package/dist/types.d.ts.map +1 -0
  168. package/dist/types.js +5 -0
  169. package/dist/types.js.map +1 -0
  170. package/dist/untrack.d.ts +14 -0
  171. package/dist/untrack.d.ts.map +1 -0
  172. package/dist/untrack.js +17 -0
  173. package/dist/untrack.js.map +1 -0
  174. package/dist/utils/withUse.d.ts +10 -0
  175. package/dist/utils/withUse.d.ts.map +1 -0
  176. package/dist/utils/withUse.js +21 -0
  177. package/dist/utils/withUse.js.map +1 -0
  178. package/dist/utils/withUse.test.d.ts +2 -0
  179. package/dist/utils/withUse.test.d.ts.map +1 -0
  180. package/dist/utils/withUse.test.js +233 -0
  181. package/dist/utils/withUse.test.js.map +1 -0
  182. package/dist/utils.d.ts +7 -0
  183. package/dist/utils.d.ts.map +1 -0
  184. package/dist/utils.js +7 -0
  185. package/dist/utils.js.map +1 -0
  186. package/dist/utils.test.d.ts +2 -0
  187. package/dist/utils.test.d.ts.map +1 -0
  188. package/dist/utils.test.js +119 -0
  189. package/dist/utils.test.js.map +1 -0
  190. package/package.json +64 -0
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Creates a mappable tuple by adding .use() method to the tuple.
3
+ * The tuple can still be destructured normally: const [signal, setter] = withUse([s, set])
4
+ *
5
+ * @param tuple - The tuple [Signal, Setter] to make mappable
6
+ * @returns The same tuple with .use() method attached
7
+ */
8
+ export function withUse(tuple) {
9
+ // Object.assign adds .use() method to the tuple array
10
+ // The tuple remains destructureable: const [signal, setter] = result
11
+ return Object.assign(tuple, {
12
+ use(plugin) {
13
+ const [originalSignal, originalSetter] = tuple;
14
+ const result = plugin(originalSignal, originalSetter);
15
+ const newSignal = result?.sig ?? originalSignal;
16
+ const newSetter = result?.set ?? originalSetter;
17
+ return withUse([newSignal, newSetter]);
18
+ },
19
+ });
20
+ }
21
+ //# sourceMappingURL=withUse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withUse.js","sourceRoot":"","sources":["../../src/utils/withUse.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CACrB,KAAQ;IAER,sDAAsD;IACtD,qEAAqE;IACrE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;QAC1B,GAAG,CACD,MAAe;YAEf,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,cAAc,CAKvC,CAAC;YACd,MAAM,SAAS,GAAG,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC;YAChD,MAAM,SAAS,GAAG,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC;YAChD,OAAO,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QACzC,CAAC;KACF,CAAe,CAAC;AACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=withUse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withUse.test.d.ts","sourceRoot":"","sources":["../../src/utils/withUse.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,233 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { atom } from "../atom";
3
+ import { withUse } from "./withUse";
4
+ // Helper to create a derived signal that forwards subscriptions
5
+ function derivedSignal(getter, sourceSignal) {
6
+ const sig = function () {
7
+ return getter();
8
+ };
9
+ sig.on = (listener) => {
10
+ return sourceSignal.on(() => listener(getter()));
11
+ };
12
+ return sig;
13
+ }
14
+ describe("mapTuple", () => {
15
+ describe("basic functionality", () => {
16
+ it("should add .map() method to tuple", () => {
17
+ const [signal, setter] = atom(1);
18
+ const mappable = withUse([signal, setter]);
19
+ expect(typeof mappable.use).toBe("function");
20
+ // Should still be destructureable
21
+ const [s] = mappable;
22
+ expect(s()).toBe(1);
23
+ });
24
+ it("should preserve tuple destructuring", () => {
25
+ const [signal, setter] = atom(42);
26
+ const mappable = withUse([signal, setter]);
27
+ const [s, set] = mappable;
28
+ expect(s()).toBe(42);
29
+ set(100);
30
+ expect(s()).toBe(100);
31
+ });
32
+ });
33
+ describe("setter-only transformation", () => {
34
+ it("should transform setter while keeping signal", () => {
35
+ const [signal, setter] = atom({ a: 0 });
36
+ const mappable = withUse([signal, setter]);
37
+ const [newSignal, newSetter] = mappable.use((_sig, set) => ({
38
+ set: (value) => set({ a: value }),
39
+ }));
40
+ // Signal should be the same
41
+ expect(newSignal()).toEqual({ a: 0 });
42
+ // New setter should accept number
43
+ newSetter(42);
44
+ expect(newSignal()).toEqual({ a: 42 });
45
+ });
46
+ it("should transform setter to accept different type", () => {
47
+ const [signal, setter] = atom({ a: 0 });
48
+ const mappable = withUse([signal, setter]);
49
+ const [newSignal, newSetter] = mappable.use((_sig, set) => ({
50
+ set: (value) => set({ a: Number(value) }),
51
+ }));
52
+ newSetter("123");
53
+ expect(newSignal()).toEqual({ a: 123 });
54
+ });
55
+ it("should notify listeners when transformed setter is called", () => {
56
+ const [signal, setter] = atom(0);
57
+ const mappable = withUse([signal, setter]);
58
+ const listener = vi.fn();
59
+ const [newSignal, newSetter] = mappable.use((_sig, set) => ({
60
+ set: (value) => set(value * 2),
61
+ }));
62
+ newSignal.on(listener);
63
+ newSetter(5);
64
+ expect(listener).toHaveBeenCalledWith(10);
65
+ });
66
+ });
67
+ describe("signal + setter transformation", () => {
68
+ it("should transform both signal and setter", () => {
69
+ const [signal, setter] = atom({ a: 0, b: 0 });
70
+ const mappable = withUse([signal, setter]);
71
+ const [newSignal, newSetter] = mappable.use((sig, set) => ({
72
+ sig: derivedSignal(() => sig().a, sig), // Extract 'a' property
73
+ set: (value) => set({ a: value, b: 0 }),
74
+ }));
75
+ expect(newSignal()).toBe(0);
76
+ newSetter(42);
77
+ expect(newSignal()).toBe(42);
78
+ expect(signal()).toEqual({ a: 42, b: 0 });
79
+ });
80
+ it("should work with complex transformations", () => {
81
+ const [signal, setter] = atom({ x: 0, y: 0 });
82
+ const mappable = withUse([signal, setter]);
83
+ const [newSignal, newSetter] = mappable.use((sig, set) => ({
84
+ sig: derivedSignal(() => ({ sum: sig().x + sig().y }), sig),
85
+ set: (value) => {
86
+ set({ x: value.sum / 2, y: value.sum / 2 });
87
+ },
88
+ }));
89
+ expect(newSignal()).toEqual({ sum: 0 });
90
+ newSetter({ sum: 10 });
91
+ expect(signal()).toEqual({ x: 5, y: 5 });
92
+ expect(newSignal()).toEqual({ sum: 10 });
93
+ });
94
+ });
95
+ describe("signal-only transformation", () => {
96
+ it("should transform signal while keeping setter", () => {
97
+ const [signal, setter] = atom({ a: 0 });
98
+ const mappable = withUse([signal, setter]);
99
+ const [newSignal, newSetter] = mappable.use((sig, _set) => ({
100
+ sig: derivedSignal(() => sig().a, sig), // Extract 'a' property
101
+ }));
102
+ expect(newSignal()).toBe(0);
103
+ // Setter should still work with original type
104
+ newSetter({ a: 42 });
105
+ expect(newSignal()).toBe(42);
106
+ });
107
+ it("should create derived signal that tracks original", () => {
108
+ const [signal, setter] = atom(5);
109
+ const mappable = withUse([signal, setter]);
110
+ const [newSignal, newSetter] = mappable.use((sig, _set) => ({
111
+ sig: derivedSignal(() => sig() * 2, sig), // Double the value
112
+ }));
113
+ expect(newSignal()).toBe(10);
114
+ newSetter(10);
115
+ expect(newSignal()).toBe(20);
116
+ });
117
+ });
118
+ describe("chaining", () => {
119
+ it("should allow chaining multiple transformations", () => {
120
+ const [signal, setter] = atom({ a: 0 });
121
+ const mappable = withUse([signal, setter]);
122
+ // Chain: first transforms string->{a:number}, second transforms string->{a:number*2}
123
+ // Note: second map receives first setter (which accepts string and calls original setter)
124
+ const chained = mappable
125
+ .use((_sig, set) => ({
126
+ set: (value) => set({ a: Number(value) }),
127
+ }))
128
+ .use((_sig, set) => ({
129
+ set: (value) => {
130
+ // set is the first setter: (value: string) => originalSet({ a: Number(value) })
131
+ // We need to convert string to number, multiply, then call first setter with the result as string
132
+ const num = Number(value);
133
+ const multiplied = num * 2;
134
+ // Call first setter with the multiplied value as string
135
+ set(String(multiplied));
136
+ },
137
+ }));
138
+ const [finalSignal, finalSetter] = chained;
139
+ finalSetter("5");
140
+ // "5" -> Number("5") = 5 -> 5 * 2 = 10 -> "10" -> Number("10") = 10
141
+ expect(finalSignal()).toEqual({ a: 10 });
142
+ expect(signal()).toEqual({ a: 10 });
143
+ });
144
+ it("should chain setter transformations", () => {
145
+ const [signal, setter] = atom(0);
146
+ const mappable = withUse([signal, setter]);
147
+ // Chain by keeping mappable wrapper
148
+ const chained = mappable
149
+ .use((_sig, set) => ({ set: (v) => set(v * 2) }))
150
+ .use((_sig, set) => ({ set: (v) => set(v + 1) }));
151
+ const [, set2] = chained;
152
+ set2(5);
153
+ // Order: setter(5) -> add 1 -> multiply by 2 = (5 + 1) * 2 = 12
154
+ expect(signal()).toBe(12);
155
+ });
156
+ it("should chain mixed transformations", () => {
157
+ const [signal, setter] = atom({ a: 0 });
158
+ const mappable = withUse([signal, setter]);
159
+ // Chain by keeping mappable wrapper
160
+ // First: extract 'a' property as signal, setter accepts number and sets { a: number }
161
+ // Second: keep signal, setter accepts string and converts to number
162
+ const chained = mappable
163
+ .use((sig, set) => ({
164
+ sig: derivedSignal(() => sig().a, sig),
165
+ set: (v) => set({ a: v }),
166
+ }))
167
+ .use((_sig, set) => ({
168
+ set: (v) => {
169
+ // set is the first setter: (v: number) => originalSet({ a: v })
170
+ const num = Number(v);
171
+ set(num);
172
+ },
173
+ }));
174
+ const [s2, set2] = chained;
175
+ set2("42");
176
+ expect(signal()).toEqual({ a: 42 });
177
+ expect(s2()).toBe(42);
178
+ });
179
+ });
180
+ describe("integration with atom()", () => {
181
+ it("should work with atom() return value", () => {
182
+ const atomValue = atom(1);
183
+ // atom() now returns Atom<T> which is MapTuple
184
+ expect(typeof atomValue.use).toBe("function");
185
+ const [signal] = atomValue;
186
+ expect(signal()).toBe(1);
187
+ });
188
+ it("should allow mapping atom directly", () => {
189
+ const atomValue = atom({ a: 0 });
190
+ const [signal, setter] = atomValue.use((_sig, set) => ({
191
+ set: (value) => set({ a: value }),
192
+ }));
193
+ setter(42);
194
+ expect(signal()).toEqual({ a: 42 });
195
+ });
196
+ it("should chain transformations on atom", () => {
197
+ const atomValue = atom(0);
198
+ // Chain by keeping mappable wrapper, then destructure at end
199
+ const chained = atomValue
200
+ .use((_sig, set) => ({ set: (v) => set(v * 2) }))
201
+ .use((_sig, set) => ({ set: (v) => set(v + 1) }));
202
+ const [signal, setter] = chained;
203
+ setter(5);
204
+ // Order: setter(5) -> add 1 -> multiply by 2 = (5 + 1) * 2 = 12
205
+ expect(signal()).toBe(12);
206
+ });
207
+ });
208
+ describe("edge cases", () => {
209
+ it("should handle empty object", () => {
210
+ const [signal, setter] = atom({});
211
+ const mappable = withUse([signal, setter]);
212
+ const [newSignal, newSetter] = mappable.use((sig, set) => ({
213
+ sig: derivedSignal(() => Object.keys(sig()).length, sig),
214
+ set: (count) => set({ count }),
215
+ }));
216
+ expect(newSignal()).toBe(0);
217
+ newSetter(5);
218
+ expect(newSignal()).toBe(1);
219
+ });
220
+ it("should handle null/undefined values", () => {
221
+ const [signal, setter] = atom(null);
222
+ const mappable = withUse([signal, setter]);
223
+ const [newSignal, newSetter] = mappable.use((sig, set) => ({
224
+ sig: derivedSignal(() => sig() ?? 0, sig),
225
+ set: (value) => set(value),
226
+ }));
227
+ expect(newSignal()).toBe(0);
228
+ newSetter(42);
229
+ expect(newSignal()).toBe(42);
230
+ });
231
+ });
232
+ });
233
+ //# sourceMappingURL=withUse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withUse.test.js","sourceRoot":"","sources":["../../src/utils/withUse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Utility functions for rexfect
3
+ */
4
+ export { batch } from "./batch";
5
+ export { untrack } from "./untrack";
6
+ export { pick } from "./pick";
7
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC"}
package/dist/utils.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Utility functions for rexfect
3
+ */
4
+ export { batch } from "./batch";
5
+ export { untrack } from "./untrack";
6
+ export { pick } from "./pick";
7
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,119 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { atom } from "./atom";
3
+ import { effect } from "./effect";
4
+ import { batch } from "./batch";
5
+ import { untrack } from "./untrack";
6
+ import { pick } from "./pick";
7
+ describe("batch", () => {
8
+ it("should batch multiple updates into single effect run", () => {
9
+ const [a, setA] = atom(0);
10
+ const [b, setB] = atom(0);
11
+ const fn = vi.fn(() => {
12
+ a();
13
+ b();
14
+ });
15
+ effect(fn);
16
+ expect(fn).toHaveBeenCalledTimes(1);
17
+ batch(() => {
18
+ setA(1);
19
+ setB(2);
20
+ });
21
+ // Should only run once after batch, not twice
22
+ expect(fn).toHaveBeenCalledTimes(2);
23
+ });
24
+ it("should return the value from the batch function", () => {
25
+ const result = batch(() => {
26
+ return 42;
27
+ });
28
+ expect(result).toBe(42);
29
+ });
30
+ it("should support nested batches", () => {
31
+ const [count, setCount] = atom(0);
32
+ const fn = vi.fn(() => count());
33
+ effect(fn);
34
+ expect(fn).toHaveBeenCalledTimes(1);
35
+ batch(() => {
36
+ setCount(1);
37
+ batch(() => {
38
+ setCount(2);
39
+ });
40
+ setCount(3);
41
+ });
42
+ // Should still batch all updates
43
+ expect(fn).toHaveBeenCalledTimes(2);
44
+ });
45
+ });
46
+ describe("untrack", () => {
47
+ it("should read values without tracking", () => {
48
+ const [count, setCount] = atom(0);
49
+ const [name] = atom("Alice");
50
+ const fn = vi.fn(() => {
51
+ count(); // tracked
52
+ untrack(() => name()); // not tracked
53
+ });
54
+ effect(fn);
55
+ expect(fn).toHaveBeenCalledTimes(1);
56
+ // count change should trigger re-run
57
+ setCount(1);
58
+ expect(fn).toHaveBeenCalledTimes(2);
59
+ });
60
+ it("should return the value from untracked function", () => {
61
+ const [count] = atom(42);
62
+ const result = untrack(() => count());
63
+ expect(result).toBe(42);
64
+ });
65
+ it("should restore tracking after untrack", () => {
66
+ const [a, setA] = atom(0);
67
+ const [b, setB] = atom(0);
68
+ const fn = vi.fn(() => {
69
+ a(); // tracked
70
+ untrack(() => {
71
+ // anything here is not tracked
72
+ });
73
+ b(); // tracked again
74
+ });
75
+ effect(fn);
76
+ expect(fn).toHaveBeenCalledTimes(1);
77
+ setA(1);
78
+ expect(fn).toHaveBeenCalledTimes(2);
79
+ setB(1);
80
+ expect(fn).toHaveBeenCalledTimes(3);
81
+ });
82
+ });
83
+ describe("pick", () => {
84
+ it("should return derived value", () => {
85
+ const [user] = atom({ name: "Alice", age: 30 });
86
+ effect(() => {
87
+ const name = pick(() => user().name);
88
+ expect(name).toBe("Alice");
89
+ });
90
+ });
91
+ it("should only trigger effect when picked value changes", () => {
92
+ const [user, setUser] = atom({ name: "Alice", age: 30 });
93
+ const fn = vi.fn();
94
+ effect(() => {
95
+ const name = pick(() => user().name);
96
+ fn(name);
97
+ });
98
+ expect(fn).toHaveBeenCalledTimes(1);
99
+ expect(fn).toHaveBeenCalledWith("Alice");
100
+ // Change age only - should NOT trigger
101
+ setUser({ name: "Alice", age: 31 });
102
+ // Note: pick creates internal effect, so behavior may vary
103
+ // Change name - should trigger
104
+ setUser({ name: "Bob", age: 31 });
105
+ });
106
+ it("should support custom equality", () => {
107
+ const [data] = atom({ value: 1 });
108
+ effect(() => {
109
+ const value = pick(() => data().value, (a, b) => Math.floor(a) === Math.floor(b));
110
+ expect(typeof value).toBe("number");
111
+ });
112
+ });
113
+ it("should work outside effect (non-reactive)", () => {
114
+ const [count] = atom(42);
115
+ const result = pick(() => count());
116
+ expect(result).toBe(42);
117
+ });
118
+ });
119
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "rexfect",
3
+ "version": "0.0.7",
4
+ "description": "Minimal reactive state management with atoms, effects, and actions",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./async": {
15
+ "types": "./dist/async/index.d.ts",
16
+ "import": "./dist/async/index.js"
17
+ },
18
+ "./react": {
19
+ "types": "./dist/react/index.d.ts",
20
+ "import": "./dist/react/index.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "test": "vitest --no-watch",
29
+ "lint": "tsc --noEmit",
30
+ "publish:patch": "node scripts/publish.js patch",
31
+ "publish:minor": "node scripts/publish.js minor",
32
+ "publish:major": "node scripts/publish.js major"
33
+ },
34
+ "keywords": [
35
+ "reactive",
36
+ "state",
37
+ "atoms",
38
+ "effects",
39
+ "events",
40
+ "signals"
41
+ ],
42
+ "dependencies": {
43
+ "lodash": "^4.17.21"
44
+ },
45
+ "license": "MIT",
46
+ "peerDependencies": {
47
+ "react": "^18.0.0 || ^19.0.0"
48
+ },
49
+ "peerDependenciesMeta": {
50
+ "react": {
51
+ "optional": true
52
+ }
53
+ },
54
+ "devDependencies": {
55
+ "@testing-library/react": "^16.0.0",
56
+ "@types/lodash": "^4.17.15",
57
+ "@types/react": "^19.0.0",
58
+ "@vitest/coverage-v8": "^2.1.9",
59
+ "jsdom": "^27.4.0",
60
+ "react": "^19.0.0",
61
+ "typescript": "^5.3.0",
62
+ "vitest": "^2.0.0"
63
+ }
64
+ }