Merge pull request #175 from vjeux/update9

Updates from Fri 20 Mar
This commit is contained in:
Christopher Chedeau 2015-03-21 10:38:21 -07:00
commit edb9322fe4
17 changed files with 97 additions and 111 deletions

View File

@ -2,11 +2,12 @@
* Copyright 2004-present Facebook. All Rights Reserved. * Copyright 2004-present Facebook. All Rights Reserved.
* *
* @providesModule GameBoard * @providesModule GameBoard
* @flow
*/ */
'use strict'; 'use strict';
// NB: Taken straight from: https://github.com/IvanVergiliev/2048-react/blob/master/src/board.js // NB: Taken straight from: https://github.com/IvanVergiliev/2048-react/blob/master/src/board.js
// with no modificiation except to format it for CommonJS and fix lint errors // with no modificiation except to format it for CommonJS and fix lint/flow errors
var rotateLeft = function (matrix) { var rotateLeft = function (matrix) {
var rows = matrix.length; var rows = matrix.length;
@ -21,9 +22,10 @@ var rotateLeft = function (matrix) {
return res; return res;
}; };
var Tile = function (value, row, column) { var Tile = function (value?: number, row?: number, column?: number) {
this.value = value || 0; this.value = value || 0;
this.row = row || -1; this.row = row || -1;
this.column = column || -1; this.column = column || -1;
this.oldRow = -1; this.oldRow = -1;
this.oldColumn = -1; this.oldColumn = -1;
@ -102,8 +104,8 @@ Board.prototype.moveLeft = function () {
targetTile.value += tile2.value; targetTile.value += tile2.value;
} }
resultRow[target] = targetTile; resultRow[target] = targetTile;
this.won |= (targetTile.value === 2048); this.won = this.won || (targetTile.value === 2048);
hasChanged |= (targetTile.value !== this.cells[row][target].value); hasChanged = hasChanged || (targetTile.value !== this.cells[row][target].value);
} }
this.cells[row] = resultRow; this.cells[row] = resultRow;
} }
@ -172,14 +174,14 @@ Board.prototype.hasLost = function () {
var canMove = false; var canMove = false;
for (var row = 0; row < Board.size; ++row) { for (var row = 0; row < Board.size; ++row) {
for (var column = 0; column < Board.size; ++column) { for (var column = 0; column < Board.size; ++column) {
canMove |= (this.cells[row][column].value === 0); canMove = canMove || (this.cells[row][column].value === 0);
for (var dir = 0; dir < 4; ++dir) { for (var dir = 0; dir < 4; ++dir) {
var newRow = row + Board.deltaX[dir]; var newRow = row + Board.deltaX[dir];
var newColumn = column + Board.deltaY[dir]; var newColumn = column + Board.deltaY[dir];
if (newRow < 0 || newRow >= Board.size || newColumn < 0 || newColumn >= Board.size) { if (newRow < 0 || newRow >= Board.size || newColumn < 0 || newColumn >= Board.size) {
continue; continue;
} }
canMove |= (this.cells[row][column].value === this.cells[newRow][newColumn].value); canMove = canMove || (this.cells[row][column].value === this.cells[newRow][newColumn].value);
} }
} }
} }

View File

@ -39,6 +39,8 @@ var LOADING = {};
var SearchScreen = React.createClass({ var SearchScreen = React.createClass({
mixins: [TimerMixin], mixins: [TimerMixin],
timeoutID: (null: any),
getInitialState: function() { getInitialState: function() {
return { return {
isLoading: false, isLoading: false,

View File

@ -11,7 +11,6 @@ var {
StyleSheet, StyleSheet,
Text, Text,
View, View,
ix,
} = React; } = React;
var ImageCapInsetsExample = React.createClass({ var ImageCapInsetsExample = React.createClass({
@ -23,7 +22,7 @@ var ImageCapInsetsExample = React.createClass({
capInsets: none capInsets: none
</Text> </Text>
<Image <Image
source={ix('story-background')} source={require('image!story-background')}
style={styles.storyBackground} style={styles.storyBackground}
capInsets={{left: 0, right: 0, bottom: 0, top: 0}} capInsets={{left: 0, right: 0, bottom: 0, top: 0}}
/> />
@ -33,7 +32,7 @@ var ImageCapInsetsExample = React.createClass({
capInsets: 15 capInsets: 15
</Text> </Text>
<Image <Image
source={ix('story-background')} source={require('image!story-background')}
style={styles.storyBackground} style={styles.storyBackground}
capInsets={{left: 15, right: 15, bottom: 15, top: 15}} capInsets={{left: 15, right: 15, bottom: 15, top: 15}}
/> />

View File

@ -9,7 +9,6 @@ var {
StyleSheet, StyleSheet,
Text, Text,
View, View,
ix,
} = React; } = React;
var ImageCapInsetsExample = require('./ImageCapInsetsExample'); var ImageCapInsetsExample = require('./ImageCapInsetsExample');
@ -34,15 +33,15 @@ exports.examples = [
}, },
{ {
title: 'Plain Static Image', title: 'Plain Static Image',
description: 'Static assets must be referenced with the `ix` wrapper and ' + description: 'Static assets should be required by prefixing with `image!` ' +
'located in the app bundle.', 'and are located in the app bundle.',
render: function() { render: function() {
return ( return (
<View style={styles.horizontal}> <View style={styles.horizontal}>
<Image source={ix('uie_thumb_normal')} style={styles.icon} /> <Image source={require('image!uie_thumb_normal')} style={styles.icon} />
<Image source={ix('uie_thumb_selected')} style={styles.icon} /> <Image source={require('image!uie_thumb_selected')} style={styles.icon} />
<Image source={ix('uie_comment_normal')} style={styles.icon} /> <Image source={require('image!uie_comment_normal')} style={styles.icon} />
<Image source={ix('uie_comment_highlighted')} style={styles.icon} /> <Image source={require('image!uie_comment_highlighted')} style={styles.icon} />
</View> </View>
); );
}, },
@ -184,19 +183,19 @@ exports.examples = [
return ( return (
<View style={styles.horizontal}> <View style={styles.horizontal}>
<Image <Image
source={ix('uie_thumb_normal')} source={require('image!uie_thumb_normal')}
style={[styles.icon, {tintColor: 'blue' }]} style={[styles.icon, {tintColor: 'blue' }]}
/> />
<Image <Image
source={ix('uie_thumb_normal')} source={require('image!uie_thumb_normal')}
style={[styles.icon, styles.leftMargin, {tintColor: 'green' }]} style={[styles.icon, styles.leftMargin, {tintColor: 'green' }]}
/> />
<Image <Image
source={ix('uie_thumb_normal')} source={require('image!uie_thumb_normal')}
style={[styles.icon, styles.leftMargin, {tintColor: 'red' }]} style={[styles.icon, styles.leftMargin, {tintColor: 'red' }]}
/> />
<Image <Image
source={ix('uie_thumb_normal')} source={require('image!uie_thumb_normal')}
style={[styles.icon, styles.leftMargin, {tintColor: 'black' }]} style={[styles.icon, styles.leftMargin, {tintColor: 'black' }]}
/> />
</View> </View>

View File

@ -10,7 +10,6 @@ var StyleSheet = require('StyleSheet');
var Text = require('Text'); var Text = require('Text');
var View = require('View'); var View = require('View');
var ix = require('ix');
var TabBarExample = React.createClass({ var TabBarExample = React.createClass({
@ -42,7 +41,7 @@ var TabBarExample = React.createClass({
selectedTab={this.state.selectedTab}> selectedTab={this.state.selectedTab}>
<TabBarItemIOS <TabBarItemIOS
name="blueTab" name="blueTab"
icon={ix('favorites')} icon={require('image!favorites')}
accessibilityLabel="Blue Tab" accessibilityLabel="Blue Tab"
selected={this.state.selectedTab === 'blueTab'} selected={this.state.selectedTab === 'blueTab'}
onPress={() => { onPress={() => {
@ -55,7 +54,7 @@ var TabBarExample = React.createClass({
<TabBarItemIOS <TabBarItemIOS
accessibilityLabel="Red Tab" accessibilityLabel="Red Tab"
name="redTab" name="redTab"
icon={ix('history')} icon={require('image!history')}
badgeValue={this.state.notifCount ? String(this.state.notifCount) : null} badgeValue={this.state.notifCount ? String(this.state.notifCount) : null}
selected={this.state.selectedTab === 'redTab'} selected={this.state.selectedTab === 'redTab'}
onPress={() => { onPress={() => {
@ -68,7 +67,7 @@ var TabBarExample = React.createClass({
</TabBarItemIOS> </TabBarItemIOS>
<TabBarItemIOS <TabBarItemIOS
name="greenTab" name="greenTab"
icon={ix('more')} icon={require('image!more')}
accessibilityLabel="Green Tab" accessibilityLabel="Green Tab"
selected={this.state.selectedTab === 'greenTab'} selected={this.state.selectedTab === 'greenTab'}
onPress={() => { onPress={() => {

View File

@ -41,7 +41,7 @@ var DEFAULT_PROPS = {
* <TouchableHighlight onPress={this._onPressButton}> * <TouchableHighlight onPress={this._onPressButton}>
* <Image * <Image
* style={styles.button} * style={styles.button}
* source={ix('myButton')} * source={require('image!myButton')}
* /> * />
* </View> * </View>
* ); * );

View File

@ -30,7 +30,7 @@ var onlyChild = require('onlyChild');
* <TouchableOpacity onPress={this._onPressButton}> * <TouchableOpacity onPress={this._onPressButton}>
* <Image * <Image
* style={styles.button} * style={styles.button}
* source={ix('myButton')} * source={require('image!myButton')}
* /> * />
* </View> * </View>
* ); * );

View File

@ -8,13 +8,11 @@
var LayoutPropTypes = require('LayoutPropTypes'); var LayoutPropTypes = require('LayoutPropTypes');
var ReactPropTypes = require('ReactPropTypes'); var ReactPropTypes = require('ReactPropTypes');
var merge = require('merge');
/** /**
* Warning: Some of these properties may not be supported in all releases. * Warning: Some of these properties may not be supported in all releases.
*/ */
var ViewStylePropTypes = merge( var ViewStylePropTypes = {
LayoutPropTypes, { ...LayoutPropTypes,
backgroundColor: ReactPropTypes.string, backgroundColor: ReactPropTypes.string,
borderColor: ReactPropTypes.string, borderColor: ReactPropTypes.string,
borderTopColor: ReactPropTypes.string, borderTopColor: ReactPropTypes.string,
@ -36,6 +34,6 @@ var ViewStylePropTypes = merge(
scaleY: ReactPropTypes.number, scaleY: ReactPropTypes.number,
translateX: ReactPropTypes.number, translateX: ReactPropTypes.number,
translateY: ReactPropTypes.number, translateY: ReactPropTypes.number,
}); };
module.exports = ViewStylePropTypes; module.exports = ViewStylePropTypes;

View File

@ -36,7 +36,7 @@ var warning = require('warning');
* <View> * <View>
* <Image * <Image
* style={styles.icon} * style={styles.icon}
* source={ix('myIcon')} * source={require('image!myIcon')}
* /> * />
* <Image * <Image
* style={styles.logo} * style={styles.logo}

View File

@ -9,23 +9,19 @@ var ImageResizeMode = require('ImageResizeMode');
var LayoutPropTypes = require('LayoutPropTypes'); var LayoutPropTypes = require('LayoutPropTypes');
var ReactPropTypes = require('ReactPropTypes'); var ReactPropTypes = require('ReactPropTypes');
var merge = require('merge'); var ImageStylePropTypes = {
...LayoutPropTypes,
resizeMode: ReactPropTypes.oneOf(Object.keys(ImageResizeMode)),
backgroundColor: ReactPropTypes.string,
borderColor: ReactPropTypes.string,
borderWidth: ReactPropTypes.number,
borderRadius: ReactPropTypes.number,
var ImageStylePropTypes = merge( // iOS-Specific style to "tint" an image.
LayoutPropTypes, // It changes the color of all the non-transparent pixels to the tintColor
{ tintColor: ReactPropTypes.string,
resizeMode: ReactPropTypes.oneOf(Object.keys(ImageResizeMode)), opacity: ReactPropTypes.number,
backgroundColor: ReactPropTypes.string, };
borderColor: ReactPropTypes.string,
borderWidth: ReactPropTypes.number,
borderRadius: ReactPropTypes.number,
// iOS-Specific style to "tint" an image.
// It changes the color of all the non-transparent pixels to the tintColor
tintColor: ReactPropTypes.string,
opacity: ReactPropTypes.number,
}
);
// Image doesn't support padding correctly (#4841912) // Image doesn't support padding correctly (#4841912)
var unsupportedProps = Object.keys({ var unsupportedProps = Object.keys({

View File

@ -1,26 +0,0 @@
/**
* Copyright 2004-present Facebook. All Rights Reserved.
*
* @providesModule ix
*/
'use strict';
/**
* This function is used to mark string literals that are image paths. The
* return value is a blob of data that core image components understand how to
* render.
*
* The arguments to ix() must be string literals so that they can be parsed
* statically.
*
* @param string Image path to render
* @return object Data blob to be used by core UI components
*/
function ix(path) {
return {
uri: path,
isStatic: true,
};
}
module.exports = ix;

View File

@ -8,25 +8,22 @@
var ReactPropTypes = require('ReactPropTypes'); var ReactPropTypes = require('ReactPropTypes');
var ViewStylePropTypes = require('ViewStylePropTypes'); var ViewStylePropTypes = require('ViewStylePropTypes');
var merge = require('merge'); var TextStylePropTypes = {
...ViewStylePropTypes,
var TextStylePropTypes = merge( fontFamily: ReactPropTypes.string,
ViewStylePropTypes, { fontSize: ReactPropTypes.number,
fontFamily: ReactPropTypes.string, fontWeight: ReactPropTypes.oneOf(['normal' /*default*/, 'bold']),
fontSize: ReactPropTypes.number, fontStyle: ReactPropTypes.oneOf(['normal', 'italic']),
fontWeight: ReactPropTypes.oneOf(['normal' /*default*/, 'bold']), lineHeight: ReactPropTypes.number,
fontStyle: ReactPropTypes.oneOf(['normal', 'italic']), color: ReactPropTypes.string,
lineHeight: ReactPropTypes.number, containerBackgroundColor: ReactPropTypes.string,
color: ReactPropTypes.string, textAlign: ReactPropTypes.oneOf(
containerBackgroundColor: ReactPropTypes.string, ['auto' /*default*/, 'left', 'right', 'center']
textAlign: ReactPropTypes.oneOf( ),
['auto' /*default*/, 'left', 'right', 'center'] writingDirection: ReactPropTypes.oneOf(
), ['auto' /*default*/, 'ltr', 'rtl']
writingDirection: ReactPropTypes.oneOf( ),
['auto' /*default*/, 'ltr', 'rtl'] };
),
}
);
// Text doesn't support padding correctly (#4841912) // Text doesn't support padding correctly (#4841912)
var unsupportedProps = Object.keys({ var unsupportedProps = Object.keys({

View File

@ -45,7 +45,7 @@ var ReactNative = {
TimerMixin: require('TimerMixin'), TimerMixin: require('TimerMixin'),
VibrationIOS: require('VibrationIOS'), VibrationIOS: require('VibrationIOS'),
ix: require('ix'), invariant: require('invariant'),
}; };
module.exports = ReactNative; module.exports = ReactNative;

View File

@ -38,7 +38,12 @@ if (options.projectRoots) {
options.projectRoots = options.projectRoots.split(','); options.projectRoots = options.projectRoots.split(',');
} }
} else { } else {
options.projectRoots = [path.resolve(__dirname, '..')]; if (__dirname.match(/node_modules\/react-native\/packager$/)) {
// packager is running from node_modules of another project
options.projectRoots = [path.resolve(__dirname, '../../..')];
} else {
options.projectRoots = [path.resolve(__dirname, '..')];
}
} }
if (options.root) { if (options.root) {

View File

@ -51,7 +51,7 @@ describe('processRequest', function() {
Packager = require('../../Packager'); Packager = require('../../Packager');
FileWatcher = require('../../FileWatcher'); FileWatcher = require('../../FileWatcher');
Packager.prototype.package = function() { Packager.prototype.package = jest.genMockFunction().mockImpl(function() {
return q({ return q({
getSource: function() { getSource: function() {
return 'this is the source'; return 'this is the source';
@ -60,7 +60,7 @@ describe('processRequest', function() {
return 'this is the source map'; return 'this is the source map';
}, },
}); });
}; });
FileWatcher.prototype.on = function(eventType, callback) { FileWatcher.prototype.on = function(eventType, callback) {
@ -106,6 +106,21 @@ describe('processRequest', function() {
}); });
}); });
pit('works with .ios.js extension', function() {
return makeRequest(
requestHandler,
'index.ios.includeRequire.bundle'
).then(function(response) {
expect(response).toEqual('this is the source');
expect(Packager.prototype.package).toBeCalledWith(
'index.ios.js',
true,
'index.ios.includeRequire.map',
true
);
});
});
pit('watches all files in projectRoot', function() { pit('watches all files in projectRoot', function() {
return makeRequest( return makeRequest(
requestHandler, requestHandler,

View File

@ -6,7 +6,6 @@ var declareOpts = require('../lib/declareOpts');
var FileWatcher = require('../FileWatcher'); var FileWatcher = require('../FileWatcher');
var Packager = require('../Packager'); var Packager = require('../Packager');
var Activity = require('../Activity'); var Activity = require('../Activity');
var setImmediate = require('timers').setImmediate;
var q = require('q'); var q = require('q');
var _ = require('underscore'); var _ = require('underscore');
@ -236,23 +235,24 @@ Server.prototype.processRequest = function(req, res, next) {
function getOptionsFromUrl(reqUrl) { function getOptionsFromUrl(reqUrl) {
// `true` to parse the query param as an object. // `true` to parse the query param as an object.
var urlObj = url.parse(reqUrl, true); var urlObj = url.parse(reqUrl, true);
var pathname = urlObj.pathname;
var match = urlObj.pathname.match(/^\/?([^\.]+)\..*(bundle|map)$/); // Backwards compatibility. Options used to be as added as '.' to the
if (!(match && match[1])) { // entry module name. We can safely remove these options.
throw new Error('Invalid url format, expected "/path/to/file.bundle"'); var entryFile = pathname.replace(/^\//, '').split('.').filter(function(part) {
} if (part === 'includeRequire' || part === 'runModule' ||
var main = match[1] + '.js'; part === 'bundle' || part === 'map') {
return false;
}
return true;
}).join('.') + '.js';
return { return {
sourceMapUrl: urlObj.pathname.replace(/\.bundle$/, '.map'), sourceMapUrl: pathname.replace(/\.bundle$/, '.map'),
main: main, main: entryFile,
dev: getBoolOptionFromQuery(urlObj.query, 'dev', true), dev: getBoolOptionFromQuery(urlObj.query, 'dev', true),
minify: getBoolOptionFromQuery(urlObj.query, 'minify'), minify: getBoolOptionFromQuery(urlObj.query, 'minify'),
runModule: getBoolOptionFromQuery(urlObj.query, 'runModule') || runModule: getBoolOptionFromQuery(urlObj.query, 'runModule', true),
// Backwards compatibility.
urlObj.pathname.split('.').some(function(part) {
return part === 'runModule';
}),
}; };
} }

View File

@ -39,7 +39,7 @@ var components = [
'../Libraries/Components/ActivityIndicatorIOS/ActivityIndicatorIOS.ios.js', '../Libraries/Components/ActivityIndicatorIOS/ActivityIndicatorIOS.ios.js',
'../Libraries/Components/DatePicker/DatePickerIOS.ios.js', '../Libraries/Components/DatePicker/DatePickerIOS.ios.js',
'../Libraries/Image/Image.ios.js', '../Libraries/Image/Image.ios.js',
'../Libraries/Components/ListView/ListView.js', '../Libraries/CustomComponents/ListView/ListView.js',
'../Libraries/Components/MapView/MapView.js', '../Libraries/Components/MapView/MapView.js',
'../Libraries/Components/Navigation/NavigatorIOS.ios.js', '../Libraries/Components/Navigation/NavigatorIOS.ios.js',
'../Libraries/Picker/PickerIOS.ios.js', '../Libraries/Picker/PickerIOS.ios.js',