@o3r/store-sync 15.3.0-prerelease.16 → 15.3.0-prerelease.17

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.
@@ -1,458 +1,229 @@
1
- import { INIT, UPDATE, createAction, props } from '@ngrx/store';
2
- import equal from 'fast-deep-equal';
3
- import { utils } from '@ama-sdk/core';
4
- import { deepFill } from '@o3r/core';
5
-
6
- const mapper = [
7
- {
8
- condition: (data) => data instanceof utils.DateTime,
9
- construct: (data) => new utils.DateTime(data)
10
- },
11
- {
12
- condition: (data) => data instanceof utils.Date,
13
- construct: (data) => new utils.Date(data)
14
- }
15
- ];
16
- /**
17
- * Deep fill of base object using source
18
- * It will do a deep merge of the objects, overriding arrays
19
- * All properties not present in source, but present in base, will remain
20
- * @param base
21
- * @param source
22
- */
1
+ import { INIT, UPDATE, createAction, props } from "@ngrx/store";
2
+ import equal from "fast-deep-equal";
3
+ import { utils } from "@ama-sdk/core";
4
+ import { deepFill } from "@o3r/core";
5
+ const mapper = [{
6
+ condition: (data) => data instanceof utils.DateTime,
7
+ construct: (data) => new utils.DateTime(data)
8
+ }, {
9
+ condition: (data) => data instanceof utils.Date,
10
+ construct: (data) => new utils.Date(data)
11
+ }];
23
12
  function deepFillWithDate(base, source) {
24
- return deepFill(base, source, mapper);
13
+ return deepFill(base, source, mapper);
25
14
  }
26
-
27
- /**
28
- * Reviver the date from a JSON field if the string is matching iso format. Return the same value otherwise
29
- * @param _key JSON item key name
30
- * @param value JSON item value
31
- */
32
15
  const dateReviver = (_key, value) => {
33
- if (typeof value === 'string' && /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/.test(value)) {
34
- return new Date(value);
35
- }
36
- return value;
16
+ if (typeof value === "string" && /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/.test(value)) return new Date(value);
17
+ return value;
37
18
  };
38
- /**
39
- * Dummy reviver returning the value of the field as it is
40
- * @param _key JSON item key name
41
- * @param value JSON item value
42
- */
43
19
  const dummyReviver = (_key, value) => value;
44
- /**
45
- * Determine if the code is run in a browser
46
- */
47
20
  const checkIsBrowserEnv = () => {
48
- return typeof window !== 'undefined';
21
+ return typeof window !== "undefined";
49
22
  };
50
- /**
51
- * Validate the keys structure of the registered stores
52
- * @param keys map of store to synchronize
53
- */
54
23
  const validateStateKeys = (keys) => {
55
- return keys.map((key) => {
56
- let attr = key;
57
- if (typeof key === 'object') {
58
- attr = Object.keys(key)[0];
59
- }
60
- if (typeof attr !== 'string') {
61
- throw new TypeError('localStorageSync Unknown Parameter Type: ' + `Expected type of string, got ${typeof attr}`);
62
- }
63
- return key;
64
- });
24
+ return keys.map((key) => {
25
+ let attr = key;
26
+ if (typeof key === "object") attr = Object.keys(key)[0];
27
+ if (typeof attr !== "string") throw new TypeError(`localStorageSync Unknown Parameter Type: Expected type of string, got ${typeof attr}`);
28
+ return key;
29
+ });
65
30
  };
66
- /**
67
- * Rehydrate the state of the whole application store
68
- * @param keys Keys of the store to rehydrate
69
- * @param storage storage when getting the data from
70
- * @param storageKeySerializer storage key transform function
71
- * @param restoreDates determine if the date need to be restored
72
- * @param logger
73
- */
74
31
  const rehydrateApplicationState = (keys, storage, storageKeySerializer, restoreDates, logger = console) => {
75
- return keys.reduce((acc, curr) => {
76
- let key = curr;
77
- let reviver = restoreDates ? dateReviver : dummyReviver;
78
- let deserialize;
79
- let decrypt;
80
- let syncForFeature = false;
81
- if (typeof key === 'object') {
82
- key = Object.keys(key)[0];
83
- syncForFeature = !!curr?.[key]?.syncForFeature;
84
- // use the custom reviver function
85
- if (typeof curr[key] === 'function') {
86
- reviver = curr[key];
87
- }
88
- else {
89
- // use custom reviver function if available
90
- if (curr[key].reviver) {
91
- reviver = curr[key].reviver;
92
- }
93
- // use custom serialize function if available
94
- if (curr[key].deserialize) {
95
- deserialize = curr[key].deserialize;
96
- }
97
- }
98
- // Ensure that encrypt and decrypt functions are both present
99
- if (curr[key].encrypt && curr[key].decrypt) {
100
- if (typeof curr[key].encrypt === 'function' && typeof curr[key].decrypt === 'function') {
101
- decrypt = curr[key].decrypt;
102
- }
103
- else {
104
- logger.error(`Either encrypt or decrypt is not a function on '${curr[key]}' key object.`);
105
- }
106
- }
107
- else if (curr[key].encrypt || curr[key].decrypt) {
108
- // Let know that one of the encryption functions is not provided
109
- logger.error(`Either encrypt or decrypt function is not present on '${curr[key]}' key object.`);
110
- }
111
- }
112
- if (storage !== undefined) {
113
- let stateSlice = storage.getItem(storageKeySerializer(key));
114
- if (stateSlice) {
115
- // Use provided decrypt function
116
- if (decrypt) {
117
- stateSlice = decrypt(stateSlice);
118
- }
119
- const isObjectRegex = new RegExp('{|\\[');
120
- let raw = stateSlice;
121
- if (stateSlice === 'null' || stateSlice === 'true' || stateSlice === 'false' || isObjectRegex.test(stateSlice.charAt(0))) {
122
- raw = JSON.parse(stateSlice, reviver);
123
- }
124
- const rehydratedState = deserialize ? deserialize(raw) : raw;
125
- return syncForFeature
126
- ? rehydratedState
127
- : Object.assign({}, acc, {
128
- [key]: rehydratedState
129
- });
130
- }
131
- }
132
- return acc;
133
- }, {});
32
+ return keys.reduce((acc, curr) => {
33
+ let key = curr;
34
+ let reviver = restoreDates ? dateReviver : dummyReviver;
35
+ let deserialize;
36
+ let decrypt;
37
+ let syncForFeature = false;
38
+ if (typeof key === "object") {
39
+ key = Object.keys(key)[0];
40
+ syncForFeature = !!curr?.[key]?.syncForFeature;
41
+ if (typeof curr[key] === "function") reviver = curr[key];
42
+ else {
43
+ if (curr[key].reviver) reviver = curr[key].reviver;
44
+ if (curr[key].deserialize) deserialize = curr[key].deserialize;
45
+ }
46
+ if (curr[key].encrypt && curr[key].decrypt) {
47
+ if (typeof curr[key].encrypt === "function" && typeof curr[key].decrypt === "function") decrypt = curr[key].decrypt;
48
+ else logger.error(`Either encrypt or decrypt is not a function on '${curr[key]}' key object.`);
49
+ } else if (curr[key].encrypt || curr[key].decrypt) logger.error(`Either encrypt or decrypt function is not present on '${curr[key]}' key object.`);
50
+ }
51
+ if (storage !== void 0) {
52
+ let stateSlice = storage.getItem(storageKeySerializer(key));
53
+ if (stateSlice) {
54
+ if (decrypt) stateSlice = decrypt(stateSlice);
55
+ const isObjectRegex = /* @__PURE__ */ new RegExp("{|\\[");
56
+ let raw = stateSlice;
57
+ if (stateSlice === "null" || stateSlice === "true" || stateSlice === "false" || isObjectRegex.test(stateSlice.charAt(0))) raw = JSON.parse(stateSlice, reviver);
58
+ const rehydratedState = deserialize ? deserialize(raw) : raw;
59
+ return syncForFeature ? rehydratedState : Object.assign({}, acc, { [key]: rehydratedState });
60
+ }
61
+ }
62
+ return acc;
63
+ }, {});
134
64
  };
135
- // Recursively traverse all properties of the existing slice as defined by the `filter` argument,
136
- // and output the new object with extraneous properties removed.
137
65
  function createStateSlice(existingSlice, filter) {
138
- return filter.reduce((memo, attr) => {
139
- if (typeof attr === 'string' || typeof attr === 'number') {
140
- const value = existingSlice?.[attr];
141
- if (value !== undefined) {
142
- memo[attr] = value;
143
- }
144
- }
145
- else {
146
- for (const key in attr) {
147
- if (Object.prototype.hasOwnProperty.call(attr, key)) {
148
- const element = attr[key];
149
- memo[key] = createStateSlice(existingSlice[key], element);
150
- }
151
- }
152
- }
153
- return memo;
154
- }, {});
66
+ return filter.reduce((memo, attr) => {
67
+ if (typeof attr === "string" || typeof attr === "number") {
68
+ const value = existingSlice?.[attr];
69
+ if (value !== void 0) memo[attr] = value;
70
+ } else for (const key in attr) if (Object.prototype.hasOwnProperty.call(attr, key)) {
71
+ const element = attr[key];
72
+ memo[key] = createStateSlice(existingSlice[key], element);
73
+ }
74
+ return memo;
75
+ }, {});
155
76
  }
156
- /**
157
- * Update the state of the store after reviving from storage
158
- * Note: this function is mainly use for internal process of store synchronization
159
- * @param state store state
160
- * @param keys key of the store
161
- * @param storage storage to use for the synchronization
162
- * @param storageKeySerializer callback to serialize the store key
163
- * @param removeOnUndefined Define if the store should be clean in the storage if undefined
164
- * @param syncCondition callback to define if the synchronization should be process
165
- * @param logger Logger to report messages
166
- */
167
77
  const syncStateUpdate = (state, keys, storage, storageKeySerializer, removeOnUndefined = false, syncCondition, logger = console) => {
168
- if (syncCondition) {
169
- try {
170
- if (syncCondition(state) !== true) {
171
- return;
172
- }
173
- }
174
- catch (e) {
175
- // Treat TypeError as do not sync
176
- if (e instanceof TypeError) {
177
- return;
178
- }
179
- throw e;
180
- }
181
- }
182
- keys.forEach((key) => {
183
- let stateSlice = state?.[key];
184
- let replacer;
185
- let space;
186
- let encrypt;
187
- let syncForFeature = false;
188
- if (typeof key === 'object') {
189
- const name = Object.keys(key)[0];
190
- syncForFeature = !!key?.[name]?.syncForFeature;
191
- stateSlice = syncForFeature ? state : state?.[name];
192
- if (typeof stateSlice !== 'undefined' && key[name]) {
193
- // use serialize function if specified.
194
- if (key[name].serialize) {
195
- stateSlice = key[name].serialize(stateSlice);
196
- }
197
- else {
198
- // if serialize function is not specified filter on fields if an array has been provided.
199
- let filter;
200
- if (key[name].reduce) {
201
- filter = key[name];
202
- }
203
- else if (key[name].filter) {
204
- filter = key[name].filter;
205
- }
206
- if (filter) {
207
- stateSlice = createStateSlice(stateSlice, filter);
208
- }
209
- // Check if encrypt and decrypt are present, also checked at this#rehydrateApplicationState()
210
- if (key[name].encrypt && key[name].decrypt) {
211
- if (typeof key[name].encrypt === 'function') {
212
- encrypt = key[name].encrypt;
213
- }
214
- }
215
- else if (key[name].encrypt || key[name].decrypt) {
216
- // If one of those is not present, then let know that one is missing
217
- logger.error(`Either encrypt or decrypt function is not present on '${key[name]}' key object.`);
218
- }
219
- }
220
- /*
221
- Replacer and space arguments to pass to JSON.stringify.
222
- If these fields don't exist, undefined will be passed.
223
- */
224
- replacer = key[name].replacer;
225
- space = key[name].space;
226
- }
227
- key = name;
228
- }
229
- else if (typeof key === 'string') {
230
- stateSlice = syncForFeature ? state : state?.[key];
231
- }
232
- if (typeof stateSlice !== 'undefined' && storage !== undefined) {
233
- try {
234
- if (encrypt) {
235
- // ensure that a string message is passed
236
- stateSlice = encrypt(typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space));
237
- }
238
- storage.setItem(storageKeySerializer(key), typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space));
239
- }
240
- catch (e) {
241
- logger.warn('Unable to save state to localStorage:', e);
242
- }
243
- }
244
- else if (typeof stateSlice === 'undefined' && removeOnUndefined && storage !== undefined) {
245
- try {
246
- storage.removeItem(storageKeySerializer(key));
247
- }
248
- catch (e) {
249
- logger.warn(`Exception on removing/cleaning undefined '${key}' state`, e);
250
- }
251
- }
252
- });
78
+ if (syncCondition) try {
79
+ if (syncCondition(state) !== true) return;
80
+ } catch (e) {
81
+ if (e instanceof TypeError) return;
82
+ throw e;
83
+ }
84
+ keys.forEach((key) => {
85
+ let stateSlice = state?.[key];
86
+ let replacer;
87
+ let space;
88
+ let encrypt;
89
+ let syncForFeature = false;
90
+ if (typeof key === "object") {
91
+ const name = Object.keys(key)[0];
92
+ syncForFeature = !!key?.[name]?.syncForFeature;
93
+ stateSlice = syncForFeature ? state : state?.[name];
94
+ if (typeof stateSlice !== "undefined" && key[name]) {
95
+ if (key[name].serialize) stateSlice = key[name].serialize(stateSlice);
96
+ else {
97
+ let filter;
98
+ if (key[name].reduce) filter = key[name];
99
+ else if (key[name].filter) filter = key[name].filter;
100
+ if (filter) stateSlice = createStateSlice(stateSlice, filter);
101
+ if (key[name].encrypt && key[name].decrypt) {
102
+ if (typeof key[name].encrypt === "function") encrypt = key[name].encrypt;
103
+ } else if (key[name].encrypt || key[name].decrypt) logger.error(`Either encrypt or decrypt function is not present on '${key[name]}' key object.`);
104
+ }
105
+ replacer = key[name].replacer;
106
+ space = key[name].space;
107
+ }
108
+ key = name;
109
+ } else if (typeof key === "string") stateSlice = syncForFeature ? state : state?.[key];
110
+ if (typeof stateSlice !== "undefined" && storage !== void 0) try {
111
+ if (encrypt) stateSlice = encrypt(typeof stateSlice === "string" ? stateSlice : JSON.stringify(stateSlice, replacer, space));
112
+ storage.setItem(storageKeySerializer(key), typeof stateSlice === "string" ? stateSlice : JSON.stringify(stateSlice, replacer, space));
113
+ } catch (e) {
114
+ logger.warn("Unable to save state to localStorage:", e);
115
+ }
116
+ else if (typeof stateSlice === "undefined" && removeOnUndefined && storage !== void 0) try {
117
+ storage.removeItem(storageKeySerializer(key));
118
+ } catch (e) {
119
+ logger.warn(`Exception on removing/cleaning undefined '${key}' state`, e);
120
+ }
121
+ });
253
122
  };
254
123
  const defaultMergeReducer = (state, rehydratedState, action) => {
255
- if ((action.type === INIT || action.type === UPDATE) && rehydratedState) {
256
- const allKeys = Array.from(new Set([...Object.keys(state), ...Object.keys(rehydratedState)]));
257
- state = Object.fromEntries(allKeys.map((key) => {
258
- // No need to create new object reference if no merge is actually needed
259
- if (!rehydratedState[key]) {
260
- return [key, state[key]];
261
- }
262
- else if (state[key]) {
263
- return [key, deepFill(state[key], rehydratedState[key])];
264
- }
265
- else {
266
- return [key, rehydratedState[key]];
267
- }
268
- }));
269
- }
270
- return state;
124
+ if ((action.type === INIT || action.type === UPDATE) && rehydratedState) {
125
+ const allKeys = Array.from(/* @__PURE__ */ new Set([...Object.keys(state), ...Object.keys(rehydratedState)]));
126
+ state = Object.fromEntries(allKeys.map((key) => {
127
+ if (!rehydratedState[key]) return [key, state[key]];
128
+ else if (state[key]) return [key, deepFill(state[key], rehydratedState[key])];
129
+ else return [key, rehydratedState[key]];
130
+ }));
131
+ }
132
+ return state;
271
133
  };
272
- /**
273
- * Local and Session storage synchronization helper
274
- * @param config
275
- */
276
134
  const syncStorage = (config) => (reducer) => {
277
- if ((config.storage === undefined && !config.checkStorageAvailability)
278
- || (config.checkStorageAvailability && checkIsBrowserEnv())) {
279
- config.storage = localStorage || window.localStorage;
280
- }
281
- if (config.storageKeySerializer === undefined) {
282
- config.storageKeySerializer = (key) => key;
283
- }
284
- if (config.restoreDates === undefined) {
285
- config.restoreDates = true;
286
- }
287
- // Use default merge reducer.
288
- let mergeReducer = config.mergeReducer;
289
- if (mergeReducer === undefined || typeof mergeReducer !== 'function') {
290
- mergeReducer = defaultMergeReducer;
291
- }
292
- const logger = config.logger || console;
293
- const stateKeys = validateStateKeys(config.keys);
294
- const rehydratedState = config.rehydrate
295
- ? rehydrateApplicationState(stateKeys, config.storage, config.storageKeySerializer, config.restoreDates, logger)
296
- : undefined;
297
- return (state, action) => {
298
- let nextState;
299
- // If state arrives undefined, we need to let it through the supplied reducer
300
- // in order to get a complete state as defined by user
301
- nextState = action.type === INIT && !state ? reducer(state, action) : { ...state };
302
- // Merge the store state with the rehydrated state using
303
- // either a user-defined reducer or the default.
304
- nextState = mergeReducer(nextState, rehydratedState, action);
305
- nextState = reducer(nextState, action);
306
- if (action.type !== INIT) {
307
- syncStateUpdate(nextState, (typeof config.syncKeyCondition === 'function')
308
- ? stateKeys.filter((key) => {
309
- const keyName = typeof key === 'object' ? Object.keys(key)[0] : key;
310
- return config.syncKeyCondition(keyName, nextState);
311
- })
312
- : stateKeys, config.storage, config.storageKeySerializer, config.removeOnUndefined, config.syncCondition, logger);
313
- }
314
- if (config.postProcess) {
315
- config.postProcess(nextState);
316
- }
317
- return nextState;
318
- };
135
+ if (config.storage === void 0 && !config.checkStorageAvailability || config.checkStorageAvailability && checkIsBrowserEnv()) config.storage = localStorage || window.localStorage;
136
+ if (config.storageKeySerializer === void 0) config.storageKeySerializer = (key) => key;
137
+ if (config.restoreDates === void 0) config.restoreDates = true;
138
+ let mergeReducer = config.mergeReducer;
139
+ if (mergeReducer === void 0 || typeof mergeReducer !== "function") mergeReducer = defaultMergeReducer;
140
+ const logger = config.logger || console;
141
+ const stateKeys = validateStateKeys(config.keys);
142
+ const rehydratedState = config.rehydrate ? rehydrateApplicationState(stateKeys, config.storage, config.storageKeySerializer, config.restoreDates, logger) : void 0;
143
+ return (state, action) => {
144
+ let nextState;
145
+ nextState = action.type === INIT && !state ? reducer(state, action) : { ...state };
146
+ nextState = mergeReducer(nextState, rehydratedState, action);
147
+ nextState = reducer(nextState, action);
148
+ if (action.type !== INIT) syncStateUpdate(nextState, typeof config.syncKeyCondition === "function" ? stateKeys.filter((key) => {
149
+ const keyName = typeof key === "object" ? Object.keys(key)[0] : key;
150
+ return config.syncKeyCondition(keyName, nextState);
151
+ }) : stateKeys, config.storage, config.storageKeySerializer, config.removeOnUndefined, config.syncCondition, logger);
152
+ if (config.postProcess) config.postProcess(nextState);
153
+ return nextState;
154
+ };
319
155
  };
320
-
321
- /*
322
- * This file is a fork of the package ngrx-store-localstorage (https://github.com/btroncone/ngrx-store-localstorage) - MIT
323
- * The following update as been added:
324
- * - properly export dateReviver function
325
- * - add missing comments
326
- * - explicit dependency to @ngrx/store for action names
327
- * - change interface names to prefix with "sync"
328
- * - add logger support
329
- * - fix lint according to eslint rules
330
- * - split code in several files
331
- * - migrate tests to Jest
332
- */
333
-
334
- /**
335
- * Defines if an object is a Serializer
336
- * @param obj Object to test
337
- * @returns True if the object is a Serializer
338
- */
339
156
  const isSerializer = (obj) => !!(obj.serialize || obj.deserialize || obj.reviver || obj.replacer || obj.initialState);
340
- /**
341
- * Label of the action to rehydrate the store
342
- */
343
- const REHYDRATE_ACTION_LABEL = '[storeSync] rehydrate';
344
- /**
345
- * Action to rehydrate the store
346
- */
157
+ const REHYDRATE_ACTION_LABEL = "[storeSync] rehydrate";
347
158
  const rehydrateAction = createAction(REHYDRATE_ACTION_LABEL, props());
348
- /**
349
- * Defines if the storage is a non-async storage
350
- * @param options The storage config
351
- * @returns in case the storage used is a non-async storage
352
- */
353
159
  const isLocalStorageConfig = (options) => !options.storage || options.storage instanceof Storage;
354
-
355
- /**
356
- * Storage synchronizer
357
- */
358
- class StorageSync {
359
- constructor(options, extraOptions) {
360
- this.alreadyHydratedStoreSlices = new Set();
361
- this.hasHydrated = false;
362
- this.storeImage = {};
363
- /**
364
- * Handle state manipulation in case of store storage sync
365
- * Merge strategy is a full merge at init; When a new `store slice` is registered, its initial state is merged with its corresponding storage content
366
- * Pass it as mergeReducer callback when calling localStorageSync function from 'ngrx-store-localstorage', in the app
367
- * @param state actual state
368
- * @param rehydratedState state from storage
369
- * @param action Triggered action
370
- */
371
- this.mergeReducer = (state, rehydratedState, action) => {
372
- if (rehydratedState) {
373
- if (action.type === INIT) {
374
- state = deepFillWithDate(state, rehydratedState);
375
- }
376
- if (action.type === UPDATE && Array.isArray(action.features)) {
377
- const notHandledFeatures = action.features.filter((featName) => !this.alreadyHydratedStoreSlices.has(featName));
378
- notHandledFeatures.filter((featName) => !!rehydratedState[featName]).forEach((fName) => {
379
- state[fName] = state[fName] ? deepFillWithDate(state[fName], rehydratedState[fName]) : rehydratedState[fName];
380
- this.alreadyHydratedStoreSlices.add(fName);
381
- });
382
- }
383
- }
384
- return state;
385
- };
386
- /**
387
- * Returns a meta reducer that handles storage sync
388
- */
389
- this.localStorageSync = () => {
390
- const base = (reducer) => syncStorage({
391
- ...this.options,
392
- rehydrate: false,
393
- storage: this.options.storage,
394
- syncCondition: () => this.hasHydrated
395
- })(reducer);
396
- return (reducer) => {
397
- if (isLocalStorageConfig(this.options)) {
398
- return syncStorage(this.options)(reducer);
399
- }
400
- return (state, action) => {
401
- let hydratedState = state;
402
- if (action.type === rehydrateAction.type) {
403
- const hasAlreadyHydrated = this.hasHydrated;
404
- this.hasHydrated = true;
405
- const initialStates = this.options.keys.reduce((acc, key) => {
406
- const storeName = Object.keys(key)[0];
407
- const storeSynchronizer = key[storeName];
408
- if (isSerializer(storeSynchronizer)) {
409
- acc[storeName] = storeSynchronizer.initialState;
410
- }
411
- return acc;
412
- }, {});
413
- let overrides = {};
414
- if (!hasAlreadyHydrated) {
415
- overrides = Object.entries(action.payload).reduce((acc, [storeName, value]) => {
416
- if (!initialStates[storeName] || initialStates[storeName] === state[storeName]) {
417
- acc[storeName] = value;
418
- }
419
- else if (initialStates[storeName] !== state[storeName]) {
420
- (this.options.logger || console).error(`Unable to rehydrate store "${storeName}", it has been modified before being hydrated`);
421
- }
422
- return acc;
423
- }, {});
424
- }
425
- if (Object.keys(overrides).length > 0) {
426
- hydratedState = { ...state, ...overrides };
427
- }
428
- }
429
- return base(reducer)(hydratedState, action);
430
- };
431
- };
432
- };
433
- this.options = {
434
- keys: [],
435
- ...(extraOptions?.disableSmartSync
436
- ? {}
437
- : {
438
- syncKeyCondition: (key, state) => !equal(this.storeImage[key], state[key]),
439
- postProcess: (state) => {
440
- this.options.keys.forEach((key) => {
441
- const keyName = typeof key === 'object' ? Object.keys(key)[0] : key;
442
- this.storeImage[keyName] = state[keyName];
443
- });
444
- }
445
- }),
446
- ...options,
447
- storage: options?.storage,
448
- mergeReducer: typeof options?.mergeReducer === 'function' ? options.mergeReducer : this.mergeReducer
449
- };
450
- }
451
- }
452
-
453
- /**
454
- * Generated bundle index. Do not edit.
455
- */
456
-
160
+ var StorageSync = class {
161
+ constructor(options, extraOptions) {
162
+ this.alreadyHydratedStoreSlices = /* @__PURE__ */ new Set();
163
+ this.hasHydrated = false;
164
+ this.storeImage = {};
165
+ this.mergeReducer = (state, rehydratedState, action) => {
166
+ if (rehydratedState) {
167
+ if (action.type === INIT) state = deepFillWithDate(state, rehydratedState);
168
+ if (action.type === UPDATE && Array.isArray(action.features)) action.features.filter((featName) => !this.alreadyHydratedStoreSlices.has(featName)).filter((featName) => !!rehydratedState[featName]).forEach((fName) => {
169
+ state[fName] = state[fName] ? deepFillWithDate(state[fName], rehydratedState[fName]) : rehydratedState[fName];
170
+ this.alreadyHydratedStoreSlices.add(fName);
171
+ });
172
+ }
173
+ return state;
174
+ };
175
+ this.localStorageSync = () => {
176
+ const base = (reducer) => syncStorage({
177
+ ...this.options,
178
+ rehydrate: false,
179
+ storage: this.options.storage,
180
+ syncCondition: () => this.hasHydrated
181
+ })(reducer);
182
+ return (reducer) => {
183
+ if (isLocalStorageConfig(this.options)) return syncStorage(this.options)(reducer);
184
+ return (state, action) => {
185
+ let hydratedState = state;
186
+ if (action.type === rehydrateAction.type) {
187
+ const hasAlreadyHydrated = this.hasHydrated;
188
+ this.hasHydrated = true;
189
+ const initialStates = this.options.keys.reduce((acc, key) => {
190
+ const storeName = Object.keys(key)[0];
191
+ const storeSynchronizer = key[storeName];
192
+ if (isSerializer(storeSynchronizer)) acc[storeName] = storeSynchronizer.initialState;
193
+ return acc;
194
+ }, {});
195
+ let overrides = {};
196
+ if (!hasAlreadyHydrated) overrides = Object.entries(action.payload).reduce((acc, [storeName, value]) => {
197
+ if (!initialStates[storeName] || initialStates[storeName] === state[storeName]) acc[storeName] = value;
198
+ else if (initialStates[storeName] !== state[storeName]) (this.options.logger || console).error(`Unable to rehydrate store "${storeName}", it has been modified before being hydrated`);
199
+ return acc;
200
+ }, {});
201
+ if (Object.keys(overrides).length > 0) hydratedState = {
202
+ ...state,
203
+ ...overrides
204
+ };
205
+ }
206
+ return base(reducer)(hydratedState, action);
207
+ };
208
+ };
209
+ };
210
+ this.options = {
211
+ keys: [],
212
+ ...extraOptions?.disableSmartSync ? {} : {
213
+ syncKeyCondition: (key, state) => !equal(this.storeImage[key], state[key]),
214
+ postProcess: (state) => {
215
+ this.options.keys.forEach((key) => {
216
+ const keyName = typeof key === "object" ? Object.keys(key)[0] : key;
217
+ this.storeImage[keyName] = state[keyName];
218
+ });
219
+ }
220
+ },
221
+ ...options,
222
+ storage: options?.storage,
223
+ mergeReducer: typeof options?.mergeReducer === "function" ? options.mergeReducer : this.mergeReducer
224
+ };
225
+ }
226
+ };
457
227
  export { REHYDRATE_ACTION_LABEL, StorageSync, dateReviver, isLocalStorageConfig, isSerializer, rehydrateAction, rehydrateApplicationState, syncStateUpdate, syncStorage };
458
- //# sourceMappingURL=o3r-store-sync.mjs.map
228
+
229
+ //# sourceMappingURL=o3r-store-sync.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"o3r-store-sync.mjs","sources":["../../src/deep-fill/deep-fill.ts","../../src/sync-storage/storage-sync.ts","../../src/sync-storage/index.ts","../../src/core/storage-sync-helpers.ts","../../src/core/storage-sync.ts","../../src/o3r-store-sync.ts"],"sourcesContent":["import {\n utils,\n} from '@ama-sdk/core';\nimport {\n deepFill,\n type PrimitiveReviverMapper,\n} from '@o3r/core';\n\nconst mapper: PrimitiveReviverMapper[] = [\n {\n condition: (data) => data instanceof utils.DateTime,\n construct: (data) => new utils.DateTime(data)\n },\n {\n condition: (data) => data instanceof utils.Date,\n construct: (data) => new utils.Date(data)\n }\n];\n\n/**\n * Deep fill of base object using source\n * It will do a deep merge of the objects, overriding arrays\n * All properties not present in source, but present in base, will remain\n * @param base\n * @param source\n */\nexport function deepFillWithDate<T extends { [x: string]: any }>(base: T, source?: { [x: string]: any }): T {\n return deepFill(base, source, mapper);\n}\n","import {\n INIT,\n UPDATE,\n} from '@ngrx/store';\nimport {\n deepFill,\n} from '@o3r/core';\nimport type {\n Logger,\n} from '@o3r/core';\nimport type {\n StorageKeyConfiguration,\n StorageKeys,\n SyncStorageConfig,\n SyncStorageSyncOptions,\n} from './interfaces';\n\n/**\n * Reviver the date from a JSON field if the string is matching iso format. Return the same value otherwise\n * @param _key JSON item key name\n * @param value JSON item value\n */\nexport const dateReviver = (_key: string, value: any) => {\n if (typeof value === 'string' && /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/.test(value)) {\n return new Date(value);\n }\n return value;\n};\n\n/**\n * Dummy reviver returning the value of the field as it is\n * @param _key JSON item key name\n * @param value JSON item value\n */\nconst dummyReviver = (_key: string, value: any) => value;\n\n/**\n * Determine if the code is run in a browser\n */\nconst checkIsBrowserEnv = () => {\n return typeof window !== 'undefined';\n};\n\n/**\n * Validate the keys structure of the registered stores\n * @param keys map of store to synchronize\n */\nconst validateStateKeys = (keys: StorageKeys) => {\n return (keys as any[]).map((key) => {\n let attr = key;\n\n if (typeof key === 'object') {\n attr = Object.keys(key)[0];\n }\n\n if (typeof attr !== 'string') {\n throw new TypeError(\n 'localStorageSync Unknown Parameter Type: ' + `Expected type of string, got ${typeof attr}`\n );\n }\n return key;\n });\n};\n\n/**\n * Rehydrate the state of the whole application store\n * @param keys Keys of the store to rehydrate\n * @param storage storage when getting the data from\n * @param storageKeySerializer storage key transform function\n * @param restoreDates determine if the date need to be restored\n * @param logger\n */\nexport const rehydrateApplicationState = (\n keys: StorageKeys,\n storage: Storage | undefined,\n storageKeySerializer: (key: string) => string,\n restoreDates: boolean,\n logger: Logger = console\n) => {\n return (keys as any[]).reduce((acc, curr) => {\n let key = curr;\n let reviver = restoreDates ? dateReviver : dummyReviver;\n let deserialize: ((arg0: string) => any) | undefined;\n let decrypt: ((arg0: string) => string) | undefined;\n let syncForFeature = false;\n\n if (typeof key === 'object') {\n key = Object.keys(key)[0];\n syncForFeature = !!(curr?.[key] as SyncStorageSyncOptions)?.syncForFeature;\n\n // use the custom reviver function\n if (typeof curr[key] === 'function') {\n reviver = curr[key];\n } else {\n // use custom reviver function if available\n if (curr[key].reviver) {\n reviver = curr[key].reviver;\n }\n // use custom serialize function if available\n if (curr[key].deserialize) {\n deserialize = curr[key].deserialize;\n }\n }\n\n // Ensure that encrypt and decrypt functions are both present\n if (curr[key].encrypt && curr[key].decrypt) {\n if (typeof curr[key].encrypt === 'function' && typeof curr[key].decrypt === 'function') {\n decrypt = curr[key].decrypt;\n } else {\n logger.error(`Either encrypt or decrypt is not a function on '${curr[key] as string}' key object.`);\n }\n } else if (curr[key].encrypt || curr[key].decrypt) {\n // Let know that one of the encryption functions is not provided\n logger.error(`Either encrypt or decrypt function is not present on '${curr[key] as string}' key object.`);\n }\n }\n if (storage !== undefined) {\n let stateSlice = storage.getItem(storageKeySerializer(key));\n if (stateSlice) {\n // Use provided decrypt function\n if (decrypt) {\n stateSlice = decrypt(stateSlice);\n }\n\n const isObjectRegex = new RegExp('{|\\\\[');\n let raw = stateSlice;\n\n if (stateSlice === 'null' || stateSlice === 'true' || stateSlice === 'false' || isObjectRegex.test(stateSlice.charAt(0))) {\n raw = JSON.parse(stateSlice, reviver);\n }\n\n const rehydratedState = deserialize ? deserialize(raw) : raw;\n\n return syncForFeature\n ? rehydratedState\n : Object.assign({}, acc, {\n [key]: rehydratedState\n });\n }\n }\n return acc;\n }, {});\n};\n\n// Recursively traverse all properties of the existing slice as defined by the `filter` argument,\n// and output the new object with extraneous properties removed.\nfunction createStateSlice(existingSlice: any, filter: (string | number | StorageKeyConfiguration | SyncStorageSyncOptions)[]) {\n return filter.reduce(\n (memo: { [x: string]: any; [x: number]: any }, attr: string | number | StorageKeyConfiguration | SyncStorageSyncOptions) => {\n if (typeof attr === 'string' || typeof attr === 'number') {\n const value = existingSlice?.[attr];\n if (value !== undefined) {\n memo[attr] = value;\n }\n } else {\n for (const key in attr) {\n if (Object.prototype.hasOwnProperty.call(attr, key)) {\n const element: any = attr[key as keyof typeof attr];\n memo[key] = createStateSlice(existingSlice[key], element);\n }\n }\n }\n return memo;\n },\n {}\n );\n}\n\n/**\n * Update the state of the store after reviving from storage\n * Note: this function is mainly use for internal process of store synchronization\n * @param state store state\n * @param keys key of the store\n * @param storage storage to use for the synchronization\n * @param storageKeySerializer callback to serialize the store key\n * @param removeOnUndefined Define if the store should be clean in the storage if undefined\n * @param syncCondition callback to define if the synchronization should be process\n * @param logger Logger to report messages\n */\nexport const syncStateUpdate = (\n state: any,\n keys: StorageKeys,\n storage: Storage | undefined,\n storageKeySerializer: (key: string | number) => string,\n removeOnUndefined = false,\n syncCondition?: (state: any) => any,\n logger: Logger = console\n) => {\n if (syncCondition) {\n try {\n if (syncCondition(state) !== true) {\n return;\n }\n } catch (e) {\n // Treat TypeError as do not sync\n if (e instanceof TypeError) {\n return;\n }\n throw e;\n }\n }\n\n keys.forEach((key: string | StorageKeyConfiguration | SyncStorageSyncOptions | ((key: string, value: any) => any)): void => {\n let stateSlice = state?.[key as string];\n let replacer;\n let space: string | number | undefined;\n let encrypt;\n let syncForFeature = false;\n\n if (typeof key === 'object') {\n const name = (Object.keys(key) as (keyof typeof key)[])[0];\n syncForFeature = !!(key?.[name] as SyncStorageSyncOptions)?.syncForFeature;\n stateSlice = syncForFeature ? state : state?.[name];\n\n if (typeof stateSlice !== 'undefined' && key[name]) {\n // use serialize function if specified.\n if ((key[name] as any).serialize) {\n stateSlice = (key[name] as SyncStorageSyncOptions).serialize!(stateSlice);\n } else {\n // if serialize function is not specified filter on fields if an array has been provided.\n let filter: StorageKeyConfiguration[] | undefined;\n if ((key[name] as any).reduce) {\n filter = key[name] as StorageKeyConfiguration[];\n } else if ((key[name] as any).filter) {\n filter = (key[name] as any).filter as StorageKeyConfiguration[];\n }\n if (filter) {\n stateSlice = createStateSlice(stateSlice, filter);\n }\n\n // Check if encrypt and decrypt are present, also checked at this#rehydrateApplicationState()\n if ((key[name] as any).encrypt && (key[name] as any).decrypt) {\n if (typeof (key[name] as any).encrypt === 'function') {\n encrypt = (key[name] as any).encrypt;\n }\n } else if ((key[name] as any).encrypt || (key[name] as any).decrypt) {\n // If one of those is not present, then let know that one is missing\n logger.error(\n `Either encrypt or decrypt function is not present on '${key[name] as string}' key object.`\n );\n }\n }\n\n /*\n Replacer and space arguments to pass to JSON.stringify.\n If these fields don't exist, undefined will be passed.\n */\n replacer = (key[name] as any).replacer;\n space = (key[name] as any).space;\n }\n\n key = name;\n } else if (typeof key === 'string') {\n stateSlice = syncForFeature ? state : state?.[key];\n }\n\n if (typeof stateSlice !== 'undefined' && storage !== undefined) {\n try {\n if (encrypt) {\n // ensure that a string message is passed\n stateSlice = encrypt(\n typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space)\n );\n }\n storage.setItem(\n storageKeySerializer(key as string),\n typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space)\n );\n } catch (e) {\n logger.warn('Unable to save state to localStorage:', e);\n }\n } else if (typeof stateSlice === 'undefined' && removeOnUndefined && storage !== undefined) {\n try {\n storage.removeItem(storageKeySerializer(key as string));\n } catch (e) {\n logger.warn(`Exception on removing/cleaning undefined '${key as string}' state`, e);\n }\n }\n });\n};\n\nconst defaultMergeReducer = (state: any, rehydratedState: any, action: any) => {\n if ((action.type === INIT || action.type === UPDATE) && rehydratedState) {\n const allKeys = Array.from(new Set([...Object.keys(state), ...Object.keys(rehydratedState)]));\n state = Object.fromEntries(allKeys.map((key) => {\n // No need to create new object reference if no merge is actually needed\n if (!rehydratedState[key]) {\n return [key, state[key]];\n } else if (state[key]) {\n return [key, deepFill(state[key], rehydratedState[key])];\n } else {\n return [key, rehydratedState[key]];\n }\n }));\n }\n\n return state;\n};\n\n/**\n * Local and Session storage synchronization helper\n * @param config\n */\nexport const syncStorage = (config: SyncStorageConfig) => (reducer: any) => {\n if (\n (config.storage === undefined && !config.checkStorageAvailability)\n || (config.checkStorageAvailability && checkIsBrowserEnv())\n ) {\n config.storage = localStorage || window.localStorage;\n }\n\n if (config.storageKeySerializer === undefined) {\n config.storageKeySerializer = (key) => key;\n }\n\n if (config.restoreDates === undefined) {\n config.restoreDates = true;\n }\n\n // Use default merge reducer.\n let mergeReducer = config.mergeReducer;\n\n if (mergeReducer === undefined || typeof mergeReducer !== 'function') {\n mergeReducer = defaultMergeReducer;\n }\n\n const logger = config.logger || console;\n\n const stateKeys = validateStateKeys(config.keys);\n const rehydratedState = config.rehydrate\n ? rehydrateApplicationState(stateKeys, config.storage, config.storageKeySerializer, config.restoreDates, logger)\n : undefined;\n\n return (state: any, action: any) => {\n let nextState: any;\n\n // If state arrives undefined, we need to let it through the supplied reducer\n // in order to get a complete state as defined by user\n nextState = action.type === INIT && !state ? reducer(state, action) : { ...state };\n\n // Merge the store state with the rehydrated state using\n // either a user-defined reducer or the default.\n nextState = mergeReducer(nextState, rehydratedState, action);\n\n nextState = reducer(nextState, action);\n\n if (action.type !== INIT) {\n syncStateUpdate(\n nextState,\n (typeof config.syncKeyCondition === 'function')\n ? stateKeys.filter((key) => {\n const keyName = typeof key === 'object' ? Object.keys(key)[0] : key;\n return config.syncKeyCondition!(keyName, nextState);\n })\n : stateKeys,\n config.storage,\n config.storageKeySerializer as (key: string | number) => string,\n config.removeOnUndefined,\n config.syncCondition,\n logger\n );\n }\n if (config.postProcess) {\n config.postProcess(nextState);\n }\n return nextState;\n };\n};\n","/*\n * This file is a fork of the package ngrx-store-localstorage (https://github.com/btroncone/ngrx-store-localstorage) - MIT\n * The following update as been added:\n * - properly export dateReviver function\n * - add missing comments\n * - explicit dependency to @ngrx/store for action names\n * - change interface names to prefix with \"sync\"\n * - add logger support\n * - fix lint according to eslint rules\n * - split code in several files\n * - migrate tests to Jest\n */\n\nexport * from './interfaces';\nexport * from './storage-sync';\n","import {\n createAction,\n props,\n} from '@ngrx/store';\nimport type {\n Serializer,\n} from '@o3r/core';\nimport type {\n SyncStorageConfig,\n} from '../sync-storage';\nimport type {\n StorageSyncOptions,\n} from './interfaces';\n\n/**\n * Defines if an object is a Serializer\n * @param obj Object to test\n * @returns True if the object is a Serializer\n */\nexport const isSerializer = (obj: any): obj is Serializer<any> => !!(obj.serialize || obj.deserialize || obj.reviver || obj.replacer || obj.initialState);\n\n/**\n * Label of the action to rehydrate the store\n */\nexport const REHYDRATE_ACTION_LABEL = '[storeSync] rehydrate';\n\n/**\n * Action to rehydrate the store\n */\nexport const rehydrateAction = createAction(REHYDRATE_ACTION_LABEL, props<{\n payload: Record<string, any>;\n}>());\n\n/**\n * Defines if the storage is a non-async storage\n * @param options The storage config\n * @returns in case the storage used is a non-async storage\n */\nexport const isLocalStorageConfig = (options: StorageSyncOptions): options is SyncStorageConfig => !options.storage || options.storage instanceof Storage;\n","import {\n INIT,\n UPDATE,\n} from '@ngrx/store';\nimport equal from 'fast-deep-equal';\nimport {\n deepFillWithDate,\n} from '../deep-fill/deep-fill';\nimport {\n syncStorage,\n} from '../sync-storage';\nimport type {\n StorageSyncOptions,\n} from './interfaces';\nimport {\n StorageSyncConstructorOptions,\n} from './interfaces';\nimport {\n isLocalStorageConfig,\n isSerializer,\n rehydrateAction,\n} from './storage-sync-helpers';\n\n/**\n * Storage synchronizer\n */\nexport class StorageSync {\n private readonly alreadyHydratedStoreSlices: Set<string> = new Set();\n private hasHydrated = false;\n private readonly storeImage: { [key: string]: any } = {};\n\n public options: StorageSyncOptions;\n\n constructor(options?: StorageSyncConstructorOptions, extraOptions?: { disableSmartSync: boolean }) {\n this.options = {\n keys: [],\n ...(extraOptions?.disableSmartSync\n ? {}\n : {\n syncKeyCondition: (key, state) => !equal(this.storeImage[key], state[key]),\n postProcess: (state) => {\n this.options.keys.forEach((key) => {\n const keyName: string = typeof key === 'object' ? Object.keys(key)[0] : key;\n this.storeImage[keyName] = state[keyName];\n });\n }\n }),\n ...options,\n storage: options?.storage as unknown as Storage,\n mergeReducer: typeof options?.mergeReducer === 'function' ? options.mergeReducer : this.mergeReducer\n };\n }\n\n /**\n * Handle state manipulation in case of store storage sync\n * Merge strategy is a full merge at init; When a new `store slice` is registered, its initial state is merged with its corresponding storage content\n * Pass it as mergeReducer callback when calling localStorageSync function from 'ngrx-store-localstorage', in the app\n * @param state actual state\n * @param rehydratedState state from storage\n * @param action Triggered action\n */\n public readonly mergeReducer = (state: any, rehydratedState: any, action: any) => {\n if (rehydratedState) {\n if (action.type === INIT) {\n state = deepFillWithDate(state, rehydratedState);\n }\n if (action.type === UPDATE && Array.isArray(action.features)) {\n const notHandledFeatures = action.features.filter((featName: string) => !this.alreadyHydratedStoreSlices.has(featName));\n\n notHandledFeatures.filter((featName: string) => !!rehydratedState[featName]).forEach((fName: string) => {\n state[fName] = state[fName] ? deepFillWithDate(state[fName], rehydratedState[fName]) : rehydratedState[fName];\n this.alreadyHydratedStoreSlices.add(fName);\n });\n }\n }\n return state;\n };\n\n /**\n * Returns a meta reducer that handles storage sync\n */\n public localStorageSync = () => {\n const base = (reducer: any) => syncStorage({\n ...this.options,\n rehydrate: false,\n storage: this.options.storage as unknown as Storage,\n syncCondition: () => this.hasHydrated\n })(reducer);\n\n return (reducer: any) => {\n if (isLocalStorageConfig(this.options)) {\n return syncStorage(this.options)(reducer);\n }\n\n return (state: any, action: any) => {\n let hydratedState = state;\n if (action.type === rehydrateAction.type) {\n const hasAlreadyHydrated = this.hasHydrated;\n this.hasHydrated = true;\n const initialStates = this.options.keys.reduce((acc: Record<string, any>, key) => {\n const storeName = Object.keys(key)[0];\n const storeSynchronizer = (key as any)[storeName];\n if (isSerializer(storeSynchronizer)) {\n acc[storeName] = storeSynchronizer.initialState;\n }\n return acc;\n }, {});\n let overrides = {};\n if (!hasAlreadyHydrated) {\n overrides = Object.entries(action.payload).reduce<Record<string, any>>((acc, [storeName, value]) => {\n if (!initialStates[storeName] || initialStates[storeName] === state[storeName]) {\n acc[storeName] = value;\n } else if (initialStates[storeName] !== state[storeName]) {\n (this.options.logger || console).error(`Unable to rehydrate store \"${storeName}\", it has been modified before being hydrated`);\n }\n return acc;\n }, {});\n }\n if (Object.keys(overrides).length > 0) {\n hydratedState = { ...state, ...overrides };\n }\n }\n return base(reducer)(hydratedState, action);\n };\n };\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"o3r-store-sync.mjs","names":[],"sources":["../../src/deep-fill/deep-fill.ts","../../src/sync-storage/storage-sync.ts","../../src/core/storage-sync-helpers.ts","../../src/core/storage-sync.ts"],"sourcesContent":["import {\n utils,\n} from '@ama-sdk/core';\nimport {\n deepFill,\n type PrimitiveReviverMapper,\n} from '@o3r/core';\n\nconst mapper: PrimitiveReviverMapper[] = [\n {\n condition: (data) => data instanceof utils.DateTime,\n construct: (data) => new utils.DateTime(data)\n },\n {\n condition: (data) => data instanceof utils.Date,\n construct: (data) => new utils.Date(data)\n }\n];\n\n/**\n * Deep fill of base object using source\n * It will do a deep merge of the objects, overriding arrays\n * All properties not present in source, but present in base, will remain\n * @param base\n * @param source\n */\nexport function deepFillWithDate<T extends { [x: string]: any }>(base: T, source?: { [x: string]: any }): T {\n return deepFill(base, source, mapper);\n}\n","import {\n INIT,\n UPDATE,\n} from '@ngrx/store';\nimport {\n deepFill,\n} from '@o3r/core';\nimport type {\n Logger,\n} from '@o3r/core';\nimport type {\n StorageKeyConfiguration,\n StorageKeys,\n SyncStorageConfig,\n SyncStorageSyncOptions,\n} from './interfaces';\n\n/**\n * Reviver the date from a JSON field if the string is matching iso format. Return the same value otherwise\n * @param _key JSON item key name\n * @param value JSON item value\n */\nexport const dateReviver = (_key: string, value: any) => {\n if (typeof value === 'string' && /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/.test(value)) {\n return new Date(value);\n }\n return value;\n};\n\n/**\n * Dummy reviver returning the value of the field as it is\n * @param _key JSON item key name\n * @param value JSON item value\n */\nconst dummyReviver = (_key: string, value: any) => value;\n\n/**\n * Determine if the code is run in a browser\n */\nconst checkIsBrowserEnv = () => {\n return typeof window !== 'undefined';\n};\n\n/**\n * Validate the keys structure of the registered stores\n * @param keys map of store to synchronize\n */\nconst validateStateKeys = (keys: StorageKeys) => {\n return (keys as any[]).map((key) => {\n let attr = key;\n\n if (typeof key === 'object') {\n attr = Object.keys(key)[0];\n }\n\n if (typeof attr !== 'string') {\n throw new TypeError(\n 'localStorageSync Unknown Parameter Type: ' + `Expected type of string, got ${typeof attr}`\n );\n }\n return key;\n });\n};\n\n/**\n * Rehydrate the state of the whole application store\n * @param keys Keys of the store to rehydrate\n * @param storage storage when getting the data from\n * @param storageKeySerializer storage key transform function\n * @param restoreDates determine if the date need to be restored\n * @param logger\n */\nexport const rehydrateApplicationState = (\n keys: StorageKeys,\n storage: Storage | undefined,\n storageKeySerializer: (key: string) => string,\n restoreDates: boolean,\n logger: Logger = console\n) => {\n return (keys as any[]).reduce((acc, curr) => {\n let key = curr;\n let reviver = restoreDates ? dateReviver : dummyReviver;\n let deserialize: ((arg0: string) => any) | undefined;\n let decrypt: ((arg0: string) => string) | undefined;\n let syncForFeature = false;\n\n if (typeof key === 'object') {\n key = Object.keys(key)[0];\n syncForFeature = !!(curr?.[key] as SyncStorageSyncOptions)?.syncForFeature;\n\n // use the custom reviver function\n if (typeof curr[key] === 'function') {\n reviver = curr[key];\n } else {\n // use custom reviver function if available\n if (curr[key].reviver) {\n reviver = curr[key].reviver;\n }\n // use custom serialize function if available\n if (curr[key].deserialize) {\n deserialize = curr[key].deserialize;\n }\n }\n\n // Ensure that encrypt and decrypt functions are both present\n if (curr[key].encrypt && curr[key].decrypt) {\n if (typeof curr[key].encrypt === 'function' && typeof curr[key].decrypt === 'function') {\n decrypt = curr[key].decrypt;\n } else {\n logger.error(`Either encrypt or decrypt is not a function on '${curr[key] as string}' key object.`);\n }\n } else if (curr[key].encrypt || curr[key].decrypt) {\n // Let know that one of the encryption functions is not provided\n logger.error(`Either encrypt or decrypt function is not present on '${curr[key] as string}' key object.`);\n }\n }\n if (storage !== undefined) {\n let stateSlice = storage.getItem(storageKeySerializer(key));\n if (stateSlice) {\n // Use provided decrypt function\n if (decrypt) {\n stateSlice = decrypt(stateSlice);\n }\n\n const isObjectRegex = new RegExp('{|\\\\[');\n let raw = stateSlice;\n\n if (stateSlice === 'null' || stateSlice === 'true' || stateSlice === 'false' || isObjectRegex.test(stateSlice.charAt(0))) {\n raw = JSON.parse(stateSlice, reviver);\n }\n\n const rehydratedState = deserialize ? deserialize(raw) : raw;\n\n return syncForFeature\n ? rehydratedState\n : Object.assign({}, acc, {\n [key]: rehydratedState\n });\n }\n }\n return acc;\n }, {});\n};\n\n// Recursively traverse all properties of the existing slice as defined by the `filter` argument,\n// and output the new object with extraneous properties removed.\nfunction createStateSlice(existingSlice: any, filter: (string | number | StorageKeyConfiguration | SyncStorageSyncOptions)[]) {\n return filter.reduce(\n (memo: { [x: string]: any; [x: number]: any }, attr: string | number | StorageKeyConfiguration | SyncStorageSyncOptions) => {\n if (typeof attr === 'string' || typeof attr === 'number') {\n const value = existingSlice?.[attr];\n if (value !== undefined) {\n memo[attr] = value;\n }\n } else {\n for (const key in attr) {\n if (Object.prototype.hasOwnProperty.call(attr, key)) {\n const element: any = attr[key as keyof typeof attr];\n memo[key] = createStateSlice(existingSlice[key], element);\n }\n }\n }\n return memo;\n },\n {}\n );\n}\n\n/**\n * Update the state of the store after reviving from storage\n * Note: this function is mainly use for internal process of store synchronization\n * @param state store state\n * @param keys key of the store\n * @param storage storage to use for the synchronization\n * @param storageKeySerializer callback to serialize the store key\n * @param removeOnUndefined Define if the store should be clean in the storage if undefined\n * @param syncCondition callback to define if the synchronization should be process\n * @param logger Logger to report messages\n */\nexport const syncStateUpdate = (\n state: any,\n keys: StorageKeys,\n storage: Storage | undefined,\n storageKeySerializer: (key: string | number) => string,\n removeOnUndefined = false,\n syncCondition?: (state: any) => any,\n logger: Logger = console\n) => {\n if (syncCondition) {\n try {\n if (syncCondition(state) !== true) {\n return;\n }\n } catch (e) {\n // Treat TypeError as do not sync\n if (e instanceof TypeError) {\n return;\n }\n throw e;\n }\n }\n\n keys.forEach((key: string | StorageKeyConfiguration | SyncStorageSyncOptions | ((key: string, value: any) => any)): void => {\n let stateSlice = state?.[key as string];\n let replacer;\n let space: string | number | undefined;\n let encrypt;\n let syncForFeature = false;\n\n if (typeof key === 'object') {\n const name = (Object.keys(key) as (keyof typeof key)[])[0];\n syncForFeature = !!(key?.[name] as SyncStorageSyncOptions)?.syncForFeature;\n stateSlice = syncForFeature ? state : state?.[name];\n\n if (typeof stateSlice !== 'undefined' && key[name]) {\n // use serialize function if specified.\n if ((key[name] as any).serialize) {\n stateSlice = (key[name] as SyncStorageSyncOptions).serialize!(stateSlice);\n } else {\n // if serialize function is not specified filter on fields if an array has been provided.\n let filter: StorageKeyConfiguration[] | undefined;\n if ((key[name] as any).reduce) {\n filter = key[name] as StorageKeyConfiguration[];\n } else if ((key[name] as any).filter) {\n filter = (key[name] as any).filter as StorageKeyConfiguration[];\n }\n if (filter) {\n stateSlice = createStateSlice(stateSlice, filter);\n }\n\n // Check if encrypt and decrypt are present, also checked at this#rehydrateApplicationState()\n if ((key[name] as any).encrypt && (key[name] as any).decrypt) {\n if (typeof (key[name] as any).encrypt === 'function') {\n encrypt = (key[name] as any).encrypt;\n }\n } else if ((key[name] as any).encrypt || (key[name] as any).decrypt) {\n // If one of those is not present, then let know that one is missing\n logger.error(\n `Either encrypt or decrypt function is not present on '${key[name] as string}' key object.`\n );\n }\n }\n\n /*\n Replacer and space arguments to pass to JSON.stringify.\n If these fields don't exist, undefined will be passed.\n */\n replacer = (key[name] as any).replacer;\n space = (key[name] as any).space;\n }\n\n key = name;\n } else if (typeof key === 'string') {\n stateSlice = syncForFeature ? state : state?.[key];\n }\n\n if (typeof stateSlice !== 'undefined' && storage !== undefined) {\n try {\n if (encrypt) {\n // ensure that a string message is passed\n stateSlice = encrypt(\n typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space)\n );\n }\n storage.setItem(\n storageKeySerializer(key as string),\n typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space)\n );\n } catch (e) {\n logger.warn('Unable to save state to localStorage:', e);\n }\n } else if (typeof stateSlice === 'undefined' && removeOnUndefined && storage !== undefined) {\n try {\n storage.removeItem(storageKeySerializer(key as string));\n } catch (e) {\n logger.warn(`Exception on removing/cleaning undefined '${key as string}' state`, e);\n }\n }\n });\n};\n\nconst defaultMergeReducer = (state: any, rehydratedState: any, action: any) => {\n if ((action.type === INIT || action.type === UPDATE) && rehydratedState) {\n const allKeys = Array.from(new Set([...Object.keys(state), ...Object.keys(rehydratedState)]));\n state = Object.fromEntries(allKeys.map((key) => {\n // No need to create new object reference if no merge is actually needed\n if (!rehydratedState[key]) {\n return [key, state[key]];\n } else if (state[key]) {\n return [key, deepFill(state[key], rehydratedState[key])];\n } else {\n return [key, rehydratedState[key]];\n }\n }));\n }\n\n return state;\n};\n\n/**\n * Local and Session storage synchronization helper\n * @param config\n */\nexport const syncStorage = (config: SyncStorageConfig) => (reducer: any) => {\n if (\n (config.storage === undefined && !config.checkStorageAvailability)\n || (config.checkStorageAvailability && checkIsBrowserEnv())\n ) {\n config.storage = localStorage || window.localStorage;\n }\n\n if (config.storageKeySerializer === undefined) {\n config.storageKeySerializer = (key) => key;\n }\n\n if (config.restoreDates === undefined) {\n config.restoreDates = true;\n }\n\n // Use default merge reducer.\n let mergeReducer = config.mergeReducer;\n\n if (mergeReducer === undefined || typeof mergeReducer !== 'function') {\n mergeReducer = defaultMergeReducer;\n }\n\n const logger = config.logger || console;\n\n const stateKeys = validateStateKeys(config.keys);\n const rehydratedState = config.rehydrate\n ? rehydrateApplicationState(stateKeys, config.storage, config.storageKeySerializer, config.restoreDates, logger)\n : undefined;\n\n return (state: any, action: any) => {\n let nextState: any;\n\n // If state arrives undefined, we need to let it through the supplied reducer\n // in order to get a complete state as defined by user\n nextState = action.type === INIT && !state ? reducer(state, action) : { ...state };\n\n // Merge the store state with the rehydrated state using\n // either a user-defined reducer or the default.\n nextState = mergeReducer(nextState, rehydratedState, action);\n\n nextState = reducer(nextState, action);\n\n if (action.type !== INIT) {\n syncStateUpdate(\n nextState,\n (typeof config.syncKeyCondition === 'function')\n ? stateKeys.filter((key) => {\n const keyName = typeof key === 'object' ? Object.keys(key)[0] : key;\n return config.syncKeyCondition!(keyName, nextState);\n })\n : stateKeys,\n config.storage,\n config.storageKeySerializer as (key: string | number) => string,\n config.removeOnUndefined,\n config.syncCondition,\n logger\n );\n }\n if (config.postProcess) {\n config.postProcess(nextState);\n }\n return nextState;\n };\n};\n","import {\n createAction,\n props,\n} from '@ngrx/store';\nimport type {\n Serializer,\n} from '@o3r/core';\nimport type {\n SyncStorageConfig,\n} from '../sync-storage';\nimport type {\n StorageSyncOptions,\n} from './interfaces';\n\n/**\n * Defines if an object is a Serializer\n * @param obj Object to test\n * @returns True if the object is a Serializer\n */\nexport const isSerializer = (obj: any): obj is Serializer<any> => !!(obj.serialize || obj.deserialize || obj.reviver || obj.replacer || obj.initialState);\n\n/**\n * Label of the action to rehydrate the store\n */\nexport const REHYDRATE_ACTION_LABEL = '[storeSync] rehydrate';\n\n/**\n * Action to rehydrate the store\n */\nexport const rehydrateAction = createAction(REHYDRATE_ACTION_LABEL, props<{\n payload: Record<string, any>;\n}>());\n\n/**\n * Defines if the storage is a non-async storage\n * @param options The storage config\n * @returns in case the storage used is a non-async storage\n */\nexport const isLocalStorageConfig = (options: StorageSyncOptions): options is SyncStorageConfig => !options.storage || options.storage instanceof Storage;\n","import {\n INIT,\n UPDATE,\n} from '@ngrx/store';\nimport equal from 'fast-deep-equal';\nimport {\n deepFillWithDate,\n} from '../deep-fill/deep-fill';\nimport {\n syncStorage,\n} from '../sync-storage';\nimport type {\n StorageSyncOptions,\n} from './interfaces';\nimport {\n StorageSyncConstructorOptions,\n} from './interfaces';\nimport {\n isLocalStorageConfig,\n isSerializer,\n rehydrateAction,\n} from './storage-sync-helpers';\n\n/**\n * Storage synchronizer\n */\nexport class StorageSync {\n private readonly alreadyHydratedStoreSlices: Set<string> = new Set();\n private hasHydrated = false;\n private readonly storeImage: { [key: string]: any } = {};\n\n public options: StorageSyncOptions;\n\n constructor(options?: StorageSyncConstructorOptions, extraOptions?: { disableSmartSync: boolean }) {\n this.options = {\n keys: [],\n ...(extraOptions?.disableSmartSync\n ? {}\n : {\n syncKeyCondition: (key, state) => !equal(this.storeImage[key], state[key]),\n postProcess: (state) => {\n this.options.keys.forEach((key) => {\n const keyName: string = typeof key === 'object' ? Object.keys(key)[0] : key;\n this.storeImage[keyName] = state[keyName];\n });\n }\n }),\n ...options,\n storage: options?.storage as unknown as Storage,\n mergeReducer: typeof options?.mergeReducer === 'function' ? options.mergeReducer : this.mergeReducer\n };\n }\n\n /**\n * Handle state manipulation in case of store storage sync\n * Merge strategy is a full merge at init; When a new `store slice` is registered, its initial state is merged with its corresponding storage content\n * Pass it as mergeReducer callback when calling localStorageSync function from 'ngrx-store-localstorage', in the app\n * @param state actual state\n * @param rehydratedState state from storage\n * @param action Triggered action\n */\n public readonly mergeReducer = (state: any, rehydratedState: any, action: any) => {\n if (rehydratedState) {\n if (action.type === INIT) {\n state = deepFillWithDate(state, rehydratedState);\n }\n if (action.type === UPDATE && Array.isArray(action.features)) {\n const notHandledFeatures = action.features.filter((featName: string) => !this.alreadyHydratedStoreSlices.has(featName));\n\n notHandledFeatures.filter((featName: string) => !!rehydratedState[featName]).forEach((fName: string) => {\n state[fName] = state[fName] ? deepFillWithDate(state[fName], rehydratedState[fName]) : rehydratedState[fName];\n this.alreadyHydratedStoreSlices.add(fName);\n });\n }\n }\n return state;\n };\n\n /**\n * Returns a meta reducer that handles storage sync\n */\n public localStorageSync = () => {\n const base = (reducer: any) => syncStorage({\n ...this.options,\n rehydrate: false,\n storage: this.options.storage as unknown as Storage,\n syncCondition: () => this.hasHydrated\n })(reducer);\n\n return (reducer: any) => {\n if (isLocalStorageConfig(this.options)) {\n return syncStorage(this.options)(reducer);\n }\n\n return (state: any, action: any) => {\n let hydratedState = state;\n if (action.type === rehydrateAction.type) {\n const hasAlreadyHydrated = this.hasHydrated;\n this.hasHydrated = true;\n const initialStates = this.options.keys.reduce((acc: Record<string, any>, key) => {\n const storeName = Object.keys(key)[0];\n const storeSynchronizer = (key as any)[storeName];\n if (isSerializer(storeSynchronizer)) {\n acc[storeName] = storeSynchronizer.initialState;\n }\n return acc;\n }, {});\n let overrides = {};\n if (!hasAlreadyHydrated) {\n overrides = Object.entries(action.payload).reduce<Record<string, any>>((acc, [storeName, value]) => {\n if (!initialStates[storeName] || initialStates[storeName] === state[storeName]) {\n acc[storeName] = value;\n } else if (initialStates[storeName] !== state[storeName]) {\n (this.options.logger || console).error(`Unable to rehydrate store \"${storeName}\", it has been modified before being hydrated`);\n }\n return acc;\n }, {});\n }\n if (Object.keys(overrides).length > 0) {\n hydratedState = { ...state, ...overrides };\n }\n }\n return base(reducer)(hydratedState, action);\n };\n };\n };\n}\n"],"mappings":";;;;AAQA,MAAM,SAAmC,CACvC;CACE,YAAY,SAAS,gBAAgB,MAAM;CAC3C,YAAY,SAAS,IAAI,MAAM,SAAS,IAAI;AAC7C,GACD;CACE,YAAY,SAAS,gBAAgB,MAAM;CAC3C,YAAY,SAAS,IAAI,MAAM,KAAK,IAAI;AACzC,CACF;AASD,SAAgB,iBAAiD,MAAS,QAA6B;CACrG,OAAO,SAAS,MAAM,QAAQ,MAAM;AACtC;ACNA,MAAa,eAAe,MAAc,UAAc;CACtD,IAAI,OAAO,UAAU,YAAY,6CAA6C,KAAK,KAAK,GACtF,OAAO,IAAI,KAAK,KAAK;CAEvB,OAAO;AACT;AAOA,MAAM,gBAAgB,MAAc,UAAe;AAKnD,MAAM,0BAAyB;CAC7B,OAAO,OAAO,WAAW;AAC3B;AAMA,MAAM,qBAAqB,SAAqB;CAC9C,OAAQ,KAAe,KAAK,QAAO;EACjC,IAAI,OAAO;EAEX,IAAI,OAAO,QAAQ,UACjB,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC;EAG1B,IAAI,OAAO,SAAS,UAClB,MAAM,IAAI,UACR,yEAA8E,OAAO,MAAM;EAG/F,OAAO;CACT,CAAC;AACH;AAUA,MAAa,6BACX,MACA,SACA,sBACA,cACA,SAAiB,YACf;CACF,OAAQ,KAAe,QAAQ,KAAK,SAAQ;EAC1C,IAAI,MAAM;EACV,IAAI,UAAU,eAAe,cAAc;EAC3C,IAAI;EACJ,IAAI;EACJ,IAAI,iBAAiB;EAErB,IAAI,OAAO,QAAQ,UAAU;GAC3B,MAAM,OAAO,KAAK,GAAG,CAAC,CAAC;GACvB,iBAAiB,CAAC,CAAE,OAAO,IAA+B,EAAE;GAG5D,IAAI,OAAO,KAAK,SAAS,YACvB,UAAU,KAAK;QACV;IAEL,IAAI,KAAK,IAAI,CAAC,SACZ,UAAU,KAAK,IAAI,CAAC;IAGtB,IAAI,KAAK,IAAI,CAAC,aACZ,cAAc,KAAK,IAAI,CAAC;GAE5B;GAGA,IAAI,KAAK,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,SAAS;IAC1C,IAAI,OAAO,KAAK,IAAI,CAAC,YAAY,cAAc,OAAO,KAAK,IAAI,CAAC,YAAY,YAC1E,UAAU,KAAK,IAAI,CAAC;SAEpB,OAAO,MAAM,mDAAmD,KAAK,KAAc,cAAe;GAEtG,OAAO,IAAI,KAAK,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,SAExC,OAAO,MAAM,yDAAyD,KAAK,KAAc,cAAe;EAE5G;EACA,IAAI,YAAY,QAAW;GACzB,IAAI,aAAa,QAAQ,QAAQ,qBAAqB,GAAG,CAAC;GAC1D,IAAI,YAAY;IAEd,IAAI,SACF,aAAa,QAAQ,UAAU;IAGjC,MAAM,gCAAgB,IAAI,OAAO,OAAO;IACxC,IAAI,MAAM;IAEV,IAAI,eAAe,UAAU,eAAe,UAAU,eAAe,WAAW,cAAc,KAAK,WAAW,OAAO,CAAC,CAAC,GACrH,MAAM,KAAK,MAAM,YAAY,OAAO;IAGtC,MAAM,kBAAkB,cAAc,YAAY,GAAG,IAAI;IAEzD,OAAO,iBACH,kBACA,OAAO,OAAO,CAAA,GAAI,KAAK,GACtB,MAAM,gBACR,CAAA;GACL;EACF;EACA,OAAO;CACT,GAAG,CAAA,CAAE;AACP;AAIA,SAAS,iBAAiB,eAAoB,QAA8E;CAC1H,OAAO,OAAO,QACX,MAA8C,SAA4E;EACzH,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;GACxD,MAAM,QAAQ,gBAAgB;GAC9B,IAAI,UAAU,QACZ,KAAK,QAAQ;EAEjB,OACE,KAAK,MAAM,OAAO,MAChB,IAAI,OAAO,UAAU,eAAe,KAAK,MAAM,GAAG,GAAG;GACnD,MAAM,UAAe,KAAK;GAC1B,KAAK,OAAO,iBAAiB,cAAc,MAAM,OAAO;EAC1D;EAGJ,OAAO;CACT,GACA,CAAA,CAAE;AAEN;AAaA,MAAa,mBACX,OACA,MACA,SACA,sBACA,oBAAoB,OACpB,eACA,SAAiB,YACf;CACF,IAAI,eACF,IAAI;EACF,IAAI,cAAc,KAAK,MAAM,MAC3B;CAEJ,SAAS,GAAG;EAEV,IAAI,aAAa,WACf;EAEF,MAAM;CACR;CAGF,KAAK,SAAS,QAA6G;EACzH,IAAI,aAAa,QAAQ;EACzB,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI,iBAAiB;EAErB,IAAI,OAAO,QAAQ,UAAU;GAC3B,MAAM,OAAQ,OAAO,KAAK,GAAG,CAA0B,CAAC;GACxD,iBAAiB,CAAC,CAAE,MAAM,KAAgC,EAAE;GAC5D,aAAa,iBAAiB,QAAQ,QAAQ;GAE9C,IAAI,OAAO,eAAe,eAAe,IAAI,OAAO;IAElD,IAAK,IAAI,KAAa,CAAC,WACrB,aAAc,IAAI,KAAgC,CAAC,UAAW,UAAU;SACnE;KAEL,IAAI;KACJ,IAAK,IAAI,KAAa,CAAC,QACrB,SAAS,IAAI;UACR,IAAK,IAAI,KAAa,CAAC,QAC5B,SAAU,IAAI,KAAa,CAAC;KAE9B,IAAI,QACF,aAAa,iBAAiB,YAAY,MAAM;KAIlD,IAAK,IAAI,KAAa,CAAC,WAAY,IAAI,KAAa,CAAC,SACnD;UAAI,OAAQ,IAAI,KAAa,CAAC,YAAY,YACxC,UAAW,IAAI,KAAa,CAAC;KAC/B,OACK,IAAK,IAAI,KAAa,CAAC,WAAY,IAAI,KAAa,CAAC,SAE1D,OAAO,MACL,yDAAyD,IAAI,MAAe,cAAe;IAGjG;IAMA,WAAY,IAAI,KAAa,CAAC;IAC9B,QAAS,IAAI,KAAa,CAAC;GAC7B;GAEA,MAAM;EACR,OAAO,IAAI,OAAO,QAAQ,UACxB,aAAa,iBAAiB,QAAQ,QAAQ;EAGhD,IAAI,OAAO,eAAe,eAAe,YAAY,QACnD,IAAI;GACF,IAAI,SAEF,aAAa,QACX,OAAO,eAAe,WAAW,aAAa,KAAK,UAAU,YAAY,UAAU,KAAK,CAAC;GAG7F,QAAQ,QACN,qBAAqB,GAAa,GAClC,OAAO,eAAe,WAAW,aAAa,KAAK,UAAU,YAAY,UAAU,KAAK,CAAC;EAE7F,SAAS,GAAG;GACV,OAAO,KAAK,yCAAyC,CAAC;EACxD;OACK,IAAI,OAAO,eAAe,eAAe,qBAAqB,YAAY,QAC/E,IAAI;GACF,QAAQ,WAAW,qBAAqB,GAAa,CAAC;EACxD,SAAS,GAAG;GACV,OAAO,KAAK,6CAA6C,IAAa,UAAW,CAAC;EACpF;CAEJ,CAAC;AACH;AAEA,MAAM,uBAAuB,OAAY,iBAAsB,WAAe;CAC5E,KAAK,OAAO,SAAS,QAAQ,OAAO,SAAS,WAAW,iBAAiB;EACvE,MAAM,UAAU,MAAM,qBAAK,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,GAAG,GAAG,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC;EAC5F,QAAQ,OAAO,YAAY,QAAQ,KAAK,QAAO;GAE7C,IAAI,CAAC,gBAAgB,MACnB,OAAO,CAAC,KAAK,MAAM,IAAI;QAClB,IAAI,MAAM,MACf,OAAO,CAAC,KAAK,SAAS,MAAM,MAAM,gBAAgB,IAAI,CAAC;QAEvD,OAAO,CAAC,KAAK,gBAAgB,IAAI;EAErC,CAAC,CAAC;CACJ;CAEA,OAAO;AACT;AAMA,MAAa,eAAe,YAA+B,YAAgB;CACzE,IACG,OAAO,YAAY,UAAa,CAAC,OAAO,4BACrC,OAAO,4BAA4B,kBAAiB,GAExD,OAAO,UAAU,gBAAgB,OAAO;CAG1C,IAAI,OAAO,yBAAyB,QAClC,OAAO,wBAAwB,QAAQ;CAGzC,IAAI,OAAO,iBAAiB,QAC1B,OAAO,eAAe;CAIxB,IAAI,eAAe,OAAO;CAE1B,IAAI,iBAAiB,UAAa,OAAO,iBAAiB,YACxD,eAAe;CAGjB,MAAM,SAAS,OAAO,UAAU;CAEhC,MAAM,YAAY,kBAAkB,OAAO,IAAI;CAC/C,MAAM,kBAAkB,OAAO,YAC3B,0BAA0B,WAAW,OAAO,SAAS,OAAO,sBAAsB,OAAO,cAAc,MAAM,IAC7G;CAEJ,QAAQ,OAAY,WAAe;EACjC,IAAI;EAIJ,YAAY,OAAO,SAAS,QAAQ,CAAC,QAAQ,QAAQ,OAAO,MAAM,IAAI,EAAE,GAAG,MAAK;EAIhF,YAAY,aAAa,WAAW,iBAAiB,MAAM;EAE3D,YAAY,QAAQ,WAAW,MAAM;EAErC,IAAI,OAAO,SAAS,MAClB,gBACE,WACC,OAAO,OAAO,qBAAqB,aAChC,UAAU,QAAQ,QAAO;GACzB,MAAM,UAAU,OAAO,QAAQ,WAAW,OAAO,KAAK,GAAG,CAAC,CAAC,KAAK;GAChE,OAAO,OAAO,iBAAkB,SAAS,SAAS;EACpD,CAAC,IACC,WACJ,OAAO,SACP,OAAO,sBACP,OAAO,mBACP,OAAO,eACP,MAAM;EAGV,IAAI,OAAO,aACT,OAAO,YAAY,SAAS;EAE9B,OAAO;CACT;AACF;AC5VA,MAAa,gBAAgB,QAAqC,CAAC,EAAE,IAAI,aAAa,IAAI,eAAe,IAAI,WAAW,IAAI,YAAY,IAAI;AAK5I,MAAa,yBAAyB;AAKtC,MAAa,kBAAkB,aAAa,wBAAwB,MAAK,CAErE;AAOJ,MAAa,wBAAwB,YAA8D,CAAC,QAAQ,WAAW,QAAQ,mBAAmB;ACZlJ,IAAa,cAAb,MAAwB;CAOtB,YAAY,SAAyC,cAA4C;EANhF,KAAA,6CAA0C,IAAI,IAAG;EAC1D,KAAA,cAAc;EACL,KAAA,aAAqC,CAAA;EAgCtC,KAAA,gBAAgB,OAAY,iBAAsB,WAAe;GAC/E,IAAI,iBAAiB;IACnB,IAAI,OAAO,SAAS,MAClB,QAAQ,iBAAiB,OAAO,eAAe;IAEjD,IAAI,OAAO,SAAS,UAAU,MAAM,QAAQ,OAAO,QAAQ,GAGzD,AAF2B,OAAO,SAAS,QAAQ,aAAqB,CAAC,KAAK,2BAA2B,IAAI,QAAQ,CAErH,CAAA,CAAmB,QAAQ,aAAqB,CAAC,CAAC,gBAAgB,SAAS,CAAC,CAAC,SAAS,UAAiB;KACrG,MAAM,SAAS,MAAM,SAAS,iBAAiB,MAAM,QAAQ,gBAAgB,MAAM,IAAI,gBAAgB;KACvG,KAAK,2BAA2B,IAAI,KAAK;IAC3C,CAAC;GAEL;GACA,OAAO;EACT;EAKO,KAAA,yBAAwB;GAC7B,MAAM,QAAQ,YAAiB,YAAY;IACzC,GAAG,KAAK;IACR,WAAW;IACX,SAAS,KAAK,QAAQ;IACtB,qBAAqB,KAAK;GAC3B,CAAA,CAAC,CAAC,OAAO;GAEV,QAAQ,YAAgB;IACtB,IAAI,qBAAqB,KAAK,OAAO,GACnC,OAAO,YAAY,KAAK,OAAO,CAAC,CAAC,OAAO;IAG1C,QAAQ,OAAY,WAAe;KACjC,IAAI,gBAAgB;KACpB,IAAI,OAAO,SAAS,gBAAgB,MAAM;MACxC,MAAM,qBAAqB,KAAK;MAChC,KAAK,cAAc;MACnB,MAAM,gBAAgB,KAAK,QAAQ,KAAK,QAAQ,KAA0B,QAAO;OAC/E,MAAM,YAAY,OAAO,KAAK,GAAG,CAAC,CAAC;OACnC,MAAM,oBAAqB,IAAY;OACvC,IAAI,aAAa,iBAAiB,GAChC,IAAI,aAAa,kBAAkB;OAErC,OAAO;MACT,GAAG,CAAA,CAAE;MACL,IAAI,YAAY,CAAA;MAChB,IAAI,CAAC,oBACH,YAAY,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,QAA6B,KAAK,CAAC,WAAW,WAAU;OACjG,IAAI,CAAC,cAAc,cAAc,cAAc,eAAe,MAAM,YAClE,IAAI,aAAa;YACZ,IAAI,cAAc,eAAe,MAAM,YAC5C,CAAC,KAAK,QAAQ,UAAU,QAAA,CAAS,MAAM,8BAA8B,UAAS,8CAA+C;OAE/H,OAAO;MACT,GAAG,CAAA,CAAE;MAEP,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,SAAS,GAClC,gBAAgB;OAAE,GAAG;OAAO,GAAG;MAAS;KAE5C;KACA,OAAO,KAAK,OAAO,CAAC,CAAC,eAAe,MAAM;IAC5C;GACF;EACF;EA3FE,KAAK,UAAU;GACb,MAAM,CAAA;GACN,GAAI,cAAc,mBACd,CAAA,IACA;IACA,mBAAmB,KAAK,UAAU,CAAC,MAAM,KAAK,WAAW,MAAM,MAAM,IAAI;IACzE,cAAc,UAAS;KACrB,KAAK,QAAQ,KAAK,SAAS,QAAO;MAChC,MAAM,UAAkB,OAAO,QAAQ,WAAW,OAAO,KAAK,GAAG,CAAC,CAAC,KAAK;MACxE,KAAK,WAAW,WAAW,MAAM;KACnC,CAAC;IACH;GACD;GACH,GAAG;GACH,SAAS,SAAS;GAClB,cAAc,OAAO,SAAS,iBAAiB,aAAa,QAAQ,eAAe,KAAK;EACzF;CACH;AA2ED"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@o3r/store-sync",
3
- "version": "15.3.0-prerelease.16",
3
+ "version": "15.3.0-prerelease.17",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -13,14 +13,14 @@
13
13
  "otter-module"
14
14
  ],
15
15
  "peerDependencies": {
16
- "@ama-sdk/core": "~15.3.0-prerelease.16",
16
+ "@ama-sdk/core": "~15.3.0-prerelease.17",
17
17
  "@angular-devkit/core": "^22.0.0",
18
18
  "@angular-devkit/schematics": "^22.0.0",
19
19
  "@ngrx/entity": "^22.0.0",
20
20
  "@ngrx/store": "^22.0.0",
21
- "@o3r/core": "~15.3.0-prerelease.16",
22
- "@o3r/logger": "~15.3.0-prerelease.16",
23
- "@o3r/schematics": "~15.3.0-prerelease.16",
21
+ "@o3r/core": "~15.3.0-prerelease.17",
22
+ "@o3r/logger": "~15.3.0-prerelease.17",
23
+ "@o3r/schematics": "~15.3.0-prerelease.17",
24
24
  "@schematics/angular": "^22.0.0",
25
25
  "fast-deep-equal": "^3.1.3",
26
26
  "rxjs": "^7.8.1",
@@ -44,7 +44,7 @@
44
44
  }
45
45
  },
46
46
  "dependencies": {
47
- "@o3r/schematics": "~15.3.0-prerelease.16",
47
+ "@o3r/schematics": "~15.3.0-prerelease.17",
48
48
  "tslib": "^2.6.2"
49
49
  },
50
50
  "schematics": "./collection.json",
@@ -1,71 +1,68 @@
1
- import { Logger, Serializer } from '@o3r/core';
2
- import * as _ngrx_store from '@ngrx/store';
3
-
1
+ import { Logger, Serializer } from "@o3r/core";
4
2
  /**
5
3
  * Options to provide to the synchronous store synchronization mechanism
6
4
  */
7
- interface SyncStorageSyncOptions {
8
- /** Callback to define the serialization strategy of the store */
9
- serialize?: (state: any) => any;
10
- /** Callback to define the deserialization strategy of the store */
11
- deserialize?: (state: any) => any;
12
- /** Callback to define the reviving strategy of the store */
13
- reviver?: (key: string, value: any) => any;
14
- /** replacer callback function provided to the parser */
15
- replacer?: ((key: string, value: any) => any) | string[];
16
- /** Filter to apply to the store fields */
17
- filter?: string[];
18
- /** Spacing for serializer */
19
- space?: string | number;
20
- /** Defines whether the store is loaded as forFeature */
21
- syncForFeature?: boolean;
5
+ export interface SyncStorageSyncOptions {
6
+ /** Callback to define the serialization strategy of the store */
7
+ serialize?: (state: any) => any;
8
+ /** Callback to define the deserialization strategy of the store */
9
+ deserialize?: (state: any) => any;
10
+ /** Callback to define the reviving strategy of the store */
11
+ reviver?: (key: string, value: any) => any;
12
+ /** replacer callback function provided to the parser */
13
+ replacer?: ((key: string, value: any) => any) | string[];
14
+ /** Filter to apply to the store fields */
15
+ filter?: string[];
16
+ /** Spacing for serializer */
17
+ space?: string | number;
18
+ /** Defines whether the store is loaded as forFeature */
19
+ syncForFeature?: boolean;
22
20
  }
23
21
  /**
24
22
  * Interface of the configurations for a store
25
23
  */
26
- interface StorageKeyConfiguration {
27
- [key: string]: string[] | number[] | StorageKeyConfiguration[] | SyncStorageSyncOptions | ((key: string, value: any) => any);
24
+ export interface StorageKeyConfiguration {
25
+ [key: string]: string[] | number[] | StorageKeyConfiguration[] | SyncStorageSyncOptions | ((key: string, value: any) => any);
28
26
  }
29
27
  /**
30
28
  * Definition of a store to to synchronize
31
29
  */
32
- type StorageKeys = (StorageKeyConfiguration | SyncStorageSyncOptions | string)[];
30
+ export type StorageKeys = (StorageKeyConfiguration | SyncStorageSyncOptions | string)[];
33
31
  /**
34
32
  * Configuration to define the way the stores should be synchronize to the storage
35
33
  */
36
- interface SyncStorageConfig {
37
- /** Map of the store to synchronize */
38
- keys: StorageKeys;
39
- /** Should the stores be initially rehydrated */
40
- rehydrate?: boolean;
41
- /** Storage reference */
42
- storage?: Storage;
43
- /** Should be removed from storage if undefined */
44
- removeOnUndefined?: boolean;
45
- /** Should apply restore date to the restored stores */
46
- restoreDates?: boolean;
47
- /** Callback to define the serialization strategy for the store keys */
48
- storageKeySerializer?: (key: string) => string;
49
- /** Callback to define the condition to the synchronization */
50
- syncCondition?: (state: any) => any;
51
- /** Callback to define the condition to the key synchronization */
52
- syncKeyCondition?: (key: string, state: any) => boolean;
53
- /** check the availability of the storage */
54
- checkStorageAvailability?: boolean;
55
- /** Merge reducer to use to deserialize the store */
56
- mergeReducer?: (state: any, rehydratedState: any, action: any) => any;
57
- /** Logger to report messages */
58
- logger?: Logger;
59
- /** Post process after sync storage execution */
60
- postProcess?: (state: any) => void;
34
+ export interface SyncStorageConfig {
35
+ /** Map of the store to synchronize */
36
+ keys: StorageKeys;
37
+ /** Should the stores be initially rehydrated */
38
+ rehydrate?: boolean;
39
+ /** Storage reference */
40
+ storage?: Storage;
41
+ /** Should be removed from storage if undefined */
42
+ removeOnUndefined?: boolean;
43
+ /** Should apply restore date to the restored stores */
44
+ restoreDates?: boolean;
45
+ /** Callback to define the serialization strategy for the store keys */
46
+ storageKeySerializer?: (key: string) => string;
47
+ /** Callback to define the condition to the synchronization */
48
+ syncCondition?: (state: any) => any;
49
+ /** Callback to define the condition to the key synchronization */
50
+ syncKeyCondition?: (key: string, state: any) => boolean;
51
+ /** check the availability of the storage */
52
+ checkStorageAvailability?: boolean;
53
+ /** Merge reducer to use to deserialize the store */
54
+ mergeReducer?: (state: any, rehydratedState: any, action: any) => any;
55
+ /** Logger to report messages */
56
+ logger?: Logger;
57
+ /** Post process after sync storage execution */
58
+ postProcess?: (state: any) => void;
61
59
  }
62
-
63
60
  /**
64
61
  * Reviver the date from a JSON field if the string is matching iso format. Return the same value otherwise
65
62
  * @param _key JSON item key name
66
63
  * @param value JSON item value
67
64
  */
68
- declare const dateReviver: (_key: string, value: any) => any;
65
+ export declare const dateReviver: (_key: string, value: any) => any;
69
66
  /**
70
67
  * Rehydrate the state of the whole application store
71
68
  * @param keys Keys of the store to rehydrate
@@ -74,7 +71,7 @@ declare const dateReviver: (_key: string, value: any) => any;
74
71
  * @param restoreDates determine if the date need to be restored
75
72
  * @param logger
76
73
  */
77
- declare const rehydrateApplicationState: (keys: StorageKeys, storage: Storage | undefined, storageKeySerializer: (key: string) => string, restoreDates: boolean, logger?: Logger) => any;
74
+ export declare const rehydrateApplicationState: (keys: StorageKeys, storage: Storage | undefined, storageKeySerializer: (key: string) => string, restoreDates: boolean, logger?: Logger) => any;
78
75
  /**
79
76
  * Update the state of the store after reviving from storage
80
77
  * Note: this function is mainly use for internal process of store synchronization
@@ -86,103 +83,97 @@ declare const rehydrateApplicationState: (keys: StorageKeys, storage: Storage |
86
83
  * @param syncCondition callback to define if the synchronization should be process
87
84
  * @param logger Logger to report messages
88
85
  */
89
- declare const syncStateUpdate: (state: any, keys: StorageKeys, storage: Storage | undefined, storageKeySerializer: (key: string | number) => string, removeOnUndefined?: boolean, syncCondition?: (state: any) => any, logger?: Logger) => void;
86
+ export declare const syncStateUpdate: (state: any, keys: StorageKeys, storage: Storage | undefined, storageKeySerializer: (key: string | number) => string, removeOnUndefined?: boolean, syncCondition?: (state: any) => any, logger?: Logger) => void;
90
87
  /**
91
88
  * Local and Session storage synchronization helper
92
89
  * @param config
93
90
  */
94
- declare const syncStorage: (config: SyncStorageConfig) => (reducer: any) => (state: any, action: any) => any;
95
-
91
+ export declare const syncStorage: (config: SyncStorageConfig) => (reducer: any) => (state: any, action: any) => any;
96
92
  /**
97
93
  * Format of a key in `StoreSyncConfig`
98
94
  */
99
- interface StoreSyncSerializers {
100
- [storeName: string]: Serializer<any>;
95
+ export interface StoreSyncSerializers {
96
+ [storeName: string]: Serializer<any>;
101
97
  }
102
98
  /**
103
99
  * An interface defining the configuration attributes to bootstrap `storeSyncMetaReducer`
104
100
  */
105
- interface StoreSyncConfig {
106
- /** State keys to sync with storage */
107
- keys: StoreSyncSerializers[];
108
- /** Pull initial state from storage on startup */
109
- rehydrate?: boolean;
110
- /** Specify an object that conforms to the Storage interface to use, this will default to localStorage */
111
- storage?: Storage;
112
- /** When set, sync to storage will only occur when this function returns a true boolean */
113
- syncCondition?: (state: any) => any;
101
+ export interface StoreSyncConfig {
102
+ /** State keys to sync with storage */
103
+ keys: StoreSyncSerializers[];
104
+ /** Pull initial state from storage on startup */
105
+ rehydrate?: boolean;
106
+ /** Specify an object that conforms to the Storage interface to use, this will default to localStorage */
107
+ storage?: Storage;
108
+ /** When set, sync to storage will only occur when this function returns a true boolean */
109
+ syncCondition?: (state: any) => any;
114
110
  }
115
111
  /**
116
112
  * Typings for async storage
117
113
  */
118
- type AsyncStorage = Omit<Storage, 'getItem'> & {
119
- getItem(key: string): Promise<string | null>;
114
+ export type AsyncStorage = Omit<Storage, 'getItem'> & {
115
+ getItem(key: string): Promise<string | null>;
120
116
  };
121
117
  /**
122
118
  * Options for async storage sync
123
119
  */
124
- interface AsyncStorageSyncOptions extends Omit<SyncStorageConfig, 'storage'> {
125
- storage?: AsyncStorage;
120
+ export interface AsyncStorageSyncOptions extends Omit<SyncStorageConfig, 'storage'> {
121
+ storage?: AsyncStorage;
126
122
  }
127
123
  /** Options for storage sync method */
128
- type StorageSyncOptions = SyncStorageConfig | AsyncStorageSyncOptions;
124
+ export type StorageSyncOptions = SyncStorageConfig | AsyncStorageSyncOptions;
129
125
  /**
130
126
  * Options that can be set on the Storage sync constructor
131
127
  * postProcess and syncKeyCondition will be handled by the StorageSync class if smart sync is activated
132
128
  */
133
- type StorageSyncConstructorOptions = Omit<StorageSyncOptions, 'postProcess' | 'syncKeyCondition'>;
134
-
129
+ export type StorageSyncConstructorOptions = Omit<StorageSyncOptions, 'postProcess' | 'syncKeyCondition'>;
135
130
  /**
136
131
  * Storage synchronizer
137
132
  */
138
- declare class StorageSync {
139
- private readonly alreadyHydratedStoreSlices;
140
- private hasHydrated;
141
- private readonly storeImage;
142
- options: StorageSyncOptions;
143
- constructor(options?: StorageSyncConstructorOptions, extraOptions?: {
144
- disableSmartSync: boolean;
145
- });
146
- /**
147
- * Handle state manipulation in case of store storage sync
148
- * Merge strategy is a full merge at init; When a new `store slice` is registered, its initial state is merged with its corresponding storage content
149
- * Pass it as mergeReducer callback when calling localStorageSync function from 'ngrx-store-localstorage', in the app
150
- * @param state actual state
151
- * @param rehydratedState state from storage
152
- * @param action Triggered action
153
- */
154
- readonly mergeReducer: (state: any, rehydratedState: any, action: any) => any;
155
- /**
156
- * Returns a meta reducer that handles storage sync
157
- */
158
- localStorageSync: () => (reducer: any) => (state: any, action: any) => any;
133
+ export declare class StorageSync {
134
+ private readonly alreadyHydratedStoreSlices;
135
+ private hasHydrated;
136
+ private readonly storeImage;
137
+ options: StorageSyncOptions;
138
+ constructor(options?: StorageSyncConstructorOptions, extraOptions?: {
139
+ disableSmartSync: boolean;
140
+ });
141
+ /**
142
+ * Handle state manipulation in case of store storage sync
143
+ * Merge strategy is a full merge at init; When a new `store slice` is registered, its initial state is merged with its corresponding storage content
144
+ * Pass it as mergeReducer callback when calling localStorageSync function from 'ngrx-store-localstorage', in the app
145
+ * @param state actual state
146
+ * @param rehydratedState state from storage
147
+ * @param action Triggered action
148
+ */
149
+ readonly mergeReducer: (state: any, rehydratedState: any, action: any) => any;
150
+ /**
151
+ * Returns a meta reducer that handles storage sync
152
+ */
153
+ localStorageSync: () => (reducer: any) => (state: any, action: any) => any;
159
154
  }
160
-
161
155
  /**
162
156
  * Defines if an object is a Serializer
163
157
  * @param obj Object to test
164
158
  * @returns True if the object is a Serializer
165
159
  */
166
- declare const isSerializer: (obj: any) => obj is Serializer<any>;
160
+ export declare const isSerializer: (obj: any) => obj is Serializer<any>;
167
161
  /**
168
162
  * Label of the action to rehydrate the store
169
163
  */
170
- declare const REHYDRATE_ACTION_LABEL = "[storeSync] rehydrate";
164
+ export declare const REHYDRATE_ACTION_LABEL = "[storeSync] rehydrate";
171
165
  /**
172
166
  * Action to rehydrate the store
173
167
  */
174
- declare const rehydrateAction: _ngrx_store.ActionCreator<"[storeSync] rehydrate", (props: {
175
- payload: Record<string, any>;
168
+ export declare const rehydrateAction: import("@ngrx/store").ActionCreator<"[storeSync] rehydrate", (props: {
169
+ payload: Record<string, any>;
176
170
  }) => {
177
- payload: Record<string, any>;
178
- } & _ngrx_store.Action<"[storeSync] rehydrate">>;
171
+ payload: Record<string, any>;
172
+ } & import("@ngrx/store").Action<"[storeSync] rehydrate">>;
179
173
  /**
180
174
  * Defines if the storage is a non-async storage
181
175
  * @param options The storage config
182
176
  * @returns in case the storage used is a non-async storage
183
177
  */
184
- declare const isLocalStorageConfig: (options: StorageSyncOptions) => options is SyncStorageConfig;
185
-
186
- export { REHYDRATE_ACTION_LABEL, StorageSync, dateReviver, isLocalStorageConfig, isSerializer, rehydrateAction, rehydrateApplicationState, syncStateUpdate, syncStorage };
187
- export type { AsyncStorage, AsyncStorageSyncOptions, StorageKeyConfiguration, StorageKeys, StorageSyncConstructorOptions, StorageSyncOptions, StoreSyncConfig, StoreSyncSerializers, SyncStorageConfig, SyncStorageSyncOptions };
188
- //# sourceMappingURL=o3r-store-sync.d.ts.map
178
+ export declare const isLocalStorageConfig: (options: StorageSyncOptions) => options is SyncStorageConfig;
179
+ //# sourceMappingURL=o3r-store-sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"o3r-store-sync.d.ts","sources":["../../src/sync-storage/interfaces.ts","../../src/sync-storage/storage-sync.ts","../../src/core/interfaces.ts","../../src/core/storage-sync.ts","../../src/core/storage-sync-helpers.ts"],"mappings":";;;AAIA;;AAEG;UACc,sBAAsB;;;;;;AAMrC;;AAEA;;AAEA;;AAEA;;;AAGD;AAED;;AAEG;UACc,uBAAuB;yCACD,uBAAuB,KAAK,sBAAsB;AACxF;AAED;;AAEG;AACG,KAAM,WAAW,IAAI,uBAAuB,GAAG,sBAAsB;AAE3E;;AAEG;UACc,iBAAiB;;UAE1B,WAAW;;;;cAIP,OAAO;;;;;;;;;;AAUjB;;;;AAIA;;aAES,MAAM;;;AAGhB;;AC/CD;;;;AAIG;AACH,cAAa,WAAW;AA0CxB;;;;;;;AAOG;AACH,cAAa,yBAAyB,SAC9B,WAAW,WACR,OAAO,6FAGR,MAAgB;AA2F1B;;;;;;;;;;AAUG;AACH,cAAa,eAAe,qBAEpB,WAAW,WACR,OAAO,iJAIR,MAAgB;AAiH1B;;;AAGG;AACH,cAAa,WAAW,WAAY,iBAAiB;;ACxSrD;;AAEG;UACc,oBAAoB;yBACd,UAAU;AAChC;AAED;;AAEG;UACc,eAAe;;UAExB,oBAAoB;;;;cAIhB,OAAO;;;AAGlB;AAED;;AAEG;AACG,KAAM,YAAY,GAAG,IAAI,CAAC,OAAO;0BACf,OAAO;;AAG/B;;AAEG;AACG,UAAW,uBAAwB,SAAQ,IAAI,CAAC,iBAAiB;cAC3D,YAAY;AACvB;AAED;KACY,kBAAkB,GAAG,iBAAiB,GAAG,uBAAuB;AAE5E;;;AAGG;AACG,KAAM,6BAA6B,GAAG,IAAI,CAAC,kBAAkB;;AC1BnE;;AAEG;AACH,cAAa,WAAW;AACtB;;AAEA;aAEgB,kBAAkB;AAEtB,0BAAU,6BAA6B;;AAA8C;AAoBjG;;;;;;;AAOG;;AAkBH;;AAEG;;AA8CJ;;AChHD;;;;AAIG;AACH,cAAa,YAAY,uBAAsB,UAAU;AAEzD;;AAEG;AACH,cAAa,sBAAsB;AAEnC;;AAEG;AACH,cAAa,eAAe,EAAA,WAAA,CAAA,aAAA;AACjB,aAAA,MAAM;;AAAN,aAAA,MAAM;;AAGjB;;;;AAIG;AACH,cAAa,oBAAoB,YAAa,kBAAkB,gBAAc,iBAA2E;;","names":[]}
1
+ {"version":3,"file":"o3r-store-sync.d.ts","names":[],"sources":["../../src/sync-storage/interfaces.ts","../../src/sync-storage/storage-sync.ts","../../src/core/interfaces.ts","../../src/core/storage-sync.ts","../../src/core/storage-sync-helpers.ts"],"mappings":";;;;iBAOiB;;EAEf,aAAa;;EAEb,eAAe;;EAEf,WAAW,aAAa;;EAExB,aAAa,aAAa;;EAE1B;;EAEA;;EAEA;;;;;iBAMe;GACd,oCAAoC,4BAA4B,2BAA2B,aAAa;;;;;YAM/F,eAAe,0BAA0B;;;;iBAKpC;;EAEf,MAAM;;EAEN;;EAEA,UAAU;;EAEV;;EAEA;;EAEA,wBAAwB;;EAExB,iBAAiB;;EAEjB,oBAAoB,aAAa;;EAEjC;;EAEA,gBAAgB,YAAY,sBAAsB;;EAElD,SAAS;;EAET,eAAe;;;;;;;qBCzCJ,cAAe,cAAc;;;;;;;;;qBAkD7B,4BACX,MAAM,aACN,SAAS,qBACT,uBAAuB,wBACvB,uBACA,SAAQ;;;;;;;;;;;;qBAsGG,kBACX,YACA,MAAM,aACN,SAAS,qBACT,uBAAuB,iCACvB,6BACA,iBAAiB,oBACjB,SAAQ;;;;;qBAqHG,cAAe,QAAQ,uBAAuB,kBA8BjD,YAAY;;;;iBCnUL;GACd,oBAAoB;;;;;iBAMN;;EAEf,MAAM;;EAEN;;EAEA,UAAU;;EAEV,iBAAiB;;;;;YAMP,eAAe,KAAK;EAC9B,QAAQ,cAAc;;;;;iBAMP,gCAAgC,KAAK;EACpD,UAAU;;;YAIA,qBAAqB,oBAAoB;;;;;YAMzC,gCAAgC,KAAK;;;;qBCvBpC;mBACM;UACT;mBACS;EAEV,SAAS;EAEJ,YAAA,UAAU,+BAA+B;IAAiB;;;;;;;;;;WA4BtD,eAAgB,YAAY,sBAAsB;;;;EAoB3D,yBAQG,kBAAY,YAAA;;;;;;;qBCtEX,eAAgB,aAAW,OAAO;;;;qBAKlC;;;;qBAKA,uCAAe,wCAAA;EACjB,SAAA;;EAAA,SAAA;0BACN;;;;;;qBAOQ,uBAAwB,SAAS,uBAAqB,WAAW"}