angular-odata 0.92.0 → 0.95.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/{esm2015/angular-odata.js → esm2020/angular-odata.mjs} +0 -0
- package/esm2020/lib/api.mjs +303 -0
- package/{esm2015/lib/cache/cache.js → esm2020/lib/cache/cache.mjs} +3 -3
- package/{esm2015/lib/cache/index.js → esm2020/lib/cache/index.mjs} +0 -0
- package/{esm2015/lib/cache/memory.js → esm2020/lib/cache/memory.mjs} +1 -1
- package/{esm2015/lib/cache/storage.js → esm2020/lib/cache/storage.mjs} +2 -2
- package/esm2020/lib/client.mjs +271 -0
- package/{esm2015/lib/constants.js → esm2020/lib/constants.mjs} +3 -1
- package/esm2020/lib/helper.mjs +268 -0
- package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -0
- package/esm2020/lib/models/collection.mjs +741 -0
- package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
- package/esm2020/lib/models/model.mjs +453 -0
- package/esm2020/lib/models/options.mjs +945 -0
- package/{esm2015/lib/module.js → esm2020/lib/module.mjs} +7 -7
- package/esm2020/lib/options.mjs +32 -0
- package/{esm2015/lib/resources/index.js → esm2020/lib/resources/index.mjs} +0 -0
- package/{esm2015/lib/resources/path/handlers.js → esm2020/lib/resources/path/handlers.mjs} +1 -1
- package/{esm2015/lib/resources/path/index.js → esm2020/lib/resources/path/index.mjs} +0 -0
- package/esm2020/lib/resources/path/segments.mjs +124 -0
- package/esm2020/lib/resources/query/builder.mjs +590 -0
- package/esm2020/lib/resources/query/expressions.mjs +207 -0
- package/esm2020/lib/resources/query/handlers.mjs +186 -0
- package/{esm2015/lib/resources/query/index.js → esm2020/lib/resources/query/index.mjs} +0 -0
- package/esm2020/lib/resources/query/options.mjs +103 -0
- package/esm2020/lib/resources/query/syntax.mjs +406 -0
- package/esm2020/lib/resources/request.mjs +167 -0
- package/esm2020/lib/resources/resource.mjs +326 -0
- package/esm2020/lib/resources/responses/annotations.mjs +119 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-annotation.js → esm2020/lib/resources/responses/csdl/csdl-annotation.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-entity-container.js → esm2020/lib/resources/responses/csdl/csdl-entity-container.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-entity-set.js → esm2020/lib/resources/responses/csdl/csdl-entity-set.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-enum-type.js → esm2020/lib/resources/responses/csdl/csdl-enum-type.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-function-action.js → esm2020/lib/resources/responses/csdl/csdl-function-action.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-navigation-property-binding.js → esm2020/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-reference.js → esm2020/lib/resources/responses/csdl/csdl-reference.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-schema.js → esm2020/lib/resources/responses/csdl/csdl-schema.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-singleton.js → esm2020/lib/resources/responses/csdl/csdl-singleton.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-structural-property.js → esm2020/lib/resources/responses/csdl/csdl-structural-property.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-structured-type.js → esm2020/lib/resources/responses/csdl/csdl-structured-type.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-type-definition.js → esm2020/lib/resources/responses/csdl/csdl-type-definition.mjs} +0 -0
- package/{esm2015/lib/resources/responses/index.js → esm2020/lib/resources/responses/index.mjs} +0 -0
- package/esm2020/lib/resources/responses/metadata.mjs +547 -0
- package/{esm2015/lib/resources/responses/options.js → esm2020/lib/resources/responses/options.mjs} +0 -0
- package/{esm2015/lib/resources/responses/response.js → esm2020/lib/resources/responses/response.mjs} +0 -0
- package/{esm2015/lib/resources/responses/types.js → esm2020/lib/resources/responses/types.mjs} +0 -0
- package/esm2020/lib/resources/types/action.mjs +101 -0
- package/esm2020/lib/resources/types/batch.mjs +288 -0
- package/esm2020/lib/resources/types/count.mjs +27 -0
- package/esm2020/lib/resources/types/entity-set.mjs +94 -0
- package/esm2020/lib/resources/types/entity.mjs +106 -0
- package/esm2020/lib/resources/types/function.mjs +137 -0
- package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
- package/esm2020/lib/resources/types/media.mjs +41 -0
- package/esm2020/lib/resources/types/metadata.mjs +30 -0
- package/esm2020/lib/resources/types/navigation-property.mjs +226 -0
- package/esm2020/lib/resources/types/options.mjs +2 -0
- package/esm2020/lib/resources/types/property.mjs +183 -0
- package/esm2020/lib/resources/types/reference.mjs +85 -0
- package/esm2020/lib/resources/types/singleton.mjs +126 -0
- package/esm2020/lib/resources/types/value.mjs +41 -0
- package/esm2020/lib/schema/annotation.mjs +37 -0
- package/esm2020/lib/schema/callable.mjs +62 -0
- package/esm2020/lib/schema/element.mjs +51 -0
- package/esm2020/lib/schema/entity-container.mjs +9 -0
- package/esm2020/lib/schema/entity-set.mjs +9 -0
- package/esm2020/lib/schema/enum-type.mjs +71 -0
- package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +0 -0
- package/esm2020/lib/schema/parsers/callable.mjs +113 -0
- package/{esm2015/lib/schema/parsers/edm.js → esm2020/lib/schema/parsers/edm.mjs} +2 -2
- package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
- package/{esm2015/lib/schema/parsers/index.js → esm2020/lib/schema/parsers/index.mjs} +0 -0
- package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
- package/esm2020/lib/schema/schema.mjs +61 -0
- package/esm2020/lib/schema/structured-type.mjs +198 -0
- package/esm2020/lib/services/base.mjs +29 -0
- package/esm2020/lib/services/entity-set.mjs +143 -0
- package/esm2020/lib/services/entity.mjs +12 -0
- package/{esm2015/lib/services/factory.js → esm2020/lib/services/factory.mjs} +3 -3
- package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
- package/{esm2015/lib/services/singleton.js → esm2020/lib/services/singleton.mjs} +1 -1
- package/{esm2015/lib/settings.js → esm2020/lib/settings.mjs} +1 -1
- package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
- package/esm2020/lib/types.mjs +37 -0
- package/{esm2015/lib/utils/arraybuffers.js → esm2020/lib/utils/arraybuffers.mjs} +0 -0
- package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
- package/{esm2015/lib/utils/durations.js → esm2020/lib/utils/durations.mjs} +0 -0
- package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
- package/{esm2015/lib/utils/http.js → esm2020/lib/utils/http.mjs} +0 -0
- package/{esm2015/lib/utils/index.js → esm2020/lib/utils/index.mjs} +0 -0
- package/{esm2015/lib/utils/objects.js → esm2020/lib/utils/objects.mjs} +0 -0
- package/esm2020/lib/utils/odata.mjs +22 -0
- package/{esm2015/lib/utils/strings.js → esm2020/lib/utils/strings.mjs} +0 -0
- package/{esm2015/lib/utils/types.js → esm2020/lib/utils/types.mjs} +0 -0
- package/{esm2015/lib/utils/urls.js → esm2020/lib/utils/urls.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/{angular-odata.js → angular-odata.mjs} +849 -750
- package/fesm2015/angular-odata.mjs.map +1 -0
- package/fesm2020/angular-odata.mjs +10274 -0
- package/fesm2020/angular-odata.mjs.map +1 -0
- package/lib/api.d.ts +10 -10
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/storage.d.ts +1 -1
- package/lib/client.d.ts +3 -3
- package/lib/constants.d.ts +1 -0
- package/lib/models/collection.d.ts +11 -19
- package/lib/models/model.d.ts +22 -18
- package/lib/models/options.d.ts +16 -21
- package/lib/module.d.ts +1 -1
- package/lib/options.d.ts +1 -0
- package/lib/resources/path/segments.d.ts +1 -1
- package/lib/resources/query/expressions.d.ts +37 -27
- package/lib/resources/query/handlers.d.ts +7 -11
- package/lib/resources/query/options.d.ts +2 -2
- package/lib/resources/query/syntax.d.ts +52 -54
- package/lib/resources/request.d.ts +1 -1
- package/lib/resources/resource.d.ts +25 -8
- package/lib/resources/types/action.d.ts +12 -19
- package/lib/resources/types/batch.d.ts +1 -3
- package/lib/resources/types/count.d.ts +5 -4
- package/lib/resources/types/entity-set.d.ts +11 -15
- package/lib/resources/types/entity.d.ts +12 -15
- package/lib/resources/types/function.d.ts +11 -18
- package/lib/resources/types/media.d.ts +6 -5
- package/lib/resources/types/metadata.d.ts +3 -5
- package/lib/resources/types/navigation-property.d.ts +15 -21
- package/lib/resources/types/property.d.ts +13 -19
- package/lib/resources/types/reference.d.ts +39 -6
- package/lib/resources/types/singleton.d.ts +12 -16
- package/lib/resources/types/value.d.ts +9 -5
- package/lib/schema/{base.d.ts → annotation.d.ts} +0 -0
- package/lib/schema/callable.d.ts +2 -18
- package/lib/schema/element.d.ts +39 -0
- package/lib/schema/entity-container.d.ts +2 -12
- package/lib/schema/entity-set.d.ts +2 -18
- package/lib/schema/enum-type.d.ts +2 -26
- package/lib/schema/parsers/enum-type.d.ts +4 -4
- package/lib/schema/parsers/structured-type.d.ts +4 -4
- package/lib/schema/schema.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +8 -26
- package/lib/services/base.d.ts +2 -2
- package/lib/services/entity-set.d.ts +2 -2
- package/lib/services/entity.d.ts +1 -1
- package/lib/services/singleton.d.ts +2 -2
- package/lib/settings.d.ts +5 -5
- package/lib/types.d.ts +1 -0
- package/package.json +21 -8
- package/bundles/angular-odata.umd.js +0 -11861
- package/bundles/angular-odata.umd.js.map +0 -1
- package/esm2015/lib/api.js +0 -296
- package/esm2015/lib/client.js +0 -272
- package/esm2015/lib/helper.js +0 -268
- package/esm2015/lib/models/collection.js +0 -734
- package/esm2015/lib/models/model.js +0 -438
- package/esm2015/lib/models/options.js +0 -942
- package/esm2015/lib/options.js +0 -31
- package/esm2015/lib/resources/path/segments.js +0 -124
- package/esm2015/lib/resources/query/builder.js +0 -591
- package/esm2015/lib/resources/query/expressions.js +0 -194
- package/esm2015/lib/resources/query/handlers.js +0 -192
- package/esm2015/lib/resources/query/options.js +0 -103
- package/esm2015/lib/resources/query/syntax.js +0 -367
- package/esm2015/lib/resources/request.js +0 -168
- package/esm2015/lib/resources/resource.js +0 -243
- package/esm2015/lib/resources/responses/annotations.js +0 -121
- package/esm2015/lib/resources/responses/metadata.js +0 -548
- package/esm2015/lib/resources/types/action.js +0 -105
- package/esm2015/lib/resources/types/batch.js +0 -294
- package/esm2015/lib/resources/types/count.js +0 -33
- package/esm2015/lib/resources/types/entity-set.js +0 -101
- package/esm2015/lib/resources/types/entity.js +0 -137
- package/esm2015/lib/resources/types/function.js +0 -130
- package/esm2015/lib/resources/types/media.js +0 -47
- package/esm2015/lib/resources/types/metadata.js +0 -36
- package/esm2015/lib/resources/types/navigation-property.js +0 -205
- package/esm2015/lib/resources/types/options.js +0 -2
- package/esm2015/lib/resources/types/property.js +0 -151
- package/esm2015/lib/resources/types/reference.js +0 -74
- package/esm2015/lib/resources/types/singleton.js +0 -167
- package/esm2015/lib/resources/types/value.js +0 -35
- package/esm2015/lib/schema/base.js +0 -37
- package/esm2015/lib/schema/callable.js +0 -82
- package/esm2015/lib/schema/entity-container.js +0 -24
- package/esm2015/lib/schema/entity-set.js +0 -35
- package/esm2015/lib/schema/enum-type.js +0 -102
- package/esm2015/lib/schema/parsers/callable.js +0 -107
- package/esm2015/lib/schema/parsers/enum-type.js +0 -107
- package/esm2015/lib/schema/parsers/structured-type.js +0 -392
- package/esm2015/lib/schema/schema.js +0 -52
- package/esm2015/lib/schema/structured-type.js +0 -220
- package/esm2015/lib/services/base.js +0 -23
- package/esm2015/lib/services/entity-set.js +0 -146
- package/esm2015/lib/services/entity.js +0 -12
- package/esm2015/lib/types.js +0 -37
- package/esm2015/lib/utils/odata.js +0 -21
- package/fesm2015/angular-odata.js.map +0 -1
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { ODataResource } from '../resource';
|
|
2
|
-
import { PathSegmentNames } from '../../types';
|
|
3
|
-
import { map } from 'rxjs/operators';
|
|
4
|
-
export class ODataActionResource extends ODataResource {
|
|
5
|
-
//#region Factory
|
|
6
|
-
static factory(api, path, type, segments, query) {
|
|
7
|
-
const segment = segments.add(PathSegmentNames.action, path);
|
|
8
|
-
if (type)
|
|
9
|
-
segment.type(type);
|
|
10
|
-
query.clear();
|
|
11
|
-
return new ODataActionResource(api, segments, query);
|
|
12
|
-
}
|
|
13
|
-
clone() {
|
|
14
|
-
return new ODataActionResource(this.api, this.cloneSegments(), this.cloneQuery());
|
|
15
|
-
}
|
|
16
|
-
//#endregion
|
|
17
|
-
schema() {
|
|
18
|
-
//TODO: Binding Type
|
|
19
|
-
let type = this.type();
|
|
20
|
-
return type !== undefined
|
|
21
|
-
? this.api.findCallableForType(type)
|
|
22
|
-
: undefined;
|
|
23
|
-
}
|
|
24
|
-
returnType() {
|
|
25
|
-
var _a, _b;
|
|
26
|
-
return (_b = (_a = this.schema()) === null || _a === void 0 ? void 0 : _a.parser.return) === null || _b === void 0 ? void 0 : _b.type;
|
|
27
|
-
}
|
|
28
|
-
asModel(entity, { annots, reset } = {}) {
|
|
29
|
-
let resource;
|
|
30
|
-
const type = (annots === null || annots === void 0 ? void 0 : annots.type) || this.returnType();
|
|
31
|
-
const Model = this.api.modelForType(type);
|
|
32
|
-
let path = annots === null || annots === void 0 ? void 0 : annots.entitySet;
|
|
33
|
-
if (path !== undefined) {
|
|
34
|
-
resource = this.api.entitySet(path).entity(entity);
|
|
35
|
-
resource.query((q) => q.apply(this.queryOptions.toQueryArguments()));
|
|
36
|
-
}
|
|
37
|
-
return new Model(entity, { resource, annots, reset });
|
|
38
|
-
}
|
|
39
|
-
asCollection(entities, { annots, reset, } = {}) {
|
|
40
|
-
let resource;
|
|
41
|
-
const type = (annots === null || annots === void 0 ? void 0 : annots.type) || this.returnType();
|
|
42
|
-
const Collection = this.api.collectionForType(type);
|
|
43
|
-
let path = annots === null || annots === void 0 ? void 0 : annots.entitySet;
|
|
44
|
-
if (path !== undefined) {
|
|
45
|
-
resource = this.api.entitySet(path);
|
|
46
|
-
resource.query((q) => q.apply(this.queryOptions.toQueryArguments()));
|
|
47
|
-
}
|
|
48
|
-
return new Collection(entities, { resource, annots, reset });
|
|
49
|
-
}
|
|
50
|
-
//#region Requests
|
|
51
|
-
post(params, options) {
|
|
52
|
-
return super.post(params, options);
|
|
53
|
-
}
|
|
54
|
-
call(params, options = {}) {
|
|
55
|
-
return this.clone().post(params, options);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Execute the action and return the result as a property
|
|
59
|
-
* @param params Parameters for the action
|
|
60
|
-
* @param options Options for the request
|
|
61
|
-
* @returns Observable of the result of the action
|
|
62
|
-
*/
|
|
63
|
-
callProperty(params, options = {}) {
|
|
64
|
-
return this.call(params, Object.assign({ responseType: 'property' }, options)).pipe(map(({ property }) => property));
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Execute the action and return the result as a entity
|
|
68
|
-
* @param params Parameters for the action
|
|
69
|
-
* @param options Options for the request
|
|
70
|
-
* @returns Observable of the result of the action
|
|
71
|
-
*/
|
|
72
|
-
callEntity(params, options = {}) {
|
|
73
|
-
return this.call(params, Object.assign({ responseType: 'entity' }, options)).pipe(map(({ entity }) => entity));
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Execute the action and return the result as a model
|
|
77
|
-
* @param params Parameters for the action
|
|
78
|
-
* @param options Options for the request
|
|
79
|
-
* @returns Observable of the result of the action
|
|
80
|
-
*/
|
|
81
|
-
callModel(params, options = {}) {
|
|
82
|
-
return this.call(params, Object.assign({ responseType: 'entity' }, options)).pipe(map(({ entity, annots }) => entity ? this.asModel(entity, { annots, reset: true }) : null));
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Execute the action and return the result as a entities
|
|
86
|
-
* @param params Parameters for the action
|
|
87
|
-
* @param options Options for the request
|
|
88
|
-
* @returns Observable of the result of the action
|
|
89
|
-
*/
|
|
90
|
-
callEntities(params, options = {}) {
|
|
91
|
-
return this.call(params, Object.assign({ responseType: 'entities' }, options)).pipe(map(({ entities }) => entities));
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Execute the action and return the result as a collection
|
|
95
|
-
* @param params Parameters for the action
|
|
96
|
-
* @param options Options for the request
|
|
97
|
-
* @returns Observable of the result of the action
|
|
98
|
-
*/
|
|
99
|
-
callCollection(params, options = {}) {
|
|
100
|
-
return this.call(params, Object.assign({ responseType: 'entities' }, options)).pipe(map(({ entities, annots }) => entities
|
|
101
|
-
? this.asCollection(entities, { annots, reset: true })
|
|
102
|
-
: null));
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3Jlc291cmNlcy90eXBlcy9hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUJBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxNQUFNLE9BQU8sbUJBQTBCLFNBQVEsYUFBZ0I7SUFDN0QsaUJBQWlCO0lBQ2pCLE1BQU0sQ0FBQyxPQUFPLENBQ1osR0FBYSxFQUNiLElBQVksRUFDWixJQUF3QixFQUN4QixRQUEyQixFQUMzQixLQUEyQjtRQUUzQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RCxJQUFJLElBQUk7WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNkLE9BQU8sSUFBSSxtQkFBbUIsQ0FBTyxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLG1CQUFtQixDQUM1QixJQUFJLENBQUMsR0FBRyxFQUNSLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBSyxDQUNyQixDQUFDO0lBQ0osQ0FBQztJQUNELFlBQVk7SUFFWixNQUFNO1FBQ0osb0JBQW9CO1FBQ3BCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixPQUFPLElBQUksS0FBSyxTQUFTO1lBQ3ZCLENBQUMsQ0FBQyxJQUFJLENB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QUFJLENBQUMsTUFBTSxrQkFBSSxZQUFZLEVBQUUsVUFBVSxJQUFLLE9BQU8sRUFBRyxDQUFDLElBQUksQ0FDckUsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUMzQixRQUFRO1lBQ04sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQU8sUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM1RCxDQUFDLENBQUMsSUFBSSxDQUNULENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9EYXRhQ29sbGVjdGlvbiwgT0RhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuICBPRGF0YUVudGl0aWVzLFxuICBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gIE9EYXRhRW50aXR5LFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YVByb3BlcnR5LFxufSBmcm9tICcuLi9yZXNwb25zZXMnO1xuaW1wb3J0IHtcbiAgT0RhdGFFbnRpdGllc09wdGlvbnMsXG4gIE9EYXRhRW50aXR5T3B0aW9ucyxcbiAgT0RhdGFOb25lT3B0aW9ucyxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVByb3BlcnR5T3B0aW9ucyxcbn0gZnJvbSAnLi9vcHRpb25zJztcblxuaW1wb3J0IHsgT0RhdGFBcGkgfSBmcm9tICcuLi8uLi9hcGknO1xuaW1wb3J0IHsgT0RhdGFFbnRpdHlSZXNvdXJjZSB9IGZyb20gJy4vZW50aXR5JztcbmltcG9ydCB7IE9EYXRhRW50aXR5U2V0UmVzb3VyY2UgfSBmcm9tICcuL2VudGl0eS1zZXQnO1xuaW1wb3J0IHsgT0RhdGFQYXRoU2VnbWVudHMgfSBmcm9tICcuLi9wYXRoJztcbmltcG9ydCB7IE9EYXRhUXVlcnlPcHRpb25zIH0gZnJvbSAnLi4vcXVlcnknO1xuaW1wb3J0IHsgT0RhdGFSZXNvdXJjZSB9IGZyb20gJy4uL3Jlc291cmNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBhdGhTZWdtZW50TmFtZXMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+IGV4dGVuZHMgT0RhdGFSZXNvdXJjZTxSPiB7XG4gIC8vI3JlZ2lvbiBGYWN0b3J5XG4gIHN0YXRpYyBmYWN0b3J5PFAsIFI+KFxuICAgIGFwaTogT0RhdGFBcGksXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzZWdtZW50czogT0RhdGFQYXRoU2VnbWVudHMsXG4gICAgcXVlcnk6IE9EYXRhUXVlcnlPcHRpb25zPFI+XG4gICkge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50cy5hZGQoUGF0aFNlZ21lbnROYW1lcy5hY3Rpb24sIHBhdGgpO1xuICAgIGlmICh0eXBlKSBzZWdtZW50LnR5cGUodHlwZSk7XG4gICAgcXVlcnkuY2xlYXIoKTtcbiAgICByZXR1cm4gbmV3IE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj4oYXBpLCBzZWdtZW50cywgcXVlcnkpO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+KFxuICAgICAgdGhpcy5hcGksXG4gICAgICB0aGlzLmNsb25lU2VnbWVudHMoKSxcbiAgICAgIHRoaXMuY2xvbmVRdWVyeTxSPigpXG4gICAgKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBzY2hlbWEoKSB7XG4gICAgLy9UT0RPOiBCaW5kaW5nIFR5cGVcbiAgICBsZXQgdHlwZSA9IHRoaXMudHlwZSgpO1xuICAgIHJldHVybiB0eXBlICE9PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5hcGkuZmluZENhbGxhYmxlRm9yVHlwZTxSPih0eXBlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm5UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYSgpPy5wYXJzZXIucmV0dXJuPy50eXBlO1xuICB9XG5cbiAgYXNNb2RlbDxNIGV4dGVuZHMgT0RhdGFNb2RlbDxSPj4oXG4gICAgZW50aXR5OiBQYXJ0aWFsPFI+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAgeyBhbm5vdHMsIHJlc2V0IH06IHsgYW5ub3RzPzogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczsgcmVzZXQ/OiBib29sZWFuIH0gPSB7fVxuICApOiBNIHtcbiAgICBsZXQgcmVzb3VyY2U6IE9EYXRhRW50aXR5UmVzb3VyY2U8Uj4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdHlwZSA9IGFubm90cz8udHlwZSB8fCB0aGlzLnJldHVyblR5cGUoKTtcbiAgICBjb25zdCBNb2RlbCA9IHRoaXMuYXBpLm1vZGVsRm9yVHlwZSh0eXBlKTtcbiAgICBsZXQgcGF0aCA9IGFubm90cz8uZW50aXR5U2V0O1xuICAgIGlmIChwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc291cmNlID0gdGhpcy5hcGkuZW50aXR5U2V0PFI+KHBhdGgpLmVudGl0eShlbnRpdHkgYXMgUGFydGlhbDxSPik7XG4gICAgICByZXNvdXJjZS5xdWVyeSgocSkgPT4gcS5hcHBseSh0aGlzLnF1ZXJ5T3B0aW9ucy50b1F1ZXJ5QXJndW1lbnRzKCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNb2RlbChlbnRpdHksIHsgcmVzb3VyY2UsIGFubm90cywgcmVzZXQgfSkgYXMgTTtcbiAgfVxuXG4gIGFzQ29sbGVjdGlvbjxNIGV4dGVuZHMgT0RhdGFNb2RlbDxSPiwgQyBleHRlbmRzIE9EYXRhQ29sbGVjdGlvbjxSLCBNPj4oXG4gICAgZW50aXRpZXM6IFBhcnRpYWw8Uj5bXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10sXG4gICAge1xuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQsXG4gICAgfTogeyBhbm5vdHM/OiBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM7IHJlc2V0PzogYm9vbGVhbiB9ID0ge31cbiAgKTogQyB7XG4gICAgbGV0IHJlc291cmNlOiBPRGF0YUVudGl0eVNldFJlc291cmNlPFI+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHR5cGUgPSBhbm5vdHM/LnR5cGUgfHwgdGhpcy5yZXR1cm5UeXBlKCk7XG4gICAgY29uc3QgQ29sbGVjdGlvbiA9IHRoaXMuYXBpLmNvbGxlY3Rpb25Gb3JUeXBlKHR5cGUpO1xuICAgIGxldCBwYXRoID0gYW5ub3RzPy5lbnRpdHlTZXQ7XG4gICAgaWYgKHBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzb3VyY2UgPSB0aGlzLmFwaS5lbnRpdHlTZXQ8Uj4ocGF0aCk7XG4gICAgICByZXNvdXJjZS5xdWVyeSgocSkgPT4gcS5hcHBseSh0aGlzLnF1ZXJ5T3B0aW9ucy50b1F1ZXJ5QXJndW1lbnRzKCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKGVudGl0aWVzLCB7IHJlc291cmNlLCBhbm5vdHMsIHJlc2V0IH0pIGFzIEM7XG4gIH1cblxuICAvLyNyZWdpb24gUmVxdWVzdHNcbiAgcHJvdGVjdGVkIHBvc3QoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFFbnRpdHlPcHRpb25zICYgT0RhdGFFbnRpdGllc09wdGlvbnMgJiBPRGF0YVByb3BlcnR5T3B0aW9uc1xuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiBzdXBlci5wb3N0KHBhcmFtcywgb3B0aW9ucyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFNob3J0Y3V0c1xuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyB0byBiZSBzZW50IHRvIHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICovXG4gIGNhbGwoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFFbnRpdHlPcHRpb25zXG4gICk6IE9ic2VydmFibGU8T0RhdGFFbnRpdHk8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhRW50aXRpZXNPcHRpb25zXG4gICk6IE9ic2VydmFibGU8T0RhdGFFbnRpdGllczxSPj47XG4gIGNhbGwoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFQcm9wZXJ0eU9wdGlvbnNcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YVByb3BlcnR5PFI+PjtcbiAgY2FsbChwYXJhbXM6IFAgfCBudWxsLCBvcHRpb25zPzogT0RhdGFOb25lT3B0aW9ucyk6IE9ic2VydmFibGU8bnVsbD47XG4gIGNhbGwoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YUVudGl0eU9wdGlvbnMgJlxuICAgICAgT0RhdGFFbnRpdGllc09wdGlvbnMgJlxuICAgICAgT0RhdGFQcm9wZXJ0eU9wdGlvbnMgJlxuICAgICAgT0RhdGFOb25lT3B0aW9ucyA9IHt9XG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5wb3N0KHBhcmFtcywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIHByb3BlcnR5XG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFjdGlvblxuICAgKi9cbiAgY2FsbFByb3BlcnR5KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZTogJ3Byb3BlcnR5JywgLi4ub3B0aW9ucyB9KS5waXBlKFxuICAgICAgbWFwKCh7IHByb3BlcnR5IH0pID0+IHByb3BlcnR5KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIGVudGl0eVxuICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBhY3Rpb25cbiAgICovXG4gIGNhbGxFbnRpdHkoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgPSB7fVxuICApOiBPYnNlcnZhYmxlPFIgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlOiAnZW50aXR5JywgLi4ub3B0aW9ucyB9KS5waXBlKFxuICAgICAgbWFwKCh7IGVudGl0eSB9KSA9PiBlbnRpdHkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgbW9kZWxcbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uXG4gICAqL1xuICBjYWxsTW9kZWw8TSBleHRlbmRzIE9EYXRhTW9kZWw8Uj4+KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zID0ge31cbiAgKTogT2JzZXJ2YWJsZTxNIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZTogJ2VudGl0eScsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdHksIGFubm90cyB9KSA9PlxuICAgICAgICBlbnRpdHkgPyB0aGlzLmFzTW9kZWw8TT4oZW50aXR5LCB7IGFubm90cywgcmVzZXQ6IHRydWUgfSkgOiBudWxsXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgZW50aXRpZXNcbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uXG4gICAqL1xuICBjYWxsRW50aXRpZXMoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgPSB7fVxuICApOiBPYnNlcnZhYmxlPFJbXSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGU6ICdlbnRpdGllcycsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdGllcyB9KSA9PiBlbnRpdGllcylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGFjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFjdGlvblxuICAgKi9cbiAgY2FsbENvbGxlY3Rpb248TSBleHRlbmRzIE9EYXRhTW9kZWw8Uj4sIEMgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248UiwgTT4+KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zID0ge31cbiAgKTogT2JzZXJ2YWJsZTxDIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZTogJ2VudGl0aWVzJywgLi4ub3B0aW9ucyB9KS5waXBlKFxuICAgICAgbWFwKCh7IGVudGl0aWVzLCBhbm5vdHMgfSkgPT5cbiAgICAgICAgZW50aXRpZXNcbiAgICAgICAgICA/IHRoaXMuYXNDb2xsZWN0aW9uPE0sIEM+KGVudGl0aWVzLCB7IGFubm90cywgcmVzZXQ6IHRydWUgfSlcbiAgICAgICAgICA6IG51bGxcbiAgICAgIClcbiAgICApO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxufVxuIl19
|
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
import { $BATCH, ACCEPT, APPLICATION_HTTP, APPLICATION_JSON, BATCH_PREFIX, BINARY, BOUNDARY_PREFIX_SUFFIX, CHANGESET_PREFIX, CONTENT_ID, CONTENT_TRANSFER_ENCODING, CONTENT_TYPE, HTTP11, MULTIPART_MIXED, MULTIPART_MIXED_BOUNDARY, NEWLINE, NEWLINE_REGEXP, ODATA_VERSION, VERSION_4_0, XSSI_PREFIX, } from '../../constants';
|
|
2
|
-
import { HttpErrorResponse, HttpHeaders, HttpResponse, } from '@angular/common/http';
|
|
3
|
-
import { Subject } from 'rxjs';
|
|
4
|
-
import { Http } from '../../utils/http';
|
|
5
|
-
import { ODataPathSegments } from '../path';
|
|
6
|
-
import { ODataRequest } from '../request';
|
|
7
|
-
import { ODataResource } from '../resource';
|
|
8
|
-
import { ODataResponse } from '../responses';
|
|
9
|
-
import { PathSegmentNames } from '../../types';
|
|
10
|
-
import { Strings } from '../../utils/strings';
|
|
11
|
-
export class ODataBatchRequest extends Subject {
|
|
12
|
-
constructor(request) {
|
|
13
|
-
super();
|
|
14
|
-
this.request = request;
|
|
15
|
-
}
|
|
16
|
-
toString() {
|
|
17
|
-
//TODO: Relative or Absolute url ?
|
|
18
|
-
let res = [
|
|
19
|
-
`${this.request.method} ${this.request.pathWithParams} ${HTTP11}`,
|
|
20
|
-
];
|
|
21
|
-
if (this.request.method === 'POST' ||
|
|
22
|
-
this.request.method === 'PATCH' ||
|
|
23
|
-
this.request.method === 'PUT') {
|
|
24
|
-
res.push(`${CONTENT_TYPE}: ${APPLICATION_JSON}`);
|
|
25
|
-
}
|
|
26
|
-
if (this.request.headers instanceof HttpHeaders) {
|
|
27
|
-
let headers = this.request.headers;
|
|
28
|
-
res = [
|
|
29
|
-
...res,
|
|
30
|
-
...headers
|
|
31
|
-
.keys()
|
|
32
|
-
.map((key) => `${key}: ${(headers.getAll(key) || []).join(',')}`),
|
|
33
|
-
];
|
|
34
|
-
}
|
|
35
|
-
return res.join(NEWLINE);
|
|
36
|
-
}
|
|
37
|
-
onLoad(content, status) {
|
|
38
|
-
let headers = new HttpHeaders();
|
|
39
|
-
var index = 1;
|
|
40
|
-
for (; index < content.length; index++) {
|
|
41
|
-
const batchBodyLine = content[index];
|
|
42
|
-
if (batchBodyLine === '') {
|
|
43
|
-
break;
|
|
44
|
-
}
|
|
45
|
-
const batchBodyLineParts = batchBodyLine.split(': ');
|
|
46
|
-
headers = headers.append(batchBodyLineParts[0].trim(), batchBodyLineParts[1].trim());
|
|
47
|
-
}
|
|
48
|
-
let body = '';
|
|
49
|
-
for (; index < content.length; index++) {
|
|
50
|
-
body += content[index];
|
|
51
|
-
}
|
|
52
|
-
if (status.code === 0) {
|
|
53
|
-
status.code = !!body ? 200 : 0;
|
|
54
|
-
}
|
|
55
|
-
let ok = status.code >= 200 && status.code < 300;
|
|
56
|
-
if (this.request.responseType === 'json' && typeof body === 'string') {
|
|
57
|
-
const originalBody = body;
|
|
58
|
-
body = body.replace(XSSI_PREFIX, '');
|
|
59
|
-
try {
|
|
60
|
-
body = body !== '' ? JSON.parse(body) : null;
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
body = originalBody;
|
|
64
|
-
if (ok) {
|
|
65
|
-
ok = false;
|
|
66
|
-
body = { error, text: body };
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
if (ok) {
|
|
71
|
-
let res = new HttpResponse({
|
|
72
|
-
body,
|
|
73
|
-
headers,
|
|
74
|
-
status: status.code,
|
|
75
|
-
statusText: status.message,
|
|
76
|
-
url: this.request.urlWithParams,
|
|
77
|
-
});
|
|
78
|
-
this.next(ODataResponse.fromHttpResponse(this.request, res));
|
|
79
|
-
this.complete();
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
// An unsuccessful request is delivered on the error channel.
|
|
83
|
-
this.error(new HttpErrorResponse({
|
|
84
|
-
// The error in this case is the response body (error from the server).
|
|
85
|
-
error: body,
|
|
86
|
-
headers,
|
|
87
|
-
status: status.code,
|
|
88
|
-
statusText: status.message,
|
|
89
|
-
url: this.request.urlWithParams,
|
|
90
|
-
}));
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
onError(content, status) {
|
|
94
|
-
const res = new HttpErrorResponse({
|
|
95
|
-
error: content.join(NEWLINE),
|
|
96
|
-
status: status.code || 0,
|
|
97
|
-
statusText: status.text || 'Unknown Error',
|
|
98
|
-
url: this.request.urlWithParams || undefined,
|
|
99
|
-
});
|
|
100
|
-
this.error(res);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* OData Batch Resource
|
|
105
|
-
* https://www.odata.org/getting-started/advanced-tutorial/#batch
|
|
106
|
-
*/
|
|
107
|
-
export class ODataBatchResource extends ODataResource {
|
|
108
|
-
constructor() {
|
|
109
|
-
super(...arguments);
|
|
110
|
-
// VARIABLES
|
|
111
|
-
this._requests = [];
|
|
112
|
-
}
|
|
113
|
-
requests() {
|
|
114
|
-
return this._requests.map((r) => r.request);
|
|
115
|
-
}
|
|
116
|
-
//#region Factory
|
|
117
|
-
static factory(api) {
|
|
118
|
-
let segments = new ODataPathSegments();
|
|
119
|
-
segments.add(PathSegmentNames.batch, $BATCH);
|
|
120
|
-
return new ODataBatchResource(api, segments);
|
|
121
|
-
}
|
|
122
|
-
clone() {
|
|
123
|
-
return new ODataBatchResource(this.api, this.cloneSegments());
|
|
124
|
-
}
|
|
125
|
-
//#endregion
|
|
126
|
-
schema() {
|
|
127
|
-
return undefined;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Execute the batch request
|
|
131
|
-
* @param ctx The context for the request
|
|
132
|
-
* @param options The options of the batch request
|
|
133
|
-
* @returns The result of execute the context
|
|
134
|
-
*/
|
|
135
|
-
exec(ctx, options) {
|
|
136
|
-
// Store original requester
|
|
137
|
-
const current = this.api.request;
|
|
138
|
-
// Switch to the batch requester
|
|
139
|
-
this.api.request = (req) => {
|
|
140
|
-
if (req.api !== this.api)
|
|
141
|
-
throw new Error('Batch Request are for the same api.');
|
|
142
|
-
if (req.observe === 'events')
|
|
143
|
-
throw new Error("Batch Request does not allows observe == 'events'.");
|
|
144
|
-
this._requests.push(new ODataBatchRequest(req));
|
|
145
|
-
return this._requests[this._requests.length - 1];
|
|
146
|
-
};
|
|
147
|
-
// Execute the context
|
|
148
|
-
const obs$ = ctx(this);
|
|
149
|
-
// Restore original requester
|
|
150
|
-
this.api.request = current;
|
|
151
|
-
if (this._requests.length >= 0) {
|
|
152
|
-
const bound = Strings.uniqueId(BATCH_PREFIX);
|
|
153
|
-
const requests = this._requests;
|
|
154
|
-
const headers = Http.mergeHttpHeaders((options && options.headers) || {}, {
|
|
155
|
-
[ODATA_VERSION]: VERSION_4_0,
|
|
156
|
-
[CONTENT_TYPE]: MULTIPART_MIXED_BOUNDARY + bound,
|
|
157
|
-
[ACCEPT]: MULTIPART_MIXED,
|
|
158
|
-
});
|
|
159
|
-
const request = new ODataRequest({
|
|
160
|
-
method: 'POST',
|
|
161
|
-
body: ODataBatchResource.buildBody(bound, requests),
|
|
162
|
-
api: this.api,
|
|
163
|
-
resource: this,
|
|
164
|
-
observe: 'response',
|
|
165
|
-
responseType: 'text',
|
|
166
|
-
headers: headers,
|
|
167
|
-
params: options ? options.params : undefined,
|
|
168
|
-
withCredentials: options ? options.withCredentials : undefined,
|
|
169
|
-
});
|
|
170
|
-
this.api.request(request).subscribe((response) => {
|
|
171
|
-
ODataBatchResource.handleResponse(requests, response);
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
return obs$;
|
|
175
|
-
}
|
|
176
|
-
body() {
|
|
177
|
-
return ODataBatchResource.buildBody(Strings.uniqueId(BATCH_PREFIX), this._requests);
|
|
178
|
-
}
|
|
179
|
-
static buildBody(batchBoundary, requests) {
|
|
180
|
-
let res = [];
|
|
181
|
-
let changesetBoundary = null;
|
|
182
|
-
let changesetId = 1;
|
|
183
|
-
for (const batch of requests) {
|
|
184
|
-
// if method is GET and there is a changeset boundary open then close it
|
|
185
|
-
if (batch.request.method === 'GET' && changesetBoundary !== null) {
|
|
186
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
|
|
187
|
-
changesetBoundary = null;
|
|
188
|
-
}
|
|
189
|
-
// if there is no changeset boundary open then open a batch boundary
|
|
190
|
-
if (changesetBoundary === null) {
|
|
191
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${batchBoundary}`);
|
|
192
|
-
}
|
|
193
|
-
// if method is not GET and there is no changeset boundary open then open a changeset boundary
|
|
194
|
-
if (batch.request.method !== 'GET') {
|
|
195
|
-
if (changesetBoundary === null) {
|
|
196
|
-
changesetBoundary = Strings.uniqueId(CHANGESET_PREFIX);
|
|
197
|
-
res.push(`${CONTENT_TYPE}: ${MULTIPART_MIXED_BOUNDARY}${changesetBoundary}`);
|
|
198
|
-
res.push(NEWLINE);
|
|
199
|
-
}
|
|
200
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}`);
|
|
201
|
-
}
|
|
202
|
-
res.push(`${CONTENT_TYPE}: ${APPLICATION_HTTP}`);
|
|
203
|
-
res.push(`${CONTENT_TRANSFER_ENCODING}: ${BINARY}`);
|
|
204
|
-
if (batch.request.method !== 'GET') {
|
|
205
|
-
res.push(`${CONTENT_ID}: ${changesetId++}`);
|
|
206
|
-
}
|
|
207
|
-
res.push(NEWLINE);
|
|
208
|
-
res.push(`${batch}`);
|
|
209
|
-
if (batch.request.method === 'GET' || batch.request.method === 'DELETE') {
|
|
210
|
-
res.push(NEWLINE);
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
res.push(`${NEWLINE}${JSON.stringify(batch.request.body)}`);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
if (res.length) {
|
|
217
|
-
if (changesetBoundary !== null) {
|
|
218
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
|
|
219
|
-
changesetBoundary = null;
|
|
220
|
-
}
|
|
221
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${batchBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
|
|
222
|
-
}
|
|
223
|
-
return res.join(NEWLINE);
|
|
224
|
-
}
|
|
225
|
-
static handleResponse(requests, response) {
|
|
226
|
-
let chunks = [];
|
|
227
|
-
const contentType = response.headers.get(CONTENT_TYPE) || '';
|
|
228
|
-
const batchBoundary = Http.boundaryDelimiter(contentType);
|
|
229
|
-
const endLine = Http.boundaryEnd(batchBoundary);
|
|
230
|
-
const lines = response.body.split(NEWLINE_REGEXP);
|
|
231
|
-
let changesetResponses = null;
|
|
232
|
-
let contentId = null;
|
|
233
|
-
let changesetBoundary = null;
|
|
234
|
-
let changesetEndLine = null;
|
|
235
|
-
let startIndex = null;
|
|
236
|
-
for (let index = 0; index < lines.length; index++) {
|
|
237
|
-
const line = lines[index];
|
|
238
|
-
if (line.startsWith(CONTENT_TYPE)) {
|
|
239
|
-
const contentTypeValue = Http.headerValue(line);
|
|
240
|
-
if (contentTypeValue === MULTIPART_MIXED) {
|
|
241
|
-
changesetResponses = [];
|
|
242
|
-
contentId = null;
|
|
243
|
-
changesetBoundary = Http.boundaryDelimiter(line);
|
|
244
|
-
changesetEndLine = Http.boundaryEnd(changesetBoundary);
|
|
245
|
-
startIndex = null;
|
|
246
|
-
}
|
|
247
|
-
continue;
|
|
248
|
-
}
|
|
249
|
-
else if (changesetResponses !== null && line.startsWith(CONTENT_ID)) {
|
|
250
|
-
contentId = Number(Http.headerValue(line));
|
|
251
|
-
}
|
|
252
|
-
else if (line.startsWith(HTTP11)) {
|
|
253
|
-
startIndex = index;
|
|
254
|
-
}
|
|
255
|
-
else if (line === batchBoundary ||
|
|
256
|
-
line === changesetBoundary ||
|
|
257
|
-
line === endLine ||
|
|
258
|
-
line === changesetEndLine) {
|
|
259
|
-
if (!startIndex) {
|
|
260
|
-
continue;
|
|
261
|
-
}
|
|
262
|
-
const chunk = lines.slice(startIndex, index);
|
|
263
|
-
if (changesetResponses !== null && contentId !== null) {
|
|
264
|
-
changesetResponses[contentId] = chunk;
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
chunks.push(chunk);
|
|
268
|
-
}
|
|
269
|
-
if (line === batchBoundary || line === changesetBoundary) {
|
|
270
|
-
startIndex = index + 1;
|
|
271
|
-
}
|
|
272
|
-
else if (line === endLine || line === changesetEndLine) {
|
|
273
|
-
if (changesetResponses !== null) {
|
|
274
|
-
for (const response of changesetResponses) {
|
|
275
|
-
if (response) {
|
|
276
|
-
chunks.push(response);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
changesetResponses = null;
|
|
281
|
-
changesetBoundary = null;
|
|
282
|
-
changesetEndLine = null;
|
|
283
|
-
startIndex = null;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
chunks.forEach((chunk, index) => {
|
|
288
|
-
const req = requests[index];
|
|
289
|
-
const { code, message } = Http.parseResponseStatus(chunk[0]);
|
|
290
|
-
req.onLoad(chunk.slice(1), { code, message });
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3R5cGVzL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLE1BQU0sRUFDTixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLE1BQU0sRUFDTixlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxjQUFjLEVBQ2QsYUFBYSxFQUNiLFdBQVcsRUFDWCxXQUFXLEdBQ1osTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxZQUFZLEdBQ2IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxNQUFNLE9BQU8saUJBQXFCLFNBQVEsT0FBeUI7SUFDakUsWUFBbUIsT0FBMEI7UUFDM0MsS0FBSyxFQUFFLENBQUM7UUFEUyxZQUFPLEdBQVAsT0FBTyxDQUFtQjtJ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RSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdELEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgJEJBVENILFxuICBBQ0NFUFQsXG4gIEFQUExJQ0FUSU9OX0hUVFAsXG4gIEFQUExJQ0FUSU9OX0pTT04sXG4gIEJBVENIX1BSRUZJWCxcbiAgQklOQVJZLFxuICBCT1VOREFSWV9QUkVGSVhfU1VGRklYLFxuICBDSEFOR0VTRVRfUFJFRklYLFxuICBDT05URU5UX0lELFxuICBDT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HLFxuICBDT05URU5UX1RZUEUsXG4gIEhUVFAxMSxcbiAgTVVMVElQQVJUX01JWEVELFxuICBNVUxUSVBBUlRfTUlYRURfQk9VTkRBUlksXG4gIE5FV0xJTkUsXG4gIE5FV0xJTkVfUkVHRVhQLFxuICBPREFUQV9WRVJTSU9OLFxuICBWRVJTSU9OXzRfMCxcbiAgWFNTSV9QUkVGSVgsXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBIdHRwRXJyb3JSZXNwb25zZSxcbiAgSHR0cEhlYWRlcnMsXG4gIEh0dHBSZXNwb25zZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBIdHRwIH0gZnJvbSAnLi4vLi4vdXRpbHMvaHR0cCc7XG5pbXBvcnQgeyBPRGF0YUFwaSB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBPRGF0YU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgT0RhdGFQYXRoU2VnbWVudHMgfSBmcm9tICcuLi9wYXRoJztcbmltcG9ydCB7IE9EYXRhUmVxdWVzdCB9IGZyb20gJy4uL3JlcXVlc3QnO1xuaW1wb3J0IHsgT0RhdGFSZXNvdXJjZSB9IGZyb20gJy4uL3Jlc291cmNlJztcbmltcG9ydCB7IE9EYXRhUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZXMnO1xuaW1wb3J0IHsgUGF0aFNlZ21lbnROYW1lcyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFN0cmluZ3MgfSBmcm9tICcuLi8uLi91dGlscy9zdHJpbmdzJztcblxuZXhwb3J0IGNsYXNzIE9EYXRhQmF0Y2hSZXF1ZXN0PFQ+IGV4dGVuZHMgU3ViamVjdDxPRGF0YVJlc3BvbnNlPFQ+PiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1ZXN0OiBPRGF0YVJlcXVlc3Q8YW55Pikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICAvL1RPRE86IFJlbGF0aXZlIG9yIEFic29sdXRlIHVybCA/XG4gICAgbGV0IHJlcyA9IFtcbiAgICAgIGAke3RoaXMucmVxdWVzdC5tZXRob2R9ICR7dGhpcy5yZXF1ZXN0LnBhdGhXaXRoUGFyYW1zfSAke0hUVFAxMX1gLFxuICAgIF07XG4gICAgaWYgKFxuICAgICAgdGhpcy5yZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnIHx8XG4gICAgICB0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnUEFUQ0gnIHx8XG4gICAgICB0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnUFVUJ1xuICAgICkge1xuICAgICAgcmVzLnB1c2goYCR7Q09OVEVOVF9UWVBFfTogJHtBUFBMSUNBVElPTl9KU09OfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcXVlc3QuaGVhZGVycyBpbnN0YW5jZW9mIEh0dHBIZWFkZXJzKSB7XG4gICAgICBsZXQgaGVhZGVycyA9IHRoaXMucmVxdWVzdC5oZWFkZXJzO1xuICAgICAgcmVzID0gW1xuICAgICAgICAuLi5yZXMsXG4gICAgICAgIC4uLmhlYWRlcnNcbiAgICAgICAgICAua2V5cygpXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBgJHtrZXl9OiAkeyhoZWFkZXJzLmdldEFsbChrZXkpIHx8IFtdKS5qb2luKCcsJyl9YCksXG4gICAgICBdO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuam9pbihORVdMSU5FKTtcbiAgfVxuXG4gIG9uTG9hZChjb250ZW50OiBzdHJpbmdbXSwgc3RhdHVzOiB7IGNvZGU6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH0pIHtcbiAgICBsZXQgaGVhZGVyczogSHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICB2YXIgaW5kZXggPSAxO1xuICAgIGZvciAoOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBiYXRjaEJvZHlMaW5lOiBzdHJpbmcgPSBjb250ZW50W2luZGV4XTtcblxuICAgICAgaWYgKGJhdGNoQm9keUxpbmUgPT09ICcnKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXRjaEJvZHlMaW5lUGFydHM6IHN0cmluZ1tdID0gYmF0Y2hCb2R5TGluZS5zcGxpdCgnOiAnKTtcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcbiAgICAgICAgYmF0Y2hCb2R5TGluZVBhcnRzWzBdLnRyaW0oKSxcbiAgICAgICAgYmF0Y2hCb2R5TGluZVBhcnRzWzFdLnRyaW0oKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgYm9keTogc3RyaW5nIHwgeyBlcnJvcjogYW55OyB0ZXh0OiBzdHJpbmcgfSA9ICcnO1xuICAgIGZvciAoOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBib2R5ICs9IGNvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMuY29kZSA9PT0gMCkge1xuICAgICAgc3RhdHVzLmNvZGUgPSAhIWJvZHkgPyAyMDAgOiAwO1xuICAgIH1cblxuICAgIGxldCBvayA9IHN0YXR1cy5jb2RlID49IDIwMCAmJiBzdGF0dXMuY29kZSA8IDMwMDtcbiAgICBpZiAodGhpcy5yZXF1ZXN0LnJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nICYmIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxCb2R5ID0gYm9keTtcbiAgICAgIGJvZHkgPSBib2R5LnJlcGxhY2UoWFNTSV9QUkVGSVgsICcnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJvZHkgPSBib2R5ICE9PSAnJyA/IEpTT04ucGFyc2UoYm9keSkgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYm9keSA9IG9yaWdpbmFsQm9keTtcblxuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICBvayA9IGZhbHNlO1xuICAgICAgICAgIGJvZHkgPSB7IGVycm9yLCB0ZXh0OiBib2R5IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2spIHtcbiAgICAgIGxldCByZXMgPSBuZXcgSHR0cFJlc3BvbnNlPGFueT4oe1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBzdGF0dXM6IHN0YXR1cy5jb2RlLFxuICAgICAgICBzdGF0dXNUZXh0OiBzdGF0dXMubWVzc2FnZSxcbiAgICAgICAgdXJsOiB0aGlzLnJlcXVlc3QudXJsV2l0aFBhcmFtcyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5uZXh0KE9EYXRhUmVzcG9uc2UuZnJvbUh0dHBSZXNwb25zZSh0aGlzLnJlcXVlc3QsIHJlcykpO1xuICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbiB1bnN1Y2Nlc3NmdWwgcmVxdWVzdCBpcyBkZWxpdmVyZWQgb24gdGhlIGVycm9yIGNoYW5uZWwuXG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICBuZXcgSHR0cEVycm9yUmVzcG9uc2Uoe1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBpbiB0aGlzIGNhc2UgaXMgdGhlIHJlc3BvbnNlIGJvZHkgKGVycm9yIGZyb20gdGhlIHNlcnZlcikuXG4gICAgICAgICAgZXJyb3I6IGJvZHksXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBzdGF0dXM6IHN0YXR1cy5jb2RlLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1cy5tZXNzYWdlLFxuICAgICAgICAgIHVybDogdGhpcy5yZXF1ZXN0LnVybFdpdGhQYXJhbXMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3IoY29udGVudDogc3RyaW5nW10sIHN0YXR1czogeyBjb2RlOiBudW1iZXI7IHRleHQ6IHN0cmluZyB9KSB7XG4gICAgY29uc3QgcmVzID0gbmV3IEh0dHBFcnJvclJlc3BvbnNlKHtcbiAgICAgIGVycm9yOiBjb250ZW50LmpvaW4oTkVXTElORSksXG4gICAgICBzdGF0dXM6IHN0YXR1cy5jb2RlIHx8IDAsXG4gICAgICBzdGF0dXNUZXh0OiBzdGF0dXMudGV4dCB8fCAnVW5rbm93biBFcnJvcicsXG4gICAgICB1cmw6IHRoaXMucmVxdWVzdC51cmxXaXRoUGFyYW1zIHx8IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICB0aGlzLmVycm9yKHJlcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBPRGF0YSBCYXRjaCBSZXNvdXJjZVxuICogaHR0cHM6Ly93d3cub2RhdGEub3JnL2dldHRpbmctc3RhcnRlZC9hZHZhbmNlZC10dXRvcmlhbC8jYmF0Y2hcbiAqL1xuZXhwb3J0IGNsYXNzIE9EYXRhQmF0Y2hSZXNvdXJjZSBleHRlbmRzIE9EYXRhUmVzb3VyY2U8YW55PiB7XG4gIC8vIFZBUklBQkxFU1xuICBwcml2YXRlIF9yZXF1ZXN0czogT0RhdGFCYXRjaFJlcXVlc3Q8YW55PltdID0gW107XG4gIHJlcXVlc3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0cy5tYXAoKHIpID0+IHIucmVxdWVzdCk7XG4gIH1cblxuICAvLyNyZWdpb24gRmFjdG9yeVxuICBzdGF0aWMgZmFjdG9yeShhcGk6IE9EYXRhQXBpKSB7XG4gICAgbGV0IHNlZ21lbnRzID0gbmV3IE9EYXRhUGF0aFNlZ21lbnRzKCk7XG4gICAgc2VnbWVudHMuYWRkKFBhdGhTZWdtZW50TmFtZXMuYmF0Y2gsICRCQVRDSCk7XG4gICAgcmV0dXJuIG5ldyBPRGF0YUJhdGNoUmVzb3VyY2UoYXBpLCBzZWdtZW50cyk7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IE9EYXRhQmF0Y2hSZXNvdXJjZSh0aGlzLmFwaSwgdGhpcy5jbG9uZVNlZ21lbnRzKCkpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHNjaGVtYSgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGJhdGNoIHJlcXVlc3RcbiAgICogQHBhcmFtIGN0eCBUaGUgY29udGV4dCBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIGJhdGNoIHJlcXVlc3RcbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiBleGVjdXRlIHRoZSBjb250ZXh0XG4gICAqL1xuICBleGVjPFI+KFxuICAgIGN0eDogKGJhdGNoOiB0aGlzKSA9PiBPYnNlcnZhYmxlPFI+LFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnNcbiAgKTogT2JzZXJ2YWJsZTxSPiB7XG4gICAgLy8gU3RvcmUgb3JpZ2luYWwgcmVxdWVzdGVyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuYXBpLnJlcXVlc3Q7XG4gICAgLy8gU3dpdGNoIHRvIHRoZSBiYXRjaCByZXF1ZXN0ZXJcbiAgICB0aGlzLmFwaS5yZXF1ZXN0ID0gKHJlcTogT0RhdGFSZXF1ZXN0PGFueT4pOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xuICAgICAgaWYgKHJlcS5hcGkgIT09IHRoaXMuYXBpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhdGNoIFJlcXVlc3QgYXJlIGZvciB0aGUgc2FtZSBhcGkuJyk7XG4gICAgICBpZiAocmVxLm9ic2VydmUgPT09ICdldmVudHMnKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYXRjaCBSZXF1ZXN0IGRvZXMgbm90IGFsbG93cyBvYnNlcnZlID09ICdldmVudHMnLlwiKTtcbiAgICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gobmV3IE9EYXRhQmF0Y2hSZXF1ZXN0PGFueT4ocmVxKSk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHNbdGhpcy5fcmVxdWVzdHMubGVuZ3RoIC0gMV07XG4gICAgfTtcbiAgICAvLyBFeGVjdXRlIHRoZSBjb250ZXh0XG4gICAgY29uc3Qgb2JzJCA9IGN0eCh0aGlzKTtcbiAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHJlcXVlc3RlclxuICAgIHRoaXMuYXBpLnJlcXVlc3QgPSBjdXJyZW50O1xuXG4gICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+PSAwKSB7XG4gICAgICBjb25zdCBib3VuZCA9IFN0cmluZ3MudW5pcXVlSWQoQkFUQ0hfUFJFRklYKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RzID0gdGhpcy5fcmVxdWVzdHM7XG4gICAgICBjb25zdCBoZWFkZXJzID0gSHR0cC5tZXJnZUh0dHBIZWFkZXJzKFxuICAgICAgICAob3B0aW9ucyAmJiBvcHRpb25zLmhlYWRlcnMpIHx8IHt9LFxuICAgICAgICB7XG4gICAgICAgICAgW09EQVRBX1ZFUlNJT05dOiBWRVJTSU9OXzRfMCxcbiAgICAgICAgICBbQ09OVEVOVF9UWVBFXTogTVVMVElQQVJUX01JWEVEX0JPVU5EQVJZICsgYm91bmQsXG4gICAgICAgICAgW0FDQ0VQVF06IE1VTFRJUEFSVF9NSVhFRCxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgT0RhdGFSZXF1ZXN0KHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IE9EYXRhQmF0Y2hSZXNvdXJjZS5idWlsZEJvZHkoYm91bmQsIHJlcXVlc3RzKSxcbiAgICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgICAgcmVzb3VyY2U6IHRoaXMsXG4gICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICBwYXJhbXM6IG9wdGlvbnMgPyBvcHRpb25zLnBhcmFtcyA6IHVuZGVmaW5lZCxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBvcHRpb25zID8gb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBpLnJlcXVlc3QocmVxdWVzdCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBPRGF0YUJhdGNoUmVzb3VyY2UuaGFuZGxlUmVzcG9uc2UocmVxdWVzdHMsIHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBvYnMkO1xuICB9XG5cbiAgYm9keSgpIHtcbiAgICByZXR1cm4gT0RhdGFCYXRjaFJlc291cmNlLmJ1aWxkQm9keShcbiAgICAgIFN0cmluZ3MudW5pcXVlSWQoQkFUQ0hfUFJFRklYKSxcbiAgICAgIHRoaXMuX3JlcXVlc3RzXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBidWlsZEJvZHkoXG4gICAgYmF0Y2hCb3VuZGFyeTogc3RyaW5nLFxuICAgIHJlcXVlc3RzOiBPRGF0YUJhdGNoUmVxdWVzdDxhbnk+W11cbiAgKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzID0gW107XG4gICAgbGV0IGNoYW5nZXNldEJvdW5kYXJ5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY2hhbmdlc2V0SWQgPSAxO1xuXG4gICAgZm9yIChjb25zdCBiYXRjaCBvZiByZXF1ZXN0cykge1xuICAgICAgLy8gaWYgbWV0aG9kIGlzIEdFVCBhbmQgdGhlcmUgaXMgYSBjaGFuZ2VzZXQgYm91bmRhcnkgb3BlbiB0aGVuIGNsb3NlIGl0XG4gICAgICBpZiAoYmF0Y2gucmVxdWVzdC5tZXRob2QgPT09ICdHRVQnICYmIGNoYW5nZXNldEJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICAgIHJlcy5wdXNoKFxuICAgICAgICAgIGAke0JPVU5EQVJZX1BSRUZJWF9TVUZGSVh9JHtjaGFuZ2VzZXRCb3VuZGFyeX0ke0JPVU5EQVJZX1BSRUZJWF9TVUZGSVh9YFxuICAgICAgICApO1xuICAgICAgICBjaGFuZ2VzZXRCb3VuZGFyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGNoYW5nZXNldCBib3VuZGFyeSBvcGVuIHRoZW4gb3BlbiBhIGJhdGNoIGJvdW5kYXJ5XG4gICAgICBpZiAoY2hhbmdlc2V0Qm91bmRhcnkgPT09IG51bGwpIHtcbiAgICAgICAgcmVzLnB1c2goYCR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH0ke2JhdGNoQm91bmRhcnl9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIG1ldGhvZCBpcyBub3QgR0VUIGFuZCB0aGVyZSBpcyBubyBjaGFuZ2VzZXQgYm91bmRhcnkgb3BlbiB0aGVuIG9wZW4gYSBjaGFuZ2VzZXQgYm91bmRhcnlcbiAgICAgIGlmIChiYXRjaC5yZXF1ZXN0Lm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgICAgaWYgKGNoYW5nZXNldEJvdW5kYXJ5ID09PSBudWxsKSB7XG4gICAgICAgICAgY2hhbmdlc2V0Qm91bmRhcnkgPSBTdHJpbmdzLnVuaXF1ZUlkKENIQU5HRVNFVF9QUkVGSVgpO1xuICAgICAgICAgIHJlcy5wdXNoKFxuICAgICAgICAgICAgYCR7Q09OVEVOVF9UWVBFfTogJHtNVUxUSVBBUlRfTUlYRURfQk9VTkRBUll9JHtjaGFuZ2VzZXRCb3VuZGFyeX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXMucHVzaChORVdMSU5FKTtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaChgJHtCT1VOREFSWV9QUkVGSVhfU1VGRklYfSR7Y2hhbmdlc2V0Qm91bmRhcnl9YCk7XG4gICAgICB9XG5cbiAgICAgIHJlcy5wdXNoKGAke0NPTlRFTlRfVFlQRX06ICR7QVBQTElDQVRJT05fSFRUUH1gKTtcbiAgICAgIHJlcy5wdXNoKGAke0NPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkd9OiAke0JJTkFSWX1gKTtcblxuICAgICAgaWYgKGJhdGNoLnJlcXVlc3QubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgICByZXMucHVzaChgJHtDT05URU5UX0lEfTogJHtjaGFuZ2VzZXRJZCsrfWApO1xuICAgICAgfVxuXG4gICAgICByZXMucHVzaChORVdMSU5FKTtcbiAgICAgIHJlcy5wdXNoKGAke2JhdGNofWApO1xuXG4gICAgICBpZiAoYmF0Y2gucmVxdWVzdC5tZXRob2QgPT09ICdHRVQnIHx8IGJhdGNoLnJlcXVlc3QubWV0aG9kID09PSAnREVMRVRFJykge1xuICAgICAgICByZXMucHVzaChORVdMSU5FKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5wdXNoKGAke05FV0xJTkV9JHtKU09OLnN0cmluZ2lmeShiYXRjaC5yZXF1ZXN0LmJvZHkpfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXMubGVuZ3RoKSB7XG4gICAgICBpZiAoY2hhbmdlc2V0Qm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgcmVzLnB1c2goXG4gICAgICAgICAgYCR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH0ke2NoYW5nZXNldEJvdW5kYXJ5fSR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH1gXG4gICAgICAgICk7XG4gICAgICAgIGNoYW5nZXNldEJvdW5kYXJ5ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJlcy5wdXNoKFxuICAgICAgICBgJHtCT1VOREFSWV9QUkVGSVhfU1VGRklYfSR7YmF0Y2hCb3VuZGFyeX0ke0JPVU5EQVJZX1BSRUZJWF9TVUZGSVh9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5qb2luKE5FV0xJTkUpO1xuICB9XG5cbiAgc3RhdGljIGhhbmRsZVJlc3BvbnNlKFxuICAgIHJlcXVlc3RzOiBPRGF0YUJhdGNoUmVxdWVzdDxhbnk+W10sXG4gICAgcmVzcG9uc2U6IE9EYXRhUmVzcG9uc2U8YW55PlxuICApIHtcbiAgICBsZXQgY2h1bmtzOiBzdHJpbmdbXVtdID0gW107XG4gICAgY29uc3QgY29udGVudFR5cGU6IHN0cmluZyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KENPTlRFTlRfVFlQRSkgfHwgJyc7XG4gICAgY29uc3QgYmF0Y2hCb3VuZGFyeTogc3RyaW5nID0gSHR0cC5ib3VuZGFyeURlbGltaXRlcihjb250ZW50VHlwZSk7XG4gICAgY29uc3QgZW5kTGluZTogc3RyaW5nID0gSHR0cC5ib3VuZGFyeUVuZChiYXRjaEJvdW5kYXJ5KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IHJlc3BvbnNlLmJvZHkuc3BsaXQoTkVXTElORV9SRUdFWFApO1xuXG4gICAgbGV0IGNoYW5nZXNldFJlc3BvbnNlczogc3RyaW5nW11bXSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjb250ZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjaGFuZ2VzZXRCb3VuZGFyeTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNoYW5nZXNldEVuZExpbmU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzdGFydEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBsaW5lID0gbGluZXNbaW5kZXhdO1xuXG4gICAgICBpZiAobGluZS5zdGFydHNXaXRoKENPTlRFTlRfVFlQRSkpIHtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGVWYWx1ZTogc3RyaW5nID0gSHR0cC5oZWFkZXJWYWx1ZShsaW5lKTtcbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlVmFsdWUgPT09IE1VTFRJUEFSVF9NSVhFRCkge1xuICAgICAgICAgIGNoYW5nZXNldFJlc3BvbnNlcyA9IFtdO1xuICAgICAgICAgIGNvbnRlbnRJZCA9IG51bGw7XG4gICAgICAgICAgY2hhbmdlc2V0Qm91bmRhcnkgPSBIdHRwLmJvdW5kYXJ5RGVsaW1pdGVyKGxpbmUpO1xuICAgICAgICAgIGNoYW5nZXNldEVuZExpbmUgPSBIdHRwLmJvdW5kYXJ5RW5kKGNoYW5nZXNldEJvdW5kYXJ5KTtcbiAgICAgICAgICBzdGFydEluZGV4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlc2V0UmVzcG9uc2VzICE9PSBudWxsICYmIGxpbmUuc3RhcnRzV2l0aChDT05URU5UX0lEKSkge1xuICAgICAgICBjb250ZW50SWQgPSBOdW1iZXIoSHR0cC5oZWFkZXJWYWx1ZShsaW5lKSk7XG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChIVFRQMTEpKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGxpbmUgPT09IGJhdGNoQm91bmRhcnkgfHxcbiAgICAgICAgbGluZSA9PT0gY2hhbmdlc2V0Qm91bmRhcnkgfHxcbiAgICAgICAgbGluZSA9PT0gZW5kTGluZSB8fFxuICAgICAgICBsaW5lID09PSBjaGFuZ2VzZXRFbmRMaW5lXG4gICAgICApIHtcbiAgICAgICAgaWYgKCFzdGFydEluZGV4KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2h1bmsgPSBsaW5lcy5zbGljZShzdGFydEluZGV4LCBpbmRleCk7XG4gICAgICAgIGlmIChjaGFuZ2VzZXRSZXNwb25zZXMgIT09IG51bGwgJiYgY29udGVudElkICE9PSBudWxsKSB7XG4gICAgICAgICAgY2hhbmdlc2V0UmVzcG9uc2VzW2NvbnRlbnRJZF0gPSBjaHVuaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZSA9PT0gYmF0Y2hCb3VuZGFyeSB8fCBsaW5lID09PSBjaGFuZ2VzZXRCb3VuZGFyeSkge1xuICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAobGluZSA9PT0gZW5kTGluZSB8fCBsaW5lID09PSBjaGFuZ2VzZXRFbmRMaW5lKSB7XG4gICAgICAgICAgaWYgKGNoYW5nZXNldFJlc3BvbnNlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBjaGFuZ2VzZXRSZXNwb25zZXMpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgY2h1bmtzLnB1c2gocmVzcG9uc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoYW5nZXNldFJlc3BvbnNlcyA9IG51bGw7XG4gICAgICAgICAgY2hhbmdlc2V0Qm91bmRhcnkgPSBudWxsO1xuICAgICAgICAgIGNoYW5nZXNldEVuZExpbmUgPSBudWxsO1xuICAgICAgICAgIHN0YXJ0SW5kZXggPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNodW5rcy5mb3JFYWNoKChjaHVuaywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJlcSA9IHJlcXVlc3RzW2luZGV4XTtcbiAgICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gSHR0cC5wYXJzZVJlc3BvbnNlU3RhdHVzKGNodW5rWzBdKTtcbiAgICAgIHJlcS5vbkxvYWQoY2h1bmsuc2xpY2UoMSksIHsgY29kZSwgbWVzc2FnZSB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { PathSegmentNames, QueryOptionNames } from '../../types';
|
|
2
|
-
import { $COUNT } from '../../constants';
|
|
3
|
-
import { ODataResource } from '../resource';
|
|
4
|
-
export class ODataCountResource extends ODataResource {
|
|
5
|
-
//#region Factory
|
|
6
|
-
static factory(api, segments, query) {
|
|
7
|
-
segments.add(PathSegmentNames.count, $COUNT).type('Edm.Int32');
|
|
8
|
-
query.keep(QueryOptionNames.filter, QueryOptionNames.search);
|
|
9
|
-
return new ODataCountResource(api, segments, query);
|
|
10
|
-
}
|
|
11
|
-
clone() {
|
|
12
|
-
return new ODataCountResource(this.api, this.cloneSegments(), this.cloneQuery());
|
|
13
|
-
}
|
|
14
|
-
//#endregion
|
|
15
|
-
schema() {
|
|
16
|
-
return undefined;
|
|
17
|
-
}
|
|
18
|
-
//#region Requests
|
|
19
|
-
get(options) {
|
|
20
|
-
return super.get(Object.assign({ responseType: 'value' }, options));
|
|
21
|
-
}
|
|
22
|
-
//#endregion
|
|
23
|
-
//#region Shortcuts
|
|
24
|
-
/**
|
|
25
|
-
* Fetch the count of the set.
|
|
26
|
-
* @param options Options for the request
|
|
27
|
-
* @returns The count of the set
|
|
28
|
-
*/
|
|
29
|
-
fetch(options) {
|
|
30
|
-
return this.get(options);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3R5cGVzL2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFLekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1QyxNQUFNLE9BQU8sa0JBQXNCLFNBQVEsYUFBZ0I7SUFDekQsaUJBQWlCO0lBQ2pCLE1BQU0sQ0FBQyxPQUFPLENBQ1osR0FBYSxFQUNiLFFBQTJCLEVBQzNCLEtBQTJCO1FBRTNCLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxPQUFPLElBQUksa0JBQWtCLENBQUksR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sSUFBSSxrQkFBa0IsQ0FDM0IsSUFBSSxDQUFDLEdBQUcsRUFDUixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQ3BCLElBQUksQ0FBQyxVQUFVLEVBQUssQ0FDckIsQ0FBQztJQUNKLENBQUM7SUFDRCxZQUFZO0lBRVosTUFBTTtRQUNKLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxrQkFBa0I7SUFDUixHQUFHLENBQUMsT0FBc0I7UUFDbEMsT0FBTyxLQUFLLENBQUMsR0FBRyxpQkFBRyxZQUFZLEVBQUUsT0FBTyxJQUFLLE9BQU8sRUFBRyxDQUFDO0lBQzFELENBQUM7SUFDRCxZQUFZO0lBRVosbUJBQW1CO0lBQ25COzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBc0I7UUFDMUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBhdGhTZWdtZW50TmFtZXMsIFF1ZXJ5T3B0aW9uTmFtZXMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB7ICRDT1VOVCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUFwaSB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBPRGF0YU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgT0RhdGFQYXRoU2VnbWVudHMgfSBmcm9tICcuLi9wYXRoJztcbmltcG9ydCB7IE9EYXRhUXVlcnlPcHRpb25zIH0gZnJvbSAnLi4vcXVlcnknO1xuaW1wb3J0IHsgT0RhdGFSZXNvdXJjZSB9IGZyb20gJy4uL3Jlc291cmNlJztcblxuZXhwb3J0IGNsYXNzIE9EYXRhQ291bnRSZXNvdXJjZTxUPiBleHRlbmRzIE9EYXRhUmVzb3VyY2U8VD4ge1xuICAvLyNyZWdpb24gRmFjdG9yeVxuICBzdGF0aWMgZmFjdG9yeTxUPihcbiAgICBhcGk6IE9EYXRhQXBpLFxuICAgIHNlZ21lbnRzOiBPRGF0YVBhdGhTZWdtZW50cyxcbiAgICBxdWVyeTogT0RhdGFRdWVyeU9wdGlvbnM8VD5cbiAgKSB7XG4gICAgc2VnbWVudHMuYWRkKFBhdGhTZWdtZW50TmFtZXMuY291bnQsICRDT1VOVCkudHlwZSgnRWRtLkludDMyJyk7XG4gICAgcXVlcnkua2VlcChRdWVyeU9wdGlvbk5hbWVzLmZpbHRlciwgUXVlcnlPcHRpb25OYW1lcy5zZWFyY2gpO1xuICAgIHJldHVybiBuZXcgT0RhdGFDb3VudFJlc291cmNlPFQ+KGFwaSwgc2VnbWVudHMsIHF1ZXJ5KTtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgT0RhdGFDb3VudFJlc291cmNlPFQ+KFxuICAgICAgdGhpcy5hcGksXG4gICAgICB0aGlzLmNsb25lU2VnbWVudHMoKSxcbiAgICAgIHRoaXMuY2xvbmVRdWVyeTxUPigpXG4gICAgKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBzY2hlbWEoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBSZXF1ZXN0c1xuICBwcm90ZWN0ZWQgZ2V0KG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiBzdXBlci5nZXQoeyByZXNwb25zZVR5cGU6ICd2YWx1ZScsIC4uLm9wdGlvbnMgfSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFNob3J0Y3V0c1xuICAvKipcbiAgICogRmV0Y2ggdGhlIGNvdW50IG9mIHRoZSBzZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIFRoZSBjb3VudCBvZiB0aGUgc2V0XG4gICAqL1xuICBmZXRjaChvcHRpb25zPzogT0RhdGFPcHRpb25zKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQob3B0aW9ucyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG4iXX0=
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { EMPTY } from 'rxjs';
|
|
2
|
-
import { ODataResource } from '../resource';
|
|
3
|
-
import { PathSegmentNames } from '../../types';
|
|
4
|
-
import { concatMap, expand, map, toArray } from 'rxjs/operators';
|
|
5
|
-
import { ODataActionResource } from './action';
|
|
6
|
-
import { ODataCountResource } from './count';
|
|
7
|
-
import { ODataEntityResource } from './entity';
|
|
8
|
-
import { ODataFunctionResource } from './function';
|
|
9
|
-
export class ODataEntitySetResource extends ODataResource {
|
|
10
|
-
//#region Factory
|
|
11
|
-
static factory(api, path, type, segments, query) {
|
|
12
|
-
const segment = segments.add(PathSegmentNames.entitySet, path);
|
|
13
|
-
if (type)
|
|
14
|
-
segment.type(type);
|
|
15
|
-
return new ODataEntitySetResource(api, segments, query);
|
|
16
|
-
}
|
|
17
|
-
clone() {
|
|
18
|
-
return new ODataEntitySetResource(this.api, this.cloneSegments(), this.cloneQuery());
|
|
19
|
-
}
|
|
20
|
-
//#endregion
|
|
21
|
-
schema() {
|
|
22
|
-
let type = this.type();
|
|
23
|
-
return type !== undefined
|
|
24
|
-
? this.api.findStructuredTypeForType(type)
|
|
25
|
-
: undefined;
|
|
26
|
-
}
|
|
27
|
-
asCollection(entities, { annots, reset = false, } = {}) {
|
|
28
|
-
const type = (annots === null || annots === void 0 ? void 0 : annots.type) || this.type();
|
|
29
|
-
const Collection = this.api.collectionForType(type);
|
|
30
|
-
return new Collection(entities, { resource: this, annots, reset });
|
|
31
|
-
}
|
|
32
|
-
entity(key) {
|
|
33
|
-
const entity = ODataEntityResource.factory(this.api, this.cloneSegments(), this.cloneQuery());
|
|
34
|
-
if (key !== undefined) {
|
|
35
|
-
return entity.key(key);
|
|
36
|
-
}
|
|
37
|
-
return entity;
|
|
38
|
-
}
|
|
39
|
-
cast(type) {
|
|
40
|
-
let segments = this.cloneSegments();
|
|
41
|
-
segments.add(PathSegmentNames.type, type).type(type);
|
|
42
|
-
return new ODataEntitySetResource(this.api, segments, this.cloneQuery());
|
|
43
|
-
}
|
|
44
|
-
action(path) {
|
|
45
|
-
let type;
|
|
46
|
-
const callable = this.api.findCallableForType(path, this.type());
|
|
47
|
-
if (callable !== undefined) {
|
|
48
|
-
path = callable.path();
|
|
49
|
-
type = callable.type();
|
|
50
|
-
}
|
|
51
|
-
return ODataActionResource.factory(this.api, path, type, this.cloneSegments(), this.cloneQuery());
|
|
52
|
-
}
|
|
53
|
-
function(path) {
|
|
54
|
-
let type;
|
|
55
|
-
const callable = this.api.findCallableForType(path, this.type());
|
|
56
|
-
if (callable !== undefined) {
|
|
57
|
-
path = callable.path();
|
|
58
|
-
type = callable.type();
|
|
59
|
-
}
|
|
60
|
-
return ODataFunctionResource.factory(this.api, path, type, this.cloneSegments(), this.cloneQuery());
|
|
61
|
-
}
|
|
62
|
-
count() {
|
|
63
|
-
return ODataCountResource.factory(this.api, this.cloneSegments(), this.cloneQuery());
|
|
64
|
-
}
|
|
65
|
-
//#region Requests
|
|
66
|
-
post(attrs, options = {}) {
|
|
67
|
-
return super.post(attrs, Object.assign({ responseType: 'entity' }, options));
|
|
68
|
-
}
|
|
69
|
-
get(options = {}) {
|
|
70
|
-
return super.get(Object.assign({ responseType: 'entities' }, options));
|
|
71
|
-
}
|
|
72
|
-
//#endregion
|
|
73
|
-
//#region Shortcuts
|
|
74
|
-
create(attrs, options) {
|
|
75
|
-
return this.post(attrs, options);
|
|
76
|
-
}
|
|
77
|
-
fetch(options) {
|
|
78
|
-
return this.get(options);
|
|
79
|
-
}
|
|
80
|
-
fetchEntities(options) {
|
|
81
|
-
return this.fetch(options).pipe(map(({ entities }) => entities));
|
|
82
|
-
}
|
|
83
|
-
fetchCollection(options) {
|
|
84
|
-
return this.fetch(options).pipe(map(({ entities, annots }) => entities
|
|
85
|
-
? this.asCollection(entities, { annots, reset: true })
|
|
86
|
-
: null));
|
|
87
|
-
}
|
|
88
|
-
fetchAll(options) {
|
|
89
|
-
let res = this.clone();
|
|
90
|
-
// Clean Paging
|
|
91
|
-
res.query((q) => q.clearPaging());
|
|
92
|
-
let fetch = (opts) => {
|
|
93
|
-
if (opts) {
|
|
94
|
-
res.query((q) => q.paging(opts));
|
|
95
|
-
}
|
|
96
|
-
return res.fetch(options);
|
|
97
|
-
};
|
|
98
|
-
return fetch().pipe(expand(({ annots: meta }) => meta.skip || meta.skiptoken ? fetch(meta) : EMPTY), concatMap(({ entities }) => entities || []), toArray());
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9yZXNvdXJjZXMvdHlwZXMvZW50aXR5LXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFvQixNQUFNLGFBQWEsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBS25ELE1BQU0sT0FBTyxzQkFBMEIsU0FBUSxhQUFnQjtJQUM3RCxpQkFBaUI7SUFDakIsTUFBTSxDQUFDLE9BQU8sQ0FDWixHQUFhLEVBQ2IsSUFBWSxFQUNaLElBQXdCLEVBQ3hCLFFBQTJCLEVBQzNCLEtBQTJCO1FBRTNCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELElBQUksSUFBSTtZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsT0FBTyxJQUFJLHNCQUFzQixDQUFJLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELEtBQUs7UUFDSCxPQUFPLElBQUksc0JBQXNC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T2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT0RhdGFSZXNvdXJjZSB9IGZyb20gJy4uL3Jlc291cmNlJztcbmltcG9ydCB7IE9EYXRhQ29sbGVjdGlvbiwgT0RhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuICBPRGF0YUVudGl0aWVzLFxuICBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gIE9EYXRhRW50aXR5LFxufSBmcm9tICcuLi9yZXNwb25zZXMnO1xuaW1wb3J0IHsgUGF0aFNlZ21lbnROYW1lcywgUXVlcnlPcHRpb25OYW1lcyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGNvbmNhdE1hcCwgZXhwYW5kLCBtYXAsIHRvQXJyYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE9EYXRhQWN0aW9uUmVzb3VyY2UgfSBmcm9tICcuL2FjdGlvbic7XG5pbXBvcnQgeyBPRGF0YUFwaSB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBPRGF0YUNvdW50UmVzb3VyY2UgfSBmcm9tICcuL2NvdW50JztcbmltcG9ydCB7IE9EYXRhRW50aXR5UmVzb3VyY2UgfSBmcm9tICcuL2VudGl0eSc7XG5pbXBvcnQgeyBPRGF0YUZ1bmN0aW9uUmVzb3VyY2UgfSBmcm9tICcuL2Z1bmN0aW9uJztcbmltcG9ydCB7IE9EYXRhT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBPRGF0YVBhdGhTZWdtZW50cyB9IGZyb20gJy4uL3BhdGgnO1xuaW1wb3J0IHsgT0RhdGFRdWVyeU9wdGlvbnMgfSBmcm9tICcuLi9xdWVyeSc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+IGV4dGVuZHMgT0RhdGFSZXNvdXJjZTxUPiB7XG4gIC8vI3JlZ2lvbiBGYWN0b3J5XG4gIHN0YXRpYyBmYWN0b3J5PEU+KFxuICAgIGFwaTogT0RhdGFBcGksXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzZWdtZW50czogT0RhdGFQYXRoU2VnbWVudHMsXG4gICAgcXVlcnk6IE9EYXRhUXVlcnlPcHRpb25zPEU+XG4gICkge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50cy5hZGQoUGF0aFNlZ21lbnROYW1lcy5lbnRpdHlTZXQsIHBhdGgpO1xuICAgIGlmICh0eXBlKSBzZWdtZW50LnR5cGUodHlwZSk7XG4gICAgcmV0dXJuIG5ldyBPRGF0YUVudGl0eVNldFJlc291cmNlPEU+KGFwaSwgc2VnbWVudHMsIHF1ZXJ5KTtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPihcbiAgICAgIHRoaXMuYXBpLFxuICAgICAgdGhpcy5jbG9uZVNlZ21lbnRzKCksXG4gICAgICB0aGlzLmNsb25lUXVlcnk8VD4oKVxuICAgICk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgc2NoZW1hKCkge1xuICAgIGxldCB0eXBlID0gdGhpcy50eXBlKCk7XG4gICAgcmV0dXJuIHR5cGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLmFwaS5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPFQ+KHR5cGUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzQ29sbGVjdGlvbjxNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPiwgQyBleHRlbmRzIE9EYXRhQ29sbGVjdGlvbjxULCBNPj4oXG4gICAgZW50aXRpZXM6IFBhcnRpYWw8VD5bXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10sXG4gICAge1xuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7IGFubm90cz86IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczsgcmVzZXQ/OiBib29sZWFuIH0gPSB7fVxuICApOiBDIHtcbiAgICBjb25zdCB0eXBlID0gYW5ub3RzPy50eXBlIHx8IHRoaXMudHlwZSgpO1xuICAgIGNvbnN0IENvbGxlY3Rpb24gPSB0aGlzLmFwaS5jb2xsZWN0aW9uRm9yVHlwZSh0eXBlKTtcbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24oZW50aXRpZXMsIHsgcmVzb3VyY2U6IHRoaXMsIGFubm90cywgcmVzZXQgfSkgYXMgQztcbiAgfVxuXG4gIGVudGl0eShrZXk/OiBhbnkpIHtcbiAgICBjb25zdCBlbnRpdHkgPSBPRGF0YUVudGl0eVJlc291cmNlLmZhY3Rvcnk8VD4oXG4gICAgICB0aGlzLmFwaSxcbiAgICAgIHRoaXMuY2xvbmVTZWdtZW50cygpLFxuICAgICAgdGhpcy5jbG9uZVF1ZXJ5PFQ+KClcbiAgICApO1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGVudGl0eS5rZXkoa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuXG4gIGNhc3Q8Qz4odHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IHNlZ21lbnRzID0gdGhpcy5jbG9uZVNlZ21lbnRzKCk7XG4gICAgc2VnbWVudHMuYWRkKFBhdGhTZWdtZW50TmFtZXMudHlwZSwgdHlwZSkudHlwZSh0eXBlKTtcbiAgICByZXR1cm4gbmV3IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8Qz4odGhpcy5hcGksIHNlZ21lbnRzLCB0aGlzLmNsb25lUXVlcnkoKSk7XG4gIH1cblxuICBhY3Rpb248UCwgUj4ocGF0aDogc3RyaW5nKSB7XG4gICAgbGV0IHR5cGU7XG4gICAgY29uc3QgY2FsbGFibGUgPSB0aGlzLmFwaS5maW5kQ2FsbGFibGVGb3JUeXBlKHBhdGgsIHRoaXMudHlwZSgpKTtcbiAgICBpZiAoY2FsbGFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGF0aCA9IGNhbGxhYmxlLnBhdGgoKTtcbiAgICAgIHR5cGUgPSBjYWxsYWJsZS50eXBlKCk7XG4gICAgfVxuICAgIHJldHVybiBPRGF0YUFjdGlvblJlc291cmNlLmZhY3Rvcnk8UCwgUj4oXG4gICAgICB0aGlzLmFwaSxcbiAgICAgIHBhdGgsXG4gICAgICB0eXBlLFxuICAgICAgdGhpcy5jbG9uZVNlZ21lbnRzKCksXG4gICAgICB0aGlzLmNsb25lUXVlcnk8Uj4oKVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbjxQLCBSPihwYXRoOiBzdHJpbmcpIHtcbiAgICBsZXQgdHlwZTtcbiAgICBjb25zdCBjYWxsYWJsZSA9IHRoaXMuYXBpLmZpbmRDYWxsYWJsZUZvclR5cGUocGF0aCwgdGhpcy50eXBlKCkpO1xuICAgIGlmIChjYWxsYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXRoID0gY2FsbGFibGUucGF0aCgpO1xuICAgICAgdHlwZSA9IGNhbGxhYmxlLnR5cGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIE9EYXRhRnVuY3Rpb25SZXNvdXJjZS5mYWN0b3J5PFAsIFI+KFxuICAgICAgdGhpcy5hcGksXG4gICAgICBwYXRoLFxuICAgICAgdHlwZSxcbiAgICAgIHRoaXMuY2xvbmVTZWdtZW50cygpLFxuICAgICAgdGhpcy5jbG9uZVF1ZXJ5PFI+KClcbiAgICApO1xuICB9XG5cbiAgY291bnQoKSB7XG4gICAgcmV0dXJuIE9EYXRhQ291bnRSZXNvdXJjZS5mYWN0b3J5PFQ+KFxuICAgICAgdGhpcy5hcGksXG4gICAgICB0aGlzLmNsb25lU2VnbWVudHMoKSxcbiAgICAgIHRoaXMuY2xvbmVRdWVyeTxUPigpXG4gICAgKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBSZXF1ZXN0c1xuICBwcm90ZWN0ZWQgcG9zdChcbiAgICBhdHRyczogUGFydGlhbDxUPixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgPSB7fVxuICApOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PFQ+PiB7XG4gICAgcmV0dXJuIHN1cGVyLnBvc3QoYXR0cnMsIHsgcmVzcG9uc2VUeXBlOiAnZW50aXR5JywgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQoXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbk5hbWVzW107XG4gICAgfSA9IHt9XG4gICk6IE9ic2VydmFibGU8T0RhdGFFbnRpdGllczxUPj4ge1xuICAgIHJldHVybiBzdXBlci5nZXQoeyByZXNwb25zZVR5cGU6ICdlbnRpdGllcycsIC4uLm9wdGlvbnMgfSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFNob3J0Y3V0c1xuICBjcmVhdGUoXG4gICAgYXR0cnM6IFBhcnRpYWw8VD4sXG4gICAgb3B0aW9ucz86IE9EYXRhT3B0aW9uc1xuICApOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucG9zdChhdHRycywgb3B0aW9ucyk7XG4gIH1cblxuICBmZXRjaChcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zICYge1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbk5hbWVzW107XG4gICAgfVxuICApOiBPYnNlcnZhYmxlPE9EYXRhRW50aXRpZXM8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQob3B0aW9ucyk7XG4gIH1cblxuICBmZXRjaEVudGl0aWVzKFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uTmFtZXNbXTtcbiAgICB9XG4gICk6IE9ic2VydmFibGU8VFtdIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmZldGNoKG9wdGlvbnMpLnBpcGUobWFwKCh7IGVudGl0aWVzIH0pID0+IGVudGl0aWVzKSk7XG4gIH1cblxuICBmZXRjaENvbGxlY3Rpb248TSBleHRlbmRzIE9EYXRhTW9kZWw8VD4sIEMgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248VCwgTT4+KFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uTmFtZXNbXTtcbiAgICB9XG4gICk6IE9ic2VydmFibGU8T0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+IHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmZldGNoKG9wdGlvbnMpLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PlxuICAgICAgICBlbnRpdGllc1xuICAgICAgICAgID8gdGhpcy5hc0NvbGxlY3Rpb248TSwgQz4oZW50aXRpZXMsIHsgYW5ub3RzLCByZXNldDogdHJ1ZSB9KVxuICAgICAgICAgIDogbnVsbFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBmZXRjaEFsbChcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uTmFtZXNbXTtcbiAgICB9XG4gICk6IE9ic2VydmFibGU8VFtdPiB7XG4gICAgbGV0IHJlcyA9IHRoaXMuY2xvbmUoKTtcbiAgICAvLyBDbGVhbiBQYWdpbmdcbiAgICByZXMucXVlcnkoKHEpID0+IHEuY2xlYXJQYWdpbmcoKSk7XG4gICAgbGV0IGZldGNoID0gKG9wdHM/OiB7XG4gICAgICBza2lwPzogbnVtYmVyO1xuICAgICAgc2tpcHRva2VuPzogc3RyaW5nO1xuICAgICAgdG9wPzogbnVtYmVyO1xuICAgIH0pOiBPYnNlcnZhYmxlPE9EYXRhRW50aXRpZXM8VD4+ID0+IHtcbiAgICAgIGlmIChvcHRzKSB7XG4gICAgICAgIHJlcy5xdWVyeSgocSkgPT4gcS5wYWdpbmcob3B0cykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5mZXRjaChvcHRpb25zKTtcbiAgICB9O1xuICAgIHJldHVybiBmZXRjaCgpLnBpcGUoXG4gICAgICBleHBhbmQoKHsgYW5ub3RzOiBtZXRhIH0pID0+XG4gICAgICAgIG1ldGEuc2tpcCB8fCBtZXRhLnNraXB0b2tlbiA/IGZldGNoKG1ldGEpIDogRU1QVFlcbiAgICAgICksXG4gICAgICBjb25jYXRNYXAoKHsgZW50aXRpZXMgfSkgPT4gZW50aXRpZXMgfHwgW10pLFxuICAgICAgdG9BcnJheSgpXG4gICAgKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==
|