ng2-rest 13.2.8 → 13.2.9
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 +33 -31
- 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 +6 -6
- package/package.json_devDependencies.json +217 -217
- package/package.json_tnp.json5 +53 -53
- package/tmp-environment.json +37 -35
- 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,220 +1,220 @@
|
|
|
1
|
-
import { Subject } from 'rxjs';
|
|
2
|
-
import { Log, Level } from 'ng2-logger/browser';
|
|
3
|
-
const log = Log.create('resouce-service', Level.__NOTHING);
|
|
4
|
-
import { Rest } from './rest.class';
|
|
5
|
-
import { RestRequest } from './rest-request';
|
|
6
|
-
import { Cookie } from './cookie';
|
|
7
|
-
import { interpolateParamsToUrl, isValid, containsModels, getModels } from './params';
|
|
8
|
-
import { Helpers } from 'tnp-core/browser';
|
|
9
|
-
export class Resource {
|
|
10
|
-
constructor() {
|
|
11
|
-
setTimeout(() => {
|
|
12
|
-
const zone = this.getZone();
|
|
13
|
-
if (!RestRequest.zone) {
|
|
14
|
-
RestRequest.zone = zone;
|
|
15
|
-
}
|
|
16
|
-
;
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
static get listenErrors() {
|
|
20
|
-
return this._listenErrors.asObservable();
|
|
21
|
-
}
|
|
22
|
-
static get listenSuccessOperations() {
|
|
23
|
-
return this._listenSuccess.asObservable();
|
|
24
|
-
}
|
|
25
|
-
getZone() {
|
|
26
|
-
const isNode = (typeof window === 'undefined');
|
|
27
|
-
if (isNode) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
;
|
|
31
|
-
const ng = window['ng'];
|
|
32
|
-
const getAllAngularRootElements = window['getAllAngularRootElements'];
|
|
33
|
-
if (!ng || !getAllAngularRootElements) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const probe = ng.probe;
|
|
37
|
-
const coreTokens = ng.coreTokens;
|
|
38
|
-
if (!coreTokens || !coreTokens.NgZone) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const zoneClass = coreTokens.NgZone;
|
|
42
|
-
if (!probe || typeof probe !== 'function' || !getAllAngularRootElements) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
const angularElements = getAllAngularRootElements();
|
|
46
|
-
if (!Array.isArray(angularElements) || angularElements.length === 0) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const rootElement = ng.probe(angularElements[0]);
|
|
50
|
-
if (!rootElement) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const injector = rootElement.injector;
|
|
54
|
-
if (!injector || !injector.get || typeof injector.get !== 'function') {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const zone = injector.get(zoneClass);
|
|
58
|
-
return zone;
|
|
59
|
-
}
|
|
60
|
-
static initAngularNgZone(zone) {
|
|
61
|
-
RestRequest.zone = zone;
|
|
62
|
-
}
|
|
63
|
-
checkNestedModels(model, allModels) {
|
|
64
|
-
for (let p in allModels) {
|
|
65
|
-
if (allModels.hasOwnProperty(p)) {
|
|
66
|
-
let m = allModels[p];
|
|
67
|
-
if (isValid(p)) {
|
|
68
|
-
let urlModels = getModels(p);
|
|
69
|
-
if (containsModels(model, urlModels)) {
|
|
70
|
-
model = p;
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return model;
|
|
77
|
-
}
|
|
78
|
-
static getModel(endpoint, model) {
|
|
79
|
-
model = Resource.prepareModel(model);
|
|
80
|
-
const e = Resource.endpoints[endpoint];
|
|
81
|
-
if (!e) {
|
|
82
|
-
return void 0;
|
|
83
|
-
}
|
|
84
|
-
const r = Resource.endpoints[endpoint].models[model];
|
|
85
|
-
return Resource.endpoints[endpoint].models[model];
|
|
86
|
-
}
|
|
87
|
-
static create(e, model, entityMapping, circular, customContentType) {
|
|
88
|
-
const badRestRegEX = new RegExp('((\/:)[a-z]+)+', 'g');
|
|
89
|
-
const matchArr = model.match(badRestRegEX) || [];
|
|
90
|
-
const badModelsNextToEachOther = matchArr.join();
|
|
91
|
-
const atleas2DoubleDots = ((badModelsNextToEachOther.match(new RegExp(':', 'g')) || []).length >= 2);
|
|
92
|
-
if (atleas2DoubleDots && model.search(badModelsNextToEachOther) !== -1) {
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { Log, Level } from 'ng2-logger/browser';
|
|
3
|
+
const log = Log.create('resouce-service', Level.__NOTHING);
|
|
4
|
+
import { Rest } from './rest.class';
|
|
5
|
+
import { RestRequest } from './rest-request';
|
|
6
|
+
import { Cookie } from './cookie';
|
|
7
|
+
import { interpolateParamsToUrl, isValid, containsModels, getModels } from './params';
|
|
8
|
+
import { Helpers } from 'tnp-core/browser';
|
|
9
|
+
export class Resource {
|
|
10
|
+
constructor() {
|
|
11
|
+
setTimeout(() => {
|
|
12
|
+
const zone = this.getZone();
|
|
13
|
+
if (!RestRequest.zone) {
|
|
14
|
+
RestRequest.zone = zone;
|
|
15
|
+
}
|
|
16
|
+
;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
static get listenErrors() {
|
|
20
|
+
return this._listenErrors.asObservable();
|
|
21
|
+
}
|
|
22
|
+
static get listenSuccessOperations() {
|
|
23
|
+
return this._listenSuccess.asObservable();
|
|
24
|
+
}
|
|
25
|
+
getZone() {
|
|
26
|
+
const isNode = (typeof window === 'undefined');
|
|
27
|
+
if (isNode) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
;
|
|
31
|
+
const ng = window['ng'];
|
|
32
|
+
const getAllAngularRootElements = window['getAllAngularRootElements'];
|
|
33
|
+
if (!ng || !getAllAngularRootElements) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const probe = ng.probe;
|
|
37
|
+
const coreTokens = ng.coreTokens;
|
|
38
|
+
if (!coreTokens || !coreTokens.NgZone) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const zoneClass = coreTokens.NgZone;
|
|
42
|
+
if (!probe || typeof probe !== 'function' || !getAllAngularRootElements) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const angularElements = getAllAngularRootElements();
|
|
46
|
+
if (!Array.isArray(angularElements) || angularElements.length === 0) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const rootElement = ng.probe(angularElements[0]);
|
|
50
|
+
if (!rootElement) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const injector = rootElement.injector;
|
|
54
|
+
if (!injector || !injector.get || typeof injector.get !== 'function') {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const zone = injector.get(zoneClass);
|
|
58
|
+
return zone;
|
|
59
|
+
}
|
|
60
|
+
static initAngularNgZone(zone) {
|
|
61
|
+
RestRequest.zone = zone;
|
|
62
|
+
}
|
|
63
|
+
checkNestedModels(model, allModels) {
|
|
64
|
+
for (let p in allModels) {
|
|
65
|
+
if (allModels.hasOwnProperty(p)) {
|
|
66
|
+
let m = allModels[p];
|
|
67
|
+
if (isValid(p)) {
|
|
68
|
+
let urlModels = getModels(p);
|
|
69
|
+
if (containsModels(model, urlModels)) {
|
|
70
|
+
model = p;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return model;
|
|
77
|
+
}
|
|
78
|
+
static getModel(endpoint, model) {
|
|
79
|
+
model = Resource.prepareModel(model);
|
|
80
|
+
const e = Resource.endpoints[endpoint];
|
|
81
|
+
if (!e) {
|
|
82
|
+
return void 0;
|
|
83
|
+
}
|
|
84
|
+
const r = Resource.endpoints[endpoint].models[model];
|
|
85
|
+
return Resource.endpoints[endpoint].models[model];
|
|
86
|
+
}
|
|
87
|
+
static create(e, model, entityMapping, circular, customContentType) {
|
|
88
|
+
const badRestRegEX = new RegExp('((\/:)[a-z]+)+', 'g');
|
|
89
|
+
const matchArr = model.match(badRestRegEX) || [];
|
|
90
|
+
const badModelsNextToEachOther = matchArr.join();
|
|
91
|
+
const atleas2DoubleDots = ((badModelsNextToEachOther.match(new RegExp(':', 'g')) || []).length >= 2);
|
|
92
|
+
if (atleas2DoubleDots && model.search(badModelsNextToEachOther) !== -1) {
|
|
93
93
|
throw new Error(`
|
|
94
94
|
|
|
95
95
|
Bad rest model: ${model}
|
|
96
96
|
|
|
97
97
|
Do not create rest models like this: /book/author/:bookid/:authorid
|
|
98
98
|
Instead use nested approach: /book/:bookid/author/:authorid
|
|
99
|
-
`);
|
|
100
|
-
}
|
|
101
|
-
;
|
|
102
|
-
Resource.map(e, e);
|
|
103
|
-
Resource.instance.add(e, model ? model : '', entityMapping, circular, customContentType);
|
|
104
|
-
return {
|
|
105
|
-
model: (params) => Resource.instance.api(e, interpolateParamsToUrl(params, model)),
|
|
106
|
-
replay: (method) => {
|
|
107
|
-
Resource.getModel(e, model).replay(method);
|
|
108
|
-
},
|
|
109
|
-
get headers() {
|
|
110
|
-
return Resource.getModel(e, model).headers;
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
static reset() {
|
|
115
|
-
Resource.endpoints = {};
|
|
116
|
-
}
|
|
117
|
-
static map(endpoint, url) {
|
|
118
|
-
log.i('url', url);
|
|
119
|
-
let regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
|
|
120
|
-
let e = endpoint;
|
|
121
|
-
if (!regex.test(url)) {
|
|
122
|
-
throw `Url address is not correct: ${url}`;
|
|
123
|
-
}
|
|
124
|
-
if (url.charAt(url.length - 1) === '/')
|
|
125
|
-
url = url.slice(0, url.length - 1);
|
|
126
|
-
log.i('url after', url);
|
|
127
|
-
if (Resource.endpoints[e] !== void 0) {
|
|
128
|
-
Helpers.log('Cannot use map function at the same API endpoint again ('
|
|
129
|
-
+ Resource.endpoints[e].url + ')');
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
Resource.endpoints[e] = {
|
|
133
|
-
url: url,
|
|
134
|
-
models: {},
|
|
135
|
-
entity: null
|
|
136
|
-
};
|
|
137
|
-
log.i('enpoints', Resource.endpoints);
|
|
138
|
-
return true;
|
|
139
|
-
}
|
|
140
|
-
static prepareModel(model) {
|
|
141
|
-
if (model.charAt(model.length - 1) === '/')
|
|
142
|
-
model = model.slice(0, model.length - 1);
|
|
143
|
-
if (model.charAt(0) === '/')
|
|
144
|
-
model = model.slice(1, model.length);
|
|
145
|
-
return model;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* And enipoint to application
|
|
149
|
-
*
|
|
150
|
-
* @param {E} endpoint
|
|
151
|
-
* @param {string} model
|
|
152
|
-
* @returns {boolean}
|
|
153
|
-
*/
|
|
154
|
-
add(endpoint, model, entity, circular, customContentType) {
|
|
155
|
-
log.i(`I am maping ${model} on ${endpoint}`);
|
|
156
|
-
model = Resource.prepareModel(model);
|
|
157
|
-
let e;
|
|
158
|
-
e = (endpoint).toString();
|
|
159
|
-
if (Resource.endpoints[e] === void 0) {
|
|
160
|
-
console.error('Endpoint is not mapped ! Cannot add model ' + model);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
if (Resource.endpoints[e].models[model] !== void 0) {
|
|
164
|
-
if (Resource.enableWarnings)
|
|
165
|
-
console.warn(`Model '${model}' is already defined in endpoint: `
|
|
166
|
-
+ Resource.endpoints[e].url);
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
Resource.endpoints[e].models[model] =
|
|
170
|
-
new Rest(Resource.endpoints[e].url
|
|
171
|
-
+ '/' + model, Resource.request, {
|
|
172
|
-
endpoint: e,
|
|
173
|
-
path: model,
|
|
174
|
-
entity,
|
|
175
|
-
circular,
|
|
176
|
-
}, customContentType); // TODO put custom content type in meta ?
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Access api throught endpoint
|
|
181
|
-
*
|
|
182
|
-
* @param {E} endpoint
|
|
183
|
-
* @param {string} model
|
|
184
|
-
* @returns {Rest<T, TA>}
|
|
185
|
-
*/
|
|
186
|
-
api(endpoint, model) {
|
|
187
|
-
if (model.charAt(0) === '/')
|
|
188
|
-
model = model.slice(1, model.length);
|
|
189
|
-
let e = (endpoint).toString();
|
|
190
|
-
if (Resource.endpoints[e] === void 0) {
|
|
191
|
-
throw `Endpoint: ${endpoint} is not mapped ! Cannot add model: ${model}`;
|
|
192
|
-
}
|
|
193
|
-
let allModels = Resource.endpoints[e].models;
|
|
194
|
-
let orgModel = model;
|
|
195
|
-
model = this.checkNestedModels(model, allModels);
|
|
196
|
-
if (Resource.endpoints[e].models[model] === void 0) {
|
|
197
|
-
throw `Model '${model}' is undefined in endpoint: ${Resource.endpoints[e].url} `;
|
|
198
|
-
}
|
|
199
|
-
let res = Resource.endpoints[(endpoint).toString()].models[model];
|
|
200
|
-
if (orgModel !== model) {
|
|
201
|
-
let baseUrl = Resource.endpoints[(endpoint).toString()].url;
|
|
202
|
-
res.__rest_endpoint = `${baseUrl}/${orgModel}`;
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
res.__rest_endpoint = void 0;
|
|
206
|
-
}
|
|
207
|
-
;
|
|
208
|
-
return res;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
Resource._listenErrors = new Subject();
|
|
212
|
-
Resource._listenSuccess = new Subject();
|
|
213
|
-
Resource.enableWarnings = true;
|
|
214
|
-
Resource.instance = new Resource();
|
|
215
|
-
Resource.endpoints = {};
|
|
216
|
-
Resource.request = new RestRequest();
|
|
217
|
-
Resource.Cookies = Cookie.Instance;
|
|
218
|
-
;
|
|
219
|
-
({}); // @--end-of-file-for-module=ng2-rest lib/resource.service.ts
|
|
99
|
+
`);
|
|
100
|
+
}
|
|
101
|
+
;
|
|
102
|
+
Resource.map(e, e);
|
|
103
|
+
Resource.instance.add(e, model ? model : '', entityMapping, circular, customContentType);
|
|
104
|
+
return {
|
|
105
|
+
model: (params) => Resource.instance.api(e, interpolateParamsToUrl(params, model)),
|
|
106
|
+
replay: (method) => {
|
|
107
|
+
Resource.getModel(e, model).replay(method);
|
|
108
|
+
},
|
|
109
|
+
get headers() {
|
|
110
|
+
return Resource.getModel(e, model).headers;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
static reset() {
|
|
115
|
+
Resource.endpoints = {};
|
|
116
|
+
}
|
|
117
|
+
static map(endpoint, url) {
|
|
118
|
+
log.i('url', url);
|
|
119
|
+
let regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
|
|
120
|
+
let e = endpoint;
|
|
121
|
+
if (!regex.test(url)) {
|
|
122
|
+
throw `Url address is not correct: ${url}`;
|
|
123
|
+
}
|
|
124
|
+
if (url.charAt(url.length - 1) === '/')
|
|
125
|
+
url = url.slice(0, url.length - 1);
|
|
126
|
+
log.i('url after', url);
|
|
127
|
+
if (Resource.endpoints[e] !== void 0) {
|
|
128
|
+
Helpers.log('Cannot use map function at the same API endpoint again ('
|
|
129
|
+
+ Resource.endpoints[e].url + ')');
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
Resource.endpoints[e] = {
|
|
133
|
+
url: url,
|
|
134
|
+
models: {},
|
|
135
|
+
entity: null
|
|
136
|
+
};
|
|
137
|
+
log.i('enpoints', Resource.endpoints);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
static prepareModel(model) {
|
|
141
|
+
if (model.charAt(model.length - 1) === '/')
|
|
142
|
+
model = model.slice(0, model.length - 1);
|
|
143
|
+
if (model.charAt(0) === '/')
|
|
144
|
+
model = model.slice(1, model.length);
|
|
145
|
+
return model;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* And enipoint to application
|
|
149
|
+
*
|
|
150
|
+
* @param {E} endpoint
|
|
151
|
+
* @param {string} model
|
|
152
|
+
* @returns {boolean}
|
|
153
|
+
*/
|
|
154
|
+
add(endpoint, model, entity, circular, customContentType) {
|
|
155
|
+
log.i(`I am maping ${model} on ${endpoint}`);
|
|
156
|
+
model = Resource.prepareModel(model);
|
|
157
|
+
let e;
|
|
158
|
+
e = (endpoint).toString();
|
|
159
|
+
if (Resource.endpoints[e] === void 0) {
|
|
160
|
+
console.error('Endpoint is not mapped ! Cannot add model ' + model);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (Resource.endpoints[e].models[model] !== void 0) {
|
|
164
|
+
if (Resource.enableWarnings)
|
|
165
|
+
console.warn(`Model '${model}' is already defined in endpoint: `
|
|
166
|
+
+ Resource.endpoints[e].url);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
Resource.endpoints[e].models[model] =
|
|
170
|
+
new Rest(Resource.endpoints[e].url
|
|
171
|
+
+ '/' + model, Resource.request, {
|
|
172
|
+
endpoint: e,
|
|
173
|
+
path: model,
|
|
174
|
+
entity,
|
|
175
|
+
circular,
|
|
176
|
+
}, customContentType); // TODO put custom content type in meta ?
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Access api throught endpoint
|
|
181
|
+
*
|
|
182
|
+
* @param {E} endpoint
|
|
183
|
+
* @param {string} model
|
|
184
|
+
* @returns {Rest<T, TA>}
|
|
185
|
+
*/
|
|
186
|
+
api(endpoint, model) {
|
|
187
|
+
if (model.charAt(0) === '/')
|
|
188
|
+
model = model.slice(1, model.length);
|
|
189
|
+
let e = (endpoint).toString();
|
|
190
|
+
if (Resource.endpoints[e] === void 0) {
|
|
191
|
+
throw `Endpoint: ${endpoint} is not mapped ! Cannot add model: ${model}`;
|
|
192
|
+
}
|
|
193
|
+
let allModels = Resource.endpoints[e].models;
|
|
194
|
+
let orgModel = model;
|
|
195
|
+
model = this.checkNestedModels(model, allModels);
|
|
196
|
+
if (Resource.endpoints[e].models[model] === void 0) {
|
|
197
|
+
throw `Model '${model}' is undefined in endpoint: ${Resource.endpoints[e].url} `;
|
|
198
|
+
}
|
|
199
|
+
let res = Resource.endpoints[(endpoint).toString()].models[model];
|
|
200
|
+
if (orgModel !== model) {
|
|
201
|
+
let baseUrl = Resource.endpoints[(endpoint).toString()].url;
|
|
202
|
+
res.__rest_endpoint = `${baseUrl}/${orgModel}`;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
res.__rest_endpoint = void 0;
|
|
206
|
+
}
|
|
207
|
+
;
|
|
208
|
+
return res;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
Resource._listenErrors = new Subject();
|
|
212
|
+
Resource._listenSuccess = new Subject();
|
|
213
|
+
Resource.enableWarnings = true;
|
|
214
|
+
Resource.instance = new Resource();
|
|
215
|
+
Resource.endpoints = {};
|
|
216
|
+
Resource.request = new RestRequest();
|
|
217
|
+
Resource.Cookies = Cookie.Instance;
|
|
218
|
+
;
|
|
219
|
+
({}); // @--end-of-file-for-module=ng2-rest lib/resource.service.ts
|
|
220
220
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1idW5kbGUvbmcyLXJlc3QvcHJvamVjdHMvbmcyLXJlc3Qvc3JjL2xpYi9yZXNvdXJjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUN0QyxLQUFLLENBQUMsU0FBUyxDQUNoQixDQUFBO0FBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUdsQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBTTFDLE1BQU0sT0FBTyxRQUFRO0lBb0huQjtRQUNFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUU7Z0JBQUUsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7YUFBRTtZQUFBLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBdEhNLE1BQU0sS0FBSyxZQUFZO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU0sTUFBTSxL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aUJBQVEsR0FBRyxJQUFJLFFBQVEsRUFBb0IsQ0FBQztBQUM1QyxrQkFBUyxHQUFHLEVBQUUsQ0FBQztBQVFmLGdCQUFPLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7QUEwRDFDLGdCQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQXVJekMsQ0FBQztBQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyw2REFBNkQiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExvZywgTGV2ZWwgfSBmcm9tICduZzItbG9nZ2VyL2Jyb3dzZXInO1xuY29uc3QgbG9nID0gTG9nLmNyZWF0ZSgncmVzb3VjZS1zZXJ2aWNlJyxcbiAgTGV2ZWwuX19OT1RISU5HXG4pXG5cbmltcG9ydCB7IFJlc3QgfSBmcm9tICcuL3Jlc3QuY2xhc3MnO1xuaW1wb3J0IHsgUmVzdFJlcXVlc3QgfSBmcm9tICcuL3Jlc3QtcmVxdWVzdCc7XG5pbXBvcnQgeyBSZXN0SGVhZGVycyB9IGZyb20gJy4vcmVzdC1oZWFkZXJzJztcbmltcG9ydCB7IENvb2tpZSB9IGZyb20gJy4vY29va2llJztcbmltcG9ydCB7IE1hcHBpbmcgfSBmcm9tICcuL21hcHBpbmcnO1xuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgaW50ZXJwb2xhdGVQYXJhbXNUb1VybCwgaXNWYWxpZCwgY29udGFpbnNNb2RlbHMsIGdldE1vZGVscyB9IGZyb20gJy4vcGFyYW1zJztcbmltcG9ydCB7IENpcmMgfSBmcm9tICdqc29uMTAvYnJvd3Nlcic7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSAndG5wLWNvcmUvYnJvd3NlcidcblxuXG5kZWNsYXJlIGNvbnN0IGdsb2JhbDogYW55O1xuXG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZTxFLCBULCBUQT4ge1xuICBwcm90ZWN0ZWQgc3RhdGljIF9saXN0ZW5FcnJvcnMgPSBuZXcgU3ViamVjdDxNb2RlbHMuQmFja2VuZEVycm9yPigpO1xuICBwcm90ZWN0ZWQgc3RhdGljIF9saXN0ZW5TdWNjZXNzID0gbmV3IFN1YmplY3Q8TW9kZWxzLkh0dHBSZXNwb25zZTxhbnk+PigpO1xuICBwdWJsaWMgc3RhdGljIGdldCBsaXN0ZW5FcnJvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RlbkVycm9ycy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGxpc3RlblN1Y2Nlc3NPcGVyYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9saXN0ZW5TdWNjZXNzLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZW5hYmxlV2FybmluZ3M6IGJvb2xlYW4gPSB0cnVlO1xuXG5cbiAgcHJpdmF0ZSBnZXRab25lKCkge1xuICAgIGNvbnN0IGlzTm9kZSA9ICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJylcbiAgICBpZiAoaXNOb2RlKSB7IHJldHVybiB9O1xuICAgIGNvbnN0IG5nID0gd2luZG93WyduZyddO1xuICAgIGNvbnN0IGdldEFsbEFuZ3VsYXJSb290RWxlbWVudHMgPSB3aW5kb3dbJ2dldEFsbEFuZ3VsYXJSb290RWxlbWVudHMnXTtcbiAgICBpZiAoIW5nIHx8ICFnZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHByb2JlID0gbmcucHJvYmU7XG4gICAgY29uc3QgY29yZVRva2VucyA9IG5nLmNvcmVUb2tlbnM7XG4gICAgaWYgKCFjb3JlVG9rZW5zIHx8ICFjb3JlVG9rZW5zLk5nWm9uZSkgeyByZXR1cm47IH1cbiAgICBjb25zdCB6b25lQ2xhc3MgPSBjb3JlVG9rZW5zLk5nWm9uZTtcbiAgICBpZiAoIXByb2JlIHx8IHR5cGVvZiBwcm9iZSAhPT0gJ2Z1bmN0aW9uJyB8fCAhZ2V0QWxsQW5ndWxhclJvb3RFbGVtZW50cykgeyByZXR1cm47IH1cbiAgICBjb25zdCBhbmd1bGFyRWxlbWVudHM6IGFueVtdID0gZ2V0QWxsQW5ndWxhclJvb3RFbGVtZW50cygpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhbmd1bGFyRWxlbWVudHMpIHx8IGFuZ3VsYXJFbGVtZW50cy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBuZy5wcm9iZShhbmd1bGFyRWxlbWVudHNbMF0pO1xuICAgIGlmICghcm9vdEVsZW1lbnQpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgaW5qZWN0b3IgPSByb290RWxlbWVudC5pbmplY3RvcjtcbiAgICBpZiAoIWluamVjdG9yIHx8ICFpbmplY3Rvci5nZXQgfHwgdHlwZW9mIGluamVjdG9yLmdldCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm47IH1cbiAgICBjb25zdCB6b25lID0gaW5qZWN0b3IuZ2V0KHpvbmVDbGFzcylcbiAgICByZXR1cm4gem9uZTtcbiAgfVxuXG5cbiAgcHVibGljIHN0YXRpYyBpbml0QW5ndWxhck5nWm9uZSh6b25lKSB7XG4gICAgUmVzdFJlcXVlc3Quem9uZSA9IHpvbmU7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTmVzdGVkTW9kZWxzKG1vZGVsOiBzdHJpbmcsIGFsbE1vZGVsczogT2JqZWN0KSB7XG5cbiAgICBmb3IgKGxldCBwIGluIGFsbE1vZGVscykge1xuICAgICAgaWYgKGFsbE1vZGVscy5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBsZXQgbSA9IGFsbE1vZGVsc1twXTtcbiAgICAgICAgaWYgKGlzVmFsaWQocCkpIHtcbiAgICAgICAgICBsZXQgdXJsTW9kZWxzID0gZ2V0TW9kZWxzKHApO1xuICAgICAgICAgIGlmIChjb250YWluc01vZGVscyhtb2RlbCwgdXJsTW9kZWxzKSkge1xuICAgICAgICAgICAgbW9kZWwgPSBwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2UgPSBuZXcgUmVzb3VyY2U8c3RyaW5nLCBhbnksIGFueT4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgZW5kcG9pbnRzID0ge307XG4gIHB1YmxpYyBzdGF0aWMgZ2V0TW9kZWwoZW5kcG9pbnQ6IHN0cmluZywgbW9kZWw6IHN0cmluZyk6IFJlc3Q8YW55PiB7XG4gICAgbW9kZWwgPSBSZXNvdXJjZS5wcmVwYXJlTW9kZWwobW9kZWwpO1xuICAgIGNvbnN0IGUgPSBSZXNvdXJjZS5lbmRwb2ludHNbZW5kcG9pbnRdO1xuICAgIGlmICghZSkgeyByZXR1cm4gdm9pZCAwOyB9XG4gICAgY29uc3QgciA9IFJlc291cmNlLmVuZHBvaW50c1tlbmRwb2ludF0ubW9kZWxzW21vZGVsXTtcbiAgICByZXR1cm4gUmVzb3VyY2UuZW5kcG9pbnRzW2VuZHBvaW50XS5tb2RlbHNbbW9kZWxdO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIHJlcXVlc3Q6IFJlc3RSZXF1ZXN0ID0gbmV3IFJlc3RSZXF1ZXN0KCk7XG5cblxuXG5cbiAgcHVibGljIHN0YXRpYyBjcmVhdGU8QSwgVEEgPSBBW10+KFxuICAgIGU6IHN0cmluZyxcbiAgICBtb2RlbD86IHN0cmluZyxcbiAgICBlbnRpdHlNYXBwaW5nPzogTWFwcGluZy5NYXBwaW5nLFxuICAgIGNpcmN1bGFyPzogQ2lyY1tdLFxuICAgIGN1c3RvbUNvbnRlbnRUeXBlPzogUmVzdEhlYWRlcnMsXG4gICk6IE1vZGVscy5SZXNvdXJjZU1vZGVsPEEsIFRBPiB7XG4gICAgY29uc3QgYmFkUmVzdFJlZ0VYID0gbmV3IFJlZ0V4cCgnKChcXC86KVthLXpdKykrJywgJ2cnKTtcbiAgICBjb25zdCBtYXRjaEFyciA9IG1vZGVsLm1hdGNoKGJhZFJlc3RSZWdFWCkgfHwgW107XG4gICAgY29uc3QgYmFkTW9kZWxzTmV4dFRvRWFjaE90aGVyID0gbWF0Y2hBcnIuam9pbigpO1xuICAgIGNvbnN0IGF0bGVhczJEb3VibGVEb3RzID0gKChiYWRNb2RlbHNOZXh0VG9FYWNoT3RoZXIubWF0Y2gobmV3IFJlZ0V4cCgnOicsICdnJykpIHx8IFtdKS5sZW5ndGggPj0gMik7XG4gICAgaWYgKGF0bGVhczJEb3VibGVEb3RzICYmIG1vZGVsLnNlYXJjaChiYWRNb2RlbHNOZXh0VG9FYWNoT3RoZXIpICE9PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcblxuQmFkIHJlc3QgbW9kZWw6ICR7bW9kZWx9XG5cbkRvIG5vdCBjcmVhdGUgcmVzdCBtb2RlbHMgbGlrZSB0aGlzOiAgICAvYm9vay9hdXRob3IvOmJvb2tpZC86YXV0aG9yaWRcbkluc3RlYWQgdXNlIG5lc3RlZCBhcHByb2FjaDogICAgICAgICAgICAvYm9vay86Ym9va2lkL2F1dGhvci86YXV0aG9yaWRcbiAgICAgICAgICAgIGApXG4gICAgfTtcbiAgICBSZXNvdXJjZS5tYXAoZSwgZSk7XG4gICAgUmVzb3VyY2UuaW5zdGFuY2UuYWRkKGUsIG1vZGVsID8gbW9kZWwgOiAnJywgZW50aXR5TWFwcGluZywgY2lyY3VsYXIsIGN1c3RvbUNvbnRlbnRUeXBlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBtb2RlbDogKHBhcmFtcz86IE9iamVjdCkgPT4gUmVzb3VyY2UuaW5zdGFuY2UuYXBpKFxuICAgICAgICBlLFxuICAgICAgICBpbnRlcnBvbGF0ZVBhcmFtc1RvVXJsKHBhcmFtcywgbW9kZWwpXG4gICAgICApLFxuICAgICAgcmVwbGF5OiAobWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCkgPT4ge1xuICAgICAgICBSZXNvdXJjZS5nZXRNb2RlbChlLCBtb2RlbCkucmVwbGF5KG1ldGhvZCk7XG4gICAgICB9LFxuICAgICAgZ2V0IGhlYWRlcnMoKSB7XG4gICAgICAgIHJldHVybiBSZXNvdXJjZS5nZXRNb2RlbChlLCBtb2RlbCkuaGVhZGVycztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG5cbiAgcHVibGljIHN0YXRpYyByZXNldCgpIHtcbiAgICBSZXNvdXJjZS5lbmRwb2ludHMgPSB7fTtcbiAgfVxuXG5cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgem9uZSA9IHRoaXMuZ2V0Wm9uZSgpO1xuICAgICAgaWYgKCFSZXN0UmVxdWVzdC56b25lKSB7IFJlc3RSZXF1ZXN0LnpvbmUgPSB6b25lIH07XG4gICAgfSlcbiAgfVxuXG5cbiAgcHVibGljIHN0YXRpYyBDb29raWVzID0gQ29va2llLkluc3RhbmNlO1xuXG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFwKGVuZHBvaW50OiBzdHJpbmcsIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICBsb2cuaSgndXJsJywgdXJsKVxuICAgIGxldCByZWdleCA9IC8oaHR0cHxodHRwcyk6XFwvXFwvKFxcdys6ezAsMX1cXHcqKT8oXFxTKykoOlswLTldKyk/KFxcL3xcXC8oW1xcdyMhOi4/Kz0mJSFcXC1cXC9dKSk/LztcbiAgICBsZXQgZSA9IGVuZHBvaW50O1xuICAgIGlmICghcmVnZXgudGVzdCh1cmwpKSB7XG4gICAgICB0aHJvdyBgVXJsIGFkZHJlc3MgaXMgbm90IGNvcnJlY3Q6ICR7dXJsfWA7XG4gICAgfVxuICAgIGlmICh1cmwuY2hhckF0KHVybC5sZW5ndGggLSAxKSA9PT0gJy8nKSB1cmwgPSB1cmwuc2xpY2UoMCwgdXJsLmxlbmd0aCAtIDEpO1xuICAgIGxvZy5pKCd1cmwgYWZ0ZXInLCB1cmwpXG4gICAgaWYgKFJlc291cmNlLmVuZHBvaW50c1tlXSAhPT0gdm9pZCAwKSB7XG4gICAgICBIZWxwZXJzLmxvZygnQ2Fubm90IHVzZSBtYXAgZnVuY3Rpb24gYXQgdGhlIHNhbWUgQVBJIGVuZHBvaW50IGFnYWluICgnXG4gICAgICAgICsgUmVzb3VyY2UuZW5kcG9pbnRzW2VdLnVybCArICcpJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFJlc291cmNlLmVuZHBvaW50c1tlXSA9IHtcbiAgICAgIHVybDogdXJsLFxuICAgICAgbW9kZWxzOiB7fSxcbiAgICAgIGVudGl0eTogbnVsbFxuICAgIH07XG4gICAgbG9nLmkoJ2VucG9pbnRzJywgUmVzb3VyY2UuZW5kcG9pbnRzKVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cblxuICBwcml2YXRlIHN0YXRpYyBwcmVwYXJlTW9kZWwobW9kZWwpIHtcbiAgICBpZiAobW9kZWwuY2hhckF0KG1vZGVsLmxlbmd0aCAtIDEpID09PSAnLycpIG1vZGVsID0gbW9kZWwuc2xpY2UoMCwgbW9kZWwubGVuZ3RoIC0gMSk7XG4gICAgaWYgKG1vZGVsLmNoYXJBdCgwKSA9PT0gJy8nKSBtb2RlbCA9IG1vZGVsLnNsaWNlKDEsIG1vZGVsLmxlbmd0aCk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cblxuXG4gIC8qKlxuICAgKiBBbmQgZW5pcG9pbnQgdG8gYXBwbGljYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtFfSBlbmRwb2ludFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBwcml2YXRlIGFkZChlbmRwb2ludDogRSwgbW9kZWw6IHN0cmluZywgZW50aXR5OiBNYXBwaW5nLk1hcHBpbmcsIGNpcmN1bGFyPzogQ2lyY1tdLCBjdXN0b21Db250ZW50VHlwZT86IFJlc3RIZWFkZXJzKSB7XG4gICAgbG9nLmkoYEkgYW0gbWFwaW5nICR7bW9kZWx9IG9uICR7PGFueT5lbmRwb2ludH1gKTtcbiAgICBtb2RlbCA9IFJlc291cmNlLnByZXBhcmVNb2RlbChtb2RlbCk7XG5cbiAgICBsZXQgZTogc3RyaW5nO1xuICAgIGUgPSA8c3RyaW5nPihlbmRwb2ludCkudG9TdHJpbmcoKTtcblxuICAgIGlmIChSZXNvdXJjZS5lbmRwb2ludHNbZV0gPT09IHZvaWQgMCkge1xuICAgICAgY29uc29sZS5lcnJvcignRW5kcG9pbnQgaXMgbm90IG1hcHBlZCAhIENhbm5vdCBhZGQgbW9kZWwgJyArIG1vZGVsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFJlc291cmNlLmVuZHBvaW50c1tlXS5tb2RlbHNbbW9kZWxdICE9PSB2b2lkIDApIHtcbiAgICAgIGlmIChSZXNvdXJjZS5lbmFibGVXYXJuaW5ncykgY29uc29sZS53YXJuKGBNb2RlbCAnJHttb2RlbH0nIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBlbmRwb2ludDogYFxuICAgICAgICArIFJlc291cmNlLmVuZHBvaW50c1tlXS51cmwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBSZXNvdXJjZS5lbmRwb2ludHNbZV0ubW9kZWxzW21vZGVsXSA9XG4gICAgICBuZXcgUmVzdDxULCBUQT4oUmVzb3VyY2UuZW5kcG9pbnRzW2VdLnVybFxuICAgICAgICArICcvJyArIG1vZGVsLCBSZXNvdXJjZS5yZXF1ZXN0LCB7XG4gICAgICAgIGVuZHBvaW50OiBlLFxuICAgICAgICBwYXRoOiBtb2RlbCxcbiAgICAgICAgZW50aXR5LFxuICAgICAgICBjaXJjdWxhcixcbiAgICAgIH0sIGN1c3RvbUNvbnRlbnRUeXBlKTsgLy8gVE9ETyBwdXQgY3VzdG9tIGNvbnRlbnQgdHlwZSBpbiBtZXRhID9cbiAgICByZXR1cm47XG4gIH1cblxuXG5cbiAgLyoqXG4gICAqIEFjY2VzcyBhcGkgdGhyb3VnaHQgZW5kcG9pbnRcbiAgICpcbiAgICogQHBhcmFtIHtFfSBlbmRwb2ludFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxcbiAgICogQHJldHVybnMge1Jlc3Q8VCwgVEE+fVxuICAgKi9cbiAgcHJpdmF0ZSBhcGkoZW5kcG9pbnQ6IEUsIG1vZGVsOiBzdHJpbmcpOiBSZXN0PFQsIFRBPiB7XG5cblxuXG5cblxuXG4gICAgaWYgKG1vZGVsLmNoYXJBdCgwKSA9PT0gJy8nKSBtb2RlbCA9IG1vZGVsLnNsaWNlKDEsIG1vZGVsLmxlbmd0aCk7XG4gICAgbGV0IGUgPSA8c3RyaW5nPihlbmRwb2ludCkudG9TdHJpbmcoKTtcbiAgICBpZiAoUmVzb3VyY2UuZW5kcG9pbnRzW2VdID09PSB2b2lkIDApIHtcbiAgICAgIHRocm93IGBFbmRwb2ludDogJHs8YW55PmVuZHBvaW50fSBpcyBub3QgbWFwcGVkICEgQ2Fubm90IGFkZCBtb2RlbDogJHttb2RlbH1gO1xuICAgIH1cbiAgICBsZXQgYWxsTW9kZWxzOiBPYmplY3QgPSBSZXNvdXJjZS5lbmRwb2ludHNbZV0ubW9kZWxzO1xuICAgIGxldCBvcmdNb2RlbCA9IG1vZGVsO1xuICAgIG1vZGVsID0gdGhpcy5jaGVja05lc3RlZE1vZGVscyhtb2RlbCwgYWxsTW9kZWxzKTtcblxuICAgIGlmIChSZXNvdXJjZS5lbmRwb2ludHNbZV0ubW9kZWxzW21vZGVsXSA9PT0gdm9pZCAwKSB7XG5cbiAgICAgIHRocm93IGBNb2RlbCAnJHttb2RlbH0nIGlzIHVuZGVmaW5lZCBpbiBlbmRwb2ludDogJHtSZXNvdXJjZS5lbmRwb2ludHNbZV0udXJsfSBgO1xuICAgIH1cblxuICAgIGxldCByZXM6IFJlc3Q8VCwgVEE+ID0gUmVzb3VyY2UuZW5kcG9pbnRzWzxzdHJpbmc+KGVuZHBvaW50KS50b1N0cmluZygpXS5tb2RlbHNbbW9kZWxdO1xuXG5cblxuXG5cblxuICAgIGlmIChvcmdNb2RlbCAhPT0gbW9kZWwpIHtcbiAgICAgIGxldCBiYXNlVXJsID0gUmVzb3VyY2UuZW5kcG9pbnRzWzxzdHJpbmc+KGVuZHBvaW50KS50b1N0cmluZygpXS51cmw7XG5cblxuXG4gICAgICByZXMuX19yZXN0X2VuZHBvaW50ID0gYCR7YmFzZVVybH0vJHtvcmdNb2RlbH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMuX19yZXN0X2VuZHBvaW50ID0gdm9pZCAwO1xuICAgIH07XG5cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuXG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gOyh7fSk7IC8vIEAtLWVuZC1vZi1maWxlLWZvci1tb2R1bGU9bmcyLXJlc3QgbGliL3Jlc291cmNlLnNlcnZpY2UudHMiXX0=
|