@reforgium/statum 1.1.0 → 2.0.1
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 +57 -55
- package/fesm2022/reforgium-statum.mjs +173 -50
- package/fesm2022/reforgium-statum.mjs.map +1 -1
- package/package.json +1 -1
- package/types/reforgium-statum.d.ts +137 -26
- package/types/reforgium-statum.d.ts.map +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AnyType, AnyDict, RestMethods, PageableRequest, Query, PageableResponse } from '@reforgium/internal';
|
|
2
2
|
import * as _angular_core from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { Signal, WritableSignal, InjectionToken } from '@angular/core';
|
|
4
|
+
import * as _reforgium_statum from '@reforgium/statum';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* List of supported primitive and composite data types
|
|
@@ -207,11 +208,10 @@ declare class Serializer<EntityType extends DataType> {
|
|
|
207
208
|
private parseQuery;
|
|
208
209
|
}
|
|
209
210
|
|
|
210
|
-
declare const SERIALIZER_CONFIG: InjectionToken<Partial<SerializerConfig>>;
|
|
211
|
-
|
|
212
211
|
type StorageStrategy = 'memory' | 'lru' | 'session' | 'persist';
|
|
213
212
|
|
|
214
213
|
type StorageInterface<Key, Type> = {
|
|
214
|
+
prefix?: string;
|
|
215
215
|
get(key: Key): Type | null;
|
|
216
216
|
set(key: Key, value: Type): void;
|
|
217
217
|
remove(key: Key): void;
|
|
@@ -231,6 +231,7 @@ declare class LruCache<KeyT, ValueT> implements StorageInterface<KeyT, ValueT> {
|
|
|
231
231
|
has(key: KeyT): boolean;
|
|
232
232
|
keys(): KeyT[];
|
|
233
233
|
values(): ValueT[];
|
|
234
|
+
entries(): [KeyT, ValueT][];
|
|
234
235
|
toArray(): ValueT[];
|
|
235
236
|
fromArray(entries: [KeyT, ValueT][]): void;
|
|
236
237
|
}
|
|
@@ -520,7 +521,7 @@ declare function isAbort(e: unknown): e is AbortError;
|
|
|
520
521
|
* Controls request method, page cache, debounce delay, and
|
|
521
522
|
* request/response transformations.
|
|
522
523
|
*/
|
|
523
|
-
type
|
|
524
|
+
type PaginatedDataStoreConfig<ItemsType extends object, FilterType = unknown> = {
|
|
524
525
|
/** Transport HTTP method: `GET`/`POST`/`PATCH`/`PUT`/`DELETE`. Defaults to global config or `POST`. */
|
|
525
526
|
method?: RestMethods;
|
|
526
527
|
/** Enable LRU cache for pages. */
|
|
@@ -552,20 +553,18 @@ type PaginatedDataConfig<ItemsType extends object, FilterType = unknown> = {
|
|
|
552
553
|
* Global defaults for `PaginatedDataStore`.
|
|
553
554
|
* Can be provided via DI to avoid duplicating config in each store.
|
|
554
555
|
*/
|
|
555
|
-
|
|
556
|
+
type PaginatedDataStoreProviderConfig = {
|
|
556
557
|
/** Default method for all stores (if not overridden locally). */
|
|
557
558
|
defaultMethod?: RestMethods;
|
|
558
559
|
/** Default base `page/pageSize/sort`. */
|
|
559
|
-
defaultQuery?:
|
|
560
|
+
defaultQuery?: PaginatedDataStoreConfig<object>['presetQuery'];
|
|
560
561
|
/** Global `parseRequest` — maps pagination/sort into a query object. */
|
|
561
|
-
defaultParseRequest?:
|
|
562
|
+
defaultParseRequest?: PaginatedDataStoreConfig<object>['parseRequest'];
|
|
562
563
|
/** Whether to enable page cache by default. */
|
|
563
564
|
defaultHasCache?: boolean;
|
|
564
565
|
/** Default LRU page cache size. */
|
|
565
566
|
defaultCacheSize?: number;
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
declare const PDS_CONFIG: InjectionToken<PaginatedDataStoreConfig>;
|
|
567
|
+
};
|
|
569
568
|
|
|
570
569
|
type PaginationType = {
|
|
571
570
|
page?: number;
|
|
@@ -593,7 +592,7 @@ type PaginationType = {
|
|
|
593
592
|
declare class PaginatedDataStore<ItemsType extends object, FilterType = unknown> {
|
|
594
593
|
#private;
|
|
595
594
|
private route;
|
|
596
|
-
config:
|
|
595
|
+
config: PaginatedDataStoreConfig<ItemsType, FilterType>;
|
|
597
596
|
private readonly defaultConfig;
|
|
598
597
|
/** Current page data (reactive). */
|
|
599
598
|
items: WritableSignal<ItemsType[]>;
|
|
@@ -616,7 +615,7 @@ declare class PaginatedDataStore<ItemsType extends object, FilterType = unknown>
|
|
|
616
615
|
* @param route Resource URL pattern (e.g., `'/users'`)
|
|
617
616
|
* @param config Store behavior: method, cache, request/response parsers, debounce, presets, etc.
|
|
618
617
|
*/
|
|
619
|
-
constructor(route: string, config?:
|
|
618
|
+
constructor(route: string, config?: PaginatedDataStoreConfig<ItemsType, FilterType>);
|
|
620
619
|
/** Force reload current data (with the same page/filters/sort). */
|
|
621
620
|
refresh(): Promise<ItemsType[] | undefined>;
|
|
622
621
|
/**
|
|
@@ -657,7 +656,7 @@ declare class PaginatedDataStore<ItemsType extends object, FilterType = unknown>
|
|
|
657
656
|
*
|
|
658
657
|
* @param params Dictionary of route parameters (e.g., `{ id: '123' }`)
|
|
659
658
|
* @param opts Options object
|
|
660
|
-
* @param opts.reset If `true
|
|
659
|
+
* @param opts.reset If `true`, resets page to 0, clears cache, total elements count, and items
|
|
661
660
|
* @param opts.abort If `true`, aborts all active transport requests and sets loading to false
|
|
662
661
|
*
|
|
663
662
|
* @example
|
|
@@ -677,7 +676,7 @@ declare class PaginatedDataStore<ItemsType extends object, FilterType = unknown>
|
|
|
677
676
|
* Update store config on the fly (without re-creation).
|
|
678
677
|
* Does not trigger loading automatically.
|
|
679
678
|
*/
|
|
680
|
-
updateConfig: (config:
|
|
679
|
+
updateConfig: (config: PaginatedDataStoreConfig<ItemsType>) => void;
|
|
681
680
|
/**
|
|
682
681
|
* Copy configuration and presets from another store of the same type.
|
|
683
682
|
*/
|
|
@@ -709,10 +708,21 @@ type DictStoreConfig<ItemsType extends object> = {
|
|
|
709
708
|
* ('lru' is excluded: used internally for inner structures)
|
|
710
709
|
*/
|
|
711
710
|
cacheStrategy?: Omit<StorageStrategy, 'lru'>;
|
|
711
|
+
/**
|
|
712
|
+
* Optional prefix applied to all storage keys.
|
|
713
|
+
*
|
|
714
|
+
* Used to isolate keys within preventing collisions
|
|
715
|
+
* between different modules or instances.
|
|
716
|
+
*
|
|
717
|
+
* Example:
|
|
718
|
+
* - keyPrefix: 'user'
|
|
719
|
+
* - stored key: 'user:settings'
|
|
720
|
+
*/
|
|
721
|
+
keyPrefix?: string;
|
|
712
722
|
/** Initial filters (added to the first request/filtering). */
|
|
713
723
|
presetFilters?: Record<string, string>;
|
|
714
724
|
/** Autoload data on initialization (`true` by default). */
|
|
715
|
-
autoLoad?: boolean;
|
|
725
|
+
autoLoad?: boolean | 'whenEmpty';
|
|
716
726
|
/**
|
|
717
727
|
* Custom mapper of pagination/sort request into query params.
|
|
718
728
|
* Useful if the API expects non-standard field names.
|
|
@@ -749,6 +759,39 @@ type DictLocalConfig<ItemsType extends object> = {
|
|
|
749
759
|
/** Field key for value in a dictionary item. Defaults to `'code'`. */
|
|
750
760
|
valueKey?: keyof ItemsType & string;
|
|
751
761
|
};
|
|
762
|
+
type DictStoreProviderConfig = {
|
|
763
|
+
/**
|
|
764
|
+
* Cache strategy for options:
|
|
765
|
+
* - 'memory' — in-memory only,
|
|
766
|
+
* - 'session' — sessionStorage,
|
|
767
|
+
* - 'persist' — localStorage.
|
|
768
|
+
* ('lru' is excluded: used internally for inner structures)
|
|
769
|
+
*/
|
|
770
|
+
defaultCacheStrategy?: DictStoreConfig<AnyType>['cacheStrategy'];
|
|
771
|
+
/**
|
|
772
|
+
* Optional prefix applied to all storage keys.
|
|
773
|
+
*
|
|
774
|
+
* Used to isolate keys within preventing collisions
|
|
775
|
+
* between different modules or instances.
|
|
776
|
+
*
|
|
777
|
+
* Example:
|
|
778
|
+
* - keyPrefix: 'user'
|
|
779
|
+
* - stored key: 'user:settings'
|
|
780
|
+
*/
|
|
781
|
+
defaultPrefix?: string;
|
|
782
|
+
/** Initial filters (added to the first request/filtering). */
|
|
783
|
+
defaultPresetFilters?: DictStoreConfig<AnyType>['presetFilters'];
|
|
784
|
+
/** Transport method for fetching the dictionary. Defaults to 'POST'. */
|
|
785
|
+
defaultRestMethod?: DictStoreConfig<AnyType>['method'];
|
|
786
|
+
/** Debounce delay before request (ms) — for frequent input/search. */
|
|
787
|
+
defaultDebounceTime?: DictStoreConfig<AnyType>['debounceTime'];
|
|
788
|
+
/** Maximum number of options exposed (truncates `options`). */
|
|
789
|
+
defaultMaxOptionsSize?: DictStoreConfig<AnyType>['maxOptionsSize'];
|
|
790
|
+
/** Field key for label in a dictionary item. Defaults to `'name'`. */
|
|
791
|
+
defaultLabelKey?: DictStoreConfig<AnyType>['labelKey'];
|
|
792
|
+
/** Field key for value in a dictionary item. Defaults to `'code'`. */
|
|
793
|
+
defaultValueKey?: DictStoreConfig<AnyType>['valueKey'];
|
|
794
|
+
};
|
|
752
795
|
type ValueType = string[] | string | number | null | undefined;
|
|
753
796
|
|
|
754
797
|
/**
|
|
@@ -772,6 +815,12 @@ declare class DictStore<Type extends AnyDict> {
|
|
|
772
815
|
private apiUrl;
|
|
773
816
|
private storageKey;
|
|
774
817
|
static readonly MAX_CACHE_SIZE = 400;
|
|
818
|
+
/**
|
|
819
|
+
* Default dictionary configuration resolved from {@link STATUM_CONFIG}.
|
|
820
|
+
*
|
|
821
|
+
* Used as a global fallback when local configuration does not explicitly
|
|
822
|
+
*/
|
|
823
|
+
defaultConfig: _reforgium_statum.DictStoreProviderConfig;
|
|
775
824
|
private readonly fixed;
|
|
776
825
|
private readonly labelKey;
|
|
777
826
|
private readonly valueKey;
|
|
@@ -792,12 +841,12 @@ declare class DictStore<Type extends AnyDict> {
|
|
|
792
841
|
* Current list of dictionary items.
|
|
793
842
|
* Source — local cache (fixed=true) or data from `PaginatedDataStore`.
|
|
794
843
|
*/
|
|
795
|
-
items:
|
|
844
|
+
items: Signal<readonly Type[]>;
|
|
796
845
|
/**
|
|
797
846
|
* Ready-to-use dropdown options: `{ label, value }`.
|
|
798
847
|
* Respects `maxOptionsSize` for truncating the list.
|
|
799
848
|
*/
|
|
800
|
-
options:
|
|
849
|
+
options: Signal<{
|
|
801
850
|
label: string;
|
|
802
851
|
value: Type[keyof Type & string];
|
|
803
852
|
}[]>;
|
|
@@ -808,7 +857,7 @@ declare class DictStore<Type extends AnyDict> {
|
|
|
808
857
|
* @param storageKey key for saving cache in the selected strategy
|
|
809
858
|
* @param cfg behavior (fixed/search, parsers, label/value keys, cache strategy, etc.)
|
|
810
859
|
*/
|
|
811
|
-
constructor(apiUrl: string, storageKey: string, {
|
|
860
|
+
constructor(apiUrl: string, storageKey: string, { autoLoad, method, presetFilters, parseResponse, parseRequest, debounceTime, fixed, maxOptionsSize, labelKey, valueKey, keyPrefix, cacheStrategy, }: DictStoreConfig<Type>);
|
|
812
861
|
/** Restore cache from the selected storage (`persist`/`session`/`lru`/`memory`). */
|
|
813
862
|
restoreCache(): void;
|
|
814
863
|
/**
|
|
@@ -839,14 +888,32 @@ declare class DictStore<Type extends AnyDict> {
|
|
|
839
888
|
private restoreFromStorage;
|
|
840
889
|
private filterLocal;
|
|
841
890
|
private keyOf;
|
|
891
|
+
private setAutoload;
|
|
842
892
|
}
|
|
843
893
|
|
|
844
894
|
declare class DictLocalStore<Type extends AnyDict> {
|
|
845
895
|
#private;
|
|
896
|
+
/**
|
|
897
|
+
* Default dictionary configuration resolved from {@link STATUM_CONFIG}.
|
|
898
|
+
*
|
|
899
|
+
* Used as a global fallback when local configuration does not explicitly
|
|
900
|
+
* define dictionary keys.
|
|
901
|
+
*/
|
|
902
|
+
defaultConfig: _reforgium_statum.DictStoreProviderConfig;
|
|
903
|
+
/**
|
|
904
|
+
* Source dictionary items.
|
|
905
|
+
*
|
|
906
|
+
* Represents the full, unfiltered list of dictionary entries.
|
|
907
|
+
* Used as the base data set for search and option generation.
|
|
908
|
+
*/
|
|
846
909
|
items: _angular_core.WritableSignal<readonly Type[]>;
|
|
847
910
|
/**
|
|
848
|
-
*
|
|
849
|
-
*
|
|
911
|
+
* Computed list of options in `{ label, value }` format.
|
|
912
|
+
*
|
|
913
|
+
* Based on the current draft items (after search/filtering).
|
|
914
|
+
* Respects `maxOptionsSize` to limit the number of generated options.
|
|
915
|
+
*
|
|
916
|
+
* Intended for direct use in dropdowns and select-like components.
|
|
850
917
|
*/
|
|
851
918
|
options: _angular_core.Signal<{
|
|
852
919
|
label: string;
|
|
@@ -857,20 +924,64 @@ declare class DictLocalStore<Type extends AnyDict> {
|
|
|
857
924
|
private readonly maxOptionsSize?;
|
|
858
925
|
constructor(items: Type[], config?: DictLocalConfig<Type>);
|
|
859
926
|
/**
|
|
860
|
-
*
|
|
927
|
+
* Restore cached dictionary state.
|
|
928
|
+
*
|
|
929
|
+
* This implementation is a no-op and exists only for API compatibility
|
|
930
|
+
* with {@link DictStore}.
|
|
861
931
|
*/
|
|
862
932
|
restoreCache(): void;
|
|
863
933
|
/**
|
|
864
|
-
*
|
|
865
|
-
*
|
|
934
|
+
* Resolve display label by value.
|
|
935
|
+
*
|
|
936
|
+
* Performs a linear search over dictionary items and returns
|
|
937
|
+
* the corresponding label for the given value.
|
|
938
|
+
*
|
|
939
|
+
* Commonly used for reverse binding (value → label).
|
|
940
|
+
*
|
|
941
|
+
* @param value Dictionary value to look up
|
|
942
|
+
* @returns Resolved label string, or `undefined` if not found
|
|
866
943
|
*/
|
|
867
944
|
findLabel: (value: ValueType) => string | undefined;
|
|
945
|
+
/**
|
|
946
|
+
* Filter dictionary items by label.
|
|
947
|
+
*
|
|
948
|
+
* Applies a case-insensitive substring match against the label field
|
|
949
|
+
* and updates the internal draft items used for option generation.
|
|
950
|
+
*
|
|
951
|
+
* Passing an empty string resets the filter and restores all items.
|
|
952
|
+
*
|
|
953
|
+
* @param name Search query string
|
|
954
|
+
*/
|
|
868
955
|
search: (name?: string) => void;
|
|
956
|
+
/**
|
|
957
|
+
* Preload additional dictionary items.
|
|
958
|
+
*
|
|
959
|
+
* Can either replace the current items completely or append
|
|
960
|
+
* new entries to the existing list.
|
|
961
|
+
*
|
|
962
|
+
* Updates both the source items and the current draft items.
|
|
963
|
+
*
|
|
964
|
+
* @param items Items to preload
|
|
965
|
+
* @param opts Preload options
|
|
966
|
+
* @param opts.replace When `true`, replaces existing items instead of appending
|
|
967
|
+
*/
|
|
869
968
|
preload: (items: readonly Type[], opts?: {
|
|
870
969
|
replace?: boolean;
|
|
871
970
|
}) => void;
|
|
872
971
|
}
|
|
873
972
|
|
|
874
|
-
|
|
875
|
-
|
|
973
|
+
type PaginatedDataProviderConfig = {
|
|
974
|
+
paginatedData?: PaginatedDataStoreProviderConfig;
|
|
975
|
+
};
|
|
976
|
+
type SerializerProviderConfig = {
|
|
977
|
+
serializer?: Partial<SerializerConfig>;
|
|
978
|
+
};
|
|
979
|
+
type DictProviderConfig = {
|
|
980
|
+
dict?: DictStoreProviderConfig;
|
|
981
|
+
};
|
|
982
|
+
type StatumConfig = PaginatedDataProviderConfig & SerializerProviderConfig & DictProviderConfig;
|
|
983
|
+
declare const STATUM_CONFIG: InjectionToken<StatumConfig>;
|
|
984
|
+
|
|
985
|
+
export { AbortError, CacheMissError, DictLocalStore, DictStore, LruCache, PaginatedDataStore, ResourceStore, STATUM_CONFIG, Serializer, isAbort, storageStrategy };
|
|
986
|
+
export type { DataType, DictLocalConfig, DictStoreConfig, DictStoreProviderConfig, FieldConfig, PaginatedDataStoreConfig, PaginatedDataStoreProviderConfig, ResourceRoutesMap, ResourceStatus, ResourceStoreOptions, SerializedType, SerializerConfig, StorageInterface, StorageStrategy, Types };
|
|
876
987
|
//# 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/
|
|
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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"}
|