@tanstack/solid-query 5.0.0-alpha.6 → 5.0.0-alpha.61

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 (161) hide show
  1. package/build/lib/QueryClient.cjs +12 -0
  2. package/build/lib/QueryClient.cjs.map +1 -0
  3. package/build/lib/QueryClient.d.ts +30 -0
  4. package/build/lib/QueryClient.d.ts.map +1 -0
  5. package/build/lib/QueryClient.js +10 -0
  6. package/build/lib/QueryClient.js.map +1 -0
  7. package/build/lib/QueryClientProvider.cjs +35 -0
  8. package/build/lib/QueryClientProvider.cjs.map +1 -0
  9. package/build/{types → lib}/QueryClientProvider.d.ts +3 -2
  10. package/build/lib/QueryClientProvider.d.ts.map +1 -0
  11. package/build/lib/QueryClientProvider.js +31 -0
  12. package/build/lib/QueryClientProvider.js.map +1 -0
  13. package/build/lib/__tests__/QueryClientProvider.test.d.ts +2 -0
  14. package/build/lib/__tests__/QueryClientProvider.test.d.ts.map +1 -0
  15. package/build/lib/__tests__/createInfiniteQuery.test.d.ts +2 -0
  16. package/build/lib/__tests__/createInfiniteQuery.test.d.ts.map +1 -0
  17. package/build/lib/__tests__/createMutation.test.d.ts +2 -0
  18. package/build/lib/__tests__/createMutation.test.d.ts.map +1 -0
  19. package/build/lib/__tests__/createQueries.test.d.ts +2 -0
  20. package/build/lib/__tests__/createQueries.test.d.ts.map +1 -0
  21. package/build/lib/__tests__/createQuery.test.d.ts +2 -0
  22. package/build/lib/__tests__/createQuery.test.d.ts.map +1 -0
  23. package/build/lib/__tests__/createQuery.types.test.d.ts +3 -0
  24. package/build/lib/__tests__/createQuery.types.test.d.ts.map +1 -0
  25. package/build/lib/__tests__/suspense.test.d.ts +2 -0
  26. package/build/lib/__tests__/suspense.test.d.ts.map +1 -0
  27. package/build/lib/__tests__/transition.test.d.ts +2 -0
  28. package/build/lib/__tests__/transition.test.d.ts.map +1 -0
  29. package/build/lib/__tests__/useIsFetching.test.d.ts +2 -0
  30. package/build/lib/__tests__/useIsFetching.test.d.ts.map +1 -0
  31. package/build/lib/__tests__/useIsMutating.test.d.ts +2 -0
  32. package/build/lib/__tests__/useIsMutating.test.d.ts.map +1 -0
  33. package/build/{types → lib}/__tests__/utils.d.ts +4 -3
  34. package/build/lib/__tests__/utils.d.ts.map +1 -0
  35. package/build/lib/createBaseQuery.cjs +192 -0
  36. package/build/lib/createBaseQuery.cjs.map +1 -0
  37. package/build/{types → lib}/createBaseQuery.d.ts +3 -1
  38. package/build/lib/createBaseQuery.d.ts.map +1 -0
  39. package/build/lib/createBaseQuery.js +190 -0
  40. package/build/lib/createBaseQuery.js.map +1 -0
  41. package/build/lib/createInfiniteQuery.cjs +14 -0
  42. package/build/lib/createInfiniteQuery.cjs.map +1 -0
  43. package/build/{types → lib}/createInfiniteQuery.d.ts +3 -1
  44. package/build/lib/createInfiniteQuery.d.ts.map +1 -0
  45. package/build/lib/createInfiniteQuery.js +12 -0
  46. package/build/lib/createInfiniteQuery.js.map +1 -0
  47. package/build/lib/createMutation.cjs +44 -0
  48. package/build/lib/createMutation.cjs.map +1 -0
  49. package/build/{types → lib}/createMutation.d.ts +3 -1
  50. package/build/lib/createMutation.d.ts.map +1 -0
  51. package/build/lib/createMutation.js +42 -0
  52. package/build/lib/createMutation.js.map +1 -0
  53. package/build/lib/createQueries.cjs +52 -0
  54. package/build/lib/createQueries.cjs.map +1 -0
  55. package/build/{types → lib}/createQueries.d.ts +12 -9
  56. package/build/lib/createQueries.d.ts.map +1 -0
  57. package/build/lib/createQueries.js +50 -0
  58. package/build/lib/createQueries.js.map +1 -0
  59. package/build/lib/createQuery.cjs +16 -0
  60. package/build/lib/createQuery.cjs.map +1 -0
  61. package/build/lib/createQuery.d.ts +15 -0
  62. package/build/lib/createQuery.d.ts.map +1 -0
  63. package/build/lib/createQuery.js +13 -0
  64. package/build/lib/createQuery.js.map +1 -0
  65. package/build/lib/index.cjs +33 -0
  66. package/build/lib/index.cjs.map +1 -0
  67. package/build/{types → lib}/index.d.ts +4 -1
  68. package/build/lib/index.d.ts.map +1 -0
  69. package/build/lib/index.js +11 -0
  70. package/build/lib/index.js.map +1 -0
  71. package/build/lib/setBatchUpdatesFn.cjs +7 -0
  72. package/build/lib/setBatchUpdatesFn.cjs.map +1 -0
  73. package/build/lib/setBatchUpdatesFn.d.ts +2 -0
  74. package/build/lib/setBatchUpdatesFn.d.ts.map +1 -0
  75. package/build/{source → lib}/setBatchUpdatesFn.js +2 -0
  76. package/build/lib/setBatchUpdatesFn.js.map +1 -0
  77. package/build/lib/types.d.ts +35 -0
  78. package/build/lib/types.d.ts.map +1 -0
  79. package/build/lib/useIsFetching.cjs +18 -0
  80. package/build/lib/useIsFetching.cjs.map +1 -0
  81. package/build/{types → lib}/useIsFetching.d.ts +3 -1
  82. package/build/lib/useIsFetching.d.ts.map +1 -0
  83. package/build/lib/useIsFetching.js +16 -0
  84. package/build/lib/useIsFetching.js.map +1 -0
  85. package/build/lib/useIsMutating.cjs +18 -0
  86. package/build/lib/useIsMutating.cjs.map +1 -0
  87. package/build/{types → lib}/useIsMutating.d.ts +3 -1
  88. package/build/lib/useIsMutating.d.ts.map +1 -0
  89. package/build/lib/useIsMutating.js +16 -0
  90. package/build/lib/useIsMutating.js.map +1 -0
  91. package/build/lib/utils.cjs +12 -0
  92. package/build/lib/utils.cjs.map +1 -0
  93. package/build/{types → lib}/utils.d.ts +1 -0
  94. package/build/lib/utils.d.ts.map +1 -0
  95. package/build/lib/utils.js +10 -0
  96. package/build/lib/utils.js.map +1 -0
  97. package/build/stats.html +6177 -0
  98. package/package.json +22 -28
  99. package/src/QueryClient.ts +84 -0
  100. package/src/QueryClientProvider.tsx +1 -1
  101. package/src/__tests__/QueryClientProvider.test.tsx +2 -3
  102. package/src/__tests__/createInfiniteQuery.test.tsx +83 -19
  103. package/src/__tests__/createMutation.test.tsx +5 -5
  104. package/src/__tests__/createQueries.test.tsx +6 -78
  105. package/src/__tests__/createQuery.test.tsx +66 -334
  106. package/src/__tests__/createQuery.types.test.tsx +21 -1
  107. package/src/__tests__/suspense.test.tsx +7 -90
  108. package/src/__tests__/transition.test.tsx +1 -1
  109. package/src/__tests__/useIsFetching.test.tsx +1 -1
  110. package/src/__tests__/useIsMutating.test.tsx +5 -7
  111. package/src/__tests__/utils.tsx +1 -1
  112. package/src/createBaseQuery.ts +73 -28
  113. package/src/createInfiniteQuery.ts +1 -1
  114. package/src/createMutation.ts +3 -2
  115. package/src/createQueries.ts +32 -14
  116. package/src/createQuery.ts +24 -1
  117. package/src/index.ts +8 -1
  118. package/src/types.ts +4 -2
  119. package/src/useIsFetching.ts +2 -1
  120. package/src/useIsMutating.ts +2 -1
  121. package/build/cjs/index.js +0 -300
  122. package/build/cjs/index.js.map +0 -1
  123. package/build/esm/index.js +0 -285
  124. package/build/esm/index.js.map +0 -1
  125. package/build/source/QueryClientProvider.jsx +0 -21
  126. package/build/source/__tests__/QueryClientProvider.test.jsx +0 -121
  127. package/build/source/__tests__/createInfiniteQuery.test.jsx +0 -1315
  128. package/build/source/__tests__/createMutation.test.jsx +0 -867
  129. package/build/source/__tests__/createQueries.test.jsx +0 -661
  130. package/build/source/__tests__/createQuery.test.jsx +0 -4608
  131. package/build/source/__tests__/createQuery.types.test.jsx +0 -135
  132. package/build/source/__tests__/suspense.test.jsx +0 -721
  133. package/build/source/__tests__/transition.test.jsx +0 -42
  134. package/build/source/__tests__/useIsFetching.test.jsx +0 -190
  135. package/build/source/__tests__/useIsMutating.test.jsx +0 -198
  136. package/build/source/__tests__/utils.jsx +0 -50
  137. package/build/source/createBaseQuery.js +0 -147
  138. package/build/source/createInfiniteQuery.js +0 -8
  139. package/build/source/createMutation.js +0 -38
  140. package/build/source/createQueries.js +0 -32
  141. package/build/source/createQuery.js +0 -6
  142. package/build/source/index.js +0 -14
  143. package/build/source/types.js +0 -2
  144. package/build/source/useIsFetching.js +0 -12
  145. package/build/source/useIsMutating.js +0 -12
  146. package/build/source/utils.js +0 -7
  147. package/build/types/__tests__/QueryClientProvider.test.d.ts +0 -1
  148. package/build/types/__tests__/createInfiniteQuery.test.d.ts +0 -1
  149. package/build/types/__tests__/createMutation.test.d.ts +0 -1
  150. package/build/types/__tests__/createQueries.test.d.ts +0 -1
  151. package/build/types/__tests__/createQuery.test.d.ts +0 -1
  152. package/build/types/__tests__/createQuery.types.test.d.ts +0 -2
  153. package/build/types/__tests__/suspense.test.d.ts +0 -1
  154. package/build/types/__tests__/transition.test.d.ts +0 -1
  155. package/build/types/__tests__/useIsFetching.test.d.ts +0 -1
  156. package/build/types/__tests__/useIsMutating.test.d.ts +0 -1
  157. package/build/types/createQuery.d.ts +0 -11
  158. package/build/types/setBatchUpdatesFn.d.ts +0 -1
  159. package/build/types/types.d.ts +0 -33
  160. package/build/umd/index.js +0 -2
  161. package/build/umd/index.js.map +0 -1
@@ -1,42 +0,0 @@
1
- import { fireEvent, render, screen, waitFor } from 'solid-testing-library';
2
- import { createSignal, Show, startTransition, Suspense } from 'solid-js';
3
- import { createQuery, QueryCache, QueryClientProvider } from '..';
4
- import { createQueryClient, queryKey, sleep } from './utils';
5
- describe("useQuery's in Suspense mode with transitions", () => {
6
- const queryCache = new QueryCache();
7
- const queryClient = createQueryClient({ queryCache });
8
- it('should render the content when the transition is done', async () => {
9
- const key = queryKey();
10
- function Suspended() {
11
- const state = createQuery(() => ({
12
- queryKey: key,
13
- queryFn: async () => {
14
- await sleep(10);
15
- return true;
16
- },
17
- }));
18
- return <Show when={state.data}>Message</Show>;
19
- }
20
- function Page() {
21
- const [showSignal, setShowSignal] = createSignal(false);
22
- return (<div>
23
- <button aria-label="toggle" onClick={() => startTransition(() => setShowSignal((value) => !value))}>
24
- {showSignal() ? 'Hide' : 'Show'}
25
- </button>
26
- <Suspense fallback="Loading">
27
- <Show when={showSignal()}>
28
- <Suspended />
29
- </Show>
30
- </Suspense>
31
- </div>);
32
- }
33
- render(() => (<QueryClientProvider client={queryClient}>
34
- <Page />
35
- </QueryClientProvider>));
36
- await waitFor(() => screen.getByText('Show'));
37
- fireEvent.click(screen.getByLabelText('toggle'));
38
- await waitFor(() => screen.getByText('Message'));
39
- // verify that the button also updated. See https://github.com/solidjs/solid/issues/1249
40
- await waitFor(() => screen.getByText('Hide'));
41
- });
42
- });
@@ -1,190 +0,0 @@
1
- import { fireEvent, render, screen, waitFor } from 'solid-testing-library';
2
- import { createEffect, createRenderEffect, createSignal, Show } from 'solid-js';
3
- import { createQuery, QueryCache, QueryClientProvider, useIsFetching } from '..';
4
- import { createQueryClient, queryKey, setActTimeout, sleep } from './utils';
5
- describe('useIsFetching', () => {
6
- // See https://github.com/tannerlinsley/react-query/issues/105
7
- it('should update as queries start and stop fetching', async () => {
8
- const queryCache = new QueryCache();
9
- const queryClient = createQueryClient({ queryCache });
10
- const key = queryKey();
11
- function IsFetching() {
12
- const isFetching = useIsFetching();
13
- return <div>isFetching: {isFetching()}</div>;
14
- }
15
- function Query() {
16
- const [ready, setReady] = createSignal(false);
17
- createQuery(() => ({
18
- queryKey: key,
19
- queryFn: async () => {
20
- await sleep(50);
21
- return 'test';
22
- },
23
- enabled: ready(),
24
- }));
25
- return <button onClick={() => setReady(true)}>setReady</button>;
26
- }
27
- function Page() {
28
- return (<div>
29
- <IsFetching />
30
- <Query />
31
- </div>);
32
- }
33
- render(() => (<QueryClientProvider client={queryClient}>
34
- <Page />
35
- </QueryClientProvider>));
36
- await screen.findByText('isFetching: 0');
37
- fireEvent.click(screen.getByRole('button', { name: /setReady/i }));
38
- await screen.findByText('isFetching: 1');
39
- await screen.findByText('isFetching: 0');
40
- });
41
- it('should not update state while rendering', async () => {
42
- const queryCache = new QueryCache();
43
- const queryClient = createQueryClient({ queryCache });
44
- const key1 = queryKey();
45
- const key2 = queryKey();
46
- const isFetchings = [];
47
- function IsFetching() {
48
- const isFetching = useIsFetching();
49
- createRenderEffect(() => {
50
- isFetchings.push(isFetching());
51
- });
52
- return null;
53
- }
54
- function FirstQuery() {
55
- createQuery(() => ({
56
- queryKey: key1,
57
- queryFn: async () => {
58
- await sleep(150);
59
- return 'data';
60
- },
61
- }));
62
- return null;
63
- }
64
- function SecondQuery() {
65
- createQuery(() => ({
66
- queryKey: key2,
67
- queryFn: async () => {
68
- await sleep(200);
69
- return 'data';
70
- },
71
- }));
72
- return null;
73
- }
74
- function Page() {
75
- const [renderSecond, setRenderSecond] = createSignal(false);
76
- createEffect(() => {
77
- setActTimeout(() => {
78
- setRenderSecond(true);
79
- }, 100);
80
- });
81
- return (<>
82
- <IsFetching />
83
- <FirstQuery />
84
- <Show when={renderSecond()}>
85
- <SecondQuery />
86
- </Show>
87
- </>);
88
- }
89
- render(() => (<QueryClientProvider client={queryClient}>
90
- <Page />
91
- </QueryClientProvider>));
92
- // unlike react, Updating renderSecond wont cause a rerender for FirstQuery
93
- await waitFor(() => expect(isFetchings).toEqual([0, 1, 2, 1, 0]));
94
- });
95
- it('should be able to filter', async () => {
96
- const queryClient = createQueryClient();
97
- const key1 = queryKey();
98
- const key2 = queryKey();
99
- const isFetchings = [];
100
- function One() {
101
- createQuery(() => ({
102
- queryKey: key1,
103
- queryFn: async () => {
104
- await sleep(10);
105
- return 'test';
106
- },
107
- }));
108
- return null;
109
- }
110
- function Two() {
111
- createQuery(() => ({
112
- queryKey: key2,
113
- queryFn: async () => {
114
- await sleep(20);
115
- return 'test';
116
- },
117
- }));
118
- return null;
119
- }
120
- function Page() {
121
- const [started, setStarted] = createSignal(false);
122
- const isFetching = useIsFetching(() => ({
123
- queryKey: key1,
124
- }));
125
- createRenderEffect(() => {
126
- isFetchings.push(isFetching());
127
- });
128
- return (<div>
129
- <button onClick={() => setStarted(true)}>setStarted</button>
130
- <div>isFetching: {isFetching()}</div>
131
- <Show when={started()}>
132
- <>
133
- <One />
134
- <Two />
135
- </>
136
- </Show>
137
- </div>);
138
- }
139
- render(() => (<QueryClientProvider client={queryClient}>
140
- <Page />
141
- </QueryClientProvider>));
142
- await screen.findByText('isFetching: 0');
143
- fireEvent.click(screen.getByRole('button', { name: /setStarted/i }));
144
- await screen.findByText('isFetching: 1');
145
- await screen.findByText('isFetching: 0');
146
- // at no point should we have isFetching: 2
147
- expect(isFetchings).toEqual(expect.not.arrayContaining([2]));
148
- });
149
- it('should show the correct fetching state when mounted after a query', async () => {
150
- const queryClient = createQueryClient();
151
- const key = queryKey();
152
- function Page() {
153
- createQuery(() => ({
154
- queryKey: key,
155
- queryFn: async () => {
156
- await sleep(10);
157
- return 'test';
158
- },
159
- }));
160
- const isFetching = useIsFetching();
161
- return (<div>
162
- <div>isFetching: {isFetching()}</div>
163
- </div>);
164
- }
165
- render(() => (<QueryClientProvider client={queryClient}>
166
- <Page />
167
- </QueryClientProvider>));
168
- await screen.findByText('isFetching: 1');
169
- await screen.findByText('isFetching: 0');
170
- });
171
- it('should use provided custom queryClient', async () => {
172
- const queryClient = createQueryClient();
173
- const key = queryKey();
174
- function Page() {
175
- createQuery(() => ({
176
- queryKey: key,
177
- queryFn: async () => {
178
- await sleep(10);
179
- return 'test';
180
- },
181
- }), () => queryClient);
182
- const isFetching = useIsFetching(undefined, () => queryClient);
183
- return (<div>
184
- <div>isFetching: {isFetching}</div>
185
- </div>);
186
- }
187
- render(() => <Page></Page>);
188
- await screen.findByText('isFetching: 1');
189
- });
190
- });
@@ -1,198 +0,0 @@
1
- import { fireEvent, screen, waitFor } from 'solid-testing-library';
2
- import { createMutation, QueryClientProvider, useIsMutating } from '..';
3
- import { createQueryClient, sleep } from './utils';
4
- import { createEffect, createRenderEffect, createSignal, Show } from 'solid-js';
5
- import { render } from 'solid-testing-library';
6
- import * as MutationCacheModule from '../../../query-core/src/mutationCache';
7
- import { setActTimeout } from './utils';
8
- import { vi } from 'vitest';
9
- describe('useIsMutating', () => {
10
- it('should return the number of fetching mutations', async () => {
11
- const isMutatings = [];
12
- const queryClient = createQueryClient();
13
- function IsMutating() {
14
- const isMutating = useIsMutating();
15
- createRenderEffect(() => {
16
- isMutatings.push(isMutating());
17
- });
18
- return null;
19
- }
20
- function Mutations() {
21
- const { mutate: mutate1 } = createMutation(() => ({
22
- mutationKey: ['mutation1'],
23
- mutationFn: async () => {
24
- await sleep(150);
25
- return 'data';
26
- },
27
- }));
28
- const { mutate: mutate2 } = createMutation(() => ({
29
- mutationKey: ['mutation2'],
30
- mutationFn: async () => {
31
- await sleep(50);
32
- return 'data';
33
- },
34
- }));
35
- createEffect(() => {
36
- mutate1();
37
- setActTimeout(() => {
38
- mutate2();
39
- }, 50);
40
- });
41
- return null;
42
- }
43
- function Page() {
44
- return (<div>
45
- <IsMutating />
46
- <Mutations />
47
- </div>);
48
- }
49
- render(() => (<QueryClientProvider client={queryClient}>
50
- <Page />
51
- </QueryClientProvider>));
52
- await waitFor(() => expect(isMutatings).toEqual([0, 1, 2, 1, 0]));
53
- });
54
- it('should filter correctly by mutationKey', async () => {
55
- const isMutatings = [];
56
- const queryClient = createQueryClient();
57
- function IsMutating() {
58
- const isMutating = useIsMutating(() => ({ mutationKey: ['mutation1'] }));
59
- createRenderEffect(() => {
60
- isMutatings.push(isMutating());
61
- });
62
- return null;
63
- }
64
- function Page() {
65
- const { mutate: mutate1 } = createMutation(() => ({
66
- mutationKey: ['mutation1'],
67
- mutationFn: async () => {
68
- await sleep(100);
69
- return 'data';
70
- },
71
- }));
72
- const { mutate: mutate2 } = createMutation(() => ({
73
- mutationKey: ['mutation2'],
74
- mutationFn: async () => {
75
- await sleep(100);
76
- return 'data';
77
- },
78
- }));
79
- createEffect(() => {
80
- mutate1();
81
- mutate2();
82
- });
83
- return <IsMutating />;
84
- }
85
- render(() => (<QueryClientProvider client={queryClient}>
86
- <Page />
87
- </QueryClientProvider>));
88
- // Unlike React, IsMutating Wont re-render twice with mutation2
89
- await waitFor(() => expect(isMutatings).toEqual([0, 1, 0]));
90
- });
91
- it('should filter correctly by predicate', async () => {
92
- const isMutatings = [];
93
- const queryClient = createQueryClient();
94
- function IsMutating() {
95
- const isMutating = useIsMutating(() => ({
96
- predicate: (mutation) => mutation.options.mutationKey?.[0] === 'mutation1',
97
- }));
98
- createRenderEffect(() => {
99
- isMutatings.push(isMutating());
100
- });
101
- return null;
102
- }
103
- function Page() {
104
- const { mutate: mutate1 } = createMutation(() => ({
105
- mutationKey: ['mutation1'],
106
- mutationFn: async () => {
107
- await sleep(100);
108
- return 'data';
109
- },
110
- }));
111
- const { mutate: mutate2 } = createMutation(() => ({
112
- mutationKey: ['mutation2'],
113
- mutationFn: async () => {
114
- await sleep(100);
115
- return 'data';
116
- },
117
- }));
118
- createEffect(() => {
119
- mutate1();
120
- mutate2();
121
- });
122
- return <IsMutating />;
123
- }
124
- render(() => (<QueryClientProvider client={queryClient}>
125
- <Page />
126
- </QueryClientProvider>));
127
- // Again, No unnecessary re-renders like React
128
- await waitFor(() => expect(isMutatings).toEqual([0, 1, 0]));
129
- });
130
- it('should use provided custom queryClient', async () => {
131
- const queryClient = createQueryClient();
132
- function Page() {
133
- const isMutating = useIsMutating(undefined, () => queryClient);
134
- const { mutate } = createMutation(() => ({
135
- mutationKey: ['mutation1'],
136
- mutationFn: async () => {
137
- await sleep(10);
138
- return 'data';
139
- },
140
- }), () => queryClient);
141
- createEffect(() => {
142
- mutate();
143
- });
144
- return (<div>
145
- <div>mutating: {isMutating}</div>
146
- </div>);
147
- }
148
- render(() => <Page></Page>);
149
- await waitFor(() => screen.findByText('mutating: 1'));
150
- });
151
- it('should not change state if unmounted', async () => {
152
- // We have to mock the MutationCache to not unsubscribe
153
- // the listener when the component is unmounted
154
- class MutationCacheMock extends MutationCacheModule.MutationCache {
155
- subscribe(listener) {
156
- super.subscribe(listener);
157
- return () => void 0;
158
- }
159
- }
160
- const MutationCacheSpy = vi
161
- .spyOn(MutationCacheModule, 'MutationCache')
162
- .mockImplementation((fn) => {
163
- return new MutationCacheMock(fn);
164
- });
165
- const queryClient = createQueryClient();
166
- function IsMutating() {
167
- useIsMutating();
168
- return null;
169
- }
170
- function Page() {
171
- const [mounted, setMounted] = createSignal(true);
172
- const { mutate: mutate1 } = createMutation(() => ({
173
- mutationKey: ['mutation1'],
174
- mutationFn: async () => {
175
- await sleep(10);
176
- return 'data';
177
- },
178
- }));
179
- createEffect(() => {
180
- mutate1();
181
- });
182
- return (<div>
183
- <button onClick={() => setMounted(false)}>unmount</button>
184
- <Show when={mounted()}>
185
- <IsMutating />
186
- </Show>
187
- </div>);
188
- }
189
- render(() => (<QueryClientProvider client={queryClient}>
190
- <Page />
191
- </QueryClientProvider>));
192
- fireEvent.click(screen.getByText('unmount'));
193
- // Should not display the console error
194
- // "Warning: Can't perform a React state update on an unmounted component"
195
- await sleep(20);
196
- MutationCacheSpy.mockRestore();
197
- });
198
- });
@@ -1,50 +0,0 @@
1
- import { QueryClient } from '@tanstack/query-core';
2
- import { createEffect, createSignal, onCleanup, Show } from 'solid-js';
3
- import { vi } from 'vitest';
4
- let queryKeyCount = 0;
5
- export function queryKey() {
6
- queryKeyCount++;
7
- return [`query_${queryKeyCount}`];
8
- }
9
- export const Blink = (props) => {
10
- const [shouldShow, setShouldShow] = createSignal(true);
11
- createEffect(() => {
12
- setShouldShow(true);
13
- const timeout = setActTimeout(() => setShouldShow(false), props.duration);
14
- onCleanup(() => clearTimeout(timeout));
15
- });
16
- return (<Show when={shouldShow()} fallback={<>off</>}>
17
- <>{props.children}</>
18
- </Show>);
19
- };
20
- export function createQueryClient(config) {
21
- return new QueryClient(config);
22
- }
23
- export function mockVisibilityState(value) {
24
- return vi.spyOn(document, 'visibilityState', 'get').mockReturnValue(value);
25
- }
26
- export function mockNavigatorOnLine(value) {
27
- return vi.spyOn(navigator, 'onLine', 'get').mockReturnValue(value);
28
- }
29
- export function sleep(timeout) {
30
- return new Promise((resolve, _reject) => {
31
- setTimeout(resolve, timeout);
32
- });
33
- }
34
- export function setActTimeout(fn, ms) {
35
- return setTimeout(() => {
36
- fn();
37
- }, ms);
38
- }
39
- /**
40
- * Assert the parameter is of a specific type.
41
- */
42
- export function expectType(_) {
43
- return undefined;
44
- }
45
- /**
46
- * Assert the parameter is not typed as `any`
47
- */
48
- export function expectTypeNotAny(_) {
49
- return undefined;
50
- }
@@ -1,147 +0,0 @@
1
- import { hydrate } from '@tanstack/query-core';
2
- import { notifyManager } from '@tanstack/query-core';
3
- import { isServer } from 'solid-js/web';
4
- import { createComputed, createMemo, createResource, on, onCleanup, onMount, } from 'solid-js';
5
- import { createStore, unwrap } from 'solid-js/store';
6
- import { useQueryClient } from './QueryClientProvider';
7
- import { shouldThrowError } from './utils';
8
- // Base Query Function that is used to create the query.
9
- export function createBaseQuery(options, Observer, queryClient) {
10
- const client = createMemo(() => useQueryClient(queryClient?.()));
11
- const defaultedOptions = client().defaultQueryOptions(options());
12
- defaultedOptions._optimisticResults = 'optimistic';
13
- if (isServer) {
14
- defaultedOptions.retry = false;
15
- defaultedOptions.throwErrors = true;
16
- }
17
- const observer = new Observer(client(), defaultedOptions);
18
- const [state, setState] = createStore(observer.getOptimisticResult(defaultedOptions));
19
- const createServerSubscriber = (resolve, reject) => {
20
- return observer.subscribe((result) => {
21
- notifyManager.batchCalls(() => {
22
- const unwrappedResult = { ...unwrap(result) };
23
- if (unwrappedResult.isError) {
24
- if (process.env['NODE_ENV'] === 'development') {
25
- console.error(unwrappedResult.error);
26
- }
27
- reject(unwrappedResult.error);
28
- }
29
- if (unwrappedResult.isSuccess) {
30
- resolve(unwrappedResult);
31
- }
32
- })();
33
- });
34
- };
35
- const createClientSubscriber = () => {
36
- return observer.subscribe((result) => {
37
- notifyManager.batchCalls(() => {
38
- const unwrappedResult = { ...unwrap(result) };
39
- // If the query has data we dont suspend but instead mutate the resource
40
- // This could happen when placeholderData/initialData is defined
41
- if (queryResource()?.data &&
42
- unwrappedResult.data &&
43
- !queryResource.loading) {
44
- setState(unwrappedResult);
45
- mutate(state);
46
- }
47
- else {
48
- setState(unwrappedResult);
49
- refetch();
50
- }
51
- })();
52
- });
53
- };
54
- /**
55
- * Unsubscribe is set lazily, so that we can subscribe after hydration when needed.
56
- */
57
- let unsubscribe = null;
58
- const [queryResource, { refetch, mutate }] = createResource(() => {
59
- return new Promise((resolve, reject) => {
60
- if (isServer) {
61
- unsubscribe = createServerSubscriber(resolve, reject);
62
- }
63
- else {
64
- if (!unsubscribe) {
65
- unsubscribe = createClientSubscriber();
66
- }
67
- }
68
- if (!state.isLoading) {
69
- resolve(state);
70
- }
71
- });
72
- }, {
73
- initialValue: state,
74
- // If initialData is provided, we resolve the resource immediately
75
- ssrLoadFrom: options().initialData ? 'initial' : 'server',
76
- get deferStream() {
77
- return options().deferStream;
78
- },
79
- /**
80
- * If this resource was populated on the server (either sync render, or streamed in over time), onHydrated
81
- * will be called. This is the point at which we can hydrate the query cache state, and setup the query subscriber.
82
- *
83
- * Leveraging onHydrated allows us to plug into the async and streaming support that solidjs resources already support.
84
- *
85
- * Note that this is only invoked on the client, for queries that were originally run on the server.
86
- */
87
- onHydrated(_k, info) {
88
- if (info.value) {
89
- hydrate(client(), {
90
- queries: [
91
- {
92
- queryKey: defaultedOptions.queryKey,
93
- queryHash: defaultedOptions.queryHash,
94
- state: info.value,
95
- },
96
- ],
97
- });
98
- }
99
- if (!unsubscribe) {
100
- /**
101
- * Do not refetch query on mount if query was fetched on server,
102
- * even if `staleTime` is not set.
103
- */
104
- const newOptions = { ...defaultedOptions };
105
- if (defaultedOptions.staleTime || !defaultedOptions.initialData) {
106
- newOptions.refetchOnMount = false;
107
- }
108
- // Setting the options as an immutable object to prevent
109
- // wonky behavior with observer subscriptions
110
- observer.setOptions(newOptions);
111
- setState(observer.getOptimisticResult(newOptions));
112
- unsubscribe = createClientSubscriber();
113
- }
114
- },
115
- });
116
- onCleanup(() => {
117
- if (unsubscribe) {
118
- unsubscribe();
119
- unsubscribe = null;
120
- }
121
- });
122
- onMount(() => {
123
- observer.setOptions(defaultedOptions, { listeners: false });
124
- });
125
- createComputed(() => {
126
- observer.setOptions(client().defaultQueryOptions(options()));
127
- });
128
- createComputed(on(() => state.status, () => {
129
- if (state.isError &&
130
- !state.isFetching &&
131
- shouldThrowError(observer.options.throwErrors, [
132
- state.error,
133
- observer.getCurrentQuery(),
134
- ])) {
135
- throw state.error;
136
- }
137
- }));
138
- const handler = {
139
- get(target, prop) {
140
- if (prop === 'data') {
141
- return queryResource()?.data;
142
- }
143
- return Reflect.get(target, prop);
144
- },
145
- };
146
- return new Proxy(state, handler);
147
- }
@@ -1,8 +0,0 @@
1
- import { InfiniteQueryObserver } from '@tanstack/query-core';
2
- import { createBaseQuery } from './createBaseQuery';
3
- import { createMemo } from 'solid-js';
4
- export function createInfiniteQuery(options, queryClient) {
5
- return createBaseQuery(createMemo(() => options()),
6
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
7
- InfiniteQueryObserver, queryClient);
8
- }
@@ -1,38 +0,0 @@
1
- import { MutationObserver } from '@tanstack/query-core';
2
- import { useQueryClient } from './QueryClientProvider';
3
- import { createComputed, onCleanup, on } from 'solid-js';
4
- import { createStore } from 'solid-js/store';
5
- import { shouldThrowError } from './utils';
6
- // HOOK
7
- export function createMutation(options, queryClient) {
8
- const client = useQueryClient(queryClient?.());
9
- const observer = new MutationObserver(client, options());
10
- const mutate = (variables, mutateOptions) => {
11
- observer.mutate(variables, mutateOptions).catch(noop);
12
- };
13
- const [state, setState] = createStore({
14
- ...observer.getCurrentResult(),
15
- mutate,
16
- mutateAsync: observer.getCurrentResult().mutate,
17
- });
18
- createComputed(() => {
19
- observer.setOptions(options());
20
- });
21
- createComputed(on(() => state.status, () => {
22
- if (state.isError &&
23
- shouldThrowError(observer.options.throwErrors, [state.error])) {
24
- throw state.error;
25
- }
26
- }));
27
- const unsubscribe = observer.subscribe((result) => {
28
- setState({
29
- ...result,
30
- mutate,
31
- mutateAsync: result.mutate,
32
- });
33
- });
34
- onCleanup(unsubscribe);
35
- return state;
36
- }
37
- // eslint-disable-next-line @typescript-eslint/no-empty-function
38
- function noop() { }