diff --git a/Examples/HybridMobileDeployCompanion/.npmignore b/.npmignore similarity index 87% rename from Examples/HybridMobileDeployCompanion/.npmignore rename to .npmignore index c39012e..2fd9205 100644 --- a/Examples/HybridMobileDeployCompanion/.npmignore +++ b/.npmignore @@ -25,3 +25,6 @@ DerivedData # node_modules/ npm-debug.log + +# Don't publish example apps +Examples/ diff --git a/Examples/HybridMobileDeployCompanion/iOS/AppDelegate.m b/Examples/HybridMobileDeployCompanion/iOS/AppDelegate.m index e87f1ae..ddc2143 100644 --- a/Examples/HybridMobileDeployCompanion/iOS/AppDelegate.m +++ b/Examples/HybridMobileDeployCompanion/iOS/AppDelegate.m @@ -33,7 +33,7 @@ * on the same Wi-Fi network. */ - //jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle"]; + jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle"]; /** * OPTION 2 @@ -45,7 +45,7 @@ * see http://facebook.github.io/react-native/docs/runningondevice.html */ - jsCodeLocation = [HybridMobileDeploy appBundleUrl:@"HybridMobileDeployCompanion" nativeBundleName:@"main"]; + //jsCodeLocation = [HybridMobileDeploy appBundleUrl:@"HybridMobileDeployCompanion" nativeBundleName:@"main"]; RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName:@"HybridMobileDeployCompanion" diff --git a/Examples/HybridMobileDeployCompanion/iOS/main.jsbundle b/Examples/HybridMobileDeployCompanion/iOS/main.jsbundle index 2451483..09db1d6 100644 --- a/Examples/HybridMobileDeployCompanion/iOS/main.jsbundle +++ b/Examples/HybridMobileDeployCompanion/iOS/main.jsbundle @@ -1101,6 +1101,8 @@ var $__0= React,AppRegistry=$__0.AppRegistry,StyleSheet=$__0.StyleSheet,Text=$__0.Text,View=$__0.View; +var HybridMobileDeploy = require('hybrid-mobile-deploy-react-native'); + var HybridMobileDeployCompanion = React.createClass({displayName: "HybridMobileDeployCompanion", render: function() { return ( @@ -1141,7 +1143,7 @@ var styles = StyleSheet.create({ AppRegistry.registerComponent('HybridMobileDeployCompanion', function() {return HybridMobileDeployCompanion;}); }); -__d('react-native/Libraries/react-native/react-native',["React","ActivityIndicatorIOS","DatePickerIOS","Image","ListView","MapView","NavigatorIOS","PickerIOS","Navigator","SegmentedControlIOS","ScrollView","SliderIOS","SwitchIOS","TabBarIOS","Text","TextInput","TouchableHighlight","TouchableOpacity","TouchableWithoutFeedback","View","WebView","AlertIOS","AppRegistry","AppStateIOS","AsyncStorage","CameraRoll","InteractionManager","LinkingIOS","LayoutAnimation","NetInfo","PixelRatio","PushNotificationIOS","PanResponder","StatusBarIOS","StyleSheet","VibrationIOS","RCTDeviceEventEmitter","NativeModules","requireNativeComponent","LinkedStateMixin","ReactComponentWithPureRenderMixin","NativeModules","ReactUpdates","cloneWithProps","ReactFragment","update","ReactDefaultPerf","ReactTestUtils"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('react-native/Libraries/react-native/react-native',["React","ActivityIndicatorIOS","DatePickerIOS","Image","ListView","MapView","NavigatorIOS","PickerIOS","Navigator","SegmentedControlIOS","ScrollView","SliderIOS","SwitchIOS","TabBarIOS","Text","TextInput","TouchableHighlight","TouchableOpacity","TouchableWithoutFeedback","View","WebView","AlertIOS","AppRegistry","AppStateIOS","AsyncStorage","CameraRoll","InteractionManager","LinkingIOS","LayoutAnimation","NetInfo","PixelRatio","PushNotificationIOS","PanResponder","StatusBarIOS","StyleSheet","VibrationIOS","RCTDeviceEventEmitter","RCTNativeAppEventEmitter","NativeModules","requireNativeComponent","LinkedStateMixin","ReactComponentWithPureRenderMixin","NativeModules","ReactUpdates","cloneWithProps","ReactFragment","update","ReactDefaultPerf","ReactTestUtils"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * @@ -1202,6 +1204,7 @@ var ReactNative = Object.assign(Object.create(require('React')), { // Plugins DeviceEventEmitter: require('RCTDeviceEventEmitter'), + NativeAppEventEmitter: require('RCTNativeAppEventEmitter'), NativeModules: require('NativeModules'), requireNativeComponent: require('requireNativeComponent'), @@ -1236,8 +1239,7 @@ __d('React',["ReactNative"],function(global, require, requireDynamic, requireLaz * @providesModule React * @flow */ - -"use strict"; +'use strict'; module.exports = require('ReactNative'); }); @@ -1252,7 +1254,7 @@ __d('ReactNative',["ReactChildren","ReactClass","ReactComponent","ReactContext", * @providesModule ReactNative * @flow */ -"use strict"; +'use strict'; var ReactChildren = require('ReactChildren'); var ReactClass = require('ReactClass'); @@ -6326,7 +6328,7 @@ var keyOf = function(oneKeyObj) { module.exports = keyOf; }); -__d('ReactNativeDefaultInjection',["InitializeJavaScriptAppEngine","EventPluginHub","EventPluginUtils","IOSDefaultEventPluginOrder","IOSNativeBridgeEventPlugin","NodeHandle","ReactClass","ReactComponentEnvironment","ReactDefaultBatchingStrategy","ReactEmptyComponent","ReactInstanceHandles","ReactNativeComponentEnvironment","ReactNativeGlobalInteractionHandler","ReactNativeGlobalResponderHandler","ReactNativeMount","ReactNativeTextComponent","ReactNativeComponent","ReactUpdates","ResponderEventPlugin","UniversalWorkerNodeHandle","createReactNativeComponentClass","invariant","RCTEventEmitter","RCTLog","RCTJSTimers"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('ReactNativeDefaultInjection',["InitializeJavaScriptAppEngine","EventPluginHub","EventPluginUtils","IOSDefaultEventPluginOrder","IOSNativeBridgeEventPlugin","NodeHandle","ReactComponentEnvironment","ReactDefaultBatchingStrategy","ReactEmptyComponent","ReactInstanceHandles","ReactNativeComponentEnvironment","ReactNativeGlobalInteractionHandler","ReactNativeGlobalResponderHandler","ReactNativeMount","ReactNativeTextComponent","ReactNativeComponent","ReactUpdates","ResponderEventPlugin","UniversalWorkerNodeHandle","createReactNativeComponentClass","invariant","RCTEventEmitter","RCTLog","RCTJSTimers"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * @@ -6337,8 +6339,7 @@ __d('ReactNativeDefaultInjection',["InitializeJavaScriptAppEngine","EventPluginH * @providesModule ReactNativeDefaultInjection * @flow */ - -"use strict"; +'use strict'; /** * Make sure `setTimeout`/`setInterval` are patched correctly. @@ -6349,7 +6350,6 @@ var EventPluginUtils = require('EventPluginUtils'); var IOSDefaultEventPluginOrder = require('IOSDefaultEventPluginOrder'); var IOSNativeBridgeEventPlugin = require('IOSNativeBridgeEventPlugin'); var NodeHandle = require('NodeHandle'); -var ReactClass = require('ReactClass'); var ReactComponentEnvironment = require('ReactComponentEnvironment'); var ReactDefaultBatchingStrategy = require('ReactDefaultBatchingStrategy'); var ReactEmptyComponent = require('ReactEmptyComponent'); @@ -6870,6 +6870,7 @@ __d('ErrorUtils',[],function(global, require, requireDynamic, requireLazy, modul * * @providesModule ErrorUtils */ +/* eslint-disable consistent-this, global-strict */ var GLOBAL = this; @@ -8118,7 +8119,6 @@ var JSTimers = { var newID = JSTimersExecution.GUID++; var freeIndex = JSTimers._getFreeIndex(); JSTimersExecution.timerIDs[freeIndex] = newID; - JSTimersExecution.callbacks[freeIndex] = func; JSTimersExecution.callbacks[freeIndex] = function() { return func.apply(undefined, args); }; @@ -8135,12 +8135,15 @@ var JSTimers = { var newID = JSTimersExecution.GUID++; var freeIndex = JSTimers._getFreeIndex(); JSTimersExecution.timerIDs[freeIndex] = newID; - JSTimersExecution.callbacks[freeIndex] = func; JSTimersExecution.callbacks[freeIndex] = function() { - return func.apply(undefined, args); + var startTime = Date.now(); + var ret = func.apply(undefined, args); + var endTime = Date.now(); + RCTTiming.createTimer(newID, Math.max(0, duration - (endTime - startTime)), endTime, false); + return ret; }; JSTimersExecution.types[freeIndex] = JSTimersExecution.Type.setInterval; - RCTTiming.createTimer(newID, duration, Date.now(), /** recurring */ true); + RCTTiming.createTimer(newID, duration, Date.now(), /** recurring */ false); return newID; }, @@ -8152,7 +8155,6 @@ var JSTimers = { var newID = JSTimersExecution.GUID++; var freeIndex = JSTimers._getFreeIndex(); JSTimersExecution.timerIDs[freeIndex] = newID; - JSTimersExecution.callbacks[freeIndex] = func; JSTimersExecution.callbacks[freeIndex] = function() { return func.apply(undefined, args); }; @@ -8593,9 +8595,9 @@ var ZERO = valuePromise(0); var EMPTYSTRING = valuePromise(''); function valuePromise(value) { - var p = new Promise(Promise._83); - p._32 = 1; - p._8 = value; + var p = new Promise(Promise._1); + p._41 = 1; + p._86 = value; return p; } Promise.resolve = function (value) { @@ -8632,11 +8634,11 @@ Promise.all = function (arr) { function res(i, val) { if (val && (typeof val === 'object' || typeof val === 'function')) { if (val instanceof Promise && val.then === Promise.prototype.then) { - while (val._32 === 3) { - val = val._8; + while (val._41 === 3) { + val = val._86; } - if (val._32 === 1) return res(i, val._8); - if (val._32 === 2) reject(val._8); + if (val._41 === 1) return res(i, val._86); + if (val._41 === 2) reject(val._86); val.then(function (val) { res(i, val); }, reject); @@ -8743,13 +8745,13 @@ function Promise(fn) { if (typeof fn !== 'function') { throw new TypeError('not a function'); } - this._32 = 0; - this._8 = null; - this._89 = []; + this._41 = 0; + this._86 = null; + this._17 = []; if (fn === noop) return; doResolve(fn, this); } -Promise._83 = noop; +Promise._1 = noop; Promise.prototype.then = function(onFulfilled, onRejected) { if (this.constructor !== Promise) { @@ -8768,24 +8770,24 @@ function safeThen(self, onFulfilled, onRejected) { }); }; function handle(self, deferred) { - while (self._32 === 3) { - self = self._8; + while (self._41 === 3) { + self = self._86; } - if (self._32 === 0) { - self._89.push(deferred); + if (self._41 === 0) { + self._17.push(deferred); return; } setImmediate(function() { - var cb = self._32 === 1 ? deferred.onFulfilled : deferred.onRejected; + var cb = self._41 === 1 ? deferred.onFulfilled : deferred.onRejected; if (cb === null) { - if (self._32 === 1) { - resolve(deferred.promise, self._8); + if (self._41 === 1) { + resolve(deferred.promise, self._86); } else { - reject(deferred.promise, self._8); + reject(deferred.promise, self._86); } return; } - var ret = tryCallOne(cb, self._8); + var ret = tryCallOne(cb, self._86); if (ret === IS_ERROR) { reject(deferred.promise, LAST_ERROR); } else { @@ -8813,8 +8815,8 @@ function resolve(self, newValue) { then === self.then && newValue instanceof Promise ) { - self._32 = 3; - self._8 = newValue; + self._41 = 3; + self._86 = newValue; finale(self); return; } else if (typeof then === 'function') { @@ -8822,21 +8824,21 @@ function resolve(self, newValue) { return; } } - self._32 = 1; - self._8 = newValue; + self._41 = 1; + self._86 = newValue; finale(self); } function reject(self, newValue) { - self._32 = 2; - self._8 = newValue; + self._41 = 2; + self._86 = newValue; finale(self); } function finale(self) { - for (var i = 0; i < self._89.length; i++) { - handle(self, self._89[i]); + for (var i = 0; i < self._17.length; i++) { + handle(self, self._17[i]); } - self._89 = null; + self._17 = null; } function Handler(onFulfilled, onRejected, promise){ @@ -8902,6 +8904,7 @@ __d('SourceMap',[],function(global, require, requireDynamic, requireLazy, module * and wrapping resulting file into `wrapper` function. * */ +/*eslint-disable */ var scope = {}; wrapper.call(scope); @@ -10859,6 +10862,7 @@ __d('react-native/Libraries/JavaScriptAppEngine/Initialization/source-map-url',[ * * @nolint */ +/* eslint-disable */ (function() { var define = null; // Hack to make it work with our packager @@ -11406,6 +11410,7 @@ __d('fetch',[],function(global, require, requireDynamic, requireLazy, module, ex * @providesModule fetch * @nolint */ +/* eslint-disable */ 'use strict'; var self = {}; @@ -11895,7 +11900,7 @@ var Geolocation = { subscriptions = []; } } -} +}; module.exports = Geolocation; }); @@ -13092,8 +13097,7 @@ __d('IOSNativeBridgeEventPlugin',["EventPropagators","NativeModules","SyntheticE * @providesModule IOSNativeBridgeEventPlugin * @flow */ - -"use strict"; +'use strict'; var EventPropagators = require('EventPropagators'); var NativeModules = require('NativeModules'); @@ -13116,7 +13120,7 @@ for (var bubblingTypeName in customBubblingEventTypes) { for (var directTypeName in customDirectEventTypes) { warning( !customBubblingEventTypes[directTypeName], - "Event cannot be both direct and bubbling: %s", + 'Event cannot be both direct and bubbling: %s', directTypeName ); allTypesByEventName[directTypeName] = customDirectEventTypes[directTypeName]; @@ -13159,7 +13163,6 @@ var IOSNativeBridgeEventPlugin = { }; module.exports = IOSNativeBridgeEventPlugin; - }); __d('EventPropagators',["EventConstants","EventPluginHub","accumulateInto","forEachAccumulated"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright 2013-2014 Facebook, Inc. @@ -14152,8 +14155,7 @@ __d('ReactNativeDOMIDOperations',["ReactNativeTagHandles","ReactMultiChildUpdate * @providesModule ReactNativeDOMIDOperations * @flow */ - -"use strict"; +'use strict'; var ReactNativeTagHandles = require('ReactNativeTagHandles'); var ReactMultiChildUpdateTypes = require('ReactMultiChildUpdateTypes'); @@ -14390,8 +14392,7 @@ __d('ReactNativeReconcileTransaction',["CallbackQueue","PooledClass","Transactio * @providesModule ReactNativeReconcileTransaction * @flow */ - -"use strict"; +'use strict'; var CallbackQueue = require('CallbackQueue'); var PooledClass = require('PooledClass'); @@ -14539,6 +14540,13 @@ var invariant = require('invariant'); var keyMirror = require('keyMirror'); var setImmediate = require('setImmediate'); + + +/** + * Maximum time a handle can be open before warning in DEV. + */ +var DEV_TIMEOUT = 2000; + var _emitter = new EventEmitter(); var _interactionSet = new Set(); var _addInteractionSet = new Set(); @@ -14607,6 +14615,14 @@ var InteractionManager = { scheduleUpdate(); var handle = ++_inc; _addInteractionSet.add(handle); + if (__DEV__) { + // Capture the stack trace of what created the handle. + var error = new Error( + 'InteractionManager: interaction handle not cleared within ' + + DEV_TIMEOUT + ' ms.' + ); + setDevTimeoutHandle(handle, error, DEV_TIMEOUT); + } return handle; }, @@ -14671,6 +14687,21 @@ function processUpdate() { _deleteInteractionSet.clear(); } +/** + * Wait until `timeout` has passed and warn if the handle has not been cleared. + */ +function setDevTimeoutHandle( + handle , + error , + timeout +) { + setTimeout(function() { + if (_interactionSet.has(handle)) { + console.warn(error.message + '\n' + error.stack); + } + }, timeout); +} + module.exports = InteractionManager; }); __d('Set',["Map","toIterator","_shouldPolyfillES6Collection"],function(global, require, requireDynamic, requireLazy, module, exports) { /** @@ -15851,7 +15882,7 @@ var ReactNativeGlobalResponderHandler = { module.exports = ReactNativeGlobalResponderHandler; }); -__d('ReactNativeMount',["NativeModules","ReactNativeTagHandles","ReactPerf","ReactReconciler","ReactUpdateQueue","ReactUpdates","emptyObject","instantiateReactComponent","invariant","shouldUpdateReactComponent"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('ReactNativeMount',["NativeModules","ReactNativeTagHandles","ReactPerf","ReactReconciler","ReactUpdateQueue","ReactUpdates","emptyObject","instantiateReactComponent","shouldUpdateReactComponent"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * @@ -15874,7 +15905,6 @@ var ReactUpdates = require('ReactUpdates'); var emptyObject = require('emptyObject'); var instantiateReactComponent = require('instantiateReactComponent'); -var invariant = require('invariant'); var shouldUpdateReactComponent = require('shouldUpdateReactComponent'); function instanceNumberToChildRootID(rootNodeID, instanceNumber) { @@ -18185,7 +18215,7 @@ var UniversalWorkerNodeHandle = { module.exports = UniversalWorkerNodeHandle; }); -__d('createReactNativeComponentClass',["ReactElement","ReactNativeBaseComponent"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('createReactNativeComponentClass',["ReactNativeBaseComponent"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * @@ -18197,9 +18227,8 @@ __d('createReactNativeComponentClass',["ReactElement","ReactNativeBaseComponent" * @flow */ -"use strict"; +'use strict'; -var ReactElement = require('ReactElement'); var ReactNativeBaseComponent = require('ReactNativeBaseComponent'); // See also ReactNativeBaseComponent @@ -18295,7 +18324,8 @@ var cachedIndexArray = function(size) { for (var i = 0; i < size; i++) { arr[i] = i; } - return cachedIndexArray._cache[size] = arr; + cachedIndexArray._cache[size] = arr; + return arr; } else { return cachedResult; } @@ -18460,7 +18490,7 @@ ReactNativeBaseComponent.Mixin = { */ _reconcileListenersUponUpdate: function(prevProps, nextProps) { for (var key in nextProps) { - if (registrationNames[key] && (nextProps[key] != prevProps[key])) { + if (registrationNames[key] && (nextProps[key] !== prevProps[key])) { putListener(this._rootNodeID, key, nextProps[key]); } } @@ -19210,6 +19240,7 @@ __d('MatrixMath',["invariant"],function(global, require, requireDynamic, require * * @providesModule MatrixMath */ +/* eslint-disable space-infix-ops */ 'use strict'; var invariant = require('invariant'); @@ -19814,8 +19845,7 @@ __d('ReactNativeEventEmitter',["EventPluginHub","ReactEventEmitterMixin","ReactN * @providesModule ReactNativeEventEmitter * @flow */ - -"use strict"; +'use strict'; var EventPluginHub = require('EventPluginHub'); var ReactEventEmitterMixin = require('ReactEventEmitterMixin'); @@ -21713,7 +21743,6 @@ __d('RCTLog',["invariant"],function(global, require, requireDynamic, requireLazy * @providesModule RCTLog * @flow */ - /* globals nativeLoggingHook */ 'use strict'; var invariant = require('invariant'); @@ -21856,7 +21885,7 @@ function onlyChild(children) { module.exports = onlyChild; }); -__d('ActivityIndicatorIOS',["NativeMethodsMixin","NativeModules","ReactPropTypes","React","StyleSheet","View","requireNativeComponent","verifyPropTypes"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('ActivityIndicatorIOS',["NativeMethodsMixin","ReactPropTypes","React","StyleSheet","View","requireNativeComponent","verifyPropTypes"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * @@ -21870,7 +21899,6 @@ __d('ActivityIndicatorIOS',["NativeMethodsMixin","NativeModules","ReactPropTypes 'use strict'; var NativeMethodsMixin = require('NativeMethodsMixin'); -var NativeModules = require('NativeModules'); var PropTypes = require('ReactPropTypes'); var React = require('React'); var StyleSheet = require('StyleSheet'); @@ -21911,6 +21939,12 @@ var ActivityIndicatorIOS = React.createClass({displayName: "ActivityIndicatorIOS 'small', 'large', ]), + /** + * Invoked on mount and layout changes with + * + * {nativeEvent: { layout: {x, y, width, height}}}. + */ + onLayout: PropTypes.func, }, getDefaultProps: function() { @@ -21923,10 +21957,12 @@ var ActivityIndicatorIOS = React.createClass({displayName: "ActivityIndicatorIOS }, render: function() { - var $__0= this.props,style=$__0.style,props=(function(source, exclusion) {var rest = {};var hasOwn = Object.prototype.hasOwnProperty;if (source == null) {throw new TypeError();}for (var key in source) {if (hasOwn.call(source, key) && !hasOwn.call(exclusion, key)) {rest[key] = source[key];}}return rest;})($__0,{style:1}); + var $__0= this.props,onLayout=$__0.onLayout,style=$__0.style,props=(function(source, exclusion) {var rest = {};var hasOwn = Object.prototype.hasOwnProperty;if (source == null) {throw new TypeError();}for (var key in source) {if (hasOwn.call(source, key) && !hasOwn.call(exclusion, key)) {rest[key] = source[key];}}return rest;})($__0,{onLayout:1,style:1}); var sizeStyle = (this.props.size === 'large') ? styles.sizeLarge : styles.sizeSmall; return ( - React.createElement(View, {style: [styles.container, sizeStyle, style]}, + React.createElement(View, { + onLayout: onLayout, + style: [styles.container, sizeStyle, style]}, React.createElement(RCTActivityIndicatorView, React.__spread({}, props)) ) ); @@ -22139,6 +22175,26 @@ var createReactNativeComponentClass = require('createReactNativeComponentClass') var stylePropType = StyleSheetPropType(ViewStylePropTypes); +var AccessibilityTraits = [ + 'none', + 'button', + 'link', + 'header', + 'search', + 'image', + 'selected', + 'plays', + 'key', + 'text', + 'summary', + 'disabled', + 'frequentUpdates', + 'startsMedia', + 'adjustable', + 'allowsDirectInteraction', + 'pageTurn', +]; + /** * The most fundamental component for building UI, `View` is a * container that supports layout with flexbox, style, some touch handling, and @@ -22185,6 +22241,27 @@ var View = React.createClass({displayName: "View", */ accessibilityLabel: PropTypes.string, + /** + * Provides additional traits to screen reader. By default no traits are + * provided unless specified otherwise in element + */ + accessibilityTraits: PropTypes.oneOfType([ + PropTypes.oneOf(AccessibilityTraits), + PropTypes.arrayOf(PropTypes.oneOf(AccessibilityTraits)), + ]), + + /** + * When `accessible` is true, the system will try to invoke this function + * when the user performs accessibility tap gesture. + */ + onAcccessibilityTap: PropTypes.func, + + /** + * When `accessible` is true, the system will invoke this function when the + * user performs the magic tap gesture. + */ + onMagicTap: PropTypes.func, + /** * Used to locate this view in end-to-end tests. */ @@ -22206,7 +22283,9 @@ var View = React.createClass({displayName: "View", onStartShouldSetResponderCapture: PropTypes.func, /** - * Invoked on mount and layout changes with {x, y, width, height}. + * Invoked on mount and layout changes with + * + * {nativeEvent: { layout: {x, y, width, height}}}. */ onLayout: PropTypes.func, @@ -22323,8 +22402,11 @@ ReactNativeViewAttributes.UIView = { pointerEvents: true, accessible: true, accessibilityLabel: true, + accessibilityTraits: true, testID: true, onLayout: true, + onAccessibilityTap: true, + onMagicTap: true, }; ReactNativeViewAttributes.RCTView = merge( @@ -22665,6 +22747,13 @@ function verifyPropTypes( if (!viewConfig) { return; // This happens for UnimplementedView. } + var componentName = component.name || component.displayName; + if (!component.propTypes) { + throw new Error( + '`' + componentName + '` has no propTypes defined`' + ); + } + var nativeProps = viewConfig.nativeProps; for (var prop in nativeProps) { if (!component.propTypes[prop] && @@ -22672,9 +22761,9 @@ function verifyPropTypes( !ReactNativeStyleAttributes[prop] && (!nativePropsToIgnore || !nativePropsToIgnore[prop])) { throw new Error( - '`' + component.displayName + '` has no propType for native prop `' + + '`' + componentName + '` has no propType for native prop `' + viewConfig.uiViewClassName + '.' + prop + '` of native type `' + - nativeProps[prop].type + '`' + nativeProps[prop] + '`' ); } } @@ -22895,7 +22984,7 @@ var Image = React.createClass({displayName: "Image", /** * `uri` is a string representing the resource identifier for the image, which * could be an http address, a local file path, or the name of a static image - * resource (which should be wrapped in the `required('image!name')` function). + * resource (which should be wrapped in the `require('image!name')` function). */ source: PropTypes.shape({ uri: PropTypes.string, @@ -22934,6 +23023,12 @@ var Image = React.createClass({displayName: "Image", * testing scripts. */ testID: PropTypes.string, + /** + * Invoked on mount and layout changes with + * + * {nativeEvent: { layout: {x, y, width, height}}}. + */ + onLayout: PropTypes.func, }, statics: { @@ -23025,7 +23120,7 @@ if (__DEV__) { module.exports = Image; }); -__d('EdgeInsetsPropType',["ReactPropTypes","createStrictShapeTypeChecker","insetsDiffer"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('EdgeInsetsPropType',["ReactPropTypes","createStrictShapeTypeChecker"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * @@ -23036,12 +23131,11 @@ __d('EdgeInsetsPropType',["ReactPropTypes","createStrictShapeTypeChecker","inset * @providesModule EdgeInsetsPropType * @flow */ -'use strict' +'use strict'; var PropTypes = require('ReactPropTypes'); var createStrictShapeTypeChecker = require('createStrictShapeTypeChecker'); -var insetsDiffer = require('insetsDiffer'); var EdgeInsetsPropType = createStrictShapeTypeChecker({ top: PropTypes.number, @@ -24683,7 +24777,7 @@ if (Platform.OS === 'android') { module.exports = ScrollView; }); -__d('PointPropType',["ReactPropTypes","createStrictShapeTypeChecker","pointsDiffer"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('PointPropType',["ReactPropTypes","createStrictShapeTypeChecker"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * @@ -24694,12 +24788,11 @@ __d('PointPropType',["ReactPropTypes","createStrictShapeTypeChecker","pointsDiff * @providesModule PointPropType * @flow */ -'use strict' +'use strict'; var PropTypes = require('ReactPropTypes'); var createStrictShapeTypeChecker = require('createStrictShapeTypeChecker'); -var pointsDiffer = require('pointsDiffer'); var PointPropType = createStrictShapeTypeChecker({ x: PropTypes.number, @@ -24893,7 +24986,7 @@ var ScrollResponderMixin = { var currentlyFocusedTextInput = TextInputState.currentlyFocusedField(); if (!this.props.keyboardShouldPersistTaps && currentlyFocusedTextInput != null && - e.target != currentlyFocusedTextInput) { + e.target !== currentlyFocusedTextInput) { return true; } return this.scrollResponderIsAnimating(); @@ -24954,7 +25047,7 @@ var ScrollResponderMixin = { var currentlyFocusedTextInput = TextInputState.currentlyFocusedField(); if (!this.props.keyboardShouldPersistTaps && currentlyFocusedTextInput != null && - e.target != currentlyFocusedTextInput && + e.target !== currentlyFocusedTextInput && !this.state.observedScrollSinceBecomingResponder && !this.state.becameResponderWhileAnimating) { this.props.onScrollResponderKeyboardDismissed && @@ -25210,7 +25303,7 @@ __d('Subscribable',["EventEmitter"],function(global, require, requireDynamic, re */ 'use strict'; -var EventEmitter = require('EventEmitter'); + /** * Subscribable provides a mixin for safely subscribing a component to an @@ -26411,7 +26504,7 @@ var RCTPickerIOS = createReactNativeComponentClass({ module.exports = PickerIOS; }); -__d('Navigator',["NativeModules","BackAndroid","Dimensions","InteractionMixin","NavigatorBreadcrumbNavigationBar","NavigatorInterceptor","NavigatorNavigationBar","NavigatorSceneConfigs","NavigatorStaticContextContainer","PanResponder","Platform","React","StaticContainer.react","StyleSheet","Subscribable","react-timer-mixin/TimerMixin","View","clamp","flattenStyle","getNavigatorContext","invariant","keyMirror","merge","rebound/rebound"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('Navigator',["NativeModules","BackAndroid","Dimensions","InteractionMixin","NavigatorBreadcrumbNavigationBar","NavigatorInterceptor","NavigatorNavigationBar","NavigatorSceneConfigs","NavigatorStaticContextContainer","PanResponder","Platform","React","StaticContainer.react","StyleSheet","Subscribable","react-timer-mixin/TimerMixin","View","clamp","flattenStyle","getNavigatorContext","invariant","rebound/rebound"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015, Facebook, Inc. All rights reserved. * * Facebook, Inc. (“Facebook”) owns all right, title and interest, including @@ -26437,6 +26530,7 @@ __d('Navigator',["NativeModules","BackAndroid","Dimensions","InteractionMixin"," * * @providesModule Navigator */ + /* eslint-disable no-extra-boolean-cast*/ 'use strict'; var AnimationsDebugModule = require('NativeModules').AnimationsDebugModule; @@ -26461,8 +26555,6 @@ var clamp = require('clamp'); var flattenStyle = require('flattenStyle'); var getNavigatorContext = require('getNavigatorContext'); var invariant = require('invariant'); -var keyMirror = require('keyMirror'); -var merge = require('merge'); var rebound = require('rebound/rebound'); var PropTypes = React.PropTypes; @@ -27102,7 +27194,7 @@ var Navigator = React.createClass({displayName: "Navigator", */ _enableScene: function(sceneIndex) { // First, determine what the defined styles are for scenes in this navigator - var sceneStyle = flattenStyle(this.props.sceneStyle); + var sceneStyle = flattenStyle([styles.baseScene, this.props.sceneStyle]); // Then restore the left value for this scene var enabledSceneNativeProps = { left: sceneStyle.left, @@ -27158,7 +27250,6 @@ var Navigator = React.createClass({displayName: "Navigator", }, _handleMoveShouldSetPanResponder: function(e, gestureState) { - var currentRoute = this.state.routeStack[this.state.presentedIndex]; var sceneConfig = this.state.sceneConfigStack[this.state.presentedIndex]; this._expectingGestureGrant = this._matchGestureAction(this._eligibleGestures, sceneConfig.gestures, gestureState); return !! this._expectingGestureGrant; @@ -27242,7 +27333,16 @@ var Navigator = React.createClass({displayName: "Navigator", } } else { // The gesture has enough velocity to complete, so we transition to the gesture's destination - this._transitionTo(destIndex, transitionVelocity); + this._transitionTo( + destIndex, + transitionVelocity, + null, + function() { + if (releaseGestureAction === 'pop') { + this._cleanScenesPastIndex(destIndex); + } + }.bind(this) + ); } this._detachGesture(); }, @@ -27704,6 +27804,14 @@ var Navigator = React.createClass({displayName: "Navigator", if (i !== this.state.presentedIndex) { disabledSceneStyle = styles.disabledScene; } + var originalRef = child.ref; + if (originalRef != null && typeof originalRef !== 'function') { + console.warn( + 'String refs are not supported for navigator scenes. Use a callback ' + + 'ref instead. Ignoring ref: ' + originalRef + ); + originalRef = null; + } return ( React.createElement(View, { key: this.state.idStack[i], @@ -27713,7 +27821,12 @@ var Navigator = React.createClass({displayName: "Navigator", }.bind(this), style: [styles.baseScene, this.props.sceneStyle, disabledSceneStyle]}, React.cloneElement(child, { - ref: this._handleItemRef.bind(null, this.state.idStack[i], route), + ref: function(component) { + this._handleItemRef(this.state.idStack[i], route, component); + if (originalRef) { + originalRef(component); + } + }.bind(this) }) ) ); @@ -28532,6 +28645,7 @@ __d('buildStyleInterpolator',["keyOf"],function(global, require, requireDynamic, /** * Cannot "use strict" because we must use eval in this file. */ +/* eslint-disable global-strict */ var keyOf = require('keyOf'); @@ -28897,7 +29011,7 @@ var MatrixOpsInitial = { var setNextValAndDetectChange = function(name, tmpVarName) { return ( ' if (!didChange) {\n' + - ' var prevVal = result.' + name +';\n' + + ' var prevVal = result.' + name + ';\n' + ' result.' + name + ' = ' + tmpVarName + ';\n' + ' didChange = didChange || (' + tmpVarName + ' !== prevVal);\n' + ' } else {\n' + @@ -29635,7 +29749,7 @@ var FromTheLeft = Object.assign({}, translateX: { from: -SCREEN_WIDTH, to: 0, - min: 0, + min: 0, max: 1, type: 'linear', extrapolate: true, @@ -32245,6 +32359,12 @@ var Text = React.createClass({displayName: "Text", * Used to locate this view in end-to-end tests. */ testID: React.PropTypes.string, + /** + * Invoked on mount and layout changes with + * + * {nativeEvent: { layout: {x, y, width, height}}}. + */ + onLayout: React.PropTypes.func, }, viewConfig: viewConfig, @@ -33184,7 +33304,6 @@ var queryLayoutByID = function( }; module.exports = queryLayoutByID; - }); __d('TextInput',["DocumentSelectionState","EventEmitter","NativeMethodsMixin","NativeModules","Platform","ReactPropTypes","React","ReactChildren","ReactNativeViewAttributes","StyleSheet","Text","TextInputState","react-timer-mixin/TimerMixin","TouchableWithoutFeedback","createReactNativeComponentClass","emptyFunction","invariant","merge"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. @@ -33367,12 +33486,12 @@ var TextInput = React.createClass({displayName: "TextInput", 'number-pad', 'phone-pad', 'name-phone-pad', - 'email-address', 'decimal-pad', 'twitter', 'web-search', // Cross-platform 'numeric', + 'email-address', ]), /** * Determines how the return key should look. @@ -35764,7 +35883,7 @@ function getObjectValues(obj) { module.exports = getObjectValues; }); -__d('WebView',["ActivityIndicatorIOS","EdgeInsetsPropType","React","ReactNativeViewAttributes","StyleSheet","Text","View","invariant","keyMirror","requireNativeComponent","NativeModules"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('WebView',["ActivityIndicatorIOS","EdgeInsetsPropType","React","StyleSheet","Text","View","invariant","keyMirror","requireNativeComponent","NativeModules"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * @@ -35780,7 +35899,6 @@ __d('WebView',["ActivityIndicatorIOS","EdgeInsetsPropType","React","ReactNativeV var ActivityIndicatorIOS = require('ActivityIndicatorIOS'); var EdgeInsetsPropType = require('EdgeInsetsPropType'); var React = require('React'); -var ReactNativeViewAttributes = require('ReactNativeViewAttributes'); var StyleSheet = require('StyleSheet'); var Text = require('Text'); var View = require('View'); @@ -35964,7 +36082,7 @@ var WebView = React.createClass({displayName: "WebView", onLoadingError: function(event ) { event.persist(); // persist this event because we need to store it - console.error("encountered an error loading page", event.nativeEvent); + console.error('Encountered an error loading page', event.nativeEvent); this.setState({ lastErrorEvent: event.nativeEvent, @@ -36942,7 +37060,7 @@ function convertError(error) { module.exports = AsyncStorage; }); -__d('RCTRenderingPerf',["ReactDefaultPerf","ReactPerf","invariant"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('RCTRenderingPerf',["ReactDefaultPerf","invariant"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * @@ -36956,7 +37074,6 @@ __d('RCTRenderingPerf',["ReactDefaultPerf","ReactPerf","invariant"],function(glo 'use strict'; var ReactDefaultPerf = require('ReactDefaultPerf'); -var ReactPerf = require('ReactPerf'); var invariant = require('invariant'); @@ -40114,7 +40231,7 @@ if (RCTReachability) { module.exports = NetInfo; }); -__d('PushNotificationIOS',["NativeModules","RCTDeviceEventEmitter","NativeModules","invariant"],function(global, require, requireDynamic, requireLazy, module, exports) { /** +__d('PushNotificationIOS',["RCTDeviceEventEmitter","NativeModules","invariant"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * @@ -40127,7 +40244,6 @@ __d('PushNotificationIOS',["NativeModules","RCTDeviceEventEmitter","NativeModule */ 'use strict'; -var NativeModules = require('NativeModules'); var RCTDeviceEventEmitter = require('RCTDeviceEventEmitter'); var RCTPushNotificationManager = require('NativeModules').PushNotificationManager; var invariant = require('invariant'); @@ -40383,6 +40499,25 @@ var VibrationIOS = { module.exports = VibrationIOS; }); +__d('RCTNativeAppEventEmitter',["EventEmitter"],function(global, require, requireDynamic, requireLazy, module, exports) { /** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule RCTNativeAppEventEmitter + * @flow + */ +'use strict'; + +var EventEmitter = require('EventEmitter'); + +var RCTNativeAppEventEmitter = new EventEmitter(); + +module.exports = RCTNativeAppEventEmitter; +}); __d('LinkedStateMixin',["ReactLink","ReactStateSetters"],function(global, require, requireDynamic, requireLazy, module, exports) { /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. diff --git a/Examples/HybridMobileDeployCompanion/index.ios.js b/Examples/HybridMobileDeployCompanion/index.ios.js index 4e993bf..b34cc0a 100644 --- a/Examples/HybridMobileDeployCompanion/index.ios.js +++ b/Examples/HybridMobileDeployCompanion/index.ios.js @@ -12,6 +12,8 @@ var { View, } = React; +var HybridMobileDeploy = require('react-native-hybrid-mobile-deploy')('http://localhost:3000/', 'HybridMobileDeployCompanion'); + var HybridMobileDeployCompanion = React.createClass({ render: function() { return ( diff --git a/Examples/HybridMobileDeployCompanion/package.json b/Examples/HybridMobileDeployCompanion/package.json index be56a24..af59b63 100644 --- a/Examples/HybridMobileDeployCompanion/package.json +++ b/Examples/HybridMobileDeployCompanion/package.json @@ -6,6 +6,7 @@ "start": "node_modules/react-native/packager/packager.sh" }, "dependencies": { - "react-native": "^0.4.4" + "react-native": "^0.4.4", + "react-native-hybrid-mobile-deploy": "file:../.." } } diff --git a/HybridMobileDeploy.android.js b/HybridMobileDeploy.android.js index ccc6d7b..5536c57 100644 --- a/HybridMobileDeploy.android.js +++ b/HybridMobileDeploy.android.js @@ -1,7 +1,7 @@ /** - * Stub of HybridMobileDeploy for Android. + * Stub of UpdateManager for Android. * - * @providesModule HybridMobileDeploy + * @providesModule UpdateManager * @flow */ 'use strict'; diff --git a/HybridMobileDeploy.ios.js b/HybridMobileDeploy.ios.js index 932794a..6ffe08c 100644 --- a/HybridMobileDeploy.ios.js +++ b/HybridMobileDeploy.ios.js @@ -2,19 +2,65 @@ * @providesModule HybridMobileDeploy * @flow */ + 'use strict'; var NativeHybridMobileDeploy = require('NativeModules').HybridMobileDeploy; -var invariant = require('invariant'); - -/** - * High-level docs for the HybridMobileDeploy iOS API can be written here. - */ +var semver = require('semver'); +var serverUrl; +var appName; var HybridMobileDeploy = { - test: function() { - NativeHybridMobileDeploy.test(); + checkForUpdate: function(version, callback) { + var url = serverUrl + 'latest/' + appName; + fetch(url) + .then(response => response.json()) + .done(latest => { + if (semver.gt(latest.version, version)) { + callback(undefined, latest); + } else { + callback(undefined, false); + } + }, err => { + callback(err); + }); + }, + pollForUpdate: function(version, intervalDelay, callback) { + var interval; + var checkUpdate = () => { + this.checkForUpdate(version, (err, update) => { + if (err) { + callback(err); + } else if (update) { + interval && clearInterval(interval); + callback(undefined, update); + } + }); + }; + interval = setInterval(checkUpdate, intervalDelay); + checkUpdate(); + }, + getAvailableUpdates: function(callback) { + var url = serverUrl + 'updates/' + appName; + console.log(url); + fetch(url) + .then((response) => { + console.log(response); + return response.json() + }) + .then((value) => { + console.log(value); + return value; + }) + .then(callback); + }, + installUpdate: function(update) { + NativeHybridMobileDeploy.installUpdateFromUrl(update.updateUrl, update.bundleName, (err) => console.log(err), () => console.log("success")); } }; -module.exports = HybridMobileDeploy; +module.exports = function(server, app) { + serverUrl = server; + appName = app; + return HybridMobileDeploy; +}; diff --git a/package.json b/package.json index 8cea13f..3973223 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,10 @@ { - "name": "HybridMobileDeploy", + "name": "react-native-hybrid-mobile-deploy", "version": "0.0.1", + "main": "HybridMobileDeploy.ios.js", "keywords": "react-native", "dependencies": { - "react-native": "^0.5.0" + "react-native": "^0.5.0", + "semver": "^4.3.6" } }