@reforgium/statum 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@reforgium/statum)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
|
-
**Signals-first state stores and caching utilities for Angular (
|
|
6
|
+
**Signals-first state stores and caching utilities for Angular (18+).**
|
|
7
7
|
|
|
8
8
|
`@reforgium/statum` provides a set of **API-oriented stores**, **cache strategies**, and a
|
|
9
9
|
**serialization layer** for building predictable data flows in Angular applications.
|
|
@@ -33,9 +33,9 @@ npm install @reforgium/statum
|
|
|
33
33
|
|
|
34
34
|
## Package Structure
|
|
35
35
|
|
|
36
|
-
- **Cache**
|
|
37
|
-
- **Stores**
|
|
38
|
-
- **Serializer**
|
|
36
|
+
- **Cache** - storage strategies for caching
|
|
37
|
+
- **Stores** - reusable state containers over HttpClient
|
|
38
|
+
- **Serializer** - configurable data transformation utility
|
|
39
39
|
|
|
40
40
|
---
|
|
41
41
|
|
|
@@ -47,10 +47,10 @@ npm install @reforgium/statum
|
|
|
47
47
|
|
|
48
48
|
Available strategies:
|
|
49
49
|
|
|
50
|
-
- `persist`
|
|
51
|
-
- `session`
|
|
52
|
-
- `memory`
|
|
53
|
-
- `lru`
|
|
50
|
+
- `persist` - browser localStorage
|
|
51
|
+
- `session` - browser sessionStorage
|
|
52
|
+
- `memory` - in-memory storage
|
|
53
|
+
- `lru` - size-limited in-memory cache
|
|
54
54
|
|
|
55
55
|
### StorageInterface
|
|
56
56
|
|
|
@@ -89,7 +89,7 @@ Transport-level store over HttpClient with cache strategies, deduplication, abor
|
|
|
89
89
|
|
|
90
90
|
### When to use
|
|
91
91
|
|
|
92
|
-
- CRUD and
|
|
92
|
+
- CRUD and "resource" endpoints
|
|
93
93
|
- Centralized debounce/throttle
|
|
94
94
|
- Abort in-flight / delayed requests (latest-wins)
|
|
95
95
|
- Dedupe identical calls to one HTTP request
|
|
@@ -97,24 +97,24 @@ Transport-level store over HttpClient with cache strategies, deduplication, abor
|
|
|
97
97
|
|
|
98
98
|
### Signals
|
|
99
99
|
|
|
100
|
-
| Signal | Type
|
|
101
|
-
|
|
102
|
-
| value | `Signal<T
|
|
103
|
-
| status | `
|
|
104
|
-
| error | `Signal<unknown
|
|
105
|
-
| loading | `Signal<boolean>`
|
|
100
|
+
| Signal | Type | Description |
|
|
101
|
+
|---------|---------------------------|-------------------------|
|
|
102
|
+
| value | `Signal<T \| null>` | Last successful value |
|
|
103
|
+
| status | `Signal<ResourceStatus>` | Resource status |
|
|
104
|
+
| error | `Signal<unknown \| null>` | Last error |
|
|
105
|
+
| loading | `Signal<boolean>` | Request in progress |
|
|
106
106
|
|
|
107
107
|
### Methods
|
|
108
108
|
|
|
109
|
-
| Method
|
|
110
|
-
|
|
111
|
-
| get
|
|
112
|
-
| post
|
|
113
|
-
| put
|
|
114
|
-
| patch
|
|
115
|
-
| delete
|
|
116
|
-
| abort
|
|
117
|
-
| abortAll | Abort all requests
|
|
109
|
+
| Method | Description |
|
|
110
|
+
|----------|--------------------------|
|
|
111
|
+
| get | GET request |
|
|
112
|
+
| post | POST request |
|
|
113
|
+
| put | PUT request |
|
|
114
|
+
| patch | PATCH request |
|
|
115
|
+
| delete | DELETE request |
|
|
116
|
+
| abort | Abort a specific request |
|
|
117
|
+
| abortAll | Abort all requests |
|
|
118
118
|
|
|
119
119
|
Example:
|
|
120
120
|
|
|
@@ -138,7 +138,7 @@ const user = await userStore.get(
|
|
|
138
138
|
|
|
139
139
|
## PaginatedDataStore
|
|
140
140
|
|
|
141
|
-
Lightweight store for server-side pagination with sorting, filtering and page cache.
|
|
141
|
+
Lightweight store for server-side pagination with sorting, filtering, and page cache.
|
|
142
142
|
|
|
143
143
|
### When to use
|
|
144
144
|
|
|
@@ -149,16 +149,16 @@ Lightweight store for server-side pagination with sorting, filtering and page ca
|
|
|
149
149
|
|
|
150
150
|
### State
|
|
151
151
|
|
|
152
|
-
| Field / Signal | Type | Description
|
|
153
|
-
|
|
154
|
-
| items | `WritableSignal<T[]>` | Current page items
|
|
155
|
-
| cached | `WritableSignal<T[]>` | Flattened cache of cached pages
|
|
156
|
-
| loading | `WritableSignal<boolean>` | Loading indicator
|
|
157
|
-
| page | `number` | Current page (0-based)
|
|
158
|
-
| pageSize | `number` | Page size
|
|
159
|
-
| totalElements | `number` | Total items on server
|
|
160
|
-
| filters | `Partial<F>` | Active filters
|
|
161
|
-
| sort | `string \| undefined` | Sort as `"field,asc
|
|
152
|
+
| Field / Signal | Type | Description |
|
|
153
|
+
|----------------|---------------------------|----------------------------------------|
|
|
154
|
+
| items | `WritableSignal<T[]>` | Current page items |
|
|
155
|
+
| cached | `WritableSignal<T[]>` | Flattened cache of cached pages |
|
|
156
|
+
| loading | `WritableSignal<boolean>` | Loading indicator |
|
|
157
|
+
| page | `number` | Current page (0-based) |
|
|
158
|
+
| pageSize | `number` | Page size |
|
|
159
|
+
| totalElements | `number` | Total items on server |
|
|
160
|
+
| filters | `Partial<F>` | Active filters |
|
|
161
|
+
| sort | `string \| undefined` | Sort as `"field,asc"` / `"field,desc"` |
|
|
162
162
|
|
|
163
163
|
### Methods
|
|
164
164
|
|
|
@@ -208,8 +208,8 @@ Helper for dictionaries/options (select/autocomplete) on top of PaginatedDataSto
|
|
|
208
208
|
### Key behavior
|
|
209
209
|
|
|
210
210
|
- Two modes:
|
|
211
|
-
- `fixed: true`
|
|
212
|
-
- `fixed: false`
|
|
211
|
+
- `fixed: true` - first load fills local cache; search happens locally
|
|
212
|
+
- `fixed: false` - search goes to server (passes filter `name`)
|
|
213
213
|
- Local cache merges without duplicates and is size-limited
|
|
214
214
|
|
|
215
215
|
### Public API
|
|
@@ -233,17 +233,17 @@ Methods:
|
|
|
233
233
|
|
|
234
234
|
Config:
|
|
235
235
|
|
|
236
|
-
| Option
|
|
237
|
-
|
|
238
|
-
| labelKey
|
|
239
|
-
| valueKey
|
|
240
|
-
| fixed
|
|
241
|
-
| method
|
|
242
|
-
|
|
|
243
|
-
|
|
|
244
|
-
|
|
|
245
|
-
|
|
|
246
|
-
|
|
|
236
|
+
| Option | Type | Default | Description |
|
|
237
|
+
|----------------|--------------------------------------|-------------|---------------------------------------------|
|
|
238
|
+
| labelKey | `string` | `'name'` | Property name to use as option label |
|
|
239
|
+
| valueKey | `string` | `'code'` | Property name to use as option value |
|
|
240
|
+
| fixed | `boolean` | `true` | Use local search instead of server requests |
|
|
241
|
+
| method | `'GET' \| 'POST'` | `'POST'` | HTTP method for requests |
|
|
242
|
+
| debounceTime | `number` | `0` | Debounce time for search requests |
|
|
243
|
+
| maxOptionsSize | `number` | `undefined` | Maximum items exposed in `options` |
|
|
244
|
+
| cacheStrategy | `'persist' \| 'session' \| 'memory'` | `'persist'` | Cache storage strategy |
|
|
245
|
+
| keyPrefix | `string` | `'re'` | Prefix for storage keys |
|
|
246
|
+
| presetFilters | `Record<string, string>` | `{}` | Filters merged into each request |
|
|
247
247
|
|
|
248
248
|
Example:
|
|
249
249
|
|
|
@@ -268,7 +268,7 @@ dict.search('kir'); // local search over cache
|
|
|
268
268
|
|
|
269
269
|
### Serializer
|
|
270
270
|
|
|
271
|
-
Utility for serialization/deserialization between layers (UI
|
|
271
|
+
Utility for serialization/deserialization between layers (UI -> API, objects -> query string).
|
|
272
272
|
|
|
273
273
|
Core API:
|
|
274
274
|
|
|
@@ -182,7 +182,7 @@ class Serializer {
|
|
|
182
182
|
return;
|
|
183
183
|
}
|
|
184
184
|
if (fields?.type === 'nullable' || isNullable(value, this.config.mapNullable?.includeEmptyString)) {
|
|
185
|
-
const nullableVal = value
|
|
185
|
+
const nullableVal = value ?? null;
|
|
186
186
|
return this.config.mapNullable.format?.(nullableVal) || this.config.mapNullable.replaceWith || nullableVal;
|
|
187
187
|
}
|
|
188
188
|
if (fields?.type === 'string') {
|
|
@@ -247,8 +247,7 @@ class Serializer {
|
|
|
247
247
|
if (field?.type === 'object') {
|
|
248
248
|
try {
|
|
249
249
|
if (this.config.mapObject.deep) {
|
|
250
|
-
|
|
251
|
-
return this.deserializeElement(value);
|
|
250
|
+
return isObject(value) ? this.deserialize(value) : value;
|
|
252
251
|
}
|
|
253
252
|
else {
|
|
254
253
|
// @ts-ignore
|
|
@@ -283,7 +282,11 @@ class Serializer {
|
|
|
283
282
|
return this.config.mapNumber.parse?.(value) || Number(String(value).trim());
|
|
284
283
|
}
|
|
285
284
|
if (field?.type === 'string' || typeof value === 'string') {
|
|
286
|
-
|
|
285
|
+
const parsed = this.config.mapString.parse?.(value);
|
|
286
|
+
if (parsed !== undefined) {
|
|
287
|
+
return parsed;
|
|
288
|
+
}
|
|
289
|
+
return this.config.mapString.trim ? String(value).trim() : value;
|
|
287
290
|
}
|
|
288
291
|
return value;
|
|
289
292
|
}
|
|
@@ -354,6 +357,9 @@ class LruCache {
|
|
|
354
357
|
values() {
|
|
355
358
|
return Array.from(this.map.values());
|
|
356
359
|
}
|
|
360
|
+
entries() {
|
|
361
|
+
return Array.from(this.map.entries());
|
|
362
|
+
}
|
|
357
363
|
toArray() {
|
|
358
364
|
return Array.from(this.map.values());
|
|
359
365
|
}
|
|
@@ -519,13 +525,32 @@ function joinUrl(base, path) {
|
|
|
519
525
|
return base ? `${base.replace(/\/$/, '')}/${path.replace(/^\//, '')}` : path;
|
|
520
526
|
}
|
|
521
527
|
function buildKey(method, path, args) {
|
|
522
|
-
const params =
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
528
|
+
const params = stableStringify(args.params || {});
|
|
529
|
+
const query = stableStringify(args.query || {});
|
|
530
|
+
const payload = stableStringify(args.payload || {});
|
|
531
|
+
return `${method}|${path}|${params}|${query}|${payload}`;
|
|
532
|
+
}
|
|
533
|
+
function stableStringify(value) {
|
|
534
|
+
if (value === null || value === undefined) {
|
|
535
|
+
return '';
|
|
536
|
+
}
|
|
537
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
538
|
+
return String(value);
|
|
539
|
+
}
|
|
540
|
+
if (value instanceof Date) {
|
|
541
|
+
return value.toISOString();
|
|
542
|
+
}
|
|
543
|
+
if (Array.isArray(value)) {
|
|
544
|
+
return `[${value.map((entry) => stableStringify(entry)).join(',')}]`;
|
|
545
|
+
}
|
|
546
|
+
if (typeof value === 'object') {
|
|
547
|
+
const entries = Object.entries(value)
|
|
548
|
+
.filter(([, v]) => v !== undefined)
|
|
549
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
550
|
+
.map(([k, v]) => `${k}:${stableStringify(v)}`);
|
|
551
|
+
return `{${entries.join(',')}}`;
|
|
552
|
+
}
|
|
553
|
+
return String(value);
|
|
529
554
|
}
|
|
530
555
|
|
|
531
556
|
/**
|
|
@@ -713,6 +738,7 @@ class ResourceStore {
|
|
|
713
738
|
const url = this.buildUrl('GET', args);
|
|
714
739
|
const key = buildKey('GET', url, args);
|
|
715
740
|
const query = this.prepareQuery(args);
|
|
741
|
+
const responseType = cfg.responseType ?? 'json';
|
|
716
742
|
const entry = this.ensureEntry(key);
|
|
717
743
|
const strategy = cfg.strategy ?? 'network-first';
|
|
718
744
|
const ttlMs = cfg.ttlMs ?? this.opts.ttlMs ?? 0;
|
|
@@ -737,15 +763,15 @@ class ResourceStore {
|
|
|
737
763
|
entry.status = isSWR ? 'stale' : 'loading';
|
|
738
764
|
this.promoteCurrent(entry, cfg.promote);
|
|
739
765
|
const task = this.scheduler.schedule(key, mode, delay, this.exec$({
|
|
740
|
-
req$: this.http.get(url, { params: query }),
|
|
766
|
+
req$: this.http.get(url, { params: query, responseType: responseType }),
|
|
741
767
|
entry,
|
|
742
768
|
promote: cfg.promote,
|
|
743
769
|
parseFn: cfg.parseResponse,
|
|
744
770
|
}));
|
|
745
771
|
cfg.dedupe && (entry.inflight = task);
|
|
746
772
|
void task.catch((e) => {
|
|
747
|
-
if (
|
|
748
|
-
|
|
773
|
+
if (isAbort(e)) {
|
|
774
|
+
return;
|
|
749
775
|
}
|
|
750
776
|
});
|
|
751
777
|
return task;
|
|
@@ -824,6 +850,7 @@ class ResourceStore {
|
|
|
824
850
|
const query = this.prepareQuery(args);
|
|
825
851
|
const payload = { ...(this.opts.presetPayload || {}), ...(args.payload || {}) };
|
|
826
852
|
const serializedPayload = this.serializer.serialize(payload);
|
|
853
|
+
const responseType = config.responseType ?? 'json';
|
|
827
854
|
const entry = this.ensureEntry(key);
|
|
828
855
|
if (config.dedupe && entry.inflight) {
|
|
829
856
|
return entry.inflight;
|
|
@@ -834,17 +861,24 @@ class ResourceStore {
|
|
|
834
861
|
this.promoteCurrent(entry, config.promote);
|
|
835
862
|
let req$;
|
|
836
863
|
if (method === 'DELETE') {
|
|
837
|
-
req$ = this.http.delete(url, {
|
|
864
|
+
req$ = this.http.delete(url, {
|
|
865
|
+
body: serializedPayload,
|
|
866
|
+
params: query,
|
|
867
|
+
responseType: responseType,
|
|
868
|
+
});
|
|
838
869
|
}
|
|
839
870
|
else {
|
|
840
871
|
// @ts-ignore
|
|
841
|
-
req$ = this.http[method.toLowerCase()](url, serializedPayload, {
|
|
872
|
+
req$ = this.http[method.toLowerCase()](url, serializedPayload, {
|
|
873
|
+
params: query,
|
|
874
|
+
responseType: responseType,
|
|
875
|
+
});
|
|
842
876
|
}
|
|
843
877
|
const task = this.scheduler.schedule(key, mode, delay, this.exec$({ req$, entry, promote: config.promote, parseFn: config.parseResponse }));
|
|
844
878
|
config.dedupe && (entry.inflight = task);
|
|
845
879
|
void task.catch((e) => {
|
|
846
|
-
if (
|
|
847
|
-
|
|
880
|
+
if (isAbort(e)) {
|
|
881
|
+
return;
|
|
848
882
|
}
|
|
849
883
|
});
|
|
850
884
|
return task;
|
|
@@ -939,8 +973,8 @@ class PaginatedDataStore {
|
|
|
939
973
|
constructor(route, config = {}) {
|
|
940
974
|
this.route = route;
|
|
941
975
|
this.config = config;
|
|
942
|
-
this.#cache = new LruCache(config.cacheSize);
|
|
943
976
|
this.applyConfig(config);
|
|
977
|
+
this.#cache = new LruCache(this.config.cacheSize);
|
|
944
978
|
this.applyPresetMeta();
|
|
945
979
|
this.initTransport();
|
|
946
980
|
inject(DestroyRef).onDestroy(() => this.destroy());
|
|
@@ -1019,7 +1053,7 @@ class PaginatedDataStore {
|
|
|
1019
1053
|
*
|
|
1020
1054
|
* @param params Dictionary of route parameters (e.g., `{ id: '123' }`)
|
|
1021
1055
|
* @param opts Options object
|
|
1022
|
-
* @param opts.reset If `true
|
|
1056
|
+
* @param opts.reset If `true`, resets page to 0, clears cache, total elements count, and items
|
|
1023
1057
|
* @param opts.abort If `true`, aborts all active transport requests and sets loading to false
|
|
1024
1058
|
*
|
|
1025
1059
|
* @example
|
|
@@ -1059,6 +1093,7 @@ class PaginatedDataStore {
|
|
|
1059
1093
|
*/
|
|
1060
1094
|
updateConfig = (config) => {
|
|
1061
1095
|
this.config = { ...this.config, ...config };
|
|
1096
|
+
this.#cache.limit = this.config.cacheSize || this.defaultConfig.defaultCacheSize || 5;
|
|
1062
1097
|
this.applyPresetMeta();
|
|
1063
1098
|
};
|
|
1064
1099
|
/**
|
|
@@ -1167,6 +1202,9 @@ class PaginatedDataStore {
|
|
|
1167
1202
|
hasCache: config.hasCache === undefined ? this.defaultConfig.defaultHasCache : config.hasCache,
|
|
1168
1203
|
cacheSize: config.cacheSize || this.defaultConfig.defaultCacheSize || 5,
|
|
1169
1204
|
};
|
|
1205
|
+
if (this.#cache) {
|
|
1206
|
+
this.#cache.limit = this.config.cacheSize;
|
|
1207
|
+
}
|
|
1170
1208
|
}
|
|
1171
1209
|
applyPresetMeta() {
|
|
1172
1210
|
this.filters = this.config.presetFilters || {};
|
|
@@ -1216,7 +1254,7 @@ class DictStore {
|
|
|
1216
1254
|
* With `fixed: true` filters the local cache; with `fixed: false` triggers server search.
|
|
1217
1255
|
*/
|
|
1218
1256
|
searchText = signal('', ...(ngDevMode ? [{ debugName: "searchText" }] : []));
|
|
1219
|
-
debouncedSearchText
|
|
1257
|
+
debouncedSearchText;
|
|
1220
1258
|
/**
|
|
1221
1259
|
* Additional filters for server request (or presets).
|
|
1222
1260
|
*/
|
|
@@ -1252,6 +1290,8 @@ class DictStore {
|
|
|
1252
1290
|
constructor(apiUrl, storageKey, { autoLoad = true, method = this.defaultConfig.defaultRestMethod, presetFilters = this.defaultConfig.defaultPresetFilters, parseResponse, parseRequest, debounceTime = this.defaultConfig.defaultDebounceTime, fixed = true, maxOptionsSize = this.defaultConfig.defaultMaxOptionsSize, labelKey = this.defaultConfig.defaultLabelKey || 'name', valueKey = this.defaultConfig.defaultValueKey || 'code', keyPrefix = this.defaultConfig.defaultPrefix || 're', cacheStrategy = this.defaultConfig.defaultCacheStrategy || 'persist', }) {
|
|
1253
1291
|
this.apiUrl = apiUrl;
|
|
1254
1292
|
this.storageKey = storageKey;
|
|
1293
|
+
const searchDebounce = debounceTime ?? 300;
|
|
1294
|
+
this.debouncedSearchText = debounceSignal(this.searchText, searchDebounce);
|
|
1255
1295
|
this.#helper = new PaginatedDataStore(this.apiUrl, {
|
|
1256
1296
|
method: method,
|
|
1257
1297
|
hasCache: false,
|
|
@@ -1399,7 +1439,9 @@ class DictStore {
|
|
|
1399
1439
|
const out = [];
|
|
1400
1440
|
for (let i = 0; i < list.length; i++) {
|
|
1401
1441
|
const val = list[i][key];
|
|
1402
|
-
val
|
|
1442
|
+
String(val ?? '')
|
|
1443
|
+
.toLowerCase()
|
|
1444
|
+
.includes(query) && out.push(list[i]);
|
|
1403
1445
|
}
|
|
1404
1446
|
return out;
|
|
1405
1447
|
}
|
|
@@ -1459,7 +1501,7 @@ class DictLocalStore {
|
|
|
1459
1501
|
constructor(items, config) {
|
|
1460
1502
|
this.labelKey = config?.labelKey ?? (this.defaultConfig.defaultLabelKey || 'name');
|
|
1461
1503
|
this.valueKey = config?.valueKey ?? (this.defaultConfig.defaultValueKey || 'code');
|
|
1462
|
-
this.maxOptionsSize = config?.maxOptionsSize ?? 1000;
|
|
1504
|
+
this.maxOptionsSize = config?.maxOptionsSize ?? this.defaultConfig.defaultMaxOptionsSize ?? 1000;
|
|
1463
1505
|
this.items.set(items);
|
|
1464
1506
|
this.#draftItems.set(items);
|
|
1465
1507
|
}
|
|
@@ -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/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/statum.provider.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.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 { 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 constructor(public prefix = 're') {}\r\n\r\n get length() {\r\n return Object.keys(localStorage).filter((key) => key.startsWith(this.prefix || '')).length;\r\n }\r\n\r\n get(key: Key): Type | null {\r\n const raw = localStorage.getItem(this.getSafePrefix(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(this.getSafePrefix(key), str);\r\n }\r\n\r\n remove(key: Key): void {\r\n return localStorage.removeItem(this.getSafePrefix(key));\r\n }\r\n\r\n clear(): void {\r\n const keys = Object.keys(localStorage).filter((key) => key.startsWith(this.prefix || ''));\r\n\r\n keys.forEach((key) => localStorage.removeItem(key));\r\n }\r\n\r\n private getSafePrefix(key: Key): string {\r\n return this.prefix ? `${this.prefix}:${key}` : String(key);\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 constructor(public prefix = 're') {}\r\n\r\n get length() {\r\n return Object.keys(sessionStorage).filter((key) => key.startsWith(this.prefix || '')).length;\r\n }\r\n\r\n get(key: Key): Type | null {\r\n const raw = sessionStorage.getItem(this.getSafePrefix(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(this.getSafePrefix(key), str);\r\n }\r\n\r\n remove(key: Key): void {\r\n return sessionStorage.removeItem(this.getSafePrefix(key));\r\n }\r\n\r\n clear(): void {\r\n const keys = Object.keys(sessionStorage).filter((key) => key.startsWith(this.prefix || ''));\r\n\r\n keys.forEach((key) => sessionStorage.removeItem(key));\r\n }\r\n\r\n private getSafePrefix(key: Key): string {\r\n return this.prefix ? `${this.prefix}:${key}` : String(key);\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","// noinspection ES6PreferShortImport\r\n\r\nimport { InjectionToken } from '@angular/core';\r\n\r\nimport { SerializerConfig } from './serializer';\r\nimport { DictStoreProviderConfig } from './stores/dict-store/dict.models';\r\nimport { PaginatedDataStoreProviderConfig } from './stores/paginated-data-store';\r\n\r\ntype PaginatedDataProviderConfig = { paginatedData?: PaginatedDataStoreProviderConfig };\r\ntype SerializerProviderConfig = { serializer?: Partial<SerializerConfig> };\r\ntype DictProviderConfig = { dict?: DictStoreProviderConfig };\r\n\r\ntype StatumConfig = PaginatedDataProviderConfig & SerializerProviderConfig & DictProviderConfig;\r\n\r\nexport const STATUM_CONFIG = new InjectionToken<StatumConfig>('RE_STATUM_CONFIG');\r\n","import { RestMethods } from '@reforgium/internal';\r\n\r\nimport { CallArgs } from './resource.models';\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, args: CallArgs): string {\r\n const params = Object.entries(args.params || {})\r\n .map(([key, value]) => `${key}=${value}`)\r\n .join('&');\r\n const query = Object.entries(args.query || {})\r\n .map(([key, value]) => `${key}=${value}`)\r\n .join('&');\r\n\r\n return `${method}|${path}|${params}|${query}`;\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 } from '../../serializer';\r\nimport { STATUM_CONFIG } from '../../statum.provider';\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(STATUM_CONFIG, { optional: true })?.serializer ?? {});\r\n\r\n #value = signal<Data | null>(null);\r\n #status = signal<ResourceStatus>('idle');\r\n #error = signal<unknown | null>(null);\r\n #activeRequests = signal(0);\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(() => this.#activeRequests() > 0 || this.#status() === 'stale');\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, args);\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 const isSWR = strategy === 'cache-first' && entry.data != null;\r\n\r\n entry.status = isSWR ? '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, args);\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, args);\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 promote && this.#activeRequests.update((n) => n + 1);\r\n\r\n return 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 promote && this.#activeRequests.update((n) => Math.max(0, n - 1));\r\n this.promoteCurrent(entry, promote);\r\n }),\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","// noinspection ES6PreferShortImport\r\n\r\nimport { DestroyRef, inject, signal, WritableSignal } from '@angular/core';\r\n\r\nimport { AnyDict, concatArray, deepEqual, isNullable, PageableResponse, Query, QueryParams } from '@reforgium/internal';\r\n\r\nimport { LruCache } from '../../cache/storages/lru.storage';\r\nimport { STATUM_CONFIG } from '../../statum.provider';\r\nimport { isAbort, ResourceStore } from '../../stores/resource-store';\r\n\r\nimport { PaginatedDataStoreConfig } 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(STATUM_CONFIG, { optional: true })?.paginatedData || {};\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 routeParams: AnyDict = {};\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: PaginatedDataStoreConfig<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 * Set route parameters (path variables) for the resource URL.\r\n * Does not trigger loading automatically — call `refresh()` or `updatePage()` after.\r\n *\r\n * @param params Dictionary of route parameters (e.g., `{ id: '123' }`)\r\n * @param opts Options object\r\n * @param opts.reset If `true` (default), resets page to 0, clears cache, total elements count, and items\r\n * @param opts.abort If `true`, aborts all active transport requests and sets loading to false\r\n *\r\n * @example\r\n * ```ts\r\n * store.setRouteParams({ userId: '42' });\r\n * await store.refresh(); // fetch with new params\r\n *\r\n * // Or with options:\r\n * store.setRouteParams({ userId: '42' }, { reset: false, abort: true });\r\n * ```\r\n */\r\n setRouteParams = (params: AnyDict = {}, opts: { reset?: boolean; abort?: boolean } = {}) => {\r\n const isChanged = !deepEqual(this.routeParams, params);\r\n\r\n if (!isChanged) {\r\n return;\r\n }\r\n\r\n this.routeParams = params;\r\n\r\n if (opts.reset) {\r\n this.page = 0;\r\n this.totalElements = 0;\r\n this.#cache.clear();\r\n this.cached.set([]);\r\n this.items.set([]);\r\n }\r\n\r\n if (opts?.abort) {\r\n try {\r\n this.#transport?.abortAll?.('Route params changed');\r\n } finally {\r\n this.loading.set(false);\r\n }\r\n }\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: PaginatedDataStoreConfig<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 const params = this.routeParams;\r\n\r\n if (this.config.method === 'GET') {\r\n return this.#transport.get<AnyDict, AnyDict>({ query, params }, { 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]<AnyDict, AnyDict, Partial<FilterType>, PageableResponse<ItemsType> | ItemsType[]>(\r\n { query, payload, params },\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: PaginatedDataStoreConfig<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, inject, signal, untracked } from '@angular/core';\r\n\r\nimport { AnyDict, debounceSignal } from '@reforgium/internal';\r\n\r\nimport { LruCache, StorageInterface, StorageStrategy, storageStrategy } from '../../cache';\r\nimport { STATUM_CONFIG } from '../../statum.provider';\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 /**\r\n * Default dictionary configuration resolved from {@link STATUM_CONFIG}.\r\n *\r\n * Used as a global fallback when local configuration does not explicitly\r\n */\r\n defaultConfig = inject(STATUM_CONFIG, { optional: true })?.dict || {};\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 private debouncedSearchText = debounceSignal(this.searchText, 300);\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.debouncedSearchText() || !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 autoLoad = true,\r\n method = this.defaultConfig.defaultRestMethod,\r\n presetFilters = this.defaultConfig.defaultPresetFilters,\r\n parseResponse,\r\n parseRequest,\r\n debounceTime = this.defaultConfig.defaultDebounceTime,\r\n fixed = true,\r\n maxOptionsSize = this.defaultConfig.defaultMaxOptionsSize,\r\n labelKey = this.defaultConfig.defaultLabelKey || 'name',\r\n valueKey = this.defaultConfig.defaultValueKey || 'code',\r\n keyPrefix = this.defaultConfig.defaultPrefix || 're',\r\n cacheStrategy = this.defaultConfig.defaultCacheStrategy || '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\r\n if (cacheStrategy !== 'memory') {\r\n this.storage = storageStrategy<string, Type[]>(cacheStrategy as StorageStrategy);\r\n this.storage.prefix = keyPrefix;\r\n }\r\n\r\n this.setAutoload(autoLoad);\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.debouncedSearchText().trim();\r\n\r\n untracked(() => {\r\n this._lastPromise = this.#helper.updateFilters({ name: query, ...rest });\r\n });\r\n } else if (!this.cachedItems().length) {\r\n untracked(() => {\r\n this._lastPromise = this.#helper.updateFilters({ name: '', ...rest });\r\n });\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.fixed ? this.searchText() : this.debouncedSearchText()).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 private setAutoload(autoLoad: boolean | 'whenEmpty') {\r\n if (autoLoad === 'whenEmpty') {\r\n const isEmpty = !this.storage?.get(this.storageKey)?.length;\r\n\r\n this._armed.set(isEmpty);\r\n } else {\r\n this._armed.set(autoLoad);\r\n }\r\n }\r\n}\r\n","import { computed, inject, signal } from '@angular/core';\r\n\r\nimport { AnyDict } from '@reforgium/internal';\r\n\r\nimport { STATUM_CONFIG } from '../../statum.provider';\r\nimport { DictLocalConfig, ValueType } from './dict.models';\r\n\r\nexport class DictLocalStore<Type extends AnyDict> {\r\n /**\r\n * Default dictionary configuration resolved from {@link STATUM_CONFIG}.\r\n *\r\n * Used as a global fallback when local configuration does not explicitly\r\n * define dictionary keys.\r\n */\r\n defaultConfig = inject(STATUM_CONFIG, { optional: true })?.dict || {};\r\n\r\n /**\r\n * Source dictionary items.\r\n *\r\n * Represents the full, unfiltered list of dictionary entries.\r\n * Used as the base data set for search and option generation.\r\n */\r\n items = signal<readonly Type[]>([]);\r\n #draftItems = signal<readonly Type[]>([]);\r\n\r\n /**\r\n * Computed list of options in `{ label, value }` format.\r\n *\r\n * Based on the current draft items (after search/filtering).\r\n * Respects `maxOptionsSize` to limit the number of generated options.\r\n *\r\n * Intended for direct use in dropdowns and select-like components.\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 ?? (this.defaultConfig.defaultLabelKey || 'name');\r\n this.valueKey = config?.valueKey ?? (this.defaultConfig.defaultValueKey || 'code');\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 // noinspection JSUnusedGlobalSymbols\r\n /**\r\n * Restore cached dictionary state.\r\n *\r\n * This implementation is a no-op and exists only for API compatibility\r\n * with {@link DictStore}.\r\n */\r\n restoreCache() {}\r\n\r\n /**\r\n * Resolve display label by value.\r\n *\r\n * Performs a linear search over dictionary items and returns\r\n * the corresponding label for the given value.\r\n *\r\n * Commonly used for reverse binding (value → label).\r\n *\r\n * @param value Dictionary value to look up\r\n * @returns Resolved 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 /**\r\n * Filter dictionary items by label.\r\n *\r\n * Applies a case-insensitive substring match against the label field\r\n * and updates the internal draft items used for option generation.\r\n *\r\n * Passing an empty string resets the filter and restores all items.\r\n *\r\n * @param name Search query string\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 /**\r\n * Preload additional dictionary items.\r\n *\r\n * Can either replace the current items completely or append\r\n * new entries to the existing list.\r\n *\r\n * Updates both the source items and the current draft items.\r\n *\r\n * @param items Items to preload\r\n * @param opts Preload options\r\n * @param opts.replace When `true`, replaces existing items instead of appending\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":";;;;;;AAKO,MAAM,eAAe,GAAG,CAAC,MAAwB,EAAE,KAAc,KACtE,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;AAE7E,MAAM,eAAe,GAAG,CAAC,MAAwB,EAAE,KAAc,KACtE,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC;AAE5C,MAAM,gBAAgB,GAAG,CAAC,MAAwB,EAAE,KAAc,KACvE,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;AAE/G,MAAM,aAAa,GAAG,CAAC,MAAwB,EAAE,KAAc,KACpE,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;;ACChF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;MACU,UAAU,CAAA;AACZ,IAAA,MAAM;AAEf;;;;;AAKG;AACH,IAAA,WAAA,CAAY,MAAiC,EAAA;QAC3C,IAAI,CAAC,MAAM,GAAG;AACZ,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;AACzB,YAAA,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;AAChC,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,QAAQ,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;AACjC,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;AACzB,YAAA,OAAO,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE;AACrC,YAAA,SAAS,EAAE;AACT,gBAAA,UAAU,EAAE,YAAY;AACxB,gBAAA,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE;AACrF,aAAA;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE;AACxD,YAAA,GAAG,MAAM;SACV;IACH;AAEA;;;;;;;;;;;;;;AAcG;AACH,IAAA,SAAS,CAAC,GAAe,EAAA;QACvB,MAAM,MAAM,GAAmB,EAAE;AAEjC,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;AAE3C,YAAA,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,EAAE;AAChC,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAiB,CAAC;gBACrD;YACF;AAEA,YAAA,IAAI,MAAM,EAAE,IAAI,KAAK,UAAU,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE;gBACjG,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE;oBAClC;gBACF;YACF;YAEA,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;gBACpD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa;AACrD,gBAAA,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK;AAExB,gBAAA,IAAI,SAAS,EAAE,IAAI,KAAK,OAAO,EAAE;oBAC/B,MAAM,CAAC,GAAG,GAAG,CAAA,EAAG,SAAS,CAAC,kBAAkB,CAAA,CAAE,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;oBACpG,MAAM,CAAC,GAAG,GAAG,CAAA,EAAG,SAAS,CAAC,gBAAgB,CAAA,CAAE,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;oBAChG;gBACF;YACF;AAEA,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC;QACjD;AAEA,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;;;;;;;AAYG;AACH,IAAA,WAAW,GAAG,CAAC,GAAqB,KAAgB;AAClD,QAAA,MAAM,IAAI,GAAmB,OAAO,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG;QACjF,MAAM,MAAM,GAAY,EAAE;AAE1B,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;AAE1C,YAAA,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;AAC7B,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;gBACtC;YACF;AAEA,YAAA,IACE,KAAK,EAAE,IAAI,KAAK,UAAU;iBACzB,KAAK,EAAE,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,EAC3F;gBACA,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE;oBAClC;gBACF;YACF;YAEA,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAc;AAE5D,YAAA,IAAI,eAAe,CAAC,IAAI,KAAK,OAAO,EAAE;AACpC,gBAAA,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,CAAC,eAAe,CAAC,kBAAkB,CAAC;AACvE,gBAAA,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,CAAC,eAAe,CAAC,gBAAgB,CAAC;AACnE,gBAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE;AACxB,qBAAA,OAAO,CAAC,eAAe,CAAC,kBAAkB,EAAE,EAAE;AAC9C,qBAAA,OAAO,CAAC,eAAe,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBAChD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;;AAG/C,gBAAA,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,QAAQ,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE;oBACpD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;oBAEjC,IAAI,MAAM,EAAE;AACV,wBAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;oBAC5E;yBAAO,IAAI,IAAI,EAAE;AACf,wBAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;oBAC5E;oBAEA;gBACF;YACF;AAEA,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC;QACnD;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC;AAED;;;;;;AAMG;AACH,IAAA,OAAO,GAAG,CAAC,GAAe,KAAY;AACpC,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;AACxE,IAAA,CAAC;AAED;;;;;;AAMG;AACH,IAAA,UAAU,CAAC,MAAiC,EAAA;AAC1C,QAAA,OAAO,IAAI,UAAU,CAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAClE;IAEQ,gBAAgB,CAAC,KAAc,EAAE,GAAY,EAAA;AACnD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,IAAI,EAAE,CAAC;AAEjD,QAAA,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,EAAE;YAChC;QACF;AAEA,QAAA,IAAI,MAAM,EAAE,IAAI,KAAK,UAAU,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE;AACjG,YAAA,MAAM,WAAW,GAAG,KAAK,IAAI,IAAI;YAEjC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,IAAI,WAAW;QAC5G;AAEA,QAAA,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,EAAE;YAC7B,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;QAC5C;AAEA,QAAA,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;YAClF,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;QAC5C;AAEA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;QAC5C;QAEA,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;YAC5D,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;QAC7C;QAEA,IAAI,MAAM,EAAE,IAAI,KAAK,MAAM,IAAI,KAAK,YAAY,IAAI,EAAE;YACpD,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;QAC1C;QAEA,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;AACpD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;AAEvC,YAAA,IAAI,SAAS,CAAC,MAAM,EAAE;AACpB,gBAAA,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;YAChC;iBAAO;AACL,gBAAA,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK;AACxB,gBAAA,MAAM,SAAS,GAAG,SAAS,CAAC,aAAc;AAE1C,gBAAA,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE;AAC7B,oBAAA,MAAM,MAAM,GAAG;wBACb,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;wBAClD,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;qBACjD;oBAED,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBACtC;YACF;QACF;AAEA,QAAA,IAAI,MAAM,EAAE,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACpD,YAAA,OAAQ,KAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACpE;QAEA,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;YAChD,QACE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC;iBACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEhF;IACF;IAEQ,kBAAkB,CAAC,KAAc,EAAE,GAAY,EAAA;AACrD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,IAAI,EAAE,CAAC;AAEhD,QAAA,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE;YAC9B;QACF;AAEA,QAAA,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACnD,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;YAEpD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;AACvC,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE;AACnE,oBAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBACvD;qBAAO;oBACL;gBACF;YACF;iBAAO;gBACL,OAAO,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACrE;QACF;AAEA,QAAA,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,IAAI;gBACF,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;;AAE9B,oBAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;gBACvC;qBAAO;;AAEL,oBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC1B;YACF;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,KAAK;YACd;QACF;AAEA,QAAA,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE;AAChG,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK;QACxD;AAEA,QAAA,IACE,KAAK,EAAE,IAAI,KAAK,SAAS;YACzB,OAAO,KAAK,KAAK,SAAS;AAC1B,YAAA,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI;YACrC,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EACtC;YACA,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC;QAC3G;AAEA,QAAA,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;QAEpE,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,SAAS,EAAE;AACvC,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,SAAS;QACxD;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAc;AAE5D,QAAA,IAAI,eAAe,CAAC,IAAI,KAAK,MAAM,EAAE;AACnC,YAAA,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;AAE9E,YAAA,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;AACjE,gBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,WAAW;YAC5D;QACF;AAEA,QAAA,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;YACjF,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7E;QAEA,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACzD,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK;QAC1G;AAEA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,UAAU,CAAC,GAAW,EAAA;AAC5B,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QACxB;AAAE,QAAA,MAAM;AACN,YAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC;YACvC,MAAM,IAAI,GAAmB,EAAE;YAE/B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AAC5B,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE;gBAChD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU;gBAElD,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;AAC7C,oBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AAChB,oBAAA,UAAU,KAAK,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;AAC/E,oBAAA,UAAU,KAAK,OAAO,IAAK,IAAI,CAAC,GAAG,CAAc,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC/D;qBAAO;AACL,oBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK;gBACnB;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,IAAI;QACb;IACF;AACD;;MChXY,QAAQ,CAAA;AAGA,IAAA,KAAA;AAFX,IAAA,GAAG,GAAG,IAAI,GAAG,EAAgB;AAErC,IAAA,WAAA,CAAmB,QAAgB,GAAG,EAAA;QAAnB,IAAA,CAAA,KAAK,GAAL,KAAK;IAAiB;AAEzC,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI;IACtB;AAEA,IAAA,GAAG,CAAC,GAAS,EAAA;QACX,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE;AAE9B,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;AAEtB,QAAA,OAAO,GAAG;IACZ;IAEA,GAAG,CAAC,GAAS,EAAE,KAAa,EAAA;QAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;QACtB;aAAO,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE;AACvC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;YAE3C,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QACjD;QAEA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;IAC1B;AAEA,IAAA,MAAM,CAAC,GAAS,EAAA;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;IAC7B;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;IAClB;AAEA,IAAA,GAAG,CAAC,GAAS,EAAA;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;IAC1B;IAEA,IAAI,GAAA;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACpC;IAEA,MAAM,GAAA;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACtC;IAEA,OAAO,GAAA;QACL,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACtC;AAEA,IAAA,SAAS,CAAC,OAAyB,EAAA;AACjC,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;QAEhB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,EAAE;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAChB;IACF;AACD;;MC/DY,YAAY,CAAA;AACJ,IAAA,MAAA;AAAnB,IAAA,WAAA,CAAmB,SAAS,IAAI,EAAA;QAAb,IAAA,CAAA,MAAM,GAAN,MAAM;IAAU;AAEnC,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM;IAC5F;AAEA,IAAA,GAAG,CAAC,GAAQ,EAAA;AACV,QAAA,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC;QAExC,OAAQ,MAAe,IAAI,IAAI;IACjC;IAEA,GAAG,CAAC,GAAQ,EAAE,KAAW,EAAA;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAEjC,QAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACpD;AAEA,IAAA,MAAM,CAAC,GAAQ,EAAA;QACb,OAAO,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACzD;IAEA,KAAK,GAAA;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAEzF,QAAA,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrD;AAEQ,IAAA,aAAa,CAAC,GAAQ,EAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAA,CAAE,GAAG,MAAM,CAAC,GAAG,CAAC;IAC5D;AACD;;MCjCY,aAAa,CAAA;AAChB,IAAA,KAAK,GAAG,IAAI,GAAG,EAAa;AAEpC,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI;IACxB;AAEA,IAAA,GAAG,CAAC,GAAQ,EAAA;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;IACpC;IAEA,GAAG,CAAC,GAAQ,EAAE,KAAW,EAAA;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;IAC5B;AAEA,IAAA,MAAM,CAAC,GAAQ,EAAA;AACb,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IACxB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;IACpB;AACD;;MCtBY,cAAc,CAAA;AACN,IAAA,MAAA;AAAnB,IAAA,WAAA,CAAmB,SAAS,IAAI,EAAA;QAAb,IAAA,CAAA,MAAM,GAAN,MAAM;IAAU;AAEnC,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM;IAC9F;AAEA,IAAA,GAAG,CAAC,GAAQ,EAAA;AACV,QAAA,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC;QAExC,OAAQ,MAAe,IAAI,IAAI;IACjC;IAEA,GAAG,CAAC,GAAQ,EAAE,KAAW,EAAA;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAEjC,QAAA,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACtD;AAEA,IAAA,MAAM,CAAC,GAAQ,EAAA;QACb,OAAO,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3D;IAEA,KAAK,GAAA;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAE3F,QAAA,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACvD;AAEQ,IAAA,aAAa,CAAC,GAAQ,EAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAA,CAAE,GAAG,MAAM,CAAC,GAAG,CAAC;IAC5D;AACD;;AC7BD;;;;;;;;;;;;;;AAcG;AACI,MAAM,eAAe,GAAG,CAC7B,QAAyB,KACM;AAC/B,IAAA,MAAM,OAAO,GAA+D;AAC1E,QAAA,MAAM,EAAE,MAAM,IAAI,aAAa,EAAa;AAC5C,QAAA,OAAO,EAAE,MAAM,IAAI,cAAc,EAAa;AAC9C,QAAA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAa;AAC5C,QAAA,GAAG,EAAE,MAAM,IAAI,QAAQ,EAAa;KACrC;AAED,IAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC5B;;AClCA;MAca,aAAa,GAAG,IAAI,cAAc,CAAe,kBAAkB;;ACVhF;;;;;;;;;;;;;;AAcG;AACG,MAAO,cAAe,SAAQ,KAAK,CAAA;AACX,IAAA,GAAA;AAA5B,IAAA,WAAA,CAA4B,GAAW,EAAA;AACrC,QAAA,KAAK,CAAC,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAE,CAAC;QADT,IAAA,CAAA,GAAG,GAAH,GAAG;AAE7B,QAAA,IAAI,CAAC,IAAI,GAAG,gBAAgB;IAC9B;AACD;AAED;;;;;AAKG;AACG,MAAO,UAAW,SAAQ,KAAK,CAAA;IACnC,WAAA,CAAY,OAAO,GAAG,SAAS,EAAA;QAC7B,KAAK,CAAC,OAAO,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,YAAY;IAC1B;AACD;AAED;;;;;AAKG;AACG,SAAU,OAAO,CAAC,CAAU,EAAA;IAChC,QACE,CAAC,YAAY,UAAU;SACtB,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAK,CAAW,EAAE,IAAI,KAAK,YAAY,IAAK,CAAW,EAAE,OAAO,KAAK,SAAS,CAAC;AAEtH;AAEM,SAAU,OAAO,CAAC,IAAwB,EAAE,IAAY,EAAA;IAC5D,OAAO,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,CAAE,GAAG,IAAI;AAC9E;SAEgB,QAAQ,CAAC,MAAmB,EAAE,IAAY,EAAE,IAAc,EAAA;IACxE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE;AAC5C,SAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,EAAE;SACvC,IAAI,CAAC,GAAG,CAAC;IACZ,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;AAC1C,SAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,EAAE;SACvC,IAAI,CAAC,GAAG,CAAC;IAEZ,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,IAAI,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;AAC/C;;ACxCA;;;;;;;;;;;;;;;;;AAiBG;MACU,cAAc,CAAA;AACjB,IAAA,QAAQ,GAAG,IAAI,GAAG,EAA4B;AAEtD;;;;;;;;;;;;;;AAcG;AACH,IAAA,QAAQ,CAAO,GAAW,EAAE,IAAe,EAAE,KAAa,EAAE,IAA4B,EAAA;QACtF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAO,GAAG,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;YACpD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC3C,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,CAAC,QAAQ,GAAG,IAAI;AAEvB,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;QAC9B;aAAO;AACL,YAAA,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC7C;AAEA,QAAA,OAAO,OAAO;IAChB;AAEA;;;;;;AAMG;AACH,IAAA,MAAM,CAAC,GAAW,EAAE,MAAA,GAAkB,IAAI,UAAU,EAAE,EAAA;QACpD,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAEjC,IAAI,CAAC,EAAE,EAAE;YACP;QACF;AAEA,QAAA,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE;AAC1B,QAAA,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE;AAC1B,QAAA,EAAE,CAAC,QAAQ,GAAG,SAAS;AACvB,QAAA,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE;QAErB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEpC,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAExC,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;IAC3B;AAEA;;;;AAIG;AACH,IAAA,SAAS,CAAC,MAAA,GAAkB,IAAI,UAAU,EAAE,EAAA;AAC1C,QAAA,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE;AAClD,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC;QAC1B;IACF;AAEQ,IAAA,aAAa,CAAO,GAAW,EAAA;QACrC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAA8B;QAE5D,IAAI,EAAE,EAAE;AACN,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,OAAO,EAAuB;QAElD,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAmB,CAAC;QAE3C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAC7B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,EACpCA,QAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EACjC,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,EAAG,CAAC,CAAC,CACpC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAC7B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,EACpCC,QAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EACrE,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,EAAG,CAAC,CAAC,CACpC;QAED,EAAE,CAAC,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU;AACvC,aAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC9C,aAAA,SAAS,EAAE;AAEd,QAAA,OAAO,EAAE;IACX;AAEQ,IAAA,cAAc,CAAI,EAAc,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ;QAExB,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AAEA,QAAA,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE;AAC1B,QAAA,EAAE,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC,SAAS,CAAC;AAC7B,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;gBACZ,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEpC,gBAAA,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;gBACb,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEpC,gBAAA,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;YACD,QAAQ,EAAE,OAAO,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC;AAC1C,SAAA,CAAC;IACJ;AACD;;AC9ID;;;;;;;;;;;;;;;;;;;AAmBG;MACU,aAAa,CAAA;AACP,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,IAAA,UAAU,GAAG,IAAI,UAAU,CAAU,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;AAElH,IAAA,MAAM,GAAG,MAAM,CAAc,IAAI,kDAAC;AAClC,IAAA,OAAO,GAAG,MAAM,CAAiB,MAAM,mDAAC;AACxC,IAAA,MAAM,GAAG,MAAM,CAAiB,IAAI,kDAAC;AACrC,IAAA,eAAe,GAAG,MAAM,CAAC,CAAC,2DAAC;AAE3B;;;AAGG;AACH,IAAA,KAAK,GAAwB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAErD;;AAEG;AACH,IAAA,MAAM,GAA2B,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAE1D;;AAEG;AACH,IAAA,KAAK,GAA2B,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAExD;;;AAGG;IACH,OAAO,GAAoB,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO,mDAAC;AAElF,IAAA,MAAM;AACN,IAAA,IAAI;AACJ,IAAA,OAAO,GAAG,IAAI,GAAG,EAAkC;AACnD,IAAA,SAAS,GAAG,IAAI,cAAc,EAAE;AAEjD;;;AAGG;IACH,WAAA,CAAY,MAAyB,EAAE,IAAA,GAA6B,EAAE,EAAA;AACpE,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;IAClB;AAEA;;;;;;;;;AASG;AACH,IAAA,MAAM,GAAG,CAIP,IAAmC,EAAE,MAAqC,EAAE,EAAA;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;QACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QAErC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAO,GAAG,CAAC;AACzC,QAAA,MAAM,QAAQ,GAAkB,GAAG,CAAC,QAAQ,IAAI,eAAe;AAC/D,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AAC/C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK;QAE7E,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE;YAChC,OAAO,KAAK,CAAC,QAAoC;QACnD;AAEA,QAAA,IAAI,QAAQ,KAAK,YAAY,EAAE;YAC7B,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE;gBAC/B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC;gBAEvC,OAAO,KAAK,CAAC,IAAY;YAC3B;AAEA,YAAA,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC;QAC/B;AAEA,QAAA,IAAI,QAAQ,KAAK,aAAa,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE;YAChF,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC;YAEvC,OAAO,KAAK,CAAC,IAAY;QAC3B;AAEA,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AAC/C,QAAA,MAAM,IAAI,GAAc,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,UAAU;QAE1E,MAAM,KAAK,GAAG,QAAQ,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI;AAE9D,QAAA,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS;QAC1C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC;AAEvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAClC,GAAG,EACH,IAAI,EACJ,KAAK,EACL,IAAI,CAAC,KAAK,CAAC;AACT,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAW,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACrD,KAAK;YACL,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE,GAAG,CAAC,aAAa;AAC3B,SAAA,CAAC,CACH;QAED,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrC,QAAA,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAI;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACf,gBAAA,MAAM,CAAC;YACT;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI;IACb;AAEA;;;;;;AAMG;AACH,IAAA,MAAM,IAAI,CAKR,IAAqC,EAAE,MAAsC,EAAE,EAAA;QAC/E,OAAO,MAAM,IAAI,CAAC,OAAO,CAAkC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC;IAC/E;AAEA;;;;;;AAMG;AACH,IAAA,MAAM,GAAG,CAKP,IAA8C,EAAE,MAAsC,EAAE,EAAA;QACxF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAkC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC;IAC9E;AAEA;;;;;;AAMG;AACH,IAAA,MAAM,KAAK,CAKT,IAA8C,EAAE,MAAsC,EAAE,EAAA;QACxF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAkC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC;IAChF;AAEA;;;;;;AAMG;AACH,IAAA,MAAM,MAAM,CAKV,IAAqC,EAAE,MAAsC,EAAE,EAAA;QAC/E,OAAO,MAAM,IAAI,CAAC,OAAO,CAAkC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC;IACjF;AAEA;;;;;;AAMG;AACH,IAAA,KAAK,CACH,MAAmB,EACnB,IAA4B,EAC5B,MAAuB,EAAA;QAEvB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;QACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QAEvC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC;IACtC;AAEA;;;;AAIG;AACH,IAAA,QAAQ,CAAC,MAAuB,EAAA;QAC9B,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC;IACpC;AAEQ,IAAA,WAAW,CAAI,GAAW,EAAA;QAChC,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAiC;QAEjE,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;YACpE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAA+B,CAAC;QACxD;AAEA,QAAA,OAAO,KAAK;IACd;IAEQ,MAAM,OAAO,CAMnB,MAAmB,EACnB,IAA8C,EAC9C,SAAyC,EAAE,EAAA;QAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;QACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACrC,MAAM,OAAO,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE;QAC/E,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC;QAE5D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAW,GAAG,CAAC;QAE7C,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE;YACnC,OAAO,KAAK,CAAC,QAA6B;QAC5C;AAEA,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AAClD,QAAA,MAAM,IAAI,GAAc,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,UAAU;AAE7E,QAAA,KAAK,CAAC,MAAM,GAAG,SAAS;QACxB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;AAE1C,QAAA,IAAI,IAA0B;AAE9B,QAAA,IAAI,MAAM,KAAK,QAAQ,EAAE;AACvB,YAAA,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAW,GAAG,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACpF;aAAO;;YAEL,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAW,GAAG,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC7F;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAClC,GAAG,EACH,IAAI,EACJ,KAAK,EACL,IAAI,CAAC,KAAK,CAAqB,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CACxG;QAED,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;AACxC,QAAA,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAI;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACf,gBAAA,MAAM,CAAC;YACT;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI;IACb;IAEQ,QAAQ,CAAC,MAAmB,EAAE,IAAc,EAAA;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAE/B,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAA,qBAAA,CAAuB,CAAC;QACnD;QAEA,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;QAEhD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;IACzC;AAEQ,IAAA,YAAY,CAAC,IAAc,EAAA;QACjC,MAAM,WAAW,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAa;QAE5F,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAe;IAC7D;AAEQ,IAAA,KAAK,GACX,CAA0B,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,EAA8B,KAC9F,MAAK;AACH,QAAA,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAEpD,QAAA,OAAO,IAAI,CAAC,IAAI,CACd,GAAG,CAAC,CAAC,IAAI,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAI,IAA0B,CAAC,CAAC,EACtE,GAAG,CAAC;AACF,YAAA,IAAI,EAAE,CAAC,IAAI,KAAI;gBACb,OAAO,KAAK,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;AAC9B,gBAAA,KAAK,CAAC,MAAM,GAAG,SAAS;AACxB,gBAAA,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;AAC5B,gBAAA,KAAK,CAAC,KAAK,GAAG,IAAI;AAClB,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC;YACrC,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,KAAK,CAAC,KAAK,GAAG,GAAG;AACjB,gBAAA,KAAK,CAAC,MAAM,GAAG,OAAO;AACtB,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC;YACrC,CAAC;AACF,SAAA,CAAC,EACF,QAAQ,CAAC,MAAK;AACZ,YAAA,KAAK,CAAC,QAAQ,GAAG,SAAS;YAC1B,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC;QACrC,CAAC,CAAC,CACH;AACH,IAAA,CAAC;AAEK,IAAA,cAAc,CAAC,KAA6B,EAAE,OAAO,GAAG,IAAI,EAAA;QAClE,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;QAEA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAE,KAAK,CAAC,IAAa,IAAI,IAAI,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9B;AACD;;ACzXD;AAoBA;;;;;;;;;;;;;;;AAeG;MACU,kBAAkB,CAAA;AA+BnB,IAAA,KAAA;AACD,IAAA,MAAA;AA/BQ,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,IAAI,EAAE;AAE/F,IAAA,UAAU;AACV,IAAA,MAAM;;AAGN,IAAA,KAAK,GAAgC,MAAM,CAAc,EAAE,iDAAC;;AAE5D,IAAA,MAAM,GAAG,MAAM,CAAc,EAAE,kDAAC;;AAEhC,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,mDAAC;;IAGvB,OAAO,GAAwB,EAAE;;AAEjC,IAAA,IAAI;;IAGJ,IAAI,GAAG,CAAC;;IAER,QAAQ,GAAG,EAAE;;IAEb,aAAa,GAAG,CAAC;IACjB,WAAW,GAAY,EAAE;AAEzB;;;AAGG;IACH,WAAA,CACU,KAAa,EACd,MAAA,GAA0D,EAAE,EAAA;QAD3D,IAAA,CAAA,KAAK,GAAL,KAAK;QACN,IAAA,CAAA,MAAM,GAAN,MAAM;QAEb,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAsB,MAAM,CAAC,SAAU,CAAC;AAClE,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACpD;;IAGA,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;IAC7B;AAEA;;;;;AAKG;AACH,IAAA,UAAU,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,KAAK,KAAI;AACrD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE;AAErC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;AACtB,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAEhB,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAChC;aAAO;YACL,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;QACnC;AACF,IAAA,CAAC;AAED;;;AAGG;IACH,cAAc,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,KAAI;AACxC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAC5C,IAAA,CAAC;AAED;;;AAGG;AACH,IAAA,aAAa,GAAG,CAAC,OAA4B,KAAI;AAC/C,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAEnB,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC;AAChF,IAAA,CAAC;AAED;;;AAGG;IACH,WAAW,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAkB,KAAI;QAC7F,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC;QAC1E,MAAM,IAAI,GAAG,SAAS,GAAG,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,SAAS,KAAK,CAAC,GAAG,KAAK,GAAG,MAAM,CAAA,CAAE,GAAG,EAAE;QAEhF,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACzC,IAAA,CAAC;AAED;;;AAGG;AACH,IAAA,UAAU,GAAG,CAAC,OAAA,GAA+B,EAAE,KAAI;AACjD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAChE,IAAA,CAAC;AAED;;;AAGG;AACH,IAAA,WAAW,GAAG,CAAC,KAAa,KAAI;AAC9B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC;AACb,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;AAClB,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,EAAE;AACtB,IAAA,CAAC;AAED;;;;;;;;;;;;;;;;;AAiBG;IACH,cAAc,GAAG,CAAC,MAAA,GAAkB,EAAE,EAAE,IAAA,GAA6C,EAAE,KAAI;QACzF,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;QAEtD,IAAI,CAAC,SAAS,EAAE;YACd;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM;AAEzB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC;AACb,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB;AAEA,QAAA,IAAI,IAAI,EAAE,KAAK,EAAE;AACf,YAAA,IAAI;gBACF,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,sBAAsB,CAAC;YACrD;oBAAU;AACR,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;QACF;AACF,IAAA,CAAC;AAED;;;AAGG;AACH,IAAA,YAAY,GAAG,CAAC,MAA2C,KAAI;AAC7D,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE;QAC3C,IAAI,CAAC,eAAe,EAAE;AACxB,IAAA,CAAC;AAED;;AAEG;AACH,IAAA,IAAI,CAAC,MAAiD,EAAA;AACpD,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,eAAe,EAAE;IACxB;;IAGA,OAAO,GAAA;AACL,QAAA,IAAI;YACF,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,8BAA8B,CAAC;QAC7D;QAAE,OAAO,CAAU,EAAE;AACnB,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACf,gBAAA,MAAM,CAAC;YACT;QACF;IACF;AAEA,IAAA,WAAW,GAAG,OAAO,EACnB,IAAI,GAAG,IAAI,CAAC,IAAI,EAChB,IAAI,GAAG,IAAI,CAAC,QAAQ,EACpB,IAAI,GAAG,IAAI,CAAC,IAAI,EAChB,OAAO,GAAG,IAAI,CAAC,OAAO,GACE,KAAI;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAE5D,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;AAE1B,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC;AAExD,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,YAAA,IAAI,CAAC,OAAO,GAAG,OAAO;YAEtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YAErD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,IAAI;AACjD,YAAA,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa;YACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;AAC9B,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;YAEhC,OAAO,MAAM,CAAC,OAAO;QACvB;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE;gBACd;YACF;AAEA,YAAA,MAAM,CAAC;QACT;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;AACF,IAAA,CAAC;IAEO,aAAa,GAAA;QACnB,IAAI,CAAC,UAAU,GAAG,IAAI,aAAa,CACjC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAC7C;AACE,YAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;AAC/B,YAAA,SAAS,EAAE,UAAU;AACrB,YAAA,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACxE,aAAa,EAAE,IAAI,CAAC,OAAO;AAC5B,SAAA,CACF;IACH;AAEQ,IAAA,MAAM,YAAY,CAAC,OAA4B,EAAE,KAAY,EAAA;AACnE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW;QAE/B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE;YAChC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACnG;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,MAAM;;QAG1D,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAC5B,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAC1B,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CACjC;IACH;IAEQ,UAAU,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAA2B,EAAA;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK;QAC1C,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,KAAK,GAAG,OAAO,GAAG,EAAE,CAAC,EAAE;AAC3E,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,EAAE,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC,IAAI,cAAc;QAC5F,MAAM,OAAO,GAAU,EAAE;AAEzB,QAAA,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAClD,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACxB,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;YAC5C;AAAO,iBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC7B,gBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK;YACtB;AACF,QAAA,CAAC,CAAC;QACF,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAEhC,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,iBAAiB,GAAG,OAC1B,IAA+C,KACP;AACxC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE;;YAE9B,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;QAC9C;AAEA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAClC;AAEA,QAAA,OAAO,IAAmC;AAC5C,IAAA,CAAC;AAEO,IAAA,WAAW,GAAG,CAAC,IAAiB,KAAI;AAC1C,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QAClC;QAEA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,IAAA,CAAC;AAEO,IAAA,cAAc,CAAC,IAAiB,EAAA;QACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE;IACtD;AAEQ,IAAA,WAAW,CAAC,MAAuD,EAAA;QACzE,IAAI,CAAC,MAAM,GAAG;AACZ,YAAA,GAAG,MAAM;YACT,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,IAAI,MAAM;YACnE,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC,YAAY;YAClE,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC,mBAAmB;AAC3E,YAAA,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC;AACtC,YAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ;YAC9F,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,gBAAgB,IAAI,CAAC;SACxE;IACH;IAEQ,eAAe,GAAA;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE;AAC9C,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE;AACvD,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI;IAC3C;AACD;;;AC3VD;;;;;;;;;;;;;;;AAeG;MACU,SAAS,CAAA;AAoEV,IAAA,MAAA;AACA,IAAA,UAAA;AApEV,IAAA,OAAgB,cAAc,GAAG,GAAG;AAEpC;;;;AAIG;AACH,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE;AAErE,IAAA,OAAO;IACP,IAAI,GAAG,IAAI,QAAQ,CAAe,EAAS,CAAC,cAAc,CAAC;IAC3D,WAAW,GAAgB,EAAE;IAEZ,KAAK,GAAY,IAAI;AACrB,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,cAAc;AACd,IAAA,OAAO;AAExB;;;AAGG;AACH,IAAA,UAAU,GAAG,MAAM,CAAS,EAAE,sDAAC;IAEvB,mBAAmB,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;AAElE;;AAEG;AACH,IAAA,OAAO,GAAG,MAAM,CAAU,EAAE,mDAAC;AAErB,IAAA,WAAW,GAAG,MAAM,CAAkB,EAAE,uDAAC;AAEjD;;;AAGG;AACH,IAAA,KAAK,GAAG,QAAQ,CAAkB,MAAK;AACrC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;AAEjC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,MAAM;QACrF;AAEA,QAAA,OAAO,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAClE,IAAA,CAAC,iDAAC;AAEF;;;AAGG;AACH,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AACtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEhH,OAAO,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,OAAO;AAC9E,IAAA,CAAC,mDAAC;IACM,YAAY,GAA4B,IAAI;AAC5C,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;;AAG9B;;;;AAIG;AACH,IAAA,WAAA,CACU,MAAc,EACd,UAAkB,EAC1B,EACE,QAAQ,GAAG,IAAI,EACf,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAC7C,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,EACvD,aAAa,EACb,YAAY,EACZ,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,EACrD,KAAK,GAAG,IAAI,EACZ,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,EACzD,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,IAAI,MAAM,EACvD,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,IAAI,MAAM,EACvD,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,IAAI,IAAI,EACpD,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,IAAI,SAAS,GAC9C,EAAA;QAfhB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,UAAU,GAAV,UAAU;QAgBlB,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAmB,IAAI,CAAC,MAAM,EAAE;AACnE,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,QAAQ,EAAE,KAAK;YACf,aAAa,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,aAAa,EAAE;AAC7C,YAAA,aAAa,EAAE,aAAa;AAC5B,YAAA,YAAY,EAAE,YAAY;AAC1B,YAAA,YAAY,EAAE,YAAY;AAC3B,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc;AAEpC,QAAA,IAAI,aAAa,KAAK,QAAQ,EAAE;AAC9B,YAAA,IAAI,CAAC,OAAO,GAAG,eAAe,CAAiB,aAAgC,CAAC;AAChF,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,SAAS;QACjC;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAE1B,IAAI,CAAC,kBAAkB,EAAE;QAEzB,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,MAAM,CAAC,MAAK;YACV,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAErC,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gBACzB;YACF;YAEA,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC,CAAC,CACH;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;gBAClB;YACF;AAEA,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAE3B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBACf,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE;gBAE/C,SAAS,CAAC,MAAK;AACb,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC;AAC1E,gBAAA,CAAC,CAAC;YACJ;iBAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE;gBACrC,SAAS,CAAC,MAAK;AACb,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC;AACvE,gBAAA,CAAC,CAAC;YACJ;QACF,CAAC,CAAC,CACH;IACH;;IAGA,YAAY,GAAA;QACV,IAAI,CAAC,kBAAkB,EAAE;IAC3B;AAEA;;;AAGG;IACH,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,OAAA,GAAmB,EAAE,KAAI;AAC5C,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAC3B,IAAA,CAAC;AAED;;;AAGG;AACH,IAAA,SAAS,GAAG,CAAC,KAAgB,KAAwB;QACnD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE;gBACjC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;YACjD;QACF;AAEA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;AAED;;;;;;AAMG;AACH,IAAA,OAAO,GAAG,CAAC,KAAsB,EAAE,IAA4B,KAAI;QACjE,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;QAClC,IAAI,OAAO,GAAG,KAAK;AAEnB,QAAA,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAE1B,IAAI,CAAC,GAAG,EAAE;gBACR;YACF;YAEA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAElC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;AACtB,YAAA,CAAC,OAAO,KAAK,OAAO,GAAG,IAAI,CAAC;QAC9B;AAEA,QAAA,IAAI,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AAE/B,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YACzB,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAS,CAAC,cAAc,CAAC,CAAC;QAC5E;AACF,IAAA,CAAC;;IAGD,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5C,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;IACvB;;IAGA,CAAC,MAAM,CAAC,OAAO,CAAC,GAAA;QACd,IAAI,CAAC,OAAO,EAAE;IAChB;AAEQ,IAAA,cAAc,CAAC,KAAa,EAAA;QAClC,IAAI,OAAO,GAAG,CAAC;AAEf,QAAA,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAEjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;AACtB,YAAA,CAAC,MAAM,IAAI,OAAO,EAAE;QACtB;AAEA,QAAA,IAAI,OAAO,GAAG,CAAC,EAAE;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AAE/B,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YACzB,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAS,CAAC,cAAc,CAAC,CAAC;QAC5E;IACF;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YAEhD,IAAI,CAAC,KAAK,EAAE;gBACV;YACF;AAEA,YAAA,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE;gBACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAE1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;YACxB;AAEA,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3C;AAAE,QAAA,MAAM;AACN,YAAA,IAAI;gBACF,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YACvC;AAAE,YAAA,MAAM;;YAER;QACF;IACF;IAEQ,WAAW,GAAA;AACjB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,EAAE,WAAW,EAAE;QAEzF,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ;QACzB,MAAM,GAAG,GAAW,EAAE;AAEtB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAExB,YAAA,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxD;AAEA,QAAA,OAAO,GAAG;IACZ;AAEQ,IAAA,KAAK,CAAC,EAAQ,EAAA;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAY;AAExC,QAAA,IAAI,GAAG,IAAI,IAAI,EAAE;AACf,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACpD;AAEQ,IAAA,WAAW,CAAC,QAA+B,EAAA;AACjD,QAAA,IAAI,QAAQ,KAAK,WAAW,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM;AAE3D,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC1B;aAAO;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B;IACF;;;;MC1TW,cAAc,CAAA;AACzB;;;;;AAKG;AACH,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE;AAErE;;;;;AAKG;AACH,IAAA,KAAK,GAAG,MAAM,CAAkB,EAAE,iDAAC;AACnC,IAAA,WAAW,GAAG,MAAM,CAAkB,EAAE,uDAAC;AAEzC;;;;;;;AAOG;AACH,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AACtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;YAC9C,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACtC,YAAA,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;AACzB,SAAA,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,OAAO;AAC9E,IAAA,CAAC,mDAAC;AAEe,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,cAAc;IAE/B,WAAA,CAAY,KAAa,EAAE,MAA8B,EAAA;AACvD,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,aAAa,CAAC,eAAe,IAAI,MAAM,CAAC;AAClF,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,aAAa,CAAC,eAAe,IAAI,MAAM,CAAC;QAClF,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,IAAI;AAEpD,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;IAC7B;;AAGA;;;;;AAKG;AACH,IAAA,YAAY,KAAI;AAEhB;;;;;;;;;;AAUG;AACH,IAAA,SAAS,GAAG,CAAC,KAAgB,KAAwB;QACnD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;YAC/B,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE;gBACjC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;YACjD;QACF;AAEA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;AAED;;;;;;;;;AASG;AACH,IAAA,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,KAAI;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAE1B,QAAA,IAAI,IAAI,EAAE,MAAM,EAAE;AAChB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAC/F;QACH;aAAO;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B;AACF,IAAA,CAAC;AAED;;;;;;;;;;;AAWG;AACH,IAAA,OAAO,GAAG,CAAC,KAAsB,EAAE,IAA4B,KAAI;AACjE,QAAA,IAAI,IAAI,EAAE,OAAO,EAAE;AACjB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B;aAAO;AACL,YAAA,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,CAAoB;AAE5D,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B;AACF,IAAA,CAAC;AACF;;AClID;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"reforgium-statum.mjs","sources":["../../../../libs/statum/src/serializer/serializer.helpers.ts","../../../../libs/statum/src/serializer/serializer.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/statum.provider.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.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 return isObject(value) ? this.deserialize(value) : 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 const parsed = this.config.mapString.parse?.(value);\r\n\r\n if (parsed !== undefined) {\r\n return parsed;\r\n }\r\n\r\n return 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 { 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 entries(): [KeyT, ValueT][] {\r\n return Array.from(this.map.entries());\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 constructor(public prefix = 're') {}\r\n\r\n get length() {\r\n return Object.keys(localStorage).filter((key) => key.startsWith(this.prefix || '')).length;\r\n }\r\n\r\n get(key: Key): Type | null {\r\n const raw = localStorage.getItem(this.getSafePrefix(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(this.getSafePrefix(key), str);\r\n }\r\n\r\n remove(key: Key): void {\r\n return localStorage.removeItem(this.getSafePrefix(key));\r\n }\r\n\r\n clear(): void {\r\n const keys = Object.keys(localStorage).filter((key) => key.startsWith(this.prefix || ''));\r\n\r\n keys.forEach((key) => localStorage.removeItem(key));\r\n }\r\n\r\n private getSafePrefix(key: Key): string {\r\n return this.prefix ? `${this.prefix}:${key}` : String(key);\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 constructor(public prefix = 're') {}\r\n\r\n get length() {\r\n return Object.keys(sessionStorage).filter((key) => key.startsWith(this.prefix || '')).length;\r\n }\r\n\r\n get(key: Key): Type | null {\r\n const raw = sessionStorage.getItem(this.getSafePrefix(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(this.getSafePrefix(key), str);\r\n }\r\n\r\n remove(key: Key): void {\r\n return sessionStorage.removeItem(this.getSafePrefix(key));\r\n }\r\n\r\n clear(): void {\r\n const keys = Object.keys(sessionStorage).filter((key) => key.startsWith(this.prefix || ''));\r\n\r\n keys.forEach((key) => sessionStorage.removeItem(key));\r\n }\r\n\r\n private getSafePrefix(key: Key): string {\r\n return this.prefix ? `${this.prefix}:${key}` : String(key);\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","// noinspection ES6PreferShortImport\r\n\r\nimport { InjectionToken } from '@angular/core';\r\n\r\nimport { SerializerConfig } from './serializer';\r\nimport { DictStoreProviderConfig } from './stores/dict-store/dict.models';\r\nimport { PaginatedDataStoreProviderConfig } from './stores/paginated-data-store';\r\n\r\ntype PaginatedDataProviderConfig = { paginatedData?: PaginatedDataStoreProviderConfig };\r\ntype SerializerProviderConfig = { serializer?: Partial<SerializerConfig> };\r\ntype DictProviderConfig = { dict?: DictStoreProviderConfig };\r\n\r\ntype StatumConfig = PaginatedDataProviderConfig & SerializerProviderConfig & DictProviderConfig;\r\n\r\nexport const STATUM_CONFIG = new InjectionToken<StatumConfig>('RE_STATUM_CONFIG');\r\n","import { RestMethods } from '@reforgium/internal';\r\n\r\nimport { CallArgs } from './resource.models';\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, args: CallArgs): string {\r\n const params = stableStringify(args.params || {});\r\n const query = stableStringify(args.query || {});\r\n const payload = stableStringify((args as CallArgs).payload || {});\r\n\r\n return `${method}|${path}|${params}|${query}|${payload}`;\r\n}\r\n\r\nfunction stableStringify(value: unknown): string {\r\n if (value === null || value === undefined) {\r\n return '';\r\n }\r\n\r\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\r\n return String(value);\r\n }\r\n\r\n if (value instanceof Date) {\r\n return value.toISOString();\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return `[${value.map((entry) => stableStringify(entry)).join(',')}]`;\r\n }\r\n\r\n if (typeof value === 'object') {\r\n const entries = Object.entries(value as Record<string, unknown>)\r\n .filter(([, v]) => v !== undefined)\r\n .sort(([a], [b]) => a.localeCompare(b))\r\n .map(([k, v]) => `${k}:${stableStringify(v)}`);\r\n\r\n return `{${entries.join(',')}}`;\r\n }\r\n\r\n return String(value);\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 } from '../../serializer';\r\nimport { STATUM_CONFIG } from '../../statum.provider';\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(STATUM_CONFIG, { optional: true })?.serializer ?? {});\r\n\r\n #value = signal<Data | null>(null);\r\n #status = signal<ResourceStatus>('idle');\r\n #error = signal<unknown | null>(null);\r\n #activeRequests = signal(0);\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(() => this.#activeRequests() > 0 || this.#status() === 'stale');\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, args);\r\n const query = this.prepareQuery(args);\r\n const responseType = cfg.responseType ?? 'json';\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 const isSWR = strategy === 'cache-first' && entry.data != null;\r\n\r\n entry.status = isSWR ? '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, responseType: responseType as 'json' }),\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 return;\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, args);\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, args);\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 const responseType = config.responseType ?? 'json';\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, {\r\n body: serializedPayload,\r\n params: query,\r\n responseType: responseType as 'json',\r\n });\r\n } else {\r\n // @ts-ignore\r\n req$ = this.http[method.toLowerCase()]<Response>(url, serializedPayload, {\r\n params: query,\r\n responseType: responseType as 'json',\r\n });\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 return;\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 promote && this.#activeRequests.update((n) => n + 1);\r\n\r\n return 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 promote && this.#activeRequests.update((n) => Math.max(0, n - 1));\r\n this.promoteCurrent(entry, promote);\r\n }),\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","// noinspection ES6PreferShortImport\r\n\r\nimport { DestroyRef, inject, signal, WritableSignal } from '@angular/core';\r\n\r\nimport { AnyDict, concatArray, deepEqual, isNullable, PageableResponse, Query, QueryParams } from '@reforgium/internal';\r\n\r\nimport { LruCache } from '../../cache/storages/lru.storage';\r\nimport { STATUM_CONFIG } from '../../statum.provider';\r\nimport { isAbort, ResourceStore } from '../../stores/resource-store';\r\n\r\nimport { PaginatedDataStoreConfig } 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(STATUM_CONFIG, { optional: true })?.paginatedData || {};\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 routeParams: AnyDict = {};\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: PaginatedDataStoreConfig<ItemsType, FilterType> = {},\r\n ) {\r\n this.applyConfig(config);\r\n this.#cache = new LruCache<number, ItemsType[]>(this.config.cacheSize!);\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 * Set route parameters (path variables) for the resource URL.\r\n * Does not trigger loading automatically — call `refresh()` or `updatePage()` after.\r\n *\r\n * @param params Dictionary of route parameters (e.g., `{ id: '123' }`)\r\n * @param opts Options object\r\n * @param opts.reset If `true`, resets page to 0, clears cache, total elements count, and items\r\n * @param opts.abort If `true`, aborts all active transport requests and sets loading to false\r\n *\r\n * @example\r\n * ```ts\r\n * store.setRouteParams({ userId: '42' });\r\n * await store.refresh(); // fetch with new params\r\n *\r\n * // Or with options:\r\n * store.setRouteParams({ userId: '42' }, { reset: false, abort: true });\r\n * ```\r\n */\r\n setRouteParams = (params: AnyDict = {}, opts: { reset?: boolean; abort?: boolean } = {}) => {\r\n const isChanged = !deepEqual(this.routeParams, params);\r\n\r\n if (!isChanged) {\r\n return;\r\n }\r\n\r\n this.routeParams = params;\r\n\r\n if (opts.reset) {\r\n this.page = 0;\r\n this.totalElements = 0;\r\n this.#cache.clear();\r\n this.cached.set([]);\r\n this.items.set([]);\r\n }\r\n\r\n if (opts?.abort) {\r\n try {\r\n this.#transport?.abortAll?.('Route params changed');\r\n } finally {\r\n this.loading.set(false);\r\n }\r\n }\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: PaginatedDataStoreConfig<ItemsType>) => {\r\n this.config = { ...this.config, ...config };\r\n this.#cache.limit = this.config.cacheSize || this.defaultConfig.defaultCacheSize || 5;\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 const params = this.routeParams;\r\n\r\n if (this.config.method === 'GET') {\r\n return this.#transport.get<AnyDict, AnyDict>({ query, params }, { 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]<AnyDict, AnyDict, Partial<FilterType>, PageableResponse<ItemsType> | ItemsType[]>(\r\n { query, payload, params },\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: PaginatedDataStoreConfig<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 if (this.#cache) {\r\n this.#cache.limit = this.config.cacheSize!;\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, inject, Signal, signal, untracked } from '@angular/core';\r\n\r\nimport { AnyDict, debounceSignal } from '@reforgium/internal';\r\n\r\nimport { LruCache, StorageInterface, StorageStrategy, storageStrategy } from '../../cache';\r\nimport { STATUM_CONFIG } from '../../statum.provider';\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 /**\r\n * Default dictionary configuration resolved from {@link STATUM_CONFIG}.\r\n *\r\n * Used as a global fallback when local configuration does not explicitly\r\n */\r\n defaultConfig = inject(STATUM_CONFIG, { optional: true })?.dict || {};\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 private debouncedSearchText!: 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.debouncedSearchText() || !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 autoLoad = true,\r\n method = this.defaultConfig.defaultRestMethod,\r\n presetFilters = this.defaultConfig.defaultPresetFilters,\r\n parseResponse,\r\n parseRequest,\r\n debounceTime = this.defaultConfig.defaultDebounceTime,\r\n fixed = true,\r\n maxOptionsSize = this.defaultConfig.defaultMaxOptionsSize,\r\n labelKey = this.defaultConfig.defaultLabelKey || 'name',\r\n valueKey = this.defaultConfig.defaultValueKey || 'code',\r\n keyPrefix = this.defaultConfig.defaultPrefix || 're',\r\n cacheStrategy = this.defaultConfig.defaultCacheStrategy || 'persist',\r\n }: DictStoreConfig<Type>,\r\n ) {\r\n const searchDebounce = debounceTime ?? 300;\r\n\r\n this.debouncedSearchText = debounceSignal(this.searchText, searchDebounce);\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\r\n if (cacheStrategy !== 'memory') {\r\n this.storage = storageStrategy<string, Type[]>(cacheStrategy as StorageStrategy);\r\n this.storage.prefix = keyPrefix;\r\n }\r\n\r\n this.setAutoload(autoLoad);\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.debouncedSearchText().trim();\r\n\r\n untracked(() => {\r\n this._lastPromise = this.#helper.updateFilters({ name: query, ...rest });\r\n });\r\n } else if (!this.cachedItems().length) {\r\n untracked(() => {\r\n this._lastPromise = this.#helper.updateFilters({ name: '', ...rest });\r\n });\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.fixed ? this.searchText() : this.debouncedSearchText()).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 String(val ?? '')\r\n .toLowerCase()\r\n .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 private setAutoload(autoLoad: boolean | 'whenEmpty') {\r\n if (autoLoad === 'whenEmpty') {\r\n const isEmpty = !this.storage?.get(this.storageKey)?.length;\r\n\r\n this._armed.set(isEmpty);\r\n } else {\r\n this._armed.set(autoLoad);\r\n }\r\n }\r\n}\r\n","import { computed, inject, signal } from '@angular/core';\r\n\r\nimport { AnyDict } from '@reforgium/internal';\r\n\r\nimport { STATUM_CONFIG } from '../../statum.provider';\r\nimport { DictLocalConfig, ValueType } from './dict.models';\r\n\r\nexport class DictLocalStore<Type extends AnyDict> {\r\n /**\r\n * Default dictionary configuration resolved from {@link STATUM_CONFIG}.\r\n *\r\n * Used as a global fallback when local configuration does not explicitly\r\n * define dictionary keys.\r\n */\r\n defaultConfig = inject(STATUM_CONFIG, { optional: true })?.dict || {};\r\n\r\n /**\r\n * Source dictionary items.\r\n *\r\n * Represents the full, unfiltered list of dictionary entries.\r\n * Used as the base data set for search and option generation.\r\n */\r\n items = signal<readonly Type[]>([]);\r\n #draftItems = signal<readonly Type[]>([]);\r\n\r\n /**\r\n * Computed list of options in `{ label, value }` format.\r\n *\r\n * Based on the current draft items (after search/filtering).\r\n * Respects `maxOptionsSize` to limit the number of generated options.\r\n *\r\n * Intended for direct use in dropdowns and select-like components.\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 ?? (this.defaultConfig.defaultLabelKey || 'name');\r\n this.valueKey = config?.valueKey ?? (this.defaultConfig.defaultValueKey || 'code');\r\n this.maxOptionsSize = config?.maxOptionsSize ?? this.defaultConfig.defaultMaxOptionsSize ?? 1000;\r\n\r\n this.items.set(items);\r\n this.#draftItems.set(items);\r\n }\r\n\r\n // noinspection JSUnusedGlobalSymbols\r\n /**\r\n * Restore cached dictionary state.\r\n *\r\n * This implementation is a no-op and exists only for API compatibility\r\n * with {@link DictStore}.\r\n */\r\n restoreCache() {}\r\n\r\n /**\r\n * Resolve display label by value.\r\n *\r\n * Performs a linear search over dictionary items and returns\r\n * the corresponding label for the given value.\r\n *\r\n * Commonly used for reverse binding (value → label).\r\n *\r\n * @param value Dictionary value to look up\r\n * @returns Resolved 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 /**\r\n * Filter dictionary items by label.\r\n *\r\n * Applies a case-insensitive substring match against the label field\r\n * and updates the internal draft items used for option generation.\r\n *\r\n * Passing an empty string resets the filter and restores all items.\r\n *\r\n * @param name Search query string\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 /**\r\n * Preload additional dictionary items.\r\n *\r\n * Can either replace the current items completely or append\r\n * new entries to the existing list.\r\n *\r\n * Updates both the source items and the current draft items.\r\n *\r\n * @param items Items to preload\r\n * @param opts Preload options\r\n * @param opts.replace When `true`, replaces existing items instead of appending\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
|
@@ -231,6 +231,7 @@ declare class LruCache<KeyT, ValueT> implements StorageInterface<KeyT, ValueT> {
|
|
|
231
231
|
has(key: KeyT): boolean;
|
|
232
232
|
keys(): KeyT[];
|
|
233
233
|
values(): ValueT[];
|
|
234
|
+
entries(): [KeyT, ValueT][];
|
|
234
235
|
toArray(): ValueT[];
|
|
235
236
|
fromArray(entries: [KeyT, ValueT][]): void;
|
|
236
237
|
}
|
|
@@ -655,7 +656,7 @@ declare class PaginatedDataStore<ItemsType extends object, FilterType = unknown>
|
|
|
655
656
|
*
|
|
656
657
|
* @param params Dictionary of route parameters (e.g., `{ id: '123' }`)
|
|
657
658
|
* @param opts Options object
|
|
658
|
-
* @param opts.reset If `true
|
|
659
|
+
* @param opts.reset If `true`, resets page to 0, clears cache, total elements count, and items
|
|
659
660
|
* @param opts.abort If `true`, aborts all active transport requests and sets loading to false
|
|
660
661
|
*
|
|
661
662
|
* @example
|
|
@@ -840,12 +841,12 @@ declare class DictStore<Type extends AnyDict> {
|
|
|
840
841
|
* Current list of dictionary items.
|
|
841
842
|
* Source — local cache (fixed=true) or data from `PaginatedDataStore`.
|
|
842
843
|
*/
|
|
843
|
-
items:
|
|
844
|
+
items: Signal<readonly Type[]>;
|
|
844
845
|
/**
|
|
845
846
|
* Ready-to-use dropdown options: `{ label, value }`.
|
|
846
847
|
* Respects `maxOptionsSize` for truncating the list.
|
|
847
848
|
*/
|
|
848
|
-
options:
|
|
849
|
+
options: Signal<{
|
|
849
850
|
label: string;
|
|
850
851
|
value: Type[keyof Type & string];
|
|
851
852
|
}[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reforgium-statum.d.ts","sources":["../../../../libs/statum/src/serializer/serialize.models.ts","../../../../libs/statum/src/serializer/serializer.ts","../../../../libs/statum/src/cache/storage-strategy/models.ts","../../../../libs/statum/src/cache/storages/models.ts","../../../../libs/statum/src/cache/storages/lru.storage.ts","../../../../libs/statum/src/cache/storage-strategy/storage.strategy.ts","../../../../libs/statum/src/stores/resource-store/resource.models.ts","../../../../libs/statum/src/stores/resource-store/resource.store.ts","../../../../libs/statum/src/stores/resource-store/resource.utils.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.models.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.store.ts","../../../../libs/statum/src/stores/dict-store/dict.models.ts","../../../../libs/statum/src/stores/dict-store/dict.store.ts","../../../../libs/statum/src/stores/dict-store/dict-local.store.ts","../../../../libs/statum/src/statum.provider.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":";;;;;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;
|
|
1
|
+
{"version":3,"file":"reforgium-statum.d.ts","sources":["../../../../libs/statum/src/serializer/serialize.models.ts","../../../../libs/statum/src/serializer/serializer.ts","../../../../libs/statum/src/cache/storage-strategy/models.ts","../../../../libs/statum/src/cache/storages/models.ts","../../../../libs/statum/src/cache/storages/lru.storage.ts","../../../../libs/statum/src/cache/storage-strategy/storage.strategy.ts","../../../../libs/statum/src/stores/resource-store/resource.models.ts","../../../../libs/statum/src/stores/resource-store/resource.store.ts","../../../../libs/statum/src/stores/resource-store/resource.utils.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.models.ts","../../../../libs/statum/src/stores/paginated-data-store/paginated-data.store.ts","../../../../libs/statum/src/stores/dict-store/dict.models.ts","../../../../libs/statum/src/stores/dict-store/dict.store.ts","../../../../libs/statum/src/stores/dict-store/dict-local.store.ts","../../../../libs/statum/src/statum.provider.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
|