@spoosh/angular 0.6.0 → 0.6.2

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.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Angular signals integration for Spoosh - `injectRead`, `injectWrite`, and `injectInfiniteRead`.
4
4
 
5
- **[Documentation](https://spoosh.dev/docs/integrations/angular)** · **Requirements:** TypeScript >= 5.0, Angular >= 16.0
5
+ **[Documentation](https://spoosh.dev/docs/angular)** · **Requirements:** TypeScript >= 5.0, Angular >= 16.0
6
6
 
7
7
  ## Installation
8
8
 
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _spoosh_core from '@spoosh/core';
2
- import { PluginArray, StateManager, EventEmitter, PluginExecutor, ReadClient, TagOptions, SpooshResponse, WriteClient, MethodOptionsMap, CoreRequestOptionsBase, SpooshPlugin, PluginTypeConfig, InfiniteRequestOptions, ResolveTypes, ResolverContext, ResolveResultTypes, MergePluginInstanceApi } from '@spoosh/core';
2
+ import { PluginArray, StateManager, EventEmitter, PluginExecutor, MethodOptionsMap, CoreRequestOptionsBase, ReadClient, TagOptions, SpooshPlugin, PluginTypeConfig, SpooshResponse, InfiniteRequestOptions, ResolveTypes, ResolverContext, WriteClient, ResolveResultTypes, MergePluginInstanceApi } from '@spoosh/core';
3
3
  import { Signal } from '@angular/core';
4
4
 
5
5
  interface SpooshInstanceShape<TApi, TSchema, TDefaultError, TPlugins extends PluginArray> {
@@ -14,33 +14,10 @@ interface SpooshInstanceShape<TApi, TSchema, TDefaultError, TPlugins extends Plu
14
14
  };
15
15
  }
16
16
  type EnabledOption = boolean | (() => boolean);
17
- interface BaseReadOptions extends TagOptions {
18
- enabled?: EnabledOption;
19
- }
20
- interface BaseReadResult<TData, TError, TPluginResult = Record<string, unknown>, TTriggerOptions = {
21
- force?: boolean;
22
- }> {
23
- data: Signal<TData | undefined>;
24
- error: Signal<TError | undefined>;
25
- loading: Signal<boolean>;
26
- fetching: Signal<boolean>;
27
- meta: Signal<TPluginResult>;
28
- abort: () => void;
29
- /**
30
- * Manually trigger a fetch.
31
- *
32
- * @param options - Optional override options (query, body, params) to use for this specific request
33
- */
34
- trigger: (options?: TTriggerOptions) => Promise<SpooshResponse<TData, TError>>;
35
- }
36
- interface BaseWriteResult<TData, TError, TOptions, TPluginResult = Record<string, unknown>> {
37
- trigger: (options?: TOptions) => Promise<SpooshResponse<TData, TError>>;
38
- data: Signal<TData | undefined>;
39
- error: Signal<TError | undefined>;
40
- loading: Signal<boolean>;
41
- meta: Signal<TPluginResult>;
42
- abort: () => void;
43
- }
17
+ type QueryRequestOptions = CoreRequestOptionsBase;
18
+ type MutationRequestOptions = CoreRequestOptionsBase;
19
+ type AngularOptionsMap = MethodOptionsMap<QueryRequestOptions, MutationRequestOptions>;
20
+
44
21
  type PageContext<TData, TRequest> = {
45
22
  response: TData | undefined;
46
23
  allResponses: TData[];
@@ -70,32 +47,54 @@ interface BaseInfiniteReadResult<TData, TError, TItem, TPluginResult = Record<st
70
47
  trigger: () => Promise<void>;
71
48
  abort: () => void;
72
49
  }
73
- type QueryRequestOptions = CoreRequestOptionsBase;
74
- type MutationRequestOptions = CoreRequestOptionsBase;
75
- type AngularOptionsMap = MethodOptionsMap<QueryRequestOptions, MutationRequestOptions>;
76
- type ReadApiClient<TSchema, TDefaultError> = ReadClient<TSchema, TDefaultError>;
77
- type WriteApiClient<TSchema, TDefaultError> = WriteClient<TSchema, TDefaultError>;
78
- type QueryField<TQuery> = [TQuery] extends [never] ? object : undefined extends TQuery ? {
79
- query?: Exclude<TQuery, undefined>;
80
- } : {
81
- query: TQuery;
82
- };
83
- type BodyField<TBody> = [TBody] extends [never] ? object : undefined extends TBody ? {
84
- body?: Exclude<TBody, undefined>;
85
- } : {
86
- body: TBody;
87
- };
88
- type ParamsField<TParamNames extends string> = [TParamNames] extends [never] ? object : {
89
- params: Record<TParamNames, string | number>;
90
- };
91
- type ReadInputFields<TQuery, TBody, TParamNames extends string> = QueryField<TQuery> & BodyField<TBody> & ParamsField<TParamNames>;
92
- type ResponseInputFields<TQuery, TBody, TParamNames extends string> = [
93
- TQuery,
94
- TBody,
95
- TParamNames
96
- ] extends [never, never, never] ? object : {
97
- input: ReadInputFields<TQuery, TBody, TParamNames>;
98
- };
50
+ type InfiniteReadApiClient<TSchema, TDefaultError> = ReadClient<TSchema, TDefaultError>;
51
+
52
+ type AnyInfiniteRequestOptions = InfiniteRequestOptions;
53
+ declare function createInjectInfiniteRead<TSchema, TDefaultError, TPlugins extends readonly SpooshPlugin<PluginTypeConfig>[]>(options: Omit<SpooshInstanceShape<unknown, TSchema, TDefaultError, TPlugins>, "_types">): <TReadFn extends (api: InfiniteReadApiClient<TSchema, TDefaultError>) => Promise<SpooshResponse<unknown, unknown>>, TRequest extends AnyInfiniteRequestOptions = AnyInfiniteRequestOptions, TItem = unknown>(readFn: TReadFn, readOptions: BaseInfiniteReadOptions<TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
54
+ data: unknown;
55
+ error?: undefined;
56
+ }> extends {
57
+ data: infer D;
58
+ } ? D : unknown : unknown, TItem, TRequest> & ResolveTypes<((TPlugins[number] extends infer T_3 ? T_3 extends TPlugins[number] ? T_3 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
59
+ readOptions: infer R_3;
60
+ } ? R_3 : object : object : never : never) extends infer T_4 ? T_4 extends (TPlugins[number] extends infer T_5 ? T_5 extends TPlugins[number] ? T_5 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
61
+ readOptions: infer R_3;
62
+ } ? R_3 : object : object : never : never) ? T_4 extends unknown ? (x: T_4) => void : never : never : never) extends (x: infer I) => void ? I : never, ResolverContext<TSchema, TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
63
+ data: unknown;
64
+ error?: undefined;
65
+ }> extends {
66
+ data: infer D;
67
+ } ? D : unknown : unknown, [TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
68
+ error: unknown;
69
+ data?: undefined;
70
+ }> extends {
71
+ error: infer E;
72
+ } ? E : unknown : unknown] extends [unknown] ? TDefaultError : TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
73
+ error: unknown;
74
+ data?: undefined;
75
+ }> extends {
76
+ error: infer E;
77
+ } ? E : unknown : unknown>>) => BaseInfiniteReadResult<TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
78
+ data: unknown;
79
+ error?: undefined;
80
+ }> extends {
81
+ data: infer D;
82
+ } ? D : unknown : unknown, [TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
83
+ error: unknown;
84
+ data?: undefined;
85
+ }> extends {
86
+ error: infer E;
87
+ } ? E : unknown : unknown] extends [unknown] ? TDefaultError : TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
88
+ error: unknown;
89
+ data?: undefined;
90
+ }> extends {
91
+ error: infer E;
92
+ } ? E : unknown : unknown, TItem, ((TPlugins[number] extends infer T ? T extends TPlugins[number] ? T extends SpooshPlugin<infer Types extends PluginTypeConfig> ? Types extends {
93
+ readResult: infer R_2;
94
+ } ? R_2 : object : object : never : never) extends infer T_1 ? T_1 extends (TPlugins[number] extends infer T_2 ? T_2 extends TPlugins[number] ? T_2 extends SpooshPlugin<infer Types extends PluginTypeConfig> ? Types extends {
95
+ readResult: infer R_2;
96
+ } ? R_2 : object : object : never : never) ? T_1 extends unknown ? (x: T_1) => void : never : never : never) extends (x: infer I) => void ? I : never>;
97
+
99
98
  type OptionalQueryField<TQuery> = [TQuery] extends [never] ? object : undefined extends TQuery ? {
100
99
  query?: Exclude<TQuery, undefined>;
101
100
  } : {
@@ -115,6 +114,16 @@ type InputFields<TQuery, TBody, TParamNames extends string> = OptionalQueryField
115
114
  type WriteResponseInputFields<TQuery, TBody, TParamNames extends string> = [TQuery, TBody, TParamNames] extends [never, never, never] ? object : {
116
115
  input: Signal<InputFields<TQuery, TBody, TParamNames> | undefined>;
117
116
  };
117
+ interface BaseWriteResult<TData, TError, TOptions, TPluginResult = Record<string, unknown>> {
118
+ trigger: (options?: TOptions) => Promise<SpooshResponse<TData, TError>>;
119
+ data: Signal<TData | undefined>;
120
+ error: Signal<TError | undefined>;
121
+ loading: Signal<boolean>;
122
+ meta: Signal<TPluginResult>;
123
+ abort: () => void;
124
+ }
125
+ type WriteApiClient<TSchema, TDefaultError> = WriteClient<TSchema, TDefaultError>;
126
+
118
127
  type SuccessResponse<T> = Extract<T, {
119
128
  data: unknown;
120
129
  error?: undefined;
@@ -147,33 +156,6 @@ type ExtractResponseParamNames<T> = SuccessReturnType<T> extends {
147
156
  params: Record<infer K, unknown>;
148
157
  };
149
158
  } ? K extends string ? K : never : never;
150
- type AwaitedReturnTypeTrigger<T> = T extends (...args: never[]) => infer R ? Awaited<R> : never;
151
- type ExtractInputFromResponse<T> = T extends {
152
- input: infer I;
153
- } ? I : never;
154
- type ExtractTriggerQuery<I> = I extends {
155
- query: infer Q;
156
- } ? {
157
- query?: Q;
158
- } : unknown;
159
- type ExtractTriggerBody<I> = I extends {
160
- body: infer B;
161
- } ? {
162
- body?: B;
163
- } : unknown;
164
- type ExtractTriggerParams<I> = I extends {
165
- params: infer P;
166
- } ? {
167
- params?: P;
168
- } : unknown;
169
- type TriggerOptions<T> = ExtractInputFromResponse<AwaitedReturnTypeTrigger<T>> extends infer I ? [I] extends [never] ? {
170
- force?: boolean;
171
- } : ExtractTriggerQuery<I> & ExtractTriggerBody<I> & ExtractTriggerParams<I> & {
172
- /** Force refetch even if data is cached */
173
- force?: boolean;
174
- } : {
175
- force?: boolean;
176
- };
177
159
  type ExtractMethodQuery<T> = ExtractMethodOptions<T> extends {
178
160
  query: infer Q;
179
161
  } ? Q : never;
@@ -181,52 +163,6 @@ type ExtractMethodBody<T> = ExtractMethodOptions<T> extends {
181
163
  body: infer B;
182
164
  } ? B : never;
183
165
 
184
- type AnyInfiniteRequestOptions = InfiniteRequestOptions;
185
- declare function createInjectInfiniteRead<TSchema, TDefaultError, TPlugins extends readonly SpooshPlugin<PluginTypeConfig>[]>(options: Omit<SpooshInstanceShape<unknown, TSchema, TDefaultError, TPlugins>, "_types">): <TReadFn extends (api: ReadApiClient<TSchema, TDefaultError>) => Promise<SpooshResponse<unknown, unknown>>, TRequest extends AnyInfiniteRequestOptions = AnyInfiniteRequestOptions, TItem = unknown>(readFn: TReadFn, readOptions: BaseInfiniteReadOptions<TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
186
- data: unknown;
187
- error?: undefined;
188
- }> extends {
189
- data: infer D;
190
- } ? D : unknown : unknown, TItem, TRequest> & ResolveTypes<((TPlugins[number] extends infer T_3 ? T_3 extends TPlugins[number] ? T_3 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
191
- readOptions: infer R_3;
192
- } ? R_3 : object : object : never : never) extends infer T_4 ? T_4 extends (TPlugins[number] extends infer T_5 ? T_5 extends TPlugins[number] ? T_5 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
193
- readOptions: infer R_3;
194
- } ? R_3 : object : object : never : never) ? T_4 extends unknown ? (x: T_4) => void : never : never : never) extends (x: infer I) => void ? I : never, ResolverContext<TSchema, TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
195
- data: unknown;
196
- error?: undefined;
197
- }> extends {
198
- data: infer D;
199
- } ? D : unknown : unknown, [TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
200
- error: unknown;
201
- data?: undefined;
202
- }> extends {
203
- error: infer E;
204
- } ? E : unknown : unknown] extends [unknown] ? TDefaultError : TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
205
- error: unknown;
206
- data?: undefined;
207
- }> extends {
208
- error: infer E;
209
- } ? E : unknown : unknown>>) => BaseInfiniteReadResult<TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
210
- data: unknown;
211
- error?: undefined;
212
- }> extends {
213
- data: infer D;
214
- } ? D : unknown : unknown, [TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
215
- error: unknown;
216
- data?: undefined;
217
- }> extends {
218
- error: infer E;
219
- } ? E : unknown : unknown] extends [unknown] ? TDefaultError : TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
220
- error: unknown;
221
- data?: undefined;
222
- }> extends {
223
- error: infer E;
224
- } ? E : unknown : unknown, TItem, ((TPlugins[number] extends infer T ? T extends TPlugins[number] ? T extends SpooshPlugin<infer Types extends PluginTypeConfig> ? Types extends {
225
- readResult: infer R_2;
226
- } ? R_2 : object : object : never : never) extends infer T_1 ? T_1 extends (TPlugins[number] extends infer T_2 ? T_2 extends TPlugins[number] ? T_2 extends SpooshPlugin<infer Types extends PluginTypeConfig> ? Types extends {
227
- readResult: infer R_2;
228
- } ? R_2 : object : object : never : never) ? T_1 extends unknown ? (x: T_1) => void : never : never : never) extends (x: infer I) => void ? I : never>;
229
-
230
166
  declare function createInjectWrite<TSchema, TDefaultError, TPlugins extends readonly SpooshPlugin<PluginTypeConfig>[]>(options: Omit<SpooshInstanceShape<unknown, TSchema, TDefaultError, TPlugins>, "_types">): <TMethod extends (...args: never[]) => Promise<SpooshResponse<unknown, unknown>>, TWriteOpts extends (TMethod extends (...args: infer A) => unknown ? A[0] : never) & _spoosh_core.ResolveTypes<((TPlugins[number] extends infer T_3 ? T_3 extends TPlugins[number] ? T_3 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
231
167
  writeOptions: infer W_1;
232
168
  } ? W_1 : object : object : never : never) extends infer T_4 ? T_4 extends (TPlugins[number] extends infer T_5 ? T_5 extends TPlugins[number] ? T_5 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
@@ -286,6 +222,75 @@ declare function createInjectWrite<TSchema, TDefaultError, TPlugins extends read
286
222
  writeResult: infer W;
287
223
  } ? W : object : object : never : never) ? T_1 extends unknown ? (x: T_1) => void : never : never : never) extends (x: infer I) => void ? I : never, TWriteOpts>> & WriteResponseInputFields<ExtractResponseQuery<TMethod>, ExtractResponseBody<TMethod>, ExtractResponseParamNames<TMethod>>;
288
224
 
225
+ interface BaseReadOptions extends TagOptions {
226
+ enabled?: EnabledOption;
227
+ }
228
+ type QueryField<TQuery> = [TQuery] extends [never] ? object : undefined extends TQuery ? {
229
+ query?: Exclude<TQuery, undefined>;
230
+ } : {
231
+ query: TQuery;
232
+ };
233
+ type BodyField<TBody> = [TBody] extends [never] ? object : undefined extends TBody ? {
234
+ body?: Exclude<TBody, undefined>;
235
+ } : {
236
+ body: TBody;
237
+ };
238
+ type ParamsField<TParamNames extends string> = [TParamNames] extends [never] ? object : {
239
+ params: Record<TParamNames, string | number>;
240
+ };
241
+ type ReadInputFields<TQuery, TBody, TParamNames extends string> = QueryField<TQuery> & BodyField<TBody> & ParamsField<TParamNames>;
242
+ type ResponseInputFields<TQuery, TBody, TParamNames extends string> = [
243
+ TQuery,
244
+ TBody,
245
+ TParamNames
246
+ ] extends [never, never, never] ? object : {
247
+ input: ReadInputFields<TQuery, TBody, TParamNames>;
248
+ };
249
+ type AwaitedReturnTypeTrigger<T> = T extends (...args: never[]) => infer R ? Awaited<R> : never;
250
+ type ExtractInputFromResponse<T> = T extends {
251
+ input: infer I;
252
+ } ? I : never;
253
+ type ExtractTriggerQuery<I> = I extends {
254
+ query: infer Q;
255
+ } ? {
256
+ query?: Q;
257
+ } : unknown;
258
+ type ExtractTriggerBody<I> = I extends {
259
+ body: infer B;
260
+ } ? {
261
+ body?: B;
262
+ } : unknown;
263
+ type ExtractTriggerParams<I> = I extends {
264
+ params: infer P;
265
+ } ? {
266
+ params?: P;
267
+ } : unknown;
268
+ type TriggerOptions<T> = ExtractInputFromResponse<AwaitedReturnTypeTrigger<T>> extends infer I ? [I] extends [never] ? {
269
+ force?: boolean;
270
+ } : ExtractTriggerQuery<I> & ExtractTriggerBody<I> & ExtractTriggerParams<I> & {
271
+ /** Force refetch even if data is cached */
272
+ force?: boolean;
273
+ } : {
274
+ force?: boolean;
275
+ };
276
+ interface BaseReadResult<TData, TError, TPluginResult = Record<string, unknown>, TTriggerOptions = {
277
+ force?: boolean;
278
+ }> {
279
+ data: Signal<TData | undefined>;
280
+ error: Signal<TError | undefined>;
281
+ loading: Signal<boolean>;
282
+ fetching: Signal<boolean>;
283
+ meta: Signal<TPluginResult>;
284
+ abort: () => void;
285
+ /**
286
+ * Manually trigger a fetch.
287
+ *
288
+ * @param options - Optional override options (query, body, params) to use for this specific request
289
+ */
290
+ trigger: (options?: TTriggerOptions) => Promise<SpooshResponse<TData, TError>>;
291
+ }
292
+ type ReadApiClient<TSchema, TDefaultError> = ReadClient<TSchema, TDefaultError>;
293
+
289
294
  declare function createInjectRead<TSchema, TDefaultError, TPlugins extends readonly SpooshPlugin<PluginTypeConfig>[]>(options: Omit<SpooshInstanceShape<unknown, TSchema, TDefaultError, TPlugins>, "_types">): <TReadFn extends (api: ReadApiClient<TSchema, TDefaultError>) => Promise<{
290
295
  data?: unknown;
291
296
  error?: unknown;
@@ -356,4 +361,4 @@ type SpooshAngularFunctions<TDefaultError, TSchema, TPlugins extends PluginArray
356
361
 
357
362
  declare function createAngularSpoosh<TSchema, TDefaultError, TPlugins extends PluginArray, TApi>(instance: SpooshInstanceShape<TApi, TSchema, TDefaultError, TPlugins>): SpooshAngularFunctions<TDefaultError, TSchema, TPlugins>;
358
363
 
359
- export { type AngularOptionsMap, type BaseInfiniteReadOptions, type BaseInfiniteReadResult, type BaseReadOptions, type BaseReadResult, type BaseWriteResult, type EnabledOption, type ExtractMethodBody, type ExtractMethodData, type ExtractMethodError, type ExtractMethodOptions, type ExtractMethodQuery, type ExtractResponseBody, type ExtractResponseParamNames, type ExtractResponseQuery, type PageContext, type ReadApiClient, type ResponseInputFields, type SpooshInstanceShape, type TriggerOptions, type WriteApiClient, type WriteResponseInputFields, createAngularSpoosh };
364
+ export { type AngularOptionsMap, type BaseInfiniteReadOptions, type BaseInfiniteReadResult, type BaseReadOptions, type BaseReadResult, type BaseWriteResult, type EnabledOption, type ExtractMethodBody, type ExtractMethodData, type ExtractMethodError, type ExtractMethodOptions, type ExtractMethodQuery, type ExtractResponseBody, type ExtractResponseParamNames, type ExtractResponseQuery, type InfiniteReadApiClient, type PageContext, type ReadApiClient, type ResponseInputFields, type SpooshInstanceShape, type TriggerOptions, type WriteApiClient, type WriteResponseInputFields, createAngularSpoosh };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _spoosh_core from '@spoosh/core';
2
- import { PluginArray, StateManager, EventEmitter, PluginExecutor, ReadClient, TagOptions, SpooshResponse, WriteClient, MethodOptionsMap, CoreRequestOptionsBase, SpooshPlugin, PluginTypeConfig, InfiniteRequestOptions, ResolveTypes, ResolverContext, ResolveResultTypes, MergePluginInstanceApi } from '@spoosh/core';
2
+ import { PluginArray, StateManager, EventEmitter, PluginExecutor, MethodOptionsMap, CoreRequestOptionsBase, ReadClient, TagOptions, SpooshPlugin, PluginTypeConfig, SpooshResponse, InfiniteRequestOptions, ResolveTypes, ResolverContext, WriteClient, ResolveResultTypes, MergePluginInstanceApi } from '@spoosh/core';
3
3
  import { Signal } from '@angular/core';
4
4
 
5
5
  interface SpooshInstanceShape<TApi, TSchema, TDefaultError, TPlugins extends PluginArray> {
@@ -14,33 +14,10 @@ interface SpooshInstanceShape<TApi, TSchema, TDefaultError, TPlugins extends Plu
14
14
  };
15
15
  }
16
16
  type EnabledOption = boolean | (() => boolean);
17
- interface BaseReadOptions extends TagOptions {
18
- enabled?: EnabledOption;
19
- }
20
- interface BaseReadResult<TData, TError, TPluginResult = Record<string, unknown>, TTriggerOptions = {
21
- force?: boolean;
22
- }> {
23
- data: Signal<TData | undefined>;
24
- error: Signal<TError | undefined>;
25
- loading: Signal<boolean>;
26
- fetching: Signal<boolean>;
27
- meta: Signal<TPluginResult>;
28
- abort: () => void;
29
- /**
30
- * Manually trigger a fetch.
31
- *
32
- * @param options - Optional override options (query, body, params) to use for this specific request
33
- */
34
- trigger: (options?: TTriggerOptions) => Promise<SpooshResponse<TData, TError>>;
35
- }
36
- interface BaseWriteResult<TData, TError, TOptions, TPluginResult = Record<string, unknown>> {
37
- trigger: (options?: TOptions) => Promise<SpooshResponse<TData, TError>>;
38
- data: Signal<TData | undefined>;
39
- error: Signal<TError | undefined>;
40
- loading: Signal<boolean>;
41
- meta: Signal<TPluginResult>;
42
- abort: () => void;
43
- }
17
+ type QueryRequestOptions = CoreRequestOptionsBase;
18
+ type MutationRequestOptions = CoreRequestOptionsBase;
19
+ type AngularOptionsMap = MethodOptionsMap<QueryRequestOptions, MutationRequestOptions>;
20
+
44
21
  type PageContext<TData, TRequest> = {
45
22
  response: TData | undefined;
46
23
  allResponses: TData[];
@@ -70,32 +47,54 @@ interface BaseInfiniteReadResult<TData, TError, TItem, TPluginResult = Record<st
70
47
  trigger: () => Promise<void>;
71
48
  abort: () => void;
72
49
  }
73
- type QueryRequestOptions = CoreRequestOptionsBase;
74
- type MutationRequestOptions = CoreRequestOptionsBase;
75
- type AngularOptionsMap = MethodOptionsMap<QueryRequestOptions, MutationRequestOptions>;
76
- type ReadApiClient<TSchema, TDefaultError> = ReadClient<TSchema, TDefaultError>;
77
- type WriteApiClient<TSchema, TDefaultError> = WriteClient<TSchema, TDefaultError>;
78
- type QueryField<TQuery> = [TQuery] extends [never] ? object : undefined extends TQuery ? {
79
- query?: Exclude<TQuery, undefined>;
80
- } : {
81
- query: TQuery;
82
- };
83
- type BodyField<TBody> = [TBody] extends [never] ? object : undefined extends TBody ? {
84
- body?: Exclude<TBody, undefined>;
85
- } : {
86
- body: TBody;
87
- };
88
- type ParamsField<TParamNames extends string> = [TParamNames] extends [never] ? object : {
89
- params: Record<TParamNames, string | number>;
90
- };
91
- type ReadInputFields<TQuery, TBody, TParamNames extends string> = QueryField<TQuery> & BodyField<TBody> & ParamsField<TParamNames>;
92
- type ResponseInputFields<TQuery, TBody, TParamNames extends string> = [
93
- TQuery,
94
- TBody,
95
- TParamNames
96
- ] extends [never, never, never] ? object : {
97
- input: ReadInputFields<TQuery, TBody, TParamNames>;
98
- };
50
+ type InfiniteReadApiClient<TSchema, TDefaultError> = ReadClient<TSchema, TDefaultError>;
51
+
52
+ type AnyInfiniteRequestOptions = InfiniteRequestOptions;
53
+ declare function createInjectInfiniteRead<TSchema, TDefaultError, TPlugins extends readonly SpooshPlugin<PluginTypeConfig>[]>(options: Omit<SpooshInstanceShape<unknown, TSchema, TDefaultError, TPlugins>, "_types">): <TReadFn extends (api: InfiniteReadApiClient<TSchema, TDefaultError>) => Promise<SpooshResponse<unknown, unknown>>, TRequest extends AnyInfiniteRequestOptions = AnyInfiniteRequestOptions, TItem = unknown>(readFn: TReadFn, readOptions: BaseInfiniteReadOptions<TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
54
+ data: unknown;
55
+ error?: undefined;
56
+ }> extends {
57
+ data: infer D;
58
+ } ? D : unknown : unknown, TItem, TRequest> & ResolveTypes<((TPlugins[number] extends infer T_3 ? T_3 extends TPlugins[number] ? T_3 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
59
+ readOptions: infer R_3;
60
+ } ? R_3 : object : object : never : never) extends infer T_4 ? T_4 extends (TPlugins[number] extends infer T_5 ? T_5 extends TPlugins[number] ? T_5 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
61
+ readOptions: infer R_3;
62
+ } ? R_3 : object : object : never : never) ? T_4 extends unknown ? (x: T_4) => void : never : never : never) extends (x: infer I) => void ? I : never, ResolverContext<TSchema, TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
63
+ data: unknown;
64
+ error?: undefined;
65
+ }> extends {
66
+ data: infer D;
67
+ } ? D : unknown : unknown, [TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
68
+ error: unknown;
69
+ data?: undefined;
70
+ }> extends {
71
+ error: infer E;
72
+ } ? E : unknown : unknown] extends [unknown] ? TDefaultError : TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
73
+ error: unknown;
74
+ data?: undefined;
75
+ }> extends {
76
+ error: infer E;
77
+ } ? E : unknown : unknown>>) => BaseInfiniteReadResult<TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
78
+ data: unknown;
79
+ error?: undefined;
80
+ }> extends {
81
+ data: infer D;
82
+ } ? D : unknown : unknown, [TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
83
+ error: unknown;
84
+ data?: undefined;
85
+ }> extends {
86
+ error: infer E;
87
+ } ? E : unknown : unknown] extends [unknown] ? TDefaultError : TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
88
+ error: unknown;
89
+ data?: undefined;
90
+ }> extends {
91
+ error: infer E;
92
+ } ? E : unknown : unknown, TItem, ((TPlugins[number] extends infer T ? T extends TPlugins[number] ? T extends SpooshPlugin<infer Types extends PluginTypeConfig> ? Types extends {
93
+ readResult: infer R_2;
94
+ } ? R_2 : object : object : never : never) extends infer T_1 ? T_1 extends (TPlugins[number] extends infer T_2 ? T_2 extends TPlugins[number] ? T_2 extends SpooshPlugin<infer Types extends PluginTypeConfig> ? Types extends {
95
+ readResult: infer R_2;
96
+ } ? R_2 : object : object : never : never) ? T_1 extends unknown ? (x: T_1) => void : never : never : never) extends (x: infer I) => void ? I : never>;
97
+
99
98
  type OptionalQueryField<TQuery> = [TQuery] extends [never] ? object : undefined extends TQuery ? {
100
99
  query?: Exclude<TQuery, undefined>;
101
100
  } : {
@@ -115,6 +114,16 @@ type InputFields<TQuery, TBody, TParamNames extends string> = OptionalQueryField
115
114
  type WriteResponseInputFields<TQuery, TBody, TParamNames extends string> = [TQuery, TBody, TParamNames] extends [never, never, never] ? object : {
116
115
  input: Signal<InputFields<TQuery, TBody, TParamNames> | undefined>;
117
116
  };
117
+ interface BaseWriteResult<TData, TError, TOptions, TPluginResult = Record<string, unknown>> {
118
+ trigger: (options?: TOptions) => Promise<SpooshResponse<TData, TError>>;
119
+ data: Signal<TData | undefined>;
120
+ error: Signal<TError | undefined>;
121
+ loading: Signal<boolean>;
122
+ meta: Signal<TPluginResult>;
123
+ abort: () => void;
124
+ }
125
+ type WriteApiClient<TSchema, TDefaultError> = WriteClient<TSchema, TDefaultError>;
126
+
118
127
  type SuccessResponse<T> = Extract<T, {
119
128
  data: unknown;
120
129
  error?: undefined;
@@ -147,33 +156,6 @@ type ExtractResponseParamNames<T> = SuccessReturnType<T> extends {
147
156
  params: Record<infer K, unknown>;
148
157
  };
149
158
  } ? K extends string ? K : never : never;
150
- type AwaitedReturnTypeTrigger<T> = T extends (...args: never[]) => infer R ? Awaited<R> : never;
151
- type ExtractInputFromResponse<T> = T extends {
152
- input: infer I;
153
- } ? I : never;
154
- type ExtractTriggerQuery<I> = I extends {
155
- query: infer Q;
156
- } ? {
157
- query?: Q;
158
- } : unknown;
159
- type ExtractTriggerBody<I> = I extends {
160
- body: infer B;
161
- } ? {
162
- body?: B;
163
- } : unknown;
164
- type ExtractTriggerParams<I> = I extends {
165
- params: infer P;
166
- } ? {
167
- params?: P;
168
- } : unknown;
169
- type TriggerOptions<T> = ExtractInputFromResponse<AwaitedReturnTypeTrigger<T>> extends infer I ? [I] extends [never] ? {
170
- force?: boolean;
171
- } : ExtractTriggerQuery<I> & ExtractTriggerBody<I> & ExtractTriggerParams<I> & {
172
- /** Force refetch even if data is cached */
173
- force?: boolean;
174
- } : {
175
- force?: boolean;
176
- };
177
159
  type ExtractMethodQuery<T> = ExtractMethodOptions<T> extends {
178
160
  query: infer Q;
179
161
  } ? Q : never;
@@ -181,52 +163,6 @@ type ExtractMethodBody<T> = ExtractMethodOptions<T> extends {
181
163
  body: infer B;
182
164
  } ? B : never;
183
165
 
184
- type AnyInfiniteRequestOptions = InfiniteRequestOptions;
185
- declare function createInjectInfiniteRead<TSchema, TDefaultError, TPlugins extends readonly SpooshPlugin<PluginTypeConfig>[]>(options: Omit<SpooshInstanceShape<unknown, TSchema, TDefaultError, TPlugins>, "_types">): <TReadFn extends (api: ReadApiClient<TSchema, TDefaultError>) => Promise<SpooshResponse<unknown, unknown>>, TRequest extends AnyInfiniteRequestOptions = AnyInfiniteRequestOptions, TItem = unknown>(readFn: TReadFn, readOptions: BaseInfiniteReadOptions<TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
186
- data: unknown;
187
- error?: undefined;
188
- }> extends {
189
- data: infer D;
190
- } ? D : unknown : unknown, TItem, TRequest> & ResolveTypes<((TPlugins[number] extends infer T_3 ? T_3 extends TPlugins[number] ? T_3 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
191
- readOptions: infer R_3;
192
- } ? R_3 : object : object : never : never) extends infer T_4 ? T_4 extends (TPlugins[number] extends infer T_5 ? T_5 extends TPlugins[number] ? T_5 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
193
- readOptions: infer R_3;
194
- } ? R_3 : object : object : never : never) ? T_4 extends unknown ? (x: T_4) => void : never : never : never) extends (x: infer I) => void ? I : never, ResolverContext<TSchema, TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
195
- data: unknown;
196
- error?: undefined;
197
- }> extends {
198
- data: infer D;
199
- } ? D : unknown : unknown, [TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
200
- error: unknown;
201
- data?: undefined;
202
- }> extends {
203
- error: infer E;
204
- } ? E : unknown : unknown] extends [unknown] ? TDefaultError : TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
205
- error: unknown;
206
- data?: undefined;
207
- }> extends {
208
- error: infer E;
209
- } ? E : unknown : unknown>>) => BaseInfiniteReadResult<TReadFn extends (...args: never[]) => infer R ? Extract<Awaited<R>, {
210
- data: unknown;
211
- error?: undefined;
212
- }> extends {
213
- data: infer D;
214
- } ? D : unknown : unknown, [TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
215
- error: unknown;
216
- data?: undefined;
217
- }> extends {
218
- error: infer E;
219
- } ? E : unknown : unknown] extends [unknown] ? TDefaultError : TReadFn extends (...args: never[]) => infer R_1 ? Extract<Awaited<R_1>, {
220
- error: unknown;
221
- data?: undefined;
222
- }> extends {
223
- error: infer E;
224
- } ? E : unknown : unknown, TItem, ((TPlugins[number] extends infer T ? T extends TPlugins[number] ? T extends SpooshPlugin<infer Types extends PluginTypeConfig> ? Types extends {
225
- readResult: infer R_2;
226
- } ? R_2 : object : object : never : never) extends infer T_1 ? T_1 extends (TPlugins[number] extends infer T_2 ? T_2 extends TPlugins[number] ? T_2 extends SpooshPlugin<infer Types extends PluginTypeConfig> ? Types extends {
227
- readResult: infer R_2;
228
- } ? R_2 : object : object : never : never) ? T_1 extends unknown ? (x: T_1) => void : never : never : never) extends (x: infer I) => void ? I : never>;
229
-
230
166
  declare function createInjectWrite<TSchema, TDefaultError, TPlugins extends readonly SpooshPlugin<PluginTypeConfig>[]>(options: Omit<SpooshInstanceShape<unknown, TSchema, TDefaultError, TPlugins>, "_types">): <TMethod extends (...args: never[]) => Promise<SpooshResponse<unknown, unknown>>, TWriteOpts extends (TMethod extends (...args: infer A) => unknown ? A[0] : never) & _spoosh_core.ResolveTypes<((TPlugins[number] extends infer T_3 ? T_3 extends TPlugins[number] ? T_3 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
231
167
  writeOptions: infer W_1;
232
168
  } ? W_1 : object : object : never : never) extends infer T_4 ? T_4 extends (TPlugins[number] extends infer T_5 ? T_5 extends TPlugins[number] ? T_5 extends SpooshPlugin<infer Types_1 extends PluginTypeConfig> ? Types_1 extends {
@@ -286,6 +222,75 @@ declare function createInjectWrite<TSchema, TDefaultError, TPlugins extends read
286
222
  writeResult: infer W;
287
223
  } ? W : object : object : never : never) ? T_1 extends unknown ? (x: T_1) => void : never : never : never) extends (x: infer I) => void ? I : never, TWriteOpts>> & WriteResponseInputFields<ExtractResponseQuery<TMethod>, ExtractResponseBody<TMethod>, ExtractResponseParamNames<TMethod>>;
288
224
 
225
+ interface BaseReadOptions extends TagOptions {
226
+ enabled?: EnabledOption;
227
+ }
228
+ type QueryField<TQuery> = [TQuery] extends [never] ? object : undefined extends TQuery ? {
229
+ query?: Exclude<TQuery, undefined>;
230
+ } : {
231
+ query: TQuery;
232
+ };
233
+ type BodyField<TBody> = [TBody] extends [never] ? object : undefined extends TBody ? {
234
+ body?: Exclude<TBody, undefined>;
235
+ } : {
236
+ body: TBody;
237
+ };
238
+ type ParamsField<TParamNames extends string> = [TParamNames] extends [never] ? object : {
239
+ params: Record<TParamNames, string | number>;
240
+ };
241
+ type ReadInputFields<TQuery, TBody, TParamNames extends string> = QueryField<TQuery> & BodyField<TBody> & ParamsField<TParamNames>;
242
+ type ResponseInputFields<TQuery, TBody, TParamNames extends string> = [
243
+ TQuery,
244
+ TBody,
245
+ TParamNames
246
+ ] extends [never, never, never] ? object : {
247
+ input: ReadInputFields<TQuery, TBody, TParamNames>;
248
+ };
249
+ type AwaitedReturnTypeTrigger<T> = T extends (...args: never[]) => infer R ? Awaited<R> : never;
250
+ type ExtractInputFromResponse<T> = T extends {
251
+ input: infer I;
252
+ } ? I : never;
253
+ type ExtractTriggerQuery<I> = I extends {
254
+ query: infer Q;
255
+ } ? {
256
+ query?: Q;
257
+ } : unknown;
258
+ type ExtractTriggerBody<I> = I extends {
259
+ body: infer B;
260
+ } ? {
261
+ body?: B;
262
+ } : unknown;
263
+ type ExtractTriggerParams<I> = I extends {
264
+ params: infer P;
265
+ } ? {
266
+ params?: P;
267
+ } : unknown;
268
+ type TriggerOptions<T> = ExtractInputFromResponse<AwaitedReturnTypeTrigger<T>> extends infer I ? [I] extends [never] ? {
269
+ force?: boolean;
270
+ } : ExtractTriggerQuery<I> & ExtractTriggerBody<I> & ExtractTriggerParams<I> & {
271
+ /** Force refetch even if data is cached */
272
+ force?: boolean;
273
+ } : {
274
+ force?: boolean;
275
+ };
276
+ interface BaseReadResult<TData, TError, TPluginResult = Record<string, unknown>, TTriggerOptions = {
277
+ force?: boolean;
278
+ }> {
279
+ data: Signal<TData | undefined>;
280
+ error: Signal<TError | undefined>;
281
+ loading: Signal<boolean>;
282
+ fetching: Signal<boolean>;
283
+ meta: Signal<TPluginResult>;
284
+ abort: () => void;
285
+ /**
286
+ * Manually trigger a fetch.
287
+ *
288
+ * @param options - Optional override options (query, body, params) to use for this specific request
289
+ */
290
+ trigger: (options?: TTriggerOptions) => Promise<SpooshResponse<TData, TError>>;
291
+ }
292
+ type ReadApiClient<TSchema, TDefaultError> = ReadClient<TSchema, TDefaultError>;
293
+
289
294
  declare function createInjectRead<TSchema, TDefaultError, TPlugins extends readonly SpooshPlugin<PluginTypeConfig>[]>(options: Omit<SpooshInstanceShape<unknown, TSchema, TDefaultError, TPlugins>, "_types">): <TReadFn extends (api: ReadApiClient<TSchema, TDefaultError>) => Promise<{
290
295
  data?: unknown;
291
296
  error?: unknown;
@@ -356,4 +361,4 @@ type SpooshAngularFunctions<TDefaultError, TSchema, TPlugins extends PluginArray
356
361
 
357
362
  declare function createAngularSpoosh<TSchema, TDefaultError, TPlugins extends PluginArray, TApi>(instance: SpooshInstanceShape<TApi, TSchema, TDefaultError, TPlugins>): SpooshAngularFunctions<TDefaultError, TSchema, TPlugins>;
358
363
 
359
- export { type AngularOptionsMap, type BaseInfiniteReadOptions, type BaseInfiniteReadResult, type BaseReadOptions, type BaseReadResult, type BaseWriteResult, type EnabledOption, type ExtractMethodBody, type ExtractMethodData, type ExtractMethodError, type ExtractMethodOptions, type ExtractMethodQuery, type ExtractResponseBody, type ExtractResponseParamNames, type ExtractResponseQuery, type PageContext, type ReadApiClient, type ResponseInputFields, type SpooshInstanceShape, type TriggerOptions, type WriteApiClient, type WriteResponseInputFields, createAngularSpoosh };
364
+ export { type AngularOptionsMap, type BaseInfiniteReadOptions, type BaseInfiniteReadResult, type BaseReadOptions, type BaseReadResult, type BaseWriteResult, type EnabledOption, type ExtractMethodBody, type ExtractMethodData, type ExtractMethodError, type ExtractMethodOptions, type ExtractMethodQuery, type ExtractResponseBody, type ExtractResponseParamNames, type ExtractResponseQuery, type InfiniteReadApiClient, type PageContext, type ReadApiClient, type ResponseInputFields, type SpooshInstanceShape, type TriggerOptions, type WriteApiClient, type WriteResponseInputFields, createAngularSpoosh };
package/dist/index.js CHANGED
@@ -121,7 +121,7 @@ function createInjectRead(options) {
121
121
  return response;
122
122
  } catch (err) {
123
123
  errorSignal.set(err);
124
- throw err;
124
+ return { error: err };
125
125
  } finally {
126
126
  loadingSignal.set(false);
127
127
  fetchingSignal.set(false);
@@ -256,9 +256,17 @@ function createInjectRead(options) {
256
256
  }
257
257
  }
258
258
  );
259
+ const unsubRefetchAll = eventEmitter.on("refetchAll", () => {
260
+ if (currentController) {
261
+ (0, import_core.untracked)(() => {
262
+ executeWithTracking(currentController, true);
263
+ });
264
+ }
265
+ });
259
266
  return () => {
260
267
  unsubRefetch();
261
268
  unsubInvalidate();
269
+ unsubRefetchAll();
262
270
  };
263
271
  },
264
272
  { allowSignalWrites: true }
@@ -275,7 +283,7 @@ function createInjectRead(options) {
275
283
  currentController?.abort();
276
284
  };
277
285
  const trigger = async (triggerOptions) => {
278
- const { force = false, ...overrideOptions } = triggerOptions ?? {};
286
+ const { force = true, ...overrideOptions } = triggerOptions ?? {};
279
287
  const hasOverrides = Object.keys(overrideOptions).length > 0;
280
288
  if (!hasOverrides) {
281
289
  if (!currentController) {
@@ -432,7 +440,7 @@ function createInjectWrite(options) {
432
440
  return response;
433
441
  } catch (err) {
434
442
  errorSignal.set(err);
435
- throw err;
443
+ return { error: err };
436
444
  } finally {
437
445
  loadingSignal.set(false);
438
446
  }
@@ -529,6 +537,7 @@ function createInjectInfiniteRead(options) {
529
537
  let prevContext = null;
530
538
  let isMounted = false;
531
539
  let unsubInvalidate = null;
540
+ let unsubRefetchAll = null;
532
541
  const updateSignalsFromState = () => {
533
542
  if (!currentController) return;
534
543
  const state = currentController.getState();
@@ -563,6 +572,9 @@ function createInjectInfiniteRead(options) {
563
572
  if (unsubInvalidate) {
564
573
  unsubInvalidate();
565
574
  }
575
+ if (unsubRefetchAll) {
576
+ unsubRefetchAll();
577
+ }
566
578
  const requestOptions = capturedCall.options;
567
579
  const pathSegments = capturedCall.path.split("/").filter(Boolean);
568
580
  const baseOptionsForKey = {
@@ -635,6 +647,14 @@ function createInjectInfiniteRead(options) {
635
647
  }
636
648
  }
637
649
  );
650
+ unsubRefetchAll = eventEmitter.on("refetchAll", () => {
651
+ if (!getEnabled() || !currentController) return;
652
+ loadingSignal.set(true);
653
+ currentController.refetch().finally(() => {
654
+ updateSignalsFromState();
655
+ loadingSignal.set(false);
656
+ });
657
+ });
638
658
  return controller;
639
659
  };
640
660
  const initialCapturedCall = captureSelector();
@@ -725,6 +745,9 @@ function createInjectInfiniteRead(options) {
725
745
  if (unsubInvalidate) {
726
746
  unsubInvalidate();
727
747
  }
748
+ if (unsubRefetchAll) {
749
+ unsubRefetchAll();
750
+ }
728
751
  if (currentSubscription) {
729
752
  currentSubscription();
730
753
  }
package/dist/index.mjs CHANGED
@@ -106,7 +106,7 @@ function createInjectRead(options) {
106
106
  return response;
107
107
  } catch (err) {
108
108
  errorSignal.set(err);
109
- throw err;
109
+ return { error: err };
110
110
  } finally {
111
111
  loadingSignal.set(false);
112
112
  fetchingSignal.set(false);
@@ -241,9 +241,17 @@ function createInjectRead(options) {
241
241
  }
242
242
  }
243
243
  );
244
+ const unsubRefetchAll = eventEmitter.on("refetchAll", () => {
245
+ if (currentController) {
246
+ untracked(() => {
247
+ executeWithTracking(currentController, true);
248
+ });
249
+ }
250
+ });
244
251
  return () => {
245
252
  unsubRefetch();
246
253
  unsubInvalidate();
254
+ unsubRefetchAll();
247
255
  };
248
256
  },
249
257
  { allowSignalWrites: true }
@@ -260,7 +268,7 @@ function createInjectRead(options) {
260
268
  currentController?.abort();
261
269
  };
262
270
  const trigger = async (triggerOptions) => {
263
- const { force = false, ...overrideOptions } = triggerOptions ?? {};
271
+ const { force = true, ...overrideOptions } = triggerOptions ?? {};
264
272
  const hasOverrides = Object.keys(overrideOptions).length > 0;
265
273
  if (!hasOverrides) {
266
274
  if (!currentController) {
@@ -422,7 +430,7 @@ function createInjectWrite(options) {
422
430
  return response;
423
431
  } catch (err) {
424
432
  errorSignal.set(err);
425
- throw err;
433
+ return { error: err };
426
434
  } finally {
427
435
  loadingSignal.set(false);
428
436
  }
@@ -531,6 +539,7 @@ function createInjectInfiniteRead(options) {
531
539
  let prevContext = null;
532
540
  let isMounted = false;
533
541
  let unsubInvalidate = null;
542
+ let unsubRefetchAll = null;
534
543
  const updateSignalsFromState = () => {
535
544
  if (!currentController) return;
536
545
  const state = currentController.getState();
@@ -565,6 +574,9 @@ function createInjectInfiniteRead(options) {
565
574
  if (unsubInvalidate) {
566
575
  unsubInvalidate();
567
576
  }
577
+ if (unsubRefetchAll) {
578
+ unsubRefetchAll();
579
+ }
568
580
  const requestOptions = capturedCall.options;
569
581
  const pathSegments = capturedCall.path.split("/").filter(Boolean);
570
582
  const baseOptionsForKey = {
@@ -637,6 +649,14 @@ function createInjectInfiniteRead(options) {
637
649
  }
638
650
  }
639
651
  );
652
+ unsubRefetchAll = eventEmitter.on("refetchAll", () => {
653
+ if (!getEnabled() || !currentController) return;
654
+ loadingSignal.set(true);
655
+ currentController.refetch().finally(() => {
656
+ updateSignalsFromState();
657
+ loadingSignal.set(false);
658
+ });
659
+ });
640
660
  return controller;
641
661
  };
642
662
  const initialCapturedCall = captureSelector();
@@ -727,6 +747,9 @@ function createInjectInfiniteRead(options) {
727
747
  if (unsubInvalidate) {
728
748
  unsubInvalidate();
729
749
  }
750
+ if (unsubRefetchAll) {
751
+ unsubRefetchAll();
752
+ }
730
753
  if (currentSubscription) {
731
754
  currentSubscription();
732
755
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spoosh/angular",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "license": "MIT",
5
5
  "description": "Angular signals integration for Spoosh API client",
6
6
  "keywords": [
@@ -13,13 +13,13 @@
13
13
  ],
14
14
  "repository": {
15
15
  "type": "git",
16
- "url": "git+https://github.com/nxnom/spoosh.git",
16
+ "url": "git+https://github.com/spooshdev/spoosh.git",
17
17
  "directory": "packages/angular"
18
18
  },
19
19
  "bugs": {
20
- "url": "https://github.com/nxnom/spoosh/issues"
20
+ "url": "https://github.com/spooshdev/spoosh/issues"
21
21
  },
22
- "homepage": "https://spoosh.dev/angular/docs",
22
+ "homepage": "https://spoosh.dev/docs/angular",
23
23
  "publishConfig": {
24
24
  "access": "public"
25
25
  },
@@ -38,7 +38,9 @@
38
38
  "@angular/core": ">=16.0.0"
39
39
  },
40
40
  "devDependencies": {
41
- "@spoosh/core": "0.9.0"
41
+ "@angular/core": "^19.0.0",
42
+ "@spoosh/core": "0.10.0",
43
+ "@spoosh/test-utils": "0.1.5"
42
44
  },
43
45
  "scripts": {
44
46
  "dev": "tsup --watch",