breeze-client 2.1.2 → 2.1.3-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 (397) hide show
  1. package/LICENSE +1 -1
  2. package/adapter-ajax-angularjs/{breeze-client-adapter-ajax-angularjs.d.ts → index.d.ts} +1 -0
  3. package/adapter-ajax-fetch/{breeze-client-adapter-ajax-fetch.d.ts → index.d.ts} +1 -0
  4. package/adapter-ajax-httpclient/{breeze-client-adapter-ajax-httpclient.d.ts → index.d.ts} +1 -0
  5. package/adapter-ajax-jquery/{breeze-client-adapter-ajax-jquery.d.ts → index.d.ts} +1 -0
  6. package/adapter-ajax-post/{breeze-client-adapter-ajax-post.d.ts → index.d.ts} +1 -0
  7. package/adapter-data-service-odata/{breeze-client-adapter-data-service-odata.d.ts → index.d.ts} +1 -0
  8. package/adapter-data-service-webapi/{breeze-client-adapter-data-service-webapi.d.ts → index.d.ts} +1 -0
  9. package/adapter-model-library-backing-store/{breeze-client-adapter-model-library-backing-store.d.ts → index.d.ts} +1 -0
  10. package/adapter-model-library-ko/{breeze-client-adapter-model-library-ko.d.ts → index.d.ts} +1 -0
  11. package/adapter-uri-builder-json/{breeze-client-adapter-uri-builder-json.d.ts → index.d.ts} +1 -0
  12. package/adapter-uri-builder-odata/{breeze-client-adapter-uri-builder-odata.d.ts → index.d.ts} +1 -0
  13. package/esm2020/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +130 -0
  14. package/esm2020/adapter-ajax-angularjs/adapter-core.mjs +49 -0
  15. package/esm2020/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +5 -0
  16. package/esm2020/adapter-ajax-fetch/adapter-ajax-fetch.mjs +132 -0
  17. package/esm2020/adapter-ajax-fetch/adapter-core.mjs +49 -0
  18. package/esm2020/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +5 -0
  19. package/esm2020/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +137 -0
  20. package/esm2020/adapter-ajax-httpclient/adapter-core.mjs +49 -0
  21. package/esm2020/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +5 -0
  22. package/esm2020/adapter-ajax-jquery/adapter-ajax-jquery.mjs +103 -0
  23. package/esm2020/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +5 -0
  24. package/esm2020/adapter-ajax-post/adapter-ajax-post.mjs +77 -0
  25. package/esm2020/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +5 -0
  26. package/esm2020/adapter-data-service-odata/adapter-core.mjs +49 -0
  27. package/esm2020/adapter-data-service-odata/adapter-data-service-odata.mjs +456 -0
  28. package/esm2020/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +5 -0
  29. package/esm2020/adapter-data-service-webapi/adapter-data-service-webapi.mjs +93 -0
  30. package/esm2020/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +5 -0
  31. package/esm2020/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +268 -0
  32. package/esm2020/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +5 -0
  33. package/esm2020/adapter-model-library-ko/adapter-model-library-ko.mjs +240 -0
  34. package/esm2020/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +5 -0
  35. package/esm2020/adapter-uri-builder-json/adapter-core.mjs +49 -0
  36. package/esm2020/adapter-uri-builder-json/adapter-uri-builder-json.mjs +36 -0
  37. package/esm2020/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +5 -0
  38. package/esm2020/adapter-uri-builder-odata/adapter-core.mjs +49 -0
  39. package/esm2020/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +190 -0
  40. package/esm2020/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +5 -0
  41. package/esm2020/breeze-client.mjs +5 -0
  42. package/esm2020/index.mjs +2 -0
  43. package/esm2020/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +5 -0
  44. package/esm2020/mixin-get-entity-graph/mixin-get-entity-graph.mjs +269 -0
  45. package/esm2020/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +5 -0
  46. package/esm2020/mixin-save-queuing/mixin-save-queuing.mjs +400 -0
  47. package/esm2020/src/abstract-data-service-adapter.mjs +296 -0
  48. package/esm2020/src/array.mjs +4 -0
  49. package/esm2020/src/assert-param.mjs +312 -0
  50. package/esm2020/src/breeze.mjs +85 -0
  51. package/esm2020/src/complex-array.mjs +117 -0
  52. package/esm2020/src/config.mjs +223 -0
  53. package/esm2020/src/core.mjs +707 -0
  54. package/esm2020/src/csdl-metadata-parser.mjs +385 -0
  55. package/esm2020/src/data-service.mjs +203 -0
  56. package/esm2020/src/data-type.mjs +444 -0
  57. package/esm2020/src/default-property-interceptor.mjs +460 -0
  58. package/esm2020/src/entity-action.mjs +45 -0
  59. package/esm2020/src/entity-aspect.mjs +806 -0
  60. package/esm2020/src/entity-group.mjs +187 -0
  61. package/esm2020/src/entity-key.mjs +116 -0
  62. package/esm2020/src/entity-manager.mjs +2094 -0
  63. package/esm2020/src/entity-metadata.mjs +2109 -0
  64. package/esm2020/src/entity-query.mjs +996 -0
  65. package/esm2020/src/entity-state.mjs +99 -0
  66. package/esm2020/src/enum.mjs +141 -0
  67. package/esm2020/src/event.mjs +256 -0
  68. package/esm2020/src/interface-registry.mjs +41 -0
  69. package/esm2020/src/key-generator.mjs +108 -0
  70. package/esm2020/src/local-query-comparison-options.mjs +65 -0
  71. package/esm2020/src/mapping-context.mjs +405 -0
  72. package/esm2020/src/naming-convention.mjs +88 -0
  73. package/esm2020/src/observable-array.mjs +183 -0
  74. package/esm2020/src/predicate.mjs +1232 -0
  75. package/esm2020/src/primitive-array.mjs +85 -0
  76. package/esm2020/src/query-options.mjs +152 -0
  77. package/esm2020/src/relation-array.mjs +173 -0
  78. package/esm2020/src/save-options.mjs +41 -0
  79. package/esm2020/src/unattached-children-map.mjs +58 -0
  80. package/esm2020/src/validate.mjs +988 -0
  81. package/esm2020/src/validation-options.mjs +64 -0
  82. package/fesm2015/{breeze-client-adapter-ajax-angularjs.js → breeze-client-adapter-ajax-angularjs.mjs} +1 -1
  83. package/fesm2015/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
  84. package/fesm2015/{breeze-client-adapter-ajax-fetch.js → breeze-client-adapter-ajax-fetch.mjs} +5 -3
  85. package/fesm2015/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
  86. package/fesm2015/{breeze-client-adapter-ajax-httpclient.js → breeze-client-adapter-ajax-httpclient.mjs} +1 -1
  87. package/fesm2015/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
  88. package/fesm2015/{breeze-client-adapter-ajax-jquery.js → breeze-client-adapter-ajax-jquery.mjs} +2 -2
  89. package/fesm2015/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
  90. package/fesm2015/{breeze-client-adapter-ajax-post.js → breeze-client-adapter-ajax-post.mjs} +1 -1
  91. package/fesm2015/breeze-client-adapter-ajax-post.mjs.map +1 -0
  92. package/fesm2015/{breeze-client-adapter-data-service-odata.js → breeze-client-adapter-data-service-odata.mjs} +20 -22
  93. package/fesm2015/breeze-client-adapter-data-service-odata.mjs.map +1 -0
  94. package/fesm2015/{breeze-client-adapter-data-service-webapi.js → breeze-client-adapter-data-service-webapi.mjs} +13 -13
  95. package/fesm2015/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
  96. package/fesm2015/{breeze-client-adapter-model-library-backing-store.js → breeze-client-adapter-model-library-backing-store.mjs} +13 -13
  97. package/fesm2015/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
  98. package/fesm2015/{breeze-client-adapter-model-library-ko.js → breeze-client-adapter-model-library-ko.mjs} +13 -13
  99. package/fesm2015/breeze-client-adapter-model-library-ko.mjs.map +1 -0
  100. package/fesm2015/{breeze-client-adapter-uri-builder-json.js → breeze-client-adapter-uri-builder-json.mjs} +8 -8
  101. package/fesm2015/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
  102. package/fesm2015/{breeze-client-adapter-uri-builder-odata.js → breeze-client-adapter-uri-builder-odata.mjs} +85 -86
  103. package/fesm2015/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
  104. package/fesm2015/{breeze-client-mixin-get-entity-graph.js → breeze-client-mixin-get-entity-graph.mjs} +1 -1
  105. package/fesm2015/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
  106. package/fesm2015/{breeze-client-mixin-save-queuing.js → breeze-client-mixin-save-queuing.mjs} +1 -1
  107. package/fesm2015/breeze-client-mixin-save-queuing.mjs.map +1 -0
  108. package/fesm2015/{breeze-client.js → breeze-client.mjs} +417 -422
  109. package/fesm2015/breeze-client.mjs.map +1 -0
  110. package/{fesm5/breeze-client-adapter-ajax-angularjs.js → fesm2020/breeze-client-adapter-ajax-angularjs.mjs} +41 -42
  111. package/fesm2020/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
  112. package/{fesm5/breeze-client-adapter-ajax-fetch.js → fesm2020/breeze-client-adapter-ajax-fetch.mjs} +44 -43
  113. package/fesm2020/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
  114. package/{fesm5/breeze-client-adapter-ajax-httpclient.js → fesm2020/breeze-client-adapter-ajax-httpclient.mjs} +43 -44
  115. package/fesm2020/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
  116. package/{fesm5/breeze-client-adapter-ajax-jquery.js → fesm2020/breeze-client-adapter-ajax-jquery.mjs} +18 -19
  117. package/fesm2020/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
  118. package/{fesm5/breeze-client-adapter-ajax-post.js → fesm2020/breeze-client-adapter-ajax-post.mjs} +8 -11
  119. package/fesm2020/breeze-client-adapter-ajax-post.mjs.map +1 -0
  120. package/{fesm5/breeze-client-adapter-data-service-odata.js → fesm2020/breeze-client-adapter-data-service-odata.mjs} +126 -134
  121. package/fesm2020/breeze-client-adapter-data-service-odata.mjs.map +1 -0
  122. package/{fesm5/breeze-client-adapter-data-service-webapi.js → fesm2020/breeze-client-adapter-data-service-webapi.mjs} +38 -42
  123. package/fesm2020/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
  124. package/{fesm5/breeze-client-adapter-model-library-backing-store.js → fesm2020/breeze-client-adapter-model-library-backing-store.mjs} +63 -64
  125. package/fesm2020/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
  126. package/{fesm5/breeze-client-adapter-model-library-ko.js → fesm2020/breeze-client-adapter-model-library-ko.mjs} +57 -58
  127. package/fesm2020/breeze-client-adapter-model-library-ko.mjs.map +1 -0
  128. package/fesm2020/breeze-client-adapter-uri-builder-json.mjs +91 -0
  129. package/fesm2020/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
  130. package/fesm2020/breeze-client-adapter-uri-builder-odata.mjs +245 -0
  131. package/fesm2020/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
  132. package/{fesm5/breeze-client-mixin-get-entity-graph.js → fesm2020/breeze-client-mixin-get-entity-graph.mjs} +45 -45
  133. package/fesm2020/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
  134. package/{fesm5/breeze-client-mixin-save-queuing.js → fesm2020/breeze-client-mixin-save-queuing.mjs} +116 -126
  135. package/fesm2020/breeze-client-mixin-save-queuing.mjs.map +1 -0
  136. package/{fesm5/breeze-client.js → fesm2020/breeze-client.mjs} +3403 -3615
  137. package/fesm2020/breeze-client.mjs.map +1 -0
  138. package/mixin-get-entity-graph/{breeze-client-mixin-get-entity-graph.d.ts → index.d.ts} +1 -0
  139. package/mixin-save-queuing/{breeze-client-mixin-save-queuing.d.ts → index.d.ts} +1 -0
  140. package/package.json +126 -12
  141. package/src/entity-metadata.d.ts +6 -4
  142. package/src/entity-query.d.ts +1 -1
  143. package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +0 -1
  144. package/adapter-ajax-angularjs/package.json +0 -13
  145. package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +0 -1
  146. package/adapter-ajax-fetch/package.json +0 -13
  147. package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +0 -1
  148. package/adapter-ajax-httpclient/package.json +0 -17
  149. package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +0 -1
  150. package/adapter-ajax-jquery/package.json +0 -13
  151. package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +0 -1
  152. package/adapter-ajax-post/package.json +0 -13
  153. package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +0 -1
  154. package/adapter-data-service-odata/package.json +0 -13
  155. package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +0 -1
  156. package/adapter-data-service-webapi/package.json +0 -13
  157. package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +0 -1
  158. package/adapter-model-library-backing-store/package.json +0 -13
  159. package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +0 -1
  160. package/adapter-model-library-ko/package.json +0 -13
  161. package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +0 -1
  162. package/adapter-uri-builder-json/package.json +0 -13
  163. package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +0 -1
  164. package/adapter-uri-builder-odata/package.json +0 -13
  165. package/breeze-client.d.ts +0 -8
  166. package/breeze-client.metadata.json +0 -1
  167. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +0 -190
  168. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +0 -1
  169. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +0 -2
  170. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +0 -1
  171. package/bundles/breeze-client-adapter-ajax-fetch.umd.js +0 -190
  172. package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +0 -1
  173. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +0 -2
  174. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +0 -1
  175. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +0 -195
  176. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +0 -1
  177. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +0 -2
  178. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +0 -1
  179. package/bundles/breeze-client-adapter-ajax-jquery.umd.js +0 -115
  180. package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +0 -1
  181. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +0 -2
  182. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +0 -1
  183. package/bundles/breeze-client-adapter-ajax-post.umd.js +0 -92
  184. package/bundles/breeze-client-adapter-ajax-post.umd.js.map +0 -1
  185. package/bundles/breeze-client-adapter-ajax-post.umd.min.js +0 -2
  186. package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +0 -1
  187. package/bundles/breeze-client-adapter-data-service-odata.umd.js +0 -743
  188. package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +0 -1
  189. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +0 -16
  190. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +0 -1
  191. package/bundles/breeze-client-adapter-data-service-webapi.umd.js +0 -326
  192. package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +0 -1
  193. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +0 -16
  194. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +0 -1
  195. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +0 -280
  196. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +0 -1
  197. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +0 -2
  198. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +0 -1
  199. package/bundles/breeze-client-adapter-model-library-ko.umd.js +0 -252
  200. package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +0 -1
  201. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +0 -2
  202. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +0 -1
  203. package/bundles/breeze-client-adapter-uri-builder-json.umd.js +0 -96
  204. package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +0 -1
  205. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +0 -2
  206. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +0 -1
  207. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +0 -262
  208. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +0 -1
  209. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +0 -2
  210. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +0 -1
  211. package/bundles/breeze-client-mixin-get-entity-graph.umd.js +0 -258
  212. package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +0 -1
  213. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +0 -2
  214. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +0 -1
  215. package/bundles/breeze-client-mixin-save-queuing.umd.js +0 -579
  216. package/bundles/breeze-client-mixin-save-queuing.umd.js.map +0 -1
  217. package/bundles/breeze-client-mixin-save-queuing.umd.min.js +0 -16
  218. package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +0 -1
  219. package/bundles/breeze-client.umd.js +0 -14094
  220. package/bundles/breeze-client.umd.js.map +0 -1
  221. package/bundles/breeze-client.umd.min.js +0 -16
  222. package/bundles/breeze-client.umd.min.js.map +0 -1
  223. package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -130
  224. package/esm2015/adapter-ajax-angularjs/adapter-core.js +0 -49
  225. package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  226. package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -130
  227. package/esm2015/adapter-ajax-fetch/adapter-core.js +0 -49
  228. package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  229. package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -137
  230. package/esm2015/adapter-ajax-httpclient/adapter-core.js +0 -49
  231. package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  232. package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -103
  233. package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  234. package/esm2015/adapter-ajax-post/adapter-ajax-post.js +0 -77
  235. package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  236. package/esm2015/adapter-data-service-odata/adapter-core.js +0 -49
  237. package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +0 -459
  238. package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  239. package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -93
  240. package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  241. package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -268
  242. package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  243. package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +0 -240
  244. package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  245. package/esm2015/adapter-uri-builder-json/adapter-core.js +0 -49
  246. package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -36
  247. package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  248. package/esm2015/adapter-uri-builder-odata/adapter-core.js +0 -49
  249. package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -192
  250. package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  251. package/esm2015/breeze-client.js +0 -9
  252. package/esm2015/index.js +0 -2
  253. package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  254. package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  255. package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  256. package/esm2015/mixin-save-queuing/mixin-save-queuing.js +0 -400
  257. package/esm2015/public_api.js +0 -2
  258. package/esm2015/src/abstract-data-service-adapter.js +0 -296
  259. package/esm2015/src/array.js +0 -4
  260. package/esm2015/src/assert-param.js +0 -312
  261. package/esm2015/src/breeze.js +0 -85
  262. package/esm2015/src/complex-array.js +0 -119
  263. package/esm2015/src/config.js +0 -223
  264. package/esm2015/src/core.js +0 -706
  265. package/esm2015/src/csdl-metadata-parser.js +0 -385
  266. package/esm2015/src/data-service.js +0 -203
  267. package/esm2015/src/data-type.js +0 -444
  268. package/esm2015/src/default-property-interceptor.js +0 -459
  269. package/esm2015/src/entity-action.js +0 -45
  270. package/esm2015/src/entity-aspect.js +0 -806
  271. package/esm2015/src/entity-group.js +0 -187
  272. package/esm2015/src/entity-key.js +0 -116
  273. package/esm2015/src/entity-manager.js +0 -2094
  274. package/esm2015/src/entity-metadata.js +0 -2109
  275. package/esm2015/src/entity-query.js +0 -996
  276. package/esm2015/src/entity-state.js +0 -99
  277. package/esm2015/src/enum.js +0 -141
  278. package/esm2015/src/event.js +0 -256
  279. package/esm2015/src/interface-registry.js +0 -41
  280. package/esm2015/src/key-generator.js +0 -108
  281. package/esm2015/src/local-query-comparison-options.js +0 -65
  282. package/esm2015/src/mapping-context.js +0 -405
  283. package/esm2015/src/naming-convention.js +0 -88
  284. package/esm2015/src/observable-array.js +0 -185
  285. package/esm2015/src/predicate.js +0 -1235
  286. package/esm2015/src/primitive-array.js +0 -87
  287. package/esm2015/src/query-options.js +0 -152
  288. package/esm2015/src/relation-array.js +0 -175
  289. package/esm2015/src/save-options.js +0 -41
  290. package/esm2015/src/unattached-children-map.js +0 -58
  291. package/esm2015/src/validate.js +0 -991
  292. package/esm2015/src/validation-options.js +0 -64
  293. package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -132
  294. package/esm5/adapter-ajax-angularjs/adapter-core.js +0 -49
  295. package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  296. package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -132
  297. package/esm5/adapter-ajax-fetch/adapter-core.js +0 -49
  298. package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  299. package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -139
  300. package/esm5/adapter-ajax-httpclient/adapter-core.js +0 -49
  301. package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  302. package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -105
  303. package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  304. package/esm5/adapter-ajax-post/adapter-ajax-post.js +0 -81
  305. package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  306. package/esm5/adapter-data-service-odata/adapter-core.js +0 -49
  307. package/esm5/adapter-data-service-odata/adapter-data-service-odata.js +0 -466
  308. package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  309. package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -98
  310. package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  311. package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -270
  312. package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  313. package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +0 -242
  314. package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  315. package/esm5/adapter-uri-builder-json/adapter-core.js +0 -49
  316. package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -38
  317. package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  318. package/esm5/adapter-uri-builder-odata/adapter-core.js +0 -49
  319. package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -197
  320. package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  321. package/esm5/breeze-client.js +0 -9
  322. package/esm5/index.js +0 -2
  323. package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  324. package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  325. package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  326. package/esm5/mixin-save-queuing/mixin-save-queuing.js +0 -412
  327. package/esm5/public_api.js +0 -2
  328. package/esm5/src/abstract-data-service-adapter.js +0 -302
  329. package/esm5/src/array.js +0 -4
  330. package/esm5/src/assert-param.js +0 -317
  331. package/esm5/src/breeze.js +0 -85
  332. package/esm5/src/complex-array.js +0 -119
  333. package/esm5/src/config.js +0 -228
  334. package/esm5/src/core.js +0 -714
  335. package/esm5/src/csdl-metadata-parser.js +0 -385
  336. package/esm5/src/data-service.js +0 -207
  337. package/esm5/src/data-type.js +0 -451
  338. package/esm5/src/default-property-interceptor.js +0 -459
  339. package/esm5/src/entity-action.js +0 -52
  340. package/esm5/src/entity-aspect.js +0 -812
  341. package/esm5/src/entity-group.js +0 -189
  342. package/esm5/src/entity-key.js +0 -118
  343. package/esm5/src/entity-manager.js +0 -2112
  344. package/esm5/src/entity-metadata.js +0 -2144
  345. package/esm5/src/entity-query.js +0 -1023
  346. package/esm5/src/entity-state.js +0 -106
  347. package/esm5/src/enum.js +0 -144
  348. package/esm5/src/event.js +0 -259
  349. package/esm5/src/interface-registry.js +0 -43
  350. package/esm5/src/key-generator.js +0 -111
  351. package/esm5/src/local-query-comparison-options.js +0 -67
  352. package/esm5/src/mapping-context.js +0 -407
  353. package/esm5/src/naming-convention.js +0 -90
  354. package/esm5/src/observable-array.js +0 -201
  355. package/esm5/src/predicate.js +0 -1300
  356. package/esm5/src/primitive-array.js +0 -87
  357. package/esm5/src/query-options.js +0 -167
  358. package/esm5/src/relation-array.js +0 -175
  359. package/esm5/src/save-options.js +0 -43
  360. package/esm5/src/unattached-children-map.js +0 -60
  361. package/esm5/src/validate.js +0 -996
  362. package/esm5/src/validation-options.js +0 -66
  363. package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  364. package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +0 -1
  365. package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  366. package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +0 -1
  367. package/fesm2015/breeze-client-adapter-ajax-post.js.map +0 -1
  368. package/fesm2015/breeze-client-adapter-data-service-odata.js.map +0 -1
  369. package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +0 -1
  370. package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  371. package/fesm2015/breeze-client-adapter-model-library-ko.js.map +0 -1
  372. package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +0 -1
  373. package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  374. package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +0 -1
  375. package/fesm2015/breeze-client-mixin-save-queuing.js.map +0 -1
  376. package/fesm2015/breeze-client.js.map +0 -1
  377. package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  378. package/fesm5/breeze-client-adapter-ajax-fetch.js.map +0 -1
  379. package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  380. package/fesm5/breeze-client-adapter-ajax-jquery.js.map +0 -1
  381. package/fesm5/breeze-client-adapter-ajax-post.js.map +0 -1
  382. package/fesm5/breeze-client-adapter-data-service-odata.js.map +0 -1
  383. package/fesm5/breeze-client-adapter-data-service-webapi.js.map +0 -1
  384. package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  385. package/fesm5/breeze-client-adapter-model-library-ko.js.map +0 -1
  386. package/fesm5/breeze-client-adapter-uri-builder-json.js +0 -92
  387. package/fesm5/breeze-client-adapter-uri-builder-json.js.map +0 -1
  388. package/fesm5/breeze-client-adapter-uri-builder-odata.js +0 -250
  389. package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  390. package/fesm5/breeze-client-mixin-get-entity-graph.js.map +0 -1
  391. package/fesm5/breeze-client-mixin-save-queuing.js.map +0 -1
  392. package/fesm5/breeze-client.js.map +0 -1
  393. package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +0 -1
  394. package/mixin-get-entity-graph/package.json +0 -13
  395. package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +0 -1
  396. package/mixin-save-queuing/package.json +0 -13
  397. package/public_api.d.ts +0 -1
@@ -0,0 +1,187 @@
1
+ import { DataProperty } from './entity-metadata';
2
+ import { EntityKey } from './entity-key';
3
+ import { EntityState } from './entity-state';
4
+ import { MergeStrategy } from './query-options';
5
+ /** @hidden @internal */
6
+ export class EntityGroup {
7
+ constructor(entityManager, entityType) {
8
+ this.entityManager = entityManager;
9
+ this.entityType = entityType;
10
+ // freeze the entityType after the first instance of this type is either created or queried.
11
+ this.entityType.isFrozen = true;
12
+ this._indexMap = {};
13
+ this._entities = [];
14
+ this._emptyIndexes = [];
15
+ }
16
+ attachEntity(entity, entityState, mergeStrategy) {
17
+ // entity should already have an aspect.
18
+ let aspect = entity.entityAspect;
19
+ if (!aspect._initialized) {
20
+ this.entityType._initializeInstance(entity);
21
+ }
22
+ delete aspect._initialized;
23
+ let keyInGroup = aspect.getKey()._keyInGroup;
24
+ let ix = this._indexMap[keyInGroup];
25
+ if (ix >= 0) {
26
+ // safecast because key was found not ix will not return a null
27
+ let targetEntity = this._entities[ix];
28
+ let targetEntityState = targetEntity.entityAspect.entityState;
29
+ let wasUnchanged = targetEntityState.isUnchanged();
30
+ if (targetEntity === entity) {
31
+ aspect.entityState = entityState;
32
+ }
33
+ else if (mergeStrategy === MergeStrategy.Disallowed) {
34
+ throw new Error("A MergeStrategy of 'Disallowed' does not allow you to attach an entity when an entity with the same key is already attached: " + aspect.getKey());
35
+ }
36
+ else if (mergeStrategy === MergeStrategy.OverwriteChanges || (mergeStrategy === MergeStrategy.PreserveChanges && wasUnchanged)) {
37
+ // unwrapInstance returns an entity with server side property names - so we need to use DataProperty.getRawValueFromServer these when we apply
38
+ // the property values back to the target.
39
+ let rawServerEntity = this.entityManager.helper.unwrapInstance(entity);
40
+ this.entityType._updateTargetFromRaw(targetEntity, rawServerEntity, DataProperty.getRawValueFromServer);
41
+ targetEntity.entityAspect.setEntityState(entityState);
42
+ }
43
+ return targetEntity;
44
+ }
45
+ else {
46
+ if (this._emptyIndexes.length === 0) {
47
+ ix = this._entities.push(entity) - 1;
48
+ }
49
+ else {
50
+ ix = this._emptyIndexes.pop();
51
+ this._entities[ix] = entity;
52
+ }
53
+ this._indexMap[keyInGroup] = ix;
54
+ aspect.entityState = entityState;
55
+ aspect.entityGroup = this;
56
+ aspect.entityManager = this.entityManager;
57
+ return entity;
58
+ }
59
+ }
60
+ detachEntity(entity) {
61
+ // by this point we have already determined that this entity
62
+ // belongs to this group.
63
+ let aspect = entity.entityAspect;
64
+ let keyInGroup = aspect.getKey()._keyInGroup;
65
+ let ix = this._indexMap[keyInGroup];
66
+ if (ix === undefined) {
67
+ // shouldn't happen.
68
+ throw new Error("internal error - entity cannot be found in group");
69
+ }
70
+ delete this._indexMap[keyInGroup];
71
+ this._emptyIndexes.push(ix);
72
+ this._entities[ix] = null;
73
+ return entity;
74
+ }
75
+ // returns entity based on an entity key defined either as an array of key values or an EntityKey
76
+ findEntityByKey(entityKey) {
77
+ let keyInGroup;
78
+ if (entityKey instanceof EntityKey) {
79
+ keyInGroup = entityKey._keyInGroup;
80
+ }
81
+ else {
82
+ keyInGroup = EntityKey.createKeyString(entityKey);
83
+ }
84
+ let ix = this._indexMap[keyInGroup];
85
+ // can't use just (ix) below because 0 is valid
86
+ let r = (ix !== undefined) ? this._entities[ix] : undefined;
87
+ // coerce null to undefined
88
+ return r == null ? undefined : r;
89
+ }
90
+ hasChanges() {
91
+ let entities = this._entities;
92
+ let unchanged = EntityState.Unchanged;
93
+ for (let i = 0, len = entities.length; i < len; i++) {
94
+ let e = entities[i];
95
+ if (e && e.entityAspect.entityState !== unchanged) {
96
+ return true;
97
+ }
98
+ }
99
+ return false;
100
+ }
101
+ getChanges() {
102
+ let entities = this._entities;
103
+ let unchanged = EntityState.Unchanged;
104
+ let changes = [];
105
+ for (let i = 0, len = entities.length; i < len; i++) {
106
+ let e = entities[i];
107
+ if (e && e.entityAspect.entityState !== unchanged) {
108
+ changes.push(e);
109
+ }
110
+ }
111
+ return changes;
112
+ }
113
+ getEntities(entityStates) {
114
+ let filter = getFilter(entityStates);
115
+ return this._entities.filter(filter);
116
+ }
117
+ _checkOperation(operationName) {
118
+ this._entities.forEach(function (entity) {
119
+ entity && entity.entityAspect._checkOperation(operationName);
120
+ });
121
+ // for chaining;
122
+ return this;
123
+ }
124
+ // do not expose this method. It is doing a special purpose INCOMPLETE fast detach operation
125
+ // just for the entityManager clear method - the entityGroup will be in an inconsistent state
126
+ // after this op, which is ok because it will be thrown away.
127
+ // TODO: rename this to be clear that it is UNSAFE...
128
+ _clear() {
129
+ this._entities.forEach(function (entity) {
130
+ if (entity != null) {
131
+ entity.entityAspect._detach();
132
+ }
133
+ });
134
+ this._entities = null;
135
+ this._indexMap = null;
136
+ this._emptyIndexes = null;
137
+ }
138
+ _updateFkVal(fkProp, oldValue, newValue) {
139
+ let fkPropName = fkProp.name;
140
+ this._entities.forEach(function (entity) {
141
+ if (entity != null) {
142
+ if (entity.getProperty(fkPropName) === oldValue) {
143
+ entity.setProperty(fkPropName, newValue);
144
+ }
145
+ }
146
+ });
147
+ }
148
+ _fixupKey(tempValue, realValue) {
149
+ // single part keys appear directly in map
150
+ let ix = this._indexMap[tempValue];
151
+ if (ix === undefined) {
152
+ throw new Error("Internal Error in key fixup - unable to locate entity");
153
+ }
154
+ let entity = this._entities[ix];
155
+ let keyPropName = entity.entityType.keyProperties[0].name;
156
+ // fks on related entities will automatically get updated by this as well
157
+ entity.setProperty(keyPropName, realValue);
158
+ delete entity.entityAspect.hasTempKey;
159
+ delete this._indexMap[tempValue];
160
+ this._indexMap[realValue] = ix;
161
+ }
162
+ _replaceKey(oldKey, newKey) {
163
+ let ix = this._indexMap[oldKey._keyInGroup];
164
+ delete this._indexMap[oldKey._keyInGroup];
165
+ this._indexMap[newKey._keyInGroup] = ix;
166
+ }
167
+ }
168
+ function getFilter(entityStates) {
169
+ if (entityStates.length === 0) {
170
+ return function (e) {
171
+ return !!e;
172
+ };
173
+ }
174
+ else if (entityStates.length === 1) {
175
+ let entityState = entityStates[0];
176
+ return function (e) {
177
+ return !!e && e.entityAspect.entityState === entityState;
178
+ };
179
+ }
180
+ else {
181
+ return function (e) {
182
+ return !!e && -1 !== entityStates.indexOf(e.entityAspect.entityState);
183
+ };
184
+ }
185
+ }
186
+ // do not expose EntityGroup - internal only
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWdyb3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VudGl0eS1ncm91cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWMsWUFBWSxFQUFHLE1BQU0sbUJBQW1CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELHdCQUF3QjtBQUN4QixNQUFNLE9BQU8sV0FBVztJQU90QixZQUFZLGFBQTRCLEVBQUUsVUFBc0I7UUFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsNEZBQTRGO1FBQzVGLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBR0QsWUFBWSxDQUFDLE1BQWMsRUFBRSxXQUF3QixFQUFFLGFBQTZCO1FBQ2xGLHdDQUF3QztRQUN4QyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBRWpDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0M7UUFDRCxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFFM0IsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxJQUFJLEVBQUUsR0FBRyxJ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Q0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzFDLENBQUM7Q0FFRjtBQUVELFNBQVMsU0FBUyxDQUFDLFlBQTJCO0lBQzVDLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDN0IsT0FBTyxVQUFVLENBQVM7WUFDeEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO0tBQ0g7U0FBTSxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3BDLElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxPQUFPLFVBQVUsQ0FBUztZQUN4QixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDO1FBQzNELENBQUMsQ0FBQztLQUNIO1NBQU07UUFDTCxPQUFPLFVBQVUsQ0FBUztZQUN4QixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQztLQUNIO0FBQ0gsQ0FBQztBQUdELDRDQUE0QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcbmltcG9ydCB7IEVudGl0eVR5cGUsIERhdGFQcm9wZXJ0eSAgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEVudGl0eUtleSB9IGZyb20gJy4vZW50aXR5LWtleSc7XHJcbmltcG9ydCB7IEVudGl0eVN0YXRlIH0gZnJvbSAnLi9lbnRpdHktc3RhdGUnO1xyXG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSAnLi9lbnRpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IE1lcmdlU3RyYXRlZ3kgfSBmcm9tICcuL3F1ZXJ5LW9wdGlvbnMnO1xyXG5cclxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBFbnRpdHlHcm91cCB7XHJcbiAgZW50aXR5TWFuYWdlcjogRW50aXR5TWFuYWdlcjtcclxuICBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlO1xyXG4gIF9pbmRleE1hcDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9O1xyXG4gIF9lbnRpdGllczogKEVudGl0eSB8IG51bGwpW107XHJcbiAgX2VtcHR5SW5kZXhlczogbnVtYmVyW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXIsIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICAgIHRoaXMuZW50aXR5TWFuYWdlciA9IGVudGl0eU1hbmFnZXI7XHJcbiAgICB0aGlzLmVudGl0eVR5cGUgPSBlbnRpdHlUeXBlO1xyXG4gICAgLy8gZnJlZXplIHRoZSBlbnRpdHlUeXBlIGFmdGVyIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgaXMgZWl0aGVyIGNyZWF0ZWQgb3IgcXVlcmllZC5cclxuICAgIHRoaXMuZW50aXR5VHlwZS5pc0Zyb3plbiA9IHRydWU7XHJcbiAgICB0aGlzLl9pbmRleE1hcCA9IHt9O1xyXG4gICAgdGhpcy5fZW50aXRpZXMgPSBbXTtcclxuICAgIHRoaXMuX2VtcHR5SW5kZXhlcyA9IFtdO1xyXG4gIH1cclxuXHJcblxyXG4gIGF0dGFjaEVudGl0eShlbnRpdHk6IEVudGl0eSwgZW50aXR5U3RhdGU6IEVudGl0eVN0YXRlLCBtZXJnZVN0cmF0ZWd5PzogTWVyZ2VTdHJhdGVneSkge1xyXG4gICAgLy8gZW50aXR5IHNob3VsZCBhbHJlYWR5IGhhdmUgYW4gYXNwZWN0LlxyXG4gICAgbGV0IGFzcGVjdCA9IGVudGl0eS5lbnRpdHlBc3BlY3Q7XHJcblxyXG4gICAgaWYgKCFhc3BlY3QuX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIHRoaXMuZW50aXR5VHlwZS5faW5pdGlhbGl6ZUluc3RhbmNlKGVudGl0eSk7XHJcbiAgICB9XHJcbiAgICBkZWxldGUgYXNwZWN0Ll9pbml0aWFsaXplZDtcclxuXHJcbiAgICBsZXQga2V5SW5Hcm91cCA9IGFzcGVjdC5nZXRLZXkoKS5fa2V5SW5Hcm91cDtcclxuICAgIGxldCBpeCA9IHRoaXMuX2luZGV4TWFwW2tleUluR3JvdXBdO1xyXG4gICAgaWYgKGl4ID49IDApIHtcclxuICAgICAgLy8gc2FmZWNhc3QgYmVjYXVzZSBrZXkgd2FzIGZvdW5kIG5vdCBpeCB3aWxsIG5vdCByZXR1cm4gYSBudWxsXHJcbiAgICAgIGxldCB0YXJnZXRFbnRpdHkgPSB0aGlzLl9lbnRpdGllc1tpeF0gYXMgRW50aXR5O1xyXG4gICAgICBsZXQgdGFyZ2V0RW50aXR5U3RhdGUgPSB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlO1xyXG4gICAgICBsZXQgd2FzVW5jaGFuZ2VkID0gdGFyZ2V0RW50aXR5U3RhdGUuaXNVbmNoYW5nZWQoKTtcclxuICAgICAgaWYgKHRhcmdldEVudGl0eSA9PT0gZW50aXR5KSB7XHJcbiAgICAgICAgYXNwZWN0LmVudGl0eVN0YXRlID0gZW50aXR5U3RhdGU7XHJcbiAgICAgIH0gZWxzZSBpZiAobWVyZ2VTdHJhdGVneSA9PT0gTWVyZ2VTdHJhdGVneS5EaXNhbGxvd2VkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBNZXJnZVN0cmF0ZWd5IG9mICdEaXNhbGxvd2VkJyBkb2VzIG5vdCBhbGxvdyB5b3UgdG8gYXR0YWNoIGFuIGVudGl0eSB3aGVuIGFuIGVudGl0eSB3aXRoIHRoZSBzYW1lIGtleSBpcyBhbHJlYWR5IGF0dGFjaGVkOiBcIiArIGFzcGVjdC5nZXRLZXkoKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAobWVyZ2VTdHJhdGVneSA9PT0gTWVyZ2VTdHJhdGVneS5PdmVyd3JpdGVDaGFuZ2VzIHx8IChtZXJnZVN0cmF0ZWd5ID09PSBNZXJnZVN0cmF0ZWd5LlByZXNlcnZlQ2hhbmdlcyAmJiB3YXNVbmNoYW5nZWQpKSB7XHJcbiAgICAgICAgLy8gdW53cmFwSW5zdGFuY2UgcmV0dXJucyBhbiBlbnRpdHkgd2l0aCBzZXJ2ZXIgc2lkZSBwcm9wZXJ0eSBuYW1lcyAtIHNvIHdlIG5lZWQgdG8gdXNlIERhdGFQcm9wZXJ0eS5nZXRSYXdWYWx1ZUZyb21TZXJ2ZXIgdGhlc2Ugd2hlbiB3ZSBhcHBseVxyXG4gICAgICAgIC8vIHRoZSBwcm9wZXJ0eSB2YWx1ZXMgYmFjayB0byB0aGUgdGFyZ2V0LlxyXG4gICAgICAgIGxldCByYXdTZXJ2ZXJFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuaGVscGVyLnVud3JhcEluc3RhbmNlKGVudGl0eSk7XHJcbiAgICAgICAgdGhpcy5lbnRpdHlUeXBlLl91cGRhdGVUYXJnZXRGcm9tUmF3KHRhcmdldEVudGl0eSwgcmF3U2VydmVyRW50aXR5LCBEYXRhUHJvcGVydHkuZ2V0UmF3VmFsdWVGcm9tU2VydmVyKTtcclxuICAgICAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LnNldEVudGl0eVN0YXRlKGVudGl0eVN0YXRlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGFyZ2V0RW50aXR5O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX2VtcHR5SW5kZXhlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBpeCA9IHRoaXMuX2VudGl0aWVzLnB1c2goZW50aXR5KSAtIDE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXggPSB0aGlzLl9lbXB0eUluZGV4ZXMucG9wKCk7XHJcbiAgICAgICAgdGhpcy5fZW50aXRpZXNbaXhdID0gZW50aXR5O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2luZGV4TWFwW2tleUluR3JvdXBdID0gaXg7XHJcbiAgICAgIGFzcGVjdC5lbnRpdHlTdGF0ZSA9IGVudGl0eVN0YXRlO1xyXG4gICAgICBhc3BlY3QuZW50aXR5R3JvdXAgPSB0aGlzO1xyXG4gICAgICBhc3BlY3QuZW50aXR5TWFuYWdlciA9IHRoaXMuZW50aXR5TWFuYWdlcjtcclxuICAgICAgcmV0dXJuIGVudGl0eTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRldGFjaEVudGl0eShlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgLy8gYnkgdGhpcyBwb2ludCB3ZSBoYXZlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0IHRoaXMgZW50aXR5XHJcbiAgICAvLyBiZWxvbmdzIHRvIHRoaXMgZ3JvdXAuXHJcbiAgICBsZXQgYXNwZWN0ID0gZW50aXR5LmVudGl0eUFzcGVjdDtcclxuICAgIGxldCBrZXlJbkdyb3VwID0gYXNwZWN0LmdldEtleSgpLl9rZXlJbkdyb3VwO1xyXG4gICAgbGV0IGl4ID0gdGhpcy5faW5kZXhNYXBba2V5SW5Hcm91cF07XHJcbiAgICBpZiAoaXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuLlxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnRlcm5hbCBlcnJvciAtIGVudGl0eSBjYW5ub3QgYmUgZm91bmQgaW4gZ3JvdXBcIik7XHJcbiAgICB9XHJcbiAgICBkZWxldGUgdGhpcy5faW5kZXhNYXBba2V5SW5Hcm91cF07XHJcbiAgICB0aGlzLl9lbXB0eUluZGV4ZXMucHVzaChpeCk7XHJcbiAgICB0aGlzLl9lbnRpdGllc1tpeF0gPSBudWxsO1xyXG4gICAgcmV0dXJuIGVudGl0eTtcclxuICB9XHJcblxyXG5cclxuICAvLyByZXR1cm5zIGVudGl0eSBiYXNlZCBvbiBhbiBlbnRpdHkga2V5IGRlZmluZWQgZWl0aGVyIGFzIGFuIGFycmF5IG9mIGtleSB2YWx1ZXMgb3IgYW4gRW50aXR5S2V5XHJcbiAgZmluZEVudGl0eUJ5S2V5KGVudGl0eUtleTogRW50aXR5S2V5KSB7XHJcbiAgICBsZXQga2V5SW5Hcm91cDogc3RyaW5nO1xyXG4gICAgaWYgKGVudGl0eUtleSBpbnN0YW5jZW9mIEVudGl0eUtleSkge1xyXG4gICAgICBrZXlJbkdyb3VwID0gZW50aXR5S2V5Ll9rZXlJbkdyb3VwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAga2V5SW5Hcm91cCA9IEVudGl0eUtleS5jcmVhdGVLZXlTdHJpbmcoZW50aXR5S2V5KTtcclxuICAgIH1cclxuICAgIGxldCBpeCA9IHRoaXMuX2luZGV4TWFwW2tleUluR3JvdXBdO1xyXG4gICAgLy8gY2FuJ3QgdXNlIGp1c3QgKGl4KSBiZWxvdyBiZWNhdXNlIDAgaXMgdmFsaWRcclxuICAgIGxldCByID0gKGl4ICE9PSB1bmRlZmluZWQpID8gdGhpcy5fZW50aXRpZXNbaXhdIDogdW5kZWZpbmVkO1xyXG4gICAgLy8gY29lcmNlIG51bGwgdG8gdW5kZWZpbmVkXHJcbiAgICByZXR1cm4gciA9PSBudWxsID8gdW5kZWZpbmVkIDogcjtcclxuICB9XHJcblxyXG4gIGhhc0NoYW5nZXMoKSB7XHJcbiAgICBsZXQgZW50aXRpZXMgPSB0aGlzLl9lbnRpdGllcztcclxuICAgIGxldCB1bmNoYW5nZWQgPSBFbnRpdHlTdGF0ZS5VbmNoYW5nZWQ7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZW50aXRpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgbGV0IGUgPSBlbnRpdGllc1tpXTtcclxuICAgICAgaWYgKGUgJiYgZS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUgIT09IHVuY2hhbmdlZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRDaGFuZ2VzKCkge1xyXG4gICAgbGV0IGVudGl0aWVzID0gdGhpcy5fZW50aXRpZXM7XHJcbiAgICBsZXQgdW5jaGFuZ2VkID0gRW50aXR5U3RhdGUuVW5jaGFuZ2VkO1xyXG4gICAgbGV0IGNoYW5nZXM6IEVudGl0eVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZW50aXRpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgbGV0IGUgPSBlbnRpdGllc1tpXTtcclxuICAgICAgaWYgKGUgJiYgZS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUgIT09IHVuY2hhbmdlZCkge1xyXG4gICAgICAgIGNoYW5nZXMucHVzaChlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoYW5nZXM7XHJcbiAgfVxyXG5cclxuICBnZXRFbnRpdGllcyhlbnRpdHlTdGF0ZXM6IEVudGl0eVN0YXRlW10pIHtcclxuICAgIGxldCBmaWx0ZXIgPSBnZXRGaWx0ZXIoZW50aXR5U3RhdGVzKTtcclxuICAgIHJldHVybiB0aGlzLl9lbnRpdGllcy5maWx0ZXIoZmlsdGVyKSBhcyBFbnRpdHlbXTtcclxuICB9XHJcblxyXG4gIF9jaGVja09wZXJhdGlvbihvcGVyYXRpb25OYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2VudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xyXG4gICAgICBlbnRpdHkgJiYgZW50aXR5LmVudGl0eUFzcGVjdC5fY2hlY2tPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7XHJcbiAgICB9KTtcclxuICAgIC8vIGZvciBjaGFpbmluZztcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gZG8gbm90IGV4cG9zZSB0aGlzIG1ldGhvZC4gSXQgaXMgZG9pbmcgYSBzcGVjaWFsIHB1cnBvc2UgSU5DT01QTEVURSBmYXN0IGRldGFjaCBvcGVyYXRpb25cclxuICAvLyBqdXN0IGZvciB0aGUgZW50aXR5TWFuYWdlciBjbGVhciBtZXRob2QgLSB0aGUgZW50aXR5R3JvdXAgd2lsbCBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGVcclxuICAvLyBhZnRlciB0aGlzIG9wLCB3aGljaCBpcyBvayBiZWNhdXNlIGl0IHdpbGwgYmUgdGhyb3duIGF3YXkuXHJcbiAgLy8gVE9ETzogcmVuYW1lIHRoaXMgdG8gYmUgY2xlYXIgdGhhdCBpdCBpcyBVTlNBRkUuLi5cclxuICBfY2xlYXIoKSB7XHJcbiAgICB0aGlzLl9lbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcclxuICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7XHJcbiAgICAgICAgZW50aXR5LmVudGl0eUFzcGVjdC5fZGV0YWNoKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgKHRoaXMgYXMgYW55KS5fZW50aXRpZXMgPSBudWxsO1xyXG4gICAgKHRoaXMgYXMgYW55KS5faW5kZXhNYXAgPSBudWxsO1xyXG4gICAgKHRoaXMgYXMgYW55KS5fZW1wdHlJbmRleGVzID0gbnVsbDtcclxuICB9XHJcblxyXG4gIF91cGRhdGVGa1ZhbChma1Byb3A6IERhdGFQcm9wZXJ0eSwgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkge1xyXG4gICAgbGV0IGZrUHJvcE5hbWUgPSBma1Byb3AubmFtZTtcclxuICAgIHRoaXMuX2VudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xyXG4gICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoZW50aXR5LmdldFByb3BlcnR5KGZrUHJvcE5hbWUpID09PSBvbGRWYWx1ZSkge1xyXG4gICAgICAgICAgZW50aXR5LnNldFByb3BlcnR5KGZrUHJvcE5hbWUsIG5ld1ZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2ZpeHVwS2V5KHRlbXBWYWx1ZTogYW55LCByZWFsVmFsdWU6IGFueSkge1xyXG4gICAgLy8gc2luZ2xlIHBhcnQga2V5cyBhcHBlYXIgZGlyZWN0bHkgaW4gbWFwXHJcbiAgICBsZXQgaXggPSB0aGlzLl9pbmRleE1hcFt0ZW1wVmFsdWVdO1xyXG4gICAgaWYgKGl4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW50ZXJuYWwgRXJyb3IgaW4ga2V5IGZpeHVwIC0gdW5hYmxlIHRvIGxvY2F0ZSBlbnRpdHlcIik7XHJcbiAgICB9XHJcbiAgICBsZXQgZW50aXR5ID0gdGhpcy5fZW50aXRpZXNbaXhdIGFzIEVudGl0eTtcclxuICAgIGxldCBrZXlQcm9wTmFtZSA9IGVudGl0eS5lbnRpdHlUeXBlLmtleVByb3BlcnRpZXNbMF0ubmFtZTtcclxuICAgIC8vIGZrcyBvbiByZWxhdGVkIGVudGl0aWVzIHdpbGwgYXV0b21hdGljYWxseSBnZXQgdXBkYXRlZCBieSB0aGlzIGFzIHdlbGxcclxuICAgIGVudGl0eS5zZXRQcm9wZXJ0eShrZXlQcm9wTmFtZSwgcmVhbFZhbHVlKTtcclxuICAgIGRlbGV0ZSBlbnRpdHkuZW50aXR5QXNwZWN0Lmhhc1RlbXBLZXk7XHJcbiAgICBkZWxldGUgdGhpcy5faW5kZXhNYXBbdGVtcFZhbHVlXTtcclxuICAgIHRoaXMuX2luZGV4TWFwW3JlYWxWYWx1ZV0gPSBpeDtcclxuICB9XHJcblxyXG4gIF9yZXBsYWNlS2V5KG9sZEtleTogRW50aXR5S2V5LCBuZXdLZXk6IEVudGl0eUtleSkge1xyXG4gICAgbGV0IGl4ID0gdGhpcy5faW5kZXhNYXBbb2xkS2V5Ll9rZXlJbkdyb3VwXTtcclxuICAgIGRlbGV0ZSB0aGlzLl9pbmRleE1hcFtvbGRLZXkuX2tleUluR3JvdXBdO1xyXG4gICAgdGhpcy5faW5kZXhNYXBbbmV3S2V5Ll9rZXlJbkdyb3VwXSA9IGl4O1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEZpbHRlcihlbnRpdHlTdGF0ZXM6IEVudGl0eVN0YXRlW10pIHtcclxuICBpZiAoZW50aXR5U3RhdGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlOiBFbnRpdHkpIHtcclxuICAgICAgcmV0dXJuICEhZTtcclxuICAgIH07XHJcbiAgfSBlbHNlIGlmIChlbnRpdHlTdGF0ZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICBsZXQgZW50aXR5U3RhdGUgPSBlbnRpdHlTdGF0ZXNbMF07XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGU6IEVudGl0eSkge1xyXG4gICAgICByZXR1cm4gISFlICYmIGUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlID09PSBlbnRpdHlTdGF0ZTtcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZTogRW50aXR5KSB7XHJcbiAgICAgIHJldHVybiAhIWUgJiYgLTEgIT09IGVudGl0eVN0YXRlcy5pbmRleE9mKGUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlKTtcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG5cclxuLy8gZG8gbm90IGV4cG9zZSBFbnRpdHlHcm91cCAtIGludGVybmFsIG9ubHlcclxuXHJcblxyXG4iXX0=
@@ -0,0 +1,116 @@
1
+ import { core } from './core';
2
+ import { assertParam } from './assert-param';
3
+ import { EntityType } from './entity-metadata';
4
+ import { DataType } from './data-type';
5
+ /**
6
+ An EntityKey is an object that represents the unique identity of an entity. EntityKey's are immutable.
7
+
8
+
9
+ **/
10
+ export class EntityKey {
11
+ /**
12
+ Constructs a new EntityKey. Each entity within an EntityManager will have a unique EntityKey.
13
+ > // assume em1 is an EntityManager containing a number of existing entities.
14
+ > var empType = em1.metadataStore.getEntityType("Employee");
15
+ > var entityKey = new EntityKey(empType, 1);
16
+
17
+ EntityKey's may also be found by calling EntityAspect.getKey()
18
+ > // assume employee1 is an existing Employee entity
19
+ > var empKey = employee1.entityAspect.getKey();
20
+
21
+ Multipart keys are created by passing an array as the 'keyValues' parameter
22
+ > var empTerrType = em1.metadataStore.getEntityType("EmployeeTerritory");
23
+ > var empTerrKey = new EntityKey(empTerrType, [ 1, 77]);
24
+ > // The order of the properties in the 'keyValues' array must be the same as that
25
+ > // returned by empTerrType.keyProperties
26
+ @param entityType - The [[EntityType]] of the entity.
27
+ @param keyValues - A single value or an array of values.
28
+ */
29
+ constructor(entityType, keyValues) {
30
+ assertParam(entityType, "entityType").isInstanceOf(EntityType).check();
31
+ let subtypes = entityType.getSelfAndSubtypes();
32
+ if (subtypes.length > 1) {
33
+ this._subtypes = subtypes.filter(function (st) {
34
+ return st.isAbstract === false;
35
+ });
36
+ }
37
+ if (!Array.isArray(keyValues)) {
38
+ keyValues = [keyValues];
39
+ }
40
+ this.entityType = entityType;
41
+ entityType.keyProperties.forEach(function (kp, i) {
42
+ // insure that guid keys are comparable.
43
+ if (kp.dataType === DataType.Guid) {
44
+ keyValues[i] = keyValues[i] && keyValues[i].toLowerCase ? keyValues[i].toLowerCase() : keyValues[i];
45
+ }
46
+ });
47
+ this.values = keyValues;
48
+ this._keyInGroup = EntityKey.createKeyString(keyValues);
49
+ }
50
+ toJSON() {
51
+ return {
52
+ entityType: this.entityType.name,
53
+ values: this.values
54
+ };
55
+ }
56
+ static fromJSON(json, metadataStore) {
57
+ let et = metadataStore._getStructuralType(json.entityType, true);
58
+ return new EntityKey(et, json.values);
59
+ }
60
+ /**
61
+ Used to compare EntityKeys are determine if they refer to the same Entity.
62
+ There is also an static version of 'equals' with the same functionality.
63
+
64
+ > // assume em1 is an EntityManager containing a number of existing entities.
65
+ > var empType = em1.metadataStore.getEntityType("Employee");
66
+ > var empKey1 = new EntityKey(empType, 1);
67
+ > // assume employee1 is an existing Employee entity
68
+ > var empKey2 = employee1.entityAspect.getKey();
69
+ > if (empKey1.equals(empKey2)) {
70
+ > // do something ...
71
+ > }
72
+ **/
73
+ equals(entityKey) {
74
+ if (!(entityKey instanceof EntityKey))
75
+ return false;
76
+ return (this.entityType === entityKey.entityType) &&
77
+ core.arrayEquals(this.values, entityKey.values);
78
+ }
79
+ /*
80
+ Returns a human readable representation of this EntityKey.
81
+ */
82
+ toString(altEntityType) {
83
+ return (altEntityType || this.entityType).name + '-' + this._keyInGroup;
84
+ }
85
+ /**
86
+ Used to compare EntityKeys are determine if they refer to the same Entity.
87
+ There is also an instance version of 'equals' with the same functionality.
88
+ > // assume em1 is an EntityManager containing a number of existing entities.
89
+ > var empType = em1.metadataStore.getEntityType("Employee");
90
+ > var empKey1 = new EntityKey(empType, 1);
91
+ > // assume employee1 is an existing Employee entity
92
+ > var empKey2 = employee1.entityAspect.getKey();
93
+ > if (EntityKey.equals(empKey1, empKey2)) {
94
+ > // do something ...
95
+ > }
96
+ **/
97
+ static equals(k1, k2) {
98
+ if (!(k1 instanceof EntityKey))
99
+ return false;
100
+ return k1.equals(k2);
101
+ }
102
+ /** @hidden @internal */
103
+ // TODO: we may want to compare to default values later.
104
+ _isEmpty() {
105
+ return this.values.join("").length === 0;
106
+ }
107
+ /** hidden */
108
+ // TODO: think about giving _ prefix or documenting.
109
+ static createKeyString(keyValues) {
110
+ return keyValues.join(EntityKey.ENTITY_KEY_DELIMITER);
111
+ }
112
+ }
113
+ /** @hidden @internal */
114
+ EntityKey.ENTITY_KEY_DELIMITER = ":::";
115
+ EntityKey.prototype._$typeName = "EntityKey";
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWtleS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnRpdHkta2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQWlCLE1BQU0sbUJBQW1CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV2Qzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFlcEI7Ozs7Ozs7Ozs7Ozs7Ozs7O01BaUJFO0lBQ0YsWUFBWSxVQUFzQixFQUFFLFNBQWM7UUFDaEQsV0FBVyxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkUsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUMzQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM3QixTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN6QjtRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLFVBQVUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDOUMsd0NBQXdDO1lBQ3hDLElBQUksRUFBRSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFO2dCQUNqQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JHO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFMUQsQ0FBQztJQUdELE1BQU07UUFDSixPQUFPO1lBQ0wsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTtZQUNoQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVMsRUFBRSxhQUE0QjtRQUNyRCxJQUFJLEVBQUUsR0FBRyxhQUFhLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQWUsQ0FBQztRQUMvRSxPQUFPLElBQUksU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILE1BQU0sQ0FBQyxTQUFvQjtRQUN6QixJQUFJLENBQUMsQ0FBQyxTQUFTLFlBQVksU0FBUyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEQsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7TUFFRTtJQUNGLFFBQVEsQ0FBQyxhQUEwQjtRQUNqQyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFhLEVBQUUsRUFBYTtRQUN4QyxJQUFJLENBQUMsQ0FBQyxFQUFFLFlBQVksU0FBUyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0MsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsd0RBQXdEO0lBQ3hELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGFBQWE7SUFDYixvREFBb0Q7SUFDcEQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFnQjtRQUNyQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDeEQsQ0FBQzs7QUExSEQsd0JBQXdCO0FBQ2pCLDhCQUFvQixHQUFHLEtBQUssQ0FBQztBQTRIdEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29yZSB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7IGFzc2VydFBhcmFtIH0gZnJvbSAnLi9hc3NlcnQtcGFyYW0nO1xyXG5pbXBvcnQgeyBFbnRpdHlUeXBlLCBNZXRhZGF0YVN0b3JlIH0gZnJvbSAnLi9lbnRpdHktbWV0YWRhdGEnO1xyXG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4vZGF0YS10eXBlJztcclxuXHJcbi8qKlxyXG5BbiBFbnRpdHlLZXkgaXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pcXVlIGlkZW50aXR5IG9mIGFuIGVudGl0eS4gIEVudGl0eUtleSdzIGFyZSBpbW11dGFibGUuXHJcblxyXG5cclxuKiovXHJcbmV4cG9ydCBjbGFzcyBFbnRpdHlLZXkge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF8kdHlwZU5hbWU6IHN0cmluZzsgLy8gYWN0dWFsbHkgcGxhY2VkIG9uIHByb3RvdHlwZVxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIHN0YXRpYyBFTlRJVFlfS0VZX0RFTElNSVRFUiA9IFwiOjo6XCI7XHJcbiAgLyoqICBUaGUgJ0VudGl0eVR5cGUnIHRoYXQgdGhpcyBpcyBhIGtleSBmb3IuIF9fUmVhZCBPbmx5X18gKi9cclxuICBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlO1xyXG4gIC8qKiAgQW4gYXJyYXkgb2YgdGhlIHZhbHVlcyBmb3IgdGhpcyBrZXkuIFRoaXMgd2lsbCB1c3VhbGx5IG9ubHkgaGF2ZSBhIHNpbmdsZSBlbGVtZW50LCBcclxuICB1bmxlc3MgdGhlIGVudGl0eSB0eXBlIGhhcyBhIG11bHRpcGFydCBrZXkuIF9fUmVhZCBPbmx5X18gKi9cclxuICB2YWx1ZXM6IGFueVtdO1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9rZXlJbkdyb3VwOiBzdHJpbmc7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3N1YnR5cGVzOiBFbnRpdHlUeXBlW107XHJcblxyXG4gIC8qKlxyXG4gIENvbnN0cnVjdHMgYSBuZXcgRW50aXR5S2V5LiAgRWFjaCBlbnRpdHkgd2l0aGluIGFuIEVudGl0eU1hbmFnZXIgd2lsbCBoYXZlIGEgdW5pcXVlIEVudGl0eUtleS5cclxuICA+ICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICB2YXIgZW1wVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJFbXBsb3llZVwiKTtcclxuICA+ICAgICB2YXIgZW50aXR5S2V5ID0gbmV3IEVudGl0eUtleShlbXBUeXBlLCAxKTtcclxuXHJcbiAgRW50aXR5S2V5J3MgbWF5IGFsc28gYmUgZm91bmQgYnkgY2FsbGluZyBFbnRpdHlBc3BlY3QuZ2V0S2V5KClcclxuICA+ICAgICAvLyBhc3N1bWUgZW1wbG95ZWUxIGlzIGFuIGV4aXN0aW5nIEVtcGxveWVlIGVudGl0eVxyXG4gID4gICAgIHZhciBlbXBLZXkgPSBlbXBsb3llZTEuZW50aXR5QXNwZWN0LmdldEtleSgpO1xyXG5cclxuICBNdWx0aXBhcnQga2V5cyBhcmUgY3JlYXRlZCBieSBwYXNzaW5nIGFuIGFycmF5IGFzIHRoZSAna2V5VmFsdWVzJyBwYXJhbWV0ZXJcclxuICA+ICAgICB2YXIgZW1wVGVyclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiRW1wbG95ZWVUZXJyaXRvcnlcIik7XHJcbiAgPiAgICAgdmFyIGVtcFRlcnJLZXkgPSBuZXcgRW50aXR5S2V5KGVtcFRlcnJUeXBlLCBbIDEsIDc3XSk7XHJcbiAgPiAgICAgLy8gVGhlIG9yZGVyIG9mIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSAna2V5VmFsdWVzJyBhcnJheSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoYXRcclxuICA+ICAgICAvLyByZXR1cm5lZCBieSBlbXBUZXJyVHlwZS5rZXlQcm9wZXJ0aWVzXHJcbiAgQHBhcmFtIGVudGl0eVR5cGUgLSBUaGUgW1tFbnRpdHlUeXBlXV0gb2YgdGhlIGVudGl0eS5cclxuICBAcGFyYW0ga2V5VmFsdWVzIC0gQSBzaW5nbGUgdmFsdWUgb3IgYW4gYXJyYXkgb2YgdmFsdWVzLiBcclxuICAqL1xyXG4gIGNvbnN0cnVjdG9yKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGtleVZhbHVlczogYW55KSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbnRpdHlUeXBlLCBcImVudGl0eVR5cGVcIikuaXNJbnN0YW5jZU9mKEVudGl0eVR5cGUpLmNoZWNrKCk7XHJcbiAgICBsZXQgc3VidHlwZXMgPSBlbnRpdHlUeXBlLmdldFNlbGZBbmRTdWJ0eXBlcygpO1xyXG4gICAgaWYgKHN1YnR5cGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5fc3VidHlwZXMgPSBzdWJ0eXBlcy5maWx0ZXIoZnVuY3Rpb24gKHN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHN0LmlzQWJzdHJhY3QgPT09IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5VmFsdWVzKSkge1xyXG4gICAgICBrZXlWYWx1ZXMgPSBba2V5VmFsdWVzXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVudGl0eVR5cGUgPSBlbnRpdHlUeXBlO1xyXG4gICAgZW50aXR5VHlwZS5rZXlQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKGtwLCBpKSB7XHJcbiAgICAgIC8vIGluc3VyZSB0aGF0IGd1aWQga2V5cyBhcmUgY29tcGFyYWJsZS5cclxuICAgICAgaWYgKGtwLmRhdGFUeXBlID09PSBEYXRhVHlwZS5HdWlkKSB7XHJcbiAgICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWVzW2ldICYmIGtleVZhbHVlc1tpXS50b0xvd2VyQ2FzZSA/IGtleVZhbHVlc1tpXS50b0xvd2VyQ2FzZSgpIDoga2V5VmFsdWVzW2ldO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZhbHVlcyA9IGtleVZhbHVlcztcclxuICAgIHRoaXMuX2tleUluR3JvdXAgPSBFbnRpdHlLZXkuY3JlYXRlS2V5U3RyaW5nKGtleVZhbHVlcyk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHRvSlNPTigpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGVudGl0eVR5cGU6IHRoaXMuZW50aXR5VHlwZS5uYW1lLFxyXG4gICAgICB2YWx1ZXM6IHRoaXMudmFsdWVzXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZyb21KU09OKGpzb246IGFueSwgbWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZSkge1xyXG4gICAgbGV0IGV0ID0gbWV0YWRhdGFTdG9yZS5fZ2V0U3RydWN0dXJhbFR5cGUoanNvbi5lbnRpdHlUeXBlLCB0cnVlKSBhcyBFbnRpdHlUeXBlO1xyXG4gICAgcmV0dXJuIG5ldyBFbnRpdHlLZXkoZXQsIGpzb24udmFsdWVzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFVzZWQgdG8gY29tcGFyZSBFbnRpdHlLZXlzIGFyZSBkZXRlcm1pbmUgaWYgdGhleSByZWZlciB0byB0aGUgc2FtZSBFbnRpdHkuXHJcbiAgVGhlcmUgaXMgYWxzbyBhbiBzdGF0aWMgdmVyc2lvbiBvZiAnZXF1YWxzJyB3aXRoIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkuXHJcbiAgXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIGV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICB2YXIgZW1wVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJFbXBsb3llZVwiKTtcclxuICA+ICAgICAgdmFyIGVtcEtleTEgPSBuZXcgRW50aXR5S2V5KGVtcFR5cGUsIDEpO1xyXG4gID4gICAgICAvLyBhc3N1bWUgZW1wbG95ZWUxIGlzIGFuIGV4aXN0aW5nIEVtcGxveWVlIGVudGl0eVxyXG4gID4gICAgICB2YXIgZW1wS2V5MiA9IGVtcGxveWVlMS5lbnRpdHlBc3BlY3QuZ2V0S2V5KCk7XHJcbiAgPiAgICAgIGlmIChlbXBLZXkxLmVxdWFscyhlbXBLZXkyKSkge1xyXG4gID4gICAgICAgICAgLy8gZG8gc29tZXRoaW5nICAuLi5cclxuICA+ICAgICAgfVxyXG4gICoqL1xyXG4gIGVxdWFscyhlbnRpdHlLZXk6IEVudGl0eUtleSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCEoZW50aXR5S2V5IGluc3RhbmNlb2YgRW50aXR5S2V5KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuICh0aGlzLmVudGl0eVR5cGUgPT09IGVudGl0eUtleS5lbnRpdHlUeXBlKSAmJlxyXG4gICAgICBjb3JlLmFycmF5RXF1YWxzKHRoaXMudmFsdWVzLCBlbnRpdHlLZXkudmFsdWVzKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRW50aXR5S2V5LlxyXG4gICovXHJcbiAgdG9TdHJpbmcoYWx0RW50aXR5VHlwZT86IEVudGl0eVR5cGUpIHtcclxuICAgIHJldHVybiAoYWx0RW50aXR5VHlwZSB8fCB0aGlzLmVudGl0eVR5cGUpLm5hbWUgKyAnLScgKyB0aGlzLl9rZXlJbkdyb3VwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgVXNlZCB0byBjb21wYXJlIEVudGl0eUtleXMgYXJlIGRldGVybWluZSBpZiB0aGV5IHJlZmVyIHRvIHRoZSBzYW1lIEVudGl0eS5cclxuICBUaGVyZSBpcyBhbHNvIGFuIGluc3RhbmNlIHZlcnNpb24gb2YgJ2VxdWFscycgd2l0aCB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LlxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgdmFyIGVtcFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiRW1wbG95ZWVcIik7XHJcbiAgPiAgICAgIHZhciBlbXBLZXkxID0gbmV3IEVudGl0eUtleShlbXBUeXBlLCAxKTtcclxuICA+ICAgICAgLy8gYXNzdW1lIGVtcGxveWVlMSBpcyBhbiBleGlzdGluZyBFbXBsb3llZSBlbnRpdHlcclxuICA+ICAgICAgdmFyIGVtcEtleTIgPSBlbXBsb3llZTEuZW50aXR5QXNwZWN0LmdldEtleSgpO1xyXG4gID4gICAgICBpZiAoRW50aXR5S2V5LmVxdWFscyhlbXBLZXkxLCBlbXBLZXkyKSkge1xyXG4gID4gICAgICAgICAgLy8gZG8gc29tZXRoaW5nICAuLi5cclxuICA+ICAgICAgfVxyXG4gICoqL1xyXG4gIHN0YXRpYyBlcXVhbHMoazE6IEVudGl0eUtleSwgazI6IEVudGl0eUtleSkge1xyXG4gICAgaWYgKCEoazEgaW5zdGFuY2VvZiBFbnRpdHlLZXkpKSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gazEuZXF1YWxzKGsyKTtcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIC8vIFRPRE86IHdlIG1heSB3YW50IHRvIGNvbXBhcmUgdG8gZGVmYXVsdCB2YWx1ZXMgbGF0ZXIuXHJcbiAgX2lzRW1wdHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuam9pbihcIlwiKS5sZW5ndGggPT09IDA7XHJcbiAgfVxyXG5cclxuICAvKiogaGlkZGVuICovXHJcbiAgLy8gVE9ETzogdGhpbmsgYWJvdXQgZ2l2aW5nIF8gcHJlZml4IG9yIGRvY3VtZW50aW5nLlxyXG4gIHN0YXRpYyBjcmVhdGVLZXlTdHJpbmcoa2V5VmFsdWVzOiBhbnlbXSkge1xyXG4gICAgcmV0dXJuIGtleVZhbHVlcy5qb2luKEVudGl0eUtleS5FTlRJVFlfS0VZX0RFTElNSVRFUik7XHJcbiAgfVxyXG5cclxufVxyXG5FbnRpdHlLZXkucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIkVudGl0eUtleVwiO1xyXG5cclxuXHJcbiJdfQ==