@angular-architects/ngrx-toolkit 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/.eslintrc.json +43 -0
  2. package/jest.config.ts +22 -0
  3. package/ng-package.json +7 -0
  4. package/package.json +3 -16
  5. package/project.json +37 -0
  6. package/{index.d.ts → src/index.ts} +3 -2
  7. package/src/lib/assertions/assertions.ts +9 -0
  8. package/src/lib/redux-connector/create-redux.ts +94 -0
  9. package/{lib/redux-connector/index.d.ts → src/lib/redux-connector/index.ts} +1 -0
  10. package/src/lib/redux-connector/model.ts +67 -0
  11. package/{lib/redux-connector/rxjs-interop/index.d.ts → src/lib/redux-connector/rxjs-interop/index.ts} +1 -0
  12. package/src/lib/redux-connector/rxjs-interop/redux-method.ts +61 -0
  13. package/src/lib/redux-connector/signal-redux-store.ts +54 -0
  14. package/src/lib/redux-connector/util.ts +22 -0
  15. package/src/lib/shared/empty.ts +2 -0
  16. package/src/lib/with-call-state.spec.ts +24 -0
  17. package/src/lib/with-call-state.ts +136 -0
  18. package/src/lib/with-data-service.ts +312 -0
  19. package/src/lib/with-devtools.spec.ts +157 -0
  20. package/src/lib/with-devtools.ts +128 -0
  21. package/src/lib/with-redux.spec.ts +100 -0
  22. package/src/lib/with-redux.ts +261 -0
  23. package/src/lib/with-storage-sync.spec.ts +237 -0
  24. package/src/lib/with-storage-sync.ts +160 -0
  25. package/src/lib/with-undo-redo.ts +184 -0
  26. package/src/test-setup.ts +8 -0
  27. package/tsconfig.json +29 -0
  28. package/tsconfig.lib.json +17 -0
  29. package/tsconfig.lib.prod.json +9 -0
  30. package/tsconfig.spec.json +16 -0
  31. package/esm2022/angular-architects-ngrx-toolkit.mjs +0 -5
  32. package/esm2022/index.mjs +0 -9
  33. package/esm2022/lib/assertions/assertions.mjs +0 -6
  34. package/esm2022/lib/redux-connector/create-redux.mjs +0 -41
  35. package/esm2022/lib/redux-connector/index.mjs +0 -2
  36. package/esm2022/lib/redux-connector/model.mjs +0 -2
  37. package/esm2022/lib/redux-connector/rxjs-interop/index.mjs +0 -2
  38. package/esm2022/lib/redux-connector/rxjs-interop/redux-method.mjs +0 -22
  39. package/esm2022/lib/redux-connector/signal-redux-store.mjs +0 -43
  40. package/esm2022/lib/redux-connector/util.mjs +0 -13
  41. package/esm2022/lib/shared/empty.mjs +0 -2
  42. package/esm2022/lib/with-call-state.mjs +0 -58
  43. package/esm2022/lib/with-data-service.mjs +0 -161
  44. package/esm2022/lib/with-devtools.mjs +0 -79
  45. package/esm2022/lib/with-redux.mjs +0 -95
  46. package/esm2022/lib/with-storage-sync.mjs +0 -56
  47. package/esm2022/lib/with-undo-redo.mjs +0 -93
  48. package/fesm2022/angular-architects-ngrx-toolkit.mjs +0 -653
  49. package/fesm2022/angular-architects-ngrx-toolkit.mjs.map +0 -1
  50. package/lib/assertions/assertions.d.ts +0 -2
  51. package/lib/redux-connector/create-redux.d.ts +0 -13
  52. package/lib/redux-connector/model.d.ts +0 -36
  53. package/lib/redux-connector/rxjs-interop/redux-method.d.ts +0 -11
  54. package/lib/redux-connector/signal-redux-store.d.ts +0 -11
  55. package/lib/redux-connector/util.d.ts +0 -5
  56. package/lib/shared/empty.d.ts +0 -1
  57. package/lib/with-call-state.d.ts +0 -56
  58. package/lib/with-data-service.d.ts +0 -115
  59. package/lib/with-devtools.d.ts +0 -32
  60. package/lib/with-redux.d.ts +0 -57
  61. package/lib/with-storage-sync.d.ts +0 -58
  62. package/lib/with-undo-redo.d.ts +0 -55
@@ -1,161 +0,0 @@
1
- import { computed, inject } from "@angular/core";
2
- import { patchState, signalStoreFeature, withComputed, withMethods, withState } from "@ngrx/signals";
3
- import { getCallStateKeys, setError, setLoaded, setLoading } from "./with-call-state";
4
- import { setAllEntities, addEntity, updateEntity, removeEntity } from "@ngrx/signals/entities";
5
- export function capitalize(str) {
6
- return str ? str[0].toUpperCase() + str.substring(1) : str;
7
- }
8
- export function getDataServiceKeys(options) {
9
- const filterKey = options.collection ? `${options.collection}Filter` : 'filter';
10
- const selectedIdsKey = options.collection ? `selected${capitalize(options.collection)}Ids` : 'selectedIds';
11
- const selectedEntitiesKey = options.collection ? `selected${capitalize(options.collection)}Entities` : 'selectedEntities';
12
- const updateFilterKey = options.collection ? `update${capitalize(options.collection)}Filter` : 'updateFilter';
13
- const updateSelectedKey = options.collection ? `updateSelected${capitalize(options.collection)}Entities` : 'updateSelected';
14
- const loadKey = options.collection ? `load${capitalize(options.collection)}Entities` : 'load';
15
- const currentKey = options.collection ? `current${capitalize(options.collection)}` : 'current';
16
- const loadByIdKey = options.collection ? `load${capitalize(options.collection)}ById` : 'loadById';
17
- const setCurrentKey = options.collection ? `setCurrent${capitalize(options.collection)}` : 'setCurrent';
18
- const createKey = options.collection ? `create${capitalize(options.collection)}` : 'create';
19
- const updateKey = options.collection ? `update${capitalize(options.collection)}` : 'update';
20
- const updateAllKey = options.collection ? `updateAll${capitalize(options.collection)}` : 'updateAll';
21
- const deleteKey = options.collection ? `delete${capitalize(options.collection)}` : 'delete';
22
- // TODO: Take these from @ngrx/signals/entities, when they are exported
23
- const entitiesKey = options.collection ? `${options.collection}Entities` : 'entities';
24
- const entityMapKey = options.collection ? `${options.collection}EntityMap` : 'entityMap';
25
- const idsKey = options.collection ? `${options.collection}Ids` : 'ids';
26
- return {
27
- filterKey,
28
- selectedIdsKey,
29
- selectedEntitiesKey,
30
- updateFilterKey,
31
- updateSelectedKey,
32
- loadKey,
33
- entitiesKey,
34
- entityMapKey,
35
- idsKey,
36
- currentKey,
37
- loadByIdKey,
38
- setCurrentKey,
39
- createKey,
40
- updateKey,
41
- updateAllKey,
42
- deleteKey
43
- };
44
- }
45
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
- export function withDataService(options) {
47
- const { dataServiceType, filter, collection: prefix } = options;
48
- const { entitiesKey, filterKey, loadKey, selectedEntitiesKey, selectedIdsKey, updateFilterKey, updateSelectedKey, currentKey, createKey, updateKey, updateAllKey, deleteKey, loadByIdKey, setCurrentKey } = getDataServiceKeys(options);
49
- const { callStateKey } = getCallStateKeys({ collection: prefix });
50
- return signalStoreFeature(withState(() => ({
51
- [filterKey]: filter,
52
- [selectedIdsKey]: {},
53
- [currentKey]: undefined
54
- })), withComputed((store) => {
55
- const entities = store[entitiesKey];
56
- const selectedIds = store[selectedIdsKey];
57
- return {
58
- [selectedEntitiesKey]: computed(() => entities().filter(e => selectedIds()[e.id]))
59
- };
60
- }), withMethods((store) => {
61
- const dataService = inject(dataServiceType);
62
- return {
63
- [updateFilterKey]: (filter) => {
64
- patchState(store, { [filterKey]: filter });
65
- },
66
- [updateSelectedKey]: (id, selected) => {
67
- patchState(store, (state) => ({
68
- [selectedIdsKey]: {
69
- ...state[selectedIdsKey],
70
- [id]: selected,
71
- }
72
- }));
73
- },
74
- [loadKey]: async () => {
75
- const filter = store[filterKey];
76
- store[callStateKey] && patchState(store, setLoading(prefix));
77
- try {
78
- const result = await dataService.load(filter());
79
- patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));
80
- store[callStateKey] && patchState(store, setLoaded(prefix));
81
- }
82
- catch (e) {
83
- store[callStateKey] && patchState(store, setError(e, prefix));
84
- throw e;
85
- }
86
- },
87
- [loadByIdKey]: async (id) => {
88
- store[callStateKey] && patchState(store, setLoading(prefix));
89
- try {
90
- const current = await dataService.loadById(id);
91
- store[callStateKey] && patchState(store, setLoaded(prefix));
92
- patchState(store, { [currentKey]: current });
93
- }
94
- catch (e) {
95
- store[callStateKey] && patchState(store, setError(e, prefix));
96
- throw e;
97
- }
98
- },
99
- [setCurrentKey]: (current) => {
100
- patchState(store, { [currentKey]: current });
101
- },
102
- [createKey]: async (entity) => {
103
- patchState(store, { [currentKey]: entity });
104
- store[callStateKey] && patchState(store, setLoading(prefix));
105
- try {
106
- const created = await dataService.create(entity);
107
- patchState(store, { [currentKey]: created });
108
- patchState(store, prefix ? addEntity(created, { collection: prefix }) : addEntity(created));
109
- store[callStateKey] && patchState(store, setLoaded(prefix));
110
- }
111
- catch (e) {
112
- store[callStateKey] && patchState(store, setError(e, prefix));
113
- throw e;
114
- }
115
- },
116
- [updateKey]: async (entity) => {
117
- patchState(store, { [currentKey]: entity });
118
- store[callStateKey] && patchState(store, setLoading(prefix));
119
- try {
120
- const updated = await dataService.update(entity);
121
- patchState(store, { [currentKey]: updated });
122
- // Why do we need this cast to Partial<Entity>?
123
- const updateArg = { id: updated.id, changes: updated };
124
- patchState(store, prefix ? updateEntity(updateArg, { collection: prefix }) : updateEntity(updateArg));
125
- store[callStateKey] && patchState(store, setLoaded(prefix));
126
- }
127
- catch (e) {
128
- store[callStateKey] && patchState(store, setError(e, prefix));
129
- throw e;
130
- }
131
- },
132
- [updateAllKey]: async (entities) => {
133
- store[callStateKey] && patchState(store, setLoading(prefix));
134
- try {
135
- const result = await dataService.updateAll(entities);
136
- patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));
137
- store[callStateKey] && patchState(store, setLoaded(prefix));
138
- }
139
- catch (e) {
140
- store[callStateKey] && patchState(store, setError(e, prefix));
141
- throw e;
142
- }
143
- },
144
- [deleteKey]: async (entity) => {
145
- patchState(store, { [currentKey]: entity });
146
- store[callStateKey] && patchState(store, setLoading(prefix));
147
- try {
148
- await dataService.delete(entity);
149
- patchState(store, { [currentKey]: undefined });
150
- patchState(store, prefix ? removeEntity(entity.id, { collection: prefix }) : removeEntity(entity.id));
151
- store[callStateKey] && patchState(store, setLoaded(prefix));
152
- }
153
- catch (e) {
154
- store[callStateKey] && patchState(store, setError(e, prefix));
155
- throw e;
156
- }
157
- },
158
- };
159
- }));
160
- }
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kYXRhLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3dpdGgtZGF0YS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBeUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQXNCLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SCxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFZLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFpQnpHLE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBVztJQUNsQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQWdDO0lBQy9ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDaEYsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUMzRyxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENB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LENBQUM7b0JBQzlELE1BQU0sQ0FBQyxDQUFDO2lCQUNYO1lBQ0wsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3ZpZGVyVG9rZW4sIFNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTaWduYWxTdG9yZUZlYXR1cmUsIHBhdGNoU3RhdGUsIHNpZ25hbFN0b3JlRmVhdHVyZSwgd2l0aENvbXB1dGVkLCB3aXRoTWV0aG9kcywgd2l0aFN0YXRlIH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHNcIjtcbmltcG9ydCB7IENhbGxTdGF0ZSwgZ2V0Q2FsbFN0YXRlS2V5cywgc2V0RXJyb3IsIHNldExvYWRlZCwgc2V0TG9hZGluZyB9IGZyb20gXCIuL3dpdGgtY2FsbC1zdGF0ZVwiO1xuaW1wb3J0IHsgc2V0QWxsRW50aXRpZXMsIEVudGl0eUlkLCBhZGRFbnRpdHksIHVwZGF0ZUVudGl0eSwgcmVtb3ZlRW50aXR5IH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHMvZW50aXRpZXNcIjtcbmltcG9ydCB7IEVudGl0eVN0YXRlLCBOYW1lZEVudGl0eVNpZ25hbHMgfSBmcm9tIFwiQG5ncngvc2lnbmFscy9lbnRpdGllcy9zcmMvbW9kZWxzXCI7XG5pbXBvcnQgeyBTdGF0ZVNpZ25hbCB9IGZyb20gXCJAbmdyeC9zaWduYWxzL3NyYy9zdGF0ZS1zaWduYWxcIjtcbmltcG9ydCB7IEVtdHB5IH0gZnJvbSBcIi4vc2hhcmVkL2VtcHR5XCI7XG5cbmV4cG9ydCB0eXBlIEZpbHRlciA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuZXhwb3J0IHR5cGUgRW50aXR5ID0geyBpZDogRW50aXR5SWQgfTtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhU2VydmljZTxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPiB7XG4gICAgbG9hZChmaWx0ZXI6IEYpOiBQcm9taXNlPEVbXT47XG4gICAgbG9hZEJ5SWQoaWQ6IEVudGl0eUlkKTogUHJvbWlzZTxFPjtcbiAgICBjcmVhdGUoZW50aXR5OiBFKTogUHJvbWlzZTxFPjtcbiAgICB1cGRhdGUoZW50aXR5OiBFKTogUHJvbWlzZTxFPjtcbiAgICB1cGRhdGVBbGwoZW50aXR5OiBFW10pOiBQcm9taXNlPEVbXT47XG4gICAgZGVsZXRlKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyID8gc3RyWzBdLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpIDogc3RyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YVNlcnZpY2VLZXlzKG9wdGlvbnM6IHsgY29sbGVjdGlvbj86IHN0cmluZyB9KSB7XG4gICAgY29uc3QgZmlsdGVyS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUZpbHRlcmAgOiAnZmlsdGVyJztcbiAgICBjb25zdCBzZWxlY3RlZElkc0tleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGBzZWxlY3RlZCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUlkc2AgOiAnc2VsZWN0ZWRJZHMnO1xuICAgIGNvbnN0IHNlbGVjdGVkRW50aXRpZXNLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgc2VsZWN0ZWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1FbnRpdGllc2AgOiAnc2VsZWN0ZWRFbnRpdGllcyc7XG5cbiAgICBjb25zdCB1cGRhdGVGaWx0ZXJLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgdXBkYXRlJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9RmlsdGVyYCA6ICd1cGRhdGVGaWx0ZXInO1xuICAgIGNvbnN0IHVwZGF0ZVNlbGVjdGVkS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZVNlbGVjdGVkJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9RW50aXRpZXNgIDogJ3VwZGF0ZVNlbGVjdGVkJztcbiAgICBjb25zdCBsb2FkS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYGxvYWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1FbnRpdGllc2AgOiAnbG9hZCc7XG5cbiAgICBjb25zdCBjdXJyZW50S2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYGN1cnJlbnQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1gIDogJ2N1cnJlbnQnO1xuICAgIGNvbnN0IGxvYWRCeUlkS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYGxvYWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1CeUlkYCA6ICdsb2FkQnlJZCc7XG4gICAgY29uc3Qgc2V0Q3VycmVudEtleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGBzZXRDdXJyZW50JHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9YCA6ICdzZXRDdXJyZW50JztcbiAgICBjb25zdCBjcmVhdGVLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgY3JlYXRlJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9YCA6ICdjcmVhdGUnO1xuICAgIGNvbnN0IHVwZGF0ZUtleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGB1cGRhdGUke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1gIDogJ3VwZGF0ZSc7XG4gICAgY29uc3QgdXBkYXRlQWxsS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZUFsbCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfWAgOiAndXBkYXRlQWxsJztcbiAgICBjb25zdCBkZWxldGVLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgZGVsZXRlJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9YCA6ICdkZWxldGUnO1xuXG4gICAgLy8gVE9ETzogVGFrZSB0aGVzZSBmcm9tIEBuZ3J4L3NpZ25hbHMvZW50aXRpZXMsIHdoZW4gdGhleSBhcmUgZXhwb3J0ZWRcbiAgICBjb25zdCBlbnRpdGllc0tleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGAke29wdGlvbnMuY29sbGVjdGlvbn1FbnRpdGllc2AgOiAnZW50aXRpZXMnO1xuICAgIGNvbnN0IGVudGl0eU1hcEtleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGAke29wdGlvbnMuY29sbGVjdGlvbn1FbnRpdHlNYXBgIDogJ2VudGl0eU1hcCc7XG4gICAgY29uc3QgaWRzS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUlkc2AgOiAnaWRzJztcblxuICAgIHJldHVybiB7XG4gICAgICAgIGZpbHRlcktleSxcbiAgICAgICAgc2VsZWN0ZWRJZHNLZXksXG4gICAgICAgIHNlbGVjdGVkRW50aXRpZXNLZXksXG4gICAgICAgIHVwZGF0ZUZpbHRlcktleSxcbiAgICAgICAgdXBkYXRlU2VsZWN0ZWRLZXksXG4gICAgICAgIGxvYWRLZXksXG4gICAgICAgIGVudGl0aWVzS2V5LFxuICAgICAgICBlbnRpdHlNYXBLZXksXG4gICAgICAgIGlkc0tleSxcblxuICAgICAgICBjdXJyZW50S2V5LFxuICAgICAgICBsb2FkQnlJZEtleSxcbiAgICAgICAgc2V0Q3VycmVudEtleSxcbiAgICAgICAgY3JlYXRlS2V5LFxuICAgICAgICB1cGRhdGVLZXksXG4gICAgICAgIHVwZGF0ZUFsbEtleSxcbiAgICAgICAgZGVsZXRlS2V5XG4gICAgfTtcbn1cblxuZXhwb3J0IHR5cGUgTmFtZWREYXRhU2VydmljZVN0YXRlPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXIsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+ID1cbiAgICB7XG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYCR7S31GaWx0ZXJgXTogRjtcbiAgICB9ICYge1xuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBzZWxlY3RlZCR7Q2FwaXRhbGl6ZTxLPn1JZHNgXTogUmVjb3JkPEVudGl0eUlkLCBib29sZWFuPjtcbiAgICB9ICYge1xuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBjdXJyZW50JHtDYXBpdGFsaXplPEs+fWBdOiBFO1xuICAgIH1cblxuZXhwb3J0IHR5cGUgRGF0YVNlcnZpY2VTdGF0ZTxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPiA9IHtcbiAgICBmaWx0ZXI6IEY7XG4gICAgc2VsZWN0ZWRJZHM6IFJlY29yZDxFbnRpdHlJZCwgYm9vbGVhbj47XG4gICAgY3VycmVudDogRTtcbn1cblxuZXhwb3J0IHR5cGUgTmFtZWREYXRhU2VydmljZVNpZ25hbHM8RSBleHRlbmRzIEVudGl0eSwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4gPVxuICAgIHtcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgc2VsZWN0ZWQke0NhcGl0YWxpemU8Sz59RW50aXRpZXNgXTogU2lnbmFsPEVbXT47XG4gICAgfVxuXG5leHBvcnQgdHlwZSBEYXRhU2VydmljZVNpZ25hbHM8RSBleHRlbmRzIEVudGl0eT4gPVxuICAgIHtcbiAgICAgICAgc2VsZWN0ZWRFbnRpdGllczogU2lnbmFsPEVbXT47XG4gICAgfVxuXG5leHBvcnQgdHlwZSBOYW1lZERhdGFTZXJ2aWNlTWV0aG9kczxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyLCBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPiA9XG4gICAge1xuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGB1cGRhdGUke0NhcGl0YWxpemU8Sz59RmlsdGVyYF06IChmaWx0ZXI6IEYpID0+IHZvaWQ7XG4gICAgfSAmXG4gICAge1xuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGB1cGRhdGVTZWxlY3RlZCR7Q2FwaXRhbGl6ZTxLPn1FbnRpdGllc2BdOiAoaWQ6IEVudGl0eUlkLCBzZWxlY3RlZDogYm9vbGVhbikgPT4gdm9pZDtcbiAgICB9ICZcbiAgICB7XG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYGxvYWQke0NhcGl0YWxpemU8Sz59RW50aXRpZXNgXTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB9ICZcblxuICAgIHtcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgc2V0Q3VycmVudCR7Q2FwaXRhbGl6ZTxLPn1gXTogKGVudGl0eTogRSkgPT4gdm9pZDtcbiAgICB9ICZcbiAgICB7XG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYGxvYWQke0NhcGl0YWxpemU8Sz59QnlJZGBdOiAoaWQ6IEVudGl0eUlkKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIH0gJlxuICAgIHtcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgY3JlYXRlJHtDYXBpdGFsaXplPEs+fWBdOiAoZW50aXR5OiBFKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIH0gJlxuICAgIHtcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgdXBkYXRlJHtDYXBpdGFsaXplPEs+fWBdOiAoZW50aXR5OiBFKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIH0gJlxuICAgIHtcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgdXBkYXRlQWxsJHtDYXBpdGFsaXplPEs+fWBdOiAoZW50aXR5OiBFW10pID0+IFByb21pc2U8dm9pZD47XG4gICAgfSAmXG4gICAge1xuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBkZWxldGUke0NhcGl0YWxpemU8Sz59YF06IChlbnRpdHk6IEUpID0+IFByb21pc2U8dm9pZD47XG4gICAgfTtcblxuXG5leHBvcnQgdHlwZSBEYXRhU2VydmljZU1ldGhvZHM8RSBleHRlbmRzIEVudGl0eSwgRiBleHRlbmRzIEZpbHRlcj4gPVxuICAgIHtcbiAgICAgICAgdXBkYXRlRmlsdGVyOiAoZmlsdGVyOiBGKSA9PiB2b2lkO1xuICAgICAgICB1cGRhdGVTZWxlY3RlZDogKGlkOiBFbnRpdHlJZCwgc2VsZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgICAgIGxvYWQ6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgICAgICAgc2V0Q3VycmVudChlbnRpdHk6IEUpOiB2b2lkO1xuICAgICAgICBsb2FkQnlJZChpZDogRW50aXR5SWQpOiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICBjcmVhdGUoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPjtcbiAgICAgICAgdXBkYXRlKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD47XG4gICAgICAgIHVwZGF0ZUFsbChlbnRpdGllczogRVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgICAgICAgZGVsZXRlKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD47XG4gICAgfVxuXG5leHBvcnQgdHlwZSBFbXB0eSA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPlxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aERhdGFTZXJ2aWNlPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXIsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KG9wdGlvbnM6IHsgZGF0YVNlcnZpY2VUeXBlOiBQcm92aWRlclRva2VuPERhdGFTZXJ2aWNlPEUsIEY+PiwgZmlsdGVyOiBGLCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uIH0pOiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAge1xuICAgICAgICBzdGF0ZTogRW10cHksXG4gICAgICAgIC8vIFRoZXNlIGFsdGVybmF0aXZlcyBicmVhayB0eXBlIGluZmVyZW5jZTpcbiAgICAgICAgLy8gc3RhdGU6IHsgY2FsbFN0YXRlOiBDYWxsU3RhdGUgfSAmIE5hbWVkRW50aXR5U3RhdGU8RSwgQ29sbGVjdGlvbj4sXG4gICAgICAgIC8vIHN0YXRlOiBOYW1lZEVudGl0eVN0YXRlPEUsIENvbGxlY3Rpb24+LFxuXG4gICAgICAgIHNpZ25hbHM6IE5hbWVkRW50aXR5U2lnbmFsczxFLCBDb2xsZWN0aW9uPixcbiAgICAgICAgbWV0aG9kczogRW10cHksXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHN0YXRlOiBOYW1lZERhdGFTZXJ2aWNlU3RhdGU8RSwgRiwgQ29sbGVjdGlvbj5cbiAgICAgICAgc2lnbmFsczogTmFtZWREYXRhU2VydmljZVNpZ25hbHM8RSwgQ29sbGVjdGlvbj5cbiAgICAgICAgbWV0aG9kczogTmFtZWREYXRhU2VydmljZU1ldGhvZHM8RSwgRiwgQ29sbGVjdGlvbj5cbiAgICB9XG4+O1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEYXRhU2VydmljZTxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPihvcHRpb25zOiB7IGRhdGFTZXJ2aWNlVHlwZTogUHJvdmlkZXJUb2tlbjxEYXRhU2VydmljZTxFLCBGPj4sIGZpbHRlcjogRiB9KTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICAgIHtcbiAgICAgICAgc3RhdGU6IHsgY2FsbFN0YXRlOiBDYWxsU3RhdGUgfSAmIEVudGl0eVN0YXRlPEU+XG4gICAgICAgIHNpZ25hbHM6IEVtdHB5LFxuICAgICAgICBtZXRob2RzOiBFbXRweSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgc3RhdGU6IERhdGFTZXJ2aWNlU3RhdGU8RSwgRj5cbiAgICAgICAgc2lnbmFsczogRGF0YVNlcnZpY2VTaWduYWxzPEU+XG4gICAgICAgIG1ldGhvZHM6IERhdGFTZXJ2aWNlTWV0aG9kczxFLCBGPlxuICAgIH0+O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEYXRhU2VydmljZTxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyLCBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPihvcHRpb25zOiB7IGRhdGFTZXJ2aWNlVHlwZTogUHJvdmlkZXJUb2tlbjxEYXRhU2VydmljZTxFLCBGPj4sIGZpbHRlcjogRiwgY29sbGVjdGlvbj86IENvbGxlY3Rpb24gfSk6IFNpZ25hbFN0b3JlRmVhdHVyZTxhbnksIGFueT4ge1xuICAgIGNvbnN0IHsgZGF0YVNlcnZpY2VUeXBlLCBmaWx0ZXIsIGNvbGxlY3Rpb246IHByZWZpeCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7XG4gICAgICAgIGVudGl0aWVzS2V5LFxuICAgICAgICBmaWx0ZXJLZXksXG4gICAgICAgIGxvYWRLZXksXG4gICAgICAgIHNlbGVjdGVkRW50aXRpZXNLZXksXG4gICAgICAgIHNlbGVjdGVkSWRzS2V5LFxuICAgICAgICB1cGRhdGVGaWx0ZXJLZXksXG4gICAgICAgIHVwZGF0ZVNlbGVjdGVkS2V5LFxuXG4gICAgICAgIGN1cnJlbnRLZXksXG4gICAgICAgIGNyZWF0ZUtleSxcbiAgICAgICAgdXBkYXRlS2V5LFxuICAgICAgICB1cGRhdGVBbGxLZXksXG4gICAgICAgIGRlbGV0ZUtleSxcbiAgICAgICAgbG9hZEJ5SWRLZXksXG4gICAgICAgIHNldEN1cnJlbnRLZXlcbiAgICB9ID0gZ2V0RGF0YVNlcnZpY2VLZXlzKG9wdGlvbnMpO1xuXG4gICAgY29uc3QgeyBjYWxsU3RhdGVLZXkgfSA9IGdldENhbGxTdGF0ZUtleXMoeyBjb2xsZWN0aW9uOiBwcmVmaXggfSk7XG5cbiAgICByZXR1cm4gc2lnbmFsU3RvcmVGZWF0dXJlKFxuICAgICAgICB3aXRoU3RhdGUoKCkgPT4gKHtcbiAgICAgICAgICAgIFtmaWx0ZXJLZXldOiBmaWx0ZXIsXG4gICAgICAgICAgICBbc2VsZWN0ZWRJZHNLZXldOiB7fSBhcyBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+LFxuICAgICAgICAgICAgW2N1cnJlbnRLZXldOiB1bmRlZmluZWQgYXMgRSB8IHVuZGVmaW5lZFxuICAgICAgICB9KSksXG4gICAgICAgIHdpdGhDb21wdXRlZCgoc3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdGllcyA9IHN0b3JlW2VudGl0aWVzS2V5XSBhcyBTaWduYWw8RVtdPjtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gc3RvcmVbc2VsZWN0ZWRJZHNLZXldIGFzIFNpZ25hbDxSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+PjtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRFbnRpdGllc0tleV06IGNvbXB1dGVkKCgpID0+IGVudGl0aWVzKCkuZmlsdGVyKGUgPT4gc2VsZWN0ZWRJZHMoKVtlLmlkXSkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICB3aXRoTWV0aG9kcygoc3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgU3RhdGVTaWduYWw8b2JqZWN0PikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YVNlcnZpY2UgPSBpbmplY3QoZGF0YVNlcnZpY2VUeXBlKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBbdXBkYXRlRmlsdGVyS2V5XTogKGZpbHRlcjogRik6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtmaWx0ZXJLZXldOiBmaWx0ZXIgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbdXBkYXRlU2VsZWN0ZWRLZXldOiAoaWQ6IEVudGl0eUlkLCBzZWxlY3RlZDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkSWRzS2V5XToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlW3NlbGVjdGVkSWRzS2V5XSBhcyBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF06IHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbbG9hZEtleV06IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gc3RvcmVbZmlsdGVyS2V5XSBhcyBTaWduYWw8Rj47XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGluZyhwcmVmaXgpKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGF0YVNlcnZpY2UubG9hZChmaWx0ZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBwcmVmaXggPyBzZXRBbGxFbnRpdGllcyhyZXN1bHQsIHsgY29sbGVjdGlvbjogcHJlZml4IH0pIDogc2V0QWxsRW50aXRpZXMocmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRlZChwcmVmaXgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtsb2FkQnlJZEtleV06IGFzeW5jIChpZDogRW50aXR5SWQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkaW5nKHByZWZpeCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgZGF0YVNlcnZpY2UubG9hZEJ5SWQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogY3VycmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtzZXRDdXJyZW50S2V5XTogKGN1cnJlbnQ6IEUpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGN1cnJlbnQgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbY3JlYXRlS2V5XTogYXN5bmMgKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogZW50aXR5IH0pO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBkYXRhU2VydmljZS5jcmVhdGUoZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiBjcmVhdGVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgcHJlZml4ID8gYWRkRW50aXR5KGNyZWF0ZWQsIHsgY29sbGVjdGlvbjogcHJlZml4IH0pIDogYWRkRW50aXR5KGNyZWF0ZWQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGVkKHByZWZpeCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldEVycm9yKGUsIHByZWZpeCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW3VwZGF0ZUtleV06IGFzeW5jIChlbnRpdHk6IEUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGVudGl0eSB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkaW5nKHByZWZpeCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgZGF0YVNlcnZpY2UudXBkYXRlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogdXBkYXRlZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoeSBkbyB3ZSBuZWVkIHRoaXMgY2FzdCB0byBQYXJ0aWFsPEVudGl0eT4/XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVBcmcgPSB7IGlkOiB1cGRhdGVkLmlkLCBjaGFuZ2VzOiB1cGRhdGVkIGFzIFBhcnRpYWw8RW50aXR5PiB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgcHJlZml4ID8gdXBkYXRlRW50aXR5KHVwZGF0ZUFyZywgeyBjb2xsZWN0aW9uOiBwcmVmaXggfSkgOiB1cGRhdGVFbnRpdHkodXBkYXRlQXJnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRlZChwcmVmaXgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFt1cGRhdGVBbGxLZXldOiBhc3luYyAoZW50aXRpZXM6IEVbXSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkaW5nKHByZWZpeCkpO1xuXG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYXRhU2VydmljZS51cGRhdGVBbGwoZW50aXRpZXMpO1xuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBwcmVmaXggPyBzZXRBbGxFbnRpdGllcyhyZXN1bHQsIHsgY29sbGVjdGlvbjogcHJlZml4IH0pIDogc2V0QWxsRW50aXRpZXMocmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGVkKHByZWZpeCkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtkZWxldGVLZXldOiBhc3luYyAoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiBlbnRpdHkgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGluZyhwcmVmaXgpKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGF0YVNlcnZpY2UuZGVsZXRlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgcHJlZml4ID8gcmVtb3ZlRW50aXR5KGVudGl0eS5pZCwgeyBjb2xsZWN0aW9uOiBwcmVmaXggfSkgOiByZW1vdmVFbnRpdHkoZW50aXR5LmlkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRlZChwcmVmaXgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICApO1xufVxuIl19
@@ -1,79 +0,0 @@
1
- import { patchState as originalPatchState, } from '@ngrx/signals';
2
- import { effect, inject, PLATFORM_ID, signal } from '@angular/core';
3
- import { isPlatformServer } from '@angular/common';
4
- const storeRegistry = signal({});
5
- let currentActionNames = new Set();
6
- let synchronizationInitialized = false;
7
- function initSynchronization() {
8
- effect(() => {
9
- if (!connection) {
10
- return;
11
- }
12
- const stores = storeRegistry();
13
- const rootState = {};
14
- for (const name in stores) {
15
- const store = stores[name];
16
- rootState[name] = store();
17
- }
18
- const names = Array.from(currentActionNames);
19
- const type = names.length ? names.join(', ') : 'Store Update';
20
- currentActionNames = new Set();
21
- connection.send({ type }, rootState);
22
- });
23
- }
24
- function getValueFromSymbol(obj, symbol) {
25
- if (typeof obj === 'object' && obj && symbol in obj) {
26
- return obj[symbol];
27
- }
28
- }
29
- function getStoreSignal(store) {
30
- const [signalStateKey] = Object.getOwnPropertySymbols(store);
31
- if (!signalStateKey) {
32
- throw new Error('Cannot find State Signal');
33
- }
34
- return getValueFromSymbol(store, signalStateKey);
35
- }
36
- let connection;
37
- /**
38
- * required for testing. is not exported during build
39
- */
40
- export function reset() {
41
- connection = undefined;
42
- synchronizationInitialized = false;
43
- storeRegistry.set({});
44
- }
45
- /**
46
- * @param name store's name as it should appear in the DevTools
47
- */
48
- export function withDevtools(name) {
49
- return (store) => {
50
- const isServer = isPlatformServer(inject(PLATFORM_ID));
51
- if (isServer) {
52
- return store;
53
- }
54
- const extensions = window.__REDUX_DEVTOOLS_EXTENSION__;
55
- if (!extensions) {
56
- return store;
57
- }
58
- if (!connection) {
59
- connection = extensions.connect({
60
- name: 'NgRx Signal Store',
61
- });
62
- }
63
- const storeSignal = getStoreSignal(store);
64
- storeRegistry.update((value) => ({
65
- ...value,
66
- [name]: storeSignal,
67
- }));
68
- if (!synchronizationInitialized) {
69
- initSynchronization();
70
- synchronizationInitialized = true;
71
- }
72
- return store;
73
- };
74
- }
75
- export const patchState = (state, action, ...rest) => {
76
- currentActionNames.add(action);
77
- return originalPatchState(state, ...rest);
78
- };
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kZXZ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvd2l0aC1kZXZ0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxJQUFJLGtCQUFrQixHQUVqQyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBaUJuRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQWtDLEVBQUUsQ0FBQyxDQUFDO0FBRWxFLElBQUksa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUUzQyxJQUFJLDBCQUEwQixHQUFHLEtBQUssQ0FBQztBQUV2QyxTQUFTLG1CQUFtQjtJQUMxQixNQUFNLENBQUMsR0FBRyxFQUFFO1FBQ1YsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE9BQU87U0FDUjtRQUVELE1BQU0sTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sU0FBUyxHQUE0QixFQUFFLENBQUM7UUFDOUMsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLEVBQUU7WUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztTQUMzQjtRQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDOUQsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUV2QyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsTUFBYztJQUN0RCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRTtRQUNuRCxPQUFRLEdBQThCLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDaEQ7QUFDSCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBYztJQUNwQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUtELElBQUksVUFBdUMsQ0FBQztBQUU1Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxLQUFLO0lBQ25CLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDdkIsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsSUFBWTtJQUVaLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNmLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksUUFBUSxFQUFFO1lBQ1osT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztnQkFDOUIsSUFBSSxFQUFFLG1CQUFtQjthQUMxQixDQUFDLENBQUM7U0FDSjtRQUVELE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLEdBQUcsS0FBSztZQUNSLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVztTQUNwQixDQUFDLENBQUMsQ0FBQztRQUVKLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUMvQixtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLDBCQUEwQixHQUFHLElBQUksQ0FBQztTQUNuQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVNELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBWSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRTtJQUM1RCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBwYXRjaFN0YXRlIGFzIG9yaWdpbmFsUGF0Y2hTdGF0ZSxcbiAgU2lnbmFsU3RvcmVGZWF0dXJlLFxufSBmcm9tICdAbmdyeC9zaWduYWxzJztcbmltcG9ydCB7IFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCB9IGZyb20gJ0BuZ3J4L3NpZ25hbHMvc3JjL3NpZ25hbC1zdG9yZS1tb2RlbHMnO1xuaW1wb3J0IHsgZWZmZWN0LCBpbmplY3QsIFBMQVRGT1JNX0lELCBzaWduYWwsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXzpcbiAgICAgIHwge1xuICAgICAgICAgIGNvbm5lY3Q6IChvcHRpb25zOiB7IG5hbWU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICBzZW5kOiAoYWN0aW9uOiBBY3Rpb24sIHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxufVxuXG50eXBlIEVtcHR5RmVhdHVyZVJlc3VsdCA9IHsgc3RhdGU6IHt9OyBzaWduYWxzOiB7fTsgbWV0aG9kczoge30gfTtcbmV4cG9ydCB0eXBlIEFjdGlvbiA9IHsgdHlwZTogc3RyaW5nIH07XG5cbmNvbnN0IHN0b3JlUmVnaXN0cnkgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oe30pO1xuXG5sZXQgY3VycmVudEFjdGlvbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmxldCBzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpbml0U3luY2hyb25pemF0aW9uKCkge1xuICBlZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlcyA9IHN0b3JlUmVnaXN0cnkoKTtcbiAgICBjb25zdCByb290U3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBuYW1lIGluIHN0b3Jlcykge1xuICAgICAgY29uc3Qgc3RvcmUgPSBzdG9yZXNbbmFtZV07XG4gICAgICByb290U3RhdGVbbmFtZV0gPSBzdG9yZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuZnJvbShjdXJyZW50QWN0aW9uTmFtZXMpO1xuICAgIGNvbnN0IHR5cGUgPSBuYW1lcy5sZW5ndGggPyBuYW1lcy5qb2luKCcsICcpIDogJ1N0b3JlIFVwZGF0ZSc7XG4gICAgY3VycmVudEFjdGlvbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25uZWN0aW9uLnNlbmQoeyB0eXBlIH0sIHJvb3RTdGF0ZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZUZyb21TeW1ib2wob2JqOiB1bmtub3duLCBzeW1ib2w6IHN5bWJvbCkge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICYmIHN5bWJvbCBpbiBvYmopIHtcbiAgICByZXR1cm4gKG9iaiBhcyB7IFtrZXk6IHN5bWJvbF06IGFueSB9KVtzeW1ib2xdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0b3JlU2lnbmFsKHN0b3JlOiB1bmtub3duKTogU2lnbmFsPHVua25vd24+IHtcbiAgY29uc3QgW3NpZ25hbFN0YXRlS2V5XSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc3RvcmUpO1xuICBpZiAoIXNpZ25hbFN0YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBTdGF0ZSBTaWduYWwnKTtcbiAgfVxuXG4gIHJldHVybiBnZXRWYWx1ZUZyb21TeW1ib2woc3RvcmUsIHNpZ25hbFN0YXRlS2V5KTtcbn1cblxudHlwZSBDb25uZWN0UmVzcG9uc2UgPSB7XG4gIHNlbmQ6IChhY3Rpb246IEFjdGlvbiwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xufTtcbmxldCBjb25uZWN0aW9uOiBDb25uZWN0UmVzcG9uc2UgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogcmVxdWlyZWQgZm9yIHRlc3RpbmcuIGlzIG5vdCBleHBvcnRlZCBkdXJpbmcgYnVpbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0KCkge1xuICBjb25uZWN0aW9uID0gdW5kZWZpbmVkO1xuICBzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCA9IGZhbHNlO1xuICBzdG9yZVJlZ2lzdHJ5LnNldCh7fSk7XG59XG5cbi8qKlxuICogQHBhcmFtIG5hbWUgc3RvcmUncyBuYW1lIGFzIGl0IHNob3VsZCBhcHBlYXIgaW4gdGhlIERldlRvb2xzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGV2dG9vbHM8SW5wdXQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQ+KFxuICBuYW1lOiBzdHJpbmdcbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxJbnB1dCwgRW1wdHlGZWF0dXJlUmVzdWx0PiB7XG4gIHJldHVybiAoc3RvcmUpID0+IHtcbiAgICBjb25zdCBpc1NlcnZlciA9IGlzUGxhdGZvcm1TZXJ2ZXIoaW5qZWN0KFBMQVRGT1JNX0lEKSk7XG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICByZXR1cm4gc3RvcmU7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fO1xuICAgIGlmICghZXh0ZW5zaW9ucykge1xuICAgICAgcmV0dXJuIHN0b3JlO1xuICAgIH1cblxuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgY29ubmVjdGlvbiA9IGV4dGVuc2lvbnMuY29ubmVjdCh7XG4gICAgICAgIG5hbWU6ICdOZ1J4IFNpZ25hbCBTdG9yZScsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZVNpZ25hbCA9IGdldFN0b3JlU2lnbmFsKHN0b3JlKTtcbiAgICBzdG9yZVJlZ2lzdHJ5LnVwZGF0ZSgodmFsdWUpID0+ICh7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIFtuYW1lXTogc3RvcmVTaWduYWwsXG4gICAgfSkpO1xuXG4gICAgaWYgKCFzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCkge1xuICAgICAgaW5pdFN5bmNocm9uaXphdGlvbigpO1xuICAgICAgc3luY2hyb25pemF0aW9uSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdG9yZTtcbiAgfTtcbn1cblxudHlwZSBQYXRjaEZuID0gdHlwZW9mIG9yaWdpbmFsUGF0Y2hTdGF0ZSBleHRlbmRzIChcbiAgYXJnMTogaW5mZXIgRmlyc3QsXG4gIC4uLmFyZ3M6IGluZmVyIFJlc3RcbikgPT4gaW5mZXIgUmV0dXJuZXJcbiAgPyAoc3RhdGU6IEZpcnN0LCBhY3Rpb246IHN0cmluZywgLi4ucmVzdDogUmVzdCkgPT4gUmV0dXJuZXJcbiAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IHBhdGNoU3RhdGU6IFBhdGNoRm4gPSAoc3RhdGUsIGFjdGlvbiwgLi4ucmVzdCkgPT4ge1xuICBjdXJyZW50QWN0aW9uTmFtZXMuYWRkKGFjdGlvbik7XG4gIHJldHVybiBvcmlnaW5hbFBhdGNoU3RhdGUoc3RhdGUsIC4uLnJlc3QpO1xufTtcbiJdfQ==
@@ -1,95 +0,0 @@
1
- import { Subject } from 'rxjs';
2
- import { assertActionFnSpecs } from './assertions/assertions';
3
- export function payload() {
4
- return {};
5
- }
6
- export const noPayload = {};
7
- function createActionFns(actionFnSpecs, reducerRegistry, effectsRegistry, state) {
8
- const actionFns = {};
9
- for (const type in actionFnSpecs) {
10
- const actionFn = (payload) => {
11
- const fullPayload = { ...payload, type };
12
- const reducer = reducerRegistry[type];
13
- if (reducer) {
14
- reducer(state, fullPayload);
15
- }
16
- const effectSubject = effectsRegistry[type];
17
- if (effectSubject) {
18
- effectSubject.next(fullPayload);
19
- }
20
- return fullPayload;
21
- };
22
- actionFn.type = type.toString();
23
- actionFns[type] = actionFn;
24
- }
25
- return actionFns;
26
- }
27
- function createPublicAndAllActionsFns(actionFnSpecs, reducerRegistry, effectsRegistry, state) {
28
- if ('public' in actionFnSpecs || 'private' in actionFnSpecs) {
29
- const privates = actionFnSpecs['private'] || {};
30
- const publics = actionFnSpecs['public'] || {};
31
- assertActionFnSpecs(privates);
32
- assertActionFnSpecs(publics);
33
- const privateActionFns = createActionFns(privates, reducerRegistry, effectsRegistry, state);
34
- const publicActionFns = createActionFns(publics, reducerRegistry, effectsRegistry, state);
35
- return {
36
- all: { ...privateActionFns, ...publicActionFns },
37
- publics: publicActionFns,
38
- };
39
- }
40
- const actionFns = createActionFns(actionFnSpecs, reducerRegistry, effectsRegistry, state);
41
- return { all: actionFns, publics: actionFns };
42
- }
43
- function fillReducerRegistry(reducer, actionFns, reducerRegistry) {
44
- function on(action, reducerFn) {
45
- reducerRegistry[action.type] = reducerFn;
46
- }
47
- reducer(actionFns, on);
48
- return reducerRegistry;
49
- }
50
- function fillEffects(effects, actionFns, effectsRegistry = {}) {
51
- function create(action) {
52
- const subject = new Subject();
53
- effectsRegistry[action.type] = subject;
54
- return subject.asObservable();
55
- }
56
- const effectObservables = effects(actionFns, create);
57
- return Object.values(effectObservables);
58
- }
59
- function startSubscriptions(observables) {
60
- return observables.map((observable) => observable.subscribe());
61
- }
62
- function processRedux(actionFnSpecs, reducer, effects, store) {
63
- const reducerRegistry = {};
64
- const effectsRegistry = {};
65
- const actionsMap = createPublicAndAllActionsFns(actionFnSpecs, reducerRegistry, effectsRegistry, store);
66
- const actionFns = actionsMap.all;
67
- const publicActionsFns = actionsMap.publics;
68
- fillReducerRegistry(reducer, actionFns, reducerRegistry);
69
- const effectObservables = fillEffects(effects, actionFns, effectsRegistry);
70
- const subscriptions = startSubscriptions(effectObservables);
71
- return {
72
- methods: publicActionsFns,
73
- subscriptions: subscriptions,
74
- };
75
- }
76
- /**
77
- * @param redux redux
78
- *
79
- * properties do not start with `with` since they are not extension functions on their own.
80
- *
81
- * no dependency to NgRx
82
- *
83
- * actions are passed to reducer and effects, but it is also possible to use other actions.
84
- * effects provide forAction and do not return anything. that is important because effects should stay inaccessible
85
- */
86
- export function withRedux(redux) {
87
- return (store) => {
88
- const { methods, subscriptions } = processRedux(redux.actions, redux.reducer, redux.effects, store);
89
- return {
90
- ...store,
91
- methods,
92
- };
93
- };
94
- }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1yZWR1eC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvd2l0aC1yZWR1eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBd0M5RCxNQUFNLFVBQVUsT0FBTztJQUNyQixPQUFPLEVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQTBCNUIsU0FBUyxlQUFlLENBQ3RCLGFBQW1CLEVBQ25CLGVBR0MsRUFDRCxlQUFrRSxFQUNsRSxLQUFjO0lBRWQsTUFBTSxTQUFTLEdBQTZCLEVBQUUsQ0FBQztJQUUvQyxLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFBRTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtZQUNwQyxNQUFNLFdBQVcsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3pDLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QyxJQUFJLE9BQU8sRUFBRTtnQkFDVixPQUFzRCxDQUNyRCxLQUFLLEVBQ0wsV0FBc0IsQ0FDdkIsQ0FBQzthQUNIO1lBQ0QsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksYUFBYSxFQUFFO2dCQUNoQixhQUE2QyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNsRTtZQUNELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxR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QU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDM0UsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUU1RCxPQUFPO1FBQ0wsT0FBTyxFQUFFLGdCQUE4QjtRQUN2QyxhQUFhLEVBQUUsYUFBYTtLQUM3QixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxTQUFTLENBS3ZCLEtBSUQ7SUFJQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDZixNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHLFlBQVksQ0FDN0MsS0FBSyxDQUFDLE9BQU8sRUFDYixLQUFLLENBQUMsT0FBNkMsRUFDbkQsS0FBSyxDQUFDLE9BQW9DLEVBQzFDLEtBQUssQ0FDTixDQUFDO1FBQ0YsT0FBTztZQUNMLEdBQUcsS0FBSztZQUNSLE9BQU87U0FDUixDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNpZ25hbFN0b3JlRmVhdHVyZSB9IGZyb20gJ0BuZ3J4L3NpZ25hbHMnO1xuaW1wb3J0IHtcbiAgRW1wdHlGZWF0dXJlUmVzdWx0LFxuICBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG59IGZyb20gJ0BuZ3J4L3NpZ25hbHMvc3JjL3NpZ25hbC1zdG9yZS1tb2RlbHMnO1xuaW1wb3J0IHsgU3RhdGVTaWduYWwgfSBmcm9tICdAbmdyeC9zaWduYWxzL3NyYy9zdGF0ZS1zaWduYWwnO1xuaW1wb3J0IHsgYXNzZXJ0QWN0aW9uRm5TcGVjcyB9IGZyb20gJy4vYXNzZXJ0aW9ucy9hc3NlcnRpb25zJztcblxuLyoqIEFjdGlvbnMgKiovXG5cbnR5cGUgUGF5bG9hZCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG50eXBlIEFjdGlvbkZuPFxuICBUeXBlIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBBY3Rpb25QYXlsb2FkIGV4dGVuZHMgUGF5bG9hZCA9IFBheWxvYWRcbj4gPSAoKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpID0+IEFjdGlvblBheWxvYWQgJiB7IHR5cGU6IFR5cGUgfSkgJiB7XG4gIHR5cGU6IFR5cGU7XG59O1xuXG50eXBlIEFjdGlvbkZucyA9IFJlY29yZDxzdHJpbmcsIEFjdGlvbkZuPjtcblxuZXhwb3J0IHR5cGUgQWN0aW9uc0ZuU3BlY3MgPSBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPjtcblxudHlwZSBBY3Rpb25GbkNyZWF0b3I8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPiA9IHtcbiAgW0FjdGlvbk5hbWUgaW4ga2V5b2YgU3BlY106ICgoXG4gICAgcGF5bG9hZDogU3BlY1tBY3Rpb25OYW1lXVxuICApID0+IFNwZWNbQWN0aW9uTmFtZV0gJiB7IHR5cGU6IEFjdGlvbk5hbWUgfSkgJiB7IHR5cGU6IEFjdGlvbk5hbWUgJiBzdHJpbmcgfTtcbn07XG5cbnR5cGUgQWN0aW9uRm5QYXlsb2FkPEFjdGlvbj4gPSBBY3Rpb24gZXh0ZW5kcyAocGF5bG9hZDogaW5mZXIgUGF5bG9hZCkgPT4gdm9pZFxuICA/IFBheWxvYWRcbiAgOiBuZXZlcjtcblxudHlwZSBBY3Rpb25GbnNDcmVhdG9yPFNwZWMgZXh0ZW5kcyBBY3Rpb25zRm5TcGVjcz4gPSBTcGVjIGV4dGVuZHMge1xuICBwcml2YXRlOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPjtcbiAgcHVibGljOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPjtcbn1cbiAgPyBBY3Rpb25GbkNyZWF0b3I8U3BlY1sncHJpdmF0ZSddPiAmIEFjdGlvbkZuQ3JlYXRvcjxTcGVjWydwdWJsaWMnXT5cbiAgOiBBY3Rpb25GbkNyZWF0b3I8U3BlYz47XG5cbnR5cGUgUHVibGljQWN0aW9uRm5zPFNwZWMgZXh0ZW5kcyBBY3Rpb25zRm5TcGVjcz4gPSBTcGVjIGV4dGVuZHMge1xuICBwdWJsaWM6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xufVxuICA/IEFjdGlvbkZuQ3JlYXRvcjxTcGVjWydwdWJsaWMnXT5cbiAgOiBBY3Rpb25GbkNyZWF0b3I8U3BlYz47XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXlsb2FkPFR5cGUgZXh0ZW5kcyBQYXlsb2FkPigpOiBUeXBlIHtcbiAgcmV0dXJuIHt9IGFzIFR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBub1BheWxvYWQgPSB7fTtcblxuLyoqIFJlZHVjZXIgKiovXG5cbnR5cGUgUmVkdWNlckZ1bmN0aW9uPFJlZHVjZXJBY3Rpb24sIFN0YXRlPiA9IChcbiAgc3RhdGU6IFN0YXRlLFxuICBhY3Rpb246IEFjdGlvbkZuUGF5bG9hZDxSZWR1Y2VyQWN0aW9uPlxuKSA9PiB2b2lkO1xuXG50eXBlIFJlZHVjZXJGYWN0b3J5PFN0YXRlQWN0aW9uRm5zIGV4dGVuZHMgQWN0aW9uRm5zLCBTdGF0ZT4gPSAoXG4gIGFjdGlvbnM6IFN0YXRlQWN0aW9uRm5zLFxuICBvbjogPFJlZHVjZXJBY3Rpb24gZXh0ZW5kcyB7IHR5cGU6IHN0cmluZyB9PihcbiAgICBhY3Rpb246IFJlZHVjZXJBY3Rpb24sXG4gICAgcmVkdWNlckZuOiBSZWR1Y2VyRnVuY3Rpb248UmVkdWNlckFjdGlvbiwgU3RhdGU+XG4gICkgPT4gdm9pZFxuKSA9PiB2b2lkO1xuXG4vKiogRWZmZWN0ICoqL1xuXG50eXBlIEVmZmVjdHNGYWN0b3J5PFN0YXRlQWN0aW9uRm5zIGV4dGVuZHMgQWN0aW9uRm5zPiA9IChcbiAgYWN0aW9uczogU3RhdGVBY3Rpb25GbnMsXG4gIGNyZWF0ZTogPEVmZmVjdEFjdGlvbiBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0+KFxuICAgIGFjdGlvbjogRWZmZWN0QWN0aW9uXG4gICkgPT4gT2JzZXJ2YWJsZTxBY3Rpb25GblBheWxvYWQ8RWZmZWN0QWN0aW9uPj5cbikgPT4gUmVjb3JkPHN0cmluZywgT2JzZXJ2YWJsZTx1bmtub3duPj47XG5cbmZ1bmN0aW9uIGNyZWF0ZUFjdGlvbkZuczxTcGVjIGV4dGVuZHMgQWN0aW9uc0ZuU3BlY3M+KFxuICBhY3Rpb25GblNwZWNzOiBTcGVjLFxuICByZWR1Y2VyUmVnaXN0cnk6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgKHN0YXRlOiB1bmtub3duLCBwYXlsb2FkOiBBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4pID0+IHZvaWRcbiAgPixcbiAgZWZmZWN0c1JlZ2lzdHJ5OiBSZWNvcmQ8c3RyaW5nLCBTdWJqZWN0PEFjdGlvbkZuUGF5bG9hZDx1bmtub3duPj4+LFxuICBzdGF0ZTogdW5rbm93blxuKSB7XG4gIGNvbnN0IGFjdGlvbkZuczogUmVjb3JkPHN0cmluZywgQWN0aW9uRm4+ID0ge307XG5cbiAgZm9yIChjb25zdCB0eXBlIGluIGFjdGlvbkZuU3BlY3MpIHtcbiAgICBjb25zdCBhY3Rpb25GbiA9IChwYXlsb2FkOiBQYXlsb2FkKSA9PiB7XG4gICAgICBjb25zdCBmdWxsUGF5bG9hZCA9IHsgLi4ucGF5bG9hZCwgdHlwZSB9O1xuICAgICAgY29uc3QgcmVkdWNlciA9IHJlZHVjZXJSZWdpc3RyeVt0eXBlXTtcbiAgICAgIGlmIChyZWR1Y2VyKSB7XG4gICAgICAgIChyZWR1Y2VyIGFzIChzdGF0ZTogdW5rbm93biwgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZCkoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgZnVsbFBheWxvYWQgYXMgdW5rbm93blxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWZmZWN0U3ViamVjdCA9IGVmZmVjdHNSZWdpc3RyeVt0eXBlXTtcbiAgICAgIGlmIChlZmZlY3RTdWJqZWN0KSB7XG4gICAgICAgIChlZmZlY3RTdWJqZWN0IGFzIHVua25vd24gYXMgU3ViamVjdDx1bmtub3duPikubmV4dChmdWxsUGF5bG9hZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVsbFBheWxvYWQ7XG4gICAgfTtcbiAgICBhY3Rpb25Gbi50eXBlID0gdHlwZS50b1N0cmluZygpO1xuICAgIGFjdGlvbkZuc1t0eXBlXSA9IGFjdGlvbkZuO1xuICB9XG5cbiAgcmV0dXJuIGFjdGlvbkZucztcbn1cblxuZnVuY3Rpb24gY3JlYXRlUHVibGljQW5kQWxsQWN0aW9uc0ZuczxTcGVjIGV4dGVuZHMgQWN0aW9uc0ZuU3BlY3M+KFxuICBhY3Rpb25GblNwZWNzOiBTcGVjLFxuICByZWR1Y2VyUmVnaXN0cnk6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgKHN0YXRlOiB1bmtub3duLCBwYXlsb2FkOiBBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4pID0+IHZvaWRcbiAgPixcbiAgZWZmZWN0c1JlZ2lzdHJ5OiBSZWNvcmQ8c3RyaW5nLCBTdWJqZWN0PEFjdGlvbkZuUGF5bG9hZDx1bmtub3duPj4+LFxuICBzdGF0ZTogdW5rbm93blxuKTogeyBhbGw6IEFjdGlvbkZuczsgcHVibGljczogQWN0aW9uRm5zIH0ge1xuICBpZiAoJ3B1YmxpYycgaW4gYWN0aW9uRm5TcGVjcyB8fCAncHJpdmF0ZScgaW4gYWN0aW9uRm5TcGVjcykge1xuICAgIGNvbnN0IHByaXZhdGVzID0gYWN0aW9uRm5TcGVjc1sncHJpdmF0ZSddIHx8IHt9O1xuICAgIGNvbnN0IHB1YmxpY3MgPSBhY3Rpb25GblNwZWNzWydwdWJsaWMnXSB8fCB7fTtcblxuICAgIGFzc2VydEFjdGlvbkZuU3BlY3MocHJpdmF0ZXMpO1xuICAgIGFzc2VydEFjdGlvbkZuU3BlY3MocHVibGljcyk7XG5cbiAgICBjb25zdCBwcml2YXRlQWN0aW9uRm5zID0gY3JlYXRlQWN0aW9uRm5zKFxuICAgICAgcHJpdmF0ZXMsXG4gICAgICByZWR1Y2VyUmVnaXN0cnksXG4gICAgICBlZmZlY3RzUmVnaXN0cnksXG4gICAgICBzdGF0ZVxuICAgICk7XG4gICAgY29uc3QgcHVibGljQWN0aW9uRm5zID0gY3JlYXRlQWN0aW9uRm5zKFxuICAgICAgcHVibGljcyxcbiAgICAgIHJlZHVjZXJSZWdpc3RyeSxcbiAgICAgIGVmZmVjdHNSZWdpc3RyeSxcbiAgICAgIHN0YXRlXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhbGw6IHsgLi4ucHJpdmF0ZUFjdGlvbkZucywgLi4ucHVibGljQWN0aW9uRm5zIH0sXG4gICAgICBwdWJsaWNzOiBwdWJsaWNBY3Rpb25GbnMsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGlvbkZucyA9IGNyZWF0ZUFjdGlvbkZucyhcbiAgICBhY3Rpb25GblNwZWNzLFxuICAgIHJlZHVjZXJSZWdpc3RyeSxcbiAgICBlZmZlY3RzUmVnaXN0cnksXG4gICAgc3RhdGVcbiAgKTtcblxuICByZXR1cm4geyBhbGw6IGFjdGlvbkZucywgcHVibGljczogYWN0aW9uRm5zIH07XG59XG5cbmZ1bmN0aW9uIGZpbGxSZWR1Y2VyUmVnaXN0cnkoXG4gIHJlZHVjZXI6IFJlZHVjZXJGYWN0b3J5PEFjdGlvbkZucywgdW5rbm93bj4sXG4gIGFjdGlvbkZuczogQWN0aW9uRm5zLFxuICByZWR1Y2VyUmVnaXN0cnk6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgKHN0YXRlOiB1bmtub3duLCBwYXlsb2FkOiBBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4pID0+IHZvaWRcbiAgPlxuKSB7XG4gIGZ1bmN0aW9uIG9uKFxuICAgIGFjdGlvbjogeyB0eXBlOiBzdHJpbmcgfSxcbiAgICByZWR1Y2VyRm46IChzdGF0ZTogdW5rbm93biwgcGF5bG9hZDogQWN0aW9uRm5QYXlsb2FkPHVua25vd24+KSA9PiB2b2lkXG4gICkge1xuICAgIHJlZHVjZXJSZWdpc3RyeVthY3Rpb24udHlwZV0gPSByZWR1Y2VyRm47XG4gIH1cblxuICByZWR1Y2VyKGFjdGlvbkZucywgb24pO1xuXG4gIHJldHVybiByZWR1Y2VyUmVnaXN0cnk7XG59XG5cbmZ1bmN0aW9uIGZpbGxFZmZlY3RzKFxuICBlZmZlY3RzOiBFZmZlY3RzRmFjdG9yeTxBY3Rpb25GbnM+LFxuICBhY3Rpb25GbnM6IEFjdGlvbkZucyxcbiAgZWZmZWN0c1JlZ2lzdHJ5OiBSZWNvcmQ8c3RyaW5nLCBTdWJqZWN0PEFjdGlvbkZuUGF5bG9hZDx1bmtub3duPj4+ID0ge31cbik6IE9ic2VydmFibGU8dW5rbm93bj5bXSB7XG4gIGZ1bmN0aW9uIGNyZWF0ZShhY3Rpb246IHsgdHlwZTogc3RyaW5nIH0pIHtcbiAgICBjb25zdCBzdWJqZWN0ID0gbmV3IFN1YmplY3Q8QWN0aW9uRm5QYXlsb2FkPHVua25vd24+PigpO1xuICAgIGVmZmVjdHNSZWdpc3RyeVthY3Rpb24udHlwZV0gPSBzdWJqZWN0O1xuICAgIHJldHVybiBzdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgY29uc3QgZWZmZWN0T2JzZXJ2YWJsZXMgPSBlZmZlY3RzKGFjdGlvbkZucywgY3JlYXRlKTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZWZmZWN0T2JzZXJ2YWJsZXMpO1xufVxuXG5mdW5jdGlvbiBzdGFydFN1YnNjcmlwdGlvbnMob2JzZXJ2YWJsZXM6IE9ic2VydmFibGU8dW5rbm93bj5bXSkge1xuICByZXR1cm4gb2JzZXJ2YWJsZXMubWFwKChvYnNlcnZhYmxlKSA9PiBvYnNlcnZhYmxlLnN1YnNjcmliZSgpKTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1JlZHV4PFNwZWMgZXh0ZW5kcyBBY3Rpb25zRm5TcGVjcywgUmV0dXJuVHlwZT4oXG4gIGFjdGlvbkZuU3BlY3M6IFNwZWMsXG4gIHJlZHVjZXI6IFJlZHVjZXJGYWN0b3J5PEFjdGlvbkZucywgdW5rbm93bj4sXG4gIGVmZmVjdHM6IEVmZmVjdHNGYWN0b3J5PEFjdGlvbkZucz4sXG4gIHN0b3JlOiB1bmtub3duXG4pIHtcbiAgY29uc3QgcmVkdWNlclJlZ2lzdHJ5OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIChzdGF0ZTogdW5rbm93biwgcGF5bG9hZDogQWN0aW9uRm5QYXlsb2FkPHVua25vd24+KSA9PiB2b2lkXG4gID4gPSB7fTtcbiAgY29uc3QgZWZmZWN0c1JlZ2lzdHJ5OiBSZWNvcmQ8c3RyaW5nLCBTdWJqZWN0PEFjdGlvbkZuUGF5bG9hZDx1bmtub3duPj4+ID0ge307XG4gIGNvbnN0IGFjdGlvbnNNYXAgPSBjcmVhdGVQdWJsaWNBbmRBbGxBY3Rpb25zRm5zKFxuICAgIGFjdGlvbkZuU3BlY3MsXG4gICAgcmVkdWNlclJlZ2lzdHJ5LFxuICAgIGVmZmVjdHNSZWdpc3RyeSxcbiAgICBzdG9yZVxuICApO1xuICBjb25zdCBhY3Rpb25GbnMgPSBhY3Rpb25zTWFwLmFsbDtcbiAgY29uc3QgcHVibGljQWN0aW9uc0ZucyA9IGFjdGlvbnNNYXAucHVibGljcztcblxuICBmaWxsUmVkdWNlclJlZ2lzdHJ5KHJlZHVjZXIsIGFjdGlvbkZucywgcmVkdWNlclJlZ2lzdHJ5KTtcbiAgY29uc3QgZWZmZWN0T2JzZXJ2YWJsZXMgPSBmaWxsRWZmZWN0cyhlZmZlY3RzLCBhY3Rpb25GbnMsIGVmZmVjdHNSZWdpc3RyeSk7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSBzdGFydFN1YnNjcmlwdGlvbnMoZWZmZWN0T2JzZXJ2YWJsZXMpO1xuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kczogcHVibGljQWN0aW9uc0ZucyBhcyBSZXR1cm5UeXBlLFxuICAgIHN1YnNjcmlwdGlvbnM6IHN1YnNjcmlwdGlvbnMsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHJlZHV4IHJlZHV4XG4gKlxuICogcHJvcGVydGllcyBkbyBub3Qgc3RhcnQgd2l0aCBgd2l0aGAgc2luY2UgdGhleSBhcmUgbm90IGV4dGVuc2lvbiBmdW5jdGlvbnMgb24gdGhlaXIgb3duLlxuICpcbiAqIG5vIGRlcGVuZGVuY3kgdG8gTmdSeFxuICpcbiAqIGFjdGlvbnMgYXJlIHBhc3NlZCB0byByZWR1Y2VyIGFuZCBlZmZlY3RzLCBidXQgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2Ugb3RoZXIgYWN0aW9ucy5cbiAqIGVmZmVjdHMgcHJvdmlkZSBmb3JBY3Rpb24gYW5kIGRvIG5vdCByZXR1cm4gYW55dGhpbmcuIHRoYXQgaXMgaW1wb3J0YW50IGJlY2F1c2UgZWZmZWN0cyBzaG91bGQgc3RheSBpbmFjY2Vzc2libGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZWR1eDxcbiAgU3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzLFxuICBJbnB1dCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcbiAgU3RhdGVBY3Rpb25GbnMgZXh0ZW5kcyBBY3Rpb25GbnNDcmVhdG9yPFNwZWM+ID0gQWN0aW9uRm5zQ3JlYXRvcjxTcGVjPixcbiAgUHVibGljU3RvcmVBY3Rpb25GbnMgZXh0ZW5kcyBQdWJsaWNBY3Rpb25GbnM8U3BlYz4gPSBQdWJsaWNBY3Rpb25GbnM8U3BlYz5cbj4ocmVkdXg6IHtcbiAgYWN0aW9uczogU3BlYztcbiAgcmVkdWNlcjogUmVkdWNlckZhY3Rvcnk8U3RhdGVBY3Rpb25GbnMsIFN0YXRlU2lnbmFsPElucHV0WydzdGF0ZSddPj47XG4gIGVmZmVjdHM6IEVmZmVjdHNGYWN0b3J5PFN0YXRlQWN0aW9uRm5zPjtcbn0pOiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gIElucHV0LFxuICBFbXB0eUZlYXR1cmVSZXN1bHQgJiB7IG1ldGhvZHM6IFB1YmxpY1N0b3JlQWN0aW9uRm5zIH1cbj4ge1xuICByZXR1cm4gKHN0b3JlKSA9PiB7XG4gICAgY29uc3QgeyBtZXRob2RzLCBzdWJzY3JpcHRpb25zIH0gPSBwcm9jZXNzUmVkdXg8U3BlYywgUHVibGljU3RvcmVBY3Rpb25GbnM+KFxuICAgICAgcmVkdXguYWN0aW9ucyxcbiAgICAgIHJlZHV4LnJlZHVjZXIgYXMgUmVkdWNlckZhY3Rvcnk8QWN0aW9uRm5zLCB1bmtub3duPixcbiAgICAgIHJlZHV4LmVmZmVjdHMgYXMgRWZmZWN0c0ZhY3Rvcnk8QWN0aW9uRm5zPixcbiAgICAgIHN0b3JlXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RvcmUsXG4gICAgICBtZXRob2RzLFxuICAgIH07XG4gIH07XG59XG4iXX0=
@@ -1,56 +0,0 @@
1
- import { isPlatformServer } from '@angular/common';
2
- import { PLATFORM_ID, effect, inject } from '@angular/core';
3
- import { getState, patchState, signalStoreFeature, withHooks, withMethods, } from '@ngrx/signals';
4
- const NOOP = () => { };
5
- const StorageSyncStub = {
6
- clearStorage: NOOP,
7
- readFromStorage: NOOP,
8
- writeToStorage: NOOP,
9
- };
10
- export function withStorageSync(configOrKey) {
11
- const { key, autoSync = true, select = (state) => state, parse = JSON.parse, stringify = JSON.stringify, storage: storageFactory = () => localStorage, } = typeof configOrKey === 'string' ? { key: configOrKey } : configOrKey;
12
- return signalStoreFeature(withMethods((store, platformId = inject(PLATFORM_ID)) => {
13
- if (isPlatformServer(platformId)) {
14
- console.warn(`'withStorageSync' provides non-functional implementation due to server-side execution`);
15
- return StorageSyncStub;
16
- }
17
- const storage = storageFactory();
18
- return {
19
- /**
20
- * Removes the item stored in storage.
21
- */
22
- clearStorage() {
23
- storage.removeItem(key);
24
- },
25
- /**
26
- * Reads item from storage and patches the state.
27
- */
28
- readFromStorage() {
29
- const stateString = storage.getItem(key);
30
- if (stateString) {
31
- patchState(store, parse(stateString));
32
- }
33
- },
34
- /**
35
- * Writes selected portion to storage.
36
- */
37
- writeToStorage() {
38
- const slicedState = select(getState(store));
39
- storage.setItem(key, stringify(slicedState));
40
- },
41
- };
42
- }), withHooks({
43
- onInit(store, platformId = inject(PLATFORM_ID)) {
44
- if (isPlatformServer(platformId)) {
45
- return;
46
- }
47
- if (autoSync) {
48
- store.readFromStorage();
49
- effect(() => {
50
- store.writeToStorage();
51
- });
52
- }
53
- },
54
- }));
55
- }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1zdG9yYWdlLXN5bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3dpdGgtc3RvcmFnZS1zeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBRUwsUUFBUSxFQUNSLFVBQVUsRUFDVixrQkFBa0IsRUFDbEIsU0FBUyxFQUNULFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQVV2QixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7QUFZdEIsTUFBTSxlQUFlLEdBR047SUFDYixZQUFZLEVBQUUsSUFBSTtJQUNsQixlQUFlLEVBQUUsSUFBSTtJQUNyQixjQUFjLEVBQUUsSUFBSTtDQUNyQixDQUFDO0FBc0RGLE1BQU0sVUFBVSxlQUFlLENBSTdCLFdBQWdEO0lBRWhELE1BQU0sRUFDSixHQUFHLEVBQ0gsUUFBUSxHQUFHLElBQUksRUFDZixNQUFNLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFDaEMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQ2xCLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUMxQixPQUFPLEVBQUUsY0FBYyxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksR0FDN0MsR0FBRyxPQUFPLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFFekUsT0FBTyxrQkFBa0IsQ0FDdkIsV0FBVyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRTtRQUN0RCxJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsdUZBQXVGLENBQ3hGLENBQUM7WUFDRixPQUFPLGVBQWUsQ0FBQztTQUN4QjtRQUVELE1BQU0sT0FBTyxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBRWpDLE9BQU87WUFDTDs7ZUFFRztZQUNILFlBQVk7Z0JBQ1YsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBQ0Q7O2VBRUc7WUFDSCxlQUFlO2dCQUNiLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksV0FBVyxFQUFFO29CQUNmLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZDO1lBQ0gsQ0FBQztZQUNEOztlQUVHO1lBQ0gsY0FBYztnQkFDWixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBVSxDQUFDLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDO1FBQ1IsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUM1QyxJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNoQyxPQUFPO2FBQ1I7WUFFRCxJQUFJLFFBQVEsRUFBRTtnQkFDWixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBRXhCLE1BQU0sQ0FBQyxHQUFHLEVBQUU7b0JBQ1YsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QixDQUFDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQztLQUNGLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUExBVEZPUk1fSUQsIGVmZmVjdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBTaWduYWxTdG9yZUZlYXR1cmUsXG4gIGdldFN0YXRlLFxuICBwYXRjaFN0YXRlLFxuICBzaWduYWxTdG9yZUZlYXR1cmUsXG4gIHdpdGhIb29rcyxcbiAgd2l0aE1ldGhvZHMsXG59IGZyb20gJ0BuZ3J4L3NpZ25hbHMnO1xuaW1wb3J0IHsgRW10cHkgfSBmcm9tICcuL3NoYXJlZC9lbXB0eSc7XG5cbnR5cGUgU2lnbmFsU3RvcmVGZWF0dXJlSW5wdXQ8U3RhdGU+ID0gUGljazxcbiAgUGFyYW1ldGVyczxTaWduYWxTdG9yZUZlYXR1cmU+WzBdLFxuICAnc2lnbmFscycgfCAnbWV0aG9kcydcbj4gJiB7XG4gIHN0YXRlOiBTdGF0ZTtcbn07XG5cbmNvbnN0IE5PT1AgPSAoKSA9PiB7fTtcblxudHlwZSBXaXRoU3RvcmFnZVN5bmNGZWF0dXJlUmVzdWx0ID0ge1xuICBzdGF0ZTogRW10cHk7XG4gIHNpZ25hbHM6IEVtdHB5O1xuICBtZXRob2RzOiB7XG4gICAgY2xlYXJTdG9yYWdlKCk6IHZvaWQ7XG4gICAgcmVhZEZyb21TdG9yYWdlKCk6IHZvaWQ7XG4gICAgd3JpdGVUb1N0b3JhZ2UoKTogdm9pZDtcbiAgfTtcbn07XG5cbmNvbnN0IFN0b3JhZ2VTeW5jU3R1YjogUGljazxcbiAgV2l0aFN0b3JhZ2VTeW5jRmVhdHVyZVJlc3VsdCxcbiAgJ21ldGhvZHMnXG4+WydtZXRob2RzJ10gPSB7XG4gIGNsZWFyU3RvcmFnZTogTk9PUCxcbiAgcmVhZEZyb21TdG9yYWdlOiBOT09QLFxuICB3cml0ZVRvU3RvcmFnZTogTk9PUCxcbn07XG5cbmV4cG9ydCB0eXBlIFN5bmNDb25maWc8U3RhdGU+ID0ge1xuICAvKipcbiAgICogVGhlIGtleSB3aGljaCBpcyB1c2VkIHRvIGFjY2VzcyB0aGUgc3RvcmFnZS5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuICAvKipcbiAgICogRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBzdG9yZSBzaG91bGQgcmVhZCBmcm9tIHN0b3JhZ2Ugb24gaW5pdCBhbmQgd3JpdGUgdG8gc3RvcmFnZSBvbiBldmVyeSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIGB0cnVlYCBieSBkZWZhdWx0XG4gICAqL1xuICBhdXRvU3luYz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBzZWxlY3QgdGhhdCBwb3J0aW9uIG9mIHRoZSBzdGF0ZSB3aGljaCBzaG91bGQgYmUgc3RvcmVkLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSB3aG9sZSBzdGF0ZSBvYmplY3QgYnkgZGVmYXVsdFxuICAgKi9cbiAgc2VsZWN0PzogKHN0YXRlOiBTdGF0ZSkgPT4gUGFydGlhbDxTdGF0ZT47XG4gIC8qKlxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIHBhcnNlIHRoZSBzdGF0ZSBjb21pbmcgZnJvbSBzdG9yYWdlLlxuICAgKlxuICAgKiBgSlNPTi5wYXJzZSgpYCBieSBkZWZhdWx0XG4gICAqL1xuICBwYXJzZT86IChzdGF0ZVN0cmluZzogc3RyaW5nKSA9PiBTdGF0ZTtcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHVzZWQgdG8gdHJhbmZvcm0gdGhlIHN0YXRlIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAqXG4gICAqIGBKU09OLnN0cmluZ2lmeSgpYCBieSBkZWZhdWx0XG4gICAqL1xuICBzdHJpbmdpZnk/OiAoc3RhdGU6IFN0YXRlKSA9PiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGYWN0b3J5IGZ1bmN0aW9uIHVzZWQgdG8gc2VsZWN0IHRoZSBzdG9yYWdlLlxuICAgKlxuICAgKiBgbG9jYWxzdG9yYWdlYCBieSBkZWZhdWx0XG4gICAqL1xuICBzdG9yYWdlPzogKCkgPT4gU3RvcmFnZTtcbn07XG5cbi8qKlxuICogRW5hYmxlcyBzdG9yZSBzeW5jaHJvbml6YXRpb24gd2l0aCBzdG9yYWdlLlxuICpcbiAqIE9ubHkgd29ya3Mgb24gYnJvd3NlciBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTdG9yYWdlU3luYzxcbiAgU3RhdGUgZXh0ZW5kcyBvYmplY3QsXG4gIElucHV0IGV4dGVuZHMgU2lnbmFsU3RvcmVGZWF0dXJlSW5wdXQ8U3RhdGU+XG4+KGtleTogc3RyaW5nKTogU2lnbmFsU3RvcmVGZWF0dXJlPElucHV0LCBXaXRoU3RvcmFnZVN5bmNGZWF0dXJlUmVzdWx0PjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoU3RvcmFnZVN5bmM8XG4gIFN0YXRlIGV4dGVuZHMgb2JqZWN0LFxuICBJbnB1dCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZUlucHV0PFN0YXRlPlxuPihcbiAgY29uZmlnOiBTeW5jQ29uZmlnPElucHV0WydzdGF0ZSddPlxuKTogU2lnbmFsU3RvcmVGZWF0dXJlPElucHV0LCBXaXRoU3RvcmFnZVN5bmNGZWF0dXJlUmVzdWx0PjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoU3RvcmFnZVN5bmM8XG4gIFN0YXRlIGV4dGVuZHMgb2JqZWN0LFxuICBJbnB1dCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZUlucHV0PFN0YXRlPlxuPihcbiAgY29uZmlnT3JLZXk6IFN5bmNDb25maWc8SW5wdXRbJ3N0YXRlJ10+IHwgc3RyaW5nXG4pOiBTaWduYWxTdG9yZUZlYXR1cmU8SW5wdXQsIFdpdGhTdG9yYWdlU3luY0ZlYXR1cmVSZXN1bHQ+IHtcbiAgY29uc3Qge1xuICAgIGtleSxcbiAgICBhdXRvU3luYyA9IHRydWUsXG4gICAgc2VsZWN0ID0gKHN0YXRlOiBTdGF0ZSkgPT4gc3RhdGUsXG4gICAgcGFyc2UgPSBKU09OLnBhcnNlLFxuICAgIHN0cmluZ2lmeSA9IEpTT04uc3RyaW5naWZ5LFxuICAgIHN0b3JhZ2U6IHN0b3JhZ2VGYWN0b3J5ID0gKCkgPT4gbG9jYWxTdG9yYWdlLFxuICB9ID0gdHlwZW9mIGNvbmZpZ09yS2V5ID09PSAnc3RyaW5nJyA/IHsga2V5OiBjb25maWdPcktleSB9IDogY29uZmlnT3JLZXk7XG5cbiAgcmV0dXJuIHNpZ25hbFN0b3JlRmVhdHVyZShcbiAgICB3aXRoTWV0aG9kcygoc3RvcmUsIHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpKSA9PiB7XG4gICAgICBpZiAoaXNQbGF0Zm9ybVNlcnZlcihwbGF0Zm9ybUlkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYCd3aXRoU3RvcmFnZVN5bmMnIHByb3ZpZGVzIG5vbi1mdW5jdGlvbmFsIGltcGxlbWVudGF0aW9uIGR1ZSB0byBzZXJ2ZXItc2lkZSBleGVjdXRpb25gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBTdG9yYWdlU3luY1N0dWI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSBzdG9yYWdlRmFjdG9yeSgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVtb3ZlcyB0aGUgaXRlbSBzdG9yZWQgaW4gc3RvcmFnZS5cbiAgICAgICAgICovXG4gICAgICAgIGNsZWFyU3RvcmFnZSgpOiB2b2lkIHtcbiAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlYWRzIGl0ZW0gZnJvbSBzdG9yYWdlIGFuZCBwYXRjaGVzIHRoZSBzdGF0ZS5cbiAgICAgICAgICovXG4gICAgICAgIHJlYWRGcm9tU3RvcmFnZSgpOiB2b2lkIHtcbiAgICAgICAgICBjb25zdCBzdGF0ZVN0cmluZyA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICAgIGlmIChzdGF0ZVN0cmluZykge1xuICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgcGFyc2Uoc3RhdGVTdHJpbmcpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXcml0ZXMgc2VsZWN0ZWQgcG9ydGlvbiB0byBzdG9yYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgd3JpdGVUb1N0b3JhZ2UoKTogdm9pZCB7XG4gICAgICAgICAgY29uc3Qgc2xpY2VkU3RhdGUgPSBzZWxlY3QoZ2V0U3RhdGUoc3RvcmUpIGFzIFN0YXRlKTtcbiAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oa2V5LCBzdHJpbmdpZnkoc2xpY2VkU3RhdGUpKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSksXG4gICAgd2l0aEhvb2tzKHtcbiAgICAgIG9uSW5pdChzdG9yZSwgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCkpIHtcbiAgICAgICAgaWYgKGlzUGxhdGZvcm1TZXJ2ZXIocGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXV0b1N5bmMpIHtcbiAgICAgICAgICBzdG9yZS5yZWFkRnJvbVN0b3JhZ2UoKTtcblxuICAgICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBzdG9yZS53cml0ZVRvU3RvcmFnZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pXG4gICk7XG59XG4iXX0=
@@ -1,93 +0,0 @@
1
- import { patchState, signalStoreFeature, withComputed, withHooks, withMethods } from "@ngrx/signals";
2
- import { effect, signal, untracked, isSignal } from "@angular/core";
3
- import { capitalize } from "./with-data-service";
4
- const defaultOptions = {
5
- maxStackSize: 100
6
- };
7
- export function getUndoRedoKeys(collections) {
8
- if (collections) {
9
- return collections.flatMap(c => [`${c}EntityMap`, `${c}Ids`, `selected${capitalize(c)}Ids`, `${c}Filter`]);
10
- }
11
- return ['entityMap', 'ids', 'selectedIds', 'filter'];
12
- }
13
- export function withUndoRedo(options = {}) {
14
- let previous = null;
15
- let skipOnce = false;
16
- const normalized = {
17
- ...defaultOptions,
18
- ...options
19
- };
20
- //
21
- // Design Decision: This feature has its own
22
- // internal state.
23
- //
24
- const undoStack = [];
25
- const redoStack = [];
26
- const canUndo = signal(false);
27
- const canRedo = signal(false);
28
- const updateInternal = () => {
29
- canUndo.set(undoStack.length !== 0);
30
- canRedo.set(redoStack.length !== 0);
31
- };
32
- const keys = getUndoRedoKeys(normalized?.collections);
33
- return signalStoreFeature(withComputed(() => ({
34
- canUndo: canUndo.asReadonly(),
35
- canRedo: canRedo.asReadonly()
36
- })), withMethods((store) => ({
37
- undo() {
38
- const item = undoStack.pop();
39
- if (item && previous) {
40
- redoStack.push(previous);
41
- }
42
- if (item) {
43
- skipOnce = true;
44
- patchState(store, item);
45
- previous = item;
46
- }
47
- updateInternal();
48
- },
49
- redo() {
50
- const item = redoStack.pop();
51
- if (item && previous) {
52
- undoStack.push(previous);
53
- }
54
- if (item) {
55
- skipOnce = true;
56
- patchState(store, item);
57
- previous = item;
58
- }
59
- updateInternal();
60
- }
61
- })), withHooks({
62
- onInit(store) {
63
- effect(() => {
64
- const cand = keys.reduce((acc, key) => {
65
- const s = store[key];
66
- if (s && isSignal(s)) {
67
- return {
68
- ...acc,
69
- [key]: s()
70
- };
71
- }
72
- return acc;
73
- }, {});
74
- if (skipOnce) {
75
- skipOnce = false;
76
- return;
77
- }
78
- // Clear redoStack after recorded action
79
- redoStack.splice(0);
80
- if (previous) {
81
- undoStack.push(previous);
82
- }
83
- if (redoStack.length > normalized.maxStackSize) {
84
- undoStack.unshift();
85
- }
86
- previous = cand;
87
- // Don't propogate current reactive context
88
- untracked(() => updateInternal());
89
- });
90
- }
91
- }));
92
- }
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC11bmRvLXJlZG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3dpdGgtdW5kby1yZWRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0IsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpILE9BQU8sRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUFVLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBVXpELE1BQU0sY0FBYyxHQUE4QjtJQUM5QyxZQUFZLEVBQUUsR0FBRztDQUNwQixDQUFDO0FBWUYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxXQUFzQjtJQUNsRCxJQUFJLFdBQVcsRUFBRTtRQUNiLE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7S0FDN0c7SUFDRCxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQXdDRCxNQUFNLFVBQVUsWUFBWSxDQUE0QixVQUdwRCxFQUFFO0lBR0YsSUFBSSxRQUFRLEdBQXFCLElBQUksQ0FBQztJQUN0QyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFckIsTUFBTSxVQUFVLEdBQUc7UUFDZixHQUFHLGNBQWM7UUFDakIsR0FBRyxPQUFPO0tBQ2IsQ0FBQztJQUVGLEVBQUU7SUFDRiw0Q0FBNEM7SUFDNUMsa0JBQWtCO0lBQ2xCLEVBQUU7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UUFBUSxHQUFHLElBQUksQ0FBQztnQkFFaEIsMkNBQTJDO2dCQUMzQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUM7S0FDSixDQUFDLENBRUwsQ0FBQTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYWxTdG9yZUZlYXR1cmUsIHBhdGNoU3RhdGUsIHNpZ25hbFN0b3JlRmVhdHVyZSwgd2l0aENvbXB1dGVkLCB3aXRoSG9va3MsIHdpdGhNZXRob2RzIH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHNcIjtcbmltcG9ydCB7IEVudGl0eUlkLCBFbnRpdHlNYXAsIEVudGl0eVN0YXRlIH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHMvZW50aXRpZXNcIjtcbmltcG9ydCB7IFNpZ25hbCwgZWZmZWN0LCBzaWduYWwsIHVudHJhY2tlZCwgaXNTaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRW50aXR5U2lnbmFscywgTmFtZWRFbnRpdHlTaWduYWxzIH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHMvZW50aXRpZXMvc3JjL21vZGVsc1wiO1xuaW1wb3J0IHsgRW50aXR5LCBjYXBpdGFsaXplIH0gZnJvbSBcIi4vd2l0aC1kYXRhLXNlcnZpY2VcIjtcbmltcG9ydCB7IEVtdHB5IH0gZnJvbSBcIi4vc2hhcmVkL2VtcHR5XCI7XG5cbmV4cG9ydCB0eXBlIFN0YWNrSXRlbSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkVW5kb1JlZG9PcHRpb25zID0ge1xuICAgIG1heFN0YWNrU2l6ZTogbnVtYmVyO1xuICAgIGNvbGxlY3Rpb25zPzogc3RyaW5nW11cbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE5vcm1hbGl6ZWRVbmRvUmVkb09wdGlvbnMgPSB7XG4gICAgbWF4U3RhY2tTaXplOiAxMDBcbn07XG5cbmV4cG9ydCB0eXBlIE5hbWVkVW5kb1JlZG9TdGF0ZTxDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0t9RW50aXR5TWFwYF06IEVudGl0eU1hcDxFbnRpdHk+O1xufSAmIHtcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtLfUlkc2BdOiBFbnRpdHlJZFtdO1xuICAgIH1cblxuZXhwb3J0IHR5cGUgTmFtZWRVbmRvUmVkb1NpZ25hbHM8Q29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4gPSB7XG4gICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtLfUVudGl0aWVzYF06IFNpZ25hbDxFbnRpdHlbXT5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuZG9SZWRvS2V5cyhjb2xsZWN0aW9ucz86IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGlmIChjb2xsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbnMuZmxhdE1hcChjID0+IFtgJHtjfUVudGl0eU1hcGAsIGAke2N9SWRzYCwgYHNlbGVjdGVkJHtjYXBpdGFsaXplKGMpfUlkc2AsIGAke2N9RmlsdGVyYF0pXG4gICAgfVxuICAgIHJldHVybiBbJ2VudGl0eU1hcCcsICdpZHMnLCAnc2VsZWN0ZWRJZHMnLCAnZmlsdGVyJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoVW5kb1JlZG88Q29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4ob3B0aW9ucz86IHsgbWF4U3RhY2tTaXplPzogbnVtYmVyOyBjb2xsZWN0aW9uczogQ29sbGVjdGlvbltdIH0pOiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAge1xuICAgICAgICBzdGF0ZTogRW10cHksXG4gICAgICAgIC8vIFRoaXMgYWx0ZXJuYXRpdmUgYnJlYWtzIHR5cGUgaW5mZXJlbmNlOlxuICAgICAgICAvLyBzdGF0ZTogTmFtZWRFbnRpdHlTdGF0ZTxFbnRpdHksIENvbGxlY3Rpb24+XG4gICAgICAgIHNpZ25hbHM6IE5hbWVkRW50aXR5U2lnbmFsczxFbnRpdHksIENvbGxlY3Rpb24+LFxuICAgICAgICBtZXRob2RzOiBFbXRweVxuICAgIH0sXG4gICAge1xuICAgICAgICBzdGF0ZTogRW10cHksXG4gICAgICAgIHNpZ25hbHM6IHtcbiAgICAgICAgICAgIGNhblVuZG86IFNpZ25hbDxib29sZWFuPixcbiAgICAgICAgICAgIGNhblJlZG86IFNpZ25hbDxib29sZWFuPlxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICB1bmRvOiAoKSA9PiB2b2lkLFxuICAgICAgICAgICAgcmVkbzogKCkgPT4gdm9pZFxuICAgICAgICB9XG4gICAgfT47XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoVW5kb1JlZG8ob3B0aW9ucz86IHsgbWF4U3RhY2tTaXplPzogbnVtYmVyIH0pOiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gICAge1xuICAgICAgICBzdGF0ZTogRW50aXR5U3RhdGU8RW50aXR5PixcbiAgICAgICAgc2lnbmFsczogRW50aXR5U2lnbmFsczxFbnRpdHk+LFxuICAgICAgICBtZXRob2RzOiBFbXRweVxuICAgIH0sXG4gICAge1xuICAgICAgICBzdGF0ZTogRW10cHksXG4gICAgICAgIHNpZ25hbHM6IHtcbiAgICAgICAgICAgIGNhblVuZG86IFNpZ25hbDxib29sZWFuPixcbiAgICAgICAgICAgIGNhblJlZG86IFNpZ25hbDxib29sZWFuPlxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICB1bmRvOiAoKSA9PiB2b2lkLFxuICAgICAgICAgICAgcmVkbzogKCkgPT4gdm9pZFxuICAgICAgICB9XG4gICAgfT47XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoVW5kb1JlZG88Q29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4ob3B0aW9uczoge1xuICAgIG1heFN0YWNrU2l6ZT86IG51bWJlcjtcbiAgICBjb2xsZWN0aW9ucz86IENvbGxlY3Rpb25bXVxufSA9IHt9KTogXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuU2lnbmFsU3RvcmVGZWF0dXJlPGFueSwgYW55PiB7XG4gICAgbGV0IHByZXZpb3VzOiBTdGFja0l0ZW0gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgc2tpcE9uY2UgPSBmYWxzZTtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gRGVzaWduIERlY2lzaW9uOiBUaGlzIGZlYXR1cmUgaGFzIGl0cyBvd25cbiAgICAvLyBpbnRlcm5hbCBzdGF0ZS5cbiAgICAvL1xuXG4gICAgY29uc3QgdW5kb1N0YWNrOiBTdGFja0l0ZW1bXSA9IFtdO1xuICAgIGNvbnN0IHJlZG9TdGFjazogU3RhY2tJdGVtW10gPSBbXTtcblxuICAgIGNvbnN0IGNhblVuZG8gPSBzaWduYWwoZmFsc2UpO1xuICAgIGNvbnN0IGNhblJlZG8gPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgY29uc3QgdXBkYXRlSW50ZXJuYWwgPSAoKSA9PiB7XG4gICAgICAgIGNhblVuZG8uc2V0KHVuZG9TdGFjay5sZW5ndGggIT09IDApO1xuICAgICAgICBjYW5SZWRvLnNldChyZWRvU3RhY2subGVuZ3RoICE9PSAwKTtcbiAgICB9O1xuXG4gICAgY29uc3Qga2V5cyA9IGdldFVuZG9SZWRvS2V5cyhub3JtYWxpemVkPy5jb2xsZWN0aW9ucyk7XG5cbiAgICByZXR1cm4gc2lnbmFsU3RvcmVGZWF0dXJlKFxuXG4gICAgICAgIHdpdGhDb21wdXRlZCgoKSA9PiAoe1xuICAgICAgICAgICAgY2FuVW5kbzogY2FuVW5kby5hc1JlYWRvbmx5KCksXG4gICAgICAgICAgICBjYW5SZWRvOiBjYW5SZWRvLmFzUmVhZG9ubHkoKVxuICAgICAgICB9KSksXG4gICAgICAgIHdpdGhNZXRob2RzKChzdG9yZSkgPT4gKHtcbiAgICAgICAgICAgIHVuZG8oKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHVuZG9TdGFjay5wb3AoKTtcblxuICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIHByZXZpb3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZG9TdGFjay5wdXNoKHByZXZpb3VzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBza2lwT25jZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdXBkYXRlSW50ZXJuYWwoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWRvKCk6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSByZWRvU3RhY2sucG9wKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBwcmV2aW91cykge1xuICAgICAgICAgICAgICAgICAgICB1bmRvU3RhY2sucHVzaChwcmV2aW91cyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2tpcE9uY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHVwZGF0ZUludGVybmFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKSxcbiAgICAgICAgd2l0aEhvb2tzKHtcbiAgICAgICAgICAgIG9uSW5pdChzdG9yZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICBlZmZlY3QoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmQgPSBrZXlzLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBzdG9yZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgJiYgaXNTaWduYWwocykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtrZXldOiBzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBPbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwT25jZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgcmVkb1N0YWNrIGFmdGVyIHJlY29yZGVkIGFjdGlvblxuICAgICAgICAgICAgICAgICAgICByZWRvU3RhY2suc3BsaWNlKDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5kb1N0YWNrLnB1c2gocHJldmlvdXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZG9TdGFjay5sZW5ndGggPiBub3JtYWxpemVkLm1heFN0YWNrU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5kb1N0YWNrLnVuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gY2FuZDtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBwcm9wb2dhdGUgY3VycmVudCByZWFjdGl2ZSBjb250ZXh0XG4gICAgICAgICAgICAgICAgICAgIHVudHJhY2tlZCgoKSA9PiB1cGRhdGVJbnRlcm5hbCgpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgKVxufVxuIl19