@reforgium/statum 1.0.0 → 1.0.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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @reforgium/statum
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@reforgium/statum)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
6
|
**Signals-first state stores and caching utilities for Angular (20+).**
|
|
@@ -885,7 +885,7 @@ const PDS_CONFIG = new InjectionToken('RE_PDS_CONFIG');
|
|
|
885
885
|
class PaginatedDataStore {
|
|
886
886
|
route;
|
|
887
887
|
config;
|
|
888
|
-
defaultConfig = inject(PDS_CONFIG);
|
|
888
|
+
defaultConfig = inject(PDS_CONFIG, { optional: true }) || {};
|
|
889
889
|
#transport;
|
|
890
890
|
#cache;
|
|
891
891
|
/** Current page data (reactive). */
|
|
@@ -947,7 +947,7 @@ class PaginatedDataStore {
|
|
|
947
947
|
};
|
|
948
948
|
/**
|
|
949
949
|
* Update filters (goes to the first page) and fetch.
|
|
950
|
-
*
|
|
950
|
+
* The previous cache is cleared.
|
|
951
951
|
*/
|
|
952
952
|
updateFilters = (filters) => {
|
|
953
953
|
this.#cache.clear();
|
|
@@ -955,7 +955,7 @@ class PaginatedDataStore {
|
|
|
955
955
|
return this.#fetchItems({ page: 0, filters: { ...this.filters, ...filters } });
|
|
956
956
|
};
|
|
957
957
|
/**
|
|
958
|
-
* Update state from table events (PrimeNG, etc.) and fetch.
|
|
958
|
+
* Update the state from table events (PrimeNG, etc.) and fetch.
|
|
959
959
|
* Supports `page/first/rows/sortField/sortOrder`.
|
|
960
960
|
*/
|
|
961
961
|
updateQuery = ({ page: pageNum, first = 0, rows = 0, sortOrder, sortField }) => {
|
|
@@ -973,7 +973,7 @@ class PaginatedDataStore {
|
|
|
973
973
|
return this.#fetchItems({ page: 0, filters, sort: undefined });
|
|
974
974
|
};
|
|
975
975
|
/**
|
|
976
|
-
* Change resource route (resets page, cache, and presets) without fetching.
|
|
976
|
+
* Change the resource route (resets page, cache, and presets) without fetching.
|
|
977
977
|
* Useful when one store should work with different endpoints.
|
|
978
978
|
*/
|
|
979
979
|
updateRoute = (route) => {
|
|
@@ -1000,7 +1000,7 @@ class PaginatedDataStore {
|
|
|
1000
1000
|
this.applyConfig(helper.config);
|
|
1001
1001
|
this.applyPresetMeta();
|
|
1002
1002
|
}
|
|
1003
|
-
/** Clean up resources and cancel active requests.
|
|
1003
|
+
/** Clean up resources and cancel active requests. Automatically called onDestroy. */
|
|
1004
1004
|
destroy() {
|
|
1005
1005
|
try {
|
|
1006
1006
|
this.#transport?.abortAll?.('PaginatedDataStore destroyed');
|
|
@@ -1017,10 +1017,10 @@ class PaginatedDataStore {
|
|
|
1017
1017
|
this.#transport.abortAll();
|
|
1018
1018
|
try {
|
|
1019
1019
|
const response = await this.runTransport(filters, query);
|
|
1020
|
-
const parsed = this.parseResponseData(response);
|
|
1021
1020
|
this.page = page;
|
|
1022
1021
|
this.sort = sort;
|
|
1023
1022
|
this.filters = filters;
|
|
1023
|
+
const parsed = await this.parseResponseData(response);
|
|
1024
1024
|
this.pageSize = parsed.pageable?.pageSize || size;
|
|
1025
1025
|
this.totalElements = parsed.totalElements;
|
|
1026
1026
|
this.items.set(parsed.content);
|
|
@@ -1069,9 +1069,10 @@ class PaginatedDataStore {
|
|
|
1069
1069
|
sort && (queries['sort'] = sort);
|
|
1070
1070
|
return queries;
|
|
1071
1071
|
}
|
|
1072
|
-
parseResponseData = (data) => {
|
|
1072
|
+
parseResponseData = async (data) => {
|
|
1073
1073
|
if (this.config?.parseResponse) {
|
|
1074
|
-
|
|
1074
|
+
// noinspection ES6RedundantAwait
|
|
1075
|
+
return await this.config.parseResponse(data);
|
|
1075
1076
|
}
|
|
1076
1077
|
if (Array.isArray(data)) {
|
|
1077
1078
|
return this.parseFlatArray(data);
|
|
@@ -1120,7 +1121,7 @@ var _a;
|
|
|
1120
1121
|
* ```ts
|
|
1121
1122
|
* const dict = new DictStore<Country>('/countries', 'countries', { labelKey: 'name', valueKey: 'code' });
|
|
1122
1123
|
* dict.search('ki'); // filters locally (fixed=true) or goes to server (fixed=false)
|
|
1123
|
-
* effect(() => console.log(dict.options())); // [{label:'Kyrgyzstan', value:'KG'}, ...]
|
|
1124
|
+
* effect(() => console.log(dict.options())); // [{label:'Kyrgyzstan', value: 'KG'}, ...]
|
|
1124
1125
|
* ```
|
|
1125
1126
|
*/
|
|
1126
1127
|
class DictStore {
|
|
@@ -1165,7 +1166,7 @@ class DictStore {
|
|
|
1165
1166
|
return this.maxOptionsSize ? options.slice(0, this.maxOptionsSize) : options;
|
|
1166
1167
|
}, ...(ngDevMode ? [{ debugName: "options" }] : []));
|
|
1167
1168
|
_lastPromise = null;
|
|
1168
|
-
_armed = false;
|
|
1169
|
+
_armed = signal(false, ...(ngDevMode ? [{ debugName: "_armed" }] : []));
|
|
1169
1170
|
// todo add i18n support
|
|
1170
1171
|
/**
|
|
1171
1172
|
* @param apiUrl dictionary endpoint (e.g., `'/api/dicts/countries'`)
|
|
@@ -1187,7 +1188,7 @@ class DictStore {
|
|
|
1187
1188
|
this.labelKey = labelKey;
|
|
1188
1189
|
this.valueKey = valueKey;
|
|
1189
1190
|
this.maxOptionsSize = maxOptionsSize;
|
|
1190
|
-
this._armed
|
|
1191
|
+
this._armed.set(autoLoad);
|
|
1191
1192
|
if (cacheStrategy !== 'memory') {
|
|
1192
1193
|
this.storage = storageStrategy(cacheStrategy);
|
|
1193
1194
|
}
|
|
@@ -1200,7 +1201,7 @@ class DictStore {
|
|
|
1200
1201
|
untracked(() => this.mergeIntoCache(incoming));
|
|
1201
1202
|
}));
|
|
1202
1203
|
this.#effectRefs.push(effect(() => {
|
|
1203
|
-
if (!this._armed) {
|
|
1204
|
+
if (!this._armed()) {
|
|
1204
1205
|
return;
|
|
1205
1206
|
}
|
|
1206
1207
|
const rest = this.filters();
|
|
@@ -1213,22 +1214,22 @@ class DictStore {
|
|
|
1213
1214
|
}
|
|
1214
1215
|
}));
|
|
1215
1216
|
}
|
|
1216
|
-
/**
|
|
1217
|
+
/** Restore cache from the selected storage (`persist`/`session`/`lru`/`memory`). */
|
|
1217
1218
|
restoreCache() {
|
|
1218
1219
|
this.restoreFromStorage();
|
|
1219
1220
|
}
|
|
1220
1221
|
/**
|
|
1221
|
-
*
|
|
1222
|
-
*
|
|
1222
|
+
* Set a search query and filters.
|
|
1223
|
+
* With `fixed: false` initiates server search; with `fixed: true` — local filtering.
|
|
1223
1224
|
*/
|
|
1224
1225
|
search = (name = '', filters = {}) => {
|
|
1225
|
-
this._armed
|
|
1226
|
+
this._armed.set(true);
|
|
1226
1227
|
this.searchText.set(name);
|
|
1227
1228
|
this.filters.set(filters);
|
|
1228
1229
|
};
|
|
1229
1230
|
/**
|
|
1230
|
-
*
|
|
1231
|
-
* @returns
|
|
1231
|
+
* Find display label by value (typically for reverse binding).
|
|
1232
|
+
* @returns label string or `undefined` if not found
|
|
1232
1233
|
*/
|
|
1233
1234
|
findLabel = (value) => {
|
|
1234
1235
|
for (const item of this.cachedItems()) {
|
|
@@ -1239,11 +1240,11 @@ class DictStore {
|
|
|
1239
1240
|
return undefined;
|
|
1240
1241
|
};
|
|
1241
1242
|
/**
|
|
1242
|
-
*
|
|
1243
|
-
*
|
|
1243
|
+
* Preload dictionary items into a local cache.
|
|
1244
|
+
* Useful for SSR/static lists/quick presets.
|
|
1244
1245
|
*
|
|
1245
|
-
* @param items
|
|
1246
|
-
* @param opts `{ replace?: true }` —
|
|
1246
|
+
* @param items list of items
|
|
1247
|
+
* @param opts `{ replace?: true }` — completely replace current cache
|
|
1247
1248
|
*/
|
|
1248
1249
|
preload = (items, opts) => {
|
|
1249
1250
|
opts?.replace && this.#lru.clear();
|
|
@@ -1263,12 +1264,12 @@ class DictStore {
|
|
|
1263
1264
|
this.storage?.set(this.storageKey, arr.slice(0, _a.MAX_CACHE_SIZE));
|
|
1264
1265
|
}
|
|
1265
1266
|
};
|
|
1266
|
-
/**
|
|
1267
|
+
/** Release resources and stop internal effects. */
|
|
1267
1268
|
dispose() {
|
|
1268
1269
|
this.#effectRefs.forEach((e) => e.destroy());
|
|
1269
1270
|
this.#effectRefs = [];
|
|
1270
1271
|
}
|
|
1271
|
-
/**
|
|
1272
|
+
/** Syntactic sugar for `using`/`Symbol.dispose`. */
|
|
1272
1273
|
[Symbol.dispose]() {
|
|
1273
1274
|
this.dispose();
|
|
1274
1275
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reforgium-statum.mjs","sources":["../../../../libs/statum/src/serializer/serializer.helpers.ts","../../../../libs/statum/src/serializer/serializer.ts","../../../../libs/statum/src/serializer/serializer.provider.ts","../../../../libs/statum/src/cache/storages/lru.storage.ts","../../../../libs/statum/src/cache/storages/local.storage.ts","../../../../libs/statum/src/cache/storages/memory.storage.ts","../../../../libs/statum/src/cache/storages/session.storage.ts","../../../../libs/statum/src/cache/storage-strategy/storage.strategy.ts","../../../../libs/statum/src/stores/resource-store/resource.utils.ts","../../../../libs/statum/src/stores/resource-store/resource.scheduler.ts","../../../../libs/statum/src/stores/resource-store/resource.store.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.provider.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.store.ts","../../../../libs/statum/src/stores/dict-store/dict.store.ts","../../../../libs/statum/src/stores/dict-store/dict-local.store.ts","../../../../libs/statum/src/reforgium-statum.ts"],"sourcesContent":["import { AnyType, formatDate } from '@reforgium/internal';\r\n\r\n// noinspection ES6PreferShortImport\r\nimport { SerializerConfig } from './serialize.models';\r\n\r\nexport const serializeString = (config: SerializerConfig, value: AnyType) =>\r\n config.mapString.format?.(value) ?? (config.mapString.trim ? value.trim() : value);\r\n\r\nexport const serializeNumber = (config: SerializerConfig, value: AnyType) =>\r\n config.mapNumber.format?.(value) ?? Number(value);\r\n\r\nexport const serializeBoolean = (config: SerializerConfig, value: AnyType) =>\r\n config.mapBoolean.format?.(value) ?? (value ? (config.mapBoolean.true ?? true) : (config.mapBoolean.false ?? false));\r\n\r\nexport const serializeDate = (config: SerializerConfig, value: AnyType) =>\r\n config.mapDate.format?.(value) ?? formatDate(value, config.mapDate.dateFormat);\r\n","import { AnyDict, AnyType } from '@reforgium/internal';\r\nimport {\r\n formatDate,\r\n isDatePeriod,\r\n isNullable,\r\n isNumber,\r\n isObject,\r\n makeQuery,\r\n parseQueryArray,\r\n parseToDate,\r\n parseToDatePeriod,\r\n} from '@reforgium/internal';\r\n\r\nimport { DataType, SerializedType, SerializerConfig } from './serialize.models';\r\nimport { serializeBoolean, serializeDate, serializeNumber, serializeString } from './serializer.helpers';\r\n\r\n/**\r\n * Universal serializer/deserializer for values used in forms, filters, and DTOs.\r\n *\r\n * Supports types: `string | number | boolean | Date | [Date, Date] (period) | array | object | nullable`.\r\n * Capabilities:\r\n * - normalize values according to config (trim strings, parse numbers from strings, boolean strings, etc.),\r\n * - transform date periods into paired keys (`from/to`) or a single joined string,\r\n * - build/parse a query string (or JSON) to and from an object.\r\n *\r\n * Example:\r\n * ```ts\r\n * type Filters = { q?: string; active?: boolean; created?: [Date, Date] | null };\r\n * const s = new Serializer<Filters>({\r\n * mapPeriod: { transformMode: { mode: 'split', dateFromKeyPostfix: 'From', dateToKeyPostfix: 'To' } }\r\n * });\r\n *\r\n * // -> { q: 'john', createdFrom: '2025-01-01', createdTo: '2025-01-31' }\r\n * const plain = s.serialize({\r\n * q: ' john ',\r\n * active: undefined,\r\n * created: [new Date('2025-01-01'), new Date('2025-01-31')]\r\n * });\r\n *\r\n * // -> 'q=john&createdFrom=2025-01-01&createdTo=2025-01-31'\r\n * const qs = s.toQuery({ q: 'john', created: [new Date('2025-01-01'), new Date('2025-01-31')] });\r\n *\r\n * // <- { q: 'john', created: [Date, Date] }\r\n * const parsed = s.deserialize('q=john&createdFrom=2025-01-01&createdTo=2025-01-31');\r\n * ```\r\n */\r\nexport class Serializer<EntityType extends DataType> {\r\n readonly config: SerializerConfig;\r\n\r\n /**\r\n * Creates a serializer with a partially overridden configuration.\r\n * Provide only the options you want to change (the rest are taken from defaults).\r\n *\r\n * @param config partial transformation configuration\r\n */\r\n constructor(config: Partial<SerializerConfig>) {\r\n this.config = {\r\n mapString: { trim: true },\r\n mapNumber: { fromString: false },\r\n mapBoolean: {},\r\n mapArray: { concatType: 'comma' },\r\n mapObject: { deep: true },\r\n mapDate: { dateFormat: 'yyyy-MM-dd' },\r\n mapPeriod: {\r\n dateFormat: 'yyyy-MM-dd',\r\n transformMode: { mode: 'split', dateFromKeyPostfix: 'From', dateToKeyPostfix: 'To' },\r\n },\r\n mapNullable: { remove: true, includeEmptyString: false },\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Converts a domain object into a flat serialized representation\r\n * (ready to send to an API or build a query string).\r\n *\r\n * Rules are taken from `config`:\r\n * — strings can be trimmed (if enabled),\r\n * — numbers can be converted from strings/numbers,\r\n * — boolean supports custom true/false representations,\r\n * — dates are formatted by `dateFormat`,\r\n * — date periods can be split/joined,\r\n * — `nullable` can be removed from the result (`remove`) or formatted.\r\n *\r\n * @param obj source object\r\n * @returns a flat dictionary with string/primitive values\r\n */\r\n serialize(obj: EntityType): SerializedType {\r\n const result: SerializedType = {};\r\n\r\n for (const [key, value] of Object.entries(obj ?? {})) {\r\n const fields = this.config.mapFields?.[key];\r\n\r\n if (fields && 'format' in fields) {\r\n result[key] = fields.format(value, obj as EntityType);\r\n continue;\r\n }\r\n\r\n if (fields?.type === 'nullable' || isNullable(value, this.config.mapNullable?.includeEmptyString)) {\r\n if (this.config.mapNullable.remove) {\r\n continue;\r\n }\r\n }\r\n\r\n if (fields?.type === 'period' || isDatePeriod(value)) {\r\n const transform = this.config.mapPeriod.transformMode;\r\n const [from, to] = value;\r\n\r\n if (transform?.mode === 'split') {\r\n result[`${key}${transform.dateFromKeyPostfix}`] = formatDate(from, this.config.mapPeriod.dateFormat);\r\n result[`${key}${transform.dateToKeyPostfix}`] = formatDate(to, this.config.mapPeriod.dateFormat);\r\n continue;\r\n }\r\n }\r\n\r\n result[key] = this.serializeElement(value, key);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Parse serialized data into a domain object.\r\n *\r\n * Source can be:\r\n * — a query string (`key=value&arr=1,2`) or `JSON.stringify(obj)`,\r\n * — an already prepared flat object.\r\n *\r\n * Transformations are reverse of `serialize`: strings → number/boolean/Date/period,\r\n * arrays are collected according to strategy (`comma`/`pipe`/`multi`), objects — deeply or as JSON.\r\n *\r\n * @param val query string or object\r\n * @returns a domain object of the specified type\r\n */\r\n deserialize = (val: string | AnyDict): EntityType => {\r\n const data: SerializedType = typeof val === 'string' ? this.parseQuery(val) : val;\r\n const result: AnyType = {};\r\n\r\n for (const [key, value] of Object.entries(data ?? {})) {\r\n const field = this.config.mapFields?.[key];\r\n\r\n if (field && 'parse' in field) {\r\n result[key] = field.parse(value, data);\r\n continue;\r\n }\r\n\r\n if (\r\n field?.type === 'nullable' ||\r\n (field?.type !== 'array' && isNullable(value, this.config.mapNullable?.includeEmptyString))\r\n ) {\r\n if (this.config.mapNullable.remove) {\r\n continue;\r\n }\r\n }\r\n\r\n const periodTransform = this.config.mapPeriod.transformMode!;\r\n\r\n if (periodTransform.mode === 'split') {\r\n const isFrom = (key || '').endsWith(periodTransform.dateFromKeyPostfix);\r\n const isTo = (key || '').endsWith(periodTransform.dateToKeyPostfix);\r\n const keyJoint = (key || '')\r\n .replace(periodTransform.dateFromKeyPostfix, '')\r\n .replace(periodTransform.dateToKeyPostfix, '');\r\n const field = this.config.mapFields?.[keyJoint];\r\n\r\n // @ts-ignore\r\n if (field?.['type'] === 'period' && (isFrom || isTo)) {\r\n result[keyJoint] ??= [null, null];\r\n\r\n if (isFrom) {\r\n result[keyJoint][0] = parseToDate(value, this.config.mapPeriod.dateFormat);\r\n } else if (isTo) {\r\n result[keyJoint][1] = parseToDate(value, this.config.mapPeriod.dateFormat);\r\n }\r\n\r\n continue;\r\n }\r\n }\r\n\r\n result[key] = this.deserializeElement(value, key);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Build a query string from a domain object using `serialize` rules\r\n * and the array joining strategy (`concatType`).\r\n *\r\n * @param val domain object\r\n * @returns query string (suitable for URL or history API)\r\n */\r\n toQuery = (val: EntityType): string => {\r\n return makeQuery(this.serialize(val), this.config.mapArray.concatType);\r\n };\r\n\r\n /**\r\n * Returns a new serializer instance with a merged configuration.\r\n * Useful for ad-hoc overrides for a specific call.\r\n *\r\n * @param config partial config changes\r\n * @returns new `Serializer` with the provided `config` applied\r\n */\r\n withConfig(config: Partial<SerializerConfig>): Serializer<EntityType> {\r\n return new Serializer<EntityType>({ ...this.config, ...config });\r\n }\r\n\r\n private serializeElement(value: AnyType, key?: string): AnyType {\r\n const fields = this.config.mapFields?.[key || ''];\r\n\r\n if (fields && 'format' in fields) {\r\n return;\r\n }\r\n\r\n if (fields?.type === 'nullable' || isNullable(value, this.config.mapNullable?.includeEmptyString)) {\r\n const nullableVal = value || null;\r\n\r\n return this.config.mapNullable.format?.(nullableVal) || this.config.mapNullable.replaceWith || nullableVal;\r\n }\r\n\r\n if (fields?.type === 'string') {\r\n return serializeString(this.config, value);\r\n }\r\n\r\n if (fields?.type === 'number' || isNumber(value, this.config.mapNumber.fromString)) {\r\n return serializeNumber(this.config, value);\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return serializeString(this.config, value);\r\n }\r\n\r\n if (fields?.type === 'boolean' || typeof value === 'boolean') {\r\n return serializeBoolean(this.config, value);\r\n }\r\n\r\n if (fields?.type === 'date' || value instanceof Date) {\r\n return serializeDate(this.config, value);\r\n }\r\n\r\n if (fields?.type === 'period' || isDatePeriod(value)) {\r\n const mapPeriod = this.config.mapPeriod;\r\n\r\n if (mapPeriod.format) {\r\n return mapPeriod.format(value);\r\n } else {\r\n const [from, to] = value;\r\n const transform = mapPeriod.transformMode!;\r\n\r\n if (transform.mode === 'join') {\r\n const period = [\r\n formatDate(from, this.config.mapPeriod.dateFormat),\r\n formatDate(to, this.config.mapPeriod.dateFormat),\r\n ];\r\n\r\n return period.join(transform.concat);\r\n }\r\n }\r\n }\r\n\r\n if (fields?.type === 'array' || Array.isArray(value)) {\r\n return (value as AnyType[]).map((it) => this.serializeElement(it));\r\n }\r\n\r\n if (fields?.type === 'object' || isObject(value)) {\r\n return (\r\n this.config.mapObject.format?.(value) ??\r\n (this.config.mapObject.deep ? this.serialize(value) : JSON.stringify(value))\r\n );\r\n }\r\n }\r\n\r\n private deserializeElement(value: AnyType, key?: string): AnyType {\r\n const field = this.config.mapFields?.[key || ''];\r\n\r\n if (field && 'format' in field) {\r\n return;\r\n }\r\n\r\n if (field?.type === 'array' || Array.isArray(value)) {\r\n const array = Array.isArray(value) ? value : [value];\r\n\r\n if (this.config.mapArray.removeNullable) {\r\n if (!isNullable(value, this.config.mapNullable?.includeEmptyString)) {\r\n return array.map((it) => this.deserializeElement(it));\r\n } else {\r\n return;\r\n }\r\n } else {\r\n return !value ? [] : array.map((it) => this.deserializeElement(it));\r\n }\r\n }\r\n\r\n if (field?.type === 'object') {\r\n try {\r\n if (this.config.mapObject.deep) {\r\n // @ts-ignore\r\n return this.deserializeElement(value);\r\n } else {\r\n // @ts-ignore\r\n return JSON.parse(value);\r\n }\r\n } catch {\r\n return value;\r\n }\r\n }\r\n\r\n if (field?.type === 'nullable' || isNullable(value, this.config.mapNullable?.includeEmptyString)) {\r\n return this.config.mapNullable.parse?.(value) || value;\r\n }\r\n\r\n if (\r\n field?.type === 'boolean' ||\r\n typeof value === 'boolean' ||\r\n value === this.config.mapBoolean.true ||\r\n value === this.config.mapBoolean.false\r\n ) {\r\n return this.config.mapBoolean.parse?.(value) ?? (value === this.config.mapBoolean.true || value === true);\r\n }\r\n\r\n const maybeDate = parseToDate(value, this.config.mapDate.dateFormat);\r\n\r\n if (field?.type === 'date' || maybeDate) {\r\n return this.config.mapDate.parse?.(value) || maybeDate;\r\n }\r\n\r\n const periodTransform = this.config.mapPeriod.transformMode!;\r\n\r\n if (periodTransform.mode === 'join') {\r\n const maybePeriod = parseToDatePeriod(value, this.config.mapPeriod.dateFormat);\r\n\r\n if (field?.type === 'period' || (maybePeriod || []).some(Boolean)) {\r\n return this.config.mapPeriod.parse?.(value) || maybePeriod;\r\n }\r\n }\r\n\r\n if (field?.type === 'number' || isNumber(value, this.config.mapNumber.fromString)) {\r\n return this.config.mapNumber.parse?.(value) || Number(String(value).trim());\r\n }\r\n\r\n if (field?.type === 'string' || typeof value === 'string') {\r\n return this.config.mapString.parse?.(value) || this.config.mapString.trim ? String(value).trim() : value;\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private parseQuery(val: string) {\r\n try {\r\n return JSON.parse(val);\r\n } catch {\r\n const params = new URLSearchParams(val);\r\n const data: SerializedType = {};\r\n\r\n params.forEach((value, key) => {\r\n const field = this.config.mapFields?.[key] || {};\r\n const concatType = this.config.mapArray.concatType;\r\n\r\n if ('type' in field && field.type === 'array') {\r\n data[key] ??= [];\r\n concatType !== 'multi' && (data[key] = parseQueryArray(value, concatType, key));\r\n concatType === 'multi' && (data[key] as string[]).push(value);\r\n } else {\r\n data[key] = value;\r\n }\r\n });\r\n\r\n return data;\r\n }\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nimport { SerializerConfig } from './serialize.models';\r\n\r\nexport const SERIALIZER_CONFIG = new InjectionToken<Partial<SerializerConfig>>('SERIALIZER_CONFIG');\r\n","import { StorageInterface } from './models';\r\n\r\nexport class LruCache<KeyT, ValueT> implements StorageInterface<KeyT, ValueT> {\r\n private map = new Map<KeyT, ValueT>();\r\n\r\n constructor(public limit: number = 100) {}\r\n\r\n get length(): number {\r\n return this.map.size;\r\n }\r\n\r\n get(key: KeyT) {\r\n if (!this.map.has(key)) {\r\n return null;\r\n }\r\n\r\n const val = this.map.get(key)!;\r\n\r\n this.map.delete(key);\r\n this.map.set(key, val);\r\n\r\n return val;\r\n }\r\n\r\n set(key: KeyT, value: ValueT) {\r\n if (this.map.has(key)) {\r\n this.map.delete(key);\r\n } else if (this.map.size === this.limit) {\r\n const oldest = this.map.keys().next().value;\r\n\r\n oldest !== undefined && this.map.delete(oldest);\r\n }\r\n\r\n this.map.set(key, value);\r\n }\r\n\r\n remove(key: KeyT): boolean {\r\n return this.map.delete(key);\r\n }\r\n\r\n clear(): void {\r\n this.map.clear();\r\n }\r\n\r\n has(key: KeyT): boolean {\r\n return this.map.has(key);\r\n }\r\n\r\n keys(): KeyT[] {\r\n return Array.from(this.map.keys());\r\n }\r\n\r\n values(): ValueT[] {\r\n return Array.from(this.map.values());\r\n }\r\n\r\n toArray(): ValueT[] {\r\n return Array.from(this.map.values());\r\n }\r\n\r\n fromArray(entries: [KeyT, ValueT][]) {\r\n this.map.clear();\r\n\r\n for (const [k, v] of entries) {\r\n this.set(k, v);\r\n }\r\n }\r\n}\r\n","import { AnyDict, AnyType } from '@reforgium/internal';\r\n\r\nimport { StorageInterface } from './models';\r\n\r\nexport class LocalStorage<Key = string, Type extends AnyType = AnyDict> implements StorageInterface<Key, Type> {\r\n get length() {\r\n return localStorage.length;\r\n }\r\n\r\n get(key: Key): Type | null {\r\n const raw = localStorage.getItem(String(key));\r\n const parsed = JSON.parse(raw ?? 'null');\r\n\r\n return (parsed as Type) ?? null;\r\n }\r\n\r\n set(key: Key, value: Type): void {\r\n const str = JSON.stringify(value);\r\n\r\n localStorage.setItem(String(key), str);\r\n }\r\n\r\n remove(key: Key): void {\r\n return localStorage.removeItem(String(key));\r\n }\r\n\r\n clear(): void {\r\n return localStorage.clear();\r\n }\r\n}\r\n","import { AnyDict, AnyType } from '@reforgium/internal';\r\n\r\nimport { StorageInterface } from '.';\r\n\r\nexport class MemoryStorage<Key = string, Type extends AnyType = AnyDict> implements StorageInterface<Key, Type> {\r\n private cache = new Map<Key, Type>();\r\n\r\n get length() {\r\n return this.cache.size;\r\n }\r\n\r\n get(key: Key): Type | null {\r\n return this.cache.get(key) ?? null;\r\n }\r\n\r\n set(key: Key, value: Type): void {\r\n this.cache.set(key, value);\r\n }\r\n\r\n remove(key: Key): void {\r\n this.cache.delete(key);\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n}\r\n","import { AnyDict, AnyType } from '@reforgium/internal';\r\n\r\nimport { StorageInterface } from './models';\r\n\r\nexport class SessionStorage<Key = string, Type extends AnyType = AnyDict> implements StorageInterface<Key, Type> {\r\n get length() {\r\n return sessionStorage.length;\r\n }\r\n\r\n get(key: Key): Type | null {\r\n const raw = sessionStorage.getItem(String(key));\r\n const parsed = JSON.parse(raw ?? 'null');\r\n\r\n return (parsed as Type) ?? null;\r\n }\r\n\r\n set(key: Key, value: Type): void {\r\n const str = JSON.stringify(value);\r\n\r\n sessionStorage.setItem(String(key), str);\r\n }\r\n\r\n remove(key: Key): void {\r\n return sessionStorage.removeItem(String(key));\r\n }\r\n\r\n clear(): void {\r\n return sessionStorage.clear();\r\n }\r\n}\r\n","import { AnyDict, AnyType } from '@reforgium/internal';\r\n\r\nimport { LruCache, StorageInterface } from '../storages';\r\nimport { LocalStorage } from '../storages/local.storage';\r\nimport { MemoryStorage } from '../storages/memory.storage';\r\nimport { SessionStorage } from '../storages/session.storage';\r\nimport { StorageStrategy } from './models';\r\n\r\n/**\r\n * Factory for data storage strategies.\r\n *\r\n * Returns a `StorageInterface` implementation depending on the selected strategy:\r\n * - `'memory'` — in-memory storage (for the session lifetime);\r\n * - `'session'` — `sessionStorage`, lives until the tab is closed;\r\n * - `'persist'` — `localStorage`, persists between sessions;\r\n * - `'lru'` — size-limited cache (Least Recently Used).\r\n *\r\n * Used to choose an appropriate storage implementation\r\n * depending on the scenario: temporary data, long-term, cache, etc.\r\n *\r\n * @param strategy storage strategy type (`memory`, `session`, `persist`, `lru`)\r\n * @returns instance implementing `StorageInterface<Key, Type>`\r\n */\r\nexport const storageStrategy = <Key = string, Type extends AnyType = AnyDict>(\r\n strategy: StorageStrategy,\r\n): StorageInterface<Key, Type> => {\r\n const fabrics: Record<StorageStrategy, () => StorageInterface<Key, Type>> = {\r\n memory: () => new MemoryStorage<Key, Type>(),\r\n session: () => new SessionStorage<Key, Type>(),\r\n persist: () => new LocalStorage<Key, Type>(),\r\n lru: () => new LruCache<Key, Type>(),\r\n };\r\n\r\n return fabrics[strategy]();\r\n};\r\n","import { RestMethods } from '@reforgium/internal';\r\n\r\n/**\r\n * Error thrown when requested data is missing in the cache.\r\n *\r\n * Used by the `cache-only` strategy when data is not found\r\n * and a network request is not allowed.\r\n *\r\n * Example:\r\n * ```ts\r\n * try {\r\n * await store.get({ query }, { strategy: 'cache-only' });\r\n * } catch (e) {\r\n * if (e instanceof CacheMissError) console.warn(e.key, 'not found in cache');\r\n * }\r\n * ```\r\n */\r\nexport class CacheMissError extends Error {\r\n constructor(public readonly key: string) {\r\n super(`Cache miss for key: ${key}`);\r\n this.name = 'CacheMissError';\r\n }\r\n}\r\n\r\n/**\r\n * Error indicating an aborted (canceled) request.\r\n *\r\n * May be thrown by `abort()` or `abortAll()` in `ResourceStore`.\r\n * Usually does not require handling as an error — used to ignore canceled operations.\r\n */\r\nexport class AbortError extends Error {\r\n constructor(message = 'aborted') {\r\n super(message);\r\n this.name = 'AbortError';\r\n }\r\n}\r\n\r\n/**\r\n * Checks whether the exception is an `AbortError` (including compatible objects).\r\n *\r\n * @param e — any value that may be an error\r\n * @returns `true` if it's an `AbortError`\r\n */\r\nexport function isAbort(e: unknown): e is AbortError {\r\n return (\r\n e instanceof AbortError ||\r\n (typeof e === 'object' && e != null && (e as Error)?.name === 'AbortError' && (e as Error)?.message === 'aborted')\r\n );\r\n}\r\n\r\nexport function joinUrl(base: string | undefined, path: string): string {\r\n return base ? `${base.replace(/\\/$/, '')}/${path.replace(/^\\//, '')}` : path;\r\n}\r\n\r\nexport function buildKey(method: RestMethods, path: string): string {\r\n return `${method}|${path}`;\r\n}\r\n","import { filter, merge, Observable, Subject, Subscription, timer } from 'rxjs';\r\nimport { debounce as rxDebounce, finalize, tap, throttle as rxThrottle } from 'rxjs/operators';\r\n\r\nimport { AnyType } from '@reforgium/internal';\r\n\r\nimport { DelayMode } from './resource.models';\r\n// noinspection ES6PreferShortImport\r\nimport { AbortError } from './resource.utils';\r\n\r\ntype Waiter<T> = { resolve: (v: T) => void; reject: (e: unknown) => void };\r\n\r\ntype ScheduledTask<Data> = {\r\n mode: DelayMode;\r\n delay: number;\r\n exec: () => Observable<Data>;\r\n};\r\n\r\ntype Channel<Data> = {\r\n subject: Subject<ScheduledTask<Data>>;\r\n waiters: Waiter<Data>[];\r\n lastExec?: () => Observable<Data>;\r\n timerSub?: Subscription;\r\n inflight?: Subscription;\r\n};\r\n\r\n/**\r\n * Per-key task scheduler with `debounce`/`throttle` and result deduplication.\r\n *\r\n * Allows applying delays and rate limiting separately for each key.\r\n * All `schedule` calls for the same key are coalesced: consumers receive a single shared `Promise`\r\n * that resolves with the value of the last started task.\r\n *\r\n * Suitable for API requests, auto-saving forms, incremental search, etc.\r\n *\r\n * Example:\r\n * ```ts\r\n * const ks = new KeyedScheduler();\r\n * // these three calls collapse into one request after 300ms\r\n * ks.schedule('users:list', 'debounce', 300, () => http.get<User[]>('/api/users'));\r\n * ks.schedule('users:list', 'debounce', 300, () => http.get<User[]>('/api/users'));\r\n * const users = await ks.schedule('users:list', 'debounce', 300, () => http.get<User[]>('/api/users'));\r\n * ```\r\n */\r\nexport class KeyedScheduler {\r\n private channels = new Map<string, Channel<AnyType>>();\r\n\r\n /**\r\n * Schedule task execution for the specified key.\r\n *\r\n * Multiple calls with the same key are merged according to the mode:\r\n * `debounce` — runs the last task after a pause;\r\n * `throttle` — runs no more often than the specified delay (uses the last accumulated).\r\n *\r\n * All waiters receive the result of a single execution.\r\n *\r\n * @param key logical channel key (e.g., `'users:list'`)\r\n * @param mode delay mode (`'debounce' | 'throttle'`)\r\n * @param delay delay in milliseconds\r\n * @param exec Observable factory with the actual work (HTTP request, etc.)\r\n * @returns Promise with the result of `exec`\r\n */\r\n schedule<Data>(key: string, mode: DelayMode, delay: number, exec: () => Observable<Data>): Promise<Data> {\r\n const channel = this.ensureChannel<Data>(key);\r\n const promise = new Promise<Data>((resolve, reject) => {\r\n channel.waiters.push({ resolve, reject });\r\n });\r\n\r\n channel.lastExec = exec;\r\n\r\n if (delay <= 0) {\r\n this.startExecution(channel);\r\n } else {\r\n channel.subject.next({ mode, delay, exec });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * Cancels scheduled/running tasks for a key.\r\n * All pending `Promise`s will be rejected with `AbortError` (or the provided reason).\r\n *\r\n * @param key channel key\r\n * @param reason cancellation reason (defaults to `AbortError('aborted')`)\r\n */\r\n cancel(key: string, reason: unknown = new AbortError()): void {\r\n const ch = this.channels.get(key);\r\n\r\n if (!ch) {\r\n return;\r\n }\r\n\r\n ch.timerSub?.unsubscribe();\r\n ch.inflight?.unsubscribe();\r\n ch.inflight = undefined;\r\n ch.subject.complete();\r\n\r\n const waiters = ch.waiters.splice(0);\r\n\r\n waiters.forEach((w) => w.reject(reason));\r\n\r\n this.channels.delete(key);\r\n }\r\n\r\n /**\r\n * Cancels all channels and their pending tasks.\r\n *\r\n * @param reason cancellation reason (defaults to `AbortError('aborted')`)\r\n */\r\n cancelAll(reason: unknown = new AbortError()) {\r\n for (const key of Array.from(this.channels.keys())) {\r\n this.cancel(key, reason);\r\n }\r\n }\r\n\r\n private ensureChannel<Type>(key: string): Channel<Type> {\r\n let ch = this.channels.get(key) as Channel<Type> | undefined;\r\n\r\n if (ch) {\r\n return ch;\r\n }\r\n\r\n const subject = new Subject<ScheduledTask<Type>>();\r\n\r\n ch = { subject, waiters: [] };\r\n this.channels.set(key, ch as Channel<Type>);\r\n\r\n const debounced$ = subject.pipe(\r\n filter((t) => t.mode === 'debounce'),\r\n rxDebounce((t) => timer(t.delay)),\r\n tap(() => this.startExecution(ch!)),\r\n );\r\n\r\n const throttled$ = subject.pipe(\r\n filter((t) => t.mode === 'throttle'),\r\n rxThrottle((t) => timer(t.delay), { leading: false, trailing: true }),\r\n tap(() => this.startExecution(ch!)),\r\n );\r\n\r\n ch.timerSub = merge(debounced$, throttled$)\r\n .pipe(finalize(() => this.channels.delete(key)))\r\n .subscribe();\r\n\r\n return ch;\r\n }\r\n\r\n private startExecution<T>(ch: Channel<T>) {\r\n const exec = ch.lastExec;\r\n\r\n if (!exec) {\r\n return;\r\n }\r\n\r\n ch.inflight?.unsubscribe();\r\n ch.inflight = exec().subscribe({\r\n next: (val) => {\r\n const waiters = ch.waiters.splice(0);\r\n\r\n waiters.forEach((w) => w.resolve(val));\r\n },\r\n error: (err) => {\r\n const waiters = ch.waiters.splice(0);\r\n\r\n waiters.forEach((w) => w.reject(err));\r\n },\r\n complete: () => (ch.inflight = undefined),\r\n });\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { computed, inject, Signal, signal } from '@angular/core';\r\nimport { map, Observable } from 'rxjs';\r\nimport { finalize, tap } from 'rxjs/operators';\r\n\r\nimport { AnyDict, AnyType, fillUrlWithParams, RestMethods } from '@reforgium/internal';\r\n\r\nimport { Serializer, SERIALIZER_CONFIG } from '../../serializer';\r\nimport {\r\n CacheStrategy,\r\n CallArgs,\r\n CallConfig,\r\n DelayMode,\r\n ExecArgs,\r\n GetCallConfig,\r\n PayloadData,\r\n ResourceEntry,\r\n ResourceRoutesMap,\r\n ResourceStatus,\r\n ResourceStoreOptions,\r\n SimpleDict,\r\n} from './resource.models';\r\nimport { KeyedScheduler } from './resource.scheduler';\r\nimport { buildKey, CacheMissError, isAbort, joinUrl } from './resource.utils';\r\n\r\n/**\r\n * Store for REST resources with caching and request deduplication.\r\n *\r\n * Provides reactive access to current value, status, and error;\r\n * supports cache strategies (cache-first / cache-only / network-first),\r\n * TTL, delays (debounce/throttle), request cancellation, and auto-serialization of query/payload.\r\n *\r\n * Example:\r\n * ```ts\r\n * const store = new ResourceStore({ GET: '/users/:id' }, { baseUrl: '/api', ttlMs: 30_000 });\r\n *\r\n * effect(() => {\r\n * if (store.loading()) showSpinner();\r\n * if (store.error()) showError(store.error());\r\n * const user = store.value();\r\n * });\r\n *\r\n * await store.get({ params: { id: '42' }, query: { expand: ['roles'] } }, { strategy: 'cache-first', dedupe: true });\r\n * ```\r\n */\r\nexport class ResourceStore<Data> {\r\n private readonly http = inject(HttpClient);\r\n private readonly serializer = new Serializer<AnyDict>(inject(SERIALIZER_CONFIG, { optional: true }) ?? {});\r\n\r\n #value = signal<Data | null>(null);\r\n #status = signal<ResourceStatus>('idle');\r\n #error = signal<unknown | null>(null);\r\n\r\n /**\r\n * Current resource value.\r\n * Returns `null` if no data yet or the request failed.\r\n */\r\n value: Signal<Data | null> = this.#value.asReadonly();\r\n\r\n /**\r\n * Current loading status of the resource: `idle | loading | stale | success | error`.\r\n */\r\n status: Signal<ResourceStatus> = this.#status.asReadonly();\r\n\r\n /**\r\n * Last error (if any). Otherwise `null`.\r\n */\r\n error: Signal<unknown | null> = this.#error.asReadonly();\r\n\r\n /**\r\n * Convenience loading flag: `true` when `loading` or `stale`.\r\n * Useful for spinners and disabling buttons.\r\n */\r\n loading: Signal<boolean> = computed(() => ['loading', 'stale'].includes(this.#status()));\r\n\r\n private readonly routes: ResourceRoutesMap;\r\n private readonly opts: ResourceStoreOptions;\r\n private readonly entries = new Map<string, ResourceEntry<unknown>>();\r\n private readonly scheduler = new KeyedScheduler();\r\n\r\n /**\r\n * @param routes Map of path templates for methods (`GET/POST/...` → `/users/:id`)\r\n * @param opts Global options (baseUrl, ttlMs, delay, delayMode, presetQueries/payload, etc.)\r\n */\r\n constructor(routes: ResourceRoutesMap, opts: ResourceStoreOptions = {}) {\r\n this.routes = routes;\r\n this.opts = opts;\r\n }\r\n\r\n /**\r\n * Perform a GET request.\r\n *\r\n * Supports cache strategies (`strategy`), TTL (`ttlMs`), revalidation,\r\n * deduplication (`dedupe`), and response parsing (`parseResponse`).\r\n *\r\n * @param args { params, query }\r\n * @param cfg Call settings (strategy, ttlMs, revalidate, parseResponse, delay, delayMode, dedupe, promote)\r\n * @returns Deserialized `Data`\r\n */\r\n async get<\r\n Param extends SimpleDict = SimpleDict,\r\n Query extends PayloadData = PayloadData,\r\n Response extends AnyType = Data,\r\n >(args: CallArgs<Param, Query, never>, cfg: GetCallConfig<Response, Data> = {}): Promise<Data> {\r\n const url = this.buildUrl('GET', args);\r\n const key = buildKey('GET', url);\r\n const query = this.prepareQuery(args);\r\n\r\n const entry = this.ensureEntry<Data>(key);\r\n const strategy: CacheStrategy = cfg.strategy ?? 'network-first';\r\n const ttlMs = cfg.ttlMs ?? this.opts.ttlMs ?? 0;\r\n const fresh = entry.updatedAt != null && Date.now() - entry.updatedAt < ttlMs;\r\n\r\n if (cfg.dedupe && entry.inflight) {\r\n return entry.inflight as unknown as Promise<Data>;\r\n }\r\n\r\n if (strategy === 'cache-only') {\r\n if (fresh && entry.data != null) {\r\n this.promoteCurrent(entry, cfg.promote);\r\n\r\n return entry.data as Data;\r\n }\r\n\r\n throw new CacheMissError(key);\r\n }\r\n\r\n if (strategy === 'cache-first' && fresh && !cfg.revalidate && entry.data != null) {\r\n this.promoteCurrent(entry, cfg.promote);\r\n\r\n return entry.data as Data;\r\n }\r\n\r\n const delay = cfg.delay ?? this.opts.delay ?? 0;\r\n const mode: DelayMode = cfg.delayMode ?? this.opts.delayMode ?? 'debounce';\r\n\r\n entry.status = strategy === 'cache-first' && fresh && entry.data != null ? 'stale' : 'loading';\r\n this.promoteCurrent(entry, cfg.promote);\r\n\r\n const task = this.scheduler.schedule(\r\n key,\r\n mode,\r\n delay,\r\n this.exec$({\r\n req$: this.http.get<Response>(url, { params: query }),\r\n entry,\r\n promote: cfg.promote,\r\n parseFn: cfg.parseResponse,\r\n }),\r\n );\r\n\r\n cfg.dedupe && (entry.inflight = task);\r\n void task.catch((e) => {\r\n if (!isAbort(e)) {\r\n throw e;\r\n }\r\n });\r\n\r\n return task;\r\n }\r\n\r\n /**\r\n * POST request.\r\n *\r\n * @param args { params, query, payload }\r\n * @param cfg Call settings (parseResponse, delay, delayMode, dedupe, promote)\r\n * @returns API response (by default — as returned by the server)\r\n */\r\n async post<\r\n Param extends SimpleDict = SimpleDict,\r\n Payload extends PayloadData = PayloadData,\r\n Query extends PayloadData = PayloadData,\r\n Response extends AnyType = AnyType,\r\n >(args: CallArgs<Param, Query, Payload>, cfg: CallConfig<Response, Response> = {}): Promise<Response> {\r\n return await this.callApi<Param, Payload, Query, Response>('POST', args, cfg);\r\n }\r\n\r\n /**\r\n * PUT request (full resource update).\r\n *\r\n * @param args { params, query, payload }\r\n * @param cfg Call settings (parseResponse, delay, delayMode, dedupe, promote)\r\n * @returns API response (by default — as returned by the server)\r\n */\r\n async put<\r\n Param extends SimpleDict = SimpleDict,\r\n Payload extends PayloadData = PayloadData,\r\n Query extends SimpleDict = SimpleDict,\r\n Response extends AnyType = AnyType,\r\n >(args: CallArgs<Param, Query, Partial<Payload>>, cfg: CallConfig<Response, Response> = {}): Promise<Response> {\r\n return await this.callApi<Param, Payload, Query, Response>('PUT', args, cfg);\r\n }\r\n\r\n /**\r\n * PATCH request (partial update).\r\n *\r\n * @param args { params, query, payload }\r\n * @param cfg Call settings (parseResponse, delay, delayMode, dedupe, promote)\r\n * @returns API response (by default — as returned by the server)\r\n */\r\n async patch<\r\n Param extends SimpleDict = SimpleDict,\r\n Payload extends PayloadData = PayloadData,\r\n Query extends SimpleDict = SimpleDict,\r\n Response extends AnyType = AnyType,\r\n >(args: CallArgs<Param, Query, Partial<Payload>>, cfg: CallConfig<Response, Response> = {}): Promise<Response> {\r\n return await this.callApi<Param, Payload, Query, Response>('PATCH', args, cfg);\r\n }\r\n\r\n /**\r\n * DELETE request.\r\n *\r\n * @param args { params, query, payload }\r\n * @param cfg Call settings (parseResponse, delay, delayMode, dedupe, promote)\r\n * @returns API response (by default — as returned by the server)\r\n */\r\n async delete<\r\n Param extends SimpleDict = SimpleDict,\r\n Payload extends PayloadData = PayloadData,\r\n Query extends SimpleDict = SimpleDict,\r\n Response extends AnyType = AnyType,\r\n >(args: CallArgs<Param, Query, Payload>, cfg: CallConfig<Response, Response> = {}): Promise<Response> {\r\n return await this.callApi<Param, Payload, Query, Response>('DELETE', args, cfg);\r\n }\r\n\r\n /**\r\n * Cancel scheduled/running requests for a specific call.\r\n *\r\n * @param method HTTP method\r\n * @param args Arguments used to build the URL (params, query)\r\n * @param reason Cancellation reason (optional)\r\n */\r\n abort<Param extends SimpleDict = SimpleDict, Query extends PayloadData = PayloadData>(\r\n method: RestMethods,\r\n args: CallArgs<Param, Query>,\r\n reason?: string | Error,\r\n ) {\r\n const url = this.buildUrl(method, args);\r\n const key = buildKey(method, url);\r\n\r\n this.scheduler.cancel?.(key, reason);\r\n }\r\n\r\n /**\r\n * Cancel all scheduled/running requests for this store.\r\n *\r\n * @param reason Cancellation reason (optional)\r\n */\r\n abortAll(reason?: string | Error) {\r\n this.scheduler.cancelAll?.(reason);\r\n }\r\n\r\n private ensureEntry<R>(key: string): ResourceEntry<R> {\r\n let entry = this.entries.get(key) as ResourceEntry<R> | undefined;\r\n\r\n if (!entry) {\r\n entry = { data: null, status: 'idle', error: null, updatedAt: null };\r\n this.entries.set(key, entry as ResourceEntry<unknown>);\r\n }\r\n\r\n return entry;\r\n }\r\n\r\n private async callApi<\r\n Param extends SimpleDict = SimpleDict,\r\n Payload extends PayloadData = PayloadData,\r\n Query extends SimpleDict = SimpleDict,\r\n Response extends AnyType = AnyType,\r\n >(\r\n method: RestMethods,\r\n args: CallArgs<Param, Query, Partial<Payload>>,\r\n config: CallConfig<Response, Response> = {},\r\n ): Promise<Response> {\r\n const url = this.buildUrl(method, args);\r\n const key = buildKey(method, url);\r\n const query = this.prepareQuery(args);\r\n const payload = { ...(this.opts.presetPayload || {}), ...(args.payload || {}) };\r\n const serializedPayload = this.serializer.serialize(payload);\r\n\r\n const entry = this.ensureEntry<Response>(key);\r\n\r\n if (config.dedupe && entry.inflight) {\r\n return entry.inflight as Promise<Response>;\r\n }\r\n\r\n const delay = config.delay ?? this.opts.delay ?? 0;\r\n const mode: DelayMode = config.delayMode ?? this.opts.delayMode ?? 'debounce';\r\n\r\n entry.status = 'loading';\r\n this.promoteCurrent(entry, config.promote);\r\n\r\n let req$: Observable<Response>;\r\n\r\n if (method === 'DELETE') {\r\n req$ = this.http.delete<Response>(url, { body: serializedPayload, params: query });\r\n } else {\r\n // @ts-ignore\r\n req$ = this.http[method.toLowerCase()]<Response>(url, serializedPayload, { params: query });\r\n }\r\n\r\n const task = this.scheduler.schedule<Response>(\r\n key,\r\n mode,\r\n delay,\r\n this.exec$<Response, Response>({ req$, entry, promote: config.promote, parseFn: config.parseResponse }),\r\n );\r\n\r\n config.dedupe && (entry.inflight = task);\r\n void task.catch((e) => {\r\n if (!isAbort(e)) {\r\n throw e;\r\n }\r\n });\r\n\r\n return task;\r\n }\r\n\r\n private buildUrl(method: RestMethods, args: CallArgs) {\r\n const tpl = this.routes[method];\r\n\r\n if (!tpl) {\r\n throw new Error(`${method} route not configured`);\r\n }\r\n\r\n const path = fillUrlWithParams(tpl, args.params);\r\n\r\n return joinUrl(this.opts.baseUrl, path);\r\n }\r\n\r\n private prepareQuery(args: CallArgs) {\r\n const mergedQuery = { ...(this.opts.presetQueries || {}), ...(args.query || {}) } as AnyDict;\r\n\r\n return this.serializer.serialize(mergedQuery) as SimpleDict;\r\n }\r\n\r\n private exec$ =\r\n <Response, Return = Data>({ req$, entry, promote = true, parseFn }: ExecArgs<Response, Return>) =>\r\n () =>\r\n req$.pipe(\r\n map((data) => (parseFn ? parseFn(data) : (data as unknown as Return))),\r\n tap({\r\n next: (data) => {\r\n promote && (entry.data = data);\r\n entry.status = 'success';\r\n entry.updatedAt = Date.now();\r\n entry.error = null;\r\n this.promoteCurrent(entry, promote);\r\n },\r\n error: (err) => {\r\n entry.error = err;\r\n entry.status = 'error';\r\n this.promoteCurrent(entry, promote);\r\n },\r\n }),\r\n finalize(() => {\r\n entry.inflight = undefined;\r\n this.promoteCurrent(entry, promote);\r\n }),\r\n );\r\n\r\n private promoteCurrent(entry: ResourceEntry<unknown>, promote = true) {\r\n if (!promote) {\r\n return;\r\n }\r\n\r\n this.#value.set((entry.data as Data) ?? null);\r\n this.#status.set(entry.status);\r\n this.#error.set(entry.error);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nimport { PaginatedDataStoreConfig } from '.';\r\n\r\nexport const PDS_CONFIG = new InjectionToken<PaginatedDataStoreConfig>('RE_PDS_CONFIG');\r\n","// noinspection ES6PreferShortImport\r\n\r\nimport { DestroyRef, inject, signal, WritableSignal } from '@angular/core';\r\n\r\nimport { AnyDict, concatArray, isNullable, PageableResponse, Query, QueryParams } from '@reforgium/internal';\r\n\r\nimport { LruCache } from '../../cache/storages/lru.storage';\r\nimport { isAbort, ResourceStore } from '../../stores/resource-store';\r\n\r\nimport { PaginatedDataConfig, PDS_CONFIG } from '.';\r\n\r\ntype PaginationType = {\r\n page?: number;\r\n first?: number | null;\r\n rows?: number | null;\r\n sortField?: string | string[] | null;\r\n sortOrder?: number | null;\r\n};\r\n\r\n/**\r\n * Store for paginated data (tables/lists) with per-page cache and unified requests.\r\n *\r\n * Provides:\r\n * - reactive signals: `items`, `loading`, `cached`;\r\n * - methods to control page/size/filters/sorting;\r\n * - optional LRU cache by pages;\r\n * - configurable transport (GET/POST/PATCH/…).\r\n *\r\n * Example:\r\n * ```ts\r\n * const ds = new PaginatedDataStore<User>('/users', { method: 'GET', hasCache: true });\r\n * await ds.updatePage(0); // load the first page\r\n * effect(() => console.log(ds.items(), ds.loading()));\r\n * ```\r\n */\r\nexport class PaginatedDataStore<ItemsType extends object, FilterType = unknown> {\r\n private readonly defaultConfig = inject(PDS_CONFIG);\r\n\r\n #transport!: ResourceStore<PageableResponse<ItemsType> | ItemsType[]>;\r\n #cache: LruCache<number, ItemsType[]>;\r\n\r\n /** Current page data (reactive). */\r\n items: WritableSignal<ItemsType[]> = signal<ItemsType[]>([]);\r\n /** Merged cache of pages (flat list) — handy for search/export. */\r\n cached = signal<ItemsType[]>([]);\r\n /** Loading flag of the current operation. */\r\n loading = signal(false);\r\n\r\n /** Current filters (applied to requests). */\r\n filters: Partial<FilterType> = {};\r\n /** Current sorting (`field,asc|desc`). */\r\n sort?: string | ReadonlyArray<string>;\r\n\r\n /** Current page index (0-based). */\r\n page = 0;\r\n /** Default page size. */\r\n pageSize = 20;\r\n /** Total number of elements reported by the server. */\r\n totalElements = 0;\r\n\r\n /**\r\n * @param route Resource URL pattern (e.g., `'/users'`)\r\n * @param config Store behavior: method, cache, request/response parsers, debounce, presets, etc.\r\n */\r\n constructor(\r\n private route: string,\r\n public config: PaginatedDataConfig<ItemsType, FilterType> = {},\r\n ) {\r\n this.#cache = new LruCache<number, ItemsType[]>(config.cacheSize!);\r\n this.applyConfig(config);\r\n this.applyPresetMeta();\r\n this.initTransport();\r\n\r\n inject(DestroyRef).onDestroy(() => this.destroy());\r\n }\r\n\r\n /** Force reload current data (with the same page/filters/sort). */\r\n refresh() {\r\n return this.#fetchItems({});\r\n }\r\n\r\n /**\r\n * Switch page with a request.\r\n * If cache is enabled and the page is present in LRU — returns it from cache.\r\n * @param page page index (0-based)\r\n * @param ignoreCache ignore cache and fetch from network\r\n */\r\n updatePage = (page = this.page, ignoreCache = false) => {\r\n if (this.config.hasCache && this.#cache.has(page) && !ignoreCache) {\r\n const cached = this.#cache.get(page)!;\r\n\r\n this.items.set(cached);\r\n this.page = page;\r\n\r\n return Promise.resolve(cached);\r\n } else {\r\n return this.#fetchItems({ page });\r\n }\r\n };\r\n\r\n /**\r\n * Change page size (will go to the first page) and fetch.\r\n * @param size new size (rows per page)\r\n */\r\n updatePageSize = (size = this.pageSize) => {\r\n return this.#fetchItems({ page: 0, size });\r\n };\r\n\r\n /**\r\n * Update filters (goes to the first page) and fetch.\r\n * Previous cache is cleared.\r\n */\r\n updateFilters = (filters: Partial<FilterType>) => {\r\n this.#cache.clear();\r\n this.cached.set([]);\r\n\r\n return this.#fetchItems({ page: 0, filters: { ...this.filters, ...filters } });\r\n };\r\n\r\n /**\r\n * Update state from table events (PrimeNG, etc.) and fetch.\r\n * Supports `page/first/rows/sortField/sortOrder`.\r\n */\r\n updateQuery = ({ page: pageNum, first = 0, rows = 0, sortOrder, sortField }: PaginationType) => {\r\n const page = (pageNum ?? (first && rows && Math.floor(first / rows))) || 0;\r\n const sort = sortField ? `${sortField},${sortOrder === 1 ? 'asc' : 'desc'}` : '';\r\n\r\n return this.#fetchItems({ page, sort });\r\n };\r\n\r\n /**\r\n * Set filters from scratch (goes to the first page and resets sorting) and fetch.\r\n * Useful for quick presets.\r\n */\r\n setFilters = (filters: Partial<FilterType> = {}) => {\r\n this.#cache.clear();\r\n this.cached.set([]);\r\n\r\n return this.#fetchItems({ page: 0, filters, sort: undefined });\r\n };\r\n\r\n /**\r\n * Change resource route (resets page, cache, and presets) without fetching.\r\n * Useful when one store should work with different endpoints.\r\n */\r\n updateRoute = (route: string) => {\r\n this.route = route;\r\n this.page = 0;\r\n this.pageSize = 20;\r\n this.totalElements = 0;\r\n this.#cache.clear();\r\n this.cached.set([]);\r\n this.initTransport();\r\n };\r\n\r\n /**\r\n * Update store config on the fly (without re-creation).\r\n * Does not trigger loading automatically.\r\n */\r\n updateConfig = (config: PaginatedDataConfig<ItemsType>) => {\r\n this.config = { ...this.config, ...config };\r\n this.applyPresetMeta();\r\n };\r\n\r\n /**\r\n * Copy configuration and presets from another store of the same type.\r\n */\r\n copy(helper: PaginatedDataStore<ItemsType, FilterType>) {\r\n this.applyConfig(helper.config);\r\n this.applyPresetMeta();\r\n }\r\n\r\n /** Clean up resources and cancel active requests. Called automatically onDestroy. */\r\n destroy() {\r\n try {\r\n this.#transport?.abortAll?.('PaginatedDataStore destroyed');\r\n } catch (e: unknown) {\r\n if (!isAbort(e)) {\r\n throw e;\r\n }\r\n }\r\n }\r\n\r\n #fetchItems = async ({\r\n page = this.page,\r\n size = this.pageSize,\r\n sort = this.sort,\r\n filters = this.filters,\r\n }: QueryParams<FilterType>) => {\r\n const query = this.parseQuery({ page, size, sort, filters });\r\n\r\n this.loading.set(true);\r\n this.#transport.abortAll();\r\n\r\n try {\r\n const response = await this.runTransport(filters, query);\r\n const parsed = this.parseResponseData(response);\r\n\r\n this.page = page;\r\n this.sort = sort;\r\n this.filters = filters;\r\n this.pageSize = parsed.pageable?.pageSize || size;\r\n this.totalElements = parsed.totalElements;\r\n this.items.set(parsed.content);\r\n this.updateCache(parsed.content);\r\n\r\n return parsed.content;\r\n } catch (e) {\r\n if (isAbort(e)) {\r\n return;\r\n }\r\n\r\n throw e;\r\n } finally {\r\n this.loading.set(false);\r\n }\r\n };\r\n\r\n private initTransport() {\r\n this.#transport = new ResourceStore<PageableResponse<ItemsType> | ItemsType[]>(\r\n { [this.config.method || 'GET']: this.route },\r\n {\r\n delay: this.config.debounceTime,\r\n delayMode: 'debounce',\r\n presetQueries: { page: this.page, size: this.pageSize, sort: this.sort },\r\n presetPayload: this.filters,\r\n },\r\n );\r\n }\r\n\r\n private async runTransport(payload: Partial<FilterType>, query: Query) {\r\n if (this.config.method === 'GET') {\r\n return this.#transport.get<never, AnyDict>({ query }, { promote: false, dedupe: true });\r\n }\r\n\r\n const method = this.config.method?.toLowerCase() || 'post';\r\n\r\n // @ts-ignore\r\n return this.#transport[method]<never, AnyDict, Partial<FilterType>, PageableResponse<ItemsType> | ItemsType[]>(\r\n { query, payload },\r\n { promote: false, dedupe: true },\r\n );\r\n }\r\n\r\n private parseQuery({ page = 0, size, sort, filters }: QueryParams<FilterType>) {\r\n const method = this.config.method || 'GET';\r\n const requestPayload = { page, size, ...(method === 'GET' ? filters : {}) };\r\n const rawQueries = this.config.parseRequest?.({ ...requestPayload, sort }) || requestPayload;\r\n const queries: Query = {};\r\n\r\n Object.entries(rawQueries).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n queries[key] = concatArray(value, 'comma');\r\n } else if (!isNullable(value)) {\r\n queries[key] = value;\r\n }\r\n });\r\n sort && (queries['sort'] = sort);\r\n\r\n return queries;\r\n }\r\n\r\n private parseResponseData = (data: PageableResponse<ItemsType> | ItemsType[]): PageableResponse<ItemsType> => {\r\n if (this.config?.parseResponse) {\r\n return this.config.parseResponse(data);\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n return this.parseFlatArray(data);\r\n }\r\n\r\n return data as PageableResponse<ItemsType>;\r\n };\r\n\r\n private updateCache = (data: ItemsType[]) => {\r\n if (this.config.hasCache) {\r\n this.#cache.set(this.page, data);\r\n }\r\n\r\n this.cached.set(Array.from(this.#cache.values()).flat());\r\n };\r\n\r\n private parseFlatArray(data: ItemsType[]): PageableResponse<ItemsType> {\r\n return { content: data, totalElements: data.length };\r\n }\r\n\r\n private applyConfig(config: PaginatedDataConfig<ItemsType, FilterType>) {\r\n this.config = {\r\n ...config,\r\n method: config.method || this.defaultConfig.defaultMethod || 'POST',\r\n presetQuery: config.presetQuery || this.defaultConfig.defaultQuery,\r\n parseRequest: config.parseRequest || this.defaultConfig.defaultParseRequest,\r\n debounceTime: config.debounceTime || 0,\r\n hasCache: config.hasCache === undefined ? this.defaultConfig.defaultHasCache : config.hasCache,\r\n cacheSize: config.cacheSize || this.defaultConfig.defaultCacheSize || 5,\r\n };\r\n }\r\n\r\n private applyPresetMeta() {\r\n this.filters = this.config.presetFilters || {};\r\n this.pageSize = this.config.presetQuery?.pageSize || 20;\r\n this.page = this.config.presetQuery?.page || 0;\r\n this.sort = this.config.presetQuery?.sort;\r\n }\r\n}\r\n","import { computed, effect, EffectRef, signal, untracked } from '@angular/core';\r\n\r\nimport { AnyDict } from '@reforgium/internal';\r\n\r\nimport { LruCache, StorageInterface, StorageStrategy, storageStrategy } from '../../cache';\r\n// noinspection ES6PreferShortImport\r\nimport { PaginatedDataStore } from '../../stores/paginated-data-store';\r\nimport { DictStoreConfig, FilterType, ValueType } from './dict.models';\r\n\r\n/**\r\n * Dictionary store (select/options) with local LRU cache and optional persistence.\r\n *\r\n * Provides:\r\n * - reactive `items` (current list) and `options` (label/value),\r\n * - local cache filtering (`fixed: true`) or server-side search by name (`fixed: false`),\r\n * - preload and restore cache from `storage` (`localStorage/session/LRU`),\r\n * - smooth integration with `PaginatedDataStore` for server fetching.\r\n *\r\n * Example:\r\n * ```ts\r\n * const dict = new DictStore<Country>('/countries', 'countries', { labelKey: 'name', valueKey: 'code' });\r\n * dict.search('ki'); // filters locally (fixed=true) or goes to server (fixed=false)\r\n * effect(() => console.log(dict.options())); // [{label:'Kyrgyzstan', value:'KG'}, ...]\r\n * ```\r\n */\r\nexport class DictStore<Type extends AnyDict> {\r\n static readonly MAX_CACHE_SIZE = 400;\r\n\r\n #helper: PaginatedDataStore<Type, FilterType>;\r\n #lru = new LruCache<string, Type>(DictStore.MAX_CACHE_SIZE);\r\n #effectRefs: EffectRef[] = [];\r\n\r\n private readonly fixed: boolean = true;\r\n private readonly labelKey: keyof Type & string;\r\n private readonly valueKey: keyof Type & string;\r\n private readonly maxOptionsSize?: number;\r\n private readonly storage?: StorageInterface<string, Type[]>;\r\n\r\n /**\r\n * Search text.\r\n * With `fixed: true` filters the local cache; with `fixed: false` triggers server search.\r\n */\r\n searchText = signal<string>('');\r\n\r\n /**\r\n * Additional filters for server request (or presets).\r\n */\r\n filters = signal<AnyDict>({});\r\n\r\n private cachedItems = signal<readonly Type[]>([]);\r\n\r\n /**\r\n * Current list of dictionary items.\r\n * Source — local cache (fixed=true) or data from `PaginatedDataStore`.\r\n */\r\n items = computed<readonly Type[]>(() => {\r\n const cached = this.cachedItems();\r\n\r\n if (!this.fixed) {\r\n return this.searchText() || !cached.length ? this.#helper.items() : cached;\r\n }\r\n\r\n return cached.length ? this.filterLocal() : this.#helper.items();\r\n });\r\n\r\n /**\r\n * Ready-to-use dropdown options: `{ label, value }`.\r\n * Respects `maxOptionsSize` for truncating the list.\r\n */\r\n options = computed(() => {\r\n const options = this.items().map((it) => ({ label: String(it[this.labelKey] ?? ''), value: it[this.valueKey] }));\r\n\r\n return this.maxOptionsSize ? options.slice(0, this.maxOptionsSize) : options;\r\n });\r\n private _lastPromise: Promise<unknown> | null = null;\r\n private _armed = false;\r\n\r\n // todo add i18n support\r\n /**\r\n * @param apiUrl dictionary endpoint (e.g., `'/api/dicts/countries'`)\r\n * @param storageKey key for saving cache in the selected strategy\r\n * @param cfg behavior (fixed/search, parsers, label/value keys, cache strategy, etc.)\r\n */\r\n constructor(\r\n private apiUrl: string,\r\n private storageKey: string,\r\n {\r\n method,\r\n autoLoad = true,\r\n presetFilters,\r\n parseResponse,\r\n parseRequest,\r\n debounceTime,\r\n fixed = true,\r\n maxOptionsSize,\r\n labelKey = 'name',\r\n valueKey = 'code',\r\n cacheStrategy = 'persist',\r\n }: DictStoreConfig<Type>,\r\n ) {\r\n this.#helper = new PaginatedDataStore<Type, FilterType>(this.apiUrl, {\r\n method: method,\r\n hasCache: false,\r\n presetFilters: { name: '', ...presetFilters },\r\n parseResponse: parseResponse,\r\n parseRequest: parseRequest,\r\n debounceTime: debounceTime,\r\n });\r\n this.fixed = fixed;\r\n this.labelKey = labelKey;\r\n this.valueKey = valueKey;\r\n this.maxOptionsSize = maxOptionsSize;\r\n this._armed = autoLoad;\r\n\r\n if (cacheStrategy !== 'memory') {\r\n this.storage = storageStrategy<string, Type[]>(cacheStrategy as StorageStrategy);\r\n }\r\n\r\n this.restoreFromStorage();\r\n\r\n this.#effectRefs.push(\r\n effect(() => {\r\n const incoming = this.#helper.items();\r\n\r\n if (incoming.length === 0) {\r\n return;\r\n }\r\n\r\n untracked(() => this.mergeIntoCache(incoming));\r\n }),\r\n );\r\n\r\n this.#effectRefs.push(\r\n effect(() => {\r\n if (!this._armed) {\r\n return;\r\n }\r\n\r\n const rest = this.filters();\r\n\r\n if (!this.fixed) {\r\n const query = this.searchText().trim();\r\n\r\n this._lastPromise = untracked(() => this.#helper.updateFilters({ name: query, ...rest }));\r\n } else if (!this.cachedItems().length) {\r\n this._lastPromise = untracked(() => this.#helper.updateFilters({ name: '', ...rest }));\r\n }\r\n }),\r\n );\r\n }\r\n\r\n /** Восстановить кэш из выбранного хранилища (`persist`/`session`/`lru`/`memory`). */\r\n restoreCache() {\r\n this.restoreFromStorage();\r\n }\r\n\r\n /**\r\n * Установить запрос и фильтры.\r\n * При `fixed: false` инициирует серверный поиск; при `fixed: true` — локальную фильтрацию.\r\n */\r\n search = (name = '', filters: AnyDict = {}) => {\r\n this._armed = true;\r\n this.searchText.set(name);\r\n this.filters.set(filters);\r\n };\r\n\r\n /**\r\n * Найти отображаемую метку по значению (обычно для обратного биндинга).\r\n * @returns строка метки или `undefined`, если не найдено\r\n */\r\n findLabel = (value: ValueType): string | undefined => {\r\n for (const item of this.cachedItems()) {\r\n if (item[this.valueKey] === value) {\r\n return String(item[this.labelKey] ?? undefined);\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Предзагрузить элементы словаря в локальный кэш.\r\n * Удобно для SSR/статических списков/быстрых пресетов.\r\n *\r\n * @param items список элементов\r\n * @param opts `{ replace?: true }` — полностью заменить текущий кэш\r\n */\r\n preload = (items: readonly Type[], opts?: { replace?: boolean }) => {\r\n opts?.replace && this.#lru.clear();\r\n let changed = false;\r\n\r\n for (const it of items) {\r\n const key = this.keyOf(it);\r\n\r\n if (!key) {\r\n continue;\r\n }\r\n\r\n const existed = this.#lru.has(key);\r\n\r\n this.#lru.set(key, it);\r\n !existed && (changed = true);\r\n }\r\n\r\n if (changed || opts?.replace) {\r\n const arr = this.#lru.toArray();\r\n\r\n this.cachedItems.set(arr);\r\n this.storage?.set(this.storageKey, arr.slice(0, DictStore.MAX_CACHE_SIZE));\r\n }\r\n };\r\n\r\n /** Освободить ресурсы и остановить внутренние эффекты. */\r\n dispose() {\r\n this.#effectRefs.forEach((e) => e.destroy());\r\n this.#effectRefs = [];\r\n }\r\n\r\n /** Синтаксический сахар для `using`/`Symbol.dispose`. */\r\n [Symbol.dispose]() {\r\n this.dispose();\r\n }\r\n\r\n private mergeIntoCache(items: Type[]) {\r\n let changed = 0;\r\n\r\n for (const it of items) {\r\n const key = this.keyOf(it);\r\n const before = this.#lru.has(key);\r\n\r\n this.#lru.set(key, it);\r\n !before && changed++;\r\n }\r\n\r\n if (changed > 0) {\r\n const arr = this.#lru.toArray();\r\n\r\n this.cachedItems.set(arr);\r\n this.storage?.set(this.storageKey, arr.slice(0, DictStore.MAX_CACHE_SIZE));\r\n }\r\n }\r\n\r\n private restoreFromStorage() {\r\n try {\r\n const array = this.storage?.get(this.storageKey);\r\n\r\n if (!array) {\r\n return;\r\n }\r\n\r\n for (const it of array) {\r\n const key = this.keyOf(it);\r\n\r\n this.#lru.set(key, it);\r\n }\r\n\r\n this.cachedItems.set(this.#lru.toArray());\r\n } catch {\r\n try {\r\n this.storage?.remove(this.storageKey);\r\n } catch {\r\n /* noop */\r\n }\r\n }\r\n }\r\n\r\n private filterLocal() {\r\n const list = this.cachedItems();\r\n const query = this.searchText().toLowerCase();\r\n\r\n if (!query) {\r\n return list;\r\n }\r\n\r\n const key = this.labelKey;\r\n const out: Type[] = [];\r\n\r\n for (let i = 0; i < list.length; i++) {\r\n const val = list[i][key];\r\n\r\n val.toLowerCase().includes(query) && out.push(list[i]);\r\n }\r\n\r\n return out;\r\n }\r\n\r\n private keyOf(it: Type) {\r\n const raw = it[this.valueKey] as unknown;\r\n\r\n if (raw == null) {\r\n return '';\r\n }\r\n\r\n return typeof raw === 'string' ? raw : String(raw);\r\n }\r\n}\r\n","import { computed, signal } from '@angular/core';\r\n\r\nimport { AnyDict } from '@reforgium/internal';\r\n\r\nimport { DictLocalConfig, ValueType } from './dict.models';\r\n\r\nexport class DictLocalStore<Type extends AnyDict> {\r\n items = signal<readonly Type[]>([]);\r\n #draftItems = signal<readonly Type[]>([]);\r\n\r\n /**\r\n * Ready-to-use options for dropdowns: `{ label, value }`.\r\n * Respects `maxOptionsSize` to truncate the list.\r\n */\r\n options = computed(() => {\r\n const options = this.#draftItems().map((it) => ({\r\n label: String(it[this.labelKey] ?? ''),\r\n value: it[this.valueKey],\r\n }));\r\n\r\n return this.maxOptionsSize ? options.slice(0, this.maxOptionsSize) : options;\r\n });\r\n\r\n private readonly labelKey: keyof Type & string;\r\n private readonly valueKey: keyof Type & string;\r\n private readonly maxOptionsSize?: number;\r\n\r\n constructor(items: Type[], config?: DictLocalConfig<Type>) {\r\n this.labelKey = config?.labelKey ?? 'label';\r\n this.valueKey = config?.valueKey ?? 'value';\r\n this.maxOptionsSize = config?.maxOptionsSize ?? 1000;\r\n\r\n this.items.set(items);\r\n this.#draftItems.set(items);\r\n }\r\n\r\n /**\r\n * No-op method for API compatibility with DictStore.\r\n */\r\n restoreCache() {}\r\n\r\n /**\r\n * Find display label by value (usually for reverse binding).\r\n * @returns label string or `undefined` if not found\r\n */\r\n findLabel = (value: ValueType): string | undefined => {\r\n for (const item of this.items()) {\r\n if (item[this.valueKey] === value) {\r\n return String(item[this.labelKey] ?? undefined);\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n search = (name = '') => {\r\n const items = this.items();\r\n\r\n if (name?.length) {\r\n this.#draftItems.set(\r\n items.filter((item) => String(item[this.labelKey]).toLowerCase().includes(name.toLowerCase())),\r\n );\r\n } else {\r\n this.#draftItems.set(items);\r\n }\r\n };\r\n\r\n preload = (items: readonly Type[], opts?: { replace?: boolean }) => {\r\n if (opts?.replace) {\r\n this.items.set(items);\r\n this.#draftItems.set(items);\r\n } else {\r\n const patch = [...this.items(), ...items] as readonly Type[];\r\n\r\n this.items.set(patch);\r\n this.#draftItems.set(patch);\r\n }\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["rxDebounce","rxThrottle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reforgium-statum.mjs","sources":["../../../../libs/statum/src/serializer/serializer.helpers.ts","../../../../libs/statum/src/serializer/serializer.ts","../../../../libs/statum/src/serializer/serializer.provider.ts","../../../../libs/statum/src/cache/storages/lru.storage.ts","../../../../libs/statum/src/cache/storages/local.storage.ts","../../../../libs/statum/src/cache/storages/memory.storage.ts","../../../../libs/statum/src/cache/storages/session.storage.ts","../../../../libs/statum/src/cache/storage-strategy/storage.strategy.ts","../../../../libs/statum/src/stores/resource-store/resource.utils.ts","../../../../libs/statum/src/stores/resource-store/resource.scheduler.ts","../../../../libs/statum/src/stores/resource-store/resource.store.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.provider.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.store.ts","../../../../libs/statum/src/stores/dict-store/dict.store.ts","../../../../libs/statum/src/stores/dict-store/dict-local.store.ts","../../../../libs/statum/src/reforgium-statum.ts"],"sourcesContent":["import { AnyType, formatDate } from '@reforgium/internal';\r\n\r\n// noinspection ES6PreferShortImport\r\nimport { SerializerConfig } from './serialize.models';\r\n\r\nexport const serializeString = (config: SerializerConfig, value: AnyType) =>\r\n config.mapString.format?.(value) ?? (config.mapString.trim ? value.trim() : value);\r\n\r\nexport const serializeNumber = (config: SerializerConfig, value: AnyType) =>\r\n config.mapNumber.format?.(value) ?? Number(value);\r\n\r\nexport const serializeBoolean = (config: SerializerConfig, value: AnyType) =>\r\n config.mapBoolean.format?.(value) ?? (value ? (config.mapBoolean.true ?? true) : (config.mapBoolean.false ?? false));\r\n\r\nexport const serializeDate = (config: SerializerConfig, value: AnyType) =>\r\n config.mapDate.format?.(value) ?? formatDate(value, config.mapDate.dateFormat);\r\n","import { AnyDict, AnyType } from '@reforgium/internal';\r\nimport {\r\n formatDate,\r\n isDatePeriod,\r\n isNullable,\r\n isNumber,\r\n isObject,\r\n makeQuery,\r\n parseQueryArray,\r\n parseToDate,\r\n parseToDatePeriod,\r\n} from '@reforgium/internal';\r\n\r\nimport { DataType, SerializedType, SerializerConfig } from './serialize.models';\r\nimport { serializeBoolean, serializeDate, serializeNumber, serializeString } from './serializer.helpers';\r\n\r\n/**\r\n * Universal serializer/deserializer for values used in forms, filters, and DTOs.\r\n *\r\n * Supports types: `string | number | boolean | Date | [Date, Date] (period) | array | object | nullable`.\r\n * Capabilities:\r\n * - normalize values according to config (trim strings, parse numbers from strings, boolean strings, etc.),\r\n * - transform date periods into paired keys (`from/to`) or a single joined string,\r\n * - build/parse a query string (or JSON) to and from an object.\r\n *\r\n * Example:\r\n * ```ts\r\n * type Filters = { q?: string; active?: boolean; created?: [Date, Date] | null };\r\n * const s = new Serializer<Filters>({\r\n * mapPeriod: { transformMode: { mode: 'split', dateFromKeyPostfix: 'From', dateToKeyPostfix: 'To' } }\r\n * });\r\n *\r\n * // -> { q: 'john', createdFrom: '2025-01-01', createdTo: '2025-01-31' }\r\n * const plain = s.serialize({\r\n * q: ' john ',\r\n * active: undefined,\r\n * created: [new Date('2025-01-01'), new Date('2025-01-31')]\r\n * });\r\n *\r\n * // -> 'q=john&createdFrom=2025-01-01&createdTo=2025-01-31'\r\n * const qs = s.toQuery({ q: 'john', created: [new Date('2025-01-01'), new Date('2025-01-31')] });\r\n *\r\n * // <- { q: 'john', created: [Date, Date] }\r\n * const parsed = s.deserialize('q=john&createdFrom=2025-01-01&createdTo=2025-01-31');\r\n * ```\r\n */\r\nexport class Serializer<EntityType extends DataType> {\r\n readonly config: SerializerConfig;\r\n\r\n /**\r\n * Creates a serializer with a partially overridden configuration.\r\n * Provide only the options you want to change (the rest are taken from defaults).\r\n *\r\n * @param config partial transformation configuration\r\n */\r\n constructor(config: Partial<SerializerConfig>) {\r\n this.config = {\r\n mapString: { trim: true },\r\n mapNumber: { fromString: false },\r\n mapBoolean: {},\r\n mapArray: { concatType: 'comma' },\r\n mapObject: { deep: true },\r\n mapDate: { dateFormat: 'yyyy-MM-dd' },\r\n mapPeriod: {\r\n dateFormat: 'yyyy-MM-dd',\r\n transformMode: { mode: 'split', dateFromKeyPostfix: 'From', dateToKeyPostfix: 'To' },\r\n },\r\n mapNullable: { remove: true, includeEmptyString: false },\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Converts a domain object into a flat serialized representation\r\n * (ready to send to an API or build a query string).\r\n *\r\n * Rules are taken from `config`:\r\n * — strings can be trimmed (if enabled),\r\n * — numbers can be converted from strings/numbers,\r\n * — boolean supports custom true/false representations,\r\n * — dates are formatted by `dateFormat`,\r\n * — date periods can be split/joined,\r\n * — `nullable` can be removed from the result (`remove`) or formatted.\r\n *\r\n * @param obj source object\r\n * @returns a flat dictionary with string/primitive values\r\n */\r\n serialize(obj: EntityType): SerializedType {\r\n const result: SerializedType = {};\r\n\r\n for (const [key, value] of Object.entries(obj ?? {})) {\r\n const fields = this.config.mapFields?.[key];\r\n\r\n if (fields && 'format' in fields) {\r\n result[key] = fields.format(value, obj as EntityType);\r\n continue;\r\n }\r\n\r\n if (fields?.type === 'nullable' || isNullable(value, this.config.mapNullable?.includeEmptyString)) {\r\n if (this.config.mapNullable.remove) {\r\n continue;\r\n }\r\n }\r\n\r\n if (fields?.type === 'period' || isDatePeriod(value)) {\r\n const transform = this.config.mapPeriod.transformMode;\r\n const [from, to] = value;\r\n\r\n if (transform?.mode === 'split') {\r\n result[`${key}${transform.dateFromKeyPostfix}`] = formatDate(from, this.config.mapPeriod.dateFormat);\r\n result[`${key}${transform.dateToKeyPostfix}`] = formatDate(to, this.config.mapPeriod.dateFormat);\r\n continue;\r\n }\r\n }\r\n\r\n result[key] = this.serializeElement(value, key);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Parse serialized data into a domain object.\r\n *\r\n * Source can be:\r\n * — a query string (`key=value&arr=1,2`) or `JSON.stringify(obj)`,\r\n * — an already prepared flat object.\r\n *\r\n * Transformations are reverse of `serialize`: strings → number/boolean/Date/period,\r\n * arrays are collected according to strategy (`comma`/`pipe`/`multi`), objects — deeply or as JSON.\r\n *\r\n * @param val query string or object\r\n * @returns a domain object of the specified type\r\n */\r\n deserialize = (val: string | AnyDict): EntityType => {\r\n const data: SerializedType = typeof val === 'string' ? this.parseQuery(val) : val;\r\n const result: AnyType = {};\r\n\r\n for (const [key, value] of Object.entries(data ?? {})) {\r\n const field = this.config.mapFields?.[key];\r\n\r\n if (field && 'parse' in field) {\r\n result[key] = field.parse(value, data);\r\n continue;\r\n }\r\n\r\n if (\r\n field?.type === 'nullable' ||\r\n (field?.type !== 'array' && isNullable(value, this.config.mapNullable?.includeEmptyString))\r\n ) {\r\n if (this.config.mapNullable.remove) {\r\n continue;\r\n }\r\n }\r\n\r\n const periodTransform = this.config.mapPeriod.transformMode!;\r\n\r\n if (periodTransform.mode === 'split') {\r\n const isFrom = (key || '').endsWith(periodTransform.dateFromKeyPostfix);\r\n const isTo = (key || '').endsWith(periodTransform.dateToKeyPostfix);\r\n const keyJoint = (key || '')\r\n .replace(periodTransform.dateFromKeyPostfix, '')\r\n .replace(periodTransform.dateToKeyPostfix, '');\r\n const field = this.config.mapFields?.[keyJoint];\r\n\r\n // @ts-ignore\r\n if (field?.['type'] === 'period' && (isFrom || isTo)) {\r\n result[keyJoint] ??= [null, null];\r\n\r\n if (isFrom) {\r\n result[keyJoint][0] = parseToDate(value, this.config.mapPeriod.dateFormat);\r\n } else if (isTo) {\r\n result[keyJoint][1] = parseToDate(value, this.config.mapPeriod.dateFormat);\r\n }\r\n\r\n continue;\r\n }\r\n }\r\n\r\n result[key] = this.deserializeElement(value, key);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Build a query string from a domain object using `serialize` rules\r\n * and the array joining strategy (`concatType`).\r\n *\r\n * @param val domain object\r\n * @returns query string (suitable for URL or history API)\r\n */\r\n toQuery = (val: EntityType): string => {\r\n return makeQuery(this.serialize(val), this.config.mapArray.concatType);\r\n };\r\n\r\n /**\r\n * Returns a new serializer instance with a merged configuration.\r\n * Useful for ad-hoc overrides for a specific call.\r\n *\r\n * @param config partial config changes\r\n * @returns new `Serializer` with the provided `config` applied\r\n */\r\n withConfig(config: Partial<SerializerConfig>): Serializer<EntityType> {\r\n return new Serializer<EntityType>({ ...this.config, ...config });\r\n }\r\n\r\n private serializeElement(value: AnyType, key?: string): AnyType {\r\n const fields = this.config.mapFields?.[key || ''];\r\n\r\n if (fields && 'format' in fields) {\r\n return;\r\n }\r\n\r\n if (fields?.type === 'nullable' || isNullable(value, this.config.mapNullable?.includeEmptyString)) {\r\n const nullableVal = value || null;\r\n\r\n return this.config.mapNullable.format?.(nullableVal) || this.config.mapNullable.replaceWith || nullableVal;\r\n }\r\n\r\n if (fields?.type === 'string') {\r\n return serializeString(this.config, value);\r\n }\r\n\r\n if (fields?.type === 'number' || isNumber(value, this.config.mapNumber.fromString)) {\r\n return serializeNumber(this.config, value);\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return serializeString(this.config, value);\r\n }\r\n\r\n if (fields?.type === 'boolean' || typeof value === 'boolean') {\r\n return serializeBoolean(this.config, value);\r\n }\r\n\r\n if (fields?.type === 'date' || value instanceof Date) {\r\n return serializeDate(this.config, value);\r\n }\r\n\r\n if (fields?.type === 'period' || isDatePeriod(value)) {\r\n const mapPeriod = this.config.mapPeriod;\r\n\r\n if (mapPeriod.format) {\r\n return mapPeriod.format(value);\r\n } else {\r\n const [from, to] = value;\r\n const transform = mapPeriod.transformMode!;\r\n\r\n if (transform.mode === 'join') {\r\n const period = [\r\n formatDate(from, this.config.mapPeriod.dateFormat),\r\n formatDate(to, this.config.mapPeriod.dateFormat),\r\n ];\r\n\r\n return period.join(transform.concat);\r\n }\r\n }\r\n }\r\n\r\n if (fields?.type === 'array' || Array.isArray(value)) {\r\n return (value as AnyType[]).map((it) => this.serializeElement(it));\r\n }\r\n\r\n if (fields?.type === 'object' || isObject(value)) {\r\n return (\r\n this.config.mapObject.format?.(value) ??\r\n (this.config.mapObject.deep ? this.serialize(value) : JSON.stringify(value))\r\n );\r\n }\r\n }\r\n\r\n private deserializeElement(value: AnyType, key?: string): AnyType {\r\n const field = this.config.mapFields?.[key || ''];\r\n\r\n if (field && 'format' in field) {\r\n return;\r\n }\r\n\r\n if (field?.type === 'array' || Array.isArray(value)) {\r\n const array = Array.isArray(value) ? value : [value];\r\n\r\n if (this.config.mapArray.removeNullable) {\r\n if (!isNullable(value, this.config.mapNullable?.includeEmptyString)) {\r\n return array.map((it) => this.deserializeElement(it));\r\n } else {\r\n return;\r\n }\r\n } else {\r\n return !value ? [] : array.map((it) => this.deserializeElement(it));\r\n }\r\n }\r\n\r\n if (field?.type === 'object') {\r\n try {\r\n if (this.config.mapObject.deep) {\r\n // @ts-ignore\r\n return this.deserializeElement(value);\r\n } else {\r\n // @ts-ignore\r\n return JSON.parse(value);\r\n }\r\n } catch {\r\n return value;\r\n }\r\n }\r\n\r\n if (field?.type === 'nullable' || isNullable(value, this.config.mapNullable?.includeEmptyString)) {\r\n return this.config.mapNullable.parse?.(value) || value;\r\n }\r\n\r\n if (\r\n field?.type === 'boolean' ||\r\n typeof value === 'boolean' ||\r\n value === this.config.mapBoolean.true ||\r\n value === this.config.mapBoolean.false\r\n ) {\r\n return this.config.mapBoolean.parse?.(value) ?? (value === this.config.mapBoolean.true || value === true);\r\n }\r\n\r\n const maybeDate = parseToDate(value, this.config.mapDate.dateFormat);\r\n\r\n if (field?.type === 'date' || maybeDate) {\r\n return this.config.mapDate.parse?.(value) || maybeDate;\r\n }\r\n\r\n const periodTransform = this.config.mapPeriod.transformMode!;\r\n\r\n if (periodTransform.mode === 'join') {\r\n const maybePeriod = parseToDatePeriod(value, this.config.mapPeriod.dateFormat);\r\n\r\n if (field?.type === 'period' || (maybePeriod || []).some(Boolean)) {\r\n return this.config.mapPeriod.parse?.(value) || maybePeriod;\r\n }\r\n }\r\n\r\n if (field?.type === 'number' || isNumber(value, this.config.mapNumber.fromString)) {\r\n return this.config.mapNumber.parse?.(value) || Number(String(value).trim());\r\n }\r\n\r\n if (field?.type === 'string' || typeof value === 'string') {\r\n return this.config.mapString.parse?.(value) || this.config.mapString.trim ? String(value).trim() : value;\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private parseQuery(val: string) {\r\n try {\r\n return JSON.parse(val);\r\n } catch {\r\n const params = new URLSearchParams(val);\r\n const data: SerializedType = {};\r\n\r\n params.forEach((value, key) => {\r\n const field = this.config.mapFields?.[key] || {};\r\n const concatType = this.config.mapArray.concatType;\r\n\r\n if ('type' in field && field.type === 'array') {\r\n data[key] ??= [];\r\n concatType !== 'multi' && (data[key] = parseQueryArray(value, concatType, key));\r\n concatType === 'multi' && (data[key] as string[]).push(value);\r\n } else {\r\n data[key] = value;\r\n }\r\n });\r\n\r\n return data;\r\n }\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nimport { SerializerConfig } from './serialize.models';\r\n\r\nexport const SERIALIZER_CONFIG = new InjectionToken<Partial<SerializerConfig>>('SERIALIZER_CONFIG');\r\n","import { StorageInterface } from './models';\r\n\r\nexport class LruCache<KeyT, ValueT> implements StorageInterface<KeyT, ValueT> {\r\n private map = new Map<KeyT, ValueT>();\r\n\r\n constructor(public limit: number = 100) {}\r\n\r\n get length(): number {\r\n return this.map.size;\r\n }\r\n\r\n get(key: KeyT) {\r\n if (!this.map.has(key)) {\r\n return null;\r\n }\r\n\r\n const val = this.map.get(key)!;\r\n\r\n this.map.delete(key);\r\n this.map.set(key, val);\r\n\r\n return val;\r\n }\r\n\r\n set(key: KeyT, value: ValueT) {\r\n if (this.map.has(key)) {\r\n this.map.delete(key);\r\n } else if (this.map.size === this.limit) {\r\n const oldest = this.map.keys().next().value;\r\n\r\n oldest !== undefined && this.map.delete(oldest);\r\n }\r\n\r\n this.map.set(key, value);\r\n }\r\n\r\n remove(key: KeyT): boolean {\r\n return this.map.delete(key);\r\n }\r\n\r\n clear(): void {\r\n this.map.clear();\r\n }\r\n\r\n has(key: KeyT): boolean {\r\n return this.map.has(key);\r\n }\r\n\r\n keys(): KeyT[] {\r\n return Array.from(this.map.keys());\r\n }\r\n\r\n values(): ValueT[] {\r\n return Array.from(this.map.values());\r\n }\r\n\r\n toArray(): ValueT[] {\r\n return Array.from(this.map.values());\r\n }\r\n\r\n fromArray(entries: [KeyT, ValueT][]) {\r\n this.map.clear();\r\n\r\n for (const [k, v] of entries) {\r\n this.set(k, v);\r\n }\r\n }\r\n}\r\n","import { AnyDict, AnyType } from '@reforgium/internal';\r\n\r\nimport { StorageInterface } from './models';\r\n\r\nexport class LocalStorage<Key = string, Type extends AnyType = AnyDict> implements StorageInterface<Key, Type> {\r\n get length() {\r\n return localStorage.length;\r\n }\r\n\r\n get(key: Key): Type | null {\r\n const raw = localStorage.getItem(String(key));\r\n const parsed = JSON.parse(raw ?? 'null');\r\n\r\n return (parsed as Type) ?? null;\r\n }\r\n\r\n set(key: Key, value: Type): void {\r\n const str = JSON.stringify(value);\r\n\r\n localStorage.setItem(String(key), str);\r\n }\r\n\r\n remove(key: Key): void {\r\n return localStorage.removeItem(String(key));\r\n }\r\n\r\n clear(): void {\r\n return localStorage.clear();\r\n }\r\n}\r\n","import { AnyDict, AnyType } from '@reforgium/internal';\r\n\r\nimport { StorageInterface } from '.';\r\n\r\nexport class MemoryStorage<Key = string, Type extends AnyType = AnyDict> implements StorageInterface<Key, Type> {\r\n private cache = new Map<Key, Type>();\r\n\r\n get length() {\r\n return this.cache.size;\r\n }\r\n\r\n get(key: Key): Type | null {\r\n return this.cache.get(key) ?? null;\r\n }\r\n\r\n set(key: Key, value: Type): void {\r\n this.cache.set(key, value);\r\n }\r\n\r\n remove(key: Key): void {\r\n this.cache.delete(key);\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n}\r\n","import { AnyDict, AnyType } from '@reforgium/internal';\r\n\r\nimport { StorageInterface } from './models';\r\n\r\nexport class SessionStorage<Key = string, Type extends AnyType = AnyDict> implements StorageInterface<Key, Type> {\r\n get length() {\r\n return sessionStorage.length;\r\n }\r\n\r\n get(key: Key): Type | null {\r\n const raw = sessionStorage.getItem(String(key));\r\n const parsed = JSON.parse(raw ?? 'null');\r\n\r\n return (parsed as Type) ?? null;\r\n }\r\n\r\n set(key: Key, value: Type): void {\r\n const str = JSON.stringify(value);\r\n\r\n sessionStorage.setItem(String(key), str);\r\n }\r\n\r\n remove(key: Key): void {\r\n return sessionStorage.removeItem(String(key));\r\n }\r\n\r\n clear(): void {\r\n return sessionStorage.clear();\r\n }\r\n}\r\n","import { AnyDict, AnyType } from '@reforgium/internal';\r\n\r\nimport { LruCache, StorageInterface } from '../storages';\r\nimport { LocalStorage } from '../storages/local.storage';\r\nimport { MemoryStorage } from '../storages/memory.storage';\r\nimport { SessionStorage } from '../storages/session.storage';\r\nimport { StorageStrategy } from './models';\r\n\r\n/**\r\n * Factory for data storage strategies.\r\n *\r\n * Returns a `StorageInterface` implementation depending on the selected strategy:\r\n * - `'memory'` — in-memory storage (for the session lifetime);\r\n * - `'session'` — `sessionStorage`, lives until the tab is closed;\r\n * - `'persist'` — `localStorage`, persists between sessions;\r\n * - `'lru'` — size-limited cache (Least Recently Used).\r\n *\r\n * Used to choose an appropriate storage implementation\r\n * depending on the scenario: temporary data, long-term, cache, etc.\r\n *\r\n * @param strategy storage strategy type (`memory`, `session`, `persist`, `lru`)\r\n * @returns instance implementing `StorageInterface<Key, Type>`\r\n */\r\nexport const storageStrategy = <Key = string, Type extends AnyType = AnyDict>(\r\n strategy: StorageStrategy,\r\n): StorageInterface<Key, Type> => {\r\n const fabrics: Record<StorageStrategy, () => StorageInterface<Key, Type>> = {\r\n memory: () => new MemoryStorage<Key, Type>(),\r\n session: () => new SessionStorage<Key, Type>(),\r\n persist: () => new LocalStorage<Key, Type>(),\r\n lru: () => new LruCache<Key, Type>(),\r\n };\r\n\r\n return fabrics[strategy]();\r\n};\r\n","import { RestMethods } from '@reforgium/internal';\r\n\r\n/**\r\n * Error thrown when requested data is missing in the cache.\r\n *\r\n * Used by the `cache-only` strategy when data is not found\r\n * and a network request is not allowed.\r\n *\r\n * Example:\r\n * ```ts\r\n * try {\r\n * await store.get({ query }, { strategy: 'cache-only' });\r\n * } catch (e) {\r\n * if (e instanceof CacheMissError) console.warn(e.key, 'not found in cache');\r\n * }\r\n * ```\r\n */\r\nexport class CacheMissError extends Error {\r\n constructor(public readonly key: string) {\r\n super(`Cache miss for key: ${key}`);\r\n this.name = 'CacheMissError';\r\n }\r\n}\r\n\r\n/**\r\n * Error indicating an aborted (canceled) request.\r\n *\r\n * May be thrown by `abort()` or `abortAll()` in `ResourceStore`.\r\n * Usually does not require handling as an error — used to ignore canceled operations.\r\n */\r\nexport class AbortError extends Error {\r\n constructor(message = 'aborted') {\r\n super(message);\r\n this.name = 'AbortError';\r\n }\r\n}\r\n\r\n/**\r\n * Checks whether the exception is an `AbortError` (including compatible objects).\r\n *\r\n * @param e — any value that may be an error\r\n * @returns `true` if it's an `AbortError`\r\n */\r\nexport function isAbort(e: unknown): e is AbortError {\r\n return (\r\n e instanceof AbortError ||\r\n (typeof e === 'object' && e != null && (e as Error)?.name === 'AbortError' && (e as Error)?.message === 'aborted')\r\n );\r\n}\r\n\r\nexport function joinUrl(base: string | undefined, path: string): string {\r\n return base ? `${base.replace(/\\/$/, '')}/${path.replace(/^\\//, '')}` : path;\r\n}\r\n\r\nexport function buildKey(method: RestMethods, path: string): string {\r\n return `${method}|${path}`;\r\n}\r\n","import { filter, merge, Observable, Subject, Subscription, timer } from 'rxjs';\r\nimport { debounce as rxDebounce, finalize, tap, throttle as rxThrottle } from 'rxjs/operators';\r\n\r\nimport { AnyType } from '@reforgium/internal';\r\n\r\nimport { DelayMode } from './resource.models';\r\n// noinspection ES6PreferShortImport\r\nimport { AbortError } from './resource.utils';\r\n\r\ntype Waiter<T> = { resolve: (v: T) => void; reject: (e: unknown) => void };\r\n\r\ntype ScheduledTask<Data> = {\r\n mode: DelayMode;\r\n delay: number;\r\n exec: () => Observable<Data>;\r\n};\r\n\r\ntype Channel<Data> = {\r\n subject: Subject<ScheduledTask<Data>>;\r\n waiters: Waiter<Data>[];\r\n lastExec?: () => Observable<Data>;\r\n timerSub?: Subscription;\r\n inflight?: Subscription;\r\n};\r\n\r\n/**\r\n * Per-key task scheduler with `debounce`/`throttle` and result deduplication.\r\n *\r\n * Allows applying delays and rate limiting separately for each key.\r\n * All `schedule` calls for the same key are coalesced: consumers receive a single shared `Promise`\r\n * that resolves with the value of the last started task.\r\n *\r\n * Suitable for API requests, auto-saving forms, incremental search, etc.\r\n *\r\n * Example:\r\n * ```ts\r\n * const ks = new KeyedScheduler();\r\n * // these three calls collapse into one request after 300ms\r\n * ks.schedule('users:list', 'debounce', 300, () => http.get<User[]>('/api/users'));\r\n * ks.schedule('users:list', 'debounce', 300, () => http.get<User[]>('/api/users'));\r\n * const users = await ks.schedule('users:list', 'debounce', 300, () => http.get<User[]>('/api/users'));\r\n * ```\r\n */\r\nexport class KeyedScheduler {\r\n private channels = new Map<string, Channel<AnyType>>();\r\n\r\n /**\r\n * Schedule task execution for the specified key.\r\n *\r\n * Multiple calls with the same key are merged according to the mode:\r\n * `debounce` — runs the last task after a pause;\r\n * `throttle` — runs no more often than the specified delay (uses the last accumulated).\r\n *\r\n * All waiters receive the result of a single execution.\r\n *\r\n * @param key logical channel key (e.g., `'users:list'`)\r\n * @param mode delay mode (`'debounce' | 'throttle'`)\r\n * @param delay delay in milliseconds\r\n * @param exec Observable factory with the actual work (HTTP request, etc.)\r\n * @returns Promise with the result of `exec`\r\n */\r\n schedule<Data>(key: string, mode: DelayMode, delay: number, exec: () => Observable<Data>): Promise<Data> {\r\n const channel = this.ensureChannel<Data>(key);\r\n const promise = new Promise<Data>((resolve, reject) => {\r\n channel.waiters.push({ resolve, reject });\r\n });\r\n\r\n channel.lastExec = exec;\r\n\r\n if (delay <= 0) {\r\n this.startExecution(channel);\r\n } else {\r\n channel.subject.next({ mode, delay, exec });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * Cancels scheduled/running tasks for a key.\r\n * All pending `Promise`s will be rejected with `AbortError` (or the provided reason).\r\n *\r\n * @param key channel key\r\n * @param reason cancellation reason (defaults to `AbortError('aborted')`)\r\n */\r\n cancel(key: string, reason: unknown = new AbortError()): void {\r\n const ch = this.channels.get(key);\r\n\r\n if (!ch) {\r\n return;\r\n }\r\n\r\n ch.timerSub?.unsubscribe();\r\n ch.inflight?.unsubscribe();\r\n ch.inflight = undefined;\r\n ch.subject.complete();\r\n\r\n const waiters = ch.waiters.splice(0);\r\n\r\n waiters.forEach((w) => w.reject(reason));\r\n\r\n this.channels.delete(key);\r\n }\r\n\r\n /**\r\n * Cancels all channels and their pending tasks.\r\n *\r\n * @param reason cancellation reason (defaults to `AbortError('aborted')`)\r\n */\r\n cancelAll(reason: unknown = new AbortError()) {\r\n for (const key of Array.from(this.channels.keys())) {\r\n this.cancel(key, reason);\r\n }\r\n }\r\n\r\n private ensureChannel<Type>(key: string): Channel<Type> {\r\n let ch = this.channels.get(key) as Channel<Type> | undefined;\r\n\r\n if (ch) {\r\n return ch;\r\n }\r\n\r\n const subject = new Subject<ScheduledTask<Type>>();\r\n\r\n ch = { subject, waiters: [] };\r\n this.channels.set(key, ch as Channel<Type>);\r\n\r\n const debounced$ = subject.pipe(\r\n filter((t) => t.mode === 'debounce'),\r\n rxDebounce((t) => timer(t.delay)),\r\n tap(() => this.startExecution(ch!)),\r\n );\r\n\r\n const throttled$ = subject.pipe(\r\n filter((t) => t.mode === 'throttle'),\r\n rxThrottle((t) => timer(t.delay), { leading: false, trailing: true }),\r\n tap(() => this.startExecution(ch!)),\r\n );\r\n\r\n ch.timerSub = merge(debounced$, throttled$)\r\n .pipe(finalize(() => this.channels.delete(key)))\r\n .subscribe();\r\n\r\n return ch;\r\n }\r\n\r\n private startExecution<T>(ch: Channel<T>) {\r\n const exec = ch.lastExec;\r\n\r\n if (!exec) {\r\n return;\r\n }\r\n\r\n ch.inflight?.unsubscribe();\r\n ch.inflight = exec().subscribe({\r\n next: (val) => {\r\n const waiters = ch.waiters.splice(0);\r\n\r\n waiters.forEach((w) => w.resolve(val));\r\n },\r\n error: (err) => {\r\n const waiters = ch.waiters.splice(0);\r\n\r\n waiters.forEach((w) => w.reject(err));\r\n },\r\n complete: () => (ch.inflight = undefined),\r\n });\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { computed, inject, Signal, signal } from '@angular/core';\r\nimport { map, Observable } from 'rxjs';\r\nimport { finalize, tap } from 'rxjs/operators';\r\n\r\nimport { AnyDict, AnyType, fillUrlWithParams, RestMethods } from '@reforgium/internal';\r\n\r\nimport { Serializer, SERIALIZER_CONFIG } from '../../serializer';\r\nimport {\r\n CacheStrategy,\r\n CallArgs,\r\n CallConfig,\r\n DelayMode,\r\n ExecArgs,\r\n GetCallConfig,\r\n PayloadData,\r\n ResourceEntry,\r\n ResourceRoutesMap,\r\n ResourceStatus,\r\n ResourceStoreOptions,\r\n SimpleDict,\r\n} from './resource.models';\r\nimport { KeyedScheduler } from './resource.scheduler';\r\nimport { buildKey, CacheMissError, isAbort, joinUrl } from './resource.utils';\r\n\r\n/**\r\n * Store for REST resources with caching and request deduplication.\r\n *\r\n * Provides reactive access to current value, status, and error;\r\n * supports cache strategies (cache-first / cache-only / network-first),\r\n * TTL, delays (debounce/throttle), request cancellation, and auto-serialization of query/payload.\r\n *\r\n * Example:\r\n * ```ts\r\n * const store = new ResourceStore({ GET: '/users/:id' }, { baseUrl: '/api', ttlMs: 30_000 });\r\n *\r\n * effect(() => {\r\n * if (store.loading()) showSpinner();\r\n * if (store.error()) showError(store.error());\r\n * const user = store.value();\r\n * });\r\n *\r\n * await store.get({ params: { id: '42' }, query: { expand: ['roles'] } }, { strategy: 'cache-first', dedupe: true });\r\n * ```\r\n */\r\nexport class ResourceStore<Data> {\r\n private readonly http = inject(HttpClient);\r\n private readonly serializer = new Serializer<AnyDict>(inject(SERIALIZER_CONFIG, { optional: true }) ?? {});\r\n\r\n #value = signal<Data | null>(null);\r\n #status = signal<ResourceStatus>('idle');\r\n #error = signal<unknown | null>(null);\r\n\r\n /**\r\n * Current resource value.\r\n * Returns `null` if no data yet or the request failed.\r\n */\r\n value: Signal<Data | null> = this.#value.asReadonly();\r\n\r\n /**\r\n * Current loading status of the resource: `idle | loading | stale | success | error`.\r\n */\r\n status: Signal<ResourceStatus> = this.#status.asReadonly();\r\n\r\n /**\r\n * Last error (if any). Otherwise `null`.\r\n */\r\n error: Signal<unknown | null> = this.#error.asReadonly();\r\n\r\n /**\r\n * Convenience loading flag: `true` when `loading` or `stale`.\r\n * Useful for spinners and disabling buttons.\r\n */\r\n loading: Signal<boolean> = computed(() => ['loading', 'stale'].includes(this.#status()));\r\n\r\n private readonly routes: ResourceRoutesMap;\r\n private readonly opts: ResourceStoreOptions;\r\n private readonly entries = new Map<string, ResourceEntry<unknown>>();\r\n private readonly scheduler = new KeyedScheduler();\r\n\r\n /**\r\n * @param routes Map of path templates for methods (`GET/POST/...` → `/users/:id`)\r\n * @param opts Global options (baseUrl, ttlMs, delay, delayMode, presetQueries/payload, etc.)\r\n */\r\n constructor(routes: ResourceRoutesMap, opts: ResourceStoreOptions = {}) {\r\n this.routes = routes;\r\n this.opts = opts;\r\n }\r\n\r\n /**\r\n * Perform a GET request.\r\n *\r\n * Supports cache strategies (`strategy`), TTL (`ttlMs`), revalidation,\r\n * deduplication (`dedupe`), and response parsing (`parseResponse`).\r\n *\r\n * @param args { params, query }\r\n * @param cfg Call settings (strategy, ttlMs, revalidate, parseResponse, delay, delayMode, dedupe, promote)\r\n * @returns Deserialized `Data`\r\n */\r\n async get<\r\n Param extends SimpleDict = SimpleDict,\r\n Query extends PayloadData = PayloadData,\r\n Response extends AnyType = Data,\r\n >(args: CallArgs<Param, Query, never>, cfg: GetCallConfig<Response, Data> = {}): Promise<Data> {\r\n const url = this.buildUrl('GET', args);\r\n const key = buildKey('GET', url);\r\n const query = this.prepareQuery(args);\r\n\r\n const entry = this.ensureEntry<Data>(key);\r\n const strategy: CacheStrategy = cfg.strategy ?? 'network-first';\r\n const ttlMs = cfg.ttlMs ?? this.opts.ttlMs ?? 0;\r\n const fresh = entry.updatedAt != null && Date.now() - entry.updatedAt < ttlMs;\r\n\r\n if (cfg.dedupe && entry.inflight) {\r\n return entry.inflight as unknown as Promise<Data>;\r\n }\r\n\r\n if (strategy === 'cache-only') {\r\n if (fresh && entry.data != null) {\r\n this.promoteCurrent(entry, cfg.promote);\r\n\r\n return entry.data as Data;\r\n }\r\n\r\n throw new CacheMissError(key);\r\n }\r\n\r\n if (strategy === 'cache-first' && fresh && !cfg.revalidate && entry.data != null) {\r\n this.promoteCurrent(entry, cfg.promote);\r\n\r\n return entry.data as Data;\r\n }\r\n\r\n const delay = cfg.delay ?? this.opts.delay ?? 0;\r\n const mode: DelayMode = cfg.delayMode ?? this.opts.delayMode ?? 'debounce';\r\n\r\n entry.status = strategy === 'cache-first' && fresh && entry.data != null ? 'stale' : 'loading';\r\n this.promoteCurrent(entry, cfg.promote);\r\n\r\n const task = this.scheduler.schedule(\r\n key,\r\n mode,\r\n delay,\r\n this.exec$({\r\n req$: this.http.get<Response>(url, { params: query }),\r\n entry,\r\n promote: cfg.promote,\r\n parseFn: cfg.parseResponse,\r\n }),\r\n );\r\n\r\n cfg.dedupe && (entry.inflight = task);\r\n void task.catch((e) => {\r\n if (!isAbort(e)) {\r\n throw e;\r\n }\r\n });\r\n\r\n return task;\r\n }\r\n\r\n /**\r\n * POST request.\r\n *\r\n * @param args { params, query, payload }\r\n * @param cfg Call settings (parseResponse, delay, delayMode, dedupe, promote)\r\n * @returns API response (by default — as returned by the server)\r\n */\r\n async post<\r\n Param extends SimpleDict = SimpleDict,\r\n Payload extends PayloadData = PayloadData,\r\n Query extends PayloadData = PayloadData,\r\n Response extends AnyType = AnyType,\r\n >(args: CallArgs<Param, Query, Payload>, cfg: CallConfig<Response, Response> = {}): Promise<Response> {\r\n return await this.callApi<Param, Payload, Query, Response>('POST', args, cfg);\r\n }\r\n\r\n /**\r\n * PUT request (full resource update).\r\n *\r\n * @param args { params, query, payload }\r\n * @param cfg Call settings (parseResponse, delay, delayMode, dedupe, promote)\r\n * @returns API response (by default — as returned by the server)\r\n */\r\n async put<\r\n Param extends SimpleDict = SimpleDict,\r\n Payload extends PayloadData = PayloadData,\r\n Query extends SimpleDict = SimpleDict,\r\n Response extends AnyType = AnyType,\r\n >(args: CallArgs<Param, Query, Partial<Payload>>, cfg: CallConfig<Response, Response> = {}): Promise<Response> {\r\n return await this.callApi<Param, Payload, Query, Response>('PUT', args, cfg);\r\n }\r\n\r\n /**\r\n * PATCH request (partial update).\r\n *\r\n * @param args { params, query, payload }\r\n * @param cfg Call settings (parseResponse, delay, delayMode, dedupe, promote)\r\n * @returns API response (by default — as returned by the server)\r\n */\r\n async patch<\r\n Param extends SimpleDict = SimpleDict,\r\n Payload extends PayloadData = PayloadData,\r\n Query extends SimpleDict = SimpleDict,\r\n Response extends AnyType = AnyType,\r\n >(args: CallArgs<Param, Query, Partial<Payload>>, cfg: CallConfig<Response, Response> = {}): Promise<Response> {\r\n return await this.callApi<Param, Payload, Query, Response>('PATCH', args, cfg);\r\n }\r\n\r\n /**\r\n * DELETE request.\r\n *\r\n * @param args { params, query, payload }\r\n * @param cfg Call settings (parseResponse, delay, delayMode, dedupe, promote)\r\n * @returns API response (by default — as returned by the server)\r\n */\r\n async delete<\r\n Param extends SimpleDict = SimpleDict,\r\n Payload extends PayloadData = PayloadData,\r\n Query extends SimpleDict = SimpleDict,\r\n Response extends AnyType = AnyType,\r\n >(args: CallArgs<Param, Query, Payload>, cfg: CallConfig<Response, Response> = {}): Promise<Response> {\r\n return await this.callApi<Param, Payload, Query, Response>('DELETE', args, cfg);\r\n }\r\n\r\n /**\r\n * Cancel scheduled/running requests for a specific call.\r\n *\r\n * @param method HTTP method\r\n * @param args Arguments used to build the URL (params, query)\r\n * @param reason Cancellation reason (optional)\r\n */\r\n abort<Param extends SimpleDict = SimpleDict, Query extends PayloadData = PayloadData>(\r\n method: RestMethods,\r\n args: CallArgs<Param, Query>,\r\n reason?: string | Error,\r\n ) {\r\n const url = this.buildUrl(method, args);\r\n const key = buildKey(method, url);\r\n\r\n this.scheduler.cancel?.(key, reason);\r\n }\r\n\r\n /**\r\n * Cancel all scheduled/running requests for this store.\r\n *\r\n * @param reason Cancellation reason (optional)\r\n */\r\n abortAll(reason?: string | Error) {\r\n this.scheduler.cancelAll?.(reason);\r\n }\r\n\r\n private ensureEntry<R>(key: string): ResourceEntry<R> {\r\n let entry = this.entries.get(key) as ResourceEntry<R> | undefined;\r\n\r\n if (!entry) {\r\n entry = { data: null, status: 'idle', error: null, updatedAt: null };\r\n this.entries.set(key, entry as ResourceEntry<unknown>);\r\n }\r\n\r\n return entry;\r\n }\r\n\r\n private async callApi<\r\n Param extends SimpleDict = SimpleDict,\r\n Payload extends PayloadData = PayloadData,\r\n Query extends SimpleDict = SimpleDict,\r\n Response extends AnyType = AnyType,\r\n >(\r\n method: RestMethods,\r\n args: CallArgs<Param, Query, Partial<Payload>>,\r\n config: CallConfig<Response, Response> = {},\r\n ): Promise<Response> {\r\n const url = this.buildUrl(method, args);\r\n const key = buildKey(method, url);\r\n const query = this.prepareQuery(args);\r\n const payload = { ...(this.opts.presetPayload || {}), ...(args.payload || {}) };\r\n const serializedPayload = this.serializer.serialize(payload);\r\n\r\n const entry = this.ensureEntry<Response>(key);\r\n\r\n if (config.dedupe && entry.inflight) {\r\n return entry.inflight as Promise<Response>;\r\n }\r\n\r\n const delay = config.delay ?? this.opts.delay ?? 0;\r\n const mode: DelayMode = config.delayMode ?? this.opts.delayMode ?? 'debounce';\r\n\r\n entry.status = 'loading';\r\n this.promoteCurrent(entry, config.promote);\r\n\r\n let req$: Observable<Response>;\r\n\r\n if (method === 'DELETE') {\r\n req$ = this.http.delete<Response>(url, { body: serializedPayload, params: query });\r\n } else {\r\n // @ts-ignore\r\n req$ = this.http[method.toLowerCase()]<Response>(url, serializedPayload, { params: query });\r\n }\r\n\r\n const task = this.scheduler.schedule<Response>(\r\n key,\r\n mode,\r\n delay,\r\n this.exec$<Response, Response>({ req$, entry, promote: config.promote, parseFn: config.parseResponse }),\r\n );\r\n\r\n config.dedupe && (entry.inflight = task);\r\n void task.catch((e) => {\r\n if (!isAbort(e)) {\r\n throw e;\r\n }\r\n });\r\n\r\n return task;\r\n }\r\n\r\n private buildUrl(method: RestMethods, args: CallArgs) {\r\n const tpl = this.routes[method];\r\n\r\n if (!tpl) {\r\n throw new Error(`${method} route not configured`);\r\n }\r\n\r\n const path = fillUrlWithParams(tpl, args.params);\r\n\r\n return joinUrl(this.opts.baseUrl, path);\r\n }\r\n\r\n private prepareQuery(args: CallArgs) {\r\n const mergedQuery = { ...(this.opts.presetQueries || {}), ...(args.query || {}) } as AnyDict;\r\n\r\n return this.serializer.serialize(mergedQuery) as SimpleDict;\r\n }\r\n\r\n private exec$ =\r\n <Response, Return = Data>({ req$, entry, promote = true, parseFn }: ExecArgs<Response, Return>) =>\r\n () =>\r\n req$.pipe(\r\n map((data) => (parseFn ? parseFn(data) : (data as unknown as Return))),\r\n tap({\r\n next: (data) => {\r\n promote && (entry.data = data);\r\n entry.status = 'success';\r\n entry.updatedAt = Date.now();\r\n entry.error = null;\r\n this.promoteCurrent(entry, promote);\r\n },\r\n error: (err) => {\r\n entry.error = err;\r\n entry.status = 'error';\r\n this.promoteCurrent(entry, promote);\r\n },\r\n }),\r\n finalize(() => {\r\n entry.inflight = undefined;\r\n this.promoteCurrent(entry, promote);\r\n }),\r\n );\r\n\r\n private promoteCurrent(entry: ResourceEntry<unknown>, promote = true) {\r\n if (!promote) {\r\n return;\r\n }\r\n\r\n this.#value.set((entry.data as Data) ?? null);\r\n this.#status.set(entry.status);\r\n this.#error.set(entry.error);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nimport { PaginatedDataStoreConfig } from '.';\r\n\r\nexport const PDS_CONFIG = new InjectionToken<PaginatedDataStoreConfig>('RE_PDS_CONFIG');\r\n","// noinspection ES6PreferShortImport\r\n\r\nimport { DestroyRef, inject, signal, WritableSignal } from '@angular/core';\r\n\r\nimport { AnyDict, concatArray, isNullable, PageableResponse, Query, QueryParams } from '@reforgium/internal';\r\n\r\nimport { LruCache } from '../../cache/storages/lru.storage';\r\nimport { isAbort, ResourceStore } from '../../stores/resource-store';\r\n\r\nimport { PaginatedDataConfig, PDS_CONFIG } from '.';\r\n\r\ntype PaginationType = {\r\n page?: number;\r\n first?: number | null;\r\n rows?: number | null;\r\n sortField?: string | string[] | null;\r\n sortOrder?: number | null;\r\n};\r\n\r\n/**\r\n * Store for paginated data (tables/lists) with per-page cache and unified requests.\r\n *\r\n * Provides:\r\n * - reactive signals: `items`, `loading`, `cached`;\r\n * - methods to control page/size/filters/sorting;\r\n * - optional LRU cache by pages;\r\n * - configurable transport (GET/POST/PATCH/…).\r\n *\r\n * Example:\r\n * ```ts\r\n * const ds = new PaginatedDataStore<User>('/users', { method: 'GET', hasCache: true });\r\n * await ds.updatePage(0); // load the first page\r\n * effect(() => console.log(ds.items(), ds.loading()));\r\n * ```\r\n */\r\nexport class PaginatedDataStore<ItemsType extends object, FilterType = unknown> {\r\n private readonly defaultConfig = inject(PDS_CONFIG, { optional: true }) || {};\r\n\r\n #transport!: ResourceStore<PageableResponse<ItemsType> | ItemsType[]>;\r\n #cache: LruCache<number, ItemsType[]>;\r\n\r\n /** Current page data (reactive). */\r\n items: WritableSignal<ItemsType[]> = signal<ItemsType[]>([]);\r\n /** Merged cache of pages (flat list) — handy for search/export. */\r\n cached = signal<ItemsType[]>([]);\r\n /** Loading flag of the current operation. */\r\n loading = signal(false);\r\n\r\n /** Current filters (applied to requests). */\r\n filters: Partial<FilterType> = {};\r\n /** Current sorting (`field,asc|desc`). */\r\n sort?: string | ReadonlyArray<string>;\r\n\r\n /** Current page index (0-based). */\r\n page = 0;\r\n /** Default page size. */\r\n pageSize = 20;\r\n /** Total number of elements reported by the server. */\r\n totalElements = 0;\r\n\r\n /**\r\n * @param route Resource URL pattern (e.g., `'/users'`)\r\n * @param config Store behavior: method, cache, request/response parsers, debounce, presets, etc.\r\n */\r\n constructor(\r\n private route: string,\r\n public config: PaginatedDataConfig<ItemsType, FilterType> = {},\r\n ) {\r\n this.#cache = new LruCache<number, ItemsType[]>(config.cacheSize!);\r\n this.applyConfig(config);\r\n this.applyPresetMeta();\r\n this.initTransport();\r\n\r\n inject(DestroyRef).onDestroy(() => this.destroy());\r\n }\r\n\r\n /** Force reload current data (with the same page/filters/sort). */\r\n refresh() {\r\n return this.#fetchItems({});\r\n }\r\n\r\n /**\r\n * Switch page with a request.\r\n * If cache is enabled and the page is present in LRU — returns it from cache.\r\n * @param page page index (0-based)\r\n * @param ignoreCache ignore cache and fetch from network\r\n */\r\n updatePage = (page = this.page, ignoreCache = false) => {\r\n if (this.config.hasCache && this.#cache.has(page) && !ignoreCache) {\r\n const cached = this.#cache.get(page)!;\r\n\r\n this.items.set(cached);\r\n this.page = page;\r\n\r\n return Promise.resolve(cached);\r\n } else {\r\n return this.#fetchItems({ page });\r\n }\r\n };\r\n\r\n /**\r\n * Change page size (will go to the first page) and fetch.\r\n * @param size new size (rows per page)\r\n */\r\n updatePageSize = (size = this.pageSize) => {\r\n return this.#fetchItems({ page: 0, size });\r\n };\r\n\r\n /**\r\n * Update filters (goes to the first page) and fetch.\r\n * The previous cache is cleared.\r\n */\r\n updateFilters = (filters: Partial<FilterType>) => {\r\n this.#cache.clear();\r\n this.cached.set([]);\r\n\r\n return this.#fetchItems({ page: 0, filters: { ...this.filters, ...filters } });\r\n };\r\n\r\n /**\r\n * Update the state from table events (PrimeNG, etc.) and fetch.\r\n * Supports `page/first/rows/sortField/sortOrder`.\r\n */\r\n updateQuery = ({ page: pageNum, first = 0, rows = 0, sortOrder, sortField }: PaginationType) => {\r\n const page = (pageNum ?? (first && rows && Math.floor(first / rows))) || 0;\r\n const sort = sortField ? `${sortField},${sortOrder === 1 ? 'asc' : 'desc'}` : '';\r\n\r\n return this.#fetchItems({ page, sort });\r\n };\r\n\r\n /**\r\n * Set filters from scratch (goes to the first page and resets sorting) and fetch.\r\n * Useful for quick presets.\r\n */\r\n setFilters = (filters: Partial<FilterType> = {}) => {\r\n this.#cache.clear();\r\n this.cached.set([]);\r\n\r\n return this.#fetchItems({ page: 0, filters, sort: undefined });\r\n };\r\n\r\n /**\r\n * Change the resource route (resets page, cache, and presets) without fetching.\r\n * Useful when one store should work with different endpoints.\r\n */\r\n updateRoute = (route: string) => {\r\n this.route = route;\r\n this.page = 0;\r\n this.pageSize = 20;\r\n this.totalElements = 0;\r\n this.#cache.clear();\r\n this.cached.set([]);\r\n this.initTransport();\r\n };\r\n\r\n /**\r\n * Update store config on the fly (without re-creation).\r\n * Does not trigger loading automatically.\r\n */\r\n updateConfig = (config: PaginatedDataConfig<ItemsType>) => {\r\n this.config = { ...this.config, ...config };\r\n this.applyPresetMeta();\r\n };\r\n\r\n /**\r\n * Copy configuration and presets from another store of the same type.\r\n */\r\n copy(helper: PaginatedDataStore<ItemsType, FilterType>) {\r\n this.applyConfig(helper.config);\r\n this.applyPresetMeta();\r\n }\r\n\r\n /** Clean up resources and cancel active requests. Automatically called onDestroy. */\r\n destroy() {\r\n try {\r\n this.#transport?.abortAll?.('PaginatedDataStore destroyed');\r\n } catch (e: unknown) {\r\n if (!isAbort(e)) {\r\n throw e;\r\n }\r\n }\r\n }\r\n\r\n #fetchItems = async ({\r\n page = this.page,\r\n size = this.pageSize,\r\n sort = this.sort,\r\n filters = this.filters,\r\n }: QueryParams<FilterType>) => {\r\n const query = this.parseQuery({ page, size, sort, filters });\r\n\r\n this.loading.set(true);\r\n this.#transport.abortAll();\r\n\r\n try {\r\n const response = await this.runTransport(filters, query);\r\n\r\n this.page = page;\r\n this.sort = sort;\r\n this.filters = filters;\r\n\r\n const parsed = await this.parseResponseData(response);\r\n\r\n this.pageSize = parsed.pageable?.pageSize || size;\r\n this.totalElements = parsed.totalElements;\r\n this.items.set(parsed.content);\r\n this.updateCache(parsed.content);\r\n\r\n return parsed.content;\r\n } catch (e) {\r\n if (isAbort(e)) {\r\n return;\r\n }\r\n\r\n throw e;\r\n } finally {\r\n this.loading.set(false);\r\n }\r\n };\r\n\r\n private initTransport() {\r\n this.#transport = new ResourceStore<PageableResponse<ItemsType> | ItemsType[]>(\r\n { [this.config.method || 'GET']: this.route },\r\n {\r\n delay: this.config.debounceTime,\r\n delayMode: 'debounce',\r\n presetQueries: { page: this.page, size: this.pageSize, sort: this.sort },\r\n presetPayload: this.filters,\r\n },\r\n );\r\n }\r\n\r\n private async runTransport(payload: Partial<FilterType>, query: Query) {\r\n if (this.config.method === 'GET') {\r\n return this.#transport.get<never, AnyDict>({ query }, { promote: false, dedupe: true });\r\n }\r\n\r\n const method = this.config.method?.toLowerCase() || 'post';\r\n\r\n // @ts-ignore\r\n return this.#transport[method]<never, AnyDict, Partial<FilterType>, PageableResponse<ItemsType> | ItemsType[]>(\r\n { query, payload },\r\n { promote: false, dedupe: true },\r\n );\r\n }\r\n\r\n private parseQuery({ page = 0, size, sort, filters }: QueryParams<FilterType>) {\r\n const method = this.config.method || 'GET';\r\n const requestPayload = { page, size, ...(method === 'GET' ? filters : {}) };\r\n const rawQueries = this.config.parseRequest?.({ ...requestPayload, sort }) || requestPayload;\r\n const queries: Query = {};\r\n\r\n Object.entries(rawQueries).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n queries[key] = concatArray(value, 'comma');\r\n } else if (!isNullable(value)) {\r\n queries[key] = value;\r\n }\r\n });\r\n sort && (queries['sort'] = sort);\r\n\r\n return queries;\r\n }\r\n\r\n private parseResponseData = async (\r\n data: PageableResponse<ItemsType> | ItemsType[],\r\n ): Promise<PageableResponse<ItemsType>> => {\r\n if (this.config?.parseResponse) {\r\n // noinspection ES6RedundantAwait\r\n return await this.config.parseResponse(data);\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n return this.parseFlatArray(data);\r\n }\r\n\r\n return data as PageableResponse<ItemsType>;\r\n };\r\n\r\n private updateCache = (data: ItemsType[]) => {\r\n if (this.config.hasCache) {\r\n this.#cache.set(this.page, data);\r\n }\r\n\r\n this.cached.set(Array.from(this.#cache.values()).flat());\r\n };\r\n\r\n private parseFlatArray(data: ItemsType[]): PageableResponse<ItemsType> {\r\n return { content: data, totalElements: data.length };\r\n }\r\n\r\n private applyConfig(config: PaginatedDataConfig<ItemsType, FilterType>) {\r\n this.config = {\r\n ...config,\r\n method: config.method || this.defaultConfig.defaultMethod || 'POST',\r\n presetQuery: config.presetQuery || this.defaultConfig.defaultQuery,\r\n parseRequest: config.parseRequest || this.defaultConfig.defaultParseRequest,\r\n debounceTime: config.debounceTime || 0,\r\n hasCache: config.hasCache === undefined ? this.defaultConfig.defaultHasCache : config.hasCache,\r\n cacheSize: config.cacheSize || this.defaultConfig.defaultCacheSize || 5,\r\n };\r\n }\r\n\r\n private applyPresetMeta() {\r\n this.filters = this.config.presetFilters || {};\r\n this.pageSize = this.config.presetQuery?.pageSize || 20;\r\n this.page = this.config.presetQuery?.page || 0;\r\n this.sort = this.config.presetQuery?.sort;\r\n }\r\n}\r\n","import { computed, effect, EffectRef, signal, untracked } from '@angular/core';\r\n\r\nimport { AnyDict } from '@reforgium/internal';\r\n\r\nimport { LruCache, StorageInterface, StorageStrategy, storageStrategy } from '../../cache';\r\n// noinspection ES6PreferShortImport\r\nimport { PaginatedDataStore } from '../../stores/paginated-data-store';\r\nimport { DictStoreConfig, FilterType, ValueType } from './dict.models';\r\n\r\n/**\r\n * Dictionary store (select/options) with local LRU cache and optional persistence.\r\n *\r\n * Provides:\r\n * - reactive `items` (current list) and `options` (label/value),\r\n * - local cache filtering (`fixed: true`) or server-side search by name (`fixed: false`),\r\n * - preload and restore cache from `storage` (`localStorage/session/LRU`),\r\n * - smooth integration with `PaginatedDataStore` for server fetching.\r\n *\r\n * Example:\r\n * ```ts\r\n * const dict = new DictStore<Country>('/countries', 'countries', { labelKey: 'name', valueKey: 'code' });\r\n * dict.search('ki'); // filters locally (fixed=true) or goes to server (fixed=false)\r\n * effect(() => console.log(dict.options())); // [{label:'Kyrgyzstan', value: 'KG'}, ...]\r\n * ```\r\n */\r\nexport class DictStore<Type extends AnyDict> {\r\n static readonly MAX_CACHE_SIZE = 400;\r\n\r\n #helper: PaginatedDataStore<Type, FilterType>;\r\n #lru = new LruCache<string, Type>(DictStore.MAX_CACHE_SIZE);\r\n #effectRefs: EffectRef[] = [];\r\n\r\n private readonly fixed: boolean = true;\r\n private readonly labelKey: keyof Type & string;\r\n private readonly valueKey: keyof Type & string;\r\n private readonly maxOptionsSize?: number;\r\n private readonly storage?: StorageInterface<string, Type[]>;\r\n\r\n /**\r\n * Search text.\r\n * With `fixed: true` filters the local cache; with `fixed: false` triggers server search.\r\n */\r\n searchText = signal<string>('');\r\n\r\n /**\r\n * Additional filters for server request (or presets).\r\n */\r\n filters = signal<AnyDict>({});\r\n\r\n private cachedItems = signal<readonly Type[]>([]);\r\n\r\n /**\r\n * Current list of dictionary items.\r\n * Source — local cache (fixed=true) or data from `PaginatedDataStore`.\r\n */\r\n items = computed<readonly Type[]>(() => {\r\n const cached = this.cachedItems();\r\n\r\n if (!this.fixed) {\r\n return this.searchText() || !cached.length ? this.#helper.items() : cached;\r\n }\r\n\r\n return cached.length ? this.filterLocal() : this.#helper.items();\r\n });\r\n\r\n /**\r\n * Ready-to-use dropdown options: `{ label, value }`.\r\n * Respects `maxOptionsSize` for truncating the list.\r\n */\r\n options = computed(() => {\r\n const options = this.items().map((it) => ({ label: String(it[this.labelKey] ?? ''), value: it[this.valueKey] }));\r\n\r\n return this.maxOptionsSize ? options.slice(0, this.maxOptionsSize) : options;\r\n });\r\n private _lastPromise: Promise<unknown> | null = null;\r\n private _armed = signal(false);\r\n\r\n // todo add i18n support\r\n /**\r\n * @param apiUrl dictionary endpoint (e.g., `'/api/dicts/countries'`)\r\n * @param storageKey key for saving cache in the selected strategy\r\n * @param cfg behavior (fixed/search, parsers, label/value keys, cache strategy, etc.)\r\n */\r\n constructor(\r\n private apiUrl: string,\r\n private storageKey: string,\r\n {\r\n method,\r\n autoLoad = true,\r\n presetFilters,\r\n parseResponse,\r\n parseRequest,\r\n debounceTime,\r\n fixed = true,\r\n maxOptionsSize,\r\n labelKey = 'name',\r\n valueKey = 'code',\r\n cacheStrategy = 'persist',\r\n }: DictStoreConfig<Type>,\r\n ) {\r\n this.#helper = new PaginatedDataStore<Type, FilterType>(this.apiUrl, {\r\n method: method,\r\n hasCache: false,\r\n presetFilters: { name: '', ...presetFilters },\r\n parseResponse: parseResponse,\r\n parseRequest: parseRequest,\r\n debounceTime: debounceTime,\r\n });\r\n this.fixed = fixed;\r\n this.labelKey = labelKey;\r\n this.valueKey = valueKey;\r\n this.maxOptionsSize = maxOptionsSize;\r\n this._armed.set(autoLoad);\r\n\r\n if (cacheStrategy !== 'memory') {\r\n this.storage = storageStrategy<string, Type[]>(cacheStrategy as StorageStrategy);\r\n }\r\n\r\n this.restoreFromStorage();\r\n\r\n this.#effectRefs.push(\r\n effect(() => {\r\n const incoming = this.#helper.items();\r\n\r\n if (incoming.length === 0) {\r\n return;\r\n }\r\n\r\n untracked(() => this.mergeIntoCache(incoming));\r\n }),\r\n );\r\n\r\n this.#effectRefs.push(\r\n effect(() => {\r\n if (!this._armed()) {\r\n return;\r\n }\r\n\r\n const rest = this.filters();\r\n\r\n if (!this.fixed) {\r\n const query = this.searchText().trim();\r\n\r\n this._lastPromise = untracked(() => this.#helper.updateFilters({ name: query, ...rest }));\r\n } else if (!this.cachedItems().length) {\r\n this._lastPromise = untracked(() => this.#helper.updateFilters({ name: '', ...rest }));\r\n }\r\n }),\r\n );\r\n }\r\n\r\n /** Restore cache from the selected storage (`persist`/`session`/`lru`/`memory`). */\r\n restoreCache() {\r\n this.restoreFromStorage();\r\n }\r\n\r\n /**\r\n * Set a search query and filters.\r\n * With `fixed: false` initiates server search; with `fixed: true` — local filtering.\r\n */\r\n search = (name = '', filters: AnyDict = {}) => {\r\n this._armed.set(true);\r\n this.searchText.set(name);\r\n this.filters.set(filters);\r\n };\r\n\r\n /**\r\n * Find display label by value (typically for reverse binding).\r\n * @returns label string or `undefined` if not found\r\n */\r\n findLabel = (value: ValueType): string | undefined => {\r\n for (const item of this.cachedItems()) {\r\n if (item[this.valueKey] === value) {\r\n return String(item[this.labelKey] ?? undefined);\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Preload dictionary items into a local cache.\r\n * Useful for SSR/static lists/quick presets.\r\n *\r\n * @param items list of items\r\n * @param opts `{ replace?: true }` — completely replace current cache\r\n */\r\n preload = (items: readonly Type[], opts?: { replace?: boolean }) => {\r\n opts?.replace && this.#lru.clear();\r\n let changed = false;\r\n\r\n for (const it of items) {\r\n const key = this.keyOf(it);\r\n\r\n if (!key) {\r\n continue;\r\n }\r\n\r\n const existed = this.#lru.has(key);\r\n\r\n this.#lru.set(key, it);\r\n !existed && (changed = true);\r\n }\r\n\r\n if (changed || opts?.replace) {\r\n const arr = this.#lru.toArray();\r\n\r\n this.cachedItems.set(arr);\r\n this.storage?.set(this.storageKey, arr.slice(0, DictStore.MAX_CACHE_SIZE));\r\n }\r\n };\r\n\r\n /** Release resources and stop internal effects. */\r\n dispose() {\r\n this.#effectRefs.forEach((e) => e.destroy());\r\n this.#effectRefs = [];\r\n }\r\n\r\n /** Syntactic sugar for `using`/`Symbol.dispose`. */\r\n [Symbol.dispose]() {\r\n this.dispose();\r\n }\r\n\r\n private mergeIntoCache(items: Type[]) {\r\n let changed = 0;\r\n\r\n for (const it of items) {\r\n const key = this.keyOf(it);\r\n const before = this.#lru.has(key);\r\n\r\n this.#lru.set(key, it);\r\n !before && changed++;\r\n }\r\n\r\n if (changed > 0) {\r\n const arr = this.#lru.toArray();\r\n\r\n this.cachedItems.set(arr);\r\n this.storage?.set(this.storageKey, arr.slice(0, DictStore.MAX_CACHE_SIZE));\r\n }\r\n }\r\n\r\n private restoreFromStorage() {\r\n try {\r\n const array = this.storage?.get(this.storageKey);\r\n\r\n if (!array) {\r\n return;\r\n }\r\n\r\n for (const it of array) {\r\n const key = this.keyOf(it);\r\n\r\n this.#lru.set(key, it);\r\n }\r\n\r\n this.cachedItems.set(this.#lru.toArray());\r\n } catch {\r\n try {\r\n this.storage?.remove(this.storageKey);\r\n } catch {\r\n /* noop */\r\n }\r\n }\r\n }\r\n\r\n private filterLocal() {\r\n const list = this.cachedItems();\r\n const query = this.searchText().toLowerCase();\r\n\r\n if (!query) {\r\n return list;\r\n }\r\n\r\n const key = this.labelKey;\r\n const out: Type[] = [];\r\n\r\n for (let i = 0; i < list.length; i++) {\r\n const val = list[i][key];\r\n\r\n val.toLowerCase().includes(query) && out.push(list[i]);\r\n }\r\n\r\n return out;\r\n }\r\n\r\n private keyOf(it: Type) {\r\n const raw = it[this.valueKey] as unknown;\r\n\r\n if (raw == null) {\r\n return '';\r\n }\r\n\r\n return typeof raw === 'string' ? raw : String(raw);\r\n }\r\n}\r\n","import { computed, signal } from '@angular/core';\r\n\r\nimport { AnyDict } from '@reforgium/internal';\r\n\r\nimport { DictLocalConfig, ValueType } from './dict.models';\r\n\r\nexport class DictLocalStore<Type extends AnyDict> {\r\n items = signal<readonly Type[]>([]);\r\n #draftItems = signal<readonly Type[]>([]);\r\n\r\n /**\r\n * Ready-to-use options for dropdowns: `{ label, value }`.\r\n * Respects `maxOptionsSize` to truncate the list.\r\n */\r\n options = computed(() => {\r\n const options = this.#draftItems().map((it) => ({\r\n label: String(it[this.labelKey] ?? ''),\r\n value: it[this.valueKey],\r\n }));\r\n\r\n return this.maxOptionsSize ? options.slice(0, this.maxOptionsSize) : options;\r\n });\r\n\r\n private readonly labelKey: keyof Type & string;\r\n private readonly valueKey: keyof Type & string;\r\n private readonly maxOptionsSize?: number;\r\n\r\n constructor(items: Type[], config?: DictLocalConfig<Type>) {\r\n this.labelKey = config?.labelKey ?? 'label';\r\n this.valueKey = config?.valueKey ?? 'value';\r\n this.maxOptionsSize = config?.maxOptionsSize ?? 1000;\r\n\r\n this.items.set(items);\r\n this.#draftItems.set(items);\r\n }\r\n\r\n /**\r\n * No-op method for API compatibility with DictStore.\r\n */\r\n restoreCache() {}\r\n\r\n /**\r\n * Find display label by value (usually for reverse binding).\r\n * @returns label string or `undefined` if not found\r\n */\r\n findLabel = (value: ValueType): string | undefined => {\r\n for (const item of this.items()) {\r\n if (item[this.valueKey] === value) {\r\n return String(item[this.labelKey] ?? undefined);\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n search = (name = '') => {\r\n const items = this.items();\r\n\r\n if (name?.length) {\r\n this.#draftItems.set(\r\n items.filter((item) => String(item[this.labelKey]).toLowerCase().includes(name.toLowerCase())),\r\n );\r\n } else {\r\n this.#draftItems.set(items);\r\n }\r\n };\r\n\r\n preload = (items: readonly Type[], opts?: { replace?: boolean }) => {\r\n if (opts?.replace) {\r\n this.items.set(items);\r\n this.#draftItems.set(items);\r\n } else {\r\n const patch = [...this.items(), ...items] as readonly Type[];\r\n\r\n this.items.set(patch);\r\n this.#draftItems.set(patch);\r\n }\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["rxDebounce","rxThrottle"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -546,7 +546,7 @@ type PaginatedDataConfig<ItemsType extends object, FilterType = unknown> = {
|
|
|
546
546
|
* Custom parser of API response into unified `PageableResponse<ItemsType>`.
|
|
547
547
|
* Use if the server returns an array or a "non-standard" structure.
|
|
548
548
|
*/
|
|
549
|
-
parseResponse?: (data: AnyType) => PageableResponse<ItemsType
|
|
549
|
+
parseResponse?: (data: AnyType) => PageableResponse<ItemsType> | Promise<PageableResponse<ItemsType>>;
|
|
550
550
|
};
|
|
551
551
|
/**
|
|
552
552
|
* Global defaults for `PaginatedDataStore`.
|
|
@@ -632,11 +632,11 @@ declare class PaginatedDataStore<ItemsType extends object, FilterType = unknown>
|
|
|
632
632
|
updatePageSize: (size?: number) => Promise<ItemsType[] | undefined>;
|
|
633
633
|
/**
|
|
634
634
|
* Update filters (goes to the first page) and fetch.
|
|
635
|
-
*
|
|
635
|
+
* The previous cache is cleared.
|
|
636
636
|
*/
|
|
637
637
|
updateFilters: (filters: Partial<FilterType>) => Promise<ItemsType[] | undefined>;
|
|
638
638
|
/**
|
|
639
|
-
* Update state from table events (PrimeNG, etc.) and fetch.
|
|
639
|
+
* Update the state from table events (PrimeNG, etc.) and fetch.
|
|
640
640
|
* Supports `page/first/rows/sortField/sortOrder`.
|
|
641
641
|
*/
|
|
642
642
|
updateQuery: ({ page: pageNum, first, rows, sortOrder, sortField }: PaginationType) => Promise<ItemsType[] | undefined>;
|
|
@@ -646,7 +646,7 @@ declare class PaginatedDataStore<ItemsType extends object, FilterType = unknown>
|
|
|
646
646
|
*/
|
|
647
647
|
setFilters: (filters?: Partial<FilterType>) => Promise<ItemsType[] | undefined>;
|
|
648
648
|
/**
|
|
649
|
-
* Change resource route (resets page, cache, and presets) without fetching.
|
|
649
|
+
* Change the resource route (resets page, cache, and presets) without fetching.
|
|
650
650
|
* Useful when one store should work with different endpoints.
|
|
651
651
|
*/
|
|
652
652
|
updateRoute: (route: string) => void;
|
|
@@ -659,7 +659,7 @@ declare class PaginatedDataStore<ItemsType extends object, FilterType = unknown>
|
|
|
659
659
|
* Copy configuration and presets from another store of the same type.
|
|
660
660
|
*/
|
|
661
661
|
copy(helper: PaginatedDataStore<ItemsType, FilterType>): void;
|
|
662
|
-
/** Clean up resources and cancel active requests.
|
|
662
|
+
/** Clean up resources and cancel active requests. Automatically called onDestroy. */
|
|
663
663
|
destroy(): void;
|
|
664
664
|
private initTransport;
|
|
665
665
|
private runTransport;
|
|
@@ -741,7 +741,7 @@ type ValueType = string[] | string | number | null | undefined;
|
|
|
741
741
|
* ```ts
|
|
742
742
|
* const dict = new DictStore<Country>('/countries', 'countries', { labelKey: 'name', valueKey: 'code' });
|
|
743
743
|
* dict.search('ki'); // filters locally (fixed=true) or goes to server (fixed=false)
|
|
744
|
-
* effect(() => console.log(dict.options())); // [{label:'Kyrgyzstan', value:'KG'}, ...]
|
|
744
|
+
* effect(() => console.log(dict.options())); // [{label:'Kyrgyzstan', value: 'KG'}, ...]
|
|
745
745
|
* ```
|
|
746
746
|
*/
|
|
747
747
|
declare class DictStore<Type extends AnyDict> {
|
|
@@ -785,31 +785,31 @@ declare class DictStore<Type extends AnyDict> {
|
|
|
785
785
|
* @param cfg behavior (fixed/search, parsers, label/value keys, cache strategy, etc.)
|
|
786
786
|
*/
|
|
787
787
|
constructor(apiUrl: string, storageKey: string, { method, autoLoad, presetFilters, parseResponse, parseRequest, debounceTime, fixed, maxOptionsSize, labelKey, valueKey, cacheStrategy, }: DictStoreConfig<Type>);
|
|
788
|
-
/**
|
|
788
|
+
/** Restore cache from the selected storage (`persist`/`session`/`lru`/`memory`). */
|
|
789
789
|
restoreCache(): void;
|
|
790
790
|
/**
|
|
791
|
-
*
|
|
792
|
-
*
|
|
791
|
+
* Set a search query and filters.
|
|
792
|
+
* With `fixed: false` initiates server search; with `fixed: true` — local filtering.
|
|
793
793
|
*/
|
|
794
794
|
search: (name?: string, filters?: AnyDict) => void;
|
|
795
795
|
/**
|
|
796
|
-
*
|
|
797
|
-
* @returns
|
|
796
|
+
* Find display label by value (typically for reverse binding).
|
|
797
|
+
* @returns label string or `undefined` if not found
|
|
798
798
|
*/
|
|
799
799
|
findLabel: (value: ValueType) => string | undefined;
|
|
800
800
|
/**
|
|
801
|
-
*
|
|
802
|
-
*
|
|
801
|
+
* Preload dictionary items into a local cache.
|
|
802
|
+
* Useful for SSR/static lists/quick presets.
|
|
803
803
|
*
|
|
804
|
-
* @param items
|
|
805
|
-
* @param opts `{ replace?: true }` —
|
|
804
|
+
* @param items list of items
|
|
805
|
+
* @param opts `{ replace?: true }` — completely replace current cache
|
|
806
806
|
*/
|
|
807
807
|
preload: (items: readonly Type[], opts?: {
|
|
808
808
|
replace?: boolean;
|
|
809
809
|
}) => void;
|
|
810
|
-
/**
|
|
810
|
+
/** Release resources and stop internal effects. */
|
|
811
811
|
dispose(): void;
|
|
812
|
-
/**
|
|
812
|
+
/** Syntactic sugar for `using`/`Symbol.dispose`. */
|
|
813
813
|
[Symbol.dispose](): void;
|
|
814
814
|
private mergeIntoCache;
|
|
815
815
|
private restoreFromStorage;
|
|
@@ -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/serializer/serializer.provider.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.provider.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"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":";;;;AAEA;;;;;AAKG;;AAGH;;;AAGG;AACH;AACA;AACA;AAEA;;;;;;AAMG;AACG;;;;AAKN;;AAEG;AACG;;;AAIA;;AAAmC;AAEzC;;;;AAIA;;;;;AAMA;;;;AAKM;AACJ;;AAA6B;AAC7B;;AAAmC;AACnC;;;AAA6C;AAC7C;;AAAgC;AAEhC;;;;;;AAMG;AACH;AACE;;AAED;AAED;;;;;AAKG;AACH;;;;AAAqF;AAIrF;;;;;AAKG;AACH;AAAY;;AAAkE;AAE9E;;;;AAIG;AACH;;AAA4B;AAE5B;;AAEG;;;AAIL;;AAEG;AACG;AAEN;;AAEG;AACG;;AC/FN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;AACH;AACE;AAEA;;;;;AAKG;AACS;AAiBZ;;;;;;;;;;;;;;AAcG;AACH;AAkCA;;;;;;;;;;;;AAYG;AACH;AAmDA;;;;;;AAMG;AACH;AAIA;;;;;;AAMG;;AAKH;AAiEA;AA2EA;AAuBD;;AC9WD;;ACJM;;;;;ACGJ;;;;;ACDF;AAGqB;;AAAA;;;AAmBnB;AAYA;AAIA;AAIA;;;;;AAuBD;;AC3DD;;;;;;;;;;;;;;AAcG;AACH;;ACjBA;;;AAGG;AACG;AAEN;;;AAGG;AACG;AAEN;;;;;;;AAOG;AACG;AAEN;;;;AAIG;;AAGH;;;;;;AAMG;AACG;AAEN;;;AAGG;AACG;AAEN;;AAEG;AACG;;;;;;;;;;;;;;AAyCN;;;;;AAKG;AACG;;;;;AAUN;;AAEG;;;;;;;;AAQD;;;AAGG;;AAEH;;;;;;;;AAQG;;AAEH;;;AAGG;;;AAIL;;AAEG;AACG;AAEN;;AAEG;AACG;;;;;;AC7HN;;;;;;;;;;;;;;;;;;;AAmBG;AACH;;AACE;AACA;AAMA;;;AAGG;AACH;AAEA;;AAEG;AACH;AAEA;;AAEG;AACH;AAEA;;;AAGG;AACH;AAEA;AACA;AACA;AACA;AAEA;;;AAGG;AACS;AAKZ;;;;;;;;;AASG;AACG;AA8DN;;;;;;AAMG;;AAUH;;;;;;AAMG;;AAUH;;;;;;AAMG;;AAUH;;;;;;AAMG;;AAUH;;;;;;AAMG;AACH;AAWA;;;;AAIG;AACH;AAIA;;AAiEA;AAYA;;AA+BA;AASD;;AC/WD;;;;;;;;;;;;;;AAcG;AACH;AAC8B;AAAA;AAI7B;AAED;;;;;AAKG;AACH;AACc;AAIb;AAED;;;;;AAKG;AACH;;ACzCA;;;;;AAKG;AACG;;;;;;;;;;AAcJ;;;;;;AAGA;AAEA;;;AAGG;;AAGH;;;AAGG;;;
|
|
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.provider.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.provider.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"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
|