UNPKG

@ng-supabase/core

Version:

ng-supabase is a component library and helper utilities for integrating Supabase in your angular application.

147 lines 20.9 kB
// Angular. import { Injectable, NgZone } from '@angular/core'; // 3rd party. import { BehaviorSubject, Subject, filter, firstValueFrom, map } from 'rxjs'; import { createClient, } from '@supabase/supabase-js'; // Local. import { SupabaseConfig } from './supabase-config'; import { LogService } from './logging/log.service'; import * as i0 from "@angular/core"; import * as i1 from "./logging/log.service"; import * as i2 from "./supabase-config"; export class SupabaseService { get isSignedIn() { return this.signedIn.value; } get isNotSignedIn() { return !this.signedIn.value; } constructor(zone, log, config) { this.zone = zone; this.log = log; this.config = config; this.authChange = new Subject(); this.initialized = new BehaviorSubject(false); this.session = new BehaviorSubject(null); this.user = new BehaviorSubject(null); this.userDisplayName = new BehaviorSubject(''); this.userSubheading = new BehaviorSubject(''); this.userProfile = new BehaviorSubject(null); this.userAvatar = new BehaviorSubject(null); this.signedIn = new BehaviorSubject(false); this.loading = new BehaviorSubject(true); this.user.subscribe((user) => this.setUserInformation(user)); this.clientReady = firstValueFrom(this.initialized.pipe(filter(Boolean), map(() => this.client))); this.config.api.subscribe(() => this.setup()); } waitForSignedIn() { return firstValueFrom(this.signedIn.pipe(filter(Boolean), map(() => this.session.value))); } refreshUserDisplayInfo() { return this.setUserInformation(this.user.value); } async setUserInformation(user) { const profileTable = this.config.profile.table; let displayName = ''; if (user && profileTable) { this.log.debug(`Retrieving user profile for user ID '${user.id}'`); const { error, data: profile } = await this.client .from(profileTable) .select() .eq(this.config.profile.userIdField, user.id) .limit(1) .single(); if (error) { this.log.error(`Failed to retrieve user profile. ${error.details}`, error); } if (profile) { const firstName = profile[this.config.profile.firstNameField]; const lastName = profile[this.config.profile.lastNameField]; const avatar = profile[this.config.profile.avatarField]; displayName = `${firstName || ''} ${lastName || ''}`.trim(); this.userProfile.next(profile); if (avatar) { this.userAvatar.next(avatar); } this.log.debug(`Retrieving display name of '${displayName}' from profile`); } else { this.log.warn(`No profile found for user ID '${user.id}'`); } } displayName = displayName || this.extractDisplay(user); const subheading = displayName === user?.email ? '' : user?.user_metadata?.['title'] || user?.email || ''; this.userDisplayName.next(displayName); this.userSubheading.next(subheading); } extractDisplay(user) { const { first_name, last_name } = user?.user_metadata || {}; const display = `${first_name || ''} ${last_name || ''}`.trim(); return user ? display || user.email || user.id : ''; } setup() { if (this.isSignedIn) { this.setStateForSignedOut(); } this.createClient(); } createClient() { const { url, key } = this.config.api.value; this.client = createClient(url, key); this.client.auth.onAuthStateChange((event) => { this.zone.run(() => { this.setAuthState(event); }); }); } setAuthState(event) { this.log.info(`Auth state change: '${event}'`); this.authChange.next(event); if (event === 'INITIAL_SESSION') { this.initialized.next(true); this.loading.next(false); } else if (event === 'SIGNED_IN') { this.signedIn.next(true); this.tryGetSession(); } else if (event === 'SIGNED_OUT') { this.setStateForSignedOut(); } } async tryGetSession() { const { data, error } = await this.client.auth.getSession(); const noSession = !error && !data.session; if (noSession) { this.log.error('No session information retrieved'); return; } if (error) { this.log.error(`Failed to get user session`, error); return; } this.session.next(data.session); if (data.session?.user) { this.user.next(data.session.user); } } setStateForSignedOut() { this.session.next(null); this.signedIn.next(false); this.user.next(null); this.userProfile.next(null); this.userDisplayName.next(''); this.userSubheading.next(''); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: SupabaseService, deps: [{ token: i0.NgZone }, { token: i1.LogService }, { token: i2.SupabaseConfig }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: SupabaseService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: SupabaseService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.LogService }, { type: i2.SupabaseConfig }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwYWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3N1cGFiYXNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FBVztBQUNYLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELGFBQWE7QUFDYixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RSxPQUFPLEVBR0wsWUFBWSxHQUdiLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsU0FBUztBQUNULE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7QUFLbkQsTUFBTSxPQUFPLGVBQWU7SUFjMUIsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUNtQixJQUFZLEVBQ1osR0FBZSxFQUNmLE1BQXNCO1FBRnRCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixRQUFHLEdBQUgsR0FBRyxDQUFZO1FBQ2YsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUF2QmhDLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUM1QyxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ2xELFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBaUIsSUFBSSxDQUFDLENBQUM7UUFDcEQsU0FBSSxHQUFHLElBQUksZUFBZSxDQUFjLElBQUksQ0FBQyxDQUFDO1FBQzlDLG9C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LElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7OEdBdktVLGVBQWU7a0hBQWYsZUFBZSxjQUZkLE1BQU07OzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhci5cbmltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vLyAzcmQgcGFydHkuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIGZpbHRlciwgZmlyc3RWYWx1ZUZyb20sIG1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgVXNlcixcbiAgU2Vzc2lvbixcbiAgY3JlYXRlQ2xpZW50LFxuICBTdXBhYmFzZUNsaWVudCxcbiAgQXV0aENoYW5nZUV2ZW50LFxufSBmcm9tICdAc3VwYWJhc2Uvc3VwYWJhc2UtanMnO1xuXG4vLyBMb2NhbC5cbmltcG9ydCB7IFN1cGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9zdXBhYmFzZS1jb25maWcnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4vbG9nZ2luZy9sb2cuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTdXBhYmFzZVNlcnZpY2Uge1xuICBjbGllbnQhOiBTdXBhYmFzZUNsaWVudDtcbiAgcmVhZG9ubHkgYXV0aENoYW5nZSA9IG5ldyBTdWJqZWN0PEF1dGhDaGFuZ2VFdmVudD4oKTtcbiAgcmVhZG9ubHkgaW5pdGlhbGl6ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2Vzc2lvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvbiB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSB1c2VyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHVzZXJEaXNwbGF5TmFtZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IHVzZXJTdWJoZWFkaW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgdXNlclByb2ZpbGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuICByZWFkb25seSB1c2VyQXZhdGFyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2lnbmVkSW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGNsaWVudFJlYWR5OiBQcm9taXNlPFN1cGFiYXNlQ2xpZW50PjtcblxuICBnZXQgaXNTaWduZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaWduZWRJbi52YWx1ZTtcbiAgfVxuXG4gIGdldCBpc05vdFNpZ25lZEluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5zaWduZWRJbi52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nOiBMb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBTdXBhYmFzZUNvbmZpZ1xuICApIHtcbiAgICB0aGlzLnVzZXIuc3Vic2NyaWJlKCh1c2VyOiBVc2VyIHwgbnVsbCkgPT4gdGhpcy5zZXRVc2VySW5mb3JtYXRpb24odXNlcikpO1xuXG4gICAgdGhpcy5jbGllbnRSZWFkeSA9IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5pbml0aWFsaXplZC5waXBlKFxuICAgICAgICBmaWx0ZXIoQm9vbGVhbiksXG4gICAgICAgIG1hcCgoKSA9PiB0aGlzLmNsaWVudClcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5jb25maWcuYXBpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNldHVwKCkpO1xuICB9XG5cbiAgd2FpdEZvclNpZ25lZEluKCk6IFByb21pc2U8U2Vzc2lvbj4ge1xuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMuc2lnbmVkSW4ucGlwZShcbiAgICAgICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5zZXNzaW9uLnZhbHVlIGFzIFNlc3Npb24pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHJlZnJlc2hVc2VyRGlzcGxheUluZm8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VXNlckluZm9ybWF0aW9uKHRoaXMudXNlci52YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldFVzZXJJbmZvcm1hdGlvbih1c2VyOiBVc2VyIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByb2ZpbGVUYWJsZSA9IHRoaXMuY29uZmlnLnByb2ZpbGUudGFibGU7XG4gICAgbGV0IGRpc3BsYXlOYW1lID0gJyc7XG5cbiAgICBpZiAodXNlciAmJiBwcm9maWxlVGFibGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBSZXRyaWV2aW5nIHVzZXIgcHJvZmlsZSBmb3IgdXNlciBJRCAnJHt1c2VyLmlkfSdgKTtcbiAgICAgIGNvbnN0IHsgZXJyb3IsIGRhdGE6IHByb2ZpbGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50XG4gICAgICAgIC5mcm9tKHByb2ZpbGVUYWJsZSlcbiAgICAgICAgLnNlbGVjdCgpXG4gICAgICAgIC5lcSh0aGlzLmNvbmZpZy5wcm9maWxlLnVzZXJJZEZpZWxkLCB1c2VyLmlkKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnNpbmdsZSgpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byByZXRyaWV2ZSB1c2VyIHByb2ZpbGUuICR7ZXJyb3IuZGV0YWlsc31gLFxuICAgICAgICAgIGVycm9yIGFzIHVua25vd24gYXMgRXJyb3JcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgICAgY29uc3QgZmlyc3ROYW1lID0gcHJvZmlsZVt0aGlzLmNvbmZpZy5wcm9maWxlLmZpcnN0TmFtZUZpZWxkXTtcbiAgICAgICAgY29uc3QgbGFzdE5hbWUgPSBwcm9maWxlW3RoaXMuY29uZmlnLnByb2ZpbGUubGFzdE5hbWVGaWVsZF07XG4gICAgICAgIGNvbnN0IGF2YXRhciA9IHByb2ZpbGVbdGhpcy5jb25maWcucHJvZmlsZS5hdmF0YXJGaWVsZF07XG4gICAgICAgIGRpc3BsYXlOYW1lID0gYCR7Zmlyc3ROYW1lIHx8ICcnfSAke2xhc3ROYW1lIHx8ICcnfWAudHJpbSgpO1xuICAgICAgICB0aGlzLnVzZXJQcm9maWxlLm5leHQocHJvZmlsZSk7XG5cbiAgICAgICAgaWYgKGF2YXRhcikge1xuICAgICAgICAgIHRoaXMudXNlckF2YXRhci5uZXh0KGF2YXRhcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgUmV0cmlldmluZyBkaXNwbGF5IG5hbWUgb2YgJyR7ZGlzcGxheU5hbWV9JyBmcm9tIHByb2ZpbGVgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBObyBwcm9maWxlIGZvdW5kIGZvciB1c2VyIElEICcke3VzZXIuaWR9J2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWUgfHwgdGhpcy5leHRyYWN0RGlzcGxheSh1c2VyKTtcbiAgICBjb25zdCBzdWJoZWFkaW5nID1cbiAgICAgIGRpc3BsYXlOYW1lID09PSB1c2VyPy5lbWFpbFxuICAgICAgICA/ICcnXG4gICAgICAgIDogdXNlcj8udXNlcl9tZXRhZGF0YT8uWyd0aXRsZSddIHx8IHVzZXI/LmVtYWlsIHx8ICcnO1xuXG4gICAgdGhpcy51c2VyRGlzcGxheU5hbWUubmV4dChkaXNwbGF5TmFtZSk7XG4gICAgdGhpcy51c2VyU3ViaGVhZGluZy5uZXh0KHN1YmhlYWRpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0RGlzcGxheSh1c2VyOiBVc2VyIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBmaXJzdF9uYW1lLCBsYXN0X25hbWUgfSA9IHVzZXI/LnVzZXJfbWV0YWRhdGEgfHwge307XG4gICAgY29uc3QgZGlzcGxheSA9IGAke2ZpcnN0X25hbWUgfHwgJyd9ICR7bGFzdF9uYW1lIHx8ICcnfWAudHJpbSgpO1xuICAgIHJldHVybiB1c2VyID8gZGlzcGxheSB8fCB1c2VyLmVtYWlsIHx8IHVzZXIuaWQgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTaWduZWRJbikge1xuICAgICAgdGhpcy5zZXRTdGF0ZUZvclNpZ25lZE91dCgpO1xuICAgIH1cblxuICAgIHRoaXMuY3JlYXRlQ2xpZW50KCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNsaWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IHVybCwga2V5IH0gPSB0aGlzLmNvbmZpZy5hcGkudmFsdWU7XG4gICAgdGhpcy5jbGllbnQgPSBjcmVhdGVDbGllbnQodXJsLCBrZXkpO1xuICAgIHRoaXMuY2xpZW50LmF1dGgub25BdXRoU3RhdGVDaGFuZ2UoKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRBdXRoU3RhdGUoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEF1dGhTdGF0ZShldmVudDogQXV0aENoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5sb2cuaW5mbyhgQXV0aCBzdGF0ZSBjaGFuZ2U6ICcke2V2ZW50fSdgKTtcbiAgICB0aGlzLmF1dGhDaGFuZ2UubmV4dChldmVudCk7XG4gICAgaWYgKGV2ZW50ID09PSAnSU5JVElBTF9TRVNTSU9OJykge1xuICAgICAgdGhpcy5pbml0aWFsaXplZC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdTSUdORURfSU4nKSB7XG4gICAgICB0aGlzLnNpZ25lZEluLm5leHQodHJ1ZSk7XG4gICAgICB0aGlzLnRyeUdldFNlc3Npb24oKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnU0lHTkVEX09VVCcpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGVGb3JTaWduZWRPdXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeUdldFNlc3Npb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5jbGllbnQuYXV0aC5nZXRTZXNzaW9uKCk7XG4gICAgY29uc3Qgbm9TZXNzaW9uID0gIWVycm9yICYmICFkYXRhLnNlc3Npb247XG5cbiAgICBpZiAobm9TZXNzaW9uKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcignTm8gc2Vzc2lvbiBpbmZvcm1hdGlvbiByZXRyaWV2ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBGYWlsZWQgdG8gZ2V0IHVzZXIgc2Vzc2lvbmAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlc3Npb24ubmV4dChkYXRhLnNlc3Npb24pO1xuXG4gICAgaWYgKGRhdGEuc2Vzc2lvbj8udXNlcikge1xuICAgICAgdGhpcy51c2VyLm5leHQoZGF0YS5zZXNzaW9uLnVzZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhdGVGb3JTaWduZWRPdXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXNzaW9uLm5leHQobnVsbCk7XG4gICAgdGhpcy5zaWduZWRJbi5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLnVzZXIubmV4dChudWxsKTtcbiAgICB0aGlzLnVzZXJQcm9maWxlLm5leHQobnVsbCk7XG4gICAgdGhpcy51c2VyRGlzcGxheU5hbWUubmV4dCgnJyk7XG4gICAgdGhpcy51c2VyU3ViaGVhZGluZy5uZXh0KCcnKTtcbiAgfVxufVxuIl19