rask-ui 0.24.0 → 0.24.3

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 (115) hide show
  1. package/dist/asyncState.d.ts +16 -0
  2. package/dist/asyncState.d.ts.map +1 -0
  3. package/dist/asyncState.js +24 -0
  4. package/dist/compiler.d.ts +1 -3
  5. package/dist/compiler.d.ts.map +1 -1
  6. package/dist/compiler.js +1 -7
  7. package/dist/component.d.ts.map +1 -1
  8. package/dist/component.js +10 -17
  9. package/dist/context.d.ts +5 -0
  10. package/dist/context.d.ts.map +1 -0
  11. package/dist/context.js +29 -0
  12. package/dist/createAsync.test.d.ts +2 -0
  13. package/dist/createAsync.test.d.ts.map +1 -0
  14. package/dist/createAsync.test.js +110 -0
  15. package/dist/createContext.d.ts +1 -1
  16. package/dist/createContext.d.ts.map +1 -1
  17. package/dist/createMutation.test.d.ts +2 -0
  18. package/dist/createMutation.test.d.ts.map +1 -0
  19. package/dist/createMutation.test.js +168 -0
  20. package/dist/createQuery.test.d.ts +2 -0
  21. package/dist/createQuery.test.d.ts.map +1 -0
  22. package/dist/createQuery.test.js +156 -0
  23. package/dist/createRef.d.ts +6 -0
  24. package/dist/createRef.d.ts.map +1 -0
  25. package/dist/createRef.js +8 -0
  26. package/dist/createState.d.ts +0 -2
  27. package/dist/createState.d.ts.map +1 -1
  28. package/dist/createState.js +5 -40
  29. package/dist/createState.test.d.ts.map +1 -0
  30. package/dist/createState.test.js +111 -0
  31. package/dist/createView.d.ts +44 -18
  32. package/dist/createView.d.ts.map +1 -1
  33. package/dist/createView.js +48 -57
  34. package/dist/createView.test.d.ts.map +1 -0
  35. package/dist/{tests/createView.test.js → createView.test.js} +40 -40
  36. package/dist/error.d.ts +14 -3
  37. package/dist/error.d.ts.map +1 -1
  38. package/dist/error.js +15 -14
  39. package/dist/jsx.d.ts +256 -10
  40. package/dist/observation.test.d.ts.map +1 -0
  41. package/dist/observation.test.js +150 -0
  42. package/dist/plugin.d.ts +1 -1
  43. package/dist/plugin.js +3 -3
  44. package/dist/suspense.d.ts +25 -0
  45. package/dist/suspense.d.ts.map +1 -0
  46. package/dist/suspense.js +97 -0
  47. package/dist/test-setup.d.ts +16 -0
  48. package/dist/test-setup.d.ts.map +1 -0
  49. package/dist/test-setup.js +40 -0
  50. package/dist/test.d.ts +2 -0
  51. package/dist/test.d.ts.map +1 -0
  52. package/dist/test.js +24 -0
  53. package/dist/transformer.d.ts +4 -0
  54. package/dist/transformer.d.ts.map +1 -0
  55. package/dist/transformer.js +7 -0
  56. package/dist/useCatchError.d.ts +1 -1
  57. package/dist/useCatchError.d.ts.map +1 -1
  58. package/package.json +4 -4
  59. package/swc-plugin/target/wasm32-wasip1/release/swc_plugin_rask_component.wasm +0 -0
  60. package/dist/createComputed.d.ts +0 -4
  61. package/dist/createComputed.d.ts.map +0 -1
  62. package/dist/createComputed.js +0 -69
  63. package/dist/createEffect.d.ts +0 -2
  64. package/dist/createEffect.d.ts.map +0 -1
  65. package/dist/createEffect.js +0 -29
  66. package/dist/createRouter.d.ts +0 -8
  67. package/dist/createRouter.d.ts.map +0 -1
  68. package/dist/createRouter.js +0 -27
  69. package/dist/createTask.d.ts +0 -31
  70. package/dist/createTask.d.ts.map +0 -1
  71. package/dist/createTask.js +0 -79
  72. package/dist/patchInferno.d.ts +0 -6
  73. package/dist/patchInferno.d.ts.map +0 -1
  74. package/dist/patchInferno.js +0 -53
  75. package/dist/scheduler.d.ts +0 -4
  76. package/dist/scheduler.d.ts.map +0 -1
  77. package/dist/scheduler.js +0 -107
  78. package/dist/tests/batch.test.d.ts +0 -2
  79. package/dist/tests/batch.test.d.ts.map +0 -1
  80. package/dist/tests/batch.test.js +0 -244
  81. package/dist/tests/createComputed.test.d.ts +0 -2
  82. package/dist/tests/createComputed.test.d.ts.map +0 -1
  83. package/dist/tests/createComputed.test.js +0 -257
  84. package/dist/tests/createContext.test.d.ts +0 -2
  85. package/dist/tests/createContext.test.d.ts.map +0 -1
  86. package/dist/tests/createContext.test.js +0 -136
  87. package/dist/tests/createEffect.test.d.ts +0 -2
  88. package/dist/tests/createEffect.test.d.ts.map +0 -1
  89. package/dist/tests/createEffect.test.js +0 -467
  90. package/dist/tests/createState.test.d.ts.map +0 -1
  91. package/dist/tests/createState.test.js +0 -144
  92. package/dist/tests/createTask.test.d.ts +0 -2
  93. package/dist/tests/createTask.test.d.ts.map +0 -1
  94. package/dist/tests/createTask.test.js +0 -322
  95. package/dist/tests/createView.test.d.ts.map +0 -1
  96. package/dist/tests/error.test.d.ts +0 -2
  97. package/dist/tests/error.test.d.ts.map +0 -1
  98. package/dist/tests/error.test.js +0 -168
  99. package/dist/tests/observation.test.d.ts.map +0 -1
  100. package/dist/tests/observation.test.js +0 -341
  101. package/dist/useComputed.d.ts +0 -5
  102. package/dist/useComputed.d.ts.map +0 -1
  103. package/dist/useComputed.js +0 -69
  104. package/dist/useQuery.d.ts +0 -25
  105. package/dist/useQuery.d.ts.map +0 -1
  106. package/dist/useQuery.js +0 -25
  107. package/dist/useSuspendAsync.d.ts +0 -18
  108. package/dist/useSuspendAsync.d.ts.map +0 -1
  109. package/dist/useSuspendAsync.js +0 -37
  110. package/dist/useTask.d.ts +0 -25
  111. package/dist/useTask.d.ts.map +0 -1
  112. package/dist/useTask.js +0 -70
  113. /package/dist/{tests/createState.test.d.ts → createState.test.d.ts} +0 -0
  114. /package/dist/{tests/createView.test.d.ts → createView.test.d.ts} +0 -0
  115. /package/dist/{tests/observation.test.d.ts → observation.test.d.ts} +0 -0
@@ -1,341 +0,0 @@
1
- import { describe, it, expect, vi } from "vitest";
2
- import { Signal, Observer, getCurrentObserver } from "../observation";
3
- describe("Signal-Observer System (Optimized)", () => {
4
- describe("Observer", () => {
5
- it("should track signals during observation", () => {
6
- const callback = vi.fn();
7
- const observer = new Observer(callback);
8
- const signal = new Signal();
9
- const dispose = observer.observe();
10
- observer.subscribeSignal(signal);
11
- dispose();
12
- signal.notify();
13
- return new Promise((resolve) => {
14
- queueMicrotask(() => {
15
- expect(callback).toHaveBeenCalledTimes(1);
16
- resolve(undefined);
17
- });
18
- });
19
- });
20
- it("should handle multiple signals", async () => {
21
- const callback = vi.fn();
22
- const observer = new Observer(callback);
23
- const signal1 = new Signal();
24
- const signal2 = new Signal();
25
- const dispose = observer.observe();
26
- observer.subscribeSignal(signal1);
27
- observer.subscribeSignal(signal2);
28
- dispose();
29
- signal1.notify();
30
- await new Promise((resolve) => queueMicrotask(() => resolve()));
31
- expect(callback).toHaveBeenCalledTimes(1);
32
- signal2.notify();
33
- await new Promise((resolve) => queueMicrotask(() => resolve()));
34
- expect(callback).toHaveBeenCalledTimes(2);
35
- });
36
- it("should clear signals when observing again", async () => {
37
- let callCount = 0;
38
- const observer = new Observer(() => {
39
- callCount++;
40
- });
41
- const signal1 = new Signal();
42
- const signal2 = new Signal();
43
- // First observation
44
- let dispose = observer.observe();
45
- observer.subscribeSignal(signal1);
46
- dispose();
47
- // Second observation - should clear previous signals
48
- dispose = observer.observe();
49
- observer.subscribeSignal(signal2);
50
- dispose();
51
- // Notify first signal - should not trigger observer
52
- signal1.notify();
53
- await new Promise((resolve) => queueMicrotask(() => resolve()));
54
- expect(callCount).toBe(0);
55
- // Notify second signal - should trigger observer
56
- signal2.notify();
57
- await new Promise((resolve) => queueMicrotask(() => resolve()));
58
- expect(callCount).toBe(1);
59
- });
60
- it("should dispose of all signal subscriptions", async () => {
61
- const callback = vi.fn();
62
- const observer = new Observer(callback);
63
- const signal = new Signal();
64
- const dispose = observer.observe();
65
- observer.subscribeSignal(signal);
66
- dispose();
67
- observer.dispose();
68
- signal.notify();
69
- await new Promise((resolve) => queueMicrotask(() => resolve()));
70
- expect(callback).not.toHaveBeenCalled();
71
- });
72
- it("should not notify after disposal", async () => {
73
- const callback = vi.fn();
74
- const observer = new Observer(callback);
75
- const signal = new Signal();
76
- const dispose = observer.observe();
77
- observer.subscribeSignal(signal);
78
- dispose();
79
- observer.dispose();
80
- signal.notify();
81
- await new Promise((resolve) => queueMicrotask(() => resolve()));
82
- expect(callback).not.toHaveBeenCalled();
83
- });
84
- it("should set current observer during observation", () => {
85
- const observer = new Observer(() => { });
86
- expect(getCurrentObserver()).toBeUndefined();
87
- const dispose = observer.observe();
88
- expect(getCurrentObserver()).toBe(observer);
89
- dispose();
90
- expect(getCurrentObserver()).toBeUndefined();
91
- });
92
- it("should handle nested observations with stack", () => {
93
- const observer1 = new Observer(() => { });
94
- const observer2 = new Observer(() => { });
95
- const dispose1 = observer1.observe();
96
- expect(getCurrentObserver()).toBe(observer1);
97
- const dispose2 = observer2.observe();
98
- expect(getCurrentObserver()).toBe(observer2);
99
- dispose2();
100
- expect(getCurrentObserver()).toBe(observer1);
101
- dispose1();
102
- expect(getCurrentObserver()).toBeUndefined();
103
- });
104
- });
105
- describe("Signal", () => {
106
- it("should notify all subscribed observers", async () => {
107
- const signal = new Signal();
108
- const callback1 = vi.fn();
109
- const callback2 = vi.fn();
110
- const observer1 = new Observer(callback1);
111
- const observer2 = new Observer(callback2);
112
- const dispose1 = observer1.observe();
113
- observer1.subscribeSignal(signal);
114
- dispose1();
115
- const dispose2 = observer2.observe();
116
- observer2.subscribeSignal(signal);
117
- dispose2();
118
- signal.notify();
119
- await new Promise((resolve) => queueMicrotask(() => resolve()));
120
- expect(callback1).toHaveBeenCalledTimes(1);
121
- expect(callback2).toHaveBeenCalledTimes(1);
122
- });
123
- it("should handle empty signal (no subscribers)", () => {
124
- const signal = new Signal();
125
- // Should not throw
126
- expect(() => signal.notify()).not.toThrow();
127
- });
128
- });
129
- describe("Optimization: Epoch Barrier", () => {
130
- it("should NOT notify new subscriptions created during notify", async () => {
131
- const signal = new Signal();
132
- const callback1 = vi.fn();
133
- const callback2 = vi.fn();
134
- const observer1 = new Observer(callback1);
135
- const observer2 = new Observer(() => {
136
- callback2();
137
- // Subscribe a new observer DURING notification
138
- const dispose = observer3.observe();
139
- observer3.subscribeSignal(signal);
140
- dispose();
141
- });
142
- const observer3 = new Observer(vi.fn());
143
- const dispose1 = observer1.observe();
144
- observer1.subscribeSignal(signal);
145
- dispose1();
146
- const dispose2 = observer2.observe();
147
- observer2.subscribeSignal(signal);
148
- dispose2();
149
- signal.notify();
150
- await new Promise((resolve) => queueMicrotask(() => resolve()));
151
- // observer1 and observer2 should fire
152
- expect(callback1).toHaveBeenCalledTimes(1);
153
- expect(callback2).toHaveBeenCalledTimes(1);
154
- // observer3 should NOT fire in the same notify pass (added during notify)
155
- // This is tested implicitly - if it fired, we'd see 3 calls above
156
- });
157
- it("should notify new subscriptions on NEXT notify", async () => {
158
- const signal = new Signal();
159
- let observer3Created = false;
160
- const callback3 = vi.fn();
161
- const observer3 = new Observer(callback3);
162
- const observer1 = new Observer(() => {
163
- if (!observer3Created) {
164
- observer3Created = true;
165
- const dispose = observer3.observe();
166
- observer3.subscribeSignal(signal);
167
- dispose();
168
- }
169
- });
170
- const dispose1 = observer1.observe();
171
- observer1.subscribeSignal(signal);
172
- dispose1();
173
- // First notify - observer3 gets created but should not fire
174
- signal.notify();
175
- await new Promise((resolve) => queueMicrotask(() => resolve()));
176
- expect(callback3).toHaveBeenCalledTimes(0);
177
- // Second notify - observer3 should now fire
178
- signal.notify();
179
- await new Promise((resolve) => queueMicrotask(() => resolve()));
180
- expect(callback3).toHaveBeenCalledTimes(1);
181
- });
182
- });
183
- describe("Optimization: Safe Unsubscribe During Notify", () => {
184
- it("should handle observer disposing itself during notification", async () => {
185
- const signal = new Signal();
186
- const callback1 = vi.fn();
187
- const callback2 = vi.fn();
188
- const observer1 = new Observer(() => {
189
- callback1();
190
- observer1.dispose(); // Dispose itself during notification
191
- });
192
- const observer2 = new Observer(callback2);
193
- const dispose1 = observer1.observe();
194
- observer1.subscribeSignal(signal);
195
- dispose1();
196
- const dispose2 = observer2.observe();
197
- observer2.subscribeSignal(signal);
198
- dispose2();
199
- // First notify - both should fire, observer1 disposes itself
200
- signal.notify();
201
- await new Promise((resolve) => queueMicrotask(() => resolve()));
202
- expect(callback1).toHaveBeenCalledTimes(1);
203
- expect(callback2).toHaveBeenCalledTimes(1);
204
- // Second notify - only observer2 should fire
205
- signal.notify();
206
- await new Promise((resolve) => queueMicrotask(() => resolve()));
207
- expect(callback1).toHaveBeenCalledTimes(1); // Still 1
208
- expect(callback2).toHaveBeenCalledTimes(2); // Incremented
209
- });
210
- it("should handle observer clearing signals during notification", async () => {
211
- const signal1 = new Signal();
212
- const signal2 = new Signal();
213
- const callback = vi.fn();
214
- const observer = new Observer(() => {
215
- callback();
216
- // Re-observe, which clears all signals
217
- const dispose = observer.observe();
218
- observer.subscribeSignal(signal2);
219
- dispose();
220
- });
221
- const dispose = observer.observe();
222
- observer.subscribeSignal(signal1);
223
- dispose();
224
- signal1.notify();
225
- await new Promise((resolve) => queueMicrotask(() => resolve()));
226
- expect(callback).toHaveBeenCalledTimes(1);
227
- // Should not respond to signal1 anymore
228
- signal1.notify();
229
- await new Promise((resolve) => queueMicrotask(() => resolve()));
230
- expect(callback).toHaveBeenCalledTimes(1);
231
- // Should respond to signal2
232
- signal2.notify();
233
- await new Promise((resolve) => queueMicrotask(() => resolve()));
234
- expect(callback).toHaveBeenCalledTimes(2);
235
- });
236
- });
237
- describe("Optimization: Memory Efficiency", () => {
238
- it("should clean up subscriptions when observer is disposed", async () => {
239
- const signal = new Signal();
240
- const observers = Array.from({ length: 100 }, () => new Observer(() => { }));
241
- // Subscribe all observers
242
- observers.forEach((observer) => {
243
- const dispose = observer.observe();
244
- observer.subscribeSignal(signal);
245
- dispose();
246
- });
247
- // Dispose half of them
248
- observers.slice(0, 50).forEach((observer) => observer.dispose());
249
- // Notify - should not throw or have issues
250
- expect(() => signal.notify()).not.toThrow();
251
- // Cleanup
252
- observers.slice(50).forEach((observer) => observer.dispose());
253
- });
254
- it("should handle multiple observe/clearSignals cycles", () => {
255
- const observer = new Observer(() => { });
256
- const signal1 = new Signal();
257
- const signal2 = new Signal();
258
- const signal3 = new Signal();
259
- // First cycle
260
- let dispose = observer.observe();
261
- observer.subscribeSignal(signal1);
262
- dispose();
263
- // Second cycle - clears signal1
264
- dispose = observer.observe();
265
- observer.subscribeSignal(signal2);
266
- dispose();
267
- // Third cycle - clears signal2
268
- dispose = observer.observe();
269
- observer.subscribeSignal(signal3);
270
- dispose();
271
- // Should not throw
272
- expect(() => {
273
- signal1.notify();
274
- signal2.notify();
275
- signal3.notify();
276
- }).not.toThrow();
277
- });
278
- });
279
- describe("Edge Cases", () => {
280
- it("should handle rapid consecutive notifies", async () => {
281
- const signal = new Signal();
282
- const callback = vi.fn();
283
- const observer = new Observer(callback);
284
- const dispose = observer.observe();
285
- observer.subscribeSignal(signal);
286
- dispose();
287
- // Rapid notifies
288
- signal.notify();
289
- signal.notify();
290
- signal.notify();
291
- await new Promise((resolve) => queueMicrotask(() => resolve()));
292
- // Due to batching, exact count depends on implementation
293
- // But should have been called at least once
294
- expect(callback).toHaveBeenCalled();
295
- });
296
- it("should not notify after subscribeSignal on disposed observer", async () => {
297
- const signal = new Signal();
298
- const callback = vi.fn();
299
- const observer = new Observer(callback);
300
- observer.dispose();
301
- const dispose = observer.observe();
302
- observer.subscribeSignal(signal);
303
- dispose();
304
- signal.notify();
305
- await new Promise((resolve) => queueMicrotask(() => resolve()));
306
- expect(callback).not.toHaveBeenCalled();
307
- });
308
- it("should handle complex subscription graph", async () => {
309
- // Create a diamond dependency pattern
310
- const signal1 = new Signal();
311
- const signal2 = new Signal();
312
- const signal3 = new Signal();
313
- const calls = [];
314
- const observer1 = new Observer(() => {
315
- calls.push("o1");
316
- signal2.notify();
317
- signal3.notify();
318
- });
319
- const observer2 = new Observer(() => calls.push("o2"));
320
- const observer3 = new Observer(() => calls.push("o3"));
321
- // observer1 listens to signal1
322
- let dispose = observer1.observe();
323
- observer1.subscribeSignal(signal1);
324
- dispose();
325
- // observer2 listens to signal2
326
- dispose = observer2.observe();
327
- observer2.subscribeSignal(signal2);
328
- dispose();
329
- // observer3 listens to signal3
330
- dispose = observer3.observe();
331
- observer3.subscribeSignal(signal3);
332
- dispose();
333
- signal1.notify();
334
- await new Promise((resolve) => queueMicrotask(() => resolve()));
335
- // All should have been called
336
- expect(calls).toContain("o1");
337
- expect(calls).toContain("o2");
338
- expect(calls).toContain("o3");
339
- });
340
- });
341
- });
@@ -1,5 +0,0 @@
1
- export type Computed<T extends Record<string, () => any>> = {
2
- [K in keyof T]: ReturnType<T[K]>;
3
- };
4
- export declare function useComputed<T extends Record<string, () => any>>(computed: T): Computed<T>;
5
- //# sourceMappingURL=useComputed.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useComputed.d.ts","sourceRoot":"","sources":["../src/useComputed.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI;KACzD,CAAC,IAAI,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACjC,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAC7D,QAAQ,EAAE,CAAC,GACV,QAAQ,CAAC,CAAC,CAAC,CA0Eb"}
@@ -1,69 +0,0 @@
1
- import { getCurrentComponent, useCleanup } from "./component";
2
- import { INSPECT_MARKER, INSPECTOR_ENABLED } from "./inspect";
3
- import { getCurrentObserver, Observer, Signal } from "./observation";
4
- export function useComputed(computed) {
5
- const currentComponent = getCurrentComponent();
6
- const proxy = {};
7
- let notifyInspectorRef = {};
8
- for (const prop in computed) {
9
- let isDirty = true;
10
- let value;
11
- const signal = new Signal();
12
- const computedObserver = new Observer(() => {
13
- isDirty = true;
14
- signal.notify();
15
- if (INSPECTOR_ENABLED) {
16
- notifyInspectorRef.current?.notify({
17
- type: "computed",
18
- path: notifyInspectorRef.current.path.concat(prop),
19
- isDirty: true,
20
- value,
21
- });
22
- }
23
- });
24
- useCleanup(() => computedObserver.dispose());
25
- Object.defineProperty(proxy, prop, {
26
- enumerable: true,
27
- configurable: true,
28
- get() {
29
- const currentObserver = getCurrentObserver();
30
- if (currentObserver) {
31
- currentObserver.subscribeSignal(signal);
32
- }
33
- if (isDirty) {
34
- const stopObserving = computedObserver.observe();
35
- value = computed[prop]();
36
- stopObserving();
37
- isDirty = false;
38
- if (INSPECTOR_ENABLED) {
39
- notifyInspectorRef.current?.notify({
40
- type: "computed",
41
- path: notifyInspectorRef.current.path.concat(prop),
42
- isDirty: false,
43
- value,
44
- });
45
- }
46
- return value;
47
- }
48
- return value;
49
- },
50
- });
51
- }
52
- if (INSPECTOR_ENABLED) {
53
- Object.defineProperty(proxy, INSPECT_MARKER, {
54
- enumerable: false,
55
- configurable: false,
56
- get() {
57
- return !notifyInspectorRef.current;
58
- },
59
- set: (value) => {
60
- Object.defineProperty(notifyInspectorRef, "current", {
61
- get() {
62
- return value.current;
63
- },
64
- });
65
- },
66
- });
67
- }
68
- return proxy;
69
- }
@@ -1,25 +0,0 @@
1
- type QueryState<T, I = null> = {
2
- isPending: true;
3
- error: null;
4
- value: I;
5
- } | {
6
- isPending: false;
7
- error: null;
8
- value: T;
9
- } | {
10
- isPending: false;
11
- error: string;
12
- value: I | null;
13
- };
14
- export type Query<T, P, I = null> = [
15
- QueryState<T, I>,
16
- [
17
- P
18
- ] extends [never] ? (params: P) => void : () => void
19
- ];
20
- export declare function useQuery<T>(query: () => Promise<T>): Query<T, never>;
21
- export declare function useQuery<T>(query: () => Promise<T>, initialValue: T): Query<T, never, T>;
22
- export declare function useQuery<T, P>(query: (params: P) => Promise<T>): Query<T, never>;
23
- export declare function useQuery<T, P>(query: (params: P) => Promise<T>, initialValue: T): Query<T, never, T>;
24
- export {};
25
- //# sourceMappingURL=useQuery.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../src/useQuery.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,IACvB;IACE,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,CAAC,CAAC;CACV,GACD;IACE,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,CAAC,CAAC;CACV,GACD;IACE,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;CACjB,CAAC;AAEN,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,IAAI;IAClC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAChB;QAAC,CAAC;KAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;CACvD,CAAC;AAEF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACtE,wBAAgB,QAAQ,CAAC,CAAC,EACxB,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACvB,YAAY,EAAE,CAAC,GACd,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACtB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAC3B,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAC/B,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACnB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAC3B,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAChC,YAAY,EAAE,CAAC,GACd,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC"}
package/dist/useQuery.js DELETED
@@ -1,25 +0,0 @@
1
- import { useEffect } from "./useEffect";
2
- import { useTask } from "./useTask";
3
- export function useQuery(query, initialValue) {
4
- const [taskState, runTask] = useTask(query);
5
- let lastValue = initialValue === undefined ? null : initialValue;
6
- useEffect(() => {
7
- if (taskState.result) {
8
- lastValue = taskState.result;
9
- }
10
- });
11
- return [
12
- {
13
- get value() {
14
- return taskState.result || lastValue;
15
- },
16
- get isPending() {
17
- return taskState.isPending;
18
- },
19
- get error() {
20
- return taskState.error;
21
- },
22
- },
23
- runTask,
24
- ];
25
- }
@@ -1,18 +0,0 @@
1
- import { AsyncState } from "./useAsync";
2
- type SuspendAsyncState<T extends Record<string, AsyncState<any>>> = {
3
- values: {
4
- [K in keyof T]: T[K]["value"];
5
- };
6
- } & ({
7
- isPending: true;
8
- error: null;
9
- } | {
10
- isPending: false;
11
- error: string;
12
- } | {
13
- isPending: false;
14
- error: null;
15
- });
16
- export declare function useSuspendAsync<T extends Record<string, AsyncState<any>>>(asyncs: T): SuspendAsyncState<T>;
17
- export {};
18
- //# sourceMappingURL=useSuspendAsync.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSuspendAsync.d.ts","sourceRoot":"","sources":["../src/useSuspendAsync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxC,KAAK,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI;IAClE,MAAM,EAAE;SACL,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;KAC9B,CAAC;CACH,GAAG,CACA;IACE,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,IAAI,CAAC;CACb,GACD;IACE,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC;CACb,CACJ,CAAC;AAEF,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EACvE,MAAM,EAAE,CAAC,wBAyCV"}
@@ -1,37 +0,0 @@
1
- import { useEffect } from "./useEffect";
2
- import { useState } from "./useState";
3
- export function useSuspendAsync(asyncs) {
4
- const state = useState({
5
- isPending: false,
6
- error: null,
7
- values: Object.keys(asyncs).reduce((aggr, key) => ({ ...aggr, [key]: asyncs[key].value }), {}),
8
- });
9
- useEffect(() => {
10
- let isPending = false;
11
- let error = "";
12
- for (const key in asyncs) {
13
- if (asyncs[key].error) {
14
- error += asyncs[key].error + "\n";
15
- continue;
16
- }
17
- if (asyncs[key].isPending) {
18
- isPending = true;
19
- continue;
20
- }
21
- }
22
- if (error) {
23
- state.isPending = false;
24
- state.error = error;
25
- return;
26
- }
27
- if (isPending) {
28
- state.isPending = false;
29
- state.error = null;
30
- return;
31
- }
32
- for (const key in asyncs) {
33
- state.values[key] = asyncs[key].value;
34
- }
35
- });
36
- return state;
37
- }
package/dist/useTask.d.ts DELETED
@@ -1,25 +0,0 @@
1
- export type TaskState<P, T> = {
2
- isPending: false;
3
- params: null;
4
- result: null;
5
- error: null;
6
- } | {
7
- isPending: true;
8
- result: T | null;
9
- params: P;
10
- error: null;
11
- } | {
12
- isPending: false;
13
- params: null;
14
- result: T;
15
- error: null;
16
- } | {
17
- isPending: false;
18
- params: null;
19
- result: null;
20
- error: string;
21
- };
22
- export type Task<A, B = never> = [B] extends [never] ? [TaskState<null, A>, () => void] : [TaskState<A, B>, (params: A) => void];
23
- export declare function useTask<T>(task: (params: undefined, signal: AbortSignal) => Promise<T>): Task<T>;
24
- export declare function useTask<P, T>(task: (params: P, signal: AbortSignal) => Promise<T>): Task<P, T>;
25
- //# sourceMappingURL=useTask.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTask.d.ts","sourceRoot":"","sources":["../src/useTask.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,IACtB;IACE,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,EAAE,IAAI,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;CACb,GACD;IACE,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACjB,MAAM,EAAE,CAAC,CAAC;IACV,KAAK,EAAE,IAAI,CAAC;CACb,GACD;IACE,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,EAAE,CAAC,CAAC;IACV,KAAK,EAAE,IAAI,CAAC;CACb,GACD;IACE,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,EAAE,IAAI,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,MAAM,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAChD,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,GAChC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;AAE3C,wBAAgB,OAAO,CAAC,CAAC,EACvB,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3D,IAAI,CAAC,CAAC,CAAC,CAAC;AACX,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAC1B,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GACnD,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
package/dist/useTask.js DELETED
@@ -1,70 +0,0 @@
1
- import { useCleanup, getCurrentComponent } from "./component";
2
- import { assignState, useState } from "./useState";
3
- export function useTask(task) {
4
- const currentComponent = getCurrentComponent();
5
- if (!currentComponent || currentComponent.isRendering) {
6
- throw new Error("Only use createTask in component setup");
7
- }
8
- const state = useState({
9
- isPending: false,
10
- result: null,
11
- error: null,
12
- params: null,
13
- });
14
- let currentAbortController;
15
- const fetch = (params) => {
16
- currentAbortController?.abort();
17
- const abortController = (currentAbortController = new AbortController());
18
- const promise = task(params, abortController.signal);
19
- promise
20
- .then((result) => {
21
- if (abortController.signal.aborted) {
22
- return;
23
- }
24
- assignState(state, {
25
- isPending: false,
26
- result,
27
- error: null,
28
- params: null,
29
- });
30
- })
31
- .catch((error) => {
32
- if (abortController.signal.aborted) {
33
- return;
34
- }
35
- assignState(state, {
36
- isPending: false,
37
- result: null,
38
- error: String(error),
39
- params: null,
40
- });
41
- });
42
- return promise;
43
- };
44
- useCleanup(() => currentAbortController?.abort());
45
- return [
46
- {
47
- get isPending() {
48
- return state.isPending;
49
- },
50
- get result() {
51
- return state.result;
52
- },
53
- get error() {
54
- return state.error;
55
- },
56
- get params() {
57
- return state.params;
58
- },
59
- },
60
- (params) => {
61
- fetch(params);
62
- assignState(state, {
63
- isPending: true,
64
- result: null,
65
- error: null,
66
- params: (params || null),
67
- });
68
- },
69
- ];
70
- }