This commit is contained in:
Salakar 2018-03-24 02:02:59 +00:00
parent e0d62f3945
commit 9eeddcab6e
15 changed files with 447 additions and 85 deletions

View File

@ -87,9 +87,13 @@ dependencies {
transitive = false
}
implementation(project(':react-native-restart')) {
transitive = false
}
compile fileTree(dir: "libs", include: ["*.jar"])
compile "com.google.android.gms:play-services-base:$firebaseVersion"
// compile "com.google.firebase:firebase-ads:$firebaseVersion"
compile "com.google.firebase:firebase-ads:$firebaseVersion"
compile "com.google.firebase:firebase-auth:$firebaseVersion"
compile "com.google.firebase:firebase-config:$firebaseVersion"
compile "com.google.firebase:firebase-core:$firebaseVersion"

View File

@ -31,7 +31,7 @@ public class MainActivity extends ReactActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// checkWindowPerms();
checkWindowPerms();
}
public void checkWindowPerms() {

View File

@ -9,7 +9,8 @@ import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;
import io.invertase.firebase.RNFirebasePackage;
//import io.invertase.firebase.admob.RNFirebaseAdMobPackage;
import com.avishayil.rnrestart.ReactNativeRestartPackage;
import io.invertase.firebase.admob.RNFirebaseAdMobPackage;
import io.invertase.firebase.analytics.RNFirebaseAnalyticsPackage;
import io.invertase.firebase.auth.RNFirebaseAuthPackage;
import io.invertase.firebase.config.RNFirebaseRemoteConfigPackage;
@ -25,6 +26,7 @@ import io.invertase.firebase.notifications.RNFirebaseNotificationsPackage;
import io.invertase.firebase.perf.RNFirebasePerformancePackage;
import io.invertase.firebase.storage.RNFirebaseStoragePackage;
import java.util.Arrays;
import java.util.List;
@ -39,8 +41,9 @@ public class MainApplication extends Application implements ReactApplication {
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new ReactNativeRestartPackage(),
new RNFirebasePackage(),
// new RNFirebaseAdMobPackage(),
new RNFirebaseAdMobPackage(),
new RNFirebaseAnalyticsPackage(),
new RNFirebaseAuthPackage(),
new RNFirebaseRemoteConfigPackage(),
@ -67,6 +70,7 @@ public class MainApplication extends Application implements ReactApplication {
@Override
public void onCreate() {
super.onCreate();
getReactNativeHost().getReactInstanceManager().getDevSupportManager().getDevSettings().setRemoteJSDebugEnabled(true);
SoLoader.init(this, /* native exopackage */ false);
}

View File

@ -1,7 +1,11 @@
rootProject.name = 'RNFTests'
include ':react-native-firebase'
project(':react-native-firebase').projectDir = new File(rootProject.projectDir, './../../android')
include ':react-native-restart'
project(':react-native-restart').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-restart/android')
include ':app'
include ':detox'

View File

@ -4,26 +4,20 @@
* @flow
*/
import React, { Component } from 'react';
import rnModule, { AppRegistry, Text, View } from 'react-native';
// must import before all else
import Bridge from './bridge/env/rn';
import testModule from './firebase';
import React, { Component } from 'react';
import { AppRegistry, Text, View } from 'react-native';
import firebase from './firebase';
class Root extends Component {
constructor(props) {
super(props);
this.state = {};
}
componentDidMount() {
if (global.__initializeEnvironment) {
console.log('Initializing environment...');
global.__initializeEnvironment({
root: this,
rnModule,
testModule,
});
}
Bridge.provideRoot(this);
Bridge.provideModule(firebase);
}
render() {

61
tests-new/bridge/env/node/index.js vendored Normal file
View File

@ -0,0 +1,61 @@
const detox = require('detox');
const vm = require('./vm');
const ws = require('./ws');
const detoxOriginalInit = detox.init.bind(detox);
const detoxOriginalCleanup = detox.cleanup.bind(detox);
let detoxOriginalReloadReactNative = null;
let bridgeReady = false;
process.on('rn-ready', () => {
// console.log('READY', true);
bridgeReady = true;
});
function onceBridgeReady() {
if (bridgeReady) return Promise.resolve();
return new Promise(resolve => {
process.once('rn-ready', resolve);
});
}
detox.init = async (...args) => {
bridgeReady = false;
console.log('detox.init.start');
return detoxOriginalInit(...args).then(() => {
console.log('detox.init.complete');
detoxOriginalReloadReactNative = device.reloadReactNative.bind(device);
device.reloadReactNative = async () => {
console.log('reloadReactNative.start');
bridgeReady = false;
// return device.launchApp({ newInstance: true }).then(() => {
global.bridge.reload();
return onceBridgeReady();
};
return onceBridgeReady();
});
};
detox.cleanup = async (...args) => {
console.log('detox.cleanup');
return detoxOriginalCleanup(...args).then(() => {
console.log('detox.cleanup.end');
ws.close();
process.exit();
});
};
global.bridge = {
_ws: null,
rootSetState(state) {
// todo
return Promise.resolve();
},
};

158
tests-new/bridge/env/node/vm.js vendored Normal file
View File

@ -0,0 +1,158 @@
const url = require('url');
const http = require('http');
const invariant = require('assert');
const { createContext, Script } = require('vm');
const ws = require('./ws');
let currentContext = null;
let scriptCached = null;
// this is a dummy file path - without a file name the source map is not used in the vm
const TEMP_BUNDLE_PATH = '/tmp/bridge/react-native.js';
/**
*
* @param replyId
* @param result
*/
function sendResult(replyID, result) {
ws.send(
JSON.stringify({
replyID,
result,
})
);
}
/**
*
* @param message
*/
function sendError(message) {
console.error(message);
}
/**
*
* @param src
* @param callback
*/
function getScript(src, callback) {
if (scriptCached) return callback(null, scriptCached);
return http
.get(src, res => {
let buff = '';
res.setEncoding('utf8');
res.on('data', chunk => {
buff += chunk;
});
res.on('end', () => {
scriptCached = new Script(buff, {
// lineOffset: -1,
// columnOffset: -1,
timeout: 120000,
displayErrors: true,
produceCachedData: true,
filename: TEMP_BUNDLE_PATH,
});
callback(null, scriptCached);
});
})
.on('error', err => {
callback(err);
});
}
process.on('ws-message', request => {
// console.log(request.method);
switch (request.method) {
case 'prepareJSRuntime':
currentContext = undefined;
currentContext = createContext({
console,
__bridgeNode: {
ready() {
process.emit('rn-ready');
},
provideReactNativeModule(rnModule) {
global.bridge.rn = undefined;
global.bridge.rn = rnModule;
},
provideModule(moduleExports) {
global.bridge.module = undefined;
global.bridge.module = moduleExports;
},
provideReload(reloadFn) {
global.bridge.reload = undefined;
global.bridge.reload = reloadFn;
},
provideRoot(rootComponent) {
global.bridge.root = undefined;
global.bridge.root = rootComponent;
},
},
});
sendResult(request.id);
return;
case 'executeApplicationScript':
// Modify the URL to make sure we get the inline source map.
const parsedUrl = url.parse(request.url, /* parseQueryString */ true);
invariant(parsedUrl.query);
parsedUrl.query.inlineSourceMap = true;
delete parsedUrl.search;
// $FlowIssue url.format() does not accept what url.parse() returns.
const scriptUrl = url.format(parsedUrl);
getScript(scriptUrl, (err, script) => {
if (err != null) {
sendError(`Failed to get script from packager: ${err.message}`);
return;
}
if (currentContext == null) {
sendError('JS runtime not prepared');
return;
}
if (request.inject) {
for (const name in request.inject) {
currentContext[name] = JSON.parse(request.inject[name]);
}
}
try {
script.runInContext(currentContext, TEMP_BUNDLE_PATH);
} catch (e) {
sendError(`Failed to exec script: ${e.message}`);
}
sendResult(request.id);
});
return;
default:
let returnValue = [[], [], [], 0];
try {
if (
currentContext != null &&
typeof currentContext.__fbBatchedBridge === 'object'
) {
returnValue = currentContext.__fbBatchedBridge[request.method].apply(
null,
request.arguments
);
}
} catch (e) {
sendError(
`Failed while making a call ${request.method}:::${e.message}`
);
} finally {
sendResult(request.id, JSON.stringify(returnValue));
}
}
});

12
tests-new/bridge/env/node/ws.js vendored Normal file
View File

@ -0,0 +1,12 @@
const WebSocket = require('ws');
const ws = new WebSocket(
// todo read url from somewhere
'ws://' + 'localhost:8081' + '/debugger-proxy?role=debugger&name=Chrome'
);
ws.onmessage = message => process.emit('ws-message', JSON.parse(message.data));
ws.onopen = () => console.log('WS open');
ws.onclose = event => (!event.wasClean ? console.log('WS close', event) : '');
module.exports = ws;

28
tests-new/bridge/env/rn.js vendored Normal file
View File

@ -0,0 +1,28 @@
import reactNative, { Platform, NativeModules } from 'react-native';
import RNRestart from 'react-native-restart'; // Import package from node modules
const bridgeNode = global.__bridgeNode;
// https://github.com/ptmt/react-native-macos/blob/master/React/Modules/RCTDevSettings.mm
if (Platform.OS === 'ios' && !bridgeNode) {
NativeModules.RCTDevSettings.setIsDebuggingRemotely(true);
}
if (bridgeNode) {
bridgeNode.provideReactNativeModule(reactNative);
bridgeNode.provideReload(RNRestart.Restart);
}
export default {
provideModule(moduleExports) {
if (bridgeNode) {
bridgeNode.provideModule(moduleExports);
bridgeNode.ready();
}
},
provideRoot(rootComponent) {
if (bridgeNode) {
bridgeNode.provideRoot(rootComponent);
}
},
};

60
tests-new/e2e/bridge.spec.js Executable file
View File

@ -0,0 +1,60 @@
// describe('Example', () => {
// beforeEach(async () => {
// await device.reloadReactNative();
// });
//
// it('should have welcome screen', async () => {
// await expect(element(by.id('welcome'))).toBeVisible();
// });
//
// it('should show hello screen after tap', async () => {
// await element(by.id('hello_button')).tap();
// await expect(element(by.text('Hello!!!'))).toBeVisible();
// });
//
// it('should show world screen after tap', async () => {
// await element(by.id('world_button')).tap();
// await expect(element(by.text('World!!!'))).toBeVisible();
// });
// });
describe('should work inside node', () => {
beforeEach(async () => {
await device.reloadReactNative();
});
it('should provide bridge global', () => {
const firebase = bridge.module;
return Promise.resolve();
});
it('should require 2', () => {
const firebase = bridge.module;
// const { Platform } = bridge.rnModule;
// should.equal(firebase.auth.nativeModuleExists, true);
return Promise.resolve();
});
it('should require 3', () => {
const firebase = bridge.module;
// const { Platform } = bridge.rnModule;
// should.equal(firebase.auth.nativeModuleExists, true);
return Promise.resolve();
});
it('should require 4', () => {
const firebase = bridge.module;
// const { Platform } = bridge.rnModule;
// should.equal(firebase.auth.nativeModuleExists, true);
return Promise.resolve();
});
it('should require 5', () => {
const firebase = bridge.module;
// const { Platform } = bridge.rnModule;
// should.equal(firebase.auth.nativeModuleExists, true);
return Promise.resolve();
});
});

View File

@ -25,7 +25,36 @@ describe('should work inside node', () => {
it('should require', () => {
const firebase = bridge.module;
return Promise.resolve();
});
it('should require 2', () => {
const firebase = bridge.module;
// const { Platform } = bridge.rnModule;
should.equal(firebase.auth.nativeModuleExists, true);
// should.equal(firebase.auth.nativeModuleExists, true);
return Promise.resolve();
});
it('should require 3', () => {
const firebase = bridge.module;
// const { Platform } = bridge.rnModule;
// should.equal(firebase.auth.nativeModuleExists, true);
return Promise.resolve();
});
it('should require 4', () => {
const firebase = bridge.module;
// const { Platform } = bridge.rnModule;
// should.equal(firebase.auth.nativeModuleExists, true);
return Promise.resolve();
});
it('should require 5', () => {
const firebase = bridge.module;
// const { Platform } = bridge.rnModule;
// should.equal(firebase.auth.nativeModuleExists, true);
return Promise.resolve();
});
});

View File

@ -1,5 +1,4 @@
--delay
--recursive
--timeout 120000
--bail
--require bridge
--require ./bridge/env/node

View File

@ -1 +1 @@
require('./app');
require('./app');

View File

@ -1,5 +1,5 @@
{
"name": "example",
"name": "rnfirebase-tests",
"version": "7.2.0",
"lockfileVersion": 1,
"requires": true,
@ -337,8 +337,7 @@
"aproba": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"dev": true
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
},
"arch": {
"version": "2.1.0",
@ -520,6 +519,11 @@
"dev": true,
"optional": true
},
"async-limiter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@ -1458,8 +1462,7 @@
"bluebird": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
"dev": true
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
},
"body-parser": {
"version": "1.13.3",
@ -1544,8 +1547,7 @@
"browser-stdout": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
"integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
"dev": true
"integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8="
},
"bser": {
"version": "2.0.0",
@ -1639,7 +1641,6 @@
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz",
"integrity": "sha1-RzChHvYQ+tRQuPIjx50x172tgHQ=",
"dev": true,
"requires": {
"cross-spawn": "4.0.2",
"node-version": "1.1.3",
@ -1650,7 +1651,6 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
"integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
"dev": true,
"requires": {
"lru-cache": "4.1.2",
"which": "1.3.0"
@ -2052,8 +2052,7 @@
"console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
},
"contains-path": {
"version": "0.1.0",
@ -2304,7 +2303,6 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/detox/-/detox-7.2.0.tgz",
"integrity": "sha512-hj+GgnXJWmNit0lzeDY1KjZZv3nvNWsB3V6oGIvwCe3Jdl2JXqg6Qn2USa137loTpuvdR77Zgl5m3u1iG1Am/Q==",
"dev": true,
"requires": {
"child-process-promise": "2.2.1",
"commander": "2.15.1",
@ -2324,7 +2322,6 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
"integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
"dev": true,
"requires": {
"graceful-fs": "4.1.11",
"jsonfile": "4.0.0",
@ -2335,7 +2332,6 @@
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"requires": {
"aproba": "1.2.0",
"console-control-strings": "1.1.0",
@ -2351,7 +2347,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
"number-is-nan": "1.0.1"
}
@ -2360,7 +2355,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"requires": {
"graceful-fs": "4.1.11"
}
@ -2369,7 +2363,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"requires": {
"are-we-there-yet": "1.1.4",
"console-control-strings": "1.1.0",
@ -2381,12 +2374,20 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",
"strip-ansi": "3.0.1"
}
},
"ws": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
"integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
"requires": {
"options": "0.0.6",
"ultron": "1.0.2"
}
}
}
},
@ -2394,7 +2395,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/detox-server/-/detox-server-7.0.0.tgz",
"integrity": "sha512-zs9ZP/MgeEmaZD/+MCl5PVcYHRjUtFBkBx3xQRPcsjJ/PmpCKy/BvygjLO6tRsR/2SC9UYay6W+BdguEYeft8g==",
"dev": true,
"requires": {
"lodash": "4.17.5",
"npmlog": "4.1.2",
@ -2405,7 +2405,6 @@
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"requires": {
"aproba": "1.2.0",
"console-control-strings": "1.1.0",
@ -2421,7 +2420,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
"number-is-nan": "1.0.1"
}
@ -2430,7 +2428,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"requires": {
"are-we-there-yet": "1.1.4",
"console-control-strings": "1.1.0",
@ -2442,20 +2439,27 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",
"strip-ansi": "3.0.1"
}
},
"ws": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
"integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
"requires": {
"options": "0.0.6",
"ultron": "1.0.2"
}
}
}
},
"diff": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
"integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
"dev": true
"integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww=="
},
"doctrine": {
"version": "2.1.0",
@ -4214,7 +4218,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/get-port/-/get-port-2.1.0.tgz",
"integrity": "sha1-h4P53OvR7qSVozThpqJR54iHqxo=",
"dev": true,
"requires": {
"pinkie-promise": "2.0.1"
}
@ -4311,8 +4314,7 @@
"growl": {
"version": "1.10.3",
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
"integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
"dev": true
"integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q=="
},
"growly": {
"version": "1.3.0",
@ -4482,8 +4484,7 @@
"he": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
"dev": true
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
},
"hoek": {
"version": "4.2.1",
@ -4561,8 +4562,7 @@
"ini": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
},
"inquirer": {
"version": "3.3.0",
@ -5554,6 +5554,15 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"ws": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
"integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
"requires": {
"options": "0.0.6",
"ultron": "1.0.2"
}
}
}
},
@ -5675,7 +5684,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz",
"integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==",
"dev": true,
"requires": {
"browser-stdout": "1.3.0",
"commander": "2.11.0",
@ -5692,14 +5700,12 @@
"commander": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
"integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
"dev": true
"integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ=="
},
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
@ -5707,14 +5713,12 @@
"has-flag": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
},
"supports-color": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
"integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
"dev": true,
"requires": {
"has-flag": "2.0.0"
}
@ -5862,8 +5866,7 @@
"node-version": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/node-version/-/node-version-1.1.3.tgz",
"integrity": "sha512-rEwE51JWn0yN3Wl5BXeGn5d52OGbSXzWiiXRjAQeuyvcGKyvuSILW2rb3G7Xh+nexzLwhTpek6Ehxd6IjvHePg==",
"dev": true
"integrity": "sha512-rEwE51JWn0yN3Wl5BXeGn5d52OGbSXzWiiXRjAQeuyvcGKyvuSILW2rb3G7Xh+nexzLwhTpek6Ehxd6IjvHePg=="
},
"normalize-package-data": {
"version": "2.4.0",
@ -6273,14 +6276,12 @@
"pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
"dev": true
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"dev": true,
"requires": {
"pinkie": "2.0.4"
}
@ -6392,8 +6393,7 @@
"promise-polyfill": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz",
"integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=",
"dev": true
"integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc="
},
"prop-types": {
"version": "15.6.1",
@ -6605,9 +6605,23 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-1.1.1.tgz",
"integrity": "sha1-rDydOfMgxtzlM5lp0FTvQ90zMxk="
},
"ws": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
"integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
"requires": {
"options": "0.0.6",
"ultron": "1.0.2"
}
}
}
},
"react-native-restart": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/react-native-restart/-/react-native-restart-0.0.6.tgz",
"integrity": "sha512-ysKvNOjCeCS8A4ouQkJ8DZRYH4wgPdPEJqqqSGFuNzK4eAi3VPOeneQ3w0HHYeOui5fc6fV9y9ClOB9LcKbKpQ=="
},
"react-proxy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz",
@ -7430,7 +7444,6 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/shell-utils/-/shell-utils-1.0.9.tgz",
"integrity": "sha512-JbTHnKpMyj9TUUbL+Us2Rx2iVHFvH5QyQoke9SN1L0pueiZeO2Gzlzopmloi7oqObL4qtvdSuZPE3UfdIzmlag==",
"dev": true,
"requires": {
"lodash": "4.17.5"
}
@ -7906,14 +7919,12 @@
"tail": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/tail/-/tail-1.2.3.tgz",
"integrity": "sha1-sI1vp5+5KIaWMaNBpRwUSXwcQlU=",
"dev": true
"integrity": "sha1-sI1vp5+5KIaWMaNBpRwUSXwcQlU="
},
"telnet-client": {
"version": "0.15.3",
"resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-0.15.3.tgz",
"integrity": "sha512-GSfdzQV0BKIYsmeXq7bJFJ2wHeJud6icaIxCUf6QCGQUD6R0BBGbT1+yLDhq67JRdgRpwyPwUbV7JxFeRrZomQ==",
"dev": true,
"requires": {
"bluebird": "3.5.1"
}
@ -8522,8 +8533,7 @@
"universalify": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
"integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
"dev": true
"integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
},
"unpipe": {
"version": "1.0.0",
@ -8704,7 +8714,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
"integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
"dev": true,
"requires": {
"string-width": "1.0.2"
},
@ -8713,7 +8722,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
"number-is-nan": "1.0.1"
}
@ -8722,7 +8730,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",
@ -8798,12 +8805,11 @@
}
},
"ws": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
"integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-5.1.0.tgz",
"integrity": "sha512-7KU/qkUXtJW9aa5WRKlo0puE1ejEoAgDb0D/Pt+lWpTkKF7Kp+MqFOtwNFwnuiYeeDpFjp0qyMniE84OjKIEqQ==",
"requires": {
"options": "0.0.6",
"ultron": "1.0.2"
"async-limiter": "1.0.0"
}
},
"xcode": {

View File

@ -3,7 +3,8 @@
"version": "7.2.0",
"private": true,
"scripts": {
"start": "REACT_DEBUGGER='todo' node node_modules/react-native/local-cli/cli.js start --platforms ios,android --skipflow",
"start-local-debug": "node node_modules/react-native/local-cli/cli.js start --platforms ios,android --skipflow",
"start": "REACT_DEBUGGER='echo nope' node node_modules/react-native/local-cli/cli.js start --platforms ios,android --skipflow",
"start-ci": "REACT_DEBUGGER='todo' node node_modules/react-native/local-cli/cli.js start --platforms ios,android --skipflow --nonPersistent",
"android:dev": "react-native run-android",
"android:prod": "react-native run-android --configuration=release",
@ -12,10 +13,12 @@
"ios:pod:install": "cd ios && rm -rf ReactNativeFirebaseDemo.xcworkspace && pod install && cd .."
},
"dependencies": {
"detox": "^7.2.0",
"mocha": "^4.0.1",
"react": "^16.2.0",
"react-native": "^0.52.3",
"detox": "^7.2.0",
"mocha": "^4.0.1"
"react-native-restart": "0.0.6",
"ws": "^5.1.0"
},
"devDependencies": {
"babel-cli": "^6.24.0",