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,412 @@
|
|
|
1
|
+
import { core } from '../core/core.js';
|
|
2
|
+
import { DataType } from '../metadata/data-type.js';
|
|
3
|
+
import { EntityState } from '../entity/entity-state.js';
|
|
4
|
+
import { EntityAction } from '../entity/entity-action.js';
|
|
5
|
+
import { EntityType, DataProperty } from '../metadata/entity-metadata.js';
|
|
6
|
+
import { MergeStrategy } from './query-options.js';
|
|
7
|
+
import { observableArray } from '../entity/observable-array.js';
|
|
8
|
+
import { EntityQuery } from './entity-query.js';
|
|
9
|
+
/**
|
|
10
|
+
For use by breeze plugin authors only. The class is for use in building a {@link DataServiceAdapter} implementation.
|
|
11
|
+
@adapter (see {@link DataServiceAdapter})
|
|
12
|
+
@hidden
|
|
13
|
+
*/
|
|
14
|
+
export class MappingContext {
|
|
15
|
+
rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.
|
|
16
|
+
constructor(config) {
|
|
17
|
+
core.extend(this, config, [
|
|
18
|
+
"query", "entityManager", "dataService", "mergeOptions"
|
|
19
|
+
]);
|
|
20
|
+
// calc'd props
|
|
21
|
+
this.refMap = {};
|
|
22
|
+
this.deferredFns = [];
|
|
23
|
+
this.jsonResultsAdapter = this.dataService.jsonResultsAdapter;
|
|
24
|
+
this.metadataStore = this.entityManager.metadataStore;
|
|
25
|
+
this.rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.
|
|
26
|
+
}
|
|
27
|
+
getUrl() {
|
|
28
|
+
let query = this.query;
|
|
29
|
+
if (!query) {
|
|
30
|
+
throw new Error("query cannot be empty");
|
|
31
|
+
}
|
|
32
|
+
let uriString;
|
|
33
|
+
if (typeof query === 'string') {
|
|
34
|
+
uriString = query;
|
|
35
|
+
}
|
|
36
|
+
else if (query instanceof EntityQuery) {
|
|
37
|
+
uriString = this.dataService.uriBuilder.buildUri(query, this.metadataStore);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
throw new Error("unable to recognize query parameter as either a string or an EntityQuery");
|
|
41
|
+
}
|
|
42
|
+
return this.dataService.qualifyUrl(uriString);
|
|
43
|
+
}
|
|
44
|
+
visitAndMerge(nodes, nodeContext) {
|
|
45
|
+
let query = this.query;
|
|
46
|
+
let jra = this.jsonResultsAdapter;
|
|
47
|
+
nodeContext = nodeContext || {};
|
|
48
|
+
let that = this;
|
|
49
|
+
let result = core.map(nodes, function (node) {
|
|
50
|
+
if (query == null && node.entityAspect) {
|
|
51
|
+
// don't bother merging a result from a save that was not returned from the server.
|
|
52
|
+
if (node.entityAspect.entityState.isDeleted()) {
|
|
53
|
+
that.entityManager.detachEntity(node);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
node.entityAspect.acceptChanges();
|
|
57
|
+
}
|
|
58
|
+
return node;
|
|
59
|
+
}
|
|
60
|
+
let meta = jra.visitNode(node, that, nodeContext) || {};
|
|
61
|
+
node = meta.node || node;
|
|
62
|
+
if (query && nodeContext.nodeType === "root" && !meta.entityType) {
|
|
63
|
+
meta.entityType = query instanceof EntityQuery && query._getToEntityType && query._getToEntityType(that.metadataStore);
|
|
64
|
+
}
|
|
65
|
+
return processMeta(that, node, meta);
|
|
66
|
+
}, this.mergeOptions.includeDeleted);
|
|
67
|
+
if (result.filter && !this.mergeOptions.includeDeleted) {
|
|
68
|
+
// result may have deleted entities because related nodes were processed
|
|
69
|
+
result = result.filter((x) => x && (!x.entityAspect || !x.entityAspect.entityState.isDeleted()));
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
processDeferred() {
|
|
74
|
+
if (this.deferredFns.length > 0) {
|
|
75
|
+
this.deferredFns.forEach((fn) => {
|
|
76
|
+
fn();
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
MappingContext.prototype._$typeName = "MappingContext";
|
|
82
|
+
function processMeta(mc, node, meta, assignFn) {
|
|
83
|
+
// == is deliberate here instead of ===
|
|
84
|
+
if (meta.ignore || node == null) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
else if (meta.nodeRefId) {
|
|
88
|
+
let refValue = resolveEntityRef(mc, meta.nodeRefId);
|
|
89
|
+
if (typeof refValue === "function" && assignFn != null) {
|
|
90
|
+
mc.deferredFns.push(function () {
|
|
91
|
+
assignFn(refValue);
|
|
92
|
+
});
|
|
93
|
+
return undefined; // deferred and will be set later;
|
|
94
|
+
}
|
|
95
|
+
return refValue;
|
|
96
|
+
}
|
|
97
|
+
else if (meta.entityType) {
|
|
98
|
+
let entityType = meta.entityType;
|
|
99
|
+
if (mc.mergeOptions.noTracking) {
|
|
100
|
+
node = processNoMerge(mc, entityType, node);
|
|
101
|
+
if (entityType.noTrackingFn) {
|
|
102
|
+
node = entityType.noTrackingFn(node, entityType);
|
|
103
|
+
}
|
|
104
|
+
if (meta.nodeId) {
|
|
105
|
+
mc.refMap[meta.nodeId] = node;
|
|
106
|
+
}
|
|
107
|
+
return node;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
if (entityType.isComplexType) {
|
|
111
|
+
// because we still need to do serverName to client name processing
|
|
112
|
+
return processNoMerge(mc, entityType, node);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
return mergeEntity(mc, node, meta);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
if ((!meta.passThru) && typeof node === 'object' && !core.isDate(node)) {
|
|
121
|
+
node = processAnonType(mc, node);
|
|
122
|
+
}
|
|
123
|
+
// updating the refMap for entities is handled by updateEntityRef for entities.
|
|
124
|
+
if (meta.nodeId) {
|
|
125
|
+
mc.refMap[meta.nodeId] = node;
|
|
126
|
+
}
|
|
127
|
+
return node;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function processNoMerge(mc, stype, node) {
|
|
131
|
+
let result = {};
|
|
132
|
+
stype.dataProperties.forEach(function (dp) {
|
|
133
|
+
if (dp.isComplexProperty) {
|
|
134
|
+
result[dp.name] = core.map(node[dp.nameOnServer], (v) => {
|
|
135
|
+
return processNoMerge(mc, dp.dataType, v);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
result[dp.name] = DataType.parseRawValue(node[dp.nameOnServer], dp.dataType);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
(stype instanceof EntityType) && stype.navigationProperties.forEach((np) => {
|
|
143
|
+
let nodeContext = { nodeType: "navProp", navigationProperty: np };
|
|
144
|
+
visitNode(node[np.nameOnServer], mc, nodeContext, result, np.name);
|
|
145
|
+
});
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
function processAnonType(mc, node) {
|
|
149
|
+
// node is guaranteed to be an object by this point, i.e. not a scalar
|
|
150
|
+
let keyFn = mc.metadataStore.namingConvention.serverPropertyNameToClient;
|
|
151
|
+
let result = {};
|
|
152
|
+
core.objectForEach(node, function (key, value) {
|
|
153
|
+
let newKey = keyFn(key);
|
|
154
|
+
let nodeContext = { nodeType: "anonProp", propertyName: newKey };
|
|
155
|
+
visitNode(value, mc, nodeContext, result, newKey);
|
|
156
|
+
});
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
function visitNode(node, mc, nodeContext, result, key) {
|
|
160
|
+
let jra = mc.jsonResultsAdapter;
|
|
161
|
+
let meta = jra.visitNode(node, mc, nodeContext) || {};
|
|
162
|
+
// allows visitNode to change the value;
|
|
163
|
+
node = meta.node || node;
|
|
164
|
+
if (meta.ignore)
|
|
165
|
+
return;
|
|
166
|
+
if (meta.passThru) {
|
|
167
|
+
// It used to `return node`, which the callers ignore, so the property was dropped.
|
|
168
|
+
if (meta.nodeId)
|
|
169
|
+
mc.refMap[meta.nodeId] = node;
|
|
170
|
+
result[key] = node;
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (Array.isArray(node)) {
|
|
174
|
+
nodeContext.nodeType = nodeContext.nodeType + "Item";
|
|
175
|
+
result[key] = node.map(function (v, ix) {
|
|
176
|
+
meta = jra.visitNode(v, mc, nodeContext) || {};
|
|
177
|
+
v = meta.node || v;
|
|
178
|
+
return processMeta(mc, v, meta, function (refValue) {
|
|
179
|
+
result[key][ix] = refValue();
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
result[key] = processMeta(mc, node, meta, function (refValue) {
|
|
185
|
+
result[key] = refValue();
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function resolveEntityRef(mc, nodeRefId) {
|
|
190
|
+
let entity = mc.refMap[nodeRefId];
|
|
191
|
+
if (entity === undefined) {
|
|
192
|
+
return function () {
|
|
193
|
+
return mc.refMap[nodeRefId];
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
return entity;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function updateEntityRef(mc, targetEntity, node) {
|
|
201
|
+
let nodeId = node._$meta.nodeId;
|
|
202
|
+
if (!nodeId && node._$meta.extraMetadata) {
|
|
203
|
+
// refMap is not really used, but is returned as data.retrievedEntities, so we populate it anyway.
|
|
204
|
+
nodeId = node._$meta.extraMetadata.uriKey;
|
|
205
|
+
}
|
|
206
|
+
if (nodeId != null) {
|
|
207
|
+
mc.refMap[nodeId] = targetEntity;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// can return null for a deleted entity if includeDeleted == false
|
|
211
|
+
function mergeEntity(mc, node, meta) {
|
|
212
|
+
node._$meta = meta;
|
|
213
|
+
let em = mc.entityManager;
|
|
214
|
+
let entityType = meta.entityType;
|
|
215
|
+
if (typeof (entityType) === 'string') {
|
|
216
|
+
entityType = mc.metadataStore._getStructuralType(entityType, false);
|
|
217
|
+
}
|
|
218
|
+
node.entityType = entityType;
|
|
219
|
+
let mergeStrategy = mc.mergeOptions.mergeStrategy;
|
|
220
|
+
let isSaving = mc.query == null;
|
|
221
|
+
let entityKey = entityType.getEntityKeyFromRawEntity(node, mc.rawValueFn);
|
|
222
|
+
let targetEntity = em.getEntityByKey(entityKey);
|
|
223
|
+
if (targetEntity) {
|
|
224
|
+
if (isSaving && targetEntity.entityAspect.entityState.isDeleted()) {
|
|
225
|
+
em.detachEntity(targetEntity);
|
|
226
|
+
return targetEntity;
|
|
227
|
+
}
|
|
228
|
+
let targetEntityState = targetEntity.entityAspect.entityState;
|
|
229
|
+
if (mergeStrategy === MergeStrategy.Disallowed) {
|
|
230
|
+
throw new Error("A MergeStrategy of 'Disallowed' prevents " + entityKey.toString() + " from being merged");
|
|
231
|
+
}
|
|
232
|
+
else if (mergeStrategy === MergeStrategy.SkipMerge) {
|
|
233
|
+
updateEntityNoMerge(mc, targetEntity, node);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
if (mergeStrategy === MergeStrategy.OverwriteChanges
|
|
237
|
+
|| targetEntityState.isUnchanged()) {
|
|
238
|
+
updateEntity(mc, targetEntity, node);
|
|
239
|
+
targetEntity.entityAspect.wasLoaded = true;
|
|
240
|
+
if (meta.extraMetadata) {
|
|
241
|
+
targetEntity.entityAspect.extraMetadata = meta.extraMetadata;
|
|
242
|
+
}
|
|
243
|
+
targetEntity.entityAspect.entityState = EntityState.Unchanged;
|
|
244
|
+
clearOriginalValues(targetEntity);
|
|
245
|
+
// propertyName not specified because multiple props EntityChangedEventArgs
|
|
246
|
+
targetEntity.entityAspect.propertyChanged.publish({ entity: targetEntity, propertyName: null });
|
|
247
|
+
let action = isSaving ? EntityAction.MergeOnSave : EntityAction.MergeOnQuery;
|
|
248
|
+
em.entityChanged.publish({ entityAction: action, entity: targetEntity });
|
|
249
|
+
// this is needed to handle an overwrite of a modified entity with an unchanged entity
|
|
250
|
+
// which might in turn cause _hasChanges to change.
|
|
251
|
+
if (!targetEntityState.isUnchanged()) {
|
|
252
|
+
em._notifyStateChange(targetEntity, false);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// process targetEntity (even if deleted) to ensure related nodes are handled
|
|
257
|
+
updateEntityNoMerge(mc, targetEntity, node);
|
|
258
|
+
if (targetEntityState === EntityState.Deleted && !mc.mergeOptions.includeDeleted) {
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
targetEntity = entityType._createInstanceCore();
|
|
266
|
+
updateEntity(mc, targetEntity, node);
|
|
267
|
+
if (meta.extraMetadata) {
|
|
268
|
+
targetEntity.entityAspect.extraMetadata = meta.extraMetadata;
|
|
269
|
+
}
|
|
270
|
+
// em._attachEntityCore(targetEntity, EntityState.Unchanged, MergeStrategy.Disallowed);
|
|
271
|
+
em._attachEntityCore(targetEntity, EntityState.Unchanged, mergeStrategy);
|
|
272
|
+
targetEntity.entityAspect.wasLoaded = true;
|
|
273
|
+
em.entityChanged.publish({ entityAction: EntityAction.AttachOnQuery, entity: targetEntity });
|
|
274
|
+
}
|
|
275
|
+
return targetEntity;
|
|
276
|
+
}
|
|
277
|
+
// copied from entityAspect
|
|
278
|
+
function clearOriginalValues(target) {
|
|
279
|
+
let aspect = target.entityAspect || target.complexAspect;
|
|
280
|
+
aspect.originalValues = {};
|
|
281
|
+
let stype = target.entityType || target.complexType;
|
|
282
|
+
stype.complexProperties.forEach(function (cp) {
|
|
283
|
+
let cos = target.getProperty(cp.name);
|
|
284
|
+
if (cp.isScalar) {
|
|
285
|
+
clearOriginalValues(cos);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
observableArray.acceptChanges(cos);
|
|
289
|
+
cos.forEach(clearOriginalValues);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
function updateEntityNoMerge(mc, targetEntity, node) {
|
|
294
|
+
updateEntityRef(mc, targetEntity, node);
|
|
295
|
+
// we still need to merge related entities even if top level entity wasn't modified.
|
|
296
|
+
node.entityType.navigationProperties.forEach(function (np) {
|
|
297
|
+
if (np.isScalar) {
|
|
298
|
+
mergeRelatedEntityCore(mc, node, np);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
mergeRelatedEntitiesCore(mc, node, np);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
function updateEntity(mc, targetEntity, node) {
|
|
306
|
+
updateEntityRef(mc, targetEntity, node);
|
|
307
|
+
let entityType = targetEntity.entityType;
|
|
308
|
+
entityType._updateTargetFromRaw(targetEntity, node, mc.rawValueFn);
|
|
309
|
+
entityType.navigationProperties.forEach(function (np) {
|
|
310
|
+
if (np.isScalar) {
|
|
311
|
+
mergeRelatedEntity(mc, np, targetEntity, node);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
mergeRelatedEntities(mc, np, targetEntity, node);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
function mergeRelatedEntity(mc, navigationProperty, targetEntity, rawEntity) {
|
|
319
|
+
let relatedEntity = mergeRelatedEntityCore(mc, rawEntity, navigationProperty);
|
|
320
|
+
if (relatedEntity == null)
|
|
321
|
+
return;
|
|
322
|
+
if (typeof relatedEntity === 'function') {
|
|
323
|
+
mc.deferredFns.push(function () {
|
|
324
|
+
relatedEntity = relatedEntity();
|
|
325
|
+
updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
function mergeRelatedEntities(mc, navigationProperty, targetEntity, rawEntity) {
|
|
333
|
+
let relatedEntities = mergeRelatedEntitiesCore(mc, rawEntity, navigationProperty);
|
|
334
|
+
if (relatedEntities == null)
|
|
335
|
+
return;
|
|
336
|
+
let inverseProperty = navigationProperty.inverse;
|
|
337
|
+
if (!inverseProperty)
|
|
338
|
+
return;
|
|
339
|
+
let originalRelatedEntities = targetEntity.getProperty(navigationProperty.name);
|
|
340
|
+
originalRelatedEntities.wasLoaded = true;
|
|
341
|
+
relatedEntities.forEach(function (relatedEntity) {
|
|
342
|
+
if (typeof relatedEntity === 'function') {
|
|
343
|
+
mc.deferredFns.push(function () {
|
|
344
|
+
relatedEntity = relatedEntity();
|
|
345
|
+
updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty);
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
function mergeRelatedEntityCore(mc, rawEntity, navigationProperty) {
|
|
354
|
+
let relatedRawEntity = rawEntity[navigationProperty.nameOnServer];
|
|
355
|
+
if (!relatedRawEntity)
|
|
356
|
+
return null;
|
|
357
|
+
let relatedEntity = mc.visitAndMerge(relatedRawEntity, { nodeType: "navProp", navigationProperty: navigationProperty });
|
|
358
|
+
return relatedEntity;
|
|
359
|
+
}
|
|
360
|
+
function mergeRelatedEntitiesCore(mc, rawEntity, navigationProperty) {
|
|
361
|
+
let relatedRawEntities = rawEntity[navigationProperty.nameOnServer];
|
|
362
|
+
if (!relatedRawEntities)
|
|
363
|
+
return null;
|
|
364
|
+
// a navigation property is expected to yield an array
|
|
365
|
+
if (!Array.isArray(relatedRawEntities))
|
|
366
|
+
return null;
|
|
367
|
+
let relatedEntities = mc.visitAndMerge(relatedRawEntities, { nodeType: "navPropItem", navigationProperty: navigationProperty });
|
|
368
|
+
return relatedEntities;
|
|
369
|
+
}
|
|
370
|
+
function updateRelatedEntity(relatedEntity, targetEntity, navigationProperty) {
|
|
371
|
+
if (!relatedEntity)
|
|
372
|
+
return;
|
|
373
|
+
let propName = navigationProperty.name;
|
|
374
|
+
let currentRelatedEntity = targetEntity.getProperty(propName);
|
|
375
|
+
// check if the related entity is already hooked up
|
|
376
|
+
if (currentRelatedEntity !== relatedEntity) {
|
|
377
|
+
// if not hook up both directions.
|
|
378
|
+
targetEntity.setProperty(propName, relatedEntity);
|
|
379
|
+
let inverseProperty = navigationProperty.inverse;
|
|
380
|
+
if (!inverseProperty)
|
|
381
|
+
return;
|
|
382
|
+
if (inverseProperty.isScalar) {
|
|
383
|
+
relatedEntity.setProperty(inverseProperty.name, targetEntity);
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
let collection = relatedEntity.getProperty(inverseProperty.name);
|
|
387
|
+
collection.push(targetEntity);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
function updateRelatedEntityInCollection(mc, relatedEntity, relatedEntities, targetEntity, inverseProperty) {
|
|
392
|
+
if (!relatedEntity)
|
|
393
|
+
return;
|
|
394
|
+
// don't update relatedCollection if preserveChanges & relatedEntity has an fkChange.
|
|
395
|
+
if (relatedEntity.entityAspect.entityState === EntityState.Modified
|
|
396
|
+
&& mc.mergeOptions.mergeStrategy === MergeStrategy.PreserveChanges) {
|
|
397
|
+
let origValues = relatedEntity.entityAspect.originalValues;
|
|
398
|
+
let fkWasModified = inverseProperty.relatedDataProperties.some(function (dp) {
|
|
399
|
+
return origValues[dp.name] != undefined;
|
|
400
|
+
});
|
|
401
|
+
if (fkWasModified)
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
// check if the related entity is already hooked up
|
|
405
|
+
let thisEntity = relatedEntity.getProperty(inverseProperty.name);
|
|
406
|
+
if (thisEntity !== targetEntity) {
|
|
407
|
+
// if not - hook it up.
|
|
408
|
+
relatedEntities.push(relatedEntity);
|
|
409
|
+
relatedEntity.setProperty(inverseProperty.name, targetEntity);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=mapping-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping-context.js","sourceRoot":"","sources":["../../src/query/mapping-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAG,MAAM,0BAA0B,CAAC;AAErD,OAAO,EAAE,WAAW,EAAG,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAiB,UAAU,EAAkB,YAAY,EAAsB,MAAM,gCAAgC,CAAC;AAE7H,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAsBhD;;;;EAIE;AACF,MAAM,OAAO,cAAc;IAIzB,UAAU,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC,qCAAqC;IAatF,YAAY,MAA4B;QAEtC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE;YACxB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc;SACxD,CAAC,CAAC;QAEH,eAAe;QACf,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;QAC9D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;QACtD,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC,qCAAqC;IAC7F,CAAC;IAED,MAAM;QACJ,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,SAAiB,CAAC;QACtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;aAAM,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACxC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,UAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,aAAa,CAAC,KAAY,EAAE,WAAgB;QAC1C,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAClC,WAAW,GAAG,WAAW,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,IAAI;YACzC,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvC,mFAAmF;gBACnF,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC;oBAC9C,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACxC,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;gBACpC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;YACxD,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;YACzB,IAAI,KAAK,IAAI,WAAW,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjE,IAAI,CAAC,UAAU,GAAG,KAAK,YAAY,WAAW,IAAK,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1H,CAAC;YACD,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAErC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;YACvD,wEAAwE;YACxE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC9B,EAAE,EAAE,CAAC;YACP,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AACD,cAAc,CAAC,SAAS,CAAC,UAAU,GAAG,gBAAgB,CAAC;AAGvD,SAAS,WAAW,CAAC,EAAkB,EAAE,IAAS,EAAE,IAAc,EAAE,QAA6B;IAC/F,uCAAuC;IACvC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;SAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1B,IAAI,QAAQ,GAAG,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,OAAO,QAAQ,KAAK,UAAU,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACvD,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;gBAClB,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,OAAO,SAAS,CAAC,CAAC,kCAAkC;QACtD,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACjC,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YAC/B,IAAI,GAAG,cAAc,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAC5C,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC5B,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YAChC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;gBAC7B,mEAAmE;gBACnE,OAAO,cAAc,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QAEN,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACxE,IAAI,GAAG,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,+EAA+E;QAC/E,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,EAAkB,EAAE,KAAqB,EAAE,IAAS;IAC1E,IAAI,MAAM,GAAG,EAAyB,CAAC;IAEvC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE;QACvC,IAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC;YACzB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAM,EAAE,EAAE;gBAC3D,OAAO,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,QAAe,EAAE,CAAC,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,QAAoB,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,CAAC,KAAK,YAAY,UAAU,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAE,CAAC,EAAE,EAAE,EAAE;QAC1E,IAAI,WAAW,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,EAAkB,EAAE,IAAS;IACpD,sEAAsE;IACtE,IAAI,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,0BAA0B,CAAC;IACzE,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,KAAK;QAC3C,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,WAAW,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QACjE,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,IAAS,EAAE,EAAkB,EAAE,WAAwB,EAAE,MAA2B,EAAE,GAAW;IAClH,IAAI,GAAG,GAAG,EAAE,CAAC,kBAAkB,CAAC;IAChC,IAAI,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;IACtD,wCAAwC;IACxC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAEzB,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO;IACxB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,mFAAmF;QACnF,IAAI,IAAI,CAAC,MAAM;YAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACnB,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE;YACpC,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;YAC/C,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YACnB,OAAO,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,QAAQ;gBAChD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,QAAQ;YAC1D,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAkB,EAAE,SAAiB;IAC7D,IAAI,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,EAAkB,EAAE,YAAiB,EAAE,IAAS;IACvE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAChC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QACzC,kGAAkG;QAClG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;IAC5C,CAAC;IACD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC;IACnC,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,SAAS,WAAW,CAAC,EAAkB,EAAE,IAAS,EAAE,IAAc;IAChE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;IAE1B,IAAI,UAAU,GAAG,IAAI,CAAC,UAAwB,CAAC;IAC/C,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrC,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAe,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAE7B,IAAI,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC;IAClD,IAAI,QAAQ,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC;IAEhC,IAAI,SAAS,GAAG,UAAU,CAAC,yBAAyB,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;IAC1E,IAAI,YAAY,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,QAAQ,IAAI,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC;YAClE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC9B,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,IAAI,iBAAiB,GAAG,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC;QAC9D,IAAI,aAAa,KAAK,aAAa,CAAC,UAAU,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,2CAA2C,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,oBAAoB,CAAC,CAAC;QAC7G,CAAC;aAAM,IAAI,aAAa,KAAK,aAAa,CAAC,SAAS,EAAE,CAAC;YACrD,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,IAAI,aAAa,KAAK,aAAa,CAAC,gBAAgB;mBAC/C,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrC,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;gBACrC,YAAY,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC;gBAC3C,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvB,YAAY,CAAC,YAAY,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC/D,CAAC;gBACD,YAAY,CAAC,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC;gBAC9D,mBAAmB,CAAC,YAAY,CAAC,CAAC;gBAClC,2EAA2E;gBAC3E,YAAY,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChG,IAAI,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC;gBAC7E,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;gBACzE,sFAAsF;gBACtF,mDAAmD;gBACnD,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC;oBACrC,EAAE,CAAC,kBAAkB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6EAA6E;gBAC7E,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;gBAC5C,IAAI,iBAAiB,KAAK,WAAW,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;oBACjF,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,UAAU,CAAC,mBAAmB,EAAY,CAAC;QAE1D,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,YAAY,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAC/D,CAAC;QACD,uFAAuF;QACvF,EAAE,CAAC,iBAAiB,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACzE,YAAY,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC;QAC3C,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,2BAA2B;AAC3B,SAAS,mBAAmB,CAAC,MAAW;IACtC,IAAI,MAAM,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,aAAa,CAAC;IACzD,MAAM,CAAC,cAAc,GAAG,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,WAAW,CAAC;IACpD,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAO;QAC/C,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACnC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAGD,SAAS,mBAAmB,CAAC,EAAkB,EAAE,YAAoB,EAAE,IAAS;IAC9E,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IACxC,oFAAoF;IACpF,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAsB;QAC3E,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,sBAAsB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,wBAAwB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,EAAkB,EAAE,YAAoB,EAAE,IAAS;IACvE,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;IACzC,UAAU,CAAC,oBAAoB,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;IAEnE,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE;QAClD,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAkB,EAAE,kBAAsC,EAAE,YAAoB,EAAE,SAAc;IAE1H,IAAI,aAAa,GAAG,sBAAsB,CAAC,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAC9E,IAAI,aAAa,IAAI,IAAI;QAAE,OAAO;IAClC,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;QACxC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;YAClB,aAAa,GAAG,aAAa,EAAE,CAAC;YAChC,mBAAmB,CAAC,aAAa,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,mBAAmB,CAAC,aAAa,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,EAAkB,EAAE,kBAAsC,EAAE,YAAoB,EAAE,SAAc;IAC5H,IAAI,eAAe,GAAG,wBAAwB,CAAC,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAClF,IAAI,eAAe,IAAI,IAAI;QAAE,OAAO;IAEpC,IAAI,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC;IACjD,IAAI,CAAC,eAAe;QAAE,OAAO;IAE7B,IAAI,uBAAuB,GAAG,YAAY,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAChF,uBAAuB,CAAC,SAAS,GAAG,IAAI,CAAC;IAEzC,eAAe,CAAC,OAAO,CAAC,UAAU,aAAkB;QAClD,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;YACxC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;gBAClB,aAAa,GAAG,aAAa,EAAE,CAAC;gBAChC,+BAA+B,CAAC,EAAE,EAAE,aAAa,EAAE,uBAAuB,EAAE,YAAY,EAAE,eAAqC,CAAC,CAAC;YACnI,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,+BAA+B,CAAC,EAAE,EAAE,aAAa,EAAE,uBAAuB,EAAE,YAAY,EAAE,eAAqC,CAAC,CAAC;QACnI,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,EAAkB,EAAE,SAAc,EAAE,kBAAsC;IACxG,IAAI,gBAAgB,GAAG,SAAS,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAClE,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,aAAa,GAAG,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACxH,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,wBAAwB,CAAC,EAAkB,EAAE,SAAc,EAAE,kBAAsC;IAC1G,IAAI,kBAAkB,GAAG,SAAS,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACpE,IAAI,CAAC,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAErC,sDAAsD;IACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpD,IAAI,eAAe,GAAG,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAChI,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,mBAAmB,CAAC,aAAqB,EAAE,YAAoB,EAAE,kBAAsC;IAC9G,IAAI,CAAC,aAAa;QAAE,OAAO;IAC3B,IAAI,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACvC,IAAI,oBAAoB,GAAG,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE9D,mDAAmD;IACnD,IAAI,oBAAoB,KAAK,aAAa,EAAE,CAAC;QAC3C,kCAAkC;QAClC,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAClD,IAAI,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC;QACjD,IAAI,CAAC,eAAe;YAAE,OAAO;QAC7B,IAAI,eAAe,CAAC,QAAQ,EAAE,CAAC;YAC7B,aAAa,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,IAAI,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACjE,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEhC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,+BAA+B,CAAC,EAAkB,EAAE,aAAiC,EAC1F,eAAyB,EAAE,YAAoB,EAAE,eAAmC;IACtF,IAAI,CAAC,aAAa;QAAE,OAAO;IAE3B,qFAAqF;IACrF,IAAI,aAAa,CAAC,YAAY,CAAC,WAAW,KAAK,WAAW,CAAC,QAAQ;WAC9D,EAAE,CAAC,YAAY,CAAC,aAAa,KAAK,aAAa,CAAC,eAAe,EAAE,CAAC;QACrE,IAAI,UAAU,GAAG,aAAa,CAAC,YAAY,CAAC,cAAc,CAAC;QAC3D,IAAI,aAAa,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,EAAE;YACzE,OAAO,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,IAAI,aAAa;YAAE,OAAO;IAC5B,CAAC;IACD,mDAAmD;IACnD,IAAI,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAEjE,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;QAChC,uBAAuB;QACvB,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,aAAa,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC;AACH,CAAC","sourcesContent":["import { DataServiceAdapter } from '../config/interface-registry.js';\r\nimport { core } from '../core/core.js';\r\nimport { DataType } from '../metadata/data-type.js';\r\nimport { DataService, JsonResultsAdapter, NodeContext, NodeMeta } from '../metadata/data-service.js';\r\nimport { EntityState } from '../entity/entity-state.js';\r\nimport { EntityAction } from '../entity/entity-action.js';\r\nimport { MetadataStore, EntityType, StructuralType, DataProperty, NavigationProperty } from '../metadata/entity-metadata.js';\r\nimport { EntityManager } from '../manager/entity-manager.js';\r\nimport { MergeStrategy } from './query-options.js';\r\nimport { Entity } from '../entity/entity-aspect.js';\r\nimport { observableArray } from '../entity/observable-array.js';\r\nimport { EntityQuery } from './entity-query.js';\r\n\r\n\r\n/**\r\nFor use by breeze plugin authors only. The class is for use in building a {@link DataServiceAdapter} implementation. \r\n@adapter (see {@link DataServiceAdapter}) \r\n@hidden \r\n*/\r\nexport interface MergeOptions {\r\n mergeStrategy: MergeStrategy;\r\n includeDeleted?: boolean;\r\n noTracking?: boolean;\r\n}\r\n\r\n/** @hidden */\r\nexport interface MappingContextConfig {\r\n dataService: DataService;\r\n query?: EntityQuery | string;\r\n entityManager: EntityManager;\r\n mergeOptions: MergeOptions;\r\n}\r\n\r\n/**\r\nFor use by breeze plugin authors only. The class is for use in building a {@link DataServiceAdapter} implementation. \r\n@adapter (see {@link DataServiceAdapter}) \r\n@hidden \r\n*/\r\nexport class MappingContext {\r\n /** @hidden @internal */\r\n declare _$typeName: string; // on prototype\r\n\r\n rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.\r\n\r\n declare dataService: DataService;\r\n declare query: EntityQuery | string;\r\n declare entityManager: EntityManager;\r\n declare mergeOptions: MergeOptions;\r\n declare adapter: DataServiceAdapter; // assigned in the AbstractDataServiceAdapter.\r\n\r\n declare refMap: Record<string, any>; // TODO\r\n declare deferredFns: Function[]; // TODO\r\n declare jsonResultsAdapter: JsonResultsAdapter;\r\n declare metadataStore: MetadataStore;\r\n\r\n constructor(config: MappingContextConfig) {\r\n\r\n core.extend(this, config, [\r\n \"query\", \"entityManager\", \"dataService\", \"mergeOptions\"\r\n ]);\r\n\r\n // calc'd props\r\n this.refMap = {};\r\n this.deferredFns = [];\r\n this.jsonResultsAdapter = this.dataService.jsonResultsAdapter;\r\n this.metadataStore = this.entityManager.metadataStore;\r\n this.rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.\r\n }\r\n\r\n getUrl() {\r\n let query = this.query;\r\n if (!query) {\r\n throw new Error(\"query cannot be empty\");\r\n }\r\n let uriString: string;\r\n if (typeof query === 'string') {\r\n uriString = query;\r\n } else if (query instanceof EntityQuery) {\r\n uriString = this.dataService.uriBuilder!.buildUri(query, this.metadataStore);\r\n } else {\r\n throw new Error(\"unable to recognize query parameter as either a string or an EntityQuery\");\r\n }\r\n return this.dataService.qualifyUrl(uriString);\r\n }\r\n\r\n visitAndMerge(nodes: any[], nodeContext: any) {\r\n let query = this.query;\r\n let jra = this.jsonResultsAdapter;\r\n nodeContext = nodeContext || {};\r\n let that = this;\r\n let result = core.map(nodes, function (node) {\r\n if (query == null && node.entityAspect) {\r\n // don't bother merging a result from a save that was not returned from the server.\r\n if (node.entityAspect.entityState.isDeleted()) {\r\n that.entityManager.detachEntity(node);\r\n } else {\r\n node.entityAspect.acceptChanges();\r\n }\r\n return node;\r\n }\r\n\r\n let meta = jra.visitNode(node, that, nodeContext) || {};\r\n node = meta.node || node;\r\n if (query && nodeContext.nodeType === \"root\" && !meta.entityType) {\r\n meta.entityType = query instanceof EntityQuery && query._getToEntityType && query._getToEntityType(that.metadataStore);\r\n }\r\n return processMeta(that, node, meta);\r\n }, this.mergeOptions.includeDeleted);\r\n\r\n if (result.filter && !this.mergeOptions.includeDeleted) {\r\n // result may have deleted entities because related nodes were processed\r\n result = result.filter((x: any) => x && (!x.entityAspect || !x.entityAspect.entityState.isDeleted()));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n processDeferred() {\r\n if (this.deferredFns.length > 0) {\r\n this.deferredFns.forEach((fn) => {\r\n fn();\r\n });\r\n }\r\n }\r\n}\r\nMappingContext.prototype._$typeName = \"MappingContext\";\r\n\r\n\r\nfunction processMeta(mc: MappingContext, node: any, meta: NodeMeta, assignFn?: (val: any) => void) {\r\n // == is deliberate here instead of ===\r\n if (meta.ignore || node == null) {\r\n return null;\r\n } else if (meta.nodeRefId) {\r\n let refValue = resolveEntityRef(mc, meta.nodeRefId);\r\n if (typeof refValue === \"function\" && assignFn != null) {\r\n mc.deferredFns.push(function () {\r\n assignFn(refValue);\r\n });\r\n return undefined; // deferred and will be set later;\r\n }\r\n return refValue;\r\n } else if (meta.entityType) {\r\n let entityType = meta.entityType;\r\n if (mc.mergeOptions.noTracking) {\r\n node = processNoMerge(mc, entityType, node);\r\n if (entityType.noTrackingFn) {\r\n node = entityType.noTrackingFn(node, entityType);\r\n }\r\n if (meta.nodeId) {\r\n mc.refMap[meta.nodeId] = node;\r\n }\r\n return node;\r\n } else {\r\n if (entityType.isComplexType) {\r\n // because we still need to do serverName to client name processing\r\n return processNoMerge(mc, entityType, node);\r\n } else {\r\n return mergeEntity(mc, node, meta);\r\n }\r\n }\r\n } else {\r\n\r\n if ((!meta.passThru) && typeof node === 'object' && ! core.isDate(node)) {\r\n node = processAnonType(mc, node);\r\n }\r\n\r\n // updating the refMap for entities is handled by updateEntityRef for entities.\r\n if (meta.nodeId) {\r\n mc.refMap[meta.nodeId] = node;\r\n }\r\n return node;\r\n }\r\n}\r\n\r\nfunction processNoMerge(mc: MappingContext, stype: StructuralType, node: any) {\r\n let result = {} as Record<string, any>;\r\n\r\n stype.dataProperties.forEach(function (dp) {\r\n if (dp.isComplexProperty) {\r\n result[dp.name] = core.map(node[dp.nameOnServer], (v: any) => {\r\n return processNoMerge(mc, dp.dataType as any, v);\r\n });\r\n } else {\r\n result[dp.name] = DataType.parseRawValue(node[dp.nameOnServer], dp.dataType as DataType);\r\n }\r\n });\r\n\r\n (stype instanceof EntityType) && stype.navigationProperties.forEach( (np) => {\r\n let nodeContext = { nodeType: \"navProp\", navigationProperty: np };\r\n visitNode(node[np.nameOnServer], mc, nodeContext, result, np.name);\r\n });\r\n\r\n return result;\r\n}\r\n\r\nfunction processAnonType(mc: MappingContext, node: any) {\r\n // node is guaranteed to be an object by this point, i.e. not a scalar\r\n let keyFn = mc.metadataStore.namingConvention.serverPropertyNameToClient;\r\n let result = {};\r\n\r\n core.objectForEach(node, function (key, value) {\r\n let newKey = keyFn(key);\r\n let nodeContext = { nodeType: \"anonProp\", propertyName: newKey };\r\n visitNode(value, mc, nodeContext, result, newKey);\r\n });\r\n return result;\r\n}\r\n\r\nfunction visitNode(node: any, mc: MappingContext, nodeContext: NodeContext, result: Record<string, any>, key: string) {\r\n let jra = mc.jsonResultsAdapter;\r\n let meta = jra.visitNode(node, mc, nodeContext) || {};\r\n // allows visitNode to change the value;\r\n node = meta.node || node;\r\n\r\n if (meta.ignore) return;\r\n if (meta.passThru) {\r\n // It used to `return node`, which the callers ignore, so the property was dropped.\r\n if (meta.nodeId) mc.refMap[meta.nodeId] = node;\r\n result[key] = node;\r\n return;\r\n }\r\n if (Array.isArray(node)) {\r\n nodeContext.nodeType = nodeContext.nodeType + \"Item\";\r\n result[key] = node.map(function (v, ix) {\r\n meta = jra.visitNode(v, mc, nodeContext) || {};\r\n v = meta.node || v;\r\n return processMeta(mc, v, meta, function (refValue) {\r\n result[key][ix] = refValue();\r\n });\r\n });\r\n } else {\r\n result[key] = processMeta(mc, node, meta, function (refValue) {\r\n result[key] = refValue();\r\n });\r\n }\r\n}\r\n\r\nfunction resolveEntityRef(mc: MappingContext, nodeRefId: string) {\r\n let entity = mc.refMap[nodeRefId];\r\n if (entity === undefined) {\r\n return function () {\r\n return mc.refMap[nodeRefId];\r\n };\r\n } else {\r\n return entity;\r\n }\r\n}\r\n\r\nfunction updateEntityRef(mc: MappingContext, targetEntity: any, node: any) {\r\n let nodeId = node._$meta.nodeId;\r\n if (!nodeId && node._$meta.extraMetadata) {\r\n // refMap is not really used, but is returned as data.retrievedEntities, so we populate it anyway.\r\n nodeId = node._$meta.extraMetadata.uriKey;\r\n }\r\n if (nodeId != null) {\r\n mc.refMap[nodeId] = targetEntity;\r\n }\r\n}\r\n\r\n// can return null for a deleted entity if includeDeleted == false\r\nfunction mergeEntity(mc: MappingContext, node: any, meta: NodeMeta) {\r\n node._$meta = meta;\r\n let em = mc.entityManager;\r\n\r\n let entityType = meta.entityType as EntityType;\r\n if (typeof (entityType) === 'string') {\r\n entityType = mc.metadataStore._getStructuralType(entityType, false) as EntityType;\r\n }\r\n node.entityType = entityType;\r\n\r\n let mergeStrategy = mc.mergeOptions.mergeStrategy;\r\n let isSaving = mc.query == null;\r\n\r\n let entityKey = entityType.getEntityKeyFromRawEntity(node, mc.rawValueFn);\r\n let targetEntity = em.getEntityByKey(entityKey);\r\n if (targetEntity) {\r\n if (isSaving && targetEntity.entityAspect.entityState.isDeleted()) {\r\n em.detachEntity(targetEntity);\r\n return targetEntity;\r\n }\r\n let targetEntityState = targetEntity.entityAspect.entityState;\r\n if (mergeStrategy === MergeStrategy.Disallowed) {\r\n throw new Error(\"A MergeStrategy of 'Disallowed' prevents \" + entityKey.toString() + \" from being merged\");\r\n } else if (mergeStrategy === MergeStrategy.SkipMerge) {\r\n updateEntityNoMerge(mc, targetEntity, node);\r\n } else {\r\n if (mergeStrategy === MergeStrategy.OverwriteChanges\r\n || targetEntityState.isUnchanged()) {\r\n updateEntity(mc, targetEntity, node);\r\n targetEntity.entityAspect.wasLoaded = true;\r\n if (meta.extraMetadata) {\r\n targetEntity.entityAspect.extraMetadata = meta.extraMetadata;\r\n }\r\n targetEntity.entityAspect.entityState = EntityState.Unchanged;\r\n clearOriginalValues(targetEntity);\r\n // propertyName not specified because multiple props EntityChangedEventArgs\r\n targetEntity.entityAspect.propertyChanged.publish({ entity: targetEntity, propertyName: null });\r\n let action = isSaving ? EntityAction.MergeOnSave : EntityAction.MergeOnQuery;\r\n em.entityChanged.publish({ entityAction: action, entity: targetEntity });\r\n // this is needed to handle an overwrite of a modified entity with an unchanged entity\r\n // which might in turn cause _hasChanges to change.\r\n if (!targetEntityState.isUnchanged()) {\r\n em._notifyStateChange(targetEntity, false);\r\n }\r\n } else {\r\n // process targetEntity (even if deleted) to ensure related nodes are handled\r\n updateEntityNoMerge(mc, targetEntity, node);\r\n if (targetEntityState === EntityState.Deleted && !mc.mergeOptions.includeDeleted) {\r\n return null;\r\n }\r\n }\r\n }\r\n } else {\r\n targetEntity = entityType._createInstanceCore() as Entity;\r\n\r\n updateEntity(mc, targetEntity, node);\r\n\r\n if (meta.extraMetadata) {\r\n targetEntity.entityAspect.extraMetadata = meta.extraMetadata;\r\n }\r\n // em._attachEntityCore(targetEntity, EntityState.Unchanged, MergeStrategy.Disallowed);\r\n em._attachEntityCore(targetEntity, EntityState.Unchanged, mergeStrategy);\r\n targetEntity.entityAspect.wasLoaded = true;\r\n em.entityChanged.publish({ entityAction: EntityAction.AttachOnQuery, entity: targetEntity });\r\n }\r\n return targetEntity;\r\n}\r\n\r\n// copied from entityAspect\r\nfunction clearOriginalValues(target: any) {\r\n let aspect = target.entityAspect || target.complexAspect;\r\n aspect.originalValues = {};\r\n let stype = target.entityType || target.complexType;\r\n stype.complexProperties.forEach(function (cp: any) {\r\n let cos = target.getProperty(cp.name);\r\n if (cp.isScalar) {\r\n clearOriginalValues(cos);\r\n } else {\r\n observableArray.acceptChanges(cos);\r\n cos.forEach(clearOriginalValues);\r\n }\r\n });\r\n}\r\n\r\n\r\nfunction updateEntityNoMerge(mc: MappingContext, targetEntity: Entity, node: any) {\r\n updateEntityRef(mc, targetEntity, node);\r\n // we still need to merge related entities even if top level entity wasn't modified.\r\n node.entityType.navigationProperties.forEach(function (np: NavigationProperty) {\r\n if (np.isScalar) {\r\n mergeRelatedEntityCore(mc, node, np);\r\n } else {\r\n mergeRelatedEntitiesCore(mc, node, np);\r\n }\r\n });\r\n}\r\n\r\nfunction updateEntity(mc: MappingContext, targetEntity: Entity, node: any) {\r\n updateEntityRef(mc, targetEntity, node);\r\n let entityType = targetEntity.entityType;\r\n entityType._updateTargetFromRaw(targetEntity, node, mc.rawValueFn);\r\n\r\n entityType.navigationProperties.forEach(function (np) {\r\n if (np.isScalar) {\r\n mergeRelatedEntity(mc, np, targetEntity, node);\r\n } else {\r\n mergeRelatedEntities(mc, np, targetEntity, node);\r\n }\r\n });\r\n}\r\n\r\nfunction mergeRelatedEntity(mc: MappingContext, navigationProperty: NavigationProperty, targetEntity: Entity, rawEntity: any) {\r\n\r\n let relatedEntity = mergeRelatedEntityCore(mc, rawEntity, navigationProperty);\r\n if (relatedEntity == null) return;\r\n if (typeof relatedEntity === 'function') {\r\n mc.deferredFns.push(function () {\r\n relatedEntity = relatedEntity();\r\n updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);\r\n });\r\n } else {\r\n updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);\r\n }\r\n}\r\n\r\nfunction mergeRelatedEntities(mc: MappingContext, navigationProperty: NavigationProperty, targetEntity: Entity, rawEntity: any) {\r\n let relatedEntities = mergeRelatedEntitiesCore(mc, rawEntity, navigationProperty);\r\n if (relatedEntities == null) return;\r\n\r\n let inverseProperty = navigationProperty.inverse;\r\n if (!inverseProperty) return;\r\n\r\n let originalRelatedEntities = targetEntity.getProperty(navigationProperty.name);\r\n originalRelatedEntities.wasLoaded = true;\r\n\r\n relatedEntities.forEach(function (relatedEntity: any) {\r\n if (typeof relatedEntity === 'function') {\r\n mc.deferredFns.push(function () {\r\n relatedEntity = relatedEntity();\r\n updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty as NavigationProperty);\r\n });\r\n } else {\r\n updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty as NavigationProperty);\r\n }\r\n });\r\n}\r\n\r\nfunction mergeRelatedEntityCore(mc: MappingContext, rawEntity: any, navigationProperty: NavigationProperty) {\r\n let relatedRawEntity = rawEntity[navigationProperty.nameOnServer];\r\n if (!relatedRawEntity) return null;\r\n\r\n let relatedEntity = mc.visitAndMerge(relatedRawEntity, { nodeType: \"navProp\", navigationProperty: navigationProperty });\r\n return relatedEntity;\r\n}\r\n\r\nfunction mergeRelatedEntitiesCore(mc: MappingContext, rawEntity: any, navigationProperty: NavigationProperty) {\r\n let relatedRawEntities = rawEntity[navigationProperty.nameOnServer];\r\n if (!relatedRawEntities) return null;\r\n\r\n // a navigation property is expected to yield an array\r\n if (!Array.isArray(relatedRawEntities)) return null;\r\n\r\n let relatedEntities = mc.visitAndMerge(relatedRawEntities, { nodeType: \"navPropItem\", navigationProperty: navigationProperty });\r\n return relatedEntities;\r\n}\r\n\r\nfunction updateRelatedEntity(relatedEntity: Entity, targetEntity: Entity, navigationProperty: NavigationProperty) {\r\n if (!relatedEntity) return;\r\n let propName = navigationProperty.name;\r\n let currentRelatedEntity = targetEntity.getProperty(propName);\r\n\r\n // check if the related entity is already hooked up\r\n if (currentRelatedEntity !== relatedEntity) {\r\n // if not hook up both directions.\r\n targetEntity.setProperty(propName, relatedEntity);\r\n let inverseProperty = navigationProperty.inverse;\r\n if (!inverseProperty) return;\r\n if (inverseProperty.isScalar) {\r\n relatedEntity.setProperty(inverseProperty.name, targetEntity);\r\n } else {\r\n let collection = relatedEntity.getProperty(inverseProperty.name);\r\n collection.push(targetEntity);\r\n\r\n }\r\n }\r\n}\r\n\r\nfunction updateRelatedEntityInCollection(mc: MappingContext, relatedEntity: Entity | undefined,\r\n relatedEntities: Entity[], targetEntity: Entity, inverseProperty: NavigationProperty) {\r\n if (!relatedEntity) return;\r\n\r\n // don't update relatedCollection if preserveChanges & relatedEntity has an fkChange.\r\n if (relatedEntity.entityAspect.entityState === EntityState.Modified\r\n && mc.mergeOptions.mergeStrategy === MergeStrategy.PreserveChanges) {\r\n let origValues = relatedEntity.entityAspect.originalValues;\r\n let fkWasModified = inverseProperty.relatedDataProperties.some(function (dp) {\r\n return origValues[dp.name] != undefined;\r\n });\r\n if (fkWasModified) return;\r\n }\r\n // check if the related entity is already hooked up\r\n let thisEntity = relatedEntity.getProperty(inverseProperty.name);\r\n\r\n if (thisEntity !== targetEntity) {\r\n // if not - hook it up.\r\n relatedEntities.push(relatedEntity);\r\n relatedEntity.setProperty(inverseProperty.name, targetEntity);\r\n }\r\n}\r\n\r\n\r\n"]}
|