UNPKG

ngx-airbrush

Version:

Angular client for jsonapi/Graphiti backends

325 lines 23 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { map, catchError } from 'rxjs/operators'; import { throwError } from 'rxjs'; import { ServiceMetadata, ModelMetadata } from '../lib/decorators/symboles'; import { ResourceBase } from './resource-base.model'; import { Scope } from './scope'; /** * @record */ export function Response() { } /** * @abstract * @template T */ export class JsonapiBaseService { /** * @param {?} http */ constructor(http) { this.http = http; } /** * @param {?=} options * @return {?} */ all(options) { /** @type {?} */ const url = this.buildUrl(); options = options || {}; /** @type {?} */ const params = options.params; /** @type {?} */ const request = this.http.get(url, { params, observe: 'response' }).pipe(map((/** * @param {?} res * @return {?} */ (res) => this.successful(res)))); if (options.metadata) { return request.pipe(map((/** * @param {?} res * @return {?} */ (res) => (({ data: this.extract(res), meta: this.extractMeta(res) })))), catchError((/** * @param {?} res * @return {?} */ (res) => this.handleError(res)))); } // else return request.pipe(map((/** * @param {?} res * @return {?} */ (res) => this.extract(res))), catchError((/** * @param {?} res * @return {?} */ (res) => this.handleError(res)))); } /** * @param {?} id * @param {?=} params * @return {?} */ find(id, params) { /** @type {?} */ const url = this.buildUrl(id); return this.http.get(url, { params, observe: 'response' }).pipe(map((/** * @param {?} res * @return {?} */ (res) => this.successful(res))), map((/** * @param {?} res * @return {?} */ (res) => this.extract(res))), catchError((/** * @param {?} res * @return {?} */ (res) => this.handleError(res)))); } /** * @param {?} model * @return {?} */ save(model) { /** @type {?} */ const url = this.buildUrl(model.id); /** @type {?} */ const body = model.toJsonapi(); /** @type {?} */ let httpCall; if (model.id) { httpCall = (/** @type {?} */ (this.http.put(url, body, { observe: 'response' }))); } else { httpCall = (/** @type {?} */ (this.http.post(url, body, { observe: 'response' }))); } return httpCall.pipe(map((/** * @param {?} res * @return {?} */ (res) => this.successful(res))), map((/** * @param {?} res * @return {?} */ (res) => this.extract(res))), catchError((/** * @param {?} res * @return {?} */ (res) => this.handleError(res)))); } /** * @param {?} id * @return {?} */ delete(id) { /** @type {?} */ const url = this.buildUrl(id); return this.http.delete(url, { observe: 'response' }).pipe(map((/** * @param {?} res * @return {?} */ (res) => this.successful(res))), catchError((/** * @param {?} res * @return {?} */ (res) => this.handleError(res)))); } /** * @protected * @param {?} response * @return {?} */ extractMeta(response) { /** @type {?} */ const body = response.body; /** @type {?} */ const meta = body.meta; return meta; } /** * @protected * @param {?} response * @return {?} */ extract(response) { /** @type {?} */ const body = response.body; /** @type {?} */ const records = body.data; if (Array.isArray(records)) { /** @type {?} */ const models = []; records.forEach((/** * @param {?} data * @return {?} */ (data) => { /** @type {?} */ const model = this.deserializeModel({ data, included: body.included }); models.push(model); })); return models; } else { /** @type {?} */ const model = this.deserializeModel(body); return model; } } /** * @protected * @param {?} data * @return {?} */ deserializeModel(data) { /** @type {?} */ const modelType = this.getModelType(); return ResourceBase.getModel(modelType, data); } /** * @protected * @param {?} error * @return {?} */ handleError(error) { return throwError(error); } /** * @protected * @param {?=} id * @return {?} */ buildUrl(id) { /** @type {?} */ const serviceConfig = this.getServiceConfig(); /** @type {?} */ const modelConfig = this.getModelConfig(); /** @type {?} */ const baseUrl = this.baseUrl; /** @type {?} */ const apiVersion = serviceConfig.apiVersion; /** @type {?} */ const endpointUrl = serviceConfig.endpointUrl || modelConfig.type; /** @type {?} */ const url = [baseUrl, apiVersion, endpointUrl, id].filter((/** * @param {?} itm * @return {?} */ itm => !!itm)).join('/'); return url; } /** * @private * @return {?} */ getModelType() { /** @type {?} */ const serviceConfig = this.getServiceConfig(); return serviceConfig.model(); } /** * @return {?} */ getModelConfig() { return Reflect.getMetadata(ModelMetadata, this.getModelType()); } /** * @return {?} */ getServiceConfig() { return Reflect.getMetadata(ServiceMetadata, this.className); } /** * @protected * @param {?} response * @return {?} */ successful(response) { /** @type {?} */ const code = response.status; if (code < 400) { return response; } throw (response); } /** * @param {?} pageNumber * @return {?} */ page(pageNumber) { /** @type {?} */ const scope = new Scope(this); return scope.page(pageNumber); } /** * @param {?} size * @return {?} */ per(size) { /** @type {?} */ const scope = new Scope(this); return scope.per(size); } /** * @param {?} clause * @return {?} */ where(clause) { /** @type {?} */ const scope = new Scope(this); return scope.where(clause); } /** * @param {?} clause * @return {?} */ stats(clause) { /** @type {?} */ const scope = new Scope(this); return scope.stats(clause); } /** * @param {?} clause * @return {?} */ order(clause) { /** @type {?} */ const scope = new Scope(this); return scope.order(clause); } /** * @param {?} clause * @return {?} */ select(clause) { /** @type {?} */ const scope = new Scope(this); return scope.select(clause); } /** * @param {?} clause * @return {?} */ includes(clause) { /** @type {?} */ const scope = new Scope(this); return scope.includes(clause); } } if (false) { /** @type {?} */ JsonapiBaseService.prototype.baseUrl; /** @type {?} */ JsonapiBaseService.prototype.className; /** * @type {?} * @protected */ JsonapiBaseService.prototype.http; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmFwaS1iYXNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYWlyYnJ1c2gvIiwic291cmNlcyI6WyJsaWIvanNvbmFwaS1iYXNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUc5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7O0FBSWhDLDhCQUFrRTs7Ozs7QUFFbEUsTUFBTSxPQUFnQixrQkFBa0I7Ozs7SUFLdEMsWUFBc0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUFHLENBQUM7Ozs7O0lBS25DLEdBQUcsQ0FBQyxPQUFxRDs7Y0FDeEQsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDM0IsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7O2NBRWxCLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTTs7Y0FDdkIsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RFLEdBQUc7Ozs7UUFBQyxDQUFDLEdBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBQyxDQUM3QztRQUVELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUNwQixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQ2pCLEdBQUc7Ozs7WUFBQyxDQUFDLEdBQWEsRUFBRSxFQUFFLENB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cG9uc2UsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgdGhyb3dFcnJvciwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTZXJ2aWNlRGVjb3JhdG9yT3B0aW9ucywgTW9kZWxEZWNvcmF0b3JPcHRpb25zIH0gZnJvbSAnLi9kZWNvcmF0b3JzL29wdGlvbi5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFNlcnZpY2VNZXRhZGF0YSwgTW9kZWxNZXRhZGF0YSB9IGZyb20gJy4uL2xpYi9kZWNvcmF0b3JzL3N5bWJvbGVzJztcbmltcG9ydCB7IFJlc291cmNlQmFzZSB9IGZyb20gJy4vcmVzb3VyY2UtYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBKc29uYXBpUmVzcG9uc2UgfSBmcm9tICcuL2ludGVyZmFjZXMvanNvbmFwaS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2NvcGUgfSBmcm9tICcuL3Njb3BlJztcbmltcG9ydCB7IFNvcnRTY29wZSwgRmllbGRTY29wZSwgRmlsdGVyU2NvcGUsIFN0YXRzU2NvcGUsIEluY2x1ZGVTY29wZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9xdWVyeS5pbnRlcmZhY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2UgZXh0ZW5kcyBIdHRwUmVzcG9uc2U8SnNvbmFwaVJlc3BvbnNlPiB7fVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSnNvbmFwaUJhc2VTZXJ2aWNlPFQgZXh0ZW5kcyBSZXNvdXJjZUJhc2U+IHtcbiAgYWJzdHJhY3QgYmFzZVVybDogc3RyaW5nO1xuICBhYnN0cmFjdCBjbGFzc05hbWU6IGFueTtcblxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50KSB7fVxuXG4gIHB1YmxpYyBhbGwob3B0aW9ucz86IHsgcGFyYW1zPzogSHR0cFBhcmFtcyB9KTogT2JzZXJ2YWJsZTxUW10+O1xuICBwdWJsaWMgYWxsKG9wdGlvbnM6IHsgcGFyYW1zPzogSHR0cFBhcmFtcywgbWV0YWRhdGE6IHRydWUgfSk6IE9ic2VydmFibGU8eyBkYXRhOiBUW10sIG1ldGE6IGFueSB9PjtcblxuICBwdWJsaWMgYWxsKG9wdGlvbnM/OiB7IHBhcmFtcz86IEh0dHBQYXJhbXMsIG1ldGFkYXRhPzogYm9vbGVhbiB9KTogT2JzZXJ2YWJsZTxUW10+IHwgT2JzZXJ2YWJsZTx7IGRhdGE6IFRbXSwgbWV0YTogYW55IH0+IHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmJ1aWxkVXJsKCk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBjb25zdCBwYXJhbXMgPSBvcHRpb25zLnBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5odHRwLmdldCh1cmwsIHsgcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pLnBpcGUoXG4gICAgICBtYXAoKHJlczogUmVzcG9uc2UpID0+IHRoaXMuc3VjY2Vzc2Z1bChyZXMpKSxcbiAgICApO1xuXG4gICAgaWYgKG9wdGlvbnMubWV0YWRhdGEpIHtcbiAgICAgIHJldHVybiByZXF1ZXN0LnBpcGUoXG4gICAgICAgIG1hcCgocmVzOiBSZXNwb25zZSkgPT4gKCh7IGRhdGE6IHRoaXMuZXh0cmFjdChyZXMpLCBtZXRhOiB0aGlzLmV4dHJhY3RNZXRhKHJlcykgfSkpKSxcbiAgICAgICAgY2F0Y2hFcnJvcigocmVzOiBhbnkpID0+IHRoaXMuaGFuZGxlRXJyb3IocmVzKSlcbiAgICAgICk7XG4gICAgfSAvLyBlbHNlXG4gICAgcmV0dXJuIHJlcXVlc3QucGlwZShcbiAgICAgIG1hcCgocmVzOiBSZXNwb25zZSkgPT4gdGhpcy5leHRyYWN0KHJlcykpLFxuICAgICAgY2F0Y2hFcnJvcigocmVzOiBhbnkpID0+IHRoaXMuaGFuZGxlRXJyb3IocmVzKSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGZpbmQoaWQ6IHN0cmluZywgcGFyYW1zPzogSHR0cFBhcmFtcyk6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuYnVpbGRVcmwoaWQpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IHBhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS5waXBlKFxuICAgICAgbWFwKChyZXM6IFJlc3BvbnNlKSA9PiB0aGlzLnN1Y2Nlc3NmdWwocmVzKSksXG4gICAgICBtYXAoKHJlczogUmVzcG9uc2UpID0+IHRoaXMuZXh0cmFjdChyZXMpKSxcbiAgICAgIGNhdGNoRXJyb3IoKHJlczogYW55KSA9PiB0aGlzLmhhbmRsZUVycm9yKHJlcykpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlKG1vZGVsOiBUKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5idWlsZFVybChtb2RlbC5pZCk7XG5cbiAgICBjb25zdCBib2R5ID0gbW9kZWwudG9Kc29uYXBpKCk7XG5cbiAgICBsZXQgaHR0cENhbGw6IE9ic2VydmFibGU8UmVzcG9uc2U+O1xuICAgIGlmIChtb2RlbC5pZCkge1xuICAgICAgaHR0cENhbGwgPSB0aGlzLmh0dHAucHV0PG9iamVjdD4odXJsLCBib2R5LCB7IG9ic2VydmU6ICdyZXNwb25zZScgfSkgYXMgT2JzZXJ2YWJsZTxSZXNwb25zZT47XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0dHBDYWxsID0gdGhpcy5odHRwLnBvc3Q8b2JqZWN0Pih1cmwsIGJvZHksIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KSBhcyBPYnNlcnZhYmxlPFJlc3BvbnNlPjtcbiAgICB9XG5cbiAgICByZXR1cm4gaHR0cENhbGwucGlwZShcbiAgICAgIG1hcCgocmVzOiBSZXNwb25zZSkgPT4gdGhpcy5zdWNjZXNzZnVsKHJlcykpLFxuICAgICAgbWFwKChyZXM6IFJlc3BvbnNlKSA9PiB0aGlzLmV4dHJhY3QocmVzKSksXG4gICAgICBjYXRjaEVycm9yKChyZXM6IGFueSkgPT4gdGhpcy5oYW5kbGVFcnJvcihyZXMpKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuYnVpbGRVcmwoaWQpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUodXJsLCB7IG9ic2VydmU6ICdyZXNwb25zZScgfSkucGlwZShcbiAgICAgIG1hcCgocmVzOiBSZXNwb25zZSkgPT4gdGhpcy5zdWNjZXNzZnVsKHJlcykpLFxuICAgICAgY2F0Y2hFcnJvcigocmVzOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihyZXMpKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXh0cmFjdE1ldGEocmVzcG9uc2U6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmJvZHk7XG4gICAgY29uc3QgbWV0YSA9IGJvZHkubWV0YTtcbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBleHRyYWN0KHJlc3BvbnNlOiBSZXNwb25zZSk6IFQgfCBUW10ge1xuICAgIGNvbnN0IGJvZHkgPSByZXNwb25zZS5ib2R5O1xuICAgIGNvbnN0IHJlY29yZHMgPSBib2R5LmRhdGE7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWNvcmRzKSkge1xuICAgICAgY29uc3QgbW9kZWxzOiBUW10gPSBbXTtcbiAgICAgIHJlY29yZHMuZm9yRWFjaCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5kZXNlcmlhbGl6ZU1vZGVsKHsgZGF0YSwgaW5jbHVkZWQ6IGJvZHkuaW5jbHVkZWQgfSk7XG4gICAgICAgIG1vZGVscy5wdXNoKG1vZGVsKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1vZGVscztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLmRlc2VyaWFsaXplTW9kZWwoYm9keSk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlc2VyaWFsaXplTW9kZWwoZGF0YTogYW55KTogVCB7XG4gICAgY29uc3QgbW9kZWxUeXBlID0gdGhpcy5nZXRNb2RlbFR5cGUoKTtcbiAgICByZXR1cm4gUmVzb3VyY2VCYXNlLmdldE1vZGVsPFQ+KG1vZGVsVHlwZSwgZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkVXJsKGlkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZXJ2aWNlQ29uZmlnID0gdGhpcy5nZXRTZXJ2aWNlQ29uZmlnKCk7XG4gICAgY29uc3QgbW9kZWxDb25maWcgPSB0aGlzLmdldE1vZGVsQ29uZmlnKCk7XG5cbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5iYXNlVXJsO1xuICAgIGNvbnN0IGFwaVZlcnNpb24gPSBzZXJ2aWNlQ29uZmlnLmFwaVZlcnNpb247XG4gICAgY29uc3QgZW5kcG9pbnRVcmw6IHN0cmluZyA9IHNlcnZpY2VDb25maWcuZW5kcG9pbnRVcmwgfHwgbW9kZWxDb25maWcudHlwZTtcblxuICAgIGNvbnN0IHVybDogc3RyaW5nID0gW2Jhc2VVcmwsIGFwaVZlcnNpb24sIGVuZHBvaW50VXJsLCBpZF0uZmlsdGVyKGl0bSA9PiAhIWl0bSkuam9pbignLycpO1xuXG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TW9kZWxUeXBlKCkge1xuICAgIGNvbnN0IHNlcnZpY2VDb25maWcgPSB0aGlzLmdldFNlcnZpY2VDb25maWcoKTtcbiAgICByZXR1cm4gc2VydmljZUNvbmZpZy5tb2RlbCgpO1xuICB9XG5cbiAgcHVibGljIGdldE1vZGVsQ29uZmlnKCk6IE1vZGVsRGVjb3JhdG9yT3B0aW9ucyB7XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0TWV0YWRhdGEoTW9kZWxNZXRhZGF0YSwgdGhpcy5nZXRNb2RlbFR5cGUoKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VydmljZUNvbmZpZygpOiBTZXJ2aWNlRGVjb3JhdG9yT3B0aW9ucyB7XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0TWV0YWRhdGEoU2VydmljZU1ldGFkYXRhLCB0aGlzLmNsYXNzTmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3VjY2Vzc2Z1bChyZXNwb25zZTogUmVzcG9uc2UpOiBSZXNwb25zZSB7XG4gICAgY29uc3QgY29kZSA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICBpZiAoIGNvZGUgPCA0MDAgKSB7IHJldHVybiByZXNwb25zZTsgfVxuICAgIHRocm93KHJlc3BvbnNlKTtcbiAgfVxuXG4gIHB1YmxpYyBwYWdlKHBhZ2VOdW1iZXI6IG51bWJlcik6IFNjb3BlPFQ+IHtcbiAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZSh0aGlzKTtcbiAgICByZXR1cm4gc2NvcGUucGFnZShwYWdlTnVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBwZXIoc2l6ZTogbnVtYmVyKTogU2NvcGU8VD4ge1xuICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKHRoaXMpO1xuICAgIHJldHVybiBzY29wZS5wZXIoc2l6ZSk7XG4gIH1cblxuICBwdWJsaWMgd2hlcmUoY2xhdXNlOiBGaWx0ZXJTY29wZSk6IFNjb3BlPFQ+IHtcbiAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZSh0aGlzKTtcbiAgICByZXR1cm4gc2NvcGUud2hlcmUoY2xhdXNlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0cyhjbGF1c2U6IFN0YXRzU2NvcGUpOiBTY29wZTxUPiB7XG4gICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUodGhpcyk7XG4gICAgcmV0dXJuIHNjb3BlLnN0YXRzKGNsYXVzZSk7XG4gIH1cblxuICBwdWJsaWMgb3JkZXIoY2xhdXNlOiBTb3J0U2NvcGUgfCBzdHJpbmcpOiBTY29wZTxUPiB7XG4gICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUodGhpcyk7XG4gICAgcmV0dXJuIHNjb3BlLm9yZGVyKGNsYXVzZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0KGNsYXVzZTogRmllbGRTY29wZSB8IHN0cmluZyB8IHN0cmluZ1tdKTogU2NvcGU8VD4ge1xuICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKHRoaXMpO1xuICAgIHJldHVybiBzY29wZS5zZWxlY3QoY2xhdXNlKTtcbiAgfVxuXG4gIHB1YmxpYyBpbmNsdWRlcyhjbGF1c2U6IEluY2x1ZGVTY29wZSk6IFNjb3BlPFQ+IHtcbiAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZSh0aGlzKTtcbiAgICByZXR1cm4gc2NvcGUuaW5jbHVkZXMoY2xhdXNlKTtcbiAgfVxufVxuIl19