UNPKG

@dagonmetric/ng-config-firebase-remote-config

Version:

Google Firebase Remote Config integration of @dagonMetric/ng-config for Angular applications.

291 lines (284 loc) 9.88 kB
import { InjectionToken, ɵɵdefineInjectable, ɵɵinject, PLATFORM_ID, NgZone, Injectable, Inject, NgModule } from '@angular/core'; import { isPlatformBrowser } from '@angular/common'; import { queueScheduler, of, EMPTY } from 'rxjs'; import { observeOn, switchMap, map, tap, startWith, shareReplay, filter } from 'rxjs/operators'; import firebase from 'firebase/app'; import { CONFIG_PROVIDER } from '@dagonmetric/ng-config'; /** * @fileoverview added by tsickle * Generated from: src/firebase-remote-config-provider-options.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** @type {?} */ const FIREBASE_REMOTE_CONFIG_PROVIDER_OPTIONS = new InjectionToken('FirebaseRemoteConfigProviderOptions'); /** * @fileoverview added by tsickle * Generated from: src/firebase-app-factory.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @param {?} options * @param {?} zone * @param {?=} appName * @return {?} */ function firebaseAppFactory(options, zone, appName) { appName = appName || '[DEFAULT]'; /** @type {?} */ const existingApp = firebase.apps.filter((/** * @param {?} app * @return {?} */ (app) => app && app.name === appName))[0]; return existingApp || zone.runOutsideAngular((/** * @return {?} */ () => firebase.initializeApp(options, appName))); } /** * @fileoverview added by tsickle * Generated from: src/zone-helpers.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ class ZoneScheduler { /** * @param {?} zone * @param {?=} delegate */ constructor(zone, delegate = queueScheduler) { this.zone = zone; this.delegate = delegate; } /** * @return {?} */ now() { return this.delegate.now(); } // eslint-disable-next-line no-shadow /** * @param {?} work * @param {?=} delay * @param {?=} state * @return {?} */ schedule(work, delay, state) { /** @type {?} */ const targetZone = this.zone; /** @type {?} */ const workInZone = (/** * @this {?} * @param {?} stateLocal * @return {?} */ function (stateLocal) { targetZone.runGuarded((/** * @return {?} */ () => { work.apply(this, [stateLocal]); })); }); return this.delegate.schedule(workInZone, delay, state); } } /** * @fileoverview added by tsickle * Generated from: src/firebase-remote-config-provider.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** @type {?} */ const doubleUnderscoreRegExp = /__/g; /** @type {?} */ const validKeyRegExp = /^[_]?[a-zA-Z]/; /** @type {?} */ const isValidKeys = (/** * @param {?} keys * @return {?} */ (keys) => { for (const key of keys) { if (!validKeyRegExp.test(key)) { return false; } } return true; }); class FirebaseRemoteConfigProvider { /** * @param {?} options * @param {?} platformId * @param {?} ngZone */ constructor(options, // eslint-disable-next-line @typescript-eslint/ban-types platformId, ngZone) { this.options = options; this.ngZone = ngZone; this.isBrowser = isPlatformBrowser(platformId); /** @type {?} */ const rc$ = of(undefined).pipe(observeOn(this.ngZone.runOutsideAngular((/** * @return {?} */ () => new ZoneScheduler(Zone.current)))), switchMap((/** * @return {?} */ () => (this.isBrowser ? import('firebase/remote-config') : EMPTY))), map((/** * @return {?} */ () => firebaseAppFactory(this.options.firebaseConfig, this.ngZone, this.options.appName))), map((/** * @param {?} app * @return {?} */ (app) => app.remoteConfig())), tap((/** * @param {?} rc * @return {?} */ (rc) => { if (this.options.remoteConfigSettings) { rc.settings = (/** @type {?} */ (this.options.remoteConfigSettings)); } })), startWith((/** @type {?} */ (((/** @type {?} */ (undefined)))))), shareReplay({ bufferSize: 1, refCount: false })); this.rc = rc$.pipe(filter((/** * @param {?} rc * @return {?} */ (rc) => !!rc))); } /** * @return {?} */ get name() { return 'FirebaseRemoteConfigProvider'; } /** * @return {?} */ load() { return this.rc.pipe(switchMap((/** * @param {?} rc * @return {?} */ (rc) => this.ngZone.runOutsideAngular((/** * @return {?} */ async () => { if (!this.isBrowser) { return {}; } await rc.activate(); try { await rc.fetch(); await rc.activate(); } catch (fetchError) { if (this.options.throwIfLoadError) { throw fetchError; } } await rc.ensureInitialized(); return rc.getAll(); })))), map((/** * @param {?} config * @return {?} */ (config) => { /** @type {?} */ const allkeys = Object.keys(config); /** @type {?} */ const mappedConfig = {}; for (const key of allkeys) { /** @type {?} */ const valueStr = config[key].asString(); /** @type {?} */ let normalizedKey = key; if (this.options.prefix) { if (!key.toLowerCase().startsWith(this.options.prefix.toLowerCase())) { continue; } else { normalizedKey = key.substr(this.options.prefix.length); } } /** @type {?} */ const nestedKeys = normalizedKey.split(doubleUnderscoreRegExp); if (nestedKeys.length > 1 && isValidKeys(nestedKeys)) { /** @type {?} */ const firstKey = nestedKeys[0]; if (!mappedConfig[firstKey] || typeof mappedConfig[firstKey] !== 'object') { mappedConfig[firstKey] = {}; } /** @type {?} */ let accObj = (/** @type {?} */ (mappedConfig[firstKey])); for (let i = 1; i < nestedKeys.length; i++) { /** @type {?} */ const currentKey = nestedKeys[i]; if (i === nestedKeys.length - 1) { accObj[currentKey] = valueStr; break; } if (!accObj[currentKey] || typeof accObj[currentKey] !== 'object') { accObj[currentKey] = {}; } accObj = (/** @type {?} */ (accObj[currentKey])); } } else { mappedConfig[normalizedKey] = valueStr; } } return mappedConfig; }))); } } /** @nocollapse */ FirebaseRemoteConfigProvider.ɵprov = ɵɵdefineInjectable({ factory: function FirebaseRemoteConfigProvider_Factory() { return new FirebaseRemoteConfigProvider(ɵɵinject(FIREBASE_REMOTE_CONFIG_PROVIDER_OPTIONS), ɵɵinject(PLATFORM_ID), ɵɵinject(NgZone)); }, token: FirebaseRemoteConfigProvider, providedIn: "any" }); FirebaseRemoteConfigProvider.decorators = [ { type: Injectable, args: [{ providedIn: 'any' },] } ]; /** @nocollapse */ FirebaseRemoteConfigProvider.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [FIREBASE_REMOTE_CONFIG_PROVIDER_OPTIONS,] }] }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: NgZone } ]; /** * @fileoverview added by tsickle * Generated from: src/firebase-remote-config-provider.module.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * The `NGMODULE` for providing `FirebaseRemoteConfigProvider`. */ class FirebaseRemoteConfigProviderModule { /** * Call this method to configure options for `FirebaseRemoteConfigProvider`. * @param {?} options An option object for `FirebaseRemoteConfigProvider`. * @return {?} */ static configure(options) { return { ngModule: FirebaseRemoteConfigProviderModule, providers: [ { provide: FIREBASE_REMOTE_CONFIG_PROVIDER_OPTIONS, useValue: options } ] }; } } FirebaseRemoteConfigProviderModule.decorators = [ { type: NgModule, args: [{ providers: [ { provide: CONFIG_PROVIDER, useClass: FirebaseRemoteConfigProvider, multi: true } ] },] } ]; export { FIREBASE_REMOTE_CONFIG_PROVIDER_OPTIONS, FirebaseRemoteConfigProvider, FirebaseRemoteConfigProviderModule }; //# sourceMappingURL=ng-config-firebase-remote-config.js.map