apollo-angular
Version:
Use your GraphQL data in your Angular app, with the Apollo Client
188 lines • 20.5 kB
JavaScript
import { from } from 'rxjs';
import { Inject, Injectable, Optional } from '@angular/core';
import { ApolloClient } from '@apollo/client/core';
import { QueryRef } from './query-ref';
import { APOLLO_FLAGS, APOLLO_NAMED_OPTIONS, APOLLO_OPTIONS } from './tokens';
import { fixObservable, fromPromise, pickFlag, useMutationLoading, wrapWithZone } from './utils';
import * as i0 from "@angular/core";
export class ApolloBase {
ngZone;
flags;
_client;
useInitialLoading;
useMutationLoading;
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 {
_ngZone;
map = new Map();
constructor(_ngZone, apolloOptions, apolloNamedOptions, flags) {
super(_ngZone, flags);
this._ngZone = _ngZone;
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);
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", 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 });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: Apollo });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBvbGxvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fwb2xsby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFVLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVVyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQVU5RSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUVqRyxNQUFNLE9BQU8sVUFBVTtJQUtUO0lBQ0E7SUFDQTtJQU5KLGlCQUFpQixDQUFVO0lBQzNCLGtCQUFrQixDQUFVO0lBRXBDLFlBQ1ksTUFBYyxFQUNkLEtBQWEsRUFDYixPQUFtQztRQUZuQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLFlBQU8sR0FBUCxPQUFPLENBQTRCO1FBRTdDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTSxVQUFVLENBQ2YsT0FBNkM7UUFFN0MsT0FBTyxJQUFJLFFBQVEsQ0FDakIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBb0I7WUFDaEQsR0FBRyxPQUFPO1NBQ1gsQ0FBdUMsRUFDeEMs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WUFBWSxDQUFjLE9BQU8sQ0FBQyxDQUFDLENBQ2pGLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksWUFBWSxDQUFDLElBQWE7UUFDL0IsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7U0FDMUI7YUFBTTtZQUNMLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQzt1R0EvRlUsTUFBTSx3Q0FNUCxjQUFjLDZCQUVkLG9CQUFvQiw2QkFDcEIsWUFBWTsyR0FUWCxNQUFNOzsyRkFBTixNQUFNO2tCQURsQixVQUFVOzswQkFNTixRQUFROzswQkFDUixNQUFNOzJCQUFDLGNBQWM7OzBCQUVyQixNQUFNOzJCQUFDLG9CQUFvQjs7MEJBQUcsUUFBUTs7MEJBQ3RDLE1BQU07MkJBQUMsWUFBWTs7MEJBQUcsUUFBUTs7QUF5Rm5DLFNBQVMsU0FBUyxDQUFDLElBQWE7SUFDOUIsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtcbiAgQXBvbGxvQ2xpZW50T3B0aW9ucyxcbiAgQXBvbGxvUXVlcnlSZXN1bHQsXG4gIEZldGNoUmVzdWx0LFxuICBPYnNlcnZhYmxlUXVlcnksXG4gIE9wZXJhdGlvblZhcmlhYmxlcyxcbiAgUXVlcnlPcHRpb25zLFxuICBTdWJzY3JpcHRpb25PcHRpb25zLFxufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7IEFwb2xsb0NsaWVudCB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHsgUXVlcnlSZWYgfSBmcm9tICcuL3F1ZXJ5LXJlZic7XG5pbXBvcnQgeyBBUE9MTE9fRkxBR1MsIEFQT0xMT19OQU1FRF9PUFRJT05TLCBBUE9MTE9fT1BUSU9OUyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB0eXBlIHtcbiAgRW1wdHlPYmplY3QsXG4gIEV4dHJhU3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgRmxhZ3MsXG4gIE11dGF0aW9uT3B0aW9ucyxcbiAgTXV0YXRpb25SZXN1bHQsXG4gIE5hbWVkT3B0aW9ucyxcbiAgV2F0Y2hRdWVyeU9wdGlvbnMsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgZml4T2JzZXJ2YWJsZSwgZnJvbVByb21pc2UsIHBpY2tGbGFnLCB1c2VNdXRhdGlvbkxvYWRpbmcsIHdyYXBXaXRoWm9uZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQXBvbGxvQmFzZTxUQ2FjaGVTaGFwZSA9IGFueT4ge1xuICBwcml2YXRlIHVzZUluaXRpYWxMb2FkaW5nOiBib29sZWFuO1xuICBwcml2YXRlIHVzZU11dGF0aW9uTG9hZGluZzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIGZsYWdzPzogRmxhZ3MsXG4gICAgcHJvdGVjdGVkIF9jbGllbnQ/OiBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+LFxuICApIHtcbiAgICB0aGlzLnVzZUluaXRpYWxMb2FkaW5nID0gcGlja0ZsYWcoZmxhZ3MsICd1c2VJbml0aWFsTG9hZGluZycsIGZhbHNlKTtcbiAgICB0aGlzLnVzZU11dGF0aW9uTG9hZGluZyA9IHBpY2tGbGFnKGZsYWdzLCAndXNlTXV0YXRpb25Mb2FkaW5nJywgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHdhdGNoUXVlcnk8VERhdGEsIFRWYXJpYWJsZXMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXMgPSBFbXB0eU9iamVjdD4oXG4gICAgb3B0aW9uczogV2F0Y2hRdWVyeU9wdGlvbnM8VFZhcmlhYmxlcywgVERhdGE+LFxuICApOiBRdWVyeVJlZjxURGF0YSwgVFZhcmlhYmxlcz4ge1xuICAgIHJldHVybiBuZXcgUXVlcnlSZWY8VERhdGEsIFRWYXJpYWJsZXM+KFxuICAgICAgdGhpcy5lbnN1cmVDbGllbnQoKS53YXRjaFF1ZXJ5PFREYXRhLCBUVmFyaWFibGVzPih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9KSBhcyBPYnNlcnZhYmxlUXVlcnk8VERhdGEsIFRWYXJpYWJsZXM+LFxuICAgICAgdGhpcy5uZ1pvbmUsXG4gICAgICB7XG4gICAgICAgIHVzZUluaXRpYWxMb2FkaW5nOiB0aGlzLnVzZUluaXRpYWxMb2FkaW5nLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5PFQsIFYgPSBFbXB0eU9iamVjdD4ob3B0aW9uczogUXVlcnlPcHRpb25zPFYsIFQ+KTogT2JzZXJ2YWJsZTxBcG9sbG9RdWVyeVJlc3VsdDxUPj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZTxBcG9sbG9RdWVyeVJlc3VsdDxUPj4oKCkgPT4gdGhpcy5lbnN1cmVDbGllbnQoKS5xdWVyeTxULCBWPih7IC4uLm9wdGlvbnMgfSkpO1xuICB9XG5cbiAgcHVibGljIG11dGF0ZTxULCBWID0gRW1wdHlPYmplY3Q+KG9wdGlvbnM6IE11dGF0aW9uT3B0aW9uczxULCBWPik6IE9ic2VydmFibGU8TXV0YXRpb25SZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gdXNlTXV0YXRpb25Mb2FkaW5nKFxuICAgICAgZnJvbVByb21pc2UoKCkgPT4gdGhpcy5lbnN1cmVDbGllbnQoKS5tdXRhdGU8VCwgVj4oeyAuLi5vcHRpb25zIH0pKSxcbiAgICAgIG9wdGlvbnMudXNlTXV0YXRpb25Mb2FkaW5nID8/IHRoaXMudXNlTXV0YXRpb25Mb2FkaW5nLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc3Vic2NyaWJlPFQsIFYgPSBFbXB0eU9iamVjdD4oXG4gICAgb3B0aW9uczogU3Vic2NyaXB0aW9uT3B0aW9uczxWLCBUPixcbiAgICBleHRyYT86IEV4dHJhU3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxGZXRjaFJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IG9icyA9IGZyb20oZml4T2JzZXJ2YWJsZSh0aGlzLmVuc3VyZUNsaWVudCgpLnN1YnNjcmliZTxULCBWPih7IC4uLm9wdGlvbnMgfSkpKTtcblxuICAgIHJldHVybiBleHRyYSAmJiBleHRyYS51c2Vab25lICE9PSB0cnVlID8gb2JzIDogd3JhcFdpdGhab25lKG9icywgdGhpcy5uZ1pvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSBvZiBBcG9sbG9DbGllbnRcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBhcG9sbG8uY2xpZW50YCBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2xpZW50KCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBuZXcgaW5zdGFuY2Ugb2YgQXBvbGxvQ2xpZW50XG4gICAqIFJlbWVtYmVyIHRvIGNsZWFuIHVwIHRoZSBzdG9yZSBiZWZvcmUgc2V0dGluZyBhIG5ldyBjbGllbnQuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgYXBvbGxvLmNsaWVudCA9IGNsaWVudGAgaW5zdGVhZFxuICAgKlxuICAgKiBAcGFyYW0gY2xpZW50IEFwb2xsb0NsaWVudCBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHNldENsaWVudChjbGllbnQ6IEFwb2xsb0NsaWVudDxUQ2FjaGVTaGFwZT4pIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgQXBvbGxvQ2xpZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNsaWVudCgpOiBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG5ldyBpbnN0YW5jZSBvZiBBcG9sbG9DbGllbnRcbiAgICogUmVtZW1iZXIgdG8gY2xlYW4gdXAgdGhlIHN0b3JlIGJlZm9yZSBzZXR0aW5nIGEgbmV3IGNsaWVudC5cbiAgICpcbiAgICogQHBhcmFtIGNsaWVudCBBcG9sbG9DbGllbnQgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzZXQgY2xpZW50KGNsaWVudDogQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPikge1xuICAgIGlmICh0aGlzLl9jbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2xpZW50IGhhcyBiZWVuIGFscmVhZHkgZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHRoaXMuX2NsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQ2xpZW50KCkge1xuICAgIHRoaXMuY2hlY2tJbnN0YW5jZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDbGllbnQgaGFzIG5vdCBiZWVuIGRlZmluZWQgeWV0Jyk7XG4gICAgfVxuICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBcG9sbG8gZXh0ZW5kcyBBcG9sbG9CYXNlPGFueT4ge1xuICBwcml2YXRlIG1hcDogTWFwPHN0cmluZywgQXBvbGxvQmFzZTxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBBcG9sbG9CYXNlPGFueT4+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KEFQT0xMT19PUFRJT05TKVxuICAgIGFwb2xsb09wdGlvbnM/OiBBcG9sbG9DbGllbnRPcHRpb25zPGFueT4sXG4gICAgQEluamVjdChBUE9MTE9fTkFNRURfT1BUSU9OUykgQE9wdGlvbmFsKCkgYXBvbGxvTmFtZWRPcHRpb25zPzogTmFtZWRPcHRpb25zLFxuICAgIEBJbmplY3QoQVBPTExPX0ZMQUdTKSBAT3B0aW9uYWwoKSBmbGFncz86IEZsYWdzLFxuICApIHtcbiAgICBzdXBlcihfbmdab25lLCBmbGFncyk7XG5cbiAgICBpZiAoYXBvbGxvT3B0aW9ucykge1xuICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0KGFwb2xsb09wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChhcG9sbG9OYW1lZE9wdGlvbnMgJiYgdHlwZW9mIGFwb2xsb05hbWVkT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gYXBvbGxvTmFtZWRPcHRpb25zKSB7XG4gICAgICAgIGlmIChhcG9sbG9OYW1lZE9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXBvbGxvTmFtZWRPcHRpb25zW25hbWVdO1xuICAgICAgICAgIHRoaXMuY3JlYXRlKG9wdGlvbnMsIG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBBcG9sbG9DbGllbnRcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyByZXF1aXJlZCB0byBjcmVhdGUgQXBvbGxvQ2xpZW50XG4gICAqIEBwYXJhbSBuYW1lIGNsaWVudCdzIG5hbWVcbiAgICovXG4gIHB1YmxpYyBjcmVhdGU8VENhY2hlU2hhcGU+KG9wdGlvbnM6IEFwb2xsb0NsaWVudE9wdGlvbnM8VENhY2hlU2hhcGU+LCBuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGlzRGVmYXVsdChuYW1lKSkge1xuICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0PFRDYWNoZVNoYXBlPihvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVOYW1lZDxUQ2FjaGVTaGFwZT4obmFtZSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBhIGRlZmF1bHQgQXBvbGxvQ2xpZW50XG4gICAqL1xuICBwdWJsaWMgZGVmYXVsdCgpOiBBcG9sbG9CYXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBhIG5hbWVkIEFwb2xsb0NsaWVudFxuICAgKiBAcGFyYW0gbmFtZSBjbGllbnQncyBuYW1lXG4gICAqL1xuICBwdWJsaWMgdXNlKG5hbWU6IHN0cmluZyk6IEFwb2xsb0Jhc2U8YW55PiB7XG4gICAgaWYgKGlzRGVmYXVsdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGRlZmF1bHQgQXBvbGxvQ2xpZW50LCBzYW1lIGFzIGBhcG9sbG8uY3JlYXRlKG9wdGlvbnMpYFxuICAgKiBAcGFyYW0gb3B0aW9ucyBBcG9sbG9DbGllbnQncyBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGVmYXVsdDxUQ2FjaGVTaGFwZT4ob3B0aW9uczogQXBvbGxvQ2xpZW50T3B0aW9uczxUQ2FjaGVTaGFwZT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXRDbGllbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcG9sbG8gaGFzIGJlZW4gYWxyZWFkeSBjcmVhdGVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldENsaWVudChuZXcgQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPihvcHRpb25zKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmFtZWQgQXBvbGxvQ2xpZW50LCBzYW1lIGFzIGBhcG9sbG8uY3JlYXRlKG9wdGlvbnMsIG5hbWUpYFxuICAgKiBAcGFyYW0gbmFtZSBjbGllbnQncyBuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIEFwb2xsb0NsaWVudCdzIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVOYW1lZDxUQ2FjaGVTaGFwZT4obmFtZTogc3RyaW5nLCBvcHRpb25zOiBBcG9sbG9DbGllbnRPcHRpb25zPFRDYWNoZVNoYXBlPik6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hcC5oYXMobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xpZW50ICR7bmFtZX0gaGFzIGJlZW4gYWxyZWFkeSBjcmVhdGVkYCk7XG4gICAgfVxuICAgIHRoaXMubWFwLnNldChcbiAgICAgIG5hbWUsXG4gICAgICBuZXcgQXBvbGxvQmFzZSh0aGlzLl9uZ1pvbmUsIHRoaXMuZmxhZ3MsIG5ldyBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+KG9wdGlvbnMpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbWVtYmVyIHRvIGNsZWFuIHVwIHRoZSBzdG9yZSBiZWZvcmUgcmVtb3ZpbmcgYSBjbGllbnRcbiAgICogQHBhcmFtIG5hbWUgY2xpZW50J3MgbmFtZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZUNsaWVudChuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGlzRGVmYXVsdChuYW1lKSkge1xuICAgICAgdGhpcy5fY2xpZW50ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcC5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzRGVmYXVsdChuYW1lPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhbmFtZSB8fCBuYW1lID09PSAnZGVmYXVsdCc7XG59XG4iXX0=