angular-odata 0.128.0 → 0.131.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/README.md +27 -244
- package/fesm2022/angular-odata.mjs +2320 -1118
- package/fesm2022/angular-odata.mjs.map +1 -1
- package/lib/api.d.ts +10 -11
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/memory.d.ts +2 -2
- package/lib/cache/storage.d.ts +2 -2
- package/lib/index.d.ts +1 -0
- package/lib/loaders.d.ts +8 -8
- package/lib/metadata/csdl/csdl-annotation.d.ts +62 -26
- package/lib/metadata/csdl/csdl-entity-container.d.ts +8 -3
- package/lib/metadata/csdl/csdl-entity-set.d.ts +7 -2
- package/lib/metadata/csdl/csdl-enum-type.d.ts +11 -3
- package/lib/metadata/csdl/csdl-function-action.d.ts +54 -11
- package/lib/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
- package/lib/metadata/csdl/csdl-reference.d.ts +26 -3
- package/lib/metadata/csdl/csdl-schema.d.ts +5 -2
- package/lib/metadata/csdl/csdl-singleton.d.ts +5 -0
- package/lib/metadata/csdl/csdl-structural-property.d.ts +19 -3
- package/lib/metadata/csdl/csdl-structured-type.d.ts +28 -7
- package/lib/metadata/csdl/csdl-type-definition.d.ts +3 -0
- package/lib/metadata/metadata.d.ts +16 -3
- package/lib/models/collection.d.ts +2 -1
- package/lib/models/model.d.ts +6 -5
- package/lib/models/options.d.ts +11 -4
- package/lib/module.d.ts +3 -3
- package/lib/options.d.ts +3 -3
- package/lib/resources/path/segments.d.ts +3 -3
- package/lib/resources/query/builder.d.ts +3 -2
- package/lib/resources/query/expressions/apply.d.ts +1 -1
- package/lib/resources/query/expressions/compute.d.ts +1 -1
- package/lib/resources/query/expressions/count.d.ts +1 -1
- package/lib/resources/query/expressions/expand.d.ts +5 -2
- package/lib/resources/query/expressions/filter.d.ts +2 -1
- package/lib/resources/query/expressions/orderby.d.ts +2 -1
- package/lib/resources/query/expressions/search.d.ts +2 -1
- package/lib/resources/query/expressions/select.d.ts +2 -1
- package/lib/resources/query/expressions/syntax.d.ts +2 -2
- package/lib/resources/query/handlers.d.ts +17 -5
- package/lib/resources/query/options.d.ts +3 -3
- package/lib/resources/resource.d.ts +36 -8
- package/lib/resources/types/action.d.ts +4 -4
- package/lib/resources/types/entity-set.d.ts +15 -8
- package/lib/resources/types/entity.d.ts +5 -1
- package/lib/resources/types/function.d.ts +4 -4
- package/lib/resources/types/navigation-property.d.ts +12 -3
- package/lib/resources/types/property.d.ts +14 -3
- package/lib/resources/types/singleton.d.ts +5 -1
- package/lib/schema/annotation.d.ts +3 -3
- package/lib/schema/callable.d.ts +3 -3
- package/lib/schema/element.d.ts +3 -3
- package/lib/schema/entity-container.d.ts +2 -2
- package/lib/schema/entity-set.d.ts +2 -2
- package/lib/schema/enum-type.d.ts +10 -10
- package/lib/schema/parsers/callable.d.ts +4 -4
- package/lib/schema/parsers/enum-type.d.ts +15 -15
- package/lib/schema/parsers/structured-type.d.ts +8 -5
- package/lib/schema/schema.d.ts +3 -3
- package/lib/schema/singleton.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +7 -4
- package/lib/services/entity-set.d.ts +9 -6
- package/lib/services/entity.d.ts +1 -1
- package/lib/services/singleton.d.ts +1 -1
- package/lib/settings.d.ts +2 -2
- package/lib/types.d.ts +82 -69
- package/lib/utils/enums.d.ts +12 -12
- package/lib/utils/http.d.ts +1 -1
- package/lib/utils/objects.d.ts +1 -1
- package/lib/utils/odata.d.ts +2 -2
- package/lib/utils/strings.d.ts +2 -2
- package/package.json +3 -5
- package/schematics/apigen/angular/api-config.js +7 -1
- package/schematics/apigen/angular/api-config.js.map +1 -1
- package/schematics/apigen/angular/base.d.ts +22 -2
- package/schematics/apigen/angular/base.js +82 -42
- package/schematics/apigen/angular/base.js.map +1 -1
- package/schematics/apigen/angular/entity.js +7 -1
- package/schematics/apigen/angular/entity.js.map +1 -1
- package/schematics/apigen/angular/enum.js +1 -0
- package/schematics/apigen/angular/enum.js.map +1 -1
- package/schematics/apigen/angular/module.js.map +1 -1
- package/schematics/apigen/angular/service.js +3 -2
- package/schematics/apigen/angular/service.js.map +1 -1
- package/schematics/apigen/files/api-config/__fileName__.ts +8 -6
- package/schematics/apigen/files/entity/__fileName__.ts +2 -2
- package/schematics/apigen/files/entitycontainer-service/__fileName__.ts +1 -1
- package/schematics/apigen/files/entityset-service/__fileName__.ts +1 -1
- package/schematics/apigen/files/enum/__fileName__.ts +1 -1
- package/schematics/apigen/files/metadata/metadata.json +1 -0
- package/schematics/apigen/files/singleton-service/__fileName__.ts +1 -1
- package/schematics/apigen/index.js +56 -12
- package/schematics/apigen/index.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-annotation.d.ts +56 -23
- package/schematics/apigen/metadata/csdl/csdl-annotation.js +143 -13
- package/schematics/apigen/metadata/csdl/csdl-annotation.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-entity-container.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js +19 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-entity-set.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js +11 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-enum-type.d.ts +6 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js +17 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-function-action.d.ts +37 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js +52 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js +6 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-reference.d.ts +15 -3
- package/schematics/apigen/metadata/csdl/csdl-reference.js +26 -2
- package/schematics/apigen/metadata/csdl/csdl-reference.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-schema.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js +37 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-singleton.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js +8 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-structural-property.d.ts +16 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js +53 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-structured-type.d.ts +22 -3
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js +47 -2
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-type-definition.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js +19 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js.map +1 -1
- package/schematics/apigen/metadata/metadata.d.ts +10 -0
- package/schematics/apigen/metadata/metadata.js +12 -6
- package/schematics/apigen/metadata/metadata.js.map +1 -1
- package/schematics/apigen/metadata/parser.js.map +1 -1
- package/schematics/apigen/schema.d.ts +2 -1
- package/schematics/apigen/schema.json +15 -14
- package/schematics/apigen/utils.d.ts +1 -0
- package/schematics/apigen/utils.js +25 -1
- package/schematics/apigen/utils.js.map +1 -1
- package/schematics/ng-add/index.js +1 -2
- package/schematics/ng-add/index.js.map +1 -1
- package/esm2022/angular-odata.mjs +0 -5
- package/esm2022/lib/annotations.mjs +0 -140
- package/esm2022/lib/api.mjs +0 -419
- package/esm2022/lib/cache/cache.mjs +0 -175
- package/esm2022/lib/cache/index.mjs +0 -4
- package/esm2022/lib/cache/memory.mjs +0 -30
- package/esm2022/lib/cache/storage.mjs +0 -55
- package/esm2022/lib/client.mjs +0 -212
- package/esm2022/lib/constants.mjs +0 -95
- package/esm2022/lib/helper.mjs +0 -280
- package/esm2022/lib/index.mjs +0 -21
- package/esm2022/lib/loaders.mjs +0 -39
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -95
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -27
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -24
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -37
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -94
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -7
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -23
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -39
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -15
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -70
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -92
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -15
- package/esm2022/lib/metadata/index.mjs +0 -3
- package/esm2022/lib/metadata/metadata.mjs +0 -14
- package/esm2022/lib/metadata/parser.mjs +0 -563
- package/esm2022/lib/models/collection.mjs +0 -814
- package/esm2022/lib/models/index.mjs +0 -4
- package/esm2022/lib/models/model.mjs +0 -553
- package/esm2022/lib/models/options.mjs +0 -1179
- package/esm2022/lib/module.mjs +0 -55
- package/esm2022/lib/options.mjs +0 -36
- package/esm2022/lib/resources/index.mjs +0 -7
- package/esm2022/lib/resources/options.mjs +0 -56
- package/esm2022/lib/resources/path/handlers.mjs +0 -79
- package/esm2022/lib/resources/path/index.mjs +0 -3
- package/esm2022/lib/resources/path/segments.mjs +0 -148
- package/esm2022/lib/resources/query/builder.mjs +0 -636
- package/esm2022/lib/resources/query/expressions/apply.mjs +0 -236
- package/esm2022/lib/resources/query/expressions/base.mjs +0 -25
- package/esm2022/lib/resources/query/expressions/compute.mjs +0 -54
- package/esm2022/lib/resources/query/expressions/count.mjs +0 -116
- package/esm2022/lib/resources/query/expressions/expand.mjs +0 -147
- package/esm2022/lib/resources/query/expressions/filter.mjs +0 -178
- package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
- package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -79
- package/esm2022/lib/resources/query/expressions/search.mjs +0 -141
- package/esm2022/lib/resources/query/expressions/select.mjs +0 -47
- package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -751
- package/esm2022/lib/resources/query/handlers.mjs +0 -420
- package/esm2022/lib/resources/query/index.mjs +0 -5
- package/esm2022/lib/resources/query/options.mjs +0 -139
- package/esm2022/lib/resources/request.mjs +0 -196
- package/esm2022/lib/resources/resource.mjs +0 -311
- package/esm2022/lib/resources/response.mjs +0 -174
- package/esm2022/lib/resources/types/action.mjs +0 -116
- package/esm2022/lib/resources/types/batch.mjs +0 -428
- package/esm2022/lib/resources/types/count.mjs +0 -33
- package/esm2022/lib/resources/types/entity-set.mjs +0 -131
- package/esm2022/lib/resources/types/entity.mjs +0 -112
- package/esm2022/lib/resources/types/function.mjs +0 -146
- package/esm2022/lib/resources/types/index.mjs +0 -15
- package/esm2022/lib/resources/types/media.mjs +0 -44
- package/esm2022/lib/resources/types/metadata.mjs +0 -35
- package/esm2022/lib/resources/types/navigation-property.mjs +0 -256
- package/esm2022/lib/resources/types/options.mjs +0 -2
- package/esm2022/lib/resources/types/property.mjs +0 -197
- package/esm2022/lib/resources/types/reference.mjs +0 -87
- package/esm2022/lib/resources/types/singleton.mjs +0 -130
- package/esm2022/lib/resources/types/value.mjs +0 -48
- package/esm2022/lib/schema/annotation.mjs +0 -37
- package/esm2022/lib/schema/callable.mjs +0 -66
- package/esm2022/lib/schema/element.mjs +0 -67
- package/esm2022/lib/schema/entity-container.mjs +0 -11
- package/esm2022/lib/schema/entity-set.mjs +0 -9
- package/esm2022/lib/schema/enum-type.mjs +0 -68
- package/esm2022/lib/schema/index.mjs +0 -9
- package/esm2022/lib/schema/parsers/callable.mjs +0 -110
- package/esm2022/lib/schema/parsers/edm.mjs +0 -101
- package/esm2022/lib/schema/parsers/enum-type.mjs +0 -130
- package/esm2022/lib/schema/parsers/index.mjs +0 -5
- package/esm2022/lib/schema/parsers/structured-type.mjs +0 -514
- package/esm2022/lib/schema/schema.mjs +0 -45
- package/esm2022/lib/schema/singleton.mjs +0 -9
- package/esm2022/lib/schema/structured-type.mjs +0 -213
- package/esm2022/lib/services/base.mjs +0 -29
- package/esm2022/lib/services/entity-set.mjs +0 -155
- package/esm2022/lib/services/entity.mjs +0 -12
- package/esm2022/lib/services/factory.mjs +0 -44
- package/esm2022/lib/services/index.mjs +0 -5
- package/esm2022/lib/services/singleton.mjs +0 -54
- package/esm2022/lib/settings.mjs +0 -112
- package/esm2022/lib/types.mjs +0 -118
- package/esm2022/lib/utils/arraybuffers.mjs +0 -46
- package/esm2022/lib/utils/arrays.mjs +0 -10
- package/esm2022/lib/utils/dates.mjs +0 -18
- package/esm2022/lib/utils/durations.mjs +0 -40
- package/esm2022/lib/utils/enums.mjs +0 -61
- package/esm2022/lib/utils/http.mjs +0 -95
- package/esm2022/lib/utils/index.mjs +0 -10
- package/esm2022/lib/utils/objects.mjs +0 -204
- package/esm2022/lib/utils/odata.mjs +0 -22
- package/esm2022/lib/utils/strings.mjs +0 -20
- package/esm2022/lib/utils/types.mjs +0 -136
- package/esm2022/lib/utils/urls.mjs +0 -24
- package/esm2022/public-api.mjs +0 -5
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { QueryOption } from '../../types';
|
|
2
|
-
import { Objects, Types } from '../../utils';
|
|
3
|
-
import { buildPathAndQuery, raw, } from './builder';
|
|
4
|
-
import { RenderableFactory, } from './expressions';
|
|
5
|
-
import { ODataQueryOptionHandler } from './handlers';
|
|
6
|
-
// Create a path and params tuple from the query options
|
|
7
|
-
export const pathAndParamsFromQueryOptions = (values, { escape, parser, options, } = {}) => {
|
|
8
|
-
const aliases = [];
|
|
9
|
-
const queryOptions = [
|
|
10
|
-
QueryOption.select,
|
|
11
|
-
QueryOption.filter,
|
|
12
|
-
QueryOption.search,
|
|
13
|
-
QueryOption.compute,
|
|
14
|
-
QueryOption.apply,
|
|
15
|
-
QueryOption.transform,
|
|
16
|
-
QueryOption.orderBy,
|
|
17
|
-
QueryOption.top,
|
|
18
|
-
QueryOption.skip,
|
|
19
|
-
QueryOption.skiptoken,
|
|
20
|
-
QueryOption.expand,
|
|
21
|
-
QueryOption.format,
|
|
22
|
-
QueryOption.levels,
|
|
23
|
-
QueryOption.count,
|
|
24
|
-
]
|
|
25
|
-
.filter((key) => values.has(key) && !Types.isEmpty(values.get(key)))
|
|
26
|
-
.reduce((acc, key) => {
|
|
27
|
-
let value = values.get(key);
|
|
28
|
-
if (Types.rawType(value).endsWith('Expression') ||
|
|
29
|
-
(Types.isArray(value) &&
|
|
30
|
-
value.some((v) => Types.rawType(v).endsWith('Expression')))) {
|
|
31
|
-
value = Types.isArray(value)
|
|
32
|
-
? value.map((v) => Types.rawType(v).endsWith('Expression')
|
|
33
|
-
? raw(v.render({ aliases, escape, parser, options }))
|
|
34
|
-
: v)
|
|
35
|
-
: raw(value.render({
|
|
36
|
-
aliases,
|
|
37
|
-
escape,
|
|
38
|
-
parser,
|
|
39
|
-
options,
|
|
40
|
-
}));
|
|
41
|
-
}
|
|
42
|
-
return Object.assign(acc, { [key]: value });
|
|
43
|
-
}, {});
|
|
44
|
-
return buildPathAndQuery({ ...queryOptions, aliases, escape });
|
|
45
|
-
};
|
|
46
|
-
export class ODataQueryOptions {
|
|
47
|
-
constructor(values) {
|
|
48
|
-
this._values = values ?? new Map();
|
|
49
|
-
}
|
|
50
|
-
pathAndParams({ escape, parser, options, } = {}) {
|
|
51
|
-
return pathAndParamsFromQueryOptions(this._values, {
|
|
52
|
-
escape,
|
|
53
|
-
parser,
|
|
54
|
-
options,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
toString({ escape, parser, } = {}) {
|
|
58
|
-
const [path, params] = this.pathAndParams({ escape, parser });
|
|
59
|
-
return (path +
|
|
60
|
-
Object.entries(params)
|
|
61
|
-
.filter(([, value]) => !Types.isEmpty(value))
|
|
62
|
-
.map(([key, value]) => `${key}=${value}`)
|
|
63
|
-
.join('&'));
|
|
64
|
-
}
|
|
65
|
-
toJson() {
|
|
66
|
-
return [...this._values.keys()].reduce((acc, key) => {
|
|
67
|
-
let value = this._values.get(key);
|
|
68
|
-
value = 'toJson' in value ? value.toJson() : value;
|
|
69
|
-
return Object.assign(acc, { [key]: value });
|
|
70
|
-
}, {});
|
|
71
|
-
}
|
|
72
|
-
fromJson(json) {
|
|
73
|
-
Object.entries(json || {}).forEach(([key, value]) => {
|
|
74
|
-
this._values.set(key, RenderableFactory(value));
|
|
75
|
-
});
|
|
76
|
-
return this;
|
|
77
|
-
}
|
|
78
|
-
static fromJson(json) {
|
|
79
|
-
const entries = Object.entries(json || {}).map(([key, value]) => [
|
|
80
|
-
key,
|
|
81
|
-
RenderableFactory(value),
|
|
82
|
-
]);
|
|
83
|
-
new Map(entries);
|
|
84
|
-
return new ODataQueryOptions(new Map(entries));
|
|
85
|
-
}
|
|
86
|
-
toQueryArguments() {
|
|
87
|
-
return {
|
|
88
|
-
select: this._values.get(QueryOption.select) ?? null,
|
|
89
|
-
expand: this._values.get(QueryOption.expand) ?? null,
|
|
90
|
-
transform: this._values.get(QueryOption.transform) ?? null,
|
|
91
|
-
compute: this._values.get(QueryOption.compute) ?? null,
|
|
92
|
-
apply: this._values.get(QueryOption.apply) ?? null,
|
|
93
|
-
search: this._values.get(QueryOption.search) ?? null,
|
|
94
|
-
filter: this._values.get(QueryOption.filter) ?? null,
|
|
95
|
-
orderBy: this._values.get(QueryOption.orderBy) ?? null,
|
|
96
|
-
top: this._values.get(QueryOption.top) ?? null,
|
|
97
|
-
skip: this._values.get(QueryOption.skip) ?? null,
|
|
98
|
-
skiptoken: this._values.get(QueryOption.skiptoken) ?? null,
|
|
99
|
-
levels: this._values.get(QueryOption.levels) ?? null,
|
|
100
|
-
count: this._values.get(QueryOption.count) ?? null,
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
clone() {
|
|
104
|
-
return new ODataQueryOptions(Objects.clone(this._values));
|
|
105
|
-
}
|
|
106
|
-
// Set Renderable
|
|
107
|
-
expression(key, exp) {
|
|
108
|
-
if (exp !== undefined)
|
|
109
|
-
this._values.set(key, exp);
|
|
110
|
-
return this._values.get(key);
|
|
111
|
-
}
|
|
112
|
-
// Option Handler
|
|
113
|
-
option(key, opts) {
|
|
114
|
-
if (opts !== undefined)
|
|
115
|
-
this._values.set(key, opts);
|
|
116
|
-
return new ODataQueryOptionHandler(this._values, key);
|
|
117
|
-
}
|
|
118
|
-
// Query Options tools
|
|
119
|
-
has(key) {
|
|
120
|
-
return this._values.has(key);
|
|
121
|
-
}
|
|
122
|
-
remove(...keys) {
|
|
123
|
-
for (let key of this._values.keys()) {
|
|
124
|
-
if (keys.includes(key))
|
|
125
|
-
this._values.delete(key);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
keep(...keys) {
|
|
129
|
-
for (let key of this._values.keys()) {
|
|
130
|
-
if (!keys.includes(key))
|
|
131
|
-
this._values.delete(key);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
// Clear
|
|
135
|
-
clear() {
|
|
136
|
-
this._values.clear();
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9yZXNvdXJjZXMvcXVlcnkvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXlCLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsaUJBQWlCLEVBS2pCLEdBQUcsR0FHSixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBS0wsaUJBQWlCLEdBRWxCLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQW1CckQsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQzNDLE1BQTZCLEVBQzdCLEVBQ0UsTUFBTSxFQUNOLE1BQU0sRUFDTixPQUFPLE1BQzhELEVBQUUsRUFDdEMsRUFBRTtJQUNyQyxNQUFNLE9BQU8sR0FBc0IsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sWUFBWSxHQUFHO1FBQ25CLFdBQVcsQ0FBQyxNQUFNO1FBQ2xCLFdBQVcsQ0FBQyxNQUFNO1FBQ2xCLFdBQVcsQ0FBQyxNQUFNO1FBQ2xCLFdBQVcsQ0FBQyxPQUFPO1FBQ25CLFdBQVcsQ0FBQyxLQUFLO1FBQ2pCLFdBQVcsQ0FBQyxTQUFTO1FBQ3JCLFdBQVcsQ0FBQyxPQUFPO1FBQ25CLFdBQVcsQ0FBQyxHQUFHO1FBQ2YsV0FBVyxDQUFDLElBQUk7UUFDaEIsV0FBVyxDQUFDLFNBQVM7UUFDckIsV0FBVyxDQUFDLE1BQU07UUFDbEIsV0FBVyxDQUFDLE1BQU07UUFDbEIsV0FBVyxDQUFDLE1BQU07UUFDbEIsV0FBVyxDQUFDLEtBQUs7S0FDbEI7U0FDRSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxD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QUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxHQUFHLElBQW1CO1FBQ3pCLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbkQ7SUFDSCxDQUFDO0lBRUQsUUFBUTtJQUNSLEtBQUs7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhcnNlciwgUGFyc2VyT3B0aW9ucywgUXVlcnlPcHRpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBPYmplY3RzLCBUeXBlcyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIGJ1aWxkUGF0aEFuZFF1ZXJ5LFxuICBFeHBhbmQsXG4gIEZpbHRlcixcbiAgT3JkZXJCeSxcbiAgUXVlcnlDdXN0b21UeXBlLFxuICByYXcsXG4gIFNlbGVjdCxcbiAgVHJhbnNmb3JtLFxufSBmcm9tICcuL2J1aWxkZXInO1xuaW1wb3J0IHtcbiAgQ29tcHV0ZUV4cHJlc3Npb24sXG4gIEV4cHJlc3Npb24sXG4gIEZpbHRlckV4cHJlc3Npb24sXG4gIE9yZGVyQnlFeHByZXNzaW9uLFxuICBSZW5kZXJhYmxlRmFjdG9yeSxcbiAgU2VhcmNoRXhwcmVzc2lvbixcbn0gZnJvbSAnLi9leHByZXNzaW9ucyc7XG5pbXBvcnQgeyBBcHBseUV4cHJlc3Npb24gfSBmcm9tICcuL2V4cHJlc3Npb25zL2FwcGx5JztcbmltcG9ydCB7IEV4cGFuZEV4cHJlc3Npb24gfSBmcm9tICcuL2V4cHJlc3Npb25zL2V4cGFuZCc7XG5pbXBvcnQgeyBTZWxlY3RFeHByZXNzaW9uIH0gZnJvbSAnLi9leHByZXNzaW9ucy9zZWxlY3QnO1xuaW1wb3J0IHsgT0RhdGFRdWVyeU9wdGlvbkhhbmRsZXIgfSBmcm9tICcuL2hhbmRsZXJzJztcblxuZXhwb3J0IHR5cGUgT0RhdGFRdWVyeUFyZ3VtZW50czxUPiA9IHtcbiAgW1F1ZXJ5T3B0aW9uLnNlbGVjdF0/OiBTZWxlY3Q8VD4gfCBTZWxlY3RFeHByZXNzaW9uPFQ+IHwgbnVsbDtcbiAgW1F1ZXJ5T3B0aW9uLmV4cGFuZF0/OiBFeHBhbmQ8VD4gfCBFeHBhbmRFeHByZXNzaW9uPFQ+IHwgbnVsbDtcbiAgW1F1ZXJ5T3B0aW9uLmNvbXB1dGVdPzogc3RyaW5nIHwgQ29tcHV0ZUV4cHJlc3Npb248VD4gfCBudWxsO1xuICBbUXVlcnlPcHRpb24uYXBwbHldPzogc3RyaW5nIHwgQXBwbHlFeHByZXNzaW9uPFQ+IHwgbnVsbDtcbiAgW1F1ZXJ5T3B0aW9uLmZpbHRlcl0/OiBGaWx0ZXI8VD4gfCBGaWx0ZXJFeHByZXNzaW9uPFQ+IHwgbnVsbDtcbiAgW1F1ZXJ5T3B0aW9uLnNlYXJjaF0/OiBzdHJpbmcgfCBTZWFyY2hFeHByZXNzaW9uPFQ+IHwgbnVsbDtcbiAgW1F1ZXJ5T3B0aW9uLnRyYW5zZm9ybV0/OiBUcmFuc2Zvcm08VD4gfCBudWxsO1xuICBbUXVlcnlPcHRpb24ub3JkZXJCeV0/OiBPcmRlckJ5PFQ+IHwgT3JkZXJCeUV4cHJlc3Npb248VD4gfCBudWxsO1xuICBbUXVlcnlPcHRpb24udG9wXT86IG51bWJlciB8IG51bGw7XG4gIFtRdWVyeU9wdGlvbi5za2lwXT86IG51bWJlciB8IG51bGw7XG4gIFtRdWVyeU9wdGlvbi5za2lwdG9rZW5dPzogc3RyaW5nIHwgbnVsbDtcbiAgW1F1ZXJ5T3B0aW9uLmZvcm1hdF0/OiBzdHJpbmcgfCBudWxsO1xuICBbUXVlcnlPcHRpb24ubGV2ZWxzXT86IG51bWJlciB8ICdtYXgnIHwgbnVsbDtcbiAgW1F1ZXJ5T3B0aW9uLmNvdW50XT86IGJvb2xlYW4gfCBudWxsO1xufTtcblxuLy8gQ3JlYXRlIGEgcGF0aCBhbmQgcGFyYW1zIHR1cGxlIGZyb20gdGhlIHF1ZXJ5IG9wdGlvbnNcbmV4cG9ydCBjb25zdCBwYXRoQW5kUGFyYW1zRnJvbVF1ZXJ5T3B0aW9ucyA9IDxUPihcbiAgdmFsdWVzOiBNYXA8UXVlcnlPcHRpb24sIGFueT4sXG4gIHtcbiAgICBlc2NhcGUsXG4gICAgcGFyc2VyLFxuICAgIG9wdGlvbnMsXG4gIH06IHsgZXNjYXBlPzogYm9vbGVhbjsgcGFyc2VyPzogUGFyc2VyPFQ+OyBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyB9ID0ge30sXG4pOiBbc3RyaW5nLCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfV0gPT4ge1xuICBjb25zdCBhbGlhc2VzOiBRdWVyeUN1c3RvbVR5cGVbXSA9IFtdO1xuICBjb25zdCBxdWVyeU9wdGlvbnMgPSBbXG4gICAgUXVlcnlPcHRpb24uc2VsZWN0LFxuICAgIFF1ZXJ5T3B0aW9uLmZpbHRlcixcbiAgICBRdWVyeU9wdGlvbi5zZWFyY2gsXG4gICAgUXVlcnlPcHRpb24uY29tcHV0ZSxcbiAgICBRdWVyeU9wdGlvbi5hcHBseSxcbiAgICBRdWVyeU9wdGlvbi50cmFuc2Zvcm0sXG4gICAgUXVlcnlPcHRpb24ub3JkZXJCeSxcbiAgICBRdWVyeU9wdGlvbi50b3AsXG4gICAgUXVlcnlPcHRpb24uc2tpcCxcbiAgICBRdWVyeU9wdGlvbi5za2lwdG9rZW4sXG4gICAgUXVlcnlPcHRpb24uZXhwYW5kLFxuICAgIFF1ZXJ5T3B0aW9uLmZvcm1hdCxcbiAgICBRdWVyeU9wdGlvbi5sZXZlbHMsXG4gICAgUXVlcnlPcHRpb24uY291bnQsXG4gIF1cbiAgICAuZmlsdGVyKChrZXkpID0+IHZhbHVlcy5oYXMoa2V5KSAmJiAhVHlwZXMuaXNFbXB0eSh2YWx1ZXMuZ2V0KGtleSkpKVxuICAgIC5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSB2YWx1ZXMuZ2V0KGtleSk7XG4gICAgICBpZiAoXG4gICAgICAgIFR5cGVzLnJhd1R5cGUodmFsdWUpLmVuZHNXaXRoKCdFeHByZXNzaW9uJykgfHxcbiAgICAgICAgKFR5cGVzLmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgdmFsdWUuc29tZSgodjogYW55KSA9PiBUeXBlcy5yYXdUeXBlKHYpLmVuZHNXaXRoKCdFeHByZXNzaW9uJykpKVxuICAgICAgKSB7XG4gICAgICAgIHZhbHVlID0gVHlwZXMuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IHZhbHVlLm1hcCgodjogRXhwcmVzc2lvbjxUPikgPT5cbiAgICAgICAgICAgICAgVHlwZXMucmF3VHlwZSh2KS5lbmRzV2l0aCgnRXhwcmVzc2lvbicpXG4gICAgICAgICAgICAgICAgPyByYXcodi5yZW5kZXIoeyBhbGlhc2VzLCBlc2NhcGUsIHBhcnNlciwgb3B0aW9ucyB9KSlcbiAgICAgICAgICAgICAgICA6IHYsXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiByYXcoXG4gICAgICAgICAgICAgICh2YWx1ZSBhcyBFeHByZXNzaW9uPFQ+KS5yZW5kZXIoe1xuICAgICAgICAgICAgICAgIGFsaWFzZXMsXG4gICAgICAgICAgICAgICAgZXNjYXBlLFxuICAgICAgICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2tleV06IHZhbHVlIH0pO1xuICAgIH0sIHt9KTtcbiAgcmV0dXJuIGJ1aWxkUGF0aEFuZFF1ZXJ5PGFueT4oeyAuLi5xdWVyeU9wdGlvbnMsIGFsaWFzZXMsIGVzY2FwZSB9KTtcbn07XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVF1ZXJ5T3B0aW9uczxUPiB7XG4gIHByaXZhdGUgX3ZhbHVlczogTWFwPFF1ZXJ5T3B0aW9uLCBhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlcz86IE1hcDxRdWVyeU9wdGlvbiwgYW55Pikge1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcyA/PyBuZXcgTWFwPFF1ZXJ5T3B0aW9uLCBhbnk+KCk7XG4gIH1cblxuICBwYXRoQW5kUGFyYW1zKHtcbiAgICBlc2NhcGUsXG4gICAgcGFyc2VyLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgICBvcHRpb25zPzogUGFyc2VyT3B0aW9ucztcbiAgfSA9IHt9KTogW3N0cmluZywgeyBbbmFtZTogc3RyaW5nXTogYW55IH1dIHtcbiAgICByZXR1cm4gcGF0aEFuZFBhcmFtc0Zyb21RdWVyeU9wdGlvbnM8VD4odGhpcy5fdmFsdWVzLCB7XG4gICAgICBlc2NhcGUsXG4gICAgICBwYXJzZXIsXG4gICAgICBvcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgdG9TdHJpbmcoe1xuICAgIGVzY2FwZSxcbiAgICBwYXJzZXIsXG4gIH06IHsgZXNjYXBlPzogYm9vbGVhbjsgcGFyc2VyPzogUGFyc2VyPFQ+IH0gPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgW3BhdGgsIHBhcmFtc10gPSB0aGlzLnBhdGhBbmRQYXJhbXMoeyBlc2NhcGUsIHBhcnNlciB9KTtcbiAgICByZXR1cm4gKFxuICAgICAgcGF0aCArXG4gICAgICBPYmplY3QuZW50cmllcyhwYXJhbXMpXG4gICAgICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIVR5cGVzLmlzRW1wdHkodmFsdWUpKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX09JHt2YWx1ZX1gKVxuICAgICAgICAuam9pbignJicpXG4gICAgKTtcbiAgfVxuXG4gIHRvSnNvbigpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3ZhbHVlcy5rZXlzKCldLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoa2V5KTtcbiAgICAgIHZhbHVlID0gJ3RvSnNvbicgaW4gdmFsdWUgPyB2YWx1ZS50b0pzb24oKSA6IHZhbHVlO1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrZXldOiB2YWx1ZSB9KTtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBmcm9tSnNvbjxUPihqc29uOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSk6IHRoaXMge1xuICAgIE9iamVjdC5lbnRyaWVzKGpzb24gfHwge30pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChrZXkgYXMgUXVlcnlPcHRpb24sIFJlbmRlcmFibGVGYWN0b3J5KHZhbHVlKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZnJvbUpzb248VD4oanNvbjogeyBbbmFtZTogc3RyaW5nXTogYW55IH0pOiBPRGF0YVF1ZXJ5T3B0aW9uczxUPiB7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGpzb24gfHwge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICBrZXksXG4gICAgICBSZW5kZXJhYmxlRmFjdG9yeSh2YWx1ZSksXG4gICAgXSkgYXMgW1F1ZXJ5T3B0aW9uLCBhbnldW107XG4gICAgbmV3IE1hcChlbnRyaWVzKTtcbiAgICByZXR1cm4gbmV3IE9EYXRhUXVlcnlPcHRpb25zPFQ+KG5ldyBNYXAoZW50cmllcykpO1xuICB9XG5cbiAgdG9RdWVyeUFyZ3VtZW50cygpOiBPRGF0YVF1ZXJ5QXJndW1lbnRzPFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0OiB0aGlzLl92YWx1ZXMuZ2V0KFF1ZXJ5T3B0aW9uLnNlbGVjdCkgPz8gbnVsbCxcbiAgICAgIGV4cGFuZDogdGhpcy5fdmFsdWVzLmdldChRdWVyeU9wdGlvbi5leHBhbmQpID8/IG51bGwsXG4gICAgICB0cmFuc2Zvcm06IHRoaXMuX3ZhbHVlcy5nZXQoUXVlcnlPcHRpb24udHJhbnNmb3JtKSA/PyBudWxsLFxuICAgICAgY29tcHV0ZTogdGhpcy5fdmFsdWVzLmdldChRdWVyeU9wdGlvbi5jb21wdXRlKSA/PyBudWxsLFxuICAgICAgYXBwbHk6IHRoaXMuX3ZhbHVlcy5nZXQoUXVlcnlPcHRpb24uYXBwbHkpID8/IG51bGwsXG4gICAgICBzZWFyY2g6IHRoaXMuX3ZhbHVlcy5nZXQoUXVlcnlPcHRpb24uc2VhcmNoKSA/PyBudWxsLFxuICAgICAgZmlsdGVyOiB0aGlzLl92YWx1ZXMuZ2V0KFF1ZXJ5T3B0aW9uLmZpbHRlcikgPz8gbnVsbCxcbiAgICAgIG9yZGVyQnk6IHRoaXMuX3ZhbHVlcy5nZXQoUXVlcnlPcHRpb24ub3JkZXJCeSkgPz8gbnVsbCxcbiAgICAgIHRvcDogdGhpcy5fdmFsdWVzLmdldChRdWVyeU9wdGlvbi50b3ApID8/IG51bGwsXG4gICAgICBza2lwOiB0aGlzLl92YWx1ZXMuZ2V0KFF1ZXJ5T3B0aW9uLnNraXApID8/IG51bGwsXG4gICAgICBza2lwdG9rZW46IHRoaXMuX3ZhbHVlcy5nZXQoUXVlcnlPcHRpb24uc2tpcHRva2VuKSA/PyBudWxsLFxuICAgICAgbGV2ZWxzOiB0aGlzLl92YWx1ZXMuZ2V0KFF1ZXJ5T3B0aW9uLmxldmVscykgPz8gbnVsbCxcbiAgICAgIGNvdW50OiB0aGlzLl92YWx1ZXMuZ2V0KFF1ZXJ5T3B0aW9uLmNvdW50KSA/PyBudWxsLFxuICAgIH0gYXMgT0RhdGFRdWVyeUFyZ3VtZW50czxUPjtcbiAgfVxuXG4gIGNsb25lPE8+KCkge1xuICAgIHJldHVybiBuZXcgT0RhdGFRdWVyeU9wdGlvbnM8Tz4oT2JqZWN0cy5jbG9uZSh0aGlzLl92YWx1ZXMpKTtcbiAgfVxuXG4gIC8vIFNldCBSZW5kZXJhYmxlXG4gIGV4cHJlc3Npb24oa2V5OiBRdWVyeU9wdGlvbiwgZXhwPzogRXhwcmVzc2lvbjxUPikge1xuICAgIGlmIChleHAgIT09IHVuZGVmaW5lZCkgdGhpcy5fdmFsdWVzLnNldChrZXksIGV4cCk7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy5nZXQoa2V5KTtcbiAgfVxuXG4gIC8vIE9wdGlvbiBIYW5kbGVyXG4gIG9wdGlvbjxPPihrZXk6IFF1ZXJ5T3B0aW9uLCBvcHRzPzogTykge1xuICAgIGlmIChvcHRzICE9PSB1bmRlZmluZWQpIHRoaXMuX3ZhbHVlcy5zZXQoa2V5LCBvcHRzKTtcbiAgICByZXR1cm4gbmV3IE9EYXRhUXVlcnlPcHRpb25IYW5kbGVyPE8+KHRoaXMuX3ZhbHVlcywga2V5KTtcbiAgfVxuXG4gIC8vIFF1ZXJ5IE9wdGlvbnMgdG9vbHNcbiAgaGFzKGtleTogUXVlcnlPcHRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzLmhhcyhrZXkpO1xuICB9XG5cbiAgcmVtb3ZlKC4uLmtleXM6IFF1ZXJ5T3B0aW9uW10pIHtcbiAgICBmb3IgKGxldCBrZXkgb2YgdGhpcy5fdmFsdWVzLmtleXMoKSkge1xuICAgICAgaWYgKGtleXMuaW5jbHVkZXMoa2V5KSkgdGhpcy5fdmFsdWVzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIGtlZXAoLi4ua2V5czogUXVlcnlPcHRpb25bXSkge1xuICAgIGZvciAobGV0IGtleSBvZiB0aGlzLl92YWx1ZXMua2V5cygpKSB7XG4gICAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkgdGhpcy5fdmFsdWVzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsZWFyXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuX3ZhbHVlcy5jbGVhcigpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { $BATCH, $QUERY, ACCEPT, APPLICATION_JSON, CONTENT_TYPE_ANY, IF_MATCH_HEADER, IF_NONE_MATCH_HEADER, PREFER, TEXT_PLAIN, } from '../constants';
|
|
2
|
-
import { Http, Types } from '../utils';
|
|
3
|
-
export class ODataRequest {
|
|
4
|
-
constructor(init) {
|
|
5
|
-
this._method = init.method;
|
|
6
|
-
this.resource = init.resource;
|
|
7
|
-
this.api = init.api;
|
|
8
|
-
this.reportProgress = init.reportProgress;
|
|
9
|
-
this.observe = init.observe;
|
|
10
|
-
this.context = init.context;
|
|
11
|
-
// Response Type
|
|
12
|
-
this._responseType = init.responseType;
|
|
13
|
-
// The Body
|
|
14
|
-
this._body = init.body !== undefined ? init.body : null;
|
|
15
|
-
if (this._body !== null)
|
|
16
|
-
this._body = this.resource.serialize(this._body, init.parserOptions);
|
|
17
|
-
this.withCredentials =
|
|
18
|
-
init.withCredentials === undefined
|
|
19
|
-
? this.api.options.withCredentials
|
|
20
|
-
: init.withCredentials;
|
|
21
|
-
this.fetchPolicy = init.fetchPolicy || this.api.options.fetchPolicy;
|
|
22
|
-
this.bodyQueryOptions = [
|
|
23
|
-
...(this.api.options.bodyQueryOptions || []),
|
|
24
|
-
...(init.bodyQueryOptions || []),
|
|
25
|
-
];
|
|
26
|
-
// The Path and Params from resource
|
|
27
|
-
const [resourcePath, resourceParams] = this.resource.pathAndParams(init.parserOptions);
|
|
28
|
-
this._path = resourcePath;
|
|
29
|
-
//#region Headers
|
|
30
|
-
const customHeaders = {};
|
|
31
|
-
if (typeof init.etag === 'string') {
|
|
32
|
-
if (this.api.options.etag.ifMatch &&
|
|
33
|
-
['PUT', 'PATCH', 'DELETE'].indexOf(this._method) !== -1)
|
|
34
|
-
customHeaders[IF_MATCH_HEADER] = init.etag;
|
|
35
|
-
else if (this.api.options.etag.ifNoneMatch &&
|
|
36
|
-
['GET'].indexOf(this._method) !== -1)
|
|
37
|
-
customHeaders[IF_NONE_MATCH_HEADER] = init.etag;
|
|
38
|
-
}
|
|
39
|
-
const accept = [];
|
|
40
|
-
// Metadata
|
|
41
|
-
if (this.api.options.accept?.metadata !== undefined)
|
|
42
|
-
accept.push(`odata.metadata=${this.api.options.accept?.metadata}`);
|
|
43
|
-
// IEEE754
|
|
44
|
-
if (this.api.options.accept?.ieee754Compatible !== undefined)
|
|
45
|
-
accept.push(`IEEE754Compatible=${this.api.options.accept?.ieee754Compatible}`);
|
|
46
|
-
// streaming
|
|
47
|
-
if (this.api.options.accept?.streaming !== undefined)
|
|
48
|
-
accept.push(`streaming=${this.api.options.accept?.streaming}`);
|
|
49
|
-
// ExponentialDecimals
|
|
50
|
-
if (this.api.options.accept?.exponentialDecimals !== undefined)
|
|
51
|
-
accept.push(`ExponentialDecimals=${this.api.options.accept?.exponentialDecimals}`);
|
|
52
|
-
if (accept.length > 0)
|
|
53
|
-
customHeaders[ACCEPT] = [
|
|
54
|
-
`${APPLICATION_JSON};${accept.join(';')}`,
|
|
55
|
-
`${TEXT_PLAIN}`,
|
|
56
|
-
`${CONTENT_TYPE_ANY}`,
|
|
57
|
-
];
|
|
58
|
-
const prefer = [];
|
|
59
|
-
// Return
|
|
60
|
-
if (this.api.options.prefer?.return !== undefined &&
|
|
61
|
-
['POST', 'PUT', 'PATCH'].indexOf(this._method) !== -1)
|
|
62
|
-
prefer.push(`return=${this.api.options.prefer?.return}`);
|
|
63
|
-
// MaxPageSize
|
|
64
|
-
if (this.api.options.prefer?.maxPageSize !== undefined &&
|
|
65
|
-
['GET'].indexOf(this._method) !== -1)
|
|
66
|
-
prefer.push(`odata.maxpagesize=${this.api.options.prefer?.maxPageSize}`);
|
|
67
|
-
// Annotations
|
|
68
|
-
if (this.api.options.prefer?.includeAnnotations !== undefined &&
|
|
69
|
-
['GET'].indexOf(this._method) !== -1)
|
|
70
|
-
prefer.push(`odata.include-annotations=${this.api.options.prefer?.includeAnnotations}`);
|
|
71
|
-
// Omit Null Values
|
|
72
|
-
if (this.api.options.prefer?.omitNullValues === true &&
|
|
73
|
-
['GET'].indexOf(this._method) !== -1)
|
|
74
|
-
prefer.push(`omit-values=nulls`);
|
|
75
|
-
// Continue on Error
|
|
76
|
-
if (this.api.options.prefer?.continueOnError === true &&
|
|
77
|
-
['POST'].indexOf(this._method) !== -1)
|
|
78
|
-
prefer.push(`odata.continue-on-error`);
|
|
79
|
-
if (prefer.length > 0)
|
|
80
|
-
customHeaders[PREFER] = prefer;
|
|
81
|
-
this._headers = Http.mergeHttpHeaders(this.api.options.headers, customHeaders, init.headers || {});
|
|
82
|
-
//#endregion
|
|
83
|
-
//#region Params
|
|
84
|
-
const customParams = {};
|
|
85
|
-
if (['POST', 'PUT', 'PATCH'].indexOf(this._method) !== -1 &&
|
|
86
|
-
'$select' in resourceParams) {
|
|
87
|
-
customParams['$select'] = resourceParams['$select'];
|
|
88
|
-
}
|
|
89
|
-
if (['POST'].indexOf(this._method) !== -1 && '$expand' in resourceParams) {
|
|
90
|
-
customParams['$expand'] = resourceParams['$expand'];
|
|
91
|
-
}
|
|
92
|
-
if (['GET'].indexOf(this._method) !== -1) {
|
|
93
|
-
Object.assign(customParams, resourceParams);
|
|
94
|
-
}
|
|
95
|
-
const params = Http.mergeHttpParams(this.api.options.params, customParams, init.params || {});
|
|
96
|
-
this._params =
|
|
97
|
-
this._responseType === 'entity'
|
|
98
|
-
? Http.withoutHttpParams(params, [
|
|
99
|
-
'$filter',
|
|
100
|
-
'$orderby',
|
|
101
|
-
'$count',
|
|
102
|
-
'$skip',
|
|
103
|
-
'$top',
|
|
104
|
-
])
|
|
105
|
-
: params;
|
|
106
|
-
//#endregion
|
|
107
|
-
}
|
|
108
|
-
static factory(api, method, resource, options) {
|
|
109
|
-
const apiOptions = api.options;
|
|
110
|
-
let params = options.params || {};
|
|
111
|
-
if (options.withCount) {
|
|
112
|
-
params = Http.mergeHttpParams(params, apiOptions.helper.countParam());
|
|
113
|
-
}
|
|
114
|
-
let etag = options.etag;
|
|
115
|
-
if (etag === undefined && Types.isPlainObject(options.body)) {
|
|
116
|
-
etag = apiOptions.helper.etag(options.body);
|
|
117
|
-
}
|
|
118
|
-
return new ODataRequest({
|
|
119
|
-
method,
|
|
120
|
-
etag,
|
|
121
|
-
api,
|
|
122
|
-
resource,
|
|
123
|
-
params,
|
|
124
|
-
context: options.context,
|
|
125
|
-
body: options.body,
|
|
126
|
-
observe: options.observe,
|
|
127
|
-
headers: options.headers,
|
|
128
|
-
reportProgress: options.reportProgress,
|
|
129
|
-
responseType: options.responseType,
|
|
130
|
-
fetchPolicy: options.fetchPolicy,
|
|
131
|
-
parserOptions: options.parserOptions,
|
|
132
|
-
withCredentials: options.withCredentials,
|
|
133
|
-
bodyQueryOptions: options.bodyQueryOptions,
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
get responseType() {
|
|
137
|
-
return this._responseType &&
|
|
138
|
-
['property', 'entity', 'entities'].indexOf(this._responseType) !== -1
|
|
139
|
-
? 'json'
|
|
140
|
-
: this._responseType === 'value'
|
|
141
|
-
? 'text'
|
|
142
|
-
: this._responseType;
|
|
143
|
-
}
|
|
144
|
-
get path() {
|
|
145
|
-
return this.isQueryBody() ? `${this._path}/${$QUERY}` : this._path;
|
|
146
|
-
}
|
|
147
|
-
get method() {
|
|
148
|
-
return this.isQueryBody() ? 'POST' : this._method;
|
|
149
|
-
}
|
|
150
|
-
get body() {
|
|
151
|
-
return this.isQueryBody()
|
|
152
|
-
? Http.splitHttpParams(this._params, this.bodyQueryOptions.map((name) => `$${name}`))[1].toString()
|
|
153
|
-
: this._body;
|
|
154
|
-
}
|
|
155
|
-
get params() {
|
|
156
|
-
return this.isQueryBody()
|
|
157
|
-
? Http.splitHttpParams(this._params, this.bodyQueryOptions.map((name) => `$${name}`))[0]
|
|
158
|
-
: this._params;
|
|
159
|
-
}
|
|
160
|
-
get headers() {
|
|
161
|
-
return this.isQueryBody()
|
|
162
|
-
? Http.mergeHttpHeaders(this._headers, { CONTENT_TYPE: TEXT_PLAIN })
|
|
163
|
-
: this._headers;
|
|
164
|
-
}
|
|
165
|
-
get pathWithParams() {
|
|
166
|
-
return this.params.keys().length > 0
|
|
167
|
-
? `${this.path}?${this.params}`
|
|
168
|
-
: this.path;
|
|
169
|
-
}
|
|
170
|
-
get url() {
|
|
171
|
-
return `${this.api.serviceRootUrl}${this.path}`;
|
|
172
|
-
}
|
|
173
|
-
get urlWithParams() {
|
|
174
|
-
return `${this.api.serviceRootUrl}${this.pathWithParams}`;
|
|
175
|
-
}
|
|
176
|
-
get cacheKey() {
|
|
177
|
-
return this._params.keys().length > 0
|
|
178
|
-
? `${this._path}?${this._params}`
|
|
179
|
-
: this._path;
|
|
180
|
-
}
|
|
181
|
-
isQueryBody() {
|
|
182
|
-
return (this._method === 'GET' &&
|
|
183
|
-
this.bodyQueryOptions.length > 0 &&
|
|
184
|
-
this.bodyQueryOptions.some((name) => this._params.has(`$${name}`)));
|
|
185
|
-
}
|
|
186
|
-
isBatch() {
|
|
187
|
-
return this.path.endsWith($BATCH);
|
|
188
|
-
}
|
|
189
|
-
isFetch() {
|
|
190
|
-
return ['GET'].indexOf(this._method) !== -1;
|
|
191
|
-
}
|
|
192
|
-
isMutate() {
|
|
193
|
-
return ['PUT', 'PATCH', 'POST', 'DELETE'].indexOf(this._method) !== -1;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9yZXNvdXJjZXMvcmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2Ysb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixVQUFVLEdBQ1gsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJdkMsTUFBTSxPQUFPLFlBQVk7SUE2QnZCLFlBQVksSUFnQ1g7UUFDQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRTlCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUU1QixnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRXZDLFdBQVc7UUFDWCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEQsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUk7WUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxD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QUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDb250ZXh0LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9EYXRhQXBpIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7XG4gICRCQVRDSCxcbiAgJFFVRVJZLFxuICBBQ0NFUFQsXG4gIEFQUExJQ0FUSU9OX0pTT04sXG4gIENPTlRFTlRfVFlQRV9BTlksXG4gIElGX01BVENIX0hFQURFUixcbiAgSUZfTk9ORV9NQVRDSF9IRUFERVIsXG4gIFBSRUZFUixcbiAgVEVYVF9QTEFJTixcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEZldGNoUG9saWN5LCBQYXJzZXJPcHRpb25zLCBRdWVyeU9wdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEh0dHAsIFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgT0RhdGFSZXNvdXJjZSB9IGZyb20gJy4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgT0RhdGFPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVJlcXVlc3Q8VD4ge1xuICByZWFkb25seSBhcGk6IE9EYXRhQXBpO1xuICByZWFkb25seSBvYnNlcnZlOiAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XG4gIHJlYWRvbmx5IGNvbnRleHQ/OiBIdHRwQ29udGV4dDtcbiAgcmVhZG9ubHkgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xuICByZWFkb25seSB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xuICByZWFkb25seSBib2R5UXVlcnlPcHRpb25zOiBRdWVyeU9wdGlvbltdO1xuICByZWFkb25seSBmZXRjaFBvbGljeTpcbiAgICB8ICdjYWNoZS1maXJzdCdcbiAgICB8ICdjYWNoZS1hbmQtbmV0d29yaydcbiAgICB8ICduZXR3b3JrLW9ubHknXG4gICAgfCAnbm8tY2FjaGUnXG4gICAgfCAnY2FjaGUtb25seSc7XG4gIHJlYWRvbmx5IHJlc291cmNlOiBPRGF0YVJlc291cmNlPFQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXNwb25zZVR5cGU/OlxuICAgIHwgJ2FycmF5YnVmZmVyJ1xuICAgIHwgJ2Jsb2InXG4gICAgfCAnanNvbidcbiAgICB8ICd0ZXh0J1xuICAgIHwgJ3ZhbHVlJ1xuICAgIHwgJ3Byb3BlcnR5J1xuICAgIHwgJ2VudGl0eSdcbiAgICB8ICdlbnRpdGllcyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21ldGhvZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ib2R5OiBhbnkgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkZXJzOiBIdHRwSGVhZGVycztcbiAgcHJpdmF0ZSByZWFkb25seSBfcGFyYW1zOiBIdHRwUGFyYW1zO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoaW5pdDoge1xuICAgIG1ldGhvZDogc3RyaW5nO1xuICAgIGFwaTogT0RhdGFBcGk7XG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8VD47XG4gICAgYm9keTogYW55O1xuICAgIG9ic2VydmU6ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHQ7XG4gICAgZXRhZz86IHN0cmluZztcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfCB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH07XG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xuICAgIHBhcmFtcz86XG4gICAgICB8IEh0dHBQYXJhbXNcbiAgICAgIHwge1xuICAgICAgICAgIFtwYXJhbTogc3RyaW5nXTpcbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8IG51bWJlclxuICAgICAgICAgICAgfCBib29sZWFuXG4gICAgICAgICAgICB8IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gICAgICAgIH07XG4gICAgcmVzcG9uc2VUeXBlPzpcbiAgICAgIHwgJ2FycmF5YnVmZmVyJ1xuICAgICAgfCAnYmxvYidcbiAgICAgIHwgJ2pzb24nXG4gICAgICB8ICd0ZXh0J1xuICAgICAgfCAndmFsdWUnXG4gICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgIHwgJ2VudGl0eSdcbiAgICAgIHwgJ2VudGl0aWVzJztcbiAgICBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5O1xuICAgIHBhcnNlck9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG4gICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uW107XG4gIH0pIHtcbiAgICB0aGlzLl9tZXRob2QgPSBpbml0Lm1ldGhvZDtcbiAgICB0aGlzLnJlc291cmNlID0gaW5pdC5yZXNvdXJjZTtcblxuICAgIHRoaXMuYXBpID0gaW5pdC5hcGk7XG4gICAgdGhpcy5yZXBvcnRQcm9ncmVzcyA9IGluaXQucmVwb3J0UHJvZ3Jlc3M7XG4gICAgdGhpcy5vYnNlcnZlID0gaW5pdC5vYnNlcnZlO1xuICAgIHRoaXMuY29udGV4dCA9IGluaXQuY29udGV4dDtcblxuICAgIC8vIFJlc3BvbnNlIFR5cGVcbiAgICB0aGlzLl9yZXNwb25zZVR5cGUgPSBpbml0LnJlc3BvbnNlVHlwZTtcblxuICAgIC8vIFRoZSBCb2R5XG4gICAgdGhpcy5fYm9keSA9IGluaXQuYm9keSAhPT0gdW5kZWZpbmVkID8gaW5pdC5ib2R5IDogbnVsbDtcbiAgICBpZiAodGhpcy5fYm9keSAhPT0gbnVsbClcbiAgICAgIHRoaXMuX2JvZHkgPSB0aGlzLnJlc291cmNlLnNlcmlhbGl6ZSh0aGlzLl9ib2R5LCBpbml0LnBhcnNlck9wdGlvbnMpO1xuXG4gICAgdGhpcy53aXRoQ3JlZGVudGlhbHMgPVxuICAgICAgaW5pdC53aXRoQ3JlZGVudGlhbHMgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuYXBpLm9wdGlvbnMud2l0aENyZWRlbnRpYWxzXG4gICAgICAgIDogaW5pdC53aXRoQ3JlZGVudGlhbHM7XG4gICAgdGhpcy5mZXRjaFBvbGljeSA9IGluaXQuZmV0Y2hQb2xpY3kgfHwgdGhpcy5hcGkub3B0aW9ucy5mZXRjaFBvbGljeTtcbiAgICB0aGlzLmJvZHlRdWVyeU9wdGlvbnMgPSBbXG4gICAgICAuLi4odGhpcy5hcGkub3B0aW9ucy5ib2R5UXVlcnlPcHRpb25zIHx8IFtdKSxcbiAgICAgIC4uLihpbml0LmJvZHlRdWVyeU9wdGlvbnMgfHwgW10pLFxuICAgIF07XG5cbiAgICAvLyBUaGUgUGF0aCBhbmQgUGFyYW1zIGZyb20gcmVzb3VyY2VcbiAgICBjb25zdCBbcmVzb3VyY2VQYXRoLCByZXNvdXJjZVBhcmFtc10gPSB0aGlzLnJlc291cmNlLnBhdGhBbmRQYXJhbXMoXG4gICAgICBpbml0LnBhcnNlck9wdGlvbnMsXG4gICAgKTtcbiAgICB0aGlzLl9wYXRoID0gcmVzb3VyY2VQYXRoO1xuXG4gICAgLy8jcmVnaW9uIEhlYWRlcnNcbiAgICBjb25zdCBjdXN0b21IZWFkZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9ID0ge307XG4gICAgaWYgKHR5cGVvZiBpbml0LmV0YWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuYXBpLm9wdGlvbnMuZXRhZy5pZk1hdGNoICYmXG4gICAgICAgIFsnUFVUJywgJ1BBVENIJywgJ0RFTEVURSddLmluZGV4T2YodGhpcy5fbWV0aG9kKSAhPT0gLTFcbiAgICAgIClcbiAgICAgICAgY3VzdG9tSGVhZGVyc1tJRl9NQVRDSF9IRUFERVJdID0gaW5pdC5ldGFnO1xuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuYXBpLm9wdGlvbnMuZXRhZy5pZk5vbmVNYXRjaCAmJlxuICAgICAgICBbJ0dFVCddLmluZGV4T2YodGhpcy5fbWV0aG9kKSAhPT0gLTFcbiAgICAgIClcbiAgICAgICAgY3VzdG9tSGVhZGVyc1tJRl9OT05FX01BVENIX0hFQURFUl0gPSBpbml0LmV0YWc7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjZXB0ID0gW107XG4gICAgLy8gTWV0YWRhdGFcbiAgICBpZiAodGhpcy5hcGkub3B0aW9ucy5hY2NlcHQ/Lm1ldGFkYXRhICE9PSB1bmRlZmluZWQpXG4gICAgICBhY2NlcHQucHVzaChgb2RhdGEubWV0YWRhdGE9JHt0aGlzLmFwaS5vcHRpb25zLmFjY2VwdD8ubWV0YWRhdGF9YCk7XG4gICAgLy8gSUVFRTc1NFxuICAgIGlmICh0aGlzLmFwaS5vcHRpb25zLmFjY2VwdD8uaWVlZTc1NENvbXBhdGlibGUgIT09IHVuZGVmaW5lZClcbiAgICAgIGFjY2VwdC5wdXNoKFxuICAgICAgICBgSUVFRTc1NENvbXBhdGlibGU9JHt0aGlzLmFwaS5vcHRpb25zLmFjY2VwdD8uaWVlZTc1NENvbXBhdGlibGV9YCxcbiAgICAgICk7XG4gICAgLy8gc3RyZWFtaW5nXG4gICAgaWYgKHRoaXMuYXBpLm9wdGlvbnMuYWNjZXB0Py5zdHJlYW1pbmcgIT09IHVuZGVmaW5lZClcbiAgICAgIGFjY2VwdC5wdXNoKGBzdHJlYW1pbmc9JHt0aGlzLmFwaS5vcHRpb25zLmFjY2VwdD8uc3RyZWFtaW5nfWApO1xuICAgIC8vIEV4cG9uZW50aWFsRGVjaW1hbHNcbiAgICBpZiAodGhpcy5hcGkub3B0aW9ucy5hY2NlcHQ/LmV4cG9uZW50aWFsRGVjaW1hbHMgIT09IHVuZGVmaW5lZClcbiAgICAgIGFjY2VwdC5wdXNoKFxuICAgICAgICBgRXhwb25lbnRpYWxEZWNpbWFscz0ke3RoaXMuYXBpLm9wdGlvbnMuYWNjZXB0Py5leHBvbmVudGlhbERlY2ltYWxzfWAsXG4gICAgICApO1xuICAgIGlmIChhY2NlcHQubGVuZ3RoID4gMClcbiAgICAgIGN1c3RvbUhlYWRlcnNbQUNDRVBUXSA9IFtcbiAgICAgICAgYCR7QVBQTElDQVRJT05fSlNPTn07JHthY2NlcHQuam9pbignOycpfWAsXG4gICAgICAgIGAke1RFWFRfUExBSU59YCxcbiAgICAgICAgYCR7Q09OVEVOVF9UWVBFX0FOWX1gLFxuICAgICAgXTtcblxuICAgIGNvbnN0IHByZWZlciA9IFtdO1xuICAgIC8vIFJldHVyblxuICAgIGlmIChcbiAgICAgIHRoaXMuYXBpLm9wdGlvbnMucHJlZmVyPy5yZXR1cm4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgWydQT1NUJywgJ1BVVCcsICdQQVRDSCddLmluZGV4T2YodGhpcy5fbWV0aG9kKSAhPT0gLTFcbiAgICApXG4gICAgICBwcmVmZXIucHVzaChgcmV0dXJuPSR7dGhpcy5hcGkub3B0aW9ucy5wcmVmZXI/LnJldHVybn1gKTtcbiAgICAvLyBNYXhQYWdlU2l6ZVxuICAgIGlmIChcbiAgICAgIHRoaXMuYXBpLm9wdGlvbnMucHJlZmVyPy5tYXhQYWdlU2l6ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBbJ0dFVCddLmluZGV4T2YodGhpcy5fbWV0aG9kKSAhPT0gLTFcbiAgICApXG4gICAgICBwcmVmZXIucHVzaChgb2RhdGEubWF4cGFnZXNpemU9JHt0aGlzLmFwaS5vcHRpb25zLnByZWZlcj8ubWF4UGFnZVNpemV9YCk7XG4gICAgLy8gQW5ub3RhdGlvbnNcbiAgICBpZiAoXG4gICAgICB0aGlzLmFwaS5vcHRpb25zLnByZWZlcj8uaW5jbHVkZUFubm90YXRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIFsnR0VUJ10uaW5kZXhPZih0aGlzLl9tZXRob2QpICE9PSAtMVxuICAgIClcbiAgICAgIHByZWZlci5wdXNoKFxuICAgICAgICBgb2RhdGEuaW5jbHVkZS1hbm5vdGF0aW9ucz0ke3RoaXMuYXBpLm9wdGlvbnMucHJlZmVyPy5pbmNsdWRlQW5ub3RhdGlvbnN9YCxcbiAgICAgICk7XG4gICAgLy8gT21pdCBOdWxsIFZhbHVlc1xuICAgIGlmIChcbiAgICAgIHRoaXMuYXBpLm9wdGlvbnMucHJlZmVyPy5vbWl0TnVsbFZhbHVlcyA9PT0gdHJ1ZSAmJlxuICAgICAgWydHRVQnXS5pbmRleE9mKHRoaXMuX21ldGhvZCkgIT09IC0xXG4gICAgKVxuICAgICAgcHJlZmVyLnB1c2goYG9taXQtdmFsdWVzPW51bGxzYCk7XG4gICAgLy8gQ29udGludWUgb24gRXJyb3JcbiAgICBpZiAoXG4gICAgICB0aGlzLmFwaS5vcHRpb25zLnByZWZlcj8uY29udGludWVPbkVycm9yID09PSB0cnVlICYmXG4gICAgICBbJ1BPU1QnXS5pbmRleE9mKHRoaXMuX21ldGhvZCkgIT09IC0xXG4gICAgKVxuICAgICAgcHJlZmVyLnB1c2goYG9kYXRhLmNvbnRpbnVlLW9uLWVycm9yYCk7XG4gICAgaWYgKHByZWZlci5sZW5ndGggPiAwKSBjdXN0b21IZWFkZXJzW1BSRUZFUl0gPSBwcmVmZXI7XG4gICAgdGhpcy5faGVhZGVycyA9IEh0dHAubWVyZ2VIdHRwSGVhZGVycyhcbiAgICAgIHRoaXMuYXBpLm9wdGlvbnMuaGVhZGVycyxcbiAgICAgIGN1c3RvbUhlYWRlcnMsXG4gICAgICBpbml0LmhlYWRlcnMgfHwge30sXG4gICAgKTtcbiAgICAvLyNlbmRyZWdpb25cblxuICAgIC8vI3JlZ2lvbiBQYXJhbXNcbiAgICBjb25zdCBjdXN0b21QYXJhbXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBpZiAoXG4gICAgICBbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJ10uaW5kZXhPZih0aGlzLl9tZXRob2QpICE9PSAtMSAmJlxuICAgICAgJyRzZWxlY3QnIGluIHJlc291cmNlUGFyYW1zXG4gICAgKSB7XG4gICAgICBjdXN0b21QYXJhbXNbJyRzZWxlY3QnXSA9IHJlc291cmNlUGFyYW1zWyckc2VsZWN0J107XG4gICAgfVxuICAgIGlmIChbJ1BPU1QnXS5pbmRleE9mKHRoaXMuX21ldGhvZCkgIT09IC0xICYmICckZXhwYW5kJyBpbiByZXNvdXJjZVBhcmFtcykge1xuICAgICAgY3VzdG9tUGFyYW1zWyckZXhwYW5kJ10gPSByZXNvdXJjZVBhcmFtc1snJGV4cGFuZCddO1xuICAgIH1cbiAgICBpZiAoWydHRVQnXS5pbmRleE9mKHRoaXMuX21ldGhvZCkgIT09IC0xKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGN1c3RvbVBhcmFtcywgcmVzb3VyY2VQYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtcyA9IEh0dHAubWVyZ2VIdHRwUGFyYW1zKFxuICAgICAgdGhpcy5hcGkub3B0aW9ucy5wYXJhbXMsXG4gICAgICBjdXN0b21QYXJhbXMsXG4gICAgICBpbml0LnBhcmFtcyB8fCB7fSxcbiAgICApO1xuXG4gICAgdGhpcy5fcGFyYW1zID1cbiAgICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9PT0gJ2VudGl0eSdcbiAgICAgICAgPyBIdHRwLndpdGhvdXRIdHRwUGFyYW1zKHBhcmFtcywgW1xuICAgICAgICAgICAgJyRmaWx0ZXInLFxuICAgICAgICAgICAgJyRvcmRlcmJ5JyxcbiAgICAgICAgICAgICckY291bnQnLFxuICAgICAgICAgICAgJyRza2lwJyxcbiAgICAgICAgICAgICckdG9wJyxcbiAgICAgICAgICBdKVxuICAgICAgICA6IHBhcmFtcztcbiAgICAvLyNlbmRyZWdpb25cbiAgfVxuXG4gIHN0YXRpYyBmYWN0b3J5KFxuICAgIGFwaTogT0RhdGFBcGksXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5PzogYW55O1xuICAgICAgZXRhZz86IHN0cmluZztcbiAgICAgIHJlc3BvbnNlVHlwZT86XG4gICAgICAgIHwgJ2FycmF5YnVmZmVyJ1xuICAgICAgICB8ICdibG9iJ1xuICAgICAgICB8ICdqc29uJ1xuICAgICAgICB8ICd0ZXh0J1xuICAgICAgICB8ICd2YWx1ZSdcbiAgICAgICAgfCAncHJvcGVydHknXG4gICAgICAgIHwgJ2VudGl0eSdcbiAgICAgICAgfCAnZW50aXRpZXMnO1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbltdO1xuICAgIH0sXG4gICkge1xuICAgIGNvbnN0IGFwaU9wdGlvbnMgPSBhcGkub3B0aW9ucztcbiAgICBsZXQgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXMgfHwge307XG4gICAgaWYgKG9wdGlvbnMud2l0aENvdW50KSB7XG4gICAgICBwYXJhbXMgPSBIdHRwLm1lcmdlSHR0cFBhcmFtcyhwYXJhbXMsIGFwaU9wdGlvbnMuaGVscGVyLmNvdW50UGFyYW0oKSk7XG4gICAgfVxuXG4gICAgbGV0IGV0YWcgPSBvcHRpb25zLmV0YWc7XG4gICAgaWYgKGV0YWcgPT09IHVuZGVmaW5lZCAmJiBUeXBlcy5pc1BsYWluT2JqZWN0KG9wdGlvbnMuYm9keSkpIHtcbiAgICAgIGV0YWcgPSBhcGlPcHRpb25zLmhlbHBlci5ldGFnKG9wdGlvbnMuYm9keSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBPRGF0YVJlcXVlc3Qoe1xuICAgICAgbWV0aG9kLFxuICAgICAgZXRhZyxcbiAgICAgIGFwaSxcbiAgICAgIHJlc291cmNlLFxuICAgICAgcGFyYW1zLFxuICAgICAgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LFxuICAgICAgYm9keTogb3B0aW9ucy5ib2R5LFxuICAgICAgb2JzZXJ2ZTogb3B0aW9ucy5vYnNlcnZlLFxuICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzLFxuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IG9wdGlvbnMucmVwb3J0UHJvZ3Jlc3MsXG4gICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlLFxuICAgICAgZmV0Y2hQb2xpY3k6IG9wdGlvbnMuZmV0Y2hQb2xpY3ksXG4gICAgICBwYXJzZXJPcHRpb25zOiBvcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IG9wdGlvbnMud2l0aENyZWRlbnRpYWxzLFxuICAgICAgYm9keVF1ZXJ5T3B0aW9uczogb3B0aW9ucy5ib2R5UXVlcnlPcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHJlc3BvbnNlVHlwZSgpOiAnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VUeXBlICYmXG4gICAgICBbJ3Byb3BlcnR5JywgJ2VudGl0eScsICdlbnRpdGllcyddLmluZGV4T2YodGhpcy5fcmVzcG9uc2VUeXBlKSAhPT0gLTFcbiAgICAgID8gJ2pzb24nXG4gICAgICA6IHRoaXMuX3Jlc3BvbnNlVHlwZSA9PT0gJ3ZhbHVlJ1xuICAgICAgICA/ICd0ZXh0J1xuICAgICAgICA6IDwnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnPnRoaXMuX3Jlc3BvbnNlVHlwZTtcbiAgfVxuXG4gIGdldCBwYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmlzUXVlcnlCb2R5KCkgPyBgJHt0aGlzLl9wYXRofS8keyRRVUVSWX1gIDogdGhpcy5fcGF0aDtcbiAgfVxuXG4gIGdldCBtZXRob2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNRdWVyeUJvZHkoKSA/ICdQT1NUJyA6IHRoaXMuX21ldGhvZDtcbiAgfVxuXG4gIGdldCBib2R5KCkge1xuICAgIHJldHVybiB0aGlzLmlzUXVlcnlCb2R5KClcbiAgICAgID8gSHR0cC5zcGxpdEh0dHBQYXJhbXMoXG4gICAgICAgICAgdGhpcy5fcGFyYW1zLFxuICAgICAgICAgIHRoaXMuYm9keVF1ZXJ5T3B0aW9ucy5tYXAoKG5hbWUpID0+IGAkJHtuYW1lfWApLFxuICAgICAgICApWzFdLnRvU3RyaW5nKClcbiAgICAgIDogdGhpcy5fYm9keTtcbiAgfVxuXG4gIGdldCBwYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNRdWVyeUJvZHkoKVxuICAgICAgPyBIdHRwLnNwbGl0SHR0cFBhcmFtcyhcbiAgICAgICAgICB0aGlzLl9wYXJhbXMsXG4gICAgICAgICAgdGhpcy5ib2R5UXVlcnlPcHRpb25zLm1hcCgobmFtZSkgPT4gYCQke25hbWV9YCksXG4gICAgICAgIClbMF1cbiAgICAgIDogdGhpcy5fcGFyYW1zO1xuICB9XG5cbiAgZ2V0IGhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNRdWVyeUJvZHkoKVxuICAgICAgPyBIdHRwLm1lcmdlSHR0cEhlYWRlcnModGhpcy5faGVhZGVycywgeyBDT05URU5UX1RZUEU6IFRFWFRfUExBSU4gfSlcbiAgICAgIDogdGhpcy5faGVhZGVycztcbiAgfVxuXG4gIGdldCBwYXRoV2l0aFBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMua2V5cygpLmxlbmd0aCA+IDBcbiAgICAgID8gYCR7dGhpcy5wYXRofT8ke3RoaXMucGFyYW1zfWBcbiAgICAgIDogdGhpcy5wYXRoO1xuICB9XG5cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5hcGkuc2VydmljZVJvb3RVcmx9JHt0aGlzLnBhdGh9YDtcbiAgfVxuXG4gIGdldCB1cmxXaXRoUGFyYW1zKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmFwaS5zZXJ2aWNlUm9vdFVybH0ke3RoaXMucGF0aFdpdGhQYXJhbXN9YDtcbiAgfVxuXG4gIGdldCBjYWNoZUtleSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1zLmtleXMoKS5sZW5ndGggPiAwXG4gICAgICA/IGAke3RoaXMuX3BhdGh9PyR7dGhpcy5fcGFyYW1zfWBcbiAgICAgIDogdGhpcy5fcGF0aDtcbiAgfVxuXG4gIGlzUXVlcnlCb2R5KCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9tZXRob2QgPT09ICdHRVQnICYmXG4gICAgICB0aGlzLmJvZHlRdWVyeU9wdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5ib2R5UXVlcnlPcHRpb25zLnNvbWUoKG5hbWUpID0+IHRoaXMuX3BhcmFtcy5oYXMoYCQke25hbWV9YCkpXG4gICAgKTtcbiAgfVxuXG4gIGlzQmF0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aC5lbmRzV2l0aCgkQkFUQ0gpO1xuICB9XG5cbiAgaXNGZXRjaCgpIHtcbiAgICByZXR1cm4gWydHRVQnXS5pbmRleE9mKHRoaXMuX21ldGhvZCkgIT09IC0xO1xuICB9XG5cbiAgaXNNdXRhdGUoKSB7XG4gICAgcmV0dXJuIFsnUFVUJywgJ1BBVENIJywgJ1BPU1QnLCAnREVMRVRFJ10uaW5kZXhPZih0aGlzLl9tZXRob2QpICE9PSAtMTtcbiAgfVxufVxuIl19
|