UNPKG

@tangential/firebase-util

Version:

Utility classes and shared functionality for Tangential services that use Firebase.

1 lines 12.5 kB
{"version":3,"file":"tangential-firebase-util.mjs","sources":["../../../../projects/tangential/firebase-util/src/lib/placeholder.ts","../../../../projects/tangential/firebase-util/src/lib/fire-blanket.ts","../../../../projects/tangential/firebase-util/src/lib/firebase-config.ts","../../../../projects/tangential/firebase-util/src/lib/firebase-provider.ts","../../../../projects/tangential/firebase-util/src/lib/firebase-errors.ts","../../../../projects/tangential/firebase-util/src/public-api.ts","../../../../projects/tangential/firebase-util/src/tangential-firebase-util.ts"],"sourcesContent":["export const Placeholder: any = Symbol('placeholder')\n\n","import {DatabaseReference, Query, DataSnapshot} from '@firebase/database'\nimport { set, push, remove, update, onValue } from 'firebase/database'\nimport {BehaviorSubject, Observable} from 'rxjs'\nimport {filter, first} from 'rxjs/operators'\n\nimport {Placeholder} from './placeholder'\n\nexport type OnRefKey = 'value' | 'child_added' | 'child_removed' | 'child_changed' | 'child_moved'\nexport const OnRefKeys = {\n value: <OnRefKey>'value',\n child_added: <OnRefKey>'child_added',\n child_removed: <OnRefKey>'child_removed',\n child_changed: <OnRefKey>'child_changed',\n child_moved: <OnRefKey>'child_moved',\n}\n\n/**\n * Copy-paste for local use, rather than create a dependency on core.\n */\nconst isObject = function (value: any): boolean {\n return (typeof value === 'object' || value['constructor'] === Object)\n}\n\n/**\n * Prevent typescript casting issues while maintaining/enhancing type safety.\n */\nexport class FireBlanket {\n\n static util = {\n\n clean<T extends object>(obj: T, deep: boolean = true): T {\n const cleanObj: T = <T>{}\n Object.keys(obj).forEach((key) => {\n let value = (obj as any)[key]\n if (FireBlanket.util.isLegalFirebaseKey(key) && FireBlanket.util.isLegalFirebaseValue(value)) {\n (cleanObj as any)[key] = (deep && isObject(value)) ? FireBlanket.util.clean(value) : value\n }\n })\n return cleanObj\n },\n\n removeIllegalKeys<T extends object>(obj: T): T {\n const cleanObj: T = <T>{}\n Object.keys(obj as any).forEach((key) => {\n if (FireBlanket.util.isLegalFirebaseKey(key)) {\n (cleanObj as any)[key] = (obj as any)[key]\n }\n })\n return cleanObj\n },\n\n isLegalFirebaseKey(key: string): boolean {\n return key !== null && key !== undefined && !key.startsWith('$')\n },\n\n isLegalFirebaseValue(value: any): boolean {\n return value !== null && value !== undefined\n },\n\n isFirebaseGeneratedId(key: string): boolean {\n let isKey = false\n // starts with \"-\" will be true for over a decade.\n if (key && key.length === 20 && key.startsWith('-')) {\n isKey = true\n }\n return isKey\n }\n\n }\n\n /**\n * Read the value once and return.\n * @param query\n */\n static value(query: Query): Promise<DataSnapshot> {\n return new Promise<DataSnapshot>((resolve, reject) => {\n onValue(query, (snap: DataSnapshot) => {\n resolve(snap);\n }, {\n onlyOnce: true\n });\n });\n }\n\n static value$(query: Query): Observable<DataSnapshot> {\n const subject = new BehaviorSubject(Placeholder); // this semicolon is required.\n\n /** @todo: ggranum: The unsubscribe is hacky, and won't actually remove the firebase\n * listener unless there is a 'next' element called\n * @maybeBug: Possible memory leak for long-running sessions with many value listeners\n * */\n (subject as any)['_firebaseUnsubscribe'] = onValue(query, (snap: DataSnapshot) => {\n if(subject.closed){\n (subject as any)['_firebaseUnsubscribe']()\n delete (subject as any)['_firebaseUnsubscribe']\n }\n subject.next(snap)\n }, (error: any) => {\n subject.error(error)\n })\n return subject\n }\n\n static awaitValue$(query: Query): Observable<DataSnapshot> {\n return this.value$(query).pipe(filter(v => v !== Placeholder))\n }\n\n static valueOnce$(query: Query): Observable<DataSnapshot> {\n return this.value$(query).pipe(first(v => v !== Placeholder))\n }\n\n static set<T>(ref: DatabaseReference, value: T): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n try {\n set(ref, value).then(() => {}).catch((e: Error) => {\n if (e) {\n reject(e)\n } else {\n resolve()\n }\n })\n } catch (e) {\n reject(e)\n }\n })\n }\n\n static push<T>(ref: DatabaseReference, value: T): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n try {\n push(ref, value).catch((e: Error) => {\n if (e) {\n reject(e)\n } else {\n resolve()\n }\n })\n } catch (e) {\n reject(e)\n }\n })\n }\n\n static update<T extends object>(ref: DatabaseReference, value: T): Promise<void> {\n return update(ref, value )\n }\n\n static remove<T>(ref: DatabaseReference): Promise<void> {\n return remove(ref)\n }\n}\n","import {Injectable} from '@angular/core'\n\n/**\n * @todo: Maybe instantiate this via the config object that we inject?\n * This can't be an interface because of inject, but we never new it up (it's treated as an interface basically)\n */\n@Injectable()\nexport class FirebaseConfig {\n apiKey: string = ''\n authDomain: string = ''\n databaseURL: string = ''\n storageBucket: string = ''\n}\n","import {Injectable} from '@angular/core'\n\nimport {FirebaseApp} from '@firebase/app'\nimport {Database} from '@firebase/database'\nimport {getApp, initializeApp } from \"firebase/app\";\nimport { getDatabase } from 'firebase/database';\n\nimport {FirebaseConfig} from './firebase-config'\n\n/**\n * With the new function route in Firebase 9, this is basically useless. Possibly worse than useless given the complications that\n * injecting multiple providers involve.\n */\n@Injectable()\nexport class FirebaseProvider {\n\n public app: FirebaseApp\n\n constructor(private config: FirebaseConfig) {\n const name:string = 'defaultDb'\n\n if (!config || !config.apiKey) {\n console.log('FirebaseProvider', 'constructor', config)\n throw new Error('FirebaseProvider requires an instance of FirebaseConfig to be set as a provider in your module.')\n }\n try {\n this.app = initializeApp(config, name);\n } catch (e) {\n // re-init happens in unit tests.\n console.log(\"FirebaseProvider', 'Reinitializing firebase - if you're not running unit tests this is bad.\")\n this.app = getApp(name)\n }\n }\n\n /**\n * refactoring stub so we can inline later, hopefully.\n */\n getDatabase(): Database{\n return getDatabase(this.app)\n }\n}\n","export const FirebaseErrors = {\n invalidEmail: 'auth/invalid-email',\n userNotFound: 'auth/user-not-found',\n badPassword: 'auth/wrong-password',\n}\n","/*\n * Public API Surface of firebase-util\n */\nexport * from './lib/fire-blanket'\nexport * from './lib/firebase-config'\nexport * from './lib/firebase-provider'\nexport * from './lib/firebase-errors'\nexport * from './lib/firebase-filters'\nexport * from './lib/placeholder'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.FirebaseConfig"],"mappings":"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"}