breeze-client 2.2.2 → 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 +63 -94
  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,117 @@
1
+ import { Observable } from 'rxjs';
2
+ // Breeze events as RxJS observables.
3
+ //
4
+ // Optional, and opt-in: import it from its own subpath, and install `rxjs` yourself.
5
+ //
6
+ // import { entityChanged$, hasChanges$ } from 'breeze-client/rxjs';
7
+ //
8
+ // Nothing in `breeze-client` itself imports this module or rxjs, so an application that does not
9
+ // use it pays nothing - not a byte of bundle and not a transitive install. `rxjs` is an optional
10
+ // peer dependency for that reason: a plain peer dependency would be installed automatically by
11
+ // npm 7 and later, for everyone.
12
+ //
13
+ // Every observable here is cold and lazy. Creating one does nothing; subscribing to it subscribes
14
+ // to the Breeze event, and unsubscribing - directly, or through an operator such as `take`,
15
+ // `takeUntil` or Angular's `async` pipe - removes that subscription again. That matters: a Breeze
16
+ // event holds its subscribers, so a subscription that is never removed keeps its callback, and
17
+ // everything the callback reaches, for as long as the event's owner lives.
18
+ //
19
+ // Only the `Observable` constructor is used, no operators, so any rxjs from 7.0 on will do.
20
+ /**
21
+ * Any {@link BreezeEvent} as an Observable: each value the event publishes is emitted, for as long
22
+ * as the subscription lasts.
23
+ *
24
+ * The other functions in this module are this, applied to a particular event. Use it directly for
25
+ * the ones they do not cover - `metadataStore.metadataFetched`, say.
26
+ *
27
+ * ```ts
28
+ * fromBreezeEvent(em.metadataStore.metadataFetched).subscribe(args => console.log(args.metadata));
29
+ * ```
30
+ *
31
+ * An error thrown by a subscriber does not reach Breeze: rxjs reports it on its own, and the
32
+ * event's other subscribers still hear about the change.
33
+ *
34
+ * @param event - the event to observe
35
+ * @returns an Observable that subscribes to `event` when it is subscribed to, and unsubscribes when
36
+ * it is torn down
37
+ */
38
+ export function fromBreezeEvent(event) {
39
+ return new Observable(subscriber => {
40
+ const unsubKey = event.subscribe(data => subscriber.next(data));
41
+ return () => { event.unsubscribe(unsubKey); };
42
+ });
43
+ }
44
+ /**
45
+ * {@link EntityManager.entityChanged} as an Observable: every entity added, attached, detached,
46
+ * changed, saved or rejected in `em`.
47
+ *
48
+ * Filter for what you want with rxjs:
49
+ *
50
+ * ```ts
51
+ * entityChanged$(em).pipe(
52
+ * filter(e => e.entityAction === EntityAction.PropertyChange),
53
+ * ).subscribe(e => markDirty(e.entity));
54
+ * ```
55
+ */
56
+ export function entityChanged$(em) {
57
+ return fromBreezeEvent(em.entityChanged);
58
+ }
59
+ /**
60
+ * Whether `em` has unsaved changes, as an Observable that starts with the current value.
61
+ *
62
+ * {@link EntityManager.hasChangesChanged} only fires on a change, so on its own it cannot tell a
63
+ * late subscriber what the answer is *now*. This emits `em.hasChanges()` as soon as it is
64
+ * subscribed to, then each change after that, and never the same value twice in a row. Bind a Save
65
+ * button to it and the button is right from the first render.
66
+ *
67
+ * ```ts
68
+ * hasChanges$(em).subscribe(dirty => saveButton.disabled = !dirty);
69
+ * ```
70
+ *
71
+ * The current value is read when you subscribe, not when you call this function.
72
+ */
73
+ export function hasChanges$(em) {
74
+ return new Observable(subscriber => {
75
+ let last = em.hasChanges();
76
+ // Subscribe to Breeze before emitting the current value. A subscriber that reacts to that
77
+ // first value by changing the manager - creating an entity, say - then has the change reported
78
+ // to it rather than lost in the gap between reading the value and listening for the next one.
79
+ const unsubKey = em.hasChangesChanged.subscribe(args => {
80
+ if (args.hasChanges !== last) {
81
+ last = args.hasChanges;
82
+ subscriber.next(last);
83
+ }
84
+ });
85
+ subscriber.next(last);
86
+ // If the subscriber took only the first value, it has already unsubscribed by now, before this
87
+ // teardown was handed back. rxjs runs a teardown returned to a closed subscriber at once, so
88
+ // the Breeze subscription is still removed.
89
+ return () => { em.hasChangesChanged.unsubscribe(unsubKey); };
90
+ });
91
+ }
92
+ /**
93
+ * {@link EntityManager.validationErrorsChanged} as an Observable: validation errors added to or
94
+ * removed from any entity in `em`.
95
+ *
96
+ * Each value says what changed, not the complete set. For "every validation error in the manager
97
+ * right now", see the recipe in the guide, which builds one from this.
98
+ */
99
+ export function validationErrorsChanged$(em) {
100
+ return fromBreezeEvent(em.validationErrorsChanged);
101
+ }
102
+ /**
103
+ * {@link EntityAspect.propertyChanged} as an Observable: each property of one entity that changes.
104
+ *
105
+ * ```ts
106
+ * propertyChanged$(order).pipe(
107
+ * filter(e => e.propertyName === 'shipCountry'),
108
+ * ).subscribe(() => recalculateTax(order));
109
+ * ```
110
+ *
111
+ * A live subscription keeps `entity` reachable, as any subscription to it would. Unsubscribe when
112
+ * the screen showing it goes away.
113
+ */
114
+ export function propertyChanged$(entity) {
115
+ return fromBreezeEvent(entity.entityAspect.propertyChanged);
116
+ }
117
+ //# sourceMappingURL=breeze-rxjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breeze-rxjs.js","sourceRoot":"","sources":["../../src/rxjs/breeze-rxjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAOlC,qCAAqC;AACrC,EAAE;AACF,qFAAqF;AACrF,EAAE;AACF,wEAAwE;AACxE,EAAE;AACF,iGAAiG;AACjG,iGAAiG;AACjG,+FAA+F;AAC/F,iCAAiC;AACjC,EAAE;AACF,kGAAkG;AAClG,4FAA4F;AAC5F,kGAAkG;AAClG,+FAA+F;AAC/F,2EAA2E;AAC3E,EAAE;AACF,4FAA4F;AAE5F;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAAI,KAAqB;IACtD,OAAO,IAAI,UAAU,CAAI,UAAU,CAAC,EAAE;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,OAAO,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,EAAiB;IAC9C,OAAO,eAAe,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,EAAiB;IAC3C,OAAO,IAAI,UAAU,CAAU,UAAU,CAAC,EAAE;QAC1C,IAAI,IAAI,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;QAC3B,0FAA0F;QAC1F,+FAA+F;QAC/F,8FAA8F;QAC9F,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YACrD,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC7B,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,+FAA+F;QAC/F,6FAA6F;QAC7F,4CAA4C;QAC5C,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,EAAiB;IACxD,OAAO,eAAe,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;AAC9D,CAAC","sourcesContent":["import { Observable } from 'rxjs';\nimport type { BreezeEvent } from '../core/event.js';\nimport type { Entity, PropertyChangedEventArgs } from '../entity/entity-aspect.js';\nimport type {\n EntityChangedEventArgs, EntityManager, ValidationErrorsChangedEventArgs,\n} from '../manager/entity-manager.js';\n\n// Breeze events as RxJS observables.\n//\n// Optional, and opt-in: import it from its own subpath, and install `rxjs` yourself.\n//\n// import { entityChanged$, hasChanges$ } from 'breeze-client/rxjs';\n//\n// Nothing in `breeze-client` itself imports this module or rxjs, so an application that does not\n// use it pays nothing - not a byte of bundle and not a transitive install. `rxjs` is an optional\n// peer dependency for that reason: a plain peer dependency would be installed automatically by\n// npm 7 and later, for everyone.\n//\n// Every observable here is cold and lazy. Creating one does nothing; subscribing to it subscribes\n// to the Breeze event, and unsubscribing - directly, or through an operator such as `take`,\n// `takeUntil` or Angular's `async` pipe - removes that subscription again. That matters: a Breeze\n// event holds its subscribers, so a subscription that is never removed keeps its callback, and\n// everything the callback reaches, for as long as the event's owner lives.\n//\n// Only the `Observable` constructor is used, no operators, so any rxjs from 7.0 on will do.\n\n/**\n * Any {@link BreezeEvent} as an Observable: each value the event publishes is emitted, for as long\n * as the subscription lasts.\n *\n * The other functions in this module are this, applied to a particular event. Use it directly for\n * the ones they do not cover - `metadataStore.metadataFetched`, say.\n *\n * ```ts\n * fromBreezeEvent(em.metadataStore.metadataFetched).subscribe(args => console.log(args.metadata));\n * ```\n *\n * An error thrown by a subscriber does not reach Breeze: rxjs reports it on its own, and the\n * event's other subscribers still hear about the change.\n *\n * @param event - the event to observe\n * @returns an Observable that subscribes to `event` when it is subscribed to, and unsubscribes when\n * it is torn down\n */\nexport function fromBreezeEvent<T>(event: BreezeEvent<T>): Observable<T> {\n return new Observable<T>(subscriber => {\n const unsubKey = event.subscribe(data => subscriber.next(data));\n return () => { event.unsubscribe(unsubKey); };\n });\n}\n\n/**\n * {@link EntityManager.entityChanged} as an Observable: every entity added, attached, detached,\n * changed, saved or rejected in `em`.\n *\n * Filter for what you want with rxjs:\n *\n * ```ts\n * entityChanged$(em).pipe(\n * filter(e => e.entityAction === EntityAction.PropertyChange),\n * ).subscribe(e => markDirty(e.entity));\n * ```\n */\nexport function entityChanged$(em: EntityManager): Observable<EntityChangedEventArgs> {\n return fromBreezeEvent(em.entityChanged);\n}\n\n/**\n * Whether `em` has unsaved changes, as an Observable that starts with the current value.\n *\n * {@link EntityManager.hasChangesChanged} only fires on a change, so on its own it cannot tell a\n * late subscriber what the answer is *now*. This emits `em.hasChanges()` as soon as it is\n * subscribed to, then each change after that, and never the same value twice in a row. Bind a Save\n * button to it and the button is right from the first render.\n *\n * ```ts\n * hasChanges$(em).subscribe(dirty => saveButton.disabled = !dirty);\n * ```\n *\n * The current value is read when you subscribe, not when you call this function.\n */\nexport function hasChanges$(em: EntityManager): Observable<boolean> {\n return new Observable<boolean>(subscriber => {\n let last = em.hasChanges();\n // Subscribe to Breeze before emitting the current value. A subscriber that reacts to that\n // first value by changing the manager - creating an entity, say - then has the change reported\n // to it rather than lost in the gap between reading the value and listening for the next one.\n const unsubKey = em.hasChangesChanged.subscribe(args => {\n if (args.hasChanges !== last) {\n last = args.hasChanges;\n subscriber.next(last);\n }\n });\n subscriber.next(last);\n // If the subscriber took only the first value, it has already unsubscribed by now, before this\n // teardown was handed back. rxjs runs a teardown returned to a closed subscriber at once, so\n // the Breeze subscription is still removed.\n return () => { em.hasChangesChanged.unsubscribe(unsubKey); };\n });\n}\n\n/**\n * {@link EntityManager.validationErrorsChanged} as an Observable: validation errors added to or\n * removed from any entity in `em`.\n *\n * Each value says what changed, not the complete set. For \"every validation error in the manager\n * right now\", see the recipe in the guide, which builds one from this.\n */\nexport function validationErrorsChanged$(em: EntityManager): Observable<ValidationErrorsChangedEventArgs> {\n return fromBreezeEvent(em.validationErrorsChanged);\n}\n\n/**\n * {@link EntityAspect.propertyChanged} as an Observable: each property of one entity that changes.\n *\n * ```ts\n * propertyChanged$(order).pipe(\n * filter(e => e.propertyName === 'shipCountry'),\n * ).subscribe(() => recalculateTax(order));\n * ```\n *\n * A live subscription keeps `entity` reachable, as any subscription to it would. Unsubscribe when\n * the screen showing it goes away.\n */\nexport function propertyChanged$(entity: Entity): Observable<PropertyChangedEventArgs> {\n return fromBreezeEvent(entity.entityAspect.propertyChanged);\n}\n"]}