@ngrx/data 15.3.0 → 16.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/esm2022/src/actions/entity-action-factory.mjs +51 -0
  2. package/esm2022/src/actions/entity-action-guard.mjs +130 -0
  3. package/esm2022/src/dataservices/default-data.service.mjs +210 -0
  4. package/esm2022/src/dataservices/entity-cache-data.service.mjs +147 -0
  5. package/esm2022/src/dataservices/entity-data.service.mjs +64 -0
  6. package/esm2022/src/dataservices/http-url-generator.mjs +88 -0
  7. package/esm2022/src/dataservices/persistence-result-handler.service.mjs +50 -0
  8. package/esm2022/src/dispatchers/entity-cache-dispatcher.mjs +164 -0
  9. package/esm2022/src/dispatchers/entity-dispatcher-default-options.mjs +31 -0
  10. package/esm2022/src/dispatchers/entity-dispatcher-factory.mjs +68 -0
  11. package/esm2022/src/effects/entity-cache-effects.mjs +116 -0
  12. package/esm2022/src/effects/entity-effects.mjs +149 -0
  13. package/esm2022/src/entity-data-without-effects.module.mjs +28 -0
  14. package/esm2022/src/entity-data.module.mjs +29 -0
  15. package/esm2022/src/entity-metadata/entity-definition.service.mjs +94 -0
  16. package/esm2022/src/entity-services/entity-collection-service-elements-factory.mjs +39 -0
  17. package/esm2022/src/entity-services/entity-collection-service-factory.mjs +29 -0
  18. package/esm2022/src/entity-services/entity-services-base.mjs +120 -0
  19. package/esm2022/src/entity-services/entity-services-elements.mjs +34 -0
  20. package/esm2022/src/reducers/entity-cache-reducer.mjs +272 -0
  21. package/esm2022/src/reducers/entity-collection-creator.mjs +38 -0
  22. package/{esm2020 → esm2022}/src/reducers/entity-collection-reducer-methods.mjs +6 -5
  23. package/esm2022/src/reducers/entity-collection-reducer-registry.mjs +69 -0
  24. package/esm2022/src/reducers/entity-collection-reducer.mjs +25 -0
  25. package/esm2022/src/selectors/entity-selectors$.mjs +53 -0
  26. package/esm2022/src/selectors/entity-selectors.mjs +97 -0
  27. package/esm2022/src/utils/correlation-id-generator.mjs +31 -0
  28. package/esm2022/src/utils/default-logger.mjs +26 -0
  29. package/esm2022/src/utils/default-pluralizer.mjs +72 -0
  30. package/{fesm2020 → fesm2022}/ngrx-data.mjs +113 -110
  31. package/fesm2022/ngrx-data.mjs.map +1 -0
  32. package/package.json +10 -16
  33. package/schematics/ng-add/index.js +6 -6
  34. package/schematics/ng-add/index.js.map +1 -1
  35. package/schematics/ng-add/schema.js +1 -1
  36. package/schematics-core/index.js +50 -61
  37. package/schematics-core/index.js.map +1 -1
  38. package/schematics-core/utility/ast-utils.js +3 -3
  39. package/schematics-core/utility/change.js +2 -2
  40. package/schematics-core/utility/config.js +1 -1
  41. package/schematics-core/utility/find-component.js +2 -2
  42. package/schematics-core/utility/find-module.js +2 -2
  43. package/schematics-core/utility/json-utilts.js +2 -2
  44. package/schematics-core/utility/libs-version.js +2 -2
  45. package/schematics-core/utility/libs-version.js.map +1 -1
  46. package/schematics-core/utility/ngrx-utils.js +3 -3
  47. package/schematics-core/utility/package.js +1 -1
  48. package/schematics-core/utility/parse-name.js +2 -2
  49. package/schematics-core/utility/project.js +1 -1
  50. package/schematics-core/utility/strings.js +1 -1
  51. package/schematics-core/utility/update.js +1 -1
  52. package/schematics-core/utility/visitors.js +7 -7
  53. package/src/actions/entity-cache-change-set.d.ts +1 -1
  54. package/src/dataservices/interfaces.d.ts +2 -2
  55. package/src/entity-metadata/entity-filters.d.ts +1 -1
  56. package/src/reducers/entity-collection-reducer.d.ts +1 -1
  57. package/src/reducers/entity-collection.d.ts +1 -1
  58. package/src/selectors/entity-cache-selector.d.ts +1 -1
  59. package/esm2020/src/actions/entity-action-factory.mjs +0 -50
  60. package/esm2020/src/actions/entity-action-guard.mjs +0 -130
  61. package/esm2020/src/dataservices/default-data.service.mjs +0 -206
  62. package/esm2020/src/dataservices/entity-cache-data.service.mjs +0 -146
  63. package/esm2020/src/dataservices/entity-data.service.mjs +0 -63
  64. package/esm2020/src/dataservices/http-url-generator.mjs +0 -87
  65. package/esm2020/src/dataservices/persistence-result-handler.service.mjs +0 -49
  66. package/esm2020/src/dispatchers/entity-cache-dispatcher.mjs +0 -163
  67. package/esm2020/src/dispatchers/entity-dispatcher-default-options.mjs +0 -30
  68. package/esm2020/src/dispatchers/entity-dispatcher-factory.mjs +0 -67
  69. package/esm2020/src/effects/entity-cache-effects.mjs +0 -115
  70. package/esm2020/src/effects/entity-effects.mjs +0 -148
  71. package/esm2020/src/entity-data-without-effects.module.mjs +0 -27
  72. package/esm2020/src/entity-data.module.mjs +0 -28
  73. package/esm2020/src/entity-metadata/entity-definition.service.mjs +0 -93
  74. package/esm2020/src/entity-services/entity-collection-service-elements-factory.mjs +0 -38
  75. package/esm2020/src/entity-services/entity-collection-service-factory.mjs +0 -28
  76. package/esm2020/src/entity-services/entity-services-base.mjs +0 -119
  77. package/esm2020/src/entity-services/entity-services-elements.mjs +0 -33
  78. package/esm2020/src/reducers/entity-cache-reducer.mjs +0 -271
  79. package/esm2020/src/reducers/entity-collection-creator.mjs +0 -37
  80. package/esm2020/src/reducers/entity-collection-reducer-registry.mjs +0 -68
  81. package/esm2020/src/reducers/entity-collection-reducer.mjs +0 -24
  82. package/esm2020/src/selectors/entity-selectors$.mjs +0 -52
  83. package/esm2020/src/selectors/entity-selectors.mjs +0 -96
  84. package/esm2020/src/utils/correlation-id-generator.mjs +0 -30
  85. package/esm2020/src/utils/default-logger.mjs +0 -25
  86. package/esm2020/src/utils/default-pluralizer.mjs +0 -71
  87. package/fesm2015/ngrx-data.mjs +0 -4957
  88. package/fesm2015/ngrx-data.mjs.map +0 -1
  89. package/fesm2020/ngrx-data.mjs.map +0 -1
  90. /package/{esm2020 → esm2022}/index.mjs +0 -0
  91. /package/{esm2020 → esm2022}/ngrx-data.mjs +0 -0
  92. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
  93. /package/{esm2020 → esm2022}/src/actions/entity-action-operators.mjs +0 -0
  94. /package/{esm2020 → esm2022}/src/actions/entity-action.mjs +0 -0
  95. /package/{esm2020 → esm2022}/src/actions/entity-cache-action.mjs +0 -0
  96. /package/{esm2020 → esm2022}/src/actions/entity-cache-change-set.mjs +0 -0
  97. /package/{esm2020 → esm2022}/src/actions/entity-op.mjs +0 -0
  98. /package/{esm2020 → esm2022}/src/actions/merge-strategy.mjs +0 -0
  99. /package/{esm2020 → esm2022}/src/actions/update-response-data.mjs +0 -0
  100. /package/{esm2020 → esm2022}/src/dataservices/data-service-error.mjs +0 -0
  101. /package/{esm2020 → esm2022}/src/dataservices/default-data-service-config.mjs +0 -0
  102. /package/{esm2020 → esm2022}/src/dataservices/interfaces.mjs +0 -0
  103. /package/{esm2020 → esm2022}/src/dispatchers/entity-commands.mjs +0 -0
  104. /package/{esm2020 → esm2022}/src/dispatchers/entity-dispatcher-base.mjs +0 -0
  105. /package/{esm2020 → esm2022}/src/dispatchers/entity-dispatcher.mjs +0 -0
  106. /package/{esm2020 → esm2022}/src/effects/entity-effects-scheduler.mjs +0 -0
  107. /package/{esm2020 → esm2022}/src/entity-data-config.mjs +0 -0
  108. /package/{esm2020 → esm2022}/src/entity-metadata/entity-definition.mjs +0 -0
  109. /package/{esm2020 → esm2022}/src/entity-metadata/entity-filters.mjs +0 -0
  110. /package/{esm2020 → esm2022}/src/entity-metadata/entity-metadata.mjs +0 -0
  111. /package/{esm2020 → esm2022}/src/entity-services/entity-collection-service-base.mjs +0 -0
  112. /package/{esm2020 → esm2022}/src/entity-services/entity-collection-service.mjs +0 -0
  113. /package/{esm2020 → esm2022}/src/entity-services/entity-services.mjs +0 -0
  114. /package/{esm2020 → esm2022}/src/index.mjs +0 -0
  115. /package/{esm2020 → esm2022}/src/provide-entity-data.mjs +0 -0
  116. /package/{esm2020 → esm2022}/src/reducers/constants.mjs +0 -0
  117. /package/{esm2020 → esm2022}/src/reducers/entity-cache.mjs +0 -0
  118. /package/{esm2020 → esm2022}/src/reducers/entity-change-tracker-base.mjs +0 -0
  119. /package/{esm2020 → esm2022}/src/reducers/entity-change-tracker.mjs +0 -0
  120. /package/{esm2020 → esm2022}/src/reducers/entity-collection.mjs +0 -0
  121. /package/{esm2020 → esm2022}/src/selectors/entity-cache-selector.mjs +0 -0
  122. /package/{esm2020 → esm2022}/src/utils/guid-fns.mjs +0 -0
  123. /package/{esm2020 → esm2022}/src/utils/interfaces.mjs +0 -0
  124. /package/{esm2020 → esm2022}/src/utils/utilities.mjs +0 -0
@@ -0,0 +1,51 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ class EntityActionFactory {
4
+ // polymorphic create for the two signatures
5
+ create(nameOrPayload, entityOp, data, options) {
6
+ const payload = typeof nameOrPayload === 'string'
7
+ ? {
8
+ ...(options || {}),
9
+ entityName: nameOrPayload,
10
+ entityOp,
11
+ data,
12
+ }
13
+ : nameOrPayload;
14
+ return this.createCore(payload);
15
+ }
16
+ /**
17
+ * Create an EntityAction to perform an operation (op) for a particular entity type
18
+ * (entityName) with optional data and other optional flags
19
+ * @param payload Defines the EntityAction and its options
20
+ */
21
+ createCore(payload) {
22
+ const { entityName, entityOp, tag } = payload;
23
+ if (!entityName) {
24
+ throw new Error('Missing entity name for new action');
25
+ }
26
+ if (entityOp == null) {
27
+ throw new Error('Missing EntityOp for new action');
28
+ }
29
+ const type = this.formatActionType(entityOp, tag || entityName);
30
+ return { type, payload };
31
+ }
32
+ /**
33
+ * Create an EntityAction from another EntityAction, replacing properties with those from newPayload;
34
+ * @param from Source action that is the base for the new action
35
+ * @param newProperties New EntityAction properties that replace the source action properties
36
+ */
37
+ createFromAction(from, newProperties) {
38
+ return this.create({ ...from.payload, ...newProperties });
39
+ }
40
+ formatActionType(op, tag) {
41
+ return `[${tag}] ${op}`;
42
+ // return `${op} [${tag}]`.toUpperCase(); // example of an alternative
43
+ }
44
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0-rc.2", ngImport: i0, type: EntityActionFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
45
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0-rc.2", ngImport: i0, type: EntityActionFactory }); }
46
+ }
47
+ export { EntityActionFactory };
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-rc.2", ngImport: i0, type: EntityActionFactory, decorators: [{
49
+ type: Injectable
50
+ }] });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWFjdGlvbi1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9kYXRhL3NyYy9hY3Rpb25zL2VudGl0eS1hY3Rpb24tZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVEzQyxNQUNhLG1CQUFtQjtJQXVCOUIsNENBQTRDO0lBQzVDLE1BQU0sQ0FDSixhQUE4QyxFQUM5QyxRQUFtQixFQUNuQixJQUFRLEVBQ1IsT0FBNkI7UUFFN0IsTUFBTSxPQUFPLEdBQ1gsT0FBTyxhQUFhLEtBQUssUUFBUTtZQUMvQixDQUFDLENBQUU7Z0JBQ0MsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLFVBQVUsRUFBRSxhQUFhO2dCQUN6QixRQUFRO2dCQUNSLElBQUk7YUFDc0I7WUFDOUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxVQUFVLENBQVUsT0FBK0I7UUFDM0QsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7UUFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUM7UUFDaEUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUNkLElBQWtCLEVBQ2xCLGFBQThDO1FBRTlDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQVUsRUFBRSxHQUFXO1FBQ3RDLE9BQU8sSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDeEIsc0VBQXNFO0lBQ3hFLENBQUM7c0lBMUVVLG1CQUFtQjswSUFBbkIsbUJBQW1COztTQUFuQixtQkFBbUI7Z0dBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRW50aXR5T3AgfSBmcm9tICcuL2VudGl0eS1vcCc7XG5pbXBvcnQge1xuICBFbnRpdHlBY3Rpb24sXG4gIEVudGl0eUFjdGlvbk9wdGlvbnMsXG4gIEVudGl0eUFjdGlvblBheWxvYWQsXG59IGZyb20gJy4vZW50aXR5LWFjdGlvbic7XG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRW50aXR5QWN0aW9uRmFjdG9yeSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gRW50aXR5QWN0aW9uIHRvIHBlcmZvcm0gYW4gb3BlcmF0aW9uIChvcCkgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgdHlwZVxuICAgKiAoZW50aXR5TmFtZSkgd2l0aCBvcHRpb25hbCBkYXRhIGFuZCBvdGhlciBvcHRpb25hbCBmbGFnc1xuICAgKiBAcGFyYW0gZW50aXR5TmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuICAgKiBAcGFyYW0gZW50aXR5T3AgT3BlcmF0aW9uIHRvIHBlcmZvcm0gKEVudGl0eU9wKVxuICAgKiBAcGFyYW0gW2RhdGFdIGRhdGEgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHBhcmFtIFtvcHRpb25zXSBhZGRpdGlvbmFsIG9wdGlvbnNcbiAgICovXG4gIGNyZWF0ZTxQID0gYW55PihcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgZW50aXR5T3A6IEVudGl0eU9wLFxuICAgIGRhdGE/OiBQLFxuICAgIG9wdGlvbnM/OiBFbnRpdHlBY3Rpb25PcHRpb25zXG4gICk6IEVudGl0eUFjdGlvbjxQPjtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEVudGl0eUFjdGlvbiB0byBwZXJmb3JtIGFuIG9wZXJhdGlvbiAob3ApIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHR5cGVcbiAgICogKGVudGl0eU5hbWUpIHdpdGggb3B0aW9uYWwgZGF0YSBhbmQgb3RoZXIgb3B0aW9uYWwgZmxhZ3NcbiAgICogQHBhcmFtIHBheWxvYWQgRGVmaW5lcyB0aGUgRW50aXR5QWN0aW9uIGFuZCBpdHMgb3B0aW9uc1xuICAgKi9cbiAgY3JlYXRlPFAgPSBhbnk+KHBheWxvYWQ6IEVudGl0eUFjdGlvblBheWxvYWQ8UD4pOiBFbnRpdHlBY3Rpb248UD47XG5cbiAgLy8gcG9seW1vcnBoaWMgY3JlYXRlIGZvciB0aGUgdHdvIHNpZ25hdHVyZXNcbiAgY3JlYXRlPFAgPSBhbnk+KFxuICAgIG5hbWVPclBheWxvYWQ6IEVudGl0eUFjdGlvblBheWxvYWQ8UD4gfCBzdHJpbmcsXG4gICAgZW50aXR5T3A/OiBFbnRpdHlPcCxcbiAgICBkYXRhPzogUCxcbiAgICBvcHRpb25zPzogRW50aXR5QWN0aW9uT3B0aW9uc1xuICApOiBFbnRpdHlBY3Rpb248UD4ge1xuICAgIGNvbnN0IHBheWxvYWQ6IEVudGl0eUFjdGlvblBheWxvYWQ8UD4gPVxuICAgICAgdHlwZW9mIG5hbWVPclBheWxvYWQgPT09ICdzdHJpbmcnXG4gICAgICAgID8gKHtcbiAgICAgICAgICAgIC4uLihvcHRpb25zIHx8IHt9KSxcbiAgICAgICAgICAgIGVudGl0eU5hbWU6IG5hbWVPclBheWxvYWQsXG4gICAgICAgICAgICBlbnRpdHlPcCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgfSBhcyBFbnRpdHlBY3Rpb25QYXlsb2FkPFA+KVxuICAgICAgICA6IG5hbWVPclBheWxvYWQ7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29yZShwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gRW50aXR5QWN0aW9uIHRvIHBlcmZvcm0gYW4gb3BlcmF0aW9uIChvcCkgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgdHlwZVxuICAgKiAoZW50aXR5TmFtZSkgd2l0aCBvcHRpb25hbCBkYXRhIGFuZCBvdGhlciBvcHRpb25hbCBmbGFnc1xuICAgKiBAcGFyYW0gcGF5bG9hZCBEZWZpbmVzIHRoZSBFbnRpdHlBY3Rpb24gYW5kIGl0cyBvcHRpb25zXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQ29yZTxQID0gYW55PihwYXlsb2FkOiBFbnRpdHlBY3Rpb25QYXlsb2FkPFA+KSB7XG4gICAgY29uc3QgeyBlbnRpdHlOYW1lLCBlbnRpdHlPcCwgdGFnIH0gPSBwYXlsb2FkO1xuICAgIGlmICghZW50aXR5TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGVudGl0eSBuYW1lIGZvciBuZXcgYWN0aW9uJyk7XG4gICAgfVxuICAgIGlmIChlbnRpdHlPcCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgRW50aXR5T3AgZm9yIG5ldyBhY3Rpb24nKTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZm9ybWF0QWN0aW9uVHlwZShlbnRpdHlPcCwgdGFnIHx8IGVudGl0eU5hbWUpO1xuICAgIHJldHVybiB7IHR5cGUsIHBheWxvYWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gRW50aXR5QWN0aW9uIGZyb20gYW5vdGhlciBFbnRpdHlBY3Rpb24sIHJlcGxhY2luZyBwcm9wZXJ0aWVzIHdpdGggdGhvc2UgZnJvbSBuZXdQYXlsb2FkO1xuICAgKiBAcGFyYW0gZnJvbSBTb3VyY2UgYWN0aW9uIHRoYXQgaXMgdGhlIGJhc2UgZm9yIHRoZSBuZXcgYWN0aW9uXG4gICAqIEBwYXJhbSBuZXdQcm9wZXJ0aWVzIE5ldyBFbnRpdHlBY3Rpb24gcHJvcGVydGllcyB0aGF0IHJlcGxhY2UgdGhlIHNvdXJjZSBhY3Rpb24gcHJvcGVydGllc1xuICAgKi9cbiAgY3JlYXRlRnJvbUFjdGlvbjxQID0gYW55PihcbiAgICBmcm9tOiBFbnRpdHlBY3Rpb24sXG4gICAgbmV3UHJvcGVydGllczogUGFydGlhbDxFbnRpdHlBY3Rpb25QYXlsb2FkPFA+PlxuICApOiBFbnRpdHlBY3Rpb248UD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZSh7IC4uLmZyb20ucGF5bG9hZCwgLi4ubmV3UHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIGZvcm1hdEFjdGlvblR5cGUob3A6IHN0cmluZywgdGFnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFske3RhZ31dICR7b3B9YDtcbiAgICAvLyByZXR1cm4gYCR7b3B9IFske3RhZ31dYC50b1VwcGVyQ2FzZSgpOyAvLyBleGFtcGxlIG9mIGFuIGFsdGVybmF0aXZlXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Guard methods that ensure EntityAction payload is as expected.
3
+ * Each method returns that payload if it passes the guard or
4
+ * throws an error.
5
+ */
6
+ export class EntityActionGuard {
7
+ constructor(entityName, selectId) {
8
+ this.entityName = entityName;
9
+ this.selectId = selectId;
10
+ }
11
+ /** Throw if the action payload is not an entity with a valid key */
12
+ mustBeEntity(action) {
13
+ const data = this.extractData(action);
14
+ if (!data) {
15
+ return this.throwError(action, `should have a single entity.`);
16
+ }
17
+ const id = this.selectId(data);
18
+ if (this.isNotKeyType(id)) {
19
+ this.throwError(action, `has a missing or invalid entity key (id)`);
20
+ }
21
+ return data;
22
+ }
23
+ /** Throw if the action payload is not an array of entities with valid keys */
24
+ mustBeEntities(action) {
25
+ const data = this.extractData(action);
26
+ if (!Array.isArray(data)) {
27
+ return this.throwError(action, `should be an array of entities`);
28
+ }
29
+ data.forEach((entity, i) => {
30
+ const id = this.selectId(entity);
31
+ if (this.isNotKeyType(id)) {
32
+ const msg = `, item ${i + 1}, does not have a valid entity key (id)`;
33
+ this.throwError(action, msg);
34
+ }
35
+ });
36
+ return data;
37
+ }
38
+ /** Throw if the action payload is not a single, valid key */
39
+ mustBeKey(action) {
40
+ const data = this.extractData(action);
41
+ if (data === undefined) {
42
+ throw new Error(`should be a single entity key`);
43
+ }
44
+ if (this.isNotKeyType(data)) {
45
+ throw new Error(`is not a valid key (id)`);
46
+ }
47
+ return data;
48
+ }
49
+ /** Throw if the action payload is not an array of valid keys */
50
+ mustBeKeys(action) {
51
+ const data = this.extractData(action);
52
+ if (!Array.isArray(data)) {
53
+ return this.throwError(action, `should be an array of entity keys (id)`);
54
+ }
55
+ data.forEach((id, i) => {
56
+ if (this.isNotKeyType(id)) {
57
+ const msg = `${this.entityName} ', item ${i + 1}, is not a valid entity key (id)`;
58
+ this.throwError(action, msg);
59
+ }
60
+ });
61
+ return data;
62
+ }
63
+ /** Throw if the action payload is not an update with a valid key (id) */
64
+ mustBeUpdate(action) {
65
+ const data = this.extractData(action);
66
+ if (!data) {
67
+ return this.throwError(action, `should be a single entity update`);
68
+ }
69
+ const { id, changes } = data;
70
+ const id2 = this.selectId(changes);
71
+ if (this.isNotKeyType(id) || this.isNotKeyType(id2)) {
72
+ this.throwError(action, `has a missing or invalid entity key (id)`);
73
+ }
74
+ return data;
75
+ }
76
+ /** Throw if the action payload is not an array of updates with valid keys (ids) */
77
+ mustBeUpdates(action) {
78
+ const data = this.extractData(action);
79
+ if (!Array.isArray(data)) {
80
+ return this.throwError(action, `should be an array of entity updates`);
81
+ }
82
+ data.forEach((item, i) => {
83
+ const { id, changes } = item;
84
+ const id2 = this.selectId(changes);
85
+ if (this.isNotKeyType(id) || this.isNotKeyType(id2)) {
86
+ this.throwError(action, `, item ${i + 1}, has a missing or invalid entity key (id)`);
87
+ }
88
+ });
89
+ return data;
90
+ }
91
+ /** Throw if the action payload is not an update response with a valid key (id) */
92
+ mustBeUpdateResponse(action) {
93
+ const data = this.extractData(action);
94
+ if (!data) {
95
+ return this.throwError(action, `should be a single entity update`);
96
+ }
97
+ const { id, changes } = data;
98
+ const id2 = this.selectId(changes);
99
+ if (this.isNotKeyType(id) || this.isNotKeyType(id2)) {
100
+ this.throwError(action, `has a missing or invalid entity key (id)`);
101
+ }
102
+ return data;
103
+ }
104
+ /** Throw if the action payload is not an array of update responses with valid keys (ids) */
105
+ mustBeUpdateResponses(action) {
106
+ const data = this.extractData(action);
107
+ if (!Array.isArray(data)) {
108
+ return this.throwError(action, `should be an array of entity updates`);
109
+ }
110
+ data.forEach((item, i) => {
111
+ const { id, changes } = item;
112
+ const id2 = this.selectId(changes);
113
+ if (this.isNotKeyType(id) || this.isNotKeyType(id2)) {
114
+ this.throwError(action, `, item ${i + 1}, has a missing or invalid entity key (id)`);
115
+ }
116
+ });
117
+ return data;
118
+ }
119
+ extractData(action) {
120
+ return action.payload && action.payload.data;
121
+ }
122
+ /** Return true if this key (id) is invalid */
123
+ isNotKeyType(id) {
124
+ return typeof id !== 'string' && typeof id !== 'number';
125
+ }
126
+ throwError(action, msg) {
127
+ throw new Error(`${this.entityName} EntityAction guard for "${action.type}": payload ${msg}`);
128
+ }
129
+ }
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWFjdGlvbi1ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvZGF0YS9zcmMvYWN0aW9ucy9lbnRpdHktYWN0aW9uLWd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLFlBQW9CLFVBQWtCLEVBQVUsUUFBdUI7UUFBbkQsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQWU7SUFBRyxDQUFDO0lBRTNFLG9FQUFvRTtJQUNwRSxZQUFZLENBQUMsTUFBdUI7UUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsMENBQTBDLENBQUMsQ0FBQztTQUNyRTtRQUNELE9BQU8sSUFBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsY0FBYyxDQUFDLE1BQXlCO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0s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RTtZQUN4QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLHNDQUFzQyxDQUFDLENBQUM7U0FDeEU7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBWSxDQUFDLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxVQUFVLENBQ2IsTUFBTSxFQUNOLFVBQVUsQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQzVELENBQUM7YUFDSDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sV0FBVyxDQUFJLE1BQXVCO1FBQzVDLE9BQU8sTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBRUQsOENBQThDO0lBQ3RDLFlBQVksQ0FBQyxFQUFPO1FBQzFCLE9BQU8sT0FBTyxFQUFFLEtBQUssUUFBUSxJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FBQztJQUMxRCxDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQW9CLEVBQUUsR0FBVztRQUNsRCxNQUFNLElBQUksS0FBSyxDQUNiLEdBQUcsSUFBSSxDQUFDLFVBQVUsNEJBQTRCLE1BQU0sQ0FBQyxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQzdFLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJZFNlbGVjdG9yLCBVcGRhdGUgfSBmcm9tICdAbmdyeC9lbnRpdHknO1xuXG5pbXBvcnQgeyBFbnRpdHlBY3Rpb24gfSBmcm9tICcuL2VudGl0eS1hY3Rpb24nO1xuaW1wb3J0IHsgVXBkYXRlUmVzcG9uc2VEYXRhIH0gZnJvbSAnLi4vYWN0aW9ucy91cGRhdGUtcmVzcG9uc2UtZGF0YSc7XG5cbi8qKlxuICogR3VhcmQgbWV0aG9kcyB0aGF0IGVuc3VyZSBFbnRpdHlBY3Rpb24gcGF5bG9hZCBpcyBhcyBleHBlY3RlZC5cbiAqIEVhY2ggbWV0aG9kIHJldHVybnMgdGhhdCBwYXlsb2FkIGlmIGl0IHBhc3NlcyB0aGUgZ3VhcmQgb3JcbiAqIHRocm93cyBhbiBlcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudGl0eUFjdGlvbkd1YXJkPFQ+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbnRpdHlOYW1lOiBzdHJpbmcsIHByaXZhdGUgc2VsZWN0SWQ6IElkU2VsZWN0b3I8VD4pIHt9XG5cbiAgLyoqIFRocm93IGlmIHRoZSBhY3Rpb24gcGF5bG9hZCBpcyBub3QgYW4gZW50aXR5IHdpdGggYSB2YWxpZCBrZXkgKi9cbiAgbXVzdEJlRW50aXR5KGFjdGlvbjogRW50aXR5QWN0aW9uPFQ+KTogVCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZXh0cmFjdERhdGEoYWN0aW9uKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLnRocm93RXJyb3IoYWN0aW9uLCBgc2hvdWxkIGhhdmUgYSBzaW5nbGUgZW50aXR5LmApO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IHRoaXMuc2VsZWN0SWQoZGF0YSk7XG4gICAgaWYgKHRoaXMuaXNOb3RLZXlUeXBlKGlkKSkge1xuICAgICAgdGhpcy50aHJvd0Vycm9yKGFjdGlvbiwgYGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBlbnRpdHkga2V5IChpZClgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgfVxuXG4gIC8qKiBUaHJvdyBpZiB0aGUgYWN0aW9uIHBheWxvYWQgaXMgbm90IGFuIGFycmF5IG9mIGVudGl0aWVzIHdpdGggdmFsaWQga2V5cyAqL1xuICBtdXN0QmVFbnRpdGllcyhhY3Rpb246IEVudGl0eUFjdGlvbjxUW10+KTogVFtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5leHRyYWN0RGF0YShhY3Rpb24pO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuIHRoaXMudGhyb3dFcnJvcihhY3Rpb24sIGBzaG91bGQgYmUgYW4gYXJyYXkgb2YgZW50aXRpZXNgKTtcbiAgICB9XG4gICAgZGF0YS5mb3JFYWNoKChlbnRpdHksIGkpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5zZWxlY3RJZChlbnRpdHkpO1xuICAgICAgaWYgKHRoaXMuaXNOb3RLZXlUeXBlKGlkKSkge1xuICAgICAgICBjb25zdCBtc2cgPSBgLCBpdGVtICR7aSArIDF9LCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgZW50aXR5IGtleSAoaWQpYDtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yKGFjdGlvbiwgbXNnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKiBUaHJvdyBpZiB0aGUgYWN0aW9uIHBheWxvYWQgaXMgbm90IGEgc2luZ2xlLCB2YWxpZCBrZXkgKi9cbiAgbXVzdEJlS2V5KGFjdGlvbjogRW50aXR5QWN0aW9uPHN0cmluZyB8IG51bWJlcj4pOiBzdHJpbmcgfCBudW1iZXIgfCBuZXZlciB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZXh0cmFjdERhdGEoYWN0aW9uKTtcbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHNob3VsZCBiZSBhIHNpbmdsZSBlbnRpdHkga2V5YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTm90S2V5VHlwZShkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpcyBub3QgYSB2YWxpZCBrZXkgKGlkKWApO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKiBUaHJvdyBpZiB0aGUgYWN0aW9uIHBheWxvYWQgaXMgbm90IGFuIGFycmF5IG9mIHZhbGlkIGtleXMgKi9cbiAgbXVzdEJlS2V5cyhhY3Rpb246IEVudGl0eUFjdGlvbjwoc3RyaW5nIHwgbnVtYmVyKVtdPik6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmV4dHJhY3REYXRhKGFjdGlvbik7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm4gdGhpcy50aHJvd0Vycm9yKGFjdGlvbiwgYHNob3VsZCBiZSBhbiBhcnJheSBvZiBlbnRpdHkga2V5cyAoaWQpYCk7XG4gICAgfVxuICAgIGRhdGEuZm9yRWFjaCgoaWQsIGkpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzTm90S2V5VHlwZShpZCkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gYCR7dGhpcy5lbnRpdHlOYW1lfSAnLCBpdGVtICR7XG4gICAgICAgICAgaSArIDFcbiAgICAgICAgfSwgaXMgbm90IGEgdmFsaWQgZW50aXR5IGtleSAoaWQpYDtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yKGFjdGlvbiwgbXNnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKiBUaHJvdyBpZiB0aGUgYWN0aW9uIHBheWxvYWQgaXMgbm90IGFuIHVwZGF0ZSB3aXRoIGEgdmFsaWQga2V5IChpZCkgKi9cbiAgbXVzdEJlVXBkYXRlKGFjdGlvbjogRW50aXR5QWN0aW9uPFVwZGF0ZTxUPj4pOiBVcGRhdGU8VD4ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmV4dHJhY3REYXRhKGFjdGlvbik7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy50aHJvd0Vycm9yKGFjdGlvbiwgYHNob3VsZCBiZSBhIHNpbmdsZSBlbnRpdHkgdXBkYXRlYCk7XG4gICAgfVxuICAgIGNvbnN0IHsgaWQsIGNoYW5nZXMgfSA9IGRhdGE7XG4gICAgY29uc3QgaWQyID0gdGhpcy5zZWxlY3RJZChjaGFuZ2VzIGFzIFQpO1xuICAgIGlmICh0aGlzLmlzTm90S2V5VHlwZShpZCkgfHwgdGhpcy5pc05vdEtleVR5cGUoaWQyKSkge1xuICAgICAgdGhpcy50aHJvd0Vycm9yKGFjdGlvbiwgYGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBlbnRpdHkga2V5IChpZClgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKiogVGhyb3cgaWYgdGhlIGFjdGlvbiBwYXlsb2FkIGlzIG5vdCBhbiBhcnJheSBvZiB1cGRhdGVzIHdpdGggdmFsaWQga2V5cyAoaWRzKSAqL1xuICBtdXN0QmVVcGRhdGVzKGFjdGlvbjogRW50aXR5QWN0aW9uPFVwZGF0ZTxUPltdPik6IFVwZGF0ZTxUPltdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5leHRyYWN0RGF0YShhY3Rpb24pO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuIHRoaXMudGhyb3dFcnJvcihhY3Rpb24sIGBzaG91bGQgYmUgYW4gYXJyYXkgb2YgZW50aXR5IHVwZGF0ZXNgKTtcbiAgICB9XG4gICAgZGF0YS5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICBjb25zdCB7IGlkLCBjaGFuZ2VzIH0gPSBpdGVtO1xuICAgICAgY29uc3QgaWQyID0gdGhpcy5zZWxlY3RJZChjaGFuZ2VzIGFzIFQpO1xuICAgICAgaWYgKHRoaXMuaXNOb3RLZXlUeXBlKGlkKSB8fCB0aGlzLmlzTm90S2V5VHlwZShpZDIpKSB7XG4gICAgICAgIHRoaXMudGhyb3dFcnJvcihcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgYCwgaXRlbSAke2kgKyAxfSwgaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIGVudGl0eSBrZXkgKGlkKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKiBUaHJvdyBpZiB0aGUgYWN0aW9uIHBheWxvYWQgaXMgbm90IGFuIHVwZGF0ZSByZXNwb25zZSB3aXRoIGEgdmFsaWQga2V5IChpZCkgKi9cbiAgbXVzdEJlVXBkYXRlUmVzcG9uc2UoXG4gICAgYWN0aW9uOiBFbnRpdHlBY3Rpb248VXBkYXRlUmVzcG9uc2VEYXRhPFQ+PlxuICApOiBVcGRhdGVSZXNwb25zZURhdGE8VD4ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmV4dHJhY3REYXRhKGFjdGlvbik7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy50aHJvd0Vycm9yKGFjdGlvbiwgYHNob3VsZCBiZSBhIHNpbmdsZSBlbnRpdHkgdXBkYXRlYCk7XG4gICAgfVxuICAgIGNvbnN0IHsgaWQsIGNoYW5nZXMgfSA9IGRhdGE7XG4gICAgY29uc3QgaWQyID0gdGhpcy5zZWxlY3RJZChjaGFuZ2VzIGFzIFQpO1xuICAgIGlmICh0aGlzLmlzTm90S2V5VHlwZShpZCkgfHwgdGhpcy5pc05vdEtleVR5cGUoaWQyKSkge1xuICAgICAgdGhpcy50aHJvd0Vycm9yKGFjdGlvbiwgYGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBlbnRpdHkga2V5IChpZClgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKiogVGhyb3cgaWYgdGhlIGFjdGlvbiBwYXlsb2FkIGlzIG5vdCBhbiBhcnJheSBvZiB1cGRhdGUgcmVzcG9uc2VzIHdpdGggdmFsaWQga2V5cyAoaWRzKSAqL1xuICBtdXN0QmVVcGRhdGVSZXNwb25zZXMoXG4gICAgYWN0aW9uOiBFbnRpdHlBY3Rpb248VXBkYXRlUmVzcG9uc2VEYXRhPFQ+W10+XG4gICk6IFVwZGF0ZVJlc3BvbnNlRGF0YTxUPltdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5leHRyYWN0RGF0YShhY3Rpb24pO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuIHRoaXMudGhyb3dFcnJvcihhY3Rpb24sIGBzaG91bGQgYmUgYW4gYXJyYXkgb2YgZW50aXR5IHVwZGF0ZXNgKTtcbiAgICB9XG4gICAgZGF0YS5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICBjb25zdCB7IGlkLCBjaGFuZ2VzIH0gPSBpdGVtO1xuICAgICAgY29uc3QgaWQyID0gdGhpcy5zZWxlY3RJZChjaGFuZ2VzIGFzIFQpO1xuICAgICAgaWYgKHRoaXMuaXNOb3RLZXlUeXBlKGlkKSB8fCB0aGlzLmlzTm90S2V5VHlwZShpZDIpKSB7XG4gICAgICAgIHRoaXMudGhyb3dFcnJvcihcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgYCwgaXRlbSAke2kgKyAxfSwgaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIGVudGl0eSBrZXkgKGlkKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdERhdGE8VD4oYWN0aW9uOiBFbnRpdHlBY3Rpb248VD4pIHtcbiAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQgJiYgYWN0aW9uLnBheWxvYWQuZGF0YTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGtleSAoaWQpIGlzIGludmFsaWQgKi9cbiAgcHJpdmF0ZSBpc05vdEtleVR5cGUoaWQ6IGFueSkge1xuICAgIHJldHVybiB0eXBlb2YgaWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBpZCAhPT0gJ251bWJlcic7XG4gIH1cblxuICBwcml2YXRlIHRocm93RXJyb3IoYWN0aW9uOiBFbnRpdHlBY3Rpb24sIG1zZzogc3RyaW5nKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke3RoaXMuZW50aXR5TmFtZX0gRW50aXR5QWN0aW9uIGd1YXJkIGZvciBcIiR7YWN0aW9uLnR5cGV9XCI6IHBheWxvYWQgJHttc2d9YFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,210 @@
1
+ import { Injectable, isDevMode, Optional } from '@angular/core';
2
+ import { HttpHeaders, HttpParams, } from '@angular/common/http';
3
+ import { of, throwError } from 'rxjs';
4
+ import { catchError, delay, map, timeout } from 'rxjs/operators';
5
+ import { DataServiceError } from './data-service-error';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common/http";
8
+ import * as i2 from "./http-url-generator";
9
+ import * as i3 from "./default-data-service-config";
10
+ /**
11
+ * A basic, generic entity data service
12
+ * suitable for persistence of most entities.
13
+ * Assumes a common REST-y web API
14
+ */
15
+ export class DefaultDataService {
16
+ get name() {
17
+ return this._name;
18
+ }
19
+ constructor(entityName, http, httpUrlGenerator, config) {
20
+ this.http = http;
21
+ this.httpUrlGenerator = httpUrlGenerator;
22
+ this.getDelay = 0;
23
+ this.saveDelay = 0;
24
+ this.timeout = 0;
25
+ this.trailingSlashEndpoints = false;
26
+ this._name = `${entityName} DefaultDataService`;
27
+ this.entityName = entityName;
28
+ const { root = 'api', delete404OK = true, getDelay = 0, saveDelay = 0, timeout: to = 0, trailingSlashEndpoints = false, } = config || {};
29
+ this.delete404OK = delete404OK;
30
+ this.entityUrl = httpUrlGenerator.entityResource(entityName, root, trailingSlashEndpoints);
31
+ this.entitiesUrl = httpUrlGenerator.collectionResource(entityName, root);
32
+ this.getDelay = getDelay;
33
+ this.saveDelay = saveDelay;
34
+ this.timeout = to;
35
+ }
36
+ add(entity, options) {
37
+ const entityOrError = entity || new Error(`No "${this.entityName}" entity to add`);
38
+ return this.execute('POST', this.entityUrl, entityOrError, null, options);
39
+ }
40
+ delete(key, options) {
41
+ let err;
42
+ if (key == null) {
43
+ err = new Error(`No "${this.entityName}" key to delete`);
44
+ }
45
+ return this.execute('DELETE', this.entityUrl + key, err, null, options).pipe(
46
+ // forward the id of deleted entity as the result of the HTTP DELETE
47
+ map((result) => key));
48
+ }
49
+ getAll(options) {
50
+ return this.execute('GET', this.entitiesUrl, null, options);
51
+ }
52
+ getById(key, options) {
53
+ let err;
54
+ if (key == null) {
55
+ err = new Error(`No "${this.entityName}" key to get`);
56
+ }
57
+ return this.execute('GET', this.entityUrl + key, err, null, options);
58
+ }
59
+ getWithQuery(queryParams, options) {
60
+ const qParams = typeof queryParams === 'string'
61
+ ? { fromString: queryParams }
62
+ : { fromObject: queryParams };
63
+ const params = new HttpParams(qParams);
64
+ return this.execute('GET', this.entitiesUrl, undefined, { params }, options);
65
+ }
66
+ update(update, options) {
67
+ const id = update && update.id;
68
+ const updateOrError = id == null
69
+ ? new Error(`No "${this.entityName}" update data or id`)
70
+ : update.changes;
71
+ return this.execute('PUT', this.entityUrl + id, updateOrError, null, options);
72
+ }
73
+ // Important! Only call if the backend service supports upserts as a POST to the target URL
74
+ upsert(entity, options) {
75
+ const entityOrError = entity || new Error(`No "${this.entityName}" entity to upsert`);
76
+ return this.execute('POST', this.entityUrl, entityOrError, null, options);
77
+ }
78
+ execute(method, url, data, // data, error, or undefined/null
79
+ options, // options or undefined/null
80
+ httpOptions // these override any options passed via options
81
+ ) {
82
+ let entityActionHttpClientOptions = undefined;
83
+ if (httpOptions) {
84
+ entityActionHttpClientOptions = {
85
+ headers: httpOptions?.httpHeaders
86
+ ? new HttpHeaders(httpOptions?.httpHeaders)
87
+ : undefined,
88
+ params: httpOptions?.httpParams
89
+ ? new HttpParams(httpOptions?.httpParams)
90
+ : undefined,
91
+ };
92
+ }
93
+ // Now we may have:
94
+ // options: containing headers, params, or any other allowed http options already in angular's api
95
+ // entityActionHttpClientOptions: headers and params in angular's api
96
+ // We therefore need to merge these so that the action ones override the
97
+ // existing keys where applicable.
98
+ // If any options have been specified, pass them to http client. Note
99
+ // the new http options, if specified, will override any options passed
100
+ // from the deprecated options parameter
101
+ let mergedOptions = undefined;
102
+ if (options || entityActionHttpClientOptions) {
103
+ if (isDevMode() && options && entityActionHttpClientOptions) {
104
+ console.warn('@ngrx/data: options.httpParams will be merged with queryParams when both are are provided to getWithQuery(). In the event of a conflict HttpOptions.httpParams will override queryParams`. The queryParams parameter of getWithQuery() will be removed in next major release.');
105
+ }
106
+ mergedOptions = {
107
+ ...options,
108
+ headers: entityActionHttpClientOptions?.headers ?? options?.headers,
109
+ params: entityActionHttpClientOptions?.params ?? options?.params,
110
+ };
111
+ }
112
+ const req = {
113
+ method,
114
+ url,
115
+ data,
116
+ options: mergedOptions,
117
+ };
118
+ if (data instanceof Error) {
119
+ return this.handleError(req)(data);
120
+ }
121
+ let result$;
122
+ switch (method) {
123
+ case 'DELETE': {
124
+ result$ = this.http.delete(url, mergedOptions);
125
+ if (this.saveDelay) {
126
+ result$ = result$.pipe(delay(this.saveDelay));
127
+ }
128
+ break;
129
+ }
130
+ case 'GET': {
131
+ result$ = this.http.get(url, mergedOptions);
132
+ if (this.getDelay) {
133
+ result$ = result$.pipe(delay(this.getDelay));
134
+ }
135
+ break;
136
+ }
137
+ case 'POST': {
138
+ result$ = this.http.post(url, data, mergedOptions);
139
+ if (this.saveDelay) {
140
+ result$ = result$.pipe(delay(this.saveDelay));
141
+ }
142
+ break;
143
+ }
144
+ // N.B.: It must return an Update<T>
145
+ case 'PUT': {
146
+ result$ = this.http.put(url, data, mergedOptions);
147
+ if (this.saveDelay) {
148
+ result$ = result$.pipe(delay(this.saveDelay));
149
+ }
150
+ break;
151
+ }
152
+ default: {
153
+ const error = new Error('Unimplemented HTTP method, ' + method);
154
+ result$ = throwError(error);
155
+ }
156
+ }
157
+ if (this.timeout) {
158
+ result$ = result$.pipe(timeout(this.timeout + this.saveDelay));
159
+ }
160
+ return result$.pipe(catchError(this.handleError(req)));
161
+ }
162
+ handleError(reqData) {
163
+ return (err) => {
164
+ const ok = this.handleDelete404(err, reqData);
165
+ if (ok) {
166
+ return ok;
167
+ }
168
+ const error = new DataServiceError(err, reqData);
169
+ return throwError(error);
170
+ };
171
+ }
172
+ handleDelete404(error, reqData) {
173
+ if (error.status === 404 &&
174
+ reqData.method === 'DELETE' &&
175
+ this.delete404OK) {
176
+ return of({});
177
+ }
178
+ return undefined;
179
+ }
180
+ }
181
+ /**
182
+ * Create a basic, generic entity data service
183
+ * suitable for persistence of most entities.
184
+ * Assumes a common REST-y web API
185
+ */
186
+ class DefaultDataServiceFactory {
187
+ constructor(http, httpUrlGenerator, config) {
188
+ this.http = http;
189
+ this.httpUrlGenerator = httpUrlGenerator;
190
+ this.config = config;
191
+ config = config || {};
192
+ httpUrlGenerator.registerHttpResourceUrls(config.entityHttpResourceUrls);
193
+ }
194
+ /**
195
+ * Create a default {EntityCollectionDataService} for the given entity type
196
+ * @param entityName {string} Name of the entity type for this data service
197
+ */
198
+ create(entityName) {
199
+ return new DefaultDataService(entityName, this.http, this.httpUrlGenerator, this.config);
200
+ }
201
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0-rc.2", ngImport: i0, type: DefaultDataServiceFactory, deps: [{ token: i1.HttpClient }, { token: i2.HttpUrlGenerator }, { token: i3.DefaultDataServiceConfig, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
202
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0-rc.2", ngImport: i0, type: DefaultDataServiceFactory }); }
203
+ }
204
+ export { DefaultDataServiceFactory };
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-rc.2", ngImport: i0, type: DefaultDataServiceFactory, decorators: [{
206
+ type: Injectable
207
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.HttpUrlGenerator }, { type: i3.DefaultDataServiceConfig, decorators: [{
208
+ type: Optional
209
+ }] }]; } });
210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1kYXRhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL2RhdGEvc3JjL2RhdGFzZXJ2aWNlcy9kZWZhdWx0LWRhdGEuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUdMLFdBQVcsRUFDWCxVQUFVLEdBQ1gsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7O0FBV3hEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBVzdCLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsWUFDRSxVQUFrQixFQUNSLElBQWdCLEVBQ2hCLGdCQUFrQyxFQUM1QyxNQUFpQztRQUZ2QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFacEMsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBWXZDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxVQUFVLHFCQUFxQixDQUFDO1FBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLE1BQU0sRUFDSixJQUFJLEdBQUcsS0FBSyxFQUNaLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLFFBQVEsR0FBRyxDQUFDLEVBQ1osU0FBUyxHQUFHLENBQUMsRUFDYixPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFDZixzQkFBc0IsR0FBRyxLQUFLLEdBQy9CLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLGNBQWMsQ0FDOUMsVUFBVSxFQUNWLElBQUksRUFDSixzQkFBc0IsQ0FDdkIsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxHQUFHLENBQUMsTUFBUyxFQUFFLE9BQXFCO1FBQ2xDLE1BQU0sYUFBYSxHQUNqQixNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxNQUFNLENBQ0osR0FBb0IsRUFDcEIsT0FBcUI7UUFFckIsSUFBSSxHQUFzQixDQUFDO1FBQzNCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNmLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLGlCQUFpQixDQUFDLENBQUM7U0FDMUQ7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLFFBQVEsRUFDUixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFDcEIsR0FBRyxFQUNILElBQUksRUFDSixPQUFPLENBQ1IsQ0FBQyxJQUFJO1FBQ0osb0VBQW9FO1FBQ3BFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBc0IsQ0FBQyxDQUN4QyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxPQUFPLENBQUMsR0FBb0IsRUFBRSxPQUFxQjtRQUNqRCxJQUFJLEdBQXNCLENBQUM7UUFDM0IsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ2YsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsY0FBYyxDQUFDLENBQUM7U0FDdkQ7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELFlBQVksQ0FDVixXQUE2QyxFQUM3QyxPQUFxQjtRQUVyQixNQUFNLE9BQU8sR0FDWCxPQUFPLFdBQVcsS0FBSyxRQUFRO1lBQzdCLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUU7WUFDN0IsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FDakIsS0FBSyxFQUNMLElBQUksQ0FBQyxXQUFXLEVBQ2hCLFNBQVMsRUFDVCxFQUFFLE1BQU0sRUFBRSxFQUNWLE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFpQixFQUFFLE9BQXFCO1FBQzdDLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sYUFBYSxHQUNqQixFQUFFLElBQUksSUFBSTtZQUNSLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLHFCQUFxQixDQUFDO1lBQ3hELENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FDakIsS0FBSyxFQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxFQUNuQixhQUFhLEVBQ2IsSUFBSSxFQUNKLE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVELDJGQUEyRjtJQUMzRixNQUFNLENBQUMsTUFBUyxFQUFFLE9BQXFCO1FBQ3JDLE1BQU0sYUFBYSxHQUNqQixNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFUyxPQUFPLENBQ2YsTUFBbUIsRUFDbkIsR0FBVyxFQUNYLElBQVUsRUFBRSxpQ0FBaUM7SUFDN0MsT0FBYSxFQUFFLDRCQUE0QjtJQUMzQyxXQUF5QixDQUFDLGdEQUFnRDs7UUFFMUUsSUFBSSw2QkFBNkIsR0FBUSxTQUFTLENBQUM7UUFDbkQsSUFBSSxXQUFXLEVBQUU7WUFDZiw2QkFBNkIsR0FBRztnQkFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXO29CQUMvQixDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztvQkFDM0MsQ0FBQyxDQUFDLFNBQVM7Z0JBQ2IsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVO29CQUM3QixDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQztvQkFDekMsQ0FBQyxDQUFDLFNBQVM7YUFDZCxDQUFDO1NBQ0g7UUFFRCxtQkFBbUI7UUFDbkIsa0dBQWtHO1FBQ2xHLHFFQUFxRTtRQUVyRSx3RUFBd0U7UUFDeEUsa0NBQWtDO1FBRWxDLHFFQUFxRTtRQUNyRSx1RUFBdUU7UUFDdkUsd0NBQXdDO1FBQ3hDLElBQUksYUFBYSxHQUFRLFNBQVMsQ0FBQztRQUNuQyxJQUFJLE9BQU8sSUFBSSw2QkFBNkIsRUFBRTtZQUM1QyxJQUFJLFNBQVMsRUFBRSxJQUFJLE9BQU8sSUFBSSw2QkFBNkIsRUFBRTtnQkFDM0QsT0FBTyxDQUFDLElBQUksQ0FDViwrUUFBK1EsQ0FDaFIsQ0FBQzthQUNIO1lBRUQsYUFBYSxHQUFHO2dCQUNkLEdBQUcsT0FBTztnQkFDVixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsT0FBTyxJQUFJLE9BQU8sRUFBRSxPQUFPO2dCQUNuRSxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxJQUFJLE9BQU8sRUFBRSxNQUFNO2FBQ2pFLENBQUM7U0FDSDtRQUVELE1BQU0sR0FBRyxHQUFnQjtZQUN2QixNQUFNO1lBQ04sR0FBRztZQUNILElBQUk7WUFDSixPQUFPLEVBQUUsYUFBYTtTQUN2QixDQUFDO1FBRUYsSUFBSSxJQUFJLFlBQVksS0FBSyxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQztRQUVELElBQUksT0FBZ0MsQ0FBQztRQUVyQyxRQUFRLE1BQU0sRUFBRTtZQUNkLEtBQUssUUFBUSxDQUFDLENBQUM7Z0JBQ2IsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNsQixPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7aUJBQy9DO2dCQUNELE1BQU07YUFDUDtZQUNELEtBQUssS0FBSyxDQUFDLENBQUM7Z0JBQ1YsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNqQixPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7aUJBQzlDO2dCQUNELE1BQU07YUFDUDtZQUNELEtBQUssTUFBTSxDQUFDLENBQUM7Z0JBQ1gsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQ25ELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDbEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2lCQUMvQztnQkFDRCxNQUFNO2FBQ1A7WUFDRCxvQ0FBb0M7WUFDcEMsS0FBSyxLQUFLLENBQUMsQ0FBQztnQkFDVixPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNsQixPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7aUJBQy9DO2dCQUNELE1BQU07YUFDUDtZQUNELE9BQU8sQ0FBQyxDQUFDO2dCQUNQLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdCO1NBQ0Y7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FDaEU7UUFDRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTyxXQUFXLENBQUMsT0FBb0I7UUFDdEMsT0FBTyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLElBQUksRUFBRSxFQUFFO2dCQUNOLE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqRCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sZUFBZSxDQUFDLEtBQXdCLEVBQUUsT0FBb0I7UUFDcEUsSUFDRSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUc7WUFDcEIsT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRO1lBQzNCLElBQUksQ0FBQyxXQUFXLEVBQ2hCO1lBQ0EsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDZjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxNQUNhLHlCQUF5QjtJQUNwQyxZQUNZLElBQWdCLEVBQ2hCLGdCQUFrQyxFQUN0QixNQUFpQztRQUY3QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBMkI7UUFFdkQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDdEIsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBSSxVQUFrQjtRQUMxQixPQUFPLElBQUksa0JBQWtCLENBQzNCLFVBQVUsRUFDVixJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FDWixDQUFDO0lBQ0osQ0FBQztzSUFyQlUseUJBQXlCOzBJQUF6Qix5QkFBeUI7O1NBQXpCLHlCQUF5QjtnR0FBekIseUJBQXlCO2tCQURyQyxVQUFVOzswQkFLTixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaXNEZXZNb2RlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSHR0cENsaWVudCxcbiAgSHR0cEVycm9yUmVzcG9uc2UsXG4gIEh0dHBIZWFkZXJzLFxuICBIdHRwUGFyYW1zLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWxheSwgbWFwLCB0aW1lb3V0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBVcGRhdGUgfSBmcm9tICdAbmdyeC9lbnRpdHknO1xuXG5pbXBvcnQgeyBEYXRhU2VydmljZUVycm9yIH0gZnJvbSAnLi9kYXRhLXNlcnZpY2UtZXJyb3InO1xuaW1wb3J0IHsgRGVmYXVsdERhdGFTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi9kZWZhdWx0LWRhdGEtc2VydmljZS1jb25maWcnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29sbGVjdGlvbkRhdGFTZXJ2aWNlLFxuICBIdHRwTWV0aG9kcyxcbiAgSHR0cE9wdGlvbnMsXG4gIFF1ZXJ5UGFyYW1zLFxuICBSZXF1ZXN0RGF0YSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEh0dHBVcmxHZW5lcmF0b3IgfSBmcm9tICcuL2h0dHAtdXJsLWdlbmVyYXRvcic7XG5cbi8qKlxuICogQSBiYXNpYywgZ2VuZXJpYyBlbnRpdHkgZGF0YSBzZXJ2aWNlXG4gKiBzdWl0YWJsZSBmb3IgcGVyc2lzdGVuY2Ugb2YgbW9zdCBlbnRpdGllcy5cbiAqIEFzc3VtZXMgYSBjb21tb24gUkVTVC15IHdlYiBBUElcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmF1bHREYXRhU2VydmljZTxUPiBpbXBsZW1lbnRzIEVudGl0eUNvbGxlY3Rpb25EYXRhU2VydmljZTxUPiB7XG4gIHByb3RlY3RlZCBfbmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZGVsZXRlNDA0T0s6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBlbnRpdHlOYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBlbnRpdHlVcmw6IHN0cmluZztcbiAgcHJvdGVjdGVkIGVudGl0aWVzVXJsOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBnZXREZWxheSA9IDA7XG4gIHByb3RlY3RlZCBzYXZlRGVsYXkgPSAwO1xuICBwcm90ZWN0ZWQgdGltZW91dCA9IDA7XG4gIHByb3RlY3RlZCB0cmFpbGluZ1NsYXNoRW5kcG9pbnRzID0gZmFsc2U7XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJvdGVjdGVkIGh0dHBVcmxHZW5lcmF0b3I6IEh0dHBVcmxHZW5lcmF0b3IsXG4gICAgY29uZmlnPzogRGVmYXVsdERhdGFTZXJ2aWNlQ29uZmlnXG4gICkge1xuICAgIHRoaXMuX25hbWUgPSBgJHtlbnRpdHlOYW1lfSBEZWZhdWx0RGF0YVNlcnZpY2VgO1xuICAgIHRoaXMuZW50aXR5TmFtZSA9IGVudGl0eU5hbWU7XG4gICAgY29uc3Qge1xuICAgICAgcm9vdCA9ICdhcGknLFxuICAgICAgZGVsZXRlNDA0T0sgPSB0cnVlLFxuICAgICAgZ2V0RGVsYXkgPSAwLFxuICAgICAgc2F2ZURlbGF5ID0gMCxcbiAgICAgIHRpbWVvdXQ6IHRvID0gMCxcbiAgICAgIHRyYWlsaW5nU2xhc2hFbmRwb2ludHMgPSBmYWxzZSxcbiAgICB9ID0gY29uZmlnIHx8IHt9O1xuICAgIHRoaXMuZGVsZXRlNDA0T0sgPSBkZWxldGU0MDRPSztcbiAgICB0aGlzLmVudGl0eVVybCA9IGh0dHBVcmxHZW5lcmF0b3IuZW50aXR5UmVzb3VyY2UoXG4gICAgICBlbnRpdHlOYW1lLFxuICAgICAgcm9vdCxcbiAgICAgIHRyYWlsaW5nU2xhc2hFbmRwb2ludHNcbiAgICApO1xuICAgIHRoaXMuZW50aXRpZXNVcmwgPSBodHRwVXJsR2VuZXJhdG9yLmNvbGxlY3Rpb25SZXNvdXJjZShlbnRpdHlOYW1lLCByb290KTtcbiAgICB0aGlzLmdldERlbGF5ID0gZ2V0RGVsYXk7XG4gICAgdGhpcy5zYXZlRGVsYXkgPSBzYXZlRGVsYXk7XG4gICAgdGhpcy50aW1lb3V0ID0gdG87XG4gIH1cblxuICBhZGQoZW50aXR5OiBULCBvcHRpb25zPzogSHR0cE9wdGlvbnMpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBjb25zdCBlbnRpdHlPckVycm9yID1cbiAgICAgIGVudGl0eSB8fCBuZXcgRXJyb3IoYE5vIFwiJHt0aGlzLmVudGl0eU5hbWV9XCIgZW50aXR5IHRvIGFkZGApO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoJ1BPU1QnLCB0aGlzLmVudGl0eVVybCwgZW50aXR5T3JFcnJvciwgbnVsbCwgb3B0aW9ucyk7XG4gIH1cblxuICBkZWxldGUoXG4gICAga2V5OiBudW1iZXIgfCBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEh0dHBPcHRpb25zXG4gICk6IE9ic2VydmFibGU8bnVtYmVyIHwgc3RyaW5nPiB7XG4gICAgbGV0IGVycjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICBlcnIgPSBuZXcgRXJyb3IoYE5vIFwiJHt0aGlzLmVudGl0eU5hbWV9XCIga2V5IHRvIGRlbGV0ZWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICAnREVMRVRFJyxcbiAgICAgIHRoaXMuZW50aXR5VXJsICsga2V5LFxuICAgICAgZXJyLFxuICAgICAgbnVsbCxcbiAgICAgIG9wdGlvbnNcbiAgICApLnBpcGUoXG4gICAgICAvLyBmb3J3YXJkIHRoZSBpZCBvZiBkZWxldGVkIGVudGl0eSBhcyB0aGUgcmVzdWx0IG9mIHRoZSBIVFRQIERFTEVURVxuICAgICAgbWFwKChyZXN1bHQpID0+IGtleSBhcyBudW1iZXIgfCBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIGdldEFsbChvcHRpb25zPzogSHR0cE9wdGlvbnMpOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoJ0dFVCcsIHRoaXMuZW50aXRpZXNVcmwsIG51bGwsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0QnlJZChrZXk6IG51bWJlciB8IHN0cmluZywgb3B0aW9ucz86IEh0dHBPcHRpb25zKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgbGV0IGVycjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICBlcnIgPSBuZXcgRXJyb3IoYE5vIFwiJHt0aGlzLmVudGl0eU5hbWV9XCIga2V5IHRvIGdldGApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKCdHRVQnLCB0aGlzLmVudGl0eVVybCArIGtleSwgZXJyLCBudWxsLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldFdpdGhRdWVyeShcbiAgICBxdWVyeVBhcmFtczogUXVlcnlQYXJhbXMgfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IEh0dHBPcHRpb25zXG4gICk6IE9ic2VydmFibGU8VFtdPiB7XG4gICAgY29uc3QgcVBhcmFtcyA9XG4gICAgICB0eXBlb2YgcXVlcnlQYXJhbXMgPT09ICdzdHJpbmcnXG4gICAgICAgID8geyBmcm9tU3RyaW5nOiBxdWVyeVBhcmFtcyB9XG4gICAgICAgIDogeyBmcm9tT2JqZWN0OiBxdWVyeVBhcmFtcyB9O1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKHFQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgICdHRVQnLFxuICAgICAgdGhpcy5lbnRpdGllc1VybCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgcGFyYW1zIH0sXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZSh1cGRhdGU6IFVwZGF0ZTxUPiwgb3B0aW9ucz86IEh0dHBPcHRpb25zKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3QgaWQgPSB1cGRhdGUgJiYgdXBkYXRlLmlkO1xuICAgIGNvbnN0IHVwZGF0ZU9yRXJyb3IgPVxuICAgICAgaWQgPT0gbnVsbFxuICAgICAgICA/IG5ldyBFcnJvcihgTm8gXCIke3RoaXMuZW50aXR5TmFtZX1cIiB1cGRhdGUgZGF0YSBvciBpZGApXG4gICAgICAgIDogdXBkYXRlLmNoYW5nZXM7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgICdQVVQnLFxuICAgICAgdGhpcy5lbnRpdHlVcmwgKyBpZCxcbiAgICAgIHVwZGF0ZU9yRXJyb3IsXG4gICAgICBudWxsLFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gIH1cblxuICAvLyBJbXBvcnRhbnQhIE9ubHkgY2FsbCBpZiB0aGUgYmFja2VuZCBzZXJ2aWNlIHN1cHBvcnRzIHVwc2VydHMgYXMgYSBQT1NUIHRvIHRoZSB0YXJnZXQgVVJMXG4gIHVwc2VydChlbnRpdHk6IFQsIG9wdGlvbnM/OiBIdHRwT3B0aW9ucyk6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IGVudGl0eU9yRXJyb3IgPVxuICAgICAgZW50aXR5IHx8IG5ldyBFcnJvcihgTm8gXCIke3RoaXMuZW50aXR5TmFtZX1cIiBlbnRpdHkgdG8gdXBzZXJ0YCk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSgnUE9TVCcsIHRoaXMuZW50aXR5VXJsLCBlbnRpdHlPckVycm9yLCBudWxsLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBleGVjdXRlKFxuICAgIG1ldGhvZDogSHR0cE1ldGhvZHMsXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZGF0YT86IGFueSwgLy8gZGF0YSwgZXJyb3IsIG9yIHVuZGVmaW5lZC9udWxsXG4gICAgb3B0aW9ucz86IGFueSwgLy8gb3B0aW9ucyBvciB1bmRlZmluZWQvbnVsbFxuICAgIGh0dHBPcHRpb25zPzogSHR0cE9wdGlvbnMgLy8gdGhlc2Ugb3ZlcnJpZGUgYW55IG9wdGlvbnMgcGFzc2VkIHZpYSBvcHRpb25zXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IGVudGl0eUFjdGlvbkh0dHBDbGllbnRPcHRpb25zOiBhbnkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGh0dHBPcHRpb25zKSB7XG4gICAgICBlbnRpdHlBY3Rpb25IdHRwQ2xpZW50T3B0aW9ucyA9IHtcbiAgICAgICAgaGVhZGVyczogaHR0cE9wdGlvbnM/Lmh0dHBIZWFkZXJzXG4gICAgICAgICAgPyBuZXcgSHR0cEhlYWRlcnMoaHR0cE9wdGlvbnM/Lmh0dHBIZWFkZXJzKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXM6IGh0dHBPcHRpb25zPy5odHRwUGFyYW1zXG4gICAgICAgICAgPyBuZXcgSHR0cFBhcmFtcyhodHRwT3B0aW9ucz8uaHR0cFBhcmFtcylcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIG1heSBoYXZlOlxuICAgIC8vIG9wdGlvbnM6IGNvbnRhaW5pbmcgaGVhZGVycywgcGFyYW1zLCBvciBhbnkgb3RoZXIgYWxsb3dlZCBodHRwIG9wdGlvbnMgYWxyZWFkeSBpbiBhbmd1bGFyJ3MgYXBpXG4gICAgLy8gZW50aXR5QWN0aW9uSHR0cENsaWVudE9wdGlvbnM6IGhlYWRlcnMgYW5kIHBhcmFtcyBpbiBhbmd1bGFyJ3MgYXBpXG5cbiAgICAvLyBXZSB0aGVyZWZvcmUgbmVlZCB0byBtZXJnZSB0aGVzZSBzbyB0aGF0IHRoZSBhY3Rpb24gb25lcyBvdmVycmlkZSB0aGVcbiAgICAvLyBleGlzdGluZyBrZXlzIHdoZXJlIGFwcGxpY2FibGUuXG5cbiAgICAvLyBJZiBhbnkgb3B0aW9ucyBoYXZlIGJlZW4gc3BlY2lmaWVkLCBwYXNzIHRoZW0gdG8gaHR0cCBjbGllbnQuIE5vdGVcbiAgICAvLyB0aGUgbmV3IGh0dHAgb3B0aW9ucywgaWYgc3BlY2lmaWVkLCB3aWxsIG92ZXJyaWRlIGFueSBvcHRpb25zIHBhc3NlZFxuICAgIC8vIGZyb20gdGhlIGRlcHJlY2F0ZWQgb3B0aW9ucyBwYXJhbWV0ZXJcbiAgICBsZXQgbWVyZ2VkT3B0aW9uczogYW55ID0gdW5kZWZpbmVkO1xuICAgIGlmIChvcHRpb25zIHx8IGVudGl0eUFjdGlvbkh0dHBDbGllbnRPcHRpb25zKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkgJiYgb3B0aW9ucyAmJiBlbnRpdHlBY3Rpb25IdHRwQ2xpZW50T3B0aW9ucykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ0BuZ3J4L2RhdGE6IG9wdGlvbnMuaHR0cFBhcmFtcyB3aWxsIGJlIG1lcmdlZCB3aXRoIHF1ZXJ5UGFyYW1zIHdoZW4gYm90aCBhcmUgYXJlIHByb3ZpZGVkIHRvIGdldFdpdGhRdWVyeSgpLiBJbiB0aGUgZXZlbnQgb2YgYSBjb25mbGljdCBIdHRwT3B0aW9ucy5odHRwUGFyYW1zIHdpbGwgb3ZlcnJpZGUgcXVlcnlQYXJhbXNgLiBUaGUgcXVlcnlQYXJhbXMgcGFyYW1ldGVyIG9mIGdldFdpdGhRdWVyeSgpIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHJlbGVhc2UuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBtZXJnZWRPcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiBlbnRpdHlBY3Rpb25IdHRwQ2xpZW50T3B0aW9ucz8uaGVhZGVycyA/PyBvcHRpb25zPy5oZWFkZXJzLFxuICAgICAgICBwYXJhbXM6IGVudGl0eUFjdGlvbkh0dHBDbGllbnRPcHRpb25zPy5wYXJhbXMgPz8gb3B0aW9ucz8ucGFyYW1zLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXE6IFJlcXVlc3REYXRhID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgZGF0YSxcbiAgICAgIG9wdGlvbnM6IG1lcmdlZE9wdGlvbnMsXG4gICAgfTtcblxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKHJlcSkoZGF0YSk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCQ6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+O1xuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ0RFTEVURSc6IHtcbiAgICAgICAgcmVzdWx0JCA9IHRoaXMuaHR0cC5kZWxldGUodXJsLCBtZXJnZWRPcHRpb25zKTtcbiAgICAgICAgaWYgKHRoaXMuc2F2ZURlbGF5KSB7XG4gICAgICAgICAgcmVzdWx0JCA9IHJlc3VsdCQucGlwZShkZWxheSh0aGlzLnNhdmVEZWxheSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnR0VUJzoge1xuICAgICAgICByZXN1bHQkID0gdGhpcy5odHRwLmdldCh1cmwsIG1lcmdlZE9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5nZXREZWxheSkge1xuICAgICAgICAgIHJlc3VsdCQgPSByZXN1bHQkLnBpcGUoZGVsYXkodGhpcy5nZXREZWxheSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnUE9TVCc6IHtcbiAgICAgICAgcmVzdWx0JCA9IHRoaXMuaHR0cC5wb3N0KHVybCwgZGF0YSwgbWVyZ2VkT3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLnNhdmVEZWxheSkge1xuICAgICAgICAgIHJlc3VsdCQgPSByZXN1bHQkLnBpcGUoZGVsYXkodGhpcy5zYXZlRGVsYXkpKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIE4uQi46IEl0IG11c3QgcmV0dXJuIGFuIFVwZGF0ZTxUPlxuICAgICAgY2FzZSAnUFVUJzoge1xuICAgICAgICByZXN1bHQkID0gdGhpcy5odHRwLnB1dCh1cmwsIGRhdGEsIG1lcmdlZE9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5zYXZlRGVsYXkpIHtcbiAgICAgICAgICByZXN1bHQkID0gcmVzdWx0JC5waXBlKGRlbGF5KHRoaXMuc2F2ZURlbGF5KSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdVbmltcGxlbWVudGVkIEhUVFAgbWV0aG9kLCAnICsgbWV0aG9kKTtcbiAgICAgICAgcmVzdWx0JCA9IHRocm93RXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICByZXN1bHQkID0gcmVzdWx0JC5waXBlKHRpbWVvdXQodGhpcy50aW1lb3V0ICsgdGhpcy5zYXZlRGVsYXkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCQucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IocmVxKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihyZXFEYXRhOiBSZXF1ZXN0RGF0YSkge1xuICAgIHJldHVybiAoZXJyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IG9rID0gdGhpcy5oYW5kbGVEZWxldGU0MDQoZXJyLCByZXFEYXRhKTtcbiAgICAgIGlmIChvaykge1xuICAgICAgICByZXR1cm4gb2s7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBEYXRhU2VydmljZUVycm9yKGVyciwgcmVxRGF0YSk7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRlNDA0KGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSwgcmVxRGF0YTogUmVxdWVzdERhdGEpIHtcbiAgICBpZiAoXG4gICAgICBlcnJvci5zdGF0dXMgPT09IDQwNCAmJlxuICAgICAgcmVxRGF0YS5tZXRob2QgPT09ICdERUxFVEUnICYmXG4gICAgICB0aGlzLmRlbGV0ZTQwNE9LXG4gICAgKSB7XG4gICAgICByZXR1cm4gb2Yoe30pO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFzaWMsIGdlbmVyaWMgZW50aXR5IGRhdGEgc2VydmljZVxuICogc3VpdGFibGUgZm9yIHBlcnNpc3RlbmNlIG9mIG1vc3QgZW50aXRpZXMuXG4gKiBBc3N1bWVzIGEgY29tbW9uIFJFU1QteSB3ZWIgQVBJXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZWZhdWx0RGF0YVNlcnZpY2VGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJvdGVjdGVkIGh0dHBVcmxHZW5lcmF0b3I6IEh0dHBVcmxHZW5lcmF0b3IsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGNvbmZpZz86IERlZmF1bHREYXRhU2VydmljZUNvbmZpZ1xuICApIHtcbiAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gICAgaHR0cFVybEdlbmVyYXRvci5yZWdpc3Rlckh0dHBSZXNvdXJjZVVybHMoY29uZmlnLmVudGl0eUh0dHBSZXNvdXJjZVVybHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGRlZmF1bHQge0VudGl0eUNvbGxlY3Rpb25EYXRhU2VydmljZX0gZm9yIHRoZSBnaXZlbiBlbnRpdHkgdHlwZVxuICAgKiBAcGFyYW0gZW50aXR5TmFtZSB7c3RyaW5nfSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZSBmb3IgdGhpcyBkYXRhIHNlcnZpY2VcbiAgICovXG4gIGNyZWF0ZTxUPihlbnRpdHlOYW1lOiBzdHJpbmcpOiBFbnRpdHlDb2xsZWN0aW9uRGF0YVNlcnZpY2U8VD4ge1xuICAgIHJldHVybiBuZXcgRGVmYXVsdERhdGFTZXJ2aWNlPFQ+KFxuICAgICAgZW50aXR5TmFtZSxcbiAgICAgIHRoaXMuaHR0cCxcbiAgICAgIHRoaXMuaHR0cFVybEdlbmVyYXRvcixcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,147 @@
1
+ import { Injectable, Optional } from '@angular/core';
2
+ import { throwError } from 'rxjs';
3
+ import { catchError, delay, map, timeout } from 'rxjs/operators';
4
+ import { ChangeSetOperation, excludeEmptyChangeSetItems, } from '../actions/entity-cache-change-set';
5
+ import { DataServiceError } from './data-service-error';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../entity-metadata/entity-definition.service";
8
+ import * as i2 from "@angular/common/http";
9
+ import * as i3 from "./default-data-service-config";
10
+ const updateOp = ChangeSetOperation.Update;
11
+ /**
12
+ * Default data service for making remote service calls targeting the entire EntityCache.
13
+ * See EntityDataService for services that target a single EntityCollection
14
+ */
15
+ class EntityCacheDataService {
16
+ constructor(entityDefinitionService, http, config) {
17
+ this.entityDefinitionService = entityDefinitionService;
18
+ this.http = http;
19
+ this.idSelectors = {};
20
+ this.saveDelay = 0;
21
+ this.timeout = 0;
22
+ const { saveDelay = 0, timeout: to = 0 } = config || {};
23
+ this.saveDelay = saveDelay;
24
+ this.timeout = to;
25
+ }
26
+ /**
27
+ * Save changes to multiple entities across one or more entity collections.
28
+ * Server endpoint must understand the essential SaveEntities protocol,
29
+ * in particular the ChangeSet interface (except for Update<T>).
30
+ * This implementation extracts the entity changes from a ChangeSet Update<T>[] and sends those.
31
+ * It then reconstructs Update<T>[] in the returned observable result.
32
+ * @param changeSet An array of SaveEntityItems.
33
+ * Each SaveEntityItem describe a change operation for one or more entities of a single collection,
34
+ * known by its 'entityName'.
35
+ * @param url The server endpoint that receives this request.
36
+ */
37
+ saveEntities(changeSet, url) {
38
+ changeSet = this.filterChangeSet(changeSet);
39
+ // Assume server doesn't understand @ngrx/entity Update<T> structure;
40
+ // Extract the entity changes from the Update<T>[] and restore on the return from server
41
+ changeSet = this.flattenUpdates(changeSet);
42
+ let result$ = this.http
43
+ .post(url, changeSet)
44
+ .pipe(map((result) => this.restoreUpdates(result)), catchError(this.handleError({ method: 'POST', url, data: changeSet })));
45
+ if (this.timeout) {
46
+ result$ = result$.pipe(timeout(this.timeout));
47
+ }
48
+ if (this.saveDelay) {
49
+ result$ = result$.pipe(delay(this.saveDelay));
50
+ }
51
+ return result$;
52
+ }
53
+ // #region helpers
54
+ handleError(reqData) {
55
+ return (err) => {
56
+ const error = new DataServiceError(err, reqData);
57
+ return throwError(error);
58
+ };
59
+ }
60
+ /**
61
+ * Filter changeSet to remove unwanted ChangeSetItems.
62
+ * This implementation excludes null and empty ChangeSetItems.
63
+ * @param changeSet ChangeSet with changes to filter
64
+ */
65
+ filterChangeSet(changeSet) {
66
+ return excludeEmptyChangeSetItems(changeSet);
67
+ }
68
+ /**
69
+ * Convert the entities in update changes from @ngrx Update<T> structure to just T.
70
+ * Reverse of restoreUpdates().
71
+ */
72
+ flattenUpdates(changeSet) {
73
+ let changes = changeSet.changes;
74
+ if (changes.length === 0) {
75
+ return changeSet;
76
+ }
77
+ let hasMutated = false;
78
+ changes = changes.map((item) => {
79
+ if (item.op === updateOp && item.entities.length > 0) {
80
+ hasMutated = true;
81
+ return {
82
+ ...item,
83
+ entities: item.entities.map((u) => u.changes),
84
+ };
85
+ }
86
+ else {
87
+ return item;
88
+ }
89
+ });
90
+ return hasMutated ? { ...changeSet, changes } : changeSet;
91
+ }
92
+ /**
93
+ * Convert the flattened T entities in update changes back to @ngrx Update<T> structures.
94
+ * Reverse of flattenUpdates().
95
+ */
96
+ restoreUpdates(changeSet) {
97
+ if (changeSet == null) {
98
+ // Nothing? Server probably responded with 204 - No Content because it made no changes to the inserted or updated entities
99
+ return changeSet;
100
+ }
101
+ let changes = changeSet.changes;
102
+ if (changes.length === 0) {
103
+ return changeSet;
104
+ }
105
+ let hasMutated = false;
106
+ changes = changes.map((item) => {
107
+ if (item.op === updateOp) {
108
+ // These are entities, not Updates; convert back to Updates
109
+ hasMutated = true;
110
+ const selectId = this.getIdSelector(item.entityName);
111
+ return {
112
+ ...item,
113
+ entities: item.entities.map((u) => ({
114
+ id: selectId(u),
115
+ changes: u,
116
+ })),
117
+ };
118
+ }
119
+ else {
120
+ return item;
121
+ }
122
+ });
123
+ return hasMutated ? { ...changeSet, changes } : changeSet;
124
+ }
125
+ /**
126
+ * Get the id (primary key) selector function for an entity type
127
+ * @param entityName name of the entity type
128
+ */
129
+ getIdSelector(entityName) {
130
+ let idSelector = this.idSelectors[entityName];
131
+ if (!idSelector) {
132
+ idSelector =
133
+ this.entityDefinitionService.getDefinition(entityName).selectId;
134
+ this.idSelectors[entityName] = idSelector;
135
+ }
136
+ return idSelector;
137
+ }
138
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0-rc.2", ngImport: i0, type: EntityCacheDataService, deps: [{ token: i1.EntityDefinitionService }, { token: i2.HttpClient }, { token: i3.DefaultDataServiceConfig, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
139
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0-rc.2", ngImport: i0, type: EntityCacheDataService }); }
140
+ }
141
+ export { EntityCacheDataService };
142
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-rc.2", ngImport: i0, type: EntityCacheDataService, decorators: [{
143
+ type: Injectable
144
+ }], ctorParameters: function () { return [{ type: i1.EntityDefinitionService }, { type: i2.HttpClient }, { type: i3.DefaultDataServiceConfig, decorators: [{
145
+ type: Optional
146
+ }] }]; } });
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWNhY2hlLWRhdGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvZGF0YS9zcmMvZGF0YXNlcnZpY2VzL2VudGl0eS1jYWNoZS1kYXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHckQsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJakUsT0FBTyxFQUNMLGtCQUFrQixFQUlsQiwwQkFBMEIsR0FDM0IsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7QUFLeEQsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDO0FBRTNDOzs7R0FHRztBQUNILE1BQ2Esc0JBQXNCO0lBS2pDLFlBQ1ksdUJBQWdELEVBQ2hELElBQWdCLEVBQ2QsTUFBaUM7UUFGbkMsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBTmxCLGdCQUFXLEdBQThDLEVBQUUsQ0FBQztRQUM1RCxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsWUFBTyxHQUFHLENBQUMsQ0FBQztRQU9wQixNQUFNLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFD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O2tCQURsQyxVQUFVOzswQkFTTixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlbGF5LCBtYXAsIHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IElkU2VsZWN0b3IgfSBmcm9tICdAbmdyeC9lbnRpdHknO1xuXG5pbXBvcnQge1xuICBDaGFuZ2VTZXRPcGVyYXRpb24sXG4gIENoYW5nZVNldCxcbiAgQ2hhbmdlU2V0SXRlbSxcbiAgQ2hhbmdlU2V0VXBkYXRlLFxuICBleGNsdWRlRW1wdHlDaGFuZ2VTZXRJdGVtcyxcbn0gZnJvbSAnLi4vYWN0aW9ucy9lbnRpdHktY2FjaGUtY2hhbmdlLXNldCc7XG5pbXBvcnQgeyBEYXRhU2VydmljZUVycm9yIH0gZnJvbSAnLi9kYXRhLXNlcnZpY2UtZXJyb3InO1xuaW1wb3J0IHsgRGVmYXVsdERhdGFTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi9kZWZhdWx0LWRhdGEtc2VydmljZS1jb25maWcnO1xuaW1wb3J0IHsgRW50aXR5RGVmaW5pdGlvblNlcnZpY2UgfSBmcm9tICcuLi9lbnRpdHktbWV0YWRhdGEvZW50aXR5LWRlZmluaXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0RGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmNvbnN0IHVwZGF0ZU9wID0gQ2hhbmdlU2V0T3BlcmF0aW9uLlVwZGF0ZTtcblxuLyoqXG4gKiBEZWZhdWx0IGRhdGEgc2VydmljZSBmb3IgbWFraW5nIHJlbW90ZSBzZXJ2aWNlIGNhbGxzIHRhcmdldGluZyB0aGUgZW50aXJlIEVudGl0eUNhY2hlLlxuICogU2VlIEVudGl0eURhdGFTZXJ2aWNlIGZvciBzZXJ2aWNlcyB0aGF0IHRhcmdldCBhIHNpbmdsZSBFbnRpdHlDb2xsZWN0aW9uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFbnRpdHlDYWNoZURhdGFTZXJ2aWNlIHtcbiAgcHJvdGVjdGVkIGlkU2VsZWN0b3JzOiB7IFtlbnRpdHlOYW1lOiBzdHJpbmddOiBJZFNlbGVjdG9yPGFueT4gfSA9IHt9O1xuICBwcm90ZWN0ZWQgc2F2ZURlbGF5ID0gMDtcbiAgcHJvdGVjdGVkIHRpbWVvdXQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBlbnRpdHlEZWZpbml0aW9uU2VydmljZTogRW50aXR5RGVmaW5pdGlvblNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQE9wdGlvbmFsKCkgY29uZmlnPzogRGVmYXVsdERhdGFTZXJ2aWNlQ29uZmlnXG4gICkge1xuICAgIGNvbnN0IHsgc2F2ZURlbGF5ID0gMCwgdGltZW91dDogdG8gPSAwIH0gPSBjb25maWcgfHwge307XG4gICAgdGhpcy5zYXZlRGVsYXkgPSBzYXZlRGVsYXk7XG4gICAgdGhpcy50aW1lb3V0ID0gdG87XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjaGFuZ2VzIHRvIG11bHRpcGxlIGVudGl0aWVzIGFjcm9zcyBvbmUgb3IgbW9yZSBlbnRpdHkgY29sbGVjdGlvbnMuXG4gICAqIFNlcnZlciBlbmRwb2ludCBtdXN0IHVuZGVyc3RhbmQgdGhlIGVzc2VudGlhbCBTYXZlRW50aXRpZXMgcHJvdG9jb2wsXG4gICAqIGluIHBhcnRpY3VsYXIgdGhlIENoYW5nZVNldCBpbnRlcmZhY2UgKGV4Y2VwdCBmb3IgVXBkYXRlPFQ+KS5cbiAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBleHRyYWN0cyB0aGUgZW50aXR5IGNoYW5nZXMgZnJvbSBhIENoYW5nZVNldCBVcGRhdGU8VD5bXSBhbmQgc2VuZHMgdGhvc2UuXG4gICAqIEl0IHRoZW4gcmVjb25zdHJ1Y3RzIFVwZGF0ZTxUPltdIGluIHRoZSByZXR1cm5lZCBvYnNlcnZhYmxlIHJlc3VsdC5cbiAgICogQHBhcmFtIGNoYW5nZVNldCAgQW4gYXJyYXkgb2YgU2F2ZUVudGl0eUl0ZW1zLlxuICAgKiBFYWNoIFNhdmVFbnRpdHlJdGVtIGRlc2NyaWJlIGEgY2hhbmdlIG9wZXJhdGlvbiBmb3Igb25lIG9yIG1vcmUgZW50aXRpZXMgb2YgYSBzaW5nbGUgY29sbGVjdGlvbixcbiAgICoga25vd24gYnkgaXRzICdlbnRpdHlOYW1lJy5cbiAgICogQHBhcmFtIHVybCBUaGUgc2VydmVyIGVuZHBvaW50IHRoYXQgcmVjZWl2ZXMgdGhpcyByZXF1ZXN0LlxuICAgKi9cbiAgc2F2ZUVudGl0aWVzKGNoYW5nZVNldDogQ2hhbmdlU2V0LCB1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhbmdlU2V0PiB7XG4gICAgY2hhbmdlU2V0ID0gdGhpcy5maWx0ZXJDaGFuZ2VTZXQoY2hhbmdlU2V0KTtcbiAgICAvLyBBc3N1bWUgc2VydmVyIGRvZXNuJ3QgdW5kZXJzdGFuZCBAbmdyeC9lbnRpdHkgVXBkYXRlPFQ+IHN0cnVjdHVyZTtcbiAgICAvLyBFeHRyYWN0IHRoZSBlbnRpdHkgY2hhbmdlcyBmcm9tIHRoZSBVcGRhdGU8VD5bXSBhbmQgcmVzdG9yZSBvbiB0aGUgcmV0dXJuIGZyb20gc2VydmVyXG4gICAgY2hhbmdlU2V0ID0gdGhpcy5mbGF0dGVuVXBkYXRlcyhjaGFuZ2VTZXQpO1xuXG4gICAgbGV0IHJlc3VsdCQ6IE9ic2VydmFibGU8Q2hhbmdlU2V0PiA9IHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Q2hhbmdlU2V0Pih1cmwsIGNoYW5nZVNldClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4gdGhpcy5yZXN0b3JlVXBkYXRlcyhyZXN1bHQpKSxcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKHsgbWV0aG9kOiAnUE9TVCcsIHVybCwgZGF0YTogY2hhbmdlU2V0IH0pKVxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIHJlc3VsdCQgPSByZXN1bHQkLnBpcGUodGltZW91dCh0aGlzLnRpbWVvdXQpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zYXZlRGVsYXkpIHtcbiAgICAgIHJlc3VsdCQgPSByZXN1bHQkLnBpcGUoZGVsYXkodGhpcy5zYXZlRGVsYXkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0JDtcbiAgfVxuXG4gIC8vICNyZWdpb24gaGVscGVyc1xuICBwcm90ZWN0ZWQgaGFuZGxlRXJyb3IocmVxRGF0YTogUmVxdWVzdERhdGEpIHtcbiAgICByZXR1cm4gKGVycjogYW55KSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBEYXRhU2VydmljZUVycm9yKGVyciwgcmVxRGF0YSk7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgY2hhbmdlU2V0IHRvIHJlbW92ZSB1bndhbnRlZCBDaGFuZ2VTZXRJdGVtcy5cbiAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBleGNsdWRlcyBudWxsIGFuZCBlbXB0eSBDaGFuZ2VTZXRJdGVtcy5cbiAgICogQHBhcmFtIGNoYW5nZVNldCBDaGFuZ2VTZXQgd2l0aCBjaGFuZ2VzIHRvIGZpbHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIGZpbHRlckNoYW5nZVNldChjaGFuZ2VTZXQ6IENoYW5nZVNldCk6IENoYW5nZVNldCB7XG4gICAgcmV0dXJuIGV4Y2x1ZGVFbXB0eUNoYW5nZVNldEl0ZW1zKGNoYW5nZVNldCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgZW50aXRpZXMgaW4gdXBkYXRlIGNoYW5nZXMgZnJvbSBAbmdyeCBVcGRhdGU8VD4gc3RydWN0dXJlIHRvIGp1c3QgVC5cbiAgICogUmV2ZXJzZSBvZiByZXN0b3JlVXBkYXRlcygpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGZsYXR0ZW5VcGRhdGVzKGNoYW5nZVNldDogQ2hhbmdlU2V0KTogQ2hhbmdlU2V0IHtcbiAgICBsZXQgY2hhbmdlcyA9IGNoYW5nZVNldC5jaGFuZ2VzO1xuICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYW5nZVNldDtcbiAgICB9XG4gICAgbGV0IGhhc011dGF0ZWQgPSBmYWxzZTtcbiAgICBjaGFuZ2VzID0gY2hhbmdlcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLm9wID09PSB1cGRhdGVPcCAmJiBpdGVtLmVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaGFzTXV0YXRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBlbnRpdGllczogKGl0ZW0gYXMgQ2hhbmdlU2V0VXBkYXRlKS5lbnRpdGllcy5tYXAoKHUpID0+IHUuY2hhbmdlcyksXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH1cbiAgICB9KSBhcyBDaGFuZ2VTZXRJdGVtW107XG4gICAgcmV0dXJuIGhhc011dGF0ZWQgPyB7IC4uLmNoYW5nZVNldCwgY2hhbmdlcyB9IDogY2hhbmdlU2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGZsYXR0ZW5lZCBUIGVudGl0aWVzIGluIHVwZGF0ZSBjaGFuZ2VzIGJhY2sgdG8gQG5ncnggVXBkYXRlPFQ+IHN0cnVjdHVyZXMuXG4gICAqIFJldmVyc2Ugb2YgZmxhdHRlblVwZGF0ZXMoKS5cbiAgICovXG4gIHByb3RlY3RlZCByZXN0b3JlVXBkYXRlcyhjaGFuZ2VTZXQ6IENoYW5nZVNldCk6IENoYW5nZVNldCB7XG4gICAgaWYgKGNoYW5nZVNldCA9PSBudWxsKSB7XG4gICAgICAvLyBOb3RoaW5nPyBTZXJ2ZXIgcHJvYmFibHkgcmVzcG9uZGVkIHdpdGggMjA0IC0gTm8gQ29udGVudCBiZWNhdXNlIGl0IG1hZGUgbm8gY2hhbmdlcyB0byB0aGUgaW5zZXJ0ZWQgb3IgdXBkYXRlZCBlbnRpdGllc1xuICAgICAgcmV0dXJuIGNoYW5nZVNldDtcbiAgICB9XG4gICAgbGV0IGNoYW5nZXMgPSBjaGFuZ2VTZXQuY2hhbmdlcztcbiAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjaGFuZ2VTZXQ7XG4gICAgfVxuICAgIGxldCBoYXNNdXRhdGVkID0gZmFsc2U7XG4gICAgY2hhbmdlcyA9IGNoYW5nZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5vcCA9PT0gdXBkYXRlT3ApIHtcbiAgICAgICAgLy8gVGhlc2UgYXJlIGVudGl0aWVzLCBub3QgVXBkYXRlczsgY29udmVydCBiYWNrIHRvIFVwZGF0ZXNcbiAgICAgICAgaGFzTXV0YXRlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHNlbGVjdElkID0gdGhpcy5nZXRJZFNlbGVjdG9yKGl0ZW0uZW50aXR5TmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBlbnRpdGllczogaXRlbS5lbnRpdGllcy5tYXAoKHU6IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGlkOiBzZWxlY3RJZCh1KSxcbiAgICAgICAgICAgIGNoYW5nZXM6IHUsXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9IGFzIENoYW5nZVNldFVwZGF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfVxuICAgIH0pIGFzIENoYW5nZVNldEl0ZW1bXTtcbiAgICByZXR1cm4gaGFzTXV0YXRlZCA/IHsgLi4uY2hhbmdlU2V0LCBjaGFuZ2VzIH0gOiBjaGFuZ2VTZXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBpZCAocHJpbWFyeSBrZXkpIHNlbGVjdG9yIGZ1bmN0aW9uIGZvciBhbiBlbnRpdHkgdHlwZVxuICAgKiBAcGFyYW0gZW50aXR5TmFtZSBuYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldElkU2VsZWN0b3IoZW50aXR5TmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IGlkU2VsZWN0b3IgPSB0aGlzLmlkU2VsZWN0b3JzW2VudGl0eU5hbWVdO1xuICAgIGlmICghaWRTZWxlY3Rvcikge1xuICAgICAgaWRTZWxlY3RvciA9XG4gICAgICAgIHRoaXMuZW50aXR5RGVmaW5pdGlvblNlcnZpY2UuZ2V0RGVmaW5pdGlvbihlbnRpdHlOYW1lKS5zZWxlY3RJZDtcbiAgICAgIHRoaXMuaWRTZWxlY3RvcnNbZW50aXR5TmFtZV0gPSBpZFNlbGVjdG9yO1xuICAgIH1cbiAgICByZXR1cm4gaWRTZWxlY3RvcjtcbiAgfVxuICAvLyAjZW5kcmVnaW9uIGhlbHBlcnNcbn1cbiJdfQ==