breeze-client 2.2.1-cjs → 2.2.1
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/adapter-ajax-angularjs/{breeze-client-adapter-ajax-angularjs.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-fetch/{breeze-client-adapter-ajax-fetch.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-httpclient/{breeze-client-adapter-ajax-httpclient.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-jquery/{breeze-client-adapter-ajax-jquery.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-post/{breeze-client-adapter-ajax-post.d.ts → index.d.ts} +1 -0
- package/adapter-data-service-odata/{breeze-client-adapter-data-service-odata.d.ts → index.d.ts} +1 -0
- package/adapter-data-service-webapi/{breeze-client-adapter-data-service-webapi.d.ts → index.d.ts} +1 -0
- package/adapter-model-library-backing-store/{breeze-client-adapter-model-library-backing-store.d.ts → index.d.ts} +1 -0
- package/adapter-model-library-ko/{breeze-client-adapter-model-library-ko.d.ts → index.d.ts} +1 -0
- package/adapter-uri-builder-json/{breeze-client-adapter-uri-builder-json.d.ts → index.d.ts} +1 -0
- package/adapter-uri-builder-odata/{breeze-client-adapter-uri-builder-odata.d.ts → index.d.ts} +1 -0
- package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +135 -0
- package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +49 -0
- package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +5 -0
- package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +135 -0
- package/esm2022/adapter-ajax-fetch/adapter-core.mjs +49 -0
- package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +5 -0
- package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +139 -0
- package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +49 -0
- package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +5 -0
- package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +107 -0
- package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +5 -0
- package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +77 -0
- package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +5 -0
- package/esm2022/adapter-data-service-odata/adapter-core.mjs +49 -0
- package/{esm5/adapter-data-service-odata/adapter-data-service-odata.js → esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs} +138 -147
- package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +5 -0
- package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +100 -0
- package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +5 -0
- package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +269 -0
- package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +5 -0
- package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +241 -0
- package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +5 -0
- package/esm2022/adapter-uri-builder-json/adapter-core.mjs +49 -0
- package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +37 -0
- package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +5 -0
- package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +49 -0
- package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +191 -0
- package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +5 -0
- package/esm2022/breeze-client.mjs +5 -0
- package/esm2022/index.mjs +2 -0
- package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +5 -0
- package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +269 -0
- package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +5 -0
- package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +421 -0
- package/esm2022/src/abstract-data-service-adapter.mjs +325 -0
- package/esm2022/src/array.mjs +4 -0
- package/esm2022/src/assert-param.mjs +330 -0
- package/esm2022/src/breeze.mjs +85 -0
- package/esm2022/src/complex-array.mjs +117 -0
- package/esm2022/src/config.mjs +232 -0
- package/esm2022/src/core.mjs +712 -0
- package/esm2022/src/csdl-metadata-parser.mjs +385 -0
- package/esm2022/src/data-service.mjs +221 -0
- package/esm2022/src/data-type.mjs +510 -0
- package/esm2022/src/default-property-interceptor.mjs +460 -0
- package/{esm2015/src/entity-action.js → esm2022/src/entity-action.mjs} +25 -25
- package/esm2022/src/entity-aspect.mjs +897 -0
- package/esm2022/src/entity-group.mjs +192 -0
- package/esm2022/src/entity-key.mjs +125 -0
- package/esm2022/src/entity-manager.mjs +2163 -0
- package/esm2022/src/entity-metadata.mjs +2242 -0
- package/esm2022/src/entity-query.mjs +1024 -0
- package/esm2022/src/entity-state.mjs +107 -0
- package/esm2022/src/enum.mjs +143 -0
- package/esm2022/src/event.mjs +264 -0
- package/esm2022/src/interface-registry.mjs +39 -0
- package/esm2022/src/key-generator.mjs +110 -0
- package/esm2022/src/local-query-comparison-options.mjs +65 -0
- package/esm2022/src/mapping-context.mjs +411 -0
- package/esm2022/src/naming-convention.mjs +92 -0
- package/esm2022/src/observable-array.mjs +183 -0
- package/esm2022/src/predicate.mjs +1259 -0
- package/esm2022/src/primitive-array.mjs +85 -0
- package/esm2022/src/query-options.mjs +152 -0
- package/esm2022/src/relation-array.mjs +173 -0
- package/esm2022/src/save-options.mjs +41 -0
- package/esm2022/src/unattached-children-map.mjs +56 -0
- package/esm2022/src/validate.mjs +995 -0
- package/esm2022/src/validation-options.mjs +64 -0
- package/{fesm2015/breeze-client-adapter-ajax-angularjs.js → fesm2022/breeze-client-adapter-ajax-angularjs.mjs} +6 -1
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-ajax-fetch.js → fesm2022/breeze-client-adapter-ajax-fetch.mjs} +9 -4
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-ajax-httpclient.js → fesm2022/breeze-client-adapter-ajax-httpclient.mjs} +6 -4
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-ajax-jquery.js → fesm2022/breeze-client-adapter-ajax-jquery.mjs} +6 -2
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-ajax-post.js → fesm2022/breeze-client-adapter-ajax-post.mjs} +1 -1
- package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-data-service-odata.js → fesm2022/breeze-client-adapter-data-service-odata.mjs} +68 -69
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-data-service-webapi.js → fesm2022/breeze-client-adapter-data-service-webapi.mjs} +30 -30
- package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-model-library-backing-store.js → fesm2022/breeze-client-adapter-model-library-backing-store.mjs} +14 -13
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-model-library-ko.js → fesm2022/breeze-client-adapter-model-library-ko.mjs} +14 -13
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-uri-builder-json.js → fesm2022/breeze-client-adapter-uri-builder-json.mjs} +9 -8
- package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-uri-builder-odata.js → fesm2022/breeze-client-adapter-uri-builder-odata.mjs} +86 -86
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
- package/{fesm2015/breeze-client-mixin-get-entity-graph.js → fesm2022/breeze-client-mixin-get-entity-graph.mjs} +1 -1
- package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
- package/{fesm2015/breeze-client-mixin-save-queuing.js → fesm2022/breeze-client-mixin-save-queuing.mjs} +23 -2
- package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +1 -0
- package/{fesm2015/breeze-client.js → fesm2022/breeze-client.mjs} +1933 -1538
- package/fesm2022/breeze-client.mjs.map +1 -0
- package/mixin-get-entity-graph/{breeze-client-mixin-get-entity-graph.d.ts → index.d.ts} +1 -0
- package/mixin-save-queuing/{breeze-client-mixin-save-queuing.d.ts → index.d.ts} +1 -0
- package/package.json +94 -12
- package/src/config.d.ts +1 -1
- package/src/core.d.ts +1 -1
- package/src/entity-aspect.d.ts +1 -1
- package/src/entity-metadata.d.ts +8 -6
- package/src/entity-query.d.ts +1 -1
- package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +0 -1
- package/adapter-ajax-angularjs/package.json +0 -13
- package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +0 -1
- package/adapter-ajax-fetch/package.json +0 -13
- package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +0 -1
- package/adapter-ajax-httpclient/package.json +0 -13
- package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +0 -1
- package/adapter-ajax-jquery/package.json +0 -13
- package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +0 -1
- package/adapter-ajax-post/package.json +0 -13
- package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +0 -1
- package/adapter-data-service-odata/package.json +0 -13
- package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +0 -1
- package/adapter-data-service-webapi/package.json +0 -13
- package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +0 -1
- package/adapter-model-library-backing-store/package.json +0 -13
- package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +0 -1
- package/adapter-model-library-ko/package.json +0 -13
- package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +0 -1
- package/adapter-uri-builder-json/package.json +0 -13
- package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +0 -1
- package/adapter-uri-builder-odata/package.json +0 -13
- package/breeze-client.d.ts +0 -8
- package/breeze-client.metadata.json +0 -1
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +0 -190
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js +0 -190
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +0 -195
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js +0 -115
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-post.umd.js +0 -92
- package/bundles/breeze-client-adapter-ajax-post.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.js +0 -747
- package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +0 -16
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js +0 -333
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +0 -16
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +0 -280
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-ko.umd.js +0 -252
- package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js +0 -96
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +0 -262
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +0 -1
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js +0 -258
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +0 -1
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +0 -2
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +0 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.js +0 -579
- package/bundles/breeze-client-mixin-save-queuing.umd.js.map +0 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js +0 -16
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +0 -1
- package/bundles/breeze-client.umd.js +0 -14234
- package/bundles/breeze-client.umd.js.map +0 -1
- package/bundles/breeze-client.umd.min.js +0 -16
- package/bundles/breeze-client.umd.min.js.map +0 -1
- package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -130
- package/esm2015/adapter-ajax-angularjs/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
- package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -130
- package/esm2015/adapter-ajax-fetch/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
- package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -137
- package/esm2015/adapter-ajax-httpclient/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
- package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -103
- package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
- package/esm2015/adapter-ajax-post/adapter-ajax-post.js +0 -77
- package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
- package/esm2015/adapter-data-service-odata/adapter-core.js +0 -49
- package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +0 -463
- package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
- package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -100
- package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
- package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -268
- package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
- package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +0 -240
- package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
- package/esm2015/adapter-uri-builder-json/adapter-core.js +0 -49
- package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -36
- package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
- package/esm2015/adapter-uri-builder-odata/adapter-core.js +0 -49
- package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -192
- package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
- package/esm2015/breeze-client.js +0 -9
- package/esm2015/index.js +0 -2
- package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
- package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
- package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
- package/esm2015/mixin-save-queuing/mixin-save-queuing.js +0 -400
- package/esm2015/src/abstract-data-service-adapter.js +0 -327
- package/esm2015/src/array.js +0 -4
- package/esm2015/src/assert-param.js +0 -312
- package/esm2015/src/breeze.js +0 -85
- package/esm2015/src/complex-array.js +0 -119
- package/esm2015/src/config.js +0 -223
- package/esm2015/src/core.js +0 -714
- package/esm2015/src/csdl-metadata-parser.js +0 -385
- package/esm2015/src/data-service.js +0 -203
- package/esm2015/src/data-type.js +0 -506
- package/esm2015/src/default-property-interceptor.js +0 -460
- package/esm2015/src/entity-aspect.js +0 -804
- package/esm2015/src/entity-group.js +0 -187
- package/esm2015/src/entity-key.js +0 -116
- package/esm2015/src/entity-manager.js +0 -2094
- package/esm2015/src/entity-metadata.js +0 -2109
- package/esm2015/src/entity-query.js +0 -1015
- package/esm2015/src/entity-state.js +0 -107
- package/esm2015/src/enum.js +0 -141
- package/esm2015/src/event.js +0 -256
- package/esm2015/src/interface-registry.js +0 -41
- package/esm2015/src/key-generator.js +0 -108
- package/esm2015/src/local-query-comparison-options.js +0 -65
- package/esm2015/src/mapping-context.js +0 -411
- package/esm2015/src/naming-convention.js +0 -88
- package/esm2015/src/observable-array.js +0 -185
- package/esm2015/src/predicate.js +0 -1242
- package/esm2015/src/primitive-array.js +0 -87
- package/esm2015/src/query-options.js +0 -152
- package/esm2015/src/relation-array.js +0 -175
- package/esm2015/src/save-options.js +0 -41
- package/esm2015/src/unattached-children-map.js +0 -58
- package/esm2015/src/validate.js +0 -991
- package/esm2015/src/validation-options.js +0 -64
- package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -132
- package/esm5/adapter-ajax-angularjs/adapter-core.js +0 -49
- package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
- package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -132
- package/esm5/adapter-ajax-fetch/adapter-core.js +0 -49
- package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
- package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -139
- package/esm5/adapter-ajax-httpclient/adapter-core.js +0 -49
- package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
- package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -105
- package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
- package/esm5/adapter-ajax-post/adapter-ajax-post.js +0 -81
- package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
- package/esm5/adapter-data-service-odata/adapter-core.js +0 -49
- package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
- package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -105
- package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
- package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -270
- package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
- package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +0 -242
- package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
- package/esm5/adapter-uri-builder-json/adapter-core.js +0 -49
- package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -38
- package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
- package/esm5/adapter-uri-builder-odata/adapter-core.js +0 -49
- package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -197
- package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
- package/esm5/breeze-client.js +0 -9
- package/esm5/index.js +0 -2
- package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
- package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
- package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
- package/esm5/mixin-save-queuing/mixin-save-queuing.js +0 -412
- package/esm5/src/abstract-data-service-adapter.js +0 -333
- package/esm5/src/array.js +0 -4
- package/esm5/src/assert-param.js +0 -317
- package/esm5/src/breeze.js +0 -85
- package/esm5/src/complex-array.js +0 -119
- package/esm5/src/config.js +0 -228
- package/esm5/src/core.js +0 -722
- package/esm5/src/csdl-metadata-parser.js +0 -385
- package/esm5/src/data-service.js +0 -207
- package/esm5/src/data-type.js +0 -513
- package/esm5/src/default-property-interceptor.js +0 -460
- package/esm5/src/entity-action.js +0 -52
- package/esm5/src/entity-aspect.js +0 -810
- package/esm5/src/entity-group.js +0 -189
- package/esm5/src/entity-key.js +0 -118
- package/esm5/src/entity-manager.js +0 -2112
- package/esm5/src/entity-metadata.js +0 -2144
- package/esm5/src/entity-query.js +0 -1042
- package/esm5/src/entity-state.js +0 -114
- package/esm5/src/enum.js +0 -144
- package/esm5/src/event.js +0 -259
- package/esm5/src/interface-registry.js +0 -43
- package/esm5/src/key-generator.js +0 -111
- package/esm5/src/local-query-comparison-options.js +0 -67
- package/esm5/src/mapping-context.js +0 -413
- package/esm5/src/naming-convention.js +0 -90
- package/esm5/src/observable-array.js +0 -201
- package/esm5/src/predicate.js +0 -1307
- package/esm5/src/primitive-array.js +0 -87
- package/esm5/src/query-options.js +0 -167
- package/esm5/src/relation-array.js +0 -175
- package/esm5/src/save-options.js +0 -43
- package/esm5/src/unattached-children-map.js +0 -60
- package/esm5/src/validate.js +0 -996
- package/esm5/src/validation-options.js +0 -66
- package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-post.js.map +0 -1
- package/fesm2015/breeze-client-adapter-data-service-odata.js.map +0 -1
- package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +0 -1
- package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +0 -1
- package/fesm2015/breeze-client-adapter-model-library-ko.js.map +0 -1
- package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +0 -1
- package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +0 -1
- package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +0 -1
- package/fesm2015/breeze-client-mixin-save-queuing.js.map +0 -1
- package/fesm2015/breeze-client.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-angularjs.js +0 -186
- package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-fetch.js +0 -186
- package/fesm5/breeze-client-adapter-ajax-fetch.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-httpclient.js +0 -193
- package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-jquery.js +0 -111
- package/fesm5/breeze-client-adapter-ajax-jquery.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-post.js +0 -86
- package/fesm5/breeze-client-adapter-ajax-post.js.map +0 -1
- package/fesm5/breeze-client-adapter-data-service-odata.js +0 -523
- package/fesm5/breeze-client-adapter-data-service-odata.js.map +0 -1
- package/fesm5/breeze-client-adapter-data-service-webapi.js +0 -111
- package/fesm5/breeze-client-adapter-data-service-webapi.js.map +0 -1
- package/fesm5/breeze-client-adapter-model-library-backing-store.js +0 -276
- package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +0 -1
- package/fesm5/breeze-client-adapter-model-library-ko.js +0 -248
- package/fesm5/breeze-client-adapter-model-library-ko.js.map +0 -1
- package/fesm5/breeze-client-adapter-uri-builder-json.js +0 -92
- package/fesm5/breeze-client-adapter-uri-builder-json.js.map +0 -1
- package/fesm5/breeze-client-adapter-uri-builder-odata.js +0 -250
- package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +0 -1
- package/fesm5/breeze-client-mixin-get-entity-graph.js +0 -254
- package/fesm5/breeze-client-mixin-get-entity-graph.js.map +0 -1
- package/fesm5/breeze-client-mixin-save-queuing.js +0 -356
- package/fesm5/breeze-client-mixin-save-queuing.js.map +0 -1
- package/fesm5/breeze-client.js +0 -13956
- package/fesm5/breeze-client.js.map +0 -1
- package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +0 -1
- package/mixin-get-entity-graph/package.json +0 -13
- package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +0 -1
- package/mixin-save-queuing/package.json +0 -13
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { core } from './core';
|
|
2
|
+
import { DataType } from './data-type';
|
|
3
|
+
import { EntityState } from './entity-state';
|
|
4
|
+
import { EntityAction } from './entity-action';
|
|
5
|
+
import { EntityType, DataProperty } from './entity-metadata';
|
|
6
|
+
import { MergeStrategy } from './query-options';
|
|
7
|
+
import { EntityQuery } from './entity-query';
|
|
8
|
+
/**
|
|
9
|
+
For use by breeze plugin authors only. The class is for use in building a [[IDataServiceAdapter]] implementation.
|
|
10
|
+
@adapter (see [[IDataServiceAdapter]])
|
|
11
|
+
@hidden
|
|
12
|
+
*/
|
|
13
|
+
export class MappingContext {
|
|
14
|
+
rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.
|
|
15
|
+
constructor(config) {
|
|
16
|
+
core.extend(this, config, [
|
|
17
|
+
"query", "entityManager", "dataService", "mergeOptions"
|
|
18
|
+
]);
|
|
19
|
+
// calc'd props
|
|
20
|
+
this.refMap = {};
|
|
21
|
+
this.deferredFns = [];
|
|
22
|
+
this.jsonResultsAdapter = this.dataService.jsonResultsAdapter;
|
|
23
|
+
this.metadataStore = this.entityManager.metadataStore;
|
|
24
|
+
this.rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.
|
|
25
|
+
}
|
|
26
|
+
getUrl() {
|
|
27
|
+
let query = this.query;
|
|
28
|
+
if (!query) {
|
|
29
|
+
throw new Error("query cannot be empty");
|
|
30
|
+
}
|
|
31
|
+
let uriString;
|
|
32
|
+
if (typeof query === 'string') {
|
|
33
|
+
uriString = query;
|
|
34
|
+
}
|
|
35
|
+
else if (query instanceof EntityQuery) {
|
|
36
|
+
uriString = this.dataService.uriBuilder.buildUri(query, this.metadataStore);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
throw new Error("unable to recognize query parameter as either a string or an EntityQuery");
|
|
40
|
+
}
|
|
41
|
+
return this.dataService.qualifyUrl(uriString);
|
|
42
|
+
}
|
|
43
|
+
visitAndMerge(nodes, nodeContext) {
|
|
44
|
+
let query = this.query;
|
|
45
|
+
let jra = this.jsonResultsAdapter;
|
|
46
|
+
nodeContext = nodeContext || {};
|
|
47
|
+
let that = this;
|
|
48
|
+
let result = core.map(nodes, function (node) {
|
|
49
|
+
if (query == null && node.entityAspect) {
|
|
50
|
+
// don't bother merging a result from a save that was not returned from the server.
|
|
51
|
+
if (node.entityAspect.entityState.isDeleted()) {
|
|
52
|
+
that.entityManager.detachEntity(node);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
node.entityAspect.acceptChanges();
|
|
56
|
+
}
|
|
57
|
+
return node;
|
|
58
|
+
}
|
|
59
|
+
let meta = jra.visitNode(node, that, nodeContext) || {};
|
|
60
|
+
node = meta.node || node;
|
|
61
|
+
if (query && nodeContext.nodeType === "root" && !meta.entityType) {
|
|
62
|
+
meta.entityType = query instanceof EntityQuery && query._getToEntityType && query._getToEntityType(that.metadataStore);
|
|
63
|
+
}
|
|
64
|
+
return processMeta(that, node, meta);
|
|
65
|
+
}, this.mergeOptions.includeDeleted);
|
|
66
|
+
if (result.filter && !this.mergeOptions.includeDeleted) {
|
|
67
|
+
// result may have deleted entities because related nodes were processed
|
|
68
|
+
result = result.filter((x) => x && (!x.entityAspect || !x.entityAspect.entityState.isDeleted()));
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
processDeferred() {
|
|
73
|
+
if (this.deferredFns.length > 0) {
|
|
74
|
+
this.deferredFns.forEach((fn) => {
|
|
75
|
+
fn();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
MappingContext.prototype._$typeName = "MappingContext";
|
|
81
|
+
function processMeta(mc, node, meta, assignFn) {
|
|
82
|
+
// == is deliberate here instead of ===
|
|
83
|
+
if (meta.ignore || node == null) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
else if (meta.nodeRefId) {
|
|
87
|
+
let refValue = resolveEntityRef(mc, meta.nodeRefId);
|
|
88
|
+
if (typeof refValue === "function" && assignFn != null) {
|
|
89
|
+
mc.deferredFns.push(function () {
|
|
90
|
+
assignFn(refValue);
|
|
91
|
+
});
|
|
92
|
+
return undefined; // deferred and will be set later;
|
|
93
|
+
}
|
|
94
|
+
return refValue;
|
|
95
|
+
}
|
|
96
|
+
else if (meta.entityType) {
|
|
97
|
+
let entityType = meta.entityType;
|
|
98
|
+
if (mc.mergeOptions.noTracking) {
|
|
99
|
+
node = processNoMerge(mc, entityType, node);
|
|
100
|
+
if (entityType.noTrackingFn) {
|
|
101
|
+
node = entityType.noTrackingFn(node, entityType);
|
|
102
|
+
}
|
|
103
|
+
if (meta.nodeId) {
|
|
104
|
+
mc.refMap[meta.nodeId] = node;
|
|
105
|
+
}
|
|
106
|
+
return node;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
if (entityType.isComplexType) {
|
|
110
|
+
// because we still need to do serverName to client name processing
|
|
111
|
+
return processNoMerge(mc, entityType, node);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
return mergeEntity(mc, node, meta);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
if ((!meta.passThru) && typeof node === 'object' && !core.isDate(node)) {
|
|
120
|
+
node = processAnonType(mc, node);
|
|
121
|
+
}
|
|
122
|
+
// updating the refMap for entities is handled by updateEntityRef for entities.
|
|
123
|
+
if (meta.nodeId) {
|
|
124
|
+
mc.refMap[meta.nodeId] = node;
|
|
125
|
+
}
|
|
126
|
+
return node;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function processNoMerge(mc, stype, node) {
|
|
130
|
+
let result = {};
|
|
131
|
+
stype.dataProperties.forEach(function (dp) {
|
|
132
|
+
if (dp.isComplexProperty) {
|
|
133
|
+
result[dp.name] = core.map(node[dp.nameOnServer], (v) => {
|
|
134
|
+
return processNoMerge(mc, dp.dataType, v);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
result[dp.name] = DataType.parseRawValue(node[dp.nameOnServer], dp.dataType);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
(stype instanceof EntityType) && stype.navigationProperties.forEach((np) => {
|
|
142
|
+
let nodeContext = { nodeType: "navProp", navigationProperty: np };
|
|
143
|
+
visitNode(node[np.nameOnServer], mc, nodeContext, result, np.name);
|
|
144
|
+
});
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
function processAnonType(mc, node) {
|
|
148
|
+
// node is guaranteed to be an object by this point, i.e. not a scalar
|
|
149
|
+
let keyFn = mc.metadataStore.namingConvention.serverPropertyNameToClient;
|
|
150
|
+
let result = {};
|
|
151
|
+
core.objectForEach(node, function (key, value) {
|
|
152
|
+
let newKey = keyFn(key);
|
|
153
|
+
let nodeContext = { nodeType: "anonProp", propertyName: newKey };
|
|
154
|
+
visitNode(value, mc, nodeContext, result, newKey);
|
|
155
|
+
});
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
function visitNode(node, mc, nodeContext, result, key) {
|
|
159
|
+
let jra = mc.jsonResultsAdapter;
|
|
160
|
+
let meta = jra.visitNode(node, mc, nodeContext) || {};
|
|
161
|
+
// allows visitNode to change the value;
|
|
162
|
+
node = meta.node || node;
|
|
163
|
+
if (meta.ignore)
|
|
164
|
+
return;
|
|
165
|
+
if (meta.passThru)
|
|
166
|
+
return node;
|
|
167
|
+
if (Array.isArray(node)) {
|
|
168
|
+
nodeContext.nodeType = nodeContext.nodeType + "Item";
|
|
169
|
+
result[key] = node.map(function (v, ix) {
|
|
170
|
+
meta = jra.visitNode(v, mc, nodeContext) || {};
|
|
171
|
+
v = meta.node || v;
|
|
172
|
+
return processMeta(mc, v, meta, function (refValue) {
|
|
173
|
+
result[key][ix] = refValue();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
result[key] = processMeta(mc, node, meta, function (refValue) {
|
|
179
|
+
result[key] = refValue();
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function resolveEntityRef(mc, nodeRefId) {
|
|
184
|
+
let entity = mc.refMap[nodeRefId];
|
|
185
|
+
if (entity === undefined) {
|
|
186
|
+
return function () {
|
|
187
|
+
return mc.refMap[nodeRefId];
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
return entity;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function updateEntityRef(mc, targetEntity, node) {
|
|
195
|
+
let nodeId = node._$meta.nodeId;
|
|
196
|
+
if (!nodeId && node._$meta.extraMetadata) {
|
|
197
|
+
// odata case. refMap isn't really used, but is returned as data.retrievedEntities, so we populated it anyway.
|
|
198
|
+
nodeId = node._$meta.extraMetadata.uriKey;
|
|
199
|
+
}
|
|
200
|
+
if (nodeId != null) {
|
|
201
|
+
mc.refMap[nodeId] = targetEntity;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// can return null for a deleted entity if includeDeleted == false
|
|
205
|
+
function mergeEntity(mc, node, meta) {
|
|
206
|
+
node._$meta = meta;
|
|
207
|
+
let em = mc.entityManager;
|
|
208
|
+
let entityType = meta.entityType;
|
|
209
|
+
if (typeof (entityType) === 'string') {
|
|
210
|
+
entityType = mc.metadataStore._getStructuralType(entityType, false);
|
|
211
|
+
}
|
|
212
|
+
node.entityType = entityType;
|
|
213
|
+
let mergeStrategy = mc.mergeOptions.mergeStrategy;
|
|
214
|
+
let isSaving = mc.query == null;
|
|
215
|
+
let entityKey = entityType.getEntityKeyFromRawEntity(node, mc.rawValueFn);
|
|
216
|
+
let targetEntity = em.getEntityByKey(entityKey);
|
|
217
|
+
if (targetEntity) {
|
|
218
|
+
if (isSaving && targetEntity.entityAspect.entityState.isDeleted()) {
|
|
219
|
+
em.detachEntity(targetEntity);
|
|
220
|
+
return targetEntity;
|
|
221
|
+
}
|
|
222
|
+
let targetEntityState = targetEntity.entityAspect.entityState;
|
|
223
|
+
if (mergeStrategy === MergeStrategy.Disallowed) {
|
|
224
|
+
throw new Error("A MergeStrategy of 'Disallowed' prevents " + entityKey.toString() + " from being merged");
|
|
225
|
+
}
|
|
226
|
+
else if (mergeStrategy === MergeStrategy.SkipMerge) {
|
|
227
|
+
updateEntityNoMerge(mc, targetEntity, node);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
if (mergeStrategy === MergeStrategy.OverwriteChanges
|
|
231
|
+
|| targetEntityState.isUnchanged()) {
|
|
232
|
+
updateEntity(mc, targetEntity, node);
|
|
233
|
+
targetEntity.entityAspect.wasLoaded = true;
|
|
234
|
+
if (meta.extraMetadata) {
|
|
235
|
+
targetEntity.entityAspect.extraMetadata = meta.extraMetadata;
|
|
236
|
+
}
|
|
237
|
+
targetEntity.entityAspect.entityState = EntityState.Unchanged;
|
|
238
|
+
clearOriginalValues(targetEntity);
|
|
239
|
+
// propertyName not specified because multiple props EntityChangedEventArgs
|
|
240
|
+
targetEntity.entityAspect.propertyChanged.publish({ entity: targetEntity, propertyName: null });
|
|
241
|
+
let action = isSaving ? EntityAction.MergeOnSave : EntityAction.MergeOnQuery;
|
|
242
|
+
em.entityChanged.publish({ entityAction: action, entity: targetEntity });
|
|
243
|
+
// this is needed to handle an overwrite of a modified entity with an unchanged entity
|
|
244
|
+
// which might in turn cause _hasChanges to change.
|
|
245
|
+
if (!targetEntityState.isUnchanged()) {
|
|
246
|
+
em._notifyStateChange(targetEntity, false);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// process targetEntity (even if deleted) to ensure related nodes are handled
|
|
251
|
+
updateEntityNoMerge(mc, targetEntity, node);
|
|
252
|
+
if (targetEntityState === EntityState.Deleted && !mc.mergeOptions.includeDeleted) {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
targetEntity = entityType._createInstanceCore();
|
|
260
|
+
updateEntity(mc, targetEntity, node);
|
|
261
|
+
if (meta.extraMetadata) {
|
|
262
|
+
targetEntity.entityAspect.extraMetadata = meta.extraMetadata;
|
|
263
|
+
}
|
|
264
|
+
// em._attachEntityCore(targetEntity, EntityState.Unchanged, MergeStrategy.Disallowed);
|
|
265
|
+
em._attachEntityCore(targetEntity, EntityState.Unchanged, mergeStrategy);
|
|
266
|
+
targetEntity.entityAspect.wasLoaded = true;
|
|
267
|
+
em.entityChanged.publish({ entityAction: EntityAction.AttachOnQuery, entity: targetEntity });
|
|
268
|
+
}
|
|
269
|
+
return targetEntity;
|
|
270
|
+
}
|
|
271
|
+
// copied from entityAspect
|
|
272
|
+
function clearOriginalValues(target) {
|
|
273
|
+
let aspect = target.entityAspect || target.complexAspect;
|
|
274
|
+
aspect.originalValues = {};
|
|
275
|
+
let stype = target.entityType || target.complexType;
|
|
276
|
+
stype.complexProperties.forEach(function (cp) {
|
|
277
|
+
let cos = target.getProperty(cp.name);
|
|
278
|
+
if (cp.isScalar) {
|
|
279
|
+
clearOriginalValues(cos);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
cos._acceptChanges();
|
|
283
|
+
cos.forEach(clearOriginalValues);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
function updateEntityNoMerge(mc, targetEntity, node) {
|
|
288
|
+
updateEntityRef(mc, targetEntity, node);
|
|
289
|
+
// we still need to merge related entities even if top level entity wasn't modified.
|
|
290
|
+
node.entityType.navigationProperties.forEach(function (np) {
|
|
291
|
+
if (np.isScalar) {
|
|
292
|
+
mergeRelatedEntityCore(mc, node, np);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
mergeRelatedEntitiesCore(mc, node, np);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
function updateEntity(mc, targetEntity, node) {
|
|
300
|
+
updateEntityRef(mc, targetEntity, node);
|
|
301
|
+
let entityType = targetEntity.entityType;
|
|
302
|
+
entityType._updateTargetFromRaw(targetEntity, node, mc.rawValueFn);
|
|
303
|
+
entityType.navigationProperties.forEach(function (np) {
|
|
304
|
+
if (np.isScalar) {
|
|
305
|
+
mergeRelatedEntity(mc, np, targetEntity, node);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
mergeRelatedEntities(mc, np, targetEntity, node);
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
function mergeRelatedEntity(mc, navigationProperty, targetEntity, rawEntity) {
|
|
313
|
+
let relatedEntity = mergeRelatedEntityCore(mc, rawEntity, navigationProperty);
|
|
314
|
+
if (relatedEntity == null)
|
|
315
|
+
return;
|
|
316
|
+
if (typeof relatedEntity === 'function') {
|
|
317
|
+
mc.deferredFns.push(function () {
|
|
318
|
+
relatedEntity = relatedEntity();
|
|
319
|
+
updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function mergeRelatedEntities(mc, navigationProperty, targetEntity, rawEntity) {
|
|
327
|
+
let relatedEntities = mergeRelatedEntitiesCore(mc, rawEntity, navigationProperty);
|
|
328
|
+
if (relatedEntities == null)
|
|
329
|
+
return;
|
|
330
|
+
let inverseProperty = navigationProperty.inverse;
|
|
331
|
+
if (!inverseProperty)
|
|
332
|
+
return;
|
|
333
|
+
let originalRelatedEntities = targetEntity.getProperty(navigationProperty.name);
|
|
334
|
+
originalRelatedEntities.wasLoaded = true;
|
|
335
|
+
relatedEntities.forEach(function (relatedEntity) {
|
|
336
|
+
if (typeof relatedEntity === 'function') {
|
|
337
|
+
mc.deferredFns.push(function () {
|
|
338
|
+
relatedEntity = relatedEntity();
|
|
339
|
+
updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
function mergeRelatedEntityCore(mc, rawEntity, navigationProperty) {
|
|
348
|
+
let relatedRawEntity = rawEntity[navigationProperty.nameOnServer];
|
|
349
|
+
if (!relatedRawEntity)
|
|
350
|
+
return null;
|
|
351
|
+
let relatedEntity = mc.visitAndMerge(relatedRawEntity, { nodeType: "navProp", navigationProperty: navigationProperty });
|
|
352
|
+
return relatedEntity;
|
|
353
|
+
}
|
|
354
|
+
function mergeRelatedEntitiesCore(mc, rawEntity, navigationProperty) {
|
|
355
|
+
let relatedRawEntities = rawEntity[navigationProperty.nameOnServer];
|
|
356
|
+
if (!relatedRawEntities)
|
|
357
|
+
return null;
|
|
358
|
+
// needed if what is returned is not an array and we expect one - this happens with __deferred in OData.
|
|
359
|
+
if (!Array.isArray(relatedRawEntities)) {
|
|
360
|
+
// return null;
|
|
361
|
+
relatedRawEntities = relatedRawEntities.results; // OData v3 will look like this with an expand
|
|
362
|
+
if (!relatedRawEntities) {
|
|
363
|
+
return null;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
let relatedEntities = mc.visitAndMerge(relatedRawEntities, { nodeType: "navPropItem", navigationProperty: navigationProperty });
|
|
367
|
+
return relatedEntities;
|
|
368
|
+
}
|
|
369
|
+
function updateRelatedEntity(relatedEntity, targetEntity, navigationProperty) {
|
|
370
|
+
if (!relatedEntity)
|
|
371
|
+
return;
|
|
372
|
+
let propName = navigationProperty.name;
|
|
373
|
+
let currentRelatedEntity = targetEntity.getProperty(propName);
|
|
374
|
+
// check if the related entity is already hooked up
|
|
375
|
+
if (currentRelatedEntity !== relatedEntity) {
|
|
376
|
+
// if not hook up both directions.
|
|
377
|
+
targetEntity.setProperty(propName, relatedEntity);
|
|
378
|
+
let inverseProperty = navigationProperty.inverse;
|
|
379
|
+
if (!inverseProperty)
|
|
380
|
+
return;
|
|
381
|
+
if (inverseProperty.isScalar) {
|
|
382
|
+
relatedEntity.setProperty(inverseProperty.name, targetEntity);
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
let collection = relatedEntity.getProperty(inverseProperty.name);
|
|
386
|
+
collection.push(targetEntity);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
function updateRelatedEntityInCollection(mc, relatedEntity, relatedEntities, targetEntity, inverseProperty) {
|
|
391
|
+
if (!relatedEntity)
|
|
392
|
+
return;
|
|
393
|
+
// don't update relatedCollection if preserveChanges & relatedEntity has an fkChange.
|
|
394
|
+
if (relatedEntity.entityAspect.entityState === EntityState.Modified
|
|
395
|
+
&& mc.mergeOptions.mergeStrategy === MergeStrategy.PreserveChanges) {
|
|
396
|
+
let origValues = relatedEntity.entityAspect.originalValues;
|
|
397
|
+
let fkWasModified = inverseProperty.relatedDataProperties.some(function (dp) {
|
|
398
|
+
return origValues[dp.name] != undefined;
|
|
399
|
+
});
|
|
400
|
+
if (fkWasModified)
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
// check if the related entity is already hooked up
|
|
404
|
+
let thisEntity = relatedEntity.getProperty(inverseProperty.name);
|
|
405
|
+
if (thisEntity !== targetEntity) {
|
|
406
|
+
// if not - hook it up.
|
|
407
|
+
relatedEntities.push(relatedEntity);
|
|
408
|
+
relatedEntity.setProperty(inverseProperty.name, targetEntity);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21hcHBpbmctY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxRQUFRLEVBQUcsTUFBTSxhQUFhLENBQUM7QUFFeEMsT0FBTyxFQUFFLFdBQVcsRUFBRyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWlCLFVBQVUsRUFBa0IsWUFBWSxFQUFzQixNQUFNLG1CQUFtQixDQUFDO0FBRWhILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFzQjdDOzs7O0VBSUU7QUFDRixNQUFNLE9BQU8sY0FBYztJQUl6QixVQUFVLEdBQUcsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUMscUNBQXFDO0lBYXRGLFlBQVksTUFBNEI7UUFFdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQ3hCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGNBQWM7U0FDeEQsQ0FBQyxDQUFDO1FBRUgsZUFBZTtRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDO1FBQzlELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7UUFDdEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQyxxQ0FBcUM7SUFD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cEUsSUFBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7UUFDM0QsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDekUsT0FBTyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksYUFBYTtZQUFFLE9BQU87S0FDM0I7SUFDRCxtREFBbUQ7SUFDbkQsSUFBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFakUsSUFBSSxVQUFVLEtBQUssWUFBWSxFQUFFO1FBQy9CLHVCQUF1QjtRQUN2QixlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BDLGFBQWEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztLQUMvRDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU2VydmljZUFkYXB0ZXIgfSBmcm9tICcuL2ludGVyZmFjZS1yZWdpc3RyeSc7XHJcbmltcG9ydCB7IGNvcmUgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhVHlwZSAgfSBmcm9tICcuL2RhdGEtdHlwZSc7XHJcbmltcG9ydCB7IERhdGFTZXJ2aWNlLCBKc29uUmVzdWx0c0FkYXB0ZXIsIE5vZGVDb250ZXh0LCBOb2RlTWV0YSB9IGZyb20gJy4vZGF0YS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5U3RhdGUgIH0gZnJvbSAnLi9lbnRpdHktc3RhdGUnO1xyXG5pbXBvcnQgeyBFbnRpdHlBY3Rpb24gfSBmcm9tICcuL2VudGl0eS1hY3Rpb24nO1xyXG5pbXBvcnQgeyBNZXRhZGF0YVN0b3JlLCBFbnRpdHlUeXBlLCBTdHJ1Y3R1cmFsVHlwZSwgRGF0YVByb3BlcnR5LCBOYXZpZ2F0aW9uUHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tICcuL2VudGl0eS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgTWVyZ2VTdHJhdGVneSB9IGZyb20gJy4vcXVlcnktb3B0aW9ucyc7XHJcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcbmltcG9ydCB7IEVudGl0eVF1ZXJ5IH0gZnJvbSAnLi9lbnRpdHktcXVlcnknO1xyXG5cclxuXHJcbi8qKlxyXG5Gb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiBUaGUgY2xhc3MgaXMgZm9yIHVzZSBpbiBidWlsZGluZyBhIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW4gXHJcbiovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVyZ2VPcHRpb25zIHtcclxuICBtZXJnZVN0cmF0ZWd5OiBNZXJnZVN0cmF0ZWd5O1xyXG4gIGluY2x1ZGVEZWxldGVkPzogYm9vbGVhbjtcclxuICBub1RyYWNraW5nPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEBoaWRkZW4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBNYXBwaW5nQ29udGV4dENvbmZpZyB7XHJcbiAgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlO1xyXG4gIHF1ZXJ5PzogRW50aXR5UXVlcnkgfCBzdHJpbmc7XHJcbiAgZW50aXR5TWFuYWdlcjogRW50aXR5TWFuYWdlcjtcclxuICBtZXJnZU9wdGlvbnM6IE1lcmdlT3B0aW9ucztcclxufVxyXG5cclxuLyoqXHJcbkZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG5AYWRhcHRlciAoc2VlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKi9cclxuZXhwb3J0IGNsYXNzIE1hcHBpbmdDb250ZXh0IHtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBkZWNsYXJlIF8kdHlwZU5hbWU6IHN0cmluZzsgLy8gb24gcHJvdG90eXBlXHJcblxyXG4gIHJhd1ZhbHVlRm4gPSBEYXRhUHJvcGVydHkuZ2V0UmF3VmFsdWVGcm9tU2VydmVyOyAvLyB0aGluayBhYm91dCBwYXNzaW5nIHRoaXMgaW4gbGF0ZXIuXHJcblxyXG4gIGRlY2xhcmUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlO1xyXG4gIGRlY2xhcmUgcXVlcnk6IEVudGl0eVF1ZXJ5IHwgc3RyaW5nO1xyXG4gIGRlY2xhcmUgZW50aXR5TWFuYWdlcjogRW50aXR5TWFuYWdlcjtcclxuICBkZWNsYXJlIG1lcmdlT3B0aW9uczogTWVyZ2VPcHRpb25zO1xyXG4gIGRlY2xhcmUgYWRhcHRlcjogRGF0YVNlcnZpY2VBZGFwdGVyOyAgLy8gYXNzaWduZWQgaW4gdGhlIEFic3RyYWN0RGF0YVNlcnZpY2VBZGFwdGVyLlxyXG5cclxuICBkZWNsYXJlIHJlZk1hcDogUmVjb3JkPHN0cmluZywgYW55PjsgLy8gVE9ET1xyXG4gIGRlY2xhcmUgZGVmZXJyZWRGbnM6IEZ1bmN0aW9uW107IC8vIFRPRE9cclxuICBkZWNsYXJlIGpzb25SZXN1bHRzQWRhcHRlcjogSnNvblJlc3VsdHNBZGFwdGVyO1xyXG4gIGRlY2xhcmUgbWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZTtcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZmlnOiBNYXBwaW5nQ29udGV4dENvbmZpZykge1xyXG5cclxuICAgIGNvcmUuZXh0ZW5kKHRoaXMsIGNvbmZpZywgW1xyXG4gICAgICBcInF1ZXJ5XCIsIFwiZW50aXR5TWFuYWdlclwiLCBcImRhdGFTZXJ2aWNlXCIsIFwibWVyZ2VPcHRpb25zXCJcclxuICAgIF0pO1xyXG5cclxuICAgIC8vIGNhbGMnZCBwcm9wc1xyXG4gICAgdGhpcy5yZWZNYXAgPSB7fTtcclxuICAgIHRoaXMuZGVmZXJyZWRGbnMgPSBbXTtcclxuICAgIHRoaXMuanNvblJlc3VsdHNBZGFwdGVyID0gdGhpcy5kYXRhU2VydmljZS5qc29uUmVzdWx0c0FkYXB0ZXI7XHJcbiAgICB0aGlzLm1ldGFkYXRhU3RvcmUgPSB0aGlzLmVudGl0eU1hbmFnZXIubWV0YWRhdGFTdG9yZTtcclxuICAgIHRoaXMucmF3VmFsdWVGbiA9IERhdGFQcm9wZXJ0eS5nZXRSYXdWYWx1ZUZyb21TZXJ2ZXI7IC8vIHRoaW5rIGFib3V0IHBhc3NpbmcgdGhpcyBpbiBsYXRlci5cclxuICB9XHJcblxyXG4gIGdldFVybCgpIHtcclxuICAgIGxldCBxdWVyeSA9IHRoaXMucXVlcnk7XHJcbiAgICBpZiAoIXF1ZXJ5KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInF1ZXJ5IGNhbm5vdCBiZSBlbXB0eVwiKTtcclxuICAgIH1cclxuICAgIGxldCB1cmlTdHJpbmc6IHN0cmluZztcclxuICAgIGlmICh0eXBlb2YgcXVlcnkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHVyaVN0cmluZyA9IHF1ZXJ5O1xyXG4gICAgfSBlbHNlIGlmIChxdWVyeSBpbnN0YW5jZW9mIEVudGl0eVF1ZXJ5KSB7XHJcbiAgICAgIHVyaVN0cmluZyA9IHRoaXMuZGF0YVNlcnZpY2UudXJpQnVpbGRlciEuYnVpbGRVcmkocXVlcnksIHRoaXMubWV0YWRhdGFTdG9yZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gcmVjb2duaXplIHF1ZXJ5IHBhcmFtZXRlciBhcyBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gRW50aXR5UXVlcnlcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5xdWFsaWZ5VXJsKHVyaVN0cmluZyk7XHJcbiAgfVxyXG5cclxuICB2aXNpdEFuZE1lcmdlKG5vZGVzOiBhbnlbXSwgbm9kZUNvbnRleHQ6IGFueSkge1xyXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5xdWVyeTtcclxuICAgIGxldCBqcmEgPSB0aGlzLmpzb25SZXN1bHRzQWRhcHRlcjtcclxuICAgIG5vZGVDb250ZXh0ID0gbm9kZUNvbnRleHQgfHwge307XHJcbiAgICBsZXQgdGhhdCA9IHRoaXM7XHJcbiAgICBsZXQgcmVzdWx0ID0gY29yZS5tYXAobm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgIGlmIChxdWVyeSA9PSBudWxsICYmIG5vZGUuZW50aXR5QXNwZWN0KSB7XHJcbiAgICAgICAgLy8gZG9uJ3QgYm90aGVyIG1lcmdpbmcgYSByZXN1bHQgZnJvbSBhIHNhdmUgdGhhdCB3YXMgbm90IHJldHVybmVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAgICBpZiAobm9kZS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgICAgIHRoYXQuZW50aXR5TWFuYWdlci5kZXRhY2hFbnRpdHkobm9kZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5vZGUuZW50aXR5QXNwZWN0LmFjY2VwdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtZXRhID0ganJhLnZpc2l0Tm9kZShub2RlLCB0aGF0LCBub2RlQ29udGV4dCkgfHwge307XHJcbiAgICAgIG5vZGUgPSBtZXRhLm5vZGUgfHwgbm9kZTtcclxuICAgICAgaWYgKHF1ZXJ5ICYmIG5vZGVDb250ZXh0Lm5vZGVUeXBlID09PSBcInJvb3RcIiAmJiAhbWV0YS5lbnRpdHlUeXBlKSB7XHJcbiAgICAgICAgbWV0YS5lbnRpdHlUeXBlID0gcXVlcnkgaW5zdGFuY2VvZiBFbnRpdHlRdWVyeSAmJiAgcXVlcnkuX2dldFRvRW50aXR5VHlwZSAmJiBxdWVyeS5fZ2V0VG9FbnRpdHlUeXBlKHRoYXQubWV0YWRhdGFTdG9yZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHByb2Nlc3NNZXRhKHRoYXQsIG5vZGUsIG1ldGEpO1xyXG4gICAgfSwgdGhpcy5tZXJnZU9wdGlvbnMuaW5jbHVkZURlbGV0ZWQpO1xyXG5cclxuICAgIGlmIChyZXN1bHQuZmlsdGVyICYmICF0aGlzLm1lcmdlT3B0aW9ucy5pbmNsdWRlRGVsZXRlZCkge1xyXG4gICAgICAvLyByZXN1bHQgbWF5IGhhdmUgZGVsZXRlZCBlbnRpdGllcyBiZWNhdXNlIHJlbGF0ZWQgbm9kZXMgd2VyZSBwcm9jZXNzZWRcclxuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigoeDogYW55KSA9PiB4ICYmICgheC5lbnRpdHlBc3BlY3QgfHwgIXguZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzRGVsZXRlZCgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NEZWZlcnJlZCgpIHtcclxuICAgIGlmICh0aGlzLmRlZmVycmVkRm5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5kZWZlcnJlZEZucy5mb3JFYWNoKChmbikgPT4ge1xyXG4gICAgICAgIGZuKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5NYXBwaW5nQ29udGV4dC5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiTWFwcGluZ0NvbnRleHRcIjtcclxuXHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzTWV0YShtYzogTWFwcGluZ0NvbnRleHQsIG5vZGU6IGFueSwgbWV0YTogTm9kZU1ldGEsIGFzc2lnbkZuPzogKHZhbDogYW55KSA9PiB2b2lkKSB7XHJcbiAgLy8gPT0gaXMgZGVsaWJlcmF0ZSBoZXJlIGluc3RlYWQgb2YgPT09XHJcbiAgaWYgKG1ldGEuaWdub3JlIHx8IG5vZGUgPT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfSBlbHNlIGlmIChtZXRhLm5vZGVSZWZJZCkge1xyXG4gICAgbGV0IHJlZlZhbHVlID0gcmVzb2x2ZUVudGl0eVJlZihtYywgbWV0YS5ub2RlUmVmSWQpO1xyXG4gICAgaWYgKHR5cGVvZiByZWZWYWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIGFzc2lnbkZuICE9IG51bGwpIHtcclxuICAgICAgbWMuZGVmZXJyZWRGbnMucHVzaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgYXNzaWduRm4ocmVmVmFsdWUpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gZGVmZXJyZWQgYW5kIHdpbGwgYmUgc2V0IGxhdGVyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlZlZhbHVlO1xyXG4gIH0gZWxzZSBpZiAobWV0YS5lbnRpdHlUeXBlKSB7XHJcbiAgICBsZXQgZW50aXR5VHlwZSA9IG1ldGEuZW50aXR5VHlwZTtcclxuICAgIGlmIChtYy5tZXJnZU9wdGlvbnMubm9UcmFja2luZykge1xyXG4gICAgICBub2RlID0gcHJvY2Vzc05vTWVyZ2UobWMsIGVudGl0eVR5cGUsIG5vZGUpO1xyXG4gICAgICBpZiAoZW50aXR5VHlwZS5ub1RyYWNraW5nRm4pIHtcclxuICAgICAgICBub2RlID0gZW50aXR5VHlwZS5ub1RyYWNraW5nRm4obm9kZSwgZW50aXR5VHlwZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1ldGEubm9kZUlkKSB7XHJcbiAgICAgICAgbWMucmVmTWFwW21ldGEubm9kZUlkXSA9IG5vZGU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZW50aXR5VHlwZS5pc0NvbXBsZXhUeXBlKSB7XHJcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRvIGRvIHNlcnZlck5hbWUgdG8gY2xpZW50IG5hbWUgcHJvY2Vzc2luZ1xyXG4gICAgICAgIHJldHVybiBwcm9jZXNzTm9NZXJnZShtYywgZW50aXR5VHlwZSwgbm9kZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG1lcmdlRW50aXR5KG1jLCBub2RlLCBtZXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcblxyXG4gICAgaWYgKCghbWV0YS5wYXNzVGhydSkgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmICEgY29yZS5pc0RhdGUobm9kZSkpIHtcclxuICAgICAgbm9kZSA9IHByb2Nlc3NBbm9uVHlwZShtYywgbm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXBkYXRpbmcgdGhlIHJlZk1hcCBmb3IgZW50aXRpZXMgaXMgaGFuZGxlZCBieSB1cGRhdGVFbnRpdHlSZWYgZm9yIGVudGl0aWVzLlxyXG4gICAgaWYgKG1ldGEubm9kZUlkKSB7XHJcbiAgICAgIG1jLnJlZk1hcFttZXRhLm5vZGVJZF0gPSBub2RlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGU7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzTm9NZXJnZShtYzogTWFwcGluZ0NvbnRleHQsIHN0eXBlOiBTdHJ1Y3R1cmFsVHlwZSwgbm9kZTogYW55KSB7XHJcbiAgbGV0IHJlc3VsdCA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIGFueT47XHJcblxyXG4gIHN0eXBlLmRhdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKGRwKSB7XHJcbiAgICBpZiAoZHAuaXNDb21wbGV4UHJvcGVydHkpIHtcclxuICAgICAgcmVzdWx0W2RwLm5hbWVdID0gY29yZS5tYXAobm9kZVtkcC5uYW1lT25TZXJ2ZXJdLCAodjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NOb01lcmdlKG1jLCBkcC5kYXRhVHlwZSBhcyBhbnksIHYpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3VsdFtkcC5uYW1lXSA9IERhdGFUeXBlLnBhcnNlUmF3VmFsdWUobm9kZVtkcC5uYW1lT25TZXJ2ZXJdLCBkcC5kYXRhVHlwZSBhcyBEYXRhVHlwZSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdHlwZSBpbnN0YW5jZW9mIEVudGl0eVR5cGUpICYmIHN0eXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goIChucCkgPT4ge1xyXG4gICAgbGV0IG5vZGVDb250ZXh0ID0geyBub2RlVHlwZTogXCJuYXZQcm9wXCIsIG5hdmlnYXRpb25Qcm9wZXJ0eTogbnAgfTtcclxuICAgIHZpc2l0Tm9kZShub2RlW25wLm5hbWVPblNlcnZlcl0sIG1jLCBub2RlQ29udGV4dCwgcmVzdWx0LCBucC5uYW1lKTtcclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc0Fub25UeXBlKG1jOiBNYXBwaW5nQ29udGV4dCwgbm9kZTogYW55KSB7XHJcbiAgLy8gbm9kZSBpcyBndWFyYW50ZWVkIHRvIGJlIGFuIG9iamVjdCBieSB0aGlzIHBvaW50LCBpLmUuIG5vdCBhIHNjYWxhclxyXG4gIGxldCBrZXlGbiA9IG1jLm1ldGFkYXRhU3RvcmUubmFtaW5nQ29udmVudGlvbi5zZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudDtcclxuICBsZXQgcmVzdWx0ID0ge307XHJcblxyXG4gIGNvcmUub2JqZWN0Rm9yRWFjaChub2RlLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xyXG4gICAgbGV0IG5ld0tleSA9IGtleUZuKGtleSk7XHJcbiAgICBsZXQgbm9kZUNvbnRleHQgPSB7IG5vZGVUeXBlOiBcImFub25Qcm9wXCIsIHByb3BlcnR5TmFtZTogbmV3S2V5IH07XHJcbiAgICB2aXNpdE5vZGUodmFsdWUsIG1jLCBub2RlQ29udGV4dCwgcmVzdWx0LCBuZXdLZXkpO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZpc2l0Tm9kZShub2RlOiBhbnksIG1jOiBNYXBwaW5nQ29udGV4dCwgbm9kZUNvbnRleHQ6IE5vZGVDb250ZXh0LCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleTogc3RyaW5nKSB7XHJcbiAgbGV0IGpyYSA9IG1jLmpzb25SZXN1bHRzQWRhcHRlcjtcclxuICBsZXQgbWV0YSA9IGpyYS52aXNpdE5vZGUobm9kZSwgbWMsIG5vZGVDb250ZXh0KSB8fCB7fTtcclxuICAvLyBhbGxvd3MgdmlzaXROb2RlIHRvIGNoYW5nZSB0aGUgdmFsdWU7XHJcbiAgbm9kZSA9IG1ldGEubm9kZSB8fCBub2RlO1xyXG5cclxuICBpZiAobWV0YS5pZ25vcmUpIHJldHVybjtcclxuICBpZiAobWV0YS5wYXNzVGhydSkgcmV0dXJuIG5vZGU7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcclxuICAgIG5vZGVDb250ZXh0Lm5vZGVUeXBlID0gbm9kZUNvbnRleHQubm9kZVR5cGUgKyBcIkl0ZW1cIjtcclxuICAgIHJlc3VsdFtrZXldID0gbm9kZS5tYXAoZnVuY3Rpb24gKHYsIGl4KSB7XHJcbiAgICAgIG1ldGEgPSBqcmEudmlzaXROb2RlKHYsIG1jLCBub2RlQ29udGV4dCkgfHwge307XHJcbiAgICAgIHYgPSBtZXRhLm5vZGUgfHwgdjtcclxuICAgICAgcmV0dXJuIHByb2Nlc3NNZXRhKG1jLCB2LCBtZXRhLCBmdW5jdGlvbiAocmVmVmFsdWUpIHtcclxuICAgICAgICByZXN1bHRba2V5XVtpeF0gPSByZWZWYWx1ZSgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXN1bHRba2V5XSA9IHByb2Nlc3NNZXRhKG1jLCBub2RlLCBtZXRhLCBmdW5jdGlvbiAocmVmVmFsdWUpIHtcclxuICAgICAgcmVzdWx0W2tleV0gPSByZWZWYWx1ZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNvbHZlRW50aXR5UmVmKG1jOiBNYXBwaW5nQ29udGV4dCwgbm9kZVJlZklkOiBzdHJpbmcpIHtcclxuICBsZXQgZW50aXR5ID0gbWMucmVmTWFwW25vZGVSZWZJZF07XHJcbiAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gbWMucmVmTWFwW25vZGVSZWZJZF07XHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZW50aXR5O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlRW50aXR5UmVmKG1jOiBNYXBwaW5nQ29udGV4dCwgdGFyZ2V0RW50aXR5OiBhbnksIG5vZGU6IGFueSkge1xyXG4gIGxldCBub2RlSWQgPSBub2RlLl8kbWV0YS5ub2RlSWQ7XHJcbiAgaWYgKCFub2RlSWQgJiYgbm9kZS5fJG1ldGEuZXh0cmFNZXRhZGF0YSkge1xyXG4gICAgLy8gb2RhdGEgY2FzZS4gIHJlZk1hcCBpc24ndCByZWFsbHkgdXNlZCwgYnV0IGlzIHJldHVybmVkIGFzIGRhdGEucmV0cmlldmVkRW50aXRpZXMsIHNvIHdlIHBvcHVsYXRlZCBpdCBhbnl3YXkuXHJcbiAgICBub2RlSWQgPSBub2RlLl8kbWV0YS5leHRyYU1ldGFkYXRhLnVyaUtleTtcclxuICB9XHJcbiAgaWYgKG5vZGVJZCAhPSBudWxsKSB7XHJcbiAgICBtYy5yZWZNYXBbbm9kZUlkXSA9IHRhcmdldEVudGl0eTtcclxuICB9XHJcbn1cclxuXHJcbi8vIGNhbiByZXR1cm4gbnVsbCBmb3IgYSBkZWxldGVkIGVudGl0eSBpZiBpbmNsdWRlRGVsZXRlZCA9PSBmYWxzZVxyXG5mdW5jdGlvbiBtZXJnZUVudGl0eShtYzogTWFwcGluZ0NvbnRleHQsIG5vZGU6IGFueSwgbWV0YTogTm9kZU1ldGEpIHtcclxuICBub2RlLl8kbWV0YSA9IG1ldGE7XHJcbiAgbGV0IGVtID0gbWMuZW50aXR5TWFuYWdlcjtcclxuXHJcbiAgbGV0IGVudGl0eVR5cGUgPSBtZXRhLmVudGl0eVR5cGUgYXMgRW50aXR5VHlwZTtcclxuICBpZiAodHlwZW9mIChlbnRpdHlUeXBlKSA9PT0gJ3N0cmluZycpIHtcclxuICAgIGVudGl0eVR5cGUgPSBtYy5tZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZShlbnRpdHlUeXBlLCBmYWxzZSkgYXMgRW50aXR5VHlwZTtcclxuICB9XHJcbiAgbm9kZS5lbnRpdHlUeXBlID0gZW50aXR5VHlwZTtcclxuXHJcbiAgbGV0IG1lcmdlU3RyYXRlZ3kgPSBtYy5tZXJnZU9wdGlvbnMubWVyZ2VTdHJhdGVneTtcclxuICBsZXQgaXNTYXZpbmcgPSBtYy5xdWVyeSA9PSBudWxsO1xyXG5cclxuICBsZXQgZW50aXR5S2V5ID0gZW50aXR5VHlwZS5nZXRFbnRpdHlLZXlGcm9tUmF3RW50aXR5KG5vZGUsIG1jLnJhd1ZhbHVlRm4pO1xyXG4gIGxldCB0YXJnZXRFbnRpdHkgPSBlbS5nZXRFbnRpdHlCeUtleShlbnRpdHlLZXkpO1xyXG4gIGlmICh0YXJnZXRFbnRpdHkpIHtcclxuICAgIGlmIChpc1NhdmluZyAmJiB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzRGVsZXRlZCgpKSB7XHJcbiAgICAgIGVtLmRldGFjaEVudGl0eSh0YXJnZXRFbnRpdHkpO1xyXG4gICAgICByZXR1cm4gdGFyZ2V0RW50aXR5O1xyXG4gICAgfVxyXG4gICAgbGV0IHRhcmdldEVudGl0eVN0YXRlID0gdGFyZ2V0RW50aXR5LmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZTtcclxuICAgIGlmIChtZXJnZVN0cmF0ZWd5ID09PSBNZXJnZVN0cmF0ZWd5LkRpc2FsbG93ZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBNZXJnZVN0cmF0ZWd5IG9mICdEaXNhbGxvd2VkJyBwcmV2ZW50cyBcIiArIGVudGl0eUtleS50b1N0cmluZygpICsgXCIgZnJvbSBiZWluZyBtZXJnZWRcIik7XHJcbiAgICB9IGVsc2UgaWYgKG1lcmdlU3RyYXRlZ3kgPT09IE1lcmdlU3RyYXRlZ3kuU2tpcE1lcmdlKSB7XHJcbiAgICAgIHVwZGF0ZUVudGl0eU5vTWVyZ2UobWMsIHRhcmdldEVudGl0eSwgbm9kZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAobWVyZ2VTdHJhdGVneSA9PT0gTWVyZ2VTdHJhdGVneS5PdmVyd3JpdGVDaGFuZ2VzXHJcbiAgICAgICAgfHwgdGFyZ2V0RW50aXR5U3RhdGUuaXNVbmNoYW5nZWQoKSkge1xyXG4gICAgICAgIHVwZGF0ZUVudGl0eShtYywgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAgICAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0Lndhc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKG1ldGEuZXh0cmFNZXRhZGF0YSkge1xyXG4gICAgICAgICAgdGFyZ2V0RW50aXR5LmVudGl0eUFzcGVjdC5leHRyYU1ldGFkYXRhID0gbWV0YS5leHRyYU1ldGFkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlID0gRW50aXR5U3RhdGUuVW5jaGFuZ2VkO1xyXG4gICAgICAgIGNsZWFyT3JpZ2luYWxWYWx1ZXModGFyZ2V0RW50aXR5KTtcclxuICAgICAgICAvLyBwcm9wZXJ0eU5hbWUgbm90IHNwZWNpZmllZCBiZWNhdXNlIG11bHRpcGxlIHByb3BzIEVudGl0eUNoYW5nZWRFdmVudEFyZ3NcclxuICAgICAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LnByb3BlcnR5Q2hhbmdlZC5wdWJsaXNoKHsgZW50aXR5OiB0YXJnZXRFbnRpdHksIHByb3BlcnR5TmFtZTogbnVsbCB9KTtcclxuICAgICAgICBsZXQgYWN0aW9uID0gaXNTYXZpbmcgPyBFbnRpdHlBY3Rpb24uTWVyZ2VPblNhdmUgOiBFbnRpdHlBY3Rpb24uTWVyZ2VPblF1ZXJ5O1xyXG4gICAgICAgIGVtLmVudGl0eUNoYW5nZWQucHVibGlzaCh7IGVudGl0eUFjdGlvbjogYWN0aW9uLCBlbnRpdHk6IHRhcmdldEVudGl0eSB9KTtcclxuICAgICAgICAvLyB0aGlzIGlzIG5lZWRlZCB0byBoYW5kbGUgYW4gb3ZlcndyaXRlIG9mIGEgbW9kaWZpZWQgZW50aXR5IHdpdGggYW4gdW5jaGFuZ2VkIGVudGl0eVxyXG4gICAgICAgIC8vIHdoaWNoIG1pZ2h0IGluIHR1cm4gY2F1c2UgX2hhc0NoYW5nZXMgdG8gY2hhbmdlLlxyXG4gICAgICAgIGlmICghdGFyZ2V0RW50aXR5U3RhdGUuaXNVbmNoYW5nZWQoKSkge1xyXG4gICAgICAgICAgZW0uX25vdGlmeVN0YXRlQ2hhbmdlKHRhcmdldEVudGl0eSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBwcm9jZXNzIHRhcmdldEVudGl0eSAoZXZlbiBpZiBkZWxldGVkKSB0byBlbnN1cmUgcmVsYXRlZCBub2RlcyBhcmUgaGFuZGxlZFxyXG4gICAgICAgIHVwZGF0ZUVudGl0eU5vTWVyZ2UobWMsIHRhcmdldEVudGl0eSwgbm9kZSk7XHJcbiAgICAgICAgaWYgKHRhcmdldEVudGl0eVN0YXRlID09PSBFbnRpdHlTdGF0ZS5EZWxldGVkICYmICFtYy5tZXJnZU9wdGlvbnMuaW5jbHVkZURlbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICB0YXJnZXRFbnRpdHkgPSBlbnRpdHlUeXBlLl9jcmVhdGVJbnN0YW5jZUNvcmUoKSBhcyBFbnRpdHk7XHJcblxyXG4gICAgdXBkYXRlRW50aXR5KG1jLCB0YXJnZXRFbnRpdHksIG5vZGUpO1xyXG5cclxuICAgIGlmIChtZXRhLmV4dHJhTWV0YWRhdGEpIHtcclxuICAgICAgdGFyZ2V0RW50aXR5LmVudGl0eUFzcGVjdC5leHRyYU1ldGFkYXRhID0gbWV0YS5leHRyYU1ldGFkYXRhO1xyXG4gICAgfVxyXG4gICAgLy8gZW0uX2F0dGFjaEVudGl0eUNvcmUodGFyZ2V0RW50aXR5LCBFbnRpdHlTdGF0ZS5VbmNoYW5nZWQsIE1lcmdlU3RyYXRlZ3kuRGlzYWxsb3dlZCk7XHJcbiAgICBlbS5fYXR0YWNoRW50aXR5Q29yZSh0YXJnZXRFbnRpdHksIEVudGl0eVN0YXRlLlVuY2hhbmdlZCwgbWVyZ2VTdHJhdGVneSk7XHJcbiAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0Lndhc0xvYWRlZCA9IHRydWU7XHJcbiAgICBlbS5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5BdHRhY2hPblF1ZXJ5LCBlbnRpdHk6IHRhcmdldEVudGl0eSB9KTtcclxuICB9XHJcbiAgcmV0dXJuIHRhcmdldEVudGl0eTtcclxufVxyXG5cclxuLy8gY29waWVkIGZyb20gZW50aXR5QXNwZWN0XHJcbmZ1bmN0aW9uIGNsZWFyT3JpZ2luYWxWYWx1ZXModGFyZ2V0OiBhbnkpIHtcclxuICBsZXQgYXNwZWN0ID0gdGFyZ2V0LmVudGl0eUFzcGVjdCB8fCB0YXJnZXQuY29tcGxleEFzcGVjdDtcclxuICBhc3BlY3Qub3JpZ2luYWxWYWx1ZXMgPSB7fTtcclxuICBsZXQgc3R5cGUgPSB0YXJnZXQuZW50aXR5VHlwZSB8fCB0YXJnZXQuY29tcGxleFR5cGU7XHJcbiAgc3R5cGUuY29tcGxleFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoY3A6IGFueSkge1xyXG4gICAgbGV0IGNvcyA9IHRhcmdldC5nZXRQcm9wZXJ0eShjcC5uYW1lKTtcclxuICAgIGlmIChjcC5pc1NjYWxhcikge1xyXG4gICAgICBjbGVhck9yaWdpbmFsVmFsdWVzKGNvcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb3MuX2FjY2VwdENoYW5nZXMoKTtcclxuICAgICAgY29zLmZvckVhY2goY2xlYXJPcmlnaW5hbFZhbHVlcyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiB1cGRhdGVFbnRpdHlOb01lcmdlKG1jOiBNYXBwaW5nQ29udGV4dCwgdGFyZ2V0RW50aXR5OiBFbnRpdHksIG5vZGU6IGFueSkge1xyXG4gIHVwZGF0ZUVudGl0eVJlZihtYywgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAvLyB3ZSBzdGlsbCBuZWVkIHRvIG1lcmdlIHJlbGF0ZWQgZW50aXRpZXMgZXZlbiBpZiB0b3AgbGV2ZWwgZW50aXR5IHdhc24ndCBtb2RpZmllZC5cclxuICBub2RlLmVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAobnA6IE5hdmlnYXRpb25Qcm9wZXJ0eSkge1xyXG4gICAgaWYgKG5wLmlzU2NhbGFyKSB7XHJcbiAgICAgIG1lcmdlUmVsYXRlZEVudGl0eUNvcmUobWMsIG5vZGUsIG5wKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1lcmdlUmVsYXRlZEVudGl0aWVzQ29yZShtYywgbm9kZSwgbnApO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVFbnRpdHkobWM6IE1hcHBpbmdDb250ZXh0LCB0YXJnZXRFbnRpdHk6IEVudGl0eSwgbm9kZTogYW55KSB7XHJcbiAgdXBkYXRlRW50aXR5UmVmKG1jLCB0YXJnZXRFbnRpdHksIG5vZGUpO1xyXG4gIGxldCBlbnRpdHlUeXBlID0gdGFyZ2V0RW50aXR5LmVudGl0eVR5cGU7XHJcbiAgZW50aXR5VHlwZS5fdXBkYXRlVGFyZ2V0RnJvbVJhdyh0YXJnZXRFbnRpdHksIG5vZGUsIG1jLnJhd1ZhbHVlRm4pO1xyXG5cclxuICBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKG5wKSB7XHJcbiAgICBpZiAobnAuaXNTY2FsYXIpIHtcclxuICAgICAgbWVyZ2VSZWxhdGVkRW50aXR5KG1jLCBucCwgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1lcmdlUmVsYXRlZEVudGl0aWVzKG1jLCBucCwgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWVyZ2VSZWxhdGVkRW50aXR5KG1jOiBNYXBwaW5nQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHksIHRhcmdldEVudGl0eTogRW50aXR5LCByYXdFbnRpdHk6IGFueSkge1xyXG5cclxuICBsZXQgcmVsYXRlZEVudGl0eSA9IG1lcmdlUmVsYXRlZEVudGl0eUNvcmUobWMsIHJhd0VudGl0eSwgbmF2aWdhdGlvblByb3BlcnR5KTtcclxuICBpZiAocmVsYXRlZEVudGl0eSA9PSBudWxsKSByZXR1cm47XHJcbiAgaWYgKHR5cGVvZiByZWxhdGVkRW50aXR5ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBtYy5kZWZlcnJlZEZucy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmVsYXRlZEVudGl0eSA9IHJlbGF0ZWRFbnRpdHkoKTtcclxuICAgICAgdXBkYXRlUmVsYXRlZEVudGl0eShyZWxhdGVkRW50aXR5LCB0YXJnZXRFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgICB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgdXBkYXRlUmVsYXRlZEVudGl0eShyZWxhdGVkRW50aXR5LCB0YXJnZXRFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBtZXJnZVJlbGF0ZWRFbnRpdGllcyhtYzogTWFwcGluZ0NvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5LCB0YXJnZXRFbnRpdHk6IEVudGl0eSwgcmF3RW50aXR5OiBhbnkpIHtcclxuICBsZXQgcmVsYXRlZEVudGl0aWVzID0gbWVyZ2VSZWxhdGVkRW50aXRpZXNDb3JlKG1jLCByYXdFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgaWYgKHJlbGF0ZWRFbnRpdGllcyA9PSBudWxsKSByZXR1cm47XHJcblxyXG4gIGxldCBpbnZlcnNlUHJvcGVydHkgPSBuYXZpZ2F0aW9uUHJvcGVydHkuaW52ZXJzZTtcclxuICBpZiAoIWludmVyc2VQcm9wZXJ0eSkgcmV0dXJuO1xyXG5cclxuICBsZXQgb3JpZ2luYWxSZWxhdGVkRW50aXRpZXMgPSB0YXJnZXRFbnRpdHkuZ2V0UHJvcGVydHkobmF2aWdhdGlvblByb3BlcnR5Lm5hbWUpO1xyXG4gIG9yaWdpbmFsUmVsYXRlZEVudGl0aWVzLndhc0xvYWRlZCA9IHRydWU7XHJcblxyXG4gIHJlbGF0ZWRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGVkRW50aXR5OiBhbnkpIHtcclxuICAgIGlmICh0eXBlb2YgcmVsYXRlZEVudGl0eSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBtYy5kZWZlcnJlZEZucy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZWxhdGVkRW50aXR5ID0gcmVsYXRlZEVudGl0eSgpO1xyXG4gICAgICAgIHVwZGF0ZVJlbGF0ZWRFbnRpdHlJbkNvbGxlY3Rpb24obWMsIHJlbGF0ZWRFbnRpdHksIG9yaWdpbmFsUmVsYXRlZEVudGl0aWVzLCB0YXJnZXRFbnRpdHksIGludmVyc2VQcm9wZXJ0eSBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVwZGF0ZVJlbGF0ZWRFbnRpdHlJbkNvbGxlY3Rpb24obWMsIHJlbGF0ZWRFbnRpdHksIG9yaWdpbmFsUmVsYXRlZEVudGl0aWVzLCB0YXJnZXRFbnRpdHksIGludmVyc2VQcm9wZXJ0eSBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBtZXJnZVJlbGF0ZWRFbnRpdHlDb3JlKG1jOiBNYXBwaW5nQ29udGV4dCwgcmF3RW50aXR5OiBhbnksIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5KSB7XHJcbiAgbGV0IHJlbGF0ZWRSYXdFbnRpdHkgPSByYXdFbnRpdHlbbmF2aWdhdGlvblByb3BlcnR5Lm5hbWVPblNlcnZlcl07XHJcbiAgaWYgKCFyZWxhdGVkUmF3RW50aXR5KSByZXR1cm4gbnVsbDtcclxuXHJcbiAgbGV0IHJlbGF0ZWRFbnRpdHkgPSBtYy52aXNpdEFuZE1lcmdlKHJlbGF0ZWRSYXdFbnRpdHksIHsgbm9kZVR5cGU6IFwibmF2UHJvcFwiLCBuYXZpZ2F0aW9uUHJvcGVydHk6IG5hdmlnYXRpb25Qcm9wZXJ0eSB9KTtcclxuICByZXR1cm4gcmVsYXRlZEVudGl0eTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWVyZ2VSZWxhdGVkRW50aXRpZXNDb3JlKG1jOiBNYXBwaW5nQ29udGV4dCwgcmF3RW50aXR5OiBhbnksIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5KSB7XHJcbiAgbGV0IHJlbGF0ZWRSYXdFbnRpdGllcyA9IHJhd0VudGl0eVtuYXZpZ2F0aW9uUHJvcGVydHkubmFtZU9uU2VydmVyXTtcclxuICBpZiAoIXJlbGF0ZWRSYXdFbnRpdGllcykgcmV0dXJuIG51bGw7XHJcblxyXG4gIC8vIG5lZWRlZCBpZiB3aGF0IGlzIHJldHVybmVkIGlzIG5vdCBhbiBhcnJheSBhbmQgd2UgZXhwZWN0IG9uZSAtIHRoaXMgaGFwcGVucyB3aXRoIF9fZGVmZXJyZWQgaW4gT0RhdGEuXHJcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJlbGF0ZWRSYXdFbnRpdGllcykpIHtcclxuICAgIC8vIHJldHVybiBudWxsO1xyXG4gICAgcmVsYXRlZFJhd0VudGl0aWVzID0gcmVsYXRlZFJhd0VudGl0aWVzLnJlc3VsdHM7IC8vIE9EYXRhIHYzIHdpbGwgbG9vayBsaWtlIHRoaXMgd2l0aCBhbiBleHBhbmRcclxuICAgIGlmICghcmVsYXRlZFJhd0VudGl0aWVzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGV0IHJlbGF0ZWRFbnRpdGllcyA9IG1jLnZpc2l0QW5kTWVyZ2UocmVsYXRlZFJhd0VudGl0aWVzLCB7IG5vZGVUeXBlOiBcIm5hdlByb3BJdGVtXCIsIG5hdmlnYXRpb25Qcm9wZXJ0eTogbmF2aWdhdGlvblByb3BlcnR5IH0pO1xyXG4gIHJldHVybiByZWxhdGVkRW50aXRpZXM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVJlbGF0ZWRFbnRpdHkocmVsYXRlZEVudGl0eTogRW50aXR5LCB0YXJnZXRFbnRpdHk6IEVudGl0eSwgbmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHkpIHtcclxuICBpZiAoIXJlbGF0ZWRFbnRpdHkpIHJldHVybjtcclxuICBsZXQgcHJvcE5hbWUgPSBuYXZpZ2F0aW9uUHJvcGVydHkubmFtZTtcclxuICBsZXQgY3VycmVudFJlbGF0ZWRFbnRpdHkgPSB0YXJnZXRFbnRpdHkuZ2V0UHJvcGVydHkocHJvcE5hbWUpO1xyXG5cclxuICAvLyBjaGVjayBpZiB0aGUgcmVsYXRlZCBlbnRpdHkgaXMgYWxyZWFkeSBob29rZWQgdXBcclxuICBpZiAoY3VycmVudFJlbGF0ZWRFbnRpdHkgIT09IHJlbGF0ZWRFbnRpdHkpIHtcclxuICAgIC8vIGlmIG5vdCBob29rIHVwIGJvdGggZGlyZWN0aW9ucy5cclxuICAgIHRhcmdldEVudGl0eS5zZXRQcm9wZXJ0eShwcm9wTmFtZSwgcmVsYXRlZEVudGl0eSk7XHJcbiAgICBsZXQgaW52ZXJzZVByb3BlcnR5ID0gbmF2aWdhdGlvblByb3BlcnR5LmludmVyc2U7XHJcbiAgICBpZiAoIWludmVyc2VQcm9wZXJ0eSkgcmV0dXJuO1xyXG4gICAgaWYgKGludmVyc2VQcm9wZXJ0eS5pc1NjYWxhcikge1xyXG4gICAgICByZWxhdGVkRW50aXR5LnNldFByb3BlcnR5KGludmVyc2VQcm9wZXJ0eS5uYW1lLCB0YXJnZXRFbnRpdHkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGNvbGxlY3Rpb24gPSByZWxhdGVkRW50aXR5LmdldFByb3BlcnR5KGludmVyc2VQcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgY29sbGVjdGlvbi5wdXNoKHRhcmdldEVudGl0eSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlUmVsYXRlZEVudGl0eUluQ29sbGVjdGlvbihtYzogTWFwcGluZ0NvbnRleHQsIHJlbGF0ZWRFbnRpdHk6IEVudGl0eSB8IHVuZGVmaW5lZCxcclxuICAgIHJlbGF0ZWRFbnRpdGllczogRW50aXR5W10sIHRhcmdldEVudGl0eTogRW50aXR5LCBpbnZlcnNlUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSkge1xyXG4gIGlmICghcmVsYXRlZEVudGl0eSkgcmV0dXJuO1xyXG5cclxuICAvLyBkb24ndCB1cGRhdGUgcmVsYXRlZENvbGxlY3Rpb24gaWYgcHJlc2VydmVDaGFuZ2VzICYgcmVsYXRlZEVudGl0eSBoYXMgYW4gZmtDaGFuZ2UuXHJcbiAgaWYgKHJlbGF0ZWRFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlID09PSBFbnRpdHlTdGF0ZS5Nb2RpZmllZFxyXG4gICAgJiYgbWMubWVyZ2VPcHRpb25zLm1lcmdlU3RyYXRlZ3kgPT09IE1lcmdlU3RyYXRlZ3kuUHJlc2VydmVDaGFuZ2VzKSB7XHJcbiAgICBsZXQgb3JpZ1ZhbHVlcyA9IHJlbGF0ZWRFbnRpdHkuZW50aXR5QXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgbGV0IGZrV2FzTW9kaWZpZWQgPSBpbnZlcnNlUHJvcGVydHkucmVsYXRlZERhdGFQcm9wZXJ0aWVzLnNvbWUoZnVuY3Rpb24gKGRwKSB7XHJcbiAgICAgIHJldHVybiBvcmlnVmFsdWVzW2RwLm5hbWVdICE9IHVuZGVmaW5lZDtcclxuICAgIH0pO1xyXG4gICAgaWYgKGZrV2FzTW9kaWZpZWQpIHJldHVybjtcclxuICB9XHJcbiAgLy8gY2hlY2sgaWYgdGhlIHJlbGF0ZWQgZW50aXR5IGlzIGFscmVhZHkgaG9va2VkIHVwXHJcbiAgbGV0IHRoaXNFbnRpdHkgPSByZWxhdGVkRW50aXR5LmdldFByb3BlcnR5KGludmVyc2VQcm9wZXJ0eS5uYW1lKTtcclxuXHJcbiAgaWYgKHRoaXNFbnRpdHkgIT09IHRhcmdldEVudGl0eSkge1xyXG4gICAgLy8gaWYgbm90IC0gaG9vayBpdCB1cC5cclxuICAgIHJlbGF0ZWRFbnRpdGllcy5wdXNoKHJlbGF0ZWRFbnRpdHkpO1xyXG4gICAgcmVsYXRlZEVudGl0eS5zZXRQcm9wZXJ0eShpbnZlcnNlUHJvcGVydHkubmFtZSwgdGFyZ2V0RW50aXR5KTtcclxuICB9XHJcbn1cclxuXHJcblxyXG4iXX0=
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { assertConfig } from './assert-param';
|
|
2
|
+
import { core } from './core';
|
|
3
|
+
import { config } from './config';
|
|
4
|
+
/**
|
|
5
|
+
A NamingConvention instance is used to specify the naming conventions under which a MetadataStore
|
|
6
|
+
will translate property names between the server and the javascript client.
|
|
7
|
+
|
|
8
|
+
The default NamingConvention does not perform any translation, it simply passes property names thru unchanged.
|
|
9
|
+
@dynamic
|
|
10
|
+
**/
|
|
11
|
+
export class NamingConvention {
|
|
12
|
+
/** Function that takes a server property name add converts it into a client side property name. __Read Only__ */
|
|
13
|
+
serverPropertyNameToClient;
|
|
14
|
+
/** Function that takes a client property name add converts it into a server side property name. __Read Only__ */
|
|
15
|
+
clientPropertyNameToServer;
|
|
16
|
+
/**
|
|
17
|
+
NamingConvention constructor
|
|
18
|
+
> // A naming convention that converts the first character of every property name to uppercase on the server
|
|
19
|
+
> // and lowercase on the client.
|
|
20
|
+
> var namingConv = new NamingConvention({
|
|
21
|
+
> serverPropertyNameToClient: function(serverPropertyName) {
|
|
22
|
+
> return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);
|
|
23
|
+
> },
|
|
24
|
+
> clientPropertyNameToServer: function(clientPropertyName) {
|
|
25
|
+
> return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
|
|
26
|
+
> }
|
|
27
|
+
> });
|
|
28
|
+
> var ms = new MetadataStore({ namingConvention: namingConv });
|
|
29
|
+
> var em = new EntityManager( { metadataStore: ms });
|
|
30
|
+
**/
|
|
31
|
+
constructor(ncConfig) {
|
|
32
|
+
assertConfig(ncConfig || {})
|
|
33
|
+
.whereParam("name").isOptional().isString()
|
|
34
|
+
.whereParam("serverPropertyNameToClient").isFunction()
|
|
35
|
+
.whereParam("clientPropertyNameToServer").isFunction()
|
|
36
|
+
.applyAll(this);
|
|
37
|
+
if (!this.name) {
|
|
38
|
+
this.name = core.getUuid();
|
|
39
|
+
}
|
|
40
|
+
config._storeObject(this, "NamingConvention", this.name);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
A noop naming convention - This is the default unless another is specified.
|
|
47
|
+
**/
|
|
48
|
+
static none = new NamingConvention({
|
|
49
|
+
name: "noChange",
|
|
50
|
+
serverPropertyNameToClient: (serverPropertyName) => {
|
|
51
|
+
return serverPropertyName;
|
|
52
|
+
},
|
|
53
|
+
clientPropertyNameToServer: (clientPropertyName) => {
|
|
54
|
+
return clientPropertyName;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
/**
|
|
58
|
+
The "camelCase" naming convention - This implementation only lowercases the first character of the server property name
|
|
59
|
+
but leaves the rest of the property name intact. If a more complicated version is needed then one should be created via the ctor.
|
|
60
|
+
**/
|
|
61
|
+
static camelCase = new NamingConvention({
|
|
62
|
+
name: "camelCase",
|
|
63
|
+
serverPropertyNameToClient: (serverPropertyName) => {
|
|
64
|
+
return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);
|
|
65
|
+
},
|
|
66
|
+
clientPropertyNameToServer: (clientPropertyName) => {
|
|
67
|
+
return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
/**
|
|
71
|
+
The default value whenever NamingConventions are not specified.
|
|
72
|
+
**/
|
|
73
|
+
static defaultInstance = new NamingConvention(NamingConvention.none);
|
|
74
|
+
/**
|
|
75
|
+
Sets the 'defaultInstance' by creating a copy of the current 'defaultInstance' and then applying all of the properties of the current instance.
|
|
76
|
+
The current instance is returned unchanged.
|
|
77
|
+
> var namingConv = new NamingConvention({
|
|
78
|
+
> serverPropertyNameToClient: function(serverPropertyName) {
|
|
79
|
+
> return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);
|
|
80
|
+
> },
|
|
81
|
+
> clientPropertyNameToServer: function(clientPropertyName) {
|
|
82
|
+
> return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
|
|
83
|
+
> }
|
|
84
|
+
> });
|
|
85
|
+
> namingConv.setAsDefault();
|
|
86
|
+
**/
|
|
87
|
+
setAsDefault() {
|
|
88
|
+
return core.setAsDefault(this, NamingConvention);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
NamingConvention.prototype._$typeName = "NamingConvention";
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtaW5nLWNvbnZlbnRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmFtaW5nLWNvbnZlbnRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQWNsQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBSzNCLGtIQUFrSDtJQUNsSCwwQkFBMEIsQ0FBd0M7SUFDbEUsaUhBQWlIO0lBQ2pILDBCQUEwQixDQUF3QztJQUVsRTs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILFlBQVksUUFBZ0M7UUFDMUMsWUFBWSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7YUFDdkIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRTthQUMxQyxVQUFVLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxVQUFVLEVBQUU7YUFDckQsVUFBVSxDQUFDLDRCQUE0QixDQUFDLENBQUMsVUFBVSxFQUFFO2FBQ3JELFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzVCO1FBQ0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQztRQUNqQyxJQUFJLEVBQUUsVUFBVTtRQUNoQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7WUFDakQsT0FBTyxrQkFBa0IsQ0FBQztRQUM1QixDQUFDO1FBQ0QsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1lBQ2pELE9BQU8sa0JBQWtCLENBQUM7UUFDNUIsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVIOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQztRQUN0QyxJQUFJLEVBQUUsV0FBVztRQUNqQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7WUFDakQsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBQ0QsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1lBQ2pELE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVIOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGVBQWUsR0FBRyxJQUFJLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXJFOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDbkQsQ0FBQzs7QUFJSCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0Q29uZmlnIH0gZnJvbSAnLi9hc3NlcnQtcGFyYW0nO1xyXG5pbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5cclxuLy8gVE9ETzogc3Ryb25nbHkgdHlwZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgdG8gbmFtaW5nIGNvbnZlbnRpb24gY29udmVydGVyIGZucy5cclxuXHJcbi8qKiBDb25maWd1cmF0aW9uIGluZm8gdG8gYmUgcGFzc2VkIHRvIHRoZSBbW05hbWluZ0NvbnZlbnRpb25dXSBjb25zdHJ1Y3RvciAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE5hbWluZ0NvbnZlbnRpb25Db25maWcge1xyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIE5hbWluZ0NvbnZlbnRpb24gKi9cclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIC8qKiBGdW5jdGlvbiB0aGF0IHRha2VzIGEgc2VydmVyIHByb3BlcnR5IG5hbWUgYWRkIGNvbnZlcnRzIGl0IGludG8gYSBjbGllbnQgc2lkZSBwcm9wZXJ0eSBuYW1lLiAgKi9cclxuICBzZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudD86IChubTogc3RyaW5nLCBjb250ZXh0PzogYW55KSA9PiBzdHJpbmc7XHJcbiAgLyoqIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjbGllbnQgcHJvcGVydHkgbmFtZSBhZGQgY29udmVydHMgaXQgaW50byBhIHNlcnZlciBzaWRlIHByb3BlcnR5IG5hbWUuICovXHJcbiAgY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXI/OiAobm06IHN0cmluZywgY29udGV4dD86IGFueSkgPT4gc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuQSBOYW1pbmdDb252ZW50aW9uIGluc3RhbmNlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtaW5nIGNvbnZlbnRpb25zIHVuZGVyIHdoaWNoIGEgTWV0YWRhdGFTdG9yZVxyXG53aWxsIHRyYW5zbGF0ZSBwcm9wZXJ0eSBuYW1lcyBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIHRoZSBqYXZhc2NyaXB0IGNsaWVudC5cclxuXHJcblRoZSBkZWZhdWx0IE5hbWluZ0NvbnZlbnRpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgdHJhbnNsYXRpb24sIGl0IHNpbXBseSBwYXNzZXMgcHJvcGVydHkgbmFtZXMgdGhydSB1bmNoYW5nZWQuXHJcbkBkeW5hbWljXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgTmFtaW5nQ29udmVudGlvbiB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgZGVjbGFyZSBfJHR5cGVOYW1lOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgTmFtaW5nQ29udmVudGlvbi4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgbmFtZTogc3RyaW5nO1xyXG4gIC8qKiBGdW5jdGlvbiB0aGF0IHRha2VzIGEgc2VydmVyIHByb3BlcnR5IG5hbWUgYWRkIGNvbnZlcnRzIGl0IGludG8gYSBjbGllbnQgc2lkZSBwcm9wZXJ0eSBuYW1lLiAgX19SZWFkIE9ubHlfXyAqL1xyXG4gIHNlcnZlclByb3BlcnR5TmFtZVRvQ2xpZW50OiAobm06IHN0cmluZywgY29udGV4dD86IGFueSkgPT4gc3RyaW5nO1xyXG4gIC8qKiBGdW5jdGlvbiB0aGF0IHRha2VzIGEgY2xpZW50IHByb3BlcnR5IG5hbWUgYWRkIGNvbnZlcnRzIGl0IGludG8gYSBzZXJ2ZXIgc2lkZSBwcm9wZXJ0eSBuYW1lLiBfX1JlYWQgT25seV9fICovXHJcbiAgY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXI6IChubTogc3RyaW5nLCBjb250ZXh0PzogYW55KSA9PiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gIE5hbWluZ0NvbnZlbnRpb24gY29uc3RydWN0b3JcclxuICA+ICAgICAgLy8gQSBuYW1pbmcgY29udmVudGlvbiB0aGF0IGNvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZXZlcnkgcHJvcGVydHkgbmFtZSB0byB1cHBlcmNhc2Ugb24gdGhlIHNlcnZlclxyXG4gID4gICAgICAvLyBhbmQgbG93ZXJjYXNlIG9uIHRoZSBjbGllbnQuXHJcbiAgPiAgICAgIHZhciBuYW1pbmdDb252ID0gbmV3IE5hbWluZ0NvbnZlbnRpb24oe1xyXG4gID4gICAgICAgICAgc2VydmVyUHJvcGVydHlOYW1lVG9DbGllbnQ6IGZ1bmN0aW9uKHNlcnZlclByb3BlcnR5TmFtZSkge1xyXG4gID4gICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJQcm9wZXJ0eU5hbWUuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBzZXJ2ZXJQcm9wZXJ0eU5hbWUuc3Vic3RyKDEpO1xyXG4gID4gICAgICAgICAgfSxcclxuICA+ICAgICAgICAgIGNsaWVudFByb3BlcnR5TmFtZVRvU2VydmVyOiBmdW5jdGlvbihjbGllbnRQcm9wZXJ0eU5hbWUpIHtcclxuICA+ICAgICAgICAgICAgICByZXR1cm4gY2xpZW50UHJvcGVydHlOYW1lLnN1YnN0cigwLCAxKS50b1VwcGVyQ2FzZSgpICsgY2xpZW50UHJvcGVydHlOYW1lLnN1YnN0cigxKTtcclxuICA+ICAgICAgICAgIH0gICAgICAgICAgICBcclxuICA+ICAgICAgfSk7XHJcbiAgPiAgICAgIHZhciBtcyA9IG5ldyBNZXRhZGF0YVN0b3JlKHsgbmFtaW5nQ29udmVudGlvbjogbmFtaW5nQ29udiB9KTtcclxuICA+ICAgICAgdmFyIGVtID0gbmV3IEVudGl0eU1hbmFnZXIoIHsgbWV0YWRhdGFTdG9yZTogbXMgfSk7XHJcbiAgKiovXHJcbiAgY29uc3RydWN0b3IobmNDb25maWc6IE5hbWluZ0NvbnZlbnRpb25Db25maWcgKSB7XHJcbiAgICBhc3NlcnRDb25maWcobmNDb25maWcgfHwge30pXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJuYW1lXCIpLmlzT3B0aW9uYWwoKS5pc1N0cmluZygpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJzZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudFwiKS5pc0Z1bmN0aW9uKClcclxuICAgICAgICAud2hlcmVQYXJhbShcImNsaWVudFByb3BlcnR5TmFtZVRvU2VydmVyXCIpLmlzRnVuY3Rpb24oKVxyXG4gICAgICAgIC5hcHBseUFsbCh0aGlzKTtcclxuICAgIGlmICghdGhpcy5uYW1lKSB7XHJcbiAgICAgIHRoaXMubmFtZSA9IGNvcmUuZ2V0VXVpZCgpO1xyXG4gICAgfVxyXG4gICAgY29uZmlnLl9zdG9yZU9iamVjdCh0aGlzLCBcIk5hbWluZ0NvbnZlbnRpb25cIiwgdGhpcy5uYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG5cclxuXHJcbiAgLyoqXHJcbiAgQSBub29wIG5hbWluZyBjb252ZW50aW9uIC0gVGhpcyBpcyB0aGUgZGVmYXVsdCB1bmxlc3MgYW5vdGhlciBpcyBzcGVjaWZpZWQuXHJcbiAgKiovXHJcbiAgc3RhdGljIG5vbmUgPSBuZXcgTmFtaW5nQ29udmVudGlvbih7XHJcbiAgICBuYW1lOiBcIm5vQ2hhbmdlXCIsXHJcbiAgICBzZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudDogKHNlcnZlclByb3BlcnR5TmFtZSkgPT4ge1xyXG4gICAgICByZXR1cm4gc2VydmVyUHJvcGVydHlOYW1lO1xyXG4gICAgfSxcclxuICAgIGNsaWVudFByb3BlcnR5TmFtZVRvU2VydmVyOiAoY2xpZW50UHJvcGVydHlOYW1lKSA9PiB7XHJcbiAgICAgIHJldHVybiBjbGllbnRQcm9wZXJ0eU5hbWU7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIC8qKlxyXG4gIFRoZSBcImNhbWVsQ2FzZVwiIG5hbWluZyBjb252ZW50aW9uIC0gVGhpcyBpbXBsZW1lbnRhdGlvbiBvbmx5IGxvd2VyY2FzZXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc2VydmVyIHByb3BlcnR5IG5hbWVcclxuICBidXQgbGVhdmVzIHRoZSByZXN0IG9mIHRoZSBwcm9wZXJ0eSBuYW1lIGludGFjdC4gIElmIGEgbW9yZSBjb21wbGljYXRlZCB2ZXJzaW9uIGlzIG5lZWRlZCB0aGVuIG9uZSBzaG91bGQgYmUgY3JlYXRlZCB2aWEgdGhlIGN0b3IuXHJcbiAgKiovXHJcbiAgc3RhdGljIGNhbWVsQ2FzZSA9IG5ldyBOYW1pbmdDb252ZW50aW9uKHtcclxuICAgIG5hbWU6IFwiY2FtZWxDYXNlXCIsXHJcbiAgICBzZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudDogKHNlcnZlclByb3BlcnR5TmFtZSkgPT4ge1xyXG4gICAgICByZXR1cm4gc2VydmVyUHJvcGVydHlOYW1lLnN1YnN0cigwLCAxKS50b0xvd2VyQ2FzZSgpICsgc2VydmVyUHJvcGVydHlOYW1lLnN1YnN0cigxKTtcclxuICAgIH0sXHJcbiAgICBjbGllbnRQcm9wZXJ0eU5hbWVUb1NlcnZlcjogKGNsaWVudFByb3BlcnR5TmFtZSkgPT4ge1xyXG4gICAgICByZXR1cm4gY2xpZW50UHJvcGVydHlOYW1lLnN1YnN0cigwLCAxKS50b1VwcGVyQ2FzZSgpICsgY2xpZW50UHJvcGVydHlOYW1lLnN1YnN0cigxKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgLyoqXHJcbiAgVGhlIGRlZmF1bHQgdmFsdWUgd2hlbmV2ZXIgTmFtaW5nQ29udmVudGlvbnMgYXJlIG5vdCBzcGVjaWZpZWQuXHJcbiAgKiovXHJcbiAgc3RhdGljIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBOYW1pbmdDb252ZW50aW9uKE5hbWluZ0NvbnZlbnRpb24ubm9uZSk7XHJcblxyXG4gIC8qKlxyXG4gIFNldHMgdGhlICdkZWZhdWx0SW5zdGFuY2UnIGJ5IGNyZWF0aW5nIGEgY29weSBvZiB0aGUgY3VycmVudCAnZGVmYXVsdEluc3RhbmNlJyBhbmQgdGhlbiBhcHBseWluZyBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UuXHJcbiAgVGhlIGN1cnJlbnQgaW5zdGFuY2UgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxyXG4gID4gICAgICB2YXIgbmFtaW5nQ29udiA9IG5ldyBOYW1pbmdDb252ZW50aW9uKHtcclxuICA+ICAgICAgICAgIHNlcnZlclByb3BlcnR5TmFtZVRvQ2xpZW50OiBmdW5jdGlvbihzZXJ2ZXJQcm9wZXJ0eU5hbWUpIHtcclxuICA+ICAgICAgICAgICAgICByZXR1cm4gc2VydmVyUHJvcGVydHlOYW1lLnN1YnN0cigwLCAxKS50b0xvd2VyQ2FzZSgpICsgc2VydmVyUHJvcGVydHlOYW1lLnN1YnN0cigxKTtcclxuICA+ICAgICAgICAgIH0sXHJcbiAgPiAgICAgICAgICBjbGllbnRQcm9wZXJ0eU5hbWVUb1NlcnZlcjogZnVuY3Rpb24oY2xpZW50UHJvcGVydHlOYW1lKSB7XHJcbiAgPiAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudFByb3BlcnR5TmFtZS5zdWJzdHIoMCwgMSkudG9VcHBlckNhc2UoKSArIGNsaWVudFByb3BlcnR5TmFtZS5zdWJzdHIoMSk7XHJcbiAgPiAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgPiAgICAgIH0pO1xyXG4gID4gICAgICBuYW1pbmdDb252LnNldEFzRGVmYXVsdCgpO1xyXG4gICoqL1xyXG4gIHNldEFzRGVmYXVsdCgpIHtcclxuICAgIHJldHVybiBjb3JlLnNldEFzRGVmYXVsdCh0aGlzLCBOYW1pbmdDb252ZW50aW9uKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5OYW1pbmdDb252ZW50aW9uLnByb3RvdHlwZS5fJHR5cGVOYW1lID0gXCJOYW1pbmdDb252ZW50aW9uXCI7XHJcblxyXG5cclxuXHJcblxyXG4iXX0=
|