UNPKG

apollo-angular

Version:

Use your GraphQL data in your Angular app, with the Apollo Client

182 lines 20.3 kB
import { Injectable, Optional, Inject } from '@angular/core'; import { ApolloClient } from '@apollo/client/core'; import { from } from 'rxjs'; import { QueryRef } from './query-ref'; import { APOLLO_OPTIONS, APOLLO_NAMED_OPTIONS, APOLLO_FLAGS } from './tokens'; import { fromPromise, useMutationLoading, wrapWithZone, fixObservable, pickFlag } from './utils'; import * as i0 from "@angular/core"; export class ApolloBase { constructor(ngZone, flags, _client) { this.ngZone = ngZone; this.flags = flags; this._client = _client; this.useInitialLoading = pickFlag(flags, 'useInitialLoading', false); this.useMutationLoading = pickFlag(flags, 'useMutationLoading', false); } watchQuery(options) { return new QueryRef(this.ensureClient().watchQuery({ ...options, }), this.ngZone, { useInitialLoading: this.useInitialLoading, ...options, }); } query(options) { return fromPromise(() => this.ensureClient().query({ ...options })); } mutate(options) { return useMutationLoading(fromPromise(() => this.ensureClient().mutate({ ...options })), options.useMutationLoading ?? this.useMutationLoading); } subscribe(options, extra) { const obs = from(fixObservable(this.ensureClient().subscribe({ ...options }))); return extra && extra.useZone !== true ? obs : wrapWithZone(obs, this.ngZone); } /** * Get an instance of ApolloClient * @deprecated use `apollo.client` instead */ getClient() { return this.client; } /** * Set a new instance of ApolloClient * Remember to clean up the store before setting a new client. * @deprecated use `apollo.client = client` instead * * @param client ApolloClient instance */ setClient(client) { this.client = client; } /** * Get an instance of ApolloClient */ get client() { return this._client; } /** * Set a new instance of ApolloClient * Remember to clean up the store before setting a new client. * * @param client ApolloClient instance */ set client(client) { if (this._client) { throw new Error('Client has been already defined'); } this._client = client; } ensureClient() { this.checkInstance(); return this._client; } checkInstance() { if (!this._client) { throw new Error('Client has not been defined yet'); } } } export class Apollo extends ApolloBase { constructor(_ngZone, apolloOptions, apolloNamedOptions, flags) { super(_ngZone, flags); this._ngZone = _ngZone; this.map = new Map(); if (apolloOptions) { this.createDefault(apolloOptions); } if (apolloNamedOptions && typeof apolloNamedOptions === 'object') { for (let name in apolloNamedOptions) { if (apolloNamedOptions.hasOwnProperty(name)) { const options = apolloNamedOptions[name]; this.create(options, name); } } } } /** * Create an instance of ApolloClient * @param options Options required to create ApolloClient * @param name client's name */ create(options, name) { if (isDefault(name)) { this.createDefault(options); } else { this.createNamed(name, options); } } /** * Use a default ApolloClient */ default() { return this; } /** * Use a named ApolloClient * @param name client's name */ use(name) { if (isDefault(name)) { return this.default(); } return this.map.get(name); } /** * Create a default ApolloClient, same as `apollo.create(options)` * @param options ApolloClient's options */ createDefault(options) { if (this.getClient()) { throw new Error('Apollo has been already created.'); } return this.setClient(new ApolloClient(options)); } /** * Create a named ApolloClient, same as `apollo.create(options, name)` * @param name client's name * @param options ApolloClient's options */ createNamed(name, options) { if (this.map.has(name)) { throw new Error(`Client ${name} has been already created`); } this.map.set(name, new ApolloBase(this._ngZone, this.flags, new ApolloClient(options))); } /** * Remember to clean up the store before removing a client * @param name client's name */ removeClient(name) { if (isDefault(name)) { this._client = undefined; } else { this.map.delete(name); } } } Apollo.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: Apollo, deps: [{ token: i0.NgZone }, { token: APOLLO_OPTIONS, optional: true }, { token: APOLLO_NAMED_OPTIONS, optional: true }, { token: APOLLO_FLAGS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); Apollo.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: Apollo }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: Apollo, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APOLLO_OPTIONS] }] }, { type: undefined, decorators: [{ type: Inject, args: [APOLLO_NAMED_OPTIONS] }, { type: Optional }] }, { type: undefined, decorators: [{ type: Inject, args: [APOLLO_FLAGS] }, { type: Optional }] }]; } }); function isDefault(name) { return !name || name === 'default'; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBvbGxvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fwb2xsby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFVckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBYyxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVV2QyxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUVqRyxNQUFNLE9BQU8sVUFBVTtJQUlyQixZQUFzQixNQUFjLEVBQVksS0FBYSxFQUFZLE9BQW1DO1FBQXRGLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBWSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVksWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUFDMUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVNLFVBQVUsQ0FDZixPQUE2QztRQUU3QyxPQUFPLElBQUksUUFBUSxDQUNqQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFvQjtZQUNoRCxHQUFHLE9BQU87U0FDWCxDQUF1QyxFQUN4QyxJQUFJLENBQUMsTUFBTSxFQUNYO1lBQ0UsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlC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QUdHO0lBQ0ksWUFBWSxDQUFDLElBQWE7UUFDL0IsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7U0FDMUI7YUFBTTtZQUNMLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQzs7bUdBNUZVLE1BQU0sd0NBTVAsY0FBYyw2QkFFZCxvQkFBb0IsNkJBQ3BCLFlBQVk7dUdBVFgsTUFBTTsyRkFBTixNQUFNO2tCQURsQixVQUFVOzswQkFNTixRQUFROzswQkFDUixNQUFNOzJCQUFDLGNBQWM7OzBCQUVyQixNQUFNOzJCQUFDLG9CQUFvQjs7MEJBQUcsUUFBUTs7MEJBQ3RDLE1BQU07MkJBQUMsWUFBWTs7MEJBQUcsUUFBUTs7QUFzRm5DLFNBQVMsU0FBUyxDQUFDLElBQWE7SUFDOUIsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCwgSW5qZWN0LCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtcbiAgUXVlcnlPcHRpb25zLFxuICBBcG9sbG9RdWVyeVJlc3VsdCxcbiAgU3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgQXBvbGxvQ2xpZW50T3B0aW9ucyxcbiAgT2JzZXJ2YWJsZVF1ZXJ5LFxuICBGZXRjaFJlc3VsdCxcbiAgT3BlcmF0aW9uVmFyaWFibGVzLFxufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7IEFwb2xsb0NsaWVudCB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBRdWVyeVJlZiB9IGZyb20gJy4vcXVlcnktcmVmJztcbmltcG9ydCB0eXBlIHtcbiAgV2F0Y2hRdWVyeU9wdGlvbnMsXG4gIEV4dHJhU3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgRW1wdHlPYmplY3QsXG4gIE5hbWVkT3B0aW9ucyxcbiAgRmxhZ3MsXG4gIE11dGF0aW9uUmVzdWx0LFxuICBNdXRhdGlvbk9wdGlvbnMsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQVBPTExPX09QVElPTlMsIEFQT0xMT19OQU1FRF9PUFRJT05TLCBBUE9MTE9fRkxBR1MgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdXNlTXV0YXRpb25Mb2FkaW5nLCB3cmFwV2l0aFpvbmUsIGZpeE9ic2VydmFibGUsIHBpY2tGbGFnIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBBcG9sbG9CYXNlPFRDYWNoZVNoYXBlID0gYW55PiB7XG4gIHByaXZhdGUgdXNlSW5pdGlhbExvYWRpbmc6IGJvb2xlYW47XG4gIHByaXZhdGUgdXNlTXV0YXRpb25Mb2FkaW5nOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBuZ1pvbmU6IE5nWm9uZSwgcHJvdGVjdGVkIGZsYWdzPzogRmxhZ3MsIHByb3RlY3RlZCBfY2xpZW50PzogQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPikge1xuICAgIHRoaXMudXNlSW5pdGlhbExvYWRpbmcgPSBwaWNrRmxhZyhmbGFncywgJ3VzZUluaXRpYWxMb2FkaW5nJywgZmFsc2UpO1xuICAgIHRoaXMudXNlTXV0YXRpb25Mb2FkaW5nID0gcGlja0ZsYWcoZmxhZ3MsICd1c2VNdXRhdGlvbkxvYWRpbmcnLCBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgd2F0Y2hRdWVyeTxURGF0YSwgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyA9IEVtcHR5T2JqZWN0PihcbiAgICBvcHRpb25zOiBXYXRjaFF1ZXJ5T3B0aW9uczxUVmFyaWFibGVzLCBURGF0YT5cbiAgKTogUXVlcnlSZWY8VERhdGEsIFRWYXJpYWJsZXM+IHtcbiAgICByZXR1cm4gbmV3IFF1ZXJ5UmVmPFREYXRhLCBUVmFyaWFibGVzPihcbiAgICAgIHRoaXMuZW5zdXJlQ2xpZW50KCkud2F0Y2hRdWVyeTxURGF0YSwgVFZhcmlhYmxlcz4oe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSkgYXMgT2JzZXJ2YWJsZVF1ZXJ5PFREYXRhLCBUVmFyaWFibGVzPixcbiAgICAgIHRoaXMubmdab25lLFxuICAgICAge1xuICAgICAgICB1c2VJbml0aWFsTG9hZGluZzogdGhpcy51c2VJbml0aWFsTG9hZGluZyxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5PFQsIFYgPSBFbXB0eU9iamVjdD4ob3B0aW9uczogUXVlcnlPcHRpb25zPFYsIFQ+KTogT2JzZXJ2YWJsZTxBcG9sbG9RdWVyeVJlc3VsdDxUPj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZTxBcG9sbG9RdWVyeVJlc3VsdDxUPj4oKCkgPT4gdGhpcy5lbnN1cmVDbGllbnQoKS5xdWVyeTxULCBWPih7IC4uLm9wdGlvbnMgfSkpO1xuICB9XG5cbiAgcHVibGljIG11dGF0ZTxULCBWID0gRW1wdHlPYmplY3Q+KG9wdGlvbnM6IE11dGF0aW9uT3B0aW9uczxULCBWPik6IE9ic2VydmFibGU8TXV0YXRpb25SZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gdXNlTXV0YXRpb25Mb2FkaW5nKFxuICAgICAgZnJvbVByb21pc2UoKCkgPT4gdGhpcy5lbnN1cmVDbGllbnQoKS5tdXRhdGU8VCwgVj4oeyAuLi5vcHRpb25zIH0pKSxcbiAgICAgIG9wdGlvbnMudXNlTXV0YXRpb25Mb2FkaW5nID8/IHRoaXMudXNlTXV0YXRpb25Mb2FkaW5nXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJzY3JpYmU8VCwgViA9IEVtcHR5T2JqZWN0PihcbiAgICBvcHRpb25zOiBTdWJzY3JpcHRpb25PcHRpb25zPFYsIFQ+LFxuICAgIGV4dHJhPzogRXh0cmFTdWJzY3JpcHRpb25PcHRpb25zXG4gICk6IE9ic2VydmFibGU8RmV0Y2hSZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBvYnMgPSBmcm9tKGZpeE9ic2VydmFibGUodGhpcy5lbnN1cmVDbGllbnQoKS5zdWJzY3JpYmU8VCwgVj4oeyAuLi5vcHRpb25zIH0pKSk7XG5cbiAgICByZXR1cm4gZXh0cmEgJiYgZXh0cmEudXNlWm9uZSAhPT0gdHJ1ZSA/IG9icyA6IHdyYXBXaXRoWm9uZShvYnMsIHRoaXMubmdab25lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgQXBvbGxvQ2xpZW50XG4gICAqIEBkZXByZWNhdGVkIHVzZSBgYXBvbGxvLmNsaWVudGAgaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIGdldENsaWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgbmV3IGluc3RhbmNlIG9mIEFwb2xsb0NsaWVudFxuICAgKiBSZW1lbWJlciB0byBjbGVhbiB1cCB0aGUgc3RvcmUgYmVmb3JlIHNldHRpbmcgYSBuZXcgY2xpZW50LlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGFwb2xsby5jbGllbnQgPSBjbGllbnRgIGluc3RlYWRcbiAgICpcbiAgICogQHBhcmFtIGNsaWVudCBBcG9sbG9DbGllbnQgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzZXRDbGllbnQoY2xpZW50OiBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+KSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGluc3RhbmNlIG9mIEFwb2xsb0NsaWVudFxuICAgKi9cbiAgcHVibGljIGdldCBjbGllbnQoKTogQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBuZXcgaW5zdGFuY2Ugb2YgQXBvbGxvQ2xpZW50XG4gICAqIFJlbWVtYmVyIHRvIGNsZWFuIHVwIHRoZSBzdG9yZSBiZWZvcmUgc2V0dGluZyBhIG5ldyBjbGllbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjbGllbnQgQXBvbGxvQ2xpZW50IGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc2V0IGNsaWVudChjbGllbnQ6IEFwb2xsb0NsaWVudDxUQ2FjaGVTaGFwZT4pIHtcbiAgICBpZiAodGhpcy5fY2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsaWVudCBoYXMgYmVlbiBhbHJlYWR5IGRlZmluZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUNsaWVudCgpIHtcbiAgICB0aGlzLmNoZWNrSW5zdGFuY2UoKTtcblxuICAgIHJldHVybiB0aGlzLl9jbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSW5zdGFuY2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2xpZW50IGhhcyBub3QgYmVlbiBkZWZpbmVkIHlldCcpO1xuICAgIH1cbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXBvbGxvIGV4dGVuZHMgQXBvbGxvQmFzZTxhbnk+IHtcbiAgcHJpdmF0ZSBtYXA6IE1hcDxzdHJpbmcsIEFwb2xsb0Jhc2U8YW55Pj4gPSBuZXcgTWFwPHN0cmluZywgQXBvbGxvQmFzZTxhbnk+PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChBUE9MTE9fT1BUSU9OUylcbiAgICBhcG9sbG9PcHRpb25zPzogQXBvbGxvQ2xpZW50T3B0aW9uczxhbnk+LFxuICAgIEBJbmplY3QoQVBPTExPX05BTUVEX09QVElPTlMpIEBPcHRpb25hbCgpIGFwb2xsb05hbWVkT3B0aW9ucz86IE5hbWVkT3B0aW9ucyxcbiAgICBASW5qZWN0KEFQT0xMT19GTEFHUykgQE9wdGlvbmFsKCkgZmxhZ3M/OiBGbGFnc1xuICApIHtcbiAgICBzdXBlcihfbmdab25lLCBmbGFncyk7XG5cbiAgICBpZiAoYXBvbGxvT3B0aW9ucykge1xuICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0KGFwb2xsb09wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChhcG9sbG9OYW1lZE9wdGlvbnMgJiYgdHlwZW9mIGFwb2xsb05hbWVkT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gYXBvbGxvTmFtZWRPcHRpb25zKSB7XG4gICAgICAgIGlmIChhcG9sbG9OYW1lZE9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXBvbGxvTmFtZWRPcHRpb25zW25hbWVdO1xuICAgICAgICAgIHRoaXMuY3JlYXRlKG9wdGlvbnMsIG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBBcG9sbG9DbGllbnRcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyByZXF1aXJlZCB0byBjcmVhdGUgQXBvbGxvQ2xpZW50XG4gICAqIEBwYXJhbSBuYW1lIGNsaWVudCdzIG5hbWVcbiAgICovXG4gIHB1YmxpYyBjcmVhdGU8VENhY2hlU2hhcGU+KG9wdGlvbnM6IEFwb2xsb0NsaWVudE9wdGlvbnM8VENhY2hlU2hhcGU+LCBuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGlzRGVmYXVsdChuYW1lKSkge1xuICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0PFRDYWNoZVNoYXBlPihvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVOYW1lZDxUQ2FjaGVTaGFwZT4obmFtZSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBhIGRlZmF1bHQgQXBvbGxvQ2xpZW50XG4gICAqL1xuICBwdWJsaWMgZGVmYXVsdCgpOiBBcG9sbG9CYXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBhIG5hbWVkIEFwb2xsb0NsaWVudFxuICAgKiBAcGFyYW0gbmFtZSBjbGllbnQncyBuYW1lXG4gICAqL1xuICBwdWJsaWMgdXNlKG5hbWU6IHN0cmluZyk6IEFwb2xsb0Jhc2U8YW55PiB7XG4gICAgaWYgKGlzRGVmYXVsdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGRlZmF1bHQgQXBvbGxvQ2xpZW50LCBzYW1lIGFzIGBhcG9sbG8uY3JlYXRlKG9wdGlvbnMpYFxuICAgKiBAcGFyYW0gb3B0aW9ucyBBcG9sbG9DbGllbnQncyBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGVmYXVsdDxUQ2FjaGVTaGFwZT4ob3B0aW9uczogQXBvbGxvQ2xpZW50T3B0aW9uczxUQ2FjaGVTaGFwZT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXRDbGllbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcG9sbG8gaGFzIGJlZW4gYWxyZWFkeSBjcmVhdGVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldENsaWVudChuZXcgQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPihvcHRpb25zKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmFtZWQgQXBvbGxvQ2xpZW50LCBzYW1lIGFzIGBhcG9sbG8uY3JlYXRlKG9wdGlvbnMsIG5hbWUpYFxuICAgKiBAcGFyYW0gbmFtZSBjbGllbnQncyBuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIEFwb2xsb0NsaWVudCdzIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVOYW1lZDxUQ2FjaGVTaGFwZT4obmFtZTogc3RyaW5nLCBvcHRpb25zOiBBcG9sbG9DbGllbnRPcHRpb25zPFRDYWNoZVNoYXBlPik6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hcC5oYXMobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xpZW50ICR7bmFtZX0gaGFzIGJlZW4gYWxyZWFkeSBjcmVhdGVkYCk7XG4gICAgfVxuICAgIHRoaXMubWFwLnNldChuYW1lLCBuZXcgQXBvbGxvQmFzZSh0aGlzLl9uZ1pvbmUsIHRoaXMuZmxhZ3MsIG5ldyBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+KG9wdGlvbnMpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtZW1iZXIgdG8gY2xlYW4gdXAgdGhlIHN0b3JlIGJlZm9yZSByZW1vdmluZyBhIGNsaWVudFxuICAgKiBAcGFyYW0gbmFtZSBjbGllbnQncyBuYW1lXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQ2xpZW50KG5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaXNEZWZhdWx0KG5hbWUpKSB7XG4gICAgICB0aGlzLl9jbGllbnQgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFwLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNEZWZhdWx0KG5hbWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFuYW1lIHx8IG5hbWUgPT09ICdkZWZhdWx0Jztcbn1cbiJdfQ==