@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
JavaScript
(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