ng2-rest 13.2.7 → 13.2.8
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 +135 -135
- package/assets/shared/shared_folder_info.txt +1 -1
- package/browser/README.md +24 -24
- package/browser/esm2020/lib/content-type.mjs +12 -12
- package/browser/esm2020/lib/cookie.mjs +28 -28
- package/browser/esm2020/lib/helpers.mjs +23 -23
- package/browser/esm2020/lib/index.mjs +12 -12
- package/browser/esm2020/lib/mapping.mjs +238 -238
- package/browser/esm2020/lib/models.mjs +159 -159
- package/browser/esm2020/lib/other/simple-resource.mjs +116 -116
- package/browser/esm2020/lib/params.mjs +278 -278
- package/browser/esm2020/lib/request-cache.mjs +100 -100
- package/browser/esm2020/lib/resource.service.mjs +213 -213
- package/browser/esm2020/lib/rest-headers.mjs +128 -128
- package/browser/esm2020/lib/rest-request.mjs +321 -321
- package/browser/esm2020/lib/rest.class.mjs +115 -115
- package/browser/esm2020/ng2-rest.mjs +4 -4
- package/browser/esm2020/public-api.mjs +1 -1
- package/browser/fesm2015/ng2-rest.mjs +1677 -1677
- package/browser/fesm2020/ng2-rest.mjs +1675 -1675
- package/browser/lib/content-type.d.ts +4 -4
- package/browser/lib/cookie.d.ts +7 -7
- package/browser/lib/helpers.d.ts +10 -10
- package/browser/lib/index.d.ts +9 -9
- package/browser/lib/mapping.d.ts +12 -12
- package/browser/lib/models.d.ts +157 -157
- package/browser/lib/other/simple-resource.d.ts +29 -29
- package/browser/lib/params.d.ts +23 -23
- package/browser/lib/request-cache.d.ts +17 -17
- package/browser/lib/resource.service.d.ts +43 -43
- package/browser/lib/rest-headers.d.ts +57 -57
- package/browser/lib/rest-request.d.ts +21 -21
- package/browser/lib/rest.class.d.ts +36 -36
- package/browser/ng2-rest.d.ts +4 -4
- package/client/README.md +24 -24
- package/client/esm2020/lib/content-type.mjs +12 -12
- package/client/esm2020/lib/cookie.mjs +28 -28
- package/client/esm2020/lib/helpers.mjs +23 -23
- package/client/esm2020/lib/index.mjs +12 -12
- package/client/esm2020/lib/mapping.mjs +238 -238
- package/client/esm2020/lib/models.mjs +159 -159
- package/client/esm2020/lib/other/simple-resource.mjs +116 -116
- package/client/esm2020/lib/params.mjs +278 -278
- package/client/esm2020/lib/request-cache.mjs +100 -100
- package/client/esm2020/lib/resource.service.mjs +213 -213
- package/client/esm2020/lib/rest-headers.mjs +128 -128
- package/client/esm2020/lib/rest-request.mjs +321 -321
- package/client/esm2020/lib/rest.class.mjs +115 -115
- package/client/esm2020/ng2-rest.mjs +4 -4
- package/client/esm2020/public-api.mjs +1 -1
- package/client/fesm2015/ng2-rest.mjs +1677 -1677
- package/client/fesm2020/ng2-rest.mjs +1675 -1675
- package/client/lib/content-type.d.ts +4 -4
- package/client/lib/cookie.d.ts +7 -7
- package/client/lib/helpers.d.ts +10 -10
- package/client/lib/index.d.ts +9 -9
- package/client/lib/mapping.d.ts +12 -12
- package/client/lib/models.d.ts +157 -157
- package/client/lib/other/simple-resource.d.ts +29 -29
- package/client/lib/params.d.ts +23 -23
- package/client/lib/request-cache.d.ts +17 -17
- package/client/lib/resource.service.d.ts +43 -43
- package/client/lib/rest-headers.d.ts +57 -57
- package/client/lib/rest-request.d.ts +21 -21
- package/client/lib/rest.class.d.ts +36 -36
- package/client/ng2-rest.d.ts +4 -4
- package/client/package.json +28 -28
- package/index.d.ts +1 -1
- package/index.js.map +1 -1
- package/lib/content-type.d.ts +5 -5
- package/lib/content-type.js.map +1 -1
- package/lib/cookie.d.ts +8 -8
- package/lib/cookie.js.map +1 -1
- package/lib/helpers.d.ts +11 -11
- package/lib/helpers.js.map +1 -1
- package/lib/index.d.ts +10 -10
- package/lib/index.js.map +1 -1
- package/lib/mapping.d.ts +13 -13
- package/lib/mapping.js.map +1 -1
- package/lib/models.d.ts +158 -158
- package/lib/models.js.map +1 -1
- package/lib/other/simple-resource.d.ts +30 -30
- package/lib/other/simple-resource.js.map +1 -1
- package/lib/params.d.ts +24 -24
- package/lib/params.js.map +1 -1
- package/lib/request-cache.d.ts +18 -18
- package/lib/request-cache.js.map +1 -1
- package/lib/resource.service.d.ts +44 -44
- package/lib/resource.service.js.map +1 -1
- package/lib/rest-headers.d.ts +58 -58
- package/lib/rest-headers.js.map +1 -1
- package/lib/rest-request.d.ts +22 -22
- package/lib/rest-request.js.map +1 -1
- package/lib/rest.class.d.ts +37 -37
- package/lib/rest.class.js.map +1 -1
- package/package.json +4 -4
- package/package.json_devDependencies.json +217 -217
- package/package.json_tnp.json5 +53 -50
- package/tmp-environment.json +34 -33
- package/websql/README.md +24 -24
- package/websql/esm2020/lib/content-type.mjs +12 -12
- package/websql/esm2020/lib/cookie.mjs +28 -28
- package/websql/esm2020/lib/helpers.mjs +23 -23
- package/websql/esm2020/lib/index.mjs +12 -12
- package/websql/esm2020/lib/mapping.mjs +238 -238
- package/websql/esm2020/lib/models.mjs +159 -159
- package/websql/esm2020/lib/other/simple-resource.mjs +116 -116
- package/websql/esm2020/lib/params.mjs +278 -278
- package/websql/esm2020/lib/request-cache.mjs +100 -100
- package/websql/esm2020/lib/resource.service.mjs +213 -213
- package/websql/esm2020/lib/rest-headers.mjs +128 -128
- package/websql/esm2020/lib/rest-request.mjs +321 -321
- package/websql/esm2020/lib/rest.class.mjs +115 -115
- package/websql/esm2020/ng2-rest.mjs +4 -4
- package/websql/esm2020/public-api.mjs +1 -1
- package/websql/fesm2015/ng2-rest.mjs +1677 -1677
- package/websql/fesm2020/ng2-rest.mjs +1675 -1675
- package/websql/lib/content-type.d.ts +4 -4
- package/websql/lib/cookie.d.ts +7 -7
- package/websql/lib/helpers.d.ts +10 -10
- package/websql/lib/index.d.ts +9 -9
- package/websql/lib/mapping.d.ts +12 -12
- package/websql/lib/models.d.ts +157 -157
- package/websql/lib/other/simple-resource.d.ts +29 -29
- package/websql/lib/params.d.ts +23 -23
- package/websql/lib/request-cache.d.ts +17 -17
- package/websql/lib/resource.service.d.ts +43 -43
- package/websql/lib/rest-headers.d.ts +57 -57
- package/websql/lib/rest-request.d.ts +21 -21
- package/websql/lib/rest.class.d.ts +36 -36
- package/websql/ng2-rest.d.ts +4 -4
|
@@ -1,250 +1,250 @@
|
|
|
1
|
-
import { _ } from 'tnp-core/browser';
|
|
2
|
-
import { Helpers } from 'tnp-core/browser';
|
|
3
|
-
import { walk } from 'lodash-walk-object/browser';
|
|
4
|
-
import { CLASS, SYMBOL } from 'typescript-class-helpers/browser';
|
|
5
|
-
export var Mapping;
|
|
6
|
-
(function (Mapping) {
|
|
7
|
-
function decode(json, autodetect = false) {
|
|
8
|
-
if (_.isUndefined(json)) {
|
|
9
|
-
return void 0;
|
|
10
|
-
}
|
|
11
|
-
let mapping = decodeFromDecorator(_.isArray(json) ? _.first(json) : json, !autodetect);
|
|
12
|
-
if (autodetect) {
|
|
13
|
-
mapping = _.merge(getMappingNaive(json), mapping);
|
|
14
|
-
}
|
|
15
|
-
return mapping;
|
|
16
|
-
}
|
|
17
|
-
Mapping.decode = decode;
|
|
18
|
-
function encode(json, mapping, circular = []) {
|
|
19
|
-
if (_.isString(json) || _.isBoolean(json) || _.isNumber(json)) {
|
|
20
|
-
return json;
|
|
21
|
-
}
|
|
22
|
-
if (mapping['']) {
|
|
23
|
-
const decoratorMapping = getModelsMapping(CLASS.getBy(mapping['']));
|
|
24
|
-
mapping = _.merge(mapping, decoratorMapping);
|
|
25
|
-
}
|
|
26
|
-
let res;
|
|
27
|
-
if (_.isArray(circular) && circular.length > 0) {
|
|
28
|
-
res = setMappingCirc(json, mapping, circular);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
res = setMapping(json, mapping);
|
|
32
|
-
}
|
|
33
|
-
return res;
|
|
34
|
-
}
|
|
35
|
-
Mapping.encode = encode;
|
|
36
|
-
function decodeFromDecorator(json, production = false) {
|
|
37
|
-
const entityClass = CLASS.getFromObject(json);
|
|
38
|
-
const mappings = getModelsMapping(entityClass);
|
|
39
|
-
return mappings;
|
|
40
|
-
}
|
|
41
|
-
function getModelsMapping(entity) {
|
|
42
|
-
if (!_.isFunction(entity) || entity === Object) {
|
|
43
|
-
return {};
|
|
44
|
-
}
|
|
45
|
-
const className = CLASS.getName(entity);
|
|
46
|
-
let enityOWnMapping = _.isArray(entity[SYMBOL.MODELS_MAPPING]) ?
|
|
47
|
-
entity[SYMBOL.MODELS_MAPPING] : [{ '': className }];
|
|
48
|
-
let res = {};
|
|
49
|
-
let parents = enityOWnMapping
|
|
50
|
-
.filter(m => !_.isUndefined(m['']) && m[''] !== className)
|
|
51
|
-
.map(m => m['']);
|
|
52
|
-
enityOWnMapping.reverse().forEach(m => {
|
|
53
|
-
m = _.cloneDeep(m);
|
|
54
|
-
Object.keys(m).forEach(key => {
|
|
55
|
-
const v = m[key];
|
|
56
|
-
const isArr = _.isArray(v);
|
|
57
|
-
const model = isArr ? _.first(v) : v;
|
|
58
|
-
if (parents.includes(model)) {
|
|
59
|
-
m[key] = isArr ? [className] : className;
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
res = _.merge(res, m);
|
|
63
|
-
});
|
|
64
|
-
res[''] = className;
|
|
65
|
-
return res;
|
|
66
|
-
}
|
|
67
|
-
Mapping.getModelsMapping = getModelsMapping;
|
|
68
|
-
function add(o, path, mapping = {}) {
|
|
69
|
-
if (!o || Array.isArray(o) || typeof o !== 'object')
|
|
70
|
-
return;
|
|
71
|
-
const objectClassName = CLASS.getName(Object.getPrototypeOf(o).constructor);
|
|
72
|
-
const resolveClass = CLASS.getBy(objectClassName);
|
|
73
|
-
if (!resolveClass) {
|
|
74
|
-
if (objectClassName !== 'Object') {
|
|
75
|
-
if (Helpers.isBrowser) {
|
|
76
|
-
console.error(`Cannot resolve class "${objectClassName}" while mapping.`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
if (!mapping[path])
|
|
82
|
-
mapping[path] = CLASS.getName(resolveClass);
|
|
83
|
-
;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* USE ONLY IN DEVELOPMENT
|
|
87
|
-
* @param c
|
|
88
|
-
* @param path
|
|
89
|
-
* @param mapping
|
|
90
|
-
* @param level
|
|
91
|
-
*/
|
|
92
|
-
function getMappingNaive(c, path = '', mapping = {}, level = 0) {
|
|
93
|
-
if (Array.isArray(c)) {
|
|
94
|
-
c.forEach(c => getMappingNaive(c, path, mapping, level));
|
|
95
|
-
return mapping;
|
|
96
|
-
}
|
|
97
|
-
if (++level === 16)
|
|
98
|
-
return;
|
|
99
|
-
add(c, path, mapping);
|
|
100
|
-
for (var p in c) {
|
|
101
|
-
if (c.hasOwnProperty(p)) {
|
|
102
|
-
const v = c[p];
|
|
103
|
-
if (Array.isArray(v) && v.length > 0) { // reducer as impovement
|
|
104
|
-
v.forEach((elem, i) => {
|
|
105
|
-
const currentPaht = [path, p].filter(c => c.trim() != '').join('.');
|
|
106
|
-
getMappingNaive(elem, currentPaht, mapping, level);
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
else if (typeof v === 'object') {
|
|
110
|
-
const currentPaht = [path, p].filter(c => c.trim() != '').join('.');
|
|
111
|
-
add(v, currentPaht, mapping);
|
|
112
|
-
getMappingNaive(v, currentPaht, mapping, level);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return mapping;
|
|
117
|
-
}
|
|
118
|
-
function getMappingPathFrom(pathLodhas) {
|
|
119
|
-
if (!_.isString(pathLodhas)) {
|
|
120
|
-
return void 0;
|
|
121
|
-
}
|
|
122
|
-
const regex = /\[([0-9a-zA-Z]|\'|\")*\]/g;
|
|
123
|
-
pathLodhas = pathLodhas
|
|
124
|
-
.replace(regex, '')
|
|
125
|
-
.replace('..', '.');
|
|
126
|
-
if (pathLodhas.startsWith('.')) {
|
|
127
|
-
pathLodhas = pathLodhas.slice(1);
|
|
128
|
-
}
|
|
129
|
-
return pathLodhas;
|
|
130
|
-
}
|
|
131
|
-
function setMappingCirc(json, mapping = {}, circular = []) {
|
|
132
|
-
const mainClassFn = !_.isArray(json) && CLASS.getBy(mapping['']);
|
|
133
|
-
walk.Object(json, (v, lodashPath, changeValue) => {
|
|
134
|
-
if (!_.isUndefined(v) && !_.isNull(v)) {
|
|
135
|
-
const mappingPath = getMappingPathFrom(lodashPath);
|
|
136
|
-
if (!_.isUndefined(mapping[mappingPath])) {
|
|
137
|
-
const isArray = _.isArray(mapping[mappingPath]);
|
|
138
|
-
if (!isArray) {
|
|
139
|
-
const className = isArray ? _.first(mapping[mappingPath]) : mapping[mappingPath];
|
|
140
|
-
const classFN = CLASS.getBy(className);
|
|
141
|
-
if (_.isFunction(classFN)) {
|
|
142
|
-
changeValue(_.merge(new classFN(), v));
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
circular.forEach(c => {
|
|
149
|
-
const ref = _.get(json, c.circuralTargetPath);
|
|
150
|
-
_.set(json, c.pathToObj, ref);
|
|
151
|
-
});
|
|
152
|
-
if (_.isFunction(mainClassFn)) {
|
|
153
|
-
json = _.merge(new mainClassFn(), json);
|
|
154
|
-
}
|
|
155
|
-
return json;
|
|
156
|
-
}
|
|
157
|
-
function setMapping(json, mapping = {}) {
|
|
158
|
-
if (Array.isArray(json)) {
|
|
159
|
-
return json.map(j => {
|
|
160
|
-
return setMapping(j, mapping);
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
const mainClassFn = CLASS.getBy(mapping['']);
|
|
164
|
-
for (const key in json) {
|
|
165
|
-
if (json.hasOwnProperty(key)) {
|
|
166
|
-
if (_.isArray(json[key])) {
|
|
167
|
-
json[key] = json[key].map(arrObj => {
|
|
168
|
-
const objMapping = getModelsMapping(CLASS.getBy(mapping[key]));
|
|
169
|
-
return setMapping(arrObj, objMapping);
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
else if (_.isObject(json[key])) {
|
|
173
|
-
const objMapping = getModelsMapping(CLASS.getBy(mapping[key]));
|
|
174
|
-
json[key] = setMapping(json[key], objMapping);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
Object
|
|
179
|
-
.keys(mapping)
|
|
180
|
-
.filter(key => key !== '' && key.split('.').length >= 2)
|
|
181
|
-
.forEach(lodasPath => {
|
|
182
|
-
const objMapping = getModelsMapping(CLASS.getBy(mapping[lodasPath]));
|
|
183
|
-
const input = _.get(json, lodasPath);
|
|
184
|
-
if (!_.isUndefined(input)) {
|
|
185
|
-
const res = setMapping(input, objMapping);
|
|
186
|
-
_.set(json, lodasPath, res);
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
if (!mainClassFn) {
|
|
190
|
-
return json;
|
|
191
|
-
}
|
|
192
|
-
return _.merge(new mainClassFn(), json);
|
|
193
|
-
}
|
|
194
|
-
function DefaultModelWithMapping(defaultModelValues, mapping) {
|
|
195
|
-
return function (target) {
|
|
196
|
-
if (!_.isArray(target[SYMBOL.MODELS_MAPPING])) {
|
|
197
|
-
target[SYMBOL.MODELS_MAPPING] = [];
|
|
198
|
-
}
|
|
199
|
-
target[SYMBOL.MODELS_MAPPING].push({ '': CLASS.getName(target) });
|
|
200
|
-
if (_.isObject(mapping)) {
|
|
201
|
-
target[SYMBOL.MODELS_MAPPING] = target[SYMBOL.MODELS_MAPPING].concat(mapping);
|
|
202
|
-
Object.keys(mapping)
|
|
203
|
-
.forEach(key => {
|
|
204
|
-
const v = mapping;
|
|
205
|
-
if (_.isUndefined(v) || _.isFunction(v)) {
|
|
1
|
+
import { _ } from 'tnp-core/browser';
|
|
2
|
+
import { Helpers } from 'tnp-core/browser';
|
|
3
|
+
import { walk } from 'lodash-walk-object/browser';
|
|
4
|
+
import { CLASS, SYMBOL } from 'typescript-class-helpers/browser';
|
|
5
|
+
export var Mapping;
|
|
6
|
+
(function (Mapping) {
|
|
7
|
+
function decode(json, autodetect = false) {
|
|
8
|
+
if (_.isUndefined(json)) {
|
|
9
|
+
return void 0;
|
|
10
|
+
}
|
|
11
|
+
let mapping = decodeFromDecorator(_.isArray(json) ? _.first(json) : json, !autodetect);
|
|
12
|
+
if (autodetect) {
|
|
13
|
+
mapping = _.merge(getMappingNaive(json), mapping);
|
|
14
|
+
}
|
|
15
|
+
return mapping;
|
|
16
|
+
}
|
|
17
|
+
Mapping.decode = decode;
|
|
18
|
+
function encode(json, mapping, circular = []) {
|
|
19
|
+
if (_.isString(json) || _.isBoolean(json) || _.isNumber(json)) {
|
|
20
|
+
return json;
|
|
21
|
+
}
|
|
22
|
+
if (mapping['']) {
|
|
23
|
+
const decoratorMapping = getModelsMapping(CLASS.getBy(mapping['']));
|
|
24
|
+
mapping = _.merge(mapping, decoratorMapping);
|
|
25
|
+
}
|
|
26
|
+
let res;
|
|
27
|
+
if (_.isArray(circular) && circular.length > 0) {
|
|
28
|
+
res = setMappingCirc(json, mapping, circular);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
res = setMapping(json, mapping);
|
|
32
|
+
}
|
|
33
|
+
return res;
|
|
34
|
+
}
|
|
35
|
+
Mapping.encode = encode;
|
|
36
|
+
function decodeFromDecorator(json, production = false) {
|
|
37
|
+
const entityClass = CLASS.getFromObject(json);
|
|
38
|
+
const mappings = getModelsMapping(entityClass);
|
|
39
|
+
return mappings;
|
|
40
|
+
}
|
|
41
|
+
function getModelsMapping(entity) {
|
|
42
|
+
if (!_.isFunction(entity) || entity === Object) {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
const className = CLASS.getName(entity);
|
|
46
|
+
let enityOWnMapping = _.isArray(entity[SYMBOL.MODELS_MAPPING]) ?
|
|
47
|
+
entity[SYMBOL.MODELS_MAPPING] : [{ '': className }];
|
|
48
|
+
let res = {};
|
|
49
|
+
let parents = enityOWnMapping
|
|
50
|
+
.filter(m => !_.isUndefined(m['']) && m[''] !== className)
|
|
51
|
+
.map(m => m['']);
|
|
52
|
+
enityOWnMapping.reverse().forEach(m => {
|
|
53
|
+
m = _.cloneDeep(m);
|
|
54
|
+
Object.keys(m).forEach(key => {
|
|
55
|
+
const v = m[key];
|
|
56
|
+
const isArr = _.isArray(v);
|
|
57
|
+
const model = isArr ? _.first(v) : v;
|
|
58
|
+
if (parents.includes(model)) {
|
|
59
|
+
m[key] = isArr ? [className] : className;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
res = _.merge(res, m);
|
|
63
|
+
});
|
|
64
|
+
res[''] = className;
|
|
65
|
+
return res;
|
|
66
|
+
}
|
|
67
|
+
Mapping.getModelsMapping = getModelsMapping;
|
|
68
|
+
function add(o, path, mapping = {}) {
|
|
69
|
+
if (!o || Array.isArray(o) || typeof o !== 'object')
|
|
70
|
+
return;
|
|
71
|
+
const objectClassName = CLASS.getName(Object.getPrototypeOf(o).constructor);
|
|
72
|
+
const resolveClass = CLASS.getBy(objectClassName);
|
|
73
|
+
if (!resolveClass) {
|
|
74
|
+
if (objectClassName !== 'Object') {
|
|
75
|
+
if (Helpers.isBrowser) {
|
|
76
|
+
console.error(`Cannot resolve class "${objectClassName}" while mapping.`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!mapping[path])
|
|
82
|
+
mapping[path] = CLASS.getName(resolveClass);
|
|
83
|
+
;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* USE ONLY IN DEVELOPMENT
|
|
87
|
+
* @param c
|
|
88
|
+
* @param path
|
|
89
|
+
* @param mapping
|
|
90
|
+
* @param level
|
|
91
|
+
*/
|
|
92
|
+
function getMappingNaive(c, path = '', mapping = {}, level = 0) {
|
|
93
|
+
if (Array.isArray(c)) {
|
|
94
|
+
c.forEach(c => getMappingNaive(c, path, mapping, level));
|
|
95
|
+
return mapping;
|
|
96
|
+
}
|
|
97
|
+
if (++level === 16)
|
|
98
|
+
return;
|
|
99
|
+
add(c, path, mapping);
|
|
100
|
+
for (var p in c) {
|
|
101
|
+
if (c.hasOwnProperty(p)) {
|
|
102
|
+
const v = c[p];
|
|
103
|
+
if (Array.isArray(v) && v.length > 0) { // reducer as impovement
|
|
104
|
+
v.forEach((elem, i) => {
|
|
105
|
+
const currentPaht = [path, p].filter(c => c.trim() != '').join('.');
|
|
106
|
+
getMappingNaive(elem, currentPaht, mapping, level);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else if (typeof v === 'object') {
|
|
110
|
+
const currentPaht = [path, p].filter(c => c.trim() != '').join('.');
|
|
111
|
+
add(v, currentPaht, mapping);
|
|
112
|
+
getMappingNaive(v, currentPaht, mapping, level);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return mapping;
|
|
117
|
+
}
|
|
118
|
+
function getMappingPathFrom(pathLodhas) {
|
|
119
|
+
if (!_.isString(pathLodhas)) {
|
|
120
|
+
return void 0;
|
|
121
|
+
}
|
|
122
|
+
const regex = /\[([0-9a-zA-Z]|\'|\")*\]/g;
|
|
123
|
+
pathLodhas = pathLodhas
|
|
124
|
+
.replace(regex, '')
|
|
125
|
+
.replace('..', '.');
|
|
126
|
+
if (pathLodhas.startsWith('.')) {
|
|
127
|
+
pathLodhas = pathLodhas.slice(1);
|
|
128
|
+
}
|
|
129
|
+
return pathLodhas;
|
|
130
|
+
}
|
|
131
|
+
function setMappingCirc(json, mapping = {}, circular = []) {
|
|
132
|
+
const mainClassFn = !_.isArray(json) && CLASS.getBy(mapping['']);
|
|
133
|
+
walk.Object(json, (v, lodashPath, changeValue) => {
|
|
134
|
+
if (!_.isUndefined(v) && !_.isNull(v)) {
|
|
135
|
+
const mappingPath = getMappingPathFrom(lodashPath);
|
|
136
|
+
if (!_.isUndefined(mapping[mappingPath])) {
|
|
137
|
+
const isArray = _.isArray(mapping[mappingPath]);
|
|
138
|
+
if (!isArray) {
|
|
139
|
+
const className = isArray ? _.first(mapping[mappingPath]) : mapping[mappingPath];
|
|
140
|
+
const classFN = CLASS.getBy(className);
|
|
141
|
+
if (_.isFunction(classFN)) {
|
|
142
|
+
changeValue(_.merge(new classFN(), v));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
circular.forEach(c => {
|
|
149
|
+
const ref = _.get(json, c.circuralTargetPath);
|
|
150
|
+
_.set(json, c.pathToObj, ref);
|
|
151
|
+
});
|
|
152
|
+
if (_.isFunction(mainClassFn)) {
|
|
153
|
+
json = _.merge(new mainClassFn(), json);
|
|
154
|
+
}
|
|
155
|
+
return json;
|
|
156
|
+
}
|
|
157
|
+
function setMapping(json, mapping = {}) {
|
|
158
|
+
if (Array.isArray(json)) {
|
|
159
|
+
return json.map(j => {
|
|
160
|
+
return setMapping(j, mapping);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const mainClassFn = CLASS.getBy(mapping['']);
|
|
164
|
+
for (const key in json) {
|
|
165
|
+
if (json.hasOwnProperty(key)) {
|
|
166
|
+
if (_.isArray(json[key])) {
|
|
167
|
+
json[key] = json[key].map(arrObj => {
|
|
168
|
+
const objMapping = getModelsMapping(CLASS.getBy(mapping[key]));
|
|
169
|
+
return setMapping(arrObj, objMapping);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
else if (_.isObject(json[key])) {
|
|
173
|
+
const objMapping = getModelsMapping(CLASS.getBy(mapping[key]));
|
|
174
|
+
json[key] = setMapping(json[key], objMapping);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
Object
|
|
179
|
+
.keys(mapping)
|
|
180
|
+
.filter(key => key !== '' && key.split('.').length >= 2)
|
|
181
|
+
.forEach(lodasPath => {
|
|
182
|
+
const objMapping = getModelsMapping(CLASS.getBy(mapping[lodasPath]));
|
|
183
|
+
const input = _.get(json, lodasPath);
|
|
184
|
+
if (!_.isUndefined(input)) {
|
|
185
|
+
const res = setMapping(input, objMapping);
|
|
186
|
+
_.set(json, lodasPath, res);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
if (!mainClassFn) {
|
|
190
|
+
return json;
|
|
191
|
+
}
|
|
192
|
+
return _.merge(new mainClassFn(), json);
|
|
193
|
+
}
|
|
194
|
+
function DefaultModelWithMapping(defaultModelValues, mapping) {
|
|
195
|
+
return function (target) {
|
|
196
|
+
if (!_.isArray(target[SYMBOL.MODELS_MAPPING])) {
|
|
197
|
+
target[SYMBOL.MODELS_MAPPING] = [];
|
|
198
|
+
}
|
|
199
|
+
target[SYMBOL.MODELS_MAPPING].push({ '': CLASS.getName(target) });
|
|
200
|
+
if (_.isObject(mapping)) {
|
|
201
|
+
target[SYMBOL.MODELS_MAPPING] = target[SYMBOL.MODELS_MAPPING].concat(mapping);
|
|
202
|
+
Object.keys(mapping)
|
|
203
|
+
.forEach(key => {
|
|
204
|
+
const v = mapping;
|
|
205
|
+
if (_.isUndefined(v) || _.isFunction(v)) {
|
|
206
206
|
throw `
|
|
207
207
|
|
|
208
208
|
|
|
209
209
|
Class: '${target.name}'
|
|
210
210
|
[ng2rest] Bad mapping value for path: ${key} , please use type: <string> or [<string>]
|
|
211
|
-
`;
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
if (_.isObject(defaultModelValues)) {
|
|
216
|
-
const toMerge = {};
|
|
217
|
-
const describedTarget = CLASS
|
|
218
|
-
.describeProperites(target)
|
|
219
|
-
.filter(prop => /^([a-zA-Z0-9]|\_|\#)+$/.test(prop));
|
|
220
|
-
describedTarget.forEach(propDefInConstr => {
|
|
221
|
-
if (defaultModelValues[propDefInConstr]) {
|
|
211
|
+
`;
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
if (_.isObject(defaultModelValues)) {
|
|
216
|
+
const toMerge = {};
|
|
217
|
+
const describedTarget = CLASS
|
|
218
|
+
.describeProperites(target)
|
|
219
|
+
.filter(prop => /^([a-zA-Z0-9]|\_|\#)+$/.test(prop));
|
|
220
|
+
describedTarget.forEach(propDefInConstr => {
|
|
221
|
+
if (defaultModelValues[propDefInConstr]) {
|
|
222
222
|
console.warn(`
|
|
223
223
|
|
|
224
224
|
CONFLICT: default value for property: "${propDefInConstr}"
|
|
225
225
|
in class "${target.name}" already defined as typescript
|
|
226
226
|
default class proprty value.
|
|
227
227
|
|
|
228
|
-
`);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
toMerge[propDefInConstr] = null; // TODO from toString I can't know that
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
target[SYMBOL.DEFAULT_MODEL] = _.merge(toMerge, defaultModelValues);
|
|
235
|
-
const propsToOmmit = Object
|
|
236
|
-
.keys(target[SYMBOL.DEFAULT_MODEL])
|
|
237
|
-
.filter(key => {
|
|
238
|
-
const descriptor = Object
|
|
239
|
-
.getOwnPropertyDescriptor(target.prototype, key);
|
|
240
|
-
return !!descriptor;
|
|
241
|
-
});
|
|
242
|
-
_.merge(target.prototype, _.omit(target[SYMBOL.DEFAULT_MODEL], propsToOmmit));
|
|
243
|
-
}
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
Mapping.DefaultModelWithMapping = DefaultModelWithMapping;
|
|
247
|
-
})(Mapping || (Mapping = {}));
|
|
248
|
-
;
|
|
249
|
-
({}); // @--end-of-file-for-module=ng2-rest lib/mapping.ts
|
|
228
|
+
`);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
toMerge[propDefInConstr] = null; // TODO from toString I can't know that
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
target[SYMBOL.DEFAULT_MODEL] = _.merge(toMerge, defaultModelValues);
|
|
235
|
+
const propsToOmmit = Object
|
|
236
|
+
.keys(target[SYMBOL.DEFAULT_MODEL])
|
|
237
|
+
.filter(key => {
|
|
238
|
+
const descriptor = Object
|
|
239
|
+
.getOwnPropertyDescriptor(target.prototype, key);
|
|
240
|
+
return !!descriptor;
|
|
241
|
+
});
|
|
242
|
+
_.merge(target.prototype, _.omit(target[SYMBOL.DEFAULT_MODEL], propsToOmmit));
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
Mapping.DefaultModelWithMapping = DefaultModelWithMapping;
|
|
247
|
+
})(Mapping || (Mapping = {}));
|
|
248
|
+
;
|
|
249
|
+
({}); // @--end-of-file-for-module=ng2-rest lib/mapping.ts
|
|
250
250
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1idW5kbGUvbmcyLXJlc3QvcHJvamVjdHMvbmcyLXJlc3Qvc3JjL2xpYi9tYXBwaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHakUsTUFBTSxLQUFXLE9BQU8sQ0FxVHZCO0FBclRELFdBQWlCLE9BQU87SUFFdEIsU0FBZ0IsTUFBTSxDQUFDLElBQVksRUFBRSxVQUFVLEdBQUcsS0FBSztRQUdyRCxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsT0FBTyxLQUFLLENBQUMsQ0FBQztTQUNmO1FBRUQsSUFBSSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFdEYsSUFBSSxVQUFVLEVBQUU7WUFDZCxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDbkQ7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBZGUsY0FBTSxTQWNyQixDQUFBO0lBRUQsU0FBZ0IsTUFBTSxDQUFlLElBQVksRUFBRSxPQUFnQixFQUFFLFdBQW1CLEVBQUU7UUFDeEYsSUFBSSxDQUFDLENBQUMsUUFBUSxD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QUFrQixDQUFDLGVBQWUsQ0FBQyxFQUFFO3dCQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDOztxREFFNEIsZUFBZTt3QkFDNUMsTUFBTSxDQUFDLElBQUk7OzthQUd0QixDQUFDLENBQUE7cUJBQ0g7eUJBQU07d0JBQ0wsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLHVDQUF1QztxQkFDekU7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBSUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUVwRSxNQUFNLFlBQVksR0FBRyxNQUFNO3FCQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztxQkFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNaLE1BQU0sVUFBVSxHQUFHLE1BQU07eUJBQ3RCLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ25ELE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO2FBRy9FO1FBQ0gsQ0FBQyxDQUFBO0lBQ0gsQ0FBQztJQWpFZSwrQkFBdUIsMEJBaUV0QyxDQUFBO0FBRUgsQ0FBQyxFQXJUZ0IsT0FBTyxLQUFQLE9BQU8sUUFxVHZCO0FBRUEsQ0FBQztBQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxvREFBb0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfIH0gZnJvbSAndG5wLWNvcmUvYnJvd3Nlcic7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSAndG5wLWNvcmUvYnJvd3Nlcic7XG5pbXBvcnQgeyBDaXJjLCBKU09OMTAgfSBmcm9tICdqc29uMTAvYnJvd3Nlcic7XG5pbXBvcnQgeyB3YWxrIH0gZnJvbSAnbG9kYXNoLXdhbGstb2JqZWN0L2Jyb3dzZXInO1xuaW1wb3J0IHsgQ0xBU1MsIFNZTUJPTCB9IGZyb20gJ3R5cGVzY3JpcHQtY2xhc3MtaGVscGVycy9icm93c2VyJztcbmltcG9ydCB7IEhlbHBlcnMgYXMgSGVscGVyc0xvZyB9IGZyb20gJ3RucC1jb3JlL2Jyb3dzZXInO1xuXG5leHBvcnQgbmFtZXNwYWNlIE1hcHBpbmcge1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWNvZGUoanNvbjogT2JqZWN0LCBhdXRvZGV0ZWN0ID0gZmFsc2UpOiBNYXBwaW5nIHtcblxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQoanNvbikpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuXG4gICAgbGV0IG1hcHBpbmcgPSBkZWNvZGVGcm9tRGVjb3JhdG9yKF8uaXNBcnJheShqc29uKSA/IF8uZmlyc3QoanNvbikgOiBqc29uLCAhYXV0b2RldGVjdClcblxuICAgIGlmIChhdXRvZGV0ZWN0KSB7XG4gICAgICBtYXBwaW5nID0gXy5tZXJnZShnZXRNYXBwaW5nTmFpdmUoanNvbiksIG1hcHBpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5nO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuY29kZTxUID0gRnVuY3Rpb24+KGpzb246IE9iamVjdCwgbWFwcGluZzogTWFwcGluZywgY2lyY3VsYXI6IENpcmNbXSA9IFtdKTogVCB7XG4gICAgaWYgKF8uaXNTdHJpbmcoanNvbikgfHwgXy5pc0Jvb2xlYW4oanNvbikgfHwgXy5pc051bWJlcihqc29uKSkge1xuICAgICAgcmV0dXJuIGpzb24gYXMgYW55O1xuICAgIH1cblxuICAgIGlmIChtYXBwaW5nWycnXSkge1xuICAgICAgY29uc3QgZGVjb3JhdG9yTWFwcGluZyA9IGdldE1vZGVsc01hcHBpbmcoQ0xBU1MuZ2V0QnkobWFwcGluZ1snJ10pKTtcbiAgICAgIG1hcHBpbmcgPSBfLm1lcmdlKG1hcHBpbmcsIGRlY29yYXRvck1hcHBpbmcpXG4gICAgfVxuXG4gICAgbGV0IHJlczogYW55O1xuICAgIGlmIChfLmlzQXJyYXkoY2lyY3VsYXIpICYmIGNpcmN1bGFyLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcyA9IHNldE1hcHBpbmdDaXJjKGpzb24sIG1hcHBpbmcsIGNpcmN1bGFyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0gc2V0TWFwcGluZyhqc29uLCBtYXBwaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG5cbiAgZnVuY3Rpb24gZGVjb2RlRnJvbURlY29yYXRvcihqc29uOiBPYmplY3QsIHByb2R1Y3Rpb24gPSBmYWxzZSk6IE1hcHBpbmcge1xuICAgIGNvbnN0IGVudGl0eUNsYXNzID0gQ0xBU1MuZ2V0RnJvbU9iamVjdChqc29uKTtcbiAgICBjb25zdCBtYXBwaW5ncyA9IGdldE1vZGVsc01hcHBpbmcoZW50aXR5Q2xhc3MpO1xuICAgIHJldHVybiBtYXBwaW5ncyBhcyBhbnk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxzTWFwcGluZyhlbnRpdHk6IEZ1bmN0aW9uKSB7XG5cbiAgICBpZiAoIV8uaXNGdW5jdGlvbihlbnRpdHkpIHx8IGVudGl0eSA9PT0gT2JqZWN0KSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IENMQVNTLmdldE5hbWUoZW50aXR5KVxuXG4gICAgbGV0IGVuaXR5T1duTWFwcGluZzogYW55W10gPSBfLmlzQXJyYXkoZW50aXR5W1NZTUJPTC5NT0RFTFNfTUFQUElOR10pID9cbiAgICAgIGVudGl0eVtTWU1CT0wuTU9ERUxTX01BUFBJTkddIDogW3sgJyc6IGNsYXNzTmFtZSB9XTtcblxuICAgIGxldCByZXMgPSB7fTtcbiAgICBsZXQgcGFyZW50cyA9IGVuaXR5T1duTWFwcGluZ1xuICAgICAgLmZpbHRlcihtID0+ICFfLmlzVW5kZWZpbmVkKG1bJyddKSAmJiBtWycnXSAhPT0gY2xhc3NOYW1lKVxuICAgICAgLm1hcChtID0+IG1bJyddKTtcblxuICAgIGVuaXR5T1duTWFwcGluZy5yZXZlcnNlKCkuZm9yRWFjaChtID0+IHtcbiAgICAgIG0gPSBfLmNsb25lRGVlcChtKTtcblxuICAgICAgT2JqZWN0LmtleXMobSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCB2ID0gbVtrZXldXG4gICAgICAgIGNvbnN0IGlzQXJyID0gXy5pc0FycmF5KHYpXG4gICAgICAgIGNvbnN0IG1vZGVsID0gaXNBcnIgPyBfLmZpcnN0KHYpIDogdjtcbiAgICAgICAgaWYgKHBhcmVudHMuaW5jbHVkZXMobW9kZWwpKSB7XG4gICAgICAgICAgbVtrZXldID0gaXNBcnIgPyBbY2xhc3NOYW1lXSA6IGNsYXNzTmFtZTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJlcyA9IF8ubWVyZ2UocmVzLCBtKVxuICAgIH0pXG4gICAgcmVzWycnXSA9IGNsYXNzTmFtZTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuXG4gIGV4cG9ydCB0eXBlIE1hcHBpbmc8VCA9IHt9PiA9IHtcbiAgICBbUCBpbiBrZXlvZiBUXT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGFkZChvOiBPYmplY3QsIHBhdGg6IHN0cmluZywgbWFwcGluZzogTWFwcGluZyA9IHt9KSB7XG4gICAgaWYgKCFvIHx8IEFycmF5LmlzQXJyYXkobykgfHwgdHlwZW9mIG8gIT09ICdvYmplY3QnKSByZXR1cm47XG4gICAgY29uc3Qgb2JqZWN0Q2xhc3NOYW1lID0gQ0xBU1MuZ2V0TmFtZShPYmplY3QuZ2V0UHJvdG90eXBlT2YobykuY29uc3RydWN0b3IpO1xuICAgIGNvbnN0IHJlc29sdmVDbGFzcyA9IENMQVNTLmdldEJ5KG9iamVjdENsYXNzTmFtZSk7XG4gICAgaWYgKCFyZXNvbHZlQ2xhc3MpIHtcbiAgICAgIGlmIChvYmplY3RDbGFzc05hbWUgIT09ICdPYmplY3QnKSB7XG4gICAgICAgIGlmIChIZWxwZXJzLmlzQnJvd3Nlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCByZXNvbHZlIGNsYXNzIFwiJHtvYmplY3RDbGFzc05hbWV9XCIgd2hpbGUgbWFwcGluZy5gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghbWFwcGluZ1twYXRoXSkgbWFwcGluZ1twYXRoXSA9IENMQVNTLmdldE5hbWUocmVzb2x2ZUNsYXNzKSBhcyBhbnk7O1xuICB9XG5cbiAgLyoqXG4gICAqIFVTRSBPTkxZIElOIERFVkVMT1BNRU5UXG4gICAqIEBwYXJhbSBjXG4gICAqIEBwYXJhbSBwYXRoXG4gICAqIEBwYXJhbSBtYXBwaW5nXG4gICAqIEBwYXJhbSBsZXZlbFxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0TWFwcGluZ05haXZlKGM6IE9iamVjdCwgcGF0aCA9ICcnLCBtYXBwaW5nOiBNYXBwaW5nID0ge30sIGxldmVsID0gMCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSB7XG4gICAgICBjLmZvckVhY2goYyA9PiBnZXRNYXBwaW5nTmFpdmUoYywgcGF0aCwgbWFwcGluZywgbGV2ZWwpKVxuICAgICAgcmV0dXJuIG1hcHBpbmc7XG4gICAgfVxuICAgIGlmICgrK2xldmVsID09PSAxNikgcmV0dXJuO1xuICAgIGFkZChjLCBwYXRoLCBtYXBwaW5nKTtcbiAgICBmb3IgKHZhciBwIGluIGMpIHtcbiAgICAgIGlmIChjLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgIGNvbnN0IHYgPSBjW3BdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lmxlbmd0aCA+IDApIHsgLy8gcmVkdWNlciBhcyBpbXBvdmVtZW50XG4gICAgICAgICAgdi5mb3JFYWNoKChlbGVtLCBpKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWh0ID0gW3BhdGgsIHBdLmZpbHRlcihjID0+IGMudHJpbSgpICE9ICcnKS5qb2luKCcuJyk7XG4gICAgICAgICAgICBnZXRNYXBwaW5nTmFpdmUoZWxlbSwgY3VycmVudFBhaHQsIG1hcHBpbmcsIGxldmVsKTtcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWh0ID0gW3BhdGgsIHBdLmZpbHRlcihjID0+IGMudHJpbSgpICE9ICcnKS5qb2luKCcuJyk7XG4gICAgICAgICAgYWRkKHYsIGN1cnJlbnRQYWh0LCBtYXBwaW5nKTtcbiAgICAgICAgICBnZXRNYXBwaW5nTmFpdmUodiwgY3VycmVudFBhaHQsIG1hcHBpbmcsIGxldmVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwcGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1hcHBpbmdQYXRoRnJvbShwYXRoTG9kaGFzOiBzdHJpbmcpIHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGF0aExvZGhhcykpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2V4ID0gL1xcWyhbMC05YS16QS1aXXxcXCd8XFxcIikqXFxdL2c7XG4gICAgcGF0aExvZGhhcyA9IHBhdGhMb2RoYXNcbiAgICAgIC5yZXBsYWNlKHJlZ2V4LCAnJylcbiAgICAgIC5yZXBsYWNlKCcuLicsICcuJyk7XG4gICAgaWYgKHBhdGhMb2RoYXMuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICBwYXRoTG9kaGFzID0gcGF0aExvZGhhcy5zbGljZSgxKVxuICAgIH1cbiAgICByZXR1cm4gcGF0aExvZGhhcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldE1hcHBpbmdDaXJjKGpzb246IE9iamVjdCwgbWFwcGluZzogTWFwcGluZyA9IHt9LCBjaXJjdWxhcjogQ2lyY1tdID0gW10pIHtcblxuICAgIGNvbnN0IG1haW5DbGFzc0ZuID0gIV8uaXNBcnJheShqc29uKSAmJiBDTEFTUy5nZXRCeShtYXBwaW5nWycnXSk7XG5cbiAgICB3YWxrLk9iamVjdChqc29uLCAodiwgbG9kYXNoUGF0aCwgY2hhbmdlVmFsdWUpID0+IHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh2KSAmJiAhXy5pc051bGwodikpIHtcbiAgICAgICAgY29uc3QgbWFwcGluZ1BhdGggPSBnZXRNYXBwaW5nUGF0aEZyb20obG9kYXNoUGF0aClcbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKG1hcHBpbmdbbWFwcGluZ1BhdGhdKSkge1xuICAgICAgICAgIGNvbnN0IGlzQXJyYXkgPSBfLmlzQXJyYXkobWFwcGluZ1ttYXBwaW5nUGF0aF0pO1xuICAgICAgICAgIGlmICghaXNBcnJheSkge1xuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gaXNBcnJheSA/IF8uZmlyc3QobWFwcGluZ1ttYXBwaW5nUGF0aF0pIDogbWFwcGluZ1ttYXBwaW5nUGF0aF07XG4gICAgICAgICAgICBjb25zdCBjbGFzc0ZOID0gQ0xBU1MuZ2V0QnkoY2xhc3NOYW1lKVxuICAgICAgICAgICAgaWYgKF8uaXNGdW5jdGlvbihjbGFzc0ZOKSkge1xuXG4gICAgICAgICAgICAgIGNoYW5nZVZhbHVlKF8ubWVyZ2UobmV3IChjbGFzc0ZOIGFzIGFueSkoKSwgdikpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIGNpcmN1bGFyLmZvckVhY2goYyA9PiB7XG4gICAgICBjb25zdCByZWYgPSBfLmdldChqc29uLCBjLmNpcmN1cmFsVGFyZ2V0UGF0aClcbiAgICAgIF8uc2V0KGpzb24sIGMucGF0aFRvT2JqLCByZWYpXG4gICAgfSlcblxuICAgIGlmIChfLmlzRnVuY3Rpb24obWFpbkNsYXNzRm4pKSB7XG4gICAgICBqc29uID0gXy5tZXJnZShuZXcgKG1haW5DbGFzc0ZuIGFzIGFueSkoKSwganNvbilcbiAgICB9XG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG5cblxuICBmdW5jdGlvbiBzZXRNYXBwaW5nKGpzb246IE9iamVjdCwgbWFwcGluZzogTWFwcGluZyA9IHt9KSB7XG5cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgICByZXR1cm4ganNvbi5tYXAoaiA9PiB7XG4gICAgICAgIHJldHVybiBzZXRNYXBwaW5nKGosIG1hcHBpbmcpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IG1haW5DbGFzc0ZuID0gQ0xBU1MuZ2V0QnkobWFwcGluZ1snJ10pO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4ganNvbikge1xuICAgICAgaWYgKGpzb24uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXG5cblxuICAgICAgICBpZiAoXy5pc0FycmF5KGpzb25ba2V5XSkpIHtcbiAgICAgICAgICBqc29uW2tleV0gPSBqc29uW2tleV0ubWFwKGFyck9iaiA9PiB7XG4gICAgICAgICAgICBjb25zdCBvYmpNYXBwaW5nID0gZ2V0TW9kZWxzTWFwcGluZyhDTEFTUy5nZXRCeShtYXBwaW5nW2tleV0pKVxuICAgICAgICAgICAgcmV0dXJuIHNldE1hcHBpbmcoYXJyT2JqLCBvYmpNYXBwaW5nKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChqc29uW2tleV0pKSB7XG4gICAgICAgICAgY29uc3Qgb2JqTWFwcGluZyA9IGdldE1vZGVsc01hcHBpbmcoQ0xBU1MuZ2V0QnkobWFwcGluZ1trZXldKSlcbiAgICAgICAgICBqc29uW2tleV0gPSBzZXRNYXBwaW5nKGpzb25ba2V5XSwgb2JqTWFwcGluZylcbiAgICAgICAgfVxuICAgICAgfVxuXG5cblxuXG5cbiAgICB9XG5cbiAgICBPYmplY3RcbiAgICAgIC5rZXlzKG1hcHBpbmcpXG4gICAgICAuZmlsdGVyKGtleSA9PiBrZXkgIT09ICcnICYmIGtleS5zcGxpdCgnLicpLmxlbmd0aCA+PSAyKVxuICAgICAgLmZvckVhY2gobG9kYXNQYXRoID0+IHtcblxuICAgICAgICBjb25zdCBvYmpNYXBwaW5nID0gZ2V0TW9kZWxzTWFwcGluZyhDTEFTUy5nZXRCeShtYXBwaW5nW2xvZGFzUGF0aF0pKVxuICAgICAgICBjb25zdCBpbnB1dCA9IF8uZ2V0KGpzb24sIGxvZGFzUGF0aClcbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGlucHV0KSkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IHNldE1hcHBpbmcoaW5wdXQsIG9iak1hcHBpbmcpXG4gICAgICAgICAgXy5zZXQoanNvbiwgbG9kYXNQYXRoLCByZXMpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICBpZiAoIW1haW5DbGFzc0ZuKSB7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgcmV0dXJuIF8ubWVyZ2UobmV3IChtYWluQ2xhc3NGbiBhcyBhbnkpKCksIGpzb24pXG4gIH1cblxuXG5cblxuICBleHBvcnQgdHlwZSBNb2RlbFZhbHVlPFQ+ID0ge1xuICAgIC8qKlxuICAgICAqIEluc2lkZSBtb2RlbHMgdHlwZXNcbiAgICAgKi9cbiAgICBbcHJvcE5hbWUgaW4ga2V5b2YgVF0/OiBUW3Byb3BOYW1lXTtcbiAgfTtcblxuXG4gIGV4cG9ydCBmdW5jdGlvbiBEZWZhdWx0TW9kZWxXaXRoTWFwcGluZzxUID0gT2JqZWN0PihcbiAgICBkZWZhdWx0TW9kZWxWYWx1ZXM/OiBNb2RlbFZhbHVlPFQ+LFxuICAgIG1hcHBpbmc/OiBNYXBwaW5nPFQ+XG4gICkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBGdW5jdGlvbikge1xuXG4gICAgICBpZiAoIV8uaXNBcnJheSh0YXJnZXRbU1lNQk9MLk1PREVMU19NQVBQSU5HXSkpIHtcbiAgICAgICAgdGFyZ2V0W1NZTUJPTC5NT0RFTFNfTUFQUElOR10gPSBbXTtcbiAgICAgIH1cblxuICAgICAgKHRhcmdldFtTWU1CT0wuTU9ERUxTX01BUFBJTkddIGFzIGFueVtdKS5wdXNoKHsgJyc6IENMQVNTLmdldE5hbWUodGFyZ2V0KSB9KTtcbiAgICAgIGlmIChfLmlzT2JqZWN0KG1hcHBpbmcpKSB7XG4gICAgICAgIHRhcmdldFtTWU1CT0wuTU9ERUxTX01BUFBJTkddID0gKHRhcmdldFtTWU1CT0wuTU9ERUxTX01BUFBJTkddIGFzIGFueVtdKS5jb25jYXQobWFwcGluZylcbiAgICAgICAgT2JqZWN0LmtleXMobWFwcGluZylcbiAgICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdiA9IG1hcHBpbmc7XG4gICAgICAgICAgICBpZiAoXy5pc1VuZGVmaW5lZCh2KSB8fCBfLmlzRnVuY3Rpb24odikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgYFxuXG5cbiAgICAgICAgICAgIENsYXNzOiAnJHt0YXJnZXQubmFtZX0nXG5bbmcycmVzdF0gQmFkIG1hcHBpbmcgdmFsdWUgZm9yIHBhdGg6ICR7a2V5fSAsIHBsZWFzZSB1c2UgdHlwZTogPHN0cmluZz4gb3IgWzxzdHJpbmc+XVxuYDtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG5cbiAgICAgIGlmIChfLmlzT2JqZWN0KGRlZmF1bHRNb2RlbFZhbHVlcykpIHtcbiAgICAgICAgY29uc3QgdG9NZXJnZSA9IHt9O1xuICAgICAgICBjb25zdCBkZXNjcmliZWRUYXJnZXQgPSBDTEFTU1xuICAgICAgICAgIC5kZXNjcmliZVByb3Blcml0ZXModGFyZ2V0KVxuICAgICAgICAgIC5maWx0ZXIocHJvcCA9PiAvXihbYS16QS1aMC05XXxcXF98XFwjKSskLy50ZXN0KHByb3ApKVxuXG4gICAgICAgIGRlc2NyaWJlZFRhcmdldC5mb3JFYWNoKHByb3BEZWZJbkNvbnN0ciA9PiB7XG4gICAgICAgICAgaWYgKGRlZmF1bHRNb2RlbFZhbHVlc1twcm9wRGVmSW5Db25zdHJdKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFxuXG4gICAgICAgICAgICBDT05GTElDVDogZGVmYXVsdCB2YWx1ZSBmb3IgcHJvcGVydHk6IFwiJHtwcm9wRGVmSW5Db25zdHJ9XCJcbiAgICAgICAgICAgIGluIGNsYXNzIFwiJHt0YXJnZXQubmFtZX1cIiBhbHJlYWR5IGRlZmluZWQgYXMgdHlwZXNjcmlwdFxuICAgICAgICAgICAgZGVmYXVsdCBjbGFzcyBwcm9wcnR5IHZhbHVlLlxuXG4gICAgICAgICAgICBgKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0b01lcmdlW3Byb3BEZWZJbkNvbnN0cl0gPSBudWxsOyAvLyBUT0RPIGZyb20gdG9TdHJpbmcgSSBjYW4ndCBrbm93IHRoYXRcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cblxuICAgICAgICB0YXJnZXRbU1lNQk9MLkRFRkFVTFRfTU9ERUxdID0gXy5tZXJnZSh0b01lcmdlLCBkZWZhdWx0TW9kZWxWYWx1ZXMpO1xuXG4gICAgICAgIGNvbnN0IHByb3BzVG9PbW1pdCA9IE9iamVjdFxuICAgICAgICAgIC5rZXlzKHRhcmdldFtTWU1CT0wuREVGQVVMVF9NT0RFTF0pXG4gICAgICAgICAgLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdFxuICAgICAgICAgICAgICAuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldC5wcm90b3R5cGUsIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gISFkZXNjcmlwdG9yO1xuICAgICAgICAgIH0pO1xuICAgICAgICBfLm1lcmdlKHRhcmdldC5wcm90b3R5cGUsIF8ub21pdCh0YXJnZXRbU1lNQk9MLkRFRkFVTFRfTU9ERUxdLCBwcm9wc1RvT21taXQpKTtcblxuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPW5nMi1yZXN0IGxpYi9tYXBwaW5nLnRzIl19
|