@reforgium/statum 2.0.0 → 2.1.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.
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.0.0",
2
+ "version": "2.1.0",
3
3
  "name": "@reforgium/statum",
4
4
  "description": "reforgium State modules",
5
5
  "author": "rtommievich",
@@ -118,6 +118,12 @@ type SerializedType = Record<string, SerializedTypeType>;
118
118
  */
119
119
  type DataType = AnyDict;
120
120
 
121
+ declare class SerializerFieldError extends Error {
122
+ readonly field: string;
123
+ readonly stage: 'parse' | 'format';
124
+ readonly originalError: unknown;
125
+ constructor(field: string, stage: 'parse' | 'format', originalError: unknown);
126
+ }
121
127
  /**
122
128
  * Universal serializer/deserializer for values used in forms, filters, and DTOs.
123
129
  *
@@ -156,7 +162,7 @@ declare class Serializer<EntityType extends DataType> {
156
162
  *
157
163
  * @param config partial transformation configuration
158
164
  */
159
- constructor(config: Partial<SerializerConfig>);
165
+ constructor(config?: Partial<SerializerConfig>);
160
166
  /**
161
167
  * Converts a domain object into a flat serialized representation
162
168
  * (ready to send to an API or build a query string).
@@ -187,6 +193,10 @@ declare class Serializer<EntityType extends DataType> {
187
193
  * @returns a domain object of the specified type
188
194
  */
189
195
  deserialize: (val: string | AnyDict) => EntityType;
196
+ /** Parse only query-string input. */
197
+ deserializeQuery: (query: string) => EntityType;
198
+ /** Parse only JSON object input. */
199
+ deserializeJson: (json: string) => EntityType;
190
200
  /**
191
201
  * Build a query string from a domain object using `serialize` rules
192
202
  * and the array joining strategy (`concatType`).
@@ -206,9 +216,19 @@ declare class Serializer<EntityType extends DataType> {
206
216
  private serializeElement;
207
217
  private deserializeElement;
208
218
  private parseQuery;
219
+ private parseJsonObject;
220
+ private parseInputString;
221
+ private mergeConfig;
209
222
  }
210
223
 
224
+ declare const createQuerySerializer: <EntityType extends DataType = DataType>(config?: Partial<SerializerConfig>) => Serializer<EntityType>;
225
+ declare const createBodySerializer: <EntityType extends DataType = DataType>(config?: Partial<SerializerConfig>) => Serializer<EntityType>;
226
+ declare const createStrictSerializer: <EntityType extends DataType = DataType>(config?: Partial<SerializerConfig>) => Serializer<EntityType>;
227
+
211
228
  type StorageStrategy = 'memory' | 'lru' | 'session' | 'persist';
229
+ type StorageStrategyOptions = {
230
+ lruLimit?: number;
231
+ };
212
232
 
213
233
  type StorageInterface<Key, Type> = {
214
234
  prefix?: string;
@@ -220,9 +240,11 @@ type StorageInterface<Key, Type> = {
220
240
  };
221
241
 
222
242
  declare class LruCache<KeyT, ValueT> implements StorageInterface<KeyT, ValueT> {
223
- limit: number;
224
243
  private map;
225
244
  constructor(limit?: number);
245
+ private _limit;
246
+ get limit(): number;
247
+ set limit(value: number);
226
248
  get length(): number;
227
249
  get(key: KeyT): NonNullable<ValueT> | null;
228
250
  set(key: KeyT, value: ValueT): void;
@@ -231,6 +253,7 @@ declare class LruCache<KeyT, ValueT> implements StorageInterface<KeyT, ValueT> {
231
253
  has(key: KeyT): boolean;
232
254
  keys(): KeyT[];
233
255
  values(): ValueT[];
256
+ entries(): [KeyT, ValueT][];
234
257
  toArray(): ValueT[];
235
258
  fromArray(entries: [KeyT, ValueT][]): void;
236
259
  }
@@ -250,7 +273,7 @@ declare class LruCache<KeyT, ValueT> implements StorageInterface<KeyT, ValueT> {
250
273
  * @param strategy storage strategy type (`memory`, `session`, `persist`, `lru`)
251
274
  * @returns instance implementing `StorageInterface<Key, Type>`
252
275
  */
253
- declare const storageStrategy: <Key = string, Type extends AnyType = AnyDict>(strategy: StorageStrategy) => StorageInterface<Key, Type>;
276
+ declare const storageStrategy: <Key = string, Type extends AnyType = AnyDict>(strategy: StorageStrategy, options?: StorageStrategyOptions) => StorageInterface<Key, Type>;
254
277
 
255
278
  /**
256
279
  * Object for request body (payload).
@@ -277,6 +300,13 @@ type ResourceStatus = 'idle' | 'loading' | 'success' | 'error' | 'stale';
277
300
  * - `throttle` — limit frequency
278
301
  */
279
302
  type DelayMode = 'debounce' | 'throttle';
303
+ type RetryBackoff = 'constant' | 'exponential';
304
+ type RetryConfig = {
305
+ attempts?: number;
306
+ delayMs?: number;
307
+ backoff?: RetryBackoff;
308
+ shouldRetry?: (error: unknown, attempt: number) => boolean;
309
+ };
280
310
  /**
281
311
  * Cache strategy for GET:
282
312
  * - `network-first` — network preferred, cache as fallback
@@ -306,6 +336,12 @@ type ResourceStoreOptions = {
306
336
  delayMode?: DelayMode;
307
337
  /** Cache freshness window (ms) for `cache-*` strategies. */
308
338
  ttlMs?: number;
339
+ /** Maximum number of internal cache entries kept in memory. */
340
+ maxEntries?: number;
341
+ /** Retry policy for network requests. */
342
+ retry?: RetryConfig;
343
+ /** Trace hook for request/cache lifecycle events. */
344
+ onTrace?: (event: ResourceTraceEvent) => void;
309
345
  };
310
346
  /**
311
347
  * API call arguments.
@@ -348,6 +384,8 @@ type CallConfig<Response, Type> = {
348
384
  * Allows converting server `Response` to the domain type `Type`.
349
385
  */
350
386
  parseResponse?: ParseFn<Response, Type>;
387
+ /** Per-call retry policy override. */
388
+ retry?: RetryConfig;
351
389
  };
352
390
  /**
353
391
  * Function that parses server response into the domain model.
@@ -361,6 +399,18 @@ type GetCallConfig<Response, Type> = CallConfig<Response, Type> & {
361
399
  revalidate?: boolean;
362
400
  ttlMs?: number;
363
401
  };
402
+ type ResourceTraceEvent = {
403
+ type: 'cache-hit' | 'cache-miss' | 'cache-fallback' | 'cache-write';
404
+ method: RestMethods;
405
+ key: string;
406
+ strategy?: CacheStrategy;
407
+ } | {
408
+ type: 'request-start' | 'request-success' | 'request-error' | 'request-retry' | 'abort';
409
+ method: RestMethods;
410
+ key: string;
411
+ attempt?: number;
412
+ error?: unknown;
413
+ };
364
414
 
365
415
  /**
366
416
  * Store for REST resources with caching and request deduplication.
@@ -406,6 +456,7 @@ declare class ResourceStore<Data> {
406
456
  loading: Signal<boolean>;
407
457
  private readonly routes;
408
458
  private readonly opts;
459
+ private readonly maxEntries;
409
460
  private readonly entries;
410
461
  private readonly scheduler;
411
462
  /**
@@ -471,9 +522,14 @@ declare class ResourceStore<Data> {
471
522
  */
472
523
  abortAll(reason?: string | Error): void;
473
524
  private ensureEntry;
525
+ private evictEntriesIfNeeded;
474
526
  private callApi;
475
527
  private buildUrl;
476
528
  private prepareQuery;
529
+ private trace;
530
+ private resolveRetryConfig;
531
+ private defaultShouldRetry;
532
+ private runWithRetry;
477
533
  private exec$;
478
534
  private promoteCurrent;
479
535
  }
@@ -655,7 +711,7 @@ declare class PaginatedDataStore<ItemsType extends object, FilterType = unknown>
655
711
  *
656
712
  * @param params Dictionary of route parameters (e.g., `{ id: '123' }`)
657
713
  * @param opts Options object
658
- * @param opts.reset If `true` (default), resets page to 0, clears cache, total elements count, and items
714
+ * @param opts.reset If `true`, resets page to 0, clears cache, total elements count, and items
659
715
  * @param opts.abort If `true`, aborts all active transport requests and sets loading to false
660
716
  *
661
717
  * @example
@@ -840,12 +896,12 @@ declare class DictStore<Type extends AnyDict> {
840
896
  * Current list of dictionary items.
841
897
  * Source — local cache (fixed=true) or data from `PaginatedDataStore`.
842
898
  */
843
- items: _angular_core.Signal<readonly Type[]>;
899
+ items: Signal<readonly Type[]>;
844
900
  /**
845
901
  * Ready-to-use dropdown options: `{ label, value }`.
846
902
  * Respects `maxOptionsSize` for truncating the list.
847
903
  */
848
- options: _angular_core.Signal<{
904
+ options: Signal<{
849
905
  label: string;
850
906
  value: Type[keyof Type & string];
851
907
  }[]>;
@@ -874,7 +930,7 @@ declare class DictStore<Type extends AnyDict> {
874
930
  * Useful for SSR/static lists/quick presets.
875
931
  *
876
932
  * @param items list of items
877
- * @param opts `{ replace?: true }` completely replace current cache
933
+ * @param opts `{ replace?: true }` - completely replace current cache
878
934
  */
879
935
  preload: (items: readonly Type[], opts?: {
880
936
  replace?: boolean;
@@ -969,6 +1025,31 @@ declare class DictLocalStore<Type extends AnyDict> {
969
1025
  }) => void;
970
1026
  }
971
1027
 
1028
+ type EntityId = string | number;
1029
+ type EntityStoreConfig<Entity extends AnyDict, IdKey extends keyof Entity = keyof Entity> = {
1030
+ idKey: IdKey;
1031
+ sortIds?: (a: Entity[IdKey], b: Entity[IdKey]) => number;
1032
+ };
1033
+
1034
+ declare class EntityStore<Entity extends AnyDict, IdKey extends keyof Entity = keyof Entity> {
1035
+ private readonly idKey;
1036
+ private readonly sortIds?;
1037
+ readonly byId: _angular_core.WritableSignal<Record<string, Entity>>;
1038
+ readonly ids: _angular_core.WritableSignal<Entity[IdKey][]>;
1039
+ readonly items: _angular_core.Signal<readonly Entity[]>;
1040
+ constructor(config: EntityStoreConfig<Entity, IdKey>);
1041
+ clear(): void;
1042
+ setAll(items: readonly Entity[]): void;
1043
+ upsertOne(item: Entity): void;
1044
+ upsertMany(items: readonly Entity[]): void;
1045
+ removeOne(id: Entity[IdKey]): void;
1046
+ removeMany(ids: readonly Entity[IdKey][]): void;
1047
+ patchOne(id: Entity[IdKey], patch: Partial<Entity>): void;
1048
+ getById(id: Entity[IdKey]): Entity | null;
1049
+ has(id: Entity[IdKey]): boolean;
1050
+ private isValidId;
1051
+ }
1052
+
972
1053
  type PaginatedDataProviderConfig = {
973
1054
  paginatedData?: PaginatedDataStoreProviderConfig;
974
1055
  };
@@ -981,6 +1062,6 @@ type DictProviderConfig = {
981
1062
  type StatumConfig = PaginatedDataProviderConfig & SerializerProviderConfig & DictProviderConfig;
982
1063
  declare const STATUM_CONFIG: InjectionToken<StatumConfig>;
983
1064
 
984
- export { AbortError, CacheMissError, DictLocalStore, DictStore, LruCache, PaginatedDataStore, ResourceStore, STATUM_CONFIG, Serializer, isAbort, storageStrategy };
985
- export type { DataType, DictLocalConfig, DictStoreConfig, DictStoreProviderConfig, FieldConfig, PaginatedDataStoreConfig, PaginatedDataStoreProviderConfig, ResourceRoutesMap, ResourceStatus, ResourceStoreOptions, SerializedType, SerializerConfig, StorageInterface, StorageStrategy, Types };
1065
+ export { AbortError, CacheMissError, DictLocalStore, DictStore, EntityStore, LruCache, PaginatedDataStore, ResourceStore, STATUM_CONFIG, Serializer, SerializerFieldError, createBodySerializer, createQuerySerializer, createStrictSerializer, isAbort, storageStrategy };
1066
+ export type { DataType, DictLocalConfig, DictStoreConfig, DictStoreProviderConfig, EntityId, EntityStoreConfig, FieldConfig, PaginatedDataStoreConfig, PaginatedDataStoreProviderConfig, ResourceRoutesMap, ResourceStatus, ResourceStoreOptions, ResourceTraceEvent, RetryConfig, SerializedType, SerializerConfig, StorageInterface, StorageStrategy, StorageStrategyOptions, Types };
986
1067
  //# sourceMappingURL=reforgium-statum.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reforgium-statum.d.ts","sources":["../../../../libs/statum/src/serializer/serialize.models.ts","../../../../libs/statum/src/serializer/serializer.ts","../../../../libs/statum/src/cache/storage-strategy/models.ts","../../../../libs/statum/src/cache/storages/models.ts","../../../../libs/statum/src/cache/storages/lru.storage.ts","../../../../libs/statum/src/cache/storage-strategy/storage.strategy.ts","../../../../libs/statum/src/stores/resource-store/resource.models.ts","../../../../libs/statum/src/stores/resource-store/resource.store.ts","../../../../libs/statum/src/stores/resource-store/resource.utils.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.models.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.store.ts","../../../../libs/statum/src/stores/dict-store/dict.models.ts","../../../../libs/statum/src/stores/dict-store/dict.store.ts","../../../../libs/statum/src/stores/dict-store/dict-local.store.ts","../../../../libs/statum/src/statum.provider.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reforgium-statum.d.ts","sources":["../../../../libs/statum/src/serializer/serialize.models.ts","../../../../libs/statum/src/serializer/serializer.ts","../../../../libs/statum/src/serializer/serializer.presets.ts","../../../../libs/statum/src/cache/storage-strategy/models.ts","../../../../libs/statum/src/cache/storages/models.ts","../../../../libs/statum/src/cache/storages/lru.storage.ts","../../../../libs/statum/src/cache/storage-strategy/storage.strategy.ts","../../../../libs/statum/src/stores/resource-store/resource.models.ts","../../../../libs/statum/src/stores/resource-store/resource.store.ts","../../../../libs/statum/src/stores/resource-store/resource.utils.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.models.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.store.ts","../../../../libs/statum/src/stores/dict-store/dict.models.ts","../../../../libs/statum/src/stores/dict-store/dict.store.ts","../../../../libs/statum/src/stores/dict-store/dict-local.store.ts","../../../../libs/statum/src/stores/entity-store/entity.models.ts","../../../../libs/statum/src/stores/entity-store/entity.store.ts","../../../../libs/statum/src/statum.provider.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}