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,392 +0,0 @@
|
|
|
1
|
-
import { Objects, Strings, Types } from '../../utils';
|
|
2
|
-
import { NONE_PARSER, } from '../../types';
|
|
3
|
-
import { ODataEnumTypeParser } from './enum-type';
|
|
4
|
-
import { COMPUTED, DESCRIPTION, LONG_DESCRIPTION } from '../../constants';
|
|
5
|
-
import { ODataAnnotatable } from '../base';
|
|
6
|
-
import { raw } from '../../resources/query';
|
|
7
|
-
import { ODataParserOptions } from '../../options';
|
|
8
|
-
export class ODataEntityTypeKey {
|
|
9
|
-
constructor({ name, alias }) {
|
|
10
|
-
this.name = name;
|
|
11
|
-
this.alias = alias;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
export class ODataReferential {
|
|
15
|
-
constructor({ property, referencedProperty, }) {
|
|
16
|
-
this.property = property;
|
|
17
|
-
this.referencedProperty = referencedProperty;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
export class ODataStructuredTypeFieldParser extends ODataAnnotatable {
|
|
21
|
-
constructor(name, structuredType, field) {
|
|
22
|
-
super(field);
|
|
23
|
-
this.name = name;
|
|
24
|
-
this.structuredType = structuredType;
|
|
25
|
-
this.type = field.type;
|
|
26
|
-
this.parser = NONE_PARSER;
|
|
27
|
-
this.referentials = (field.referentials || []).map((referential) => new ODataReferential(referential));
|
|
28
|
-
this.default = field.default;
|
|
29
|
-
this.maxLength = field.maxLength;
|
|
30
|
-
this.nullable = field.nullable !== undefined ? field.nullable : true;
|
|
31
|
-
this.collection = Boolean(field.collection);
|
|
32
|
-
this.navigation = Boolean(field.navigation);
|
|
33
|
-
this.precision = field.precision;
|
|
34
|
-
this.scale = field.scale;
|
|
35
|
-
}
|
|
36
|
-
validate(value, { method, navigation = false, } = {}) {
|
|
37
|
-
let errors;
|
|
38
|
-
if (this.collection && Array.isArray(value)) {
|
|
39
|
-
errors = value.map((v) => this.validate(v, { method, navigation }));
|
|
40
|
-
}
|
|
41
|
-
else if ((this.isStructuredType() &&
|
|
42
|
-
typeof value === 'object' &&
|
|
43
|
-
value !== null) ||
|
|
44
|
-
(this.navigation && value !== undefined)) {
|
|
45
|
-
errors =
|
|
46
|
-
this.structured().validate(value, { method, navigation }) ||
|
|
47
|
-
{};
|
|
48
|
-
}
|
|
49
|
-
else if (this.isEnumType() &&
|
|
50
|
-
(typeof value === 'string' || typeof value === 'number')) {
|
|
51
|
-
errors = this.enum().validate(value, { method, navigation });
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
// IsEdmType
|
|
55
|
-
const computed = this.annotatedValue(COMPUTED);
|
|
56
|
-
errors = [];
|
|
57
|
-
if (!this.nullable &&
|
|
58
|
-
(value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
|
|
59
|
-
!(computed && method === 'create') // Not (Is Computed field and create) ?
|
|
60
|
-
) {
|
|
61
|
-
errors.push(`required`);
|
|
62
|
-
}
|
|
63
|
-
if (this.maxLength !== undefined &&
|
|
64
|
-
typeof value === 'string' &&
|
|
65
|
-
value.length > this.maxLength) {
|
|
66
|
-
errors.push(`maxlength`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
70
|
-
}
|
|
71
|
-
//#region Deserialize
|
|
72
|
-
parse(parser, value, options) {
|
|
73
|
-
const type = Types.isPlainObject(value)
|
|
74
|
-
? options === null || options === void 0 ? void 0 : options.helper.type(value)
|
|
75
|
-
: undefined;
|
|
76
|
-
if (type !== undefined) {
|
|
77
|
-
return parser
|
|
78
|
-
.childParser((c) => c.isTypeOf(type))
|
|
79
|
-
.deserialize(value, options);
|
|
80
|
-
}
|
|
81
|
-
return parser.deserialize(value, options);
|
|
82
|
-
}
|
|
83
|
-
deserialize(value, options) {
|
|
84
|
-
const parserOptions = options !== undefined
|
|
85
|
-
? new ODataParserOptions(options)
|
|
86
|
-
: this.optionsHelper;
|
|
87
|
-
if (this.parser instanceof ODataStructuredTypeParser) {
|
|
88
|
-
const parser = this.parser;
|
|
89
|
-
return Array.isArray(value)
|
|
90
|
-
? value.map((v) => this.parse(parser, v, parserOptions))
|
|
91
|
-
: this.parse(parser, value, parserOptions);
|
|
92
|
-
}
|
|
93
|
-
return this.parser.deserialize(value, Object.assign({ field: this }, parserOptions));
|
|
94
|
-
}
|
|
95
|
-
//#endregion
|
|
96
|
-
//#region Serialize
|
|
97
|
-
toJson(parser, value, options) {
|
|
98
|
-
const type = Types.isPlainObject(value)
|
|
99
|
-
? options === null || options === void 0 ? void 0 : options.helper.type(value)
|
|
100
|
-
: undefined;
|
|
101
|
-
if (type !== undefined) {
|
|
102
|
-
return parser
|
|
103
|
-
.childParser((c) => c.isTypeOf(type))
|
|
104
|
-
.serialize(value, options);
|
|
105
|
-
}
|
|
106
|
-
return parser.serialize(value, options);
|
|
107
|
-
}
|
|
108
|
-
serialize(value, options) {
|
|
109
|
-
const parserOptions = options !== undefined
|
|
110
|
-
? new ODataParserOptions(options)
|
|
111
|
-
: this.optionsHelper;
|
|
112
|
-
if (this.parser instanceof ODataStructuredTypeParser) {
|
|
113
|
-
const parser = this.parser;
|
|
114
|
-
return Array.isArray(value)
|
|
115
|
-
? value.map((v) => this.toJson(parser, v, parserOptions))
|
|
116
|
-
: this.toJson(parser, value, parserOptions);
|
|
117
|
-
}
|
|
118
|
-
return this.parser.serialize(value, Object.assign({ field: this }, parserOptions));
|
|
119
|
-
}
|
|
120
|
-
//#endregion
|
|
121
|
-
//#region Encode
|
|
122
|
-
encode(value, options) {
|
|
123
|
-
const parserOptions = options !== undefined
|
|
124
|
-
? new ODataParserOptions(options)
|
|
125
|
-
: this.optionsHelper;
|
|
126
|
-
return this.parser.encode(value, Object.assign({ field: this }, parserOptions));
|
|
127
|
-
}
|
|
128
|
-
//#endregion
|
|
129
|
-
configure({ parserForType, options, }) {
|
|
130
|
-
this.optionsHelper = options;
|
|
131
|
-
this.parser = parserForType(this.type);
|
|
132
|
-
if (this.default !== undefined) {
|
|
133
|
-
this.default = this.deserialize(this.default, options);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
//#region Json Schema
|
|
137
|
-
// https://json-schema.org/
|
|
138
|
-
toJsonSchema(options = {}) {
|
|
139
|
-
let schema = this.parser instanceof ODataStructuredTypeFieldParser ||
|
|
140
|
-
this.parser instanceof ODataStructuredTypeParser ||
|
|
141
|
-
this.parser instanceof ODataEnumTypeParser
|
|
142
|
-
? this.parser.toJsonSchema(options)
|
|
143
|
-
: { title: this.name, type: 'object' };
|
|
144
|
-
if ([
|
|
145
|
-
'Edm.String',
|
|
146
|
-
'Edm.Date',
|
|
147
|
-
'Edm.TimeOfDay',
|
|
148
|
-
'Edm.DateTimeOffset',
|
|
149
|
-
'Edm.Guid',
|
|
150
|
-
'Edm.Binary',
|
|
151
|
-
].indexOf(this.type) !== -1) {
|
|
152
|
-
schema.type = 'string';
|
|
153
|
-
if (this.type === 'Edm.Date')
|
|
154
|
-
schema.format = 'date';
|
|
155
|
-
else if (this.type === 'Edm.TimeOfDay')
|
|
156
|
-
schema.format = 'time';
|
|
157
|
-
else if (this.type === 'Edm.DateTimeOffset')
|
|
158
|
-
schema.format = 'date-time';
|
|
159
|
-
else if (this.type === 'Edm.Guid')
|
|
160
|
-
schema.pattern =
|
|
161
|
-
'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$';
|
|
162
|
-
else if (this.type === 'Edm.Binary')
|
|
163
|
-
schema.contentEncoding = 'base64';
|
|
164
|
-
else if (this.type === 'Edm.String' && this.maxLength)
|
|
165
|
-
schema.maxLength = this.maxLength;
|
|
166
|
-
}
|
|
167
|
-
else if (['Edm.Int64', 'Edm.Int32', 'Edm.Int16', 'Edm.Byte', 'Edm.SByte'].indexOf(this.type) !== -1) {
|
|
168
|
-
//TODO: Range
|
|
169
|
-
schema.type = 'integer';
|
|
170
|
-
}
|
|
171
|
-
else if (['Edm.Decimal', 'Edm.Double'].indexOf(this.type) !== -1) {
|
|
172
|
-
schema.type = 'number';
|
|
173
|
-
}
|
|
174
|
-
else if (['Edm.Boolean'].indexOf(this.type) !== -1) {
|
|
175
|
-
schema.type = 'boolean';
|
|
176
|
-
}
|
|
177
|
-
if (this.default)
|
|
178
|
-
schema.default = this.default;
|
|
179
|
-
if (this.nullable)
|
|
180
|
-
schema.type = [schema.type, 'null'];
|
|
181
|
-
if (this.collection)
|
|
182
|
-
schema = {
|
|
183
|
-
type: 'array',
|
|
184
|
-
items: schema,
|
|
185
|
-
additionalItems: false,
|
|
186
|
-
};
|
|
187
|
-
return schema;
|
|
188
|
-
}
|
|
189
|
-
//#endregion
|
|
190
|
-
isKey() {
|
|
191
|
-
var _a;
|
|
192
|
-
return (((_a = this.structuredType.keys) === null || _a === void 0 ? void 0 : _a.find((k) => k.name === this.name)) !== undefined);
|
|
193
|
-
}
|
|
194
|
-
hasReferentials() {
|
|
195
|
-
return this.referentials.length !== 0;
|
|
196
|
-
}
|
|
197
|
-
isEdmType() {
|
|
198
|
-
return this.type.startsWith('Edm.');
|
|
199
|
-
}
|
|
200
|
-
isEnumType() {
|
|
201
|
-
return this.parser instanceof ODataEnumTypeParser;
|
|
202
|
-
}
|
|
203
|
-
enum() {
|
|
204
|
-
if (!this.isEnumType())
|
|
205
|
-
throw new Error('Field are not EnumType');
|
|
206
|
-
return this.parser;
|
|
207
|
-
}
|
|
208
|
-
isStructuredType() {
|
|
209
|
-
return this.parser instanceof ODataStructuredTypeParser;
|
|
210
|
-
}
|
|
211
|
-
structured() {
|
|
212
|
-
if (!this.isStructuredType())
|
|
213
|
-
throw new Error('Field are not StrucuturedType');
|
|
214
|
-
return this.parser;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
export class ODataStructuredTypeParser extends ODataAnnotatable {
|
|
218
|
-
constructor(config, namespace, alias) {
|
|
219
|
-
super(config);
|
|
220
|
-
this.children = [];
|
|
221
|
-
this.name = config.name;
|
|
222
|
-
this.base = config.base;
|
|
223
|
-
this.open = config.open || false;
|
|
224
|
-
this.namespace = namespace;
|
|
225
|
-
this.alias = alias;
|
|
226
|
-
if (Array.isArray(config.keys))
|
|
227
|
-
this.keys = config.keys.map((key) => new ODataEntityTypeKey(key));
|
|
228
|
-
this.fields = Object.entries(config.fields).map(([name, config]) => new ODataStructuredTypeFieldParser(name, this, config));
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Create a nicer looking title.
|
|
232
|
-
* Titleize is meant for creating pretty output.
|
|
233
|
-
* @param term The term of the annotation to find.
|
|
234
|
-
* @returns The titleized string.
|
|
235
|
-
*/
|
|
236
|
-
titelize(term) {
|
|
237
|
-
return this.annotatedValue(term) || Strings.titleCase(this.name);
|
|
238
|
-
}
|
|
239
|
-
isTypeOf(type) {
|
|
240
|
-
var names = [`${this.namespace}.${this.name}`];
|
|
241
|
-
if (this.alias)
|
|
242
|
-
names.push(`${this.alias}.${this.name}`);
|
|
243
|
-
return names.indexOf(type) !== -1;
|
|
244
|
-
}
|
|
245
|
-
typeFor(name) {
|
|
246
|
-
const field = this.fields.find((f) => f.name === name);
|
|
247
|
-
if (field === undefined && this.parent !== undefined)
|
|
248
|
-
return this.parent.typeFor(name);
|
|
249
|
-
return field !== undefined ? field.type : undefined;
|
|
250
|
-
}
|
|
251
|
-
findChildParser(predicate) {
|
|
252
|
-
if (predicate(this))
|
|
253
|
-
return this;
|
|
254
|
-
let match;
|
|
255
|
-
for (let ch of this.children) {
|
|
256
|
-
match = ch.findChildParser(predicate);
|
|
257
|
-
if (match !== undefined)
|
|
258
|
-
break;
|
|
259
|
-
}
|
|
260
|
-
return match;
|
|
261
|
-
}
|
|
262
|
-
childParser(predicate) {
|
|
263
|
-
return this.findChildParser(predicate) || NONE_PARSER;
|
|
264
|
-
}
|
|
265
|
-
// Deserialize
|
|
266
|
-
deserialize(value, options) {
|
|
267
|
-
const parserOptions = options !== undefined
|
|
268
|
-
? new ODataParserOptions(options)
|
|
269
|
-
: this.optionsHelper;
|
|
270
|
-
if (this.parent !== undefined)
|
|
271
|
-
value = this.parent.deserialize(value, parserOptions);
|
|
272
|
-
const fields = this.fields.filter((f) => f.name in value && value[f.name] !== undefined && value[f.name] !== null);
|
|
273
|
-
return Object.assign(Object.assign({}, value), fields.reduce((acc, f) => (Object.assign(Object.assign({}, acc), { [f.name]: f.deserialize(value[f.name], parserOptions) })), {}));
|
|
274
|
-
}
|
|
275
|
-
// Serialize
|
|
276
|
-
serialize(value, options) {
|
|
277
|
-
const parserOptions = options !== undefined
|
|
278
|
-
? new ODataParserOptions(options)
|
|
279
|
-
: this.optionsHelper;
|
|
280
|
-
if (this.parent !== undefined)
|
|
281
|
-
value = this.parent.serialize(value, parserOptions);
|
|
282
|
-
const fields = this.fields.filter((f) => f.name in value &&
|
|
283
|
-
value[f.name] !== undefined &&
|
|
284
|
-
value[f.name] !== null);
|
|
285
|
-
return Object.assign(Object.assign({}, value), fields.reduce((acc, f) => (Object.assign(Object.assign({}, acc), { [f.name]: f.serialize(value[f.name], parserOptions) })), {}));
|
|
286
|
-
}
|
|
287
|
-
// Encode
|
|
288
|
-
encode(value, options) {
|
|
289
|
-
const parserOptions = options !== undefined
|
|
290
|
-
? new ODataParserOptions(options)
|
|
291
|
-
: this.optionsHelper;
|
|
292
|
-
return raw(JSON.stringify(this.serialize(value, parserOptions)));
|
|
293
|
-
}
|
|
294
|
-
configure({ parserForType, options, }) {
|
|
295
|
-
this.optionsHelper = options;
|
|
296
|
-
if (this.base) {
|
|
297
|
-
const parent = parserForType(this.base);
|
|
298
|
-
parent.children.push(this);
|
|
299
|
-
this.parent = parent;
|
|
300
|
-
}
|
|
301
|
-
this.fields.forEach((f) => f.configure({ parserForType, options }));
|
|
302
|
-
}
|
|
303
|
-
resolveKey(value) {
|
|
304
|
-
var _a;
|
|
305
|
-
let key = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.resolveKey(value)) || {};
|
|
306
|
-
if (Array.isArray(this.keys) && this.keys.length > 0) {
|
|
307
|
-
for (var k of this.keys) {
|
|
308
|
-
let v = value;
|
|
309
|
-
let structured = this;
|
|
310
|
-
let field;
|
|
311
|
-
for (let name of k.name.split('/')) {
|
|
312
|
-
if (structured === undefined)
|
|
313
|
-
break;
|
|
314
|
-
field = structured.fields.find((f) => f.name === name);
|
|
315
|
-
if (field !== undefined) {
|
|
316
|
-
v = Types.isPlainObject(v) ? v[field.name] : v;
|
|
317
|
-
structured = field.isStructuredType()
|
|
318
|
-
? field.structured()
|
|
319
|
-
: undefined;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
if (field !== undefined && v !== undefined) {
|
|
323
|
-
key[k.alias || field.name] = field.encode(v);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
if (Types.isEmpty(key))
|
|
328
|
-
return undefined;
|
|
329
|
-
return Objects.resolveKey(key);
|
|
330
|
-
}
|
|
331
|
-
defaults() {
|
|
332
|
-
var _a;
|
|
333
|
-
let value = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.defaults()) || {};
|
|
334
|
-
let fields = this.fields.filter((f) => f.default !== undefined || f.isStructuredType());
|
|
335
|
-
return Object.assign(Object.assign({}, value), fields.reduce((acc, f) => {
|
|
336
|
-
let value = f.isStructuredType()
|
|
337
|
-
? f.structured().defaults()
|
|
338
|
-
: f.default;
|
|
339
|
-
return Types.isEmpty(value) ? acc : Object.assign(Object.assign({}, acc), { [f.name]: value });
|
|
340
|
-
}, {}));
|
|
341
|
-
}
|
|
342
|
-
// Json Schema
|
|
343
|
-
toJsonSchema(options = {}) {
|
|
344
|
-
var _a;
|
|
345
|
-
let schema = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.toJsonSchema(options)) || {
|
|
346
|
-
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
347
|
-
$id: `${this.namespace}.${this.name}`,
|
|
348
|
-
title: this.titelize(DESCRIPTION),
|
|
349
|
-
description: this.annotatedValue(LONG_DESCRIPTION),
|
|
350
|
-
type: 'object',
|
|
351
|
-
properties: {},
|
|
352
|
-
required: [],
|
|
353
|
-
};
|
|
354
|
-
const fields = this.fields.filter((f) => (!f.navigation || (options.expand && f.name in options.expand)) &&
|
|
355
|
-
(!options.select || options.select.indexOf(f.name) !== -1));
|
|
356
|
-
schema.properties = Object.assign({}, schema.properties, fields
|
|
357
|
-
.map((f) => {
|
|
358
|
-
let expand = options.expand && f.name in options.expand
|
|
359
|
-
? options.expand[f.name]
|
|
360
|
-
: undefined;
|
|
361
|
-
let schema = f.toJsonSchema(expand);
|
|
362
|
-
if (options.custom && f.name in options.custom)
|
|
363
|
-
schema = options.custom[f.name](schema, f);
|
|
364
|
-
return { [f.name]: schema };
|
|
365
|
-
})
|
|
366
|
-
.reduce((acc, v) => Object.assign(acc, v), {}));
|
|
367
|
-
schema.required = [
|
|
368
|
-
...schema.required,
|
|
369
|
-
...fields
|
|
370
|
-
.filter((f) => options.required && f.name in options.required
|
|
371
|
-
? options.required[f.name]
|
|
372
|
-
: !f.nullable)
|
|
373
|
-
.map((f) => f.name),
|
|
374
|
-
];
|
|
375
|
-
return schema;
|
|
376
|
-
}
|
|
377
|
-
validate(attrs, { method, navigation = false, } = {}) {
|
|
378
|
-
var _a;
|
|
379
|
-
const errors = (((_a = this.parent) === null || _a === void 0 ? void 0 : _a.validate(attrs, { method, navigation })) ||
|
|
380
|
-
{});
|
|
381
|
-
const fields = this.fields.filter((f) => !f.navigation || navigation);
|
|
382
|
-
for (var field of fields) {
|
|
383
|
-
const value = attrs[field.name];
|
|
384
|
-
const errs = field.validate(value, { method, navigation });
|
|
385
|
-
if (errs !== undefined) {
|
|
386
|
-
errors[field.name] = errs;
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3NjaGVtYS9wYXJzZXJzL3N0cnVjdHVyZWQtdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUtMLFdBQVcsR0FHWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQW1CbkQsTUFBTSxPQUFPLGtCQUFrQjtJQUc3QixZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBb0M7UUFDM0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUFZLEVBQ1YsUUFBUSxFQUNSLGtCQUFrQixHQUluQjtRQUNDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sOEJBQ1gsU0FBUSxnQkFBZ0I7SUFpQnhCLFlBQ0UsSUFBWSxFQUNaLGNBQThDLEVBQzlDLEtBQWdDO1FBRWhDLEtBQUss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RyxLQUFLLE1BS2hCLEVBQUU7O1FBRU4sTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUNsRSxFQUFFLENBQTRCLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsQ0FBQztRQUN0RSxLQUFLLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRTtZQUN4QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQWUsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQzthQUMzQjtTQUNGO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9iamVjdHMsIFN0cmluZ3MsIFR5cGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgUGFyc2VyLFxuICBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnLFxuICBTdHJ1Y3R1cmVkVHlwZUNvbmZpZyxcbiAgT3B0aW9uc0hlbHBlcixcbiAgTk9ORV9QQVJTRVIsXG4gIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zLFxuICBPcHRpb25zLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YUVudW1UeXBlUGFyc2VyIH0gZnJvbSAnLi9lbnVtLXR5cGUnO1xuaW1wb3J0IHsgQ09NUFVURUQsIERFU0NSSVBUSU9OLCBMT05HX0RFU0NSSVBUSU9OIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhQW5ub3RhdGFibGUgfSBmcm9tICcuLi9iYXNlJztcbmltcG9ydCB7IHJhdyB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9xdWVyeSc7XG5pbXBvcnQgeyBPRGF0YVBhcnNlck9wdGlvbnMgfSBmcm9tICcuLi8uLi9vcHRpb25zJztcblxuLy8gSlNPTiBTQ0hFTUFcbnR5cGUgSnNvblNjaGVtYVNlbGVjdDxUPiA9IEFycmF5PGtleW9mIFQ+O1xudHlwZSBKc29uU2NoZW1hQ3VzdG9tPFQ+ID0ge1xuICBbUCBpbiBrZXlvZiBUXT86IChcbiAgICBzY2hlbWE6IGFueSxcbiAgICBmaWVsZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPFRbUF0+XG4gICkgPT4gYW55O1xufTtcbnR5cGUgSnNvblNjaGVtYUV4cGFuZDxUPiA9IHsgW1AgaW4ga2V5b2YgVF0/OiBKc29uU2NoZW1hT3B0aW9uczxUW1BdPiB9O1xudHlwZSBKc29uU2NoZW1hUmVxdWlyZWQ8VD4gPSB7IFtQIGluIGtleW9mIFRdPzogYm9vbGVhbiB9O1xuZXhwb3J0IHR5cGUgSnNvblNjaGVtYU9wdGlvbnM8VD4gPSB7XG4gIHNlbGVjdD86IEpzb25TY2hlbWFTZWxlY3Q8VD47XG4gIGN1c3RvbT86IEpzb25TY2hlbWFDdXN0b208VD47XG4gIGV4cGFuZD86IEpzb25TY2hlbWFFeHBhbmQ8VD47XG4gIHJlcXVpcmVkPzogSnNvblNjaGVtYVJlcXVpcmVkPFQ+O1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhRW50aXR5VHlwZUtleSB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWxpYXM/OiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHsgbmFtZSwgYWxpYXMgfTogeyBuYW1lOiBzdHJpbmc7IGFsaWFzPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFSZWZlcmVudGlhbCB7XG4gIHByb3BlcnR5OiBzdHJpbmc7XG4gIHJlZmVyZW5jZWRQcm9wZXJ0eTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgcHJvcGVydHksXG4gICAgcmVmZXJlbmNlZFByb3BlcnR5LFxuICB9OiB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICByZWZlcmVuY2VkUHJvcGVydHk6IHN0cmluZztcbiAgfSkge1xuICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICB0aGlzLnJlZmVyZW5jZWRQcm9wZXJ0eSA9IHJlZmVyZW5jZWRQcm9wZXJ0eTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPFQ+XG4gIGV4dGVuZHMgT0RhdGFBbm5vdGF0YWJsZVxuICBpbXBsZW1lbnRzIFBhcnNlcjxUPlxue1xuICBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RydWN0dXJlZFR5cGU6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PjtcbiAgdHlwZTogc3RyaW5nO1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyPFQ+O1xuICBkZWZhdWx0PzogYW55O1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIGNvbGxlY3Rpb246IGJvb2xlYW47XG4gIG51bGxhYmxlOiBib29sZWFuO1xuICBuYXZpZ2F0aW9uOiBib29sZWFuO1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIHNjYWxlPzogbnVtYmVyO1xuICByZWZlcmVudGlhbHM6IE9EYXRhUmVmZXJlbnRpYWxbXTtcbiAgb3B0aW9uc0hlbHBlcj86IE9wdGlvbnNIZWxwZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cnVjdHVyZWRUeXBlOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4sXG4gICAgZmllbGQ6IFN0cnVjdHVyZWRUeXBlRmllbGRDb25maWdcbiAgKSB7XG4gICAgc3VwZXIoZmllbGQpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdHJ1Y3R1cmVkVHlwZSA9IHN0cnVjdHVyZWRUeXBlO1xuICAgIHRoaXMudHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgdGhpcy5wYXJzZXIgPSBOT05FX1BBUlNFUjtcbiAgICB0aGlzLnJlZmVyZW50aWFscyA9IChmaWVsZC5yZWZlcmVudGlhbHMgfHwgW10pLm1hcChcbiAgICAgIChyZWZlcmVudGlhbCkgPT4gbmV3IE9EYXRhUmVmZXJlbnRpYWwocmVmZXJlbnRpYWwpXG4gICAgKTtcbiAgICB0aGlzLmRlZmF1bHQgPSBmaWVsZC5kZWZhdWx0O1xuICAgIHRoaXMubWF4TGVuZ3RoID0gZmllbGQubWF4TGVuZ3RoO1xuICAgIHRoaXMubnVsbGFibGUgPSBmaWVsZC5udWxsYWJsZSAhPT0gdW5kZWZpbmVkID8gZmllbGQubnVsbGFibGUgOiB0cnVlO1xuICAgIHRoaXMuY29sbGVjdGlvbiA9IEJvb2xlYW4oZmllbGQuY29sbGVjdGlvbik7XG4gICAgdGhpcy5uYXZpZ2F0aW9uID0gQm9vbGVhbihmaWVsZC5uYXZpZ2F0aW9uKTtcbiAgICB0aGlzLnByZWNpc2lvbiA9IGZpZWxkLnByZWNpc2lvbjtcbiAgICB0aGlzLnNjYWxlID0gZmllbGQuc2NhbGU7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTpcbiAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgfCBzdHJpbmdbXVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZXJyb3JzO1xuICAgIGlmICh0aGlzLmNvbGxlY3Rpb24gJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGVycm9ycyA9IHZhbHVlLm1hcCgodikgPT4gdGhpcy52YWxpZGF0ZSh2LCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSkgYXMge1xuICAgICAgICBbbmFtZTogc3RyaW5nXTogYW55W107XG4gICAgICB9W107XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICh0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHZhbHVlICE9PSBudWxsKSB8fFxuICAgICAgKHRoaXMubmF2aWdhdGlvbiAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgZXJyb3JzID1cbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmVkKCkudmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pIHx8XG4gICAgICAgICh7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnlbXSB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5pc0VudW1UeXBlKCkgJiZcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgKSB7XG4gICAgICBlcnJvcnMgPSB0aGlzLmVudW0oKS52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElzRWRtVHlwZVxuICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmFubm90YXRlZFZhbHVlPGJvb2xlYW4+KENPTVBVVEVEKTtcbiAgICAgIGVycm9ycyA9IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5udWxsYWJsZSAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWV0aG9kICE9PSAnbW9kaWZ5JykpICYmIC8vIElzIG51bGwgb3IgdW5kZWZpbmVkIHdpdGhvdXQgcGF0Y2g/XG4gICAgICAgICEoY29tcHV0ZWQgJiYgbWV0aG9kID09PSAnY3JlYXRlJykgLy8gTm90IChJcyBDb21wdXRlZCBmaWVsZCBhbmQgY3JlYXRlKSA/XG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYHJlcXVpcmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBtYXhsZW5ndGhgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICFUeXBlcy5pc0VtcHR5KGVycm9ycykgPyBlcnJvcnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyNyZWdpb24gRGVzZXJpYWxpemVcbiAgcHJpdmF0ZSBwYXJzZShcbiAgICBwYXJzZXI6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD4sXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zPzogT3B0aW9uc0hlbHBlclxuICApOiBhbnkge1xuICAgIGNvbnN0IHR5cGUgPSBUeXBlcy5pc1BsYWluT2JqZWN0KHZhbHVlKVxuICAgICAgPyBvcHRpb25zPy5oZWxwZXIudHlwZSh2YWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwYXJzZXJcbiAgICAgICAgLmNoaWxkUGFyc2VyKChjKSA9PiBjLmlzVHlwZU9mKHR5cGUpKVxuICAgICAgICAuZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBPcHRpb25zKTogVCB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5vcHRpb25zSGVscGVyO1xuICAgIGlmICh0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXIpIHtcbiAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD47XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS5tYXAoKHYpID0+IHRoaXMucGFyc2UocGFyc2VyLCB2LCBwYXJzZXJPcHRpb25zKSlcbiAgICAgICAgOiB0aGlzLnBhcnNlKHBhcnNlciwgdmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZGVzZXJpYWxpemUodmFsdWUsIHtcbiAgICAgIGZpZWxkOiB0aGlzLFxuICAgICAgLi4ucGFyc2VyT3B0aW9ucyxcbiAgICB9IGFzIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2VyaWFsaXplXG4gIHByaXZhdGUgdG9Kc29uKFxuICAgIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPixcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM/OiBPcHRpb25zSGVscGVyXG4gICk6IGFueSB7XG4gICAgY29uc3QgdHlwZSA9IFR5cGVzLmlzUGxhaW5PYmplY3QodmFsdWUpXG4gICAgICA/IG9wdGlvbnM/LmhlbHBlci50eXBlKHZhbHVlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBhcnNlclxuICAgICAgICAuY2hpbGRQYXJzZXIoKGMpID0+IGMuaXNUeXBlT2YodHlwZSkpXG4gICAgICAgIC5zZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBzZXJpYWxpemUodmFsdWU6IFQsIG9wdGlvbnM/OiBPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgaWYgKHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcikge1xuICAgICAgY29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXIgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICA/ICh2YWx1ZSBhcyBhbnlbXSkubWFwKCh2KSA9PiB0aGlzLnRvSnNvbihwYXJzZXIsIHYsIHBhcnNlck9wdGlvbnMpKVxuICAgICAgICA6IHRoaXMudG9Kc29uKHBhcnNlciwgdmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuc2VyaWFsaXplKHZhbHVlLCB7XG4gICAgICBmaWVsZDogdGhpcyxcbiAgICAgIC4uLnBhcnNlck9wdGlvbnMsXG4gICAgfSBhcyBTdHJ1Y3R1cmVkVHlwZUZpZWxkT3B0aW9ucyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEVuY29kZVxuICBlbmNvZGUodmFsdWU6IFQsIG9wdGlvbnM/OiBPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmVuY29kZSh2YWx1ZSwge1xuICAgICAgZmllbGQ6IHRoaXMsXG4gICAgICAuLi5wYXJzZXJPcHRpb25zLFxuICAgIH0gYXMgU3RydWN0dXJlZFR5cGVGaWVsZE9wdGlvbnMpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgcGFyc2VyRm9yVHlwZSxcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gUGFyc2VyPGFueT47XG4gICAgb3B0aW9uczogT3B0aW9uc0hlbHBlcjtcbiAgfSkge1xuICAgIHRoaXMub3B0aW9uc0hlbHBlciA9IG9wdGlvbnM7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXJGb3JUeXBlKHRoaXMudHlwZSk7XG4gICAgaWYgKHRoaXMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlc2VyaWFsaXplKHRoaXMuZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8jcmVnaW9uIEpzb24gU2NoZW1hXG4gIC8vIGh0dHBzOi8vanNvbi1zY2hlbWEub3JnL1xuICB0b0pzb25TY2hlbWEob3B0aW9uczogSnNvblNjaGVtYU9wdGlvbnM8VD4gPSB7fSkge1xuICAgIGxldCBzY2hlbWE6IGFueSA9XG4gICAgICB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlciB8fFxuICAgICAgdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyIHx8XG4gICAgICB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhRW51bVR5cGVQYXJzZXJcbiAgICAgICAgPyB0aGlzLnBhcnNlci50b0pzb25TY2hlbWEob3B0aW9ucylcbiAgICAgICAgOiAoeyB0aXRsZTogdGhpcy5uYW1lLCB0eXBlOiAnb2JqZWN0JyB9IGFzIGFueSk7XG5cbiAgICBpZiAoXG4gICAgICBbXG4gICAgICAgICdFZG0uU3RyaW5nJyxcbiAgICAgICAgJ0VkbS5EYXRlJyxcbiAgICAgICAgJ0VkbS5UaW1lT2ZEYXknLFxuICAgICAgICAnRWRtLkRhdGVUaW1lT2Zmc2V0JyxcbiAgICAgICAgJ0VkbS5HdWlkJyxcbiAgICAgICAgJ0VkbS5CaW5hcnknLFxuICAgICAgXS5pbmRleE9mKHRoaXMudHlwZSkgIT09IC0xXG4gICAgKSB7XG4gICAgICBzY2hlbWEudHlwZSA9ICdzdHJpbmcnO1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5EYXRlJykgc2NoZW1hLmZvcm1hdCA9ICdkYXRlJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5UaW1lT2ZEYXknKSBzY2hlbWEuZm9ybWF0ID0gJ3RpbWUnO1xuICAgICAgZWxzZSBpZiAodGhpcy50eXBlID09PSAnRWRtLkRhdGVUaW1lT2Zmc2V0Jykgc2NoZW1hLmZvcm1hdCA9ICdkYXRlLXRpbWUnO1xuICAgICAgZWxzZSBpZiAodGhpcy50eXBlID09PSAnRWRtLkd1aWQnKVxuICAgICAgICBzY2hlbWEucGF0dGVybiA9XG4gICAgICAgICAgJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5CaW5hcnknKSBzY2hlbWEuY29udGVudEVuY29kaW5nID0gJ2Jhc2U2NCc7XG4gICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdFZG0uU3RyaW5nJyAmJiB0aGlzLm1heExlbmd0aClcbiAgICAgICAgc2NoZW1hLm1heExlbmd0aCA9IHRoaXMubWF4TGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBbJ0VkbS5JbnQ2NCcsICdFZG0uSW50MzInLCAnRWRtLkludDE2JywgJ0VkbS5CeXRlJywgJ0VkbS5TQnl0ZSddLmluZGV4T2YoXG4gICAgICAgIHRoaXMudHlwZVxuICAgICAgKSAhPT0gLTFcbiAgICApIHtcbiAgICAgIC8vVE9ETzogUmFuZ2VcbiAgICAgIHNjaGVtYS50eXBlID0gJ2ludGVnZXInO1xuICAgIH0gZWxzZSBpZiAoWydFZG0uRGVjaW1hbCcsICdFZG0uRG91YmxlJ10uaW5kZXhPZih0aGlzLnR5cGUpICE9PSAtMSkge1xuICAgICAgc2NoZW1hLnR5cGUgPSAnbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKFsnRWRtLkJvb2xlYW4nXS5pbmRleE9mKHRoaXMudHlwZSkgIT09IC0xKSB7XG4gICAgICBzY2hlbWEudHlwZSA9ICdib29sZWFuJztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVmYXVsdCkgc2NoZW1hLmRlZmF1bHQgPSB0aGlzLmRlZmF1bHQ7XG4gICAgaWYgKHRoaXMubnVsbGFibGUpIHNjaGVtYS50eXBlID0gW3NjaGVtYS50eXBlLCAnbnVsbCddO1xuICAgIGlmICh0aGlzLmNvbGxlY3Rpb24pXG4gICAgICBzY2hlbWEgPSB7XG4gICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgIGl0ZW1zOiBzY2hlbWEsXG4gICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICB9O1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgaXNLZXkoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RydWN0dXJlZFR5cGUua2V5cz8uZmluZCgoaykgPT4gay5uYW1lID09PSB0aGlzLm5hbWUpICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgaGFzUmVmZXJlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnJlZmVyZW50aWFscy5sZW5ndGggIT09IDA7XG4gIH1cblxuICBpc0VkbVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZS5zdGFydHNXaXRoKCdFZG0uJyk7XG4gIH1cblxuICBpc0VudW1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhRW51bVR5cGVQYXJzZXI7XG4gIH1cblxuICBlbnVtKCkge1xuICAgIGlmICghdGhpcy5pc0VudW1UeXBlKCkpIHRocm93IG5ldyBFcnJvcignRmllbGQgYXJlIG5vdCBFbnVtVHlwZScpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBhcyBPRGF0YUVudW1UeXBlUGFyc2VyPFQ+O1xuICB9XG5cbiAgaXNTdHJ1Y3R1cmVkVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyO1xuICB9XG5cbiAgc3RydWN0dXJlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNTdHJ1Y3R1cmVkVHlwZSgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWVsZCBhcmUgbm90IFN0cnVjdXR1cmVkVHlwZScpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+XG4gIGV4dGVuZHMgT0RhdGFBbm5vdGF0YWJsZVxuICBpbXBsZW1lbnRzIFBhcnNlcjxUPlxue1xuICBuYW1lOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICBvcGVuOiBib29sZWFuO1xuICBjaGlsZHJlbjogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+W10gPSBbXTtcbiAgYWxpYXM/OiBzdHJpbmc7XG4gIGJhc2U/OiBzdHJpbmc7XG4gIHBhcmVudD86IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PjtcbiAga2V5cz86IE9EYXRhRW50aXR5VHlwZUtleVtdO1xuICBmaWVsZHM6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxhbnk+W107XG4gIG9wdGlvbnNIZWxwZXI/OiBPcHRpb25zSGVscGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZzogU3RydWN0dXJlZFR5cGVDb25maWc8VD4sXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLmJhc2UgPSBjb25maWcuYmFzZTtcbiAgICB0aGlzLm9wZW4gPSBjb25maWcub3BlbiB8fCBmYWxzZTtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLmtleXMpKVxuICAgICAgdGhpcy5rZXlzID0gY29uZmlnLmtleXMubWFwKChrZXkpID0+IG5ldyBPRGF0YUVudGl0eVR5cGVLZXkoa2V5KSk7XG4gICAgdGhpcy5maWVsZHMgPSBPYmplY3QuZW50cmllczxTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnPihcbiAgICAgIGNvbmZpZy5maWVsZHMgYXMgeyBbUCBpbiBrZXlvZiBUXTogU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyB9XG4gICAgKS5tYXAoXG4gICAgICAoW25hbWUsIGNvbmZpZ10pID0+IG5ldyBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXIobmFtZSwgdGhpcywgY29uZmlnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmljZXIgbG9va2luZyB0aXRsZS5cbiAgICogVGl0bGVpemUgaXMgbWVhbnQgZm9yIGNyZWF0aW5nIHByZXR0eSBvdXRwdXQuXG4gICAqIEBwYXJhbSB0ZXJtIFRoZSB0ZXJtIG9mIHRoZSBhbm5vdGF0aW9uIHRvIGZpbmQuXG4gICAqIEByZXR1cm5zIFRoZSB0aXRsZWl6ZWQgc3RyaW5nLlxuICAgKi9cbiAgdGl0ZWxpemUodGVybTogc3RyaW5nIHwgUmVnRXhwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hbm5vdGF0ZWRWYWx1ZSh0ZXJtKSB8fCBTdHJpbmdzLnRpdGxlQ2FzZSh0aGlzLm5hbWUpO1xuICB9XG5cbiAgaXNUeXBlT2YodHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIG5hbWVzID0gW2Ake3RoaXMubmFtZXNwYWNlfS4ke3RoaXMubmFtZX1gXTtcbiAgICBpZiAodGhpcy5hbGlhcykgbmFtZXMucHVzaChgJHt0aGlzLmFsaWFzfS4ke3RoaXMubmFtZX1gKTtcbiAgICByZXR1cm4gbmFtZXMuaW5kZXhPZih0eXBlKSAhPT0gLTE7XG4gIH1cblxuICB0eXBlRm9yKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IG5hbWUpO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQudHlwZUZvcihuYW1lKTtcbiAgICByZXR1cm4gZmllbGQgIT09IHVuZGVmaW5lZCA/IGZpZWxkLnR5cGUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBmaW5kQ2hpbGRQYXJzZXIoXG4gICAgcHJlZGljYXRlOiAocDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+KSA9PiBib29sZWFuXG4gICk6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByZWRpY2F0ZSh0aGlzKSkgcmV0dXJuIHRoaXM7XG4gICAgbGV0IG1hdGNoOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgY2ggb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgbWF0Y2ggPSBjaC5maW5kQ2hpbGRQYXJzZXIocHJlZGljYXRlKTtcbiAgICAgIGlmIChtYXRjaCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgY2hpbGRQYXJzZXIoXG4gICAgcHJlZGljYXRlOiAocDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+KSA9PiBib29sZWFuXG4gICk6IFBhcnNlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kQ2hpbGRQYXJzZXIocHJlZGljYXRlKSB8fCBOT05FX1BBUlNFUjtcbiAgfVxuXG4gIC8vIERlc2VyaWFsaXplXG4gIGRlc2VyaWFsaXplKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBPcHRpb25zKTogVCB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5vcHRpb25zSGVscGVyO1xuICAgIGlmICh0aGlzLnBhcmVudCAhPT0gdW5kZWZpbmVkKVxuICAgICAgdmFsdWUgPSB0aGlzLnBhcmVudC5kZXNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMuZmlsdGVyKFxuICAgICAgKGYpID0+XG4gICAgICAgIGYubmFtZSBpbiB2YWx1ZSAmJiB2YWx1ZVtmLm5hbWVdICE9PSB1bmRlZmluZWQgJiYgdmFsdWVbZi5uYW1lXSAhPT0gbnVsbFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgLi4uZmllbGRzLnJlZHVjZShcbiAgICAgICAgKGFjYywgZikgPT4gKHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgW2YubmFtZV06IGYuZGVzZXJpYWxpemUodmFsdWVbZi5uYW1lXSwgcGFyc2VyT3B0aW9ucyksXG4gICAgICAgIH0pLFxuICAgICAgICB7fVxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gU2VyaWFsaXplXG4gIHNlcmlhbGl6ZSh2YWx1ZTogVCwgb3B0aW9ucz86IE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMub3B0aW9uc0hlbHBlcjtcbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZClcbiAgICAgIHZhbHVlID0gdGhpcy5wYXJlbnQuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgZi5uYW1lIGluIHZhbHVlICYmXG4gICAgICAgICh2YWx1ZSBhcyBhbnkpW2YubmFtZV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAodmFsdWUgYXMgYW55KVtmLm5hbWVdICE9PSBudWxsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICAuLi5maWVsZHMucmVkdWNlKFxuICAgICAgICAoYWNjLCBmKSA9PiAoe1xuICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICBbZi5uYW1lXTogZi5zZXJpYWxpemUoKHZhbHVlIGFzIGFueSlbZi5uYW1lXSwgcGFyc2VyT3B0aW9ucyksXG4gICAgICAgIH0pLFxuICAgICAgICB7fVxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gRW5jb2RlXG4gIGVuY29kZSh2YWx1ZTogVCwgb3B0aW9ucz86IE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMub3B0aW9uc0hlbHBlcjtcbiAgICByZXR1cm4gcmF3KEpTT04uc3RyaW5naWZ5KHRoaXMuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKSkpO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBwYXJzZXJGb3JUeXBlLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBwYXJzZXJGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBQYXJzZXI8YW55PjtcbiAgICBvcHRpb25zOiBPcHRpb25zSGVscGVyO1xuICB9KSB7XG4gICAgdGhpcy5vcHRpb25zSGVscGVyID0gb3B0aW9ucztcbiAgICBpZiAodGhpcy5iYXNlKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJzZXJGb3JUeXBlKHRoaXMuYmFzZSkgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+O1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcyk7XG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgdGhpcy5maWVsZHMuZm9yRWFjaCgoZikgPT4gZi5jb25maWd1cmUoeyBwYXJzZXJGb3JUeXBlLCBvcHRpb25zIH0pKTtcbiAgfVxuXG4gIHJlc29sdmVLZXkodmFsdWU6IGFueSk6IGFueSB7XG4gICAgbGV0IGtleSA9IHRoaXMucGFyZW50Py5yZXNvbHZlS2V5KHZhbHVlKSB8fCB7fTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmtleXMpICYmIHRoaXMua2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBrIG9mIHRoaXMua2V5cykge1xuICAgICAgICBsZXQgdiA9IHZhbHVlIGFzIGFueTtcbiAgICAgICAgbGV0IHN0cnVjdHVyZWQgPSB0aGlzIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGZpZWxkOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBvZiBrLm5hbWUuc3BsaXQoJy8nKSkge1xuICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICAgIGZpZWxkID0gc3RydWN0dXJlZC5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdiA9IFR5cGVzLmlzUGxhaW5PYmplY3QodikgPyB2W2ZpZWxkLm5hbWVdIDogdjtcbiAgICAgICAgICAgIHN0cnVjdHVyZWQgPSBmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKClcbiAgICAgICAgICAgICAgPyBmaWVsZC5zdHJ1Y3R1cmVkKClcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZCAhPT0gdW5kZWZpbmVkICYmIHYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGtleVtrLmFsaWFzIHx8IGZpZWxkLm5hbWVdID0gZmllbGQuZW5jb2RlKHYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChUeXBlcy5pc0VtcHR5KGtleSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdHMucmVzb2x2ZUtleShrZXkpO1xuICB9XG5cbiAgZGVmYXVsdHMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMucGFyZW50Py5kZWZhdWx0cygpIHx8IHt9O1xuICAgIGxldCBmaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoXG4gICAgICAoZikgPT4gZi5kZWZhdWx0ICE9PSB1bmRlZmluZWQgfHwgZi5pc1N0cnVjdHVyZWRUeXBlKClcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIC4uLmZpZWxkcy5yZWR1Y2UoKGFjYywgZikgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBmLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICAgICAgID8gZi5zdHJ1Y3R1cmVkKCkuZGVmYXVsdHMoKVxuICAgICAgICAgIDogZi5kZWZhdWx0O1xuICAgICAgICByZXR1cm4gVHlwZXMuaXNFbXB0eSh2YWx1ZSkgPyBhY2MgOiB7IC4uLmFjYywgW2YubmFtZV06IHZhbHVlIH07XG4gICAgICB9LCB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEpzb24gU2NoZW1hXG4gIHRvSnNvblNjaGVtYShvcHRpb25zOiBKc29uU2NoZW1hT3B0aW9uczxUPiA9IHt9KSB7XG4gICAgbGV0IHNjaGVtYTogYW55ID0gdGhpcy5wYXJlbnQ/LnRvSnNvblNjaGVtYShvcHRpb25zKSB8fCB7XG4gICAgICAkc2NoZW1hOiAnaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjJyxcbiAgICAgICRpZDogYCR7dGhpcy5uYW1lc3BhY2V9LiR7dGhpcy5uYW1lfWAsXG4gICAgICB0aXRsZTogdGhpcy50aXRlbGl6ZShERVNDUklQVElPTiksXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5hbm5vdGF0ZWRWYWx1ZShMT05HX0RFU0NSSVBUSU9OKSxcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge30sXG4gICAgICByZXF1aXJlZDogW10sXG4gICAgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgKCFmLm5hdmlnYXRpb24gfHwgKG9wdGlvbnMuZXhwYW5kICYmIGYubmFtZSBpbiBvcHRpb25zLmV4cGFuZCkpICYmXG4gICAgICAgICghb3B0aW9ucy5zZWxlY3QgfHwgKDxzdHJpbmdbXT5vcHRpb25zLnNlbGVjdCkuaW5kZXhPZihmLm5hbWUpICE9PSAtMSlcbiAgICApO1xuICAgIHNjaGVtYS5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgc2NoZW1hLnByb3BlcnRpZXMsXG4gICAgICBmaWVsZHNcbiAgICAgICAgLm1hcCgoZikgPT4ge1xuICAgICAgICAgIGxldCBleHBhbmQgPVxuICAgICAgICAgICAgb3B0aW9ucy5leHBhbmQgJiYgZi5uYW1lIGluIG9wdGlvbnMuZXhwYW5kXG4gICAgICAgICAgICAgID8gKG9wdGlvbnMuZXhwYW5kIGFzIGFueSlbZi5uYW1lXVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBsZXQgc2NoZW1hID0gZi50b0pzb25TY2hlbWEoZXhwYW5kKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jdXN0b20gJiYgZi5uYW1lIGluIG9wdGlvbnMuY3VzdG9tKVxuICAgICAgICAgICAgc2NoZW1hID0gKFxuICAgICAgICAgICAgICBvcHRpb25zLmN1c3RvbVtmLm5hbWUgYXMga2V5b2YgVF0gYXMgKFxuICAgICAgICAgICAgICAgIHNjaGVtYTogYW55LFxuICAgICAgICAgICAgICAgIGZpZWxkOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PlxuICAgICAgICAgICAgICApID0+IGFueVxuICAgICAgICAgICAgKShzY2hlbWEsIGYpO1xuICAgICAgICAgIHJldHVybiB7IFtmLm5hbWVdOiBzY2hlbWEgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZHVjZSgoYWNjLCB2KSA9PiBPYmplY3QuYXNzaWduKGFjYywgdiksIHt9KVxuICAgICk7XG4gICAgc2NoZW1hLnJlcXVpcmVkID0gW1xuICAgICAgLi4uc2NoZW1hLnJlcXVpcmVkLFxuICAgICAgLi4uZmllbGRzXG4gICAgICAgIC5maWx0ZXIoKGYpID0+XG4gICAgICAgICAgb3B0aW9ucy5yZXF1aXJlZCAmJiBmLm5hbWUgaW4gb3B0aW9ucy5yZXF1aXJlZFxuICAgICAgICAgICAgPyBvcHRpb25zLnJlcXVpcmVkW2YubmFtZSBhcyBrZXlvZiBUXVxuICAgICAgICAgICAgOiAhZi5udWxsYWJsZVxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGYpID0+IGYubmFtZSksXG4gICAgXTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgYXR0cnM6IGFueSxcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgY3JlYXRlPzogYm9vbGVhbjtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXJyb3JzID0gKHRoaXMucGFyZW50Py52YWxpZGF0ZShhdHRycywgeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgfHxcbiAgICAgIHt9KSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoKGYpID0+ICFmLm5hdmlnYXRpb24gfHwgbmF2aWdhdGlvbik7XG4gICAgZm9yICh2YXIgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF0dHJzW2ZpZWxkLm5hbWUgYXMga2V5b2YgVF07XG4gICAgICBjb25zdCBlcnJzID0gZmllbGQudmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICAgICAgaWYgKGVycnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcnNbZmllbGQubmFtZV0gPSBlcnJzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { OData } from '../utils/odata';
|
|
2
|
-
import { ODataAnnotatable } from './base';
|
|
3
|
-
import { ODataCallable } from './callable';
|
|
4
|
-
import { ODataEntityContainer } from './entity-container';
|
|
5
|
-
import { ODataEnumType } from './enum-type';
|
|
6
|
-
import { ODataStructuredType } from './structured-type';
|
|
7
|
-
export class ODataSchema extends ODataAnnotatable {
|
|
8
|
-
constructor(config, api) {
|
|
9
|
-
super(config);
|
|
10
|
-
this.api = api;
|
|
11
|
-
this.namespace = config.namespace;
|
|
12
|
-
this.alias = config.alias;
|
|
13
|
-
this.enums = (config.enums || []).map((config) => new ODataEnumType(config, this));
|
|
14
|
-
this.entities = (config.entities || []).map((config) => new ODataStructuredType(config, this));
|
|
15
|
-
this.callables = OData.mergeCallableParameters(config.callables || []).map((config) => new ODataCallable(config, this));
|
|
16
|
-
this.containers = (config.containers || []).map((config) => new ODataEntityContainer(config, this));
|
|
17
|
-
}
|
|
18
|
-
isNamespaceOf(type) {
|
|
19
|
-
return (type.startsWith(this.namespace) ||
|
|
20
|
-
(this.alias && type.startsWith(this.alias)));
|
|
21
|
-
}
|
|
22
|
-
get entitySets() {
|
|
23
|
-
return this.containers.reduce((acc, container) => [...acc, ...container.entitySets], []);
|
|
24
|
-
}
|
|
25
|
-
//#region Find for Type
|
|
26
|
-
findEnumTypeForType(type) {
|
|
27
|
-
return this.enums.find((e) => e.isTypeOf(type));
|
|
28
|
-
}
|
|
29
|
-
findStructuredTypeForType(type) {
|
|
30
|
-
return this.entities.find((e) => e.isTypeOf(type));
|
|
31
|
-
}
|
|
32
|
-
findCallableForType(type, bindingType) {
|
|
33
|
-
return this.callables.find((c) => {
|
|
34
|
-
var _a;
|
|
35
|
-
return c.isTypeOf(type) &&
|
|
36
|
-
(bindingType === undefined || bindingType === ((_a = c.binding()) === null || _a === void 0 ? void 0 : _a.type));
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
findEntitySetForType(type) {
|
|
40
|
-
return this.entitySets.find((e) => e.isTypeOf(type));
|
|
41
|
-
}
|
|
42
|
-
//#endregion
|
|
43
|
-
configure({ parserForType, findOptionsForType, }) {
|
|
44
|
-
// Configure Enums
|
|
45
|
-
this.enums.forEach((enu) => enu.configure());
|
|
46
|
-
// Configure Entities
|
|
47
|
-
this.entities.forEach((config) => config.configure({ parserForType, findOptionsForType }));
|
|
48
|
-
// Configure callables
|
|
49
|
-
this.callables.forEach((callable) => callable.configure({ parserForType }));
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3NjaGVtYS9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBbUIsTUFBTSxRQUFRLENBQUM7QUFFM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXhELE1BQU0sT0FBTyxXQUFZLFNBQVEsZ0JBQWdCO0lBUy9DLFlBQVksTUFBb0IsRUFBRSxHQUFhO1FBQzdDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQ25DLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQzVDLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQ3pDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJ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O0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYXJzZXIsIFNjaGVtYUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgT0RhdGEgfSBmcm9tICcuLi91dGlscy9vZGF0YSc7XG5pbXBvcnQgeyBPRGF0YUFubm90YXRhYmxlLCBPRGF0YUFubm90YXRpb24gfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgT0RhdGFBcGkgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHsgT0RhdGFDYWxsYWJsZSB9IGZyb20gJy4vY2FsbGFibGUnO1xuaW1wb3J0IHsgT0RhdGFFbnRpdHlDb250YWluZXIgfSBmcm9tICcuL2VudGl0eS1jb250YWluZXInO1xuaW1wb3J0IHsgT0RhdGFFbnRpdHlTZXQgfSBmcm9tICcuL2VudGl0eS1zZXQnO1xuaW1wb3J0IHsgT0RhdGFFbnVtVHlwZSB9IGZyb20gJy4vZW51bS10eXBlJztcbmltcG9ydCB7IE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuL3N0cnVjdHVyZWQtdHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVNjaGVtYSBleHRlbmRzIE9EYXRhQW5ub3RhdGFibGUge1xuICBhcGk6IE9EYXRhQXBpO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgYWxpYXM/OiBzdHJpbmc7XG4gIGVudW1zOiBPRGF0YUVudW1UeXBlPGFueT5bXTtcbiAgZW50aXRpZXM6IE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PltdO1xuICBjYWxsYWJsZXM6IE9EYXRhQ2FsbGFibGU8YW55PltdO1xuICBjb250YWluZXJzOiBPRGF0YUVudGl0eUNvbnRhaW5lcltdO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU2NoZW1hQ29uZmlnLCBhcGk6IE9EYXRhQXBpKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLmFwaSA9IGFwaTtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IGNvbmZpZy5uYW1lc3BhY2U7XG4gICAgdGhpcy5hbGlhcyA9IGNvbmZpZy5hbGlhcztcbiAgICB0aGlzLmVudW1zID0gKGNvbmZpZy5lbnVtcyB8fCBbXSkubWFwKFxuICAgICAgKGNvbmZpZykgPT4gbmV3IE9EYXRhRW51bVR5cGUoY29uZmlnLCB0aGlzKVxuICAgICk7XG4gICAgdGhpcy5lbnRpdGllcyA9IChjb25maWcuZW50aXRpZXMgfHwgW10pLm1hcChcbiAgICAgIChjb25maWcpID0+IG5ldyBPRGF0YVN0cnVjdHVyZWRUeXBlKGNvbmZpZywgdGhpcylcbiAgICApO1xuICAgIHRoaXMuY2FsbGFibGVzID0gT0RhdGEubWVyZ2VDYWxsYWJsZVBhcmFtZXRlcnMoY29uZmlnLmNhbGxhYmxlcyB8fCBbXSkubWFwKFxuICAgICAgKGNvbmZpZykgPT4gbmV3IE9EYXRhQ2FsbGFibGUoY29uZmlnLCB0aGlzKVxuICAgICk7XG4gICAgdGhpcy5jb250YWluZXJzID0gKGNvbmZpZy5jb250YWluZXJzIHx8IFtdKS5tYXAoXG4gICAgICAoY29uZmlnKSA9PiBuZXcgT0RhdGFFbnRpdHlDb250YWluZXIoY29uZmlnLCB0aGlzKVxuICAgICk7XG4gIH1cblxuICBpc05hbWVzcGFjZU9mKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlLnN0YXJ0c1dpdGgodGhpcy5uYW1lc3BhY2UpIHx8XG4gICAgICAodGhpcy5hbGlhcyAmJiB0eXBlLnN0YXJ0c1dpdGgodGhpcy5hbGlhcykpXG4gICAgKTtcbiAgfVxuXG4gIGdldCBlbnRpdHlTZXRzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcnMucmVkdWNlKFxuICAgICAgKGFjYywgY29udGFpbmVyKSA9PiBbLi4uYWNjLCAuLi5jb250YWluZXIuZW50aXR5U2V0c10sXG4gICAgICBbXSBhcyBPRGF0YUVudGl0eVNldFtdXG4gICAgKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBGaW5kIGZvciBUeXBlXG4gIHB1YmxpYyBmaW5kRW51bVR5cGVGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVudW1zLmZpbmQoKGUpID0+IGUuaXNUeXBlT2YodHlwZSkpIGFzXG4gICAgICB8IE9EYXRhRW51bVR5cGU8VD5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50aXRpZXMuZmluZCgoZSkgPT4gZS5pc1R5cGVPZih0eXBlKSkgYXNcbiAgICAgIHwgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZmluZENhbGxhYmxlRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcsIGJpbmRpbmdUeXBlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbGFibGVzLmZpbmQoXG4gICAgICAoYykgPT5cbiAgICAgICAgYy5pc1R5cGVPZih0eXBlKSAmJlxuICAgICAgICAoYmluZGluZ1R5cGUgPT09IHVuZGVmaW5lZCB8fCBiaW5kaW5nVHlwZSA9PT0gYy5iaW5kaW5nKCk/LnR5cGUpXG4gICAgKSBhcyBPRGF0YUNhbGxhYmxlPFQ+IHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnRpdHlTZXRGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVudGl0eVNldHMuZmluZCgoZSkgPT4gZS5pc1R5cGVPZih0eXBlKSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgY29uZmlndXJlKHtcbiAgICBwYXJzZXJGb3JUeXBlLFxuICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgfToge1xuICAgIHBhcnNlckZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IFBhcnNlcjxhbnk+O1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gYW55O1xuICB9KSB7XG4gICAgLy8gQ29uZmlndXJlIEVudW1zXG4gICAgdGhpcy5lbnVtcy5mb3JFYWNoKChlbnUpID0+IGVudS5jb25maWd1cmUoKSk7XG4gICAgLy8gQ29uZmlndXJlIEVudGl0aWVzXG4gICAgdGhpcy5lbnRpdGllcy5mb3JFYWNoKChjb25maWcpID0+XG4gICAgICBjb25maWcuY29uZmlndXJlKHsgcGFyc2VyRm9yVHlwZSwgZmluZE9wdGlvbnNGb3JUeXBlIH0pXG4gICAgKTtcbiAgICAvLyBDb25maWd1cmUgY2FsbGFibGVzXG4gICAgdGhpcy5jYWxsYWJsZXMuZm9yRWFjaCgoY2FsbGFibGUpID0+IGNhbGxhYmxlLmNvbmZpZ3VyZSh7IHBhcnNlckZvclR5cGUgfSkpO1xuICB9XG59XG4iXX0=
|