breeze-client 2.1.5-mjs → 2.1.6-mjs

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 (176) hide show
  1. package/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -1
  2. package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +135 -0
  3. package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +135 -0
  4. package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +139 -0
  5. package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +107 -0
  6. package/esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs +461 -0
  7. package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +100 -0
  8. package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +269 -0
  9. package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +241 -0
  10. package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +37 -0
  11. package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +191 -0
  12. package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +421 -0
  13. package/esm2022/src/abstract-data-service-adapter.mjs +294 -0
  14. package/esm2022/src/assert-param.mjs +330 -0
  15. package/esm2022/src/config.mjs +232 -0
  16. package/esm2022/src/core.mjs +712 -0
  17. package/esm2022/src/data-service.mjs +239 -0
  18. package/esm2022/src/data-type.mjs +507 -0
  19. package/esm2022/src/entity-action.mjs +45 -0
  20. package/esm2022/src/entity-aspect.mjs +897 -0
  21. package/esm2022/src/entity-group.mjs +192 -0
  22. package/esm2022/src/entity-key.mjs +127 -0
  23. package/{esm2020 → esm2022}/src/entity-manager.mjs +95 -6
  24. package/esm2022/src/entity-metadata.mjs +2242 -0
  25. package/{esm2020 → esm2022}/src/entity-query.mjs +61 -52
  26. package/esm2022/src/entity-state.mjs +107 -0
  27. package/esm2022/src/enum.mjs +143 -0
  28. package/esm2022/src/event.mjs +264 -0
  29. package/esm2022/src/interface-registry.mjs +39 -0
  30. package/esm2022/src/key-generator.mjs +110 -0
  31. package/{esm2020 → esm2022}/src/local-query-comparison-options.mjs +23 -13
  32. package/esm2022/src/mapping-context.mjs +422 -0
  33. package/esm2022/src/naming-convention.mjs +96 -0
  34. package/esm2022/src/predicate.mjs +1259 -0
  35. package/esm2022/src/query-options.mjs +160 -0
  36. package/esm2022/src/save-options.mjs +51 -0
  37. package/esm2022/src/unattached-children-map.mjs +56 -0
  38. package/esm2022/src/validate.mjs +1002 -0
  39. package/esm2022/src/validation-options.mjs +78 -0
  40. package/{fesm2015 → fesm2022}/breeze-client-adapter-ajax-angularjs.mjs +5 -1
  41. package/{fesm2015 → fesm2022}/breeze-client-adapter-ajax-angularjs.mjs.map +1 -1
  42. package/{fesm2015 → fesm2022}/breeze-client-adapter-ajax-fetch.mjs +4 -2
  43. package/{fesm2015 → fesm2022}/breeze-client-adapter-ajax-fetch.mjs.map +1 -1
  44. package/{fesm2015 → fesm2022}/breeze-client-adapter-ajax-httpclient.mjs +5 -4
  45. package/{fesm2020 → fesm2022}/breeze-client-adapter-ajax-httpclient.mjs.map +1 -1
  46. package/{fesm2015 → fesm2022}/breeze-client-adapter-ajax-jquery.mjs +4 -1
  47. package/{fesm2020 → fesm2022}/breeze-client-adapter-ajax-jquery.mjs.map +1 -1
  48. package/{fesm2020 → fesm2022}/breeze-client-adapter-ajax-post.mjs +0 -1
  49. package/{fesm2015 → fesm2022}/breeze-client-adapter-data-service-odata.mjs +52 -48
  50. package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +1 -0
  51. package/{fesm2020 → fesm2022}/breeze-client-adapter-data-service-webapi.mjs +25 -19
  52. package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
  53. package/{fesm2015 → fesm2022}/breeze-client-adapter-model-library-backing-store.mjs +1 -1
  54. package/{fesm2020 → fesm2022}/breeze-client-adapter-model-library-backing-store.mjs.map +1 -1
  55. package/{fesm2015 → fesm2022}/breeze-client-adapter-model-library-ko.mjs +1 -1
  56. package/{fesm2015 → fesm2022}/breeze-client-adapter-model-library-ko.mjs.map +1 -1
  57. package/{fesm2020 → fesm2022}/breeze-client-adapter-uri-builder-json.mjs +1 -1
  58. package/{fesm2015 → fesm2022}/breeze-client-adapter-uri-builder-json.mjs.map +1 -1
  59. package/{fesm2020 → fesm2022}/breeze-client-adapter-uri-builder-odata.mjs +1 -1
  60. package/{fesm2020 → fesm2022}/breeze-client-adapter-uri-builder-odata.mjs.map +1 -1
  61. package/{fesm2015 → fesm2022}/breeze-client-mixin-get-entity-graph.mjs +0 -1
  62. package/{fesm2015 → fesm2022}/breeze-client-mixin-save-queuing.mjs +22 -2
  63. package/{fesm2015 → fesm2022}/breeze-client-mixin-save-queuing.mjs.map +1 -1
  64. package/{fesm2020 → fesm2022}/breeze-client.mjs +1715 -1124
  65. package/fesm2022/breeze-client.mjs.map +1 -0
  66. package/package.json +44 -76
  67. package/src/abstract-data-service-adapter.d.ts +0 -1
  68. package/src/config.d.ts +1 -1
  69. package/src/core.d.ts +1 -1
  70. package/src/data-type.d.ts +5 -0
  71. package/src/entity-aspect.d.ts +6 -6
  72. package/src/entity-manager.d.ts +4 -4
  73. package/src/entity-metadata.d.ts +39 -29
  74. package/src/entity-state.d.ts +4 -0
  75. package/src/mapping-context.d.ts +1 -1
  76. package/src/predicate.d.ts +4 -7
  77. package/esm2020/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -130
  78. package/esm2020/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -132
  79. package/esm2020/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -137
  80. package/esm2020/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -103
  81. package/esm2020/adapter-data-service-odata/adapter-data-service-odata.mjs +0 -456
  82. package/esm2020/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -93
  83. package/esm2020/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -268
  84. package/esm2020/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -240
  85. package/esm2020/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -36
  86. package/esm2020/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -190
  87. package/esm2020/mixin-save-queuing/mixin-save-queuing.mjs +0 -400
  88. package/esm2020/src/abstract-data-service-adapter.mjs +0 -296
  89. package/esm2020/src/assert-param.mjs +0 -312
  90. package/esm2020/src/config.mjs +0 -223
  91. package/esm2020/src/core.mjs +0 -707
  92. package/esm2020/src/data-service.mjs +0 -203
  93. package/esm2020/src/data-type.mjs +0 -444
  94. package/esm2020/src/entity-action.mjs +0 -45
  95. package/esm2020/src/entity-aspect.mjs +0 -806
  96. package/esm2020/src/entity-group.mjs +0 -187
  97. package/esm2020/src/entity-key.mjs +0 -116
  98. package/esm2020/src/entity-metadata.mjs +0 -2109
  99. package/esm2020/src/entity-state.mjs +0 -99
  100. package/esm2020/src/enum.mjs +0 -141
  101. package/esm2020/src/event.mjs +0 -256
  102. package/esm2020/src/interface-registry.mjs +0 -41
  103. package/esm2020/src/key-generator.mjs +0 -108
  104. package/esm2020/src/mapping-context.mjs +0 -405
  105. package/esm2020/src/naming-convention.mjs +0 -88
  106. package/esm2020/src/predicate.mjs +0 -1232
  107. package/esm2020/src/query-options.mjs +0 -152
  108. package/esm2020/src/save-options.mjs +0 -41
  109. package/esm2020/src/unattached-children-map.mjs +0 -58
  110. package/esm2020/src/validate.mjs +0 -988
  111. package/esm2020/src/validation-options.mjs +0 -64
  112. package/fesm2015/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
  113. package/fesm2015/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
  114. package/fesm2015/breeze-client-adapter-ajax-post.mjs +0 -84
  115. package/fesm2015/breeze-client-adapter-data-service-odata.mjs.map +0 -1
  116. package/fesm2015/breeze-client-adapter-data-service-webapi.mjs +0 -101
  117. package/fesm2015/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
  118. package/fesm2015/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
  119. package/fesm2015/breeze-client-adapter-uri-builder-json.mjs +0 -92
  120. package/fesm2015/breeze-client-adapter-uri-builder-odata.mjs +0 -246
  121. package/fesm2015/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
  122. package/fesm2015/breeze-client.mjs +0 -13604
  123. package/fesm2015/breeze-client.mjs.map +0 -1
  124. package/fesm2020/breeze-client-adapter-ajax-angularjs.mjs +0 -186
  125. package/fesm2020/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
  126. package/fesm2020/breeze-client-adapter-ajax-fetch.mjs +0 -188
  127. package/fesm2020/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
  128. package/fesm2020/breeze-client-adapter-ajax-httpclient.mjs +0 -193
  129. package/fesm2020/breeze-client-adapter-ajax-jquery.mjs +0 -111
  130. package/fesm2020/breeze-client-adapter-ajax-post.mjs.map +0 -1
  131. package/fesm2020/breeze-client-adapter-data-service-odata.mjs +0 -512
  132. package/fesm2020/breeze-client-adapter-data-service-odata.mjs.map +0 -1
  133. package/fesm2020/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
  134. package/fesm2020/breeze-client-adapter-model-library-backing-store.mjs +0 -276
  135. package/fesm2020/breeze-client-adapter-model-library-ko.mjs +0 -248
  136. package/fesm2020/breeze-client-adapter-model-library-ko.mjs.map +0 -1
  137. package/fesm2020/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
  138. package/fesm2020/breeze-client-mixin-get-entity-graph.mjs +0 -255
  139. package/fesm2020/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
  140. package/fesm2020/breeze-client-mixin-save-queuing.mjs +0 -347
  141. package/fesm2020/breeze-client-mixin-save-queuing.mjs.map +0 -1
  142. package/fesm2020/breeze-client.mjs.map +0 -1
  143. package/mjs/README.md +0 -17
  144. /package/{esm2020 → esm2022}/adapter-ajax-angularjs/adapter-core.mjs +0 -0
  145. /package/{esm2020 → esm2022}/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -0
  146. /package/{esm2020 → esm2022}/adapter-ajax-fetch/adapter-core.mjs +0 -0
  147. /package/{esm2020 → esm2022}/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -0
  148. /package/{esm2020 → esm2022}/adapter-ajax-httpclient/adapter-core.mjs +0 -0
  149. /package/{esm2020 → esm2022}/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -0
  150. /package/{esm2020 → esm2022}/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -0
  151. /package/{esm2020 → esm2022}/adapter-ajax-post/adapter-ajax-post.mjs +0 -0
  152. /package/{esm2020 → esm2022}/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -0
  153. /package/{esm2020 → esm2022}/adapter-data-service-odata/adapter-core.mjs +0 -0
  154. /package/{esm2020 → esm2022}/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -0
  155. /package/{esm2020 → esm2022}/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -0
  156. /package/{esm2020 → esm2022}/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -0
  157. /package/{esm2020 → esm2022}/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -0
  158. /package/{esm2020 → esm2022}/adapter-uri-builder-json/adapter-core.mjs +0 -0
  159. /package/{esm2020 → esm2022}/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -0
  160. /package/{esm2020 → esm2022}/adapter-uri-builder-odata/adapter-core.mjs +0 -0
  161. /package/{esm2020 → esm2022}/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -0
  162. /package/{esm2020 → esm2022}/breeze-client.mjs +0 -0
  163. /package/{esm2020 → esm2022}/index.mjs +0 -0
  164. /package/{esm2020 → esm2022}/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -0
  165. /package/{esm2020 → esm2022}/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -0
  166. /package/{esm2020 → esm2022}/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -0
  167. /package/{esm2020 → esm2022}/src/array.mjs +0 -0
  168. /package/{esm2020 → esm2022}/src/breeze.mjs +0 -0
  169. /package/{esm2020 → esm2022}/src/complex-array.mjs +0 -0
  170. /package/{esm2020 → esm2022}/src/csdl-metadata-parser.mjs +0 -0
  171. /package/{esm2020 → esm2022}/src/default-property-interceptor.mjs +0 -0
  172. /package/{esm2020 → esm2022}/src/observable-array.mjs +0 -0
  173. /package/{esm2020 → esm2022}/src/primitive-array.mjs +0 -0
  174. /package/{esm2020 → esm2022}/src/relation-array.mjs +0 -0
  175. /package/{fesm2015 → fesm2022}/breeze-client-adapter-ajax-post.mjs.map +0 -0
  176. /package/{fesm2015 → fesm2022}/breeze-client-mixin-get-entity-graph.mjs.map +0 -0
@@ -1,7 +1,6 @@
1
1
  import * as breeze from 'breeze-client';
2
2
  /** @hidden */
3
3
  export declare class DataServiceODataAdapter extends breeze.AbstractDataServiceAdapter {
4
- name: string;
5
4
  relativeUrl: boolean | ((ds: breeze.DataService, url: string) => string);
6
5
  headers: {
7
6
  DataServiceVersion: string;
@@ -0,0 +1,135 @@
1
+ import { config, core } from 'breeze-client';
2
+ import { appendQueryStringParameter, encodeParams } from './adapter-core';
3
+ export class AjaxAngularjsAdapter {
4
+ name;
5
+ defaultSettings;
6
+ requestInterceptor;
7
+ $http;
8
+ $rootScope;
9
+ constructor() {
10
+ this.name = "angularjs";
11
+ this.defaultSettings = {};
12
+ this.requestInterceptor = undefined;
13
+ // Will set:
14
+ // this.$http;
15
+ // this.$rootScope;
16
+ }
17
+ static register(breezeConfig) {
18
+ breezeConfig = breezeConfig || config;
19
+ breezeConfig.registerAdapter("ajax", AjaxAngularjsAdapter);
20
+ return breezeConfig.initializeAdapterInstance("ajax", "angularjs", true);
21
+ }
22
+ initialize() {
23
+ let ng = core.requireLib("angular");
24
+ if (ng) {
25
+ let $injector = ng.injector(['ng']);
26
+ let http, rootScope;
27
+ $injector.invoke(['$http', '$rootScope', function ($http, $rootScope) {
28
+ http = $http;
29
+ rootScope = $rootScope;
30
+ }]);
31
+ this.$http = http;
32
+ this.$rootScope = rootScope;
33
+ }
34
+ }
35
+ setHttp(http) {
36
+ this.$http = http;
37
+ this.$rootScope = null; // to suppress $rootScope.digest
38
+ }
39
+ ajax(config) {
40
+ if (!this.$http) {
41
+ throw new Error("Unable to locate angularjs for ajax adapter");
42
+ }
43
+ let ngConfig = {
44
+ method: config.type,
45
+ url: config.url,
46
+ dataType: config.dataType,
47
+ contentType: config.contentType,
48
+ crossDomain: config.crossDomain,
49
+ headers: config.headers || {},
50
+ data: undefined
51
+ };
52
+ if (config.params) {
53
+ // Hack: because of the way that Angular handles writing parameters out to the url.
54
+ // so this approach takes over the url param writing completely.
55
+ // See: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
56
+ ngConfig.url = appendQueryStringParameter(ngConfig.url, encodeParams(config.params));
57
+ }
58
+ if (config.data) {
59
+ ngConfig.data = config.data;
60
+ }
61
+ if (!core.isEmpty(this.defaultSettings)) {
62
+ let compositeConfig = core.extend({}, this.defaultSettings);
63
+ ngConfig = core.extend(compositeConfig, ngConfig);
64
+ // extend is shallow; extend headers separately
65
+ let headers = core.extend({}, this.defaultSettings.headers); // copy default headers 1st
66
+ ngConfig.headers = core.extend(headers, ngConfig.headers);
67
+ }
68
+ let requestInfo = {
69
+ adapter: this,
70
+ config: ngConfig,
71
+ dsaConfig: config,
72
+ success: successFn,
73
+ error: errorFn,
74
+ responseSuccess: responseSuccessFn,
75
+ responseError: responseErrorFn // adapter's error callback (ng 1.6+)
76
+ };
77
+ if (core.isFunction(this.requestInterceptor)) {
78
+ let ri = this.requestInterceptor;
79
+ ri(requestInfo);
80
+ if (ri.oneTime) {
81
+ this.requestInterceptor = undefined;
82
+ }
83
+ }
84
+ if (requestInfo.config) { // exists unless requestInterceptor killed it.
85
+ let prom = this.$http(requestInfo.config);
86
+ if (prom.success) {
87
+ // response for ng < 1.6
88
+ prom.success(requestInfo.success).error(requestInfo.error);
89
+ }
90
+ else {
91
+ // response for ng 1.6+
92
+ prom.then(requestInfo.responseSuccess).catch(requestInfo.responseError);
93
+ }
94
+ this.$rootScope && this.$rootScope.$digest();
95
+ }
96
+ function responseSuccessFn(response) {
97
+ return successFn(response.data, response.status, response.headers, response.config, response.statusText);
98
+ }
99
+ function successFn(data, status, headers, xconfig, statusText) {
100
+ // HACK: because $http returns a server side null as a string containing "null" - this is WRONG.
101
+ if (data === "null")
102
+ data = null;
103
+ let httpResponse = {
104
+ config: config,
105
+ data: data,
106
+ getHeaders: headers,
107
+ ngConfig: xconfig,
108
+ status: status,
109
+ statusText: statusText
110
+ };
111
+ config.success(httpResponse);
112
+ }
113
+ function responseErrorFn(response) {
114
+ return errorFn(response.data, response.status, response.headers, response.config, response.statusText);
115
+ }
116
+ function errorFn(data, status, headers, xconfig, statusText) {
117
+ // Timeout appears as an error with status===0 and no data.
118
+ // Make it better
119
+ if (status === 0 && data == null) {
120
+ data = 'timeout';
121
+ }
122
+ let httpResponse = {
123
+ config: config,
124
+ data: data,
125
+ getHeaders: headers,
126
+ ngConfig: xconfig,
127
+ status: status,
128
+ statusText: statusText
129
+ };
130
+ config.error(httpResponse);
131
+ }
132
+ }
133
+ }
134
+ config.registerAdapter("ajax", AjaxAngularjsAdapter);
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1hamF4LWFuZ3VsYXJqcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGVyLWFqYXgtYW5ndWxhcmpzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUQsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUUsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixJQUFJLENBQVM7SUFDYixlQUFlLENBQTJDO0lBQzFELGtCQUFrQixDQUEwQjtJQUM1QyxLQUFLLENBQU07SUFDWCxVQUFVLENBQU07SUFDaEI7UUFDRSxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIscUJBQXFCO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQTJCO1FBQ3pDLFlBQVksR0FBRyxZQUFZLElBQUksTUFBTSxDQUFDO1FBQ3RDLFlBQVksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDM0QsT0FBTyxZQUFZLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQXlCLENBQUM7SUFDbkcsQ0FBQztJQUVELFVBQVU7UUFFUixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksRUFBRSxFQUFFO1lBQ04sSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxJQUFTLEVBQUUsU0FBYyxDQUFDO1lBQzlCLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsS0FBVSxFQUFFLFVBQWU7b0JBQzVFLElBQUksR0FBRyxLQUFLLENBQUM7b0JBQ2IsU0FBUyxHQUFHLFVBQVUsQ0FBQztnQkFDekIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1NBQzdCO0lBRUgsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFTO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxnQ0FBZ0M7SUFDMUQsQ0FBQztJQUdELElBQUksQ0FBQyxNQUFXO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7U0FDaEU7UUFDRCxJQUFJLFFBQVEsR0FBRztZQUNiLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNuQixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7WUFDZixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1lBQy9CLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztZQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFO1lBQzdCLElBQUksRUFBRSxTQUFnQjtTQUN2QixDQUFDO1FBRUYsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2pCLG1GQUFtRjtZQUNuRixnRUFBZ0U7WUFDaEUsNkZBQTZGO1lBQzdGLFFBQVEsQ0FBQyxHQUFHLEdBQUcsMEJBQTBCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDdEY7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDZixRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDN0I7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDdkMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzVELFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQVEsQ0FBQztZQUN6RCwrQ0FBK0M7WUFDL0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDJCQUEyQjtZQUN4RixRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMzRDtRQUVELElBQUksV0FBVyxHQUFHO1lBQ2hCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsTUFBTSxFQUFFLFFBQVE7WUFDaEIsU0FBUyxFQUFFLE1BQU07WUFDakIsT0FBTyxFQUFFLFNBQVM7WUFDbEIsS0FBSyxFQUFFLE9BQU87WUFDZCxlQUFlLEVBQUUsaUJBQWlCO1lBQ2xDLGFBQWEsRUFBRSxlQUFlLENBQU0scUNBQXFDO1NBQzFFLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7WUFDNUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUF5QixDQUFDO1lBQ3hDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQzthQUNyQztTQUNGO1FBRUQsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLEVBQUUsOENBQThDO1lBQ3RFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsZ0NBQWdDO2dCQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzVEO2lCQUFNO2dCQUNMLHVCQUF1QjtnQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN6RTtZQUNELElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM5QztRQUVELFNBQVMsaUJBQWlCLENBQUMsUUFBYTtZQUN0QyxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBRUQsU0FBUyxTQUFTLENBQUMsSUFBUyxFQUFFLE1BQVcsRUFBRSxPQUFZLEVBQUUsT0FBWSxFQUFFLFVBQWtCO1lBQ3ZGLGdHQUFnRztZQUNoRyxJQUFJLElBQUksS0FBSyxNQUFNO2dCQUFFLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxZQUFZLEdBQUc7Z0JBQ2pCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxJQUFJO2dCQUNWLFVBQVUsRUFBRSxPQUFPO2dCQUNuQixRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsVUFBVSxFQUFFLFVBQVU7YUFDdkIsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVELFNBQVMsZUFBZSxDQUFDLFFBQWE7WUFDcEMsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUVELFNBQVMsT0FBTyxDQUFDLElBQVMsRUFBRSxNQUFXLEVBQUUsT0FBWSxFQUFFLE9BQVksRUFBRSxVQUFrQjtZQUNyRiwyREFBMkQ7WUFDM0QsaUJBQWlCO1lBQ2pCLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO2dCQUNoQyxJQUFJLEdBQUcsU0FBUyxDQUFDO2FBQ2xCO1lBQ0QsSUFBSSxZQUFZLEdBQUc7Z0JBQ2pCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxJQUFJO2dCQUNWLFVBQVUsRUFBRSxPQUFPO2dCQUNuQixRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsVUFBVSxFQUFFLFVBQVU7YUFDdkIsQ0FBQztZQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBamF4QWRhcHRlciwgQWpheFJlcXVlc3RJbnRlcmNlcHRvciwgQnJlZXplQ29uZmlnLCBjb25maWcsIGNvcmUgfSBmcm9tICdicmVlemUtY2xpZW50JztcclxuaW1wb3J0IHsgYXBwZW5kUXVlcnlTdHJpbmdQYXJhbWV0ZXIsIGVuY29kZVBhcmFtcyB9IGZyb20gJy4vYWRhcHRlci1jb3JlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBBamF4QW5ndWxhcmpzQWRhcHRlciBpbXBsZW1lbnRzIEFqYXhBZGFwdGVyIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZGVmYXVsdFNldHRpbmdzOiB7IGhlYWRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSB9O1xyXG4gIHJlcXVlc3RJbnRlcmNlcHRvcj86IEFqYXhSZXF1ZXN0SW50ZXJjZXB0b3I7XHJcbiAgJGh0dHA6IGFueTtcclxuICAkcm9vdFNjb3BlOiBhbnk7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLm5hbWUgPSBcImFuZ3VsYXJqc1wiO1xyXG4gICAgdGhpcy5kZWZhdWx0U2V0dGluZ3MgPSB7fTtcclxuICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gV2lsbCBzZXQ6XHJcbiAgICAvLyAgIHRoaXMuJGh0dHA7XHJcbiAgICAvLyAgIHRoaXMuJHJvb3RTY29wZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByZWdpc3RlcihicmVlemVDb25maWc/OiBCcmVlemVDb25maWcpIHtcclxuICAgIGJyZWV6ZUNvbmZpZyA9IGJyZWV6ZUNvbmZpZyB8fCBjb25maWc7XHJcbiAgICBicmVlemVDb25maWcucmVnaXN0ZXJBZGFwdGVyKFwiYWpheFwiLCBBamF4QW5ndWxhcmpzQWRhcHRlcik7XHJcbiAgICByZXR1cm4gYnJlZXplQ29uZmlnLmluaXRpYWxpemVBZGFwdGVySW5zdGFuY2UoXCJhamF4XCIsIFwiYW5ndWxhcmpzXCIsIHRydWUpIGFzIEFqYXhBbmd1bGFyanNBZGFwdGVyO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZSgpIHtcclxuXHJcbiAgICBsZXQgbmcgPSBjb3JlLnJlcXVpcmVMaWIoXCJhbmd1bGFyXCIpO1xyXG4gICAgaWYgKG5nKSB7XHJcbiAgICAgIGxldCAkaW5qZWN0b3IgPSBuZy5pbmplY3RvcihbJ25nJ10pO1xyXG4gICAgICBsZXQgaHR0cDogYW55LCByb290U2NvcGU6IGFueTtcclxuICAgICAgJGluamVjdG9yLmludm9rZShbJyRodHRwJywgJyRyb290U2NvcGUnLCBmdW5jdGlvbiAoJGh0dHA6IGFueSwgJHJvb3RTY29wZTogYW55KSB7XHJcbiAgICAgICAgaHR0cCA9ICRodHRwO1xyXG4gICAgICAgIHJvb3RTY29wZSA9ICRyb290U2NvcGU7XHJcbiAgICAgIH1dKTtcclxuICAgICAgdGhpcy4kaHR0cCA9IGh0dHA7XHJcbiAgICAgIHRoaXMuJHJvb3RTY29wZSA9IHJvb3RTY29wZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzZXRIdHRwKGh0dHA6IGFueSkge1xyXG4gICAgdGhpcy4kaHR0cCA9IGh0dHA7XHJcbiAgICB0aGlzLiRyb290U2NvcGUgPSBudWxsOyAvLyB0byBzdXBwcmVzcyAkcm9vdFNjb3BlLmRpZ2VzdFxyXG4gIH1cclxuXHJcblxyXG4gIGFqYXgoY29uZmlnOiBhbnkpIHtcclxuICAgIGlmICghdGhpcy4kaHR0cCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gbG9jYXRlIGFuZ3VsYXJqcyBmb3IgYWpheCBhZGFwdGVyXCIpO1xyXG4gICAgfVxyXG4gICAgbGV0IG5nQ29uZmlnID0ge1xyXG4gICAgICBtZXRob2Q6IGNvbmZpZy50eXBlLFxyXG4gICAgICB1cmw6IGNvbmZpZy51cmwsXHJcbiAgICAgIGRhdGFUeXBlOiBjb25maWcuZGF0YVR5cGUsXHJcbiAgICAgIGNvbnRlbnRUeXBlOiBjb25maWcuY29udGVudFR5cGUsXHJcbiAgICAgIGNyb3NzRG9tYWluOiBjb25maWcuY3Jvc3NEb21haW4sXHJcbiAgICAgIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzIHx8IHt9LFxyXG4gICAgICBkYXRhOiB1bmRlZmluZWQgYXMgYW55XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChjb25maWcucGFyYW1zKSB7XHJcbiAgICAgIC8vIEhhY2s6IGJlY2F1c2Ugb2YgdGhlIHdheSB0aGF0IEFuZ3VsYXIgaGFuZGxlcyB3cml0aW5nIHBhcmFtZXRlcnMgb3V0IHRvIHRoZSB1cmwuXHJcbiAgICAgIC8vIHNvIHRoaXMgYXBwcm9hY2ggdGFrZXMgb3ZlciB0aGUgdXJsIHBhcmFtIHdyaXRpbmcgY29tcGxldGVseS5cclxuICAgICAgLy8gU2VlOiBodHRwOi8vdmljdG9yYmxvZy5jb20vMjAxMi8xMi8yMC9tYWtlLWFuZ3VsYXJqcy1odHRwLXNlcnZpY2UtYmVoYXZlLWxpa2UtanF1ZXJ5LWFqYXgvXHJcbiAgICAgIG5nQ29uZmlnLnVybCA9IGFwcGVuZFF1ZXJ5U3RyaW5nUGFyYW1ldGVyKG5nQ29uZmlnLnVybCwgZW5jb2RlUGFyYW1zKGNvbmZpZy5wYXJhbXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLmRhdGEpIHtcclxuICAgICAgbmdDb25maWcuZGF0YSA9IGNvbmZpZy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29yZS5pc0VtcHR5KHRoaXMuZGVmYXVsdFNldHRpbmdzKSkge1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZmlnID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzKTtcclxuICAgICAgbmdDb25maWcgPSBjb3JlLmV4dGVuZChjb21wb3NpdGVDb25maWcsIG5nQ29uZmlnKSBhcyBhbnk7XHJcbiAgICAgIC8vIGV4dGVuZCBpcyBzaGFsbG93OyBleHRlbmQgaGVhZGVycyBzZXBhcmF0ZWx5XHJcbiAgICAgIGxldCBoZWFkZXJzID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzLmhlYWRlcnMpOyAvLyBjb3B5IGRlZmF1bHQgaGVhZGVycyAxc3RcclxuICAgICAgbmdDb25maWcuaGVhZGVycyA9IGNvcmUuZXh0ZW5kKGhlYWRlcnMsIG5nQ29uZmlnLmhlYWRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXF1ZXN0SW5mbyA9IHtcclxuICAgICAgYWRhcHRlcjogdGhpcywgICAgICAvLyB0aGlzIGFkYXB0ZXJcclxuICAgICAgY29uZmlnOiBuZ0NvbmZpZywgICAvLyBhbmd1bGFyJ3MgJGh0dHAgY29uZmlndXJhdGlvbiBvYmplY3RcclxuICAgICAgZHNhQ29uZmlnOiBjb25maWcsICAvLyB0aGUgY29uZmlnIGFyZyBmcm9tIHRoZSBjYWxsaW5nIEJyZWV6ZSBEYXRhU2VydmljZUFkYXB0ZXJcclxuICAgICAgc3VjY2Vzczogc3VjY2Vzc0ZuLCAvLyBhZGFwdGVyJ3Mgc3VjY2VzcyBjYWxsYmFja1xyXG4gICAgICBlcnJvcjogZXJyb3JGbiwgICAgICAvLyBhZGFwdGVyJ3MgZXJyb3IgY2FsbGJhY2tcclxuICAgICAgcmVzcG9uc2VTdWNjZXNzOiByZXNwb25zZVN1Y2Nlc3NGbiwgLy8gYWRhcHRlcidzIHN1Y2Nlc3MgY2FsbGJhY2sgKG5nIDEuNispXHJcbiAgICAgIHJlc3BvbnNlRXJyb3I6IHJlc3BvbnNlRXJyb3JGbiAgICAgIC8vIGFkYXB0ZXIncyBlcnJvciBjYWxsYmFjayAobmcgMS42KylcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGNvcmUuaXNGdW5jdGlvbih0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcikpIHtcclxuICAgICAgbGV0IHJpID0gdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IgYXMgYW55O1xyXG4gICAgICByaShyZXF1ZXN0SW5mbyk7XHJcbiAgICAgIGlmIChyaS5vbmVUaW1lKSB7XHJcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVxdWVzdEluZm8uY29uZmlnKSB7IC8vIGV4aXN0cyB1bmxlc3MgcmVxdWVzdEludGVyY2VwdG9yIGtpbGxlZCBpdC5cclxuICAgICAgbGV0IHByb20gPSB0aGlzLiRodHRwKHJlcXVlc3RJbmZvLmNvbmZpZyk7XHJcbiAgICAgIGlmIChwcm9tLnN1Y2Nlc3MpIHtcclxuICAgICAgICAvLyByZXNwb25zZSBmb3IgbmcgPCAxLjYgICAgICAgIFxyXG4gICAgICAgIHByb20uc3VjY2VzcyhyZXF1ZXN0SW5mby5zdWNjZXNzKS5lcnJvcihyZXF1ZXN0SW5mby5lcnJvcik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gcmVzcG9uc2UgZm9yIG5nIDEuNitcclxuICAgICAgICBwcm9tLnRoZW4ocmVxdWVzdEluZm8ucmVzcG9uc2VTdWNjZXNzKS5jYXRjaChyZXF1ZXN0SW5mby5yZXNwb25zZUVycm9yKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLiRyb290U2NvcGUgJiYgdGhpcy4kcm9vdFNjb3BlLiRkaWdlc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZXNwb25zZVN1Y2Nlc3NGbihyZXNwb25zZTogYW55KSB7XHJcbiAgICAgIHJldHVybiBzdWNjZXNzRm4ocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLCByZXNwb25zZS5jb25maWcsIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHN1Y2Nlc3NGbihkYXRhOiBhbnksIHN0YXR1czogYW55LCBoZWFkZXJzOiBhbnksIHhjb25maWc6IGFueSwgc3RhdHVzVGV4dDogc3RyaW5nKSB7XHJcbiAgICAgIC8vIEhBQ0s6IGJlY2F1c2UgJGh0dHAgcmV0dXJucyBhIHNlcnZlciBzaWRlIG51bGwgYXMgYSBzdHJpbmcgY29udGFpbmluZyBcIm51bGxcIiAtIHRoaXMgaXMgV1JPTkcuXHJcbiAgICAgIGlmIChkYXRhID09PSBcIm51bGxcIikgZGF0YSA9IG51bGw7XHJcbiAgICAgIGxldCBodHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgY29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICBnZXRIZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgIG5nQ29uZmlnOiB4Y29uZmlnLFxyXG4gICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHRcclxuICAgICAgfTtcclxuICAgICAgY29uZmlnLnN1Y2Nlc3MoaHR0cFJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZXNwb25zZUVycm9yRm4ocmVzcG9uc2U6IGFueSkge1xyXG4gICAgICByZXR1cm4gZXJyb3JGbihyZXNwb25zZS5kYXRhLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMsIHJlc3BvbnNlLmNvbmZpZywgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZXJyb3JGbihkYXRhOiBhbnksIHN0YXR1czogYW55LCBoZWFkZXJzOiBhbnksIHhjb25maWc6IGFueSwgc3RhdHVzVGV4dDogc3RyaW5nKSB7XHJcbiAgICAgIC8vIFRpbWVvdXQgYXBwZWFycyBhcyBhbiBlcnJvciB3aXRoIHN0YXR1cz09PTAgYW5kIG5vIGRhdGEuXHJcbiAgICAgIC8vIE1ha2UgaXQgYmV0dGVyXHJcbiAgICAgIGlmIChzdGF0dXMgPT09IDAgJiYgZGF0YSA9PSBudWxsKSB7XHJcbiAgICAgICAgZGF0YSA9ICd0aW1lb3V0JztcclxuICAgICAgfVxyXG4gICAgICBsZXQgaHR0cFJlc3BvbnNlID0ge1xyXG4gICAgICAgIGNvbmZpZzogY29uZmlnLFxyXG4gICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgZ2V0SGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICBuZ0NvbmZpZzogeGNvbmZpZyxcclxuICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICBzdGF0dXNUZXh0OiBzdGF0dXNUZXh0XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbmZpZy5lcnJvcihodHRwUmVzcG9uc2UpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuY29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImFqYXhcIiwgQWpheEFuZ3VsYXJqc0FkYXB0ZXIpO1xyXG4iXX0=
@@ -0,0 +1,135 @@
1
+ import { config, core } from 'breeze-client';
2
+ import { appendQueryStringParameter, encodeParams } from './adapter-core';
3
+ /** Breeze AJAX adapter using fetch API
4
+ * See https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
5
+ */
6
+ export class AjaxFetchAdapter {
7
+ static adapterName = "fetch";
8
+ name;
9
+ defaultSettings;
10
+ requestInterceptor;
11
+ constructor() {
12
+ this.name = AjaxFetchAdapter.adapterName;
13
+ this.defaultSettings = {};
14
+ this.requestInterceptor = undefined;
15
+ }
16
+ static register(breezeConfig) {
17
+ breezeConfig = breezeConfig || config;
18
+ breezeConfig.registerAdapter("ajax", AjaxFetchAdapter);
19
+ return breezeConfig.initializeAdapterInstance("ajax", AjaxFetchAdapter.adapterName, true);
20
+ }
21
+ initialize() {
22
+ }
23
+ ajax(config) {
24
+ if (!fetch) {
25
+ throw new Error("fetch API not supported in this browser");
26
+ }
27
+ let init = {
28
+ method: config.type,
29
+ mode: 'cors',
30
+ cache: 'no-cache',
31
+ credentials: 'include',
32
+ headers: {
33
+ 'Content-Type': config.contentType || 'application/json',
34
+ // ...config.headers
35
+ // 'Content-Type': 'application/x-www-form-urlencoded',
36
+ },
37
+ redirect: 'follow',
38
+ referrer: 'client', // no-referrer, *client
39
+ };
40
+ if (config.type !== "GET" && config.type !== "HEAD") {
41
+ // body data type must match "Content-Type" header
42
+ // let data = config.params || config.data;
43
+ let data = config.data;
44
+ if (typeof (data) !== "string") {
45
+ data = JSON.stringify(data);
46
+ }
47
+ init.body = data;
48
+ }
49
+ let url = config.url;
50
+ if (!core.isEmpty(config.params)) {
51
+ // Hack: Not sure how Fetch handles writing 'search' parameters to the url.
52
+ // so this approach takes over the url param writing completely.
53
+ url = appendQueryStringParameter(url, encodeParams(config.params));
54
+ }
55
+ if (!core.isEmpty(this.defaultSettings)) {
56
+ let compositeConfig = core.extend({}, this.defaultSettings);
57
+ init = core.extend(compositeConfig, init);
58
+ // extend is shallow; extend headers separately
59
+ let headers = core.extend({}, this.defaultSettings.headers); // copy default headers 1st
60
+ init.headers = core.extend(headers, init.headers);
61
+ }
62
+ let requestInfo = {
63
+ adapter: this,
64
+ config: init,
65
+ dsaConfig: config,
66
+ success: successFn,
67
+ error: errorFn, // adapter's error callback
68
+ };
69
+ if (core.isFunction(this.requestInterceptor)) {
70
+ let ri = this.requestInterceptor;
71
+ ri(requestInfo);
72
+ if (ri.oneTime) {
73
+ this.requestInterceptor = undefined;
74
+ }
75
+ }
76
+ if (requestInfo.config) { // exists unless requestInterceptor killed it.
77
+ fetch(url, requestInfo.config).then(response => {
78
+ if (!response.ok) {
79
+ response.text().then(s => {
80
+ requestInfo.error(response.status, response.statusText, s, response, null);
81
+ });
82
+ }
83
+ else {
84
+ response.json().then(j => {
85
+ requestInfo.success(j, response.statusText, response);
86
+ });
87
+ }
88
+ }).catch(err => {
89
+ requestInfo.error(0, err && err.message || err, null, null, err);
90
+ });
91
+ }
92
+ function successFn(data, statusText, response) {
93
+ let httpResponse = {
94
+ config: config,
95
+ data: data,
96
+ getHeaders: getHeadersFn(response),
97
+ status: response.status,
98
+ statusText: statusText
99
+ };
100
+ config.success(httpResponse);
101
+ }
102
+ function errorFn(status, statusText, body, response, errorThrown) {
103
+ let httpResponse = {
104
+ config: config,
105
+ data: body,
106
+ error: errorThrown || statusText,
107
+ getHeaders: getHeadersFn(response),
108
+ status: status,
109
+ statusText: statusText
110
+ };
111
+ config.error(httpResponse);
112
+ }
113
+ }
114
+ }
115
+ config.registerAdapter("ajax", AjaxFetchAdapter);
116
+ function getHeadersFn(response) {
117
+ if (!response || response.status === 0) { // timeout or abort; no headers
118
+ return function (headerName) {
119
+ return (headerName && headerName.length > 0) ? "" : {};
120
+ };
121
+ }
122
+ else {
123
+ return function (headerName) {
124
+ if (headerName && headerName.length > 0) {
125
+ return response.headers.get(headerName);
126
+ }
127
+ let hob = {};
128
+ response.headers.forEach((val, key) => {
129
+ hob[key] = val;
130
+ });
131
+ return hob;
132
+ };
133
+ }
134
+ }
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1hamF4LWZldGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXItYWpheC1mZXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFFOztFQUVFO0FBQ0YsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixNQUFNLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztJQUM3QixJQUFJLENBQVM7SUFDYixlQUFlLENBQTJDO0lBQzFELGtCQUFrQixDQUEwQjtJQUU1QztRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBMkI7UUFDekMsWUFBWSxHQUFHLFlBQVksSUFBSSxNQUFNLENBQUM7UUFDdEMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUN2RCxPQUFPLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBcUIsQ0FBQztJQUNoSCxDQUFDO0lBRUQsVUFBVTtJQUNWLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBa0I7UUFDckIsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztTQUM1RDtRQUVELElBQUksSUFBSSxHQUFnQjtZQUN0QixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDbkIsSUFBSSxFQUFFLE1BQU07WUFD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QUFDOztBQUdILE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFFakQsU0FBUyxZQUFZLENBQUMsUUFBa0I7SUFDdEMsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxFQUFFLCtCQUErQjtRQUN2RSxPQUFPLFVBQVUsVUFBa0I7WUFDakMsT0FBTyxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxDQUFDLENBQUM7S0FDSDtTQUFNO1FBQ0wsT0FBTyxVQUFVLFVBQWtCO1lBQ2pDLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN2QyxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ3BDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQztLQUNIO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFqYXhBZGFwdGVyLCBBamF4Q29uZmlnLCBBamF4UmVxdWVzdEludGVyY2VwdG9yLCBCcmVlemVDb25maWcsIGNvbmZpZywgY29yZSB9IGZyb20gJ2JyZWV6ZS1jbGllbnQnO1xyXG5pbXBvcnQgeyBhcHBlbmRRdWVyeVN0cmluZ1BhcmFtZXRlciwgZW5jb2RlUGFyYW1zIH0gZnJvbSAnLi9hZGFwdGVyLWNvcmUnO1xyXG5cclxuLyoqIEJyZWV6ZSBBSkFYIGFkYXB0ZXIgdXNpbmcgZmV0Y2ggQVBJIFxyXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZldGNoX0FQSS9Vc2luZ19GZXRjaFxyXG4qL1xyXG5leHBvcnQgY2xhc3MgQWpheEZldGNoQWRhcHRlciBpbXBsZW1lbnRzIEFqYXhBZGFwdGVyIHtcclxuICBzdGF0aWMgYWRhcHRlck5hbWUgPSBcImZldGNoXCI7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGRlZmF1bHRTZXR0aW5nczogeyBoZWFkZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gfTtcclxuICByZXF1ZXN0SW50ZXJjZXB0b3I/OiBBamF4UmVxdWVzdEludGVyY2VwdG9yO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMubmFtZSA9IEFqYXhGZXRjaEFkYXB0ZXIuYWRhcHRlck5hbWU7XHJcbiAgICB0aGlzLmRlZmF1bHRTZXR0aW5ncyA9IHsgfTtcclxuICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlZ2lzdGVyKGJyZWV6ZUNvbmZpZz86IEJyZWV6ZUNvbmZpZykge1xyXG4gICAgYnJlZXplQ29uZmlnID0gYnJlZXplQ29uZmlnIHx8IGNvbmZpZztcclxuICAgIGJyZWV6ZUNvbmZpZy5yZWdpc3RlckFkYXB0ZXIoXCJhamF4XCIsIEFqYXhGZXRjaEFkYXB0ZXIpO1xyXG4gICAgcmV0dXJuIGJyZWV6ZUNvbmZpZy5pbml0aWFsaXplQWRhcHRlckluc3RhbmNlKFwiYWpheFwiLCBBamF4RmV0Y2hBZGFwdGVyLmFkYXB0ZXJOYW1lLCB0cnVlKSBhcyBBamF4RmV0Y2hBZGFwdGVyO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZSgpIHtcclxuICB9XHJcblxyXG4gIGFqYXgoY29uZmlnOiBBamF4Q29uZmlnKSB7XHJcbiAgICBpZiAoIWZldGNoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZldGNoIEFQSSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaW5pdDogUmVxdWVzdEluaXQgPSB7XHJcbiAgICAgIG1ldGhvZDogY29uZmlnLnR5cGUsIC8vICpHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBldGMuXHJcbiAgICAgIG1vZGU6ICdjb3JzJywgLy8gbm8tY29ycywgKmNvcnMsIHNhbWUtb3JpZ2luXHJcbiAgICAgIGNhY2hlOiAnbm8tY2FjaGUnLCAvLyAqZGVmYXVsdCwgbm8tY2FjaGUsIHJlbG9hZCwgZm9yY2UtY2FjaGUsIG9ubHktaWYtY2FjaGVkXHJcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsIC8vIGluY2x1ZGUsICpzYW1lLW9yaWdpbiwgb21pdFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGNvbmZpZy5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgLy8gLi4uY29uZmlnLmhlYWRlcnNcclxuICAgICAgICAvLyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gbWFudWFsLCAqZm9sbG93LCBlcnJvclxyXG4gICAgICByZWZlcnJlcjogJ2NsaWVudCcsIC8vIG5vLXJlZmVycmVyLCAqY2xpZW50XHJcbiAgICB9O1xyXG4gICAgaWYgKGNvbmZpZy50eXBlICE9PSBcIkdFVFwiICYmIGNvbmZpZy50eXBlICE9PSBcIkhFQURcIikge1xyXG4gICAgICAvLyBib2R5IGRhdGEgdHlwZSBtdXN0IG1hdGNoIFwiQ29udGVudC1UeXBlXCIgaGVhZGVyXHJcbiAgICAgIC8vIGxldCBkYXRhID0gY29uZmlnLnBhcmFtcyB8fCBjb25maWcuZGF0YTtcclxuICAgICAgbGV0IGRhdGEgPSBjb25maWcuZGF0YTtcclxuICAgICAgaWYgKHR5cGVvZihkYXRhKSAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICBpbml0LmJvZHkgPSBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB1cmwgPSBjb25maWcudXJsO1xyXG4gICAgaWYgKCFjb3JlLmlzRW1wdHkoY29uZmlnLnBhcmFtcykpIHtcclxuICAgICAgLy8gSGFjazogTm90IHN1cmUgaG93IEZldGNoIGhhbmRsZXMgd3JpdGluZyAnc2VhcmNoJyBwYXJhbWV0ZXJzIHRvIHRoZSB1cmwuXHJcbiAgICAgIC8vIHNvIHRoaXMgYXBwcm9hY2ggdGFrZXMgb3ZlciB0aGUgdXJsIHBhcmFtIHdyaXRpbmcgY29tcGxldGVseS5cclxuICAgICAgdXJsID0gYXBwZW5kUXVlcnlTdHJpbmdQYXJhbWV0ZXIodXJsLCBlbmNvZGVQYXJhbXMoY29uZmlnLnBhcmFtcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29yZS5pc0VtcHR5KHRoaXMuZGVmYXVsdFNldHRpbmdzKSkge1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZmlnID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzKTtcclxuICAgICAgaW5pdCA9IGNvcmUuZXh0ZW5kKGNvbXBvc2l0ZUNvbmZpZywgaW5pdCkgYXMgYW55O1xyXG4gICAgICAvLyBleHRlbmQgaXMgc2hhbGxvdzsgZXh0ZW5kIGhlYWRlcnMgc2VwYXJhdGVseVxyXG4gICAgICBsZXQgaGVhZGVycyA9IGNvcmUuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRTZXR0aW5ncy5oZWFkZXJzKTsgLy8gY29weSBkZWZhdWx0IGhlYWRlcnMgMXN0XHJcbiAgICAgIGluaXQuaGVhZGVycyA9IGNvcmUuZXh0ZW5kKGhlYWRlcnMsIGluaXQuaGVhZGVycykgYXMgYW55O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXF1ZXN0SW5mbyA9IHtcclxuICAgICAgYWRhcHRlcjogdGhpcywgICAgICAvLyB0aGlzIGFkYXB0ZXJcclxuICAgICAgY29uZmlnOiBpbml0LCAgIC8vIGZldGNoIGFwaSAnaW5pdCcgb2JqZWN0XHJcbiAgICAgIGRzYUNvbmZpZzogY29uZmlnLCAgLy8gdGhlIGNvbmZpZyBhcmcgZnJvbSB0aGUgY2FsbGluZyBCcmVlemUgRGF0YVNlcnZpY2VBZGFwdGVyXHJcbiAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NGbiwgLy8gYWRhcHRlcidzIHN1Y2Nlc3MgY2FsbGJhY2tcclxuICAgICAgZXJyb3I6IGVycm9yRm4sICAgICAgLy8gYWRhcHRlcidzIGVycm9yIGNhbGxiYWNrXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChjb3JlLmlzRnVuY3Rpb24odGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IpKSB7XHJcbiAgICAgIGxldCByaSA9IHRoaXMucmVxdWVzdEludGVyY2VwdG9yIGFzIGFueTtcclxuICAgICAgcmkocmVxdWVzdEluZm8pO1xyXG4gICAgICBpZiAocmkub25lVGltZSkge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RJbmZvLmNvbmZpZykgeyAvLyBleGlzdHMgdW5sZXNzIHJlcXVlc3RJbnRlcmNlcHRvciBraWxsZWQgaXQuXHJcbiAgICAgIGZldGNoKHVybCwgcmVxdWVzdEluZm8uY29uZmlnKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICByZXNwb25zZS50ZXh0KCkudGhlbihzID0+IHtcclxuICAgICAgICAgICAgcmVxdWVzdEluZm8uZXJyb3IocmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5zdGF0dXNUZXh0LCBzLCByZXNwb25zZSwgbnVsbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzcG9uc2UuanNvbigpLnRoZW4oaiA9PiB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RJbmZvLnN1Y2Nlc3MoaiwgcmVzcG9uc2Uuc3RhdHVzVGV4dCwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIHJlcXVlc3RJbmZvLmVycm9yKDAsIGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIsIG51bGwsIG51bGwsIGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHN1Y2Nlc3NGbihkYXRhOiBhbnksIHN0YXR1c1RleHQ6IHN0cmluZywgcmVzcG9uc2U6IFJlc3BvbnNlKSB7XHJcbiAgICAgIGxldCBodHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgY29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICBnZXRIZWFkZXJzOiBnZXRIZWFkZXJzRm4ocmVzcG9uc2UpLFxyXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHRcclxuICAgICAgfTtcclxuICAgICAgY29uZmlnLnN1Y2Nlc3MoaHR0cFJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBlcnJvckZuKHN0YXR1czogbnVtYmVyLCBzdGF0dXNUZXh0OiBzdHJpbmcsIGJvZHk6IHN0cmluZywgcmVzcG9uc2U6IFJlc3BvbnNlLCBlcnJvclRocm93bjogYW55KSB7XHJcbiAgICAgIGxldCBodHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgY29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgZGF0YTogYm9keSxcclxuICAgICAgICBlcnJvcjogZXJyb3JUaHJvd24gfHwgc3RhdHVzVGV4dCxcclxuICAgICAgICBnZXRIZWFkZXJzOiBnZXRIZWFkZXJzRm4ocmVzcG9uc2UpLFxyXG4gICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHRcclxuICAgICAgfTtcclxuICAgICAgY29uZmlnLmVycm9yKGh0dHBSZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jb25maWcucmVnaXN0ZXJBZGFwdGVyKFwiYWpheFwiLCBBamF4RmV0Y2hBZGFwdGVyKTtcclxuXHJcbmZ1bmN0aW9uIGdldEhlYWRlcnNGbihyZXNwb25zZTogUmVzcG9uc2UpOiBhbnkge1xyXG4gIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAwKSB7IC8vIHRpbWVvdXQgb3IgYWJvcnQ7IG5vIGhlYWRlcnNcclxuICAgIHJldHVybiBmdW5jdGlvbiAoaGVhZGVyTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiAoaGVhZGVyTmFtZSAmJiBoZWFkZXJOYW1lLmxlbmd0aCA+IDApID8gXCJcIiA6IHt9O1xyXG4gICAgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChoZWFkZXJOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgaWYgKGhlYWRlck5hbWUgJiYgaGVhZGVyTmFtZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBob2IgPSB7fTtcclxuICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWwsIGtleSkgPT4ge1xyXG4gICAgICAgIGhvYltrZXldID0gdmFsO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGhvYjtcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,139 @@
1
+ import { HttpHeaders, HttpRequest, HttpResponse } from "@angular/common/http";
2
+ import { config, core } from "breeze-client";
3
+ import { filter, map } from "rxjs/operators";
4
+ import { appendQueryStringParameter, encodeParams } from "./adapter-core";
5
+ export class AjaxHttpClientAdapter {
6
+ http;
7
+ static adapterName = 'httpclient';
8
+ name = AjaxHttpClientAdapter.adapterName;
9
+ defaultSettings = {};
10
+ requestInterceptor;
11
+ constructor(http) {
12
+ this.http = http;
13
+ }
14
+ static register(http, breezeConfig) {
15
+ breezeConfig = breezeConfig || config;
16
+ breezeConfig.registerAdapter("ajax", function () { return new AjaxHttpClientAdapter(http); });
17
+ return breezeConfig.initializeAdapterInstance("ajax", AjaxHttpClientAdapter.adapterName, true);
18
+ }
19
+ initialize() { }
20
+ ajax(config) {
21
+ if (!this.http) {
22
+ throw new Error('Unable to locate angular http module for ajax adapter');
23
+ }
24
+ // merge default DataSetAdapter Settings with config arg
25
+ if (!core.isEmpty(this.defaultSettings)) {
26
+ let compositeConfig = core.extend({}, this.defaultSettings);
27
+ config = core.extend(compositeConfig, config);
28
+ // extend is shallow; extend headers separately
29
+ let headers = core.extend({}, this.defaultSettings['headers']); // copy default headers 1st
30
+ config['headers'] = core.extend(headers, config.headers);
31
+ }
32
+ if (config.crossDomain) {
33
+ throw new Error(this.name + ' does not support JSONP (crossDomain) requests');
34
+ }
35
+ // Hack: Not sure how Angular handles writing 'search' parameters to the url.
36
+ // so this approach takes over the url param writing completely.
37
+ const parameters = core.isEmpty(config.params) ? null : encodeParams(config.params);
38
+ const url = appendQueryStringParameter(config.url, parameters);
39
+ let headers = new HttpHeaders(config.headers || {});
40
+ if (!headers.has('Content-Type')) {
41
+ if (config.type !== 'GET' && config.type !== 'DELETE' && !!config.contentType) {
42
+ headers = headers.set('Content-Type', config.contentType || 'application/json; charset=utf-8');
43
+ }
44
+ }
45
+ let body = config.data;
46
+ let request = new HttpRequest((config.type || 'GET').toUpperCase(), url, body, { headers: headers, responseType: "text" });
47
+ let requestInfo = {
48
+ adapter: this,
49
+ request: request,
50
+ dsaConfig: config,
51
+ success: successFn,
52
+ error: errorFn // adapter's error callback
53
+ };
54
+ if (core.isFunction(this.requestInterceptor)) {
55
+ this.requestInterceptor(requestInfo);
56
+ if (this.requestInterceptor['oneTime']) {
57
+ this.requestInterceptor = null;
58
+ }
59
+ }
60
+ if (requestInfo.request) { // exists unless requestInterceptor killed it.
61
+ const ffilter = filter((response) => response instanceof HttpResponse);
62
+ const fmap = map(extractData);
63
+ fmap(ffilter(this.http.request(requestInfo.request)))
64
+ .forEach(requestInfo.success)
65
+ .catch(requestInfo.error);
66
+ }
67
+ function extractData(event) {
68
+ let response = event;
69
+ let data;
70
+ let dt = requestInfo.dsaConfig.dataType;
71
+ // beware:`res.json` and `res.text` will be async some day
72
+ if (dt && dt !== 'json') {
73
+ data = response.body;
74
+ }
75
+ else {
76
+ data = JSON.parse(response.body);
77
+ }
78
+ return { data, response };
79
+ }
80
+ function successFn(arg) {
81
+ if (arg.response.status < 200 || arg.response.status >= 300) {
82
+ throw { data: arg.data, response: arg.response };
83
+ }
84
+ let httpResponse = {
85
+ config: requestInfo.request,
86
+ data: arg.data,
87
+ getHeaders: makeGetHeaders(arg.response.headers),
88
+ status: arg.response.status
89
+ };
90
+ httpResponse['ngConfig'] = requestInfo.request;
91
+ httpResponse['statusText'] = arg.response.statusText;
92
+ httpResponse['response'] = arg.response;
93
+ config.success(httpResponse);
94
+ }
95
+ function errorFn(response) {
96
+ if (response instanceof Error) {
97
+ throw response; // program error; nothing we can do
98
+ }
99
+ else {
100
+ let data;
101
+ if (response.error instanceof HttpResponse) {
102
+ data = response.error.body;
103
+ }
104
+ else if (response.error instanceof Error) {
105
+ data = response.error.message;
106
+ }
107
+ else {
108
+ data = response.error;
109
+ }
110
+ // Timeout appears as an error with status===0 and no data.
111
+ if (response.status === 0 && data == null) {
112
+ data = 'timeout';
113
+ }
114
+ let errorMessage = response.status + ": " + response.statusText;
115
+ if (data && typeof data === 'object') {
116
+ data["message"] = data["message"] || errorMessage; // breeze looks at the message property
117
+ }
118
+ if (!data) {
119
+ data = errorMessage; // Return the error message as data
120
+ }
121
+ let httpResponse = {
122
+ config: requestInfo.request,
123
+ data: data,
124
+ getHeaders: makeGetHeaders(response.headers),
125
+ status: response.status
126
+ };
127
+ httpResponse['ngConfig'] = requestInfo.request;
128
+ httpResponse['statusText'] = response.statusText;
129
+ httpResponse['response'] = response;
130
+ config.error(httpResponse); // send error to breeze error handler
131
+ }
132
+ }
133
+ }
134
+ }
135
+ ///// Helpers ////
136
+ function makeGetHeaders(headers) {
137
+ return function getHeaders(headerName) { return headers.getAll(headerName).join('\r\n'); };
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1hamF4LWh0dHBjbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlci1hamF4LWh0dHBjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QyxXQUFXLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hILE9BQU8sRUFBYyxNQUFNLEVBQUUsSUFBSSxFQUF5RixNQUFNLGVBQWUsQ0FBQztBQUNoSixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRSxNQUFNLE9BQU8scUJBQXFCO0lBTWI7SUFMbkIsTUFBTSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7SUFDbEMsSUFBSSxHQUFHLHFCQUFxQixDQUFDLFdBQVcsQ0FBQztJQUN6QyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLGtCQUFrQixDQUF5QjtJQUUzQyxZQUFtQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQUksQ0FBQztJQUV4QyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQWdCLEVBQUUsWUFBMkI7UUFDM0QsWUFBWSxHQUFHLFlBQVksSUFBSSxNQUFNLENBQUM7UUFDdEMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQU8sY0FBYyxPQUFPLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRyxPQUFPLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBMEIsQ0FBQztJQUMxSCxDQUFDO0lBRUQsVUFBVSxLQUFLLENBQUM7SUFFaEIsSUFBSSxDQUFDLE1BQWtCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENB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SUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFFLHVDQUF1QztpQkFDNUY7Z0JBQ0QsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDVCxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUcsbUNBQW1DO2lCQUMzRDtnQkFDRCxJQUFJLFlBQVksR0FBdUI7b0JBQ3JDLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTztvQkFDM0IsSUFBSSxFQUFFLElBQUk7b0JBQ1YsVUFBVSxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO29CQUM1QyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07aUJBQ3hCLENBQUM7Z0JBQ0YsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7Z0JBQy9DLFlBQVksQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUNqRCxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDO2dCQUVwQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMscUNBQXFDO2FBQ2xFO1FBQ0gsQ0FBQztJQUNILENBQUM7O0FBSUgsa0JBQWtCO0FBRWxCLFNBQVMsY0FBYyxDQUFDLE9BQW9CO0lBQzFDLE9BQU8sU0FBUyxVQUFVLENBQUMsVUFBbUIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwSGVhZGVycywgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBBamF4Q29uZmlnLCBjb25maWcsIGNvcmUsIEh0dHBSZXNwb25zZSBhcyBCcmVlemVIdHRwUmVzcG9uc2UsIEJyZWV6ZUNvbmZpZywgQWpheFJlcXVlc3RJbnRlcmNlcHRvciwgQWpheEFkYXB0ZXIgfSBmcm9tIFwiYnJlZXplLWNsaWVudFwiO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBhcHBlbmRRdWVyeVN0cmluZ1BhcmFtZXRlciwgZW5jb2RlUGFyYW1zIH0gZnJvbSBcIi4vYWRhcHRlci1jb3JlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWpheEh0dHBDbGllbnRBZGFwdGVyIGltcGxlbWVudHMgQWpheEFkYXB0ZXIge1xyXG4gIHN0YXRpYyBhZGFwdGVyTmFtZSA9ICdodHRwY2xpZW50JztcclxuICBuYW1lID0gQWpheEh0dHBDbGllbnRBZGFwdGVyLmFkYXB0ZXJOYW1lO1xyXG4gIGRlZmF1bHRTZXR0aW5ncyA9IHt9O1xyXG4gIHJlcXVlc3RJbnRlcmNlcHRvcjogQWpheFJlcXVlc3RJbnRlcmNlcHRvcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGh0dHA6IEh0dHBDbGllbnQpIHsgfVxyXG5cclxuICBzdGF0aWMgcmVnaXN0ZXIoaHR0cDogSHR0cENsaWVudCwgYnJlZXplQ29uZmlnPzogQnJlZXplQ29uZmlnKSB7XHJcbiAgICBicmVlemVDb25maWcgPSBicmVlemVDb25maWcgfHwgY29uZmlnO1xyXG4gICAgYnJlZXplQ29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImFqYXhcIiwgPGFueT5mdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgQWpheEh0dHBDbGllbnRBZGFwdGVyKGh0dHApOyB9KTtcclxuICAgIHJldHVybiBicmVlemVDb25maWcuaW5pdGlhbGl6ZUFkYXB0ZXJJbnN0YW5jZShcImFqYXhcIiwgQWpheEh0dHBDbGllbnRBZGFwdGVyLmFkYXB0ZXJOYW1lLCB0cnVlKSBhcyBBamF4SHR0cENsaWVudEFkYXB0ZXI7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplKCkgeyB9XHJcblxyXG4gIGFqYXgoY29uZmlnOiBBamF4Q29uZmlnKSB7XHJcbiAgICBpZiAoIXRoaXMuaHR0cCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBsb2NhdGUgYW5ndWxhciBodHRwIG1vZHVsZSBmb3IgYWpheCBhZGFwdGVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbWVyZ2UgZGVmYXVsdCBEYXRhU2V0QWRhcHRlciBTZXR0aW5ncyB3aXRoIGNvbmZpZyBhcmdcclxuICAgIGlmICghY29yZS5pc0VtcHR5KHRoaXMuZGVmYXVsdFNldHRpbmdzKSkge1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZmlnID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzKTtcclxuICAgICAgY29uZmlnID0gPEFqYXhDb25maWc+Y29yZS5leHRlbmQoY29tcG9zaXRlQ29uZmlnLCBjb25maWcpO1xyXG4gICAgICAvLyBleHRlbmQgaXMgc2hhbGxvdzsgZXh0ZW5kIGhlYWRlcnMgc2VwYXJhdGVseVxyXG4gICAgICBsZXQgaGVhZGVycyA9IGNvcmUuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRTZXR0aW5nc1snaGVhZGVycyddKTsgLy8gY29weSBkZWZhdWx0IGhlYWRlcnMgMXN0XHJcbiAgICAgIGNvbmZpZ1snaGVhZGVycyddID0gY29yZS5leHRlbmQoaGVhZGVycywgY29uZmlnLmhlYWRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25maWcuY3Jvc3NEb21haW4pIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMubmFtZSArICcgZG9lcyBub3Qgc3VwcG9ydCBKU09OUCAoY3Jvc3NEb21haW4pIHJlcXVlc3RzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFjazogTm90IHN1cmUgaG93IEFuZ3VsYXIgaGFuZGxlcyB3cml0aW5nICdzZWFyY2gnIHBhcmFtZXRlcnMgdG8gdGhlIHVybC5cclxuICAgIC8vIHNvIHRoaXMgYXBwcm9hY2ggdGFrZXMgb3ZlciB0aGUgdXJsIHBhcmFtIHdyaXRpbmcgY29tcGxldGVseS5cclxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBjb3JlLmlzRW1wdHkoY29uZmlnLnBhcmFtcykgPyBudWxsIDogZW5jb2RlUGFyYW1zKGNvbmZpZy5wYXJhbXMpO1xyXG4gICAgY29uc3QgdXJsID0gYXBwZW5kUXVlcnlTdHJpbmdQYXJhbWV0ZXIoY29uZmlnLnVybCwgcGFyYW1ldGVycyk7XHJcblxyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoY29uZmlnLmhlYWRlcnMgfHwge30pO1xyXG4gICAgaWYgKCFoZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcclxuICAgICAgaWYgKGNvbmZpZy50eXBlICE9PSAnR0VUJyAmJiBjb25maWcudHlwZSAhPT0gJ0RFTEVURScgJiYgISFjb25maWcuY29udGVudFR5cGUpIHtcclxuICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsXHJcbiAgICAgICAgICA8c3RyaW5nPmNvbmZpZy5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJvZHk6IGFueSA9IGNvbmZpZy5kYXRhO1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKGNvbmZpZy50eXBlIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpLCB1cmwsIGJvZHksIHsgaGVhZGVyczogaGVhZGVycywgcmVzcG9uc2VUeXBlOiBcInRleHRcIiB9KTtcclxuXHJcbiAgICBsZXQgcmVxdWVzdEluZm8gPSB7XHJcbiAgICAgIGFkYXB0ZXI6IHRoaXMsICAgICAgLy8gdGhpcyBhZGFwdGVyXHJcbiAgICAgIHJlcXVlc3Q6IHJlcXVlc3QsICAgLy8gdGhlIGh0dHAgcmVxdWVzdCBmcm9tIHRoZSByZXF1ZXN0T3B0aW9uc1xyXG4gICAgICBkc2FDb25maWc6IGNvbmZpZywgIC8vIHRoZSBjb25maWcgYXJnIGZyb20gdGhlIGNhbGxpbmcgQnJlZXplIERhdGFTZXJ2aWNlQWRhcHRlclxyXG4gICAgICBzdWNjZXNzOiBzdWNjZXNzRm4sIC8vIGFkYXB0ZXIncyBzdWNjZXNzIGNhbGxiYWNrXHJcbiAgICAgIGVycm9yOiBlcnJvckZuICAgICAgLy8gYWRhcHRlcidzIGVycm9yIGNhbGxiYWNrXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChjb3JlLmlzRnVuY3Rpb24odGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IpKSB7XHJcbiAgICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yKHJlcXVlc3RJbmZvIGFzIGFueSk7XHJcbiAgICAgIGlmICh0aGlzLnJlcXVlc3RJbnRlcmNlcHRvclsnb25lVGltZSddKSB7XHJcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RJbmZvLnJlcXVlc3QpIHsgLy8gZXhpc3RzIHVubGVzcyByZXF1ZXN0SW50ZXJjZXB0b3Iga2lsbGVkIGl0LlxyXG4gICAgICBjb25zdCBmZmlsdGVyID0gZmlsdGVyKChyZXNwb25zZTogSHR0cEV2ZW50PGFueT4pID0+IHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKTtcclxuICAgICAgY29uc3QgZm1hcCA9IG1hcChleHRyYWN0RGF0YSk7XHJcblxyXG4gICAgICBmbWFwKGZmaWx0ZXIodGhpcy5odHRwLnJlcXVlc3QocmVxdWVzdEluZm8ucmVxdWVzdCkpKVxyXG4gICAgICAgIC5mb3JFYWNoKHJlcXVlc3RJbmZvLnN1Y2Nlc3MpXHJcbiAgICAgICAgLmNhdGNoKHJlcXVlc3RJbmZvLmVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBleHRyYWN0RGF0YShldmVudDogSHR0cEV2ZW50PGFueT4pIHtcclxuICAgICAgbGV0IHJlc3BvbnNlID0gZXZlbnQgYXMgSHR0cFJlc3BvbnNlPGFueT47XHJcbiAgICAgIGxldCBkYXRhOiBhbnk7XHJcbiAgICAgIGxldCBkdCA9IHJlcXVlc3RJbmZvLmRzYUNvbmZpZy5kYXRhVHlwZTtcclxuICAgICAgLy8gYmV3YXJlOmByZXMuanNvbmAgYW5kIGByZXMudGV4dGAgd2lsbCBiZSBhc3luYyBzb21lIGRheVxyXG4gICAgICBpZiAoZHQgJiYgZHQgIT09ICdqc29uJykge1xyXG4gICAgICAgIGRhdGEgPSByZXNwb25zZS5ib2R5O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IGRhdGEsIHJlc3BvbnNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc3VjY2Vzc0ZuKGFyZzogeyBkYXRhOiBhbnksIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55PiB9KSB7XHJcbiAgICAgIGlmIChhcmcucmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IGFyZy5yZXNwb25zZS5zdGF0dXMgPj0gMzAwKSB7XHJcbiAgICAgICAgdGhyb3cgeyBkYXRhOiBhcmcuZGF0YSwgcmVzcG9uc2U6IGFyZy5yZXNwb25zZSB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaHR0cFJlc3BvbnNlOiBCcmVlemVIdHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgY29uZmlnOiByZXF1ZXN0SW5mby5yZXF1ZXN0LFxyXG4gICAgICAgIGRhdGE6IGFyZy5kYXRhLFxyXG4gICAgICAgIGdldEhlYWRlcnM6IG1ha2VHZXRIZWFkZXJzKGFyZy5yZXNwb25zZS5oZWFkZXJzKSxcclxuICAgICAgICBzdGF0dXM6IGFyZy5yZXNwb25zZS5zdGF0dXNcclxuICAgICAgfTtcclxuICAgICAgaHR0cFJlc3BvbnNlWyduZ0NvbmZpZyddID0gcmVxdWVzdEluZm8ucmVxdWVzdDtcclxuICAgICAgaHR0cFJlc3BvbnNlWydzdGF0dXNUZXh0J10gPSBhcmcucmVzcG9uc2Uuc3RhdHVzVGV4dDtcclxuICAgICAgaHR0cFJlc3BvbnNlWydyZXNwb25zZSddID0gYXJnLnJlc3BvbnNlO1xyXG4gICAgICBjb25maWcuc3VjY2VzcyhodHRwUmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGVycm9yRm4ocmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgcmVzcG9uc2U7IC8vIHByb2dyYW0gZXJyb3I7IG5vdGhpbmcgd2UgY2FuIGRvXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGRhdGE6IGFueTtcclxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpIHtcclxuICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5lcnJvci5ib2R5O1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5lcnJvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRpbWVvdXQgYXBwZWFycyBhcyBhbiBlcnJvciB3aXRoIHN0YXR1cz09PTAgYW5kIG5vIGRhdGEuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMCAmJiBkYXRhID09IG51bGwpIHtcclxuICAgICAgICAgIGRhdGEgPSAndGltZW91dCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzICsgXCI6IFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dDtcclxuICAgICAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgIGRhdGFbXCJtZXNzYWdlXCJdID0gZGF0YVtcIm1lc3NhZ2VcIl0gfHwgZXJyb3JNZXNzYWdlOyAgLy8gYnJlZXplIGxvb2tzIGF0IHRoZSBtZXNzYWdlIHByb3BlcnR5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgZGF0YSA9IGVycm9yTWVzc2FnZTsgICAvLyBSZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgYXMgZGF0YVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaHR0cFJlc3BvbnNlOiBCcmVlemVIdHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICBjb25maWc6IHJlcXVlc3RJbmZvLnJlcXVlc3QsXHJcbiAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgZ2V0SGVhZGVyczogbWFrZUdldEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1c1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaHR0cFJlc3BvbnNlWyduZ0NvbmZpZyddID0gcmVxdWVzdEluZm8ucmVxdWVzdDtcclxuICAgICAgICBodHRwUmVzcG9uc2VbJ3N0YXR1c1RleHQnXSA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XHJcbiAgICAgICAgaHR0cFJlc3BvbnNlWydyZXNwb25zZSddID0gcmVzcG9uc2U7XHJcblxyXG4gICAgICAgIGNvbmZpZy5lcnJvcihodHRwUmVzcG9uc2UpOyAvLyBzZW5kIGVycm9yIHRvIGJyZWV6ZSBlcnJvciBoYW5kbGVyXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG4vLy8vLyBIZWxwZXJzIC8vLy9cclxuXHJcbmZ1bmN0aW9uIG1ha2VHZXRIZWFkZXJzKGhlYWRlcnM6IEh0dHBIZWFkZXJzKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldEhlYWRlcnMoaGVhZGVyTmFtZT86IHN0cmluZykgeyByZXR1cm4gaGVhZGVycy5nZXRBbGwoaGVhZGVyTmFtZSkuam9pbignXFxyXFxuJyk7IH07XHJcbn0iXX0=
@@ -0,0 +1,107 @@
1
+ import { config, core } from 'breeze-client';
2
+ export class AjaxJQueryAdapter {
3
+ name;
4
+ defaultSettings;
5
+ requestInterceptor;
6
+ jQuery;
7
+ constructor() {
8
+ this.name = "jQuery";
9
+ this.defaultSettings = {};
10
+ this.requestInterceptor = undefined;
11
+ }
12
+ static register(breezeConfig) {
13
+ breezeConfig = breezeConfig || config;
14
+ breezeConfig.registerAdapter("ajax", AjaxJQueryAdapter);
15
+ return breezeConfig.initializeAdapterInstance("ajax", "jQuery", true);
16
+ }
17
+ initialize() {
18
+ this.jQuery = jQuery;
19
+ // look for the jQuery lib but don't fail immediately if not found
20
+ if (!jQuery) {
21
+ this.jQuery = core.requireLib("jQuery;jquery");
22
+ }
23
+ }
24
+ ajax(config) {
25
+ if (!this.jQuery) {
26
+ throw new Error("Unable to locate jQuery");
27
+ }
28
+ let jqConfig = {
29
+ type: config.type,
30
+ url: config.url,
31
+ data: config.params || config.data,
32
+ dataType: config.dataType,
33
+ contentType: config.contentType,
34
+ crossDomain: config.crossDomain,
35
+ headers: config.headers || {}
36
+ };
37
+ if (!core.isEmpty(this.defaultSettings)) {
38
+ let compositeConfig = core.extend({}, this.defaultSettings);
39
+ jqConfig = core.extend(compositeConfig, jqConfig);
40
+ // extend is shallow; extend headers separately
41
+ let headers = core.extend({}, this.defaultSettings.headers); // copy default headers 1st
42
+ jqConfig.headers = core.extend(headers, jqConfig.headers);
43
+ }
44
+ let requestInfo = {
45
+ adapter: this,
46
+ config: jqConfig,
47
+ dsaConfig: config,
48
+ success: successFn,
49
+ error: errorFn, // adapter's error callback
50
+ };
51
+ if (core.isFunction(this.requestInterceptor)) {
52
+ let ri = this.requestInterceptor;
53
+ ri(requestInfo);
54
+ if (ri.oneTime) {
55
+ this.requestInterceptor = undefined;
56
+ }
57
+ }
58
+ if (requestInfo.config) { // exists unless requestInterceptor killed it.
59
+ requestInfo.jqXHR = this.jQuery.ajax(requestInfo.config)
60
+ .done(requestInfo.success)
61
+ .fail(requestInfo.error);
62
+ }
63
+ function successFn(data, statusText, jqXHR) {
64
+ let httpResponse = {
65
+ config: config,
66
+ data: data,
67
+ getHeaders: getHeadersFn(jqXHR),
68
+ status: jqXHR.status,
69
+ statusText: statusText
70
+ };
71
+ config.success(httpResponse);
72
+ // TODO: not sure how to do this or if needed.
73
+ // jqXHR.onreadystatechange = null;
74
+ // jqXHR.abort = null;
75
+ }
76
+ function errorFn(jqXHR, statusText, errorThrown) {
77
+ let httpResponse = {
78
+ config: config,
79
+ data: jqXHR.responseText,
80
+ error: errorThrown,
81
+ getHeaders: getHeadersFn(jqXHR),
82
+ status: jqXHR.status,
83
+ statusText: statusText
84
+ };
85
+ config.error(httpResponse);
86
+ // TODO: not sure how to do this or if needed.
87
+ // jqXHR.onreadystatechange = null;
88
+ // jqXHR.abort = null;
89
+ }
90
+ }
91
+ }
92
+ config.registerAdapter("ajax", AjaxJQueryAdapter);
93
+ function getHeadersFn(jqXHR) {
94
+ if (jqXHR.status === 0) { // timeout or abort; no headers
95
+ return function (headerName) {
96
+ return (headerName && headerName.length > 0) ? "" : {};
97
+ };
98
+ }
99
+ else { // jqXHR should have header functions
100
+ return function (headerName) {
101
+ return (headerName && headerName.length > 0) ?
102
+ jqXHR.getResponseHeader(headerName) :
103
+ jqXHR.getAllResponseHeaders();
104
+ };
105
+ }
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1hamF4LWpxdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGVyLWFqYXgtanF1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUk1RyxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLElBQUksQ0FBUztJQUNiLGVBQWUsQ0FBMkM7SUFDMUQsa0JBQWtCLENBQTBCO0lBQzVDLE1BQU0sQ0FBTTtJQUVaO1FBQ0UsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUEyQjtRQUN6QyxZQUFZLEdBQUcsWUFBWSxJQUFJLE1BQU0sQ0FBQztRQUN0QyxZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sWUFBWSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFzQixDQUFDO0lBQzdGLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQWtCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUM1QztRQUNELElBQUksUUFBUSxHQUFHO1lBQ2IsSUFBSSxFQUFF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WUFDOUMsbUNBQW1DO1lBQ25DLHNCQUFzQjtRQUN4QixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUVsRCxTQUFTLFlBQVksQ0FBQyxLQUFxQjtJQUN6QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLEVBQUUsK0JBQStCO1FBQ3ZELE9BQU8sVUFBVSxVQUFrQjtZQUNqQyxPQUFPLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pELENBQUMsQ0FBQztLQUNIO1NBQU0sRUFBRSxxQ0FBcUM7UUFDNUMsT0FBTyxVQUFVLFVBQWtCO1lBQ2pDLE9BQU8sQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDckMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDO0tBQ0g7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWpheEFkYXB0ZXIsIEFqYXhDb25maWcsIEFqYXhSZXF1ZXN0SW50ZXJjZXB0b3IsIEJyZWV6ZUNvbmZpZywgY29uZmlnLCBjb3JlIH0gZnJvbSAnYnJlZXplLWNsaWVudCc7XHJcblxyXG5kZWNsYXJlIHZhciBqUXVlcnk6IGFueTtcclxuXHJcbmV4cG9ydCBjbGFzcyBBamF4SlF1ZXJ5QWRhcHRlciBpbXBsZW1lbnRzIEFqYXhBZGFwdGVyIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZGVmYXVsdFNldHRpbmdzOiB7IGhlYWRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSB9O1xyXG4gIHJlcXVlc3RJbnRlcmNlcHRvcj86IEFqYXhSZXF1ZXN0SW50ZXJjZXB0b3I7XHJcbiAgalF1ZXJ5OiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5uYW1lID0gXCJqUXVlcnlcIjtcclxuICAgIHRoaXMuZGVmYXVsdFNldHRpbmdzID0geyB9O1xyXG4gICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmVnaXN0ZXIoYnJlZXplQ29uZmlnPzogQnJlZXplQ29uZmlnKSB7XHJcbiAgICBicmVlemVDb25maWcgPSBicmVlemVDb25maWcgfHwgY29uZmlnO1xyXG4gICAgYnJlZXplQ29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImFqYXhcIiwgQWpheEpRdWVyeUFkYXB0ZXIpO1xyXG4gICAgcmV0dXJuIGJyZWV6ZUNvbmZpZy5pbml0aWFsaXplQWRhcHRlckluc3RhbmNlKFwiYWpheFwiLCBcImpRdWVyeVwiLCB0cnVlKSBhcyBBamF4SlF1ZXJ5QWRhcHRlcjtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemUoKSB7XHJcbiAgICB0aGlzLmpRdWVyeSA9IGpRdWVyeTtcclxuICAgIC8vIGxvb2sgZm9yIHRoZSBqUXVlcnkgbGliIGJ1dCBkb24ndCBmYWlsIGltbWVkaWF0ZWx5IGlmIG5vdCBmb3VuZFxyXG4gICAgaWYgKCFqUXVlcnkpIHtcclxuICAgICAgdGhpcy5qUXVlcnkgPSBjb3JlLnJlcXVpcmVMaWIoXCJqUXVlcnk7anF1ZXJ5XCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWpheChjb25maWc6IEFqYXhDb25maWcpIHtcclxuICAgIGlmICghdGhpcy5qUXVlcnkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGxvY2F0ZSBqUXVlcnlcIik7XHJcbiAgICB9XHJcbiAgICBsZXQganFDb25maWcgPSB7XHJcbiAgICAgIHR5cGU6IGNvbmZpZy50eXBlLFxyXG4gICAgICB1cmw6IGNvbmZpZy51cmwsXHJcbiAgICAgIGRhdGE6IGNvbmZpZy5wYXJhbXMgfHwgY29uZmlnLmRhdGEsXHJcbiAgICAgIGRhdGFUeXBlOiBjb25maWcuZGF0YVR5cGUsXHJcbiAgICAgIGNvbnRlbnRUeXBlOiBjb25maWcuY29udGVudFR5cGUsXHJcbiAgICAgIGNyb3NzRG9tYWluOiBjb25maWcuY3Jvc3NEb21haW4sXHJcbiAgICAgIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzIHx8IHt9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmICghY29yZS5pc0VtcHR5KHRoaXMuZGVmYXVsdFNldHRpbmdzKSkge1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZmlnID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzKTtcclxuICAgICAganFDb25maWcgPSBjb3JlLmV4dGVuZChjb21wb3NpdGVDb25maWcsIGpxQ29uZmlnKSBhcyBhbnk7XHJcbiAgICAgIC8vIGV4dGVuZCBpcyBzaGFsbG93OyBleHRlbmQgaGVhZGVycyBzZXBhcmF0ZWx5XHJcbiAgICAgIGxldCBoZWFkZXJzID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzLmhlYWRlcnMpOyAvLyBjb3B5IGRlZmF1bHQgaGVhZGVycyAxc3RcclxuICAgICAganFDb25maWcuaGVhZGVycyA9IGNvcmUuZXh0ZW5kKGhlYWRlcnMsIGpxQ29uZmlnLmhlYWRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXF1ZXN0SW5mbyA9IHtcclxuICAgICAgYWRhcHRlcjogdGhpcywgICAgICAvLyB0aGlzIGFkYXB0ZXJcclxuICAgICAgY29uZmlnOiBqcUNvbmZpZywgICAvLyBqUXVlcnkncyBhamF4ICdzZXR0aW5ncycgb2JqZWN0XHJcbiAgICAgIGRzYUNvbmZpZzogY29uZmlnLCAgLy8gdGhlIGNvbmZpZyBhcmcgZnJvbSB0aGUgY2FsbGluZyBCcmVlemUgRGF0YVNlcnZpY2VBZGFwdGVyXHJcbiAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NGbiwgLy8gYWRhcHRlcidzIHN1Y2Nlc3MgY2FsbGJhY2tcclxuICAgICAgZXJyb3I6IGVycm9yRm4sICAgICAgLy8gYWRhcHRlcidzIGVycm9yIGNhbGxiYWNrXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChjb3JlLmlzRnVuY3Rpb24odGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IpKSB7XHJcbiAgICAgIGxldCByaSA9IHRoaXMucmVxdWVzdEludGVyY2VwdG9yIGFzIGFueTtcclxuICAgICAgcmkocmVxdWVzdEluZm8pO1xyXG4gICAgICBpZiAocmkub25lVGltZSkge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RJbmZvLmNvbmZpZykgeyAvLyBleGlzdHMgdW5sZXNzIHJlcXVlc3RJbnRlcmNlcHRvciBraWxsZWQgaXQuXHJcbiAgICAgIChyZXF1ZXN0SW5mbyBhcyBhbnkpLmpxWEhSID0gdGhpcy5qUXVlcnkuYWpheChyZXF1ZXN0SW5mby5jb25maWcpXHJcbiAgICAgICAgLmRvbmUocmVxdWVzdEluZm8uc3VjY2VzcylcclxuICAgICAgICAuZmFpbChyZXF1ZXN0SW5mby5lcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc3VjY2Vzc0ZuKGRhdGE6IGFueSwgc3RhdHVzVGV4dDogc3RyaW5nLCBqcVhIUjogWE1MSHR0cFJlcXVlc3QpIHtcclxuICAgICAgbGV0IGh0dHBSZXNwb25zZSA9IHtcclxuICAgICAgICBjb25maWc6IGNvbmZpZyxcclxuICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgIGdldEhlYWRlcnM6IGdldEhlYWRlcnNGbihqcVhIUiksXHJcbiAgICAgICAgc3RhdHVzOiBqcVhIUi5zdGF0dXMsXHJcbiAgICAgICAgc3RhdHVzVGV4dDogc3RhdHVzVGV4dFxyXG4gICAgICB9O1xyXG4gICAgICBjb25maWcuc3VjY2VzcyhodHRwUmVzcG9uc2UpO1xyXG4gICAgICAvLyBUT0RPOiBub3Qgc3VyZSBob3cgdG8gZG8gdGhpcyBvciBpZiBuZWVkZWQuXHJcbiAgICAgIC8vIGpxWEhSLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XHJcbiAgICAgIC8vIGpxWEhSLmFib3J0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBlcnJvckZuKGpxWEhSOiBYTUxIdHRwUmVxdWVzdCwgc3RhdHVzVGV4dDogc3RyaW5nLCBlcnJvclRocm93bjogYW55KSB7XHJcbiAgICAgIGxldCBodHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgY29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgZGF0YToganFYSFIucmVzcG9uc2VUZXh0LFxyXG4gICAgICAgIGVycm9yOiBlcnJvclRocm93bixcclxuICAgICAgICBnZXRIZWFkZXJzOiBnZXRIZWFkZXJzRm4oanFYSFIpLFxyXG4gICAgICAgIHN0YXR1czoganFYSFIuc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHRcclxuICAgICAgfTtcclxuICAgICAgY29uZmlnLmVycm9yKGh0dHBSZXNwb25zZSk7XHJcbiAgICAgIC8vIFRPRE86IG5vdCBzdXJlIGhvdyB0byBkbyB0aGlzIG9yIGlmIG5lZWRlZC5cclxuICAgICAgLy8ganFYSFIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcclxuICAgICAgLy8ganFYSFIuYWJvcnQgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuY29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImFqYXhcIiwgQWpheEpRdWVyeUFkYXB0ZXIpO1xyXG5cclxuZnVuY3Rpb24gZ2V0SGVhZGVyc0ZuKGpxWEhSOiBYTUxIdHRwUmVxdWVzdCk6IGFueSB7XHJcbiAgaWYgKGpxWEhSLnN0YXR1cyA9PT0gMCkgeyAvLyB0aW1lb3V0IG9yIGFib3J0OyBubyBoZWFkZXJzXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGhlYWRlck5hbWU6IHN0cmluZykge1xyXG4gICAgICByZXR1cm4gKGhlYWRlck5hbWUgJiYgaGVhZGVyTmFtZS5sZW5ndGggPiAwKSA/IFwiXCIgOiB7fTtcclxuICAgIH07XHJcbiAgfSBlbHNlIHsgLy8ganFYSFIgc2hvdWxkIGhhdmUgaGVhZGVyIGZ1bmN0aW9uc1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChoZWFkZXJOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuIChoZWFkZXJOYW1lICYmIGhlYWRlck5hbWUubGVuZ3RoID4gMCkgP1xyXG4gICAgICAgIGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlck5hbWUpIDpcclxuICAgICAgICBqcVhIUi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTtcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==