diff --git a/.flowconfig b/.flowconfig index 945dfd07..60cc3456 100644 --- a/.flowconfig +++ b/.flowconfig @@ -55,7 +55,6 @@ suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(si suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError -suppress_comment=\\(.\\|\n\\)*\\$FlowBug.* unsafe.enable_getters_and_setters=true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 79b02ec8..946e8ee4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,10 +7,12 @@ First, thank you for considering contributing to react-native-firebase! It's peo We welcome any type of contribution, not only code. You can help with * **QA**: file bug reports, the more details you can give the better (e.g. screenshots with the console open) +* **Docs**: improve reference coverage, add more examples, fix any typos or anything else you can spot. At the top of every page on our docs site you can click the `Edit` pencil to go to that pages markdown file, or view the [Docs Repo](https://github.com/invertase/react-native-firebase-docs) directly * **Marketing**: writing blog posts, howto's, printing stickers, ... * **Community**: presenting the project at meetups, organizing a dedicated meetup for the local community, ... * **Code**: take a look at the [open issues](issues). Even if you can't write code, commenting on them, showing that you care about a given issue matters. It helps us triage them. * **Money**: we welcome financial contributions in full transparency on our [open collective](https://opencollective.com/react-native-firebase). +* **Premium Starter Kits**: purchasing one of our starter kits helps us continue to develop the library and support its ever growing community (and you get something too!). [View Kits](http://invertase.link/get-started-premium) ## Your First Contribution @@ -32,8 +34,7 @@ Anyone can file an expense. If the expense makes sense for the development of th ## Questions -If you have any questions, create an [issue](issue) (protip: do a quick search first to see if someone else didn't ask the same question before!). -You can also reach us at oss@invertase.io +For questions and support please use our [Discord chat](https://discord.gg/C9aK28N) or [Stack Overflow](https://stackoverflow.com/questions/tagged/react-native-firebase). The issue list of this repo is **exclusively** for bug reports. ## Credits diff --git a/README.md b/README.md index 4c74939e..2aa8743e 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ License Backers on Open Collective Sponsors on Open Collective - Chat + Chat Follow on Twitter

diff --git a/ios/RNFirebase/config/RNFirebaseRemoteConfig.m b/ios/RNFirebase/config/RNFirebaseRemoteConfig.m index 0b3cf6e1..fe9c4061 100644 --- a/ios/RNFirebase/config/RNFirebaseRemoteConfig.m +++ b/ios/RNFirebase/config/RNFirebaseRemoteConfig.m @@ -49,7 +49,6 @@ RCT_EXPORT_METHOD(fetch: (RCTPromiseRejectBlock) reject) { [[FIRRemoteConfig remoteConfig] fetchWithCompletionHandler:^(FIRRemoteConfigFetchStatus status, NSError *__nullable error) { if (error) { - RCTLogError(@"\nError: %@", RCTJSErrorFromNSError(error)); reject(convertFIRRemoteConfigFetchStatusToNSString(status), error.localizedDescription, error); } else { resolve(convertFIRRemoteConfigFetchStatusToNSString(status)); @@ -64,7 +63,6 @@ RCT_EXPORT_METHOD(fetchWithExpirationDuration: rejecter:(RCTPromiseRejectBlock)reject) { [[FIRRemoteConfig remoteConfig] fetchWithExpirationDuration:expirationDuration.doubleValue completionHandler:^(FIRRemoteConfigFetchStatus status, NSError *__nullable error) { if (error) { - RCTLogError(@"\nError: %@", RCTJSErrorFromNSError(error)); reject(convertFIRRemoteConfigFetchStatusToNSString(status), error.localizedDescription, error); } else { resolve(convertFIRRemoteConfigFetchStatusToNSString(status)); diff --git a/lib/index.js b/lib/index.js index b31d093b..80b57d44 100644 --- a/lib/index.js +++ b/lib/index.js @@ -3,6 +3,64 @@ */ import firebase from './modules/core/firebase'; +export default firebase; + +/* + * Export App types + */ +export type { default as App } from './modules/core/app'; + +/* + * Export Auth types + */ +export type { + ActionCodeInfo, + ActionCodeSettings, + AdditionalUserInfo, + AuthCredential, + UserCredential, + UserInfo, + UserMetadata, +} from './modules/auth/types'; +export type { + default as ConfirmationResult, +} from './modules/auth/ConfirmationResult'; export type { default as User } from './modules/auth/User'; -export default firebase; +/* + * Export Database types + */ +export type { default as DataSnapshot } from './modules/database/DataSnapshot'; +export type { default as OnDisconnect } from './modules/database/OnDisconnect'; +export type { default as Reference } from './modules/database/Reference'; +export type { default as DataQuery } from './modules/database/Query'; + +/* + * Export Firestore types + */ +export type { + DocumentListenOptions, + QueryListenOptions, + SetOptions, + SnapshotMetadata, +} from './modules/firestore/types'; +export type { + default as CollectionReference, +} from './modules/firestore/CollectionReference'; +export type { + default as DocumentChange, +} from './modules/firestore/DocumentChange'; +export type { + default as DocumentReference, +} from './modules/firestore/DocumentReference'; +export type { + default as DocumentSnapshot, +} from './modules/firestore/DocumentSnapshot'; +export type { default as FieldPath } from './modules/firestore/FieldPath'; +export type { default as FieldValue } from './modules/firestore/FieldValue'; +export type { default as GeoPoint } from './modules/firestore/GeoPoint'; +export type { default as Query } from './modules/firestore/Query'; +export type { + default as QuerySnapshot, +} from './modules/firestore/QuerySnapshot'; +export type { default as WriteBatch } from './modules/firestore/WriteBatch'; diff --git a/lib/modules/admob/index.js b/lib/modules/admob/index.js index 691a35bb..795099a3 100644 --- a/lib/modules/admob/index.js +++ b/lib/modules/admob/index.js @@ -19,7 +19,7 @@ import EventTypes, { RewardedVideoEventTypes, } from './EventTypes'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; type NativeEvent = { adUnit: string, diff --git a/lib/modules/analytics/index.js b/lib/modules/analytics/index.js index 373753d3..94588b93 100644 --- a/lib/modules/analytics/index.js +++ b/lib/modules/analytics/index.js @@ -5,7 +5,7 @@ import ModuleBase from '../../utils/ModuleBase'; import { getNativeModule } from '../../utils/native'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; const AlphaNumericUnderscore = /^[a-zA-Z0-9_]+$/; diff --git a/lib/modules/auth/PhoneAuthListener.js b/lib/modules/auth/PhoneAuthListener.js index 24033318..d85bcace 100644 --- a/lib/modules/auth/PhoneAuthListener.js +++ b/lib/modules/auth/PhoneAuthListener.js @@ -109,7 +109,7 @@ export default class PhoneAuthListener { const type = events[i]; SharedEventEmitter.once( this._internalEvents[type], - // $FlowBug: Flow doesn't support indexable signatures on classes: https://github.com/facebook/flow/issues/1323 + // $FlowExpectedError: Flow doesn't support indexable signatures on classes: https://github.com/facebook/flow/issues/1323 this[`_${type}Handler`].bind(this) ); } diff --git a/lib/modules/auth/User.js b/lib/modules/auth/User.js index cd3b3af6..e509bb94 100644 --- a/lib/modules/auth/User.js +++ b/lib/modules/auth/User.js @@ -11,18 +11,10 @@ import type { AuthCredential, NativeUser, UserCredential, + UserInfo, UserMetadata, } from './types'; -type UserInfo = { - displayName?: string, - email?: string, - phoneNumber?: string, - photoURL?: string, - providerId: string, - uid: string, -}; - type UpdateProfile = { displayName?: string, photoURL?: string, diff --git a/lib/modules/auth/index.js b/lib/modules/auth/index.js index 2b18b9df..e7cbe2ed 100644 --- a/lib/modules/auth/index.js +++ b/lib/modules/auth/index.js @@ -22,26 +22,19 @@ import FacebookAuthProvider from './providers/FacebookAuthProvider'; import PhoneAuthListener from './PhoneAuthListener'; import type { + ActionCodeInfo, ActionCodeSettings, AuthCredential, NativeUser, NativeUserCredential, UserCredential, } from './types'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; type AuthState = { user?: NativeUser, }; -type ActionCodeInfo = { - data: { - email?: string, - fromEmail?: string, - }, - operation: 'PASSWORD_RESET' | 'VERIFY_EMAIL' | 'RECOVER_EMAIL', -}; - const NATIVE_EVENTS = [ 'auth_state_changed', 'auth_id_token_changed', diff --git a/lib/modules/auth/types.js b/lib/modules/auth/types.js index 8f40d619..64655509 100644 --- a/lib/modules/auth/types.js +++ b/lib/modules/auth/types.js @@ -3,6 +3,14 @@ */ import type User from './User'; +export type ActionCodeInfo = { + data: { + email?: string, + fromEmail?: string, + }, + operation: 'PASSWORD_RESET' | 'VERIFY_EMAIL' | 'RECOVER_EMAIL', +}; + export type ActionCodeSettings = { android: { installApp?: boolean, @@ -16,7 +24,7 @@ export type ActionCodeSettings = { url: string, }; -type AdditionalUserInfo = { +export type AdditionalUserInfo = { isNewUser: boolean, profile?: Object, providerId: string, diff --git a/lib/modules/config/index.js b/lib/modules/config/index.js index f6535d6d..9f5136f2 100644 --- a/lib/modules/config/index.js +++ b/lib/modules/config/index.js @@ -6,7 +6,7 @@ import { getLogger } from '../../utils/log'; import ModuleBase from '../../utils/ModuleBase'; import { getNativeModule } from '../../utils/native'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; type NativeValue = { stringValue?: string, @@ -123,7 +123,7 @@ export default class RemoteConfig extends ModuleBase { * "source" : OneOf(remoteConfigSourceRemote|remoteConfigSourceDefault|remoteConfigSourceStatic) * } */ - getValue(key: String) { + getValue(key: string) { return getNativeModule(this) .getValue(key || '') .then(this._nativeValueToJS); @@ -160,7 +160,7 @@ export default class RemoteConfig extends ModuleBase { * @param prefix: The key prefix to look for. If prefix is nil or empty, returns all the keys. * @returns {*|Promise.>} */ - getKeysByPrefix(prefix?: String) { + getKeysByPrefix(prefix?: string) { return getNativeModule(this).getKeysByPrefix(prefix); } @@ -176,7 +176,7 @@ export default class RemoteConfig extends ModuleBase { * Sets default configs from plist for default namespace; * @param resource: The plist file name or resource ID */ - setDefaultsFromResource(resource: String | number) { + setDefaultsFromResource(resource: string | number) { getNativeModule(this).setDefaultsFromResource(resource); } } diff --git a/lib/modules/core/firebase-app.js b/lib/modules/core/app.js similarity index 94% rename from lib/modules/core/firebase-app.js rename to lib/modules/core/app.js index 1f81e6aa..c77ed4b6 100644 --- a/lib/modules/core/firebase-app.js +++ b/lib/modules/core/app.js @@ -116,10 +116,12 @@ export default class App { * @param props */ extendApp(props: Object) { - if (!isObject(props)) + if (!isObject(props)) { throw new Error( INTERNALS.STRINGS.ERROR_MISSING_ARG('Object', 'extendApp') ); + } + const keys = Object.keys(props); for (let i = 0, len = keys.length; i < len; i++) { @@ -129,7 +131,7 @@ export default class App { throw new Error(INTERNALS.STRINGS.ERROR_PROTECTED_PROP(key)); } - // $FlowBug: Flow doesn't support indexable signatures on classes: https://github.com/facebook/flow/issues/1323 + // $FlowExpectedError: Flow doesn't support indexable signatures on classes: https://github.com/facebook/flow/issues/1323 this[key] = props[key]; this._extendedProps[key] = true; } @@ -167,4 +169,13 @@ export default class App { }); }); } + + /** + * toString returns the name of the app. + * + * @return {string} + */ + toString() { + return this._name; + } } diff --git a/lib/modules/core/firebase.js b/lib/modules/core/firebase.js index 13aad29d..90bc69ce 100644 --- a/lib/modules/core/firebase.js +++ b/lib/modules/core/firebase.js @@ -1,12 +1,11 @@ /** - * @providesModule Firebase * @flow */ import { NativeModules } from 'react-native'; import APPS from '../../utils/apps'; import INTERNALS from '../../utils/internals'; -import App from './firebase-app'; +import App from './app'; import VERSION from '../../version'; // module imports diff --git a/lib/modules/crash/index.js b/lib/modules/crash/index.js index 314d910a..e18ec36b 100644 --- a/lib/modules/crash/index.js +++ b/lib/modules/crash/index.js @@ -5,7 +5,7 @@ import ModuleBase from '../../utils/ModuleBase'; import { getNativeModule } from '../../utils/native'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; import type { FirebaseError } from '../../types'; export const MODULE_NAME = 'RNFirebaseCrash'; diff --git a/lib/modules/database/snapshot.js b/lib/modules/database/DataSnapshot.js similarity index 95% rename from lib/modules/database/snapshot.js rename to lib/modules/database/DataSnapshot.js index 572ea85b..31597cbf 100644 --- a/lib/modules/database/snapshot.js +++ b/lib/modules/database/DataSnapshot.js @@ -1,15 +1,15 @@ /** * @flow - * Snapshot representation wrapper + * DataSnapshot representation wrapper */ import { isObject, deepGet, deepExists } from './../../utils'; -import type Reference from './reference'; +import type Reference from './Reference'; /** * @class DataSnapshot * @link https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot */ -export default class Snapshot { +export default class DataSnapshot { ref: Reference; key: string; @@ -50,10 +50,10 @@ export default class Snapshot { * @link https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#forEach * @returns {Snapshot} */ - child(path: string): Snapshot { + child(path: string): DataSnapshot { const value = deepGet(this._value, path); const childRef = this.ref.child(path); - return new Snapshot(childRef, { + return new DataSnapshot(childRef, { value, key: childRef.key, exists: value !== null, diff --git a/lib/modules/database/disconnect.js b/lib/modules/database/OnDisconnect.js similarity index 91% rename from lib/modules/database/disconnect.js rename to lib/modules/database/OnDisconnect.js index 3ec940b6..1662b085 100644 --- a/lib/modules/database/disconnect.js +++ b/lib/modules/database/OnDisconnect.js @@ -1,17 +1,17 @@ /** * @flow - * Disconnect representation wrapper + * OnDisconnect representation wrapper */ import { typeOf } from '../../utils'; import { getNativeModule } from '../../utils/native'; import type Database from './'; -import type Reference from './reference'; +import type Reference from './Reference'; /** * @url https://firebase.google.com/docs/reference/js/firebase.database.OnDisconnect - * @class Disconnect + * @class OmDisconnect */ -export default class Disconnect { +export default class OnDisconnect { _database: Database; ref: Reference; path: string; diff --git a/lib/modules/database/query.js b/lib/modules/database/Query.js similarity index 97% rename from lib/modules/database/query.js rename to lib/modules/database/Query.js index 974dba85..b58388be 100644 --- a/lib/modules/database/query.js +++ b/lib/modules/database/Query.js @@ -5,7 +5,7 @@ import { objectToUniqueId } from '../../utils'; import type { DatabaseModifier } from '../../types'; -import type Reference from './reference'; +import type Reference from './Reference'; // todo doc methods diff --git a/lib/modules/database/reference.js b/lib/modules/database/Reference.js similarity index 96% rename from lib/modules/database/reference.js rename to lib/modules/database/Reference.js index b91e6f13..9702da0e 100644 --- a/lib/modules/database/reference.js +++ b/lib/modules/database/Reference.js @@ -2,9 +2,9 @@ * @flow * Database Reference representation wrapper */ -import Query from './query'; -import Snapshot from './snapshot'; -import Disconnect from './disconnect'; +import Query from './Query'; +import DataSnapshot from './DataSnapshot'; +import OnDisconnect from './OnDisconnect'; import { getLogger } from '../../utils/log'; import { getNativeModule } from '../../utils/native'; import ReferenceBase from '../../utils/ReferenceBase'; @@ -218,7 +218,11 @@ export default class Reference extends ReferenceBase { */ transaction( transactionUpdate: Function, - onComplete: (error: ?Error, committed: boolean, snapshot: ?Snapshot) => *, + onComplete: ( + error: ?Error, + committed: boolean, + snapshot: ?DataSnapshot + ) => *, applyLocally: boolean = false ) { if (!isFunction(transactionUpdate)) { @@ -233,14 +237,14 @@ export default class Reference extends ReferenceBase { if (error) { onComplete(error, committed, null); } else { - onComplete(null, committed, new Snapshot(this, snapshotData)); + onComplete(null, committed, new DataSnapshot(this, snapshotData)); } } if (error) return reject(error); return resolve({ committed, - snapshot: new Snapshot(this, snapshotData), + snapshot: new DataSnapshot(this, snapshotData), }); }; @@ -264,14 +268,14 @@ export default class Reference extends ReferenceBase { */ once( eventName: string = 'value', - successCallback: (snapshot: Object) => void, + successCallback: (snapshot: DataSnapshot) => void, cancelOrContext: (error: FirebaseError) => void, context?: Object ) { return getNativeModule(this._database) .once(this._getRefKey(), this.path, this._query.getModifiers(), eventName) .then(({ snapshot }) => { - const _snapshot = new Snapshot(this, snapshot); + const _snapshot = new DataSnapshot(this, snapshot); if (isFunction(successCallback)) { if (isObject(cancelOrContext)) @@ -313,9 +317,9 @@ export default class Reference extends ReferenceBase { if (isFunction(onComplete)) { return ( promise - // $FlowBug: Reports that onComplete can change to null despite the null check: https://github.com/facebook/flow/issues/1655 + // $FlowExpectedError: Reports that onComplete can change to null despite the null check: https://github.com/facebook/flow/issues/1655 .then(() => onComplete(null, newRef)) - // $FlowBug: Reports that onComplete can change to null despite the null check: https://github.com/facebook/flow/issues/1655 + // $FlowExpectedError: Reports that onComplete can change to null despite the null check: https://github.com/facebook/flow/issues/1655 .catch(error => onComplete(error, null)) ); } @@ -470,10 +474,10 @@ export default class Reference extends ReferenceBase { /** * - * @returns {Disconnect} + * @returns {OnDisconnect} */ - onDisconnect(): Disconnect { - return new Disconnect(this); + onDisconnect(): OnDisconnect { + return new OnDisconnect(this); } /** @@ -691,7 +695,7 @@ export default class Reference extends ReferenceBase { */ on( eventType: string, - callback: Snapshot => any, + callback: DataSnapshot => any, cancelCallbackOrContext?: Object => any | Object, context?: Object ): Function { diff --git a/lib/modules/database/index.js b/lib/modules/database/index.js index c921c565..4967e0e8 100644 --- a/lib/modules/database/index.js +++ b/lib/modules/database/index.js @@ -4,12 +4,12 @@ */ import { NativeModules } from 'react-native'; -import Reference from './reference'; +import Reference from './Reference'; import TransactionHandler from './transaction'; import ModuleBase from '../../utils/ModuleBase'; import { getNativeModule } from '../../utils/native'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; const NATIVE_EVENTS = [ 'database_transaction_event', diff --git a/lib/modules/fabric/crashlytics/index.js b/lib/modules/fabric/crashlytics/index.js index b95b9d2d..6b8a4484 100644 --- a/lib/modules/fabric/crashlytics/index.js +++ b/lib/modules/fabric/crashlytics/index.js @@ -5,7 +5,7 @@ import ModuleBase from '../../../utils/ModuleBase'; import { getNativeModule } from '../../../utils/native'; -import type App from '../../core/firebase-app'; +import type App from '../../core/app'; export const MODULE_NAME = 'RNFirebaseCrashlytics'; export const NAMESPACE = 'crashlytics'; diff --git a/lib/modules/firestore/CollectionReference.js b/lib/modules/firestore/CollectionReference.js index 19807680..57e6d2a3 100644 --- a/lib/modules/firestore/CollectionReference.js +++ b/lib/modules/firestore/CollectionReference.js @@ -8,17 +8,13 @@ import { firestoreAutoId } from '../../utils'; import type Firestore from './'; import type { - FirestoreQueryDirection, - FirestoreQueryOperator, -} from '../../types'; + QueryDirection, + QueryListenOptions, + QueryOperator, +} from './types'; import type FieldPath from './FieldPath'; import type Path from './Path'; -import type { - Observer, - ObserverOnError, - ObserverOnNext, - QueryListenOptions, -} from './Query'; +import type { Observer, ObserverOnError, ObserverOnNext } from './Query'; import type QuerySnapshot from './QuerySnapshot'; /** @@ -95,10 +91,7 @@ export default class CollectionReference { ); } - orderBy( - fieldPath: string | FieldPath, - directionStr?: FirestoreQueryDirection - ): Query { + orderBy(fieldPath: string | FieldPath, directionStr?: QueryDirection): Query { return this._query.orderBy(fieldPath, directionStr); } @@ -110,7 +103,7 @@ export default class CollectionReference { return this._query.startAt(snapshotOrVarArgs); } - where(fieldPath: string, opStr: FirestoreQueryOperator, value: any): Query { + where(fieldPath: string, opStr: QueryOperator, value: any): Query { return this._query.where(fieldPath, opStr, value); } } diff --git a/lib/modules/firestore/DocumentChange.js b/lib/modules/firestore/DocumentChange.js index c0656d0a..6adf9577 100644 --- a/lib/modules/firestore/DocumentChange.js +++ b/lib/modules/firestore/DocumentChange.js @@ -5,7 +5,7 @@ import DocumentSnapshot from './DocumentSnapshot'; import type Firestore from './'; -import type { FirestoreNativeDocumentChange } from '../../types'; +import type { NativeDocumentChange } from './types'; /** * @class DocumentChange @@ -16,7 +16,7 @@ export default class DocumentChange { _oldIndex: number; _type: string; - constructor(firestore: Firestore, nativeData: FirestoreNativeDocumentChange) { + constructor(firestore: Firestore, nativeData: NativeDocumentChange) { this._document = new DocumentSnapshot(firestore, nativeData.document); this._newIndex = nativeData.newIndex; this._oldIndex = nativeData.oldIndex; diff --git a/lib/modules/firestore/DocumentReference.js b/lib/modules/firestore/DocumentReference.js index 9fb9ac9c..91772833 100644 --- a/lib/modules/firestore/DocumentReference.js +++ b/lib/modules/firestore/DocumentReference.js @@ -14,15 +14,12 @@ import { getNativeModule } from '../../utils/native'; import type Firestore from './'; import type { - FirestoreNativeDocumentSnapshot, - FirestoreWriteOptions, -} from '../../types'; + DocumentListenOptions, + NativeDocumentSnapshot, + SetOptions, +} from './types'; import type Path from './Path'; -type DocumentListenOptions = { - includeMetadataChanges: boolean, -}; - type ObserverOnError = Object => void; type ObserverOnNext = DocumentSnapshot => void; @@ -99,7 +96,7 @@ export default class DocumentReference { 'DocumentReference.onSnapshot failed: Second argument must be a valid function.' ); } - // $FlowBug: Not coping with the overloaded method signature + // $FlowExpectedError: Not coping with the overloaded method signature observer = { next: optionsOrObserverOrOnNext, error: observerOrOnNextOrOnError, @@ -119,7 +116,7 @@ export default class DocumentReference { 'DocumentReference.onSnapshot failed: Observer.error must be a valid function.' ); } - // $FlowBug: Not coping with the overloaded method signature + // $FlowExpectedError: Not coping with the overloaded method signature observer = { next: optionsOrObserverOrOnNext.next, error: optionsOrObserverOrOnNext.error, @@ -143,7 +140,7 @@ export default class DocumentReference { 'DocumentReference.onSnapshot failed: Third argument must be a valid function.' ); } - // $FlowBug: Not coping with the overloaded method signature + // $FlowExpectedError: Not coping with the overloaded method signature observer = { next: observerOrOnNextOrOnError, error: onError, @@ -189,9 +186,7 @@ export default class DocumentReference { } const listenerId = firestoreAutoId(); - const listener = ( - nativeDocumentSnapshot: FirestoreNativeDocumentSnapshot - ) => { + const listener = (nativeDocumentSnapshot: NativeDocumentSnapshot) => { const documentSnapshot = new DocumentSnapshot( this.firestore, nativeDocumentSnapshot @@ -227,12 +222,12 @@ export default class DocumentReference { return this._offDocumentSnapshot.bind(this, listenerId, listener); } - set(data: Object, writeOptions?: FirestoreWriteOptions): Promise { + set(data: Object, options?: SetOptions): Promise { const nativeData = buildNativeMap(data); return getNativeModule(this._firestore).documentSet( this.path, nativeData, - writeOptions + options ); } diff --git a/lib/modules/firestore/DocumentSnapshot.js b/lib/modules/firestore/DocumentSnapshot.js index 691c82c4..23e8ef10 100644 --- a/lib/modules/firestore/DocumentSnapshot.js +++ b/lib/modules/firestore/DocumentSnapshot.js @@ -9,10 +9,7 @@ import { isObject } from '../../utils'; import { parseNativeMap } from './utils/serialize'; import type Firestore from './'; -import type { - FirestoreNativeDocumentSnapshot, - FirestoreSnapshotMetadata, -} from '../../types'; +import type { NativeDocumentSnapshot, SnapshotMetadata } from './types'; const extractFieldPathData = (data: Object | void, segments: string[]): any => { if (!data || !isObject(data)) { @@ -30,13 +27,10 @@ const extractFieldPathData = (data: Object | void, segments: string[]): any => { */ export default class DocumentSnapshot { _data: Object | void; - _metadata: FirestoreSnapshotMetadata; + _metadata: SnapshotMetadata; _ref: DocumentReference; - constructor( - firestore: Firestore, - nativeData: FirestoreNativeDocumentSnapshot - ) { + constructor(firestore: Firestore, nativeData: NativeDocumentSnapshot) { this._data = parseNativeMap(firestore, nativeData.data); this._metadata = nativeData.metadata; this._ref = new DocumentReference( @@ -53,7 +47,7 @@ export default class DocumentSnapshot { return this._ref.id; } - get metadata(): FirestoreSnapshotMetadata { + get metadata(): SnapshotMetadata { return this._metadata; } diff --git a/lib/modules/firestore/Query.js b/lib/modules/firestore/Query.js index 176a1dcc..270b87e2 100644 --- a/lib/modules/firestore/Query.js +++ b/lib/modules/firestore/Query.js @@ -12,20 +12,21 @@ import { firestoreAutoId, isFunction, isObject } from '../../utils'; import { getNativeModule } from '../../utils/native'; import type Firestore from './'; -import type { - FirestoreQueryDirection, - FirestoreQueryOperator, -} from '../../types'; import type Path from './Path'; +import type { + QueryDirection, + QueryOperator, + QueryListenOptions, +} from './types'; -const DIRECTIONS: { [FirestoreQueryDirection]: string } = { +const DIRECTIONS: { [QueryDirection]: string } = { ASC: 'ASCENDING', asc: 'ASCENDING', DESC: 'DESCENDING', desc: 'DESCENDING', }; -const OPERATORS: { [FirestoreQueryOperator]: string } = { +const OPERATORS: { [QueryOperator]: string } = { '=': 'EQUAL', '==': 'EQUAL', '>': 'GREATER_THAN', @@ -58,11 +59,6 @@ type QueryOptions = { startAt?: any[], }; -export type QueryListenOptions = {| - includeDocumentMetadataChanges: boolean, - includeQueryMetadataChanges: boolean, -|}; - export type ObserverOnError = Object => void; export type ObserverOnNext = QuerySnapshot => void; @@ -187,7 +183,7 @@ export default class Query { 'Query.onSnapshot failed: Second argument must be a valid function.' ); } - // $FlowBug: Not coping with the overloaded method signature + // $FlowExpectedError: Not coping with the overloaded method signature observer = { next: optionsOrObserverOrOnNext, error: observerOrOnNextOrOnError, @@ -207,7 +203,7 @@ export default class Query { 'Query.onSnapshot failed: Observer.error must be a valid function.' ); } - // $FlowBug: Not coping with the overloaded method signature + // $FlowExpectedError: Not coping with the overloaded method signature observer = { next: optionsOrObserverOrOnNext.next, error: optionsOrObserverOrOnNext.error, @@ -235,7 +231,7 @@ export default class Query { 'Query.onSnapshot failed: Third argument must be a valid function.' ); } - // $FlowBug: Not coping with the overloaded method signature + // $FlowExpectedError: Not coping with the overloaded method signature observer = { next: observerOrOnNextOrOnError, error: onError, @@ -320,7 +316,7 @@ export default class Query { orderBy( fieldPath: string | FieldPath, - directionStr?: FirestoreQueryDirection = 'asc' + directionStr?: QueryDirection = 'asc' ): Query { // TODO: Validation // validate.isFieldPath('fieldPath', fieldPath); @@ -379,7 +375,7 @@ export default class Query { where( fieldPath: string | FieldPath, - opStr: FirestoreQueryOperator, + opStr: QueryOperator, value: any ): Query { // TODO: Validation diff --git a/lib/modules/firestore/QuerySnapshot.js b/lib/modules/firestore/QuerySnapshot.js index 3ff070db..d7748cf8 100644 --- a/lib/modules/firestore/QuerySnapshot.js +++ b/lib/modules/firestore/QuerySnapshot.js @@ -7,16 +7,16 @@ import DocumentSnapshot from './DocumentSnapshot'; import type Firestore from './'; import type { - FirestoreNativeDocumentChange, - FirestoreNativeDocumentSnapshot, - FirestoreSnapshotMetadata, -} from '../../types'; + NativeDocumentChange, + NativeDocumentSnapshot, + SnapshotMetadata, +} from './types'; import type Query from './Query'; -type QuerySnapshotNativeData = { - changes: FirestoreNativeDocumentChange[], - documents: FirestoreNativeDocumentSnapshot[], - metadata: FirestoreSnapshotMetadata, +type NativeQuerySnapshot = { + changes: NativeDocumentChange[], + documents: NativeDocumentSnapshot[], + metadata: SnapshotMetadata, }; /** @@ -25,13 +25,13 @@ type QuerySnapshotNativeData = { export default class QuerySnapshot { _changes: DocumentChange[]; _docs: DocumentSnapshot[]; - _metadata: FirestoreSnapshotMetadata; + _metadata: SnapshotMetadata; _query: Query; constructor( firestore: Firestore, query: Query, - nativeData: QuerySnapshotNativeData + nativeData: NativeQuerySnapshot ) { this._changes = nativeData.changes.map( change => new DocumentChange(firestore, change) @@ -55,7 +55,7 @@ export default class QuerySnapshot { return this._docs.length === 0; } - get metadata(): FirestoreSnapshotMetadata { + get metadata(): SnapshotMetadata { return this._metadata; } diff --git a/lib/modules/firestore/WriteBatch.js b/lib/modules/firestore/WriteBatch.js index afb3dc47..fe4f15a9 100644 --- a/lib/modules/firestore/WriteBatch.js +++ b/lib/modules/firestore/WriteBatch.js @@ -10,7 +10,7 @@ import { getNativeModule } from '../../utils/native'; import type DocumentReference from './DocumentReference'; import type Firestore from './'; -import type { FirestoreWriteOptions } from '../../types'; +import type { SetOptions } from './types'; type DocumentWrite = { data?: Object, @@ -47,19 +47,15 @@ export default class WriteBatch { return this; } - set( - docRef: DocumentReference, - data: Object, - writeOptions?: FirestoreWriteOptions - ) { + set(docRef: DocumentReference, data: Object, options?: SetOptions) { // TODO: Validation // validate.isDocumentReference('docRef', docRef); // validate.isDocument('data', data); - // validate.isOptionalPrecondition('writeOptions', writeOptions); + // validate.isOptionalPrecondition('options', writeOptions); const nativeData = buildNativeMap(data); this._writes.push({ data: nativeData, - options: writeOptions, + options, path: docRef.path, type: 'SET', }); diff --git a/lib/modules/firestore/index.js b/lib/modules/firestore/index.js index cd6a1947..35ee7047 100644 --- a/lib/modules/firestore/index.js +++ b/lib/modules/firestore/index.js @@ -18,7 +18,7 @@ import Transaction from './Transaction'; import INTERNALS from '../../utils/internals'; import type DocumentSnapshot from './DocumentSnapshot'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; import type QuerySnapshot from './QuerySnapshot'; type CollectionSyncEvent = { diff --git a/lib/modules/firestore/types.js b/lib/modules/firestore/types.js new file mode 100644 index 00000000..6ed935dc --- /dev/null +++ b/lib/modules/firestore/types.js @@ -0,0 +1,54 @@ +/* + * @flow + */ + +export type DocumentListenOptions = { + includeMetadataChanges: boolean, +}; + +export type QueryDirection = 'DESC' | 'desc' | 'ASC' | 'asc'; + +export type QueryListenOptions = {| + includeDocumentMetadataChanges: boolean, + includeQueryMetadataChanges: boolean, +|}; + +export type QueryOperator = '<' | '<=' | '=' | '==' | '>' | '>='; + +export type SetOptions = { + merge?: boolean, +}; + +export type SnapshotMetadata = { + fromCache: boolean, + hasPendingWrites: boolean, +}; + +export type NativeDocumentChange = { + document: NativeDocumentSnapshot, + newIndex: number, + oldIndex: number, + type: string, +}; + +export type NativeDocumentSnapshot = { + data: { [string]: NativeTypeMap }, + metadata: SnapshotMetadata, + path: string, +}; + +export type NativeTypeMap = { + type: + | 'array' + | 'boolean' + | 'date' + | 'documentid' + | 'fieldvalue' + | 'geopoint' + | 'null' + | 'number' + | 'object' + | 'reference' + | 'string', + value: any, +}; diff --git a/lib/modules/firestore/utils/serialize.js b/lib/modules/firestore/utils/serialize.js index 2aacbe7b..8ea8a5d7 100644 --- a/lib/modules/firestore/utils/serialize.js +++ b/lib/modules/firestore/utils/serialize.js @@ -13,7 +13,7 @@ import Path from '../Path'; import { typeOf } from '../../../utils'; import type Firestore from '../'; -import type { FirestoreTypeMap } from '../../../types'; +import type { NativeTypeMap } from '../types'; /* * Functions that build up the data needed to represent @@ -21,9 +21,7 @@ import type { FirestoreTypeMap } from '../../../types'; * for transmission to the native side */ -export const buildNativeMap = ( - data: Object -): { [string]: FirestoreTypeMap } => { +export const buildNativeMap = (data: Object): { [string]: NativeTypeMap } => { const nativeData = {}; if (data) { Object.keys(data).forEach(key => { @@ -36,7 +34,7 @@ export const buildNativeMap = ( return nativeData; }; -export const buildNativeArray = (array: Object[]): FirestoreTypeMap[] => { +export const buildNativeArray = (array: Object[]): NativeTypeMap[] => { const nativeArray = []; if (array) { array.forEach(value => { @@ -49,7 +47,7 @@ export const buildNativeArray = (array: Object[]): FirestoreTypeMap[] => { return nativeArray; }; -export const buildTypeMap = (value: any): FirestoreTypeMap | null => { +export const buildTypeMap = (value: any): NativeTypeMap | null => { const type = typeOf(value); if (value === null || value === undefined || Number.isNaN(value)) { return { @@ -117,7 +115,7 @@ export const buildTypeMap = (value: any): FirestoreTypeMap | null => { export const parseNativeMap = ( firestore: Firestore, - nativeData: { [string]: FirestoreTypeMap } + nativeData: { [string]: NativeTypeMap } ): Object | void => { let data; if (nativeData) { @@ -131,7 +129,7 @@ export const parseNativeMap = ( const parseNativeArray = ( firestore: Firestore, - nativeArray: FirestoreTypeMap[] + nativeArray: NativeTypeMap[] ): any[] => { const array = []; if (nativeArray) { @@ -142,7 +140,7 @@ const parseNativeArray = ( return array; }; -const parseTypeMap = (firestore: Firestore, typeMap: FirestoreTypeMap): any => { +const parseTypeMap = (firestore: Firestore, typeMap: NativeTypeMap): any => { const { type, value } = typeMap; if (type === 'null') { return null; diff --git a/lib/modules/links/index.js b/lib/modules/links/index.js index ae475204..28c31879 100644 --- a/lib/modules/links/index.js +++ b/lib/modules/links/index.js @@ -7,7 +7,7 @@ import ModuleBase from '../../utils/ModuleBase'; import { areObjectKeysContainedInOther, isObject, isString } from '../../utils'; import { getNativeModule } from '../../utils/native'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; const EVENT_TYPE = { Link: 'dynamic_link_received', diff --git a/lib/modules/messaging/index.js b/lib/modules/messaging/index.js index 4030c5ba..fee50492 100644 --- a/lib/modules/messaging/index.js +++ b/lib/modules/messaging/index.js @@ -8,7 +8,7 @@ import ModuleBase from '../../utils/ModuleBase'; import RemoteMessage from './RemoteMessage'; import { getNativeModule } from '../../utils/native'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; const EVENT_TYPE = { RefreshToken: 'messaging_token_refreshed', diff --git a/lib/modules/perf/index.js b/lib/modules/perf/index.js index 8b0eac38..e394d370 100644 --- a/lib/modules/perf/index.js +++ b/lib/modules/perf/index.js @@ -6,7 +6,7 @@ import Trace from './Trace'; import ModuleBase from '../../utils/ModuleBase'; import { getNativeModule } from '../../utils/native'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; export const MODULE_NAME = 'RNFirebasePerformance'; export const NAMESPACE = 'perf'; diff --git a/lib/modules/storage/index.js b/lib/modules/storage/index.js index f2fce5f2..3803feb9 100644 --- a/lib/modules/storage/index.js +++ b/lib/modules/storage/index.js @@ -10,7 +10,7 @@ import { getLogger } from '../../utils/log'; import ModuleBase from '../../utils/ModuleBase'; import { getNativeModule } from '../../utils/native'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; const FirebaseStorage = NativeModules.RNFirebaseStorage; diff --git a/lib/modules/storage/task.js b/lib/modules/storage/task.js index 95b0605f..0fdc6329 100644 --- a/lib/modules/storage/task.js +++ b/lib/modules/storage/task.js @@ -92,7 +92,7 @@ export default class StorageTask { if (!isFunction(f)) return null; return error => { const _error = new Error(error.message); - // $FlowFixMe + // $FlowExpectedError _error.code = error.code; return f && f(_error); }; diff --git a/lib/modules/utils/index.js b/lib/modules/utils/index.js index f42fbf94..7215f2b1 100644 --- a/lib/modules/utils/index.js +++ b/lib/modules/utils/index.js @@ -3,7 +3,7 @@ import { NativeModules } from 'react-native'; import INTERNALS from '../../utils/internals'; import { isIOS } from '../../utils'; import ModuleBase from '../../utils/ModuleBase'; -import type App from '../core/firebase-app'; +import type App from '../core/app'; const FirebaseCoreModule = NativeModules.RNFirebase; diff --git a/lib/types/index.js b/lib/types/index.js index ac1dc42f..dd54f999 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -162,47 +162,6 @@ export type FirestoreModule = { nativeModuleExists: boolean, } & FirestoreStatics; -export type FirestoreNativeDocumentChange = { - document: FirestoreNativeDocumentSnapshot, - newIndex: number, - oldIndex: number, - type: string, -}; - -export type FirestoreNativeDocumentSnapshot = { - data: { [string]: FirestoreTypeMap }, - metadata: FirestoreSnapshotMetadata, - path: string, -}; - -export type FirestoreSnapshotMetadata = { - fromCache: boolean, - hasPendingWrites: boolean, -}; - -export type FirestoreQueryDirection = 'DESC' | 'desc' | 'ASC' | 'asc'; -export type FirestoreQueryOperator = '<' | '<=' | '=' | '==' | '>' | '>='; - -export type FirestoreTypeMap = { - type: - | 'array' - | 'boolean' - | 'date' - | 'documentid' - | 'fieldvalue' - | 'geopoint' - | 'null' - | 'number' - | 'object' - | 'reference' - | 'string', - value: any, -}; - -export type FirestoreWriteOptions = { - merge?: boolean, -}; - /* Links types */ export type LinksModule = { diff --git a/lib/utils/ModuleBase.js b/lib/utils/ModuleBase.js index 8b68c7fd..83dd5f48 100644 --- a/lib/utils/ModuleBase.js +++ b/lib/utils/ModuleBase.js @@ -4,7 +4,7 @@ import { initialiseLogger } from './log'; import { initialiseNativeModule } from './native'; -import type App from '../modules/core/firebase-app'; +import type App from '../modules/core/app'; import type { FirebaseModuleConfig, FirebaseNamespace } from '../types'; export default class ModuleBase { diff --git a/lib/utils/SyncTree.js b/lib/utils/SyncTree.js index 17de49e3..7c72b7b6 100644 --- a/lib/utils/SyncTree.js +++ b/lib/utils/SyncTree.js @@ -4,11 +4,11 @@ import { NativeEventEmitter, NativeModules } from 'react-native'; import { SharedEventEmitter } from './events'; -import DatabaseSnapshot from '../modules/database/snapshot'; -import DatabaseReference from '../modules/database/reference'; +import DataSnapshot from '../modules/database/DataSnapshot'; +import DatabaseReference from '../modules/database/Reference'; import { isString, nativeToJSError } from '../utils'; -type Listener = DatabaseSnapshot => any; +type Listener = DataSnapshot => any; type Registration = { key: string, @@ -83,7 +83,7 @@ class SyncTree { // forward on to users .on(successCallback <-- listener return SharedEventEmitter.emit( eventRegistrationKey, - new DatabaseSnapshot(registration.ref, snapshot), + new DataSnapshot(registration.ref, snapshot), previousChildName ); } diff --git a/lib/utils/apps.js b/lib/utils/apps.js index 7ff37b34..ac6f84c9 100644 --- a/lib/utils/apps.js +++ b/lib/utils/apps.js @@ -2,7 +2,7 @@ * @flow */ import { NativeModules } from 'react-native'; -import App from '../modules/core/firebase-app'; +import App from '../modules/core/app'; import INTERNALS from './internals'; import { isAndroid, isObject, isString } from './'; @@ -32,13 +32,14 @@ export default { }, apps(): Array { - // $FlowBug: Object.values always returns mixed type: https://github.com/facebook/flow/issues/2221 + // $FlowExpectedError: Object.values always returns mixed type: https://github.com/facebook/flow/issues/2221 return Object.values(APPS); }, /** * - * @param statics + * @param app + * @param namespace * @param InstanceClass * @return {function()} * @private @@ -152,8 +153,9 @@ export default { /** * + * @param namespace * @param statics - * @param InstanceClass + * @param moduleName * @return {function(App=)} */ moduleAndStatics( @@ -174,7 +176,7 @@ export default { if (namespace === 'crashlytics') { return _app.fabric[namespace](); } - // $FlowBug: Flow doesn't support indexable signatures on classes: https://github.com/facebook/flow/issues/1323 + // $FlowExpectedError: Flow doesn't support indexable signatures on classes: https://github.com/facebook/flow/issues/1323 const module = _app[namespace]; return module(); }; diff --git a/lib/utils/emitter/EventEmitter.js b/lib/utils/emitter/EventEmitter.js index 4c805daf..96487b1e 100644 --- a/lib/utils/emitter/EventEmitter.js +++ b/lib/utils/emitter/EventEmitter.js @@ -201,7 +201,7 @@ class EventEmitter { * }); // removes the listener if already registered * */ - removeListener(eventType: String, listener) { + removeListener(eventType: string, listener) { const subscriptions: ?[EmitterSubscription] = (this._subscriber.getSubscriptionsForType(eventType): any); if (subscriptions) { for (let i = 0, l = subscriptions.length; i < l; i++) { diff --git a/lib/utils/index.js b/lib/utils/index.js index 5ff9ba85..d832503c 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -282,7 +282,7 @@ export function typeOf(value: any): string { // * @param string // * @return {string} // */ -// export function capitalizeFirstLetter(string: String) { +// export function capitalizeFirstLetter(string: string) { // return `${string.charAt(0).toUpperCase()}${string.slice(1)}`; // } diff --git a/lib/utils/internals.js b/lib/utils/internals.js index 05e611f7..de46d40a 100644 --- a/lib/utils/internals.js +++ b/lib/utils/internals.js @@ -21,35 +21,35 @@ const GRADLE_DEPS = { }; const PLAY_SERVICES_CODES = { - // $FlowBug: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 + // $FlowExpectedError: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 1: { code: 'SERVICE_MISSING', message: 'Google Play services is missing on this device.', }, - // $FlowBug: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 + // $FlowExpectedError: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 2: { code: 'SERVICE_VERSION_UPDATE_REQUIRED', message: 'The installed version of Google Play services on this device is out of date.', }, - // $FlowBug: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 + // $FlowExpectedError: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 3: { code: 'SERVICE_DISABLED', message: 'The installed version of Google Play services has been disabled on this device.', }, - // $FlowBug: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 + // $FlowExpectedError: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 9: { code: 'SERVICE_INVALID', message: 'The version of the Google Play services installed on this device is not authentic.', }, - // $FlowBug: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 + // $FlowExpectedError: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 18: { code: 'SERVICE_UPDATING', message: 'Google Play services is currently being updated on this device.', }, - // $FlowBug: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 + // $FlowExpectedError: Doesn't like numerical object keys: https://github.com/facebook/flow/issues/380 19: { code: 'SERVICE_MISSING_PERMISSION', message: diff --git a/package-lock.json b/package-lock.json index 4e75de32..e3763c91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "react-native-firebase", - "version": "3.2.4", + "version": "3.2.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 84184cb9..24966bab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-firebase", - "version": "3.2.4", + "version": "3.2.7", "author": "Invertase (http://invertase.io)", "description": "A well tested, feature rich Firebase implementation for React Native, supporting iOS & Android. Individual module support for Admob, Analytics, Auth, Crash Reporting, Cloud Firestore, Database, Dynamic Links, Messaging (FCM), Remote Config, Storage and Performance.", "main": "dist/index.js", @@ -35,7 +35,7 @@ "unmockedModulePathPatterns": ["./node_modules/react", "./node_modules/react-native", "./node_modules/react-native-mock", "./node_modules/react-addons-test-utils"] }, "license": "APACHE-2.0", - "keywords": ["react", "admob", "auth", "config", "digits", "phone-auth", "sms", "firestore", "cloud-firestore", "datastore", "remote-config", "transactions", "react-native", "react-native-firebase", "firebase", "fcm", "apn", "gcm", "analytics", "messaging", "database", "android", "ios", "crash", "firestack", "performance", "firestore", "dynamic-links", "crashlytics"], + "keywords": ["react", "admob", "auth", "config", "digits", "fabric", "phone-auth", "sms", "firestore", "cloud-firestore", "datastore", "remote-config", "transactions", "react-native", "react-native-firebase", "firebase", "fcm", "apn", "gcm", "analytics", "messaging", "database", "android", "ios", "crash", "firestack", "performance", "firestore", "dynamic-links", "crashlytics"], "peerDependencies": { "react": "*", "react-native": ">= 0.48.0", diff --git a/tests/src/tests/core/coreTests.js b/tests/src/tests/core/coreTests.js index c7990982..6d34a374 100644 --- a/tests/src/tests/core/coreTests.js +++ b/tests/src/tests/core/coreTests.js @@ -1,7 +1,7 @@ import { Platform } from 'react-native'; import should from 'should'; -import RNFirebase from './../../../firebase'; +import firebase from './../../../firebase'; const androidTestConfig = { // firebase android sdk completely ignores client id @@ -33,52 +33,47 @@ function rand(from = 1, to = 9999) { } function coreTests({ describe, it }) { - describe('Core', () => { + describe('Firebase', () => { it('it should create js apps for natively initialized apps', () => { - should.equal(RNFirebase.app()._nativeInitialized, true); + should.equal(firebase.app()._nativeInitialized, true); return Promise.resolve(); }); it('natively initialized apps should have options available in js', () => { should.equal( - RNFirebase.app().options.apiKey, + firebase.app().options.apiKey, Platform.OS === 'ios' ? iosTestConfig.apiKey : androidTestConfig.apiKey ); should.equal( - RNFirebase.app().options.appId, + firebase.app().options.appId, Platform.OS === 'ios' ? iosTestConfig.appId : androidTestConfig.appId ); should.equal( - RNFirebase.app().options.databaseURL, + firebase.app().options.databaseURL, iosTestConfig.databaseURL ); should.equal( - RNFirebase.app().options.messagingSenderId, + firebase.app().options.messagingSenderId, iosTestConfig.messagingSenderId ); - should.equal(RNFirebase.app().options.projectId, iosTestConfig.projectId); + should.equal(firebase.app().options.projectId, iosTestConfig.projectId); should.equal( - RNFirebase.app().options.storageBucket, + firebase.app().options.storageBucket, iosTestConfig.storageBucket ); return Promise.resolve(); }); it('it should resolve onReady for natively initialized apps', () => - RNFirebase.app().onReady()); - - it('it should provide an array of apps', () => { - should.equal(!!RNFirebase.apps.length, true); - should.equal(RNFirebase.apps.includes(RNFirebase.app('[DEFAULT]')), true); - return Promise.resolve(); - }); + firebase.app().onReady()); it('it should initialize dynamic apps', () => { const name = `testscoreapp${rand()}`; - return RNFirebase.initializeApp( - Platform.OS === 'ios' ? iosTestConfig : androidTestConfig, - name - ) + return firebase + .initializeApp( + Platform.OS === 'ios' ? iosTestConfig : androidTestConfig, + name + ) .onReady() .then(newApp => { newApp.name.should.equal(name.toUpperCase()); @@ -90,6 +85,52 @@ function coreTests({ describe, it }) { return Promise.resolve(); }); }); + + it('SDK_VERSION should return a string version', () => { + firebase.SDK_VERSION.should.be.a.String(); + }); + }); + + describe('App', () => { + it('apps should provide an array of apps', () => { + should.equal(!!firebase.apps.length, true); + should.equal(firebase.apps.includes(firebase.app('[DEFAULT]')), true); + return Promise.resolve(); + }); + + it('delete is unsupported', () => { + (() => { + firebase.app().delete(); + }).should.throw( + 'app.delete() is unsupported by the native Firebase SDKs.' + ); + }); + + it('extendApp should error if an object is not supplied', () => { + (() => { + firebase.app().extendApp('string'); + }).should.throw( + "Missing required argument of type 'Object' for method 'extendApp()'." + ); + }); + + it('extendApp should error if a protected property is supplied', () => { + (() => { + firebase.app().extendApp({ + database: {}, + }); + }).should.throw( + "Property 'database' is protected and can not be overridden by extendApp." + ); + }); + + it('extendApp should provide additional functionality', () => { + const extension = {}; + firebase.app().extendApp({ + extension, + }); + firebase.app().extension.should.equal(extension); + }); }); }