rask-ui 0.2.5 → 0.2.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 (200) hide show
  1. package/dist/vdom/AbstractVNode.d.ts +20 -1
  2. package/dist/vdom/AbstractVNode.d.ts.map +1 -1
  3. package/dist/vdom/AbstractVNode.js +151 -12
  4. package/dist/vdom/ComponentVNode.d.ts +2 -2
  5. package/dist/vdom/ComponentVNode.d.ts.map +1 -1
  6. package/dist/vdom/ComponentVNode.js +17 -8
  7. package/dist/vdom/ElementVNode.d.ts +6 -9
  8. package/dist/vdom/ElementVNode.d.ts.map +1 -1
  9. package/dist/vdom/ElementVNode.js +103 -34
  10. package/dist/vdom/FragmentVNode.d.ts +2 -2
  11. package/dist/vdom/FragmentVNode.d.ts.map +1 -1
  12. package/dist/vdom/FragmentVNode.js +18 -7
  13. package/dist/vdom/RootVNode.d.ts +2 -2
  14. package/dist/vdom/RootVNode.d.ts.map +1 -1
  15. package/dist/vdom/RootVNode.js +15 -6
  16. package/dist/vdom/dom-utils.d.ts +6 -1
  17. package/dist/vdom/dom-utils.d.ts.map +1 -1
  18. package/dist/vdom/dom-utils.js +20 -1
  19. package/dist/vdom/types.d.ts +12 -0
  20. package/dist/vdom/types.d.ts.map +1 -1
  21. package/package.json +1 -1
  22. package/dist/component.d.ts +0 -38
  23. package/dist/component.d.ts.map +0 -1
  24. package/dist/component.js +0 -130
  25. package/dist/context.d.ts +0 -5
  26. package/dist/context.d.ts.map +0 -1
  27. package/dist/context.js +0 -29
  28. package/dist/createAsync.test.d.ts +0 -2
  29. package/dist/createAsync.test.d.ts.map +0 -1
  30. package/dist/createAsync.test.js +0 -110
  31. package/dist/createAsyncState.d.ts +0 -16
  32. package/dist/createAsyncState.d.ts.map +0 -1
  33. package/dist/createAsyncState.js +0 -24
  34. package/dist/createContext.test.d.ts +0 -2
  35. package/dist/createContext.test.d.ts.map +0 -1
  36. package/dist/createContext.test.js +0 -136
  37. package/dist/createMutation.test.d.ts +0 -2
  38. package/dist/createMutation.test.d.ts.map +0 -1
  39. package/dist/createMutation.test.js +0 -168
  40. package/dist/createQuery.test.d.ts +0 -2
  41. package/dist/createQuery.test.d.ts.map +0 -1
  42. package/dist/createQuery.test.js +0 -156
  43. package/dist/createRef.test.d.ts +0 -2
  44. package/dist/createRef.test.d.ts.map +0 -1
  45. package/dist/createRef.test.js +0 -80
  46. package/dist/createState.test.d.ts +0 -2
  47. package/dist/createState.test.d.ts.map +0 -1
  48. package/dist/createState.test.js +0 -111
  49. package/dist/createView.test.d.ts +0 -2
  50. package/dist/createView.test.d.ts.map +0 -1
  51. package/dist/createView.test.js +0 -203
  52. package/dist/error.test.d.ts +0 -2
  53. package/dist/error.test.d.ts.map +0 -1
  54. package/dist/error.test.js +0 -144
  55. package/dist/integration.test.d.ts +0 -2
  56. package/dist/integration.test.d.ts.map +0 -1
  57. package/dist/integration.test.js +0 -155
  58. package/dist/jsx.d.ts.map +0 -1
  59. package/dist/jsx.js +0 -42
  60. package/dist/observation.test.d.ts +0 -2
  61. package/dist/observation.test.d.ts.map +0 -1
  62. package/dist/observation.test.js +0 -113
  63. package/dist/render-test.d.ts +0 -2
  64. package/dist/render-test.d.ts.map +0 -1
  65. package/dist/render-test.js +0 -21
  66. package/dist/render.d.ts +0 -7
  67. package/dist/render.d.ts.map +0 -1
  68. package/dist/render.js +0 -77
  69. package/dist/suspense.d.ts +0 -25
  70. package/dist/suspense.d.ts.map +0 -1
  71. package/dist/suspense.js +0 -97
  72. package/dist/tests/class.test.d.ts +0 -2
  73. package/dist/tests/class.test.d.ts.map +0 -1
  74. package/dist/tests/class.test.js +0 -185
  75. package/dist/tests/complex-rendering.test.d.ts +0 -2
  76. package/dist/tests/complex-rendering.test.d.ts.map +0 -1
  77. package/dist/tests/complex-rendering.test.js +0 -400
  78. package/dist/tests/component.cleanup.test.d.ts +0 -2
  79. package/dist/tests/component.cleanup.test.d.ts.map +0 -1
  80. package/dist/tests/component.cleanup.test.js +0 -325
  81. package/dist/tests/component.counter.test.d.ts +0 -2
  82. package/dist/tests/component.counter.test.d.ts.map +0 -1
  83. package/dist/tests/component.counter.test.js +0 -124
  84. package/dist/tests/component.interaction.test.d.ts +0 -2
  85. package/dist/tests/component.interaction.test.d.ts.map +0 -1
  86. package/dist/tests/component.interaction.test.js +0 -73
  87. package/dist/tests/component.props.test.d.ts +0 -2
  88. package/dist/tests/component.props.test.d.ts.map +0 -1
  89. package/dist/tests/component.props.test.js +0 -334
  90. package/dist/tests/component.return-types.test.d.ts +0 -2
  91. package/dist/tests/component.return-types.test.d.ts.map +0 -1
  92. package/dist/tests/component.return-types.test.js +0 -357
  93. package/dist/tests/component.state.test.d.ts +0 -2
  94. package/dist/tests/component.state.test.d.ts.map +0 -1
  95. package/dist/tests/component.state.test.js +0 -135
  96. package/dist/tests/component.test.d.ts +0 -2
  97. package/dist/tests/component.test.d.ts.map +0 -1
  98. package/dist/tests/component.test.js +0 -63
  99. package/dist/tests/createAsync.test.d.ts +0 -2
  100. package/dist/tests/createAsync.test.d.ts.map +0 -1
  101. package/dist/tests/createAsync.test.js +0 -110
  102. package/dist/tests/createContext.test.d.ts +0 -2
  103. package/dist/tests/createContext.test.d.ts.map +0 -1
  104. package/dist/tests/createContext.test.js +0 -141
  105. package/dist/tests/createMutation.test.d.ts +0 -2
  106. package/dist/tests/createMutation.test.d.ts.map +0 -1
  107. package/dist/tests/createMutation.test.js +0 -168
  108. package/dist/tests/createQuery.test.d.ts +0 -2
  109. package/dist/tests/createQuery.test.d.ts.map +0 -1
  110. package/dist/tests/createQuery.test.js +0 -156
  111. package/dist/tests/createRef.test.d.ts +0 -2
  112. package/dist/tests/createRef.test.d.ts.map +0 -1
  113. package/dist/tests/createRef.test.js +0 -84
  114. package/dist/tests/createState.test.d.ts +0 -2
  115. package/dist/tests/createState.test.d.ts.map +0 -1
  116. package/dist/tests/createState.test.js +0 -103
  117. package/dist/tests/createView.test.d.ts +0 -2
  118. package/dist/tests/createView.test.d.ts.map +0 -1
  119. package/dist/tests/createView.test.js +0 -203
  120. package/dist/tests/edge-cases.test.d.ts +0 -2
  121. package/dist/tests/edge-cases.test.d.ts.map +0 -1
  122. package/dist/tests/edge-cases.test.js +0 -637
  123. package/dist/tests/error-no-boundary.test.d.ts +0 -2
  124. package/dist/tests/error-no-boundary.test.d.ts.map +0 -1
  125. package/dist/tests/error-no-boundary.test.js +0 -174
  126. package/dist/tests/error.test.d.ts +0 -2
  127. package/dist/tests/error.test.d.ts.map +0 -1
  128. package/dist/tests/error.test.js +0 -199
  129. package/dist/tests/fragment.test.d.ts +0 -2
  130. package/dist/tests/fragment.test.d.ts.map +0 -1
  131. package/dist/tests/fragment.test.js +0 -618
  132. package/dist/tests/integration.test.d.ts +0 -2
  133. package/dist/tests/integration.test.d.ts.map +0 -1
  134. package/dist/tests/integration.test.js +0 -192
  135. package/dist/tests/keys.test.d.ts +0 -2
  136. package/dist/tests/keys.test.d.ts.map +0 -1
  137. package/dist/tests/keys.test.js +0 -293
  138. package/dist/tests/mount.test.d.ts +0 -2
  139. package/dist/tests/mount.test.d.ts.map +0 -1
  140. package/dist/tests/mount.test.js +0 -91
  141. package/dist/tests/observation.test.d.ts +0 -2
  142. package/dist/tests/observation.test.d.ts.map +0 -1
  143. package/dist/tests/observation.test.js +0 -113
  144. package/dist/tests/patch.test.d.ts +0 -2
  145. package/dist/tests/patch.test.d.ts.map +0 -1
  146. package/dist/tests/patch.test.js +0 -498
  147. package/dist/tests/patchChildren.test.d.ts +0 -2
  148. package/dist/tests/patchChildren.test.d.ts.map +0 -1
  149. package/dist/tests/patchChildren.test.js +0 -405
  150. package/dist/tests/primitives.test.d.ts +0 -2
  151. package/dist/tests/primitives.test.d.ts.map +0 -1
  152. package/dist/tests/primitives.test.js +0 -132
  153. package/dist/vdom/class.test.d.ts +0 -2
  154. package/dist/vdom/class.test.d.ts.map +0 -1
  155. package/dist/vdom/class.test.js +0 -143
  156. package/dist/vdom/complex-rendering.test.d.ts +0 -2
  157. package/dist/vdom/complex-rendering.test.d.ts.map +0 -1
  158. package/dist/vdom/complex-rendering.test.js +0 -400
  159. package/dist/vdom/component.cleanup.test.d.ts +0 -2
  160. package/dist/vdom/component.cleanup.test.d.ts.map +0 -1
  161. package/dist/vdom/component.cleanup.test.js +0 -323
  162. package/dist/vdom/component.counter.test.d.ts +0 -2
  163. package/dist/vdom/component.counter.test.d.ts.map +0 -1
  164. package/dist/vdom/component.counter.test.js +0 -124
  165. package/dist/vdom/component.interaction.test.d.ts +0 -2
  166. package/dist/vdom/component.interaction.test.d.ts.map +0 -1
  167. package/dist/vdom/component.interaction.test.js +0 -73
  168. package/dist/vdom/component.props.test.d.ts +0 -2
  169. package/dist/vdom/component.props.test.d.ts.map +0 -1
  170. package/dist/vdom/component.props.test.js +0 -88
  171. package/dist/vdom/component.return-types.test.d.ts +0 -2
  172. package/dist/vdom/component.return-types.test.d.ts.map +0 -1
  173. package/dist/vdom/component.return-types.test.js +0 -357
  174. package/dist/vdom/component.state.test.d.ts +0 -2
  175. package/dist/vdom/component.state.test.d.ts.map +0 -1
  176. package/dist/vdom/component.state.test.js +0 -129
  177. package/dist/vdom/component.test.d.ts +0 -2
  178. package/dist/vdom/component.test.d.ts.map +0 -1
  179. package/dist/vdom/component.test.js +0 -63
  180. package/dist/vdom/edge-cases.test.d.ts +0 -2
  181. package/dist/vdom/edge-cases.test.d.ts.map +0 -1
  182. package/dist/vdom/edge-cases.test.js +0 -637
  183. package/dist/vdom/fragment.test.d.ts +0 -2
  184. package/dist/vdom/fragment.test.d.ts.map +0 -1
  185. package/dist/vdom/fragment.test.js +0 -618
  186. package/dist/vdom/keys.test.d.ts +0 -2
  187. package/dist/vdom/keys.test.d.ts.map +0 -1
  188. package/dist/vdom/keys.test.js +0 -293
  189. package/dist/vdom/mount.test.d.ts +0 -2
  190. package/dist/vdom/mount.test.d.ts.map +0 -1
  191. package/dist/vdom/mount.test.js +0 -91
  192. package/dist/vdom/patch.test.d.ts +0 -2
  193. package/dist/vdom/patch.test.d.ts.map +0 -1
  194. package/dist/vdom/patch.test.js +0 -498
  195. package/dist/vdom/patchChildren.test.d.ts +0 -2
  196. package/dist/vdom/patchChildren.test.d.ts.map +0 -1
  197. package/dist/vdom/patchChildren.test.js +0 -392
  198. package/dist/vdom/primitives.test.d.ts +0 -2
  199. package/dist/vdom/primitives.test.d.ts.map +0 -1
  200. package/dist/vdom/primitives.test.js +0 -132
@@ -1,168 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { createMutation } from './createMutation';
3
- describe('createMutation', () => {
4
- it('should start in idle state', () => {
5
- const mutator = vi.fn(() => Promise.resolve(null));
6
- const mutation = createMutation(mutator);
7
- expect(mutation.isPending).toBe(false);
8
- expect(mutation.params).toBeNull();
9
- expect(mutation.error).toBeNull();
10
- expect(mutator).not.toHaveBeenCalled();
11
- });
12
- it('should execute mutator when mutate is called', async () => {
13
- const mutator = vi.fn((params) => Promise.resolve(params));
14
- const mutation = createMutation(mutator);
15
- mutation.mutate('test');
16
- expect(mutation.isPending).toBe(true);
17
- expect(mutation.params).toBe('test');
18
- expect(mutator).toHaveBeenCalledWith('test');
19
- await new Promise((resolve) => setTimeout(resolve, 10));
20
- expect(mutation.isPending).toBe(false);
21
- expect(mutation.params).toBeNull();
22
- });
23
- it('should handle successful mutations', async () => {
24
- const mutator = (params) => Promise.resolve(params);
25
- const mutation = createMutation(mutator);
26
- mutation.mutate({ id: 1 });
27
- expect(mutation.isPending).toBe(true);
28
- await new Promise((resolve) => setTimeout(resolve, 10));
29
- expect(mutation.isPending).toBe(false);
30
- expect(mutation.error).toBeNull();
31
- expect(mutation.params).toBeNull();
32
- });
33
- it('should handle mutation errors', async () => {
34
- const mutator = (params) => Promise.reject(new Error('Mutation failed'));
35
- const mutation = createMutation(mutator);
36
- mutation.mutate('test');
37
- expect(mutation.isPending).toBe(true);
38
- await new Promise((resolve) => setTimeout(resolve, 10));
39
- expect(mutation.isPending).toBe(false);
40
- expect(mutation.error).toContain('Mutation failed');
41
- expect(mutation.params).toBeNull();
42
- });
43
- it('should cancel previous mutation on new mutate call', async () => {
44
- let resolveFirst;
45
- let resolveSecond;
46
- const firstPromise = new Promise((resolve) => {
47
- resolveFirst = resolve;
48
- });
49
- const secondPromise = new Promise((resolve) => {
50
- resolveSecond = resolve;
51
- });
52
- const mutator = vi
53
- .fn()
54
- .mockReturnValueOnce(firstPromise)
55
- .mockReturnValueOnce(secondPromise);
56
- const mutation = createMutation(mutator);
57
- mutation.mutate('first');
58
- expect(mutation.params).toBe('first');
59
- // Trigger second mutation before first completes
60
- mutation.mutate('second');
61
- expect(mutation.params).toBe('second');
62
- // Resolve first (should be ignored due to cancellation)
63
- resolveFirst('first');
64
- await new Promise((resolve) => setTimeout(resolve, 10));
65
- expect(mutation.isPending).toBe(true); // Still pending second
66
- // Resolve second
67
- resolveSecond('second');
68
- await new Promise((resolve) => setTimeout(resolve, 10));
69
- expect(mutation.isPending).toBe(false);
70
- expect(mutation.params).toBeNull();
71
- });
72
- it('should handle rapid successive mutations', async () => {
73
- let counter = 0;
74
- const mutator = vi.fn(() => Promise.resolve(++counter));
75
- const mutation = createMutation(mutator);
76
- // Rapid mutations
77
- mutation.mutate('1');
78
- mutation.mutate('2');
79
- mutation.mutate('3');
80
- await new Promise((resolve) => setTimeout(resolve, 20));
81
- // Only the last mutation should complete
82
- expect(mutator).toHaveBeenCalledTimes(3);
83
- expect(mutation.isPending).toBe(false);
84
- expect(mutation.params).toBeNull();
85
- });
86
- it('should clear error on successful retry', async () => {
87
- const mutator = vi
88
- .fn()
89
- .mockRejectedValueOnce(new Error('First error'))
90
- .mockResolvedValueOnce('success');
91
- const mutation = createMutation(mutator);
92
- mutation.mutate('attempt1');
93
- await new Promise((resolve) => setTimeout(resolve, 10));
94
- expect(mutation.error).toContain('First error');
95
- mutation.mutate('attempt2');
96
- await new Promise((resolve) => setTimeout(resolve, 10));
97
- expect(mutation.error).toBeNull();
98
- expect(mutation.isPending).toBe(false);
99
- });
100
- it('should handle different parameter types', async () => {
101
- const mutator = vi.fn((params) => Promise.resolve(params));
102
- const mutation = createMutation(mutator);
103
- // Object params
104
- mutation.mutate({ id: 1, name: 'test' });
105
- expect(mutation.params).toEqual({ id: 1, name: 'test' });
106
- await new Promise((resolve) => setTimeout(resolve, 10));
107
- // Array params
108
- const mutation2 = createMutation(mutator);
109
- mutation2.mutate([1, 2, 3]);
110
- expect(mutation2.params).toEqual([1, 2, 3]);
111
- await new Promise((resolve) => setTimeout(resolve, 10));
112
- // String params
113
- const mutation3 = createMutation(mutator);
114
- mutation3.mutate('string');
115
- expect(mutation3.params).toBe('string');
116
- });
117
- it('should convert errors to strings', async () => {
118
- const mutator = (params) => Promise.reject('string error');
119
- const mutation = createMutation(mutator);
120
- mutation.mutate('test');
121
- await new Promise((resolve) => setTimeout(resolve, 10));
122
- expect(typeof mutation.error).toBe('string');
123
- expect(mutation.error).toBe('string error');
124
- });
125
- it('should handle AbortController cancellation correctly', async () => {
126
- const abortedPromise = new Promise((_, reject) => {
127
- const error = new Error('Aborted');
128
- error.name = 'AbortError';
129
- setTimeout(() => reject(error), 5);
130
- });
131
- const successPromise = Promise.resolve('success');
132
- const mutator = vi
133
- .fn()
134
- .mockReturnValueOnce(abortedPromise)
135
- .mockReturnValueOnce(successPromise);
136
- const mutation = createMutation(mutator);
137
- mutation.mutate('first');
138
- // Immediately trigger second mutation to abort first
139
- mutation.mutate('second');
140
- await new Promise((resolve) => setTimeout(resolve, 20));
141
- expect(mutation.isPending).toBe(false);
142
- expect(mutation.error).toBeNull();
143
- });
144
- it('should track params during pending state', () => {
145
- const mutator = () => new Promise((resolve) => setTimeout(() => resolve(null), 100));
146
- const mutation = createMutation(mutator);
147
- const params = { id: 123, action: 'update' };
148
- mutation.mutate(params);
149
- expect(mutation.isPending).toBe(true);
150
- expect(mutation.params).toEqual(params);
151
- });
152
- it('should expose reactive getters', async () => {
153
- const mutator = () => Promise.resolve('data');
154
- const mutation = createMutation(mutator);
155
- // Access getters before mutation
156
- expect(mutation.isPending).toBe(false);
157
- expect(mutation.params).toBeNull();
158
- expect(mutation.error).toBeNull();
159
- mutation.mutate('test');
160
- // Access getters during mutation
161
- expect(mutation.isPending).toBe(true);
162
- expect(mutation.params).toBe('test');
163
- await new Promise((resolve) => setTimeout(resolve, 10));
164
- // Access getters after mutation
165
- expect(mutation.isPending).toBe(false);
166
- expect(mutation.params).toBeNull();
167
- });
168
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=createQuery.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createQuery.test.d.ts","sourceRoot":"","sources":["../src/createQuery.test.ts"],"names":[],"mappings":""}
@@ -1,156 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { createQuery } from './createQuery';
3
- describe('createQuery', () => {
4
- it('should start in pending state and fetch immediately', async () => {
5
- const fetcher = vi.fn(() => Promise.resolve('data'));
6
- const query = createQuery(fetcher);
7
- expect(query.isPending).toBe(true);
8
- expect(query.data).toBeNull();
9
- expect(query.error).toBeNull();
10
- expect(fetcher).toHaveBeenCalledTimes(1);
11
- await new Promise((resolve) => setTimeout(resolve, 10));
12
- expect(query.isPending).toBe(false);
13
- expect(query.data).toBe('data');
14
- });
15
- it('should resolve to data state on success', async () => {
16
- const fetcher = () => Promise.resolve({ id: 1, name: 'Test' });
17
- const query = createQuery(fetcher);
18
- await new Promise((resolve) => setTimeout(resolve, 10));
19
- expect(query.isPending).toBe(false);
20
- expect(query.data).toEqual({ id: 1, name: 'Test' });
21
- expect(query.error).toBeNull();
22
- });
23
- it('should resolve to error state on failure', async () => {
24
- const fetcher = () => Promise.reject(new Error('Network error'));
25
- const query = createQuery(fetcher);
26
- await new Promise((resolve) => setTimeout(resolve, 10));
27
- expect(query.isPending).toBe(false);
28
- expect(query.data).toBeNull();
29
- expect(query.error).toContain('Network error');
30
- });
31
- it('should allow manual refetch', async () => {
32
- const fetcher = vi.fn(() => Promise.resolve('data'));
33
- const query = createQuery(fetcher);
34
- await new Promise((resolve) => setTimeout(resolve, 10));
35
- expect(fetcher).toHaveBeenCalledTimes(1);
36
- query.fetch();
37
- expect(query.isPending).toBe(true);
38
- await new Promise((resolve) => setTimeout(resolve, 10));
39
- expect(fetcher).toHaveBeenCalledTimes(2);
40
- expect(query.isPending).toBe(false);
41
- });
42
- it('should retain old data during refetch by default', async () => {
43
- const fetcher = vi
44
- .fn()
45
- .mockResolvedValueOnce('data1')
46
- .mockResolvedValueOnce('data2');
47
- const query = createQuery(fetcher);
48
- await new Promise((resolve) => setTimeout(resolve, 10));
49
- expect(query.data).toBe('data1');
50
- query.fetch();
51
- expect(query.isPending).toBe(true);
52
- expect(query.data).toBe('data1'); // Old data retained
53
- await new Promise((resolve) => setTimeout(resolve, 10));
54
- expect(query.data).toBe('data2');
55
- });
56
- it('should clear old data when force refetch is used', async () => {
57
- const fetcher = vi
58
- .fn()
59
- .mockResolvedValueOnce('data1')
60
- .mockResolvedValueOnce('data2');
61
- const query = createQuery(fetcher);
62
- await new Promise((resolve) => setTimeout(resolve, 10));
63
- expect(query.data).toBe('data1');
64
- query.fetch(true); // Force refresh
65
- expect(query.isPending).toBe(true);
66
- expect(query.data).toBeNull(); // Old data cleared
67
- await new Promise((resolve) => setTimeout(resolve, 10));
68
- expect(query.data).toBe('data2');
69
- });
70
- it('should cancel previous request on new fetch', async () => {
71
- let resolveFirst;
72
- let resolveSecond;
73
- const firstPromise = new Promise((resolve) => {
74
- resolveFirst = resolve;
75
- });
76
- const secondPromise = new Promise((resolve) => {
77
- resolveSecond = resolve;
78
- });
79
- const fetcher = vi
80
- .fn()
81
- .mockReturnValueOnce(firstPromise)
82
- .mockReturnValueOnce(secondPromise);
83
- const query = createQuery(fetcher);
84
- expect(query.isPending).toBe(true);
85
- // Trigger second fetch before first completes
86
- query.fetch();
87
- // Resolve first (should be ignored due to cancellation)
88
- resolveFirst('first');
89
- await new Promise((resolve) => setTimeout(resolve, 10));
90
- expect(query.data).toBeNull(); // First result ignored
91
- // Resolve second
92
- resolveSecond('second');
93
- await new Promise((resolve) => setTimeout(resolve, 10));
94
- expect(query.data).toBe('second');
95
- });
96
- it('should handle rapid successive fetches', async () => {
97
- let counter = 0;
98
- const fetcher = vi.fn(() => Promise.resolve(`data-${++counter}`));
99
- const query = createQuery(fetcher);
100
- await new Promise((resolve) => setTimeout(resolve, 10));
101
- // Rapid fetches
102
- query.fetch();
103
- query.fetch();
104
- query.fetch();
105
- await new Promise((resolve) => setTimeout(resolve, 20));
106
- // Only the last fetch should matter
107
- expect(fetcher).toHaveBeenCalledTimes(4); // Initial + 3 fetches
108
- expect(query.data).toBe('data-4');
109
- });
110
- it('should cancel on error and allow refetch', async () => {
111
- const fetcher = vi
112
- .fn()
113
- .mockRejectedValueOnce(new Error('First error'))
114
- .mockResolvedValueOnce('success');
115
- const query = createQuery(fetcher);
116
- await new Promise((resolve) => setTimeout(resolve, 10));
117
- expect(query.error).toContain('First error');
118
- expect(query.data).toBeNull();
119
- query.fetch();
120
- await new Promise((resolve) => setTimeout(resolve, 10));
121
- expect(query.error).toBeNull();
122
- expect(query.data).toBe('success');
123
- });
124
- it('should handle AbortController cancellation correctly', async () => {
125
- const abortedPromise = new Promise((_, reject) => {
126
- const error = new Error('Aborted');
127
- error.name = 'AbortError';
128
- setTimeout(() => reject(error), 5);
129
- });
130
- const successPromise = Promise.resolve('success');
131
- const fetcher = vi
132
- .fn()
133
- .mockReturnValueOnce(abortedPromise)
134
- .mockReturnValueOnce(successPromise);
135
- const query = createQuery(fetcher);
136
- // Immediately trigger second fetch to abort first
137
- query.fetch();
138
- await new Promise((resolve) => setTimeout(resolve, 20));
139
- expect(query.data).toBe('success');
140
- expect(query.error).toBeNull();
141
- });
142
- it('should expose reactive getters', async () => {
143
- const fetcher = () => Promise.resolve('data');
144
- const query = createQuery(fetcher);
145
- // Access getters
146
- const pending1 = query.isPending;
147
- const data1 = query.data;
148
- const error1 = query.error;
149
- expect(pending1).toBe(true);
150
- expect(data1).toBeNull();
151
- expect(error1).toBeNull();
152
- await new Promise((resolve) => setTimeout(resolve, 10));
153
- expect(query.isPending).toBe(false);
154
- expect(query.data).toBe('data');
155
- });
156
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=createRef.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createRef.test.d.ts","sourceRoot":"","sources":["../src/createRef.test.tsx"],"names":[],"mappings":""}
@@ -1,80 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "./jsx-runtime";
2
- import { describe, it, expect } from "vitest";
3
- import { createRef } from "./createRef";
4
- import { render } from "./vdom";
5
- describe("createRef", () => {
6
- it("should create a ref with null initial value", () => {
7
- const ref = createRef();
8
- expect(ref.current).toBeNull();
9
- });
10
- it("should be callable as a function", () => {
11
- const ref = createRef();
12
- expect(typeof ref).toBe("function");
13
- });
14
- it("should update current when called with a node", () => {
15
- const ref = createRef();
16
- const element = document.createElement("div");
17
- ref(element);
18
- expect(ref.current).toBe(element);
19
- });
20
- it("should update current when called with null", () => {
21
- const ref = createRef();
22
- const element = document.createElement("div");
23
- ref(element);
24
- expect(ref.current).toBe(element);
25
- ref(null);
26
- expect(ref.current).toBeNull();
27
- });
28
- it("should work with JSX ref attribute", async () => {
29
- const ref = createRef();
30
- function TestComponent() {
31
- return () => _jsx("div", { ref: ref, children: "Hello" });
32
- }
33
- const container = document.createElement("div");
34
- document.body.appendChild(container);
35
- const vnode = render(_jsx(TestComponent, {}), container);
36
- await new Promise((resolve) => setTimeout(resolve, 0));
37
- expect(ref.current).not.toBeNull();
38
- expect(ref.current?.tagName).toBe("DIV");
39
- expect(ref.current?.textContent).toBe("Hello");
40
- document.body.removeChild(vnode.elm);
41
- });
42
- it("should handle multiple ref updates", () => {
43
- const ref = createRef();
44
- const div = document.createElement("div");
45
- const span = document.createElement("span");
46
- ref(div);
47
- expect(ref.current).toBe(div);
48
- ref(span);
49
- expect(ref.current).toBe(span);
50
- ref(null);
51
- expect(ref.current).toBeNull();
52
- });
53
- it("should work with different element types", async () => {
54
- const inputRef = createRef();
55
- const buttonRef = createRef();
56
- function TestComponent() {
57
- return () => (_jsxs("div", { children: [_jsx("input", { ref: inputRef, type: "text" }), _jsx("button", { ref: buttonRef, children: "Click" })] }));
58
- }
59
- const container = document.createElement("div");
60
- document.body.appendChild(container);
61
- const vnode = render(_jsx(TestComponent, {}), container);
62
- await new Promise((resolve) => setTimeout(resolve, 0));
63
- expect(inputRef.current?.tagName).toBe("INPUT");
64
- expect(buttonRef.current?.tagName).toBe("BUTTON");
65
- document.body.removeChild(vnode.elm);
66
- });
67
- it("should allow accessing DOM properties", async () => {
68
- const ref = createRef();
69
- function TestComponent() {
70
- return () => _jsx("input", { ref: ref, type: "text", value: "test" });
71
- }
72
- const container = document.createElement("div");
73
- document.body.appendChild(container);
74
- const vnode = render(_jsx(TestComponent, {}), container);
75
- await new Promise((resolve) => setTimeout(resolve, 0));
76
- expect(ref.current?.value).toBe("test");
77
- expect(ref.current?.type).toBe("text");
78
- document.body.removeChild(vnode.elm);
79
- });
80
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=createState.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createState.test.d.ts","sourceRoot":"","sources":["../src/createState.test.ts"],"names":[],"mappings":""}
@@ -1,111 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { createState } from './createState';
3
- import { Observer } from './observation';
4
- describe('createState', () => {
5
- it('should create a reactive proxy from an object', () => {
6
- const state = createState({ count: 0 });
7
- expect(state.count).toBe(0);
8
- });
9
- it('should allow mutations', () => {
10
- const state = createState({ count: 0 });
11
- state.count = 5;
12
- expect(state.count).toBe(5);
13
- });
14
- it('should return the same proxy for the same object', () => {
15
- const obj = { count: 0 };
16
- const proxy1 = createState(obj);
17
- const proxy2 = createState(obj);
18
- expect(proxy1).toBe(proxy2);
19
- });
20
- it('should create nested proxies for nested objects', () => {
21
- const state = createState({ user: { name: 'Alice', age: 30 } });
22
- state.user.name = 'Bob';
23
- expect(state.user.name).toBe('Bob');
24
- });
25
- it('should handle arrays reactively', () => {
26
- const state = createState({ items: [1, 2, 3] });
27
- state.items.push(4);
28
- expect(state.items).toEqual([1, 2, 3, 4]);
29
- });
30
- it('should track property access in observers', () => {
31
- const state = createState({ count: 0 });
32
- let renderCount = 0;
33
- const observer = new Observer(() => {
34
- renderCount++;
35
- });
36
- const dispose = observer.observe();
37
- state.count; // Access property to track it
38
- dispose();
39
- expect(renderCount).toBe(0);
40
- // Mutate after observation setup
41
- const dispose2 = observer.observe();
42
- const value = state.count; // Track
43
- dispose2(); // Stop observing, subscriptions are now active
44
- state.count = 1;
45
- // Wait for microtask
46
- return new Promise((resolve) => {
47
- queueMicrotask(() => {
48
- expect(renderCount).toBeGreaterThan(0);
49
- resolve(undefined);
50
- });
51
- });
52
- });
53
- it('should handle property deletion', () => {
54
- const state = createState({ count: 0, temp: 'value' });
55
- delete state.temp;
56
- expect(state.temp).toBeUndefined();
57
- expect('temp' in state).toBe(false);
58
- });
59
- it('should not create proxies for functions', () => {
60
- const fn = () => 'hello';
61
- const state = createState({ method: fn });
62
- expect(state.method).toBe(fn);
63
- expect(state.method()).toBe('hello');
64
- });
65
- it('should handle symbol properties', () => {
66
- const sym = Symbol('test');
67
- const state = createState({ [sym]: 'value' });
68
- expect(state[sym]).toBe('value');
69
- });
70
- it('should notify observers only on actual changes', () => {
71
- const state = createState({ count: 0 });
72
- let notifyCount = 0;
73
- const observer = new Observer(() => {
74
- notifyCount++;
75
- });
76
- const dispose = observer.observe();
77
- state.count; // Track
78
- dispose();
79
- state.count = 0; // Same value - should still notify per current implementation
80
- state.count = 0;
81
- return new Promise((resolve) => {
82
- queueMicrotask(() => {
83
- // The implementation notifies even for same value, except for optimization cases
84
- observer.dispose();
85
- resolve(undefined);
86
- });
87
- });
88
- });
89
- it('should handle deeply nested objects', () => {
90
- const state = createState({
91
- level1: {
92
- level2: {
93
- level3: {
94
- value: 'deep',
95
- },
96
- },
97
- },
98
- });
99
- state.level1.level2.level3.value = 'modified';
100
- expect(state.level1.level2.level3.value).toBe('modified');
101
- });
102
- it('should handle array mutations correctly', () => {
103
- const state = createState({ items: [1, 2, 3] });
104
- state.items.pop();
105
- expect(state.items).toEqual([1, 2]);
106
- state.items.unshift(0);
107
- expect(state.items).toEqual([0, 1, 2]);
108
- state.items.splice(1, 1, 99);
109
- expect(state.items).toEqual([0, 99, 2]);
110
- });
111
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=createView.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createView.test.d.ts","sourceRoot":"","sources":["../src/createView.test.ts"],"names":[],"mappings":""}