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.
- package/LICENSE +1 -1
- package/README.md +83 -63
- package/adapters/abstract-data-service-adapter.d.ts +120 -0
- package/adapters/abstract-data-service-adapter.js +395 -0
- package/adapters/abstract-data-service-adapter.js.map +1 -0
- package/adapters/adapter-ajax-fetch.d.ts +12 -0
- package/adapters/adapter-ajax-fetch.js +13 -0
- package/adapters/adapter-ajax-fetch.js.map +1 -0
- package/{adapter-ajax-post → adapters}/adapter-ajax-post.d.ts +40 -36
- package/{fesm2022/breeze-client-adapter-ajax-post.mjs → adapters/adapter-ajax-post.js} +80 -82
- package/adapters/adapter-ajax-post.js.map +1 -0
- package/{adapter-ajax-fetch → adapters}/adapter-core.d.ts +4 -4
- package/{fesm2022/breeze-client-adapter-uri-builder-json.mjs → adapters/adapter-core.js} +48 -91
- package/adapters/adapter-core.js.map +1 -0
- package/adapters/adapter-data-service-webapi.d.ts +9 -0
- package/{fesm2022/breeze-client-adapter-data-service-webapi.mjs → adapters/adapter-data-service-webapi.js} +105 -107
- package/adapters/adapter-data-service-webapi.js.map +1 -0
- package/adapters/adapter-model-library-backing-store.d.ts +32 -0
- package/adapters/adapter-model-library-backing-store.js +321 -0
- package/adapters/adapter-model-library-backing-store.js.map +1 -0
- package/adapters/adapter-uri-builder-json.d.ts +11 -0
- package/adapters/adapter-uri-builder-json.js +40 -0
- package/adapters/adapter-uri-builder-json.js.map +1 -0
- package/adapters/http.d.ts +52 -0
- package/adapters/http.js +202 -0
- package/adapters/http.js.map +1 -0
- package/angular/adapter-angular-httpclient.d.ts +21 -0
- package/angular/adapter-angular-httpclient.js +70 -0
- package/angular/adapter-angular-httpclient.js.map +1 -0
- package/breeze.d.ts +215 -0
- package/breeze.js +141 -0
- package/breeze.js.map +1 -0
- package/config/config.d.ts +212 -0
- package/config/config.js +392 -0
- package/config/config.js.map +1 -0
- package/config/configure.d.ts +66 -0
- package/config/configure.js +46 -0
- package/config/configure.js.map +1 -0
- package/config/default-adapters.d.ts +1 -0
- package/config/default-adapters.js +40 -0
- package/config/default-adapters.js.map +1 -0
- package/config/interface-registry.d.ts +191 -0
- package/config/interface-registry.js +5 -0
- package/config/interface-registry.js.map +1 -0
- package/{src → core}/assert-param.d.ts +52 -60
- package/core/assert-param.js +390 -0
- package/core/assert-param.js.map +1 -0
- package/core/core.d.ts +285 -0
- package/core/core.js +772 -0
- package/core/core.js.map +1 -0
- package/core/enum.d.ts +116 -0
- package/core/enum.js +167 -0
- package/core/enum.js.map +1 -0
- package/core/event.d.ts +169 -0
- package/core/event.js +338 -0
- package/core/event.js.map +1 -0
- package/entity/array.d.ts +3 -0
- package/entity/array.js +4 -0
- package/entity/array.js.map +1 -0
- package/entity/complex-array.d.ts +17 -0
- package/entity/complex-array.js +104 -0
- package/entity/complex-array.js.map +1 -0
- package/entity/default-property-interceptor.d.ts +1 -0
- package/entity/default-property-interceptor.js +496 -0
- package/entity/default-property-interceptor.js.map +1 -0
- package/{src → entity}/entity-action.d.ts +36 -42
- package/entity/entity-action.js +45 -0
- package/entity/entity-action.js.map +1 -0
- package/entity/entity-aspect.d.ts +457 -0
- package/entity/entity-aspect.js +1262 -0
- package/entity/entity-aspect.js.map +1 -0
- package/entity/entity-base.d.ts +55 -0
- package/entity/entity-base.js +41 -0
- package/entity/entity-base.js.map +1 -0
- package/entity/entity-group.d.ts +1 -0
- package/entity/entity-group.js +224 -0
- package/entity/entity-group.js.map +1 -0
- package/entity/entity-key.d.ts +95 -0
- package/entity/entity-key.js +189 -0
- package/entity/entity-key.js.map +1 -0
- package/{src → entity}/entity-state.d.ts +112 -84
- package/entity/entity-state.js +135 -0
- package/entity/entity-state.js.map +1 -0
- package/entity/key-generator.d.ts +57 -0
- package/entity/key-generator.js +155 -0
- package/entity/key-generator.js.map +1 -0
- package/entity/observable-array.d.ts +25 -0
- package/entity/observable-array.js +230 -0
- package/entity/observable-array.js.map +1 -0
- package/entity/primitive-array.d.ts +12 -0
- package/entity/primitive-array.js +71 -0
- package/entity/primitive-array.js.map +1 -0
- package/entity/relation-array.d.ts +24 -0
- package/entity/relation-array.js +176 -0
- package/entity/relation-array.js.map +1 -0
- package/entity/unattached-children-map.d.ts +1 -0
- package/entity/unattached-children-map.js +105 -0
- package/entity/unattached-children-map.js.map +1 -0
- package/generate-entity-classes.js +1176 -0
- package/manager/entity-manager.d.ts +801 -0
- package/manager/entity-manager.js +2395 -0
- package/manager/entity-manager.js.map +1 -0
- package/{src → manager}/save-options.d.ts +48 -42
- package/manager/save-options.js +51 -0
- package/manager/save-options.js.map +1 -0
- package/{src → metadata}/data-service.d.ts +229 -184
- package/metadata/data-service.js +246 -0
- package/metadata/data-service.js.map +1 -0
- package/metadata/data-type.d.ts +122 -0
- package/metadata/data-type.js +465 -0
- package/metadata/data-type.js.map +1 -0
- package/metadata/entity-metadata.d.ts +1193 -0
- package/metadata/entity-metadata.js +2502 -0
- package/metadata/entity-metadata.js.map +1 -0
- package/{src → metadata}/local-query-comparison-options.d.ts +65 -59
- package/metadata/local-query-comparison-options.js +69 -0
- package/metadata/local-query-comparison-options.js.map +1 -0
- package/{src → metadata}/naming-convention.d.ts +75 -72
- package/metadata/naming-convention.js +97 -0
- package/metadata/naming-convention.js.map +1 -0
- package/mixins/mixin-get-entity-graph.d.ts +63 -0
- package/{fesm2022/breeze-client-mixin-get-entity-graph.mjs → mixins/mixin-get-entity-graph.js} +331 -253
- package/mixins/mixin-get-entity-graph.js.map +1 -0
- package/mixins/mixin-save-queuing.d.ts +98 -0
- package/{fesm2022/breeze-client-mixin-save-queuing.mjs → mixins/mixin-save-queuing.js} +493 -365
- package/mixins/mixin-save-queuing.js.map +1 -0
- package/package.json +63 -94
- package/query/entity-query.d.ts +521 -0
- package/query/entity-query.js +1149 -0
- package/query/entity-query.js.map +1 -0
- package/{src → query}/mapping-context.d.ts +44 -46
- package/query/mapping-context.js +412 -0
- package/query/mapping-context.js.map +1 -0
- package/query/predicate.d.ts +394 -0
- package/query/predicate.js +1294 -0
- package/query/predicate.js.map +1 -0
- package/query/property-path.d.ts +252 -0
- package/query/property-path.js +2 -0
- package/query/property-path.js.map +1 -0
- package/{src → query}/query-options.d.ts +143 -119
- package/query/query-options.js +180 -0
- package/query/query-options.js.map +1 -0
- package/rxjs/breeze-rxjs.d.ts +72 -0
- package/rxjs/breeze-rxjs.js +117 -0
- package/rxjs/breeze-rxjs.js.map +1 -0
- package/validation/validate.d.ts +583 -0
- package/validation/validate.js +961 -0
- package/validation/validate.js.map +1 -0
- package/{src → validation}/validation-options.d.ts +67 -63
- package/validation/validation-options.js +70 -0
- package/validation/validation-options.js.map +1 -0
- package/adapter-ajax-angularjs/adapter-ajax-angularjs.d.ts +0 -17
- package/adapter-ajax-angularjs/adapter-core.d.ts +0 -4
- package/adapter-ajax-angularjs/index.d.ts +0 -5
- package/adapter-ajax-fetch/adapter-ajax-fetch.d.ts +0 -18
- package/adapter-ajax-fetch/index.d.ts +0 -5
- package/adapter-ajax-httpclient/adapter-ajax-httpclient.d.ts +0 -13
- package/adapter-ajax-httpclient/adapter-core.d.ts +0 -4
- package/adapter-ajax-httpclient/index.d.ts +0 -5
- package/adapter-ajax-jquery/adapter-ajax-jquery.d.ts +0 -15
- package/adapter-ajax-jquery/index.d.ts +0 -5
- package/adapter-ajax-post/index.d.ts +0 -5
- package/adapter-data-service-odata/adapter-core.d.ts +0 -4
- package/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -17
- package/adapter-data-service-odata/index.d.ts +0 -5
- package/adapter-data-service-webapi/adapter-data-service-webapi.d.ts +0 -15
- package/adapter-data-service-webapi/index.d.ts +0 -5
- package/adapter-model-library-backing-store/adapter-model-library-backing-store.d.ts +0 -10
- package/adapter-model-library-backing-store/index.d.ts +0 -5
- package/adapter-model-library-ko/adapter-model-library-ko.d.ts +0 -10
- package/adapter-model-library-ko/index.d.ts +0 -5
- package/adapter-uri-builder-json/adapter-core.d.ts +0 -4
- package/adapter-uri-builder-json/adapter-uri-builder-json.d.ts +0 -8
- package/adapter-uri-builder-json/index.d.ts +0 -5
- package/adapter-uri-builder-odata/adapter-core.d.ts +0 -4
- package/adapter-uri-builder-odata/adapter-uri-builder-odata.d.ts +0 -8
- package/adapter-uri-builder-odata/index.d.ts +0 -5
- package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -135
- package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
- package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -135
- package/esm2022/adapter-ajax-fetch/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
- package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -139
- package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
- package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -107
- package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
- package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
- package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
- package/esm2022/adapter-data-service-odata/adapter-core.mjs +0 -49
- package/esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs +0 -461
- package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
- package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -100
- package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
- package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -269
- package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
- package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -241
- package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
- package/esm2022/adapter-uri-builder-json/adapter-core.mjs +0 -49
- package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -37
- package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
- package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +0 -49
- package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -191
- package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
- package/esm2022/breeze-client.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
- package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
- package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
- package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +0 -421
- package/esm2022/src/abstract-data-service-adapter.mjs +0 -325
- package/esm2022/src/array.mjs +0 -4
- package/esm2022/src/assert-param.mjs +0 -330
- package/esm2022/src/breeze.mjs +0 -85
- package/esm2022/src/complex-array.mjs +0 -117
- package/esm2022/src/config.mjs +0 -232
- package/esm2022/src/core.mjs +0 -712
- package/esm2022/src/csdl-metadata-parser.mjs +0 -385
- package/esm2022/src/data-service.mjs +0 -221
- package/esm2022/src/data-type.mjs +0 -510
- package/esm2022/src/default-property-interceptor.mjs +0 -460
- package/esm2022/src/entity-action.mjs +0 -45
- package/esm2022/src/entity-aspect.mjs +0 -897
- package/esm2022/src/entity-group.mjs +0 -192
- package/esm2022/src/entity-key.mjs +0 -125
- package/esm2022/src/entity-manager.mjs +0 -2163
- package/esm2022/src/entity-metadata.mjs +0 -2242
- package/esm2022/src/entity-query.mjs +0 -1024
- package/esm2022/src/entity-state.mjs +0 -107
- package/esm2022/src/enum.mjs +0 -143
- package/esm2022/src/event.mjs +0 -264
- package/esm2022/src/interface-registry.mjs +0 -39
- package/esm2022/src/key-generator.mjs +0 -110
- package/esm2022/src/local-query-comparison-options.mjs +0 -65
- package/esm2022/src/mapping-context.mjs +0 -411
- package/esm2022/src/naming-convention.mjs +0 -92
- package/esm2022/src/observable-array.mjs +0 -183
- package/esm2022/src/predicate.mjs +0 -1259
- package/esm2022/src/primitive-array.mjs +0 -85
- package/esm2022/src/query-options.mjs +0 -152
- package/esm2022/src/relation-array.mjs +0 -173
- package/esm2022/src/save-options.mjs +0 -41
- package/esm2022/src/unattached-children-map.mjs +0 -56
- package/esm2022/src/validate.mjs +0 -995
- package/esm2022/src/validation-options.mjs +0 -64
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs +0 -190
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs +0 -190
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs +0 -194
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs +0 -114
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs +0 -516
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs +0 -276
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs +0 -248
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs +0 -246
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
- package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
- package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +0 -1
- package/fesm2022/breeze-client.mjs +0 -14144
- package/fesm2022/breeze-client.mjs.map +0 -1
- package/index.d.ts +0 -1
- package/mixin-get-entity-graph/index.d.ts +0 -5
- package/mixin-get-entity-graph/mixin-get-entity-graph.d.ts +0 -31
- package/mixin-save-queuing/index.d.ts +0 -5
- package/mixin-save-queuing/mixin-save-queuing.d.ts +0 -32
- package/src/abstract-data-service-adapter.d.ts +0 -84
- package/src/array.d.ts +0 -3
- package/src/breeze.d.ts +0 -139
- package/src/complex-array.d.ts +0 -13
- package/src/config.d.ts +0 -104
- package/src/core.d.ts +0 -164
- package/src/csdl-metadata-parser.d.ts +0 -7
- package/src/data-type.d.ts +0 -89
- package/src/default-property-interceptor.d.ts +0 -4
- package/src/entity-aspect.d.ts +0 -332
- package/src/entity-group.d.ts +0 -28
- package/src/entity-key.d.ts +0 -77
- package/src/entity-manager.d.ts +0 -680
- package/src/entity-metadata.d.ts +0 -988
- package/src/entity-query.d.ts +0 -444
- package/src/enum.d.ts +0 -100
- package/src/event.d.ts +0 -142
- package/src/interface-registry.d.ts +0 -150
- package/src/key-generator.d.ts +0 -12
- package/src/observable-array.d.ts +0 -52
- package/src/predicate.d.ts +0 -376
- package/src/primitive-array.d.ts +0 -7
- package/src/relation-array.d.ts +0 -18
- package/src/unattached-children-map.d.ts +0 -19
- 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"]}
|