@angular-architects/ngrx-toolkit 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm2022/index.mjs CHANGED
@@ -6,4 +6,5 @@ export * from './lib/with-data-service';
6
6
  export { withStorageSync } from './lib/with-storage-sync';
7
7
  export * from './lib/redux-connector';
8
8
  export * from './lib/redux-connector/rxjs-interop';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxHQUVaLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsY0FBYyxrQkFBa0IsQ0FBQztBQUVqQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0seUJBQXlCLENBQUM7QUFDdEUsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9DQUFvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHtcbiAgd2l0aERldnRvb2xzLFxuICBwYXRjaFN0YXRlLFxuICB1cGRhdGVTdGF0ZSxcbiAgQWN0aW9uLFxufSBmcm9tICcuL2xpYi93aXRoLWRldnRvb2xzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtcmVkdXgnO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi93aXRoLWNhbGwtc3RhdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvd2l0aC11bmRvLXJlZG8nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvd2l0aC1kYXRhLXNlcnZpY2UnO1xuZXhwb3J0IHsgd2l0aFN0b3JhZ2VTeW5jLCBTeW5jQ29uZmlnIH0gZnJvbSAnLi9saWIvd2l0aC1zdG9yYWdlLXN5bmMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcmVkdXgtY29ubmVjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JlZHV4LWNvbm5lY3Rvci9yeGpzLWludGVyb3AnO1xuIl19
9
+ export * from './lib/with-pagination';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxHQUVaLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsY0FBYyxrQkFBa0IsQ0FBQztBQUVqQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0seUJBQXlCLENBQUM7QUFDdEUsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICB3aXRoRGV2dG9vbHMsXG4gIHBhdGNoU3RhdGUsXG4gIHVwZGF0ZVN0YXRlLFxuICBBY3Rpb24sXG59IGZyb20gJy4vbGliL3dpdGgtZGV2dG9vbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvd2l0aC1yZWR1eCc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtY2FsbC1zdGF0ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi93aXRoLXVuZG8tcmVkbyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi93aXRoLWRhdGEtc2VydmljZSc7XG5leHBvcnQgeyB3aXRoU3RvcmFnZVN5bmMsIFN5bmNDb25maWcgfSBmcm9tICcuL2xpYi93aXRoLXN0b3JhZ2Utc3luYyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9yZWR1eC1jb25uZWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcmVkdXgtY29ubmVjdG9yL3J4anMtaW50ZXJvcCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi93aXRoLXBhZ2luYXRpb24nO1xuIl19
@@ -0,0 +1,152 @@
1
+ /** With pagination comes in two flavors the first one is local pagination or in memory pagination. For example we have 2000 items which we want
2
+ * to display in a table and the response payload is small enough to be stored in the memory. But we can not display all 2000 items at once
3
+ * so we need to paginate the data. The second flavor is server side pagination where the response payload is too large to be stored in the memory
4
+ * and we need to fetch the data from the server in chunks. In the second case we 'could' also cache the data in the memory but that could lead to
5
+ * other problems like memory leaks and stale data. So we will not cache the data in the memory in the second case.
6
+ * This feature implements the local pagination.
7
+ */
8
+ import { computed } from '@angular/core';
9
+ import { signalStoreFeature, withComputed, withState, } from '@ngrx/signals';
10
+ import { capitalize } from './with-data-service';
11
+ export function withPagination(options) {
12
+ const { pageKey, pageSizeKey, entitiesKey, selectedPageEntitiesKey, totalCountKey, pageCountKey, pageNavigationArrayMaxKey, pageNavigationArrayKey, } = createPaginationKeys(options);
13
+ return signalStoreFeature(withState({
14
+ [pageKey]: 1,
15
+ [pageSizeKey]: 10,
16
+ [pageNavigationArrayMaxKey]: 7,
17
+ }), withComputed((store) => {
18
+ const entities = store[entitiesKey];
19
+ const page = store[pageKey];
20
+ const pageSize = store[pageSizeKey];
21
+ const pageNavigationArrayMax = store[pageNavigationArrayMaxKey];
22
+ return {
23
+ // The derived enitites which are displayed on the current page
24
+ [selectedPageEntitiesKey]: computed(() => {
25
+ const pageSizeValue = pageSize();
26
+ const pageValue = page();
27
+ // If the page is greater than the total number of pages
28
+ // we should return an empty array
29
+ if (pageValue < 0 ||
30
+ pageSizeValue === 0 ||
31
+ pageValue > Math.ceil(entities().length / pageSizeValue)) {
32
+ return [];
33
+ }
34
+ return entities().slice((pageValue - 1) * pageSizeValue, pageValue * pageSizeValue);
35
+ }),
36
+ [totalCountKey]: computed(() => entities().length),
37
+ [pageCountKey]: computed(() => {
38
+ const totalCountValue = entities().length;
39
+ const pageSizeValue = pageSize();
40
+ if (totalCountValue === 0) {
41
+ return 0;
42
+ }
43
+ return Math.ceil(totalCountValue / pageSizeValue);
44
+ }),
45
+ [pageNavigationArrayKey]: computed(() => createPageArray(page(), pageSize(), entities().length, pageNavigationArrayMax())),
46
+ };
47
+ }));
48
+ }
49
+ export function gotoPage(page, options) {
50
+ const { pageKey } = createPaginationKeys(options);
51
+ return {
52
+ [pageKey]: page,
53
+ };
54
+ }
55
+ export function setPageSize(pageSize, options) {
56
+ const { pageSizeKey } = createPaginationKeys(options);
57
+ return {
58
+ [pageSizeKey]: pageSize,
59
+ };
60
+ }
61
+ export function nextPage(options) {
62
+ const { pageKey } = createPaginationKeys(options);
63
+ return {
64
+ [pageKey]: (currentPage) => currentPage + 1,
65
+ };
66
+ }
67
+ export function previousPage(options) {
68
+ const { pageKey } = createPaginationKeys(options);
69
+ return {
70
+ [pageKey]: (currentPage) => Math.max(currentPage - 1, 1),
71
+ };
72
+ }
73
+ export function firstPage(options) {
74
+ const { pageKey } = createPaginationKeys(options);
75
+ return {
76
+ [pageKey]: 1,
77
+ };
78
+ }
79
+ export function setMaxPageNavigationArrayItems(maxPageNavigationArrayItems, options) {
80
+ const { pageNavigationArrayMaxKey } = createPaginationKeys(options);
81
+ return {
82
+ [pageNavigationArrayMaxKey]: maxPageNavigationArrayItems,
83
+ };
84
+ }
85
+ function createPaginationKeys(options) {
86
+ const entitiesKey = options?.collection
87
+ ? `${options.collection}Entities`
88
+ : 'entities';
89
+ const selectedPageEntitiesKey = options?.collection
90
+ ? `selectedPage${capitalize(options?.collection)}Entities`
91
+ : 'selectedPageEntities';
92
+ const pageKey = options?.collection ? `${options.collection}CurrentPage` : 'currentPage';
93
+ const pageSizeKey = options?.collection
94
+ ? `${options.collection}PageSize`
95
+ : 'pageSize';
96
+ const totalCountKey = options?.collection
97
+ ? `${options.collection}TotalCount`
98
+ : 'totalCount';
99
+ const pageCountKey = options?.collection
100
+ ? `${options.collection}PageCount`
101
+ : 'pageCount';
102
+ const pageNavigationArrayMaxKey = options?.collection
103
+ ? `${options.collection}PageNavigationArrayMax`
104
+ : 'pageNavigationArrayMax';
105
+ const pageNavigationArrayKey = options?.collection
106
+ ? `${options.collection}PageNavigationArray`
107
+ : 'pageNavigationArray';
108
+ return {
109
+ pageKey,
110
+ pageSizeKey,
111
+ entitiesKey,
112
+ selectedPageEntitiesKey,
113
+ totalCountKey,
114
+ pageCountKey,
115
+ pageNavigationArrayKey,
116
+ pageNavigationArrayMaxKey,
117
+ };
118
+ }
119
+ export function createPageArray(currentPage, itemsPerPage, totalItems, paginationRange) {
120
+ // Convert paginationRange to number in case it's a string
121
+ paginationRange = +paginationRange;
122
+ // Calculate total number of pages
123
+ const totalPages = Math.max(Math.ceil(totalItems / itemsPerPage), 1);
124
+ const halfWay = Math.ceil(paginationRange / 2);
125
+ const isStart = currentPage <= halfWay;
126
+ const isEnd = totalPages - halfWay < currentPage;
127
+ const isMiddle = !isStart && !isEnd;
128
+ const ellipsesNeeded = paginationRange < totalPages;
129
+ const pages = [];
130
+ for (let i = 1; i <= totalPages && i <= paginationRange; i++) {
131
+ let pageNumber = i;
132
+ if (i === paginationRange) {
133
+ pageNumber = totalPages;
134
+ }
135
+ else if (ellipsesNeeded) {
136
+ if (isEnd) {
137
+ pageNumber = totalPages - paginationRange + i;
138
+ }
139
+ else if (isMiddle) {
140
+ pageNumber = currentPage - halfWay + i;
141
+ }
142
+ }
143
+ const openingEllipsesNeeded = i === 2 && (isMiddle || isEnd);
144
+ const closingEllipsesNeeded = i === paginationRange - 1 && (isMiddle || isStart);
145
+ const label = ellipsesNeeded && (openingEllipsesNeeded || closingEllipsesNeeded)
146
+ ? '...'
147
+ : pageNumber;
148
+ pages.push({ label, value: pageNumber });
149
+ }
150
+ return pages;
151
+ }
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1wYWdpbmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRvb2xraXQvc3JjL2xpYi93aXRoLXBhZ2luYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFPdkIsT0FBTyxFQUFVLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBcUd6RCxNQUFNLFVBQVUsY0FBYyxDQUc1QixPQUFvQztJQUNwQyxNQUFNLEVBQ0osT0FBTyxFQUNQLFdBQVcsRUFDWCxXQUFXLEVBQ1gsdUJBQXVCLEVBQ3ZCLGFBQWEsRUFDYixZQUFZLEVBQ1oseUJBQXlCLEVBQ3pCLHNCQUFzQixHQUN2QixHQUFHLG9CQUFvQixDQUFhLE9BQU8sQ0FBQyxDQUFDO0lBRTlDLE9BQU8sa0JBQWtCLENBQ3ZCLFNBQVMsQ0FBQztRQUNSLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNaLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRTtRQUNqQixDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQztLQUMvQixDQUFDLEVBQ0YsWUFBWSxDQUFDLENBQUMsS0FBOEIsRUFBRSxFQUFFO1FBQzlDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQWdCLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBbUIsQ0FBQztRQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFtQixDQUFDO1FBQ3RELE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUNsQyx5QkFBeUIsQ0FDUixDQUFDO1FBRXBCLE9BQU87WUFDTCwrREFBK0Q7WUFDL0QsQ0FBQyx1QkFBdUIsQ0FBQyxF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QyxDQUFDO1FBRW5CLElBQUksQ0FBQyxLQUFLLGVBQWUsRUFBRTtZQUN6QixVQUFVLEdBQUcsVUFBVSxDQUFDO1NBQ3pCO2FBQU0sSUFBSSxjQUFjLEVBQUU7WUFDekIsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsVUFBVSxHQUFHLFVBQVUsR0FBRyxlQUFlLEdBQUcsQ0FBQyxDQUFDO2FBQy9DO2lCQUFNLElBQUksUUFBUSxFQUFFO2dCQUNuQixVQUFVLEdBQUcsV0FBVyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7YUFDeEM7U0FDRjtRQUVELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsQ0FBQztRQUM3RCxNQUFNLHFCQUFxQixHQUN6QixDQUFDLEtBQUssZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQztRQUVyRCxNQUFNLEtBQUssR0FDVCxjQUFjLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxxQkFBcUIsQ0FBQztZQUNoRSxDQUFDLENBQUMsS0FBSztZQUNQLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFFakIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztLQUMxQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBXaXRoIHBhZ2luYXRpb24gY29tZXMgaW4gdHdvIGZsYXZvcnMgdGhlIGZpcnN0IG9uZSBpcyBsb2NhbCBwYWdpbmF0aW9uIG9yIGluIG1lbW9yeSBwYWdpbmF0aW9uLiBGb3IgZXhhbXBsZSB3ZSBoYXZlIDIwMDAgaXRlbXMgd2hpY2ggd2Ugd2FudFxuICogdG8gZGlzcGxheSBpbiBhIHRhYmxlIGFuZCB0aGUgcmVzcG9uc2UgcGF5bG9hZCBpcyBzbWFsbCBlbm91Z2ggdG8gYmUgc3RvcmVkIGluIHRoZSBtZW1vcnkuIEJ1dCB3ZSBjYW4gbm90IGRpc3BsYXkgYWxsIDIwMDAgaXRlbXMgYXQgb25jZVxuICogc28gd2UgbmVlZCB0byBwYWdpbmF0ZSB0aGUgZGF0YS4gVGhlIHNlY29uZCBmbGF2b3IgaXMgc2VydmVyIHNpZGUgcGFnaW5hdGlvbiB3aGVyZSB0aGUgcmVzcG9uc2UgcGF5bG9hZCBpcyB0b28gbGFyZ2UgdG8gYmUgc3RvcmVkIGluIHRoZSBtZW1vcnlcbiAqIGFuZCB3ZSBuZWVkIHRvIGZldGNoIHRoZSBkYXRhIGZyb20gdGhlIHNlcnZlciBpbiBjaHVua3MuIEluIHRoZSBzZWNvbmQgY2FzZSB3ZSAnY291bGQnIGFsc28gY2FjaGUgdGhlIGRhdGEgaW4gdGhlIG1lbW9yeSBidXQgdGhhdCBjb3VsZCBsZWFkIHRvXG4gKiBvdGhlciBwcm9ibGVtcyBsaWtlIG1lbW9yeSBsZWFrcyBhbmQgc3RhbGUgZGF0YS4gU28gd2Ugd2lsbCBub3QgY2FjaGUgdGhlIGRhdGEgaW4gdGhlIG1lbW9yeSBpbiB0aGUgc2Vjb25kIGNhc2UuXG4gKiBUaGlzIGZlYXR1cmUgaW1wbGVtZW50cyB0aGUgbG9jYWwgcGFnaW5hdGlvbi5cbiAqL1xuXG5pbXBvcnQgeyBTaWduYWwsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBTaWduYWxTdG9yZUZlYXR1cmUsXG4gIHNpZ25hbFN0b3JlRmVhdHVyZSxcbiAgd2l0aENvbXB1dGVkLFxuICB3aXRoU3RhdGUsXG59IGZyb20gJ0BuZ3J4L3NpZ25hbHMnO1xuaW1wb3J0IHsgRW10cHkgfSBmcm9tICcuL3NoYXJlZC9lbXB0eSc7XG5pbXBvcnQge1xuICBFbnRpdHlTaWduYWxzLFxuICBFbnRpdHlTdGF0ZSxcbiAgTmFtZWRFbnRpdHlTaWduYWxzLFxufSBmcm9tICdAbmdyeC9zaWduYWxzL2VudGl0aWVzL3NyYy9tb2RlbHMnO1xuaW1wb3J0IHsgRW50aXR5LCBjYXBpdGFsaXplIH0gZnJvbSAnLi93aXRoLWRhdGEtc2VydmljZSc7XG5cbi8vIFRoaXMgaXMgYSB2aXJ0dWFsIHBhZ2Ugd2hpY2ggaXMgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgcGFnaW5hdGlvbiBjb250cm9sXG5leHBvcnQgdHlwZSBQYWdlID0geyBsYWJlbDogc3RyaW5nIHwgbnVtYmVyOyB2YWx1ZTogbnVtYmVyIH07XG5cbmV4cG9ydCB0eXBlIE5hbWVkUGFnaW5hdGlvblNlcnZpY2VTdGF0ZTxcbiAgRSBleHRlbmRzIEVudGl0eSxcbiAgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZ1xuPiA9IHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgc2VsZWN0ZWRQYWdlJHtDYXBpdGFsaXplPEs+fUVudGl0aWVzYF06IEFycmF5PEU+O1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtMb3dlcmNhc2U8Sz59Q3VycmVudFBhZ2VgXTogbnVtYmVyO1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtMb3dlcmNhc2U8Sz59UGFnZVNpemVgXTogbnVtYmVyO1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtMb3dlcmNhc2U8Sz59VG90YWxDb3VudGBdOiBudW1iZXI7XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0xvd2VyY2FzZTxLPn1QYWdlQ291bnRgXTogbnVtYmVyO1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtMb3dlcmNhc2U8Sz59UGFnZU5hdmlnYXRpb25BcnJheWBdOiBudW1iZXI7XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0xvd2VyY2FzZTxLPn1QYWdlTmF2aWdhdGlvbkFycmF5TWF4YF06IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE5hbWVkUGFnaW5hdGlvblNlcnZpY2VTaWduYWxzPFxuICBFIGV4dGVuZHMgRW50aXR5LFxuICBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nXG4+ID0ge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBzZWxlY3RlZFBhZ2Uke0NhcGl0YWxpemU8Sz59RW50aXRpZXNgXTogU2lnbmFsPEVbXT47XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0xvd2VyY2FzZTxLPn1DdXJyZW50UGFnZWBdOiBTaWduYWw8bnVtYmVyPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYCR7TG93ZXJjYXNlPEs+fVBhZ2VTaXplYF06IFNpZ25hbDxudW1iZXI+O1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtMb3dlcmNhc2U8Sz59VG90YWxDb3VudGBdOiBTaWduYWw8bnVtYmVyPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYCR7TG93ZXJjYXNlPEs+fVBhZ2VDb3VudGBdOiBTaWduYWw8bnVtYmVyPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYCR7TG93ZXJjYXNlPEs+fVBhZ2VOYXZpZ2F0aW9uQXJyYXlgXTogU2lnbmFsPFBhZ2VbXT47XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0xvd2VyY2FzZTxLPn1QYWdlTmF2aWdhdGlvbkFycmF5TWF4YF06IFNpZ25hbDxudW1iZXI+O1xufTtcblxuZXhwb3J0IHR5cGUgUGFnaW5hdGlvblNlcnZpY2VTdGF0ZTxFIGV4dGVuZHMgRW50aXR5PiA9IHtcbiAgc2VsZWN0ZWRQYWdlRW50aXRpZXM6IEFycmF5PEU+O1xuICBjdXJyZW50UGFnZTogbnVtYmVyO1xuICBwYWdlU2l6ZTogbnVtYmVyO1xuICB0b3RhbENvdW50OiBudW1iZXI7XG4gIHBhZ2VDb3VudDogbnVtYmVyO1xuICBwYWdlTmF2aWdhdGlvbkFycmF5OiBQYWdlW107XG4gIHBhZ2VOYXZpZ2F0aW9uQXJyYXlNYXg6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFBhZ2luYXRpb25TZXJ2aWNlU2lnbmFsczxFIGV4dGVuZHMgRW50aXR5PiA9IHtcbiAgc2VsZWN0ZWRQYWdlRW50aXRpZXM6IFNpZ25hbDxFW10+O1xuICBjdXJyZW50UGFnZTogU2lnbmFsPG51bWJlcj47XG4gIHBhZ2VTaXplOiBTaWduYWw8bnVtYmVyPjtcbiAgdG90YWxDb3VudDogU2lnbmFsPG51bWJlcj47XG4gIHBhZ2VDb3VudDogU2lnbmFsPG51bWJlcj47XG4gIHBhZ2VOYXZpZ2F0aW9uQXJyYXk6IFNpZ25hbDxQYWdlW10+O1xuICBwYWdlTmF2aWdhdGlvbkFycmF5TWF4OiBTaWduYWw8bnVtYmVyPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNldFBhZ2luYXRpb25TdGF0ZTxcbiAgRSBleHRlbmRzIEVudGl0eSxcbiAgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZFxuPiA9IENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmdcbiAgPyBOYW1lZFBhZ2luYXRpb25TZXJ2aWNlU3RhdGU8RSwgQ29sbGVjdGlvbj5cbiAgOiBQYWdpbmF0aW9uU2VydmljZVN0YXRlPEU+O1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBhZ2luYXRpb248XG4gIEUgZXh0ZW5kcyBFbnRpdHksXG4gIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmdcbj4ob3B0aW9uczoge1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xufSk6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAge1xuICAgIHN0YXRlOiBFbXRweTtcbiAgICBzaWduYWxzOiBOYW1lZEVudGl0eVNpZ25hbHM8RSwgQ29sbGVjdGlvbj47XG4gICAgbWV0aG9kczogRW10cHk7XG4gIH0sXG4gIHtcbiAgICBzdGF0ZTogTmFtZWRQYWdpbmF0aW9uU2VydmljZVN0YXRlPEUsIENvbGxlY3Rpb24+O1xuICAgIHNpZ25hbHM6IE5hbWVkUGFnaW5hdGlvblNlcnZpY2VTaWduYWxzPEUsIENvbGxlY3Rpb24+O1xuICAgIG1ldGhvZHM6IEVtdHB5O1xuICB9XG4+O1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBhZ2luYXRpb248RSBleHRlbmRzIEVudGl0eT4oKTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICB7XG4gICAgc3RhdGU6IEVudGl0eVN0YXRlPEU+O1xuICAgIHNpZ25hbHM6IEVudGl0eVNpZ25hbHM8RT47XG4gICAgbWV0aG9kczogRW10cHk7XG4gIH0sXG4gIHtcbiAgICBzdGF0ZTogUGFnaW5hdGlvblNlcnZpY2VTdGF0ZTxFPjtcbiAgICBzaWduYWxzOiBQYWdpbmF0aW9uU2VydmljZVNpZ25hbHM8RT47XG4gICAgbWV0aG9kczogRW10cHk7XG4gIH1cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGFnaW5hdGlvbjxcbiAgRSBleHRlbmRzIEVudGl0eSxcbiAgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZ1xuPihvcHRpb25zPzogeyBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uIH0pOiBTaWduYWxTdG9yZUZlYXR1cmU8YW55LCBhbnk+IHtcbiAgY29uc3Qge1xuICAgIHBhZ2VLZXksXG4gICAgcGFnZVNpemVLZXksXG4gICAgZW50aXRpZXNLZXksXG4gICAgc2VsZWN0ZWRQYWdlRW50aXRpZXNLZXksXG4gICAgdG90YWxDb3VudEtleSxcbiAgICBwYWdlQ291bnRLZXksXG4gICAgcGFnZU5hdmlnYXRpb25BcnJheU1heEtleSxcbiAgICBwYWdlTmF2aWdhdGlvbkFycmF5S2V5LFxuICB9ID0gY3JlYXRlUGFnaW5hdGlvbktleXM8Q29sbGVjdGlvbj4ob3B0aW9ucyk7XG5cbiAgcmV0dXJuIHNpZ25hbFN0b3JlRmVhdHVyZShcbiAgICB3aXRoU3RhdGUoe1xuICAgICAgW3BhZ2VLZXldOiAxLFxuICAgICAgW3BhZ2VTaXplS2V5XTogMTAsXG4gICAgICBbcGFnZU5hdmlnYXRpb25BcnJheU1heEtleV06IDcsXG4gICAgfSksXG4gICAgd2l0aENvbXB1dGVkKChzdG9yZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIGNvbnN0IGVudGl0aWVzID0gc3RvcmVbZW50aXRpZXNLZXldIGFzIFNpZ25hbDxFW10+O1xuICAgICAgY29uc3QgcGFnZSA9IHN0b3JlW3BhZ2VLZXldIGFzIFNpZ25hbDxudW1iZXI+O1xuICAgICAgY29uc3QgcGFnZVNpemUgPSBzdG9yZVtwYWdlU2l6ZUtleV0gYXMgU2lnbmFsPG51bWJlcj47XG4gICAgICBjb25zdCBwYWdlTmF2aWdhdGlvbkFycmF5TWF4ID0gc3RvcmVbXG4gICAgICAgIHBhZ2VOYXZpZ2F0aW9uQXJyYXlNYXhLZXlcbiAgICAgIF0gYXMgU2lnbmFsPG51bWJlcj47XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIFRoZSBkZXJpdmVkIGVuaXRpdGVzIHdoaWNoIGFyZSBkaXNwbGF5ZWQgb24gdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgICBbc2VsZWN0ZWRQYWdlRW50aXRpZXNLZXldOiBjb21wdXRlZDxFW10+KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBwYWdlU2l6ZVZhbHVlID0gcGFnZVNpemUoKTtcbiAgICAgICAgICBjb25zdCBwYWdlVmFsdWUgPSBwYWdlKCk7XG5cbiAgICAgICAgICAvLyBJZiB0aGUgcGFnZSBpcyBncmVhdGVyIHRoYW4gdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xuICAgICAgICAgIC8vIHdlIHNob3VsZCByZXR1cm4gYW4gZW1wdHkgYXJyYXlcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYWdlVmFsdWUgPCAwIHx8XG4gICAgICAgICAgICBwYWdlU2l6ZVZhbHVlID09PSAwIHx8XG4gICAgICAgICAgICBwYWdlVmFsdWUgPiBNYXRoLmNlaWwoZW50aXRpZXMoKS5sZW5ndGggLyBwYWdlU2l6ZVZhbHVlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFtdIGFzIEVbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZW50aXRpZXMoKS5zbGljZShcbiAgICAgICAgICAgIChwYWdlVmFsdWUgLSAxKSAqIHBhZ2VTaXplVmFsdWUsXG4gICAgICAgICAgICBwYWdlVmFsdWUgKiBwYWdlU2l6ZVZhbHVlXG4gICAgICAgICAgKSBhcyBFW107XG4gICAgICAgIH0pLFxuICAgICAgICBbdG90YWxDb3VudEtleV06IGNvbXB1dGVkKCgpID0+IGVudGl0aWVzKCkubGVuZ3RoKSxcbiAgICAgICAgW3BhZ2VDb3VudEtleV06IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB0b3RhbENvdW50VmFsdWUgPSBlbnRpdGllcygpLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBwYWdlU2l6ZVZhbHVlID0gcGFnZVNpemUoKTtcblxuICAgICAgICAgIGlmICh0b3RhbENvdW50VmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwodG90YWxDb3VudFZhbHVlIC8gcGFnZVNpemVWYWx1ZSk7XG4gICAgICAgIH0pLFxuICAgICAgICBbcGFnZU5hdmlnYXRpb25BcnJheUtleV06IGNvbXB1dGVkKCgpID0+XG4gICAgICAgICAgY3JlYXRlUGFnZUFycmF5KFxuICAgICAgICAgICAgcGFnZSgpLFxuICAgICAgICAgICAgcGFnZVNpemUoKSxcbiAgICAgICAgICAgIGVudGl0aWVzKCkubGVuZ3RoLFxuICAgICAgICAgICAgcGFnZU5hdmlnYXRpb25BcnJheU1heCgpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ290b1BhZ2U8RSBleHRlbmRzIEVudGl0eSwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4oXG4gIHBhZ2U6IG51bWJlcixcbiAgb3B0aW9ucz86IHtcbiAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xuICB9XG4pOiBQYXJ0aWFsPFNldFBhZ2luYXRpb25TdGF0ZTxFLCBDb2xsZWN0aW9uPj4ge1xuICBjb25zdCB7IHBhZ2VLZXkgfSA9IGNyZWF0ZVBhZ2luYXRpb25LZXlzPENvbGxlY3Rpb24+KG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgW3BhZ2VLZXldOiBwYWdlLFxuICB9IGFzIFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFBhZ2VTaXplPEUgZXh0ZW5kcyBFbnRpdHksIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KFxuICBwYWdlU2l6ZTogbnVtYmVyLFxuICBvcHRpb25zPzoge1xuICAgIGNvbGxlY3Rpb246IENvbGxlY3Rpb247XG4gIH1cbik6IFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+PiB7XG4gIGNvbnN0IHsgcGFnZVNpemVLZXkgfSA9IGNyZWF0ZVBhZ2luYXRpb25LZXlzPENvbGxlY3Rpb24+KG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgW3BhZ2VTaXplS2V5XTogcGFnZVNpemUsXG4gIH0gYXMgUGFydGlhbDxTZXRQYWdpbmF0aW9uU3RhdGU8RSwgQ29sbGVjdGlvbj4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV4dFBhZ2U8XG4gIEUgZXh0ZW5kcyBFbnRpdHksXG4gIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmdcbj4ob3B0aW9ucz86IHtcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvbjtcbn0pOiBQYXJ0aWFsPFNldFBhZ2luYXRpb25TdGF0ZTxFLCBDb2xsZWN0aW9uPj4ge1xuICBjb25zdCB7IHBhZ2VLZXkgfSA9IGNyZWF0ZVBhZ2luYXRpb25LZXlzPENvbGxlY3Rpb24+KG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgW3BhZ2VLZXldOiAoY3VycmVudFBhZ2U6IG51bWJlcikgPT4gY3VycmVudFBhZ2UgKyAxLFxuICB9IGFzIFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXZpb3VzUGFnZTxcbiAgRSBleHRlbmRzIEVudGl0eSxcbiAgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZ1xuPihvcHRpb25zPzoge1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xufSk6IFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+PiB7XG4gIGNvbnN0IHsgcGFnZUtleSB9ID0gY3JlYXRlUGFnaW5hdGlvbktleXM8Q29sbGVjdGlvbj4ob3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICBbcGFnZUtleV06IChjdXJyZW50UGFnZTogbnVtYmVyKSA9PiBNYXRoLm1heChjdXJyZW50UGFnZSAtIDEsIDEpLFxuICB9IGFzIFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0UGFnZTxcbiAgRSBleHRlbmRzIEVudGl0eSxcbiAgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZ1xuPihvcHRpb25zPzoge1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xufSk6IFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+PiB7XG4gIGNvbnN0IHsgcGFnZUtleSB9ID0gY3JlYXRlUGFnaW5hdGlvbktleXM8Q29sbGVjdGlvbj4ob3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICBbcGFnZUtleV06IDEsXG4gIH0gYXMgUGFydGlhbDxTZXRQYWdpbmF0aW9uU3RhdGU8RSwgQ29sbGVjdGlvbj4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TWF4UGFnZU5hdmlnYXRpb25BcnJheUl0ZW1zPFxuICBFIGV4dGVuZHMgRW50aXR5LFxuICBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nXG4+KFxuICBtYXhQYWdlTmF2aWdhdGlvbkFycmF5SXRlbXM6IG51bWJlcixcbiAgb3B0aW9ucz86IHtcbiAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xuICB9XG4pOiBQYXJ0aWFsPFNldFBhZ2luYXRpb25TdGF0ZTxFLCBDb2xsZWN0aW9uPj4ge1xuICBjb25zdCB7IHBhZ2VOYXZpZ2F0aW9uQXJyYXlNYXhLZXkgfSA9XG4gICAgY3JlYXRlUGFnaW5hdGlvbktleXM8Q29sbGVjdGlvbj4ob3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICBbcGFnZU5hdmlnYXRpb25BcnJheU1heEtleV06IG1heFBhZ2VOYXZpZ2F0aW9uQXJyYXlJdGVtcyxcbiAgfSBhcyBQYXJ0aWFsPFNldFBhZ2luYXRpb25TdGF0ZTxFLCBDb2xsZWN0aW9uPj47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhZ2luYXRpb25LZXlzPENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KFxuICBvcHRpb25zOiB7IGNvbGxlY3Rpb246IENvbGxlY3Rpb24gfSB8IHVuZGVmaW5lZFxuKSB7XG4gIGNvbnN0IGVudGl0aWVzS2V5ID0gb3B0aW9ucz8uY29sbGVjdGlvblxuICAgID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUVudGl0aWVzYFxuICAgIDogJ2VudGl0aWVzJztcbiAgY29uc3Qgc2VsZWN0ZWRQYWdlRW50aXRpZXNLZXkgPSBvcHRpb25zPy5jb2xsZWN0aW9uXG4gICAgPyBgc2VsZWN0ZWRQYWdlJHtjYXBpdGFsaXplKG9wdGlvbnM/LmNvbGxlY3Rpb24pfUVudGl0aWVzYFxuICAgIDogJ3NlbGVjdGVkUGFnZUVudGl0aWVzJztcbiAgY29uc3QgcGFnZUtleSA9IG9wdGlvbnM/LmNvbGxlY3Rpb24gPyBgJHtvcHRpb25zLmNvbGxlY3Rpb259Q3VycmVudFBhZ2VgIDogJ2N1cnJlbnRQYWdlJztcbiAgY29uc3QgcGFnZVNpemVLZXkgPSBvcHRpb25zPy5jb2xsZWN0aW9uXG4gICAgPyBgJHtvcHRpb25zLmNvbGxlY3Rpb259UGFnZVNpemVgXG4gICAgOiAncGFnZVNpemUnO1xuICBjb25zdCB0b3RhbENvdW50S2V5ID0gb3B0aW9ucz8uY29sbGVjdGlvblxuICAgID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufVRvdGFsQ291bnRgXG4gICAgOiAndG90YWxDb3VudCc7XG4gIGNvbnN0IHBhZ2VDb3VudEtleSA9IG9wdGlvbnM/LmNvbGxlY3Rpb25cbiAgICA/IGAke29wdGlvbnMuY29sbGVjdGlvbn1QYWdlQ291bnRgXG4gICAgOiAncGFnZUNvdW50JztcbiAgY29uc3QgcGFnZU5hdmlnYXRpb25BcnJheU1heEtleSA9IG9wdGlvbnM/LmNvbGxlY3Rpb25cbiAgICA/IGAke29wdGlvbnMuY29sbGVjdGlvbn1QYWdlTmF2aWdhdGlvbkFycmF5TWF4YFxuICAgIDogJ3BhZ2VOYXZpZ2F0aW9uQXJyYXlNYXgnO1xuICBjb25zdCBwYWdlTmF2aWdhdGlvbkFycmF5S2V5ID0gb3B0aW9ucz8uY29sbGVjdGlvblxuICAgID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufVBhZ2VOYXZpZ2F0aW9uQXJyYXlgXG4gICAgOiAncGFnZU5hdmlnYXRpb25BcnJheSc7XG4gIHJldHVybiB7XG4gICAgcGFnZUtleSxcbiAgICBwYWdlU2l6ZUtleSxcbiAgICBlbnRpdGllc0tleSxcbiAgICBzZWxlY3RlZFBhZ2VFbnRpdGllc0tleSxcbiAgICB0b3RhbENvdW50S2V5LFxuICAgIHBhZ2VDb3VudEtleSxcbiAgICBwYWdlTmF2aWdhdGlvbkFycmF5S2V5LFxuICAgIHBhZ2VOYXZpZ2F0aW9uQXJyYXlNYXhLZXksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYWdlQXJyYXkoXG4gIGN1cnJlbnRQYWdlOiBudW1iZXIsXG4gIGl0ZW1zUGVyUGFnZTogbnVtYmVyLFxuICB0b3RhbEl0ZW1zOiBudW1iZXIsXG4gIHBhZ2luYXRpb25SYW5nZTogbnVtYmVyXG4pOiBQYWdlW10ge1xuICAvLyBDb252ZXJ0IHBhZ2luYXRpb25SYW5nZSB0byBudW1iZXIgaW4gY2FzZSBpdCdzIGEgc3RyaW5nXG4gIHBhZ2luYXRpb25SYW5nZSA9ICtwYWdpbmF0aW9uUmFuZ2U7XG5cbiAgLy8gQ2FsY3VsYXRlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xuICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5tYXgoTWF0aC5jZWlsKHRvdGFsSXRlbXMgLyBpdGVtc1BlclBhZ2UpLCAxKTtcbiAgY29uc3QgaGFsZldheSA9IE1hdGguY2VpbChwYWdpbmF0aW9uUmFuZ2UgLyAyKTtcblxuICBjb25zdCBpc1N0YXJ0ID0gY3VycmVudFBhZ2UgPD0gaGFsZldheTtcbiAgY29uc3QgaXNFbmQgPSB0b3RhbFBhZ2VzIC0gaGFsZldheSA8IGN1cnJlbnRQYWdlO1xuICBjb25zdCBpc01pZGRsZSA9ICFpc1N0YXJ0ICYmICFpc0VuZDtcblxuICBjb25zdCBlbGxpcHNlc05lZWRlZCA9IHBhZ2luYXRpb25SYW5nZSA8IHRvdGFsUGFnZXM7XG4gIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMTsgaSA8PSB0b3RhbFBhZ2VzICYmIGkgPD0gcGFnaW5hdGlvblJhbmdlOyBpKyspIHtcbiAgICBsZXQgcGFnZU51bWJlciA9IGk7XG5cbiAgICBpZiAoaSA9PT0gcGFnaW5hdGlvblJhbmdlKSB7XG4gICAgICBwYWdlTnVtYmVyID0gdG90YWxQYWdlcztcbiAgICB9IGVsc2UgaWYgKGVsbGlwc2VzTmVlZGVkKSB7XG4gICAgICBpZiAoaXNFbmQpIHtcbiAgICAgICAgcGFnZU51bWJlciA9IHRvdGFsUGFnZXMgLSBwYWdpbmF0aW9uUmFuZ2UgKyBpO1xuICAgICAgfSBlbHNlIGlmIChpc01pZGRsZSkge1xuICAgICAgICBwYWdlTnVtYmVyID0gY3VycmVudFBhZ2UgLSBoYWxmV2F5ICsgaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvcGVuaW5nRWxsaXBzZXNOZWVkZWQgPSBpID09PSAyICYmIChpc01pZGRsZSB8fCBpc0VuZCk7XG4gICAgY29uc3QgY2xvc2luZ0VsbGlwc2VzTmVlZGVkID1cbiAgICAgIGkgPT09IHBhZ2luYXRpb25SYW5nZSAtIDEgJiYgKGlzTWlkZGxlIHx8IGlzU3RhcnQpO1xuXG4gICAgY29uc3QgbGFiZWwgPVxuICAgICAgZWxsaXBzZXNOZWVkZWQgJiYgKG9wZW5pbmdFbGxpcHNlc05lZWRlZCB8fCBjbG9zaW5nRWxsaXBzZXNOZWVkZWQpXG4gICAgICAgID8gJy4uLidcbiAgICAgICAgOiBwYWdlTnVtYmVyO1xuXG4gICAgcGFnZXMucHVzaCh7IGxhYmVsLCB2YWx1ZTogcGFnZU51bWJlciB9KTtcbiAgfVxuXG4gIHJldHVybiBwYWdlcztcbn1cbiJdfQ==
@@ -663,9 +663,158 @@ function reduxMethod(generator, resultMethodOrConfig, config) {
663
663
  return rxMethod(generator, resultMethodOrConfig);
664
664
  }
665
665
 
666
+ /** With pagination comes in two flavors the first one is local pagination or in memory pagination. For example we have 2000 items which we want
667
+ * to display in a table and the response payload is small enough to be stored in the memory. But we can not display all 2000 items at once
668
+ * so we need to paginate the data. The second flavor is server side pagination where the response payload is too large to be stored in the memory
669
+ * and we need to fetch the data from the server in chunks. In the second case we 'could' also cache the data in the memory but that could lead to
670
+ * other problems like memory leaks and stale data. So we will not cache the data in the memory in the second case.
671
+ * This feature implements the local pagination.
672
+ */
673
+ function withPagination(options) {
674
+ const { pageKey, pageSizeKey, entitiesKey, selectedPageEntitiesKey, totalCountKey, pageCountKey, pageNavigationArrayMaxKey, pageNavigationArrayKey, } = createPaginationKeys(options);
675
+ return signalStoreFeature(withState({
676
+ [pageKey]: 1,
677
+ [pageSizeKey]: 10,
678
+ [pageNavigationArrayMaxKey]: 7,
679
+ }), withComputed((store) => {
680
+ const entities = store[entitiesKey];
681
+ const page = store[pageKey];
682
+ const pageSize = store[pageSizeKey];
683
+ const pageNavigationArrayMax = store[pageNavigationArrayMaxKey];
684
+ return {
685
+ // The derived enitites which are displayed on the current page
686
+ [selectedPageEntitiesKey]: computed(() => {
687
+ const pageSizeValue = pageSize();
688
+ const pageValue = page();
689
+ // If the page is greater than the total number of pages
690
+ // we should return an empty array
691
+ if (pageValue < 0 ||
692
+ pageSizeValue === 0 ||
693
+ pageValue > Math.ceil(entities().length / pageSizeValue)) {
694
+ return [];
695
+ }
696
+ return entities().slice((pageValue - 1) * pageSizeValue, pageValue * pageSizeValue);
697
+ }),
698
+ [totalCountKey]: computed(() => entities().length),
699
+ [pageCountKey]: computed(() => {
700
+ const totalCountValue = entities().length;
701
+ const pageSizeValue = pageSize();
702
+ if (totalCountValue === 0) {
703
+ return 0;
704
+ }
705
+ return Math.ceil(totalCountValue / pageSizeValue);
706
+ }),
707
+ [pageNavigationArrayKey]: computed(() => createPageArray(page(), pageSize(), entities().length, pageNavigationArrayMax())),
708
+ };
709
+ }));
710
+ }
711
+ function gotoPage(page, options) {
712
+ const { pageKey } = createPaginationKeys(options);
713
+ return {
714
+ [pageKey]: page,
715
+ };
716
+ }
717
+ function setPageSize(pageSize, options) {
718
+ const { pageSizeKey } = createPaginationKeys(options);
719
+ return {
720
+ [pageSizeKey]: pageSize,
721
+ };
722
+ }
723
+ function nextPage(options) {
724
+ const { pageKey } = createPaginationKeys(options);
725
+ return {
726
+ [pageKey]: (currentPage) => currentPage + 1,
727
+ };
728
+ }
729
+ function previousPage(options) {
730
+ const { pageKey } = createPaginationKeys(options);
731
+ return {
732
+ [pageKey]: (currentPage) => Math.max(currentPage - 1, 1),
733
+ };
734
+ }
735
+ function firstPage(options) {
736
+ const { pageKey } = createPaginationKeys(options);
737
+ return {
738
+ [pageKey]: 1,
739
+ };
740
+ }
741
+ function setMaxPageNavigationArrayItems(maxPageNavigationArrayItems, options) {
742
+ const { pageNavigationArrayMaxKey } = createPaginationKeys(options);
743
+ return {
744
+ [pageNavigationArrayMaxKey]: maxPageNavigationArrayItems,
745
+ };
746
+ }
747
+ function createPaginationKeys(options) {
748
+ const entitiesKey = options?.collection
749
+ ? `${options.collection}Entities`
750
+ : 'entities';
751
+ const selectedPageEntitiesKey = options?.collection
752
+ ? `selectedPage${capitalize$1(options?.collection)}Entities`
753
+ : 'selectedPageEntities';
754
+ const pageKey = options?.collection ? `${options.collection}CurrentPage` : 'currentPage';
755
+ const pageSizeKey = options?.collection
756
+ ? `${options.collection}PageSize`
757
+ : 'pageSize';
758
+ const totalCountKey = options?.collection
759
+ ? `${options.collection}TotalCount`
760
+ : 'totalCount';
761
+ const pageCountKey = options?.collection
762
+ ? `${options.collection}PageCount`
763
+ : 'pageCount';
764
+ const pageNavigationArrayMaxKey = options?.collection
765
+ ? `${options.collection}PageNavigationArrayMax`
766
+ : 'pageNavigationArrayMax';
767
+ const pageNavigationArrayKey = options?.collection
768
+ ? `${options.collection}PageNavigationArray`
769
+ : 'pageNavigationArray';
770
+ return {
771
+ pageKey,
772
+ pageSizeKey,
773
+ entitiesKey,
774
+ selectedPageEntitiesKey,
775
+ totalCountKey,
776
+ pageCountKey,
777
+ pageNavigationArrayKey,
778
+ pageNavigationArrayMaxKey,
779
+ };
780
+ }
781
+ function createPageArray(currentPage, itemsPerPage, totalItems, paginationRange) {
782
+ // Convert paginationRange to number in case it's a string
783
+ paginationRange = +paginationRange;
784
+ // Calculate total number of pages
785
+ const totalPages = Math.max(Math.ceil(totalItems / itemsPerPage), 1);
786
+ const halfWay = Math.ceil(paginationRange / 2);
787
+ const isStart = currentPage <= halfWay;
788
+ const isEnd = totalPages - halfWay < currentPage;
789
+ const isMiddle = !isStart && !isEnd;
790
+ const ellipsesNeeded = paginationRange < totalPages;
791
+ const pages = [];
792
+ for (let i = 1; i <= totalPages && i <= paginationRange; i++) {
793
+ let pageNumber = i;
794
+ if (i === paginationRange) {
795
+ pageNumber = totalPages;
796
+ }
797
+ else if (ellipsesNeeded) {
798
+ if (isEnd) {
799
+ pageNumber = totalPages - paginationRange + i;
800
+ }
801
+ else if (isMiddle) {
802
+ pageNumber = currentPage - halfWay + i;
803
+ }
804
+ }
805
+ const openingEllipsesNeeded = i === 2 && (isMiddle || isEnd);
806
+ const closingEllipsesNeeded = i === paginationRange - 1 && (isMiddle || isStart);
807
+ const label = ellipsesNeeded && (openingEllipsesNeeded || closingEllipsesNeeded)
808
+ ? '...'
809
+ : pageNumber;
810
+ pages.push({ label, value: pageNumber });
811
+ }
812
+ return pages;
813
+ }
814
+
666
815
  /**
667
816
  * Generated bundle index. Do not edit.
668
817
  */
669
818
 
670
- export { capitalize$1 as capitalize, createReduxState, getCallStateKeys, getDataServiceKeys, getUndoRedoKeys, mapAction, noPayload, patchState, payload, reduxMethod, setError, setLoaded, setLoading, updateState, withActionMappers, withCallState, withDataService, withDevtools, withRedux, withStorageSync, withUndoRedo };
819
+ export { capitalize$1 as capitalize, createPageArray, createReduxState, firstPage, getCallStateKeys, getDataServiceKeys, getUndoRedoKeys, gotoPage, mapAction, nextPage, noPayload, patchState, payload, previousPage, reduxMethod, setError, setLoaded, setLoading, setMaxPageNavigationArrayItems, setPageSize, updateState, withActionMappers, withCallState, withDataService, withDevtools, withPagination, withRedux, withStorageSync, withUndoRedo };
671
820
  //# sourceMappingURL=angular-architects-ngrx-toolkit.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"angular-architects-ngrx-toolkit.mjs","sources":["../../../../libs/ngrx-toolkit/src/lib/with-devtools.ts","../../../../libs/ngrx-toolkit/src/lib/assertions/assertions.ts","../../../../libs/ngrx-toolkit/src/lib/with-redux.ts","../../../../libs/ngrx-toolkit/src/lib/with-call-state.ts","../../../../libs/ngrx-toolkit/src/lib/with-data-service.ts","../../../../libs/ngrx-toolkit/src/lib/with-undo-redo.ts","../../../../libs/ngrx-toolkit/src/lib/with-storage-sync.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/util.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/signal-redux-store.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/create-redux.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/rxjs-interop/redux-method.ts","../../../../libs/ngrx-toolkit/src/angular-architects-ngrx-toolkit.ts"],"sourcesContent":["import {\n patchState as originalPatchState,\n SignalStoreFeature,\n} from '@ngrx/signals';\nimport { SignalStoreFeatureResult } from '@ngrx/signals/src/signal-store-models';\nimport { effect, inject, PLATFORM_ID, signal, Signal } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\n\ndeclare global {\n interface Window {\n __REDUX_DEVTOOLS_EXTENSION__:\n | {\n connect: (options: { name: string }) => {\n send: (action: Action, state: Record<string, unknown>) => void;\n };\n }\n | undefined;\n }\n}\n\ntype EmptyFeatureResult = { state: {}; signals: {}; methods: {} };\nexport type Action = { type: string };\n\nconst storeRegistry = signal<Record<string, Signal<unknown>>>({});\n\nlet currentActionNames = new Set<string>();\n\nlet synchronizationInitialized = false;\n\nfunction initSynchronization() {\n effect(() => {\n if (!connection) {\n return;\n }\n\n const stores = storeRegistry();\n const rootState: Record<string, unknown> = {};\n for (const name in stores) {\n const store = stores[name];\n rootState[name] = store();\n }\n\n const names = Array.from(currentActionNames);\n const type = names.length ? names.join(', ') : 'Store Update';\n currentActionNames = new Set<string>();\n\n connection.send({ type }, rootState);\n });\n}\n\nfunction getValueFromSymbol(obj: unknown, symbol: symbol) {\n if (typeof obj === 'object' && obj && symbol in obj) {\n return (obj as { [key: symbol]: any })[symbol];\n }\n}\n\nfunction getStoreSignal(store: unknown): Signal<unknown> {\n const [signalStateKey] = Object.getOwnPropertySymbols(store);\n if (!signalStateKey) {\n throw new Error('Cannot find State Signal');\n }\n\n return getValueFromSymbol(store, signalStateKey);\n}\n\ntype ConnectResponse = {\n send: (action: Action, state: Record<string, unknown>) => void;\n};\nlet connection: ConnectResponse | undefined;\n\n/**\n * required for testing. is not exported during build\n */\nexport function reset() {\n connection = undefined;\n synchronizationInitialized = false;\n storeRegistry.set({});\n}\n\n/**\n * @param name store's name as it should appear in the DevTools\n */\nexport function withDevtools<Input extends SignalStoreFeatureResult>(\n name: string\n): SignalStoreFeature<Input, EmptyFeatureResult> {\n return (store) => {\n const isServer = isPlatformServer(inject(PLATFORM_ID));\n if (isServer) {\n return store;\n }\n\n const extensions = window.__REDUX_DEVTOOLS_EXTENSION__;\n if (!extensions) {\n return store;\n }\n\n if (!connection) {\n connection = extensions.connect({\n name: 'NgRx Signal Store',\n });\n }\n\n const storeSignal = getStoreSignal(store);\n storeRegistry.update((value) => ({\n ...value,\n [name]: storeSignal,\n }));\n\n if (!synchronizationInitialized) {\n initSynchronization();\n synchronizationInitialized = true;\n }\n\n return store;\n };\n}\n\ntype PatchFn = typeof originalPatchState extends (\n arg1: infer First,\n ...args: infer Rest\n) => infer Returner\n ? (state: First, action: string, ...rest: Rest) => Returner\n : never;\n\n/**\n * @deprecated Has been renamed to `updateState`\n */\nexport const patchState: PatchFn = (state, action, ...rest) => {\n updateState(state, action, ...rest);\n};\n\n/**\n * Wrapper of `patchState` for DevTools integration. Next to updating the state,\n * it also sends the action to the DevTools.\n * @param state state of Signal Store\n * @param action name of action how it will show in DevTools\n * @param updaters updater functions or objects\n */\nexport const updateState: PatchFn = (state, action, ...updaters) => {\n currentActionNames.add(action);\n return originalPatchState(state, ...updaters);\n};\n","import { ActionsFnSpecs } from '../with-redux';\n\nexport function assertActionFnSpecs(\n obj: unknown\n): asserts obj is ActionsFnSpecs {\n if (!obj || typeof obj !== 'object') {\n throw new Error('%o is not an Action Specification');\n }\n}\n","import { Observable, Subject } from 'rxjs';\nimport { SignalStoreFeature } from '@ngrx/signals';\nimport {\n EmptyFeatureResult,\n SignalStoreFeatureResult,\n} from '@ngrx/signals/src/signal-store-models';\nimport { StateSignal } from '@ngrx/signals/src/state-signal';\nimport { assertActionFnSpecs } from './assertions/assertions';\n\n/** Actions **/\n\ntype Payload = Record<string, unknown>;\n\ntype ActionFn<\n Type extends string = string,\n ActionPayload extends Payload = Payload,\n> = ((payload: ActionPayload) => ActionPayload & { type: Type }) & {\n type: Type;\n};\n\ntype ActionFns = Record<string, ActionFn>;\n\nexport type ActionsFnSpecs = Record<string, Payload>;\n\ntype ActionFnCreator<Spec extends ActionsFnSpecs> = {\n [ActionName in keyof Spec]: (Record<never, never> extends Spec[ActionName]\n ? () => Spec[ActionName] & { type: ActionName }\n : (\n payload: Spec[ActionName],\n ) => Spec[ActionName] & { type: ActionName }) & {\n type: ActionName & string;\n };\n};\n\ntype ActionFnPayload<Action> = Action extends (payload: infer Payload) => void\n ? Payload\n : never;\n\ntype ActionFnsCreator<Spec extends ActionsFnSpecs> = Spec extends {\n private: Record<string, Payload>;\n public: Record<string, Payload>;\n}\n ? ActionFnCreator<Spec['private']> & ActionFnCreator<Spec['public']>\n : ActionFnCreator<Spec>;\n\ntype PublicActionFns<Spec extends ActionsFnSpecs> = Spec extends {\n public: Record<string, Payload>;\n}\n ? ActionFnCreator<Spec['public']>\n : ActionFnCreator<Spec>;\n\nexport function payload<Type extends Payload>(): Type {\n return {} as Type;\n}\n\nexport const noPayload = {};\n\n/** Reducer **/\n\ntype ReducerFunction<ReducerAction, State> = (\n state: State,\n action: ActionFnPayload<ReducerAction>,\n) => void;\n\ntype ReducerFactory<StateActionFns extends ActionFns, State> = (\n actions: StateActionFns,\n on: <ReducerAction extends { type: string }>(\n action: ReducerAction,\n reducerFn: ReducerFunction<ReducerAction, State>,\n ) => void,\n) => void;\n\n/** Effect **/\n\ntype EffectsFactory<StateActionFns extends ActionFns> = (\n actions: StateActionFns,\n create: <EffectAction extends { type: string }>(\n action: EffectAction,\n ) => Observable<ActionFnPayload<EffectAction>>,\n) => Record<string, Observable<unknown>>;\n\n// internal types\n\n/**\n * Record which holds all effects for a specific action type.\n * The values are Subject which the effect are subscribed to.\n * `createActionFns` will call next on these subjects.\n */\ntype EffectsRegistry = Record<string, Subject<ActionFnPayload<unknown>>[]>;\n\nfunction createActionFns<Spec extends ActionsFnSpecs>(\n actionFnSpecs: Spec,\n reducerRegistry: Record<\n string,\n (state: unknown, payload: ActionFnPayload<unknown>) => void\n >,\n effectsRegistry: EffectsRegistry,\n state: unknown,\n) {\n const actionFns: Record<string, ActionFn> = {};\n\n for (const type in actionFnSpecs) {\n const actionFn = (payload: Payload) => {\n const fullPayload = { ...payload, type };\n const reducer = reducerRegistry[type];\n if (reducer) {\n (reducer as (state: unknown, payload: unknown) => void)(\n state,\n fullPayload as unknown,\n );\n }\n const effectSubjects = effectsRegistry[type];\n if (effectSubjects?.length) {\n for (const effectSubject of effectSubjects) {\n (effectSubject as unknown as Subject<unknown>).next(fullPayload);\n }\n }\n return fullPayload;\n };\n actionFn.type = type.toString();\n actionFns[type] = actionFn;\n }\n\n return actionFns;\n}\n\nfunction createPublicAndAllActionsFns<Spec extends ActionsFnSpecs>(\n actionFnSpecs: Spec,\n reducerRegistry: Record<\n string,\n (state: unknown, payload: ActionFnPayload<unknown>) => void\n >,\n effectsRegistry: EffectsRegistry,\n state: unknown,\n): { all: ActionFns; publics: ActionFns } {\n if ('public' in actionFnSpecs || 'private' in actionFnSpecs) {\n const privates = actionFnSpecs['private'] || {};\n const publics = actionFnSpecs['public'] || {};\n\n assertActionFnSpecs(privates);\n assertActionFnSpecs(publics);\n\n const privateActionFns = createActionFns(\n privates,\n reducerRegistry,\n effectsRegistry,\n state,\n );\n const publicActionFns = createActionFns(\n publics,\n reducerRegistry,\n effectsRegistry,\n state,\n );\n\n return {\n all: { ...privateActionFns, ...publicActionFns },\n publics: publicActionFns,\n };\n }\n\n const actionFns = createActionFns(\n actionFnSpecs,\n reducerRegistry,\n effectsRegistry,\n state,\n );\n\n return { all: actionFns, publics: actionFns };\n}\n\nfunction fillReducerRegistry(\n reducer: ReducerFactory<ActionFns, unknown>,\n actionFns: ActionFns,\n reducerRegistry: Record<\n string,\n (state: unknown, payload: ActionFnPayload<unknown>) => void\n >,\n) {\n function on(\n action: { type: string },\n reducerFn: (state: unknown, payload: ActionFnPayload<unknown>) => void,\n ) {\n reducerRegistry[action.type] = reducerFn;\n }\n\n reducer(actionFns, on);\n\n return reducerRegistry;\n}\n\nfunction fillEffects(\n effects: EffectsFactory<ActionFns>,\n actionFns: ActionFns,\n effectsRegistry: EffectsRegistry = {},\n): Observable<unknown>[] {\n function create(action: { type: string }) {\n const subject = new Subject<ActionFnPayload<unknown>>();\n if (!(action.type in effectsRegistry)) {\n effectsRegistry[action.type] = [];\n }\n effectsRegistry[action.type].push(subject);\n return subject.asObservable();\n }\n\n const effectObservables = effects(actionFns, create);\n return Object.values(effectObservables);\n}\n\nfunction startSubscriptions(observables: Observable<unknown>[]) {\n return observables.map((observable) => observable.subscribe());\n}\n\nfunction processRedux<Spec extends ActionsFnSpecs, ReturnType>(\n actionFnSpecs: Spec,\n reducer: ReducerFactory<ActionFns, unknown>,\n effects: EffectsFactory<ActionFns>,\n store: unknown,\n) {\n const reducerRegistry: Record<\n string,\n (state: unknown, payload: ActionFnPayload<unknown>) => void\n > = {};\n const effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>[]> =\n {};\n const actionsMap = createPublicAndAllActionsFns(\n actionFnSpecs,\n reducerRegistry,\n effectsRegistry,\n store,\n );\n const actionFns = actionsMap.all;\n const publicActionsFns = actionsMap.publics;\n\n fillReducerRegistry(reducer, actionFns, reducerRegistry);\n const effectObservables = fillEffects(effects, actionFns, effectsRegistry);\n const subscriptions = startSubscriptions(effectObservables);\n\n return {\n methods: publicActionsFns as ReturnType,\n subscriptions: subscriptions,\n };\n}\n\n/**\n * @param redux redux\n *\n * properties do not start with `with` since they are not extension functions on their own.\n *\n * no dependency to NgRx\n *\n * actions are passed to reducer and effects, but it is also possible to use other actions.\n * effects provide forAction and do not return anything. that is important because effects should stay inaccessible\n */\nexport function withRedux<\n Spec extends ActionsFnSpecs,\n Input extends SignalStoreFeatureResult,\n StateActionFns extends ActionFnsCreator<Spec> = ActionFnsCreator<Spec>,\n PublicStoreActionFns extends PublicActionFns<Spec> = PublicActionFns<Spec>,\n>(redux: {\n actions: Spec;\n reducer: ReducerFactory<StateActionFns, StateSignal<Input['state']>>;\n effects: EffectsFactory<StateActionFns>;\n}): SignalStoreFeature<\n Input,\n EmptyFeatureResult & { methods: PublicStoreActionFns }\n> {\n return (store) => {\n const { methods } = processRedux<Spec, PublicStoreActionFns>(\n redux.actions,\n redux.reducer as ReducerFactory<ActionFns, unknown>,\n redux.effects as EffectsFactory<ActionFns>,\n store,\n );\n return {\n ...store,\n methods,\n };\n };\n}\n","import { Signal, computed } from '@angular/core';\nimport {\n SignalStoreFeature,\n signalStoreFeature,\n withComputed,\n withState,\n} from '@ngrx/signals';\nimport { Emtpy } from './shared/empty';\n\nexport type CallState = 'init' | 'loading' | 'loaded' | { error: string };\n\nexport type CallStateSlice = {\n callState: CallState\n}\n\nexport type NamedCallStateSlice<Collection extends string> = {\n [K in keyof CallStateSlice as `${Collection}${Capitalize<K>}`]: CallStateSlice[K];\n}\n\nexport type CallStateSignals = {\n loading: Signal<boolean>;\n loaded: Signal<boolean>;\n error: Signal<string | null>\n}\n\nexport type NamedCallStateSignals<Prop extends string> = {\n [K in keyof CallStateSignals as `${Prop}${Capitalize<K>}`]: CallStateSignals[K];\n}\n\nexport type SetCallState<Prop extends string | undefined> = Prop extends string\n ? NamedCallStateSlice<Prop>\n : CallStateSlice;\n\nexport function getCallStateKeys(config?: { collection?: string }) {\n const prop = config?.collection;\n return {\n callStateKey: prop ? `${config.collection}CallState` : 'callState',\n loadingKey: prop ? `${config.collection}Loading` : 'loading',\n loadedKey: prop ? `${config.collection}Loaded` : 'loaded',\n errorKey: prop ? `${config.collection}Error` : 'error',\n };\n}\n\nexport function withCallState<Collection extends string>(config: {\n collection: Collection;\n}): SignalStoreFeature<\n { state: Emtpy, signals: Emtpy, methods: Emtpy },\n {\n state: NamedCallStateSlice<Collection>,\n signals: NamedCallStateSignals<Collection>,\n methods: Emtpy\n }\n>;\nexport function withCallState(): SignalStoreFeature<\n { state: Emtpy, signals: Emtpy, methods: Emtpy },\n {\n state: CallStateSlice,\n signals: CallStateSignals,\n methods: Emtpy\n }\n>;\nexport function withCallState<Collection extends string>(config?: {\n collection: Collection;\n}): SignalStoreFeature {\n const { callStateKey, errorKey, loadedKey, loadingKey } =\n getCallStateKeys(config);\n\n return signalStoreFeature(\n withState({ [callStateKey]: 'init' }),\n withComputed((state: Record<string, Signal<unknown>>) => {\n\n const callState = state[callStateKey] as Signal<CallState>;\n\n return {\n [loadingKey]: computed(() => callState() === 'loading'),\n [loadedKey]: computed(() => callState() === 'loaded'),\n [errorKey]: computed(() => {\n const v = callState();\n return typeof v === 'object' ? v.error : null;\n })\n }\n })\n );\n}\n\nexport function setLoading<Prop extends string | undefined = undefined>(\n prop?: Prop\n): SetCallState<Prop> {\n if (prop) {\n return { [`${prop}CallState`]: 'loading' } as SetCallState<Prop>;\n }\n\n return { callState: 'loading' } as SetCallState<Prop>;\n}\n\nexport function setLoaded<Prop extends string | undefined = undefined>(\n prop?: Prop\n): SetCallState<Prop> {\n\n if (prop) {\n return { [`${prop}CallState`]: 'loaded' } as SetCallState<Prop>;\n }\n else {\n return { callState: 'loaded' } as SetCallState<Prop>;\n }\n}\n\nexport function setError<Prop extends string | undefined = undefined>(\n error: unknown,\n prop?: Prop,\n ): SetCallState<Prop> {\n\n let errorMessage = '';\n\n if (!error) {\n errorMessage = '';\n }\n else if (typeof error === 'object' && 'message' in error) {\n errorMessage = String(error.message);\n }\n else {\n errorMessage = String(error);\n }\n \n\n if (prop) {\n return { [`${prop}CallState`]: { error: errorMessage } } as SetCallState<Prop>;\n }\n else {\n return { callState: { error: errorMessage } } as SetCallState<Prop>;\n }\n}\n","import { ProviderToken, Signal, computed, inject } from \"@angular/core\";\nimport { SignalStoreFeature, patchState, signalStoreFeature, withComputed, withMethods, withState } from \"@ngrx/signals\";\nimport { CallState, getCallStateKeys, setError, setLoaded, setLoading } from \"./with-call-state\";\nimport { setAllEntities, EntityId, addEntity, updateEntity, removeEntity } from \"@ngrx/signals/entities\";\nimport { EntityState, NamedEntitySignals } from \"@ngrx/signals/entities/src/models\";\nimport { StateSignal } from \"@ngrx/signals/src/state-signal\";\nimport { Emtpy } from \"./shared/empty\";\n\nexport type Filter = Record<string, unknown>;\nexport type Entity = { id: EntityId };\n\nexport interface DataService<E extends Entity, F extends Filter> {\n load(filter: F): Promise<E[]>;\n loadById(id: EntityId): Promise<E>;\n create(entity: E): Promise<E>;\n update(entity: E): Promise<E>;\n updateAll(entity: E[]): Promise<E[]>;\n delete(entity: E): Promise<void>;\n}\n\nexport function capitalize(str: string): string {\n return str ? str[0].toUpperCase() + str.substring(1) : str;\n}\n\nexport function getDataServiceKeys(options: { collection?: string }) {\n const filterKey = options.collection ? `${options.collection}Filter` : 'filter';\n const selectedIdsKey = options.collection ? `selected${capitalize(options.collection)}Ids` : 'selectedIds';\n const selectedEntitiesKey = options.collection ? `selected${capitalize(options.collection)}Entities` : 'selectedEntities';\n\n const updateFilterKey = options.collection ? `update${capitalize(options.collection)}Filter` : 'updateFilter';\n const updateSelectedKey = options.collection ? `updateSelected${capitalize(options.collection)}Entities` : 'updateSelected';\n const loadKey = options.collection ? `load${capitalize(options.collection)}Entities` : 'load';\n\n const currentKey = options.collection ? `current${capitalize(options.collection)}` : 'current';\n const loadByIdKey = options.collection ? `load${capitalize(options.collection)}ById` : 'loadById';\n const setCurrentKey = options.collection ? `setCurrent${capitalize(options.collection)}` : 'setCurrent';\n const createKey = options.collection ? `create${capitalize(options.collection)}` : 'create';\n const updateKey = options.collection ? `update${capitalize(options.collection)}` : 'update';\n const updateAllKey = options.collection ? `updateAll${capitalize(options.collection)}` : 'updateAll';\n const deleteKey = options.collection ? `delete${capitalize(options.collection)}` : 'delete';\n\n // TODO: Take these from @ngrx/signals/entities, when they are exported\n const entitiesKey = options.collection ? `${options.collection}Entities` : 'entities';\n const entityMapKey = options.collection ? `${options.collection}EntityMap` : 'entityMap';\n const idsKey = options.collection ? `${options.collection}Ids` : 'ids';\n\n return {\n filterKey,\n selectedIdsKey,\n selectedEntitiesKey,\n updateFilterKey,\n updateSelectedKey,\n loadKey,\n entitiesKey,\n entityMapKey,\n idsKey,\n\n currentKey,\n loadByIdKey,\n setCurrentKey,\n createKey,\n updateKey,\n updateAllKey,\n deleteKey\n };\n}\n\nexport type NamedDataServiceState<E extends Entity, F extends Filter, Collection extends string> =\n {\n [K in Collection as `${K}Filter`]: F;\n } & {\n [K in Collection as `selected${Capitalize<K>}Ids`]: Record<EntityId, boolean>;\n } & {\n [K in Collection as `current${Capitalize<K>}`]: E;\n }\n\nexport type DataServiceState<E extends Entity, F extends Filter> = {\n filter: F;\n selectedIds: Record<EntityId, boolean>;\n current: E;\n}\n\nexport type NamedDataServiceSignals<E extends Entity, Collection extends string> =\n {\n [K in Collection as `selected${Capitalize<K>}Entities`]: Signal<E[]>;\n }\n\nexport type DataServiceSignals<E extends Entity> =\n {\n selectedEntities: Signal<E[]>;\n }\n\nexport type NamedDataServiceMethods<E extends Entity, F extends Filter, Collection extends string> =\n {\n [K in Collection as `update${Capitalize<K>}Filter`]: (filter: F) => void;\n } &\n {\n [K in Collection as `updateSelected${Capitalize<K>}Entities`]: (id: EntityId, selected: boolean) => void;\n } &\n {\n [K in Collection as `load${Capitalize<K>}Entities`]: () => Promise<void>;\n } &\n\n {\n [K in Collection as `setCurrent${Capitalize<K>}`]: (entity: E) => void;\n } &\n {\n [K in Collection as `load${Capitalize<K>}ById`]: (id: EntityId) => Promise<void>;\n } &\n {\n [K in Collection as `create${Capitalize<K>}`]: (entity: E) => Promise<void>;\n } &\n {\n [K in Collection as `update${Capitalize<K>}`]: (entity: E) => Promise<void>;\n } &\n {\n [K in Collection as `updateAll${Capitalize<K>}`]: (entity: E[]) => Promise<void>;\n } &\n {\n [K in Collection as `delete${Capitalize<K>}`]: (entity: E) => Promise<void>;\n };\n\n\nexport type DataServiceMethods<E extends Entity, F extends Filter> =\n {\n updateFilter: (filter: F) => void;\n updateSelected: (id: EntityId, selected: boolean) => void;\n load: () => Promise<void>;\n\n setCurrent(entity: E): void;\n loadById(id: EntityId): Promise<void>;\n create(entity: E): Promise<void>;\n update(entity: E): Promise<void>;\n updateAll(entities: E[]): Promise<void>;\n delete(entity: E): Promise<void>;\n }\n\nexport type Empty = Record<string, never>\n\nexport function withDataService<E extends Entity, F extends Filter, Collection extends string>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F, collection: Collection }): SignalStoreFeature<\n {\n state: Emtpy,\n // These alternatives break type inference:\n // state: { callState: CallState } & NamedEntityState<E, Collection>,\n // state: NamedEntityState<E, Collection>,\n\n signals: NamedEntitySignals<E, Collection>,\n methods: Emtpy,\n },\n {\n state: NamedDataServiceState<E, F, Collection>\n signals: NamedDataServiceSignals<E, Collection>\n methods: NamedDataServiceMethods<E, F, Collection>\n }\n>;\nexport function withDataService<E extends Entity, F extends Filter>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F }): SignalStoreFeature<\n {\n state: { callState: CallState } & EntityState<E>\n signals: Emtpy,\n methods: Emtpy,\n },\n {\n state: DataServiceState<E, F>\n signals: DataServiceSignals<E>\n methods: DataServiceMethods<E, F>\n }>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withDataService<E extends Entity, F extends Filter, Collection extends string>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F, collection?: Collection }): SignalStoreFeature<any, any> {\n const { dataServiceType, filter, collection: prefix } = options;\n const {\n entitiesKey,\n filterKey,\n loadKey,\n selectedEntitiesKey,\n selectedIdsKey,\n updateFilterKey,\n updateSelectedKey,\n\n currentKey,\n createKey,\n updateKey,\n updateAllKey,\n deleteKey,\n loadByIdKey,\n setCurrentKey\n } = getDataServiceKeys(options);\n\n const { callStateKey } = getCallStateKeys({ collection: prefix });\n\n return signalStoreFeature(\n withState(() => ({\n [filterKey]: filter,\n [selectedIdsKey]: {} as Record<EntityId, boolean>,\n [currentKey]: undefined as E | undefined\n })),\n withComputed((store: Record<string, unknown>) => {\n const entities = store[entitiesKey] as Signal<E[]>;\n const selectedIds = store[selectedIdsKey] as Signal<Record<EntityId, boolean>>;\n\n return {\n [selectedEntitiesKey]: computed(() => entities().filter(e => selectedIds()[e.id]))\n }\n }),\n withMethods((store: Record<string, unknown> & StateSignal<object>) => {\n const dataService = inject(dataServiceType)\n return {\n [updateFilterKey]: (filter: F): void => {\n patchState(store, { [filterKey]: filter });\n },\n [updateSelectedKey]: (id: EntityId, selected: boolean): void => {\n patchState(store, (state: Record<string, unknown>) => ({\n [selectedIdsKey]: {\n ...state[selectedIdsKey] as Record<EntityId, boolean>,\n [id]: selected,\n }\n }));\n },\n [loadKey]: async (): Promise<void> => {\n const filter = store[filterKey] as Signal<F>;\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const result = await dataService.load(filter());\n patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [loadByIdKey]: async (id: EntityId): Promise<void> => {\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const current = await dataService.loadById(id);\n store[callStateKey] && patchState(store, setLoaded(prefix));\n patchState(store, { [currentKey]: current });\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [setCurrentKey]: (current: E): void => {\n patchState(store, { [currentKey]: current });\n },\n [createKey]: async (entity: E): Promise<void> => {\n patchState(store, { [currentKey]: entity });\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const created = await dataService.create(entity);\n patchState(store, { [currentKey]: created });\n patchState(store, prefix ? addEntity(created, { collection: prefix }) : addEntity(created));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [updateKey]: async (entity: E): Promise<void> => {\n patchState(store, { [currentKey]: entity });\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const updated = await dataService.update(entity);\n patchState(store, { [currentKey]: updated });\n // Why do we need this cast to Partial<Entity>?\n const updateArg = { id: updated.id, changes: updated as Partial<Entity> };\n patchState(store, prefix ? updateEntity(updateArg, { collection: prefix }) : updateEntity(updateArg));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [updateAllKey]: async (entities: E[]): Promise<void> => {\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const result = await dataService.updateAll(entities);\n patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [deleteKey]: async (entity: E): Promise<void> => {\n patchState(store, { [currentKey]: entity });\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n await dataService.delete(entity);\n patchState(store, { [currentKey]: undefined });\n patchState(store, prefix ? removeEntity(entity.id, { collection: prefix }) : removeEntity(entity.id));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n };\n })\n );\n}\n","import { SignalStoreFeature, patchState, signalStoreFeature, withComputed, withHooks, withMethods } from \"@ngrx/signals\";\nimport { EntityId, EntityMap, EntityState } from \"@ngrx/signals/entities\";\nimport { Signal, effect, signal, untracked, isSignal } from \"@angular/core\";\nimport { EntitySignals, NamedEntitySignals } from \"@ngrx/signals/entities/src/models\";\nimport { Entity, capitalize } from \"./with-data-service\";\nimport { Emtpy } from \"./shared/empty\";\n\nexport type StackItem = Record<string, unknown>;\n\nexport type NormalizedUndoRedoOptions = {\n maxStackSize: number;\n collections?: string[]\n}\n\nconst defaultOptions: NormalizedUndoRedoOptions = {\n maxStackSize: 100\n};\n\nexport type NamedUndoRedoState<Collection extends string> = {\n [K in Collection as `${K}EntityMap`]: EntityMap<Entity>;\n} & {\n [K in Collection as `${K}Ids`]: EntityId[];\n }\n\nexport type NamedUndoRedoSignals<Collection extends string> = {\n [K in Collection as `${K}Entities`]: Signal<Entity[]>\n}\n\nexport function getUndoRedoKeys(collections?: string[]): string[] {\n if (collections) {\n return collections.flatMap(c => [`${c}EntityMap`, `${c}Ids`, `selected${capitalize(c)}Ids`, `${c}Filter`])\n }\n return ['entityMap', 'ids', 'selectedIds', 'filter'];\n}\n\nexport function withUndoRedo<Collection extends string>(options?: { maxStackSize?: number; collections: Collection[] }): SignalStoreFeature<\n {\n state: Emtpy,\n // This alternative breaks type inference:\n // state: NamedEntityState<Entity, Collection>\n signals: NamedEntitySignals<Entity, Collection>,\n methods: Emtpy\n },\n {\n state: Emtpy,\n signals: {\n canUndo: Signal<boolean>,\n canRedo: Signal<boolean>\n },\n methods: {\n undo: () => void,\n redo: () => void\n }\n }>;\n\nexport function withUndoRedo(options?: { maxStackSize?: number }): SignalStoreFeature<\n {\n state: EntityState<Entity>,\n signals: EntitySignals<Entity>,\n methods: Emtpy\n },\n {\n state: Emtpy,\n signals: {\n canUndo: Signal<boolean>,\n canRedo: Signal<boolean>\n },\n methods: {\n undo: () => void,\n redo: () => void\n }\n }>;\n\nexport function withUndoRedo<Collection extends string>(options: {\n maxStackSize?: number;\n collections?: Collection[]\n} = {}): \n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nSignalStoreFeature<any, any> {\n let previous: StackItem | null = null;\n let skipOnce = false;\n\n const normalized = {\n ...defaultOptions,\n ...options\n };\n\n //\n // Design Decision: This feature has its own\n // internal state.\n //\n\n const undoStack: StackItem[] = [];\n const redoStack: StackItem[] = [];\n\n const canUndo = signal(false);\n const canRedo = signal(false);\n\n const updateInternal = () => {\n canUndo.set(undoStack.length !== 0);\n canRedo.set(redoStack.length !== 0);\n };\n\n const keys = getUndoRedoKeys(normalized?.collections);\n\n return signalStoreFeature(\n\n withComputed(() => ({\n canUndo: canUndo.asReadonly(),\n canRedo: canRedo.asReadonly()\n })),\n withMethods((store) => ({\n undo(): void {\n const item = undoStack.pop();\n\n if (item && previous) {\n redoStack.push(previous);\n }\n\n if (item) {\n skipOnce = true;\n patchState(store, item);\n previous = item;\n }\n\n updateInternal();\n },\n redo(): void {\n const item = redoStack.pop();\n\n if (item && previous) {\n undoStack.push(previous);\n }\n\n if (item) {\n skipOnce = true;\n patchState(store, item);\n previous = item;\n }\n\n updateInternal();\n }\n })),\n withHooks({\n onInit(store: Record<string, unknown>) {\n effect(() => {\n\n const cand = keys.reduce((acc, key) => {\n const s = store[key];\n if (s && isSignal(s)) {\n return {\n ...acc,\n [key]: s()\n }\n }\n return acc;\n }, {});\n\n if (skipOnce) {\n skipOnce = false;\n return;\n }\n\n // Clear redoStack after recorded action\n redoStack.splice(0);\n\n if (previous) {\n undoStack.push(previous);\n }\n\n if (redoStack.length > normalized.maxStackSize) {\n undoStack.unshift();\n }\n\n previous = cand;\n\n // Don't propogate current reactive context\n untracked(() => updateInternal());\n })\n }\n })\n\n )\n}\n","import { isPlatformServer } from '@angular/common';\nimport { PLATFORM_ID, effect, inject } from '@angular/core';\nimport {\n SignalStoreFeature,\n getState,\n patchState,\n signalStoreFeature,\n withHooks,\n withMethods,\n} from '@ngrx/signals';\nimport { Emtpy } from './shared/empty';\n\ntype SignalStoreFeatureInput<State> = Pick<\n Parameters<SignalStoreFeature>[0],\n 'signals' | 'methods'\n> & {\n state: State;\n};\n\nconst NOOP = () => {};\n\ntype WithStorageSyncFeatureResult = {\n state: Emtpy;\n signals: Emtpy;\n methods: {\n clearStorage(): void;\n readFromStorage(): void;\n writeToStorage(): void;\n };\n};\n\nconst StorageSyncStub: Pick<\n WithStorageSyncFeatureResult,\n 'methods'\n>['methods'] = {\n clearStorage: NOOP,\n readFromStorage: NOOP,\n writeToStorage: NOOP,\n};\n\nexport type SyncConfig<State> = {\n /**\n * The key which is used to access the storage.\n */\n key: string;\n /**\n * Flag indicating if the store should read from storage on init and write to storage on every state change.\n *\n * `true` by default\n */\n autoSync?: boolean;\n /**\n * Function to select that portion of the state which should be stored.\n *\n * Returns the whole state object by default\n */\n select?: (state: State) => Partial<State>;\n /**\n * Function used to parse the state coming from storage.\n *\n * `JSON.parse()` by default\n */\n parse?: (stateString: string) => State;\n /**\n * Function used to tranform the state into a string representation.\n *\n * `JSON.stringify()` by default\n */\n stringify?: (state: State) => string;\n /**\n * Factory function used to select the storage.\n *\n * `localstorage` by default\n */\n storage?: () => Storage;\n};\n\n/**\n * Enables store synchronization with storage.\n *\n * Only works on browser platform.\n */\nexport function withStorageSync<\n State extends object,\n Input extends SignalStoreFeatureInput<State>\n>(key: string): SignalStoreFeature<Input, WithStorageSyncFeatureResult>;\nexport function withStorageSync<\n State extends object,\n Input extends SignalStoreFeatureInput<State>\n>(\n config: SyncConfig<Input['state']>\n): SignalStoreFeature<Input, WithStorageSyncFeatureResult>;\nexport function withStorageSync<\n State extends object,\n Input extends SignalStoreFeatureInput<State>\n>(\n configOrKey: SyncConfig<Input['state']> | string\n): SignalStoreFeature<Input, WithStorageSyncFeatureResult> {\n const {\n key,\n autoSync = true,\n select = (state: State) => state,\n parse = JSON.parse,\n stringify = JSON.stringify,\n storage: storageFactory = () => localStorage,\n } = typeof configOrKey === 'string' ? { key: configOrKey } : configOrKey;\n\n return signalStoreFeature(\n withMethods((store, platformId = inject(PLATFORM_ID)) => {\n if (isPlatformServer(platformId)) {\n console.warn(\n `'withStorageSync' provides non-functional implementation due to server-side execution`\n );\n return StorageSyncStub;\n }\n\n const storage = storageFactory();\n\n return {\n /**\n * Removes the item stored in storage.\n */\n clearStorage(): void {\n storage.removeItem(key);\n },\n /**\n * Reads item from storage and patches the state.\n */\n readFromStorage(): void {\n const stateString = storage.getItem(key);\n if (stateString) {\n patchState(store, parse(stateString));\n }\n },\n /**\n * Writes selected portion to storage.\n */\n writeToStorage(): void {\n const slicedState = select(getState(store) as State);\n storage.setItem(key, stringify(slicedState));\n },\n };\n }),\n withHooks({\n onInit(store, platformId = inject(PLATFORM_ID)) {\n if (isPlatformServer(platformId)) {\n return;\n }\n\n if (autoSync) {\n store.readFromStorage();\n\n effect(() => {\n store.writeToStorage();\n });\n }\n },\n })\n );\n}\n","import { Action } from '@ngrx/store';\nimport { Unsubscribable } from 'rxjs';\n\n\nexport function isUnsubscribable<F extends (...args: unknown[]) => unknown>(\n fn: F | (F & Unsubscribable)\n): fn is F & Unsubscribable {\n return !!(fn as any as F & Unsubscribable)?.unsubscribe;\n}\n\nexport function capitalize(str: string): string {\n return str ? str[0].toUpperCase() + str.substring(1) : str;\n}\n\nexport function isActionCreator(action: any): action is Action {\n return (\n typeof action === 'function' &&\n action &&\n action.type &&\n typeof action.type === 'string'\n );\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { rxMethod } from \"@ngrx/signals/rxjs-interop\";\nimport { Action, ActionCreator } from \"@ngrx/store\";\nimport { pipe, tap } from \"rxjs\";\nimport { MapperTypes } from \"./model\";\nimport { isUnsubscribable } from \"./util\";\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SignalReduxStore {\n private mapperDict: Record<string, {\n storeMethod: (...args: unknown[]) => unknown,\n resultMethod?: (...args: unknown[]) => unknown,\n }> = {};\n\n dispatch = rxMethod<Action>(pipe(\n tap((action: Action) => {\n const callbacks = this.mapperDict[action.type];\n if (callbacks?.storeMethod) {\n if (\n isUnsubscribable(callbacks.storeMethod) &&\n callbacks.resultMethod\n ) {\n return callbacks.storeMethod(action, (a: Action) => {\n const resultAction = callbacks.resultMethod?.(a) as Action;\n this.dispatch(resultAction);\n });\n }\n\n return callbacks?.storeMethod(action);\n }\n\n return;\n })\n ));\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n connectFeatureStore(mappers: MapperTypes<ActionCreator<any, any>[]>[]): void {\n mappers.forEach(\n mapper => mapper.types.forEach(\n action => this.mapperDict[action] = {\n storeMethod: mapper.storeMethod,\n resultMethod: mapper.resultMethod\n }\n )\n );\n }\n}\n\nexport function injectReduxDispatch() {\n return inject(SignalReduxStore).dispatch;\n}\n","import { ENVIRONMENT_INITIALIZER, inject, makeEnvironmentProviders } from \"@angular/core\";\nimport { ActionCreator, ActionType } from \"@ngrx/store/src/models\";\nimport { CreateReduxState, ExtractActionTypes, MapperTypes, Store } from \"./model\";\nimport { SignalReduxStore, injectReduxDispatch } from \"./signal-redux-store\";\nimport { capitalize, isActionCreator } from \"./util\";\n\n\nexport function mapAction<\n Creators extends readonly ActionCreator[]\n>(\n ...args: [\n ...creators: Creators,\n storeMethod: (action: ActionType<Creators[number]>) => unknown\n ]\n): MapperTypes<Creators>;\nexport function mapAction<\n Creators extends readonly ActionCreator[],\n T\n>(\n ...args: [\n ...creators: Creators,\n storeMethod: (action: ActionType<Creators[number]>, resultMethod: (input: T) => unknown) => unknown,\n resultMethod: (input: T) => unknown\n ]\n): MapperTypes<Creators>;\nexport function mapAction<\n Creators extends readonly ActionCreator[]\n>(\n ...args: [\n ...creators: Creators,\n storeMethod: (action: ActionType<Creators[number]>) => unknown,\n resultMethod?: (input: unknown) => unknown\n ]\n): MapperTypes<Creators> {\n let resultMethod = args.pop() as unknown as ((input: unknown) => unknown ) | undefined;\n let storeMethod = args.pop() as unknown as (action: ActionType<Creators[number]>) => unknown;\n\n if (isActionCreator(storeMethod)) {\n args.push(storeMethod);\n storeMethod = resultMethod || storeMethod;\n resultMethod = undefined;\n }\n\n const types = (args as unknown as Creators).map(\n (creator) => creator.type\n ) as unknown as ExtractActionTypes<Creators>;\n\n return {\n types,\n storeMethod,\n resultMethod\n };\n}\n\nexport function withActionMappers(\n ...mappers: MapperTypes<ActionCreator<any, any>[]>[]\n): MapperTypes<ActionCreator<any, any>[]>[] {\n return mappers;\n}\n\nexport function createReduxState<\n StoreName extends string,\n STORE extends Store\n>(\n storeName: StoreName,\n signalStore: STORE,\n withActionMappers: (store: InstanceType<STORE>) => MapperTypes<ActionCreator<any, any>[]>[],\n): CreateReduxState<StoreName, STORE> {\n const isRootProvider = (signalStore as any)?.ɵprov?.providedIn === 'root';\n return {\n [`provide${capitalize(storeName)}Store`]: (connectReduxDevtools = false) => makeEnvironmentProviders([\n isRootProvider? [] : signalStore,\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (\n signalReduxStore = inject(SignalReduxStore),\n store = inject(signalStore)\n ) => () => {\n if (connectReduxDevtools) {\n // addStoreToReduxDevtools(store, storeName, false);\n }\n signalReduxStore.connectFeatureStore(\n withActionMappers(store)\n );\n }\n }\n ]),\n [`inject${capitalize(storeName)}Store`]: () => Object.assign(\n inject(signalStore),\n { dispatch: injectReduxDispatch() }\n )\n } as CreateReduxState<StoreName, STORE>;\n}\n","import { Injector, Signal, inject } from \"@angular/core\";\nimport { rxMethod } from \"@ngrx/signals/rxjs-interop\";\nimport { Observable, Unsubscribable, map, pipe } from \"rxjs\";\n\n\ntype RxMethodInput<Input> = Input | Observable<Input> | Signal<Input>;\n\ntype RxMethod<Input, MethodInput = Input, MethodResult = unknown> = ((\n input: RxMethodInput<Input>,\n resultMethod: (input: MethodInput) => MethodResult\n) => Unsubscribable) & Unsubscribable;\n\nexport function reduxMethod<Input, MethodInput = Input>(\n generator: (source$: Observable<Input>) => Observable<MethodInput>,\n config?: { injector?: Injector }\n): RxMethod<Input, MethodInput>;\nexport function reduxMethod<Input, MethodInput = Input, MethodResult = unknown>(\n generator: (source$: Observable<Input>) => Observable<MethodInput>,\n resultMethod: (input: MethodInput) => MethodResult,\n config?: {\n injector?: Injector\n }\n): RxMethod<Input, MethodInput, MethodResult>;\nexport function reduxMethod<Input, MethodInput = Input, MethodResult = unknown>(\n generator: (source$: Observable<Input>) => Observable<MethodInput>,\n resultMethodOrConfig?: ((input: MethodInput) => MethodResult) | {\n injector?: Injector\n },\n config?: {\n injector?: Injector\n }\n): RxMethod<Input, MethodInput, MethodResult> {\n const injector = inject(Injector);\n\n if (typeof resultMethodOrConfig === 'function') {\n let unsubscribable: Unsubscribable;\n const inputResultFn = ((\n input: RxMethodInput<Input>,\n resultMethod = resultMethodOrConfig\n ) => {\n\n const rxMethodWithResult = rxMethod<Input>(pipe(\n generator,\n map(resultMethod)\n ), {\n ...(config || {}),\n injector: config?.injector || injector\n });\n const rxWithInput = rxMethodWithResult(input);\n unsubscribable = { unsubscribe: rxWithInput.unsubscribe.bind(rxWithInput) };\n\n return rxWithInput;\n }) as RxMethod<Input, MethodInput, MethodResult>;\n\n inputResultFn.unsubscribe = () => unsubscribable?.unsubscribe();\n\n return inputResultFn;\n }\n\n return rxMethod<Input>(generator, resultMethodOrConfig);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["originalPatchState","capitalize","patchState"],"mappings":"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"}
1
+ {"version":3,"file":"angular-architects-ngrx-toolkit.mjs","sources":["../../../../libs/ngrx-toolkit/src/lib/with-devtools.ts","../../../../libs/ngrx-toolkit/src/lib/assertions/assertions.ts","../../../../libs/ngrx-toolkit/src/lib/with-redux.ts","../../../../libs/ngrx-toolkit/src/lib/with-call-state.ts","../../../../libs/ngrx-toolkit/src/lib/with-data-service.ts","../../../../libs/ngrx-toolkit/src/lib/with-undo-redo.ts","../../../../libs/ngrx-toolkit/src/lib/with-storage-sync.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/util.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/signal-redux-store.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/create-redux.ts","../../../../libs/ngrx-toolkit/src/lib/redux-connector/rxjs-interop/redux-method.ts","../../../../libs/ngrx-toolkit/src/lib/with-pagination.ts","../../../../libs/ngrx-toolkit/src/angular-architects-ngrx-toolkit.ts"],"sourcesContent":["import {\n patchState as originalPatchState,\n SignalStoreFeature,\n} from '@ngrx/signals';\nimport { SignalStoreFeatureResult } from '@ngrx/signals/src/signal-store-models';\nimport { effect, inject, PLATFORM_ID, signal, Signal } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\n\ndeclare global {\n interface Window {\n __REDUX_DEVTOOLS_EXTENSION__:\n | {\n connect: (options: { name: string }) => {\n send: (action: Action, state: Record<string, unknown>) => void;\n };\n }\n | undefined;\n }\n}\n\ntype EmptyFeatureResult = { state: {}; signals: {}; methods: {} };\nexport type Action = { type: string };\n\nconst storeRegistry = signal<Record<string, Signal<unknown>>>({});\n\nlet currentActionNames = new Set<string>();\n\nlet synchronizationInitialized = false;\n\nfunction initSynchronization() {\n effect(() => {\n if (!connection) {\n return;\n }\n\n const stores = storeRegistry();\n const rootState: Record<string, unknown> = {};\n for (const name in stores) {\n const store = stores[name];\n rootState[name] = store();\n }\n\n const names = Array.from(currentActionNames);\n const type = names.length ? names.join(', ') : 'Store Update';\n currentActionNames = new Set<string>();\n\n connection.send({ type }, rootState);\n });\n}\n\nfunction getValueFromSymbol(obj: unknown, symbol: symbol) {\n if (typeof obj === 'object' && obj && symbol in obj) {\n return (obj as { [key: symbol]: any })[symbol];\n }\n}\n\nfunction getStoreSignal(store: unknown): Signal<unknown> {\n const [signalStateKey] = Object.getOwnPropertySymbols(store);\n if (!signalStateKey) {\n throw new Error('Cannot find State Signal');\n }\n\n return getValueFromSymbol(store, signalStateKey);\n}\n\ntype ConnectResponse = {\n send: (action: Action, state: Record<string, unknown>) => void;\n};\nlet connection: ConnectResponse | undefined;\n\n/**\n * required for testing. is not exported during build\n */\nexport function reset() {\n connection = undefined;\n synchronizationInitialized = false;\n storeRegistry.set({});\n}\n\n/**\n * @param name store's name as it should appear in the DevTools\n */\nexport function withDevtools<Input extends SignalStoreFeatureResult>(\n name: string\n): SignalStoreFeature<Input, EmptyFeatureResult> {\n return (store) => {\n const isServer = isPlatformServer(inject(PLATFORM_ID));\n if (isServer) {\n return store;\n }\n\n const extensions = window.__REDUX_DEVTOOLS_EXTENSION__;\n if (!extensions) {\n return store;\n }\n\n if (!connection) {\n connection = extensions.connect({\n name: 'NgRx Signal Store',\n });\n }\n\n const storeSignal = getStoreSignal(store);\n storeRegistry.update((value) => ({\n ...value,\n [name]: storeSignal,\n }));\n\n if (!synchronizationInitialized) {\n initSynchronization();\n synchronizationInitialized = true;\n }\n\n return store;\n };\n}\n\ntype PatchFn = typeof originalPatchState extends (\n arg1: infer First,\n ...args: infer Rest\n) => infer Returner\n ? (state: First, action: string, ...rest: Rest) => Returner\n : never;\n\n/**\n * @deprecated Has been renamed to `updateState`\n */\nexport const patchState: PatchFn = (state, action, ...rest) => {\n updateState(state, action, ...rest);\n};\n\n/**\n * Wrapper of `patchState` for DevTools integration. Next to updating the state,\n * it also sends the action to the DevTools.\n * @param state state of Signal Store\n * @param action name of action how it will show in DevTools\n * @param updaters updater functions or objects\n */\nexport const updateState: PatchFn = (state, action, ...updaters) => {\n currentActionNames.add(action);\n return originalPatchState(state, ...updaters);\n};\n","import { ActionsFnSpecs } from '../with-redux';\n\nexport function assertActionFnSpecs(\n obj: unknown\n): asserts obj is ActionsFnSpecs {\n if (!obj || typeof obj !== 'object') {\n throw new Error('%o is not an Action Specification');\n }\n}\n","import { Observable, Subject } from 'rxjs';\nimport { SignalStoreFeature } from '@ngrx/signals';\nimport {\n EmptyFeatureResult,\n SignalStoreFeatureResult,\n} from '@ngrx/signals/src/signal-store-models';\nimport { StateSignal } from '@ngrx/signals/src/state-signal';\nimport { assertActionFnSpecs } from './assertions/assertions';\n\n/** Actions **/\n\ntype Payload = Record<string, unknown>;\n\ntype ActionFn<\n Type extends string = string,\n ActionPayload extends Payload = Payload,\n> = ((payload: ActionPayload) => ActionPayload & { type: Type }) & {\n type: Type;\n};\n\ntype ActionFns = Record<string, ActionFn>;\n\nexport type ActionsFnSpecs = Record<string, Payload>;\n\ntype ActionFnCreator<Spec extends ActionsFnSpecs> = {\n [ActionName in keyof Spec]: (Record<never, never> extends Spec[ActionName]\n ? () => Spec[ActionName] & { type: ActionName }\n : (\n payload: Spec[ActionName],\n ) => Spec[ActionName] & { type: ActionName }) & {\n type: ActionName & string;\n };\n};\n\ntype ActionFnPayload<Action> = Action extends (payload: infer Payload) => void\n ? Payload\n : never;\n\ntype ActionFnsCreator<Spec extends ActionsFnSpecs> = Spec extends {\n private: Record<string, Payload>;\n public: Record<string, Payload>;\n}\n ? ActionFnCreator<Spec['private']> & ActionFnCreator<Spec['public']>\n : ActionFnCreator<Spec>;\n\ntype PublicActionFns<Spec extends ActionsFnSpecs> = Spec extends {\n public: Record<string, Payload>;\n}\n ? ActionFnCreator<Spec['public']>\n : ActionFnCreator<Spec>;\n\nexport function payload<Type extends Payload>(): Type {\n return {} as Type;\n}\n\nexport const noPayload = {};\n\n/** Reducer **/\n\ntype ReducerFunction<ReducerAction, State> = (\n state: State,\n action: ActionFnPayload<ReducerAction>,\n) => void;\n\ntype ReducerFactory<StateActionFns extends ActionFns, State> = (\n actions: StateActionFns,\n on: <ReducerAction extends { type: string }>(\n action: ReducerAction,\n reducerFn: ReducerFunction<ReducerAction, State>,\n ) => void,\n) => void;\n\n/** Effect **/\n\ntype EffectsFactory<StateActionFns extends ActionFns> = (\n actions: StateActionFns,\n create: <EffectAction extends { type: string }>(\n action: EffectAction,\n ) => Observable<ActionFnPayload<EffectAction>>,\n) => Record<string, Observable<unknown>>;\n\n// internal types\n\n/**\n * Record which holds all effects for a specific action type.\n * The values are Subject which the effect are subscribed to.\n * `createActionFns` will call next on these subjects.\n */\ntype EffectsRegistry = Record<string, Subject<ActionFnPayload<unknown>>[]>;\n\nfunction createActionFns<Spec extends ActionsFnSpecs>(\n actionFnSpecs: Spec,\n reducerRegistry: Record<\n string,\n (state: unknown, payload: ActionFnPayload<unknown>) => void\n >,\n effectsRegistry: EffectsRegistry,\n state: unknown,\n) {\n const actionFns: Record<string, ActionFn> = {};\n\n for (const type in actionFnSpecs) {\n const actionFn = (payload: Payload) => {\n const fullPayload = { ...payload, type };\n const reducer = reducerRegistry[type];\n if (reducer) {\n (reducer as (state: unknown, payload: unknown) => void)(\n state,\n fullPayload as unknown,\n );\n }\n const effectSubjects = effectsRegistry[type];\n if (effectSubjects?.length) {\n for (const effectSubject of effectSubjects) {\n (effectSubject as unknown as Subject<unknown>).next(fullPayload);\n }\n }\n return fullPayload;\n };\n actionFn.type = type.toString();\n actionFns[type] = actionFn;\n }\n\n return actionFns;\n}\n\nfunction createPublicAndAllActionsFns<Spec extends ActionsFnSpecs>(\n actionFnSpecs: Spec,\n reducerRegistry: Record<\n string,\n (state: unknown, payload: ActionFnPayload<unknown>) => void\n >,\n effectsRegistry: EffectsRegistry,\n state: unknown,\n): { all: ActionFns; publics: ActionFns } {\n if ('public' in actionFnSpecs || 'private' in actionFnSpecs) {\n const privates = actionFnSpecs['private'] || {};\n const publics = actionFnSpecs['public'] || {};\n\n assertActionFnSpecs(privates);\n assertActionFnSpecs(publics);\n\n const privateActionFns = createActionFns(\n privates,\n reducerRegistry,\n effectsRegistry,\n state,\n );\n const publicActionFns = createActionFns(\n publics,\n reducerRegistry,\n effectsRegistry,\n state,\n );\n\n return {\n all: { ...privateActionFns, ...publicActionFns },\n publics: publicActionFns,\n };\n }\n\n const actionFns = createActionFns(\n actionFnSpecs,\n reducerRegistry,\n effectsRegistry,\n state,\n );\n\n return { all: actionFns, publics: actionFns };\n}\n\nfunction fillReducerRegistry(\n reducer: ReducerFactory<ActionFns, unknown>,\n actionFns: ActionFns,\n reducerRegistry: Record<\n string,\n (state: unknown, payload: ActionFnPayload<unknown>) => void\n >,\n) {\n function on(\n action: { type: string },\n reducerFn: (state: unknown, payload: ActionFnPayload<unknown>) => void,\n ) {\n reducerRegistry[action.type] = reducerFn;\n }\n\n reducer(actionFns, on);\n\n return reducerRegistry;\n}\n\nfunction fillEffects(\n effects: EffectsFactory<ActionFns>,\n actionFns: ActionFns,\n effectsRegistry: EffectsRegistry = {},\n): Observable<unknown>[] {\n function create(action: { type: string }) {\n const subject = new Subject<ActionFnPayload<unknown>>();\n if (!(action.type in effectsRegistry)) {\n effectsRegistry[action.type] = [];\n }\n effectsRegistry[action.type].push(subject);\n return subject.asObservable();\n }\n\n const effectObservables = effects(actionFns, create);\n return Object.values(effectObservables);\n}\n\nfunction startSubscriptions(observables: Observable<unknown>[]) {\n return observables.map((observable) => observable.subscribe());\n}\n\nfunction processRedux<Spec extends ActionsFnSpecs, ReturnType>(\n actionFnSpecs: Spec,\n reducer: ReducerFactory<ActionFns, unknown>,\n effects: EffectsFactory<ActionFns>,\n store: unknown,\n) {\n const reducerRegistry: Record<\n string,\n (state: unknown, payload: ActionFnPayload<unknown>) => void\n > = {};\n const effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>[]> =\n {};\n const actionsMap = createPublicAndAllActionsFns(\n actionFnSpecs,\n reducerRegistry,\n effectsRegistry,\n store,\n );\n const actionFns = actionsMap.all;\n const publicActionsFns = actionsMap.publics;\n\n fillReducerRegistry(reducer, actionFns, reducerRegistry);\n const effectObservables = fillEffects(effects, actionFns, effectsRegistry);\n const subscriptions = startSubscriptions(effectObservables);\n\n return {\n methods: publicActionsFns as ReturnType,\n subscriptions: subscriptions,\n };\n}\n\n/**\n * @param redux redux\n *\n * properties do not start with `with` since they are not extension functions on their own.\n *\n * no dependency to NgRx\n *\n * actions are passed to reducer and effects, but it is also possible to use other actions.\n * effects provide forAction and do not return anything. that is important because effects should stay inaccessible\n */\nexport function withRedux<\n Spec extends ActionsFnSpecs,\n Input extends SignalStoreFeatureResult,\n StateActionFns extends ActionFnsCreator<Spec> = ActionFnsCreator<Spec>,\n PublicStoreActionFns extends PublicActionFns<Spec> = PublicActionFns<Spec>,\n>(redux: {\n actions: Spec;\n reducer: ReducerFactory<StateActionFns, StateSignal<Input['state']>>;\n effects: EffectsFactory<StateActionFns>;\n}): SignalStoreFeature<\n Input,\n EmptyFeatureResult & { methods: PublicStoreActionFns }\n> {\n return (store) => {\n const { methods } = processRedux<Spec, PublicStoreActionFns>(\n redux.actions,\n redux.reducer as ReducerFactory<ActionFns, unknown>,\n redux.effects as EffectsFactory<ActionFns>,\n store,\n );\n return {\n ...store,\n methods,\n };\n };\n}\n","import { Signal, computed } from '@angular/core';\nimport {\n SignalStoreFeature,\n signalStoreFeature,\n withComputed,\n withState,\n} from '@ngrx/signals';\nimport { Emtpy } from './shared/empty';\n\nexport type CallState = 'init' | 'loading' | 'loaded' | { error: string };\n\nexport type CallStateSlice = {\n callState: CallState\n}\n\nexport type NamedCallStateSlice<Collection extends string> = {\n [K in keyof CallStateSlice as `${Collection}${Capitalize<K>}`]: CallStateSlice[K];\n}\n\nexport type CallStateSignals = {\n loading: Signal<boolean>;\n loaded: Signal<boolean>;\n error: Signal<string | null>\n}\n\nexport type NamedCallStateSignals<Prop extends string> = {\n [K in keyof CallStateSignals as `${Prop}${Capitalize<K>}`]: CallStateSignals[K];\n}\n\nexport type SetCallState<Prop extends string | undefined> = Prop extends string\n ? NamedCallStateSlice<Prop>\n : CallStateSlice;\n\nexport function getCallStateKeys(config?: { collection?: string }) {\n const prop = config?.collection;\n return {\n callStateKey: prop ? `${config.collection}CallState` : 'callState',\n loadingKey: prop ? `${config.collection}Loading` : 'loading',\n loadedKey: prop ? `${config.collection}Loaded` : 'loaded',\n errorKey: prop ? `${config.collection}Error` : 'error',\n };\n}\n\nexport function withCallState<Collection extends string>(config: {\n collection: Collection;\n}): SignalStoreFeature<\n { state: Emtpy, signals: Emtpy, methods: Emtpy },\n {\n state: NamedCallStateSlice<Collection>,\n signals: NamedCallStateSignals<Collection>,\n methods: Emtpy\n }\n>;\nexport function withCallState(): SignalStoreFeature<\n { state: Emtpy, signals: Emtpy, methods: Emtpy },\n {\n state: CallStateSlice,\n signals: CallStateSignals,\n methods: Emtpy\n }\n>;\nexport function withCallState<Collection extends string>(config?: {\n collection: Collection;\n}): SignalStoreFeature {\n const { callStateKey, errorKey, loadedKey, loadingKey } =\n getCallStateKeys(config);\n\n return signalStoreFeature(\n withState({ [callStateKey]: 'init' }),\n withComputed((state: Record<string, Signal<unknown>>) => {\n\n const callState = state[callStateKey] as Signal<CallState>;\n\n return {\n [loadingKey]: computed(() => callState() === 'loading'),\n [loadedKey]: computed(() => callState() === 'loaded'),\n [errorKey]: computed(() => {\n const v = callState();\n return typeof v === 'object' ? v.error : null;\n })\n }\n })\n );\n}\n\nexport function setLoading<Prop extends string | undefined = undefined>(\n prop?: Prop\n): SetCallState<Prop> {\n if (prop) {\n return { [`${prop}CallState`]: 'loading' } as SetCallState<Prop>;\n }\n\n return { callState: 'loading' } as SetCallState<Prop>;\n}\n\nexport function setLoaded<Prop extends string | undefined = undefined>(\n prop?: Prop\n): SetCallState<Prop> {\n\n if (prop) {\n return { [`${prop}CallState`]: 'loaded' } as SetCallState<Prop>;\n }\n else {\n return { callState: 'loaded' } as SetCallState<Prop>;\n }\n}\n\nexport function setError<Prop extends string | undefined = undefined>(\n error: unknown,\n prop?: Prop,\n ): SetCallState<Prop> {\n\n let errorMessage = '';\n\n if (!error) {\n errorMessage = '';\n }\n else if (typeof error === 'object' && 'message' in error) {\n errorMessage = String(error.message);\n }\n else {\n errorMessage = String(error);\n }\n \n\n if (prop) {\n return { [`${prop}CallState`]: { error: errorMessage } } as SetCallState<Prop>;\n }\n else {\n return { callState: { error: errorMessage } } as SetCallState<Prop>;\n }\n}\n","import { ProviderToken, Signal, computed, inject } from \"@angular/core\";\nimport { SignalStoreFeature, patchState, signalStoreFeature, withComputed, withMethods, withState } from \"@ngrx/signals\";\nimport { CallState, getCallStateKeys, setError, setLoaded, setLoading } from \"./with-call-state\";\nimport { setAllEntities, EntityId, addEntity, updateEntity, removeEntity } from \"@ngrx/signals/entities\";\nimport { EntityState, NamedEntitySignals } from \"@ngrx/signals/entities/src/models\";\nimport { StateSignal } from \"@ngrx/signals/src/state-signal\";\nimport { Emtpy } from \"./shared/empty\";\n\nexport type Filter = Record<string, unknown>;\nexport type Entity = { id: EntityId };\n\nexport interface DataService<E extends Entity, F extends Filter> {\n load(filter: F): Promise<E[]>;\n loadById(id: EntityId): Promise<E>;\n create(entity: E): Promise<E>;\n update(entity: E): Promise<E>;\n updateAll(entity: E[]): Promise<E[]>;\n delete(entity: E): Promise<void>;\n}\n\nexport function capitalize(str: string): string {\n return str ? str[0].toUpperCase() + str.substring(1) : str;\n}\n\nexport function getDataServiceKeys(options: { collection?: string }) {\n const filterKey = options.collection ? `${options.collection}Filter` : 'filter';\n const selectedIdsKey = options.collection ? `selected${capitalize(options.collection)}Ids` : 'selectedIds';\n const selectedEntitiesKey = options.collection ? `selected${capitalize(options.collection)}Entities` : 'selectedEntities';\n\n const updateFilterKey = options.collection ? `update${capitalize(options.collection)}Filter` : 'updateFilter';\n const updateSelectedKey = options.collection ? `updateSelected${capitalize(options.collection)}Entities` : 'updateSelected';\n const loadKey = options.collection ? `load${capitalize(options.collection)}Entities` : 'load';\n\n const currentKey = options.collection ? `current${capitalize(options.collection)}` : 'current';\n const loadByIdKey = options.collection ? `load${capitalize(options.collection)}ById` : 'loadById';\n const setCurrentKey = options.collection ? `setCurrent${capitalize(options.collection)}` : 'setCurrent';\n const createKey = options.collection ? `create${capitalize(options.collection)}` : 'create';\n const updateKey = options.collection ? `update${capitalize(options.collection)}` : 'update';\n const updateAllKey = options.collection ? `updateAll${capitalize(options.collection)}` : 'updateAll';\n const deleteKey = options.collection ? `delete${capitalize(options.collection)}` : 'delete';\n\n // TODO: Take these from @ngrx/signals/entities, when they are exported\n const entitiesKey = options.collection ? `${options.collection}Entities` : 'entities';\n const entityMapKey = options.collection ? `${options.collection}EntityMap` : 'entityMap';\n const idsKey = options.collection ? `${options.collection}Ids` : 'ids';\n\n return {\n filterKey,\n selectedIdsKey,\n selectedEntitiesKey,\n updateFilterKey,\n updateSelectedKey,\n loadKey,\n entitiesKey,\n entityMapKey,\n idsKey,\n\n currentKey,\n loadByIdKey,\n setCurrentKey,\n createKey,\n updateKey,\n updateAllKey,\n deleteKey\n };\n}\n\nexport type NamedDataServiceState<E extends Entity, F extends Filter, Collection extends string> =\n {\n [K in Collection as `${K}Filter`]: F;\n } & {\n [K in Collection as `selected${Capitalize<K>}Ids`]: Record<EntityId, boolean>;\n } & {\n [K in Collection as `current${Capitalize<K>}`]: E;\n }\n\nexport type DataServiceState<E extends Entity, F extends Filter> = {\n filter: F;\n selectedIds: Record<EntityId, boolean>;\n current: E;\n}\n\nexport type NamedDataServiceSignals<E extends Entity, Collection extends string> =\n {\n [K in Collection as `selected${Capitalize<K>}Entities`]: Signal<E[]>;\n }\n\nexport type DataServiceSignals<E extends Entity> =\n {\n selectedEntities: Signal<E[]>;\n }\n\nexport type NamedDataServiceMethods<E extends Entity, F extends Filter, Collection extends string> =\n {\n [K in Collection as `update${Capitalize<K>}Filter`]: (filter: F) => void;\n } &\n {\n [K in Collection as `updateSelected${Capitalize<K>}Entities`]: (id: EntityId, selected: boolean) => void;\n } &\n {\n [K in Collection as `load${Capitalize<K>}Entities`]: () => Promise<void>;\n } &\n\n {\n [K in Collection as `setCurrent${Capitalize<K>}`]: (entity: E) => void;\n } &\n {\n [K in Collection as `load${Capitalize<K>}ById`]: (id: EntityId) => Promise<void>;\n } &\n {\n [K in Collection as `create${Capitalize<K>}`]: (entity: E) => Promise<void>;\n } &\n {\n [K in Collection as `update${Capitalize<K>}`]: (entity: E) => Promise<void>;\n } &\n {\n [K in Collection as `updateAll${Capitalize<K>}`]: (entity: E[]) => Promise<void>;\n } &\n {\n [K in Collection as `delete${Capitalize<K>}`]: (entity: E) => Promise<void>;\n };\n\n\nexport type DataServiceMethods<E extends Entity, F extends Filter> =\n {\n updateFilter: (filter: F) => void;\n updateSelected: (id: EntityId, selected: boolean) => void;\n load: () => Promise<void>;\n\n setCurrent(entity: E): void;\n loadById(id: EntityId): Promise<void>;\n create(entity: E): Promise<void>;\n update(entity: E): Promise<void>;\n updateAll(entities: E[]): Promise<void>;\n delete(entity: E): Promise<void>;\n }\n\nexport type Empty = Record<string, never>\n\nexport function withDataService<E extends Entity, F extends Filter, Collection extends string>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F, collection: Collection }): SignalStoreFeature<\n {\n state: Emtpy,\n // These alternatives break type inference:\n // state: { callState: CallState } & NamedEntityState<E, Collection>,\n // state: NamedEntityState<E, Collection>,\n\n signals: NamedEntitySignals<E, Collection>,\n methods: Emtpy,\n },\n {\n state: NamedDataServiceState<E, F, Collection>\n signals: NamedDataServiceSignals<E, Collection>\n methods: NamedDataServiceMethods<E, F, Collection>\n }\n>;\nexport function withDataService<E extends Entity, F extends Filter>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F }): SignalStoreFeature<\n {\n state: { callState: CallState } & EntityState<E>\n signals: Emtpy,\n methods: Emtpy,\n },\n {\n state: DataServiceState<E, F>\n signals: DataServiceSignals<E>\n methods: DataServiceMethods<E, F>\n }>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withDataService<E extends Entity, F extends Filter, Collection extends string>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F, collection?: Collection }): SignalStoreFeature<any, any> {\n const { dataServiceType, filter, collection: prefix } = options;\n const {\n entitiesKey,\n filterKey,\n loadKey,\n selectedEntitiesKey,\n selectedIdsKey,\n updateFilterKey,\n updateSelectedKey,\n\n currentKey,\n createKey,\n updateKey,\n updateAllKey,\n deleteKey,\n loadByIdKey,\n setCurrentKey\n } = getDataServiceKeys(options);\n\n const { callStateKey } = getCallStateKeys({ collection: prefix });\n\n return signalStoreFeature(\n withState(() => ({\n [filterKey]: filter,\n [selectedIdsKey]: {} as Record<EntityId, boolean>,\n [currentKey]: undefined as E | undefined\n })),\n withComputed((store: Record<string, unknown>) => {\n const entities = store[entitiesKey] as Signal<E[]>;\n const selectedIds = store[selectedIdsKey] as Signal<Record<EntityId, boolean>>;\n\n return {\n [selectedEntitiesKey]: computed(() => entities().filter(e => selectedIds()[e.id]))\n }\n }),\n withMethods((store: Record<string, unknown> & StateSignal<object>) => {\n const dataService = inject(dataServiceType)\n return {\n [updateFilterKey]: (filter: F): void => {\n patchState(store, { [filterKey]: filter });\n },\n [updateSelectedKey]: (id: EntityId, selected: boolean): void => {\n patchState(store, (state: Record<string, unknown>) => ({\n [selectedIdsKey]: {\n ...state[selectedIdsKey] as Record<EntityId, boolean>,\n [id]: selected,\n }\n }));\n },\n [loadKey]: async (): Promise<void> => {\n const filter = store[filterKey] as Signal<F>;\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const result = await dataService.load(filter());\n patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [loadByIdKey]: async (id: EntityId): Promise<void> => {\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const current = await dataService.loadById(id);\n store[callStateKey] && patchState(store, setLoaded(prefix));\n patchState(store, { [currentKey]: current });\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [setCurrentKey]: (current: E): void => {\n patchState(store, { [currentKey]: current });\n },\n [createKey]: async (entity: E): Promise<void> => {\n patchState(store, { [currentKey]: entity });\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const created = await dataService.create(entity);\n patchState(store, { [currentKey]: created });\n patchState(store, prefix ? addEntity(created, { collection: prefix }) : addEntity(created));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [updateKey]: async (entity: E): Promise<void> => {\n patchState(store, { [currentKey]: entity });\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const updated = await dataService.update(entity);\n patchState(store, { [currentKey]: updated });\n // Why do we need this cast to Partial<Entity>?\n const updateArg = { id: updated.id, changes: updated as Partial<Entity> };\n patchState(store, prefix ? updateEntity(updateArg, { collection: prefix }) : updateEntity(updateArg));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [updateAllKey]: async (entities: E[]): Promise<void> => {\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const result = await dataService.updateAll(entities);\n patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [deleteKey]: async (entity: E): Promise<void> => {\n patchState(store, { [currentKey]: entity });\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n await dataService.delete(entity);\n patchState(store, { [currentKey]: undefined });\n patchState(store, prefix ? removeEntity(entity.id, { collection: prefix }) : removeEntity(entity.id));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n };\n })\n );\n}\n","import { SignalStoreFeature, patchState, signalStoreFeature, withComputed, withHooks, withMethods } from \"@ngrx/signals\";\nimport { EntityId, EntityMap, EntityState } from \"@ngrx/signals/entities\";\nimport { Signal, effect, signal, untracked, isSignal } from \"@angular/core\";\nimport { EntitySignals, NamedEntitySignals } from \"@ngrx/signals/entities/src/models\";\nimport { Entity, capitalize } from \"./with-data-service\";\nimport { Emtpy } from \"./shared/empty\";\n\nexport type StackItem = Record<string, unknown>;\n\nexport type NormalizedUndoRedoOptions = {\n maxStackSize: number;\n collections?: string[]\n}\n\nconst defaultOptions: NormalizedUndoRedoOptions = {\n maxStackSize: 100\n};\n\nexport type NamedUndoRedoState<Collection extends string> = {\n [K in Collection as `${K}EntityMap`]: EntityMap<Entity>;\n} & {\n [K in Collection as `${K}Ids`]: EntityId[];\n }\n\nexport type NamedUndoRedoSignals<Collection extends string> = {\n [K in Collection as `${K}Entities`]: Signal<Entity[]>\n}\n\nexport function getUndoRedoKeys(collections?: string[]): string[] {\n if (collections) {\n return collections.flatMap(c => [`${c}EntityMap`, `${c}Ids`, `selected${capitalize(c)}Ids`, `${c}Filter`])\n }\n return ['entityMap', 'ids', 'selectedIds', 'filter'];\n}\n\nexport function withUndoRedo<Collection extends string>(options?: { maxStackSize?: number; collections: Collection[] }): SignalStoreFeature<\n {\n state: Emtpy,\n // This alternative breaks type inference:\n // state: NamedEntityState<Entity, Collection>\n signals: NamedEntitySignals<Entity, Collection>,\n methods: Emtpy\n },\n {\n state: Emtpy,\n signals: {\n canUndo: Signal<boolean>,\n canRedo: Signal<boolean>\n },\n methods: {\n undo: () => void,\n redo: () => void\n }\n }>;\n\nexport function withUndoRedo(options?: { maxStackSize?: number }): SignalStoreFeature<\n {\n state: EntityState<Entity>,\n signals: EntitySignals<Entity>,\n methods: Emtpy\n },\n {\n state: Emtpy,\n signals: {\n canUndo: Signal<boolean>,\n canRedo: Signal<boolean>\n },\n methods: {\n undo: () => void,\n redo: () => void\n }\n }>;\n\nexport function withUndoRedo<Collection extends string>(options: {\n maxStackSize?: number;\n collections?: Collection[]\n} = {}): \n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nSignalStoreFeature<any, any> {\n let previous: StackItem | null = null;\n let skipOnce = false;\n\n const normalized = {\n ...defaultOptions,\n ...options\n };\n\n //\n // Design Decision: This feature has its own\n // internal state.\n //\n\n const undoStack: StackItem[] = [];\n const redoStack: StackItem[] = [];\n\n const canUndo = signal(false);\n const canRedo = signal(false);\n\n const updateInternal = () => {\n canUndo.set(undoStack.length !== 0);\n canRedo.set(redoStack.length !== 0);\n };\n\n const keys = getUndoRedoKeys(normalized?.collections);\n\n return signalStoreFeature(\n\n withComputed(() => ({\n canUndo: canUndo.asReadonly(),\n canRedo: canRedo.asReadonly()\n })),\n withMethods((store) => ({\n undo(): void {\n const item = undoStack.pop();\n\n if (item && previous) {\n redoStack.push(previous);\n }\n\n if (item) {\n skipOnce = true;\n patchState(store, item);\n previous = item;\n }\n\n updateInternal();\n },\n redo(): void {\n const item = redoStack.pop();\n\n if (item && previous) {\n undoStack.push(previous);\n }\n\n if (item) {\n skipOnce = true;\n patchState(store, item);\n previous = item;\n }\n\n updateInternal();\n }\n })),\n withHooks({\n onInit(store: Record<string, unknown>) {\n effect(() => {\n\n const cand = keys.reduce((acc, key) => {\n const s = store[key];\n if (s && isSignal(s)) {\n return {\n ...acc,\n [key]: s()\n }\n }\n return acc;\n }, {});\n\n if (skipOnce) {\n skipOnce = false;\n return;\n }\n\n // Clear redoStack after recorded action\n redoStack.splice(0);\n\n if (previous) {\n undoStack.push(previous);\n }\n\n if (redoStack.length > normalized.maxStackSize) {\n undoStack.unshift();\n }\n\n previous = cand;\n\n // Don't propogate current reactive context\n untracked(() => updateInternal());\n })\n }\n })\n\n )\n}\n","import { isPlatformServer } from '@angular/common';\nimport { PLATFORM_ID, effect, inject } from '@angular/core';\nimport {\n SignalStoreFeature,\n getState,\n patchState,\n signalStoreFeature,\n withHooks,\n withMethods,\n} from '@ngrx/signals';\nimport { Emtpy } from './shared/empty';\n\ntype SignalStoreFeatureInput<State> = Pick<\n Parameters<SignalStoreFeature>[0],\n 'signals' | 'methods'\n> & {\n state: State;\n};\n\nconst NOOP = () => {};\n\ntype WithStorageSyncFeatureResult = {\n state: Emtpy;\n signals: Emtpy;\n methods: {\n clearStorage(): void;\n readFromStorage(): void;\n writeToStorage(): void;\n };\n};\n\nconst StorageSyncStub: Pick<\n WithStorageSyncFeatureResult,\n 'methods'\n>['methods'] = {\n clearStorage: NOOP,\n readFromStorage: NOOP,\n writeToStorage: NOOP,\n};\n\nexport type SyncConfig<State> = {\n /**\n * The key which is used to access the storage.\n */\n key: string;\n /**\n * Flag indicating if the store should read from storage on init and write to storage on every state change.\n *\n * `true` by default\n */\n autoSync?: boolean;\n /**\n * Function to select that portion of the state which should be stored.\n *\n * Returns the whole state object by default\n */\n select?: (state: State) => Partial<State>;\n /**\n * Function used to parse the state coming from storage.\n *\n * `JSON.parse()` by default\n */\n parse?: (stateString: string) => State;\n /**\n * Function used to tranform the state into a string representation.\n *\n * `JSON.stringify()` by default\n */\n stringify?: (state: State) => string;\n /**\n * Factory function used to select the storage.\n *\n * `localstorage` by default\n */\n storage?: () => Storage;\n};\n\n/**\n * Enables store synchronization with storage.\n *\n * Only works on browser platform.\n */\nexport function withStorageSync<\n State extends object,\n Input extends SignalStoreFeatureInput<State>\n>(key: string): SignalStoreFeature<Input, WithStorageSyncFeatureResult>;\nexport function withStorageSync<\n State extends object,\n Input extends SignalStoreFeatureInput<State>\n>(\n config: SyncConfig<Input['state']>\n): SignalStoreFeature<Input, WithStorageSyncFeatureResult>;\nexport function withStorageSync<\n State extends object,\n Input extends SignalStoreFeatureInput<State>\n>(\n configOrKey: SyncConfig<Input['state']> | string\n): SignalStoreFeature<Input, WithStorageSyncFeatureResult> {\n const {\n key,\n autoSync = true,\n select = (state: State) => state,\n parse = JSON.parse,\n stringify = JSON.stringify,\n storage: storageFactory = () => localStorage,\n } = typeof configOrKey === 'string' ? { key: configOrKey } : configOrKey;\n\n return signalStoreFeature(\n withMethods((store, platformId = inject(PLATFORM_ID)) => {\n if (isPlatformServer(platformId)) {\n console.warn(\n `'withStorageSync' provides non-functional implementation due to server-side execution`\n );\n return StorageSyncStub;\n }\n\n const storage = storageFactory();\n\n return {\n /**\n * Removes the item stored in storage.\n */\n clearStorage(): void {\n storage.removeItem(key);\n },\n /**\n * Reads item from storage and patches the state.\n */\n readFromStorage(): void {\n const stateString = storage.getItem(key);\n if (stateString) {\n patchState(store, parse(stateString));\n }\n },\n /**\n * Writes selected portion to storage.\n */\n writeToStorage(): void {\n const slicedState = select(getState(store) as State);\n storage.setItem(key, stringify(slicedState));\n },\n };\n }),\n withHooks({\n onInit(store, platformId = inject(PLATFORM_ID)) {\n if (isPlatformServer(platformId)) {\n return;\n }\n\n if (autoSync) {\n store.readFromStorage();\n\n effect(() => {\n store.writeToStorage();\n });\n }\n },\n })\n );\n}\n","import { Action } from '@ngrx/store';\nimport { Unsubscribable } from 'rxjs';\n\n\nexport function isUnsubscribable<F extends (...args: unknown[]) => unknown>(\n fn: F | (F & Unsubscribable)\n): fn is F & Unsubscribable {\n return !!(fn as any as F & Unsubscribable)?.unsubscribe;\n}\n\nexport function capitalize(str: string): string {\n return str ? str[0].toUpperCase() + str.substring(1) : str;\n}\n\nexport function isActionCreator(action: any): action is Action {\n return (\n typeof action === 'function' &&\n action &&\n action.type &&\n typeof action.type === 'string'\n );\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { rxMethod } from \"@ngrx/signals/rxjs-interop\";\nimport { Action, ActionCreator } from \"@ngrx/store\";\nimport { pipe, tap } from \"rxjs\";\nimport { MapperTypes } from \"./model\";\nimport { isUnsubscribable } from \"./util\";\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SignalReduxStore {\n private mapperDict: Record<string, {\n storeMethod: (...args: unknown[]) => unknown,\n resultMethod?: (...args: unknown[]) => unknown,\n }> = {};\n\n dispatch = rxMethod<Action>(pipe(\n tap((action: Action) => {\n const callbacks = this.mapperDict[action.type];\n if (callbacks?.storeMethod) {\n if (\n isUnsubscribable(callbacks.storeMethod) &&\n callbacks.resultMethod\n ) {\n return callbacks.storeMethod(action, (a: Action) => {\n const resultAction = callbacks.resultMethod?.(a) as Action;\n this.dispatch(resultAction);\n });\n }\n\n return callbacks?.storeMethod(action);\n }\n\n return;\n })\n ));\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n connectFeatureStore(mappers: MapperTypes<ActionCreator<any, any>[]>[]): void {\n mappers.forEach(\n mapper => mapper.types.forEach(\n action => this.mapperDict[action] = {\n storeMethod: mapper.storeMethod,\n resultMethod: mapper.resultMethod\n }\n )\n );\n }\n}\n\nexport function injectReduxDispatch() {\n return inject(SignalReduxStore).dispatch;\n}\n","import { ENVIRONMENT_INITIALIZER, inject, makeEnvironmentProviders } from \"@angular/core\";\nimport { ActionCreator, ActionType } from \"@ngrx/store/src/models\";\nimport { CreateReduxState, ExtractActionTypes, MapperTypes, Store } from \"./model\";\nimport { SignalReduxStore, injectReduxDispatch } from \"./signal-redux-store\";\nimport { capitalize, isActionCreator } from \"./util\";\n\n\nexport function mapAction<\n Creators extends readonly ActionCreator[]\n>(\n ...args: [\n ...creators: Creators,\n storeMethod: (action: ActionType<Creators[number]>) => unknown\n ]\n): MapperTypes<Creators>;\nexport function mapAction<\n Creators extends readonly ActionCreator[],\n T\n>(\n ...args: [\n ...creators: Creators,\n storeMethod: (action: ActionType<Creators[number]>, resultMethod: (input: T) => unknown) => unknown,\n resultMethod: (input: T) => unknown\n ]\n): MapperTypes<Creators>;\nexport function mapAction<\n Creators extends readonly ActionCreator[]\n>(\n ...args: [\n ...creators: Creators,\n storeMethod: (action: ActionType<Creators[number]>) => unknown,\n resultMethod?: (input: unknown) => unknown\n ]\n): MapperTypes<Creators> {\n let resultMethod = args.pop() as unknown as ((input: unknown) => unknown ) | undefined;\n let storeMethod = args.pop() as unknown as (action: ActionType<Creators[number]>) => unknown;\n\n if (isActionCreator(storeMethod)) {\n args.push(storeMethod);\n storeMethod = resultMethod || storeMethod;\n resultMethod = undefined;\n }\n\n const types = (args as unknown as Creators).map(\n (creator) => creator.type\n ) as unknown as ExtractActionTypes<Creators>;\n\n return {\n types,\n storeMethod,\n resultMethod\n };\n}\n\nexport function withActionMappers(\n ...mappers: MapperTypes<ActionCreator<any, any>[]>[]\n): MapperTypes<ActionCreator<any, any>[]>[] {\n return mappers;\n}\n\nexport function createReduxState<\n StoreName extends string,\n STORE extends Store\n>(\n storeName: StoreName,\n signalStore: STORE,\n withActionMappers: (store: InstanceType<STORE>) => MapperTypes<ActionCreator<any, any>[]>[],\n): CreateReduxState<StoreName, STORE> {\n const isRootProvider = (signalStore as any)?.ɵprov?.providedIn === 'root';\n return {\n [`provide${capitalize(storeName)}Store`]: (connectReduxDevtools = false) => makeEnvironmentProviders([\n isRootProvider? [] : signalStore,\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (\n signalReduxStore = inject(SignalReduxStore),\n store = inject(signalStore)\n ) => () => {\n if (connectReduxDevtools) {\n // addStoreToReduxDevtools(store, storeName, false);\n }\n signalReduxStore.connectFeatureStore(\n withActionMappers(store)\n );\n }\n }\n ]),\n [`inject${capitalize(storeName)}Store`]: () => Object.assign(\n inject(signalStore),\n { dispatch: injectReduxDispatch() }\n )\n } as CreateReduxState<StoreName, STORE>;\n}\n","import { Injector, Signal, inject } from \"@angular/core\";\nimport { rxMethod } from \"@ngrx/signals/rxjs-interop\";\nimport { Observable, Unsubscribable, map, pipe } from \"rxjs\";\n\n\ntype RxMethodInput<Input> = Input | Observable<Input> | Signal<Input>;\n\ntype RxMethod<Input, MethodInput = Input, MethodResult = unknown> = ((\n input: RxMethodInput<Input>,\n resultMethod: (input: MethodInput) => MethodResult\n) => Unsubscribable) & Unsubscribable;\n\nexport function reduxMethod<Input, MethodInput = Input>(\n generator: (source$: Observable<Input>) => Observable<MethodInput>,\n config?: { injector?: Injector }\n): RxMethod<Input, MethodInput>;\nexport function reduxMethod<Input, MethodInput = Input, MethodResult = unknown>(\n generator: (source$: Observable<Input>) => Observable<MethodInput>,\n resultMethod: (input: MethodInput) => MethodResult,\n config?: {\n injector?: Injector\n }\n): RxMethod<Input, MethodInput, MethodResult>;\nexport function reduxMethod<Input, MethodInput = Input, MethodResult = unknown>(\n generator: (source$: Observable<Input>) => Observable<MethodInput>,\n resultMethodOrConfig?: ((input: MethodInput) => MethodResult) | {\n injector?: Injector\n },\n config?: {\n injector?: Injector\n }\n): RxMethod<Input, MethodInput, MethodResult> {\n const injector = inject(Injector);\n\n if (typeof resultMethodOrConfig === 'function') {\n let unsubscribable: Unsubscribable;\n const inputResultFn = ((\n input: RxMethodInput<Input>,\n resultMethod = resultMethodOrConfig\n ) => {\n\n const rxMethodWithResult = rxMethod<Input>(pipe(\n generator,\n map(resultMethod)\n ), {\n ...(config || {}),\n injector: config?.injector || injector\n });\n const rxWithInput = rxMethodWithResult(input);\n unsubscribable = { unsubscribe: rxWithInput.unsubscribe.bind(rxWithInput) };\n\n return rxWithInput;\n }) as RxMethod<Input, MethodInput, MethodResult>;\n\n inputResultFn.unsubscribe = () => unsubscribable?.unsubscribe();\n\n return inputResultFn;\n }\n\n return rxMethod<Input>(generator, resultMethodOrConfig);\n}\n","/** With pagination comes in two flavors the first one is local pagination or in memory pagination. For example we have 2000 items which we want\n * to display in a table and the response payload is small enough to be stored in the memory. But we can not display all 2000 items at once\n * so we need to paginate the data. The second flavor is server side pagination where the response payload is too large to be stored in the memory\n * and we need to fetch the data from the server in chunks. In the second case we 'could' also cache the data in the memory but that could lead to\n * other problems like memory leaks and stale data. So we will not cache the data in the memory in the second case.\n * This feature implements the local pagination.\n */\n\nimport { Signal, computed } from '@angular/core';\nimport {\n SignalStoreFeature,\n signalStoreFeature,\n withComputed,\n withState,\n} from '@ngrx/signals';\nimport { Emtpy } from './shared/empty';\nimport {\n EntitySignals,\n EntityState,\n NamedEntitySignals,\n} from '@ngrx/signals/entities/src/models';\nimport { Entity, capitalize } from './with-data-service';\n\n// This is a virtual page which is can be used to create a pagination control\nexport type Page = { label: string | number; value: number };\n\nexport type NamedPaginationServiceState<\n E extends Entity,\n Collection extends string\n> = {\n [K in Collection as `selectedPage${Capitalize<K>}Entities`]: Array<E>;\n} & {\n [K in Collection as `${Lowercase<K>}CurrentPage`]: number;\n} & {\n [K in Collection as `${Lowercase<K>}PageSize`]: number;\n} & {\n [K in Collection as `${Lowercase<K>}TotalCount`]: number;\n} & {\n [K in Collection as `${Lowercase<K>}PageCount`]: number;\n} & {\n [K in Collection as `${Lowercase<K>}PageNavigationArray`]: number;\n} & {\n [K in Collection as `${Lowercase<K>}PageNavigationArrayMax`]: number;\n};\n\nexport type NamedPaginationServiceSignals<\n E extends Entity,\n Collection extends string\n> = {\n [K in Collection as `selectedPage${Capitalize<K>}Entities`]: Signal<E[]>;\n} & {\n [K in Collection as `${Lowercase<K>}CurrentPage`]: Signal<number>;\n} & {\n [K in Collection as `${Lowercase<K>}PageSize`]: Signal<number>;\n} & {\n [K in Collection as `${Lowercase<K>}TotalCount`]: Signal<number>;\n} & {\n [K in Collection as `${Lowercase<K>}PageCount`]: Signal<number>;\n} & {\n [K in Collection as `${Lowercase<K>}PageNavigationArray`]: Signal<Page[]>;\n} & {\n [K in Collection as `${Lowercase<K>}PageNavigationArrayMax`]: Signal<number>;\n};\n\nexport type PaginationServiceState<E extends Entity> = {\n selectedPageEntities: Array<E>;\n currentPage: number;\n pageSize: number;\n totalCount: number;\n pageCount: number;\n pageNavigationArray: Page[];\n pageNavigationArrayMax: number;\n};\n\nexport type PaginationServiceSignals<E extends Entity> = {\n selectedPageEntities: Signal<E[]>;\n currentPage: Signal<number>;\n pageSize: Signal<number>;\n totalCount: Signal<number>;\n pageCount: Signal<number>;\n pageNavigationArray: Signal<Page[]>;\n pageNavigationArrayMax: Signal<number>;\n};\n\nexport type SetPaginationState<\n E extends Entity,\n Collection extends string | undefined\n> = Collection extends string\n ? NamedPaginationServiceState<E, Collection>\n : PaginationServiceState<E>;\n\nexport function withPagination<\n E extends Entity,\n Collection extends string\n>(options: {\n collection: Collection;\n}): SignalStoreFeature<\n {\n state: Emtpy;\n signals: NamedEntitySignals<E, Collection>;\n methods: Emtpy;\n },\n {\n state: NamedPaginationServiceState<E, Collection>;\n signals: NamedPaginationServiceSignals<E, Collection>;\n methods: Emtpy;\n }\n>;\n\nexport function withPagination<E extends Entity>(): SignalStoreFeature<\n {\n state: EntityState<E>;\n signals: EntitySignals<E>;\n methods: Emtpy;\n },\n {\n state: PaginationServiceState<E>;\n signals: PaginationServiceSignals<E>;\n methods: Emtpy;\n }\n>;\n\nexport function withPagination<\n E extends Entity,\n Collection extends string\n>(options?: { collection: Collection }): SignalStoreFeature<any, any> {\n const {\n pageKey,\n pageSizeKey,\n entitiesKey,\n selectedPageEntitiesKey,\n totalCountKey,\n pageCountKey,\n pageNavigationArrayMaxKey,\n pageNavigationArrayKey,\n } = createPaginationKeys<Collection>(options);\n\n return signalStoreFeature(\n withState({\n [pageKey]: 1,\n [pageSizeKey]: 10,\n [pageNavigationArrayMaxKey]: 7,\n }),\n withComputed((store: Record<string, unknown>) => {\n const entities = store[entitiesKey] as Signal<E[]>;\n const page = store[pageKey] as Signal<number>;\n const pageSize = store[pageSizeKey] as Signal<number>;\n const pageNavigationArrayMax = store[\n pageNavigationArrayMaxKey\n ] as Signal<number>;\n\n return {\n // The derived enitites which are displayed on the current page\n [selectedPageEntitiesKey]: computed<E[]>(() => {\n const pageSizeValue = pageSize();\n const pageValue = page();\n\n // If the page is greater than the total number of pages\n // we should return an empty array\n if (\n pageValue < 0 ||\n pageSizeValue === 0 ||\n pageValue > Math.ceil(entities().length / pageSizeValue)\n ) {\n return [] as E[];\n }\n\n return entities().slice(\n (pageValue - 1) * pageSizeValue,\n pageValue * pageSizeValue\n ) as E[];\n }),\n [totalCountKey]: computed(() => entities().length),\n [pageCountKey]: computed(() => {\n const totalCountValue = entities().length;\n const pageSizeValue = pageSize();\n\n if (totalCountValue === 0) {\n return 0;\n }\n\n return Math.ceil(totalCountValue / pageSizeValue);\n }),\n [pageNavigationArrayKey]: computed(() =>\n createPageArray(\n page(),\n pageSize(),\n entities().length,\n pageNavigationArrayMax()\n )\n ),\n };\n })\n );\n}\n\nexport function gotoPage<E extends Entity, Collection extends string>(\n page: number,\n options?: {\n collection: Collection;\n }\n): Partial<SetPaginationState<E, Collection>> {\n const { pageKey } = createPaginationKeys<Collection>(options);\n\n return {\n [pageKey]: page,\n } as Partial<SetPaginationState<E, Collection>>;\n}\n\nexport function setPageSize<E extends Entity, Collection extends string>(\n pageSize: number,\n options?: {\n collection: Collection;\n }\n): Partial<SetPaginationState<E, Collection>> {\n const { pageSizeKey } = createPaginationKeys<Collection>(options);\n\n return {\n [pageSizeKey]: pageSize,\n } as Partial<SetPaginationState<E, Collection>>;\n}\n\nexport function nextPage<\n E extends Entity,\n Collection extends string\n>(options?: {\n collection: Collection;\n}): Partial<SetPaginationState<E, Collection>> {\n const { pageKey } = createPaginationKeys<Collection>(options);\n\n return {\n [pageKey]: (currentPage: number) => currentPage + 1,\n } as Partial<SetPaginationState<E, Collection>>;\n}\n\nexport function previousPage<\n E extends Entity,\n Collection extends string\n>(options?: {\n collection: Collection;\n}): Partial<SetPaginationState<E, Collection>> {\n const { pageKey } = createPaginationKeys<Collection>(options);\n\n return {\n [pageKey]: (currentPage: number) => Math.max(currentPage - 1, 1),\n } as Partial<SetPaginationState<E, Collection>>;\n}\n\nexport function firstPage<\n E extends Entity,\n Collection extends string\n>(options?: {\n collection: Collection;\n}): Partial<SetPaginationState<E, Collection>> {\n const { pageKey } = createPaginationKeys<Collection>(options);\n\n return {\n [pageKey]: 1,\n } as Partial<SetPaginationState<E, Collection>>;\n}\n\nexport function setMaxPageNavigationArrayItems<\n E extends Entity,\n Collection extends string\n>(\n maxPageNavigationArrayItems: number,\n options?: {\n collection: Collection;\n }\n): Partial<SetPaginationState<E, Collection>> {\n const { pageNavigationArrayMaxKey } =\n createPaginationKeys<Collection>(options);\n\n return {\n [pageNavigationArrayMaxKey]: maxPageNavigationArrayItems,\n } as Partial<SetPaginationState<E, Collection>>;\n}\n\nfunction createPaginationKeys<Collection extends string>(\n options: { collection: Collection } | undefined\n) {\n const entitiesKey = options?.collection\n ? `${options.collection}Entities`\n : 'entities';\n const selectedPageEntitiesKey = options?.collection\n ? `selectedPage${capitalize(options?.collection)}Entities`\n : 'selectedPageEntities';\n const pageKey = options?.collection ? `${options.collection}CurrentPage` : 'currentPage';\n const pageSizeKey = options?.collection\n ? `${options.collection}PageSize`\n : 'pageSize';\n const totalCountKey = options?.collection\n ? `${options.collection}TotalCount`\n : 'totalCount';\n const pageCountKey = options?.collection\n ? `${options.collection}PageCount`\n : 'pageCount';\n const pageNavigationArrayMaxKey = options?.collection\n ? `${options.collection}PageNavigationArrayMax`\n : 'pageNavigationArrayMax';\n const pageNavigationArrayKey = options?.collection\n ? `${options.collection}PageNavigationArray`\n : 'pageNavigationArray';\n return {\n pageKey,\n pageSizeKey,\n entitiesKey,\n selectedPageEntitiesKey,\n totalCountKey,\n pageCountKey,\n pageNavigationArrayKey,\n pageNavigationArrayMaxKey,\n };\n}\n\nexport function createPageArray(\n currentPage: number,\n itemsPerPage: number,\n totalItems: number,\n paginationRange: number\n): Page[] {\n // Convert paginationRange to number in case it's a string\n paginationRange = +paginationRange;\n\n // Calculate total number of pages\n const totalPages = Math.max(Math.ceil(totalItems / itemsPerPage), 1);\n const halfWay = Math.ceil(paginationRange / 2);\n\n const isStart = currentPage <= halfWay;\n const isEnd = totalPages - halfWay < currentPage;\n const isMiddle = !isStart && !isEnd;\n\n const ellipsesNeeded = paginationRange < totalPages;\n const pages: Page[] = [];\n\n for (let i = 1; i <= totalPages && i <= paginationRange; i++) {\n let pageNumber = i;\n\n if (i === paginationRange) {\n pageNumber = totalPages;\n } else if (ellipsesNeeded) {\n if (isEnd) {\n pageNumber = totalPages - paginationRange + i;\n } else if (isMiddle) {\n pageNumber = currentPage - halfWay + i;\n }\n }\n\n const openingEllipsesNeeded = i === 2 && (isMiddle || isEnd);\n const closingEllipsesNeeded =\n i === paginationRange - 1 && (isMiddle || isStart);\n\n const label =\n ellipsesNeeded && (openingEllipsesNeeded || closingEllipsesNeeded)\n ? '...'\n : pageNumber;\n\n pages.push({ label, value: pageNumber });\n }\n\n return pages;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["originalPatchState","capitalize","patchState"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -6,3 +6,4 @@ export * from './lib/with-data-service';
6
6
  export { withStorageSync, SyncConfig } from './lib/with-storage-sync';
7
7
  export * from './lib/redux-connector';
8
8
  export * from './lib/redux-connector/rxjs-interop';
9
+ export * from './lib/with-pagination';
@@ -0,0 +1,104 @@
1
+ /** With pagination comes in two flavors the first one is local pagination or in memory pagination. For example we have 2000 items which we want
2
+ * to display in a table and the response payload is small enough to be stored in the memory. But we can not display all 2000 items at once
3
+ * so we need to paginate the data. The second flavor is server side pagination where the response payload is too large to be stored in the memory
4
+ * and we need to fetch the data from the server in chunks. In the second case we 'could' also cache the data in the memory but that could lead to
5
+ * other problems like memory leaks and stale data. So we will not cache the data in the memory in the second case.
6
+ * This feature implements the local pagination.
7
+ */
8
+ import { Signal } from '@angular/core';
9
+ import { SignalStoreFeature } from '@ngrx/signals';
10
+ import { Emtpy } from './shared/empty';
11
+ import { EntitySignals, EntityState, NamedEntitySignals } from '@ngrx/signals/entities/src/models';
12
+ import { Entity } from './with-data-service';
13
+ export type Page = {
14
+ label: string | number;
15
+ value: number;
16
+ };
17
+ export type NamedPaginationServiceState<E extends Entity, Collection extends string> = {
18
+ [K in Collection as `selectedPage${Capitalize<K>}Entities`]: Array<E>;
19
+ } & {
20
+ [K in Collection as `${Lowercase<K>}CurrentPage`]: number;
21
+ } & {
22
+ [K in Collection as `${Lowercase<K>}PageSize`]: number;
23
+ } & {
24
+ [K in Collection as `${Lowercase<K>}TotalCount`]: number;
25
+ } & {
26
+ [K in Collection as `${Lowercase<K>}PageCount`]: number;
27
+ } & {
28
+ [K in Collection as `${Lowercase<K>}PageNavigationArray`]: number;
29
+ } & {
30
+ [K in Collection as `${Lowercase<K>}PageNavigationArrayMax`]: number;
31
+ };
32
+ export type NamedPaginationServiceSignals<E extends Entity, Collection extends string> = {
33
+ [K in Collection as `selectedPage${Capitalize<K>}Entities`]: Signal<E[]>;
34
+ } & {
35
+ [K in Collection as `${Lowercase<K>}CurrentPage`]: Signal<number>;
36
+ } & {
37
+ [K in Collection as `${Lowercase<K>}PageSize`]: Signal<number>;
38
+ } & {
39
+ [K in Collection as `${Lowercase<K>}TotalCount`]: Signal<number>;
40
+ } & {
41
+ [K in Collection as `${Lowercase<K>}PageCount`]: Signal<number>;
42
+ } & {
43
+ [K in Collection as `${Lowercase<K>}PageNavigationArray`]: Signal<Page[]>;
44
+ } & {
45
+ [K in Collection as `${Lowercase<K>}PageNavigationArrayMax`]: Signal<number>;
46
+ };
47
+ export type PaginationServiceState<E extends Entity> = {
48
+ selectedPageEntities: Array<E>;
49
+ currentPage: number;
50
+ pageSize: number;
51
+ totalCount: number;
52
+ pageCount: number;
53
+ pageNavigationArray: Page[];
54
+ pageNavigationArrayMax: number;
55
+ };
56
+ export type PaginationServiceSignals<E extends Entity> = {
57
+ selectedPageEntities: Signal<E[]>;
58
+ currentPage: Signal<number>;
59
+ pageSize: Signal<number>;
60
+ totalCount: Signal<number>;
61
+ pageCount: Signal<number>;
62
+ pageNavigationArray: Signal<Page[]>;
63
+ pageNavigationArrayMax: Signal<number>;
64
+ };
65
+ export type SetPaginationState<E extends Entity, Collection extends string | undefined> = Collection extends string ? NamedPaginationServiceState<E, Collection> : PaginationServiceState<E>;
66
+ export declare function withPagination<E extends Entity, Collection extends string>(options: {
67
+ collection: Collection;
68
+ }): SignalStoreFeature<{
69
+ state: Emtpy;
70
+ signals: NamedEntitySignals<E, Collection>;
71
+ methods: Emtpy;
72
+ }, {
73
+ state: NamedPaginationServiceState<E, Collection>;
74
+ signals: NamedPaginationServiceSignals<E, Collection>;
75
+ methods: Emtpy;
76
+ }>;
77
+ export declare function withPagination<E extends Entity>(): SignalStoreFeature<{
78
+ state: EntityState<E>;
79
+ signals: EntitySignals<E>;
80
+ methods: Emtpy;
81
+ }, {
82
+ state: PaginationServiceState<E>;
83
+ signals: PaginationServiceSignals<E>;
84
+ methods: Emtpy;
85
+ }>;
86
+ export declare function gotoPage<E extends Entity, Collection extends string>(page: number, options?: {
87
+ collection: Collection;
88
+ }): Partial<SetPaginationState<E, Collection>>;
89
+ export declare function setPageSize<E extends Entity, Collection extends string>(pageSize: number, options?: {
90
+ collection: Collection;
91
+ }): Partial<SetPaginationState<E, Collection>>;
92
+ export declare function nextPage<E extends Entity, Collection extends string>(options?: {
93
+ collection: Collection;
94
+ }): Partial<SetPaginationState<E, Collection>>;
95
+ export declare function previousPage<E extends Entity, Collection extends string>(options?: {
96
+ collection: Collection;
97
+ }): Partial<SetPaginationState<E, Collection>>;
98
+ export declare function firstPage<E extends Entity, Collection extends string>(options?: {
99
+ collection: Collection;
100
+ }): Partial<SetPaginationState<E, Collection>>;
101
+ export declare function setMaxPageNavigationArrayItems<E extends Entity, Collection extends string>(maxPageNavigationArrayItems: number, options?: {
102
+ collection: Collection;
103
+ }): Partial<SetPaginationState<E, Collection>>;
104
+ export declare function createPageArray(currentPage: number, itemsPerPage: number, totalItems: number, paginationRange: number): Page[];
package/package.json CHANGED
@@ -1,15 +1,13 @@
1
1
  {
2
2
  "name": "@angular-architects/ngrx-toolkit",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "GitHub",
7
7
  "url": "https://github.com/angular-architects/ngrx-toolkit"
8
8
  },
9
9
  "peerDependencies": {
10
- "@angular/common": "^17.0.0",
11
- "@angular/core": "^17.0.0",
12
- "@ngrx/signals": "^17.0.0"
10
+ "@ngrx/signals": "^17.2.0"
13
11
  },
14
12
  "dependencies": {
15
13
  "tslib": "^2.3.0"