@decaf-ts/for-http 0.0.11 → 0.2.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/dist/for-http.cjs +240 -0
- package/dist/for-http.esm.cjs +231 -0
- package/lib/RestRepository.cjs +1 -2
- package/lib/RestRepository.d.ts +7 -0
- package/lib/RestService.cjs +1 -2
- package/{dist/types → lib}/RestService.d.ts +3 -3
- package/lib/adapter.cjs +6 -5
- package/{dist/types → lib}/adapter.d.ts +8 -8
- package/lib/axios/axios.cjs +50 -0
- package/{dist/types → lib/axios}/axios.d.ts +5 -3
- package/lib/axios/index.cjs +18 -0
- package/lib/axios/index.d.ts +1 -0
- package/lib/axios/types.cjs +3 -0
- package/lib/axios/types.d.ts +2 -0
- package/lib/esm/RestRepository.d.ts +7 -0
- package/lib/esm/RestRepository.js +1 -2
- package/lib/esm/RestService.d.ts +43 -0
- package/lib/esm/RestService.js +1 -2
- package/lib/esm/adapter.d.ts +23 -0
- package/lib/esm/adapter.js +8 -7
- package/lib/esm/axios/axios.d.ts +13 -0
- package/lib/esm/axios/axios.js +46 -0
- package/lib/esm/axios/index.d.ts +1 -0
- package/lib/esm/axios/index.js +2 -0
- package/lib/esm/axios/types.d.ts +2 -0
- package/lib/esm/axios/types.js +2 -0
- package/{dist/types → lib/esm}/index.d.ts +2 -2
- package/lib/esm/index.js +3 -4
- package/lib/esm/types.d.ts +8 -0
- package/lib/esm/types.js +1 -2
- package/lib/index.cjs +3 -4
- package/lib/index.d.ts +23 -0
- package/lib/types.cjs +1 -2
- package/lib/types.d.ts +8 -0
- package/package.json +31 -38
- package/dist/esm/for-http.js +0 -2
- package/dist/esm/for-http.js.LICENSE.txt +0 -14
- package/dist/for-http.js +0 -2
- package/dist/for-http.js.LICENSE.txt +0 -14
- package/dist/types/RestRepository.d.ts +0 -5
- package/dist/types/types.d.ts +0 -4
- package/lib/axios.cjs +0 -51
- package/lib/esm/axios.js +0 -47
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@decaf-ts/core'), require('@decaf-ts/db-decorators')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', '@decaf-ts/core', '@decaf-ts/db-decorators'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["for-http"] = {}, global.core, global.dbDecorators));
|
|
5
|
+
})(this, (function (exports, core, dbDecorators) { 'use strict';
|
|
6
|
+
|
|
7
|
+
class RestService {
|
|
8
|
+
get class() {
|
|
9
|
+
if (!this._class)
|
|
10
|
+
throw new dbDecorators.InternalError("No class definition found for this repository");
|
|
11
|
+
return this._class;
|
|
12
|
+
}
|
|
13
|
+
get pk() {
|
|
14
|
+
if (!this._pk)
|
|
15
|
+
this._pk = dbDecorators.findPrimaryKey(new this.class()).id;
|
|
16
|
+
return this._pk;
|
|
17
|
+
}
|
|
18
|
+
get adapter() {
|
|
19
|
+
if (!this._adapter)
|
|
20
|
+
throw new dbDecorators.InternalError("No adapter found for this repository. did you use the @uses decorator or pass it in the constructor?");
|
|
21
|
+
return this._adapter;
|
|
22
|
+
}
|
|
23
|
+
get tableName() {
|
|
24
|
+
if (!this._tableName)
|
|
25
|
+
this._tableName = core.Repository.table(this.class);
|
|
26
|
+
return this._tableName;
|
|
27
|
+
}
|
|
28
|
+
constructor(adapter, clazz) {
|
|
29
|
+
this.observers = [];
|
|
30
|
+
this._adapter = adapter;
|
|
31
|
+
if (clazz)
|
|
32
|
+
this._class = clazz;
|
|
33
|
+
}
|
|
34
|
+
async create(model, ...args) {
|
|
35
|
+
// eslint-disable-next-line prefer-const
|
|
36
|
+
let { record, id } = this.adapter.prepare(model, this.pk);
|
|
37
|
+
record = await this.adapter.create(this.tableName, id, record, ...args);
|
|
38
|
+
return this.adapter.revert(record, this.class, this.pk, id);
|
|
39
|
+
}
|
|
40
|
+
async read(id, ...args) {
|
|
41
|
+
const m = await this.adapter.read(this.tableName, id, ...args);
|
|
42
|
+
return this.adapter.revert(m, this.class, this.pk, id);
|
|
43
|
+
}
|
|
44
|
+
async update(model, ...args) {
|
|
45
|
+
// eslint-disable-next-line prefer-const
|
|
46
|
+
let { record, id } = this.adapter.prepare(model, this.pk);
|
|
47
|
+
record = await this.adapter.update(this.tableName, id, record, ...args);
|
|
48
|
+
return this.adapter.revert(record, this.class, this.pk, id);
|
|
49
|
+
}
|
|
50
|
+
async delete(id, ...args) {
|
|
51
|
+
const m = await this.adapter.delete(this.tableName, id, ...args);
|
|
52
|
+
return this.adapter.revert(m, this.class, this.pk, id);
|
|
53
|
+
}
|
|
54
|
+
async createAll(models, ...args) {
|
|
55
|
+
if (!models.length)
|
|
56
|
+
return models;
|
|
57
|
+
const prepared = models.map((m) => this.adapter.prepare(m, this.pk));
|
|
58
|
+
const ids = prepared.map((p) => p.id);
|
|
59
|
+
let records = prepared.map((p) => p.record);
|
|
60
|
+
records = await this.adapter.createAll(this.tableName, ids, records, ...args);
|
|
61
|
+
return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, ids[i]));
|
|
62
|
+
}
|
|
63
|
+
async deleteAll(keys, ...args) {
|
|
64
|
+
const results = await this.adapter.deleteAll(this.tableName, keys, ...args);
|
|
65
|
+
return results.map((r, i) => this.adapter.revert(r, this.class, this.pk, keys[i]));
|
|
66
|
+
}
|
|
67
|
+
async readAll(keys, ...args) {
|
|
68
|
+
const records = await this.adapter.readAll(this.tableName, keys, ...args);
|
|
69
|
+
return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, keys[i]));
|
|
70
|
+
}
|
|
71
|
+
async updateAll(models, ...args) {
|
|
72
|
+
const records = models.map((m) => this.adapter.prepare(m, this.pk));
|
|
73
|
+
const updated = await this.adapter.updateAll(this.tableName, records.map((r) => r.id), records.map((r) => r.record), ...args);
|
|
74
|
+
return updated.map((u, i) => this.adapter.revert(u, this.class, this.pk, records[i].id));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @summary Registers an {@link Observer}
|
|
78
|
+
* @param {Observer} observer
|
|
79
|
+
*
|
|
80
|
+
* @see {Observable#observe}
|
|
81
|
+
*/
|
|
82
|
+
observe(observer) {
|
|
83
|
+
const index = this.observers.indexOf(observer);
|
|
84
|
+
if (index !== -1)
|
|
85
|
+
throw new dbDecorators.InternalError("Observer already registered");
|
|
86
|
+
this.observers.push(observer);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* @summary Unregisters an {@link Observer}
|
|
90
|
+
* @param {Observer} observer
|
|
91
|
+
*
|
|
92
|
+
* @see {Observable#unObserve}
|
|
93
|
+
*/
|
|
94
|
+
unObserve(observer) {
|
|
95
|
+
const index = this.observers.indexOf(observer);
|
|
96
|
+
if (index === -1)
|
|
97
|
+
throw new dbDecorators.InternalError("Failed to find Observer");
|
|
98
|
+
this.observers.splice(index, 1);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* @summary calls all registered {@link Observer}s to update themselves
|
|
102
|
+
* @param {any[]} [args] optional arguments to be passed to the {@link Observer#refresh} method
|
|
103
|
+
*/
|
|
104
|
+
async updateObservers(...args) {
|
|
105
|
+
const results = await Promise.allSettled(this.observers.map((o) => o.refresh(...args)));
|
|
106
|
+
results.forEach((result, i) => {
|
|
107
|
+
if (result.status === "rejected")
|
|
108
|
+
console.warn(`Failed to update observable ${this.observers[i]}: ${result.reason}`);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
class HttpAdapter extends core.Adapter {
|
|
114
|
+
constructor(native, config, flavour = "http") {
|
|
115
|
+
super(native, flavour);
|
|
116
|
+
this.config = config;
|
|
117
|
+
}
|
|
118
|
+
async context(operation, overrides, model) {
|
|
119
|
+
return (await super.context(operation, Object.assign({
|
|
120
|
+
headers: {},
|
|
121
|
+
}, overrides), model));
|
|
122
|
+
}
|
|
123
|
+
repository() {
|
|
124
|
+
return RestService;
|
|
125
|
+
}
|
|
126
|
+
url(tableName, queryParams) {
|
|
127
|
+
const url = new URL(`${this.config.protocol}://${this.config.host}/${tableName}`);
|
|
128
|
+
if (queryParams)
|
|
129
|
+
Object.entries(queryParams).forEach(([key, value]) => url.searchParams.append(key, value.toString()));
|
|
130
|
+
return encodeURI(url.toString());
|
|
131
|
+
}
|
|
132
|
+
parseError(err) {
|
|
133
|
+
const { message } = err;
|
|
134
|
+
switch (message) {
|
|
135
|
+
default:
|
|
136
|
+
return err;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
140
|
+
async initialize(...args) {
|
|
141
|
+
// do nothing
|
|
142
|
+
}
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
144
|
+
raw(rawInput, process, ...args) {
|
|
145
|
+
throw new core.UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
146
|
+
}
|
|
147
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
148
|
+
Sequence(options) {
|
|
149
|
+
throw new core.UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
150
|
+
}
|
|
151
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
152
|
+
parseCondition(condition) {
|
|
153
|
+
throw new core.UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
154
|
+
}
|
|
155
|
+
get Statement() {
|
|
156
|
+
throw new core.UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
157
|
+
}
|
|
158
|
+
get Clauses() {
|
|
159
|
+
throw new dbDecorators.InternalError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
class AxiosHttpAdapter extends HttpAdapter {
|
|
164
|
+
constructor(native, config, flavour = "axios") {
|
|
165
|
+
super(native, config, flavour);
|
|
166
|
+
}
|
|
167
|
+
async request(details) {
|
|
168
|
+
return this.native.request(details);
|
|
169
|
+
}
|
|
170
|
+
async create(tableName, id, model) {
|
|
171
|
+
try {
|
|
172
|
+
const url = this.url(tableName);
|
|
173
|
+
return this.native.post(url, model);
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
throw this.parseError(e);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async read(tableName, id) {
|
|
180
|
+
try {
|
|
181
|
+
const url = this.url(tableName, { id: id });
|
|
182
|
+
return this.native.get(url);
|
|
183
|
+
}
|
|
184
|
+
catch (e) {
|
|
185
|
+
throw this.parseError(e);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async update(tableName, id, model) {
|
|
189
|
+
try {
|
|
190
|
+
const url = this.url(tableName);
|
|
191
|
+
return this.native.put(url, model);
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
throw this.parseError(e);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async delete(tableName, id) {
|
|
198
|
+
try {
|
|
199
|
+
const url = this.url(tableName, { id: id });
|
|
200
|
+
return this.native.delete(url);
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
throw this.parseError(e);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
class RestRepository extends core.Repository {
|
|
209
|
+
constructor(adapter, clazz) {
|
|
210
|
+
super(adapter, clazz);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* @summary Module summary
|
|
216
|
+
* @description Module description
|
|
217
|
+
* @module ts-workspace
|
|
218
|
+
*/
|
|
219
|
+
/**
|
|
220
|
+
* @summary Namespace summary
|
|
221
|
+
* @description Namespace description
|
|
222
|
+
* @namespace Namespace
|
|
223
|
+
* @memberOf module:ts-workspace
|
|
224
|
+
*/
|
|
225
|
+
/**
|
|
226
|
+
* @summary stores the current package version
|
|
227
|
+
* @description this is how you should document a constant
|
|
228
|
+
* @const VERSION
|
|
229
|
+
* @memberOf module:ts-workspace
|
|
230
|
+
*/
|
|
231
|
+
const VERSION = "0.2.0";
|
|
232
|
+
|
|
233
|
+
exports.AxiosHttpAdapter = AxiosHttpAdapter;
|
|
234
|
+
exports.HttpAdapter = HttpAdapter;
|
|
235
|
+
exports.RestRepository = RestRepository;
|
|
236
|
+
exports.RestService = RestService;
|
|
237
|
+
exports.VERSION = VERSION;
|
|
238
|
+
|
|
239
|
+
}));
|
|
240
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWh0dHAuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvUmVzdFNlcnZpY2UudHMiLCIuLi9zcmMvYWRhcHRlci50cyIsIi4uL3NyYy9heGlvcy9heGlvcy50cyIsIi4uL3NyYy9SZXN0UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdG9yLFxuICBDb250ZXh0LFxuICBDcnVkT3BlcmF0b3IsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEh0dHBBZGFwdGVyIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuXG5leHBvcnQgY2xhc3MgUmVzdFNlcnZpY2U8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFEsXG4gICAgQSBleHRlbmRzIEh0dHBBZGFwdGVyPGFueSwgUSwgRiwgQz4sXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID5cbiAgaW1wbGVtZW50cyBDcnVkT3BlcmF0b3I8TT4sIEJ1bGtDcnVkT3BlcmF0b3I8TT4sIE9ic2VydmFibGVcbntcbiAgcHJpdmF0ZSByZWFkb25seSBfY2xhc3MhOiBDb25zdHJ1Y3RvcjxNPjtcbiAgcHJpdmF0ZSBfcGshOiBrZXlvZiBNO1xuXG4gIGdldCBjbGFzcygpIHtcbiAgICBpZiAoIXRoaXMuX2NsYXNzKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJObyBjbGFzcyBkZWZpbml0aW9uIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnlcIik7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzO1xuICB9XG5cbiAgZ2V0IHBrKCkge1xuICAgIGlmICghdGhpcy5fcGspIHRoaXMuX3BrID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMuY2xhc3MoKSkuaWQ7XG4gICAgcmV0dXJuIHRoaXMuX3BrO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9ic2VydmVyczogT2JzZXJ2ZXJbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXIhOiBBO1xuICBwcml2YXRlIF90YWJsZU5hbWUhOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIGdldCBhZGFwdGVyKCk6IEEge1xuICAgIGlmICghdGhpcy5fYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk5vIGFkYXB0ZXIgZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeS4gZGlkIHlvdSB1c2UgdGhlIEB1c2VzIGRlY29yYXRvciBvciBwYXNzIGl0IGluIHRoZSBjb25zdHJ1Y3Rvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdGFibGVOYW1lKCkge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgdGhpcy5fYWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgaWYgKGNsYXp6KSB0aGlzLl9jbGFzcyA9IGNsYXp6O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkIH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQobSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkIH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZyB8IG51bWJlciwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIG1vZGVscztcbiAgICBjb25zdCBwcmVwYXJlZCA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGxldCByZWNvcmRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIGlkcyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgICAgcmVjb3JkcyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQWxsKGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZUFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICBhc3luYyByZWFkQWxsKGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWRBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIucmVjb3JkKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB1cGRhdGVkLm1hcCgodSwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjb2JzZXJ2ZX1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk9ic2VydmVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGNhbGxzIGFsbCByZWdpc3RlcmVkIHtAbGluayBPYnNlcnZlcn1zIHRvIHVwZGF0ZSB0aGVtc2VsdmVzXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSBvcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgT2JzZXJ2ZXIjcmVmcmVzaH0gbWV0aG9kXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLnJlZnJlc2goLi4uYXJncykpXG4gICAgKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIG9ic2VydmFibGUgJHt0aGlzLm9ic2VydmVyc1tpXX06ICR7cmVzdWx0LnJlYXNvbn1gXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIENsYXVzZUZhY3RvcnksXG4gIENvbmRpdGlvbixcbiAgUmVwb3NpdG9yeSxcbiAgU2VxdWVuY2UsXG4gIFNlcXVlbmNlT3B0aW9ucyxcbiAgU3RhdGVtZW50LFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29udGV4dCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEh0dHBDb25maWcgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tIFwiLi9SZXN0U2VydmljZVwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSHR0cEFkYXB0ZXI8XG4gIFksXG4gIFEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPiBleHRlbmRzIEFkYXB0ZXI8WSwgUSwgRiwgQz4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgbmF0aXZlOiBZLFxuICAgIHByb3RlY3RlZCBjb25maWc6IEh0dHBDb25maWcsXG4gICAgZmxhdm91cjogc3RyaW5nID0gXCJodHRwXCJcbiAgKSB7XG4gICAgc3VwZXIobmF0aXZlLCBmbGF2b3VyKTtcbiAgfVxuXG4gIGFzeW5jIGNvbnRleHQ8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gID4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEY+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQcm9taXNlPEM+IHtcbiAgICByZXR1cm4gKGF3YWl0IHN1cGVyLmNvbnRleHQoXG4gICAgICBvcGVyYXRpb24sXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIH0sXG4gICAgICAgIG92ZXJyaWRlc1xuICAgICAgKSxcbiAgICAgIG1vZGVsXG4gICAgKSkgYXMgdW5rbm93biBhcyBDO1xuICB9XG5cbiAgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbnN0cnVjdG9yPFxuICAgIFJlcG9zaXRvcnk8TSwgUSwgSHR0cEFkYXB0ZXI8WSwgUSwgRiwgQz4+XG4gID4ge1xuICAgIHJldHVybiBSZXN0U2VydmljZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFxuICAgICAgUmVwb3NpdG9yeTxNLCBRLCBIdHRwQWRhcHRlcjxZLCBRLCBGLCBDPj5cbiAgICA+O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVybChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBxdWVyeVBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cbiAgKSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChcbiAgICAgIGAke3RoaXMuY29uZmlnLnByb3RvY29sfTovLyR7dGhpcy5jb25maWcuaG9zdH0vJHt0YWJsZU5hbWV9YFxuICAgICk7XG4gICAgaWYgKHF1ZXJ5UGFyYW1zKVxuICAgICAgT2JqZWN0LmVudHJpZXMocXVlcnlQYXJhbXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygpKVxuICAgICAgKTtcblxuICAgIHJldHVybiBlbmNvZGVVUkkodXJsLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcGFyc2VFcnJvcihlcnI6IEVycm9yKTogQmFzZUVycm9yIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UgfSA9IGVycjtcbiAgICBzd2l0Y2ggKG1lc3NhZ2UpIHtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBlcnIgYXMgQmFzZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5pdGlhbGl6ZSguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGFic3RyYWN0IHJlcXVlc3Q8Vj4oZGV0YWlsczogUSk6IFByb21pc2U8Vj47XG5cbiAgYWJzdHJhY3QgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICBhYnN0cmFjdCByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICBhYnN0cmFjdCB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIGFic3RyYWN0IGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICByYXc8Uj4ocmF3SW5wdXQ6IFEsIHByb2Nlc3M6IGJvb2xlYW4sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPiB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIkFwaSBpcyBub3QgbmF0aXZlbHkgYXZhaWxhYmxlIGZvciBIdHRwQWRhcHRlcnMuIElmIHJlcXVpcmVkLCBwbGVhc2UgZXh0ZW5kcyB0aGlzIGNsYXNzXCJcbiAgICApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPiB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIkFwaSBpcyBub3QgbmF0aXZlbHkgYXZhaWxhYmxlIGZvciBIdHRwQWRhcHRlcnMuIElmIHJlcXVpcmVkLCBwbGVhc2UgZXh0ZW5kcyB0aGlzIGNsYXNzXCJcbiAgICApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbik6IFEge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJBcGkgaXMgbm90IG5hdGl2ZWx5IGF2YWlsYWJsZSBmb3IgSHR0cEFkYXB0ZXJzLiBJZiByZXF1aXJlZCwgcGxlYXNlIGV4dGVuZHMgdGhpcyBjbGFzc1wiXG4gICAgKTtcbiAgfVxuICBnZXQgU3RhdGVtZW50KCk6IFN0YXRlbWVudDxRPiB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIkFwaSBpcyBub3QgbmF0aXZlbHkgYXZhaWxhYmxlIGZvciBIdHRwQWRhcHRlcnMuIElmIHJlcXVpcmVkLCBwbGVhc2UgZXh0ZW5kcyB0aGlzIGNsYXNzXCJcbiAgICApO1xuICB9XG4gIGdldCBDbGF1c2VzKCk6IENsYXVzZUZhY3Rvcnk8WSwgUSwgdHlwZW9mIHRoaXM+IHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIFwiQXBpIGlzIG5vdCBuYXRpdmVseSBhdmFpbGFibGUgZm9yIEh0dHBBZGFwdGVycy4gSWYgcmVxdWlyZWQsIHBsZWFzZSBleHRlbmRzIHRoaXMgY2xhc3NcIlxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEh0dHBBZGFwdGVyIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB7IEF4aW9zLCBBeGlvc1JlcXVlc3RDb25maWcgfSBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCB7IEh0dHBDb25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEF4aW9zRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgQXhpb3NIdHRwQWRhcHRlciBleHRlbmRzIEh0dHBBZGFwdGVyPFxuICBBeGlvcyxcbiAgQXhpb3NSZXF1ZXN0Q29uZmlnLFxuICBBeGlvc0ZsYWdzLFxuICBDb250ZXh0PEF4aW9zRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3IobmF0aXZlOiBBeGlvcywgY29uZmlnOiBIdHRwQ29uZmlnLCBmbGF2b3VyOiBzdHJpbmcgPSBcImF4aW9zXCIpIHtcbiAgICBzdXBlcihuYXRpdmUgYXMgYW55LCBjb25maWcsIGZsYXZvdXIpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVxdWVzdDxWPihkZXRhaWxzOiBBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPFY+IHtcbiAgICByZXR1cm4gdGhpcy5uYXRpdmUucmVxdWVzdChkZXRhaWxzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLnVybCh0YWJsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLnBvc3QodXJsLCBtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG4gIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy51cmwodGFibGVOYW1lLCB7IGlkOiBpZCBhcyBzdHJpbmcgfCBudW1iZXIgfSk7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZ2V0KHVybCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKHRhYmxlTmFtZSk7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUucHV0KHVybCwgbW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLnVybCh0YWJsZU5hbWUsIHsgaWQ6IGlkIGFzIHN0cmluZyB8IG51bWJlciB9KTtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5kZWxldGUodXJsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEh0dHBBZGFwdGVyIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHsgQ29udGV4dCwgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXN0UmVwb3NpdG9yeTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBRLFxuICBBIGV4dGVuZHMgSHR0cEFkYXB0ZXI8YW55LCBRLCBGLCBDPixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgUSwgQT4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgY2xhenopO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9hZGFwdGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9heGlvcy9heGlvc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUmVzdFJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Jlc3RTZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1vZHVsZSBzdW1tYXJ5XG4gKiBAZGVzY3JpcHRpb24gTW9kdWxlIGRlc2NyaXB0aW9uXG4gKiBAbW9kdWxlIHRzLXdvcmtzcGFjZVxuICovXG5cbi8qKlxuICogQHN1bW1hcnkgTmFtZXNwYWNlIHN1bW1hcnlcbiAqIEBkZXNjcmlwdGlvbiBOYW1lc3BhY2UgZGVzY3JpcHRpb25cbiAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRzLXdvcmtzcGFjZVxuICovXG5cbi8qKlxuICogQHN1bW1hcnkgc3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQGRlc2NyaXB0aW9uIHRoaXMgaXMgaG93IHlvdSBzaG91bGQgZG9jdW1lbnQgYSBjb25zdGFudFxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6dHMtd29ya3NwYWNlXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkludGVybmFsRXJyb3IiLCJmaW5kUHJpbWFyeUtleSIsIlJlcG9zaXRvcnkiLCJBZGFwdGVyIiwiVW5zdXBwb3J0ZWRFcnJvciJdLCJtYXBwaW5n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
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { Repository, Adapter, UnsupportedError } from '@decaf-ts/core';
|
|
2
|
+
import { InternalError, findPrimaryKey } from '@decaf-ts/db-decorators';
|
|
3
|
+
|
|
4
|
+
class RestService {
|
|
5
|
+
get class() {
|
|
6
|
+
if (!this._class)
|
|
7
|
+
throw new InternalError("No class definition found for this repository");
|
|
8
|
+
return this._class;
|
|
9
|
+
}
|
|
10
|
+
get pk() {
|
|
11
|
+
if (!this._pk)
|
|
12
|
+
this._pk = findPrimaryKey(new this.class()).id;
|
|
13
|
+
return this._pk;
|
|
14
|
+
}
|
|
15
|
+
get adapter() {
|
|
16
|
+
if (!this._adapter)
|
|
17
|
+
throw new InternalError("No adapter found for this repository. did you use the @uses decorator or pass it in the constructor?");
|
|
18
|
+
return this._adapter;
|
|
19
|
+
}
|
|
20
|
+
get tableName() {
|
|
21
|
+
if (!this._tableName)
|
|
22
|
+
this._tableName = Repository.table(this.class);
|
|
23
|
+
return this._tableName;
|
|
24
|
+
}
|
|
25
|
+
constructor(adapter, clazz) {
|
|
26
|
+
this.observers = [];
|
|
27
|
+
this._adapter = adapter;
|
|
28
|
+
if (clazz)
|
|
29
|
+
this._class = clazz;
|
|
30
|
+
}
|
|
31
|
+
async create(model, ...args) {
|
|
32
|
+
// eslint-disable-next-line prefer-const
|
|
33
|
+
let { record, id } = this.adapter.prepare(model, this.pk);
|
|
34
|
+
record = await this.adapter.create(this.tableName, id, record, ...args);
|
|
35
|
+
return this.adapter.revert(record, this.class, this.pk, id);
|
|
36
|
+
}
|
|
37
|
+
async read(id, ...args) {
|
|
38
|
+
const m = await this.adapter.read(this.tableName, id, ...args);
|
|
39
|
+
return this.adapter.revert(m, this.class, this.pk, id);
|
|
40
|
+
}
|
|
41
|
+
async update(model, ...args) {
|
|
42
|
+
// eslint-disable-next-line prefer-const
|
|
43
|
+
let { record, id } = this.adapter.prepare(model, this.pk);
|
|
44
|
+
record = await this.adapter.update(this.tableName, id, record, ...args);
|
|
45
|
+
return this.adapter.revert(record, this.class, this.pk, id);
|
|
46
|
+
}
|
|
47
|
+
async delete(id, ...args) {
|
|
48
|
+
const m = await this.adapter.delete(this.tableName, id, ...args);
|
|
49
|
+
return this.adapter.revert(m, this.class, this.pk, id);
|
|
50
|
+
}
|
|
51
|
+
async createAll(models, ...args) {
|
|
52
|
+
if (!models.length)
|
|
53
|
+
return models;
|
|
54
|
+
const prepared = models.map((m) => this.adapter.prepare(m, this.pk));
|
|
55
|
+
const ids = prepared.map((p) => p.id);
|
|
56
|
+
let records = prepared.map((p) => p.record);
|
|
57
|
+
records = await this.adapter.createAll(this.tableName, ids, records, ...args);
|
|
58
|
+
return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, ids[i]));
|
|
59
|
+
}
|
|
60
|
+
async deleteAll(keys, ...args) {
|
|
61
|
+
const results = await this.adapter.deleteAll(this.tableName, keys, ...args);
|
|
62
|
+
return results.map((r, i) => this.adapter.revert(r, this.class, this.pk, keys[i]));
|
|
63
|
+
}
|
|
64
|
+
async readAll(keys, ...args) {
|
|
65
|
+
const records = await this.adapter.readAll(this.tableName, keys, ...args);
|
|
66
|
+
return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, keys[i]));
|
|
67
|
+
}
|
|
68
|
+
async updateAll(models, ...args) {
|
|
69
|
+
const records = models.map((m) => this.adapter.prepare(m, this.pk));
|
|
70
|
+
const updated = await this.adapter.updateAll(this.tableName, records.map((r) => r.id), records.map((r) => r.record), ...args);
|
|
71
|
+
return updated.map((u, i) => this.adapter.revert(u, this.class, this.pk, records[i].id));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* @summary Registers an {@link Observer}
|
|
75
|
+
* @param {Observer} observer
|
|
76
|
+
*
|
|
77
|
+
* @see {Observable#observe}
|
|
78
|
+
*/
|
|
79
|
+
observe(observer) {
|
|
80
|
+
const index = this.observers.indexOf(observer);
|
|
81
|
+
if (index !== -1)
|
|
82
|
+
throw new InternalError("Observer already registered");
|
|
83
|
+
this.observers.push(observer);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* @summary Unregisters an {@link Observer}
|
|
87
|
+
* @param {Observer} observer
|
|
88
|
+
*
|
|
89
|
+
* @see {Observable#unObserve}
|
|
90
|
+
*/
|
|
91
|
+
unObserve(observer) {
|
|
92
|
+
const index = this.observers.indexOf(observer);
|
|
93
|
+
if (index === -1)
|
|
94
|
+
throw new InternalError("Failed to find Observer");
|
|
95
|
+
this.observers.splice(index, 1);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* @summary calls all registered {@link Observer}s to update themselves
|
|
99
|
+
* @param {any[]} [args] optional arguments to be passed to the {@link Observer#refresh} method
|
|
100
|
+
*/
|
|
101
|
+
async updateObservers(...args) {
|
|
102
|
+
const results = await Promise.allSettled(this.observers.map((o) => o.refresh(...args)));
|
|
103
|
+
results.forEach((result, i) => {
|
|
104
|
+
if (result.status === "rejected")
|
|
105
|
+
console.warn(`Failed to update observable ${this.observers[i]}: ${result.reason}`);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
class HttpAdapter extends Adapter {
|
|
111
|
+
constructor(native, config, flavour = "http") {
|
|
112
|
+
super(native, flavour);
|
|
113
|
+
this.config = config;
|
|
114
|
+
}
|
|
115
|
+
async context(operation, overrides, model) {
|
|
116
|
+
return (await super.context(operation, Object.assign({
|
|
117
|
+
headers: {},
|
|
118
|
+
}, overrides), model));
|
|
119
|
+
}
|
|
120
|
+
repository() {
|
|
121
|
+
return RestService;
|
|
122
|
+
}
|
|
123
|
+
url(tableName, queryParams) {
|
|
124
|
+
const url = new URL(`${this.config.protocol}://${this.config.host}/${tableName}`);
|
|
125
|
+
if (queryParams)
|
|
126
|
+
Object.entries(queryParams).forEach(([key, value]) => url.searchParams.append(key, value.toString()));
|
|
127
|
+
return encodeURI(url.toString());
|
|
128
|
+
}
|
|
129
|
+
parseError(err) {
|
|
130
|
+
const { message } = err;
|
|
131
|
+
switch (message) {
|
|
132
|
+
default:
|
|
133
|
+
return err;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
137
|
+
async initialize(...args) {
|
|
138
|
+
// do nothing
|
|
139
|
+
}
|
|
140
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
141
|
+
raw(rawInput, process, ...args) {
|
|
142
|
+
throw new UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
143
|
+
}
|
|
144
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
145
|
+
Sequence(options) {
|
|
146
|
+
throw new UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
147
|
+
}
|
|
148
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
149
|
+
parseCondition(condition) {
|
|
150
|
+
throw new UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
151
|
+
}
|
|
152
|
+
get Statement() {
|
|
153
|
+
throw new UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
154
|
+
}
|
|
155
|
+
get Clauses() {
|
|
156
|
+
throw new InternalError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
class AxiosHttpAdapter extends HttpAdapter {
|
|
161
|
+
constructor(native, config, flavour = "axios") {
|
|
162
|
+
super(native, config, flavour);
|
|
163
|
+
}
|
|
164
|
+
async request(details) {
|
|
165
|
+
return this.native.request(details);
|
|
166
|
+
}
|
|
167
|
+
async create(tableName, id, model) {
|
|
168
|
+
try {
|
|
169
|
+
const url = this.url(tableName);
|
|
170
|
+
return this.native.post(url, model);
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
throw this.parseError(e);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async read(tableName, id) {
|
|
177
|
+
try {
|
|
178
|
+
const url = this.url(tableName, { id: id });
|
|
179
|
+
return this.native.get(url);
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
throw this.parseError(e);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async update(tableName, id, model) {
|
|
186
|
+
try {
|
|
187
|
+
const url = this.url(tableName);
|
|
188
|
+
return this.native.put(url, model);
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
throw this.parseError(e);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
async delete(tableName, id) {
|
|
195
|
+
try {
|
|
196
|
+
const url = this.url(tableName, { id: id });
|
|
197
|
+
return this.native.delete(url);
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
throw this.parseError(e);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
class RestRepository extends Repository {
|
|
206
|
+
constructor(adapter, clazz) {
|
|
207
|
+
super(adapter, clazz);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* @summary Module summary
|
|
213
|
+
* @description Module description
|
|
214
|
+
* @module ts-workspace
|
|
215
|
+
*/
|
|
216
|
+
/**
|
|
217
|
+
* @summary Namespace summary
|
|
218
|
+
* @description Namespace description
|
|
219
|
+
* @namespace Namespace
|
|
220
|
+
* @memberOf module:ts-workspace
|
|
221
|
+
*/
|
|
222
|
+
/**
|
|
223
|
+
* @summary stores the current package version
|
|
224
|
+
* @description this is how you should document a constant
|
|
225
|
+
* @const VERSION
|
|
226
|
+
* @memberOf module:ts-workspace
|
|
227
|
+
*/
|
|
228
|
+
const VERSION = "0.2.0";
|
|
229
|
+
|
|
230
|
+
export { AxiosHttpAdapter, HttpAdapter, RestRepository, RestService, VERSION };
|
|
231
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWh0dHAuZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL1Jlc3RTZXJ2aWNlLnRzIiwiLi4vc3JjL2FkYXB0ZXIudHMiLCIuLi9zcmMvYXhpb3MvYXhpb3MudHMiLCIuLi9zcmMvUmVzdFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRvcixcbiAgQ29udGV4dCxcbiAgQ3J1ZE9wZXJhdG9yLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgUmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwQWRhcHRlciB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFJlc3RTZXJ2aWNlPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBRLFxuICAgIEEgZXh0ZW5kcyBIdHRwQWRhcHRlcjxhbnksIFEsIEYsIEM+LFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuICA+XG4gIGltcGxlbWVudHMgQ3J1ZE9wZXJhdG9yPE0+LCBCdWxrQ3J1ZE9wZXJhdG9yPE0+LCBPYnNlcnZhYmxlXG57XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsYXNzITogQ29uc3RydWN0b3I8TT47XG4gIHByaXZhdGUgX3BrIToga2V5b2YgTTtcblxuICBnZXQgY2xhc3MoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGFzcylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gY2xhc3MgZGVmaW5pdGlvbiBmb3VuZCBmb3IgdGhpcyByZXBvc2l0b3J5XCIpO1xuICAgIHJldHVybiB0aGlzLl9jbGFzcztcbiAgfVxuXG4gIGdldCBwaygpIHtcbiAgICBpZiAoIXRoaXMuX3BrKSB0aGlzLl9wayA9IGZpbmRQcmltYXJ5S2V5KG5ldyB0aGlzLmNsYXNzKCkpLmlkO1xuICAgIHJldHVybiB0aGlzLl9waztcbiAgfVxuXG4gIHByb3RlY3RlZCBvYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hZGFwdGVyITogQTtcbiAgcHJpdmF0ZSBfdGFibGVOYW1lITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBnZXQgYWRhcHRlcigpOiBBIHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyBhZGFwdGVyIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnkuIGRpZCB5b3UgdXNlIHRoZSBAdXNlcyBkZWNvcmF0b3Igb3IgcGFzcyBpdCBpbiB0aGUgY29uc3RydWN0b3I/XCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICBpZiAoIXRoaXMuX3RhYmxlTmFtZSkgdGhpcy5fdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZSh0aGlzLmNsYXNzKTtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVOYW1lO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcjogQSwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHRoaXMuX2FkYXB0ZXIgPSBhZGFwdGVyO1xuICAgIGlmIChjbGF6eikgdGhpcy5fY2xhc3MgPSBjbGF6ejtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgYXN5bmMgcmVhZChpZDogc3RyaW5nIHwgbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZCh0aGlzLnRhYmxlTmFtZSwgaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcgfCBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGUodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIHJlY29yZHMsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkc1tpXSBhcyBzdHJpbmcgfCBudW1iZXIpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVhZEFsbChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLmlkKSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLnJlY29yZCksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHUsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHUsIHRoaXMuY2xhc3MsIHRoaXMucGssIHJlY29yZHNbaV0uaWQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYW4ge0BsaW5rIE9ic2VydmVyfVxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgKlxuICAgKiBAc2VlIHtPYnNlcnZhYmxlI29ic2VydmV9XG4gICAqL1xuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJPYnNlcnZlciBhbHJlYWR5IHJlZ2lzdGVyZWRcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVW5yZWdpc3RlcnMgYW4ge0BsaW5rIE9ic2VydmVyfVxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgKlxuICAgKiBAc2VlIHtPYnNlcnZhYmxlI3VuT2JzZXJ2ZX1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgT2JzZXJ2ZXJcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBjYWxscyBhbGwgcmVnaXN0ZXJlZCB7QGxpbmsgT2JzZXJ2ZXJ9cyB0byB1cGRhdGUgdGhlbXNlbHZlc1xuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gb3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUge0BsaW5rIE9ic2VydmVyI3JlZnJlc2h9IG1ldGhvZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5yZWZyZXNoKC4uLmFyZ3MpKVxuICAgICk7XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBvYnNlcnZhYmxlICR7dGhpcy5vYnNlcnZlcnNbaV19OiAke3Jlc3VsdC5yZWFzb259YFxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDbGF1c2VGYWN0b3J5LFxuICBDb25kaXRpb24sXG4gIFJlcG9zaXRvcnksXG4gIFNlcXVlbmNlLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG4gIFN0YXRlbWVudCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbnRleHQsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnlGbGFncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBIdHRwQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSBcIi4vUmVzdFNlcnZpY2VcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEh0dHBBZGFwdGVyPFxuICBZLFxuICBRLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4gZXh0ZW5kcyBBZGFwdGVyPFksIFEsIEYsIEM+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG5hdGl2ZTogWSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnOiBIdHRwQ29uZmlnLFxuICAgIGZsYXZvdXI6IHN0cmluZyA9IFwiaHR0cFwiXG4gICkge1xuICAgIHN1cGVyKG5hdGl2ZSwgZmxhdm91cik7XG4gIH1cblxuICBhc3luYyBjb250ZXh0PFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICA+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbiAgKTogUHJvbWlzZTxDPiB7XG4gICAgcmV0dXJuIChhd2FpdCBzdXBlci5jb250ZXh0KFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICB9LFxuICAgICAgICBvdmVycmlkZXNcbiAgICAgICksXG4gICAgICBtb2RlbFxuICAgICkpIGFzIHVua25vd24gYXMgQztcbiAgfVxuXG4gIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPigpOiBDb25zdHJ1Y3RvcjxcbiAgICBSZXBvc2l0b3J5PE0sIFEsIEh0dHBBZGFwdGVyPFksIFEsIEYsIEM+PlxuICA+IHtcbiAgICByZXR1cm4gUmVzdFNlcnZpY2UgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxcbiAgICAgIFJlcG9zaXRvcnk8TSwgUSwgSHR0cEFkYXB0ZXI8WSwgUSwgRiwgQz4+XG4gICAgPjtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cmwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+XG4gICkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5wcm90b2NvbH06Ly8ke3RoaXMuY29uZmlnLmhvc3R9LyR7dGFibGVOYW1lfWBcbiAgICApO1xuICAgIGlmIChxdWVyeVBhcmFtcylcbiAgICAgIE9iamVjdC5lbnRyaWVzKHF1ZXJ5UGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoKSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZW5jb2RlVVJJKHVybC50b1N0cmluZygpKTtcbiAgfVxuXG4gIHBhcnNlRXJyb3IoZXJyOiBFcnJvcik6IEJhc2VFcnJvciB7XG4gICAgY29uc3QgeyBtZXNzYWdlIH0gPSBlcnI7XG4gICAgc3dpdGNoIChtZXNzYWdlKSB7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZXJyIGFzIEJhc2VFcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluaXRpYWxpemUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBhYnN0cmFjdCByZXF1ZXN0PFY+KGRldGFpbHM6IFEpOiBQcm9taXNlPFY+O1xuXG4gIGFic3RyYWN0IGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgYWJzdHJhY3QgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgYWJzdHJhY3QgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICBhYnN0cmFjdCBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmF3PFI+KHJhd0lucHV0OiBRLCBwcm9jZXNzOiBib29sZWFuLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj4ge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJBcGkgaXMgbm90IG5hdGl2ZWx5IGF2YWlsYWJsZSBmb3IgSHR0cEFkYXB0ZXJzLiBJZiByZXF1aXJlZCwgcGxlYXNlIGV4dGVuZHMgdGhpcyBjbGFzc1wiXG4gICAgKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJBcGkgaXMgbm90IG5hdGl2ZWx5IGF2YWlsYWJsZSBmb3IgSHR0cEFkYXB0ZXJzLiBJZiByZXF1aXJlZCwgcGxlYXNlIGV4dGVuZHMgdGhpcyBjbGFzc1wiXG4gICAgKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24pOiBRIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiQXBpIGlzIG5vdCBuYXRpdmVseSBhdmFpbGFibGUgZm9yIEh0dHBBZGFwdGVycy4gSWYgcmVxdWlyZWQsIHBsZWFzZSBleHRlbmRzIHRoaXMgY2xhc3NcIlxuICAgICk7XG4gIH1cbiAgZ2V0IFN0YXRlbWVudCgpOiBTdGF0ZW1lbnQ8UT4ge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJBcGkgaXMgbm90IG5hdGl2ZWx5IGF2YWlsYWJsZSBmb3IgSHR0cEFkYXB0ZXJzLiBJZiByZXF1aXJlZCwgcGxlYXNlIGV4dGVuZHMgdGhpcyBjbGFzc1wiXG4gICAgKTtcbiAgfVxuICBnZXQgQ2xhdXNlcygpOiBDbGF1c2VGYWN0b3J5PFksIFEsIHR5cGVvZiB0aGlzPiB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBcIkFwaSBpcyBub3QgbmF0aXZlbHkgYXZhaWxhYmxlIGZvciBIdHRwQWRhcHRlcnMuIElmIHJlcXVpcmVkLCBwbGVhc2UgZXh0ZW5kcyB0aGlzIGNsYXNzXCJcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBIdHRwQWRhcHRlciB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5pbXBvcnQgeyBBeGlvcywgQXhpb3NSZXF1ZXN0Q29uZmlnIH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBIdHRwQ29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBBeGlvc0ZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIEF4aW9zSHR0cEFkYXB0ZXIgZXh0ZW5kcyBIdHRwQWRhcHRlcjxcbiAgQXhpb3MsXG4gIEF4aW9zUmVxdWVzdENvbmZpZyxcbiAgQXhpb3NGbGFncyxcbiAgQ29udGV4dDxBeGlvc0ZsYWdzPlxuPiB7XG4gIGNvbnN0cnVjdG9yKG5hdGl2ZTogQXhpb3MsIGNvbmZpZzogSHR0cENvbmZpZywgZmxhdm91cjogc3RyaW5nID0gXCJheGlvc1wiKSB7XG4gICAgc3VwZXIobmF0aXZlIGFzIGFueSwgY29uZmlnLCBmbGF2b3VyKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHJlcXVlc3Q8Vj4oZGV0YWlsczogQXhpb3NSZXF1ZXN0Q29uZmlnKTogUHJvbWlzZTxWPiB7XG4gICAgcmV0dXJuIHRoaXMubmF0aXZlLnJlcXVlc3QoZGV0YWlscyk7XG4gIH1cblxuICBhc3luYyBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy51cmwodGFibGVOYW1lKTtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5wb3N0KHVybCwgbW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKHRhYmxlTmFtZSwgeyBpZDogaWQgYXMgc3RyaW5nIHwgbnVtYmVyIH0pO1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmdldCh1cmwpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLnVybCh0YWJsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLnB1dCh1cmwsIG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy51cmwodGFibGVOYW1lLCB7IGlkOiBpZCBhcyBzdHJpbmcgfCBudW1iZXIgfSk7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZGVsZXRlKHVybCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIdHRwQWRhcHRlciB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB7IENvbnRleHQsIFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzdFJlcG9zaXRvcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUSxcbiAgQSBleHRlbmRzIEh0dHBBZGFwdGVyPGFueSwgUSwgRiwgQz4sXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIFEsIEE+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogQSwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHN1cGVyKGFkYXB0ZXIsIGNsYXp6KTtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vYWRhcHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXhpb3MvYXhpb3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Jlc3RSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9SZXN0U2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNb2R1bGUgc3VtbWFyeVxuICogQGRlc2NyaXB0aW9uIE1vZHVsZSBkZXNjcmlwdGlvblxuICogQG1vZHVsZSB0cy13b3Jrc3BhY2VcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IE5hbWVzcGFjZSBzdW1tYXJ5XG4gKiBAZGVzY3JpcHRpb24gTmFtZXNwYWNlIGRlc2NyaXB0aW9uXG4gKiBAbmFtZXNwYWNlIE5hbWVzcGFjZVxuICogQG1lbWJlck9mIG1vZHVsZTp0cy13b3Jrc3BhY2VcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IHN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBkZXNjcmlwdGlvbiB0aGlzIGlzIGhvdyB5b3Ugc2hvdWxkIGRvY3VtZW50IGEgY29uc3RhbnRcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRzLXdvcmtzcGFjZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7TUFZYSxXQUFXLENBQUE7QUFZdEIsSUFBQSxJQUFJLEtBQUssR0FBQTtRQUNQLElBQUksQ0FBQyxJQUFJLENB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TSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztBQUMzRSxRQUFBLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JEOztBQUdILElBQUEsTUFBTSxPQUFPLENBQUMsSUFBeUIsRUFBRSxHQUFHLElBQVcsRUFBQTtBQUNyRCxRQUFBLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDekUsUUFBQSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRDs7QUFHSCxJQUFBLE1BQU0sU0FBUyxDQUFDLE1BQVcsRUFBRSxHQUFHLElBQVcsRUFBQTtRQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDMUMsSUFBSSxDQUFDLFNBQVMsRUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMs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
|
package/lib/RestRepository.cjs
CHANGED
|
@@ -8,5 +8,4 @@ class RestRepository extends core_1.Repository {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
exports.RestRepository = RestRepository;
|
|
11
|
-
|
|
12
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9SZXN0UmVwb3NpdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBcUQ7QUFHckQsTUFBYSxjQUlYLFNBQVEsaUJBQW1CO0lBQzNCLFlBQVksT0FBVSxFQUFFLEtBQXNCO1FBQzVDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBUkQsd0NBUUMiLCJmaWxlIjoiUmVzdFJlcG9zaXRvcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZGFwdGVyLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXN0UmVwb3NpdG9yeTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBRLFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIFE+LFxuPiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgUSwgQT4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgY2xhenopO1xuICB9XG59XG4iXX0=
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzdFJlcG9zaXRvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUmVzdFJlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQTRDO0FBSzVDLE1BQWEsY0FNWCxTQUFRLGlCQUFtQjtJQUMzQixZQUFZLE9BQVUsRUFBRSxLQUFzQjtRQUM1QyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDRjtBQVZELHdDQVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSHR0cEFkYXB0ZXIgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc3RSZXBvc2l0b3J5PFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFEsXG4gIEEgZXh0ZW5kcyBIdHRwQWRhcHRlcjxhbnksIFEsIEYsIEM+LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+IGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBRLCBBPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBjbGF6eik7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Repository } from "@decaf-ts/core";
|
|
2
|
+
import { Constructor, Model } from "@decaf-ts/decorator-validation";
|
|
3
|
+
import { HttpAdapter } from "./adapter";
|
|
4
|
+
import { Context, RepositoryFlags } from "@decaf-ts/db-decorators";
|
|
5
|
+
export declare class RestRepository<M extends Model, Q, A extends HttpAdapter<any, Q, F, C>, F extends RepositoryFlags, C extends Context<F> = Context<F>> extends Repository<M, Q, A> {
|
|
6
|
+
constructor(adapter: A, clazz?: Constructor<M>);
|
|
7
|
+
}
|