@o3r/store-sync 10.0.0-next.8 → 11.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -1
- package/core/storage-sync.d.ts +2 -3
- package/core/storage-sync.d.ts.map +1 -1
- package/core/storage-sync.helpers.d.ts +0 -2
- package/core/storage-sync.helpers.d.ts.map +1 -1
- package/deep-fill/deep-fill.d.ts +13 -0
- package/deep-fill/deep-fill.d.ts.map +1 -0
- package/esm2022/core/storage-sync.helpers.mjs +1 -3
- package/esm2022/core/storage-sync.mjs +4 -5
- package/esm2022/deep-fill/deep-fill.mjs +23 -0
- package/esm2022/sync-storage/storage-sync.mjs +14 -8
- package/fesm2022/o3r-store-sync.mjs +38 -13
- package/fesm2022/o3r-store-sync.mjs.map +1 -1
- package/package.json +12 -11
- package/schematics/ng-add/index.d.ts +0 -1
- package/schematics/ng-add/index.d.ts.map +1 -1
- package/schematics/ng-add/index.js +2 -3
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-add/schema.json +2 -2
- package/sync-storage/storage-sync.d.ts +0 -4
- package/sync-storage/storage-sync.d.ts.map +1 -1
- package/schematics/package.json +0 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<h1 align="center">Otter Store Sync</h1>
|
|
2
2
|
<p align="center">
|
|
3
|
-
<img src="
|
|
3
|
+
<img src="../../../assets/logo/otter.png" alt="Super cute Otter!" width="40%"/>
|
|
4
4
|
</p>
|
|
5
5
|
|
|
6
6
|
This package is an [Otter Framework Module](https://github.com/AmadeusITGroup/otter/tree/main/docs/core/MODULE.md).
|
|
@@ -22,3 +22,16 @@ To facilitate the synchronization, the `StorageSync` class is based on a fork of
|
|
|
22
22
|
- Split code in several files
|
|
23
23
|
- Migrate tests to Jest
|
|
24
24
|
- Removal of deprecated `deepmerge` dependency.
|
|
25
|
+
- Support of a `smartSync` setup to improve performances
|
|
26
|
+
|
|
27
|
+
### Configuration
|
|
28
|
+
#### Smart sync
|
|
29
|
+
The original ngrx-store-localstorage synchronize all of your states everytime a state is updated which can lead to a lot
|
|
30
|
+
of accesses to the local and session storage and cause performance issue.
|
|
31
|
+
|
|
32
|
+
To avoid this pitfall, by default the @o3r/store-sync only synchronizes a state if its value changed and no longer matches
|
|
33
|
+
the storage.
|
|
34
|
+
This behaviour can be disabled as follows:
|
|
35
|
+
```typescript
|
|
36
|
+
const storage = new StorageSync({keys: [...myStorekeys]}, {disableSmartSync: true});
|
|
37
|
+
```
|
package/core/storage-sync.d.ts
CHANGED
|
@@ -4,9 +4,9 @@ import { StorageSyncConstructorOptions } from './interfaces';
|
|
|
4
4
|
* Storage synchronizer
|
|
5
5
|
*/
|
|
6
6
|
export declare class StorageSync {
|
|
7
|
-
private alreadyHydratedStoreSlices;
|
|
7
|
+
private readonly alreadyHydratedStoreSlices;
|
|
8
8
|
private hasHydrated;
|
|
9
|
-
private storeImage;
|
|
9
|
+
private readonly storeImage;
|
|
10
10
|
options: StorageSyncOptions;
|
|
11
11
|
constructor(options?: StorageSyncConstructorOptions, extraOptions?: {
|
|
12
12
|
disableSmartSync: boolean;
|
|
@@ -15,7 +15,6 @@ export declare class StorageSync {
|
|
|
15
15
|
* Handle state manipulation in case of store storage sync
|
|
16
16
|
* 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
|
|
17
17
|
* Pass it as mergeReducer callback when calling localStorageSync function from 'ngrx-store-localstorage', in the app
|
|
18
|
-
*
|
|
19
18
|
* @param state actual state
|
|
20
19
|
* @param rehydratedState state from storage
|
|
21
20
|
* @param action Triggered action
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-sync.d.ts","sourceRoot":"","sources":["../../src/core/storage-sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAGrD,OAAO,EAAC,6BAA6B,EAAC,MAAM,cAAc,CAAC;AAE3D;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,0BAA0B,CAA0B;
|
|
1
|
+
{"version":3,"file":"storage-sync.d.ts","sourceRoot":"","sources":["../../src/core/storage-sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAGrD,OAAO,EAAC,6BAA6B,EAAC,MAAM,cAAc,CAAC;AAE3D;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAA0B;IACrE,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IAElD,OAAO,EAAE,kBAAkB,CAAC;gBAEvB,OAAO,CAAC,EAAE,6BAA6B,EAAE,YAAY,CAAC,EAAE;QAAC,gBAAgB,EAAE,OAAO,CAAA;KAAC;IAkB/F;;;;;;;OAOG;IACH,SAAgB,YAAY,UAAW,GAAG,mBAAmB,GAAG,UAAU,GAAG,SAiB3E;IAEF;;OAEG;IACI,gBAAgB,kBAQJ,GAAG,sCAqCpB;CACH"}
|
|
@@ -3,7 +3,6 @@ import type { StorageSyncOptions } from './interfaces';
|
|
|
3
3
|
import type { SyncStorageConfig } from '../sync-storage';
|
|
4
4
|
/**
|
|
5
5
|
* Defines if an object is a Serializer
|
|
6
|
-
*
|
|
7
6
|
* @param obj Object to test
|
|
8
7
|
* @returns True if the object is a Serializer
|
|
9
8
|
*/
|
|
@@ -22,7 +21,6 @@ export declare const rehydrateAction: import("@ngrx/store").ActionCreator<"[stor
|
|
|
22
21
|
} & import("@ngrx/store/src/models").TypedAction<"[storeSync] rehydrate">>;
|
|
23
22
|
/**
|
|
24
23
|
* Defines if the storage is a non-async storage
|
|
25
|
-
*
|
|
26
24
|
* @param options The storage config
|
|
27
25
|
* @returns in case the storage used is a non-async storage
|
|
28
26
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-sync.helpers.d.ts","sourceRoot":"","sources":["../../src/core/storage-sync.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD
|
|
1
|
+
{"version":3,"file":"storage-sync.helpers.d.ts","sourceRoot":"","sources":["../../src/core/storage-sync.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAAS,GAAG,2BAAoH,CAAC;AAE1J;;GAEG;AACH,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,eAAe;aACjB,OAAO,MAAM,EAAE,GAAG,CAAC;;aAAnB,OAAO,MAAM,EAAE,GAAG,CAAC;0EACzB,CAAC;AAEN;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,YAAa,kBAAkB,iCAAyF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep fill of base object using source
|
|
3
|
+
* It will do a deep merge of the objects, overriding arrays
|
|
4
|
+
* All properties not present in source, but present in base, will remain
|
|
5
|
+
* @param base
|
|
6
|
+
* @param source
|
|
7
|
+
*/
|
|
8
|
+
export declare function deepFillWithDate<T extends {
|
|
9
|
+
[x: string]: any;
|
|
10
|
+
}>(base: T, source?: {
|
|
11
|
+
[x: string]: any;
|
|
12
|
+
}): T;
|
|
13
|
+
//# sourceMappingURL=deep-fill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-fill.d.ts","sourceRoot":"","sources":["../../src/deep-fill/deep-fill.ts"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,CAAC,CAE1G"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createAction, props } from '@ngrx/store';
|
|
2
2
|
/**
|
|
3
3
|
* Defines if an object is a Serializer
|
|
4
|
-
*
|
|
5
4
|
* @param obj Object to test
|
|
6
5
|
* @returns True if the object is a Serializer
|
|
7
6
|
*/
|
|
@@ -16,9 +15,8 @@ export const REHYDRATE_ACTION_LABEL = '[storeSync] rehydrate';
|
|
|
16
15
|
export const rehydrateAction = createAction(REHYDRATE_ACTION_LABEL, props());
|
|
17
16
|
/**
|
|
18
17
|
* Defines if the storage is a non-async storage
|
|
19
|
-
*
|
|
20
18
|
* @param options The storage config
|
|
21
19
|
* @returns in case the storage used is a non-async storage
|
|
22
20
|
*/
|
|
23
21
|
export const isLocalStorageConfig = (options) => !options.storage || options.storage instanceof Storage;
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1zeW5jLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zdG9yYWdlLXN5bmMuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUlsRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBUSxFQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFMUo7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyx1QkFBdUIsQ0FBQztBQUU5RDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxFQUVyRSxDQUFDLENBQUM7QUFFTjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxPQUEyQixFQUFnQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLFlBQVksT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTZXJpYWxpemVyIH0gZnJvbSAnQG8zci9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUFjdGlvbiwgcHJvcHMgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VTeW5jT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IFN5bmNTdG9yYWdlQ29uZmlnIH0gZnJvbSAnLi4vc3luYy1zdG9yYWdlJztcblxuLyoqXG4gKiBEZWZpbmVzIGlmIGFuIG9iamVjdCBpcyBhIFNlcmlhbGl6ZXJcbiAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIHRlc3RcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBpcyBhIFNlcmlhbGl6ZXJcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2VyaWFsaXplciA9IChvYmo6IGFueSk6IG9iaiBpcyBTZXJpYWxpemVyPGFueT4gPT4gISEob2JqLnNlcmlhbGl6ZSB8fCBvYmouZGVzZXJpYWxpemUgfHwgb2JqLnJldml2ZXIgfHwgb2JqLnJlcGxhY2VyIHx8IG9iai5pbml0aWFsU3RhdGUpO1xuXG4vKipcbiAqIExhYmVsIG9mIHRoZSBhY3Rpb24gdG8gcmVoeWRyYXRlIHRoZSBzdG9yZVxuICovXG5leHBvcnQgY29uc3QgUkVIWURSQVRFX0FDVElPTl9MQUJFTCA9ICdbc3RvcmVTeW5jXSByZWh5ZHJhdGUnO1xuXG4vKipcbiAqIEFjdGlvbiB0byByZWh5ZHJhdGUgdGhlIHN0b3JlXG4gKi9cbmV4cG9ydCBjb25zdCByZWh5ZHJhdGVBY3Rpb24gPSBjcmVhdGVBY3Rpb24oUkVIWURSQVRFX0FDVElPTl9MQUJFTCwgcHJvcHM8e1xuICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufT4oKSk7XG5cbi8qKlxuICogRGVmaW5lcyBpZiB0aGUgc3RvcmFnZSBpcyBhIG5vbi1hc3luYyBzdG9yYWdlXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RvcmFnZSBjb25maWdcbiAqIEByZXR1cm5zIGluIGNhc2UgdGhlIHN0b3JhZ2UgdXNlZCBpcyBhIG5vbi1hc3luYyBzdG9yYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBpc0xvY2FsU3RvcmFnZUNvbmZpZyA9IChvcHRpb25zOiBTdG9yYWdlU3luY09wdGlvbnMpOiBvcHRpb25zIGlzIFN5bmNTdG9yYWdlQ29uZmlnID0+ICFvcHRpb25zLnN0b3JhZ2UgfHwgb3B0aW9ucy5zdG9yYWdlIGluc3RhbmNlb2YgU3RvcmFnZTtcbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { INIT, UPDATE } from '@ngrx/store';
|
|
2
|
-
import {
|
|
2
|
+
import { deepFillWithDate } from '../deep-fill/deep-fill';
|
|
3
3
|
import equal from 'fast-deep-equal';
|
|
4
4
|
import { isLocalStorageConfig, isSerializer, rehydrateAction } from './storage-sync.helpers';
|
|
5
5
|
import { syncStorage } from '../sync-storage';
|
|
@@ -15,7 +15,6 @@ export class StorageSync {
|
|
|
15
15
|
* Handle state manipulation in case of store storage sync
|
|
16
16
|
* 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
|
|
17
17
|
* Pass it as mergeReducer callback when calling localStorageSync function from 'ngrx-store-localstorage', in the app
|
|
18
|
-
*
|
|
19
18
|
* @param state actual state
|
|
20
19
|
* @param rehydratedState state from storage
|
|
21
20
|
* @param action Triggered action
|
|
@@ -23,12 +22,12 @@ export class StorageSync {
|
|
|
23
22
|
this.mergeReducer = (state, rehydratedState, action) => {
|
|
24
23
|
if (rehydratedState) {
|
|
25
24
|
if (action.type === INIT) {
|
|
26
|
-
state =
|
|
25
|
+
state = deepFillWithDate(state, rehydratedState);
|
|
27
26
|
}
|
|
28
27
|
if (action.type === UPDATE && Array.isArray(action.features)) {
|
|
29
28
|
const notHandledFeatures = action.features.filter((featName) => !this.alreadyHydratedStoreSlices.has(featName));
|
|
30
29
|
notHandledFeatures.filter((featName) => !!rehydratedState[featName]).forEach((fName) => {
|
|
31
|
-
state[fName] = state[fName] ?
|
|
30
|
+
state[fName] = state[fName] ? deepFillWithDate(state[fName], rehydratedState[fName]) : rehydratedState[fName];
|
|
32
31
|
this.alreadyHydratedStoreSlices.add(fName);
|
|
33
32
|
});
|
|
34
33
|
}
|
|
@@ -99,4 +98,4 @@ export class StorageSync {
|
|
|
99
98
|
};
|
|
100
99
|
}
|
|
101
100
|
}
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1zeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvc3RvcmFnZS1zeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHNUM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQU90QixZQUFZLE9BQXVDLEVBQUUsWUFBMEM7UUFOdkYsK0JBQTBCLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDcEQsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsZUFBVSxHQUEyQixFQUFFLENBQUM7UUFzQmhEOzs7Ozs7OztXQVFHO1FBQ2EsaUJBQVksR0FBRyxDQUFDLEtBQVUsRUFBRSxlQUFvQixFQUFFLE1BQVcsRUFBRSxFQUFFO1lBQy9FLElBQUksZUFBZSxFQUFFO2dCQUNuQixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUN4QixLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztpQkFDMUM7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFFNUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFD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QUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM1QyxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2FBQ0YsQ0FBQztZQUNGLEdBQUcsT0FBTztZQUNWLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBNkI7WUFDL0MsWUFBWSxFQUFFLE9BQU8sT0FBTyxFQUFFLFlBQVksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZO1NBQ3JHLENBQUM7SUFDSixDQUFDO0NBK0VGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJTklULCBVUERBVEV9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7ZGVlcEZpbGx9IGZyb20gJ0BvM3IvY29yZSc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsJztcbmltcG9ydCB0eXBlIHtTdG9yYWdlU3luY09wdGlvbnN9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge2lzTG9jYWxTdG9yYWdlQ29uZmlnLCBpc1NlcmlhbGl6ZXIsIHJlaHlkcmF0ZUFjdGlvbn0gZnJvbSAnLi9zdG9yYWdlLXN5bmMuaGVscGVycyc7XG5pbXBvcnQge3N5bmNTdG9yYWdlfSBmcm9tICcuLi9zeW5jLXN0b3JhZ2UnO1xuaW1wb3J0IHtTdG9yYWdlU3luY0NvbnN0cnVjdG9yT3B0aW9uc30gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBTdG9yYWdlIHN5bmNocm9uaXplclxuICovXG5leHBvcnQgY2xhc3MgU3RvcmFnZVN5bmMge1xuICBwcml2YXRlIGFscmVhZHlIeWRyYXRlZFN0b3JlU2xpY2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBoYXNIeWRyYXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIHN0b3JlSW1hZ2U6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICBwdWJsaWMgb3B0aW9uczogU3RvcmFnZVN5bmNPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBTdG9yYWdlU3luY0NvbnN0cnVjdG9yT3B0aW9ucywgZXh0cmFPcHRpb25zPzoge2Rpc2FibGVTbWFydFN5bmM6IGJvb2xlYW59KSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAga2V5czogW10sXG4gICAgICAuLi4oZXh0cmFPcHRpb25zPy5kaXNhYmxlU21hcnRTeW5jID8ge30gOiB7XG4gICAgICAgIHN5bmNLZXlDb25kaXRpb246IChrZXksIHN0YXRlKSA9PiAhZXF1YWwodGhpcy5zdG9yZUltYWdlW2tleV0sIHN0YXRlW2tleV0pLFxuICAgICAgICBwb3N0UHJvY2VzczogKHN0YXRlKSA9PiB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5TmFtZTogc3RyaW5nID0gdHlwZW9mIGtleSA9PT0gJ29iamVjdCcgPyBPYmplY3Qua2V5cyhrZXkpWzBdIDoga2V5O1xuICAgICAgICAgICAgdGhpcy5zdG9yZUltYWdlW2tleU5hbWVdID0gc3RhdGVba2V5TmFtZV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHN0b3JhZ2U6IG9wdGlvbnM/LnN0b3JhZ2UgYXMgdW5rbm93biBhcyBTdG9yYWdlLFxuICAgICAgbWVyZ2VSZWR1Y2VyOiB0eXBlb2Ygb3B0aW9ucz8ubWVyZ2VSZWR1Y2VyICE9PSAnZnVuY3Rpb24nID8gdGhpcy5tZXJnZVJlZHVjZXIgOiBvcHRpb25zLm1lcmdlUmVkdWNlclxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN0YXRlIG1hbmlwdWxhdGlvbiBpbiBjYXNlIG9mIHN0b3JlIHN0b3JhZ2Ugc3luY1xuICAgKiBNZXJnZSBzdHJhdGVneSBpcyBhIGZ1bGwgbWVyZ2UgYXQgaW5pdDsgV2hlbiBhIG5ldyBgc3RvcmUgc2xpY2VgIGlzIHJlZ2lzdGVyZWQsIGl0cyBpbml0aWFsIHN0YXRlIGlzIG1lcmdlZCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIHN0b3JhZ2UgY29udGVudFxuICAgKiBQYXNzIGl0IGFzIG1lcmdlUmVkdWNlciBjYWxsYmFjayB3aGVuIGNhbGxpbmcgbG9jYWxTdG9yYWdlU3luYyBmdW5jdGlvbiBmcm9tICduZ3J4LXN0b3JlLWxvY2Fsc3RvcmFnZScsIGluIHRoZSBhcHBcbiAgICpcbiAgICogQHBhcmFtIHN0YXRlIGFjdHVhbCBzdGF0ZVxuICAgKiBAcGFyYW0gcmVoeWRyYXRlZFN0YXRlIHN0YXRlIGZyb20gc3RvcmFnZVxuICAgKiBAcGFyYW0gYWN0aW9uIFRyaWdnZXJlZCBhY3Rpb25cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXJnZVJlZHVjZXIgPSAoc3RhdGU6IGFueSwgcmVoeWRyYXRlZFN0YXRlOiBhbnksIGFjdGlvbjogYW55KSA9PiB7XG4gICAgaWYgKHJlaHlkcmF0ZWRTdGF0ZSkge1xuICAgICAgaWYgKGFjdGlvbi50eXBlID09PSBJTklUKSB7XG4gICAgICAgIHN0YXRlID0gZGVlcEZpbGwoc3RhdGUsIHJlaHlkcmF0ZWRTdGF0ZSk7XG4gICAgICB9XG4gICAgICBpZiAoYWN0aW9uLnR5cGUgPT09IFVQREFURSAmJiBBcnJheS5pc0FycmF5KGFjdGlvbi5mZWF0dXJlcykpIHtcblxuICAgICAgICBjb25zdCBub3RIYW5kbGVkRmVhdHVyZXMgPSBhY3Rpb24uZmVhdHVyZXMuZmlsdGVyKChmZWF0TmFtZTogc3RyaW5nKSA9PiAhdGhpcy5hbHJlYWR5SHlkcmF0ZWRTdG9yZVNsaWNlcy5oYXMoZmVhdE5hbWUpKTtcblxuICAgICAgICBub3RIYW5kbGVkRmVhdHVyZXMuZmlsdGVyKChmZWF0TmFtZTogc3RyaW5nKSA9PiAhIXJlaHlkcmF0ZWRTdGF0ZVtmZWF0TmFtZV0pLmZvckVhY2goKGZOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBzdGF0ZVtmTmFtZV0gPSBzdGF0ZVtmTmFtZV0gPyBkZWVwRmlsbChzdGF0ZVtmTmFtZV0sIHJlaHlkcmF0ZWRTdGF0ZVtmTmFtZV0pIDogcmVoeWRyYXRlZFN0YXRlW2ZOYW1lXTtcbiAgICAgICAgICB0aGlzLmFscmVhZHlIeWRyYXRlZFN0b3JlU2xpY2VzLmFkZChmTmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhIG1ldGEgcmVkdWNlciB0aGF0IGhhbmRsZXMgc3RvcmFnZSBzeW5jXG4gICAqL1xuICBwdWJsaWMgbG9jYWxTdG9yYWdlU3luYyA9ICgpID0+IHtcbiAgICBjb25zdCBiYXNlID0gKHJlZHVjZXI6IGFueSkgPT4gc3luY1N0b3JhZ2Uoe1xuICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgcmVoeWRyYXRlOiBmYWxzZSxcbiAgICAgIHN0b3JhZ2U6IHRoaXMub3B0aW9ucy5zdG9yYWdlIGFzIHVua25vd24gYXMgU3RvcmFnZSxcbiAgICAgIHN5bmNDb25kaXRpb246ICgpID0+IHRoaXMuaGFzSHlkcmF0ZWRcbiAgICB9KShyZWR1Y2VyKTtcblxuICAgIHJldHVybiAocmVkdWNlcjogYW55KSA9PiB7XG4gICAgICBpZiAoaXNMb2NhbFN0b3JhZ2VDb25maWcodGhpcy5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gc3luY1N0b3JhZ2UodGhpcy5vcHRpb25zKShyZWR1Y2VyKTtcbiAgICAgIH1cblxuXG4gICAgICByZXR1cm4gKHN0YXRlOiBhbnksIGFjdGlvbjogYW55KSA9PiB7XG4gICAgICAgIGxldCBoeWRyYXRlZFN0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gcmVoeWRyYXRlQWN0aW9uLnR5cGUpIHtcbiAgICAgICAgICBjb25zdCBoYXNBbHJlYWR5SHlkcmF0ZWQgPSB0aGlzLmhhc0h5ZHJhdGVkO1xuICAgICAgICAgIHRoaXMuaGFzSHlkcmF0ZWQgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZXMgPSB0aGlzLm9wdGlvbnMua2V5cy5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgYW55Piwga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdG9yZU5hbWUgPSBPYmplY3Qua2V5cyhrZXkpWzBdO1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVTeW5jaHJvbml6ZXIgPSAoa2V5IGFzIGFueSlbc3RvcmVOYW1lXTtcbiAgICAgICAgICAgIGlmIChpc1NlcmlhbGl6ZXIoc3RvcmVTeW5jaHJvbml6ZXIpKSB7XG4gICAgICAgICAgICAgIGFjY1tzdG9yZU5hbWVdID0gc3RvcmVTeW5jaHJvbml6ZXIuaW5pdGlhbFN0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgbGV0IG92ZXJyaWRlcyA9IHt9O1xuICAgICAgICAgIGlmICghaGFzQWxyZWFkeUh5ZHJhdGVkKSB7XG4gICAgICAgICAgICBvdmVycmlkZXMgPSBPYmplY3QuZW50cmllcyhhY3Rpb24ucGF5bG9hZCkucmVkdWNlPFJlY29yZDxzdHJpbmcsIGFueT4+KChhY2MsIFtzdG9yZU5hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWluaXRpYWxTdGF0ZXNbc3RvcmVOYW1lXSB8fCBpbml0aWFsU3RhdGVzW3N0b3JlTmFtZV0gPT09IHN0YXRlW3N0b3JlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICBhY2Nbc3RvcmVOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxTdGF0ZXNbc3RvcmVOYW1lXSAhPT0gc3RhdGVbc3RvcmVOYW1lXSkge1xuICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMubG9nZ2VyIHx8IGNvbnNvbGUpLmVycm9yKGBVbmFibGUgdG8gcmVoeWRyYXRlIHN0b3JlIFwiJHtzdG9yZU5hbWV9XCIsIGl0IGhhcyBiZWVuIG1vZGlmaWVkIGJlZm9yZSBiZWluZyBoeWRyYXRlZGApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCkge1xuICAgICAgICAgICAgaHlkcmF0ZWRTdGF0ZSA9IHsgLi4uc3RhdGUsIC4uLm92ZXJyaWRlcyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZShyZWR1Y2VyKShoeWRyYXRlZFN0YXRlLCBhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuIl19
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1zeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvc3RvcmFnZS1zeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sS0FBSyxNQUFNLGlCQUFpQixDQUFDO0FBRXBDLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDM0YsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRzVDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFPdEIsWUFBWSxPQUF1QyxFQUFFLFlBQTBDO1FBTjlFLCtCQUEwQixHQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzdELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ1gsZUFBVSxHQUEyQixFQUFFLENBQUM7UUFzQnpEOzs7Ozs7O1dBT0c7UUFDYSxpQkFBWSxHQUFHLENBQUMsS0FBVSxFQUFFLGVBQW9CLEVBQUUsTUFBVyxFQUFFLEVBQUU7WUFDL0UsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7b0JBQ3hCLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7aUJBQ2xEO2dCQUNELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBRTVELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIs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QUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM1QyxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2FBQ0YsQ0FBQztZQUNGLEdBQUcsT0FBTztZQUNWLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBNkI7WUFDL0MsWUFBWSxFQUFFLE9BQU8sT0FBTyxFQUFFLFlBQVksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZO1NBQ3JHLENBQUM7SUFDSixDQUFDO0NBOEVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJTklULCBVUERBVEV9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IGRlZXBGaWxsV2l0aERhdGUgfSBmcm9tICcuLi9kZWVwLWZpbGwvZGVlcC1maWxsJztcbmltcG9ydCBlcXVhbCBmcm9tICdmYXN0LWRlZXAtZXF1YWwnO1xuaW1wb3J0IHR5cGUge1N0b3JhZ2VTeW5jT3B0aW9uc30gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7aXNMb2NhbFN0b3JhZ2VDb25maWcsIGlzU2VyaWFsaXplciwgcmVoeWRyYXRlQWN0aW9ufSBmcm9tICcuL3N0b3JhZ2Utc3luYy5oZWxwZXJzJztcbmltcG9ydCB7c3luY1N0b3JhZ2V9IGZyb20gJy4uL3N5bmMtc3RvcmFnZSc7XG5pbXBvcnQge1N0b3JhZ2VTeW5jQ29uc3RydWN0b3JPcHRpb25zfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIFN0b3JhZ2Ugc3luY2hyb25pemVyXG4gKi9cbmV4cG9ydCBjbGFzcyBTdG9yYWdlU3luYyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxyZWFkeUh5ZHJhdGVkU3RvcmVTbGljZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIGhhc0h5ZHJhdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmVJbWFnZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gIHB1YmxpYyBvcHRpb25zOiBTdG9yYWdlU3luY09wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IFN0b3JhZ2VTeW5jQ29uc3RydWN0b3JPcHRpb25zLCBleHRyYU9wdGlvbnM/OiB7ZGlzYWJsZVNtYXJ0U3luYzogYm9vbGVhbn0pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBrZXlzOiBbXSxcbiAgICAgIC4uLihleHRyYU9wdGlvbnM/LmRpc2FibGVTbWFydFN5bmMgPyB7fSA6IHtcbiAgICAgICAgc3luY0tleUNvbmRpdGlvbjogKGtleSwgc3RhdGUpID0+ICFlcXVhbCh0aGlzLnN0b3JlSW1hZ2Vba2V5XSwgc3RhdGVba2V5XSksXG4gICAgICAgIHBvc3RQcm9jZXNzOiAoc3RhdGUpID0+IHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMua2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXlOYW1lOiBzdHJpbmcgPSB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyA/IE9iamVjdC5rZXlzKGtleSlbMF0gOiBrZXk7XG4gICAgICAgICAgICB0aGlzLnN0b3JlSW1hZ2Vba2V5TmFtZV0gPSBzdGF0ZVtrZXlOYW1lXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgc3RvcmFnZTogb3B0aW9ucz8uc3RvcmFnZSBhcyB1bmtub3duIGFzIFN0b3JhZ2UsXG4gICAgICBtZXJnZVJlZHVjZXI6IHR5cGVvZiBvcHRpb25zPy5tZXJnZVJlZHVjZXIgIT09ICdmdW5jdGlvbicgPyB0aGlzLm1lcmdlUmVkdWNlciA6IG9wdGlvbnMubWVyZ2VSZWR1Y2VyXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3RhdGUgbWFuaXB1bGF0aW9uIGluIGNhc2Ugb2Ygc3RvcmUgc3RvcmFnZSBzeW5jXG4gICAqIE1lcmdlIHN0cmF0ZWd5IGlzIGEgZnVsbCBtZXJnZSBhdCBpbml0OyBXaGVuIGEgbmV3IGBzdG9yZSBzbGljZWAgaXMgcmVnaXN0ZXJlZCwgaXRzIGluaXRpYWwgc3RhdGUgaXMgbWVyZ2VkIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgc3RvcmFnZSBjb250ZW50XG4gICAqIFBhc3MgaXQgYXMgbWVyZ2VSZWR1Y2VyIGNhbGxiYWNrIHdoZW4gY2FsbGluZyBsb2NhbFN0b3JhZ2VTeW5jIGZ1bmN0aW9uIGZyb20gJ25ncngtc3RvcmUtbG9jYWxzdG9yYWdlJywgaW4gdGhlIGFwcFxuICAgKiBAcGFyYW0gc3RhdGUgYWN0dWFsIHN0YXRlXG4gICAqIEBwYXJhbSByZWh5ZHJhdGVkU3RhdGUgc3RhdGUgZnJvbSBzdG9yYWdlXG4gICAqIEBwYXJhbSBhY3Rpb24gVHJpZ2dlcmVkIGFjdGlvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1lcmdlUmVkdWNlciA9IChzdGF0ZTogYW55LCByZWh5ZHJhdGVkU3RhdGU6IGFueSwgYWN0aW9uOiBhbnkpID0+IHtcbiAgICBpZiAocmVoeWRyYXRlZFN0YXRlKSB7XG4gICAgICBpZiAoYWN0aW9uLnR5cGUgPT09IElOSVQpIHtcbiAgICAgICAgc3RhdGUgPSBkZWVwRmlsbFdpdGhEYXRlKHN0YXRlLCByZWh5ZHJhdGVkU3RhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbi50eXBlID09PSBVUERBVEUgJiYgQXJyYXkuaXNBcnJheShhY3Rpb24uZmVhdHVyZXMpKSB7XG5cbiAgICAgICAgY29uc3Qgbm90SGFuZGxlZEZlYXR1cmVzID0gYWN0aW9uLmZlYXR1cmVzLmZpbHRlcigoZmVhdE5hbWU6IHN0cmluZykgPT4gIXRoaXMuYWxyZWFkeUh5ZHJhdGVkU3RvcmVTbGljZXMuaGFzKGZlYXROYW1lKSk7XG5cbiAgICAgICAgbm90SGFuZGxlZEZlYXR1cmVzLmZpbHRlcigoZmVhdE5hbWU6IHN0cmluZykgPT4gISFyZWh5ZHJhdGVkU3RhdGVbZmVhdE5hbWVdKS5mb3JFYWNoKChmTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgc3RhdGVbZk5hbWVdID0gc3RhdGVbZk5hbWVdID8gZGVlcEZpbGxXaXRoRGF0ZShzdGF0ZVtmTmFtZV0sIHJlaHlkcmF0ZWRTdGF0ZVtmTmFtZV0pIDogcmVoeWRyYXRlZFN0YXRlW2ZOYW1lXTtcbiAgICAgICAgICB0aGlzLmFscmVhZHlIeWRyYXRlZFN0b3JlU2xpY2VzLmFkZChmTmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhIG1ldGEgcmVkdWNlciB0aGF0IGhhbmRsZXMgc3RvcmFnZSBzeW5jXG4gICAqL1xuICBwdWJsaWMgbG9jYWxTdG9yYWdlU3luYyA9ICgpID0+IHtcbiAgICBjb25zdCBiYXNlID0gKHJlZHVjZXI6IGFueSkgPT4gc3luY1N0b3JhZ2Uoe1xuICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgcmVoeWRyYXRlOiBmYWxzZSxcbiAgICAgIHN0b3JhZ2U6IHRoaXMub3B0aW9ucy5zdG9yYWdlIGFzIHVua25vd24gYXMgU3RvcmFnZSxcbiAgICAgIHN5bmNDb25kaXRpb246ICgpID0+IHRoaXMuaGFzSHlkcmF0ZWRcbiAgICB9KShyZWR1Y2VyKTtcblxuICAgIHJldHVybiAocmVkdWNlcjogYW55KSA9PiB7XG4gICAgICBpZiAoaXNMb2NhbFN0b3JhZ2VDb25maWcodGhpcy5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gc3luY1N0b3JhZ2UodGhpcy5vcHRpb25zKShyZWR1Y2VyKTtcbiAgICAgIH1cblxuXG4gICAgICByZXR1cm4gKHN0YXRlOiBhbnksIGFjdGlvbjogYW55KSA9PiB7XG4gICAgICAgIGxldCBoeWRyYXRlZFN0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gcmVoeWRyYXRlQWN0aW9uLnR5cGUpIHtcbiAgICAgICAgICBjb25zdCBoYXNBbHJlYWR5SHlkcmF0ZWQgPSB0aGlzLmhhc0h5ZHJhdGVkO1xuICAgICAgICAgIHRoaXMuaGFzSHlkcmF0ZWQgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZXMgPSB0aGlzLm9wdGlvbnMua2V5cy5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgYW55Piwga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdG9yZU5hbWUgPSBPYmplY3Qua2V5cyhrZXkpWzBdO1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVTeW5jaHJvbml6ZXIgPSAoa2V5IGFzIGFueSlbc3RvcmVOYW1lXTtcbiAgICAgICAgICAgIGlmIChpc1NlcmlhbGl6ZXIoc3RvcmVTeW5jaHJvbml6ZXIpKSB7XG4gICAgICAgICAgICAgIGFjY1tzdG9yZU5hbWVdID0gc3RvcmVTeW5jaHJvbml6ZXIuaW5pdGlhbFN0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgbGV0IG92ZXJyaWRlcyA9IHt9O1xuICAgICAgICAgIGlmICghaGFzQWxyZWFkeUh5ZHJhdGVkKSB7XG4gICAgICAgICAgICBvdmVycmlkZXMgPSBPYmplY3QuZW50cmllcyhhY3Rpb24ucGF5bG9hZCkucmVkdWNlPFJlY29yZDxzdHJpbmcsIGFueT4+KChhY2MsIFtzdG9yZU5hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWluaXRpYWxTdGF0ZXNbc3RvcmVOYW1lXSB8fCBpbml0aWFsU3RhdGVzW3N0b3JlTmFtZV0gPT09IHN0YXRlW3N0b3JlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICBhY2Nbc3RvcmVOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxTdGF0ZXNbc3RvcmVOYW1lXSAhPT0gc3RhdGVbc3RvcmVOYW1lXSkge1xuICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMubG9nZ2VyIHx8IGNvbnNvbGUpLmVycm9yKGBVbmFibGUgdG8gcmVoeWRyYXRlIHN0b3JlIFwiJHtzdG9yZU5hbWV9XCIsIGl0IGhhcyBiZWVuIG1vZGlmaWVkIGJlZm9yZSBiZWluZyBoeWRyYXRlZGApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCkge1xuICAgICAgICAgICAgaHlkcmF0ZWRTdGF0ZSA9IHsgLi4uc3RhdGUsIC4uLm92ZXJyaWRlcyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZShyZWR1Y2VyKShoeWRyYXRlZFN0YXRlLCBhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { deepFill } from '@o3r/core';
|
|
2
|
+
import { utils } from '@ama-sdk/core';
|
|
3
|
+
const mapper = [
|
|
4
|
+
{
|
|
5
|
+
condition: (data) => data instanceof utils.DateTime,
|
|
6
|
+
construct: (data) => new utils.DateTime(data)
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
condition: (data) => data instanceof utils.Date,
|
|
10
|
+
construct: (data) => new utils.Date(data)
|
|
11
|
+
}
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Deep fill of base object using source
|
|
15
|
+
* It will do a deep merge of the objects, overriding arrays
|
|
16
|
+
* All properties not present in source, but present in base, will remain
|
|
17
|
+
* @param base
|
|
18
|
+
* @param source
|
|
19
|
+
*/
|
|
20
|
+
export function deepFillWithDate(base, source) {
|
|
21
|
+
return deepFill(base, source, mapper);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcC1maWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RlZXAtZmlsbC9kZWVwLWZpbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBK0IsTUFBTSxXQUFXLENBQUM7QUFDbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV0QyxNQUFNLE1BQU0sR0FBNkI7SUFDdkM7UUFDRSxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksWUFBWSxLQUFLLENBQUMsUUFBUTtRQUNuRCxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7S0FDOUM7SUFDRDtRQUNFLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxZQUFZLEtBQUssQ0FBQyxJQUFJO1FBQy9DLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztLQUMxQztDQUNGLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQWlDLElBQU8sRUFBRSxNQUE2QjtJQUNyRyxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWVwRmlsbCwgdHlwZSBQcmltaXRpdmVSZXZpdmVyTWFwcGVyIH0gZnJvbSAnQG8zci9jb3JlJztcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnQGFtYS1zZGsvY29yZSc7XG5cbmNvbnN0IG1hcHBlcjogUHJpbWl0aXZlUmV2aXZlck1hcHBlcltdID0gW1xuICB7XG4gICAgY29uZGl0aW9uOiAoZGF0YSkgPT4gZGF0YSBpbnN0YW5jZW9mIHV0aWxzLkRhdGVUaW1lLFxuICAgIGNvbnN0cnVjdDogKGRhdGEpID0+IG5ldyB1dGlscy5EYXRlVGltZShkYXRhKVxuICB9LFxuICB7XG4gICAgY29uZGl0aW9uOiAoZGF0YSkgPT4gZGF0YSBpbnN0YW5jZW9mIHV0aWxzLkRhdGUsXG4gICAgY29uc3RydWN0OiAoZGF0YSkgPT4gbmV3IHV0aWxzLkRhdGUoZGF0YSlcbiAgfVxuXTtcblxuLyoqXG4gKiBEZWVwIGZpbGwgb2YgYmFzZSBvYmplY3QgdXNpbmcgc291cmNlXG4gKiBJdCB3aWxsIGRvIGEgZGVlcCBtZXJnZSBvZiB0aGUgb2JqZWN0cywgb3ZlcnJpZGluZyBhcnJheXNcbiAqIEFsbCBwcm9wZXJ0aWVzIG5vdCBwcmVzZW50IGluIHNvdXJjZSwgYnV0IHByZXNlbnQgaW4gYmFzZSwgd2lsbCByZW1haW5cbiAqIEBwYXJhbSBiYXNlXG4gKiBAcGFyYW0gc291cmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRmlsbFdpdGhEYXRlPFQgZXh0ZW5kcyB7IFt4OiBzdHJpbmddOiBhbnkgfT4oYmFzZTogVCwgc291cmNlPzogeyBbeDogc3RyaW5nXTogYW55IH0pOiBUIHtcbiAgcmV0dXJuIGRlZXBGaWxsKGJhc2UsIHNvdXJjZSwgbWFwcGVyKTtcbn1cbiJdfQ==
|
|
@@ -2,7 +2,6 @@ import { INIT, UPDATE } from '@ngrx/store';
|
|
|
2
2
|
import { deepFill } from '@o3r/core';
|
|
3
3
|
/**
|
|
4
4
|
* Reviver the date from a JSON field if the string is matching iso format. Return the same value otherwise
|
|
5
|
-
*
|
|
6
5
|
* @param _key JSON item key name
|
|
7
6
|
* @param value JSON item value
|
|
8
7
|
*/
|
|
@@ -14,7 +13,6 @@ export const dateReviver = (_key, value) => {
|
|
|
14
13
|
};
|
|
15
14
|
/**
|
|
16
15
|
* Dummy reviver returning the value of the field as it is
|
|
17
|
-
*
|
|
18
16
|
* @param _key JSON item key name
|
|
19
17
|
* @param value JSON item value
|
|
20
18
|
*/
|
|
@@ -27,7 +25,6 @@ const checkIsBrowserEnv = () => {
|
|
|
27
25
|
};
|
|
28
26
|
/**
|
|
29
27
|
* Validate the keys structure of the registered stores
|
|
30
|
-
*
|
|
31
28
|
* @param keys map of store to synchronize
|
|
32
29
|
*/
|
|
33
30
|
const validateStateKeys = (keys) => {
|
|
@@ -44,7 +41,6 @@ const validateStateKeys = (keys) => {
|
|
|
44
41
|
};
|
|
45
42
|
/**
|
|
46
43
|
* Rehydrate the state of the whole application store
|
|
47
|
-
*
|
|
48
44
|
* @param keys Keys of the store to rehydrate
|
|
49
45
|
* @param storage storage when getting the data from
|
|
50
46
|
* @param storageKeySerializer storage key transform function
|
|
@@ -134,7 +130,6 @@ function createStateSlice(existingSlice, filter) {
|
|
|
134
130
|
/**
|
|
135
131
|
* Update the state of the store after reviving from storage
|
|
136
132
|
* Note: this function is mainly use for internal process of store synchronization
|
|
137
|
-
*
|
|
138
133
|
* @param state store state
|
|
139
134
|
* @param keys key of the store
|
|
140
135
|
* @param storage storage to use for the synchronization
|
|
@@ -232,13 +227,24 @@ export const syncStateUpdate = (state, keys, storage, storageKeySerializer, remo
|
|
|
232
227
|
};
|
|
233
228
|
const defaultMergeReducer = (state, rehydratedState, action) => {
|
|
234
229
|
if ((action.type === INIT || action.type === UPDATE) && rehydratedState) {
|
|
235
|
-
|
|
230
|
+
const allKeys = Array.from(new Set([...Object.keys(state), ...Object.keys(rehydratedState)]));
|
|
231
|
+
state = Object.fromEntries(allKeys.map((key) => {
|
|
232
|
+
// No need to create new object reference if no merge is actually needed
|
|
233
|
+
if (!rehydratedState[key]) {
|
|
234
|
+
return [key, state[key]];
|
|
235
|
+
}
|
|
236
|
+
else if (!state[key]) {
|
|
237
|
+
return [key, rehydratedState[key]];
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
return [key, deepFill(state[key], rehydratedState[key])];
|
|
241
|
+
}
|
|
242
|
+
}));
|
|
236
243
|
}
|
|
237
244
|
return state;
|
|
238
245
|
};
|
|
239
246
|
/**
|
|
240
247
|
* Local and Session storage synchronization helper
|
|
241
|
-
*
|
|
242
248
|
* @param config
|
|
243
249
|
*/
|
|
244
250
|
export const syncStorage = (config) => (reducer) => {
|
|
@@ -288,4 +294,4 @@ export const syncStorage = (config) => (reducer) => {
|
|
|
288
294
|
return nextState;
|
|
289
295
|
};
|
|
290
296
|
};
|
|
291
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1zeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMtc3RvcmFnZS9zdG9yYWdlLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUlyQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQVksRUFBRSxLQUFVLEVBQUUsRUFBRTtJQUN0RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSw0Q0FBNEMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDekYsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4QjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLFlBQVksR0FBRyxDQUFDLElBQVksRUFBRSxLQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztBQUV6RDs7R0FFRztBQUNILE1BQU0saUJBQWlCLEdBQUcsR0FBRyxFQUFFO0lBQzdCLE9BQU8sT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO0lBQzlDLE9BQVEsSUFBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUVmLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQzNCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxPQUFPLElBQUksS0FBSyxR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d0RBQXdEO1FBQ3hELGdEQUFnRDtRQUNoRCxTQUFTLEdBQUcsWUFBYSxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFOUQsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFdkMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtZQUN4QixlQUFlLENBQ2IsU0FBUyxFQUNULENBQUMsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZFLE1BQU0sT0FBTyxHQUFHLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNwRSxPQUFPLE1BQU0sQ0FBQyxnQkFBaUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDZCxNQUFNLENBQUMsT0FBTyxFQUNkLE1BQU0sQ0FBQyxvQkFBd0QsRUFDL0QsTUFBTSxDQUFDLGlCQUFpQixFQUN4QixNQUFNLENBQUMsYUFBYSxFQUNwQixNQUFNLENBQ1AsQ0FBQztTQUNIO1FBQ0QsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDL0I7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJTklULCBVUERBVEUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBkZWVwRmlsbCB9IGZyb20gJ0BvM3IvY29yZSc7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJ0BvM3IvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VLZXlDb25maWd1cmF0aW9uLCBTdG9yYWdlS2V5cywgU3luY1N0b3JhZ2VDb25maWcsIFN5bmNTdG9yYWdlU3luY09wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIFJldml2ZXIgdGhlIGRhdGUgZnJvbSBhIEpTT04gZmllbGQgaWYgdGhlIHN0cmluZyBpcyBtYXRjaGluZyBpc28gZm9ybWF0LiBSZXR1cm4gdGhlIHNhbWUgdmFsdWUgb3RoZXJ3aXNlXG4gKlxuICogQHBhcmFtIF9rZXkgSlNPTiBpdGVtIGtleSBuYW1lXG4gKiBAcGFyYW0gdmFsdWUgSlNPTiBpdGVtIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCBkYXRlUmV2aXZlciA9IChfa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgL1xcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9LlxcZHszfVovLnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIER1bW15IHJldml2ZXIgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgYXMgaXQgaXNcbiAqXG4gKiBAcGFyYW0gX2tleSBKU09OIGl0ZW0ga2V5IG5hbWVcbiAqIEBwYXJhbSB2YWx1ZSBKU09OIGl0ZW0gdmFsdWVcbiAqL1xuY29uc3QgZHVtbXlSZXZpdmVyID0gKF9rZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gdmFsdWU7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGlzIHJ1biBpbiBhIGJyb3dzZXJcbiAqL1xuY29uc3QgY2hlY2tJc0Jyb3dzZXJFbnYgPSAoKSA9PiB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbn07XG5cbi8qKlxuICogVmFsaWRhdGUgdGhlIGtleXMgc3RydWN0dXJlIG9mIHRoZSByZWdpc3RlcmVkIHN0b3Jlc1xuICpcbiAqIEBwYXJhbSBrZXlzIG1hcCBvZiBzdG9yZSB0byBzeW5jaHJvbml6ZVxuICovXG5jb25zdCB2YWxpZGF0ZVN0YXRlS2V5cyA9IChrZXlzOiBTdG9yYWdlS2V5cykgPT4ge1xuICByZXR1cm4gKGtleXMgYXMgYW55W10pLm1hcCgoa2V5KSA9PiB7XG4gICAgbGV0IGF0dHIgPSBrZXk7XG5cbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGF0dHIgPSBPYmplY3Qua2V5cyhrZXkpWzBdO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXR0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdsb2NhbFN0b3JhZ2VTeW5jIFVua25vd24gUGFyYW1ldGVyIFR5cGU6ICcgKyBgRXhwZWN0ZWQgdHlwZSBvZiBzdHJpbmcsIGdvdCAke3R5cGVvZiBhdHRyfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZWh5ZHJhdGUgdGhlIHN0YXRlIG9mIHRoZSB3aG9sZSBhcHBsaWNhdGlvbiBzdG9yZVxuICpcbiAqIEBwYXJhbSBrZXlzIEtleXMgb2YgdGhlIHN0b3JlIHRvIHJlaHlkcmF0ZVxuICogQHBhcmFtIHN0b3JhZ2Ugc3RvcmFnZSB3aGVuIGdldHRpbmcgdGhlIGRhdGEgZnJvbVxuICogQHBhcmFtIHN0b3JhZ2VLZXlTZXJpYWxpemVyIHN0b3JhZ2Uga2V5IHRyYW5zZm9ybSBmdW5jdGlvblxuICogQHBhcmFtIHJlc3RvcmVEYXRlcyBkZXRlcm1pbmUgaWYgdGhlIGRhdGUgbmVlZCB0byBiZSByZXN0b3JlZFxuICogQHBhcmFtIGxvZ2dlclxuICovXG5leHBvcnQgY29uc3QgcmVoeWRyYXRlQXBwbGljYXRpb25TdGF0ZSA9IChcbiAga2V5czogU3RvcmFnZUtleXMsXG4gIHN0b3JhZ2U6IFN0b3JhZ2UgfCB1bmRlZmluZWQsXG4gIHN0b3JhZ2VLZXlTZXJpYWxpemVyOiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgcmVzdG9yZURhdGVzOiBib29sZWFuLFxuICBsb2dnZXI6IExvZ2dlciA9IGNvbnNvbGVcbikgPT4ge1xuICByZXR1cm4gKGtleXMgYXMgYW55W10pLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgbGV0IGtleSA9IGN1cnI7XG4gICAgbGV0IHJldml2ZXIgPSByZXN0b3JlRGF0ZXMgPyBkYXRlUmV2aXZlciA6IGR1bW15UmV2aXZlcjtcbiAgICBsZXQgZGVzZXJpYWxpemU6ICgoYXJnMDogc3RyaW5nKSA9PiBhbnkpIHwgdW5kZWZpbmVkO1xuICAgIGxldCBkZWNyeXB0OiAoKGFyZzA6IHN0cmluZykgPT4gc3RyaW5nKSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3luY0ZvckZlYXR1cmUgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAga2V5ID0gT2JqZWN0LmtleXMoa2V5KVswXTtcbiAgICAgIHN5bmNGb3JGZWF0dXJlID0gISEoY3Vycj8uW2tleV0gYXMgU3luY1N0b3JhZ2VTeW5jT3B0aW9ucyk/LnN5bmNGb3JGZWF0dXJlO1xuXG4gICAgICAvLyB1c2UgdGhlIGN1c3RvbSByZXZpdmVyIGZ1bmN0aW9uXG4gICAgICBpZiAodHlwZW9mIGN1cnJba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXZpdmVyID0gY3VycltrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIGN1c3RvbSByZXZpdmVyIGZ1bmN0aW9uIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAoY3VycltrZXldLnJldml2ZXIpIHtcbiAgICAgICAgICByZXZpdmVyID0gY3VycltrZXldLnJldml2ZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlIGN1c3RvbSBzZXJpYWxpemUgZnVuY3Rpb24gaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmIChjdXJyW2tleV0uZGVzZXJpYWxpemUpIHtcbiAgICAgICAgICBkZXNlcmlhbGl6ZSA9IGN1cnJba2V5XS5kZXNlcmlhbGl6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgdGhhdCBlbmNyeXB0IGFuZCBkZWNyeXB0IGZ1bmN0aW9ucyBhcmUgYm90aCBwcmVzZW50XG4gICAgICBpZiAoY3VycltrZXldLmVuY3J5cHQgJiYgY3VycltrZXldLmRlY3J5cHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjdXJyW2tleV0uZW5jcnlwdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY3VycltrZXldLmRlY3J5cHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBkZWNyeXB0ID0gY3VycltrZXldLmRlY3J5cHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBFaXRoZXIgZW5jcnlwdCBvciBkZWNyeXB0IGlzIG5vdCBhIGZ1bmN0aW9uIG9uICcke2N1cnJba2V5XSBhcyBzdHJpbmd9JyBrZXkgb2JqZWN0LmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGN1cnJba2V5XS5lbmNyeXB0IHx8IGN1cnJba2V5XS5kZWNyeXB0KSB7XG4gICAgICAgIC8vIExldCBrbm93IHRoYXQgb25lIG9mIHRoZSBlbmNyeXB0aW9uIGZ1bmN0aW9ucyBpcyBub3QgcHJvdmlkZWRcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBFaXRoZXIgZW5jcnlwdCBvciBkZWNyeXB0IGZ1bmN0aW9uIGlzIG5vdCBwcmVzZW50IG9uICcke2N1cnJba2V5XSBhcyBzdHJpbmd9JyBrZXkgb2JqZWN0LmApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RvcmFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgc3RhdGVTbGljZSA9IHN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5U2VyaWFsaXplcihrZXkpKTtcbiAgICAgIGlmIChzdGF0ZVNsaWNlKSB7XG4gICAgICAgIC8vIFVzZSBwcm92aWRlZCBkZWNyeXB0IGZ1bmN0aW9uXG4gICAgICAgIGlmIChkZWNyeXB0KSB7XG4gICAgICAgICAgc3RhdGVTbGljZSA9IGRlY3J5cHQoc3RhdGVTbGljZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc09iamVjdFJlZ2V4ID0gbmV3IFJlZ0V4cCgne3xcXFxcWycpO1xuICAgICAgICBsZXQgcmF3ID0gc3RhdGVTbGljZTtcblxuICAgICAgICBpZiAoc3RhdGVTbGljZSA9PT0gJ251bGwnIHx8IHN0YXRlU2xpY2UgPT09ICd0cnVlJyB8fCBzdGF0ZVNsaWNlID09PSAnZmFsc2UnIHx8IGlzT2JqZWN0UmVnZXgudGVzdChzdGF0ZVNsaWNlLmNoYXJBdCgwKSkpIHtcbiAgICAgICAgICByYXcgPSBKU09OLnBhcnNlKHN0YXRlU2xpY2UsIHJldml2ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVoeWRyYXRlZFN0YXRlID0gZGVzZXJpYWxpemUgPyBkZXNlcmlhbGl6ZShyYXcpIDogcmF3O1xuXG4gICAgICAgIHJldHVybiBzeW5jRm9yRmVhdHVyZSA/IHJlaHlkcmF0ZWRTdGF0ZSA6IE9iamVjdC5hc3NpZ24oe30sIGFjYywge1xuICAgICAgICAgIFtrZXldOiByZWh5ZHJhdGVkU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn07XG5cbi8vIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBleGlzdGluZyBzbGljZSBhcyBkZWZpbmVkIGJ5IHRoZSBgZmlsdGVyYCBhcmd1bWVudCxcbi8vIGFuZCBvdXRwdXQgdGhlIG5ldyBvYmplY3Qgd2l0aCBleHRyYW5lb3VzIHByb3BlcnRpZXMgcmVtb3ZlZC5cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRlU2xpY2UoZXhpc3RpbmdTbGljZTogYW55LCBmaWx0ZXI6IChzdHJpbmcgfCBudW1iZXIgfCBTdG9yYWdlS2V5Q29uZmlndXJhdGlvbiB8IFN5bmNTdG9yYWdlU3luY09wdGlvbnMpW10pIHtcbiAgcmV0dXJuIGZpbHRlci5yZWR1Y2UoXG4gICAgKG1lbW86IHsgW3g6IHN0cmluZ106IGFueTtbeDogbnVtYmVyXTogYW55IH0sIGF0dHI6IHN0cmluZyB8IG51bWJlciB8IFN0b3JhZ2VLZXlDb25maWd1cmF0aW9uIHwgU3luY1N0b3JhZ2VTeW5jT3B0aW9ucykgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYXR0ciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBleGlzdGluZ1NsaWNlPy5bYXR0cl07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbWVtb1thdHRyXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRyLCBrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50OiBhbnkgPSBhdHRyW2tleSBhcyBrZXlvZiB0eXBlb2YgYXR0cl07XG4gICAgICAgICAgICBtZW1vW2tleV0gPSBjcmVhdGVTdGF0ZVNsaWNlKGV4aXN0aW5nU2xpY2Vba2V5XSwgZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9LFxuICAgIHt9XG4gICk7XG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSBzdGF0ZSBvZiB0aGUgc3RvcmUgYWZ0ZXIgcmV2aXZpbmcgZnJvbSBzdG9yYWdlXG4gKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGlzIG1haW5seSB1c2UgZm9yIGludGVybmFsIHByb2Nlc3Mgb2Ygc3RvcmUgc3luY2hyb25pemF0aW9uXG4gKlxuICogQHBhcmFtIHN0YXRlIHN0b3JlIHN0YXRlXG4gKiBAcGFyYW0ga2V5cyBrZXkgb2YgdGhlIHN0b3JlXG4gKiBAcGFyYW0gc3RvcmFnZSBzdG9yYWdlIHRvIHVzZSBmb3IgdGhlIHN5bmNocm9uaXphdGlvblxuICogQHBhcmFtIHN0b3JhZ2VLZXlTZXJpYWxpemVyIGNhbGxiYWNrIHRvIHNlcmlhbGl6ZSB0aGUgc3RvcmUga2V5XG4gKiBAcGFyYW0gcmVtb3ZlT25VbmRlZmluZWQgRGVmaW5lIGlmIHRoZSBzdG9yZSBzaG91bGQgYmUgY2xlYW4gaW4gdGhlIHN0b3JhZ2UgaWYgdW5kZWZpbmVkXG4gKiBAcGFyYW0gc3luY0NvbmRpdGlvbiBjYWxsYmFjayB0byBkZWZpbmUgaWYgdGhlIHN5bmNocm9uaXphdGlvbiBzaG91bGQgYmUgcHJvY2Vzc1xuICogQHBhcmFtIGxvZ2dlciBMb2dnZXIgdG8gcmVwb3J0IG1lc3NhZ2VzXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jU3RhdGVVcGRhdGUgPSAoXG4gIHN0YXRlOiBhbnksXG4gIGtleXM6IFN0b3JhZ2VLZXlzLFxuICBzdG9yYWdlOiBTdG9yYWdlIHwgdW5kZWZpbmVkLFxuICBzdG9yYWdlS2V5U2VyaWFsaXplcjogKGtleTogc3RyaW5nIHwgbnVtYmVyKSA9PiBzdHJpbmcsXG4gIHJlbW92ZU9uVW5kZWZpbmVkID0gZmFsc2UsXG4gIHN5bmNDb25kaXRpb24/OiAoc3RhdGU6IGFueSkgPT4gYW55LFxuICBsb2dnZXI6IExvZ2dlciA9IGNvbnNvbGVcbikgPT4ge1xuICBpZiAoc3luY0NvbmRpdGlvbikge1xuICAgIHRyeSB7XG4gICAgICBpZiAoc3luY0NvbmRpdGlvbihzdGF0ZSkgIT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFRyZWF0IFR5cGVFcnJvciBhcyBkbyBub3Qgc3luY1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBrZXlzLmZvckVhY2goKGtleTogc3RyaW5nIHwgU3RvcmFnZUtleUNvbmZpZ3VyYXRpb24gfCBTeW5jU3RvcmFnZVN5bmNPcHRpb25zIHwgKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSk6IHZvaWQgPT4ge1xuICAgIGxldCBzdGF0ZVNsaWNlID0gc3RhdGU/LltrZXkgYXMgc3RyaW5nXTtcbiAgICBsZXQgcmVwbGFjZXI7XG4gICAgbGV0IHNwYWNlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVuY3J5cHQ7XG4gICAgbGV0IHN5bmNGb3JGZWF0dXJlID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSAoT2JqZWN0LmtleXMoa2V5KSBhcyAoa2V5b2YgdHlwZW9mIGtleSlbXSlbMF07XG4gICAgICBzeW5jRm9yRmVhdHVyZSA9ICEhKGtleT8uW25hbWVdIGFzIFN5bmNTdG9yYWdlU3luY09wdGlvbnMpPy5zeW5jRm9yRmVhdHVyZTtcbiAgICAgIHN0YXRlU2xpY2UgPSBzeW5jRm9yRmVhdHVyZSA/IHN0YXRlIDogc3RhdGU/LltuYW1lXTtcblxuICAgICAgaWYgKHR5cGVvZiBzdGF0ZVNsaWNlICE9PSAndW5kZWZpbmVkJyAmJiBrZXlbbmFtZV0pIHtcbiAgICAgICAgLy8gdXNlIHNlcmlhbGl6ZSBmdW5jdGlvbiBpZiBzcGVjaWZpZWQuXG4gICAgICAgIGlmICgoa2V5W25hbWVdIGFzIGFueSkuc2VyaWFsaXplKSB7XG4gICAgICAgICAgc3RhdGVTbGljZSA9IChrZXlbbmFtZV0gYXMgU3luY1N0b3JhZ2VTeW5jT3B0aW9ucykuc2VyaWFsaXplIShzdGF0ZVNsaWNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiBzZXJpYWxpemUgZnVuY3Rpb24gaXMgbm90IHNwZWNpZmllZCBmaWx0ZXIgb24gZmllbGRzIGlmIGFuIGFycmF5IGhhcyBiZWVuIHByb3ZpZGVkLlxuICAgICAgICAgIGxldCBmaWx0ZXI6IFN0b3JhZ2VLZXlDb25maWd1cmF0aW9uW10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKChrZXlbbmFtZV0gYXMgYW55KS5yZWR1Y2UpIHtcbiAgICAgICAgICAgIGZpbHRlciA9IGtleVtuYW1lXSBhcyBTdG9yYWdlS2V5Q29uZmlndXJhdGlvbltdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGtleVtuYW1lXSBhcyBhbnkpLmZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVyID0gKGtleVtuYW1lXSBhcyBhbnkpLmZpbHRlciBhcyBTdG9yYWdlS2V5Q29uZmlndXJhdGlvbltdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBzdGF0ZVNsaWNlID0gY3JlYXRlU3RhdGVTbGljZShzdGF0ZVNsaWNlLCBmaWx0ZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIGVuY3J5cHQgYW5kIGRlY3J5cHQgYXJlIHByZXNlbnQsIGFsc28gY2hlY2tlZCBhdCB0aGlzI3JlaHlkcmF0ZUFwcGxpY2F0aW9uU3RhdGUoKVxuICAgICAgICAgIGlmICgoa2V5W25hbWVdIGFzIGFueSkuZW5jcnlwdCAmJiAoa2V5W25hbWVdIGFzIGFueSkuZGVjcnlwdCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAoa2V5W25hbWVdIGFzIGFueSkuZW5jcnlwdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBlbmNyeXB0ID0gKGtleVtuYW1lXSBhcyBhbnkpLmVuY3J5cHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICgoa2V5W25hbWVdIGFzIGFueSkuZW5jcnlwdCB8fCAoa2V5W25hbWVdIGFzIGFueSkuZGVjcnlwdCkge1xuICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRob3NlIGlzIG5vdCBwcmVzZW50LCB0aGVuIGxldCBrbm93IHRoYXQgb25lIGlzIG1pc3NpbmdcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEVpdGhlciBlbmNyeXB0IG9yIGRlY3J5cHQgZnVuY3Rpb24gaXMgbm90IHByZXNlbnQgb24gJyR7a2V5W25hbWVdIGFzIHN0cmluZ30nIGtleSBvYmplY3QuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgIFJlcGxhY2VyIGFuZCBzcGFjZSBhcmd1bWVudHMgdG8gcGFzcyB0byBKU09OLnN0cmluZ2lmeS5cbiAgICAgICAgICBJZiB0aGVzZSBmaWVsZHMgZG9uJ3QgZXhpc3QsIHVuZGVmaW5lZCB3aWxsIGJlIHBhc3NlZC5cbiAgICAgICAgKi9cbiAgICAgICAgcmVwbGFjZXIgPSAoa2V5W25hbWVdIGFzIGFueSkucmVwbGFjZXI7XG4gICAgICAgIHNwYWNlID0gKGtleVtuYW1lXSBhcyBhbnkpLnNwYWNlO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSBuYW1lO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHN0YXRlU2xpY2UgPSBzeW5jRm9yRmVhdHVyZSA/IHN0YXRlIDogc3RhdGU/LltrZXldO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc3RhdGVTbGljZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RvcmFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZW5jcnlwdCkge1xuICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGEgc3RyaW5nIG1lc3NhZ2UgaXMgcGFzc2VkXG4gICAgICAgICAgc3RhdGVTbGljZSA9IGVuY3J5cHQoXG4gICAgICAgICAgICB0eXBlb2Ygc3RhdGVTbGljZSA9PT0gJ3N0cmluZycgPyBzdGF0ZVNsaWNlIDogSlNPTi5zdHJpbmdpZnkoc3RhdGVTbGljZSwgcmVwbGFjZXIsIHNwYWNlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgIHN0b3JhZ2VLZXlTZXJpYWxpemVyKGtleSBhcyBzdHJpbmcpLFxuICAgICAgICAgIHR5cGVvZiBzdGF0ZVNsaWNlID09PSAnc3RyaW5nJyA/IHN0YXRlU2xpY2UgOiBKU09OLnN0cmluZ2lmeShzdGF0ZVNsaWNlLCByZXBsYWNlciwgc3BhY2UpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIHNhdmUgc3RhdGUgdG8gbG9jYWxTdG9yYWdlOicsIGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0YXRlU2xpY2UgPT09ICd1bmRlZmluZWQnICYmIHJlbW92ZU9uVW5kZWZpbmVkICYmIHN0b3JhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JhZ2VLZXlTZXJpYWxpemVyKGtleSBhcyBzdHJpbmcpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBFeGNlcHRpb24gb24gcmVtb3ZpbmcvY2xlYW5pbmcgdW5kZWZpbmVkICcke2tleSBhcyBzdHJpbmd9JyBzdGF0ZWAsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCBkZWZhdWx0TWVyZ2VSZWR1Y2VyID0gKHN0YXRlOiBhbnksIHJlaHlkcmF0ZWRTdGF0ZTogYW55LCBhY3Rpb246IGFueSkgPT4ge1xuICBpZiAoKGFjdGlvbi50eXBlID09PSBJTklUIHx8IGFjdGlvbi50eXBlID09PSBVUERBVEUpICYmIHJlaHlkcmF0ZWRTdGF0ZSkge1xuICAgIHN0YXRlID0gZGVlcEZpbGwoc3RhdGUsIHJlaHlkcmF0ZWRTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIExvY2FsIGFuZCBTZXNzaW9uIHN0b3JhZ2Ugc3luY2hyb25pemF0aW9uIGhlbHBlclxuICpcbiAqIEBwYXJhbSBjb25maWdcbiAqL1xuZXhwb3J0IGNvbnN0IHN5bmNTdG9yYWdlID0gKGNvbmZpZzogU3luY1N0b3JhZ2VDb25maWcpID0+IChyZWR1Y2VyOiBhbnkpID0+IHtcbiAgaWYgKFxuICAgIChjb25maWcuc3RvcmFnZSA9PT0gdW5kZWZpbmVkICYmICFjb25maWcuY2hlY2tTdG9yYWdlQXZhaWxhYmlsaXR5KSB8fFxuICAgIChjb25maWcuY2hlY2tTdG9yYWdlQXZhaWxhYmlsaXR5ICYmIGNoZWNrSXNCcm93c2VyRW52KCkpXG4gICkge1xuICAgIGNvbmZpZy5zdG9yYWdlID0gbG9jYWxTdG9yYWdlIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH1cblxuICBpZiAoY29uZmlnLnN0b3JhZ2VLZXlTZXJpYWxpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25maWcuc3RvcmFnZUtleVNlcmlhbGl6ZXIgPSAoa2V5KSA9PiBrZXk7XG4gIH1cblxuICBpZiAoY29uZmlnLnJlc3RvcmVEYXRlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLnJlc3RvcmVEYXRlcyA9IHRydWU7XG4gIH1cblxuICAvLyBVc2UgZGVmYXVsdCBtZXJnZSByZWR1Y2VyLlxuICBsZXQgbWVyZ2VSZWR1Y2VyID0gY29uZmlnLm1lcmdlUmVkdWNlcjtcblxuICBpZiAobWVyZ2VSZWR1Y2VyID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1lcmdlUmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIG1lcmdlUmVkdWNlciA9IGRlZmF1bHRNZXJnZVJlZHVjZXI7XG4gIH1cblxuICBjb25zdCBsb2dnZXIgPSBjb25maWcubG9nZ2VyIHx8IGNvbnNvbGU7XG5cbiAgY29uc3Qgc3RhdGVLZXlzID0gdmFsaWRhdGVTdGF0ZUtleXMoY29uZmlnLmtleXMpO1xuICBjb25zdCByZWh5ZHJhdGVkU3RhdGUgPSBjb25maWcucmVoeWRyYXRlXG4gICAgPyByZWh5ZHJhdGVBcHBsaWNhdGlvblN0YXRlKHN0YXRlS2V5cywgY29uZmlnLnN0b3JhZ2UsIGNvbmZpZy5zdG9yYWdlS2V5U2VyaWFsaXplciwgY29uZmlnLnJlc3RvcmVEYXRlcywgbG9nZ2VyKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiAoc3RhdGU6IGFueSwgYWN0aW9uOiBhbnkpID0+IHtcbiAgICBsZXQgbmV4dFN0YXRlOiBhbnk7XG5cbiAgICAvLyBJZiBzdGF0ZSBhcnJpdmVzIHVuZGVmaW5lZCwgd2UgbmVlZCB0byBsZXQgaXQgdGhyb3VnaCB0aGUgc3VwcGxpZWQgcmVkdWNlclxuICAgIC8vIGluIG9yZGVyIHRvIGdldCBhIGNvbXBsZXRlIHN0YXRlIGFzIGRlZmluZWQgYnkgdXNlclxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gSU5JVCAmJiAhc3RhdGUpIHtcbiAgICAgIG5leHRTdGF0ZSA9IHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRTdGF0ZSA9IHsgLi4uc3RhdGUgfTtcbiAgICB9XG5cbiAgICAvLyBNZXJnZSB0aGUgc3RvcmUgc3RhdGUgd2l0aCB0aGUgcmVoeWRyYXRlZCBzdGF0ZSB1c2luZ1xuICAgIC8vIGVpdGhlciBhIHVzZXItZGVmaW5lZCByZWR1Y2VyIG9yIHRoZSBkZWZhdWx0LlxuICAgIG5leHRTdGF0ZSA9IG1lcmdlUmVkdWNlciEobmV4dFN0YXRlLCByZWh5ZHJhdGVkU3RhdGUsIGFjdGlvbik7XG5cbiAgICBuZXh0U3RhdGUgPSByZWR1Y2VyKG5leHRTdGF0ZSwgYWN0aW9uKTtcblxuICAgIGlmIChhY3Rpb24udHlwZSAhPT0gSU5JVCkge1xuICAgICAgc3luY1N0YXRlVXBkYXRlKFxuICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgICh0eXBlb2YgY29uZmlnLnN5bmNLZXlDb25kaXRpb24gPT09ICdmdW5jdGlvbicpID8gc3RhdGVLZXlzLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IGtleU5hbWUgPSB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyA/IE9iamVjdC5rZXlzKGtleSlbMF0gOiBrZXk7XG4gICAgICAgICAgcmV0dXJuIGNvbmZpZy5zeW5jS2V5Q29uZGl0aW9uIShrZXlOYW1lLCBuZXh0U3RhdGUpO1xuICAgICAgICB9KSA6IHN0YXRlS2V5cyxcbiAgICAgICAgY29uZmlnLnN0b3JhZ2UsXG4gICAgICAgIGNvbmZpZy5zdG9yYWdlS2V5U2VyaWFsaXplciBhcyAoa2V5OiBzdHJpbmcgfCBudW1iZXIpID0+IHN0cmluZyxcbiAgICAgICAgY29uZmlnLnJlbW92ZU9uVW5kZWZpbmVkLFxuICAgICAgICBjb25maWcuc3luY0NvbmRpdGlvbixcbiAgICAgICAgbG9nZ2VyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnBvc3RQcm9jZXNzKSB7XG4gICAgICBjb25maWcucG9zdFByb2Nlc3MobmV4dFN0YXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfTtcbn07XG4iXX0=
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1zeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMtc3RvcmFnZS9zdG9yYWdlLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUlyQzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBWSxFQUFFLEtBQVUsRUFBRSxFQUFFO0lBQ3RELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLDRDQUE0QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN6RixPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFZLEVBQUUsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUM7QUFFekQ7O0dBRUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLEdBQUcsRUFBRTtJQUM3QixPQUFPLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQztBQUN2QyxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO0lBQzlDLE9BQVEsSUFBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUVmLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQzNCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFR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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNwRSxPQUFPLE1BQU0sQ0FBQyxnQkFBaUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDZCxNQUFNLENBQUMsT0FBTyxFQUNkLE1BQU0sQ0FBQyxvQkFBd0QsRUFDL0QsTUFBTSxDQUFDLGlCQUFpQixFQUN4QixNQUFNLENBQUMsYUFBYSxFQUNwQixNQUFNLENBQ1AsQ0FBQztTQUNIO1FBQ0QsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDL0I7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJTklULCBVUERBVEUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBkZWVwRmlsbCB9IGZyb20gJ0BvM3IvY29yZSc7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJ0BvM3IvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VLZXlDb25maWd1cmF0aW9uLCBTdG9yYWdlS2V5cywgU3luY1N0b3JhZ2VDb25maWcsIFN5bmNTdG9yYWdlU3luY09wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIFJldml2ZXIgdGhlIGRhdGUgZnJvbSBhIEpTT04gZmllbGQgaWYgdGhlIHN0cmluZyBpcyBtYXRjaGluZyBpc28gZm9ybWF0LiBSZXR1cm4gdGhlIHNhbWUgdmFsdWUgb3RoZXJ3aXNlXG4gKiBAcGFyYW0gX2tleSBKU09OIGl0ZW0ga2V5IG5hbWVcbiAqIEBwYXJhbSB2YWx1ZSBKU09OIGl0ZW0gdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IGRhdGVSZXZpdmVyID0gKF9rZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAvXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0uXFxkezN9Wi8udGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogRHVtbXkgcmV2aXZlciByZXR1cm5pbmcgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBhcyBpdCBpc1xuICogQHBhcmFtIF9rZXkgSlNPTiBpdGVtIGtleSBuYW1lXG4gKiBAcGFyYW0gdmFsdWUgSlNPTiBpdGVtIHZhbHVlXG4gKi9cbmNvbnN0IGR1bW15UmV2aXZlciA9IChfa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHZhbHVlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgY29kZSBpcyBydW4gaW4gYSBicm93c2VyXG4gKi9cbmNvbnN0IGNoZWNrSXNCcm93c2VyRW52ID0gKCkgPT4ge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlIHRoZSBrZXlzIHN0cnVjdHVyZSBvZiB0aGUgcmVnaXN0ZXJlZCBzdG9yZXNcbiAqIEBwYXJhbSBrZXlzIG1hcCBvZiBzdG9yZSB0byBzeW5jaHJvbml6ZVxuICovXG5jb25zdCB2YWxpZGF0ZVN0YXRlS2V5cyA9IChrZXlzOiBTdG9yYWdlS2V5cykgPT4ge1xuICByZXR1cm4gKGtleXMgYXMgYW55W10pLm1hcCgoa2V5KSA9PiB7XG4gICAgbGV0IGF0dHIgPSBrZXk7XG5cbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGF0dHIgPSBPYmplY3Qua2V5cyhrZXkpWzBdO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXR0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdsb2NhbFN0b3JhZ2VTeW5jIFVua25vd24gUGFyYW1ldGVyIFR5cGU6ICcgKyBgRXhwZWN0ZWQgdHlwZSBvZiBzdHJpbmcsIGdvdCAke3R5cGVvZiBhdHRyfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZWh5ZHJhdGUgdGhlIHN0YXRlIG9mIHRoZSB3aG9sZSBhcHBsaWNhdGlvbiBzdG9yZVxuICogQHBhcmFtIGtleXMgS2V5cyBvZiB0aGUgc3RvcmUgdG8gcmVoeWRyYXRlXG4gKiBAcGFyYW0gc3RvcmFnZSBzdG9yYWdlIHdoZW4gZ2V0dGluZyB0aGUgZGF0YSBmcm9tXG4gKiBAcGFyYW0gc3RvcmFnZUtleVNlcmlhbGl6ZXIgc3RvcmFnZSBrZXkgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gKiBAcGFyYW0gcmVzdG9yZURhdGVzIGRldGVybWluZSBpZiB0aGUgZGF0ZSBuZWVkIHRvIGJlIHJlc3RvcmVkXG4gKiBAcGFyYW0gbG9nZ2VyXG4gKi9cbmV4cG9ydCBjb25zdCByZWh5ZHJhdGVBcHBsaWNhdGlvblN0YXRlID0gKFxuICBrZXlzOiBTdG9yYWdlS2V5cyxcbiAgc3RvcmFnZTogU3RvcmFnZSB8IHVuZGVmaW5lZCxcbiAgc3RvcmFnZUtleVNlcmlhbGl6ZXI6IChrZXk6IHN0cmluZykgPT4gc3RyaW5nLFxuICByZXN0b3JlRGF0ZXM6IGJvb2xlYW4sXG4gIGxvZ2dlcjogTG9nZ2VyID0gY29uc29sZVxuKSA9PiB7XG4gIHJldHVybiAoa2V5cyBhcyBhbnlbXSkucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICBsZXQga2V5ID0gY3VycjtcbiAgICBsZXQgcmV2aXZlciA9IHJlc3RvcmVEYXRlcyA/IGRhdGVSZXZpdmVyIDogZHVtbXlSZXZpdmVyO1xuICAgIGxldCBkZXNlcmlhbGl6ZTogKChhcmcwOiBzdHJpbmcpID0+IGFueSkgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGRlY3J5cHQ6ICgoYXJnMDogc3RyaW5nKSA9PiBzdHJpbmcpIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzeW5jRm9yRmVhdHVyZSA9IGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICBrZXkgPSBPYmplY3Qua2V5cyhrZXkpWzBdO1xuICAgICAgc3luY0ZvckZlYXR1cmUgPSAhIShjdXJyPy5ba2V5XSBhcyBTeW5jU3RvcmFnZVN5bmNPcHRpb25zKT8uc3luY0ZvckZlYXR1cmU7XG5cbiAgICAgIC8vIHVzZSB0aGUgY3VzdG9tIHJldml2ZXIgZnVuY3Rpb25cbiAgICAgIGlmICh0eXBlb2YgY3VycltrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldml2ZXIgPSBjdXJyW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1c2UgY3VzdG9tIHJldml2ZXIgZnVuY3Rpb24gaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmIChjdXJyW2tleV0ucmV2aXZlcikge1xuICAgICAgICAgIHJldml2ZXIgPSBjdXJyW2tleV0ucmV2aXZlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2UgY3VzdG9tIHNlcmlhbGl6ZSBmdW5jdGlvbiBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKGN1cnJba2V5XS5kZXNlcmlhbGl6ZSkge1xuICAgICAgICAgIGRlc2VyaWFsaXplID0gY3VycltrZXldLmRlc2VyaWFsaXplO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSB0aGF0IGVuY3J5cHQgYW5kIGRlY3J5cHQgZnVuY3Rpb25zIGFyZSBib3RoIHByZXNlbnRcbiAgICAgIGlmIChjdXJyW2tleV0uZW5jcnlwdCAmJiBjdXJyW2tleV0uZGVjcnlwdCkge1xuICAgICAgICBpZiAodHlwZW9mIGN1cnJba2V5XS5lbmNyeXB0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjdXJyW2tleV0uZGVjcnlwdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGRlY3J5cHQgPSBjdXJyW2tleV0uZGVjcnlwdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYEVpdGhlciBlbmNyeXB0IG9yIGRlY3J5cHQgaXMgbm90IGEgZnVuY3Rpb24gb24gJyR7Y3VycltrZXldIGFzIHN0cmluZ30nIGtleSBvYmplY3QuYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY3VycltrZXldLmVuY3J5cHQgfHwgY3VycltrZXldLmRlY3J5cHQpIHtcbiAgICAgICAgLy8gTGV0IGtub3cgdGhhdCBvbmUgb2YgdGhlIGVuY3J5cHRpb24gZnVuY3Rpb25zIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICBsb2dnZXIuZXJyb3IoYEVpdGhlciBlbmNyeXB0IG9yIGRlY3J5cHQgZnVuY3Rpb24gaXMgbm90IHByZXNlbnQgb24gJyR7Y3VycltrZXldIGFzIHN0cmluZ30nIGtleSBvYmplY3QuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdG9yYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCBzdGF0ZVNsaWNlID0gc3RvcmFnZS5nZXRJdGVtKHN0b3JhZ2VLZXlTZXJpYWxpemVyKGtleSkpO1xuICAgICAgaWYgKHN0YXRlU2xpY2UpIHtcbiAgICAgICAgLy8gVXNlIHByb3ZpZGVkIGRlY3J5cHQgZnVuY3Rpb25cbiAgICAgICAgaWYgKGRlY3J5cHQpIHtcbiAgICAgICAgICBzdGF0ZVNsaWNlID0gZGVjcnlwdChzdGF0ZVNsaWNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzT2JqZWN0UmVnZXggPSBuZXcgUmVnRXhwKCd7fFxcXFxbJyk7XG4gICAgICAgIGxldCByYXcgPSBzdGF0ZVNsaWNlO1xuXG4gICAgICAgIGlmIChzdGF0ZVNsaWNlID09PSAnbnVsbCcgfHwgc3RhdGVTbGljZSA9PT0gJ3RydWUnIHx8IHN0YXRlU2xpY2UgPT09ICdmYWxzZScgfHwgaXNPYmplY3RSZWdleC50ZXN0KHN0YXRlU2xpY2UuY2hhckF0KDApKSkge1xuICAgICAgICAgIHJhdyA9IEpTT04ucGFyc2Uoc3RhdGVTbGljZSwgcmV2aXZlcik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWh5ZHJhdGVkU3RhdGUgPSBkZXNlcmlhbGl6ZSA/IGRlc2VyaWFsaXplKHJhdykgOiByYXc7XG5cbiAgICAgICAgcmV0dXJuIHN5bmNGb3JGZWF0dXJlID8gcmVoeWRyYXRlZFN0YXRlIDogT2JqZWN0LmFzc2lnbih7fSwgYWNjLCB7XG4gICAgICAgICAgW2tleV06IHJlaHlkcmF0ZWRTdGF0ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufTtcblxuLy8gUmVjdXJzaXZlbHkgdHJhdmVyc2UgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGV4aXN0aW5nIHNsaWNlIGFzIGRlZmluZWQgYnkgdGhlIGBmaWx0ZXJgIGFyZ3VtZW50LFxuLy8gYW5kIG91dHB1dCB0aGUgbmV3IG9iamVjdCB3aXRoIGV4dHJhbmVvdXMgcHJvcGVydGllcyByZW1vdmVkLlxuZnVuY3Rpb24gY3JlYXRlU3RhdGVTbGljZShleGlzdGluZ1NsaWNlOiBhbnksIGZpbHRlcjogKHN0cmluZyB8IG51bWJlciB8IFN0b3JhZ2VLZXlDb25maWd1cmF0aW9uIHwgU3luY1N0b3JhZ2VTeW5jT3B0aW9ucylbXSkge1xuICByZXR1cm4gZmlsdGVyLnJlZHVjZShcbiAgICAobWVtbzogeyBbeDogc3RyaW5nXTogYW55O1t4OiBudW1iZXJdOiBhbnkgfSwgYXR0cjogc3RyaW5nIHwgbnVtYmVyIHwgU3RvcmFnZUtleUNvbmZpZ3VyYXRpb24gfCBTeW5jU3RvcmFnZVN5bmNPcHRpb25zKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhdHRyID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGV4aXN0aW5nU2xpY2U/LlthdHRyXTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBtZW1vW2F0dHJdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHIpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGF0dHIsIGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQ6IGFueSA9IGF0dHJba2V5IGFzIGtleW9mIHR5cGVvZiBhdHRyXTtcbiAgICAgICAgICAgIG1lbW9ba2V5XSA9IGNyZWF0ZVN0YXRlU2xpY2UoZXhpc3RpbmdTbGljZVtrZXldLCBlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH0sXG4gICAge31cbiAgKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIHN0YXRlIG9mIHRoZSBzdG9yZSBhZnRlciByZXZpdmluZyBmcm9tIHN0b3JhZ2VcbiAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IHVzZSBmb3IgaW50ZXJuYWwgcHJvY2VzcyBvZiBzdG9yZSBzeW5jaHJvbml6YXRpb25cbiAqIEBwYXJhbSBzdGF0ZSBzdG9yZSBzdGF0ZVxuICogQHBhcmFtIGtleXMga2V5IG9mIHRoZSBzdG9yZVxuICogQHBhcmFtIHN0b3JhZ2Ugc3RvcmFnZSB0byB1c2UgZm9yIHRoZSBzeW5jaHJvbml6YXRpb25cbiAqIEBwYXJhbSBzdG9yYWdlS2V5U2VyaWFsaXplciBjYWxsYmFjayB0byBzZXJpYWxpemUgdGhlIHN0b3JlIGtleVxuICogQHBhcmFtIHJlbW92ZU9uVW5kZWZpbmVkIERlZmluZSBpZiB0aGUgc3RvcmUgc2hvdWxkIGJlIGNsZWFuIGluIHRoZSBzdG9yYWdlIGlmIHVuZGVmaW5lZFxuICogQHBhcmFtIHN5bmNDb25kaXRpb24gY2FsbGJhY2sgdG8gZGVmaW5lIGlmIHRoZSBzeW5jaHJvbml6YXRpb24gc2hvdWxkIGJlIHByb2Nlc3NcbiAqIEBwYXJhbSBsb2dnZXIgTG9nZ2VyIHRvIHJlcG9ydCBtZXNzYWdlc1xuICovXG5leHBvcnQgY29uc3Qgc3luY1N0YXRlVXBkYXRlID0gKFxuICBzdGF0ZTogYW55LFxuICBrZXlzOiBTdG9yYWdlS2V5cyxcbiAgc3RvcmFnZTogU3RvcmFnZSB8IHVuZGVmaW5lZCxcbiAgc3RvcmFnZUtleVNlcmlhbGl6ZXI6IChrZXk6IHN0cmluZyB8IG51bWJlcikgPT4gc3RyaW5nLFxuICByZW1vdmVPblVuZGVmaW5lZCA9IGZhbHNlLFxuICBzeW5jQ29uZGl0aW9uPzogKHN0YXRlOiBhbnkpID0+IGFueSxcbiAgbG9nZ2VyOiBMb2dnZXIgPSBjb25zb2xlXG4pID0+IHtcbiAgaWYgKHN5bmNDb25kaXRpb24pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHN5bmNDb25kaXRpb24oc3RhdGUpICE9PSB0cnVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBUcmVhdCBUeXBlRXJyb3IgYXMgZG8gbm90IHN5bmNcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAga2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZyB8IFN0b3JhZ2VLZXlDb25maWd1cmF0aW9uIHwgU3luY1N0b3JhZ2VTeW5jT3B0aW9ucyB8ICgoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IGFueSkpOiB2b2lkID0+IHtcbiAgICBsZXQgc3RhdGVTbGljZSA9IHN0YXRlPy5ba2V5IGFzIHN0cmluZ107XG4gICAgbGV0IHJlcGxhY2VyO1xuICAgIGxldCBzcGFjZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBlbmNyeXB0O1xuICAgIGxldCBzeW5jRm9yRmVhdHVyZSA9IGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBuYW1lID0gKE9iamVjdC5rZXlzKGtleSkgYXMgKGtleW9mIHR5cGVvZiBrZXkpW10pWzBdO1xuICAgICAgc3luY0ZvckZlYXR1cmUgPSAhIShrZXk/LltuYW1lXSBhcyBTeW5jU3RvcmFnZVN5bmNPcHRpb25zKT8uc3luY0ZvckZlYXR1cmU7XG4gICAgICBzdGF0ZVNsaWNlID0gc3luY0ZvckZlYXR1cmUgPyBzdGF0ZSA6IHN0YXRlPy5bbmFtZV07XG5cbiAgICAgIGlmICh0eXBlb2Ygc3RhdGVTbGljZSAhPT0gJ3VuZGVmaW5lZCcgJiYga2V5W25hbWVdKSB7XG4gICAgICAgIC8vIHVzZSBzZXJpYWxpemUgZnVuY3Rpb24gaWYgc3BlY2lmaWVkLlxuICAgICAgICBpZiAoKGtleVtuYW1lXSBhcyBhbnkpLnNlcmlhbGl6ZSkge1xuICAgICAgICAgIHN0YXRlU2xpY2UgPSAoa2V5W25hbWVdIGFzIFN5bmNTdG9yYWdlU3luY09wdGlvbnMpLnNlcmlhbGl6ZSEoc3RhdGVTbGljZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgc2VyaWFsaXplIGZ1bmN0aW9uIGlzIG5vdCBzcGVjaWZpZWQgZmlsdGVyIG9uIGZpZWxkcyBpZiBhbiBhcnJheSBoYXMgYmVlbiBwcm92aWRlZC5cbiAgICAgICAgICBsZXQgZmlsdGVyOiBTdG9yYWdlS2V5Q29uZmlndXJhdGlvbltdIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICgoa2V5W25hbWVdIGFzIGFueSkucmVkdWNlKSB7XG4gICAgICAgICAgICBmaWx0ZXIgPSBrZXlbbmFtZV0gYXMgU3RvcmFnZUtleUNvbmZpZ3VyYXRpb25bXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChrZXlbbmFtZV0gYXMgYW55KS5maWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlciA9IChrZXlbbmFtZV0gYXMgYW55KS5maWx0ZXIgYXMgU3RvcmFnZUtleUNvbmZpZ3VyYXRpb25bXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgc3RhdGVTbGljZSA9IGNyZWF0ZVN0YXRlU2xpY2Uoc3RhdGVTbGljZSwgZmlsdGVyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBlbmNyeXB0IGFuZCBkZWNyeXB0IGFyZSBwcmVzZW50LCBhbHNvIGNoZWNrZWQgYXQgdGhpcyNyZWh5ZHJhdGVBcHBsaWNhdGlvblN0YXRlKClcbiAgICAgICAgICBpZiAoKGtleVtuYW1lXSBhcyBhbnkpLmVuY3J5cHQgJiYgKGtleVtuYW1lXSBhcyBhbnkpLmRlY3J5cHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGtleVtuYW1lXSBhcyBhbnkpLmVuY3J5cHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgZW5jcnlwdCA9IChrZXlbbmFtZV0gYXMgYW55KS5lbmNyeXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoKGtleVtuYW1lXSBhcyBhbnkpLmVuY3J5cHQgfHwgKGtleVtuYW1lXSBhcyBhbnkpLmRlY3J5cHQpIHtcbiAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aG9zZSBpcyBub3QgcHJlc2VudCwgdGhlbiBsZXQga25vdyB0aGF0IG9uZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIGBFaXRoZXIgZW5jcnlwdCBvciBkZWNyeXB0IGZ1bmN0aW9uIGlzIG5vdCBwcmVzZW50IG9uICcke2tleVtuYW1lXSBhcyBzdHJpbmd9JyBrZXkgb2JqZWN0LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICBSZXBsYWNlciBhbmQgc3BhY2UgYXJndW1lbnRzIHRvIHBhc3MgdG8gSlNPTi5zdHJpbmdpZnkuXG4gICAgICAgICAgSWYgdGhlc2UgZmllbGRzIGRvbid0IGV4aXN0LCB1bmRlZmluZWQgd2lsbCBiZSBwYXNzZWQuXG4gICAgICAgICovXG4gICAgICAgIHJlcGxhY2VyID0gKGtleVtuYW1lXSBhcyBhbnkpLnJlcGxhY2VyO1xuICAgICAgICBzcGFjZSA9IChrZXlbbmFtZV0gYXMgYW55KS5zcGFjZTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gbmFtZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzdGF0ZVNsaWNlID0gc3luY0ZvckZlYXR1cmUgPyBzdGF0ZSA6IHN0YXRlPy5ba2V5XTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHN0YXRlU2xpY2UgIT09ICd1bmRlZmluZWQnICYmIHN0b3JhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGVuY3J5cHQpIHtcbiAgICAgICAgICAvLyBlbnN1cmUgdGhhdCBhIHN0cmluZyBtZXNzYWdlIGlzIHBhc3NlZFxuICAgICAgICAgIHN0YXRlU2xpY2UgPSBlbmNyeXB0KFxuICAgICAgICAgICAgdHlwZW9mIHN0YXRlU2xpY2UgPT09ICdzdHJpbmcnID8gc3RhdGVTbGljZSA6IEpTT04uc3RyaW5naWZ5KHN0YXRlU2xpY2UsIHJlcGxhY2VyLCBzcGFjZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICBzdG9yYWdlS2V5U2VyaWFsaXplcihrZXkgYXMgc3RyaW5nKSxcbiAgICAgICAgICB0eXBlb2Ygc3RhdGVTbGljZSA9PT0gJ3N0cmluZycgPyBzdGF0ZVNsaWNlIDogSlNPTi5zdHJpbmdpZnkoc3RhdGVTbGljZSwgcmVwbGFjZXIsIHNwYWNlKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBzYXZlIHN0YXRlIHRvIGxvY2FsU3RvcmFnZTonLCBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdGF0ZVNsaWNlID09PSAndW5kZWZpbmVkJyAmJiByZW1vdmVPblVuZGVmaW5lZCAmJiBzdG9yYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5U2VyaWFsaXplcihrZXkgYXMgc3RyaW5nKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRXhjZXB0aW9uIG9uIHJlbW92aW5nL2NsZWFuaW5nIHVuZGVmaW5lZCAnJHtrZXkgYXMgc3RyaW5nfScgc3RhdGVgLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgZGVmYXVsdE1lcmdlUmVkdWNlciA9IChzdGF0ZTogYW55LCByZWh5ZHJhdGVkU3RhdGU6IGFueSwgYWN0aW9uOiBhbnkpID0+IHtcbiAgaWYgKChhY3Rpb24udHlwZSA9PT0gSU5JVCB8fCBhY3Rpb24udHlwZSA9PT0gVVBEQVRFKSAmJiByZWh5ZHJhdGVkU3RhdGUpIHtcbiAgICBjb25zdCBhbGxLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhzdGF0ZSksIC4uLk9iamVjdC5rZXlzKHJlaHlkcmF0ZWRTdGF0ZSldKSk7XG4gICAgc3RhdGUgPSBPYmplY3QuZnJvbUVudHJpZXMoYWxsS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgLy8gTm8gbmVlZCB0byBjcmVhdGUgbmV3IG9iamVjdCByZWZlcmVuY2UgaWYgbm8gbWVyZ2UgaXMgYWN0dWFsbHkgbmVlZGVkXG4gICAgICBpZiAoIXJlaHlkcmF0ZWRTdGF0ZVtrZXldKSB7XG4gICAgICAgIHJldHVybiBba2V5LCBzdGF0ZVtrZXldXTtcbiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIFtrZXksIHJlaHlkcmF0ZWRTdGF0ZVtrZXldXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBba2V5LCBkZWVwRmlsbChzdGF0ZVtrZXldLCByZWh5ZHJhdGVkU3RhdGVba2V5XSldO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogTG9jYWwgYW5kIFNlc3Npb24gc3RvcmFnZSBzeW5jaHJvbml6YXRpb24gaGVscGVyXG4gKiBAcGFyYW0gY29uZmlnXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jU3RvcmFnZSA9IChjb25maWc6IFN5bmNTdG9yYWdlQ29uZmlnKSA9PiAocmVkdWNlcjogYW55KSA9PiB7XG4gIGlmIChcbiAgICAoY29uZmlnLnN0b3JhZ2UgPT09IHVuZGVmaW5lZCAmJiAhY29uZmlnLmNoZWNrU3RvcmFnZUF2YWlsYWJpbGl0eSkgfHxcbiAgICAoY29uZmlnLmNoZWNrU3RvcmFnZUF2YWlsYWJpbGl0eSAmJiBjaGVja0lzQnJvd3NlckVudigpKVxuICApIHtcbiAgICBjb25maWcuc3RvcmFnZSA9IGxvY2FsU3RvcmFnZSB8fCB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5zdG9yYWdlS2V5U2VyaWFsaXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLnN0b3JhZ2VLZXlTZXJpYWxpemVyID0gKGtleSkgPT4ga2V5O1xuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXN0b3JlRGF0ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmZpZy5yZXN0b3JlRGF0ZXMgPSB0cnVlO1xuICB9XG5cbiAgLy8gVXNlIGRlZmF1bHQgbWVyZ2UgcmVkdWNlci5cbiAgbGV0IG1lcmdlUmVkdWNlciA9IGNvbmZpZy5tZXJnZVJlZHVjZXI7XG5cbiAgaWYgKG1lcmdlUmVkdWNlciA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXJnZVJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICBtZXJnZVJlZHVjZXIgPSBkZWZhdWx0TWVyZ2VSZWR1Y2VyO1xuICB9XG5cbiAgY29uc3QgbG9nZ2VyID0gY29uZmlnLmxvZ2dlciB8fCBjb25zb2xlO1xuXG4gIGNvbnN0IHN0YXRlS2V5cyA9IHZhbGlkYXRlU3RhdGVLZXlzKGNvbmZpZy5rZXlzKTtcbiAgY29uc3QgcmVoeWRyYXRlZFN0YXRlID0gY29uZmlnLnJlaHlkcmF0ZVxuICAgID8gcmVoeWRyYXRlQXBwbGljYXRpb25TdGF0ZShzdGF0ZUtleXMsIGNvbmZpZy5zdG9yYWdlLCBjb25maWcuc3RvcmFnZUtleVNlcmlhbGl6ZXIsIGNvbmZpZy5yZXN0b3JlRGF0ZXMsIGxvZ2dlcilcbiAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gKHN0YXRlOiBhbnksIGFjdGlvbjogYW55KSA9PiB7XG4gICAgbGV0IG5leHRTdGF0ZTogYW55O1xuXG4gICAgLy8gSWYgc3RhdGUgYXJyaXZlcyB1bmRlZmluZWQsIHdlIG5lZWQgdG8gbGV0IGl0IHRocm91Z2ggdGhlIHN1cHBsaWVkIHJlZHVjZXJcbiAgICAvLyBpbiBvcmRlciB0byBnZXQgYSBjb21wbGV0ZSBzdGF0ZSBhcyBkZWZpbmVkIGJ5IHVzZXJcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IElOSVQgJiYgIXN0YXRlKSB7XG4gICAgICBuZXh0U3RhdGUgPSByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0U3RhdGUgPSB7IC4uLnN0YXRlIH07XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgdGhlIHN0b3JlIHN0YXRlIHdpdGggdGhlIHJlaHlkcmF0ZWQgc3RhdGUgdXNpbmdcbiAgICAvLyBlaXRoZXIgYSB1c2VyLWRlZmluZWQgcmVkdWNlciBvciB0aGUgZGVmYXVsdC5cbiAgICBuZXh0U3RhdGUgPSBtZXJnZVJlZHVjZXIhKG5leHRTdGF0ZSwgcmVoeWRyYXRlZFN0YXRlLCBhY3Rpb24pO1xuXG4gICAgbmV4dFN0YXRlID0gcmVkdWNlcihuZXh0U3RhdGUsIGFjdGlvbik7XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgIT09IElOSVQpIHtcbiAgICAgIHN5bmNTdGF0ZVVwZGF0ZShcbiAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICAodHlwZW9mIGNvbmZpZy5zeW5jS2V5Q29uZGl0aW9uID09PSAnZnVuY3Rpb24nKSA/IHN0YXRlS2V5cy5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBrZXlOYW1lID0gdHlwZW9mIGtleSA9PT0gJ29iamVjdCcgPyBPYmplY3Qua2V5cyhrZXkpWzBdIDoga2V5O1xuICAgICAgICAgIHJldHVybiBjb25maWcuc3luY0tleUNvbmRpdGlvbiEoa2V5TmFtZSwgbmV4dFN0YXRlKTtcbiAgICAgICAgfSkgOiBzdGF0ZUtleXMsXG4gICAgICAgIGNvbmZpZy5zdG9yYWdlLFxuICAgICAgICBjb25maWcuc3RvcmFnZUtleVNlcmlhbGl6ZXIgYXMgKGtleTogc3RyaW5nIHwgbnVtYmVyKSA9PiBzdHJpbmcsXG4gICAgICAgIGNvbmZpZy5yZW1vdmVPblVuZGVmaW5lZCxcbiAgICAgICAgY29uZmlnLnN5bmNDb25kaXRpb24sXG4gICAgICAgIGxvZ2dlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5wb3N0UHJvY2Vzcykge1xuICAgICAgY29uZmlnLnBvc3RQcm9jZXNzKG5leHRTdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0U3RhdGU7XG4gIH07XG59O1xuIl19
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { props, createAction, INIT, UPDATE } from '@ngrx/store';
|
|
2
2
|
import { deepFill } from '@o3r/core';
|
|
3
|
+
import { utils } from '@ama-sdk/core';
|
|
3
4
|
import equal from 'fast-deep-equal';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Defines if an object is a Serializer
|
|
7
|
-
*
|
|
8
8
|
* @param obj Object to test
|
|
9
9
|
* @returns True if the object is a Serializer
|
|
10
10
|
*/
|
|
@@ -19,15 +19,34 @@ const REHYDRATE_ACTION_LABEL = '[storeSync] rehydrate';
|
|
|
19
19
|
const rehydrateAction = createAction(REHYDRATE_ACTION_LABEL, props());
|
|
20
20
|
/**
|
|
21
21
|
* Defines if the storage is a non-async storage
|
|
22
|
-
*
|
|
23
22
|
* @param options The storage config
|
|
24
23
|
* @returns in case the storage used is a non-async storage
|
|
25
24
|
*/
|
|
26
25
|
const isLocalStorageConfig = (options) => !options.storage || options.storage instanceof Storage;
|
|
27
26
|
|
|
27
|
+
const mapper = [
|
|
28
|
+
{
|
|
29
|
+
condition: (data) => data instanceof utils.DateTime,
|
|
30
|
+
construct: (data) => new utils.DateTime(data)
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
condition: (data) => data instanceof utils.Date,
|
|
34
|
+
construct: (data) => new utils.Date(data)
|
|
35
|
+
}
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Deep fill of base object using source
|
|
39
|
+
* It will do a deep merge of the objects, overriding arrays
|
|
40
|
+
* All properties not present in source, but present in base, will remain
|
|
41
|
+
* @param base
|
|
42
|
+
* @param source
|
|
43
|
+
*/
|
|
44
|
+
function deepFillWithDate(base, source) {
|
|
45
|
+
return deepFill(base, source, mapper);
|
|
46
|
+
}
|
|
47
|
+
|
|
28
48
|
/**
|
|
29
49
|
* Reviver the date from a JSON field if the string is matching iso format. Return the same value otherwise
|
|
30
|
-
*
|
|
31
50
|
* @param _key JSON item key name
|
|
32
51
|
* @param value JSON item value
|
|
33
52
|
*/
|
|
@@ -39,7 +58,6 @@ const dateReviver = (_key, value) => {
|
|
|
39
58
|
};
|
|
40
59
|
/**
|
|
41
60
|
* Dummy reviver returning the value of the field as it is
|
|
42
|
-
*
|
|
43
61
|
* @param _key JSON item key name
|
|
44
62
|
* @param value JSON item value
|
|
45
63
|
*/
|
|
@@ -52,7 +70,6 @@ const checkIsBrowserEnv = () => {
|
|
|
52
70
|
};
|
|
53
71
|
/**
|
|
54
72
|
* Validate the keys structure of the registered stores
|
|
55
|
-
*
|
|
56
73
|
* @param keys map of store to synchronize
|
|
57
74
|
*/
|
|
58
75
|
const validateStateKeys = (keys) => {
|
|
@@ -69,7 +86,6 @@ const validateStateKeys = (keys) => {
|
|
|
69
86
|
};
|
|
70
87
|
/**
|
|
71
88
|
* Rehydrate the state of the whole application store
|
|
72
|
-
*
|
|
73
89
|
* @param keys Keys of the store to rehydrate
|
|
74
90
|
* @param storage storage when getting the data from
|
|
75
91
|
* @param storageKeySerializer storage key transform function
|
|
@@ -159,7 +175,6 @@ function createStateSlice(existingSlice, filter) {
|
|
|
159
175
|
/**
|
|
160
176
|
* Update the state of the store after reviving from storage
|
|
161
177
|
* Note: this function is mainly use for internal process of store synchronization
|
|
162
|
-
*
|
|
163
178
|
* @param state store state
|
|
164
179
|
* @param keys key of the store
|
|
165
180
|
* @param storage storage to use for the synchronization
|
|
@@ -257,13 +272,24 @@ const syncStateUpdate = (state, keys, storage, storageKeySerializer, removeOnUnd
|
|
|
257
272
|
};
|
|
258
273
|
const defaultMergeReducer = (state, rehydratedState, action) => {
|
|
259
274
|
if ((action.type === INIT || action.type === UPDATE) && rehydratedState) {
|
|
260
|
-
|
|
275
|
+
const allKeys = Array.from(new Set([...Object.keys(state), ...Object.keys(rehydratedState)]));
|
|
276
|
+
state = Object.fromEntries(allKeys.map((key) => {
|
|
277
|
+
// No need to create new object reference if no merge is actually needed
|
|
278
|
+
if (!rehydratedState[key]) {
|
|
279
|
+
return [key, state[key]];
|
|
280
|
+
}
|
|
281
|
+
else if (!state[key]) {
|
|
282
|
+
return [key, rehydratedState[key]];
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
return [key, deepFill(state[key], rehydratedState[key])];
|
|
286
|
+
}
|
|
287
|
+
}));
|
|
261
288
|
}
|
|
262
289
|
return state;
|
|
263
290
|
};
|
|
264
291
|
/**
|
|
265
292
|
* Local and Session storage synchronization helper
|
|
266
|
-
*
|
|
267
293
|
* @param config
|
|
268
294
|
*/
|
|
269
295
|
const syncStorage = (config) => (reducer) => {
|
|
@@ -339,7 +365,6 @@ class StorageSync {
|
|
|
339
365
|
* Handle state manipulation in case of store storage sync
|
|
340
366
|
* 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
|
|
341
367
|
* Pass it as mergeReducer callback when calling localStorageSync function from 'ngrx-store-localstorage', in the app
|
|
342
|
-
*
|
|
343
368
|
* @param state actual state
|
|
344
369
|
* @param rehydratedState state from storage
|
|
345
370
|
* @param action Triggered action
|
|
@@ -347,12 +372,12 @@ class StorageSync {
|
|
|
347
372
|
this.mergeReducer = (state, rehydratedState, action) => {
|
|
348
373
|
if (rehydratedState) {
|
|
349
374
|
if (action.type === INIT) {
|
|
350
|
-
state =
|
|
375
|
+
state = deepFillWithDate(state, rehydratedState);
|
|
351
376
|
}
|
|
352
377
|
if (action.type === UPDATE && Array.isArray(action.features)) {
|
|
353
378
|
const notHandledFeatures = action.features.filter((featName) => !this.alreadyHydratedStoreSlices.has(featName));
|
|
354
379
|
notHandledFeatures.filter((featName) => !!rehydratedState[featName]).forEach((fName) => {
|
|
355
|
-
state[fName] = state[fName] ?
|
|
380
|
+
state[fName] = state[fName] ? deepFillWithDate(state[fName], rehydratedState[fName]) : rehydratedState[fName];
|
|
356
381
|
this.alreadyHydratedStoreSlices.add(fName);
|
|
357
382
|
});
|
|
358
383
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"o3r-store-sync.mjs","sources":["../../src/core/storage-sync.helpers.ts","../../src/sync-storage/storage-sync.ts","../../src/sync-storage/index.ts","../../src/core/storage-sync.ts","../../src/o3r-store-sync.ts"],"sourcesContent":["import type { Serializer } from '@o3r/core';\nimport { createAction, props } from '@ngrx/store';\nimport type { StorageSyncOptions } from './interfaces';\nimport type { SyncStorageConfig } from '../sync-storage';\n\n/**\n * Defines if an object is a Serializer\n *\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 *\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 { INIT, UPDATE } from '@ngrx/store';\nimport { deepFill } from '@o3r/core';\nimport type { Logger } from '@o3r/core';\nimport type { StorageKeyConfiguration, StorageKeys, SyncStorageConfig, SyncStorageSyncOptions } 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 *\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 *\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 *\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 *\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 ? rehydratedState : 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 *\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 console.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 console.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 state = deepFill(state, rehydratedState);\n }\n\n return state;\n};\n\n/**\n * Local and Session storage synchronization helper\n *\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 if (action.type === INIT && !state) {\n nextState = reducer(state, action);\n } else {\n nextState = { ...state };\n }\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') ? stateKeys.filter(key => {\n const keyName = typeof key === 'object' ? Object.keys(key)[0] : key;\n return config.syncKeyCondition!(keyName, nextState);\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 {INIT, UPDATE} from '@ngrx/store';\nimport {deepFill} from '@o3r/core';\nimport equal from 'fast-deep-equal';\nimport type {StorageSyncOptions} from './interfaces';\nimport {isLocalStorageConfig, isSerializer, rehydrateAction} from './storage-sync.helpers';\nimport {syncStorage} from '../sync-storage';\nimport {StorageSyncConstructorOptions} from './interfaces';\n\n/**\n * Storage synchronizer\n */\nexport class StorageSync {\n private alreadyHydratedStoreSlices: Set<string> = new Set();\n private hasHydrated = false;\n private 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 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' ? this.mergeReducer : options.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 *\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 = deepFill(state, rehydratedState);\n }\n if (action.type === UPDATE && Array.isArray(action.features)) {\n\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] ? deepFill(state[fName], rehydratedState[fName]) : rehydratedState[fName];\n this.alreadyHydratedStoreSlices.add(fName);\n });\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\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) {\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","sources":["../../src/core/storage-sync.helpers.ts","../../src/deep-fill/deep-fill.ts","../../src/sync-storage/storage-sync.ts","../../src/sync-storage/index.ts","../../src/core/storage-sync.ts","../../src/o3r-store-sync.ts"],"sourcesContent":["import type { Serializer } from '@o3r/core';\nimport { createAction, props } from '@ngrx/store';\nimport type { StorageSyncOptions } from './interfaces';\nimport type { SyncStorageConfig } from '../sync-storage';\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 { deepFill, type PrimitiveReviverMapper } from '@o3r/core';\nimport { utils } from '@ama-sdk/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 { INIT, UPDATE } from '@ngrx/store';\nimport { deepFill } from '@o3r/core';\nimport type { Logger } from '@o3r/core';\nimport type { StorageKeyConfiguration, StorageKeys, SyncStorageConfig, SyncStorageSyncOptions } 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 ? rehydratedState : 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 console.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 console.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, rehydratedState[key]];\n } else {\n return [key, deepFill(state[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 if (action.type === INIT && !state) {\n nextState = reducer(state, action);\n } else {\n nextState = { ...state };\n }\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') ? stateKeys.filter(key => {\n const keyName = typeof key === 'object' ? Object.keys(key)[0] : key;\n return config.syncKeyCondition!(keyName, nextState);\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 {INIT, UPDATE} from '@ngrx/store';\nimport { deepFillWithDate } from '../deep-fill/deep-fill';\nimport equal from 'fast-deep-equal';\nimport type {StorageSyncOptions} from './interfaces';\nimport {isLocalStorageConfig, isSerializer, rehydrateAction} from './storage-sync.helpers';\nimport {syncStorage} from '../sync-storage';\nimport {StorageSyncConstructorOptions} from './interfaces';\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 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' ? this.mergeReducer : options.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\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 }\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\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) {\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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@o3r/store-sync",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "11.0.0-next.0",
|
|
4
4
|
"description": "This module is exposing an NgRx store synchronization solution (synchronous and asynchronous) via the class StorageSync.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"store",
|
|
@@ -10,14 +10,14 @@
|
|
|
10
10
|
"otter-module"
|
|
11
11
|
],
|
|
12
12
|
"peerDependencies": {
|
|
13
|
-
"@
|
|
14
|
-
"@angular-devkit/
|
|
15
|
-
"@
|
|
16
|
-
"@ngrx/
|
|
17
|
-
"@
|
|
18
|
-
"@o3r/
|
|
19
|
-
"@o3r/logger": "^
|
|
20
|
-
"@o3r/schematics": "^
|
|
13
|
+
"@ama-sdk/core": "^11.0.0-next.0",
|
|
14
|
+
"@angular-devkit/core": "~17.0.0",
|
|
15
|
+
"@angular-devkit/schematics": "~17.0.0",
|
|
16
|
+
"@ngrx/entity": "~17.0.0",
|
|
17
|
+
"@ngrx/store": "~17.0.0",
|
|
18
|
+
"@o3r/core": "^11.0.0-next.0",
|
|
19
|
+
"@o3r/logger": "^11.0.0-next.0",
|
|
20
|
+
"@o3r/schematics": "^11.0.0-next.0",
|
|
21
21
|
"fast-deep-equal": "^3.1.3",
|
|
22
22
|
"rxjs": "^7.8.1"
|
|
23
23
|
},
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"schematics": "./collection.json",
|
|
39
39
|
"engines": {
|
|
40
|
-
"node": ">=
|
|
40
|
+
"node": ">=18.0.0"
|
|
41
41
|
},
|
|
42
42
|
"module": "fesm2022/o3r-store-sync.mjs",
|
|
43
43
|
"typings": "index.d.ts",
|
|
@@ -116,5 +116,6 @@
|
|
|
116
116
|
],
|
|
117
117
|
"bugs": "https://github.com/AmadeusITGroup/otter/issues",
|
|
118
118
|
"repository": "https://github.com/AmadeusITGroup/otter",
|
|
119
|
-
"license": "BSD-3-Clause"
|
|
119
|
+
"license": "BSD-3-Clause",
|
|
120
|
+
"homepage": "https://amadeusitgroup.github.io/otter/"
|
|
120
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../schematics/ng-add/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGtD
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../schematics/ng-add/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGtD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CA8B1D"}
|
|
@@ -5,17 +5,16 @@ const schematics_1 = require("@angular-devkit/schematics");
|
|
|
5
5
|
const path = require("node:path");
|
|
6
6
|
/**
|
|
7
7
|
* Add Otter store-sync to an Otter Project
|
|
8
|
-
*
|
|
9
8
|
* @param options
|
|
10
9
|
*/
|
|
11
10
|
function ngAdd(options) {
|
|
12
11
|
return async (tree, context) => {
|
|
13
12
|
try {
|
|
14
13
|
// use dynamic import to properly raise an exception if it is not an Otter project.
|
|
15
|
-
const { applyEsLintFix, install, ngAddPackages, getO3rPeerDeps,
|
|
14
|
+
const { applyEsLintFix, install, ngAddPackages, getO3rPeerDeps, getWorkspaceConfig } = await Promise.resolve().then(() => require('@o3r/schematics'));
|
|
16
15
|
// retrieve dependencies following the /^@o3r\/.*/ pattern within the peerDependencies of the current module
|
|
17
16
|
const depsInfo = getO3rPeerDeps(path.resolve(__dirname, '..', '..', 'package.json'));
|
|
18
|
-
const workingDirectory =
|
|
17
|
+
const workingDirectory = options?.projectName && getWorkspaceConfig(tree)?.projects[options.projectName]?.root || '.';
|
|
19
18
|
return (0, schematics_1.chain)([
|
|
20
19
|
// optional custom action dedicated to this module
|
|
21
20
|
options.skipLinter ? (0, schematics_1.noop)() : applyEsLintFix(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../schematics/ng-add/index.ts"],"names":[],"mappings":";;;AAAA,2DAA+D;AAE/D,kCAAkC;AAElC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../schematics/ng-add/index.ts"],"names":[],"mappings":";;;AAAA,2DAA+D;AAE/D,kCAAkC;AAElC;;;GAGG;AACH,SAAgB,KAAK,CAAC,OAA8B;IAClD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC7B,IAAI;YACF,mFAAmF;YACnF,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,2CAAa,iBAAiB,EAAC,CAAC;YACvH,4GAA4G;YAC5G,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;YACrF,MAAM,gBAAgB,GAAG,OAAO,EAAE,WAAW,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC;YACtH,OAAO,IAAA,kBAAK,EAAC;gBACX,kDAAkD;gBAClD,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAA,iBAAI,GAAE,CAAC,CAAC,CAAC,cAAc,EAAE;gBAC9C,gDAAgD;gBAChD,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAI,CAAC,CAAC,CAAC,OAAO;gBACpC,uDAAuD;gBACvD,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE;oBAClC,gBAAgB,EAAE,IAAI;oBACtB,OAAO,EAAE,QAAQ,CAAC,cAAc;oBAChC,iBAAiB,EAAE,GAAG,QAAQ,CAAC,WAAY,UAAU;oBACrD,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,gBAAgB;iBACjB,CAAC;aACH,CAAC,CAAC;SACJ;QAAC,OAAO,CAAC,EAAE;YACV,gIAAgI;YAChI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;oDAEyB,CAAC,CAAC;YAChD,MAAM,CAAC,CAAC,CAAC,CAAC;SACX;IACH,CAAC,CAAC;AACJ,CAAC;AA9BD,sBA8BC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "http://json-schema.org/schema",
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema",
|
|
3
3
|
"$id": "ngAddSchematicsSchema",
|
|
4
4
|
"title": "Add store-sync project",
|
|
5
5
|
"description": "'ng add store-sync' project",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"default": true
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
|
-
"additionalProperties":
|
|
25
|
+
"additionalProperties": true,
|
|
26
26
|
"required": [
|
|
27
27
|
]
|
|
28
28
|
}
|
|
@@ -2,14 +2,12 @@ import type { Logger } from '@o3r/core';
|
|
|
2
2
|
import type { StorageKeys, SyncStorageConfig } from './interfaces';
|
|
3
3
|
/**
|
|
4
4
|
* Reviver the date from a JSON field if the string is matching iso format. Return the same value otherwise
|
|
5
|
-
*
|
|
6
5
|
* @param _key JSON item key name
|
|
7
6
|
* @param value JSON item value
|
|
8
7
|
*/
|
|
9
8
|
export declare const dateReviver: (_key: string, value: any) => any;
|
|
10
9
|
/**
|
|
11
10
|
* Rehydrate the state of the whole application store
|
|
12
|
-
*
|
|
13
11
|
* @param keys Keys of the store to rehydrate
|
|
14
12
|
* @param storage storage when getting the data from
|
|
15
13
|
* @param storageKeySerializer storage key transform function
|
|
@@ -20,7 +18,6 @@ export declare const rehydrateApplicationState: (keys: StorageKeys, storage: Sto
|
|
|
20
18
|
/**
|
|
21
19
|
* Update the state of the store after reviving from storage
|
|
22
20
|
* Note: this function is mainly use for internal process of store synchronization
|
|
23
|
-
*
|
|
24
21
|
* @param state store state
|
|
25
22
|
* @param keys key of the store
|
|
26
23
|
* @param storage storage to use for the synchronization
|
|
@@ -32,7 +29,6 @@ export declare const rehydrateApplicationState: (keys: StorageKeys, storage: Sto
|
|
|
32
29
|
export declare const syncStateUpdate: (state: any, keys: StorageKeys, storage: Storage | undefined, storageKeySerializer: (key: string | number) => string, removeOnUndefined?: boolean, syncCondition?: ((state: any) => any) | undefined, logger?: Logger) => void;
|
|
33
30
|
/**
|
|
34
31
|
* Local and Session storage synchronization helper
|
|
35
|
-
*
|
|
36
32
|
* @param config
|
|
37
33
|
*/
|
|
38
34
|
export declare const syncStorage: (config: SyncStorageConfig) => (reducer: any) => (state: any, action: any) => any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-sync.d.ts","sourceRoot":"","sources":["../../src/sync-storage/storage-sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAA2B,WAAW,EAAE,iBAAiB,EAA0B,MAAM,cAAc,CAAC;AAEpH
|
|
1
|
+
{"version":3,"file":"storage-sync.d.ts","sourceRoot":"","sources":["../../src/sync-storage/storage-sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAA2B,WAAW,EAAE,iBAAiB,EAA0B,MAAM,cAAc,CAAC;AAEpH;;;;GAIG;AACH,eAAO,MAAM,WAAW,SAAU,MAAM,SAAS,GAAG,QAKnD,CAAC;AAqCF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,+BAE3B,OAAO,GAAG,SAAS,8BACA,MAAM,KAAK,MAAM,gBAC/B,OAAO,WACb,MAAM,QA+Df,CAAC;AA0BF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,UACnB,GAAG,8BAED,OAAO,GAAG,SAAS,8BACA,MAAM,GAAG,MAAM,KAAK,MAAM,wDAE9B,GAAG,KAAK,GAAG,wBAC3B,MAAM,SA6Ff,CAAC;AAoBF;;;GAGG;AACH,eAAO,MAAM,WAAW,WAAY,iBAAiB,eAAe,GAAG,aA8BtD,GAAG,UAAU,GAAG,QAoChC,CAAC"}
|
package/schematics/package.json
DELETED