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,321 @@
|
|
|
1
|
+
import { config as globalConfig } from '../config/config.js';
|
|
2
|
+
import { core } from '../core/core.js';
|
|
3
|
+
import { EntityAspect } from '../entity/entity-aspect.js';
|
|
4
|
+
import { DataProperty } from '../metadata/entity-metadata.js';
|
|
5
|
+
import { makeComplexArray, makePrimitiveArray, makeRelationArray } from '../entity/array.js';
|
|
6
|
+
/**
|
|
7
|
+
* Change tracking for plain JavaScript objects.
|
|
8
|
+
*
|
|
9
|
+
* Each mapped property becomes an accessor **on the prototype** - defined once per type, not per
|
|
10
|
+
* instance - and the values live in a `_backingStore` object on the instance. A get reads the
|
|
11
|
+
* store; a set hands the property, the new value and an accessor for the old one to the entity's
|
|
12
|
+
* `_$interceptor`, which is where change tracking actually happens.
|
|
13
|
+
*
|
|
14
|
+
* That split is why this file is cheap and the interceptor is not: of the time spent setting a
|
|
15
|
+
* tracked property, about 96% is change tracking (validation alone is around 63%) and about 2% is
|
|
16
|
+
* the plumbing here. Optimise the interceptor, or turn off `validateOnPropertyChange`; there is
|
|
17
|
+
* very little to win in this file.
|
|
18
|
+
*/
|
|
19
|
+
export class ModelLibraryBackingStoreAdapter {
|
|
20
|
+
name;
|
|
21
|
+
constructor() {
|
|
22
|
+
this.name = "backingStore";
|
|
23
|
+
}
|
|
24
|
+
static register(config) {
|
|
25
|
+
config = config || globalConfig;
|
|
26
|
+
config.registerAdapter("modelLibrary", ModelLibraryBackingStoreAdapter);
|
|
27
|
+
return config.initializeAdapterInstance("modelLibrary", "backingStore", true);
|
|
28
|
+
}
|
|
29
|
+
initialize() {
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The value of a property as it is stored, without creating anything. A collection navigation
|
|
33
|
+
* is created on first read (see makeCollectionNavPropDescription), so code that only wants to
|
|
34
|
+
* look at existing related entities asks with this instead of `getProperty` - otherwise
|
|
35
|
+
* attaching or deleting an entity would materialise every collection it has.
|
|
36
|
+
*/
|
|
37
|
+
peekProperty(entity, propertyName) {
|
|
38
|
+
const bs = entity._backingStore;
|
|
39
|
+
return bs ? bs[propertyName] : undefined;
|
|
40
|
+
}
|
|
41
|
+
getTrackablePropertyNames(entity) {
|
|
42
|
+
let names = [];
|
|
43
|
+
for (let p in entity) {
|
|
44
|
+
if (p === "entityAspect" || p === "entityType")
|
|
45
|
+
continue;
|
|
46
|
+
if (p === "_$typeName" || p === "_backingStore")
|
|
47
|
+
continue;
|
|
48
|
+
if (typeof entity[p] !== "function") {
|
|
49
|
+
names.push(p);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return names;
|
|
53
|
+
}
|
|
54
|
+
// This method is called during Metadata initialization
|
|
55
|
+
initializeEntityPrototype(proto) {
|
|
56
|
+
proto.getProperty = function (propertyName) {
|
|
57
|
+
return this[propertyName];
|
|
58
|
+
};
|
|
59
|
+
proto.setProperty = function (propertyName, value) {
|
|
60
|
+
this[propertyName] = value;
|
|
61
|
+
// allow setProperty chaining.
|
|
62
|
+
return this;
|
|
63
|
+
};
|
|
64
|
+
movePropDefsToProto(proto);
|
|
65
|
+
}
|
|
66
|
+
// This method is called when an EntityAspect is first created - this will occur as part of the entityType.createEntity call.
|
|
67
|
+
// which can be called either directly or via standard query materialization
|
|
68
|
+
// entity is either an entity or a complexObject
|
|
69
|
+
startTracking(entity, proto) {
|
|
70
|
+
// Write through the backing store rather than the accessors: the interceptor would treat
|
|
71
|
+
// these initial values as changes to an entity that does not exist yet.
|
|
72
|
+
let bs = movePropsToBackingStore(entity);
|
|
73
|
+
// assign default values to the entity
|
|
74
|
+
let stype = EntityAspect.isEntity(entity) ? entity.entityType : entity.complexType;
|
|
75
|
+
forEachProperty(stype, function (prop) {
|
|
76
|
+
let propName = prop.name;
|
|
77
|
+
// Deliberately the stored value rather than (entity as any)[propName]: reading a collection
|
|
78
|
+
// navigation through its accessor would create the very array this method leaves lazy.
|
|
79
|
+
let val = bs[propName];
|
|
80
|
+
if (prop instanceof DataProperty) {
|
|
81
|
+
if (prop.isComplexProperty) {
|
|
82
|
+
if (prop.isScalar) {
|
|
83
|
+
val = prop.dataType._createInstanceCore(entity, prop);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
val = makeComplexArray([], entity, prop);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else if (!prop.isScalar) {
|
|
90
|
+
val = makePrimitiveArray([], entity, prop);
|
|
91
|
+
}
|
|
92
|
+
else if (val === undefined) {
|
|
93
|
+
val = prop.defaultValue;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else if (prop.isNavigationProperty) {
|
|
97
|
+
if (val !== undefined && val !== null) {
|
|
98
|
+
throw new Error("Cannot assign a navigation property in an entity ctor.: " + propName);
|
|
99
|
+
}
|
|
100
|
+
if (prop.isScalar) {
|
|
101
|
+
// TODO: change this to nullstob later.
|
|
102
|
+
val = null;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Left uncreated: the accessor builds the relation array on first read. An array plus
|
|
106
|
+
// its arrayChanged event is ~390 bytes, and most collections on most entities are never
|
|
107
|
+
// touched. See makeCollectionNavPropDescription.
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
throw new Error("unknown property: " + propName);
|
|
113
|
+
}
|
|
114
|
+
if (prop.isSettable || prop.isNavigationProperty) {
|
|
115
|
+
bs[propName] = val;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// NOTE: this module deliberately does NOT register itself on import.
|
|
121
|
+
// Registration is explicit - pass the adapter to configureBreeze, or call
|
|
122
|
+
// SomeAdapter.register(). Importing a module should not mutate global state.
|
|
123
|
+
// private methods
|
|
124
|
+
/**
|
|
125
|
+
* Visits a type's data and navigation properties. `getProperties()` returns them concatenated
|
|
126
|
+
* into a fresh array, and this runs twice for every instance created, so it walks the two arrays
|
|
127
|
+
* instead. (A ComplexType has no navigation properties.)
|
|
128
|
+
*/
|
|
129
|
+
function forEachProperty(stype, fn) {
|
|
130
|
+
const dataProps = stype.dataProperties;
|
|
131
|
+
for (let i = 0; i < dataProps.length; i++)
|
|
132
|
+
fn(dataProps[i]);
|
|
133
|
+
const navProps = stype.navigationProperties;
|
|
134
|
+
if (navProps) {
|
|
135
|
+
for (let i = 0; i < navProps.length; i++)
|
|
136
|
+
fn(navProps[i]);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// This method is called during Metadata initialization to correctly "wrap" properties.
|
|
140
|
+
function movePropDefsToProto(proto) {
|
|
141
|
+
let stype = (proto.entityType || proto.complexType);
|
|
142
|
+
let extra = stype._extra;
|
|
143
|
+
let alreadyWrapped = extra.alreadyWrappedProps || {};
|
|
144
|
+
forEachProperty(stype, function (prop) {
|
|
145
|
+
let propName = prop.name;
|
|
146
|
+
// we only want to wrap props that haven't already been wrapped
|
|
147
|
+
if (alreadyWrapped[propName])
|
|
148
|
+
return;
|
|
149
|
+
// If property is already defined on the prototype then wrap it in another propertyDescriptor.
|
|
150
|
+
// otherwise create a propDescriptor for it.
|
|
151
|
+
let descr;
|
|
152
|
+
if (propName in proto) {
|
|
153
|
+
descr = wrapPropDescription(proto, prop);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
descr = makePropDescription(proto, prop);
|
|
157
|
+
}
|
|
158
|
+
// descr will be null for a wrapped descr that is not configurable
|
|
159
|
+
if (descr != null) {
|
|
160
|
+
Object.defineProperty(proto, propName, descr);
|
|
161
|
+
}
|
|
162
|
+
alreadyWrapped[propName] = true;
|
|
163
|
+
});
|
|
164
|
+
extra.alreadyWrappedProps = alreadyWrapped;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Called once per instance, as it starts being tracked. A custom constructor may have assigned
|
|
168
|
+
* properties in its own body, which lands them on the instance and shadows the prototype
|
|
169
|
+
* accessor; those values are moved into the backing store by writing them back through it.
|
|
170
|
+
*/
|
|
171
|
+
function movePropsToBackingStore(instance) {
|
|
172
|
+
let bs = getBackingStore(instance);
|
|
173
|
+
let proto = Object.getPrototypeOf(instance);
|
|
174
|
+
let stype = (proto.entityType || proto.complexType);
|
|
175
|
+
forEachProperty(stype, function (prop) {
|
|
176
|
+
let propName = prop.name;
|
|
177
|
+
if (prop.isUnmapped) {
|
|
178
|
+
// insure that any unmapped properties that were added after entityType
|
|
179
|
+
// was first created are wrapped with a property descriptor.
|
|
180
|
+
if (!core.getPropertyDescriptor(proto, propName)) {
|
|
181
|
+
let descr = makePropDescription(proto, prop);
|
|
182
|
+
Object.defineProperty(proto, propName, descr);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (!Object.prototype.hasOwnProperty.call(instance, propName))
|
|
186
|
+
return;
|
|
187
|
+
// pulls off the value, removes the instance property and then rewrites it via the accessor
|
|
188
|
+
let value = instance[propName];
|
|
189
|
+
delete instance[propName];
|
|
190
|
+
instance[propName] = value;
|
|
191
|
+
});
|
|
192
|
+
return bs;
|
|
193
|
+
}
|
|
194
|
+
function makePropDescription(proto, property) {
|
|
195
|
+
if (property.isNavigationProperty && !property.isScalar) {
|
|
196
|
+
return makeCollectionNavPropDescription(property);
|
|
197
|
+
}
|
|
198
|
+
let propName = property.name;
|
|
199
|
+
let descr = {
|
|
200
|
+
get: function () {
|
|
201
|
+
let bs = this._backingStore || getBackingStore(this);
|
|
202
|
+
return bs[propName];
|
|
203
|
+
},
|
|
204
|
+
set: function (value) {
|
|
205
|
+
let bs = this._backingStore || getBackingStore(this);
|
|
206
|
+
// A fresh accessor per set, because `(property, newValue, rawAccessorFn)` is the
|
|
207
|
+
// interceptor contract - MetadataStore.trackUnmappedType lets an application supply its
|
|
208
|
+
// own. It is about 2% of a set, so the contract is worth more than the allocation.
|
|
209
|
+
this._$interceptor(property, value, getAccessorFn(bs, propName));
|
|
210
|
+
},
|
|
211
|
+
enumerable: true,
|
|
212
|
+
configurable: true
|
|
213
|
+
};
|
|
214
|
+
descr.set.rawSet = function (value) {
|
|
215
|
+
let bs = this._backingStore || getBackingStore(this);
|
|
216
|
+
bs[propName] = value;
|
|
217
|
+
};
|
|
218
|
+
return descr;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* A collection navigation - `order.orderDetails` - is an empty relation array until something
|
|
222
|
+
* reads it. Creating one costs about 0.5 microseconds and 390 bytes, and an entity that is never
|
|
223
|
+
* navigated never pays it. Reads after the first are an ordinary backing-store lookup.
|
|
224
|
+
*
|
|
225
|
+
* Assigning to a collection navigation throws in the interceptor either way ("Nonscalar
|
|
226
|
+
* navigation properties are readonly"), so the setter keeps the standard path.
|
|
227
|
+
*/
|
|
228
|
+
function makeCollectionNavPropDescription(property) {
|
|
229
|
+
const propName = property.name;
|
|
230
|
+
const descr = {
|
|
231
|
+
get: function () {
|
|
232
|
+
const bs = this._backingStore || getBackingStore(this);
|
|
233
|
+
let arr = bs[propName];
|
|
234
|
+
if (arr === undefined) {
|
|
235
|
+
arr = makeRelationArray([], this, property);
|
|
236
|
+
bs[propName] = arr;
|
|
237
|
+
}
|
|
238
|
+
return arr;
|
|
239
|
+
},
|
|
240
|
+
set: function (value) {
|
|
241
|
+
const bs = this._backingStore || getBackingStore(this);
|
|
242
|
+
this._$interceptor(property, value, getAccessorFn(bs, propName));
|
|
243
|
+
},
|
|
244
|
+
enumerable: true,
|
|
245
|
+
configurable: true
|
|
246
|
+
};
|
|
247
|
+
descr.set.rawSet = function (value) {
|
|
248
|
+
const bs = this._backingStore || getBackingStore(this);
|
|
249
|
+
bs[propName] = value;
|
|
250
|
+
};
|
|
251
|
+
return descr;
|
|
252
|
+
}
|
|
253
|
+
function getAccessorFn(bsArg, propName) {
|
|
254
|
+
const bs = bsArg;
|
|
255
|
+
return function () {
|
|
256
|
+
if (arguments.length === 0) {
|
|
257
|
+
return bs[propName];
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
bs[propName] = arguments[0];
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* For a property that already has an accessor on the prototype - a custom constructor using
|
|
267
|
+
* get/set - keep that accessor and route writes through the interceptor first.
|
|
268
|
+
*/
|
|
269
|
+
function wrapPropDescription(proto, property) {
|
|
270
|
+
if (!Object.prototype.hasOwnProperty.call(proto, property.name)) {
|
|
271
|
+
let nextProto = Object.getPrototypeOf(proto);
|
|
272
|
+
return wrapPropDescription(nextProto, property);
|
|
273
|
+
}
|
|
274
|
+
let propDescr = Object.getOwnPropertyDescriptor(proto, property.name);
|
|
275
|
+
if (!propDescr)
|
|
276
|
+
return undefined;
|
|
277
|
+
// if not configurable; we can't touch it - so leave.
|
|
278
|
+
if (!propDescr.configurable)
|
|
279
|
+
return undefined;
|
|
280
|
+
// if a data descriptor - don't change it - this is basically a static property - i.e. defined on every instance of the type with the same value.
|
|
281
|
+
if (propDescr.value)
|
|
282
|
+
return undefined;
|
|
283
|
+
// if a read only property descriptor - no need to change it.
|
|
284
|
+
if (!propDescr.set)
|
|
285
|
+
return undefined;
|
|
286
|
+
const originalGet = propDescr.get;
|
|
287
|
+
const originalSet = propDescr.set;
|
|
288
|
+
const rawSet = originalSet.rawSet || originalSet;
|
|
289
|
+
let localAccessorFn = function (entity) {
|
|
290
|
+
return function () {
|
|
291
|
+
if (arguments.length === 0) {
|
|
292
|
+
return originalGet.call(entity);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
rawSet.call(entity, arguments[0]);
|
|
296
|
+
return undefined;
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
};
|
|
300
|
+
let newDescr = {
|
|
301
|
+
get: function () {
|
|
302
|
+
return originalGet.call(this);
|
|
303
|
+
},
|
|
304
|
+
set: function (value) {
|
|
305
|
+
this._$interceptor(property, value, localAccessorFn(this));
|
|
306
|
+
},
|
|
307
|
+
enumerable: propDescr.enumerable,
|
|
308
|
+
configurable: true
|
|
309
|
+
};
|
|
310
|
+
newDescr.set.rawSet = originalSet;
|
|
311
|
+
return newDescr;
|
|
312
|
+
}
|
|
313
|
+
function getBackingStore(instance) {
|
|
314
|
+
let bs = instance._backingStore;
|
|
315
|
+
if (!bs) {
|
|
316
|
+
bs = {};
|
|
317
|
+
instance._backingStore = bs;
|
|
318
|
+
}
|
|
319
|
+
return bs;
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=adapter-model-library-backing-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-model-library-backing-store.js","sourceRoot":"","sources":["../../src/adapters/adapter-model-library-backing-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { config as globalConfig, BreezeConfig } from '../config/config.js';\nimport { core } from '../core/core.js';\nimport type { ModelLibraryAdapter } from '../config/interface-registry.js';\nimport { EntityAspect } from '../entity/entity-aspect.js';\nimport type { Entity, StructuralObject } from '../entity/entity-aspect.js';\nimport { DataProperty, ComplexType, NavigationProperty } from '../metadata/entity-metadata.js';\nimport type { StructuralType, EntityProperty } from '../metadata/entity-metadata.js';\nimport { makeComplexArray, makePrimitiveArray, makeRelationArray } from '../entity/array.js';\n\n/**\n * Change tracking for plain JavaScript objects.\n *\n * Each mapped property becomes an accessor **on the prototype** - defined once per type, not per\n * instance - and the values live in a `_backingStore` object on the instance. A get reads the\n * store; a set hands the property, the new value and an accessor for the old one to the entity's\n * `_$interceptor`, which is where change tracking actually happens.\n *\n * That split is why this file is cheap and the interceptor is not: of the time spent setting a\n * tracked property, about 96% is change tracking (validation alone is around 63%) and about 2% is\n * the plumbing here. Optimise the interceptor, or turn off `validateOnPropertyChange`; there is\n * very little to win in this file.\n */\nexport class ModelLibraryBackingStoreAdapter implements ModelLibraryAdapter {\n name: string;\n\n constructor() {\n this.name = \"backingStore\";\n }\n\n static register(config?: BreezeConfig) {\n config = config || globalConfig;\n config.registerAdapter(\"modelLibrary\", ModelLibraryBackingStoreAdapter);\n return config.initializeAdapterInstance(\"modelLibrary\", \"backingStore\", true) as ModelLibraryBackingStoreAdapter;\n }\n\n initialize() {\n }\n\n /**\n * The value of a property as it is stored, without creating anything. A collection navigation\n * is created on first read (see makeCollectionNavPropDescription), so code that only wants to\n * look at existing related entities asks with this instead of `getProperty` - otherwise\n * attaching or deleting an entity would materialise every collection it has.\n */\n peekProperty(entity: StructuralObject, propertyName: string) {\n const bs = (entity as any)._backingStore;\n return bs ? bs[propertyName] : undefined;\n }\n\n getTrackablePropertyNames(entity: Entity) {\n let names: string[] = [];\n for (let p in entity) {\n if (p === \"entityAspect\" || p === \"entityType\") continue;\n if (p === \"_$typeName\" || p === \"_backingStore\") continue;\n if (typeof (entity as Record<string, any>)[p] !== \"function\") {\n names.push(p);\n }\n }\n return names;\n }\n\n // This method is called during Metadata initialization\n initializeEntityPrototype(proto: any) {\n\n proto.getProperty = function (propertyName: string) {\n return this[propertyName];\n };\n\n proto.setProperty = function (propertyName: string, value: any) {\n this[propertyName] = value;\n // allow setProperty chaining.\n return this;\n };\n\n movePropDefsToProto(proto);\n }\n\n // This method is called when an EntityAspect is first created - this will occur as part of the entityType.createEntity call.\n // which can be called either directly or via standard query materialization\n\n // entity is either an entity or a complexObject\n startTracking(entity: StructuralObject, proto: any) {\n // Write through the backing store rather than the accessors: the interceptor would treat\n // these initial values as changes to an entity that does not exist yet.\n let bs = movePropsToBackingStore(entity);\n\n // assign default values to the entity\n let stype = EntityAspect.isEntity(entity) ? entity.entityType : entity.complexType;\n forEachProperty(stype, function (prop) {\n\n let propName = prop.name;\n // Deliberately the stored value rather than (entity as any)[propName]: reading a collection\n // navigation through its accessor would create the very array this method leaves lazy.\n let val = bs[propName];\n\n if (prop instanceof DataProperty) {\n if (prop.isComplexProperty) {\n if (prop.isScalar) {\n val = (prop.dataType as ComplexType)._createInstanceCore(entity, prop);\n } else {\n val = makeComplexArray([], entity, prop);\n }\n } else if (!prop.isScalar) {\n val = makePrimitiveArray([], entity, prop);\n } else if (val === undefined) {\n val = prop.defaultValue;\n }\n\n } else if (prop.isNavigationProperty) {\n if (val !== undefined && val !== null) {\n throw new Error(\"Cannot assign a navigation property in an entity ctor.: \" + propName);\n }\n if (prop.isScalar) {\n // TODO: change this to nullstob later.\n val = null;\n } else {\n // Left uncreated: the accessor builds the relation array on first read. An array plus\n // its arrayChanged event is ~390 bytes, and most collections on most entities are never\n // touched. See makeCollectionNavPropDescription.\n return;\n }\n } else {\n throw new Error(\"unknown property: \" + propName);\n }\n if ((prop as DataProperty).isSettable || prop.isNavigationProperty) {\n bs[propName] = val;\n }\n });\n }\n}\n\n// NOTE: this module deliberately does NOT register itself on import.\n// Registration is explicit - pass the adapter to configureBreeze, or call\n// SomeAdapter.register(). Importing a module should not mutate global state.\n\n\n// private methods\n\n/**\n * Visits a type's data and navigation properties. `getProperties()` returns them concatenated\n * into a fresh array, and this runs twice for every instance created, so it walks the two arrays\n * instead. (A ComplexType has no navigation properties.)\n */\nfunction forEachProperty(stype: StructuralType, fn: (prop: EntityProperty) => void) {\n const dataProps = stype.dataProperties;\n for (let i = 0; i < dataProps.length; i++) fn(dataProps[i]);\n const navProps = (stype as any).navigationProperties as EntityProperty[] | undefined;\n if (navProps) {\n for (let i = 0; i < navProps.length; i++) fn(navProps[i]);\n }\n}\n\n// This method is called during Metadata initialization to correctly \"wrap\" properties.\nfunction movePropDefsToProto(proto: any) {\n let stype = (proto.entityType || proto.complexType) as StructuralType;\n let extra = stype._extra;\n\n let alreadyWrapped = extra.alreadyWrappedProps || {};\n\n forEachProperty(stype, function (prop) {\n let propName = prop.name;\n // we only want to wrap props that haven't already been wrapped\n if (alreadyWrapped[propName]) return;\n\n // If property is already defined on the prototype then wrap it in another propertyDescriptor.\n // otherwise create a propDescriptor for it.\n let descr: any;\n if (propName in proto) {\n descr = wrapPropDescription(proto, prop);\n } else {\n descr = makePropDescription(proto, prop);\n }\n // descr will be null for a wrapped descr that is not configurable\n if (descr != null) {\n Object.defineProperty(proto, propName, descr);\n }\n alreadyWrapped[propName] = true;\n });\n extra.alreadyWrappedProps = alreadyWrapped;\n}\n\n/**\n * Called once per instance, as it starts being tracked. A custom constructor may have assigned\n * properties in its own body, which lands them on the instance and shadows the prototype\n * accessor; those values are moved into the backing store by writing them back through it.\n */\nfunction movePropsToBackingStore(instance: any) {\n\n let bs = getBackingStore(instance);\n let proto = Object.getPrototypeOf(instance);\n let stype = (proto.entityType || proto.complexType) as StructuralType;\n forEachProperty(stype, function (prop) {\n let propName = prop.name;\n if (prop.isUnmapped) {\n // insure that any unmapped properties that were added after entityType\n // was first created are wrapped with a property descriptor.\n if (!core.getPropertyDescriptor(proto, propName)) {\n let descr = makePropDescription(proto, prop);\n Object.defineProperty(proto, propName, descr);\n }\n }\n if (!Object.prototype.hasOwnProperty.call(instance, propName)) return;\n // pulls off the value, removes the instance property and then rewrites it via the accessor\n let value = instance[propName];\n delete instance[propName];\n instance[propName] = value;\n });\n return bs;\n}\n\nfunction makePropDescription(proto: any, property: EntityProperty) {\n if (property.isNavigationProperty && !property.isScalar) {\n return makeCollectionNavPropDescription(property as NavigationProperty);\n }\n let propName = property.name;\n let descr = {\n get: function () {\n let bs = this._backingStore || getBackingStore(this);\n return bs[propName];\n },\n set: function (value: any) {\n let bs = this._backingStore || getBackingStore(this);\n // A fresh accessor per set, because `(property, newValue, rawAccessorFn)` is the\n // interceptor contract - MetadataStore.trackUnmappedType lets an application supply its\n // own. It is about 2% of a set, so the contract is worth more than the allocation.\n this._$interceptor(property, value, getAccessorFn(bs, propName));\n },\n enumerable: true,\n configurable: true\n };\n\n (descr.set as any).rawSet = function (value: any) {\n let bs = this._backingStore || getBackingStore(this);\n bs[propName] = value;\n };\n return descr;\n\n}\n\n/**\n * A collection navigation - `order.orderDetails` - is an empty relation array until something\n * reads it. Creating one costs about 0.5 microseconds and 390 bytes, and an entity that is never\n * navigated never pays it. Reads after the first are an ordinary backing-store lookup.\n *\n * Assigning to a collection navigation throws in the interceptor either way (\"Nonscalar\n * navigation properties are readonly\"), so the setter keeps the standard path.\n */\nfunction makeCollectionNavPropDescription(property: NavigationProperty) {\n const propName = property.name;\n const descr = {\n get: function () {\n const bs = this._backingStore || getBackingStore(this);\n let arr = bs[propName];\n if (arr === undefined) {\n arr = makeRelationArray([], this as Entity, property);\n bs[propName] = arr;\n }\n return arr;\n },\n set: function (value: any) {\n const bs = this._backingStore || getBackingStore(this);\n this._$interceptor(property, value, getAccessorFn(bs, propName));\n },\n enumerable: true,\n configurable: true\n };\n\n (descr.set as any).rawSet = function (value: any) {\n const bs = this._backingStore || getBackingStore(this);\n bs[propName] = value;\n };\n return descr;\n}\n\nfunction getAccessorFn(bsArg: {}, propName: string): any {\n const bs = bsArg as Record<string, any>;\n return function () {\n if (arguments.length === 0) {\n return bs[propName];\n } else {\n bs[propName] = arguments[0];\n return undefined;\n }\n };\n}\n\n/**\n * For a property that already has an accessor on the prototype - a custom constructor using\n * get/set - keep that accessor and route writes through the interceptor first.\n */\nfunction wrapPropDescription(proto: any, property: EntityProperty): any {\n if (!Object.prototype.hasOwnProperty.call(proto, property.name)) {\n let nextProto = Object.getPrototypeOf(proto);\n return wrapPropDescription(nextProto, property);\n }\n\n let propDescr = Object.getOwnPropertyDescriptor(proto, property.name);\n if (!propDescr) return undefined;\n // if not configurable; we can't touch it - so leave.\n if (!propDescr.configurable) return undefined;\n // if a data descriptor - don't change it - this is basically a static property - i.e. defined on every instance of the type with the same value.\n if (propDescr.value) return undefined;\n // if a read only property descriptor - no need to change it.\n if (!propDescr.set) return undefined;\n\n const originalGet = propDescr.get!;\n const originalSet = propDescr.set;\n const rawSet = (originalSet as any).rawSet || originalSet;\n\n let localAccessorFn = function (entity: any) {\n return function () {\n if (arguments.length === 0) {\n return originalGet.call(entity);\n } else {\n rawSet.call(entity, arguments[0]);\n return undefined;\n }\n };\n };\n\n let newDescr = {\n get: function () {\n return originalGet.call(this);\n },\n set: function (value: any) {\n this._$interceptor(property, value, localAccessorFn(this));\n },\n enumerable: propDescr.enumerable,\n configurable: true\n };\n (newDescr.set as any).rawSet = originalSet;\n return newDescr;\n}\n\n\nfunction getBackingStore(instance: any) {\n let bs = instance._backingStore;\n if (!bs) {\n bs = {};\n instance._backingStore = bs;\n }\n return bs;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BreezeConfig } from '../config/config.js';
|
|
2
|
+
import type { UriBuilderAdapter } from '../config/interface-registry.js';
|
|
3
|
+
import { EntityQuery } from '../query/entity-query.js';
|
|
4
|
+
import { MetadataStore } from '../metadata/entity-metadata.js';
|
|
5
|
+
export declare class UriBuilderJsonAdapter implements UriBuilderAdapter {
|
|
6
|
+
name: string;
|
|
7
|
+
constructor();
|
|
8
|
+
static register(config?: BreezeConfig): UriBuilderJsonAdapter;
|
|
9
|
+
initialize(): void;
|
|
10
|
+
buildUri(entityQuery: EntityQuery, metadataStore: MetadataStore): string;
|
|
11
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { config as globalConfig } from '../config/config.js';
|
|
2
|
+
import { EntityType } from '../metadata/entity-metadata.js';
|
|
3
|
+
import { appendQueryStringParameter } from './adapter-core.js';
|
|
4
|
+
export class UriBuilderJsonAdapter {
|
|
5
|
+
name;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.name = "json";
|
|
8
|
+
}
|
|
9
|
+
static register(config) {
|
|
10
|
+
config = config || globalConfig;
|
|
11
|
+
config.registerAdapter("uriBuilder", UriBuilderJsonAdapter);
|
|
12
|
+
return config.initializeAdapterInstance("uriBuilder", "json", true);
|
|
13
|
+
}
|
|
14
|
+
initialize() { }
|
|
15
|
+
buildUri(entityQuery, metadataStore) {
|
|
16
|
+
// force entityType validation;
|
|
17
|
+
let entityType = entityQuery._getFromEntityType(metadataStore, false);
|
|
18
|
+
if (!entityType)
|
|
19
|
+
entityType = new EntityType(metadataStore);
|
|
20
|
+
let json = entityQuery.toJSONExt({ entityType: entityType, toNameOnServer: true });
|
|
21
|
+
json.from = undefined;
|
|
22
|
+
json.queryOptions = undefined;
|
|
23
|
+
// withParameters values are sent once, as ordinary query-string arguments (the data
|
|
24
|
+
// service adapter passes them as request params). That is where the server's model
|
|
25
|
+
// binding reads them; a copy inside the JSON was never read.
|
|
26
|
+
json.parameters = undefined;
|
|
27
|
+
let jsonString = JSON.stringify(json);
|
|
28
|
+
if (jsonString.length > 2) {
|
|
29
|
+
let urlBody = encodeURIComponent(jsonString);
|
|
30
|
+
return appendQueryStringParameter(entityQuery.resourceName, urlBody);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return entityQuery.resourceName;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// NOTE: this module deliberately does NOT register itself on import.
|
|
38
|
+
// Registration is explicit - pass the adapter to configureBreeze, or call
|
|
39
|
+
// SomeAdapter.register(). Importing a module should not mutate global state.
|
|
40
|
+
//# sourceMappingURL=adapter-uri-builder-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-uri-builder-json.js","sourceRoot":"","sources":["../../src/adapters/adapter-uri-builder-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAgB,MAAM,qBAAqB,CAAC;AAG3E,OAAO,EAAiB,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,OAAO,qBAAqB;IAChC,IAAI,CAAS;IAEb;QACE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,MAAqB;QACnC,MAAM,GAAG,MAAM,IAAI,YAAY,CAAC;QAChC,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAA0B,CAAC;IAC/F,CAAC;IAED,UAAU,KAAI,CAAC;IAEf,QAAQ,CAAC,WAAwB,EAAE,aAA4B;QAC7D,+BAA+B;QAC/B,IAAI,UAAU,GAAG,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU;YAAE,UAAU,GAAG,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;QAC5D,IAAI,IAAI,GAAG,WAAW,CAAC,SAAS,CAAE,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAC,CAAQ,CAAC;QAC1F,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,oFAAoF;QACpF,mFAAmF;QACnF,6DAA6D;QAC7D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,OAAO,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC7C,OAAO,0BAA0B,CAAC,WAAW,CAAC,YAAa,EAAE,OAAO,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,OAAO,WAAW,CAAC,YAAa,CAAC;QACnC,CAAC;IAEH,CAAC;CAEF;AAED,qEAAqE;AACrE,0EAA0E;AAC1E,6EAA6E","sourcesContent":["import { config as globalConfig, BreezeConfig } from '../config/config.js';\r\nimport type { UriBuilderAdapter } from '../config/interface-registry.js';\r\nimport { EntityQuery } from '../query/entity-query.js';\r\nimport { MetadataStore, EntityType } from '../metadata/entity-metadata.js';\r\nimport { appendQueryStringParameter } from './adapter-core.js';\r\n\r\nexport class UriBuilderJsonAdapter implements UriBuilderAdapter {\r\n name: string;\r\n\r\n constructor() {\r\n this.name = \"json\";\r\n }\r\n\r\n static register(config?: BreezeConfig) {\r\n config = config || globalConfig;\r\n config.registerAdapter(\"uriBuilder\", UriBuilderJsonAdapter);\r\n return config.initializeAdapterInstance(\"uriBuilder\", \"json\", true) as UriBuilderJsonAdapter;\r\n }\r\n\r\n initialize() {}\r\n\r\n buildUri(entityQuery: EntityQuery, metadataStore: MetadataStore) {\r\n // force entityType validation;\r\n let entityType = entityQuery._getFromEntityType(metadataStore, false);\r\n if (!entityType) entityType = new EntityType(metadataStore);\r\n let json = entityQuery.toJSONExt( { entityType: entityType, toNameOnServer: true}) as any;\r\n json.from = undefined;\r\n json.queryOptions = undefined;\r\n // withParameters values are sent once, as ordinary query-string arguments (the data\r\n // service adapter passes them as request params). That is where the server's model\r\n // binding reads them; a copy inside the JSON was never read.\r\n json.parameters = undefined;\r\n\r\n let jsonString = JSON.stringify(json);\r\n if (jsonString.length > 2) {\r\n let urlBody = encodeURIComponent(jsonString);\r\n return appendQueryStringParameter(entityQuery.resourceName!, urlBody);\r\n } else {\r\n return entityQuery.resourceName!;\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\n// NOTE: this module deliberately does NOT register itself on import.\r\n// Registration is explicit - pass the adapter to configureBreeze, or call\r\n// SomeAdapter.register(). Importing a module should not mutate global state.\r\n\r\n\r\n\r\n\r\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { BreezeConfig } from '../config/config.js';
|
|
2
|
+
import type { AjaxAdapter, AjaxConfig, AjaxRequestInterceptor, BreezeFetch } from '../config/interface-registry.js';
|
|
3
|
+
import type { HttpResponse } from '../manager/entity-manager.js';
|
|
4
|
+
/** The transport used when none is supplied. Wrapped so that `fetch` keeps its receiver,
|
|
5
|
+
which some environments require. */
|
|
6
|
+
export declare const defaultFetch: BreezeFetch;
|
|
7
|
+
/** Breeze's description of one request, without the callbacks. */
|
|
8
|
+
export type HttpRequestConfig = Omit<AjaxConfig, 'success' | 'error'>;
|
|
9
|
+
/** The outcome of one request. Failures are values, not rejections. */
|
|
10
|
+
export interface HttpOutcome {
|
|
11
|
+
succeeded: boolean;
|
|
12
|
+
httpResponse: HttpResponse;
|
|
13
|
+
}
|
|
14
|
+
/** Turns Breeze's description of a request into the arguments for a fetch call. */
|
|
15
|
+
export declare function toFetchArgs(request: HttpRequestConfig): {
|
|
16
|
+
url: string;
|
|
17
|
+
init: RequestInit;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Sends one request and resolves with its outcome. Never rejects: a transport failure is
|
|
21
|
+
* reported with status 0, and a body that cannot be read with the real HTTP status.
|
|
22
|
+
*/
|
|
23
|
+
export declare function sendFetch(fetchFn: BreezeFetch, url: string, init: RequestInit, request: HttpRequestConfig): Promise<HttpOutcome>;
|
|
24
|
+
/**
|
|
25
|
+
* Ajax adapter using the fetch API.
|
|
26
|
+
*
|
|
27
|
+
* @deprecated Breeze 3 needs no ajax adapter: requests go through `config.fetch`, set with
|
|
28
|
+
* `configureBreeze({ fetch })`. This class is kept so that 2.x startup code - `register()`,
|
|
29
|
+
* `configureBreeze({ ajax: AjaxFetchAdapter })`, `config.initializeAdapterInstance('ajax',
|
|
30
|
+
* 'fetch')` - and code using `defaultSettings` or `requestInterceptor` keeps working. It is
|
|
31
|
+
* not scheduled for removal.
|
|
32
|
+
*/
|
|
33
|
+
export declare class AjaxFetchAdapter implements AjaxAdapter {
|
|
34
|
+
static adapterName: string;
|
|
35
|
+
name: string;
|
|
36
|
+
defaultSettings: {
|
|
37
|
+
headers?: {
|
|
38
|
+
[name: string]: string;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
requestInterceptor?: AjaxRequestInterceptor;
|
|
42
|
+
/** The function used to make the request. Defaults to `globalThis.fetch`. */
|
|
43
|
+
fetchFn: BreezeFetch;
|
|
44
|
+
constructor(fetchFn?: BreezeFetch);
|
|
45
|
+
/**
|
|
46
|
+
* @param breezeConfig - defaults to the global breeze config
|
|
47
|
+
* @param fetchFn - the transport this adapter uses. Defaults to `globalThis.fetch`.
|
|
48
|
+
*/
|
|
49
|
+
static register(breezeConfig?: BreezeConfig, fetchFn?: BreezeFetch): AjaxFetchAdapter;
|
|
50
|
+
initialize(): void;
|
|
51
|
+
ajax(ajaxConfig: AjaxConfig): void;
|
|
52
|
+
}
|