UNPKG

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

Version:

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

300 lines (289 loc) 12.1 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('rxjs'), require('rxjs/operators'), require('firebase/app'), require('@dagonmetric/ng-config')) : typeof define === 'function' && define.amd ? define('@dagonmetric/ng-config-firebase-remote-config', ['exports', '@angular/core', '@angular/common', 'rxjs', 'rxjs/operators', 'firebase/app', '@dagonmetric/ng-config'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.ngConfig = global.ngConfig || {}, global.ngConfig.firebaseRemoteConfig = {}), global.ng.core, global.ng.common, global.rxjs, global.rxjs.operators, global.firebase.app, global.ngConfig)); }(this, (function (exports, i0, common, rxjs, operators, firebase, ngConfig) { 'use strict'; function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var firebase__default = /*#__PURE__*/_interopDefaultLegacy(firebase); /** * @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 i0.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__default['default'].apps.filter((/** * @param {?} app * @return {?} */ (app) => app && app.name === appName))[0]; return existingApp || zone.runOutsideAngular((/** * @return {?} */ () => firebase__default['default'].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 = rxjs.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 = common.isPlatformBrowser(platformId); /** @type {?} */ const rc$ = rxjs.of(undefined).pipe(operators.observeOn(this.ngZone.runOutsideAngular((/** * @return {?} */ () => new ZoneScheduler(Zone.current)))), operators.switchMap((/** * @return {?} */ () => (this.isBrowser ? import('firebase/remote-config') : rxjs.EMPTY))), operators.map((/** * @return {?} */ () => firebaseAppFactory(this.options.firebaseConfig, this.ngZone, this.options.appName))), operators.map((/** * @param {?} app * @return {?} */ (app) => app.remoteConfig())), operators.tap((/** * @param {?} rc * @return {?} */ (rc) => { if (this.options.remoteConfigSettings) { rc.settings = (/** @type {?} */ (this.options.remoteConfigSettings)); } })), operators.startWith((/** @type {?} */ (((/** @type {?} */ (undefined)))))), operators.shareReplay({ bufferSize: 1, refCount: false })); this.rc = rc$.pipe(operators.filter((/** * @param {?} rc * @return {?} */ (rc) => !!rc))); } /** * @return {?} */ get name() { return 'FirebaseRemoteConfigProvider'; } /** * @return {?} */ load() { return this.rc.pipe(operators.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(); })))), operators.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 = i0.ɵɵdefineInjectable({ factory: function FirebaseRemoteConfigProvider_Factory() { return new FirebaseRemoteConfigProvider(i0.ɵɵinject(FIREBASE_REMOTE_CONFIG_PROVIDER_OPTIONS), i0.ɵɵinject(i0.PLATFORM_ID), i0.ɵɵinject(i0.NgZone)); }, token: FirebaseRemoteConfigProvider, providedIn: "any" }); FirebaseRemoteConfigProvider.decorators = [ { type: i0.Injectable, args: [{ providedIn: 'any' },] } ]; /** @nocollapse */ FirebaseRemoteConfigProvider.ctorParameters = () => [ { type: undefined, decorators: [{ type: i0.Inject, args: [FIREBASE_REMOTE_CONFIG_PROVIDER_OPTIONS,] }] }, { type: Object, decorators: [{ type: i0.Inject, args: [i0.PLATFORM_ID,] }] }, { type: i0.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: i0.NgModule, args: [{ providers: [ { provide: ngConfig.CONFIG_PROVIDER, useClass: FirebaseRemoteConfigProvider, multi: true } ] },] } ]; exports.FIREBASE_REMOTE_CONFIG_PROVIDER_OPTIONS = FIREBASE_REMOTE_CONFIG_PROVIDER_OPTIONS; exports.FirebaseRemoteConfigProvider = FirebaseRemoteConfigProvider; exports.FirebaseRemoteConfigProviderModule = FirebaseRemoteConfigProviderModule; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=ng-config-firebase-remote-config.umd.js.map