ngx-airbrush
Version:
Angular client for jsonapi/Graphiti backends
325 lines • 23 kB
JavaScript
/**
* @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