@vielzeug/sourcerer 1.0.6 → 2.0.0

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 (152) hide show
  1. package/README.md +19 -74
  2. package/dist/_dev.cjs +2 -0
  3. package/dist/_dev.cjs.map +1 -0
  4. package/dist/_dev.d.ts +2 -0
  5. package/dist/_dev.d.ts.map +1 -0
  6. package/dist/_dev.js +6 -0
  7. package/dist/_dev.js.map +1 -0
  8. package/dist/asyncSource.cjs +1 -1
  9. package/dist/asyncSource.cjs.map +1 -1
  10. package/dist/asyncSource.d.ts +14 -58
  11. package/dist/asyncSource.d.ts.map +1 -1
  12. package/dist/asyncSource.js +28 -27
  13. package/dist/asyncSource.js.map +1 -1
  14. package/dist/cursorSource.cjs +1 -1
  15. package/dist/cursorSource.cjs.map +1 -1
  16. package/dist/cursorSource.d.ts +3 -3
  17. package/dist/cursorSource.d.ts.map +1 -1
  18. package/dist/cursorSource.js +77 -110
  19. package/dist/cursorSource.js.map +1 -1
  20. package/dist/devtools.cjs +2 -0
  21. package/dist/devtools.cjs.map +1 -0
  22. package/dist/devtools.d.ts +6 -0
  23. package/dist/devtools.d.ts.map +1 -0
  24. package/dist/devtools.js +8 -0
  25. package/dist/devtools.js.map +1 -0
  26. package/dist/index.cjs +1 -1
  27. package/dist/index.d.ts +2 -12
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +5 -14
  30. package/dist/infiniteSource.cjs +1 -1
  31. package/dist/infiniteSource.cjs.map +1 -1
  32. package/dist/infiniteSource.d.ts +3 -3
  33. package/dist/infiniteSource.d.ts.map +1 -1
  34. package/dist/infiniteSource.js +72 -107
  35. package/dist/infiniteSource.js.map +1 -1
  36. package/dist/localSource.cjs +1 -1
  37. package/dist/localSource.cjs.map +1 -1
  38. package/dist/localSource.d.ts +2 -22
  39. package/dist/localSource.d.ts.map +1 -1
  40. package/dist/localSource.js +58 -114
  41. package/dist/localSource.js.map +1 -1
  42. package/dist/pageSource.cjs +2 -0
  43. package/dist/pageSource.cjs.map +1 -0
  44. package/dist/pageSource.d.ts +4 -0
  45. package/dist/pageSource.d.ts.map +1 -0
  46. package/dist/pageSource.js +96 -0
  47. package/dist/pageSource.js.map +1 -0
  48. package/dist/pagination.cjs +1 -1
  49. package/dist/pagination.cjs.map +1 -1
  50. package/dist/pagination.d.ts +5 -30
  51. package/dist/pagination.d.ts.map +1 -1
  52. package/dist/pagination.js +21 -27
  53. package/dist/pagination.js.map +1 -1
  54. package/dist/requestController.cjs +2 -0
  55. package/dist/requestController.cjs.map +1 -0
  56. package/dist/requestController.d.ts +13 -0
  57. package/dist/requestController.d.ts.map +1 -0
  58. package/dist/requestController.js +29 -0
  59. package/dist/requestController.js.map +1 -0
  60. package/dist/sourceStore.cjs +2 -0
  61. package/dist/sourceStore.cjs.map +1 -0
  62. package/dist/sourceStore.d.ts +10 -0
  63. package/dist/sourceStore.d.ts.map +1 -0
  64. package/dist/sourceStore.js +38 -0
  65. package/dist/sourceStore.js.map +1 -0
  66. package/dist/sourcerer.cjs +1 -1
  67. package/dist/sourcerer.cjs.map +1 -1
  68. package/dist/sourcerer.iife.js +1 -1
  69. package/dist/sourcerer.iife.js.map +1 -1
  70. package/dist/sourcerer.js +1 -1
  71. package/dist/sourcerer.js.map +1 -1
  72. package/dist/types.d.ts +128 -345
  73. package/dist/types.d.ts.map +1 -1
  74. package/package.json +10 -7
  75. package/dist/_utils.cjs +0 -2
  76. package/dist/_utils.cjs.map +0 -1
  77. package/dist/_utils.d.ts +0 -8
  78. package/dist/_utils.d.ts.map +0 -1
  79. package/dist/_utils.js +0 -7
  80. package/dist/_utils.js.map +0 -1
  81. package/dist/applyQuery.cjs +0 -2
  82. package/dist/applyQuery.cjs.map +0 -1
  83. package/dist/applyQuery.d.ts +0 -20
  84. package/dist/applyQuery.d.ts.map +0 -1
  85. package/dist/applyQuery.js +0 -8
  86. package/dist/applyQuery.js.map +0 -1
  87. package/dist/asyncSearch.cjs +0 -2
  88. package/dist/asyncSearch.cjs.map +0 -1
  89. package/dist/asyncSearch.d.ts +0 -13
  90. package/dist/asyncSearch.d.ts.map +0 -1
  91. package/dist/asyncSearch.js +0 -28
  92. package/dist/asyncSearch.js.map +0 -1
  93. package/dist/codecs.cjs +0 -2
  94. package/dist/codecs.cjs.map +0 -1
  95. package/dist/codecs.d.ts +0 -30
  96. package/dist/codecs.d.ts.map +0 -1
  97. package/dist/codecs.js +0 -36
  98. package/dist/codecs.js.map +0 -1
  99. package/dist/core.cjs +0 -2
  100. package/dist/core.cjs.map +0 -1
  101. package/dist/core.d.ts +0 -47
  102. package/dist/core.d.ts.map +0 -1
  103. package/dist/core.js +0 -59
  104. package/dist/core.js.map +0 -1
  105. package/dist/derive.cjs +0 -2
  106. package/dist/derive.cjs.map +0 -1
  107. package/dist/derive.d.ts +0 -28
  108. package/dist/derive.d.ts.map +0 -1
  109. package/dist/derive.js +0 -40
  110. package/dist/derive.js.map +0 -1
  111. package/dist/errors.cjs +0 -2
  112. package/dist/errors.cjs.map +0 -1
  113. package/dist/errors.d.ts +0 -62
  114. package/dist/errors.d.ts.map +0 -1
  115. package/dist/errors.js +0 -29
  116. package/dist/errors.js.map +0 -1
  117. package/dist/fetchManager.cjs +0 -2
  118. package/dist/fetchManager.cjs.map +0 -1
  119. package/dist/fetchManager.d.ts +0 -27
  120. package/dist/fetchManager.d.ts.map +0 -1
  121. package/dist/fetchManager.js +0 -41
  122. package/dist/fetchManager.js.map +0 -1
  123. package/dist/merge.cjs +0 -2
  124. package/dist/merge.cjs.map +0 -1
  125. package/dist/merge.d.ts +0 -30
  126. package/dist/merge.d.ts.map +0 -1
  127. package/dist/merge.js +0 -34
  128. package/dist/merge.js.map +0 -1
  129. package/dist/prefetch.cjs +0 -2
  130. package/dist/prefetch.cjs.map +0 -1
  131. package/dist/prefetch.d.ts +0 -32
  132. package/dist/prefetch.d.ts.map +0 -1
  133. package/dist/prefetch.js +0 -38
  134. package/dist/prefetch.js.map +0 -1
  135. package/dist/presets.cjs +0 -2
  136. package/dist/presets.cjs.map +0 -1
  137. package/dist/presets.d.ts +0 -17
  138. package/dist/presets.d.ts.map +0 -1
  139. package/dist/presets.js +0 -43
  140. package/dist/presets.js.map +0 -1
  141. package/dist/remoteSource.cjs +0 -2
  142. package/dist/remoteSource.cjs.map +0 -1
  143. package/dist/remoteSource.d.ts +0 -4
  144. package/dist/remoteSource.d.ts.map +0 -1
  145. package/dist/remoteSource.js +0 -165
  146. package/dist/remoteSource.js.map +0 -1
  147. package/dist/state.cjs +0 -2
  148. package/dist/state.cjs.map +0 -1
  149. package/dist/state.d.ts +0 -23
  150. package/dist/state.d.ts.map +0 -1
  151. package/dist/state.js +0 -14
  152. package/dist/state.js.map +0 -1
package/dist/types.d.ts CHANGED
@@ -1,374 +1,157 @@
1
- import type { SourcererError } from './errors';
2
- export type Predicate<T> = (value: T, index: number, array: readonly T[]) => boolean;
3
- export type Sorter<T> = (a: T, b: T) => number;
4
- export type QueryParamsInput = Record<string, string | string[] | undefined>;
5
- export type QueryParams = Record<string, string>;
6
- /** Configures automatic retry on fetch failure. */
7
- export type RetryConfig = Readonly<{
8
- /** Number of retry attempts after the first failure. Default: 0 (no retries). */
9
- attempts?: number;
10
- /** Returns the delay in ms before the nth retry (1-indexed). Default: exponential backoff. */
11
- delay?: (attempt: number) => number;
12
- }>;
13
- export type SourceQuery = Readonly<{
14
- limit: number;
15
- page: number;
16
- /**
17
- * The active search string. Absent (or empty string) when no search is active.
18
- * Both representations are equivalent — treat `''` and `undefined` identically.
19
- * `encodeQuery` omits this field when falsy; `decodeQuery` returns it only when present in the URL.
20
- */
21
- search?: string;
1
+ export type Predicate<T> = (value: T, index: number, values: readonly T[]) => boolean;
2
+ export type Sorter<T> = (left: T, right: T) => number;
3
+ export type Disposable = {
4
+ [Symbol.dispose](): void;
5
+ readonly disposalSignal: AbortSignal;
6
+ dispose(): void;
7
+ readonly disposed: boolean;
8
+ };
9
+ export type PagePagination = Readonly<{
10
+ count: number;
11
+ hasNext: boolean;
12
+ hasPrevious: boolean;
13
+ index: number;
14
+ kind: 'page';
15
+ size: number;
16
+ total: number;
22
17
  }>;
23
- export type RemoteSourceQuery<TFilter = unknown, TSort = unknown> = Readonly<{
24
- filter?: TFilter;
25
- limit: number;
26
- page: number;
27
- search?: string;
28
- sort?: TSort;
18
+ export type CursorPagination<TCursor = string> = Readonly<{
19
+ hasNext: boolean;
20
+ hasPrevious: boolean;
21
+ kind: 'cursor';
22
+ nextCursor?: TCursor;
23
+ previousCursor?: TCursor;
24
+ total?: number;
29
25
  }>;
30
- export type CursorSourceQuery<TCursor = string> = Readonly<{
31
- after?: TCursor;
32
- before?: TCursor;
33
- limit: number;
34
- search?: string;
35
- }>;
36
- export type InfiniteSourceQuery = Readonly<{
37
- limit: number;
38
- page: number;
39
- search?: string;
26
+ export type InfinitePagination = Readonly<{
27
+ hasMore: boolean;
28
+ isLoadingMore: boolean;
29
+ kind: 'infinite';
30
+ loaded: number;
31
+ total: number;
40
32
  }>;
41
- export { SourceDisposedError, SourcererError, SourceTimeoutError } from './errors';
42
- export type { SourcererErrorContext } from './errors';
43
- /**
44
- * Event emitted by the `onFetch` callback after each fetch attempt settles.
45
- * Carries the full `SourcererError` on failure for rich diagnostics.
46
- */
47
- export type FetchEvent<TQuery = unknown> = Readonly<{
48
- /** Total time in ms from issuing the request to receiving a response (includes retries). */
49
- durationMs: number;
50
- /** Structured error when `status` is `'error'`. */
51
- error?: SourcererError;
52
- /** The query object that was fetched. */
33
+ export type AnyPagination = CursorPagination<unknown> | InfinitePagination | PagePagination;
34
+ /** Loaded state remains internally consistent while pendingQuery describes newer work. */
35
+ export type SourceSnapshot<T, TQuery, TPagination extends AnyPagination = AnyPagination> = Readonly<{
36
+ data: readonly T[];
37
+ error: Error | null;
38
+ isFetching: boolean;
39
+ pagination: TPagination;
40
+ pendingQuery?: TQuery;
53
41
  query: TQuery;
54
- status: 'error' | 'success';
55
42
  }>;
56
- /**
57
- * Metadata snapshot describing the current pagination and loading state of a source.
58
- * Use `itemRange(meta)` to compute display-level start/end item numbers.
59
- */
60
- export type SourceMeta = Readonly<{
61
- /** Structured error from the most recent failed fetch. `null` when healthy. */
62
- error: SourcererError | null;
63
- isLoading: boolean;
64
- isSearchPending: boolean;
65
- pageCount: number;
66
- pageNumber: number;
43
+ export type Source<T, TQuery, TPagination extends AnyPagination = AnyPagination> = Disposable & {
44
+ readonly snapshot: SourceSnapshot<T, TQuery, TPagination>;
45
+ subscribe(listener: (snapshot: SourceSnapshot<T, TQuery, TPagination>) => void): () => void;
46
+ };
47
+ export type PageQuery<TFilter = unknown, TSort = unknown> = Readonly<{
48
+ filter?: TFilter;
49
+ page: number;
67
50
  pageSize: number;
68
- totalItems: number;
51
+ search: string;
52
+ sort?: TSort;
69
53
  }>;
70
- /**
71
- * A serializable point-in-time snapshot of a remote source's loaded state.
72
- * Safe to embed in HTML or pass over the network.
73
- */
74
- export type SourceSnapshot<T> = Readonly<{
75
- items: readonly T[];
54
+ export type PageQueryPatch<TFilter = unknown, TSort = unknown> = Readonly<{
55
+ filter?: TFilter | undefined;
76
56
  page?: number;
57
+ pageSize?: number;
77
58
  search?: string;
59
+ sort?: TSort | undefined;
60
+ }>;
61
+ export type PageResult<T> = Readonly<{
62
+ data: readonly T[];
78
63
  total: number;
79
64
  }>;
80
- /**
81
- * Discriminated union describing the current state of any reactive source.
82
- * Use `sourceState(source)` to derive this without manual branching on meta fields.
83
- *
84
- * @example
85
- * ```ts
86
- * const state = sourceState(source);
87
- * if (state.status === 'loading') return <Spinner />;
88
- * if (state.status === 'error') return <Error message={state.error.message} />;
89
- * return <List items={state.items} />;
90
- * ```
91
- */
92
- export type SourceState<T> = {
93
- readonly error: SourcererError;
94
- readonly status: 'error';
95
- } | {
96
- readonly items: readonly T[];
97
- readonly status: 'success';
98
- } | {
99
- readonly status: 'loading';
100
- };
101
- /**
102
- * Minimal observable interface shared by all source and derived source types.
103
- * Framework adapters should target this interface for maximum portability.
104
- */
105
- export type ReactiveSource<T, TMeta = SourceMeta> = {
106
- [Symbol.dispose](): void;
107
- readonly current: readonly T[];
108
- readonly disposalSignal: AbortSignal;
109
- dispose(): void;
110
- readonly disposed: boolean;
111
- readonly meta: TMeta;
112
- subscribe(listener: () => void): () => void;
113
- };
114
- /**
115
- * Read-only reactive projection derived from a parent source.
116
- * Returned by `deriveSource()`.
117
- */
118
- export type DerivedSource<T, TMeta = SourceMeta> = ReactiveSource<T, TMeta>;
119
- /**
120
- * Read-only reactive view combining multiple sources.
121
- * Returned by `mergeSource()` when sources have incompatible meta shapes.
122
- */
123
- export type MergedSource<T> = {
124
- [Symbol.dispose](): void;
125
- readonly current: readonly T[];
126
- readonly disposalSignal: AbortSignal;
127
- dispose(): void;
128
- readonly disposed: boolean;
129
- subscribe(listener: () => void): () => void;
65
+ export type PageLoadContext<TQuery> = Readonly<{
66
+ query: TQuery;
67
+ signal: AbortSignal;
68
+ }>;
69
+ export type PageSource<T, TFilter = unknown, TSort = unknown> = Source<T, PageQuery<TFilter, TSort>, PagePagination> & {
70
+ readonly page: Readonly<{
71
+ go(index: number): Promise<void>;
72
+ last(): Promise<void>;
73
+ next(): Promise<void>;
74
+ previous(): Promise<void>;
75
+ }>;
76
+ reload(): Promise<void>;
77
+ setQuery(changes: PageQueryPatch<TFilter, TSort>): Promise<void>;
130
78
  };
131
- /** Options for the `search()` method on all source types. */
132
- export type SearchOptions = Readonly<{
133
- /** When `true`, cancels any pending debounce and fetches immediately. Default: `false`. */
134
- immediate?: boolean;
79
+ export type PageSourceConfig<T, TFilter = unknown, TSort = unknown> = Readonly<{
80
+ autoStart?: boolean;
81
+ initialQuery?: PageQueryPatch<TFilter, TSort>;
82
+ load(context: PageLoadContext<PageQuery<TFilter, TSort>>): Promise<PageResult<T>>;
135
83
  }>;
136
- /** Shared navigation interface for all page-based source types (local and remote). */
137
- export type PageNavigator<T> = ReactiveSource<T, SourceMeta> & {
138
- goTo(page: number): Promise<void>;
139
- goToLast(): Promise<void>;
140
- next(): Promise<void>;
141
- /**
142
- * Applies one or more query changes atomically — a single fetch for any combination
143
- * of limit, page, and search updates.
144
- *
145
- * @example
146
- * ```ts
147
- * // Change limit and search in one fetch
148
- * await source.patch({ limit: 20, search: 'hello' });
149
- * ```
150
- */
151
- patch(changes: Partial<SourceQuery>): Promise<void>;
152
- prev(): Promise<void>;
153
- /**
154
- * The current query state — limit, page, and optional search string.
155
- * Use `encodeQuery(source.query)` to serialize to URL params.
156
- */
157
- readonly query: SourceQuery;
158
- /**
159
- * Resolves when the source is idle (no pending async computation).
160
- * Rejects with `SourceTimeoutError` after `timeout` ms if still busy.
161
- */
162
- ready(timeout?: number): Promise<void>;
163
- reset(): Promise<void>;
164
- /**
165
- * Updates the search query. Debounced by default.
166
- * Always returns a `Promise<void>` that resolves when the triggered fetch completes.
167
- * Pass `{ immediate: true }` to skip the debounce window.
168
- */
169
- search(query: string, opts?: SearchOptions): Promise<void>;
170
- };
171
- /** Full set of fields patchable in one atomic recompute on a local source. */
172
- export type LocalSourceQuery<T> = Partial<{
173
- filter: Predicate<T> | undefined;
174
- limit: number;
84
+ export type LocalQuery = Readonly<{
175
85
  page: number;
86
+ pageSize: number;
176
87
  search: string;
177
- sort: Sorter<T> | undefined;
178
88
  }>;
179
- /**
180
- * Full interface for in-memory page-based sources.
181
- * Synchronous when no async ops are configured; supports async filter/sort
182
- * pipelines (e.g. Web Worker offloading) when `filterAsync`/`sortAsync` are set.
183
- */
184
- export type LocalSource<T> = Omit<PageNavigator<T>, 'patch'> & {
185
- /**
186
- * Applies one or more query changes atomically — a single recompute for any combination
187
- * of limit, page, search, filter, and sort updates.
188
- *
189
- * @example
190
- * ```ts
191
- * // Change filter and search in one recompute
192
- * await source.patch({ filter: (u) => u.active, search: 'ada', limit: 5 });
193
- * ```
194
- */
195
- patch(changes: LocalSourceQuery<T>): Promise<void>;
196
- setData(data: readonly T[]): Promise<void>;
197
- };
198
- /**
199
- * Full interface for remote page-based sources.
200
- * `optimisticUpdate(mutator)` throws if a concurrent update is already pending.
201
- */
202
- export type RemoteSource<T, TFilter = unknown, TSort = unknown> = Omit<PageNavigator<T>, 'patch' | 'query'> & {
203
- /**
204
- * Applies an optimistic update immediately before a fetch settles.
205
- * Returns a rollback function. The optimistic state is automatically cleared
206
- * on the next successful fetch, or rolled back on failure.
207
- *
208
- * @throws {Error} If an optimistic update is already active.
209
- */
210
- optimisticUpdate(mutator: (current: readonly T[]) => readonly T[], options?: {
211
- total?: number;
212
- }): () => void;
213
- /**
214
- * Applies one or more query changes atomically — a single fetch for any combination
215
- * of limit, page, search, filter, and sort updates.
216
- */
217
- patch(changes: Partial<RemoteSourceQuery<TFilter, TSort>>): Promise<void>;
218
- /**
219
- * The current query state. Use `encodeQuery(source.query)` to serialize to URL params.
220
- */
221
- readonly query: RemoteSourceQuery<TFilter, TSort>;
222
- ready(timeout?: number): Promise<void>;
223
- refresh(): Promise<void>;
89
+ export type LocalQueryPatch = Readonly<{
90
+ page?: number;
91
+ pageSize?: number;
92
+ search?: string;
93
+ }>;
94
+ export type LocalSource<T> = Source<T, LocalQuery, PagePagination> & {
95
+ readonly page: Readonly<{
96
+ go(index: number): boolean;
97
+ last(): boolean;
98
+ next(): boolean;
99
+ previous(): boolean;
100
+ }>;
101
+ setData(data: readonly T[]): boolean;
102
+ setQuery(changes: LocalQueryPatch): boolean;
224
103
  };
225
104
  export type LocalSourceConfig<T> = Readonly<{
226
- debounceMs?: number;
227
- filter?: Predicate<T>;
228
- /**
229
- * Async filter applied after the sync `filter`, enabling Web Worker offloading
230
- * via `@vielzeug/familiar`. Sets `meta.isLoading` to `true` during computation.
231
- * The signal is aborted when a new computation supersedes this one.
232
- */
233
- filterAsync?: (items: readonly T[], signal: AbortSignal) => Promise<readonly T[]>;
234
- /** Initial data to populate the source. When provided, pass `[]` as the first arg. */
235
- initialData?: readonly T[];
236
- limit?: number;
237
- /**
238
- * Custom search function. Default: case-insensitive JSON substring match.
239
- * Provide a domain-specific function for better relevance on large datasets.
240
- */
241
- searchFn?: (items: readonly T[], query: string) => readonly T[];
242
- sort?: Sorter<T>;
243
- /**
244
- * Async sort applied after the sync `sort`. Sets `meta.isLoading` to `true`
245
- * during computation, enabling Web Worker offloading.
246
- */
247
- sortAsync?: (items: readonly T[], signal: AbortSignal) => Promise<readonly T[]>;
248
- }>;
249
- export type RemoteConfig<T, TFilter = unknown, TSort = unknown> = Readonly<{
250
- /** Automatically fetch on construction. Default: `true`. */
251
- autoFetch?: boolean;
252
- /** Debounce delay in ms for `search()` calls. Default: `300`. */
253
- debounceMs?: number;
254
- fetch: (q: RemoteSourceQuery<TFilter, TSort>, signal: AbortSignal) => Promise<Readonly<{
255
- items: readonly T[];
256
- total: number;
257
- }>>;
258
- filter?: TFilter;
259
- limit?: number;
260
- /**
261
- * Called after each fetch attempt settles (success or failure).
262
- * Useful for logging, telemetry, and debugging.
263
- */
264
- onFetch?: (event: FetchEvent<RemoteSourceQuery<TFilter, TSort>>) => void;
265
- queryKey?: (q: RemoteSourceQuery<TFilter, TSort>) => string;
266
- /**
267
- * Automatically re-fetch at this interval in ms. The timer is cancelled on `dispose()`.
268
- * Useful for live dashboards and real-time data displays.
269
- */
270
- refreshInterval?: number;
271
- retry?: RetryConfig;
272
- /**
273
- * Pre-populate the source with server-fetched data (SSR / prefetch).
274
- * The source starts in a loaded state — no initial loading flash.
275
- * Set `autoFetch: false` to suppress the background re-fetch when the snapshot is fresh.
276
- */
277
- snapshot?: SourceSnapshot<T>;
278
- sort?: TSort;
279
- /**
280
- * Skip re-fetching if the last successful fetch was within this many ms.
281
- * Returns cached data immediately. Combine with `refreshInterval` for
282
- * stale-while-revalidate behaviour.
283
- * Default: `0` (always re-fetch).
284
- */
285
- staleTime?: number;
105
+ initialQuery?: LocalQueryPatch;
106
+ match?: (item: T, search: string) => boolean;
286
107
  }>;
287
- export type CursorMeta = Readonly<{
288
- error: SourcererError | null;
289
- hasNextPage: boolean;
290
- hasPrevPage: boolean;
291
- isLoading: boolean;
292
- isSearchPending: boolean;
108
+ export type CursorQuery<TCursor = string> = Readonly<{
109
+ after?: TCursor;
110
+ before?: TCursor;
293
111
  pageSize: number;
294
- totalItems: number;
112
+ search: string;
295
113
  }>;
296
- export type CursorSource<T, TCursor = string> = ReactiveSource<T, CursorMeta> & {
297
- next(): Promise<void>;
298
- /**
299
- * Applies one or more query changes atomically — a single fetch for any combination
300
- * of limit and search updates.
301
- */
302
- patch(changes: Partial<Pick<CursorSourceQuery<TCursor>, 'limit' | 'search'>>): Promise<void>;
303
- prev(): Promise<void>;
304
- /** The current query state. Use `encodeQuery(source.query)` to serialize to URL params. */
305
- readonly query: CursorSourceQuery<TCursor>;
306
- ready(timeout?: number): Promise<void>;
307
- refresh(): Promise<void>;
308
- reset(): Promise<void>;
309
- search(query: string, opts?: SearchOptions): Promise<void>;
114
+ export type CursorQueryPatch<TCursor = string> = Readonly<{
115
+ after?: TCursor | undefined;
116
+ before?: TCursor | undefined;
117
+ pageSize?: number;
118
+ search?: string;
119
+ }>;
120
+ export type CursorResult<T, TCursor = string> = Readonly<{
121
+ data: readonly T[];
122
+ nextCursor?: TCursor;
123
+ previousCursor?: TCursor;
124
+ total?: number;
125
+ }>;
126
+ export type CursorSource<T, TCursor = string> = Source<T, CursorQuery<TCursor>, CursorPagination<TCursor>> & {
127
+ readonly page: Readonly<{
128
+ next(): Promise<void>;
129
+ previous(): Promise<void>;
130
+ }>;
131
+ reload(): Promise<void>;
132
+ setQuery(changes: CursorQueryPatch<TCursor>): Promise<void>;
310
133
  };
311
- export type CursorConfig<T, TCursor = string> = Readonly<{
312
- autoFetch?: boolean;
313
- debounceMs?: number;
314
- fetch: (q: CursorSourceQuery<TCursor>, signal: AbortSignal) => Promise<Readonly<{
315
- items: readonly T[];
316
- nextCursor?: TCursor;
317
- prevCursor?: TCursor;
318
- total?: number;
319
- }>>;
320
- limit?: number;
321
- /** Called after each fetch attempt settles. Useful for logging and telemetry. */
322
- onFetch?: (event: FetchEvent<CursorSourceQuery<TCursor>>) => void;
323
- queryKey?: (q: CursorSourceQuery<TCursor>) => string;
324
- /** Automatically re-fetch at this interval in ms. Cancelled on `dispose()`. */
325
- refreshInterval?: number;
326
- retry?: RetryConfig;
134
+ export type CursorSourceConfig<T, TCursor = string> = Readonly<{
135
+ autoStart?: boolean;
136
+ initialQuery?: CursorQueryPatch<TCursor>;
137
+ load(context: PageLoadContext<CursorQuery<TCursor>>): Promise<CursorResult<T, TCursor>>;
327
138
  }>;
328
- export type InfiniteMeta = Readonly<{
329
- error: SourcererError | null;
330
- hasMore: boolean;
331
- isLoading: boolean;
332
- /** `true` only during `loadMore()` fetches — distinct from the initial load. */
333
- isLoadingMore: boolean;
334
- isSearchPending: boolean;
335
- /** Number of pages appended so far. Resets to 0 on `reset()` or `search()`. */
336
- loadedPages: number;
139
+ export type InfiniteQuery = Readonly<{
337
140
  pageSize: number;
338
- totalItems: number;
141
+ search: string;
142
+ }>;
143
+ export type InfiniteQueryPatch = Readonly<{
144
+ pageSize?: number;
145
+ search?: string;
339
146
  }>;
340
- export type InfiniteSource<T> = ReactiveSource<T, InfiniteMeta> & {
341
- /** Appends the next page of results to `current`. No-op when `meta.hasMore` is false. */
147
+ export type InfiniteSource<T> = Source<T, InfiniteQuery, InfinitePagination> & {
342
148
  loadMore(): Promise<void>;
343
- /**
344
- * Applies one or more query changes atomically — a single fetch for any combination
345
- * of limit and search updates. Resets accumulated pages.
346
- */
347
- patch(changes: Partial<Pick<InfiniteSourceQuery, 'limit' | 'search'>>): Promise<void>;
348
- /** The current query state. Use `encodeQuery(source.query)` to serialize to URL params. */
349
- readonly query: InfiniteSourceQuery;
350
- /**
351
- * Resolves when no fetch is in progress (including `loadMore` fetches).
352
- * Rejects after `timeout` ms if still loading.
353
- */
354
- ready(timeout?: number): Promise<void>;
355
- reset(): Promise<void>;
356
- search(query: string, opts?: SearchOptions): Promise<void>;
149
+ reload(): Promise<void>;
150
+ setQuery(changes: InfiniteQueryPatch): Promise<void>;
357
151
  };
358
- export type InfiniteConfig<T> = Readonly<{
359
- autoFetch?: boolean;
360
- debounceMs?: number;
361
- fetch: (q: InfiniteSourceQuery, signal: AbortSignal) => Promise<Readonly<{
362
- items: readonly T[];
363
- total: number;
364
- }>>;
365
- limit?: number;
366
- /** Called after each fetch attempt settles. Useful for logging and telemetry. */
367
- onFetch?: (event: FetchEvent<InfiniteSourceQuery>) => void;
368
- /** Custom cache key function. Used to deduplicate in-flight requests. Default: stable JSON stringify. */
369
- queryKey?: (q: InfiniteSourceQuery) => string;
370
- /** Automatically re-fetch (reset to page 1) at this interval in ms. Cancelled on `dispose()`. */
371
- refreshInterval?: number;
372
- retry?: RetryConfig;
152
+ export type InfiniteSourceConfig<T> = Readonly<{
153
+ autoStart?: boolean;
154
+ initialQuery?: InfiniteQueryPatch;
155
+ load(context: PageLoadContext<PageQuery>): Promise<PageResult<T>>;
373
156
  }>;
374
157
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC;AACtF,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG;IACvB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,MAAM,MAAM,gBAAgB,CAAC,OAAO,GAAG,MAAM,IAAI,QAAQ,CAAC;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,kBAAkB,GAAG,cAAc,CAAC;AAE5F,0FAA0F;AAC1F,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,SAAS,aAAa,GAAG,aAAa,IAAI,QAAQ,CAAC;IAClG,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,WAAW,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,SAAS,aAAa,GAAG,aAAa,IAAI,UAAU,GAAG;IAC9F,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC1D,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7F,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,IAAI,QAAQ,CAAC;IACnE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC;CACd,CAAC,CAAC;AAEH,MAAM,MAAM,cAAc,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,IAAI,QAAQ,CAAC;IACxE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;CAC1B,CAAC,CAAC;AAEH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,QAAQ,CAAC;IACnC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,CAAC,MAAM,IAAI,QAAQ,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,IAAI,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,GAAG;IACrH,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QACtB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;KAC3B,CAAC,CAAC;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,IAAI,QAAQ,CAAC;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;CACnF,CAAC,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG;IACnE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QACtB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAC3B,IAAI,IAAI,OAAO,CAAC;QAChB,IAAI,IAAI,OAAO,CAAC;QAChB,QAAQ,IAAI,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC1C,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CAC9C,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,CAAC,OAAO,GAAG,MAAM,IAAI,QAAQ,CAAC;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,gBAAgB,CAAC,OAAO,GAAG,MAAM,IAAI,QAAQ,CAAC;IACxD,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC;AAEH,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,IAAI,QAAQ,CAAC;IACvD,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG;IAC3G,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;KAC3B,CAAC,CAAC;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,IAAI,QAAQ,CAAC;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;CACzF,CAAC,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC;AAEH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,aAAa,EAAE,kBAAkB,CAAC,GAAG;IAC7E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC7C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;CACnE,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vielzeug/sourcerer",
3
- "version": "1.0.6",
4
- "description": "Typed data-source adapter pagination, filtering, sorting, search, and cursor-based infinite scroll",
3
+ "version": "2.0.0",
4
+ "description": "Framework-agnostic reactive collection sources with local, page, cursor, and infinite pagination",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist"
@@ -15,6 +15,12 @@
15
15
  "types": "./dist/index.d.ts",
16
16
  "import": "./dist/index.js",
17
17
  "require": "./dist/index.cjs"
18
+ },
19
+ "./devtools": {
20
+ "source": "./src/devtools.ts",
21
+ "types": "./dist/devtools.d.ts",
22
+ "import": "./dist/devtools.js",
23
+ "require": "./dist/devtools.cjs"
18
24
  }
19
25
  },
20
26
  "scripts": {
@@ -34,13 +40,10 @@
34
40
  "engines": {
35
41
  "node": ">=22"
36
42
  },
37
- "dependencies": {
38
- "@vielzeug/arsenal": "1.1.2"
39
- },
40
43
  "devDependencies": {
41
- "@types/node": "^26.1.0",
44
+ "@types/node": "^26.1.2",
42
45
  "typescript": "^6.0.3",
43
- "vite": "^8.1.3",
46
+ "vite": "^8.2.0",
44
47
  "vitest": "^4.1.10"
45
48
  }
46
49
  }
package/dist/_utils.cjs DELETED
@@ -1,2 +0,0 @@
1
- let e=require("@vielzeug/arsenal");var t=e.hash,n=e=>e instanceof Error?e.message:typeof e==`string`&&e.length>0?e:`Request failed`,r=t=>(0,e.backoff)(t);exports.defaultKeyOf=t,exports.defaultRetryDelay=r,exports.extractError=n;
2
- //# sourceMappingURL=_utils.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_utils.cjs","names":[],"sources":["../src/_utils.ts"],"sourcesContent":["import { backoff, hash, retry } from '@vielzeug/arsenal';\n\nexport { retry };\n\n// Internal stable-key helper — used by source factories, not exposed as public API.\nexport const defaultKeyOf = hash;\n\n/** Extracts a user-facing error message from a caught exception. */\nexport const extractError = (reason: unknown): string => {\n if (reason instanceof Error) return reason.message;\n\n if (typeof reason === 'string' && reason.length > 0) return reason;\n\n return 'Request failed';\n};\n\n/** Default exponential backoff: 1 s, 2 s, 4 s, … capped at 30 s. Receives a 0-indexed failure count. */\nexport const defaultRetryDelay = (attempt: number): number => backoff(attempt);\n"],"mappings":"mCAKA,IAAa,EAAe,EAAA,KAGf,EAAgB,GACvB,aAAkB,MAAc,EAAO,QAEvC,OAAO,GAAW,UAAY,EAAO,OAAS,EAAU,EAErD,iBAII,EAAqB,IAAA,EAAA,EAAA,QAAA,CAAoC,CAAO"}
package/dist/_utils.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import { hash, retry } from '@vielzeug/arsenal';
2
- export { retry };
3
- export declare const defaultKeyOf: typeof hash;
4
- /** Extracts a user-facing error message from a caught exception. */
5
- export declare const extractError: (reason: unknown) => string;
6
- /** Default exponential backoff: 1 s, 2 s, 4 s, … capped at 30 s. Receives a 0-indexed failure count. */
7
- export declare const defaultRetryDelay: (attempt: number) => number;
8
- //# sourceMappingURL=_utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_utils.d.ts","sourceRoot":"","sources":["../src/_utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,KAAK,EAAE,CAAC;AAGjB,eAAO,MAAM,YAAY,aAAO,CAAC;AAEjC,oEAAoE;AACpE,eAAO,MAAM,YAAY,GAAI,QAAQ,OAAO,KAAG,MAM9C,CAAC;AAEF,wGAAwG;AACxG,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,KAAG,MAA0B,CAAC"}
package/dist/_utils.js DELETED
@@ -1,7 +0,0 @@
1
- import { backoff as e, hash as t, retry as n } from "@vielzeug/arsenal";
2
- //#region src/_utils.ts
3
- var r = t, i = (e) => e instanceof Error ? e.message : typeof e == "string" && e.length > 0 ? e : "Request failed", a = (t) => e(t);
4
- //#endregion
5
- export { r as defaultKeyOf, a as defaultRetryDelay, i as extractError, n as retry };
6
-
7
- //# sourceMappingURL=_utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_utils.js","names":[],"sources":["../src/_utils.ts"],"sourcesContent":["import { backoff, hash, retry } from '@vielzeug/arsenal';\n\nexport { retry };\n\n// Internal stable-key helper — used by source factories, not exposed as public API.\nexport const defaultKeyOf = hash;\n\n/** Extracts a user-facing error message from a caught exception. */\nexport const extractError = (reason: unknown): string => {\n if (reason instanceof Error) return reason.message;\n\n if (typeof reason === 'string' && reason.length > 0) return reason;\n\n return 'Request failed';\n};\n\n/** Default exponential backoff: 1 s, 2 s, 4 s, … capped at 30 s. Receives a 0-indexed failure count. */\nexport const defaultRetryDelay = (attempt: number): number => backoff(attempt);\n"],"mappings":";;AAKA,IAAa,IAAe,GAGf,KAAgB,MACvB,aAAkB,QAAc,EAAO,UAEvC,OAAO,KAAW,YAAY,EAAO,SAAS,IAAU,IAErD,kBAII,KAAqB,MAA4B,EAAQ,CAAO"}