breeze-client 2.2.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +83 -63
  3. package/adapters/abstract-data-service-adapter.d.ts +120 -0
  4. package/adapters/abstract-data-service-adapter.js +395 -0
  5. package/adapters/abstract-data-service-adapter.js.map +1 -0
  6. package/adapters/adapter-ajax-fetch.d.ts +12 -0
  7. package/adapters/adapter-ajax-fetch.js +13 -0
  8. package/adapters/adapter-ajax-fetch.js.map +1 -0
  9. package/{adapter-ajax-post → adapters}/adapter-ajax-post.d.ts +40 -36
  10. package/{fesm2022/breeze-client-adapter-ajax-post.mjs → adapters/adapter-ajax-post.js} +80 -82
  11. package/adapters/adapter-ajax-post.js.map +1 -0
  12. package/{adapter-ajax-fetch → adapters}/adapter-core.d.ts +4 -4
  13. package/{fesm2022/breeze-client-adapter-uri-builder-json.mjs → adapters/adapter-core.js} +48 -91
  14. package/adapters/adapter-core.js.map +1 -0
  15. package/adapters/adapter-data-service-webapi.d.ts +9 -0
  16. package/{fesm2022/breeze-client-adapter-data-service-webapi.mjs → adapters/adapter-data-service-webapi.js} +105 -107
  17. package/adapters/adapter-data-service-webapi.js.map +1 -0
  18. package/adapters/adapter-model-library-backing-store.d.ts +32 -0
  19. package/adapters/adapter-model-library-backing-store.js +321 -0
  20. package/adapters/adapter-model-library-backing-store.js.map +1 -0
  21. package/adapters/adapter-uri-builder-json.d.ts +11 -0
  22. package/adapters/adapter-uri-builder-json.js +40 -0
  23. package/adapters/adapter-uri-builder-json.js.map +1 -0
  24. package/adapters/http.d.ts +52 -0
  25. package/adapters/http.js +202 -0
  26. package/adapters/http.js.map +1 -0
  27. package/angular/adapter-angular-httpclient.d.ts +21 -0
  28. package/angular/adapter-angular-httpclient.js +70 -0
  29. package/angular/adapter-angular-httpclient.js.map +1 -0
  30. package/breeze.d.ts +215 -0
  31. package/breeze.js +141 -0
  32. package/breeze.js.map +1 -0
  33. package/config/config.d.ts +212 -0
  34. package/config/config.js +392 -0
  35. package/config/config.js.map +1 -0
  36. package/config/configure.d.ts +66 -0
  37. package/config/configure.js +46 -0
  38. package/config/configure.js.map +1 -0
  39. package/config/default-adapters.d.ts +1 -0
  40. package/config/default-adapters.js +40 -0
  41. package/config/default-adapters.js.map +1 -0
  42. package/config/interface-registry.d.ts +191 -0
  43. package/config/interface-registry.js +5 -0
  44. package/config/interface-registry.js.map +1 -0
  45. package/{src → core}/assert-param.d.ts +52 -60
  46. package/core/assert-param.js +390 -0
  47. package/core/assert-param.js.map +1 -0
  48. package/core/core.d.ts +285 -0
  49. package/core/core.js +772 -0
  50. package/core/core.js.map +1 -0
  51. package/core/enum.d.ts +116 -0
  52. package/core/enum.js +167 -0
  53. package/core/enum.js.map +1 -0
  54. package/core/event.d.ts +169 -0
  55. package/core/event.js +338 -0
  56. package/core/event.js.map +1 -0
  57. package/entity/array.d.ts +3 -0
  58. package/entity/array.js +4 -0
  59. package/entity/array.js.map +1 -0
  60. package/entity/complex-array.d.ts +17 -0
  61. package/entity/complex-array.js +104 -0
  62. package/entity/complex-array.js.map +1 -0
  63. package/entity/default-property-interceptor.d.ts +1 -0
  64. package/entity/default-property-interceptor.js +496 -0
  65. package/entity/default-property-interceptor.js.map +1 -0
  66. package/{src → entity}/entity-action.d.ts +36 -42
  67. package/entity/entity-action.js +45 -0
  68. package/entity/entity-action.js.map +1 -0
  69. package/entity/entity-aspect.d.ts +457 -0
  70. package/entity/entity-aspect.js +1262 -0
  71. package/entity/entity-aspect.js.map +1 -0
  72. package/entity/entity-base.d.ts +55 -0
  73. package/entity/entity-base.js +41 -0
  74. package/entity/entity-base.js.map +1 -0
  75. package/entity/entity-group.d.ts +1 -0
  76. package/entity/entity-group.js +224 -0
  77. package/entity/entity-group.js.map +1 -0
  78. package/entity/entity-key.d.ts +95 -0
  79. package/entity/entity-key.js +189 -0
  80. package/entity/entity-key.js.map +1 -0
  81. package/{src → entity}/entity-state.d.ts +112 -84
  82. package/entity/entity-state.js +135 -0
  83. package/entity/entity-state.js.map +1 -0
  84. package/entity/key-generator.d.ts +57 -0
  85. package/entity/key-generator.js +155 -0
  86. package/entity/key-generator.js.map +1 -0
  87. package/entity/observable-array.d.ts +25 -0
  88. package/entity/observable-array.js +230 -0
  89. package/entity/observable-array.js.map +1 -0
  90. package/entity/primitive-array.d.ts +12 -0
  91. package/entity/primitive-array.js +71 -0
  92. package/entity/primitive-array.js.map +1 -0
  93. package/entity/relation-array.d.ts +24 -0
  94. package/entity/relation-array.js +176 -0
  95. package/entity/relation-array.js.map +1 -0
  96. package/entity/unattached-children-map.d.ts +1 -0
  97. package/entity/unattached-children-map.js +105 -0
  98. package/entity/unattached-children-map.js.map +1 -0
  99. package/generate-entity-classes.js +1176 -0
  100. package/manager/entity-manager.d.ts +801 -0
  101. package/manager/entity-manager.js +2395 -0
  102. package/manager/entity-manager.js.map +1 -0
  103. package/{src → manager}/save-options.d.ts +48 -42
  104. package/manager/save-options.js +51 -0
  105. package/manager/save-options.js.map +1 -0
  106. package/{src → metadata}/data-service.d.ts +229 -184
  107. package/metadata/data-service.js +246 -0
  108. package/metadata/data-service.js.map +1 -0
  109. package/metadata/data-type.d.ts +122 -0
  110. package/metadata/data-type.js +465 -0
  111. package/metadata/data-type.js.map +1 -0
  112. package/metadata/entity-metadata.d.ts +1193 -0
  113. package/metadata/entity-metadata.js +2502 -0
  114. package/metadata/entity-metadata.js.map +1 -0
  115. package/{src → metadata}/local-query-comparison-options.d.ts +65 -59
  116. package/metadata/local-query-comparison-options.js +69 -0
  117. package/metadata/local-query-comparison-options.js.map +1 -0
  118. package/{src → metadata}/naming-convention.d.ts +75 -72
  119. package/metadata/naming-convention.js +97 -0
  120. package/metadata/naming-convention.js.map +1 -0
  121. package/mixins/mixin-get-entity-graph.d.ts +63 -0
  122. package/{fesm2022/breeze-client-mixin-get-entity-graph.mjs → mixins/mixin-get-entity-graph.js} +331 -253
  123. package/mixins/mixin-get-entity-graph.js.map +1 -0
  124. package/mixins/mixin-save-queuing.d.ts +98 -0
  125. package/{fesm2022/breeze-client-mixin-save-queuing.mjs → mixins/mixin-save-queuing.js} +493 -365
  126. package/mixins/mixin-save-queuing.js.map +1 -0
  127. package/package.json +62 -93
  128. package/query/entity-query.d.ts +521 -0
  129. package/query/entity-query.js +1149 -0
  130. package/query/entity-query.js.map +1 -0
  131. package/{src → query}/mapping-context.d.ts +44 -46
  132. package/query/mapping-context.js +412 -0
  133. package/query/mapping-context.js.map +1 -0
  134. package/query/predicate.d.ts +394 -0
  135. package/query/predicate.js +1294 -0
  136. package/query/predicate.js.map +1 -0
  137. package/query/property-path.d.ts +252 -0
  138. package/query/property-path.js +2 -0
  139. package/query/property-path.js.map +1 -0
  140. package/{src → query}/query-options.d.ts +143 -119
  141. package/query/query-options.js +180 -0
  142. package/query/query-options.js.map +1 -0
  143. package/rxjs/breeze-rxjs.d.ts +72 -0
  144. package/rxjs/breeze-rxjs.js +117 -0
  145. package/rxjs/breeze-rxjs.js.map +1 -0
  146. package/validation/validate.d.ts +583 -0
  147. package/validation/validate.js +961 -0
  148. package/validation/validate.js.map +1 -0
  149. package/{src → validation}/validation-options.d.ts +67 -63
  150. package/validation/validation-options.js +70 -0
  151. package/validation/validation-options.js.map +1 -0
  152. package/adapter-ajax-angularjs/adapter-ajax-angularjs.d.ts +0 -17
  153. package/adapter-ajax-angularjs/adapter-core.d.ts +0 -4
  154. package/adapter-ajax-angularjs/index.d.ts +0 -5
  155. package/adapter-ajax-fetch/adapter-ajax-fetch.d.ts +0 -18
  156. package/adapter-ajax-fetch/index.d.ts +0 -5
  157. package/adapter-ajax-httpclient/adapter-ajax-httpclient.d.ts +0 -13
  158. package/adapter-ajax-httpclient/adapter-core.d.ts +0 -4
  159. package/adapter-ajax-httpclient/index.d.ts +0 -5
  160. package/adapter-ajax-jquery/adapter-ajax-jquery.d.ts +0 -15
  161. package/adapter-ajax-jquery/index.d.ts +0 -5
  162. package/adapter-ajax-post/index.d.ts +0 -5
  163. package/adapter-data-service-odata/adapter-core.d.ts +0 -4
  164. package/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -17
  165. package/adapter-data-service-odata/index.d.ts +0 -5
  166. package/adapter-data-service-webapi/adapter-data-service-webapi.d.ts +0 -15
  167. package/adapter-data-service-webapi/index.d.ts +0 -5
  168. package/adapter-model-library-backing-store/adapter-model-library-backing-store.d.ts +0 -10
  169. package/adapter-model-library-backing-store/index.d.ts +0 -5
  170. package/adapter-model-library-ko/adapter-model-library-ko.d.ts +0 -10
  171. package/adapter-model-library-ko/index.d.ts +0 -5
  172. package/adapter-uri-builder-json/adapter-core.d.ts +0 -4
  173. package/adapter-uri-builder-json/adapter-uri-builder-json.d.ts +0 -8
  174. package/adapter-uri-builder-json/index.d.ts +0 -5
  175. package/adapter-uri-builder-odata/adapter-core.d.ts +0 -4
  176. package/adapter-uri-builder-odata/adapter-uri-builder-odata.d.ts +0 -8
  177. package/adapter-uri-builder-odata/index.d.ts +0 -5
  178. package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -135
  179. package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +0 -49
  180. package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
  181. package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -135
  182. package/esm2022/adapter-ajax-fetch/adapter-core.mjs +0 -49
  183. package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
  184. package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -139
  185. package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +0 -49
  186. package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
  187. package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -107
  188. package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
  189. package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
  190. package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
  191. package/esm2022/adapter-data-service-odata/adapter-core.mjs +0 -49
  192. package/esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs +0 -461
  193. package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
  194. package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -100
  195. package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
  196. package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -269
  197. package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
  198. package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -241
  199. package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
  200. package/esm2022/adapter-uri-builder-json/adapter-core.mjs +0 -49
  201. package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -37
  202. package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
  203. package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +0 -49
  204. package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -191
  205. package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
  206. package/esm2022/breeze-client.mjs +0 -5
  207. package/esm2022/index.mjs +0 -2
  208. package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
  209. package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
  210. package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
  211. package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +0 -421
  212. package/esm2022/src/abstract-data-service-adapter.mjs +0 -325
  213. package/esm2022/src/array.mjs +0 -4
  214. package/esm2022/src/assert-param.mjs +0 -330
  215. package/esm2022/src/breeze.mjs +0 -85
  216. package/esm2022/src/complex-array.mjs +0 -117
  217. package/esm2022/src/config.mjs +0 -232
  218. package/esm2022/src/core.mjs +0 -712
  219. package/esm2022/src/csdl-metadata-parser.mjs +0 -385
  220. package/esm2022/src/data-service.mjs +0 -221
  221. package/esm2022/src/data-type.mjs +0 -510
  222. package/esm2022/src/default-property-interceptor.mjs +0 -460
  223. package/esm2022/src/entity-action.mjs +0 -45
  224. package/esm2022/src/entity-aspect.mjs +0 -897
  225. package/esm2022/src/entity-group.mjs +0 -192
  226. package/esm2022/src/entity-key.mjs +0 -125
  227. package/esm2022/src/entity-manager.mjs +0 -2163
  228. package/esm2022/src/entity-metadata.mjs +0 -2242
  229. package/esm2022/src/entity-query.mjs +0 -1024
  230. package/esm2022/src/entity-state.mjs +0 -107
  231. package/esm2022/src/enum.mjs +0 -143
  232. package/esm2022/src/event.mjs +0 -264
  233. package/esm2022/src/interface-registry.mjs +0 -39
  234. package/esm2022/src/key-generator.mjs +0 -110
  235. package/esm2022/src/local-query-comparison-options.mjs +0 -65
  236. package/esm2022/src/mapping-context.mjs +0 -411
  237. package/esm2022/src/naming-convention.mjs +0 -92
  238. package/esm2022/src/observable-array.mjs +0 -183
  239. package/esm2022/src/predicate.mjs +0 -1259
  240. package/esm2022/src/primitive-array.mjs +0 -85
  241. package/esm2022/src/query-options.mjs +0 -152
  242. package/esm2022/src/relation-array.mjs +0 -173
  243. package/esm2022/src/save-options.mjs +0 -41
  244. package/esm2022/src/unattached-children-map.mjs +0 -56
  245. package/esm2022/src/validate.mjs +0 -995
  246. package/esm2022/src/validation-options.mjs +0 -64
  247. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs +0 -190
  248. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
  249. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs +0 -190
  250. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
  251. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs +0 -194
  252. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
  253. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs +0 -114
  254. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
  255. package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +0 -1
  256. package/fesm2022/breeze-client-adapter-data-service-odata.mjs +0 -516
  257. package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +0 -1
  258. package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
  259. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs +0 -276
  260. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
  261. package/fesm2022/breeze-client-adapter-model-library-ko.mjs +0 -248
  262. package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +0 -1
  263. package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
  264. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs +0 -246
  265. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
  266. package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
  267. package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +0 -1
  268. package/fesm2022/breeze-client.mjs +0 -14144
  269. package/fesm2022/breeze-client.mjs.map +0 -1
  270. package/index.d.ts +0 -1
  271. package/mixin-get-entity-graph/index.d.ts +0 -5
  272. package/mixin-get-entity-graph/mixin-get-entity-graph.d.ts +0 -31
  273. package/mixin-save-queuing/index.d.ts +0 -5
  274. package/mixin-save-queuing/mixin-save-queuing.d.ts +0 -32
  275. package/src/abstract-data-service-adapter.d.ts +0 -84
  276. package/src/array.d.ts +0 -3
  277. package/src/breeze.d.ts +0 -139
  278. package/src/complex-array.d.ts +0 -13
  279. package/src/config.d.ts +0 -104
  280. package/src/core.d.ts +0 -164
  281. package/src/csdl-metadata-parser.d.ts +0 -7
  282. package/src/data-type.d.ts +0 -89
  283. package/src/default-property-interceptor.d.ts +0 -4
  284. package/src/entity-aspect.d.ts +0 -332
  285. package/src/entity-group.d.ts +0 -28
  286. package/src/entity-key.d.ts +0 -77
  287. package/src/entity-manager.d.ts +0 -680
  288. package/src/entity-metadata.d.ts +0 -988
  289. package/src/entity-query.d.ts +0 -444
  290. package/src/enum.d.ts +0 -100
  291. package/src/event.d.ts +0 -142
  292. package/src/interface-registry.d.ts +0 -150
  293. package/src/key-generator.d.ts +0 -12
  294. package/src/observable-array.d.ts +0 -52
  295. package/src/predicate.d.ts +0 -376
  296. package/src/primitive-array.d.ts +0 -7
  297. package/src/relation-array.d.ts +0 -18
  298. package/src/unattached-children-map.d.ts +0 -19
  299. package/src/validate.d.ts +0 -650
@@ -0,0 +1,24 @@
1
+ import { ObservableArray } from './observable-array.js';
2
+ import type { Entity, QueriedAs } from './entity-aspect.js';
3
+ import type { QueryErrorCallback, QueryResult, QuerySuccessCallback } from '../manager/entity-manager.js';
4
+ import type { DataProperty, NavigationProperty } from '../metadata/entity-metadata.js';
5
+ /** The value of a collection navigation property, such as `customer.orders`. It is a real array:
6
+ adding an entity sets the entity's inverse navigation property (or foreign key) to point at the
7
+ parent, attaching it to the parent's manager if it is detached, and removing one sets its inverse
8
+ navigation property to null. Changes raise the array's `arrayChanged` event with an {@link ArrayChangedArgs}. */
9
+ export interface RelationArray<T extends Entity = Entity> extends ObservableArray<T> {
10
+ /** The entity whose navigation property holds this array. */
11
+ parentEntity: Entity;
12
+ /** Not set on a relation array: always undefined. Use `navigationProperty`. */
13
+ parentProperty?: DataProperty;
14
+ /** The {@link NavigationProperty} of `parentEntity` that holds this array. */
15
+ navigationProperty: NavigationProperty;
16
+ load(): Promise<QueryResult<QueriedAs<T>>>;
17
+ /** @deprecated Await the returned promise instead of passing callbacks. */
18
+ load(querySuccessCallback?: QuerySuccessCallback, queryErrorCallback?: QueryErrorCallback): Promise<QueryResult<QueriedAs<T>>>;
19
+ }
20
+ /** For use by breeze plugin authors only. The class is for use in building a {@link ModelLibraryAdapter} implementation.
21
+ @adapter (see {@link ModelLibraryAdapter})
22
+ @hidden
23
+ */
24
+ export declare function makeRelationArray(arr: any[], parentEntity: Entity, navigationProperty: NavigationProperty): RelationArray;
@@ -0,0 +1,176 @@
1
+ import { BreezeEvent } from '../core/event.js';
2
+ import { observableArray } from './observable-array.js';
3
+ import { EntityState } from './entity-state.js';
4
+ import { EntityQuery } from '../query/entity-query.js';
5
+ /*
6
+ Relation arrays are not a class: they are real arrays whose mutating methods are replaced, so that
7
+ changing one updates both ends of the relationship. A relation array is a collection of entities
8
+ associated with a navigation property on a single entity, i.e. customer.orders or
9
+ order.orderDetails.
10
+ @class {relationArray}
11
+ */
12
+ /*
13
+ An {@link BreezeEvent} that fires whenever the contents of this array changed. This event
14
+ is fired any time a new entity is attached or added to the EntityManager and happens to belong to this collection.
15
+ Adds that occur as a result of query or import operations are batched so that all of the adds or removes to any individual
16
+ collections are collected into a single notification event for each relation array.
17
+ @example
18
+ // assume order is an order entity attached to an EntityManager.
19
+ orders.arrayChanged.subscribe(
20
+ function (arrayChangedArgs) {
21
+ let addedEntities = arrayChangedArgs.added;
22
+ let removedEntities = arrayChanged.removed;
23
+ });
24
+ @event arrayChanged
25
+ @param added {Array of Entity} An array of all of the entities added to this collection.
26
+ @param removed {Array of Entity} An array of all of the removed from this collection.
27
+ @readOnly
28
+ */
29
+ /**
30
+ Performs an asynchronous load of all other the entities associated with this relationArray.
31
+ @example
32
+ // assume orders is an empty, as yet unpopulated, relation array of orders
33
+ // associated with a specific customer.
34
+ orders.load().then(...)
35
+ The callback arguments are deprecated. They still work, but the promise is the supported
36
+ form and they will be removed in a future major version.
37
+ @param [callback] {Function} Deprecated.
38
+ @param [errorCallback] {Function} Deprecated.
39
+ @returns {Promise}
40
+ */
41
+ function load(callback, errorCallback) {
42
+ const parent = this.parentEntity;
43
+ const query = EntityQuery.fromEntityNavigation(this.parentEntity, this.navigationProperty);
44
+ const em = parent.entityAspect.entityManager;
45
+ return em.executeQuery(query, callback, errorCallback);
46
+ }
47
+ const relationArrayOps = {
48
+ getGoodAdds: function (arr, adds) {
49
+ return getGoodAdds(arr, adds);
50
+ },
51
+ beforeChange: function (arr) {
52
+ // a relation array does not change the state of the entity that owns it
53
+ },
54
+ processAdds: function (arr, adds) {
55
+ processAdds(arr, adds);
56
+ },
57
+ processRemoves: function (arr, removes) {
58
+ processRemoves(arr, removes);
59
+ },
60
+ getEventParent: function (arr) {
61
+ return arr.parentEntity.entityAspect;
62
+ },
63
+ getPendingPubs: function (arr) {
64
+ const em = arr.parentEntity.entityAspect.entityManager;
65
+ return em && em._pendingPubs;
66
+ }
67
+ };
68
+ function getGoodAdds(relationArray, adds) {
69
+ let goodAdds = checkForDups(relationArray, adds);
70
+ if (!goodAdds.length) {
71
+ return goodAdds;
72
+ }
73
+ let parentEntity = relationArray.parentEntity;
74
+ let entityManager = parentEntity.entityAspect.entityManager;
75
+ // we do not want to attach an entity during loading
76
+ // because these will all be 'attached' at a later step.
77
+ if (entityManager && !entityManager.isLoading) {
78
+ goodAdds.forEach(function (add) {
79
+ if (add.entityAspect.entityState.isDetached()) {
80
+ relationArray._obs.inProgress = true;
81
+ try {
82
+ entityManager.attachEntity(add, EntityState.Added);
83
+ }
84
+ finally {
85
+ relationArray._obs.inProgress = false;
86
+ }
87
+ }
88
+ });
89
+ }
90
+ return goodAdds;
91
+ }
92
+ function processAdds(relationArray, adds) {
93
+ let parentEntity = relationArray.parentEntity;
94
+ let np = relationArray.navigationProperty;
95
+ let addsInProcess = relationArray._obs.addsInProcess;
96
+ let invNp = np.inverse;
97
+ let startIx = addsInProcess.length;
98
+ try {
99
+ adds.forEach(function (childEntity) {
100
+ addsInProcess.push(childEntity);
101
+ if (invNp) {
102
+ childEntity.setProperty(invNp.name, parentEntity);
103
+ }
104
+ else {
105
+ // This occurs with a unidirectional 1-n navigation - in this case
106
+ // we need to update the fks instead of the navProp
107
+ let pks = parentEntity.entityType.keyProperties;
108
+ np.invForeignKeyNames.forEach(function (fk, i) {
109
+ childEntity.setProperty(fk, parentEntity.getProperty(pks[i].name));
110
+ });
111
+ }
112
+ });
113
+ }
114
+ finally {
115
+ addsInProcess.splice(startIx, adds.length);
116
+ }
117
+ }
118
+ function processRemoves(relationArray, removes) {
119
+ let inp = relationArray.navigationProperty.inverse;
120
+ if (inp) {
121
+ removes.forEach(function (childEntity) {
122
+ childEntity.setProperty(inp.name, null);
123
+ });
124
+ }
125
+ }
126
+ function checkForDups(relationArray, adds) {
127
+ // don't allow dups in this array. - also prevents recursion
128
+ let parentEntity = relationArray.parentEntity;
129
+ let navProp = relationArray.navigationProperty;
130
+ let inverseProp = navProp.inverse;
131
+ let addsInProcess = relationArray._obs.addsInProcess;
132
+ let goodAdds;
133
+ if (inverseProp) {
134
+ goodAdds = adds.filter(function (a) {
135
+ if (addsInProcess.indexOf(a) >= 0) {
136
+ return false;
137
+ }
138
+ let inverseValue = a.getProperty(inverseProp.name);
139
+ return inverseValue !== parentEntity;
140
+ });
141
+ }
142
+ else {
143
+ // This occurs with a unidirectional 1->N relation ( where there is no n -> 1)
144
+ // in this case we compare fks.
145
+ let fkPropNames = navProp.invForeignKeyNames;
146
+ let keyProps = parentEntity.entityType.keyProperties;
147
+ goodAdds = adds.filter(function (a) {
148
+ if (addsInProcess.indexOf(a) >= 0) {
149
+ return false;
150
+ }
151
+ return fkPropNames.some(function (fk, i) {
152
+ let keyProp = keyProps[i].name;
153
+ let keyVal = parentEntity.getProperty(keyProp);
154
+ let fkVal = a.getProperty(fk);
155
+ return keyVal !== fkVal;
156
+ });
157
+ });
158
+ }
159
+ return goodAdds;
160
+ }
161
+ /** For use by breeze plugin authors only. The class is for use in building a {@link ModelLibraryAdapter} implementation.
162
+ @adapter (see {@link ModelLibraryAdapter})
163
+ @hidden
164
+ */
165
+ export function makeRelationArray(arr, parentEntity, navigationProperty) {
166
+ const arrX = arr;
167
+ arrX.parentEntity = parentEntity;
168
+ arrX.navigationProperty = navigationProperty;
169
+ arrX.arrayChanged = new BreezeEvent("arrayChanged", arrX);
170
+ arrX.load = load;
171
+ // addsInProcess: the pushes currently being processed on this array, which is what stops the
172
+ // relationship fixup from recursing back into it.
173
+ observableArray.initialize(arrX, relationArrayOps, { addsInProcess: [] });
174
+ return arrX;
175
+ }
176
+ //# sourceMappingURL=relation-array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-array.js","sourceRoot":"","sources":["../../src/entity/relation-array.ts"],"names":[],"mappings":"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","sourcesContent":["import { BreezeEvent } from '../core/event.js';\r\nimport { ObservableArray, ObservableArrayOps, observableArray } from './observable-array.js';\r\nimport { EntityState } from './entity-state.js';\r\nimport { EntityQuery } from '../query/entity-query.js';\r\nimport type { Entity, QueriedAs } from './entity-aspect.js';\r\nimport type { QueryErrorCallback, QueryResult, QuerySuccessCallback } from '../manager/entity-manager.js';\r\nimport type { DataProperty, NavigationProperty } from '../metadata/entity-metadata.js';\r\n\r\n/** The value of a collection navigation property, such as `customer.orders`. It is a real array:\r\nadding an entity sets the entity's inverse navigation property (or foreign key) to point at the\r\nparent, attaching it to the parent's manager if it is detached, and removing one sets its inverse\r\nnavigation property to null. Changes raise the array's `arrayChanged` event with an {@link ArrayChangedArgs}. */\r\nexport interface RelationArray<T extends Entity = Entity> extends ObservableArray<T> {\r\n /** The entity whose navigation property holds this array. */\r\n parentEntity: Entity;\r\n /** Not set on a relation array: always undefined. Use `navigationProperty`. */\r\n parentProperty?: DataProperty;\r\n /** The {@link NavigationProperty} of `parentEntity` that holds this array. */\r\n navigationProperty: NavigationProperty;\r\n load(): Promise<QueryResult<QueriedAs<T>>>;\r\n /** @deprecated Await the returned promise instead of passing callbacks. */\r\n load(querySuccessCallback?: QuerySuccessCallback, queryErrorCallback?: QueryErrorCallback): Promise<QueryResult<QueriedAs<T>>>;\r\n}\r\n\r\n/*\r\n Relation arrays are not a class: they are real arrays whose mutating methods are replaced, so that\r\n changing one updates both ends of the relationship. A relation array is a collection of entities\r\n associated with a navigation property on a single entity, i.e. customer.orders or\r\n order.orderDetails.\r\n @class {relationArray}\r\n */\r\n\r\n/*\r\nAn {@link BreezeEvent} that fires whenever the contents of this array changed. This event\r\nis fired any time a new entity is attached or added to the EntityManager and happens to belong to this collection.\r\nAdds that occur as a result of query or import operations are batched so that all of the adds or removes to any individual\r\ncollections are collected into a single notification event for each relation array.\r\n@example\r\n // assume order is an order entity attached to an EntityManager.\r\n orders.arrayChanged.subscribe(\r\n function (arrayChangedArgs) {\r\n let addedEntities = arrayChangedArgs.added;\r\n let removedEntities = arrayChanged.removed;\r\n });\r\n@event arrayChanged\r\n@param added {Array of Entity} An array of all of the entities added to this collection.\r\n@param removed {Array of Entity} An array of all of the removed from this collection.\r\n@readOnly\r\n*/\r\n\r\n/**\r\nPerforms an asynchronous load of all other the entities associated with this relationArray.\r\n@example\r\n // assume orders is an empty, as yet unpopulated, relation array of orders\r\n // associated with a specific customer.\r\n orders.load().then(...)\r\nThe callback arguments are deprecated. They still work, but the promise is the supported\r\nform and they will be removed in a future major version.\r\n@param [callback] {Function} Deprecated.\r\n@param [errorCallback] {Function} Deprecated.\r\n@returns {Promise}\r\n*/\r\nfunction load(this: RelationArray, callback?: QuerySuccessCallback, errorCallback?: QueryErrorCallback): Promise<QueryResult> {\r\n const parent = this.parentEntity;\r\n const query = EntityQuery.fromEntityNavigation(this.parentEntity, this.navigationProperty);\r\n const em = parent.entityAspect.entityManager!;\r\n return em.executeQuery(query, callback, errorCallback);\r\n}\r\n\r\nconst relationArrayOps: ObservableArrayOps = {\r\n\r\n getGoodAdds: function (arr: RelationArray, adds: Entity[]) {\r\n return getGoodAdds(arr, adds);\r\n },\r\n\r\n beforeChange: function (arr: RelationArray) {\r\n // a relation array does not change the state of the entity that owns it\r\n },\r\n\r\n processAdds: function (arr: RelationArray, adds: Entity[]) {\r\n processAdds(arr, adds);\r\n },\r\n\r\n processRemoves: function (arr: RelationArray, removes: Entity[]) {\r\n processRemoves(arr, removes);\r\n },\r\n\r\n getEventParent: function (arr: RelationArray) {\r\n return arr.parentEntity.entityAspect;\r\n },\r\n\r\n getPendingPubs: function (arr: RelationArray) {\r\n const em = arr.parentEntity.entityAspect.entityManager;\r\n return em && (em as any)._pendingPubs;\r\n }\r\n};\r\n\r\nfunction getGoodAdds(relationArray: RelationArray, adds: Entity[]) {\r\n let goodAdds = checkForDups(relationArray, adds);\r\n if (!goodAdds.length) {\r\n return goodAdds;\r\n }\r\n let parentEntity = relationArray.parentEntity;\r\n let entityManager = parentEntity.entityAspect.entityManager;\r\n // we do not want to attach an entity during loading\r\n // because these will all be 'attached' at a later step.\r\n if (entityManager && !entityManager.isLoading) {\r\n goodAdds.forEach(function (add) {\r\n if (add.entityAspect.entityState.isDetached()) {\r\n relationArray._obs.inProgress = true;\r\n try {\r\n entityManager!.attachEntity(add, EntityState.Added);\r\n } finally {\r\n relationArray._obs.inProgress = false;\r\n }\r\n }\r\n });\r\n }\r\n return goodAdds;\r\n}\r\n\r\nfunction processAdds(relationArray: RelationArray, adds: Entity[]) {\r\n let parentEntity = relationArray.parentEntity;\r\n let np = relationArray.navigationProperty;\r\n let addsInProcess = relationArray._obs.addsInProcess!;\r\n\r\n let invNp = np.inverse;\r\n let startIx = addsInProcess.length;\r\n try {\r\n adds.forEach(function (childEntity) {\r\n addsInProcess.push(childEntity);\r\n if (invNp) {\r\n childEntity.setProperty(invNp.name, parentEntity);\r\n } else {\r\n // This occurs with a unidirectional 1-n navigation - in this case\r\n // we need to update the fks instead of the navProp\r\n let pks = parentEntity.entityType.keyProperties;\r\n np.invForeignKeyNames.forEach(function (fk, i) {\r\n childEntity.setProperty(fk, parentEntity.getProperty(pks[i].name));\r\n });\r\n }\r\n });\r\n } finally {\r\n addsInProcess.splice(startIx, adds.length);\r\n }\r\n\r\n}\r\n\r\nfunction processRemoves(relationArray: RelationArray, removes: Entity[]) {\r\n let inp = relationArray.navigationProperty.inverse;\r\n if (inp) {\r\n removes.forEach(function (childEntity) {\r\n childEntity.setProperty(inp!.name, null);\r\n });\r\n }\r\n}\r\n\r\nfunction checkForDups(relationArray: RelationArray, adds: Entity[]) {\r\n // don't allow dups in this array. - also prevents recursion\r\n let parentEntity = relationArray.parentEntity;\r\n let navProp = relationArray.navigationProperty;\r\n let inverseProp = navProp.inverse;\r\n let addsInProcess = relationArray._obs.addsInProcess!;\r\n let goodAdds: Entity[];\r\n if (inverseProp) {\r\n goodAdds = adds.filter(function (a) {\r\n if (addsInProcess.indexOf(a) >= 0) {\r\n return false;\r\n }\r\n let inverseValue = a.getProperty(inverseProp!.name);\r\n return inverseValue !== parentEntity;\r\n });\r\n } else {\r\n // This occurs with a unidirectional 1->N relation ( where there is no n -> 1)\r\n // in this case we compare fks.\r\n let fkPropNames = navProp.invForeignKeyNames;\r\n let keyProps = parentEntity.entityType.keyProperties;\r\n goodAdds = adds.filter(function (a) {\r\n if (addsInProcess.indexOf(a) >= 0) {\r\n return false;\r\n }\r\n return fkPropNames.some(function (fk, i) {\r\n let keyProp = keyProps[i].name;\r\n let keyVal = parentEntity.getProperty(keyProp);\r\n let fkVal = a.getProperty(fk);\r\n return keyVal !== fkVal;\r\n });\r\n });\r\n }\r\n return goodAdds;\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a {@link ModelLibraryAdapter} implementation.\r\n@adapter (see {@link ModelLibraryAdapter})\r\n@hidden\r\n*/\r\nexport function makeRelationArray(arr: any[], parentEntity: Entity, navigationProperty: NavigationProperty): RelationArray {\r\n const arrX = arr as any;\r\n arrX.parentEntity = parentEntity;\r\n arrX.navigationProperty = navigationProperty;\r\n arrX.arrayChanged = new BreezeEvent(\"arrayChanged\", arrX);\r\n arrX.load = load;\r\n // addsInProcess: the pushes currently being processed on this array, which is what stops the\r\n // relationship fixup from recursing back into it.\r\n observableArray.initialize(arrX, relationArrayOps, { addsInProcess: [] });\r\n return arrX as RelationArray;\r\n}\r\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,105 @@
1
+ import { core } from '../core/core.js';
2
+ /** @hidden @internal */
3
+ // Represents entities not yet attached to navigationProperties.
4
+ export class UnattachedChildrenMap {
5
+ // key is EntityKey.toString(), value is array of { navigationProperty, children }
6
+ map = new Map();
7
+ // Which keys each child is parked under, so that detaching it is a lookup rather than a scan
8
+ // of the whole map. A WeakMap because it is only ever read for a child we are already holding,
9
+ // and an entry that outlives its entity would be the leak this exists to close.
10
+ childKeys = new WeakMap();
11
+ addChild(parentEntityKey, navigationProperty, child) {
12
+ let tuple = this.getTuple(parentEntityKey, navigationProperty);
13
+ if (!tuple) {
14
+ tuple = { navigationProperty: navigationProperty, children: [] };
15
+ core.getMapArray(this.map, parentEntityKey.toString()).push(tuple);
16
+ }
17
+ tuple.children.push(child);
18
+ // getTuple looks up the hierarchy, so the tuple just pushed into may be stored under a base
19
+ // type's key. Record every key it could be under; removeChild ignores the ones it is not in.
20
+ let keys = this.childKeys.get(child);
21
+ if (!keys) {
22
+ keys = new Set();
23
+ this.childKeys.set(child, keys);
24
+ }
25
+ keys.add(parentEntityKey.toString());
26
+ let entityType = parentEntityKey.entityType;
27
+ while (entityType.baseEntityType) {
28
+ entityType = entityType.baseEntityType;
29
+ keys.add(parentEntityKey.toString(entityType));
30
+ }
31
+ }
32
+ /**
33
+ * Takes a child out of every entry it is parked under, and drops an entry that is left empty.
34
+ *
35
+ * Called when an entity is detached. Without it a child whose parent never arrived is held for
36
+ * the life of the manager: `clear()` replaces the whole map, but `detachEntity` is how an
37
+ * application drops one row. See the retention tier.
38
+ */
39
+ removeChild(child) {
40
+ const keys = this.childKeys.get(child);
41
+ if (!keys)
42
+ return;
43
+ for (const keyString of keys) {
44
+ const tuples = this.map.get(keyString);
45
+ if (!tuples)
46
+ continue;
47
+ for (let i = tuples.length - 1; i >= 0; i--) {
48
+ const children = tuples[i].children;
49
+ const ix = children.indexOf(child);
50
+ if (ix >= 0)
51
+ children.splice(ix, 1);
52
+ if (children.length === 0)
53
+ tuples.splice(i, 1);
54
+ }
55
+ if (tuples.length === 0)
56
+ this.map.delete(keyString);
57
+ }
58
+ this.childKeys.delete(child);
59
+ }
60
+ removeChildren(parentEntityKeyString, navigationProperty) {
61
+ let tuples = this.map.get(parentEntityKeyString);
62
+ if (!tuples)
63
+ return;
64
+ core.arrayRemoveItem(tuples, (t) => {
65
+ return t.navigationProperty === navigationProperty;
66
+ });
67
+ if (!tuples.length) {
68
+ this.map.delete(parentEntityKeyString);
69
+ }
70
+ }
71
+ getTuple(parentEntityKey, navigationProperty) {
72
+ let tuples = this.getTuples(parentEntityKey);
73
+ if (!tuples)
74
+ return null;
75
+ let tuple = core.arrayFirst(tuples, function (t) {
76
+ return t.navigationProperty === navigationProperty;
77
+ });
78
+ return tuple;
79
+ }
80
+ getTuples(parentEntityKey) {
81
+ let tuples = this.map.get(parentEntityKey.toString());
82
+ let entityType = parentEntityKey.entityType;
83
+ // Nothing above it in the hierarchy, which is the usual case: there is only one entry to
84
+ // find, so hand back the stored array rather than copying it into a new one. addChild goes
85
+ // through here for every child it registers.
86
+ if (!entityType.baseEntityType)
87
+ return tuples && tuples.length ? tuples : undefined;
88
+ let allTuples;
89
+ while (entityType.baseEntityType) {
90
+ entityType = entityType.baseEntityType;
91
+ let baseTuples = this.map.get(parentEntityKey.toString(entityType));
92
+ if (baseTuples) {
93
+ // only now is a combined array needed
94
+ allTuples = allTuples || (tuples ? tuples.slice() : []);
95
+ allTuples.push(...baseTuples);
96
+ }
97
+ }
98
+ allTuples = allTuples || tuples;
99
+ return allTuples && allTuples.length ? allTuples : undefined;
100
+ }
101
+ getTuplesByString(parentEntityKeyString) {
102
+ return this.map.get(parentEntityKeyString);
103
+ }
104
+ }
105
+ //# sourceMappingURL=unattached-children-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unattached-children-map.js","sourceRoot":"","sources":["../../src/entity/unattached-children-map.ts"],"names":[],"mappings":"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","sourcesContent":["import { core } from '../core/core.js';\r\nimport { Entity } from './entity-aspect.js';\r\nimport { NavigationProperty } from '../metadata/entity-metadata.js';\r\nimport { EntityKey } from './entity-key.js';\r\n\r\n/** @hidden @internal */\r\nexport interface INavTuple {\r\n navigationProperty: NavigationProperty;\r\n children: Entity[];\r\n}\r\n\r\n/** @hidden @internal */\r\n// Represents entities not yet attached to navigationProperties. \r\nexport class UnattachedChildrenMap {\r\n // key is EntityKey.toString(), value is array of { navigationProperty, children }\r\n map = new Map<string, INavTuple[]>();\r\n\r\n // Which keys each child is parked under, so that detaching it is a lookup rather than a scan\r\n // of the whole map. A WeakMap because it is only ever read for a child we are already holding,\r\n // and an entry that outlives its entity would be the leak this exists to close.\r\n private childKeys = new WeakMap<Entity, Set<string>>();\r\n\r\n addChild(parentEntityKey: EntityKey, navigationProperty: NavigationProperty, child: Entity) {\r\n let tuple = this.getTuple(parentEntityKey, navigationProperty);\r\n if (!tuple) {\r\n tuple = { navigationProperty: navigationProperty, children: [] };\r\n core.getMapArray(this.map, parentEntityKey.toString()).push(tuple);\r\n }\r\n tuple.children.push(child);\r\n\r\n // getTuple looks up the hierarchy, so the tuple just pushed into may be stored under a base\r\n // type's key. Record every key it could be under; removeChild ignores the ones it is not in.\r\n let keys = this.childKeys.get(child);\r\n if (!keys) { keys = new Set<string>(); this.childKeys.set(child, keys); }\r\n keys.add(parentEntityKey.toString());\r\n let entityType = parentEntityKey.entityType;\r\n while (entityType.baseEntityType) {\r\n entityType = entityType.baseEntityType;\r\n keys.add(parentEntityKey.toString(entityType));\r\n }\r\n }\r\n\r\n /**\r\n * Takes a child out of every entry it is parked under, and drops an entry that is left empty.\r\n *\r\n * Called when an entity is detached. Without it a child whose parent never arrived is held for\r\n * the life of the manager: `clear()` replaces the whole map, but `detachEntity` is how an\r\n * application drops one row. See the retention tier.\r\n */\r\n removeChild(child: Entity) {\r\n const keys = this.childKeys.get(child);\r\n if (!keys) return;\r\n for (const keyString of keys) {\r\n const tuples = this.map.get(keyString);\r\n if (!tuples) continue;\r\n for (let i = tuples.length - 1; i >= 0; i--) {\r\n const children = tuples[i].children;\r\n const ix = children.indexOf(child);\r\n if (ix >= 0) children.splice(ix, 1);\r\n if (children.length === 0) tuples.splice(i, 1);\r\n }\r\n if (tuples.length === 0) this.map.delete(keyString);\r\n }\r\n this.childKeys.delete(child);\r\n }\r\n\r\n removeChildren(parentEntityKeyString: string, navigationProperty: NavigationProperty) {\r\n let tuples = this.map.get(parentEntityKeyString);\r\n if (!tuples) return;\r\n core.arrayRemoveItem(tuples, (t: any) => {\r\n return t.navigationProperty === navigationProperty;\r\n });\r\n if (!tuples.length) {\r\n this.map.delete(parentEntityKeyString);\r\n }\r\n }\r\n\r\n getTuple(parentEntityKey: EntityKey, navigationProperty: NavigationProperty) {\r\n let tuples = this.getTuples(parentEntityKey);\r\n if (!tuples) return null;\r\n let tuple = core.arrayFirst(tuples, function (t) {\r\n return t.navigationProperty === navigationProperty;\r\n });\r\n return tuple;\r\n }\r\n\r\n getTuples(parentEntityKey: EntityKey) {\r\n let tuples = this.map.get(parentEntityKey.toString());\r\n let entityType = parentEntityKey.entityType;\r\n // Nothing above it in the hierarchy, which is the usual case: there is only one entry to\r\n // find, so hand back the stored array rather than copying it into a new one. addChild goes\r\n // through here for every child it registers.\r\n if (!entityType.baseEntityType) return tuples && tuples.length ? tuples : undefined;\r\n\r\n let allTuples: INavTuple[] | undefined;\r\n while (entityType.baseEntityType) {\r\n entityType = entityType.baseEntityType;\r\n let baseTuples = this.map.get(parentEntityKey.toString(entityType));\r\n if (baseTuples) {\r\n // only now is a combined array needed\r\n allTuples = allTuples || (tuples ? tuples.slice() : []);\r\n allTuples.push(...baseTuples);\r\n }\r\n }\r\n allTuples = allTuples || tuples;\r\n return allTuples && allTuples.length ? allTuples : undefined;\r\n }\r\n\r\n getTuplesByString(parentEntityKeyString: string) {\r\n return this.map.get(parentEntityKeyString);\r\n }\r\n\r\n}\r\n"]}