From 19cec2cd8b2b8005e919451234b5895861597f5f Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Mon, 4 Dec 2017 12:07:41 +0000 Subject: [PATCH] Better flow config to remove unrelated errors --- .flowconfig | 121 +++++++++---------------- lib/modules/config/index.js | 23 ++++- lib/modules/crash/index.js | 3 +- lib/modules/database/disconnect.js | 10 +- lib/modules/database/index.js | 20 ++-- lib/modules/database/query.js | 9 +- lib/modules/database/reference.js | 41 ++++----- lib/modules/database/snapshot.js | 7 +- lib/modules/database/transaction.js | 7 +- lib/modules/links/index.js | 14 ++- lib/modules/messaging/RemoteMessage.js | 12 ++- lib/modules/messaging/index.js | 52 ++++++----- lib/modules/perf/Trace.js | 18 +++- lib/modules/perf/index.js | 17 ++-- lib/modules/storage/index.js | 31 ++++--- lib/modules/storage/reference.js | 32 ++++--- lib/modules/storage/task.js | 14 ++- lib/types/index.js | 1 + 18 files changed, 234 insertions(+), 198 deletions(-) diff --git a/.flowconfig b/.flowconfig index b8353a70..96622d4e 100644 --- a/.flowconfig +++ b/.flowconfig @@ -1,77 +1,37 @@ [ignore] +; We fork some components by platform +.*/*[.]android.js +; Ignore "BUCK" generated dirs +.*/node_modules/react-native/\.buckd/ -# Some modules have their own node_modules with overlap -.*/node_modules/node-haste/.* +; Ignore unexpected extra "@providesModule" +.*/node_modules/.*/node_modules/fbjs/.* +; Ignore duplicate module providers +; For RN Apps installed via npm, "Libraries" folder is inside +; "node_modules/react-native" but in the source repo it is in the root +.*/Libraries/react-native/React.js + +; Ignore polyfills +.*/Libraries/polyfills/.* # React Native problems -.*/node_modules/react-native/Libraries/Animated/src/AnimatedInterpolation.js -.*/node_modules/react-native/Libraries/Animated/src/Interpolation.js -.*/node_modules/react-native/Libraries/BugReporting/dumpReactTree.js -.*/node_modules/react-native/Libraries/CustomComponents/NavigationExperimental/NavigationHeader.js -.*/node_modules/react-native/Libraries/CustomComponents/NavigationExperimental/NavigationPagerStyleInterpolater.js -.*/node_modules/react-native/Libraries/Experimental/WindowedListView.js -.*/node_modules/react-native/Libraries/Image/Image.io.js -.*/node_modules/react-native/Libraries/NavigationExperimental/NavigationExperimental.js -.*/node_modules/react-native/Libraries/NavigationExperimental/NavigationHeaderStyleInterpolator.js -.*/node_modules/react-native/Libraries/Network/FormData.js -.*/node_modules/react-native/Libraries/ReactIOS/YellowBox.js - - - -# Ignore react and fbjs where there are overlaps, but don't ignore -# anything that react-native relies on -.*/node_modules/fbjs/lib/Map.js -.*/node_modules/fbjs/lib/ErrorUtils.js - -# Flow has a built-in definition for the 'react' module which we prefer to use -# over the currently-untyped source -.*/node_modules/react/react.js -.*/node_modules/react/lib/React.js -.*/node_modules/react/lib/ReactDOM.js - -.*/__mocks__/.* -.*/__tests__/.* - -.*/commoner/test/source/widget/share.js - -# Ignore commoner tests -.*/node_modules/commoner/test/.* - -# See https://github.com/facebook/flow/issues/442 -.*/react-tools/node_modules/commoner/lib/reader.js - -# Ignore jest -.*/node_modules/jest-cli/.* - -# Ignore Website -.*/website/.* - -# Ignore generators -.*/local-cli/generator.* - -# Ignore BUCK generated folders -.*\.buckd/ - -.*/node_modules/is-my-json-valid/test/.*\.json -.*/node_modules/iconv-lite/encodings/tables/.*\.json -.*/node_modules/y18n/test/.*\.json -.*/node_modules/spdx-license-ids/spdx-license-ids.json -.*/node_modules/spdx-exceptions/index.json -.*/node_modules/resolve/test/subdirs/node_modules/a/b/c/x.json -.*/node_modules/resolve/lib/core.json -.*/node_modules/jsonparse/samplejson/.*\.json -.*/node_modules/json5/test/.*\.json -.*/node_modules/ua-parser-js/test/.*\.json -.*/node_modules/builtin-modules/builtin-modules.json -.*/node_modules/binary-extensions/binary-extensions.json -.*/node_modules/url-regex/tlds.json -.*/node_modules/joi/.*\.json -.*/node_modules/isemail/.*\.json -.*/node_modules/tr46/.*\.json -.*/node_modules/protobufjs/src/bower.json -.*/node_modules/grpc/node_modules/protobufjs/src/bower.json +.*/node_modules/metro-bundler/src/DeltaBundler/DeltaCalculator.js.flow +.*/node_modules/metro-bundler/src/DeltaBundler/DeltaPatcher.js.flow +.*/node_modules/metro-bundler/src/node-haste/AssetResolutionCache.js.flow +.*/node_modules/metro-bundler/src/node-haste/DependencyGraph.js.flow +#.*/node_modules/react-native/Libraries/Animated/src/nodes/AnimatedStyle.js +#.*/node_modules/react-native/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +#.*/node_modules/react-native/Libraries/Experimental/SwipeableRow/SwipeableFlatList.js +#.*/node_modules/react-native/Libraries/Experimental/SwipeableRow/SwipeableListView.js +#.*/node_modules/react-native/Libraries/Image/ImageBackground.js +#.*/node_modules/react-native/Libraries/Lists/FlatList.js +#.*/node_modules/react-native/Libraries/Lists/MetroListView.js +#.*/node_modules/react-native/Libraries/Lists/SectionList.js +#.*/node_modules/react-native/Libraries/Lists/ViewabilityHelper.js +#.*/node_modules/react-native/Libraries/Lists/VirtualizedList.js +#.*/node_modules/react-native/Libraries/Lists/VirtualizedSectionList.js # Ignore dist folder .*/dist/.* @@ -80,34 +40,37 @@ .*/tests/.* [include] -node_modules/fbjs/lib [libs] node_modules/react-native/Libraries/react-native/react-native-interface.js -node_modules/react-native/flow -node_modules/fbjs/flow/lib +node_modules/react-native/flow/ [options] module.system=haste -experimental.strict_type_args=true -unsafe.enable_getters_and_setters=true - -esproposal.class_static_fields=enable -esproposal.class_instance_fields=enable +emoji=true munge_underscores=false -module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' +module.file_ext=.js +module.file_ext=.jsx +module.file_ext=.json +module.file_ext=.native.js + suppress_type=$FlowIssue suppress_type=$FlowFixMe +suppress_type=$FlowFixMeProps +suppress_type=$FlowFixMeState suppress_type=$FixMe -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(2[0-4]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(2[0-4]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(5[0-6]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(5[0-6]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy +suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError + +unsafe.enable_getters_and_setters=true [version] ^0.56.0 diff --git a/lib/modules/config/index.js b/lib/modules/config/index.js index 07562a37..999c838a 100644 --- a/lib/modules/config/index.js +++ b/lib/modules/config/index.js @@ -1,8 +1,19 @@ /** * @flow + * Remote Config representation wrapper */ import ModuleBase from './../../utils/ModuleBase'; +import type FirebaseApp from '../core/firebase-app'; + +type NativeValue = { + stringValue?: string, + numberValue?: number, + dataValue?: Object, + boolValue?: boolean, + source: 'remoteConfigSourceRemote' | 'remoteConfigSourceDefault' | ' remoteConfigSourceStatic', +} + /** * @class Config */ @@ -10,9 +21,11 @@ export default class RemoteConfig extends ModuleBase { static _NAMESPACE = 'config'; static _NATIVE_MODULE = 'RNFirebaseRemoteConfig'; - constructor(firebaseApp: Object, options: Object = {}) { + _developerModeEnabled: boolean; + + constructor(firebaseApp: FirebaseApp, options: Object = {}) { super(firebaseApp, options); - this.developerModeEnabled = false; + this._developerModeEnabled = false; } /** @@ -21,7 +34,7 @@ export default class RemoteConfig extends ModuleBase { * @returns {*} * @private */ - _nativeValueToJS(nativeValue) { + _nativeValueToJS(nativeValue: NativeValue) { return { source: nativeValue.source, val() { @@ -37,10 +50,10 @@ export default class RemoteConfig extends ModuleBase { * Enable Remote Config developer mode to allow for frequent refreshes of the cache */ enableDeveloperMode() { - if (!this.developerModeEnabled) { + if (!this._developerModeEnabled) { this.log.debug('Enabled developer mode'); this._native.enableDeveloperMode(); - this.developerModeEnabled = true; + this._developerModeEnabled = true; } } diff --git a/lib/modules/crash/index.js b/lib/modules/crash/index.js index 70a677e7..2844a65c 100644 --- a/lib/modules/crash/index.js +++ b/lib/modules/crash/index.js @@ -4,13 +4,14 @@ */ import ModuleBase from '../../utils/ModuleBase'; +import type FirebaseApp from '../core/firebase-app'; import type { FirebaseError } from '../../types'; export default class Crash extends ModuleBase { static _NAMESPACE = 'crash'; static _NATIVE_MODULE = 'RNFirebaseCrash'; - constructor(firebaseApp: Object, options: Object = {}) { + constructor(firebaseApp: FirebaseApp, options: Object = {}) { super(firebaseApp, options); } diff --git a/lib/modules/database/disconnect.js b/lib/modules/database/disconnect.js index 638f8c76..f1a37122 100644 --- a/lib/modules/database/disconnect.js +++ b/lib/modules/database/disconnect.js @@ -1,7 +1,10 @@ -/* @flow */ - +/** + * @flow + * Disconnect representation wrapper + */ import { typeOf } from './../../utils'; -import Reference from './reference'; +import type Database from './'; +import type Reference from './reference'; /** @@ -9,6 +12,7 @@ import Reference from './reference'; * @class Disconnect */ export default class Disconnect { + _database: Database; ref: Reference; path: string; diff --git a/lib/modules/database/index.js b/lib/modules/database/index.js index a73e59f8..ddcae474 100644 --- a/lib/modules/database/index.js +++ b/lib/modules/database/index.js @@ -8,6 +8,8 @@ import Reference from './reference'; import TransactionHandler from './transaction'; import ModuleBase from './../../utils/ModuleBase'; +import type FirebaseApp from '../core/firebase-app'; + /** * @class Database */ @@ -15,7 +17,11 @@ export default class Database extends ModuleBase { static _NAMESPACE = 'database'; static _NATIVE_MODULE = 'RNFirebaseDatabase'; - constructor(firebaseApp: Object, options: Object = {}) { + _offsetRef: Reference; + _serverTimeOffset: number; + _transactionHandler: TransactionHandler; + + constructor(firebaseApp: FirebaseApp, options: Object = {}) { super(firebaseApp, options, true); this._transactionHandler = new TransactionHandler(this); @@ -40,21 +46,21 @@ export default class Database extends ModuleBase { * * @return {number} */ - getServerTime() { + getServerTime(): number { return new Date(Date.now() + this._serverTimeOffset); } /** * */ - goOnline() { + goOnline(): void { this._native.goOnline(); } /** * */ - goOffline() { + goOffline(): void { this._native.goOffline(); } @@ -63,7 +69,7 @@ export default class Database extends ModuleBase { * @param path * @returns {Reference} */ - ref(path: string) { + ref(path: string): Reference { return new Reference(this, path); } } @@ -72,9 +78,9 @@ export const statics = { ServerValue: NativeModules.RNFirebaseDatabase ? { TIMESTAMP: NativeModules.RNFirebaseDatabase.serverValueTimestamp || { '.sv': 'timestamp' }, } : {}, - enableLogging(bool) { + enableLogging(enabled: boolean) { if (NativeModules[Database._NATIVE_MODULE]) { - NativeModules[Database._NATIVE_MODULE].enableLogging(bool); + NativeModules[Database._NATIVE_MODULE].enableLogging(enabled); } }, }; diff --git a/lib/modules/database/query.js b/lib/modules/database/query.js index 9cd75760..47192f22 100644 --- a/lib/modules/database/query.js +++ b/lib/modules/database/query.js @@ -1,11 +1,11 @@ /** * @flow + * Query representation wrapper */ - -import Reference from './reference.js'; import { objectToUniqueId } from '../../utils'; import type { DatabaseModifier } from '../../types'; +import type Reference from './reference.js'; // todo doc methods @@ -13,6 +13,7 @@ import type { DatabaseModifier } from '../../types'; * @class Query */ export default class Query { + _reference: Reference; modifiers: Array; constructor(ref: Reference, path: string, existingModifiers?: Array) { @@ -28,7 +29,7 @@ export default class Query { */ orderBy(name: string, key?: string) { this.modifiers.push({ - id: `orderBy-${name}:${key}`, + id: `orderBy-${name}:${key || ''}`, type: 'orderBy', name, key, @@ -63,7 +64,7 @@ export default class Query { */ filter(name: string, value: any, key?: string) { this.modifiers.push({ - id: `filter-${name}:${objectToUniqueId(value)}:${key}`, + id: `filter-${name}:${objectToUniqueId(value)}:${key || ''}`, type: 'filter', name, value, diff --git a/lib/modules/database/reference.js b/lib/modules/database/reference.js index befd514d..ee0f6283 100644 --- a/lib/modules/database/reference.js +++ b/lib/modules/database/reference.js @@ -1,7 +1,7 @@ /** * @flow + * Database Reference representation wrapper */ - import Query from './query.js'; import Snapshot from './snapshot'; import Disconnect from './disconnect'; @@ -20,6 +20,7 @@ import { import INTERNALS from '../../utils/internals'; import type { DatabaseModifier, FirebaseError } from '../../types'; +import type SyncTree from '../../utils/SyncTree'; // track all event registrations by path let listeners = 0; @@ -72,10 +73,10 @@ type DatabaseListener = { * @extends ReferenceBase */ export default class Reference extends ReferenceBase { - - _refListeners: { [listenerId: number]: DatabaseListener }; _database: Object; + _promise: ?Promise<*>; _query: Query; + _refListeners: { [listenerId: number]: DatabaseListener }; constructor(database: Object, path: string, existingModifiers?: Array) { super(path, database); @@ -96,7 +97,7 @@ export default class Reference extends ReferenceBase { * @param bool * @returns {*} */ - keepSynced(bool: boolean) { + keepSynced(bool: boolean): Promise { return this._database._native.keepSynced(this._getRefKey(), this.path, this._query.getModifiers(), bool); } @@ -108,7 +109,7 @@ export default class Reference extends ReferenceBase { * @param onComplete * @returns {Promise} */ - set(value: any, onComplete?: Function): Promise { + set(value: any, onComplete?: Function): Promise { return promiseOrCallback( this._database._native.set(this.path, this._serializeAnyType(value)), onComplete, @@ -123,7 +124,7 @@ export default class Reference extends ReferenceBase { * @param onComplete * @returns {Promise} */ - setPriority(priority: string | number | null, onComplete?: Function): Promise { + setPriority(priority: string | number | null, onComplete?: Function): Promise { const _priority = this._serializeAnyType(priority); return promiseOrCallback( @@ -141,7 +142,7 @@ export default class Reference extends ReferenceBase { * @param onComplete * @returns {Promise} */ - setWithPriority(value: any, priority: string | number | null, onComplete?: Function): Promise { + setWithPriority(value: any, priority: string | number | null, onComplete?: Function): Promise { const _value = this._serializeAnyType(value); const _priority = this._serializeAnyType(priority); @@ -159,7 +160,7 @@ export default class Reference extends ReferenceBase { * @param onComplete * @returns {Promise} */ - update(val: Object, onComplete?: Function): Promise { + update(val: Object, onComplete?: Function): Promise { const value = this._serializeObject(val); return promiseOrCallback( @@ -175,7 +176,7 @@ export default class Reference extends ReferenceBase { * @param onComplete * @return {Promise} */ - remove(onComplete?: Function): Promise { + remove(onComplete?: Function): Promise { return promiseOrCallback( this._database._native.remove(this.path), onComplete, @@ -196,16 +197,14 @@ export default class Reference extends ReferenceBase { applyLocally: boolean = false, ) { if (!isFunction(transactionUpdate)) { - return Promise.reject( - new Error('Missing transactionUpdate function argument.'), - ); + return Promise.reject(new Error('Missing transactionUpdate function argument.')); } return new Promise((resolve, reject) => { const onCompleteWrapper = (error, committed, snapshotData) => { if (isFunction(onComplete)) { - if (error) { - onComplete(error, committed, null); + if (error) { + onComplete(error, committed, null); } else { onComplete(null, committed, new Snapshot(this, snapshotData)); } @@ -259,7 +258,7 @@ export default class Reference extends ReferenceBase { * @param onComplete * @returns {*} */ - push(value: any, onComplete?: Function): Reference | Promise { + push(value: any, onComplete?: Function): Reference | Promise { if (value === null || value === undefined) { return new Reference(this._database, `${this.path}/${generatePushID(this._database._serverTimeOffset)}`); } @@ -492,7 +491,7 @@ export default class Reference extends ReferenceBase { * Access then method of promise if set * @return {*} */ - then(fnResolve, fnReject) { + then(fnResolve: (any) => any, fnReject: (any) => any) { if (isFunction(fnResolve) && this._promise && this._promise.then) { return this._promise.then.bind(this._promise)((result) => { this._promise = null; @@ -515,7 +514,7 @@ export default class Reference extends ReferenceBase { * Access catch method of promise if set * @return {*} */ - catch(fnReject) { + catch(fnReject: (any) => any) { if (isFunction(fnReject) && this._promise && this._promise.catch) { return this._promise.catch.bind(this._promise)((possibleErr) => { this._promise = null; @@ -535,7 +534,7 @@ export default class Reference extends ReferenceBase { * * @return {string} */ - _getRegistrationKey(eventType) { + _getRegistrationKey(eventType: string): string { return `$${this._database._appName}$/${this.path}$${this._query.queryIdentifier()}$${listeners}$${eventType}`; } @@ -546,7 +545,7 @@ export default class Reference extends ReferenceBase { * @return {string} * @private */ - _getRefKey() { + _getRefKey(): string { return `$${this._database._appName}$/${this.path}$${this._query.queryIdentifier()}`; } @@ -562,7 +561,7 @@ export default class Reference extends ReferenceBase { * @param promise * @private */ - _setThenable(promise) { + _setThenable(promise: Promise<*>) { this._promise = promise; } @@ -770,7 +769,7 @@ export default class Reference extends ReferenceBase { return this._syncTree.removeListenersForRegistrations(registrations); } - get _syncTree() { + get _syncTree(): SyncTree { return INTERNALS.SyncTree; } } diff --git a/lib/modules/database/snapshot.js b/lib/modules/database/snapshot.js index 6a117104..fa6c6c77 100644 --- a/lib/modules/database/snapshot.js +++ b/lib/modules/database/snapshot.js @@ -1,15 +1,16 @@ /** * @flow + * Snapshot representation wrapper */ -import Reference from './reference.js'; import { isObject, deepGet, deepExists } from './../../utils'; +import type Reference from './reference.js'; /** * @class DataSnapshot * @link https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot */ export default class Snapshot { - ref: Object; + ref: Reference; key: string; _value: any; @@ -138,7 +139,7 @@ export default class Snapshot { * @link https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#toJSON * @returns {any} */ - toJSON(): any { + toJSON(): Object { return this.val(); } } diff --git a/lib/modules/database/transaction.js b/lib/modules/database/transaction.js index 4c1f4864..d84a1d26 100644 --- a/lib/modules/database/transaction.js +++ b/lib/modules/database/transaction.js @@ -2,6 +2,7 @@ * @flow * Database Transaction representation wrapper */ +import type Database from './'; let transactionId = 0; @@ -9,7 +10,11 @@ let transactionId = 0; * @class TransactionHandler */ export default class TransactionHandler { - constructor(database: Object) { + _database: Database; + _transactionListener: Function; + _transactions: { [string]: Object } + + constructor(database: Database) { this._transactions = {}; this._database = database; diff --git a/lib/modules/links/index.js b/lib/modules/links/index.js index 3f12df6a..68b332bb 100644 --- a/lib/modules/links/index.js +++ b/lib/modules/links/index.js @@ -1,6 +1,12 @@ +/** + * @flow + * Dynamic Links representation wrapper + */ import ModuleBase from './../../utils/ModuleBase'; import { areObjectKeysContainedInOther, isObject, isString } from './../../utils'; +import type FirebaseApp from '../core/firebase-app'; + const EVENT_TYPE = { Link: 'dynamic_link_received', }; @@ -59,11 +65,11 @@ export default class Links extends ModuleBase { static _NAMESPACE = 'links'; static _NATIVE_MODULE = 'RNFirebaseLinks'; - constructor(firebaseApp: Object, options: Object = {}) { + constructor(firebaseApp: FirebaseApp, options: Object = {}) { super(firebaseApp, options, true); } - get EVENT_TYPE() { + get EVENT_TYPE(): Object { return EVENT_TYPE; } @@ -71,7 +77,7 @@ export default class Links extends ModuleBase { * Returns the link that triggered application open * @returns {Promise.} */ - getInitialLink() { + getInitialLink(): Promise { return this._native.getInitialLink(); } @@ -90,7 +96,7 @@ export default class Links extends ModuleBase { * @param parameters * @returns {Promise.} */ - createDynamicLink(parameters: Object = {}): Promise { + createDynamicLink(parameters: Object = {}): Promise { try { checkForMandatoryParameters(parameters); validateParameters(parameters); diff --git a/lib/modules/messaging/RemoteMessage.js b/lib/modules/messaging/RemoteMessage.js index b44a6cbb..78472967 100644 --- a/lib/modules/messaging/RemoteMessage.js +++ b/lib/modules/messaging/RemoteMessage.js @@ -1,7 +1,13 @@ +/** + * @flow + * Remote message representation wrapper + */ import { isObject, generatePushID } from './../../utils'; export default class RemoteMessage { - constructor(sender: String) { + properties: Object; + + constructor(sender: string) { this.properties = { id: generatePushID(), ttl: 3600, @@ -17,7 +23,7 @@ export default class RemoteMessage { * @param ttl * @returns {RemoteMessage} */ - setTtl(ttl: Number): RemoteMessage { + setTtl(ttl: number): RemoteMessage { this.properties.ttl = ttl; return this; } @@ -74,7 +80,7 @@ export default class RemoteMessage { return this; } - toJSON() { + toJSON(): Object { return Object.assign({}, this.properties); } } diff --git a/lib/modules/messaging/index.js b/lib/modules/messaging/index.js index c06937bd..595ab402 100644 --- a/lib/modules/messaging/index.js +++ b/lib/modules/messaging/index.js @@ -1,7 +1,13 @@ +/** + * @flow + * Messaging representation wrapper + */ import { Platform, NativeModules } from 'react-native'; import ModuleBase from './../../utils/ModuleBase'; import RemoteMessage from './RemoteMessage'; +import type FirebaseApp from '../core/firebase-app'; + const EVENT_TYPE = { RefreshToken: 'messaging_token_refreshed', Notification: 'messaging_notification_received', @@ -75,23 +81,23 @@ export default class Messaging extends ModuleBase { static _NAMESPACE = 'messaging'; static _NATIVE_MODULE = 'RNFirebaseMessaging'; - constructor(firebaseApp: Object, options: Object = {}) { + constructor(firebaseApp: FirebaseApp, options: Object = {}) { super(firebaseApp, options, true); } - get EVENT_TYPE() { + get EVENT_TYPE(): Object { return EVENT_TYPE; } - get NOTIFICATION_TYPE() { + get NOTIFICATION_TYPE(): Object { return NOTIFICATION_TYPE; } - get REMOTE_NOTIFICATION_RESULT() { + get REMOTE_NOTIFICATION_RESULT(): Object { return REMOTE_NOTIFICATION_RESULT; } - get WILL_PRESENT_RESULT() { + get WILL_PRESENT_RESULT(): Object { return WILL_PRESENT_RESULT; } @@ -99,7 +105,7 @@ export default class Messaging extends ModuleBase { * Returns the notification that triggered application open * @returns {*} */ - getInitialNotification() { + getInitialNotification(): Promise { return this._native.getInitialNotification(); } @@ -107,7 +113,7 @@ export default class Messaging extends ModuleBase { * Returns the fcm token for the current device * @returns {*|Promise.} */ - getToken() { + getToken(): Promise { return this._native.getToken(); } @@ -115,7 +121,7 @@ export default class Messaging extends ModuleBase { * Reset Instance ID and revokes all tokens. * @returns {*|Promise.<*>} */ - deleteInstanceId() { + deleteInstanceId(): Promise { return this._native.deleteInstanceId(); } @@ -124,7 +130,7 @@ export default class Messaging extends ModuleBase { * @param notification * @returns {*} */ - createLocalNotification(notification: Object) { + createLocalNotification(notification: Object): Promise { const _notification = Object.assign({}, notification); _notification.id = _notification.id || new Date().getTime().toString(); _notification.local_notification = true; @@ -136,7 +142,7 @@ export default class Messaging extends ModuleBase { * @param notification * @returns {*} */ - scheduleLocalNotification(notification: Object) { + scheduleLocalNotification(notification: Object): Promise { const _notification = Object.assign({}, notification); if (!notification.id) return Promise.reject(new Error('An id is required to schedule a local notification.')); _notification.local_notification = true; @@ -147,7 +153,7 @@ export default class Messaging extends ModuleBase { * Returns an array of all scheduled notifications * @returns {Promise.} */ - getScheduledLocalNotifications() { + getScheduledLocalNotifications(): Promise { return this._native.getScheduledLocalNotifications(); } @@ -157,8 +163,8 @@ export default class Messaging extends ModuleBase { * @param id * @returns {*} */ - cancelLocalNotification(id: string) { - if (!id) return null; + cancelLocalNotification(id: string): Promise { + if (!id) return Promise.reject(new Error('Missing notification id')); if (id === '*') return this._native.cancelAllLocalNotifications(); return this._native.cancelLocalNotification(id); } @@ -169,8 +175,8 @@ export default class Messaging extends ModuleBase { * @param id * @returns {*} */ - removeDeliveredNotification(id: string) { - if (!id) return null; + removeDeliveredNotification(id: string): Promise { + if (!id) return Promise.reject(new Error('Missing notification id')); if (id === '*') return this._native.removeAllDeliveredNotifications(); return this._native.removeDeliveredNotification(id); } @@ -180,7 +186,7 @@ export default class Messaging extends ModuleBase { * @platforms ios * @returns {*|Promise.<*>} */ - requestPermissions() { + requestPermissions(): Promise { return this._native.requestPermissions(); } @@ -189,7 +195,7 @@ export default class Messaging extends ModuleBase { * Set notification count badge number * @param n */ - setBadgeNumber(n: number) { + setBadgeNumber(n: number): void { this._native.setBadgeNumber(n); } @@ -197,7 +203,7 @@ export default class Messaging extends ModuleBase { * set notification count badge number * @returns {Promise.} */ - getBadgeNumber() { + getBadgeNumber(): Promise { return this._native.getBadgeNumber(); } @@ -206,7 +212,7 @@ export default class Messaging extends ModuleBase { * @param listener * @returns {*} */ - onMessage(listener: Function): () => any { + onMessage(listener: (Object) => any): () => any { const rnListener = this._eventEmitter.addListener( EVENT_TYPE.Notification, async (event) => { @@ -229,7 +235,7 @@ export default class Messaging extends ModuleBase { * @param listener * @returns {*} */ - onTokenRefresh(listener: Function): () => any { + onTokenRefresh(listener: (string) => any): () => any { const rnListener = this._eventEmitter.addListener(EVENT_TYPE.RefreshToken, listener); return () => rnListener.remove(); } @@ -238,7 +244,7 @@ export default class Messaging extends ModuleBase { * Subscribe to a topic * @param topic */ - subscribeToTopic(topic: String) { + subscribeToTopic(topic: string): void { this._native.subscribeToTopic(topic); } @@ -246,7 +252,7 @@ export default class Messaging extends ModuleBase { * Unsubscribe from a topic * @param topic */ - unsubscribeFromTopic(topic: String) { + unsubscribeFromTopic(topic: string): void { this._native.unsubscribeFromTopic(topic); } @@ -254,7 +260,7 @@ export default class Messaging extends ModuleBase { * Send an upstream message * @param remoteMessage */ - send(remoteMessage: RemoteMessage) { + send(remoteMessage: RemoteMessage): Promise { if (!(remoteMessage instanceof RemoteMessage)) { throw new Error('messaging().send requires an instance of RemoteMessage as the first argument.'); } diff --git a/lib/modules/perf/Trace.js b/lib/modules/perf/Trace.js index 7ac258b0..5b5614b1 100644 --- a/lib/modules/perf/Trace.js +++ b/lib/modules/perf/Trace.js @@ -1,19 +1,27 @@ -export default class Trace { +/** + * @flow + * Trace representation wrapper + */ +import type PerformanceMonitoring from './'; - constructor(perf: Object, identifier: string) { +export default class Trace { + identifier: string; + perf: PerformanceMonitoring; + + constructor(perf: PerformanceMonitoring, identifier: string) { this.perf = perf; this.identifier = identifier; } - start() { + start(): void { this.perf._native.start(this.identifier); } - stop() { + stop(): void { this.perf._native.stop(this.identifier); } - incrementCounter(event: string) { + incrementCounter(event: string): void { this.perf._native.incrementCounter(this.identifier, event); } } diff --git a/lib/modules/perf/index.js b/lib/modules/perf/index.js index 496ce59a..81d3a5d1 100644 --- a/lib/modules/perf/index.js +++ b/lib/modules/perf/index.js @@ -1,14 +1,17 @@ -// @flow +/** + * @flow + * Performance monitoring representation wrapper + */ import Trace from './Trace'; import ModuleBase from '../../utils/ModuleBase'; +import type FirebaseApp from '../core/firebase-app'; + export default class PerformanceMonitoring extends ModuleBase { static _NAMESPACE = 'perf'; static _NATIVE_MODULE = 'RNFirebasePerformance'; - _native: Object; - - constructor(firebaseApp: Object, options: Object = {}) { + constructor(firebaseApp: FirebaseApp, options: Object = {}) { super(firebaseApp, options); } @@ -17,15 +20,15 @@ export default class PerformanceMonitoring extends ModuleBase { * @param enabled * @returns {*} */ - setPerformanceCollectionEnabled(enabled: boolean) { - return this._native.setPerformanceCollectionEnabled(enabled); + setPerformanceCollectionEnabled(enabled: boolean): void { + this._native.setPerformanceCollectionEnabled(enabled); } /** * Returns a new trace instance * @param trace */ - newTrace(trace: string): void { + newTrace(trace: string): Trace { return new Trace(this, trace); } } diff --git a/lib/modules/storage/index.js b/lib/modules/storage/index.js index eccfa45a..fdf5f520 100644 --- a/lib/modules/storage/index.js +++ b/lib/modules/storage/index.js @@ -1,22 +1,27 @@ -/* @flow */ +/** + * @flow + * Storage representation wrapper + */ import { NativeModules } from 'react-native'; import StorageRef from './reference'; import ModuleBase from './../../utils/ModuleBase'; +import type FirebaseApp from '../core/firebase-app'; + const FirebaseStorage = NativeModules.RNFirebaseStorage; export default class Storage extends ModuleBase { static _NAMESPACE = 'storage'; static _NATIVE_MODULE = 'RNFirebaseStorage'; + /** * * @param firebaseApp * @param options */ - constructor(firebaseApp: Object, options: Object = {}) { + constructor(firebaseApp: FirebaseApp, options: Object = {}) { super(firebaseApp, options, true); - this._subscriptions = {}; this.addListener( this._getAppEventName('storage_event'), @@ -55,7 +60,7 @@ export default class Storage extends ModuleBase { * @url https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxOperationRetryTime * @param time The new maximum operation retry time in milliseconds. */ - setMaxOperationRetryTime(time: number) { + setMaxOperationRetryTime(time: number): void { this._native.setMaxOperationRetryTime(time); } @@ -64,7 +69,7 @@ export default class Storage extends ModuleBase { * @url https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxUploadRetryTime * @param time The new maximum upload retry time in milliseconds. */ - setMaxUploadRetryTime(time: number) { + setMaxUploadRetryTime(time: number): void { this._native.setMaxUploadRetryTime(time); } @@ -73,14 +78,14 @@ export default class Storage extends ModuleBase { * @url N/A * @param time The new maximum download retry time in milliseconds. */ - setMaxDownloadRetryTime(time: number) { + setMaxDownloadRetryTime(time: number): void { this._native.setMaxDownloadRetryTime(time); } - /** ********** + /** * INTERNALS - ********** **/ - _getSubEventName(path, eventName) { + */ + _getSubEventName(path: string, eventName: string) { return this._getAppEventName(`${path}-${eventName}`); } @@ -93,18 +98,18 @@ export default class Storage extends ModuleBase { } _handleStorageError(err: Object) { - const { path, eventName } = event; - const body = event.body || {}; + const { path, eventName } = err; + const body = err.body || {}; this.log.debug('_handleStorageError ->', err); this.emit(this._getSubEventName(path, eventName), body); } - _addListener(path: string, eventName: string, cb: (evt: Object) => Object) { + _addListener(path: string, eventName: string, cb: (evt: Object) => Object): void { this.on(this._getSubEventName(path, eventName), cb); } - _removeListener(path: string, eventName: string, origCB: (evt: Object) => Object) { + _removeListener(path: string, eventName: string, origCB: (evt: Object) => Object): void { this.removeListener(this._getSubEventName(path, eventName), origCB); } } diff --git a/lib/modules/storage/reference.js b/lib/modules/storage/reference.js index 70f8af8e..d38c5d2a 100644 --- a/lib/modules/storage/reference.js +++ b/lib/modules/storage/reference.js @@ -1,14 +1,18 @@ -/* @flow */ - +/** + * @flow + * StorageReference representation wrapper + */ import ReferenceBase from '../../utils/ReferenceBase'; import StorageTask, { UPLOAD_TASK, DOWNLOAD_TASK } from './task'; -import Storage from './'; +import type Storage from './'; /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference */ export default class StorageReference extends ReferenceBase { + _storage: Storage; + constructor(storage: Storage, path: string) { super(path, storage); this._storage = storage; @@ -18,7 +22,7 @@ export default class StorageReference extends ReferenceBase { return this.path; } - toString(): String { + toString(): string { return `gs://${this._storage.app.options.storageBucket}${this.path}`; } @@ -27,24 +31,24 @@ export default class StorageReference extends ReferenceBase { * @param path * @returns {StorageReference} */ - child(path: string) { - return new StorageReference(this._module, `${this.path}/${path}`); + child(path: string): StorageReference { + return new StorageReference(this._storage, `${this.path}/${path}`); } /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#delete * @returns {Promise.|*} */ - delete(): Promise<*> { - return this._module._native.delete(this.path); + delete(): Promise { + return this._storage._native.delete(this.path); } /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getDownloadURL * @returns {Promise.|*} */ - getDownloadURL(): Promise { - return this._module._native.getDownloadURL(this.path); + getDownloadURL(): Promise { + return this._storage._native.getDownloadURL(this.path); } /** @@ -52,7 +56,7 @@ export default class StorageReference extends ReferenceBase { * @returns {Promise.|*} */ getMetadata(): Promise { - return this._module._native.getMetadata(this.path); + return this._storage._native.getMetadata(this.path); } /** @@ -61,7 +65,7 @@ export default class StorageReference extends ReferenceBase { * @returns {Promise.|*} */ updateMetadata(metadata: Object = {}): Promise { - return this._module._native.updateMetadata(this.path, metadata); + return this._storage._native.updateMetadata(this.path, metadata); } /** @@ -70,14 +74,14 @@ export default class StorageReference extends ReferenceBase { * @return {Promise} */ downloadFile(filePath: string): Promise { - return new StorageTask(DOWNLOAD_TASK, this._module._native.downloadFile(this.path, filePath), this); + return new StorageTask(DOWNLOAD_TASK, this._storage._native.downloadFile(this.path, filePath), this); } /** * Alias to putFile * @returns {StorageReference.putFile} */ - get put(): Function { + get put(): (Object, Object) => Promise { return this.putFile; } diff --git a/lib/modules/storage/task.js b/lib/modules/storage/task.js index 647a3b0c..e3906c23 100644 --- a/lib/modules/storage/task.js +++ b/lib/modules/storage/task.js @@ -1,7 +1,11 @@ -/* @flow */ +/** + * @flow + * UploadTask representation wrapper + */ import { statics as StorageStatics } from './'; import { isFunction } from './../../utils'; -import StorageReference from './reference'; +import type Storage from './'; +import type StorageReference from './reference'; export const UPLOAD_TASK = 'upload'; export const DOWNLOAD_TASK = 'download'; @@ -40,15 +44,15 @@ declare type NextOrObserverType = null | export default class StorageTask { type: typeof UPLOAD_TASK | typeof DOWNLOAD_TASK; ref: StorageReference; - storage: StorageReference.storage; - path: StorageReference.path; + storage: Storage; + path: string; then: () => Promise<*>; catch: () => Promise<*>; constructor(type: typeof UPLOAD_TASK | typeof DOWNLOAD_TASK, promise: Promise<*>, storageRef: StorageReference) { this.type = type; this.ref = storageRef; - this.storage = storageRef._module; + this.storage = storageRef._storage; this.path = storageRef.path; // 'proxy' original promise diff --git a/lib/types/index.js b/lib/types/index.js index 40b53a3a..48fb199d 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -106,6 +106,7 @@ export type DatabaseModule = { } & DatabaseStatics; export type DatabaseModifier = { + id: string; type: 'orderBy' | 'limit' | 'filter'; name?: string; key?: string;