@tanstack/angular-query-experimental 5.103.1 → 5.103.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 (219) hide show
  1. package/dist/create-base-query.d.mts +169 -0
  2. package/dist/create-base-query.d.mts.map +1 -0
  3. package/dist/create-base-query.mjs +91 -0
  4. package/dist/create-base-query.mjs.map +1 -0
  5. package/dist/devtools/index.d.mts +3 -0
  6. package/dist/devtools/index.mjs +2 -0
  7. package/dist/devtools/production/index.d.mts +4 -0
  8. package/dist/devtools/production/index.mjs +2 -0
  9. package/dist/devtools/stub.d.mts +6 -0
  10. package/dist/devtools/stub.d.mts.map +1 -0
  11. package/dist/devtools/stub.mjs +9 -0
  12. package/dist/devtools/stub.mjs.map +1 -0
  13. package/dist/devtools/types.d.mts +107 -0
  14. package/dist/devtools/types.d.mts.map +1 -0
  15. package/dist/devtools/types.mjs +1 -0
  16. package/{devtools/with-devtools.d.ts → dist/devtools/with-devtools.d.mts} +6 -2
  17. package/dist/devtools/with-devtools.d.mts.map +1 -0
  18. package/dist/devtools/with-devtools.mjs +110 -0
  19. package/dist/devtools/with-devtools.mjs.map +1 -0
  20. package/dist/devtools-panel/index.d.mts +3 -0
  21. package/dist/devtools-panel/index.mjs +2 -0
  22. package/{devtools-panel/inject-devtools-panel.d.ts → dist/devtools-panel/inject-devtools-panel.d.mts} +6 -2
  23. package/dist/devtools-panel/inject-devtools-panel.d.mts.map +1 -0
  24. package/dist/devtools-panel/inject-devtools-panel.mjs +67 -0
  25. package/dist/devtools-panel/inject-devtools-panel.mjs.map +1 -0
  26. package/dist/devtools-panel/production/index.d.mts +4 -0
  27. package/dist/devtools-panel/production/index.mjs +2 -0
  28. package/dist/devtools-panel/stub.d.mts +6 -0
  29. package/dist/devtools-panel/stub.d.mts.map +1 -0
  30. package/dist/devtools-panel/stub.mjs +7 -0
  31. package/dist/devtools-panel/stub.mjs.map +1 -0
  32. package/dist/devtools-panel/types.d.mts +52 -0
  33. package/dist/devtools-panel/types.d.mts.map +1 -0
  34. package/dist/devtools-panel/types.mjs +1 -0
  35. package/dist/index.d.mts +16 -0
  36. package/{index.mjs → dist/index.mjs} +8 -21
  37. package/dist/index.mjs.map +1 -0
  38. package/{infinite-query-options.d.ts → dist/infinite-query-options.d.mts} +35 -31
  39. package/dist/infinite-query-options.d.mts.map +1 -0
  40. package/dist/infinite-query-options.mjs +8 -0
  41. package/dist/infinite-query-options.mjs.map +1 -0
  42. package/{inject-infinite-query.d.ts → dist/inject-infinite-query.d.mts} +18 -14
  43. package/dist/inject-infinite-query.d.mts.map +1 -0
  44. package/dist/inject-infinite-query.mjs +13 -0
  45. package/dist/inject-infinite-query.mjs.map +1 -0
  46. package/{inject-is-fetching.d.ts → dist/inject-is-fetching.d.mts} +14 -10
  47. package/dist/inject-is-fetching.d.mts.map +1 -0
  48. package/dist/inject-is-fetching.mjs +69 -0
  49. package/dist/inject-is-fetching.mjs.map +1 -0
  50. package/{inject-is-mutating.d.ts → dist/inject-is-mutating.d.mts} +14 -10
  51. package/dist/inject-is-mutating.d.mts.map +1 -0
  52. package/dist/inject-is-mutating.mjs +52 -0
  53. package/dist/inject-is-mutating.mjs.map +1 -0
  54. package/{inject-is-restoring.d.ts → dist/inject-is-restoring.d.mts} +13 -10
  55. package/dist/inject-is-restoring.d.mts.map +1 -0
  56. package/dist/inject-is-restoring.mjs +35 -0
  57. package/dist/inject-is-restoring.mjs.map +1 -0
  58. package/{inject-mutation-state.d.ts → dist/inject-mutation-state.d.mts} +16 -13
  59. package/dist/inject-mutation-state.d.mts.map +1 -0
  60. package/dist/inject-mutation-state.mjs +103 -0
  61. package/dist/inject-mutation-state.mjs.map +1 -0
  62. package/{inject-mutation.d.ts → dist/inject-mutation.d.mts} +15 -11
  63. package/dist/inject-mutation.d.mts.map +1 -0
  64. package/dist/inject-mutation.mjs +226 -0
  65. package/dist/inject-mutation.mjs.map +1 -0
  66. package/dist/inject-queries-experimental/index.d.mts +2 -0
  67. package/dist/inject-queries-experimental/index.mjs +2 -0
  68. package/{inject-queries.d.ts → dist/inject-queries.d.mts} +36 -55
  69. package/dist/inject-queries.d.mts.map +1 -0
  70. package/dist/inject-queries.mjs +203 -0
  71. package/dist/inject-queries.mjs.map +1 -0
  72. package/{inject-query-client.d.ts → dist/inject-query-client.d.mts} +8 -4
  73. package/dist/inject-query-client.d.mts.map +1 -0
  74. package/dist/inject-query-client.mjs +23 -0
  75. package/dist/inject-query-client.mjs.map +1 -0
  76. package/{inject-query.d.ts → dist/inject-query.d.mts} +18 -14
  77. package/dist/inject-query.d.mts.map +1 -0
  78. package/dist/inject-query.mjs +12 -0
  79. package/dist/inject-query.mjs.map +1 -0
  80. package/{mutation-options.d.ts → dist/mutation-options.d.mts} +8 -4
  81. package/dist/mutation-options.d.mts.map +1 -0
  82. package/dist/mutation-options.mjs +8 -0
  83. package/dist/mutation-options.mjs.map +1 -0
  84. package/dist/pending-tasks-compat.d.mts +10 -0
  85. package/dist/pending-tasks-compat.d.mts.map +1 -0
  86. package/dist/pending-tasks-compat.mjs +13 -0
  87. package/dist/pending-tasks-compat.mjs.map +1 -0
  88. package/{providers.d.ts → dist/providers.d.mts} +16 -13
  89. package/dist/providers.d.mts.map +1 -0
  90. package/dist/providers.mjs +124 -0
  91. package/dist/providers.mjs.map +1 -0
  92. package/{query-options.d.ts → dist/query-options.d.mts} +41 -37
  93. package/dist/query-options.d.mts.map +1 -0
  94. package/dist/query-options.mjs +8 -0
  95. package/dist/query-options.mjs.map +1 -0
  96. package/dist/signal-proxy.d.mts +13 -0
  97. package/dist/signal-proxy.d.mts.map +1 -0
  98. package/dist/signal-proxy.mjs +35 -0
  99. package/dist/signal-proxy.mjs.map +1 -0
  100. package/{types.d.ts → dist/types.d.mts} +36 -37
  101. package/dist/types.d.mts.map +1 -0
  102. package/dist/types.mjs +6 -0
  103. package/dist/types.mjs.map +1 -0
  104. package/package.json +48 -20
  105. package/src/__tests__/infinite-query-options.test-d.ts +314 -0
  106. package/src/__tests__/infinite-query-options.test.ts +19 -0
  107. package/src/__tests__/inject-devtools-panel.test.ts +196 -0
  108. package/src/__tests__/inject-infinite-query.test-d.ts +66 -0
  109. package/src/__tests__/inject-infinite-query.test.ts +227 -0
  110. package/src/__tests__/inject-is-fetching.test.ts +108 -0
  111. package/src/__tests__/inject-is-mutating.test.ts +113 -0
  112. package/src/__tests__/inject-is-restoring.test.ts +93 -0
  113. package/src/__tests__/inject-mutation-state.test-d.ts +22 -0
  114. package/src/__tests__/inject-mutation-state.test.ts +198 -0
  115. package/src/__tests__/inject-mutation.test-d.ts +158 -0
  116. package/src/__tests__/inject-mutation.test.ts +1161 -0
  117. package/src/__tests__/inject-queries.test-d.ts +196 -0
  118. package/src/__tests__/inject-queries.test.ts +240 -0
  119. package/src/__tests__/inject-query.test-d.ts +357 -0
  120. package/src/__tests__/inject-query.test.ts +700 -0
  121. package/src/__tests__/mutation-options.test-d.ts +234 -0
  122. package/src/__tests__/mutation-options.test.ts +344 -0
  123. package/src/__tests__/pending-tasks.test.ts +644 -0
  124. package/src/__tests__/provide-query-client.test.ts +38 -0
  125. package/src/__tests__/provide-tanstack-query.test.ts +38 -0
  126. package/src/__tests__/query-options.test-d.ts +262 -0
  127. package/src/__tests__/query-options.test.ts +14 -0
  128. package/src/__tests__/signal-proxy.test.ts +27 -0
  129. package/src/__tests__/test-utils.ts +77 -0
  130. package/src/__tests__/with-devtools.test.ts +674 -0
  131. package/src/create-base-query.ts +175 -0
  132. package/src/devtools/index.ts +8 -0
  133. package/src/devtools/production/index.ts +1 -0
  134. package/src/devtools/stub.ts +7 -0
  135. package/src/devtools/types.ts +116 -0
  136. package/src/devtools/with-devtools.ts +182 -0
  137. package/src/devtools-panel/index.ts +8 -0
  138. package/src/devtools-panel/inject-devtools-panel.ts +110 -0
  139. package/src/devtools-panel/production/index.ts +1 -0
  140. package/src/devtools-panel/stub.ts +7 -0
  141. package/src/devtools-panel/types.ts +57 -0
  142. package/src/index.ts +60 -0
  143. package/src/infinite-query-options.ts +354 -0
  144. package/src/inject-infinite-query.ts +296 -0
  145. package/src/inject-is-fetching.ts +97 -0
  146. package/src/inject-is-mutating.ts +80 -0
  147. package/src/inject-is-restoring.ts +53 -0
  148. package/src/inject-mutation-state.ts +167 -0
  149. package/src/inject-mutation.ts +328 -0
  150. package/src/inject-queries-experimental/index.ts +1 -0
  151. package/src/inject-queries.ts +479 -0
  152. package/src/inject-query-client.ts +22 -0
  153. package/src/inject-query.ts +208 -0
  154. package/src/mutation-options.ts +121 -0
  155. package/src/pending-tasks-compat.ts +27 -0
  156. package/src/providers.ts +170 -0
  157. package/src/query-options.ts +292 -0
  158. package/src/signal-proxy.ts +46 -0
  159. package/src/types.ts +429 -0
  160. package/create-base-query.d.ts +0 -164
  161. package/create-base-query.mjs +0 -99
  162. package/create-base-query.mjs.map +0 -1
  163. package/devtools/index.d.ts +0 -2
  164. package/devtools/index.mjs +0 -5
  165. package/devtools/index.mjs.map +0 -1
  166. package/devtools/production/index.d.ts +0 -1
  167. package/devtools/stub.d.ts +0 -2
  168. package/devtools/stub.mjs +0 -8
  169. package/devtools/stub.mjs.map +0 -1
  170. package/devtools/types.d.ts +0 -100
  171. package/devtools/with-devtools.mjs +0 -106
  172. package/devtools/with-devtools.mjs.map +0 -1
  173. package/devtools-panel/index.d.ts +0 -2
  174. package/devtools-panel/index.mjs +0 -5
  175. package/devtools-panel/index.mjs.map +0 -1
  176. package/devtools-panel/inject-devtools-panel.mjs +0 -72
  177. package/devtools-panel/inject-devtools-panel.mjs.map +0 -1
  178. package/devtools-panel/production/index.d.ts +0 -1
  179. package/devtools-panel/stub.d.ts +0 -2
  180. package/devtools-panel/stub.mjs +0 -8
  181. package/devtools-panel/stub.mjs.map +0 -1
  182. package/devtools-panel/types.d.ts +0 -48
  183. package/index.d.ts +0 -25
  184. package/index.mjs.map +0 -1
  185. package/infinite-query-options.mjs +0 -7
  186. package/infinite-query-options.mjs.map +0 -1
  187. package/inject-infinite-query.mjs +0 -18
  188. package/inject-infinite-query.mjs.map +0 -1
  189. package/inject-is-fetching.mjs +0 -31
  190. package/inject-is-fetching.mjs.map +0 -1
  191. package/inject-is-mutating.mjs +0 -31
  192. package/inject-is-mutating.mjs.map +0 -1
  193. package/inject-is-restoring.mjs +0 -21
  194. package/inject-is-restoring.mjs.map +0 -1
  195. package/inject-mutation-state.mjs +0 -51
  196. package/inject-mutation-state.mjs.map +0 -1
  197. package/inject-mutation.mjs +0 -94
  198. package/inject-mutation.mjs.map +0 -1
  199. package/inject-queries-experimental/index.d.ts +0 -1
  200. package/inject-queries-experimental/index.mjs +0 -5
  201. package/inject-queries-experimental/index.mjs.map +0 -1
  202. package/inject-queries.mjs +0 -82
  203. package/inject-queries.mjs.map +0 -1
  204. package/inject-query-client.mjs +0 -9
  205. package/inject-query-client.mjs.map +0 -1
  206. package/inject-query.mjs +0 -14
  207. package/inject-query.mjs.map +0 -1
  208. package/mutation-options.mjs +0 -7
  209. package/mutation-options.mjs.map +0 -1
  210. package/pending-tasks-compat.d.ts +0 -7
  211. package/pending-tasks-compat.mjs +0 -19
  212. package/pending-tasks-compat.mjs.map +0 -1
  213. package/providers.mjs +0 -32
  214. package/providers.mjs.map +0 -1
  215. package/query-options.mjs +0 -7
  216. package/query-options.mjs.map +0 -1
  217. package/signal-proxy.d.ts +0 -11
  218. package/signal-proxy.mjs +0 -29
  219. package/signal-proxy.mjs.map +0 -1
@@ -0,0 +1,196 @@
1
+ import { describe, expectTypeOf, it } from 'vitest'
2
+ import { queryKey } from '@tanstack/query-test-utils'
3
+ import { skipToken } from '..'
4
+ import { injectQueries } from '../inject-queries'
5
+ import { queryOptions } from '../query-options'
6
+ import type { CreateQueryOptions, CreateQueryResult, OmitKeyof } from '..'
7
+ import type { Signal } from '@angular/core'
8
+
9
+ describe('injectQueries', () => {
10
+ describe('config object overload', () => {
11
+ it('TData should always be defined when initialData is provided as an object', () => {
12
+ const key1 = queryKey()
13
+ const key2 = queryKey()
14
+ const key3 = queryKey()
15
+
16
+ const query1 = {
17
+ queryKey: key1,
18
+ queryFn: () => {
19
+ return {
20
+ wow: true,
21
+ }
22
+ },
23
+ initialData: {
24
+ wow: false,
25
+ },
26
+ }
27
+
28
+ const query2 = {
29
+ queryKey: key2,
30
+ queryFn: () => 'Query Data',
31
+ initialData: 'initial data',
32
+ }
33
+
34
+ const query3 = {
35
+ queryKey: key3,
36
+ queryFn: () => 'Query Data',
37
+ }
38
+
39
+ const queryResults = injectQueries(() => ({
40
+ queries: [query1, query2, query3],
41
+ }))
42
+
43
+ const query1Data = queryResults()[0].data()
44
+ const query2Data = queryResults()[1].data()
45
+ const query3Data = queryResults()[2].data()
46
+
47
+ expectTypeOf(query1Data).toEqualTypeOf<{ wow: boolean }>()
48
+ expectTypeOf(query2Data).toEqualTypeOf<string>()
49
+ expectTypeOf(query3Data).toEqualTypeOf<string | undefined>()
50
+ })
51
+
52
+ it('TData should be defined when passed through queryOptions', () => {
53
+ const key = queryKey()
54
+ const options = queryOptions({
55
+ queryKey: key,
56
+ queryFn: () => {
57
+ return {
58
+ wow: true,
59
+ }
60
+ },
61
+ initialData: {
62
+ wow: true,
63
+ },
64
+ })
65
+ const queryResults = injectQueries(() => ({ queries: [options] }))
66
+
67
+ const data = queryResults()[0].data()
68
+
69
+ expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>()
70
+ })
71
+
72
+ it('should be possible to define a different TData than TQueryFnData using select with queryOptions spread into injectQuery', () => {
73
+ const key1 = queryKey()
74
+ const key2 = queryKey()
75
+
76
+ const query1 = queryOptions({
77
+ queryKey: key1,
78
+ queryFn: () => Promise.resolve(1),
79
+ select: (data) => data > 1,
80
+ })
81
+
82
+ const query2 = {
83
+ queryKey: key2,
84
+ queryFn: () => Promise.resolve(1),
85
+ select: (data: number) => data > 1,
86
+ }
87
+
88
+ const queryResults = injectQueries(() => ({ queries: [query1, query2] }))
89
+ const query1Data = queryResults()[0].data()
90
+ const query2Data = queryResults()[1].data()
91
+
92
+ expectTypeOf(query1Data).toEqualTypeOf<boolean | undefined>()
93
+ expectTypeOf(query2Data).toEqualTypeOf<boolean | undefined>()
94
+ })
95
+
96
+ it('TData should have undefined in the union when initialData is provided as a function which can return undefined', () => {
97
+ const key = queryKey()
98
+ const queryResults = injectQueries(() => ({
99
+ queries: [
100
+ {
101
+ queryKey: key,
102
+ queryFn: () => {
103
+ return {
104
+ wow: true,
105
+ }
106
+ },
107
+ initialData: () => undefined as { wow: boolean } | undefined,
108
+ },
109
+ ],
110
+ }))
111
+
112
+ const data = queryResults()[0].data()
113
+
114
+ expectTypeOf(data).toEqualTypeOf<{ wow: boolean } | undefined>()
115
+ })
116
+
117
+ describe('custom injectable', () => {
118
+ it('should allow custom hooks using UseQueryOptions', () => {
119
+ type Data = string
120
+ const key = queryKey()
121
+
122
+ const injectCustomQueries = (
123
+ options?: OmitKeyof<CreateQueryOptions<Data>, 'queryKey' | 'queryFn'>,
124
+ ) => {
125
+ return injectQueries(() => ({
126
+ queries: [
127
+ {
128
+ ...options,
129
+ queryKey: key,
130
+ queryFn: () => Promise.resolve('data'),
131
+ },
132
+ ],
133
+ }))
134
+ }
135
+
136
+ const queryResults = injectCustomQueries()
137
+ const data = queryResults()[0].data()
138
+
139
+ expectTypeOf(data).toEqualTypeOf<Data | undefined>()
140
+ })
141
+ })
142
+
143
+ it('TData should have correct type when conditional skipToken is passed', () => {
144
+ const key = queryKey()
145
+ const queryResults = injectQueries(() => ({
146
+ queries: [
147
+ {
148
+ queryKey: key,
149
+ queryFn: Math.random() > 0.5 ? skipToken : () => Promise.resolve(5),
150
+ },
151
+ ],
152
+ }))
153
+
154
+ const firstResult = queryResults()[0]
155
+
156
+ expectTypeOf(firstResult).toEqualTypeOf<
157
+ CreateQueryResult<number, Error>
158
+ >()
159
+ expectTypeOf(firstResult.data()).toEqualTypeOf<number | undefined>()
160
+ })
161
+
162
+ it('should return correct data for dynamic queries with mixed result types', () => {
163
+ const key1 = queryKey()
164
+ const key2 = queryKey()
165
+
166
+ const Queries1 = {
167
+ get: () =>
168
+ queryOptions({
169
+ queryKey: key1,
170
+ queryFn: () => Promise.resolve(1),
171
+ }),
172
+ }
173
+ const Queries2 = {
174
+ get: () =>
175
+ queryOptions({
176
+ queryKey: key2,
177
+ queryFn: () => Promise.resolve(true),
178
+ }),
179
+ }
180
+
181
+ const queries1List = [1, 2, 3].map(() => ({ ...Queries1.get() }))
182
+ const result = injectQueries(() => ({
183
+ queries: [...queries1List, { ...Queries2.get() }],
184
+ }))
185
+
186
+ expectTypeOf(result).branded.toEqualTypeOf<
187
+ Signal<
188
+ [
189
+ ...Array<CreateQueryResult<number, Error>>,
190
+ CreateQueryResult<boolean, Error>,
191
+ ]
192
+ >
193
+ >()
194
+ })
195
+ })
196
+ })
@@ -0,0 +1,240 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
2
+ import {
3
+ Component,
4
+ effect,
5
+ provideZonelessChangeDetection,
6
+ signal,
7
+ } from '@angular/core'
8
+ import { TestBed } from '@angular/core/testing'
9
+ import { render } from '@testing-library/angular'
10
+ import { queryKey, sleep } from '@tanstack/query-test-utils'
11
+ import { QueryClient, provideIsRestoring, provideTanStackQuery } from '..'
12
+ import { injectQueries } from '../inject-queries'
13
+
14
+ describe('injectQueries', () => {
15
+ let queryClient: QueryClient
16
+
17
+ beforeEach(() => {
18
+ vi.useFakeTimers()
19
+ queryClient = new QueryClient()
20
+ TestBed.configureTestingModule({
21
+ providers: [
22
+ provideZonelessChangeDetection(),
23
+ provideTanStackQuery(queryClient),
24
+ ],
25
+ })
26
+ })
27
+
28
+ afterEach(() => {
29
+ vi.useRealTimers()
30
+ })
31
+
32
+ it('should return the correct states', async () => {
33
+ const key1 = queryKey()
34
+ const key2 = queryKey()
35
+ const results: Array<Array<Record<string, any>>> = []
36
+
37
+ @Component({
38
+ template: `
39
+ <div>
40
+ <div>
41
+ data1: {{ result()[0].data() ?? 'null' }}, data2:
42
+ {{ result()[1].data() ?? 'null' }}
43
+ </div>
44
+ </div>
45
+ `,
46
+ })
47
+ class Page {
48
+ readonly result = injectQueries(() => ({
49
+ queries: [
50
+ {
51
+ queryKey: key1,
52
+ queryFn: () => sleep(10).then(() => 1),
53
+ },
54
+ {
55
+ queryKey: key2,
56
+ queryFn: () => sleep(100).then(() => 2),
57
+ },
58
+ ],
59
+ }))
60
+
61
+ constructor() {
62
+ effect(() => {
63
+ const snapshot = this.result().map((q) => ({ data: q.data() }))
64
+ results.push(snapshot)
65
+ })
66
+ }
67
+ }
68
+
69
+ const rendered = await render(Page)
70
+
71
+ await vi.advanceTimersByTimeAsync(101)
72
+ rendered.fixture.detectChanges()
73
+
74
+ expect(rendered.getByText('data1: 1, data2: 2')).toBeInTheDocument()
75
+
76
+ expect(results.length).toBe(3)
77
+ expect(results[0]).toMatchObject([{ data: undefined }, { data: undefined }])
78
+ expect(results[1]).toMatchObject([{ data: 1 }, { data: undefined }])
79
+ expect(results[2]).toMatchObject([{ data: 1 }, { data: 2 }])
80
+ })
81
+
82
+ it('should return the combined result when combine is provided', async () => {
83
+ const key1 = queryKey()
84
+ const key2 = queryKey()
85
+ const results: Array<Record<string, any>> = []
86
+
87
+ @Component({
88
+ template: `
89
+ <div>data: {{ combined().data.join(',') }}</div>
90
+ <div>isPending: {{ combined().isPending }}</div>
91
+ `,
92
+ })
93
+ class Page {
94
+ readonly combined = injectQueries(() => ({
95
+ queries: [
96
+ {
97
+ queryKey: key1,
98
+ queryFn: () => sleep(10).then(() => 1),
99
+ },
100
+ {
101
+ queryKey: key2,
102
+ queryFn: () => sleep(10).then(() => 2),
103
+ },
104
+ ],
105
+ combine: (queries) => ({
106
+ data: queries.map((q) => q.data),
107
+ isPending: queries.some((q) => q.isPending),
108
+ }),
109
+ }))
110
+
111
+ constructor() {
112
+ effect(() => {
113
+ results.push({ ...this.combined() })
114
+ })
115
+ }
116
+ }
117
+
118
+ const rendered = await render(Page)
119
+
120
+ expect(rendered.getByText('data: ,')).toBeInTheDocument()
121
+ expect(rendered.getByText('isPending: true')).toBeInTheDocument()
122
+ expect(results[0]).toMatchObject({
123
+ data: [undefined, undefined],
124
+ isPending: true,
125
+ })
126
+
127
+ await vi.advanceTimersByTimeAsync(11)
128
+ rendered.fixture.detectChanges()
129
+
130
+ expect(rendered.getByText('data: 1,2')).toBeInTheDocument()
131
+ expect(rendered.getByText('isPending: false')).toBeInTheDocument()
132
+ expect(results[results.length - 1]).toMatchObject({
133
+ data: [1, 2],
134
+ isPending: false,
135
+ })
136
+ expect(results.length).toBeGreaterThanOrEqual(2)
137
+ })
138
+
139
+ it('should reflect error state when one of the queries rejects', async () => {
140
+ const key1 = queryKey()
141
+ const key2 = queryKey()
142
+
143
+ @Component({
144
+ template: `
145
+ <div>
146
+ status1: {{ result()[0].status() }}, error1:
147
+ {{ result()[0].error()?.message ?? 'none' }}
148
+ </div>
149
+ <div>
150
+ status2: {{ result()[1].status() }}, data2:
151
+ {{ result()[1].data() ?? 'none' }}
152
+ </div>
153
+ `,
154
+ })
155
+ class Page {
156
+ readonly result = injectQueries(() => ({
157
+ queries: [
158
+ {
159
+ queryKey: key1,
160
+ queryFn: () =>
161
+ sleep(10).then(() => Promise.reject(new Error('Some error'))),
162
+ retry: false,
163
+ },
164
+ {
165
+ queryKey: key2,
166
+ queryFn: () => sleep(10).then(() => 2),
167
+ },
168
+ ],
169
+ }))
170
+ }
171
+
172
+ const rendered = await render(Page)
173
+
174
+ await vi.advanceTimersByTimeAsync(11)
175
+ rendered.fixture.detectChanges()
176
+
177
+ expect(
178
+ rendered.getByText('status1: error, error1: Some error'),
179
+ ).toBeInTheDocument()
180
+ expect(rendered.getByText('status2: success, data2: 2')).toBeInTheDocument()
181
+ })
182
+
183
+ describe('isRestoring', () => {
184
+ it('should not fetch for the duration of the restoring period when isRestoring is true', async () => {
185
+ const key1 = queryKey()
186
+ const key2 = queryKey()
187
+ const queryFn1 = vi.fn().mockImplementation(() => sleep(10).then(() => 1))
188
+ const queryFn2 = vi.fn().mockImplementation(() => sleep(10).then(() => 2))
189
+
190
+ TestBed.configureTestingModule({
191
+ providers: [provideIsRestoring(signal(true).asReadonly())],
192
+ })
193
+
194
+ @Component({
195
+ template: `
196
+ <div>
197
+ status1: {{ queries()[0].status() }}, fetchStatus1:
198
+ {{ queries()[0].fetchStatus() }}
199
+ </div>
200
+ <div>
201
+ status2: {{ queries()[1].status() }}, fetchStatus2:
202
+ {{ queries()[1].fetchStatus() }}
203
+ </div>
204
+ `,
205
+ })
206
+ class Page {
207
+ readonly queries = injectQueries(() => ({
208
+ queries: [
209
+ { queryKey: key1, queryFn: queryFn1 },
210
+ { queryKey: key2, queryFn: queryFn2 },
211
+ ],
212
+ }))
213
+ }
214
+
215
+ const rendered = await render(Page)
216
+
217
+ await vi.advanceTimersByTimeAsync(0)
218
+ rendered.fixture.detectChanges()
219
+ expect(
220
+ rendered.getByText('status1: pending, fetchStatus1: idle'),
221
+ ).toBeInTheDocument()
222
+ expect(
223
+ rendered.getByText('status2: pending, fetchStatus2: idle'),
224
+ ).toBeInTheDocument()
225
+ expect(queryFn1).toHaveBeenCalledTimes(0)
226
+ expect(queryFn2).toHaveBeenCalledTimes(0)
227
+
228
+ await vi.advanceTimersByTimeAsync(11)
229
+ rendered.fixture.detectChanges()
230
+ expect(
231
+ rendered.getByText('status1: pending, fetchStatus1: idle'),
232
+ ).toBeInTheDocument()
233
+ expect(
234
+ rendered.getByText('status2: pending, fetchStatus2: idle'),
235
+ ).toBeInTheDocument()
236
+ expect(queryFn1).toHaveBeenCalledTimes(0)
237
+ expect(queryFn2).toHaveBeenCalledTimes(0)
238
+ })
239
+ })
240
+ })