diff --git a/Examples/UIExplorer/ActivityIndicatorExample.js b/Examples/UIExplorer/ActivityIndicatorIOSExample.js similarity index 100% rename from Examples/UIExplorer/ActivityIndicatorExample.js rename to Examples/UIExplorer/ActivityIndicatorIOSExample.js diff --git a/Examples/UIExplorer/DatePickerExample.js b/Examples/UIExplorer/DatePickerIOSExample.js similarity index 100% rename from Examples/UIExplorer/DatePickerExample.js rename to Examples/UIExplorer/DatePickerIOSExample.js diff --git a/Examples/UIExplorer/ListViewSimpleExample.js b/Examples/UIExplorer/ListViewExample.js similarity index 100% rename from Examples/UIExplorer/ListViewSimpleExample.js rename to Examples/UIExplorer/ListViewExample.js diff --git a/Examples/UIExplorer/ListViewPagingExample.js b/Examples/UIExplorer/ListViewPagingExample.js index 36cc82d869b391..7fdf8966595cb7 100644 --- a/Examples/UIExplorer/ListViewPagingExample.js +++ b/Examples/UIExplorer/ListViewPagingExample.js @@ -11,7 +11,6 @@ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * @providesModule ListViewPagingExample * @flow */ 'use strict'; diff --git a/Examples/UIExplorer/PickerExample.js b/Examples/UIExplorer/PickerIOSExample.js similarity index 100% rename from Examples/UIExplorer/PickerExample.js rename to Examples/UIExplorer/PickerIOSExample.js diff --git a/Examples/UIExplorer/SwitchExample.js b/Examples/UIExplorer/SwitchIOSExample.js similarity index 100% rename from Examples/UIExplorer/SwitchExample.js rename to Examples/UIExplorer/SwitchIOSExample.js diff --git a/Examples/UIExplorer/TabBarExample.js b/Examples/UIExplorer/TabBarIOSExample.js similarity index 100% rename from Examples/UIExplorer/TabBarExample.js rename to Examples/UIExplorer/TabBarIOSExample.js diff --git a/Examples/UIExplorer/UIExplorer.xcodeproj/project.pbxproj.rej b/Examples/UIExplorer/UIExplorer.xcodeproj/project.pbxproj.rej deleted file mode 100644 index fa002c8b07a6b3..00000000000000 --- a/Examples/UIExplorer/UIExplorer.xcodeproj/project.pbxproj.rej +++ /dev/null @@ -1,72 +0,0 @@ -diff a/Libraries/FBReactKit/js/react-native-github/Examples/UIExplorer/UIExplorer.xcodeproj/project.pbxproj b/Libraries/FBReactKit/js/react-native-github/Examples/UIExplorer/UIExplorer.xcodeproj/project.pbxproj (rejected hunks) -@@ -19,6 +19,7 @@ - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 147CED4C1AB3532B00DA3E4C /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 147CED4B1AB34F8C00DA3E4C /* libRCTActionSheet.a */; }; -+ D85B829E1AB6D5D7003F4FE2 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D85B829C1AB6D5CE003F4FE2 /* libRCTVibration.a */; }; - /* End PBXBuildFile section */ - - /* Begin PBXContainerItemProxy section */ -@@ -78,6 +79,13 @@ - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTActionSheet; - }; -+ D85B829B1AB6D5CE003F4FE2 /* PBXContainerItemProxy */ = { -+ isa = PBXContainerItemProxy; -+ containerPortal = D85B82911AB6D5CE003F4FE2 /* RCTVibration.xcodeproj */; -+ proxyType = 2; -+ remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; -+ remoteInfo = RCTVibration; -+ }; - /* End PBXContainerItemProxy section */ - - /* Begin PBXFileReference section */ -@@ -98,6 +106,7 @@ - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 14E0EEC81AB118F7000DECC3 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = ../../Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj; sourceTree = ""; }; -+ D85B82911AB6D5CE003F4FE2 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = ../../Libraries/Vibration/RCTVibration.xcodeproj; sourceTree = ""; }; - /* End PBXFileReference section */ - - /* Begin PBXFrameworksBuildPhase section */ -@@ -112,6 +121,7 @@ - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( -+ D85B829E1AB6D5D7003F4FE2 /* libRCTVibration.a in Frameworks */, - 147CED4C1AB3532B00DA3E4C /* libRCTActionSheet.a in Frameworks */, - 134454601AAFCABD003F0779 /* libRCTAdSupport.a in Frameworks */, - 134A8A2A1AACED7A00945AAE /* libRCTGeolocation.a in Frameworks */, -@@ -145,6 +155,7 @@ - 1316A21D1AA397F400C0188E /* Libraries */ = { - isa = PBXGroup; - children = ( -+ D85B82911AB6D5CE003F4FE2 /* RCTVibration.xcodeproj */, - 14E0EEC81AB118F7000DECC3 /* RCTActionSheet.xcodeproj */, - 13417FFA1AA91531003F314A /* ReactKit.xcodeproj */, - 134454551AAFCAAE003F0779 /* RCTAdSupport.xcodeproj */, -@@ -334,6 +353,10 @@ - ProjectRef = 13417FEA1AA914B8003F314A /* RCTText.xcodeproj */; - }, - { -+ ProductGroup = D85B82921AB6D5CE003F4FE2 /* Products */; -+ ProjectRef = D85B82911AB6D5CE003F4FE2 /* RCTVibration.xcodeproj */; -+ }, -+ { - ProductGroup = 13417FFB1AA91531003F314A /* Products */; - ProjectRef = 13417FFA1AA91531003F314A /* ReactKit.xcodeproj */; - }, -@@ -396,6 +419,13 @@ - remoteRef = 147CED4A1AB34F8C00DA3E4C /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -+ D85B829C1AB6D5CE003F4FE2 /* libRCTVibration.a */ = { -+ isa = PBXReferenceProxy; -+ fileType = archive.ar; -+ path = libRCTVibration.a; -+ remoteRef = D85B829B1AB6D5CE003F4FE2 /* PBXContainerItemProxy */; -+ sourceTree = BUILT_PRODUCTS_DIR; -+ }; - /* End PBXReferenceProxy section */ - - /* Begin PBXResourcesBuildPhase section */ diff --git a/Examples/UIExplorer/UIExplorerList.js b/Examples/UIExplorer/UIExplorerList.js index d2f4d6f0c858c8..cee61af873a74e 100644 --- a/Examples/UIExplorer/UIExplorerList.js +++ b/Examples/UIExplorer/UIExplorerList.js @@ -33,19 +33,19 @@ var { TestModule } = React.addons; var createExamplePage = require('./createExamplePage'); var COMPONENTS = [ - require('./ActivityIndicatorExample'), - require('./DatePickerExample'), + require('./ActivityIndicatorIOSExample'), + require('./DatePickerIOSExample'), require('./ImageExample'), + require('./ListViewExample'), require('./ListViewPagingExample'), - require('./ListViewSimpleExample'), require('./MapViewExample'), require('./NavigatorIOSExample'), NavigatorExample, - require('./PickerExample'), + require('./PickerIOSExample'), require('./ScrollViewExample'), require('./SliderIOSExample'), - require('./SwitchExample'), - require('./TabBarExample'), + require('./SwitchIOSExample'), + require('./TabBarIOSExample'), require('./TextExample.ios'), require('./TextInputExample'), require('./TouchableExample'), diff --git a/Examples/UIExplorer/WebViewExample.js b/Examples/UIExplorer/WebViewExample.js index 057a0016133541..8813a8afdb1a01 100644 --- a/Examples/UIExplorer/WebViewExample.js +++ b/Examples/UIExplorer/WebViewExample.js @@ -18,7 +18,6 @@ var React = require('react-native'); var StyleSheet = require('StyleSheet'); var { - ActivityIndicatorIOS, StyleSheet, Text, TextInput, @@ -95,8 +94,6 @@ var WebViewExample = React.createClass({ automaticallyAdjustContentInsets={false} style={styles.webView} url={this.state.url} - renderError={this.renderError} - renderLoading={this.renderLoading} onNavigationStateChange={this.onNavigationStateChange} startInLoadingState={true} /> @@ -129,33 +126,6 @@ var WebViewExample = React.createClass({ }); }, - renderError: function(errorDomain, errorCode, errorDesc) { - return ( - - - Error loading page - - - {'Domain: ' + errorDomain} - - - {'Error Code: ' + errorCode} - - - {'Description: ' + errorDesc} - - - ); - }, - - renderLoading: function() { - return ( - - - - ); - }, - onSubmitEditing: function(event) { this.pressGoButton(); }, @@ -230,28 +200,6 @@ var styles = StyleSheet.create({ borderRadius: 3, alignSelf: 'stretch', }, - loadingView: { - backgroundColor: BGWASH, - flex: 1, - justifyContent: 'center', - alignItems: 'center', - }, - errorContainer: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - backgroundColor: BGWASH, - }, - errorTextTitle: { - fontSize: 15, - fontWeight: '500', - marginBottom: 10, - }, - errorText: { - fontSize: 14, - textAlign: 'center', - marginBottom: 2, - }, statusBar: { flexDirection: 'row', alignItems: 'center', diff --git a/IntegrationTests/IntegrationTests.xcodeproj/xcshareddata/xcschemes/IntegrationTests.xcscheme b/IntegrationTests/IntegrationTests.xcodeproj/xcshareddata/xcschemes/IntegrationTests.xcscheme index 8c75e37ee541ad..564d15d003abde 100644 --- a/IntegrationTests/IntegrationTests.xcodeproj/xcshareddata/xcschemes/IntegrationTests.xcscheme +++ b/IntegrationTests/IntegrationTests.xcodeproj/xcshareddata/xcschemes/IntegrationTests.xcscheme @@ -22,7 +22,7 @@ diff --git a/Libraries/Components/Touchable/TouchableOpacity.js b/Libraries/Components/Touchable/TouchableOpacity.js index ff1df3851ebbc9..e590999debd23f 100644 --- a/Libraries/Components/Touchable/TouchableOpacity.js +++ b/Libraries/Components/Touchable/TouchableOpacity.js @@ -59,7 +59,7 @@ var TouchableOpacity = React.createClass({ getDefaultProps: function() { return { - activeOpacity: 0.5, + activeOpacity: 0.2, }; }, diff --git a/Libraries/Components/WebView/WebView.ios.js b/Libraries/Components/WebView/WebView.ios.js index f05e2f61b876e6..83c90a1fdbe915 100644 --- a/Libraries/Components/WebView/WebView.ios.js +++ b/Libraries/Components/WebView/WebView.ios.js @@ -11,10 +11,12 @@ */ 'use strict'; +var ActivityIndicatorIOS = require('ActivityIndicatorIOS'); var EdgeInsetsPropType = require('EdgeInsetsPropType'); var React = require('React'); var ReactIOSViewAttributes = require('ReactIOSViewAttributes'); var StyleSheet = require('StyleSheet'); +var Text = require('Text'); var View = require('View'); var createReactIOSNativeComponentClass = require('createReactIOSNativeComponentClass'); @@ -27,6 +29,7 @@ var RCTWebViewManager = require('NativeModules').WebViewManager; var invariant = require('invariant'); +var BGWASH = 'rgba(255,255,255,0.8)'; var RCT_WEBVIEW_REF = 'webview'; var WebViewState = keyMirror({ @@ -52,16 +55,38 @@ type ErrorEvent = { type Event = Object; +var defaultRenderLoading = () => ( + + + +); +var defaultRenderError = (errorDomain, errorCode, errorDesc) => ( + + + Error loading page + + + {'Domain: ' + errorDomain} + + + {'Error Code: ' + errorCode} + + + {'Description: ' + errorDesc} + + +); + var WebView = React.createClass({ statics: { NavigationType: NavigationType, }, propTypes: { - renderError: PropTypes.func.isRequired, // view to show if there's an error - renderLoading: PropTypes.func.isRequired, // loading indicator to show url: PropTypes.string, html: PropTypes.string, + renderError: PropTypes.func, // view to show if there's an error + renderLoading: PropTypes.func, // loading indicator to show automaticallyAdjustContentInsets: PropTypes.bool, shouldInjectAJAXHandler: PropTypes.bool, contentInset: EdgeInsetsPropType, @@ -87,20 +112,23 @@ var WebView = React.createClass({ render: function() { var otherView = null; - if (this.state.viewState === WebViewState.LOADING) { - otherView = this.props.renderLoading(); + if (this.state.viewState === WebViewState.LOADING) { + otherView = (this.props.renderLoading || defaultRenderLoading)(); } else if (this.state.viewState === WebViewState.ERROR) { var errorEvent = this.state.lastErrorEvent; invariant( errorEvent != null, 'lastErrorEvent expected to be non-null' ); - otherView = this.props.renderError( + otherView = (this.props.renderError || defaultRenderError)( errorEvent.domain, errorEvent.code, - errorEvent.description); + errorEvent.description + ); } else if (this.state.viewState !== WebViewState.IDLE) { - console.error('RCTWebView invalid state encountered: ' + this.state.loading); + console.error( + 'RCTWebView invalid state encountered: ' + this.state.loading + ); } var webViewStyles = [styles.container, this.props.style]; @@ -196,10 +224,32 @@ var styles = StyleSheet.create({ container: { flex: 1, }, + errorContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: BGWASH, + }, + errorText: { + fontSize: 14, + textAlign: 'center', + marginBottom: 2, + }, + errorTextTitle: { + fontSize: 15, + fontWeight: '500', + marginBottom: 10, + }, hidden: { height: 0, flex: 0, // disable 'flex:1' when hiding a View }, + loadingView: { + backgroundColor: BGWASH, + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, }); module.exports = WebView; diff --git a/React/Base/RCTConvert.m b/React/Base/RCTConvert.m index 9aea12727b394f..10a8fbd54f5349 100644 --- a/React/Base/RCTConvert.m +++ b/React/Base/RCTConvert.m @@ -459,7 +459,17 @@ + (UIColor *)UIColor:(id)json NSUInteger blue = -1; CGFloat alpha = 1.0; if ([colorString hasPrefix:@"#"]) { - sscanf([colorString UTF8String], "#%02tX%02tX%02tX", &red, &green, &blue); + if (colorString.length == 4) { // 3 digit hex + sscanf([colorString UTF8String], "#%01tX%01tX%01tX", &red, &green, &blue); + // expand to 6 digit hex + red = red | (red << 4); + green = green | (green << 4); + blue = blue | (blue << 4); + } else if (colorString.length == 7) { // normal 6 digit hex + sscanf([colorString UTF8String], "#%02tX%02tX%02tX", &red, &green, &blue); + } else { + RCTLogError(@"Invalid hex color %@. Hex colors should be 3 or 6 digits long", colorString); + } } else if ([colorString hasPrefix:@"rgba("]) { double tmpAlpha; sscanf([colorString UTF8String], "rgba(%zd,%zd,%zd,%lf)", &red, &green, &blue, &tmpAlpha); diff --git a/package.json b/package.json index ca60030f782fce..be08b782b6cae7 100644 --- a/package.json +++ b/package.json @@ -53,13 +53,13 @@ "joi": "~5.1.0", "module-deps": "3.5.6", "optimist": "0.6.1", - "q": "1.0.1", "sane": "1.0.1", "uglify-js": "~2.4.16", "underscore": "1.7.0", "worker-farm": "1.1.0", "yargs": "1.3.2", - "ws": "0.4.31" + "ws": "0.4.31", + "bluebird": "^2.9.21" }, "devDependencies": { "jest-cli": "0.2.1", diff --git a/packager/react-packager/__mocks__/bluebird.js b/packager/react-packager/__mocks__/bluebird.js new file mode 100644 index 00000000000000..9ac6e14b62fe2e --- /dev/null +++ b/packager/react-packager/__mocks__/bluebird.js @@ -0,0 +1,5 @@ +'use strict'; + +jest.autoMockOff(); +module.exports = require.requireActual('bluebird'); +jest.autoMockOn(); diff --git a/packager/react-packager/src/DependencyResolver/haste/DependencyGraph/__tests__/DependencyGraph-test.js b/packager/react-packager/src/DependencyResolver/haste/DependencyGraph/__tests__/DependencyGraph-test.js index 3202274c45aacb..5f6ec8822d6611 100644 --- a/packager/react-packager/src/DependencyResolver/haste/DependencyGraph/__tests__/DependencyGraph-test.js +++ b/packager/react-packager/src/DependencyResolver/haste/DependencyGraph/__tests__/DependencyGraph-test.js @@ -10,7 +10,6 @@ jest .dontMock('../index') - .dontMock('q') .dontMock('path') .dontMock('absolute-path') .dontMock('../docblock') diff --git a/packager/react-packager/src/DependencyResolver/haste/DependencyGraph/index.js b/packager/react-packager/src/DependencyResolver/haste/DependencyGraph/index.js index a23f6d50044bd6..9ca430c49cd7a2 100644 --- a/packager/react-packager/src/DependencyResolver/haste/DependencyGraph/index.js +++ b/packager/react-packager/src/DependencyResolver/haste/DependencyGraph/index.js @@ -9,7 +9,7 @@ 'use strict'; var ModuleDescriptor = require('../../ModuleDescriptor'); -var q = require('q'); +var Promise = require('bluebird'); var fs = require('fs'); var docblock = require('./docblock'); var requirePattern = require('../requirePattern'); @@ -19,10 +19,10 @@ var debug = require('debug')('DependecyGraph'); var util = require('util'); var declareOpts = require('../../../lib/declareOpts'); -var readFile = q.nfbind(fs.readFile); -var readDir = q.nfbind(fs.readdir); -var lstat = q.nfbind(fs.lstat); -var realpath = q.nfbind(fs.realpath); +var readFile = Promise.promisify(fs.readFile); +var readDir = Promise.promisify(fs.readdir); +var lstat = Promise.promisify(fs.lstat); +var realpath = Promise.promisify(fs.realpath); var validateOpts = declareOpts({ roots: { @@ -73,7 +73,7 @@ DependecyGraph.prototype.load = function() { return this._loading; } - this._loading = q.all([ + this._loading = Promise.all([ this._search(), this._buildAssetMap(), ]); @@ -263,7 +263,7 @@ DependecyGraph.prototype._search = function() { var dir = this._queue.shift(); if (dir == null) { - return q.Promise.resolve(this._graph); + return Promise.resolve(this._graph); } // Steps: @@ -292,10 +292,10 @@ DependecyGraph.prototype._search = function() { var processing = self._findAndProcessPackage(files, dir) .then(function() { - return q.all(modulePaths.map(self._processModule.bind(self))); + return Promise.all(modulePaths.map(self._processModule.bind(self))); }); - return q.all([ + return Promise.all([ processing, self._search() ]); @@ -324,7 +324,7 @@ DependecyGraph.prototype._findAndProcessPackage = function(files, root) { if (packagePath != null) { return this._processPackage(packagePath); } else { - return q(); + return Promise.resolve(); } }; @@ -338,7 +338,7 @@ DependecyGraph.prototype._processPackage = function(packagePath) { packageJson = JSON.parse(content); } catch (e) { debug('WARNING: malformed package.json: ', packagePath); - return q(); + return Promise.resolve(); } if (packageJson.name == null) { @@ -346,7 +346,7 @@ DependecyGraph.prototype._processPackage = function(packagePath) { 'WARNING: package.json `%s` is missing a name field', packagePath ); - return q(); + return Promise.resolve(); } packageJson._root = packageRoot; @@ -556,7 +556,7 @@ DependecyGraph.prototype._getAbsolutePath = function(filePath) { DependecyGraph.prototype._buildAssetMap = function() { if (this._assetRoots == null || this._assetRoots.length === 0) { - return q(); + return Promise.resolve(); } this._assetMap = Object.create(null); @@ -640,13 +640,13 @@ function withExtJs(file) { function handleBrokenLink(e) { debug('WARNING: error stating, possibly broken symlink', e.message); - return q(); + return Promise.resolve(); } function readAndStatDir(dir) { return readDir(dir) .then(function(files){ - return q.all(files.map(function(filePath) { + return Promise.all(files.map(function(filePath) { return realpath(path.join(dir, filePath)).catch(handleBrokenLink); })); }).then(function(files) { @@ -660,7 +660,7 @@ function readAndStatDir(dir) { return [ files, - q.all(stats), + Promise.all(stats), ]; }); } @@ -676,7 +676,7 @@ function buildAssetMap(roots, processAsset) { var root = queue.shift(); if (root == null) { - return q(); + return Promise.resolve(); } return readAndStatDir(root).spread(function(files, stats) { diff --git a/packager/react-packager/src/DependencyResolver/haste/__tests__/HasteDependencyResolver-test.js b/packager/react-packager/src/DependencyResolver/haste/__tests__/HasteDependencyResolver-test.js index c81944d8e1a5f9..2a24f2d137cebe 100644 --- a/packager/react-packager/src/DependencyResolver/haste/__tests__/HasteDependencyResolver-test.js +++ b/packager/react-packager/src/DependencyResolver/haste/__tests__/HasteDependencyResolver-test.js @@ -13,7 +13,7 @@ jest.dontMock('../') .dontMock('../requirePattern') .setMock('../../ModuleDescriptor', function(data) {return data;}); -var q = require('q'); +var Promise = require('bluebird'); describe('HasteDependencyResolver', function() { var HasteDependencyResolver; @@ -41,7 +41,7 @@ describe('HasteDependencyResolver', function() { return deps; }); depGraph.load.mockImpl(function() { - return q(); + return Promise.resolve(); }); return depResolver.getDependencies('/root/index.js', { dev: false }) @@ -101,7 +101,7 @@ describe('HasteDependencyResolver', function() { return deps; }); depGraph.load.mockImpl(function() { - return q(); + return Promise.resolve(); }); return depResolver.getDependencies('/root/index.js', { dev: true }) @@ -162,7 +162,7 @@ describe('HasteDependencyResolver', function() { return deps; }); depGraph.load.mockImpl(function() { - return q(); + return Promise.resolve(); }); return depResolver.getDependencies('/root/index.js', { dev: false }) diff --git a/packager/react-packager/src/DependencyResolver/node/index.js b/packager/react-packager/src/DependencyResolver/node/index.js index 46c93c2f1e39c3..573885646e97ce 100644 --- a/packager/react-packager/src/DependencyResolver/node/index.js +++ b/packager/react-packager/src/DependencyResolver/node/index.js @@ -8,7 +8,7 @@ */ 'use strict'; -var Promise = require('q').Promise; +var Promise = require('bluebird'); var ModuleDescriptor = require('../ModuleDescriptor'); var mdeps = require('module-deps'); diff --git a/packager/react-packager/src/FileWatcher/__tests__/FileWatcher-test.js b/packager/react-packager/src/FileWatcher/__tests__/FileWatcher-test.js index e24618dcfee917..fc45205a857c6e 100644 --- a/packager/react-packager/src/FileWatcher/__tests__/FileWatcher-test.js +++ b/packager/react-packager/src/FileWatcher/__tests__/FileWatcher-test.js @@ -9,6 +9,8 @@ 'use strict'; jest + .dontMock('util') + .dontMock('events') .dontMock('../') .dontMock('q') .setMock( @@ -38,6 +40,21 @@ describe('FileWatcher', function() { }); }); + pit('should emit events', function() { + var cb; + Watcher.prototype.on.mockImplementation(function(type, callback) { + cb = callback; + }); + var fileWatcher = new FileWatcher(['rootDir']); + var handler = jest.genMockFn(); + fileWatcher.on('all', handler); + return fileWatcher._loading.then(function(){ + cb(1, 2, 3, 4); + jest.runAllTimers(); + expect(handler.mock.calls[0]).toEqual([1, 2, 3, 4]); + }); + }); + pit('it should end the watcher', function() { var fileWatcher = new FileWatcher(['rootDir']); Watcher.prototype.close.mockImplementation(function(callback) { diff --git a/packager/react-packager/src/FileWatcher/index.js b/packager/react-packager/src/FileWatcher/index.js index 86ec962bd210e8..6f451b482297f9 100644 --- a/packager/react-packager/src/FileWatcher/index.js +++ b/packager/react-packager/src/FileWatcher/index.js @@ -10,12 +10,10 @@ var EventEmitter = require('events').EventEmitter; var sane = require('sane'); -var q = require('q'); +var Promise = require('bluebird'); var util = require('util'); var exec = require('child_process').exec; -var Promise = q.Promise; - var detectingWatcherClass = new Promise(function(resolve) { exec('which watchman', function(err, out) { if (err || out.length === 0) { @@ -41,12 +39,12 @@ function FileWatcher(rootConfigs) { fileWatcher = this; - this._loading = q.all( + this._loading = Promise.all( rootConfigs.map(createWatcher) ).then(function(watchers) { watchers.forEach(function(watcher) { - watcher.on('all', function(type, filepath, root) { - fileWatcher.emit('all', type, filepath, root); + watcher.on('all', function(type, filepath, root, stat) { + fileWatcher.emit('all', type, filepath, root, stat); }); }); return watchers; @@ -59,7 +57,7 @@ util.inherits(FileWatcher, EventEmitter); FileWatcher.prototype.end = function() { return this._loading.then(function(watchers) { watchers.forEach(function(watcher) { - return q.ninvoke(watcher, 'close'); + return Promise.promisify(watcher.close, watcher)(); }); }); }; @@ -88,7 +86,7 @@ function createWatcher(rootConfig) { FileWatcher.createDummyWatcher = function() { var ev = new EventEmitter(); ev.end = function() { - return q(); + return Promise.resolve(); }; return ev; }; diff --git a/packager/react-packager/src/JSTransformer/Cache.js b/packager/react-packager/src/JSTransformer/Cache.js index 363be7b9957c8d..4761d15edf37ee 100644 --- a/packager/react-packager/src/JSTransformer/Cache.js +++ b/packager/react-packager/src/JSTransformer/Cache.js @@ -14,12 +14,10 @@ var declareOpts = require('../lib/declareOpts'); var fs = require('fs'); var isAbsolutePath = require('absolute-path'); var path = require('path'); -var q = require('q'); +var Promise = require('bluebird'); var tmpdir = require('os').tmpDir(); var version = require('../../../../package.json').version; -var Promise = q.Promise; - var validateOpts = declareOpts({ resetCache: { type: 'boolean', @@ -74,7 +72,7 @@ Cache.prototype._set = function(filepath, loaderPromise) { this._data[filepath] = loaderPromise.then(function(data) { return [ data, - q.nfbind(fs.stat)(filepath) + Promise.promisify(fs.stat)(filepath) ]; }).spread(function(data, stat) { this._persistEventually(); @@ -105,13 +103,13 @@ Cache.prototype._persistCache = function() { var data = this._data; var cacheFilepath = this._cacheFilePath; - this._persisting = q.all(_.values(data)) + this._persisting = Promise.all(_.values(data)) .then(function(values) { var json = Object.create(null); Object.keys(data).forEach(function(key, i) { json[key] = values[i]; }); - return q.nfbind(fs.writeFile)(cacheFilepath, JSON.stringify(json)); + return Promise.promisify(fs.writeFile)(cacheFilepath, JSON.stringify(json)); }) .then(function() { this._persisting = null; diff --git a/packager/react-packager/src/JSTransformer/__tests__/Cache-test.js b/packager/react-packager/src/JSTransformer/__tests__/Cache-test.js index 6af1ff9427c06d..51f7ec05ec9d9a 100644 --- a/packager/react-packager/src/JSTransformer/__tests__/Cache-test.js +++ b/packager/react-packager/src/JSTransformer/__tests__/Cache-test.js @@ -15,7 +15,7 @@ jest .dontMock('crypto') .dontMock('../Cache'); -var q = require('q'); +var Promise = require('bluebird'); describe('JSTransformer Cache', function() { var Cache; @@ -32,7 +32,7 @@ describe('JSTransformer Cache', function() { it('calls loader callback for uncached file', function() { var cache = new Cache({projectRoots: ['/rootDir']}); var loaderCb = jest.genMockFn().mockImpl(function() { - return q(); + return Promise.resolve(); }); cache.get('/rootDir/someFile', loaderCb); expect(loaderCb).toBeCalledWith('/rootDir/someFile'); @@ -48,7 +48,7 @@ describe('JSTransformer Cache', function() { }); var cache = new Cache({projectRoots: ['/rootDir']}); var loaderCb = jest.genMockFn().mockImpl(function() { - return q('lol'); + return Promise.resolve('lol'); }); return cache.get('/rootDir/someFile', loaderCb).then(function(value) { expect(value).toBe('lol'); @@ -65,7 +65,7 @@ describe('JSTransformer Cache', function() { }); var cache = new Cache({projectRoots: ['/rootDir']}); var loaderCb = jest.genMockFn().mockImpl(function() { - return q('lol'); + return Promise.resolve('lol'); }); return cache.get('/rootDir/someFile', loaderCb).then(function() { var shouldNotBeCalled = jest.genMockFn(); @@ -152,7 +152,7 @@ describe('JSTransformer Cache', function() { var cache = new Cache({projectRoots: ['/rootDir']}); var loaderCb = jest.genMockFn().mockImpl(function() { - return q('new value'); + return Promise.resolve('new value'); }); return cache.get('/rootDir/someFile', loaderCb).then(function(value) { @@ -193,13 +193,13 @@ describe('JSTransformer Cache', function() { var cache = new Cache({projectRoots: ['/rootDir']}); cache.get('/rootDir/bar', function() { - return q('bar value'); + return Promise.resolve('bar value'); }); cache.get('/rootDir/foo', function() { - return q('foo value'); + return Promise.resolve('foo value'); }); cache.get('/rootDir/baz', function() { - return q('baz value'); + return Promise.resolve('baz value'); }); jest.runAllTicks(); diff --git a/packager/react-packager/src/JSTransformer/index.js b/packager/react-packager/src/JSTransformer/index.js index c7f7bb7f30236f..fde8336e042b1c 100644 --- a/packager/react-packager/src/JSTransformer/index.js +++ b/packager/react-packager/src/JSTransformer/index.js @@ -9,14 +9,13 @@ 'use strict'; var fs = require('fs'); -var q = require('q'); +var Promise = require('bluebird'); var Cache = require('./Cache'); -var _ = require('underscore'); var workerFarm = require('worker-farm'); var declareOpts = require('../lib/declareOpts'); var util = require('util'); -var readFile = q.nfbind(fs.readFile); +var readFile = Promise.promisify(fs.readFile); module.exports = Transformer; Transformer.TransformError = TransformError; @@ -63,12 +62,14 @@ function Transformer(options) { }); if (options.transformModulePath == null) { - this._failedToStart = q.Promise.reject(new Error('No transfrom module')); + this._failedToStart = Promise.reject(new Error('No transfrom module')); } else { this._workers = workerFarm( {autoStart: true, maxConcurrentCallsPerWorker: 1}, options.transformModulePath ); + + this._transform = Promise.promisify(this._workers); } } @@ -86,13 +87,13 @@ Transformer.prototype.loadFileAndTransform = function(filePath) { return this._failedToStart; } - var workers = this._workers; + var transform = this._transform; return this._cache.get(filePath, function() { return readFile(filePath) .then(function(buffer) { var sourceCode = buffer.toString(); - return q.nfbind(workers)({ + return transform({ sourceCode: sourceCode, filename: filePath, }).then( diff --git a/packager/react-packager/src/Packager/__tests__/Packager-test.js b/packager/react-packager/src/Packager/__tests__/Packager-test.js index bed6fac3b54277..8f61df9729c01e 100644 --- a/packager/react-packager/src/Packager/__tests__/Packager-test.js +++ b/packager/react-packager/src/Packager/__tests__/Packager-test.js @@ -11,13 +11,12 @@ jest .setMock('worker-farm', function() { return function() {};}) .dontMock('path') - .dontMock('q') .dontMock('os') .dontMock('underscore') .setMock('uglify-js') .dontMock('../'); -var q = require('q'); +var Promise = require('bluebird'); describe('Packager', function() { var getDependencies; @@ -56,7 +55,7 @@ describe('Packager', function() { ]; getDependencies.mockImpl(function() { - return q({ + return Promise.resolve({ mainModuleId: 'foo', dependencies: modules }); @@ -64,7 +63,7 @@ describe('Packager', function() { require('../../JSTransformer').prototype.loadFileAndTransform .mockImpl(function(path) { - return q({ + return Promise.resolve({ code: 'transformed ' + path, sourceCode: 'source ' + path, sourcePath: path diff --git a/packager/react-packager/src/Packager/index.js b/packager/react-packager/src/Packager/index.js index 843efe75a6d9f0..bf5a635da3a92c 100644 --- a/packager/react-packager/src/Packager/index.js +++ b/packager/react-packager/src/Packager/index.js @@ -11,8 +11,7 @@ var assert = require('assert'); var fs = require('fs'); var path = require('path'); -var q = require('q'); -var Promise = require('q').Promise; +var Promise = require('bluebird'); var Transformer = require('../JSTransformer'); var DependencyResolver = require('../DependencyResolver'); var _ = require('underscore'); @@ -140,7 +139,7 @@ Packager.prototype._transformModule = function(module) { var transform; if (module.isAsset) { - transform = q(generateAssetModule(module)); + transform = Promise.resolve(generateAssetModule(module)); } else { transform = this._transformer.loadFileAndTransform( path.resolve(module.path) diff --git a/packager/react-packager/src/Server/__tests__/Server-test.js b/packager/react-packager/src/Server/__tests__/Server-test.js index aa7ca3493a8f81..a7b6502133b5b0 100644 --- a/packager/react-packager/src/Server/__tests__/Server-test.js +++ b/packager/react-packager/src/Server/__tests__/Server-test.js @@ -9,7 +9,6 @@ 'use strict'; jest.setMock('worker-farm', function() { return function() {}; }) - .dontMock('q') .dontMock('os') .dontMock('path') .dontMock('url') @@ -21,7 +20,7 @@ jest.setMock('worker-farm', function() { return function() {}; }) .setMock('uglify-js') .dontMock('../'); -var q = require('q'); +var Promise = require('bluebird'); describe('processRequest', function() { var server; @@ -36,18 +35,19 @@ describe('processRequest', function() { }; var makeRequest = function(requestHandler, requrl) { - var deferred = q.defer(); - requestHandler({ - url: requrl - },{ - end: function(res) { - deferred.resolve(res); + return new Promise(function(resolve) { + requestHandler( + { url: requrl }, + { + end: function(res) { + resolve(res); + } + }, + { + next: function() {} } - },{ - next: function() {} - } - ); - return deferred.promise; + ); + }); }; var invalidatorFunc = jest.genMockFunction(); @@ -60,7 +60,7 @@ describe('processRequest', function() { FileWatcher = require('../../FileWatcher'); Packager.prototype.package = jest.genMockFunction().mockImpl(function() { - return q({ + return Promise.resolve({ getSource: function() { return 'this is the source'; }, @@ -156,7 +156,7 @@ describe('processRequest', function() { var packageFunc = jest.genMockFunction(); packageFunc .mockReturnValueOnce( - q({ + Promise.resolve({ getSource: function() { return 'this is the first source'; }, @@ -164,7 +164,7 @@ describe('processRequest', function() { }) ) .mockReturnValue( - q({ + Promise.resolve({ getSource: function() { return 'this is the rebuilt source'; }, diff --git a/packager/react-packager/src/Server/index.js b/packager/react-packager/src/Server/index.js index 23af55dbca47ae..6550758153b64b 100644 --- a/packager/react-packager/src/Server/index.js +++ b/packager/react-packager/src/Server/index.js @@ -14,7 +14,7 @@ var declareOpts = require('../lib/declareOpts'); var FileWatcher = require('../FileWatcher'); var Packager = require('../Packager'); var Activity = require('../Activity'); -var q = require('q'); +var Promise = require('bluebird'); var _ = require('underscore'); module.exports = Server; @@ -123,7 +123,7 @@ Server.prototype._rebuildPackages = function() { Object.keys(packages).forEach(function(key) { var options = getOptionsFromUrl(key); // Wait for a previous build (if exists) to finish. - packages[key] = (packages[key] || q()).finally(function() { + packages[key] = (packages[key] || Promise.resolve()).finally(function() { // With finally promise callback we can't change the state of the promise // so we need to reassign the promise. packages[key] = buildPackage(options).then(function(p) { @@ -154,7 +154,7 @@ Server.prototype._informChangeWatchers = function() { }; Server.prototype.end = function() { - q.all([ + Promise.all([ this._fileWatcher.end(), this._packager.kill(), ]); @@ -188,7 +188,7 @@ Server.prototype._processDebugRequest = function(reqUrl, res) { res.end(ret); } else if (parts[1] === 'packages') { ret += '

Cached Packages

'; - q.all(Object.keys(this._packages).map(function(url) { + Promise.all(Object.keys(this._packages).map(function(url) { return this._packages[url].then(function(p) { ret += '

' + url + '

'; ret += p.getDebugInfo();