diff --git a/dist/react-select.js b/dist/react-select.js index e08f97fe78..837f612568 100644 --- a/dist/react-select.js +++ b/dist/react-select.js @@ -1,26 +1,4 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Select = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0; --i) { - var cacheKey = input.slice(0, i); - if (cache[cacheKey] && (input === cacheKey || cache[cacheKey].complete)) { - return cache[cacheKey]; - } - } + if (!cache) return; + for (var i = input.length; i >= 0; --i) { + var cacheKey = input.slice(0, i); + if (cache[cacheKey] && (input === cacheKey || cache[cacheKey].complete)) { + return cache[cacheKey]; + } + } } function thenPromise(promise, callback) { - if (!promise || typeof promise.then !== 'function') return; - return promise.then(function (data) { - callback(null, data); - }, function (err) { - callback(err); - }); + if (!promise || typeof promise.then !== 'function') return; + return promise.then(function (data) { + callback(null, data); + }, function (err) { + callback(err); + }); } var stringOrNode = _react2['default'].PropTypes.oneOfType([_react2['default'].PropTypes.string, _react2['default'].PropTypes.node]); var Async = _react2['default'].createClass({ - displayName: 'Async', - - propTypes: { - cache: _react2['default'].PropTypes.any, // object to use to cache results, can be null to disable cache - ignoreAccents: _react2['default'].PropTypes.bool, // whether to strip diacritics when filtering (shared with Select) - ignoreCase: _react2['default'].PropTypes.bool, // whether to perform case-insensitive filtering (shared with Select) - isLoading: _react2['default'].PropTypes.bool, // overrides the isLoading state when set to true - loadOptions: _react2['default'].PropTypes.func.isRequired, // function to call to load options asynchronously - loadingPlaceholder: _react2['default'].PropTypes.string, // replaces the placeholder while options are loading - minimumInput: _react2['default'].PropTypes.number, // the minimum number of characters that trigger loadOptions - noResultsText: stringOrNode, // placeholder displayed when there are no matching search results (shared with Select) - onInputChange: _react2['default'].PropTypes.func, // onInputChange handler: function (inputValue) {} - placeholder: stringOrNode, // field placeholder, displayed when there's no value (shared with Select) - searchPromptText: stringOrNode, // label to prompt for search input - searchingText: _react2['default'].PropTypes.string }, - // message to display while options are loading - getDefaultProps: function getDefaultProps() { - return { - cache: true, - ignoreAccents: true, - ignoreCase: true, - loadingPlaceholder: 'Loading...', - minimumInput: 0, - searchingText: 'Searching...', - searchPromptText: 'Type to search' - }; - }, - getInitialState: function getInitialState() { - return { - cache: initCache(this.props.cache), - isLoading: false, - options: [] - }; - }, - componentWillMount: function componentWillMount() { - this._lastInput = ''; - }, - componentDidMount: function componentDidMount() { - this.loadOptions(''); - }, - componentWillReceiveProps: function componentWillReceiveProps(nextProps) { - if (nextProps.cache !== this.props.cache) { - this.setState({ - cache: initCache(nextProps.cache) - }); - } - }, - focus: function focus() { - this.refs.select.focus(); - }, - resetState: function resetState() { - this._currentRequestId = -1; - this.setState({ - isLoading: false, - options: [] - }); - }, - getResponseHandler: function getResponseHandler(input) { - var _this = this; - - var _requestId = this._currentRequestId = requestId++; - return function (err, data) { - if (err) throw err; - if (!_this.isMounted()) return; - updateCache(_this.state.cache, input, data); - if (_requestId !== _this._currentRequestId) return; - _this.setState({ - isLoading: false, - options: data && data.options || [] - }); - }; - }, - loadOptions: function loadOptions(input) { - if (this.props.onInputChange) { - var nextState = this.props.onInputChange(input); - // Note: != used deliberately here to catch undefined and null - if (nextState != null) { - input = '' + nextState; - } - } - if (this.props.ignoreAccents) input = (0, _utilsStripDiacritics2['default'])(input); - if (this.props.ignoreCase) input = input.toLowerCase(); - - this._lastInput = input; - if (input.length < this.props.minimumInput) { - return this.resetState(); - } - var cacheResult = getFromCache(this.state.cache, input); - if (cacheResult) { - return this.setState({ - options: cacheResult.options - }); - } - this.setState({ - isLoading: true - }); - var responseHandler = this.getResponseHandler(input); - var inputPromise = thenPromise(this.props.loadOptions(input, responseHandler), responseHandler); - return inputPromise ? inputPromise.then(function () { - return input; - }) : input; - }, - render: function render() { - var noResultsText = this.props.noResultsText; - var _state = this.state; - var isLoading = _state.isLoading; - var options = _state.options; - - if (this.props.isLoading) isLoading = true; - var placeholder = isLoading ? this.props.loadingPlaceholder : this.props.placeholder; - if (isLoading) { - noResultsText = this.props.searchingText; - } else if (!options.length && this._lastInput.length < this.props.minimumInput) { - noResultsText = this.props.searchPromptText; - } - return _react2['default'].createElement(_Select2['default'], _extends({}, this.props, { - ref: 'select', - isLoading: isLoading, - noResultsText: noResultsText, - onInputChange: this.loadOptions, - options: options, - placeholder: placeholder - })); - } + displayName: 'Async', + + propTypes: { + cache: _react2['default'].PropTypes.any, // object to use to cache results, can be null to disable cache + ignoreAccents: _react2['default'].PropTypes.bool, // whether to strip diacritics when filtering (shared with Select) + ignoreCase: _react2['default'].PropTypes.bool, // whether to perform case-insensitive filtering (shared with Select) + isLoading: _react2['default'].PropTypes.bool, // overrides the isLoading state when set to true + loadOptions: _react2['default'].PropTypes.func.isRequired, // function to call to load options asynchronously + loadingPlaceholder: _react2['default'].PropTypes.string, // replaces the placeholder while options are loading + minimumInput: _react2['default'].PropTypes.number, // the minimum number of characters that trigger loadOptions + noResultsText: stringOrNode, // placeholder displayed when there are no matching search results (shared with Select) + onInputChange: _react2['default'].PropTypes.func, // onInputChange handler: function (inputValue) {} + placeholder: stringOrNode, // field placeholder, displayed when there's no value (shared with Select) + searchPromptText: stringOrNode, // label to prompt for search input + searchingText: _react2['default'].PropTypes.string, // message to display while options are loading + selectedValue: _react2['default'].PropTypes.string, + selectedLabel: _react2['default'].PropTypes.string + }, + getDefaultProps: function getDefaultProps() { + return { + cache: true, + ignoreAccents: true, + ignoreCase: true, + loadingPlaceholder: 'Loading...', + minimumInput: 0, + searchingText: 'Searching...', + searchPromptText: 'Type to search' + }; + }, + getInitialState: function getInitialState() { + return { + cache: initCache(this.props.cache), + isLoading: false, + options: [] + }; + }, + componentWillMount: function componentWillMount() { + this._lastInput = ''; + }, + componentDidMount: function componentDidMount() { + this.loadOptions(''); + }, + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { + if (nextProps.cache !== this.props.cache) { + this.setState({ + cache: initCache(nextProps.cache) + }); + } + }, + focus: function focus() { + this.refs.select.focus(); + }, + resetState: function resetState() { + this._currentRequestId = -1; + this.setState({ + isLoading: false, + options: [] + }); + }, + getResponseHandler: function getResponseHandler(input) { + var _this = this; + + var _requestId = this._currentRequestId = requestId++; + return function (err, data) { + if (err) throw err; + if (!_this.isMounted()) return; + updateCache(_this.state.cache, input, data); + if (_requestId !== _this._currentRequestId) return; + _this.setState({ + isLoading: false, + options: data && data.options || [] + }); + }; + }, + loadOptions: function loadOptions(input) { + if (this.props.onInputChange) { + var nextState = this.props.onInputChange(input); + // Note: != used deliberately here to catch undefined and null + if (nextState != null) { + input = '' + nextState; + } + } + if (this.props.ignoreAccents) input = (0, _utilsStripDiacritics2['default'])(input); + if (this.props.ignoreCase) input = input.toLowerCase(); + + this._lastInput = input; + if (input.length < this.props.minimumInput) { + return this.resetState(); + } + var cacheResult = getFromCache(this.state.cache, input); + if (cacheResult) { + return this.setState({ + options: cacheResult.options + }); + } + this.setState({ + isLoading: true + }); + var responseHandler = this.getResponseHandler(input); + var inputPromise = thenPromise(this.props.loadOptions(input, responseHandler), responseHandler); + return inputPromise ? inputPromise.then(function () { + return input; + }) : input; + }, + render: function render() { + var _props = this.props; + var noResultsText = _props.noResultsText; + var selectedValue = _props.selectedValue; + var selectedLabel = _props.selectedLabel; + var _state = this.state; + var isLoading = _state.isLoading; + var options = _state.options; + + if (this.props.isLoading) isLoading = true; + var placeholder = isLoading ? this.props.loadingPlaceholder : this.props.placeholder; + if (isLoading) { + noResultsText = this.props.searchingText; + } else if (!options.length && this._lastInput.length < this.props.minimumInput) { + noResultsText = this.props.searchPromptText; + } + if (selectedValue !== '' && selectedLabel !== '') { + options = [{ + value: selectedValue, + label: selectedLabel + }]; + } + return _react2['default'].createElement(_Select2['default'], _extends({}, this.props, { + ref: 'select', + isLoading: isLoading, + noResultsText: noResultsText, + onInputChange: this.loadOptions, + options: options, + placeholder: placeholder + })); + } }); module.exports = Async; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./Select":4,"./utils/stripDiacritics":6}],3:[function(require,module,exports){ +},{"./Select":3,"./utils/stripDiacritics":5}],2:[function(require,module,exports){ (function (global){ 'use strict'; @@ -320,7 +309,7 @@ var Option = _react2['default'].createClass({ module.exports = Option; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],4:[function(require,module,exports){ +},{}],3:[function(require,module,exports){ (function (global){ 'use strict'; @@ -332,6 +321,8 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var _react = (typeof window !== "undefined" ? window['React'] : typeof global !== "undefined" ? global['React'] : null); @@ -350,10 +341,6 @@ var _classnames = (typeof window !== "undefined" ? window['classNames'] : typeof var _classnames2 = _interopRequireDefault(_classnames); -var _blacklist = require('blacklist'); - -var _blacklist2 = _interopRequireDefault(_blacklist); - var _utilsStripDiacritics = require('./utils/stripDiacritics'); var _utilsStripDiacritics2 = _interopRequireDefault(_utilsStripDiacritics); @@ -1163,7 +1150,11 @@ var Select = _react2['default'].createClass({ }); if (this.props.disabled || !this.props.searchable) { - var divProps = (0, _blacklist2['default'])(this.props.inputProps, 'inputClassName'); + var _props$inputProps = this.props.inputProps; + var inputClassName = _props$inputProps.inputClassName; + + var divProps = _objectWithoutProperties(_props$inputProps, ['inputClassName']); + return _react2['default'].createElement('div', _extends({}, divProps, { role: 'combobox', 'aria-expanded': isOpen, @@ -1449,7 +1440,7 @@ exports['default'] = Select; module.exports = exports['default']; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./Async":2,"./Option":3,"./Value":5,"./utils/stripDiacritics":6,"blacklist":1}],5:[function(require,module,exports){ +},{"./Async":1,"./Option":2,"./Value":4,"./utils/stripDiacritics":5}],4:[function(require,module,exports){ (function (global){ 'use strict'; @@ -1559,7 +1550,7 @@ var Value = _react2['default'].createClass({ module.exports = Value; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],6:[function(require,module,exports){ +},{}],5:[function(require,module,exports){ 'use strict'; var map = [{ 'base': 'A', 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g }, { 'base': 'AA', 'letters': /[\uA732]/g }, { 'base': 'AE', 'letters': /[\u00C6\u01FC\u01E2]/g }, { 'base': 'AO', 'letters': /[\uA734]/g }, { 'base': 'AU', 'letters': /[\uA736]/g }, { 'base': 'AV', 'letters': /[\uA738\uA73A]/g }, { 'base': 'AY', 'letters': /[\uA73C]/g }, { 'base': 'B', 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g }, { 'base': 'C', 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g }, { 'base': 'D', 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g }, { 'base': 'DZ', 'letters': /[\u01F1\u01C4]/g }, { 'base': 'Dz', 'letters': /[\u01F2\u01C5]/g }, { 'base': 'E', 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g }, { 'base': 'F', 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g }, { 'base': 'G', 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g }, { 'base': 'H', 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g }, { 'base': 'I', 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g }, { 'base': 'J', 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g }, { 'base': 'K', 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g }, { 'base': 'L', 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g }, { 'base': 'LJ', 'letters': /[\u01C7]/g }, { 'base': 'Lj', 'letters': /[\u01C8]/g }, { 'base': 'M', 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g }, { 'base': 'N', 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g }, { 'base': 'NJ', 'letters': /[\u01CA]/g }, { 'base': 'Nj', 'letters': /[\u01CB]/g }, { 'base': 'O', 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g }, { 'base': 'OI', 'letters': /[\u01A2]/g }, { 'base': 'OO', 'letters': /[\uA74E]/g }, { 'base': 'OU', 'letters': /[\u0222]/g }, { 'base': 'P', 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g }, { 'base': 'Q', 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g }, { 'base': 'R', 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g }, { 'base': 'S', 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g }, { 'base': 'T', 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g }, { 'base': 'TZ', 'letters': /[\uA728]/g }, { 'base': 'U', 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g }, { 'base': 'V', 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g }, { 'base': 'VY', 'letters': /[\uA760]/g }, { 'base': 'W', 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g }, { 'base': 'X', 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g }, { 'base': 'Y', 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g }, { 'base': 'Z', 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g }, { 'base': 'a', 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g }, { 'base': 'aa', 'letters': /[\uA733]/g }, { 'base': 'ae', 'letters': /[\u00E6\u01FD\u01E3]/g }, { 'base': 'ao', 'letters': /[\uA735]/g }, { 'base': 'au', 'letters': /[\uA737]/g }, { 'base': 'av', 'letters': /[\uA739\uA73B]/g }, { 'base': 'ay', 'letters': /[\uA73D]/g }, { 'base': 'b', 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g }, { 'base': 'c', 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g }, { 'base': 'd', 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g }, { 'base': 'dz', 'letters': /[\u01F3\u01C6]/g }, { 'base': 'e', 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g }, { 'base': 'f', 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g }, { 'base': 'g', 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g }, { 'base': 'h', 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g }, { 'base': 'hv', 'letters': /[\u0195]/g }, { 'base': 'i', 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g }, { 'base': 'j', 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g }, { 'base': 'k', 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g }, { 'base': 'l', 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g }, { 'base': 'lj', 'letters': /[\u01C9]/g }, { 'base': 'm', 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g }, { 'base': 'n', 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g }, { 'base': 'nj', 'letters': /[\u01CC]/g }, { 'base': 'o', 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g }, { 'base': 'oi', 'letters': /[\u01A3]/g }, { 'base': 'ou', 'letters': /[\u0223]/g }, { 'base': 'oo', 'letters': /[\uA74F]/g }, { 'base': 'p', 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g }, { 'base': 'q', 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g }, { 'base': 'r', 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g }, { 'base': 's', 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g }, { 'base': 't', 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g }, { 'base': 'tz', 'letters': /[\uA729]/g }, { 'base': 'u', 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g }, { 'base': 'v', 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g }, { 'base': 'vy', 'letters': /[\uA761]/g }, { 'base': 'w', 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g }, { 'base': 'x', 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g }, { 'base': 'y', 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g }, { 'base': 'z', 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g }]; @@ -1571,5 +1562,5 @@ module.exports = function stripDiacritics(str) { return str; }; -},{}]},{},[4])(4) +},{}]},{},[3])(3) }); \ No newline at end of file diff --git a/dist/react-select.min.js b/dist/react-select.min.js index 61cf493e6d..813a3d5dbb 100644 --- a/dist/react-select.min.js +++ b/dist/react-select.min.js @@ -1,2 +1,2 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Select=e()}}(function(){return function e(t,u,s){function o(i,a){if(!u[i]){if(!t[i]){var r="function"==typeof require&&require;if(!a&&r)return r(i,!0);if(n)return n(i,!0);var l=new Error("Cannot find module '"+i+"'");throw l.code="MODULE_NOT_FOUND",l}var p=u[i]={exports:{}};t[i][0].call(p.exports,function(e){var u=t[i][1][e];return o(u?u:e)},p,p.exports,e,t,u,s)}return u[i].exports}for(var n="function"==typeof require&&require,i=0;i=0;--u){var s=t.slice(0,u);if(e[s]&&(t===s||e[s].complete))return e[s]}}function a(e,t){if(e&&"function"==typeof e.then)return e.then(function(e){t(null,e)},function(e){t(e)})}var r=Object.assign||function(e){for(var t=1;ta.bottom||i.topt.offsetHeight&&!(t.scrollHeight-t.offsetHeight-t.scrollTop)&&this.props.onMenuScrollToBottom()}},handleRequired:function(e,t){return!e||(t?0===e.length:0===Object.keys(e).length)},getOptionLabel:function(e){return e[this.props.labelKey]},getValueArray:function(e,t){var u=this,s="object"==typeof t?t:this.props;if(s.multi){if("string"==typeof e&&(e=e.split(s.delimiter)),!Array.isArray(e)){if(null===e||void 0===e)return[];e=[e]}return e.map(function(e){return u.expandValue(e,s)}).filter(function(e){return e})}var o=this.expandValue(e,s);return o?[o]:[]},expandValue:function(e,t){if("string"!=typeof e&&"number"!=typeof e)return e;var u=t.options,s=t.valueKey;if(u)for(var o=0;o0?u-=1:u=t.length-1;else if("start"===e)u=0;else if("end"===e)u=t.length-1;else if("page_up"===e){var o=u-this.props.pageSize;u=o<0?0:o}else if("page_down"===e){var o=u+this.props.pageSize;u=o>t.length-1?t.length-1:o}u===-1&&(u=0),this.setState({focusedIndex:t[u].index,focusedOption:t[u].option})}},selectFocusedOption:function(){if(this._focusedOption)return this.selectValue(this._focusedOption)},renderLoading:function(){if(this.props.isLoading)return l["default"].createElement("span",{className:"Select-loading-zone","aria-hidden":"true"},l["default"].createElement("span",{className:"Select-loading"}))},renderValue:function(e,t){var u=this,s=this.props.valueRenderer||this.getOptionLabel,o=this.props.valueComponent;if(!e.length)return this.state.inputValue?null:l["default"].createElement("div",{className:"Select-placeholder"},this.props.placeholder);var n=this.props.onValueClick?this.handleValueClick:null;return this.props.multi?e.map(function(e,t){return l["default"].createElement(o,{id:u._instancePrefix+"-value-"+t,instancePrefix:u._instancePrefix,disabled:u.props.disabled||e.clearableValue===!1,key:"value-"+t+"-"+e[u.props.valueKey],onClick:n,onRemove:u.removeValue,value:e},s(e),l["default"].createElement("span",{className:"Select-aria-only"}," "))}):this.state.inputValue?void 0:(t&&(n=null),l["default"].createElement(o,{id:this._instancePrefix+"-value-item",disabled:this.props.disabled,instancePrefix:this._instancePrefix,onClick:n,value:e[0]},s(e[0])))},renderInput:function(e,t){if(this.props.inputRenderer)return this.props.inputRenderer();var u,s=(0,E["default"])("Select-input",this.props.inputProps.className),o=!!this.state.isOpen,i=(0,E["default"])((u={},n(u,this._instancePrefix+"-list",o),n(u,this._instancePrefix+"-backspace-remove-message",this.props.multi&&!this.props.disabled&&this.state.isFocused&&!this.state.inputValue),u)),r=a({},this.props.inputProps,{role:"combobox","aria-expanded":""+o,"aria-owns":i,"aria-haspopup":""+o,"aria-activedescendant":o?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-labelledby":this.props["aria-labelledby"],"aria-label":this.props["aria-label"],className:s,tabIndex:this.props.tabIndex,onBlur:this.handleInputBlur,onChange:this.handleInputChange,onFocus:this.handleInputFocus,ref:"input",required:this.state.required,value:this.state.inputValue});if(this.props.disabled||!this.props.searchable){var p=(0,b["default"])(this.props.inputProps,"inputClassName");return l["default"].createElement("div",a({},p,{role:"combobox","aria-expanded":o,"aria-owns":o?this._instancePrefix+"-list":this._instancePrefix+"-value","aria-activedescendant":o?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value",className:s,tabIndex:this.props.tabIndex||0,onBlur:this.handleInputBlur,onFocus:this.handleInputFocus,ref:"input","aria-readonly":""+!!this.props.disabled,style:{border:0,width:1,display:"inline-block"}}))}return this.props.autosize?l["default"].createElement(f["default"],a({},r,{minWidth:"5px"})):l["default"].createElement("div",{className:s},l["default"].createElement("input",r))},renderClear:function(){if(this.props.clearable&&this.props.value&&(!this.props.multi||this.props.value.length)&&!this.props.disabled&&!this.props.isLoading)return l["default"].createElement("span",{className:"Select-clear-zone",title:this.props.multi?this.props.clearAllText:this.props.clearValueText,"aria-label":this.props.multi?this.props.clearAllText:this.props.clearValueText,onMouseDown:this.clearValue,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEndClearValue},l["default"].createElement("span",{className:"Select-clear",dangerouslySetInnerHTML:{__html:"×"}}))},renderArrow:function(){return l["default"].createElement("span",{className:"Select-arrow-zone",onMouseDown:this.handleMouseDownOnArrow},l["default"].createElement("span",{className:"Select-arrow",onMouseDown:this.handleMouseDownOnArrow}))},filterOptions:function(e){var t=this,u=this.state.inputValue,s=this.props.options||[];return"function"==typeof this.props.filterOptions?this.props.filterOptions.call(this,s,u,e):this.props.filterOptions?(this.props.ignoreAccents&&(u=(0,m["default"])(u)),this.props.ignoreCase&&(u=u.toLowerCase()),e&&(e=e.map(function(e){return e[t.props.valueKey]})),s.filter(function(s){if(e&&e.indexOf(s[t.props.valueKey])>-1)return!1;if(t.props.filterOption)return t.props.filterOption.call(t,s,u);if(!u)return!0;var o=String(s[t.props.valueKey]),n=String(s[t.props.labelKey]);return t.props.ignoreAccents&&("label"!==t.props.matchProp&&(o=(0,m["default"])(o)),"value"!==t.props.matchProp&&(n=(0,m["default"])(n))),t.props.ignoreCase&&("label"!==t.props.matchProp&&(o=o.toLowerCase()),"value"!==t.props.matchProp&&(n=n.toLowerCase())),"start"===t.props.matchPos?"label"!==t.props.matchProp&&o.substr(0,u.length)===u||"value"!==t.props.matchProp&&n.substr(0,u.length)===u:"label"!==t.props.matchProp&&o.indexOf(u)>=0||"value"!==t.props.matchProp&&n.indexOf(u)>=0})):s},renderMenu:function(e,t,u){var s=this;if(!e||!e.length)return this.props.noResultsText?l["default"].createElement("div",{className:"Select-noresults"},this.props.noResultsText):null;if(this.props.menuRenderer)return this.props.menuRenderer({focusedOption:u,focusOption:this.focusOption,labelKey:this.props.labelKey,options:e,selectValue:this.selectValue,valueArray:t});var o=function(){var o=s.props.optionComponent,n=s.props.optionRenderer||s.getOptionLabel;return{v:e.map(function(e,i){var a=t&&t.indexOf(e)>-1,r=e===u,p=r?"focused":null,d=(0,E["default"])(s.props.optionClassName,{"Select-option":!0,"is-selected":a,"is-focused":r,"is-disabled":e.disabled});return l["default"].createElement(o,{instancePrefix:s._instancePrefix,optionIndex:i,className:d,isDisabled:e.disabled,isFocused:r,key:"option-"+i+"-"+e[s.props.valueKey],onSelect:s.selectValue,onFocus:s.focusOption,option:e,isSelected:a,ref:p},n(e))})}}();return"object"==typeof o?o.v:void 0},renderHiddenField:function(e){var t=this;if(this.props.name){if(this.props.joinValues){var u=e.map(function(e){return i(e[t.props.valueKey])}).join(this.props.delimiter);return l["default"].createElement("input",{type:"hidden",ref:"value",name:this.props.name,value:u,disabled:this.props.disabled})}return e.map(function(e,u){return l["default"].createElement("input",{key:"hidden."+u,type:"hidden",ref:"value"+u,name:t.props.name,value:i(e[t.props.valueKey]),disabled:t.props.disabled})})}},getFocusableOptionIndex:function(e){var t=this._visibleOptions;if(!t.length)return null;var u=this.state.focusedOption||e;if(u&&!u.disabled){var s=t.indexOf(u);if(s!==-1)return s}for(var o=0;o=0;--u){var s=t.slice(0,u);if(e[s]&&(t===s||e[s].complete))return e[s]}}function a(e,t){if(e&&"function"==typeof e.then)return e.then(function(e){t(null,e)},function(e){t(e)})}var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,s)&&(u[s]=e[s]);return u}function i(e,t,u){return t in e?Object.defineProperty(e,t,{value:u,enumerable:!0,configurable:!0,writable:!0}):e[t]=u,e}function a(e){return"object"==typeof e?JSON.stringify(e):e}Object.defineProperty(u,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;ta.bottom||i.topt.offsetHeight&&!(t.scrollHeight-t.offsetHeight-t.scrollTop)&&this.props.onMenuScrollToBottom()}},handleRequired:function(e,t){return!e||(t?0===e.length:0===Object.keys(e).length)},getOptionLabel:function(e){return e[this.props.labelKey]},getValueArray:function(e,t){var u=this,s="object"==typeof t?t:this.props;if(s.multi){if("string"==typeof e&&(e=e.split(s.delimiter)),!Array.isArray(e)){if(null===e||void 0===e)return[];e=[e]}return e.map(function(e){return u.expandValue(e,s)}).filter(function(e){return e})}var o=this.expandValue(e,s);return o?[o]:[]},expandValue:function(e,t){if("string"!=typeof e&&"number"!=typeof e)return e;var u=t.options,s=t.valueKey;if(u)for(var o=0;o0?u-=1:u=t.length-1;else if("start"===e)u=0;else if("end"===e)u=t.length-1;else if("page_up"===e){var o=u-this.props.pageSize;u=o<0?0:o}else if("page_down"===e){var o=u+this.props.pageSize;u=o>t.length-1?t.length-1:o}u===-1&&(u=0),this.setState({focusedIndex:t[u].index,focusedOption:t[u].option})}},selectFocusedOption:function(){if(this._focusedOption)return this.selectValue(this._focusedOption)},renderLoading:function(){if(this.props.isLoading)return p["default"].createElement("span",{className:"Select-loading-zone","aria-hidden":"true"},p["default"].createElement("span",{className:"Select-loading"}))},renderValue:function(e,t){var u=this,s=this.props.valueRenderer||this.getOptionLabel,o=this.props.valueComponent;if(!e.length)return this.state.inputValue?null:p["default"].createElement("div",{className:"Select-placeholder"},this.props.placeholder);var n=this.props.onValueClick?this.handleValueClick:null;return this.props.multi?e.map(function(e,t){return p["default"].createElement(o,{id:u._instancePrefix+"-value-"+t,instancePrefix:u._instancePrefix,disabled:u.props.disabled||e.clearableValue===!1,key:"value-"+t+"-"+e[u.props.valueKey],onClick:n,onRemove:u.removeValue,value:e},s(e),p["default"].createElement("span",{className:"Select-aria-only"}," "))}):this.state.inputValue?void 0:(t&&(n=null),p["default"].createElement(o,{id:this._instancePrefix+"-value-item",disabled:this.props.disabled,instancePrefix:this._instancePrefix,onClick:n,value:e[0]},s(e[0])))},renderInput:function(e,t){if(this.props.inputRenderer)return this.props.inputRenderer();var u,s=(0,g["default"])("Select-input",this.props.inputProps.className),o=!!this.state.isOpen,a=(0,g["default"])((u={},i(u,this._instancePrefix+"-list",o),i(u,this._instancePrefix+"-backspace-remove-message",this.props.multi&&!this.props.disabled&&this.state.isFocused&&!this.state.inputValue),u)),l=r({},this.props.inputProps,{role:"combobox","aria-expanded":""+o,"aria-owns":a,"aria-haspopup":""+o,"aria-activedescendant":o?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-labelledby":this.props["aria-labelledby"],"aria-label":this.props["aria-label"],className:s,tabIndex:this.props.tabIndex,onBlur:this.handleInputBlur,onChange:this.handleInputChange,onFocus:this.handleInputFocus,ref:"input",required:this.state.required,value:this.state.inputValue});if(this.props.disabled||!this.props.searchable){var d=this.props.inputProps,c=(d.inputClassName,n(d,["inputClassName"]));return p["default"].createElement("div",r({},c,{role:"combobox","aria-expanded":o,"aria-owns":o?this._instancePrefix+"-list":this._instancePrefix+"-value","aria-activedescendant":o?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value",className:s,tabIndex:this.props.tabIndex||0,onBlur:this.handleInputBlur,onFocus:this.handleInputFocus,ref:"input","aria-readonly":""+!!this.props.disabled,style:{border:0,width:1,display:"inline-block"}}))}return this.props.autosize?p["default"].createElement(h["default"],r({},l,{minWidth:"5px"})):p["default"].createElement("div",{className:s},p["default"].createElement("input",l))},renderClear:function(){if(this.props.clearable&&this.props.value&&(!this.props.multi||this.props.value.length)&&!this.props.disabled&&!this.props.isLoading)return p["default"].createElement("span",{className:"Select-clear-zone",title:this.props.multi?this.props.clearAllText:this.props.clearValueText,"aria-label":this.props.multi?this.props.clearAllText:this.props.clearValueText,onMouseDown:this.clearValue,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEndClearValue},p["default"].createElement("span",{className:"Select-clear",dangerouslySetInnerHTML:{__html:"×"}}))},renderArrow:function(){return p["default"].createElement("span",{className:"Select-arrow-zone",onMouseDown:this.handleMouseDownOnArrow},p["default"].createElement("span",{className:"Select-arrow",onMouseDown:this.handleMouseDownOnArrow}))},filterOptions:function(e){var t=this,u=this.state.inputValue,s=this.props.options||[];return"function"==typeof this.props.filterOptions?this.props.filterOptions.call(this,s,u,e):this.props.filterOptions?(this.props.ignoreAccents&&(u=(0,y["default"])(u)),this.props.ignoreCase&&(u=u.toLowerCase()),e&&(e=e.map(function(e){return e[t.props.valueKey]})),s.filter(function(s){if(e&&e.indexOf(s[t.props.valueKey])>-1)return!1;if(t.props.filterOption)return t.props.filterOption.call(t,s,u);if(!u)return!0;var o=String(s[t.props.valueKey]),n=String(s[t.props.labelKey]);return t.props.ignoreAccents&&("label"!==t.props.matchProp&&(o=(0,y["default"])(o)),"value"!==t.props.matchProp&&(n=(0,y["default"])(n))),t.props.ignoreCase&&("label"!==t.props.matchProp&&(o=o.toLowerCase()),"value"!==t.props.matchProp&&(n=n.toLowerCase())),"start"===t.props.matchPos?"label"!==t.props.matchProp&&o.substr(0,u.length)===u||"value"!==t.props.matchProp&&n.substr(0,u.length)===u:"label"!==t.props.matchProp&&o.indexOf(u)>=0||"value"!==t.props.matchProp&&n.indexOf(u)>=0})):s},renderMenu:function(e,t,u){var s=this;if(!e||!e.length)return this.props.noResultsText?p["default"].createElement("div",{className:"Select-noresults"},this.props.noResultsText):null;if(this.props.menuRenderer)return this.props.menuRenderer({focusedOption:u,focusOption:this.focusOption,labelKey:this.props.labelKey,options:e,selectValue:this.selectValue,valueArray:t});var o=function(){var o=s.props.optionComponent,n=s.props.optionRenderer||s.getOptionLabel;return{v:e.map(function(e,i){var a=t&&t.indexOf(e)>-1,r=e===u,l=r?"focused":null,d=(0,g["default"])(s.props.optionClassName,{"Select-option":!0,"is-selected":a,"is-focused":r,"is-disabled":e.disabled});return p["default"].createElement(o,{instancePrefix:s._instancePrefix,optionIndex:i,className:d,isDisabled:e.disabled,isFocused:r,key:"option-"+i+"-"+e[s.props.valueKey],onSelect:s.selectValue,onFocus:s.focusOption,option:e,isSelected:a,ref:l},n(e))})}}();return"object"==typeof o?o.v:void 0},renderHiddenField:function(e){var t=this;if(this.props.name){if(this.props.joinValues){var u=e.map(function(e){return a(e[t.props.valueKey])}).join(this.props.delimiter);return p["default"].createElement("input",{type:"hidden",ref:"value",name:this.props.name,value:u,disabled:this.props.disabled})}return e.map(function(e,u){return p["default"].createElement("input",{key:"hidden."+u,type:"hidden",ref:"value"+u,name:t.props.name,value:a(e[t.props.valueKey]),disabled:t.props.disabled})})}},getFocusableOptionIndex:function(e){var t=this._visibleOptions;if(!t.length)return null;var u=this.state.focusedOption||e;if(u&&!u.disabled){var s=t.indexOf(u);if(s!==-1)return s}for(var o=0;o - * License: MIT +/*! + * Determine if an object is a Buffer * - * `npm install is-buffer` + * @author Feross Aboukhadijeh + * @license MIT */ +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually module.exports = function (obj) { - return !!(obj != null && - (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) - (obj.constructor && - typeof obj.constructor.isBuffer === 'function' && - obj.constructor.isBuffer(obj)) - )) + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) } },{}],20:[function(require,module,exports){ @@ -1491,7 +1495,6 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) { }).call(this,require('_process')) },{"_process":25}],25:[function(require,module,exports){ // shim for using process in browser - var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it @@ -1503,21 +1506,63 @@ var cachedSetTimeout; var cachedClearTimeout; (function () { - try { - cachedSetTimeout = setTimeout; - } catch (e) { - cachedSetTimeout = function () { - throw new Error('setTimeout is not defined'); + try { + cachedSetTimeout = setTimeout; + } catch (e) { + cachedSetTimeout = function () { + throw new Error('setTimeout is not defined'); + } } - } - try { - cachedClearTimeout = clearTimeout; - } catch (e) { - cachedClearTimeout = function () { - throw new Error('clearTimeout is not defined'); + try { + cachedClearTimeout = clearTimeout; + } catch (e) { + cachedClearTimeout = function () { + throw new Error('clearTimeout is not defined'); + } } - } } ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} var queue = []; var draining = false; var currentQueue; @@ -1542,7 +1587,7 @@ function drainQueue() { if (draining) { return; } - var timeout = cachedSetTimeout(cleanUpNextTick); + var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; @@ -1559,7 +1604,7 @@ function drainQueue() { } currentQueue = null; draining = false; - cachedClearTimeout(timeout); + runClearTimeout(timeout); } process.nextTick = function (fun) { @@ -1571,7 +1616,7 @@ process.nextTick = function (fun) { } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { - cachedSetTimeout(drainQueue, 0); + runTimeout(drainQueue); } }; diff --git a/examples/dist/bundle.js b/examples/dist/bundle.js index 4bc375b626..eba2f3d459 100644 --- a/examples/dist/bundle.js +++ b/examples/dist/bundle.js @@ -1,26 +1,4 @@ require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0; --i) { - var cacheKey = input.slice(0, i); - if (cache[cacheKey] && (input === cacheKey || cache[cacheKey].complete)) { - return cache[cacheKey]; - } - } + if (!cache) return; + for (var i = input.length; i >= 0; --i) { + var cacheKey = input.slice(0, i); + if (cache[cacheKey] && (input === cacheKey || cache[cacheKey].complete)) { + return cache[cacheKey]; + } + } } function thenPromise(promise, callback) { - if (!promise || typeof promise.then !== 'function') return; - return promise.then(function (data) { - callback(null, data); - }, function (err) { - callback(err); - }); + if (!promise || typeof promise.then !== 'function') return; + return promise.then(function (data) { + callback(null, data); + }, function (err) { + callback(err); + }); } var stringOrNode = _react2['default'].PropTypes.oneOfType([_react2['default'].PropTypes.string, _react2['default'].PropTypes.node]); var Async = _react2['default'].createClass({ - displayName: 'Async', - - propTypes: { - cache: _react2['default'].PropTypes.any, // object to use to cache results, can be null to disable cache - ignoreAccents: _react2['default'].PropTypes.bool, // whether to strip diacritics when filtering (shared with Select) - ignoreCase: _react2['default'].PropTypes.bool, // whether to perform case-insensitive filtering (shared with Select) - isLoading: _react2['default'].PropTypes.bool, // overrides the isLoading state when set to true - loadOptions: _react2['default'].PropTypes.func.isRequired, // function to call to load options asynchronously - loadingPlaceholder: _react2['default'].PropTypes.string, // replaces the placeholder while options are loading - minimumInput: _react2['default'].PropTypes.number, // the minimum number of characters that trigger loadOptions - noResultsText: stringOrNode, // placeholder displayed when there are no matching search results (shared with Select) - onInputChange: _react2['default'].PropTypes.func, // onInputChange handler: function (inputValue) {} - placeholder: stringOrNode, // field placeholder, displayed when there's no value (shared with Select) - searchPromptText: stringOrNode, // label to prompt for search input - searchingText: _react2['default'].PropTypes.string }, - // message to display while options are loading - getDefaultProps: function getDefaultProps() { - return { - cache: true, - ignoreAccents: true, - ignoreCase: true, - loadingPlaceholder: 'Loading...', - minimumInput: 0, - searchingText: 'Searching...', - searchPromptText: 'Type to search' - }; - }, - getInitialState: function getInitialState() { - return { - cache: initCache(this.props.cache), - isLoading: false, - options: [] - }; - }, - componentWillMount: function componentWillMount() { - this._lastInput = ''; - }, - componentDidMount: function componentDidMount() { - this.loadOptions(''); - }, - componentWillReceiveProps: function componentWillReceiveProps(nextProps) { - if (nextProps.cache !== this.props.cache) { - this.setState({ - cache: initCache(nextProps.cache) - }); - } - }, - focus: function focus() { - this.refs.select.focus(); - }, - resetState: function resetState() { - this._currentRequestId = -1; - this.setState({ - isLoading: false, - options: [] - }); - }, - getResponseHandler: function getResponseHandler(input) { - var _this = this; - - var _requestId = this._currentRequestId = requestId++; - return function (err, data) { - if (err) throw err; - if (!_this.isMounted()) return; - updateCache(_this.state.cache, input, data); - if (_requestId !== _this._currentRequestId) return; - _this.setState({ - isLoading: false, - options: data && data.options || [] - }); - }; - }, - loadOptions: function loadOptions(input) { - if (this.props.onInputChange) { - var nextState = this.props.onInputChange(input); - // Note: != used deliberately here to catch undefined and null - if (nextState != null) { - input = '' + nextState; - } - } - if (this.props.ignoreAccents) input = (0, _utilsStripDiacritics2['default'])(input); - if (this.props.ignoreCase) input = input.toLowerCase(); - - this._lastInput = input; - if (input.length < this.props.minimumInput) { - return this.resetState(); - } - var cacheResult = getFromCache(this.state.cache, input); - if (cacheResult) { - return this.setState({ - options: cacheResult.options - }); - } - this.setState({ - isLoading: true - }); - var responseHandler = this.getResponseHandler(input); - var inputPromise = thenPromise(this.props.loadOptions(input, responseHandler), responseHandler); - return inputPromise ? inputPromise.then(function () { - return input; - }) : input; - }, - render: function render() { - var noResultsText = this.props.noResultsText; - var _state = this.state; - var isLoading = _state.isLoading; - var options = _state.options; - - if (this.props.isLoading) isLoading = true; - var placeholder = isLoading ? this.props.loadingPlaceholder : this.props.placeholder; - if (isLoading) { - noResultsText = this.props.searchingText; - } else if (!options.length && this._lastInput.length < this.props.minimumInput) { - noResultsText = this.props.searchPromptText; - } - return _react2['default'].createElement(_Select2['default'], _extends({}, this.props, { - ref: 'select', - isLoading: isLoading, - noResultsText: noResultsText, - onInputChange: this.loadOptions, - options: options, - placeholder: placeholder - })); - } + displayName: 'Async', + + propTypes: { + cache: _react2['default'].PropTypes.any, // object to use to cache results, can be null to disable cache + ignoreAccents: _react2['default'].PropTypes.bool, // whether to strip diacritics when filtering (shared with Select) + ignoreCase: _react2['default'].PropTypes.bool, // whether to perform case-insensitive filtering (shared with Select) + isLoading: _react2['default'].PropTypes.bool, // overrides the isLoading state when set to true + loadOptions: _react2['default'].PropTypes.func.isRequired, // function to call to load options asynchronously + loadingPlaceholder: _react2['default'].PropTypes.string, // replaces the placeholder while options are loading + minimumInput: _react2['default'].PropTypes.number, // the minimum number of characters that trigger loadOptions + noResultsText: stringOrNode, // placeholder displayed when there are no matching search results (shared with Select) + onInputChange: _react2['default'].PropTypes.func, // onInputChange handler: function (inputValue) {} + placeholder: stringOrNode, // field placeholder, displayed when there's no value (shared with Select) + searchPromptText: stringOrNode, // label to prompt for search input + searchingText: _react2['default'].PropTypes.string, // message to display while options are loading + selectedValue: _react2['default'].PropTypes.string, + selectedLabel: _react2['default'].PropTypes.string + }, + getDefaultProps: function getDefaultProps() { + return { + cache: true, + ignoreAccents: true, + ignoreCase: true, + loadingPlaceholder: 'Loading...', + minimumInput: 0, + searchingText: 'Searching...', + searchPromptText: 'Type to search' + }; + }, + getInitialState: function getInitialState() { + return { + cache: initCache(this.props.cache), + isLoading: false, + options: [] + }; + }, + componentWillMount: function componentWillMount() { + this._lastInput = ''; + }, + componentDidMount: function componentDidMount() { + this.loadOptions(''); + }, + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { + if (nextProps.cache !== this.props.cache) { + this.setState({ + cache: initCache(nextProps.cache) + }); + } + }, + focus: function focus() { + this.refs.select.focus(); + }, + resetState: function resetState() { + this._currentRequestId = -1; + this.setState({ + isLoading: false, + options: [] + }); + }, + getResponseHandler: function getResponseHandler(input) { + var _this = this; + + var _requestId = this._currentRequestId = requestId++; + return function (err, data) { + if (err) throw err; + if (!_this.isMounted()) return; + updateCache(_this.state.cache, input, data); + if (_requestId !== _this._currentRequestId) return; + _this.setState({ + isLoading: false, + options: data && data.options || [] + }); + }; + }, + loadOptions: function loadOptions(input) { + if (this.props.onInputChange) { + var nextState = this.props.onInputChange(input); + // Note: != used deliberately here to catch undefined and null + if (nextState != null) { + input = '' + nextState; + } + } + if (this.props.ignoreAccents) input = (0, _utilsStripDiacritics2['default'])(input); + if (this.props.ignoreCase) input = input.toLowerCase(); + + this._lastInput = input; + if (input.length < this.props.minimumInput) { + return this.resetState(); + } + var cacheResult = getFromCache(this.state.cache, input); + if (cacheResult) { + return this.setState({ + options: cacheResult.options + }); + } + this.setState({ + isLoading: true + }); + var responseHandler = this.getResponseHandler(input); + var inputPromise = thenPromise(this.props.loadOptions(input, responseHandler), responseHandler); + return inputPromise ? inputPromise.then(function () { + return input; + }) : input; + }, + render: function render() { + var _props = this.props; + var noResultsText = _props.noResultsText; + var selectedValue = _props.selectedValue; + var selectedLabel = _props.selectedLabel; + var _state = this.state; + var isLoading = _state.isLoading; + var options = _state.options; + + if (this.props.isLoading) isLoading = true; + var placeholder = isLoading ? this.props.loadingPlaceholder : this.props.placeholder; + if (isLoading) { + noResultsText = this.props.searchingText; + } else if (!options.length && this._lastInput.length < this.props.minimumInput) { + noResultsText = this.props.searchPromptText; + } + if (selectedValue !== '' && selectedLabel !== '') { + options = [{ + value: selectedValue, + label: selectedLabel + }]; + } + return _react2['default'].createElement(_Select2['default'], _extends({}, this.props, { + ref: 'select', + isLoading: isLoading, + noResultsText: noResultsText, + onInputChange: this.loadOptions, + options: options, + placeholder: placeholder + })); + } }); module.exports = Async; -},{"./Select":"react-select","./utils/stripDiacritics":5,"react":undefined}],3:[function(require,module,exports){ +},{"./Select":"react-select","./utils/stripDiacritics":4,"react":undefined}],2:[function(require,module,exports){ 'use strict'; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } @@ -316,7 +305,7 @@ var Option = _react2['default'].createClass({ module.exports = Option; -},{"classnames":undefined,"react":undefined}],4:[function(require,module,exports){ +},{"classnames":undefined,"react":undefined}],3:[function(require,module,exports){ 'use strict'; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } @@ -424,7 +413,7 @@ var Value = _react2['default'].createClass({ module.exports = Value; -},{"classnames":undefined,"react":undefined}],5:[function(require,module,exports){ +},{"classnames":undefined,"react":undefined}],4:[function(require,module,exports){ 'use strict'; var map = [{ 'base': 'A', 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g }, { 'base': 'AA', 'letters': /[\uA732]/g }, { 'base': 'AE', 'letters': /[\u00C6\u01FC\u01E2]/g }, { 'base': 'AO', 'letters': /[\uA734]/g }, { 'base': 'AU', 'letters': /[\uA736]/g }, { 'base': 'AV', 'letters': /[\uA738\uA73A]/g }, { 'base': 'AY', 'letters': /[\uA73C]/g }, { 'base': 'B', 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g }, { 'base': 'C', 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g }, { 'base': 'D', 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g }, { 'base': 'DZ', 'letters': /[\u01F1\u01C4]/g }, { 'base': 'Dz', 'letters': /[\u01F2\u01C5]/g }, { 'base': 'E', 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g }, { 'base': 'F', 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g }, { 'base': 'G', 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g }, { 'base': 'H', 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g }, { 'base': 'I', 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g }, { 'base': 'J', 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g }, { 'base': 'K', 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g }, { 'base': 'L', 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g }, { 'base': 'LJ', 'letters': /[\u01C7]/g }, { 'base': 'Lj', 'letters': /[\u01C8]/g }, { 'base': 'M', 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g }, { 'base': 'N', 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g }, { 'base': 'NJ', 'letters': /[\u01CA]/g }, { 'base': 'Nj', 'letters': /[\u01CB]/g }, { 'base': 'O', 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g }, { 'base': 'OI', 'letters': /[\u01A2]/g }, { 'base': 'OO', 'letters': /[\uA74E]/g }, { 'base': 'OU', 'letters': /[\u0222]/g }, { 'base': 'P', 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g }, { 'base': 'Q', 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g }, { 'base': 'R', 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g }, { 'base': 'S', 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g }, { 'base': 'T', 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g }, { 'base': 'TZ', 'letters': /[\uA728]/g }, { 'base': 'U', 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g }, { 'base': 'V', 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g }, { 'base': 'VY', 'letters': /[\uA760]/g }, { 'base': 'W', 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g }, { 'base': 'X', 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g }, { 'base': 'Y', 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g }, { 'base': 'Z', 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g }, { 'base': 'a', 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g }, { 'base': 'aa', 'letters': /[\uA733]/g }, { 'base': 'ae', 'letters': /[\u00E6\u01FD\u01E3]/g }, { 'base': 'ao', 'letters': /[\uA735]/g }, { 'base': 'au', 'letters': /[\uA737]/g }, { 'base': 'av', 'letters': /[\uA739\uA73B]/g }, { 'base': 'ay', 'letters': /[\uA73D]/g }, { 'base': 'b', 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g }, { 'base': 'c', 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g }, { 'base': 'd', 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g }, { 'base': 'dz', 'letters': /[\u01F3\u01C6]/g }, { 'base': 'e', 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g }, { 'base': 'f', 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g }, { 'base': 'g', 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g }, { 'base': 'h', 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g }, { 'base': 'hv', 'letters': /[\u0195]/g }, { 'base': 'i', 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g }, { 'base': 'j', 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g }, { 'base': 'k', 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g }, { 'base': 'l', 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g }, { 'base': 'lj', 'letters': /[\u01C9]/g }, { 'base': 'm', 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g }, { 'base': 'n', 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g }, { 'base': 'nj', 'letters': /[\u01CC]/g }, { 'base': 'o', 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g }, { 'base': 'oi', 'letters': /[\u01A3]/g }, { 'base': 'ou', 'letters': /[\u0223]/g }, { 'base': 'oo', 'letters': /[\uA74F]/g }, { 'base': 'p', 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g }, { 'base': 'q', 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g }, { 'base': 'r', 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g }, { 'base': 's', 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g }, { 'base': 't', 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g }, { 'base': 'tz', 'letters': /[\uA729]/g }, { 'base': 'u', 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g }, { 'base': 'v', 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g }, { 'base': 'vy', 'letters': /[\uA761]/g }, { 'base': 'w', 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g }, { 'base': 'x', 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g }, { 'base': 'y', 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g }, { 'base': 'z', 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g }]; @@ -447,6 +436,8 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var _react = require('react'); @@ -465,10 +456,6 @@ var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); -var _blacklist = require('blacklist'); - -var _blacklist2 = _interopRequireDefault(_blacklist); - var _utilsStripDiacritics = require('./utils/stripDiacritics'); var _utilsStripDiacritics2 = _interopRequireDefault(_utilsStripDiacritics); @@ -1278,7 +1265,11 @@ var Select = _react2['default'].createClass({ }); if (this.props.disabled || !this.props.searchable) { - var divProps = (0, _blacklist2['default'])(this.props.inputProps, 'inputClassName'); + var _props$inputProps = this.props.inputProps; + var inputClassName = _props$inputProps.inputClassName; + + var divProps = _objectWithoutProperties(_props$inputProps, ['inputClassName']); + return _react2['default'].createElement('div', _extends({}, divProps, { role: 'combobox', 'aria-expanded': isOpen, @@ -1563,4 +1554,4 @@ var Select = _react2['default'].createClass({ exports['default'] = Select; module.exports = exports['default']; -},{"./Async":2,"./Option":3,"./Value":4,"./utils/stripDiacritics":5,"blacklist":1,"classnames":undefined,"react":undefined,"react-dom":undefined,"react-input-autosize":undefined}]},{},[]); +},{"./Async":1,"./Option":2,"./Value":3,"./utils/stripDiacritics":4,"classnames":undefined,"react":undefined,"react-dom":undefined,"react-input-autosize":undefined}]},{},[]); diff --git a/examples/dist/common.js b/examples/dist/common.js index 8f504d7625..a63febb382 100644 --- a/examples/dist/common.js +++ b/examples/dist/common.js @@ -304,7 +304,7 @@ function toArray(obj) { * @return {boolean} */ function hasArrayNature(obj) { - return( + return ( // not null/false !!obj && ( // arrays are objects, NodeLists are functions in Safari @@ -950,57 +950,6 @@ var keyOf = function keyOf(oneKeyObj) { module.exports = keyOf; },{}],21:[function(require,module,exports){ -/** - * Copyright (c) 2013-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. - * - */ - -'use strict'; - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * Executes the provided `callback` once for each enumerable own property in the - * object and constructs a new object from the results. The `callback` is - * invoked with three arguments: - * - * - the property value - * - the property name - * - the object being traversed - * - * Properties that are added after the call to `mapObject` will not be visited - * by `callback`. If the values of existing properties are changed, the value - * passed to `callback` will be the value at the time `mapObject` visits them. - * Properties that are deleted before being visited are not visited. - * - * @grep function objectMap() - * @grep function objMap() - * - * @param {?object} object - * @param {function} callback - * @param {*} context - * @return {?object} - */ -function mapObject(object, callback, context) { - if (!object) { - return null; - } - var result = {}; - for (var name in object) { - if (hasOwnProperty.call(object, name)) { - result[name] = callback.call(context, object[name], name, object); - } - } - return result; -} - -module.exports = mapObject; -},{}],22:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -1030,7 +979,7 @@ function memoizeStringOnly(callback) { } module.exports = memoizeStringOnly; -},{}],23:[function(require,module,exports){ +},{}],22:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -1053,7 +1002,7 @@ if (ExecutionEnvironment.canUseDOM) { } module.exports = performance || {}; -},{"./ExecutionEnvironment":2}],24:[function(require,module,exports){ +},{"./ExecutionEnvironment":2}],23:[function(require,module,exports){ 'use strict'; /** @@ -1087,7 +1036,7 @@ if (performance.now) { } module.exports = performanceNow; -},{"./performance":23}],25:[function(require,module,exports){ +},{"./performance":22}],24:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -1154,7 +1103,7 @@ function shallowEqual(objA, objB) { } module.exports = shallowEqual; -},{}],26:[function(require,module,exports){ +},{}],25:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. * All rights reserved. @@ -1179,20 +1128,12 @@ var emptyFunction = require('./emptyFunction'); var warning = emptyFunction; if ("production" !== 'production') { - warning = function warning(condition, format) { - for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - - if (format === undefined) { - throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument'); - } - - if (format.indexOf('Failed Composite propType: ') === 0) { - return; // Ignore CompositeComponent proptype check. - } + (function () { + var printWarning = function printWarning(format) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } - if (!condition) { var argIndex = 0; var message = 'Warning: ' + format.replace(/%s/g, function () { return args[argIndex++]; @@ -1206,12 +1147,30 @@ if ("production" !== 'production') { // to find the callsite that caused this warning to fire. throw new Error(message); } catch (x) {} - } - }; + }; + + warning = function warning(condition, format) { + if (format === undefined) { + throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument'); + } + + if (format.indexOf('Failed Composite propType: ') === 0) { + return; // Ignore CompositeComponent proptype check. + } + + if (!condition) { + for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { + args[_key2 - 2] = arguments[_key2]; + } + + printWarning.apply(undefined, [format].concat(args)); + } + }; + })(); } module.exports = warning; -},{"./emptyFunction":8}],27:[function(require,module,exports){ +},{"./emptyFunction":8}],26:[function(require,module,exports){ 'use strict'; /* eslint-disable no-unused-vars */ var hasOwnProperty = Object.prototype.hasOwnProperty; @@ -1296,6 +1255,168 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) { return to; }; +},{}],27:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +(function () { + try { + cachedSetTimeout = setTimeout; + } catch (e) { + cachedSetTimeout = function () { + throw new Error('setTimeout is not defined'); + } + } + try { + cachedClearTimeout = clearTimeout; + } catch (e) { + cachedClearTimeout = function () { + throw new Error('clearTimeout is not defined'); + } + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + },{}],28:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. @@ -1321,7 +1442,7 @@ var AutoFocusUtils = { }; module.exports = AutoFocusUtils; -},{"./ReactDOMComponentTree":68,"fbjs/lib/focusNode":10}],29:[function(require,module,exports){ +},{"./ReactDOMComponentTree":69,"fbjs/lib/focusNode":10}],29:[function(require,module,exports){ /** * Copyright 2013-present Facebook, Inc. * All rights reserved. @@ -1710,7 +1831,7 @@ var BeforeInputEventPlugin = { }; module.exports = BeforeInputEventPlugin; -},{"./EventConstants":43,"./EventPropagators":47,"./FallbackCompositionState":48,"./SyntheticCompositionEvent":125,"./SyntheticInputEvent":129,"fbjs/lib/ExecutionEnvironment":2,"fbjs/lib/keyOf":20}],30:[function(require,module,exports){ +},{"./EventConstants":43,"./EventPropagators":47,"./FallbackCompositionState":48,"./SyntheticCompositionEvent":126,"./SyntheticInputEvent":130,"fbjs/lib/ExecutionEnvironment":2,"fbjs/lib/keyOf":20}],30:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -2065,7 +2186,7 @@ var CSSPropertyOperations = { }; module.exports = CSSPropertyOperations; -},{"./CSSProperty":30,"./ReactInstrumentation":100,"./dangerousStyleValue":143,"fbjs/lib/ExecutionEnvironment":2,"fbjs/lib/camelizeStyleName":4,"fbjs/lib/hyphenateStyleName":15,"fbjs/lib/memoizeStringOnly":22,"fbjs/lib/warning":26}],32:[function(require,module,exports){ +},{"./CSSProperty":30,"./ReactInstrumentation":99,"./dangerousStyleValue":144,"fbjs/lib/ExecutionEnvironment":2,"fbjs/lib/camelizeStyleName":4,"fbjs/lib/hyphenateStyleName":15,"fbjs/lib/memoizeStringOnly":21,"fbjs/lib/warning":25}],32:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -2172,7 +2293,7 @@ _assign(CallbackQueue.prototype, { PooledClass.addPoolingTo(CallbackQueue); module.exports = CallbackQueue; -},{"./PooledClass":52,"./reactProdInvariant":162,"fbjs/lib/invariant":16,"object-assign":27}],33:[function(require,module,exports){ +},{"./PooledClass":52,"./reactProdInvariant":163,"fbjs/lib/invariant":16,"object-assign":26}],33:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -2498,7 +2619,7 @@ var ChangeEventPlugin = { }; module.exports = ChangeEventPlugin; -},{"./EventConstants":43,"./EventPluginHub":44,"./EventPropagators":47,"./ReactDOMComponentTree":68,"./ReactUpdates":118,"./SyntheticEvent":127,"./getEventTarget":151,"./isEventSupported":158,"./isTextInputElement":159,"fbjs/lib/ExecutionEnvironment":2,"fbjs/lib/keyOf":20}],34:[function(require,module,exports){ +},{"./EventConstants":43,"./EventPluginHub":44,"./EventPropagators":47,"./ReactDOMComponentTree":69,"./ReactUpdates":119,"./SyntheticEvent":128,"./getEventTarget":152,"./isEventSupported":159,"./isTextInputElement":160,"fbjs/lib/ExecutionEnvironment":2,"fbjs/lib/keyOf":20}],34:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -2693,7 +2814,7 @@ var DOMChildrenOperations = { }; module.exports = DOMChildrenOperations; -},{"./DOMLazyTree":35,"./Danger":39,"./ReactDOMComponentTree":68,"./ReactInstrumentation":100,"./ReactMultiChildUpdateTypes":105,"./createMicrosoftUnsafeLocalFunction":142,"./setInnerHTML":164,"./setTextContent":165}],35:[function(require,module,exports){ +},{"./DOMLazyTree":35,"./Danger":39,"./ReactDOMComponentTree":69,"./ReactInstrumentation":99,"./ReactMultiChildUpdateTypes":104,"./createMicrosoftUnsafeLocalFunction":143,"./setInnerHTML":165,"./setTextContent":166}],35:[function(require,module,exports){ /** * Copyright 2015-present, Facebook, Inc. * All rights reserved. @@ -2812,7 +2933,7 @@ DOMLazyTree.queueHTML = queueHTML; DOMLazyTree.queueText = queueText; module.exports = DOMLazyTree; -},{"./DOMNamespaces":36,"./createMicrosoftUnsafeLocalFunction":142,"./setInnerHTML":164,"./setTextContent":165}],36:[function(require,module,exports){ +},{"./DOMNamespaces":36,"./createMicrosoftUnsafeLocalFunction":143,"./setInnerHTML":165,"./setTextContent":166}],36:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -3040,7 +3161,7 @@ var DOMProperty = { }; module.exports = DOMProperty; -},{"./reactProdInvariant":162,"fbjs/lib/invariant":16}],38:[function(require,module,exports){ +},{"./reactProdInvariant":163,"fbjs/lib/invariant":16}],38:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -3056,7 +3177,6 @@ module.exports = DOMProperty; var DOMProperty = require('./DOMProperty'); var ReactDOMComponentTree = require('./ReactDOMComponentTree'); -var ReactDOMInstrumentation = require('./ReactDOMInstrumentation'); var ReactInstrumentation = require('./ReactInstrumentation'); var quoteAttributeValueForBrowser = require('./quoteAttributeValueForBrowser'); @@ -3121,9 +3241,6 @@ var DOMPropertyOperations = { * @return {?string} Markup string, or null if the property was invalid. */ createMarkupForProperty: function (name, value) { - if ("production" !== 'production') { - ReactDOMInstrumentation.debugTool.onCreateMarkupForProperty(name, value); - } var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; if (propertyInfo) { if (shouldIgnoreValue(propertyInfo, value)) { @@ -3196,7 +3313,6 @@ var DOMPropertyOperations = { } if ("production" !== 'production') { - ReactDOMInstrumentation.debugTool.onSetValueForProperty(node, name, value); var payload = {}; payload[name] = value; ReactInstrumentation.debugTool.onHostOperation(ReactDOMComponentTree.getInstanceFromNode(node)._debugID, 'update attribute', payload); @@ -3229,7 +3345,6 @@ var DOMPropertyOperations = { deleteValueForAttribute: function (node, name) { node.removeAttribute(name); if ("production" !== 'production') { - ReactDOMInstrumentation.debugTool.onDeleteValueForProperty(node, name); ReactInstrumentation.debugTool.onHostOperation(ReactDOMComponentTree.getInstanceFromNode(node)._debugID, 'remove attribute', name); } }, @@ -3261,7 +3376,6 @@ var DOMPropertyOperations = { } if ("production" !== 'production') { - ReactDOMInstrumentation.debugTool.onDeleteValueForProperty(node, name); ReactInstrumentation.debugTool.onHostOperation(ReactDOMComponentTree.getInstanceFromNode(node)._debugID, 'remove attribute', name); } } @@ -3269,7 +3383,7 @@ var DOMPropertyOperations = { }; module.exports = DOMPropertyOperations; -},{"./DOMProperty":37,"./ReactDOMComponentTree":68,"./ReactDOMInstrumentation":76,"./ReactInstrumentation":100,"./quoteAttributeValueForBrowser":161,"fbjs/lib/warning":26}],39:[function(require,module,exports){ +},{"./DOMProperty":37,"./ReactDOMComponentTree":69,"./ReactInstrumentation":99,"./quoteAttributeValueForBrowser":162,"fbjs/lib/warning":25}],39:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -3318,7 +3432,7 @@ var Danger = { }; module.exports = Danger; -},{"./DOMLazyTree":35,"./reactProdInvariant":162,"fbjs/lib/ExecutionEnvironment":2,"fbjs/lib/createNodesFromMarkup":7,"fbjs/lib/emptyFunction":8,"fbjs/lib/invariant":16}],40:[function(require,module,exports){ +},{"./DOMLazyTree":35,"./reactProdInvariant":163,"fbjs/lib/ExecutionEnvironment":2,"fbjs/lib/createNodesFromMarkup":7,"fbjs/lib/emptyFunction":8,"fbjs/lib/invariant":16}],40:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -3503,7 +3617,7 @@ var EnterLeaveEventPlugin = { }; module.exports = EnterLeaveEventPlugin; -},{"./EventConstants":43,"./EventPropagators":47,"./ReactDOMComponentTree":68,"./SyntheticMouseEvent":131,"fbjs/lib/keyOf":20}],43:[function(require,module,exports){ +},{"./EventConstants":43,"./EventPropagators":47,"./ReactDOMComponentTree":69,"./SyntheticMouseEvent":132,"fbjs/lib/keyOf":20}],43:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -3659,6 +3773,12 @@ var executeDispatchesAndReleaseTopLevel = function (e) { return executeDispatchesAndRelease(e, false); }; +var getDictionaryKey = function (inst) { + // Prevents V8 performance issue: + // https://github.com/facebook/react/pull/7232 + return '.' + inst._rootNodeID; +}; + /** * This is a unified interface for event plugins to be installed and configured. * @@ -3702,7 +3822,7 @@ var EventPluginHub = { }, /** - * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent. + * Stores `listener` at `listenerBank[registrationName][key]`. Is idempotent. * * @param {object} inst The instance, which is the source of events. * @param {string} registrationName Name of listener (e.g. `onClick`). @@ -3711,8 +3831,9 @@ var EventPluginHub = { putListener: function (inst, registrationName, listener) { !(typeof listener === 'function') ? "production" !== 'production' ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : _prodInvariant('94', registrationName, typeof listener) : void 0; + var key = getDictionaryKey(inst); var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {}); - bankForRegistrationName[inst._rootNodeID] = listener; + bankForRegistrationName[key] = listener; var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; if (PluginModule && PluginModule.didPutListener) { @@ -3727,7 +3848,8 @@ var EventPluginHub = { */ getListener: function (inst, registrationName) { var bankForRegistrationName = listenerBank[registrationName]; - return bankForRegistrationName && bankForRegistrationName[inst._rootNodeID]; + var key = getDictionaryKey(inst); + return bankForRegistrationName && bankForRegistrationName[key]; }, /** @@ -3745,7 +3867,8 @@ var EventPluginHub = { var bankForRegistrationName = listenerBank[registrationName]; // TODO: This should never be null -- when is it? if (bankForRegistrationName) { - delete bankForRegistrationName[inst._rootNodeID]; + var key = getDictionaryKey(inst); + delete bankForRegistrationName[key]; } }, @@ -3755,12 +3878,13 @@ var EventPluginHub = { * @param {object} inst The instance, which is the source of events. */ deleteAllListeners: function (inst) { + var key = getDictionaryKey(inst); for (var registrationName in listenerBank) { if (!listenerBank.hasOwnProperty(registrationName)) { continue; } - if (!listenerBank[registrationName][inst._rootNodeID]) { + if (!listenerBank[registrationName][key]) { continue; } @@ -3769,7 +3893,7 @@ var EventPluginHub = { PluginModule.willDeleteListener(inst, registrationName); } - delete listenerBank[registrationName][inst._rootNodeID]; + delete listenerBank[registrationName][key]; } }, @@ -3843,7 +3967,7 @@ var EventPluginHub = { }; module.exports = EventPluginHub; -},{"./EventPluginRegistry":45,"./EventPluginUtils":46,"./ReactErrorUtils":91,"./accumulateInto":138,"./forEachAccumulated":147,"./reactProdInvariant":162,"fbjs/lib/invariant":16}],45:[function(require,module,exports){ +},{"./EventPluginRegistry":45,"./EventPluginUtils":46,"./ReactErrorUtils":90,"./accumulateInto":139,"./forEachAccumulated":148,"./reactProdInvariant":163,"fbjs/lib/invariant":16}],45:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -4091,7 +4215,7 @@ var EventPluginRegistry = { }; module.exports = EventPluginRegistry; -},{"./reactProdInvariant":162,"fbjs/lib/invariant":16}],46:[function(require,module,exports){ +},{"./reactProdInvariant":163,"fbjs/lib/invariant":16}],46:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -4321,7 +4445,7 @@ var EventPluginUtils = { }; module.exports = EventPluginUtils; -},{"./EventConstants":43,"./ReactErrorUtils":91,"./reactProdInvariant":162,"fbjs/lib/invariant":16,"fbjs/lib/warning":26}],47:[function(require,module,exports){ +},{"./EventConstants":43,"./ReactErrorUtils":90,"./reactProdInvariant":163,"fbjs/lib/invariant":16,"fbjs/lib/warning":25}],47:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -4459,7 +4583,7 @@ var EventPropagators = { }; module.exports = EventPropagators; -},{"./EventConstants":43,"./EventPluginHub":44,"./EventPluginUtils":46,"./accumulateInto":138,"./forEachAccumulated":147,"fbjs/lib/warning":26}],48:[function(require,module,exports){ +},{"./EventConstants":43,"./EventPluginHub":44,"./EventPluginUtils":46,"./accumulateInto":139,"./forEachAccumulated":148,"fbjs/lib/warning":25}],48:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -4555,7 +4679,7 @@ _assign(FallbackCompositionState.prototype, { PooledClass.addPoolingTo(FallbackCompositionState); module.exports = FallbackCompositionState; -},{"./PooledClass":52,"./getTextContentAccessor":155,"object-assign":27}],49:[function(require,module,exports){ +},{"./PooledClass":52,"./getTextContentAccessor":156,"object-assign":26}],49:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -4675,6 +4799,7 @@ var HTMLDOMPropertyConfig = { profile: 0, radioGroup: 0, readOnly: HAS_BOOLEAN_VALUE, + referrerPolicy: 0, rel: 0, required: HAS_BOOLEAN_VALUE, reversed: HAS_BOOLEAN_VALUE, @@ -4842,6 +4967,7 @@ var _prodInvariant = require('./reactProdInvariant'); var ReactPropTypes = require('./ReactPropTypes'); var ReactPropTypeLocations = require('./ReactPropTypeLocations'); +var ReactPropTypesSecret = require('./ReactPropTypesSecret'); var invariant = require('fbjs/lib/invariant'); var warning = require('fbjs/lib/warning'); @@ -4904,7 +5030,7 @@ var LinkedValueUtils = { checkPropTypes: function (tagName, props, owner) { for (var propName in propTypes) { if (propTypes.hasOwnProperty(propName)) { - var error = propTypes[propName](props, propName, tagName, ReactPropTypeLocations.prop); + var error = propTypes[propName](props, propName, tagName, ReactPropTypeLocations.prop, null, ReactPropTypesSecret); } if (error instanceof Error && !(error.message in loggedTypeFailures)) { // Only monitor this failure once because there tends to be a lot of the @@ -4960,7 +5086,7 @@ var LinkedValueUtils = { }; module.exports = LinkedValueUtils; -},{"./ReactPropTypeLocations":110,"./ReactPropTypes":111,"./reactProdInvariant":162,"fbjs/lib/invariant":16,"fbjs/lib/warning":26}],52:[function(require,module,exports){ +},{"./ReactPropTypeLocations":109,"./ReactPropTypes":110,"./ReactPropTypesSecret":111,"./reactProdInvariant":163,"fbjs/lib/invariant":16,"fbjs/lib/warning":25}],52:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -5082,7 +5208,7 @@ var PooledClass = { }; module.exports = PooledClass; -},{"./reactProdInvariant":162,"fbjs/lib/invariant":16}],53:[function(require,module,exports){ +},{"./reactProdInvariant":163,"fbjs/lib/invariant":16}],53:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -5100,6 +5226,7 @@ var _assign = require('object-assign'); var ReactChildren = require('./ReactChildren'); var ReactComponent = require('./ReactComponent'); +var ReactPureComponent = require('./ReactPureComponent'); var ReactClass = require('./ReactClass'); var ReactDOMFactories = require('./ReactDOMFactories'); var ReactElement = require('./ReactElement'); @@ -5144,6 +5271,7 @@ var React = { }, Component: ReactComponent, + PureComponent: ReactPureComponent, createElement: createElement, cloneElement: cloneElement, @@ -5170,7 +5298,7 @@ var React = { }; module.exports = React; -},{"./ReactChildren":56,"./ReactClass":57,"./ReactComponent":58,"./ReactDOMFactories":72,"./ReactElement":88,"./ReactElementValidator":89,"./ReactPropTypes":111,"./ReactVersion":119,"./onlyChild":160,"fbjs/lib/warning":26,"object-assign":27}],54:[function(require,module,exports){ +},{"./ReactChildren":56,"./ReactClass":58,"./ReactComponent":59,"./ReactDOMFactories":72,"./ReactElement":87,"./ReactElementValidator":88,"./ReactPropTypes":110,"./ReactPureComponent":112,"./ReactVersion":120,"./onlyChild":161,"fbjs/lib/warning":25,"object-assign":26}],54:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -5488,7 +5616,8 @@ var ReactBrowserEventEmitter = _assign({}, ReactEventEmitterMixin, { }); module.exports = ReactBrowserEventEmitter; -},{"./EventConstants":43,"./EventPluginRegistry":45,"./ReactEventEmitterMixin":92,"./ViewportMetrics":137,"./getVendorPrefixedEventName":156,"./isEventSupported":158,"object-assign":27}],55:[function(require,module,exports){ +},{"./EventConstants":43,"./EventPluginRegistry":45,"./ReactEventEmitterMixin":91,"./ViewportMetrics":138,"./getVendorPrefixedEventName":157,"./isEventSupported":159,"object-assign":26}],55:[function(require,module,exports){ +(function (process){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -5510,12 +5639,27 @@ var shouldUpdateReactComponent = require('./shouldUpdateReactComponent'); var traverseAllChildren = require('./traverseAllChildren'); var warning = require('fbjs/lib/warning'); +var ReactComponentTreeHook; + +if (typeof process !== 'undefined' && process.env && "production" === 'test') { + // Temporary hack. + // Inline requires don't work well with Jest: + // https://github.com/facebook/react/issues/7240 + // Remove the inline requires when we don't need them anymore: + // https://github.com/facebook/react/pull/7178 + ReactComponentTreeHook = require('./ReactComponentTreeHook'); +} + function instantiateChild(childInstances, child, name, selfDebugID) { // We found a component instance. var keyUnique = childInstances[name] === undefined; if ("production" !== 'production') { - var ReactComponentTreeDevtool = require('./ReactComponentTreeDevtool'); - "production" !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.%s', KeyEscapeUtils.unescape(name), ReactComponentTreeDevtool.getStackAddendumByID(selfDebugID)) : void 0; + if (!ReactComponentTreeHook) { + ReactComponentTreeHook = require('./ReactComponentTreeHook'); + } + if (!keyUnique) { + "production" !== 'production' ? warning(false, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.%s', KeyEscapeUtils.unescape(name), ReactComponentTreeHook.getStackAddendumByID(selfDebugID)) : void 0; + } } if (child != null && keyUnique) { childInstances[name] = instantiateReactComponent(child, true); @@ -5536,7 +5680,7 @@ var ReactChildReconciler = { * @return {?object} A set of child instances. * @internal */ - instantiateChildren: function (nestedChildNodes, transaction, context, selfDebugID // __DEV__ only + instantiateChildren: function (nestedChildNodes, transaction, context, selfDebugID // 0 in production and for roots ) { if (nestedChildNodes == null) { return null; @@ -5563,7 +5707,8 @@ var ReactChildReconciler = { * @return {?object} A new set of child instances. * @internal */ - updateChildren: function (prevChildren, nextChildren, removedNodes, transaction, context) { + updateChildren: function (prevChildren, nextChildren, mountImages, removedNodes, transaction, hostParent, hostContainerInfo, context, selfDebugID // 0 in production and for roots + ) { // We currently don't have a way to track moves here but if we use iterators // instead of for..in we can zip the iterators and check if an item has // moved. @@ -5592,6 +5737,10 @@ var ReactChildReconciler = { // The child must be instantiated before it's mounted. var nextChildInstance = instantiateReactComponent(nextElement, true); nextChildren[name] = nextChildInstance; + // Creating mount image now ensures refs are resolved in right order + // (see https://github.com/facebook/react/pull/7101 for explanation). + var nextChildMountImage = ReactReconciler.mountComponent(nextChildInstance, transaction, hostParent, hostContainerInfo, context, selfDebugID); + mountImages.push(nextChildMountImage); } } // Unmount children that are no longer present. @@ -5623,7 +5772,8 @@ var ReactChildReconciler = { }; module.exports = ReactChildReconciler; -},{"./KeyEscapeUtils":50,"./ReactComponentTreeDevtool":61,"./ReactReconciler":113,"./instantiateReactComponent":157,"./shouldUpdateReactComponent":166,"./traverseAllChildren":167,"fbjs/lib/warning":26}],56:[function(require,module,exports){ +}).call(this,require('_process')) +},{"./KeyEscapeUtils":50,"./ReactComponentTreeHook":62,"./ReactReconciler":114,"./instantiateReactComponent":158,"./shouldUpdateReactComponent":167,"./traverseAllChildren":168,"_process":27,"fbjs/lib/warning":25}],56:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -5815,7 +5965,62 @@ var ReactChildren = { }; module.exports = ReactChildren; -},{"./PooledClass":52,"./ReactElement":88,"./traverseAllChildren":167,"fbjs/lib/emptyFunction":8}],57:[function(require,module,exports){ +},{"./PooledClass":52,"./ReactElement":87,"./traverseAllChildren":168,"fbjs/lib/emptyFunction":8}],57:[function(require,module,exports){ +/** + * Copyright 2013-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 ReactChildrenMutationWarningHook + */ + +'use strict'; + +var ReactComponentTreeHook = require('./ReactComponentTreeHook'); + +var warning = require('fbjs/lib/warning'); + +function handleElement(debugID, element) { + if (element == null) { + return; + } + if (element._shadowChildren === undefined) { + return; + } + if (element._shadowChildren === element.props.children) { + return; + } + var isMutated = false; + if (Array.isArray(element._shadowChildren)) { + if (element._shadowChildren.length === element.props.children.length) { + for (var i = 0; i < element._shadowChildren.length; i++) { + if (element._shadowChildren[i] !== element.props.children[i]) { + isMutated = true; + } + } + } else { + isMutated = true; + } + } + if (!Array.isArray(element._shadowChildren) || isMutated) { + "production" !== 'production' ? warning(false, 'Component\'s children should not be mutated.%s', ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0; + } +} + +var ReactChildrenMutationWarningHook = { + onMountComponent: function (debugID) { + handleElement(debugID, ReactComponentTreeHook.getElement(debugID)); + }, + onUpdateComponent: function (debugID) { + handleElement(debugID, ReactComponentTreeHook.getElement(debugID)); + } +}; + +module.exports = ReactChildrenMutationWarningHook; +},{"./ReactComponentTreeHook":62,"fbjs/lib/warning":25}],58:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -6203,6 +6408,13 @@ function validateMethodOverride(isAlreadyDefined, name) { */ function mixSpecIntoComponent(Constructor, spec) { if (!spec) { + if ("production" !== 'production') { + var typeofSpec = typeof spec; + var isMixinValid = typeofSpec === 'object' && spec !== null; + + "production" !== 'production' ? warning(isMixinValid, '%s: You\'re attempting to include a mixin that is either null ' + 'or not an object. Check the mixins included by the component, ' + 'as well as any mixins they include themselves. ' + 'Expected object but got %s.', Constructor.displayName || 'ReactClass', spec === null ? null : typeofSpec) : void 0; + } + return; } @@ -6541,7 +6753,7 @@ var ReactClass = { }; module.exports = ReactClass; -},{"./ReactComponent":58,"./ReactElement":88,"./ReactNoopUpdateQueue":107,"./ReactPropTypeLocationNames":109,"./ReactPropTypeLocations":110,"./reactProdInvariant":162,"fbjs/lib/emptyObject":9,"fbjs/lib/invariant":16,"fbjs/lib/keyMirror":19,"fbjs/lib/keyOf":20,"fbjs/lib/warning":26,"object-assign":27}],58:[function(require,module,exports){ +},{"./ReactComponent":59,"./ReactElement":87,"./ReactNoopUpdateQueue":106,"./ReactPropTypeLocationNames":108,"./ReactPropTypeLocations":109,"./reactProdInvariant":163,"fbjs/lib/emptyObject":9,"fbjs/lib/invariant":16,"fbjs/lib/keyMirror":19,"fbjs/lib/keyOf":20,"fbjs/lib/warning":25,"object-assign":26}],59:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -6660,7 +6872,7 @@ if ("production" !== 'production') { } module.exports = ReactComponent; -},{"./ReactNoopUpdateQueue":107,"./canDefineProperty":140,"./reactProdInvariant":162,"fbjs/lib/emptyObject":9,"fbjs/lib/invariant":16,"fbjs/lib/warning":26}],59:[function(require,module,exports){ +},{"./ReactNoopUpdateQueue":106,"./canDefineProperty":141,"./reactProdInvariant":163,"fbjs/lib/emptyObject":9,"fbjs/lib/invariant":16,"fbjs/lib/warning":25}],60:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -6686,21 +6898,12 @@ var ReactComponentBrowserEnvironment = { processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates, - replaceNodeWithMarkup: DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup, - - /** - * If a particular environment requires that some resources be cleaned up, - * specify this in the injected Mixin. In the DOM, we would likely want to - * purge any cached node ID lookups. - * - * @private - */ - unmountIDFromEnvironment: function (rootNodeID) {} + replaceNodeWithMarkup: DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup }; module.exports = ReactComponentBrowserEnvironment; -},{"./DOMChildrenOperations":34,"./ReactDOMIDOperations":74}],60:[function(require,module,exports){ +},{"./DOMChildrenOperations":34,"./ReactDOMIDOperations":74}],61:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -6722,13 +6925,6 @@ var injected = false; var ReactComponentEnvironment = { - /** - * Optionally injectable environment dependent cleanup hook. (server vs. - * browser etc). Example: A browser system caches DOM nodes based on component - * ID and must remove that cache entry when this instance is unmounted. - */ - unmountIDFromEnvironment: null, - /** * Optionally injectable hook for swapping out mount images in the middle of * the tree. @@ -6744,7 +6940,6 @@ var ReactComponentEnvironment = { injection: { injectEnvironment: function (environment) { !!injected ? "production" !== 'production' ? invariant(false, 'ReactCompositeComponent: injectEnvironment() can only be called once.') : _prodInvariant('104') : void 0; - ReactComponentEnvironment.unmountIDFromEnvironment = environment.unmountIDFromEnvironment; ReactComponentEnvironment.replaceNodeWithMarkup = environment.replaceNodeWithMarkup; ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates; injected = true; @@ -6754,7 +6949,7 @@ var ReactComponentEnvironment = { }; module.exports = ReactComponentEnvironment; -},{"./reactProdInvariant":162,"fbjs/lib/invariant":16}],61:[function(require,module,exports){ +},{"./reactProdInvariant":163,"fbjs/lib/invariant":16}],62:[function(require,module,exports){ /** * Copyright 2016-present, Facebook, Inc. * All rights reserved. @@ -6763,7 +6958,7 @@ module.exports = ReactComponentEnvironment; * 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 ReactComponentTreeDevtool + * @providesModule ReactComponentTreeHook */ 'use strict'; @@ -6775,32 +6970,138 @@ var ReactCurrentOwner = require('./ReactCurrentOwner'); var invariant = require('fbjs/lib/invariant'); var warning = require('fbjs/lib/warning'); -var tree = {}; -var unmountedIDs = {}; -var rootIDs = {}; +function isNative(fn) { + // Based on isNative() from Lodash + var funcToString = Function.prototype.toString; + var hasOwnProperty = Object.prototype.hasOwnProperty; + var reIsNative = RegExp('^' + funcToString + // Take an example native function source for comparison + .call(hasOwnProperty) + // Strip regex characters so we can use it for regex + .replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + // Remove hasOwnProperty from the template to make it generic + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'); + try { + var source = funcToString.call(fn); + return reIsNative.test(source); + } catch (err) { + return false; + } +} + +var canUseCollections = +// Array.from +typeof Array.from === 'function' && +// Map +typeof Map === 'function' && isNative(Map) && +// Map.prototype.keys +Map.prototype != null && typeof Map.prototype.keys === 'function' && isNative(Map.prototype.keys) && +// Set +typeof Set === 'function' && isNative(Set) && +// Set.prototype.keys +Set.prototype != null && typeof Set.prototype.keys === 'function' && isNative(Set.prototype.keys); -function updateTree(id, update) { - if (!tree[id]) { - tree[id] = { - element: null, - parentID: null, - ownerID: null, - text: null, - childIDs: [], - displayName: 'Unknown', - isMounted: false, - updateCount: 0 - }; +var itemMap; +var rootIDSet; + +var itemByKey; +var rootByKey; + +if (canUseCollections) { + itemMap = new Map(); + rootIDSet = new Set(); +} else { + itemByKey = {}; + rootByKey = {}; +} + +var unmountedIDs = []; + +// Use non-numeric keys to prevent V8 performance issues: +// https://github.com/facebook/react/pull/7232 +function getKeyFromID(id) { + return '.' + id; +} +function getIDFromKey(key) { + return parseInt(key.substr(1), 10); +} + +function get(id) { + if (canUseCollections) { + return itemMap.get(id); + } else { + var key = getKeyFromID(id); + return itemByKey[key]; + } +} + +function remove(id) { + if (canUseCollections) { + itemMap['delete'](id); + } else { + var key = getKeyFromID(id); + delete itemByKey[key]; + } +} + +function create(id, element, parentID) { + var item = { + element: element, + parentID: parentID, + text: null, + childIDs: [], + isMounted: false, + updateCount: 0 + }; + + if (canUseCollections) { + itemMap.set(id, item); + } else { + var key = getKeyFromID(id); + itemByKey[key] = item; + } +} + +function addRoot(id) { + if (canUseCollections) { + rootIDSet.add(id); + } else { + var key = getKeyFromID(id); + rootByKey[key] = true; + } +} + +function removeRoot(id) { + if (canUseCollections) { + rootIDSet['delete'](id); + } else { + var key = getKeyFromID(id); + delete rootByKey[key]; + } +} + +function getRegisteredIDs() { + if (canUseCollections) { + return Array.from(itemMap.keys()); + } else { + return Object.keys(itemByKey).map(getIDFromKey); + } +} + +function getRootIDs() { + if (canUseCollections) { + return Array.from(rootIDSet.keys()); + } else { + return Object.keys(rootByKey).map(getIDFromKey); } - update(tree[id]); } function purgeDeep(id) { - var item = tree[id]; + var item = get(id); if (item) { var childIDs = item.childIDs; - delete tree[id]; + remove(id); childIDs.forEach(purgeDeep); } } @@ -6809,102 +7110,109 @@ function describeComponentFrame(name, source, ownerName) { return '\n in ' + name + (source ? ' (at ' + source.fileName.replace(/^.*[\\\/]/, '') + ':' + source.lineNumber + ')' : ownerName ? ' (created by ' + ownerName + ')' : ''); } +function getDisplayName(element) { + if (element == null) { + return '#empty'; + } else if (typeof element === 'string' || typeof element === 'number') { + return '#text'; + } else if (typeof element.type === 'string') { + return element.type; + } else { + return element.type.displayName || element.type.name || 'Unknown'; + } +} + function describeID(id) { - var name = ReactComponentTreeDevtool.getDisplayName(id); - var element = ReactComponentTreeDevtool.getElement(id); - var ownerID = ReactComponentTreeDevtool.getOwnerID(id); + var name = ReactComponentTreeHook.getDisplayName(id); + var element = ReactComponentTreeHook.getElement(id); + var ownerID = ReactComponentTreeHook.getOwnerID(id); var ownerName; if (ownerID) { - ownerName = ReactComponentTreeDevtool.getDisplayName(ownerID); + ownerName = ReactComponentTreeHook.getDisplayName(ownerID); } - "production" !== 'production' ? warning(element, 'ReactComponentTreeDevtool: Missing React element for debugID %s when ' + 'building stack', id) : void 0; + "production" !== 'production' ? warning(element, 'ReactComponentTreeHook: Missing React element for debugID %s when ' + 'building stack', id) : void 0; return describeComponentFrame(name, element && element._source, ownerName); } -var ReactComponentTreeDevtool = { - onSetDisplayName: function (id, displayName) { - updateTree(id, function (item) { - return item.displayName = displayName; - }); - }, +var ReactComponentTreeHook = { onSetChildren: function (id, nextChildIDs) { - updateTree(id, function (item) { - item.childIDs = nextChildIDs; - - nextChildIDs.forEach(function (nextChildID) { - var nextChild = tree[nextChildID]; - !nextChild ? "production" !== 'production' ? invariant(false, 'Expected devtool events to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('68') : void 0; - !(nextChild.displayName != null) ? "production" !== 'production' ? invariant(false, 'Expected onSetDisplayName() to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('69') : void 0; - !(nextChild.childIDs != null || nextChild.text != null) ? "production" !== 'production' ? invariant(false, 'Expected onSetChildren() or onSetText() to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('70') : void 0; - !nextChild.isMounted ? "production" !== 'production' ? invariant(false, 'Expected onMountComponent() to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('71') : void 0; - if (nextChild.parentID == null) { - nextChild.parentID = id; - // TODO: This shouldn't be necessary but mounting a new root during in - // componentWillMount currently causes not-yet-mounted components to - // be purged from our tree data so their parent ID is missing. - } - !(nextChild.parentID === id) ? "production" !== 'production' ? invariant(false, 'Expected onSetParent() and onSetChildren() to be consistent (%s has parents %s and %s).', nextChildID, nextChild.parentID, id) : _prodInvariant('72', nextChildID, nextChild.parentID, id) : void 0; - }); - }); - }, - onSetOwner: function (id, ownerID) { - updateTree(id, function (item) { - return item.ownerID = ownerID; - }); - }, - onSetParent: function (id, parentID) { - updateTree(id, function (item) { - return item.parentID = parentID; - }); - }, - onSetText: function (id, text) { - updateTree(id, function (item) { - return item.text = text; - }); + var item = get(id); + item.childIDs = nextChildIDs; + + for (var i = 0; i < nextChildIDs.length; i++) { + var nextChildID = nextChildIDs[i]; + var nextChild = get(nextChildID); + !nextChild ? "production" !== 'production' ? invariant(false, 'Expected hook events to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('140') : void 0; + !(nextChild.childIDs != null || typeof nextChild.element !== 'object' || nextChild.element == null) ? "production" !== 'production' ? invariant(false, 'Expected onSetChildren() to fire for a container child before its parent includes it in onSetChildren().') : _prodInvariant('141') : void 0; + !nextChild.isMounted ? "production" !== 'production' ? invariant(false, 'Expected onMountComponent() to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('71') : void 0; + if (nextChild.parentID == null) { + nextChild.parentID = id; + // TODO: This shouldn't be necessary but mounting a new root during in + // componentWillMount currently causes not-yet-mounted components to + // be purged from our tree data so their parent ID is missing. + } + !(nextChild.parentID === id) ? "production" !== 'production' ? invariant(false, 'Expected onBeforeMountComponent() parent and onSetChildren() to be consistent (%s has parents %s and %s).', nextChildID, nextChild.parentID, id) : _prodInvariant('142', nextChildID, nextChild.parentID, id) : void 0; + } }, - onBeforeMountComponent: function (id, element) { - updateTree(id, function (item) { - return item.element = element; - }); + onBeforeMountComponent: function (id, element, parentID) { + create(id, element, parentID); }, onBeforeUpdateComponent: function (id, element) { - updateTree(id, function (item) { - return item.element = element; - }); + var item = get(id); + if (!item || !item.isMounted) { + // We may end up here as a result of setState() in componentWillUnmount(). + // In this case, ignore the element. + return; + } + item.element = element; }, onMountComponent: function (id) { - updateTree(id, function (item) { - return item.isMounted = true; - }); - }, - onMountRootComponent: function (id) { - rootIDs[id] = true; + var item = get(id); + item.isMounted = true; + var isRoot = item.parentID === 0; + if (isRoot) { + addRoot(id); + } }, onUpdateComponent: function (id) { - updateTree(id, function (item) { - return item.updateCount++; - }); + var item = get(id); + if (!item || !item.isMounted) { + // We may end up here as a result of setState() in componentWillUnmount(). + // In this case, ignore the element. + return; + } + item.updateCount++; }, onUnmountComponent: function (id) { - updateTree(id, function (item) { - return item.isMounted = false; - }); - unmountedIDs[id] = true; - delete rootIDs[id]; + var item = get(id); + if (item) { + // We need to check if it exists. + // `item` might not exist if it is inside an error boundary, and a sibling + // error boundary child threw while mounting. Then this instance never + // got a chance to mount, but it still gets an unmounting event during + // the error boundary cleanup. + item.isMounted = false; + var isRoot = item.parentID === 0; + if (isRoot) { + removeRoot(id); + } + } + unmountedIDs.push(id); }, purgeUnmountedComponents: function () { - if (ReactComponentTreeDevtool._preventPurging) { + if (ReactComponentTreeHook._preventPurging) { // Should only be used for testing. return; } - for (var id in unmountedIDs) { + for (var i = 0; i < unmountedIDs.length; i++) { + var id = unmountedIDs[i]; purgeDeep(id); } - unmountedIDs = {}; + unmountedIDs.length = 0; }, isMounted: function (id) { - var item = tree[id]; + var item = get(id); return item ? item.isMounted : false; }, getCurrentStackAddendum: function (topElement) { @@ -6919,61 +7227,72 @@ var ReactComponentTreeDevtool = { var currentOwner = ReactCurrentOwner.current; var id = currentOwner && currentOwner._debugID; - info += ReactComponentTreeDevtool.getStackAddendumByID(id); + info += ReactComponentTreeHook.getStackAddendumByID(id); return info; }, getStackAddendumByID: function (id) { var info = ''; while (id) { info += describeID(id); - id = ReactComponentTreeDevtool.getParentID(id); + id = ReactComponentTreeHook.getParentID(id); } return info; }, getChildIDs: function (id) { - var item = tree[id]; + var item = get(id); return item ? item.childIDs : []; }, getDisplayName: function (id) { - var item = tree[id]; - return item ? item.displayName : 'Unknown'; + var element = ReactComponentTreeHook.getElement(id); + if (!element) { + return null; + } + return getDisplayName(element); }, getElement: function (id) { - var item = tree[id]; + var item = get(id); return item ? item.element : null; }, getOwnerID: function (id) { - var item = tree[id]; - return item ? item.ownerID : null; + var element = ReactComponentTreeHook.getElement(id); + if (!element || !element._owner) { + return null; + } + return element._owner._debugID; }, getParentID: function (id) { - var item = tree[id]; + var item = get(id); return item ? item.parentID : null; }, getSource: function (id) { - var item = tree[id]; + var item = get(id); var element = item ? item.element : null; var source = element != null ? element._source : null; return source; }, getText: function (id) { - var item = tree[id]; - return item ? item.text : null; + var element = ReactComponentTreeHook.getElement(id); + if (typeof element === 'string') { + return element; + } else if (typeof element === 'number') { + return '' + element; + } else { + return null; + } }, getUpdateCount: function (id) { - var item = tree[id]; + var item = get(id); return item ? item.updateCount : 0; }, - getRootIDs: function () { - return Object.keys(rootIDs); - }, - getRegisteredIDs: function () { - return Object.keys(tree); - } + + + getRegisteredIDs: getRegisteredIDs, + + getRootIDs: getRootIDs }; -module.exports = ReactComponentTreeDevtool; -},{"./ReactCurrentOwner":63,"./reactProdInvariant":162,"fbjs/lib/invariant":16,"fbjs/lib/warning":26}],62:[function(require,module,exports){ +module.exports = ReactComponentTreeHook; +},{"./ReactCurrentOwner":64,"./reactProdInvariant":163,"fbjs/lib/invariant":16,"fbjs/lib/warning":25}],63:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -7001,12 +7320,18 @@ var ReactPropTypeLocations = require('./ReactPropTypeLocations'); var ReactReconciler = require('./ReactReconciler'); var checkReactTypeSpec = require('./checkReactTypeSpec'); - var emptyObject = require('fbjs/lib/emptyObject'); var invariant = require('fbjs/lib/invariant'); +var shallowEqual = require('fbjs/lib/shallowEqual'); var shouldUpdateReactComponent = require('./shouldUpdateReactComponent'); var warning = require('fbjs/lib/warning'); +var CompositeTypes = { + ImpureClass: 0, + PureClass: 1, + StatelessFunctional: 2 +}; + function StatelessComponent(Component) {} StatelessComponent.prototype.render = function () { var Component = ReactInstanceMap.get(this)._currentElement.type; @@ -7045,7 +7370,11 @@ function invokeComponentDidUpdateWithTimer(prevProps, prevState, prevContext) { } function shouldConstruct(Component) { - return Component.prototype && Component.prototype.isReactComponent; + return !!(Component.prototype && Component.prototype.isReactComponent); +} + +function isPureComponent(Component) { + return !!(Component.prototype && Component.prototype.isPureReactComponent); } /** @@ -7097,7 +7426,8 @@ var ReactCompositeComponentMixin = { */ construct: function (element) { this._currentElement = element; - this._rootNodeID = null; + this._rootNodeID = 0; + this._compositeType = null; this._instance = null; this._hostParent = null; this._hostContainerInfo = null; @@ -7151,15 +7481,23 @@ var ReactCompositeComponentMixin = { var updateQueue = transaction.getUpdateQueue(); // Initialize the public class - var inst = this._constructComponent(publicProps, publicContext, updateQueue); + var doConstruct = shouldConstruct(Component); + var inst = this._constructComponent(doConstruct, publicProps, publicContext, updateQueue); var renderedElement; // Support functional components - if (!shouldConstruct(Component) && (inst == null || inst.render == null)) { + if (!doConstruct && (inst == null || inst.render == null)) { renderedElement = inst; warnIfInvalidElement(Component, renderedElement); !(inst === null || inst === false || ReactElement.isValidElement(inst)) ? "production" !== 'production' ? invariant(false, '%s(...): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.', Component.displayName || Component.name || 'Component') : _prodInvariant('105', Component.displayName || Component.name || 'Component') : void 0; inst = new StatelessComponent(Component); + this._compositeType = CompositeTypes.StatelessFunctional; + } else { + if (isPureComponent(Component)) { + this._compositeType = CompositeTypes.PureClass; + } else { + this._compositeType = CompositeTypes.ImpureClass; + } } if ("production" !== 'production') { @@ -7228,23 +7566,23 @@ var ReactCompositeComponentMixin = { return markup; }, - _constructComponent: function (publicProps, publicContext, updateQueue) { + _constructComponent: function (doConstruct, publicProps, publicContext, updateQueue) { if ("production" !== 'production') { ReactCurrentOwner.current = this; try { - return this._constructComponentWithoutOwner(publicProps, publicContext, updateQueue); + return this._constructComponentWithoutOwner(doConstruct, publicProps, publicContext, updateQueue); } finally { ReactCurrentOwner.current = null; } } else { - return this._constructComponentWithoutOwner(publicProps, publicContext, updateQueue); + return this._constructComponentWithoutOwner(doConstruct, publicProps, publicContext, updateQueue); } }, - _constructComponentWithoutOwner: function (publicProps, publicContext, updateQueue) { + _constructComponentWithoutOwner: function (doConstruct, publicProps, publicContext, updateQueue) { var Component = this._currentElement.type; var instanceOrElement; - if (shouldConstruct(Component)) { + if (doConstruct) { if ("production" !== 'production') { if (this._debugID !== 0) { ReactInstrumentation.debugTool.onBeginLifeCycleTimer(this._debugID, 'ctor'); @@ -7334,13 +7672,12 @@ var ReactCompositeComponentMixin = { var child = this._instantiateReactComponent(renderedElement, nodeType !== ReactNodeTypes.EMPTY /* shouldHaveDebugID */ ); this._renderedComponent = child; + + var selfDebugID = 0; if ("production" !== 'production') { - if (child._debugID !== 0 && this._debugID !== 0) { - ReactInstrumentation.debugTool.onSetParent(child._debugID, this._debugID); - } + selfDebugID = this._debugID; } - - var markup = ReactReconciler.mountComponent(child, transaction, hostParent, hostContainerInfo, this._processChildContext(context)); + var markup = ReactReconciler.mountComponent(child, transaction, hostParent, hostContainerInfo, this._processChildContext(context), selfDebugID); if ("production" !== 'production') { if (this._debugID !== 0) { @@ -7406,7 +7743,7 @@ var ReactCompositeComponentMixin = { // These fields do not really need to be reset since this object is no // longer accessible. this._context = null; - this._rootNodeID = null; + this._rootNodeID = 0; this._topLevelWrapper = null; // Delete the reference from the instance to this internal representation @@ -7548,7 +7885,6 @@ var ReactCompositeComponentMixin = { var willReceive = false; var nextContext; - var nextProps; // Determine if the context has changed or not if (this._context === nextUnmaskedContext) { @@ -7558,7 +7894,8 @@ var ReactCompositeComponentMixin = { willReceive = true; } - nextProps = nextParentElement.props; + var prevProps = prevParentElement.props; + var nextProps = nextParentElement.props; // Not a simple state update but a props update if (prevParentElement !== nextParentElement) { @@ -7585,16 +7922,22 @@ var ReactCompositeComponentMixin = { var nextState = this._processPendingState(nextProps, nextContext); var shouldUpdate = true; - if (!this._pendingForceUpdate && inst.shouldComponentUpdate) { - if ("production" !== 'production') { - if (this._debugID !== 0) { - ReactInstrumentation.debugTool.onBeginLifeCycleTimer(this._debugID, 'shouldComponentUpdate'); + if (!this._pendingForceUpdate) { + if (inst.shouldComponentUpdate) { + if ("production" !== 'production') { + if (this._debugID !== 0) { + ReactInstrumentation.debugTool.onBeginLifeCycleTimer(this._debugID, 'shouldComponentUpdate'); + } } - } - shouldUpdate = inst.shouldComponentUpdate(nextProps, nextState, nextContext); - if ("production" !== 'production') { - if (this._debugID !== 0) { - ReactInstrumentation.debugTool.onEndLifeCycleTimer(this._debugID, 'shouldComponentUpdate'); + shouldUpdate = inst.shouldComponentUpdate(nextProps, nextState, nextContext); + if ("production" !== 'production') { + if (this._debugID !== 0) { + ReactInstrumentation.debugTool.onEndLifeCycleTimer(this._debugID, 'shouldComponentUpdate'); + } + } + } else { + if (this._compositeType === CompositeTypes.PureClass) { + shouldUpdate = !shallowEqual(prevProps, nextProps) || !shallowEqual(inst.state, nextState); } } } @@ -7720,13 +8063,12 @@ var ReactCompositeComponentMixin = { var child = this._instantiateReactComponent(nextRenderedElement, nodeType !== ReactNodeTypes.EMPTY /* shouldHaveDebugID */ ); this._renderedComponent = child; + + var selfDebugID = 0; if ("production" !== 'production') { - if (child._debugID !== 0 && this._debugID !== 0) { - ReactInstrumentation.debugTool.onSetParent(child._debugID, this._debugID); - } + selfDebugID = this._debugID; } - - var nextMarkup = ReactReconciler.mountComponent(child, transaction, this._hostParent, this._hostContainerInfo, this._processChildContext(context)); + var nextMarkup = ReactReconciler.mountComponent(child, transaction, this._hostParent, this._hostContainerInfo, this._processChildContext(context), selfDebugID); if ("production" !== 'production') { if (this._debugID !== 0) { @@ -7782,11 +8124,15 @@ var ReactCompositeComponentMixin = { */ _renderValidatedComponent: function () { var renderedComponent; - ReactCurrentOwner.current = this; - try { + if ("production" !== 'production' || this._compositeType !== CompositeTypes.StatelessFunctional) { + ReactCurrentOwner.current = this; + try { + renderedComponent = this._renderValidatedComponentWithoutOwnerOrContext(); + } finally { + ReactCurrentOwner.current = null; + } + } else { renderedComponent = this._renderValidatedComponentWithoutOwnerOrContext(); - } finally { - ReactCurrentOwner.current = null; } !( // TODO: An `isValidNode` function would probably be more appropriate @@ -7849,7 +8195,7 @@ var ReactCompositeComponentMixin = { */ getPublicInstance: function () { var inst = this._instance; - if (inst instanceof StatelessComponent) { + if (this._compositeType === CompositeTypes.StatelessFunctional) { return null; } return inst; @@ -7867,7 +8213,7 @@ var ReactCompositeComponent = { }; module.exports = ReactCompositeComponent; -},{"./ReactComponentEnvironment":60,"./ReactCurrentOwner":63,"./ReactElement":88,"./ReactErrorUtils":91,"./ReactInstanceMap":99,"./ReactInstrumentation":100,"./ReactNodeTypes":106,"./ReactPropTypeLocations":110,"./ReactReconciler":113,"./checkReactTypeSpec":141,"./reactProdInvariant":162,"./shouldUpdateReactComponent":166,"fbjs/lib/emptyObject":9,"fbjs/lib/invariant":16,"fbjs/lib/warning":26,"object-assign":27}],63:[function(require,module,exports){ +},{"./ReactComponentEnvironment":61,"./ReactCurrentOwner":64,"./ReactElement":87,"./ReactErrorUtils":90,"./ReactInstanceMap":98,"./ReactInstrumentation":99,"./ReactNodeTypes":105,"./ReactPropTypeLocations":109,"./ReactReconciler":114,"./checkReactTypeSpec":142,"./reactProdInvariant":163,"./shouldUpdateReactComponent":167,"fbjs/lib/emptyObject":9,"fbjs/lib/invariant":16,"fbjs/lib/shallowEqual":24,"fbjs/lib/warning":25,"object-assign":26}],64:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -7899,7 +8245,7 @@ var ReactCurrentOwner = { }; module.exports = ReactCurrentOwner; -},{}],64:[function(require,module,exports){ +},{}],65:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -7929,7 +8275,7 @@ var warning = require('fbjs/lib/warning'); ReactDefaultInjection.inject(); -var React = { +var ReactDOM = { findDOMNode: findDOMNode, render: ReactMount.render, unmountComponentAtNode: ReactMount.unmountComponentAtNode, @@ -8000,8 +8346,17 @@ if ("production" !== 'production') { } } -module.exports = React; -},{"./ReactDOMComponentTree":68,"./ReactDefaultInjection":87,"./ReactMount":103,"./ReactReconciler":113,"./ReactUpdates":118,"./ReactVersion":119,"./findDOMNode":145,"./getHostComponentFromComposite":152,"./renderSubtreeIntoContainer":163,"fbjs/lib/ExecutionEnvironment":2,"fbjs/lib/warning":26}],65:[function(require,module,exports){ +if ("production" !== 'production') { + var ReactInstrumentation = require('./ReactInstrumentation'); + var ReactDOMUnknownPropertyHook = require('./ReactDOMUnknownPropertyHook'); + var ReactDOMNullInputValuePropHook = require('./ReactDOMNullInputValuePropHook'); + + ReactInstrumentation.debugTool.addHook(ReactDOMUnknownPropertyHook); + ReactInstrumentation.debugTool.addHook(ReactDOMNullInputValuePropHook); +} + +module.exports = ReactDOM; +},{"./ReactDOMComponentTree":69,"./ReactDOMNullInputValuePropHook":76,"./ReactDOMUnknownPropertyHook":83,"./ReactDefaultInjection":86,"./ReactInstrumentation":99,"./ReactMount":102,"./ReactReconciler":114,"./ReactUpdates":119,"./ReactVersion":120,"./findDOMNode":146,"./getHostComponentFromComposite":153,"./renderSubtreeIntoContainer":164,"fbjs/lib/ExecutionEnvironment":2,"fbjs/lib/warning":25}],66:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -8026,7 +8381,7 @@ var ReactDOMButton = { }; module.exports = ReactDOMButton; -},{"./DisabledInputUtils":41}],66:[function(require,module,exports){ +},{"./DisabledInputUtils":41}],67:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -8055,7 +8410,6 @@ var EventConstants = require('./EventConstants'); var EventPluginHub = require('./EventPluginHub'); var EventPluginRegistry = require('./EventPluginRegistry'); var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter'); -var ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment'); var ReactDOMButton = require('./ReactDOMButton'); var ReactDOMComponentFlags = require('./ReactDOMComponentFlags'); var ReactDOMComponentTree = require('./ReactDOMComponentTree'); @@ -8230,7 +8584,8 @@ if ("production" !== 'production') { setContentChildForInstrumentation = function (content) { var hasExistingContent = this._contentDebugID != null; var debugID = this._debugID; - var contentDebugID = debugID + '#text'; + // This ID represents the inlined child that has no backing instance: + var contentDebugID = -debugID; if (content == null) { if (hasExistingContent) { @@ -8241,17 +8596,11 @@ if ("production" !== 'production') { } this._contentDebugID = contentDebugID; - var text = '' + content; - - ReactInstrumentation.debugTool.onSetDisplayName(contentDebugID, '#text'); - ReactInstrumentation.debugTool.onSetParent(contentDebugID, debugID); - ReactInstrumentation.debugTool.onSetText(contentDebugID, text); - if (hasExistingContent) { ReactInstrumentation.debugTool.onBeforeUpdateComponent(contentDebugID, content); ReactInstrumentation.debugTool.onUpdateComponent(contentDebugID); } else { - ReactInstrumentation.debugTool.onBeforeMountComponent(contentDebugID, content); + ReactInstrumentation.debugTool.onBeforeMountComponent(contentDebugID, content, debugID); ReactInstrumentation.debugTool.onMountComponent(contentDebugID); ReactInstrumentation.debugTool.onSetChildren(debugID, [contentDebugID]); } @@ -8412,8 +8761,8 @@ function ReactDOMComponent(element) { this._previousStyleCopy = null; this._hostNode = null; this._hostParent = null; - this._rootNodeID = null; - this._domID = null; + this._rootNodeID = 0; + this._domID = 0; this._hostContainerInfo = null; this._wrapperState = null; this._topLevelWrapper = null; @@ -8434,7 +8783,7 @@ ReactDOMComponent.Mixin = { * * @internal * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction - * @param {?ReactDOMComponent} the containing DOM component instance + * @param {?ReactDOMComponent} the parent component instance * @param {?object} info about the host container * @param {object} context * @return {string} The computed markup. @@ -8772,7 +9121,6 @@ ReactDOMComponent.Mixin = { nextProps = ReactDOMButton.getHostProps(this, nextProps); break; case 'input': - ReactDOMInput.updateWrapper(this); lastProps = ReactDOMInput.getHostProps(this, lastProps); nextProps = ReactDOMInput.getHostProps(this, nextProps); break; @@ -8785,7 +9133,6 @@ ReactDOMComponent.Mixin = { nextProps = ReactDOMSelect.getHostProps(this, nextProps); break; case 'textarea': - ReactDOMTextarea.updateWrapper(this); lastProps = ReactDOMTextarea.getHostProps(this, lastProps); nextProps = ReactDOMTextarea.getHostProps(this, nextProps); break; @@ -8795,10 +9142,21 @@ ReactDOMComponent.Mixin = { this._updateDOMProperties(lastProps, nextProps, transaction); this._updateDOMChildren(lastProps, nextProps, transaction, context); - if (this._tag === 'select') { - // value update needs to occur after