├── .gitignore ├── LICENSE.md ├── README.md ├── package.json ├── server.js ├── src ├── angular1.html ├── angular1.js ├── angular2-app.js ├── angular2-app.ts ├── angular2-grid.html ├── angular2.html ├── demo.css ├── favicon.ico ├── index.html ├── js │ ├── angular-1 │ │ ├── angular-csp.css │ │ ├── angular.js │ │ └── angular.min.js │ └── react │ │ ├── JSXTransformer.js │ │ ├── react-with-addons.js │ │ ├── react-with-addons.min.js │ │ ├── react.js │ │ └── react.min.js ├── react.html └── react.jsx ├── tests ├── angular-1-mount-grid.conf.js ├── angular-1-mount-grid.spec.js ├── angular-2-mount-grid.conf.js ├── angular-2-mount-grid.spec.js ├── react-mount-grid.conf.js └── react-mount-grid.spec.js └── typings ├── angular2 └── angular2.d.ts ├── es6-promise └── es6-promise.d.ts └── rx ├── rx-lite.d.ts └── rx.d.ts /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .idea/ 3 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Dave Baskin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AngularJS and ReactJS Performance 2 | 3 | This repository builds off of the great work by Ben Nadel in his blog post, 4 | [Rendering Large Datasets With AngularJS And ReactJS](http://www.bennadel.com/blog/2864-rendering-large-datasets-with-angularjs-and-reactjs.htm). 5 | The source code for the original example is [here](https://github.com/bennadel/JavaScript-Demos/tree/master/demos/render-large-datasets-angularjs-reactjs). 6 | 7 | This code takes the original code and adds Angular Benchpress tests to put actual 8 | numbers on: 9 | 10 | - Rendering the large grid. 11 | - Searching within the grid. 12 | 13 | It also compares this with Angular2. 14 | 15 | ## Prerequisites 16 | 17 | - [NodeJS](https://nodejs.org/) 18 | - [Protractor](https://angular.github.io/protractor/) 19 | 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "render-large-datasets-angularjs-reactjs", 3 | "version": "1.0.0", 4 | "description": "Performance of rendering large datasets with AngularJS And ReactJS.", 5 | "main": "server.js", 6 | "author": "Dave Baskin ", 7 | "license": "MIT", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/dfbaskin/render-large-datasets-angularjs-reactjs" 11 | }, 12 | "dependencies": { 13 | "angular2": "^2.0.0-alpha.31", 14 | "es6-shim": "^0.32.2", 15 | "express": "^4.13.1", 16 | "q": "^1.4.1", 17 | "reflect-metadata": "^0.1.0", 18 | "systemjs": "^0.18.4" 19 | }, 20 | "devDependencies": { 21 | "benchpress": "^2.0.0-alpha.31", 22 | "jasmine-core": "^2.3.4" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | 2 | var portNum = process.env.PORT || 5001; 3 | 4 | var express = require('express'); 5 | var app = express(); 6 | 7 | app.all("*", function(req, res, next) { 8 | console.log('--> ' + req.path); 9 | next(); 10 | }); 11 | 12 | app.use("/angular2", express.static("node_modules/angular2")); 13 | app.use("/zone", express.static("node_modules/angular2/node_modules/zone.js/lib")); 14 | app.use("/es6-shim", express.static("node_modules/es6-shim")); 15 | app.use("/reflect-metadata", express.static("node_modules/reflect-metadata")); 16 | app.use("/systemjs", express.static("node_modules/systemjs/dist")); 17 | app.use("/", express.static("src")); 18 | 19 | var server = app.listen(portNum, function () { 20 | var addr = server.address().address; 21 | var host = isLocalHost(addr) ? "localhost" : addr; 22 | var port = server.address().port; 23 | console.log('Web application listening at http://%s:%s', host, port); 24 | }); 25 | 26 | function isLocalHost(addr) { 27 | return addr === "::"; 28 | } 29 | -------------------------------------------------------------------------------- /src/angular1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Rendering Large Datasets With AngularJS 8 | 9 | 10 | 11 | 12 | 13 | 14 |

15 | Rendering Large Datasets With AngularJS 16 |

17 | 18 |
19 | Filter Data: 20 | 21 | 22 | 26 | 27 | — 28 | Filtering {{ vm.form.filter }} 29 | over {{ vm.dataPoints }} data points, 30 | {{ vm.visibleCount }} found. 31 | 32 | 33 | 34 | Unmount Grid 35 | Remount Grid 36 |
37 | 38 | 39 | 40 | 43 | 49 | 50 |
41 | {{ row.id }} 42 | 47 | {{ item.value }} 48 |
51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /src/angular1.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 3 | // Create an application module for our demo. 4 | angular.module( "Demo", [] ); 5 | 6 | 7 | // --------------------------------------------------------------------------- // 8 | // --------------------------------------------------------------------------- // 9 | 10 | 11 | // I control the root of the application. 12 | angular.module( "Demo" ).controller( 13 | "AppController", 14 | function provideAppController( $scope ) { 15 | 16 | var vm = this; 17 | 18 | // We'll start out with a grid with 10,000 items. 19 | vm.grid = generateGrid( 1000, 10 ); 20 | 21 | // Calculate the number of data-points that may have filtering. 22 | vm.dataPoints = ( vm.grid.length * vm.grid[ 0 ].items.length ); 23 | 24 | // I hold the form data for use with ngModel. 25 | vm.form = { 26 | filter: "" 27 | }; 28 | 29 | // I hold the number of items that are visible based on filtering. 30 | vm.visibleCount = 0; 31 | 32 | // As the user interacts with filter, we need to update the view-model 33 | // to reflect the matching items. 34 | $scope.$watch( "vm.form.filter", handleFilterChange ); 35 | 36 | // Expose the public API. 37 | vm.remountGrid = remountGrid; 38 | vm.unmountGrid = unmountGrid; 39 | 40 | 41 | // --- 42 | // PUBLIC METHODS. 43 | // --- 44 | 45 | 46 | // I update the visibility of the items when the filter is updated. 47 | function handleFilterChange( newValue, oldValue ) { 48 | 49 | if ( newValue === oldValue ) { 50 | 51 | return; 52 | 53 | } 54 | 55 | // Reset the visible count. As we iterate of the items checking 56 | // for visibility, we can increment this count as necessary. 57 | vm.visibleCount = 0; 58 | 59 | for ( var r = 0, rowCount = vm.grid.length ; r < rowCount ; r++ ) { 60 | 61 | var row = vm.grid[ r ]; 62 | 63 | for ( var c = 0, columnCount = row.items.length ; c < columnCount ; c++ ) { 64 | 65 | var item = row.items[ c ]; 66 | 67 | // The item is hidden if the given filter text cannot be 68 | // found in the value of the item. 69 | item.isHiddenByFilter = ( newValue && ( item.value.indexOf( newValue ) === -1 ) ); 70 | 71 | // If the item isn't hidden, track it as part of the visible 72 | // set of data. 73 | if ( ! item.isHiddenByFilter ) { 74 | 75 | vm.visibleCount++; 76 | 77 | } 78 | 79 | } 80 | 81 | } 82 | 83 | } 84 | 85 | 86 | // I repopulate the grid with data. This will help separate processing 87 | // performance characteristics from page-load processing. 88 | function remountGrid() { 89 | 90 | vm.grid = generateGrid( 1000, 10 ); 91 | vm.dataPoints = ( vm.grid.length * vm.grid[ 0 ].items.length ); 92 | 93 | vm.visibleCount = 0; 94 | vm.form.filter = ""; 95 | 96 | } 97 | 98 | 99 | // I clear the grid of data. This will help separate processing 100 | // performance characteristics from page-load processing. 101 | function unmountGrid() { 102 | 103 | vm.grid = []; 104 | vm.dataPoints = 0; 105 | 106 | vm.visibleCount = 0; 107 | vm.form.filter = ""; 108 | 109 | } 110 | 111 | 112 | // --- 113 | // PRIVATE METHODS. 114 | // --- 115 | 116 | 117 | // I generate a grid of items with the given dimensions. The grid is 118 | // represented as a two dimensional grid, of sorts. Each row has an 119 | // object that has an items collection. 120 | function generateGrid( rowCount, columnCount ) { 121 | 122 | var valuePoints = [ 123 | "Daenerys", "Jon", "Sansa", "Arya", "Stannis", "Gregor", "Tyrion", 124 | "Theon", "Joffrey", "Ramsay", "Cersei", "Bran", "Margaery", 125 | "Melisandre", "Daario", "Jamie", "Eddard", "Myrcella", "Robb", 126 | "Jorah", "Petyr", "Tommen", "Sandor", "Oberyn", "Drogo", "Ygritte" 127 | ]; 128 | 129 | var valueIndex = 0; 130 | 131 | var grid = []; 132 | 133 | for ( var r = 0 ; r < rowCount ; r++ ) { 134 | 135 | var row = { 136 | id: r, 137 | items: [] 138 | }; 139 | 140 | for ( var c = 0 ; c < columnCount ; c++ ) { 141 | 142 | row.items.push({ 143 | id: ( r + "-" + c ), 144 | value: valuePoints[ valueIndex ], 145 | isHiddenByFilter: false 146 | }); 147 | 148 | if ( ++valueIndex >= valuePoints.length ) { 149 | 150 | valueIndex = 0; 151 | 152 | } 153 | 154 | } 155 | 156 | grid.push( row ); 157 | 158 | } 159 | 160 | return( grid ); 161 | 162 | } 163 | 164 | } 165 | ); 166 | 167 | }()); 168 | -------------------------------------------------------------------------------- /src/angular2-app.js: -------------------------------------------------------------------------------- 1 | /// 2 | if (typeof __decorate !== "function") __decorate = function (decorators, target, key, desc) { 3 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") return Reflect.decorate(decorators, target, key, desc); 4 | switch (arguments.length) { 5 | case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target); 6 | case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0); 7 | case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc); 8 | } 9 | }; 10 | if (typeof __metadata !== "function") __metadata = function (k, v) { 11 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); 12 | }; 13 | require('zone/zone.js'); 14 | require('reflect-metadata/Reflect.js'); 15 | require('es6-shim/es6-shim.js'); 16 | var angular2_1 = require('angular2/angular2'); 17 | var MyAppComponent = (function () { 18 | function MyAppComponent() { 19 | // We'll start out with a grid with 10,000 items. 20 | this.grid = this.generateGrid(1000, 10); 21 | // Calculate the number of data-points that may have filtering. 22 | this.dataPoints = (this.grid.length * this.grid[0].items.length); 23 | // I hold the form data for use with ngModel. 24 | this.form = { 25 | filter: "" 26 | }; 27 | // I hold the number of items that are visible based on filtering. 28 | this.visibleCount = 0; 29 | // As the user interacts with filter, we need to update the view-model 30 | // to reflect the matching items. 31 | //$scope.$watch( "vm.form.filter", handleFilterChange ); 32 | } 33 | // I repopulate the grid with data. This will help separate processing 34 | // performance characteristics from page-load processing. 35 | MyAppComponent.prototype.remountGrid = function () { 36 | this.grid = this.generateGrid(1000, 10); 37 | this.dataPoints = (this.grid.length * this.grid[0].items.length); 38 | this.visibleCount = 0; 39 | this.form.filter = ""; 40 | }; 41 | // I clear the grid of data. This will help separate processing 42 | // performance characteristics from page-load processing. 43 | MyAppComponent.prototype.unmountGrid = function () { 44 | this.grid = []; 45 | this.dataPoints = 0; 46 | this.visibleCount = 0; 47 | this.form.filter = ""; 48 | }; 49 | // I update the visibility of the items when the filter is updated. 50 | MyAppComponent.prototype.handleFilterChange = function (newValue) { 51 | if (this.form.filter === newValue) { 52 | return; 53 | } 54 | this.form.filter = newValue; 55 | // Reset the visible count. As we iterate of the items checking 56 | // for visibility, we can increment this count as necessary. 57 | this.visibleCount = 0; 58 | for (var r = 0, rowCount = this.grid.length; r < rowCount; r++) { 59 | var row = this.grid[r]; 60 | for (var c = 0, columnCount = row.items.length; c < columnCount; c++) { 61 | var item = row.items[c]; 62 | // The item is hidden if the given filter text cannot be 63 | // found in the value of the item. 64 | item.isHiddenByFilter = (newValue && (item.value.indexOf(newValue) === -1)); 65 | // If the item isn't hidden, track it as part of the visible 66 | // set of data. 67 | if (!item.isHiddenByFilter) { 68 | this.visibleCount++; 69 | } 70 | } 71 | } 72 | }; 73 | MyAppComponent.prototype.generateGrid = function (rowCount, columnCount) { 74 | var valuePoints = [ 75 | "Daenerys", "Jon", "Sansa", "Arya", "Stannis", "Gregor", "Tyrion", 76 | "Theon", "Joffrey", "Ramsay", "Cersei", "Bran", "Margaery", 77 | "Melisandre", "Daario", "Jamie", "Eddard", "Myrcella", "Robb", 78 | "Jorah", "Petyr", "Tommen", "Sandor", "Oberyn", "Drogo", "Ygritte" 79 | ]; 80 | var valueIndex = 0; 81 | var grid = []; 82 | for (var r = 0; r < rowCount; r++) { 83 | var row = { 84 | id: r, 85 | items: [] 86 | }; 87 | for (var c = 0; c < columnCount; c++) { 88 | row.items.push({ 89 | id: (r + "-" + c), 90 | value: valuePoints[valueIndex], 91 | isHiddenByFilter: false 92 | }); 93 | if (++valueIndex >= valuePoints.length) { 94 | valueIndex = 0; 95 | } 96 | } 97 | grid.push(row); 98 | } 99 | return grid; 100 | }; 101 | MyAppComponent = __decorate([ 102 | angular2_1.Component({ 103 | selector: 'my-app' 104 | }), 105 | angular2_1.View({ 106 | directives: [angular2_1.NgFor, angular2_1.NgIf, angular2_1.formDirectives, angular2_1.CSSClass], 107 | templateUrl: 'angular2-grid.html' 108 | }), 109 | __metadata('design:paramtypes', []) 110 | ], MyAppComponent); 111 | return MyAppComponent; 112 | })(); 113 | angular2_1.bootstrap(MyAppComponent); 114 | -------------------------------------------------------------------------------- /src/angular2-app.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import 'zone/zone.js'; 4 | import 'reflect-metadata/Reflect.js'; 5 | import 'es6-shim/es6-shim.js'; 6 | 7 | import { 8 | Component, 9 | View, 10 | NgFor, 11 | NgIf, 12 | formDirectives, 13 | CSSClass, 14 | bootstrap 15 | } from 'angular2/angular2'; 16 | 17 | @Component({ 18 | selector: 'my-app' 19 | }) 20 | @View({ 21 | directives: [NgFor, NgIf, formDirectives, CSSClass], 22 | templateUrl: 'angular2-grid.html' 23 | }) 24 | class MyAppComponent { 25 | 26 | grid; 27 | dataPoints; 28 | form; 29 | visibleCount; 30 | 31 | constructor() { 32 | 33 | // We'll start out with a grid with 10,000 items. 34 | this.grid = this.generateGrid( 1000, 10 ); 35 | 36 | // Calculate the number of data-points that may have filtering. 37 | this.dataPoints = ( this.grid.length * this.grid[ 0 ].items.length ); 38 | 39 | // I hold the form data for use with ngModel. 40 | this.form = { 41 | filter: "" 42 | }; 43 | 44 | // I hold the number of items that are visible based on filtering. 45 | this.visibleCount = 0; 46 | 47 | // As the user interacts with filter, we need to update the view-model 48 | // to reflect the matching items. 49 | //$scope.$watch( "vm.form.filter", handleFilterChange ); 50 | 51 | } 52 | 53 | // I repopulate the grid with data. This will help separate processing 54 | // performance characteristics from page-load processing. 55 | remountGrid() { 56 | 57 | this.grid = this.generateGrid( 1000, 10 ); 58 | this.dataPoints = ( this.grid.length * this.grid[ 0 ].items.length ); 59 | 60 | this.visibleCount = 0; 61 | this.form.filter = ""; 62 | } 63 | 64 | // I clear the grid of data. This will help separate processing 65 | // performance characteristics from page-load processing. 66 | unmountGrid() { 67 | 68 | this.grid = []; 69 | this.dataPoints = 0; 70 | 71 | this.visibleCount = 0; 72 | this.form.filter = ""; 73 | } 74 | 75 | // I update the visibility of the items when the filter is updated. 76 | handleFilterChange( newValue ) { 77 | 78 | if(this.form.filter === newValue) { 79 | return; 80 | } 81 | this.form.filter = newValue; 82 | 83 | // Reset the visible count. As we iterate of the items checking 84 | // for visibility, we can increment this count as necessary. 85 | this.visibleCount = 0; 86 | 87 | for ( var r = 0, rowCount = this.grid.length ; r < rowCount ; r++ ) { 88 | 89 | var row = this.grid[ r ]; 90 | 91 | for ( var c = 0, columnCount = row.items.length ; c < columnCount ; c++ ) { 92 | 93 | var item = row.items[ c ]; 94 | 95 | // The item is hidden if the given filter text cannot be 96 | // found in the value of the item. 97 | item.isHiddenByFilter = ( newValue && ( item.value.indexOf( newValue ) === -1 ) ); 98 | 99 | // If the item isn't hidden, track it as part of the visible 100 | // set of data. 101 | if ( ! item.isHiddenByFilter ) { 102 | 103 | this.visibleCount++; 104 | 105 | } 106 | 107 | } 108 | 109 | } 110 | 111 | } 112 | 113 | private generateGrid( rowCount, columnCount ) { 114 | 115 | var valuePoints = [ 116 | "Daenerys", "Jon", "Sansa", "Arya", "Stannis", "Gregor", "Tyrion", 117 | "Theon", "Joffrey", "Ramsay", "Cersei", "Bran", "Margaery", 118 | "Melisandre", "Daario", "Jamie", "Eddard", "Myrcella", "Robb", 119 | "Jorah", "Petyr", "Tommen", "Sandor", "Oberyn", "Drogo", "Ygritte" 120 | ]; 121 | 122 | var valueIndex = 0; 123 | 124 | var grid = []; 125 | 126 | for ( var r = 0 ; r < rowCount ; r++ ) { 127 | 128 | var row = { 129 | id: r, 130 | items: [] 131 | }; 132 | 133 | for ( var c = 0 ; c < columnCount ; c++ ) { 134 | 135 | row.items.push({ 136 | id: ( r + "-" + c ), 137 | value: valuePoints[ valueIndex ], 138 | isHiddenByFilter: false 139 | }); 140 | 141 | if ( ++valueIndex >= valuePoints.length ) { 142 | 143 | valueIndex = 0; 144 | 145 | } 146 | 147 | } 148 | 149 | grid.push( row ); 150 | 151 | } 152 | 153 | return grid; 154 | } 155 | } 156 | 157 | bootstrap(MyAppComponent); 158 | 159 | -------------------------------------------------------------------------------- /src/angular2-grid.html: -------------------------------------------------------------------------------- 1 |
2 | Filter Data: 3 | 4 | 5 | 9 | 10 | — 11 | Filtering {{ form.filter }} 12 | over {{ dataPoints }} data points, 13 | {{ visibleCount }} found. 14 | 15 | 16 | 17 | Unmount Grid 18 | Remount Grid 19 |
20 | 21 | 22 | 23 | 26 | 27 | 32 | 33 |
24 | {{ row.id }} 25 | 30 | {{ item.value }} 31 |
34 | -------------------------------------------------------------------------------- /src/angular2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Rendering Large Datasets With AngularJS (version 2) 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |

16 | Rendering Large Datasets With AngularJS (version 2) 17 |

18 | 19 | 20 | Loading ... 21 | 22 | 23 | 24 | 36 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/demo.css: -------------------------------------------------------------------------------- 1 | form { 2 | margin-bottom: 15px ; 3 | } 4 | 5 | table { 6 | border: 1px solid #666666 ; 7 | } 8 | 9 | td { 10 | border: 1px solid #666666 ; 11 | padding: 4px 4px 4px 4px ; 12 | } 13 | 14 | td.hidden { 15 | border-color: #CCCCCC ; 16 | color: #CCCCCC ; 17 | } 18 | 19 | table.filtered td.item { 20 | background-color: #FFFFBF ; 21 | } 22 | 23 | table.filtered td.item.hidden { 24 | background-color: transparent ; 25 | } 26 | 27 | a[ ng-click ], 28 | a[ data-reactid ] { 29 | color: red ; 30 | cursor: pointer ; 31 | text-decoration: underline ; 32 | user-select: none ; 33 | -moz-user-select: none ; 34 | -webkit-user-select: none ; 35 | } -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dfbaskin/render-large-datasets-angularjs-reactjs/f210e82619f77ca619fb81cabda7bfe4d68c1035/src/favicon.ico -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AngularJS and ReactJS Performance 6 | 7 | 8 |

AngularJS and ReactJS Performance

9 |

Using large dataset

10 | 21 | 22 | -------------------------------------------------------------------------------- /src/js/angular-1/angular-csp.css: -------------------------------------------------------------------------------- 1 | /* Include this file in your html if you are using the CSP mode. */ 2 | 3 | @charset "UTF-8"; 4 | 5 | [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], 6 | .ng-cloak, .x-ng-cloak, 7 | .ng-hide:not(.ng-hide-animate) { 8 | display: none !important; 9 | } 10 | 11 | ng\:form { 12 | display: block; 13 | } 14 | 15 | .ng-animate-shim { 16 | visibility:hidden; 17 | } 18 | 19 | .ng-anchor { 20 | position:absolute; 21 | } 22 | -------------------------------------------------------------------------------- /src/js/react/react.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * React v0.13.3 3 | * 4 | * Copyright 2013-2015, Facebook, Inc. 5 | * All rights reserved. 6 | * 7 | * This source code is licensed under the BSD-style license found in the 8 | * LICENSE file in the root directory of this source tree. An additional grant 9 | * of patent rights can be found in the PATENTS file in the same directory. 10 | * 11 | */ 12 | !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.React=e()}}(function(){return function e(t,n,r){function o(a,u){if(!n[a]){if(!t[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a8&&11>=x),N=32,I=String.fromCharCode(N),T=f.topLevelTypes,P={beforeInput:{phasedRegistrationNames:{bubbled:C({onBeforeInput:null}),captured:C({onBeforeInputCapture:null})},dependencies:[T.topCompositionEnd,T.topKeyPress,T.topTextInput,T.topPaste]},compositionEnd:{phasedRegistrationNames:{bubbled:C({onCompositionEnd:null}),captured:C({onCompositionEndCapture:null})},dependencies:[T.topBlur,T.topCompositionEnd,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]},compositionStart:{phasedRegistrationNames:{bubbled:C({onCompositionStart:null}),captured:C({onCompositionStartCapture:null})},dependencies:[T.topBlur,T.topCompositionStart,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]},compositionUpdate:{phasedRegistrationNames:{bubbled:C({onCompositionUpdate:null}),captured:C({onCompositionUpdateCapture:null})},dependencies:[T.topBlur,T.topCompositionUpdate,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]}},R=!1,w=null,O={eventTypes:P,extractEvents:function(e,t,n,r){return[l(e,t,n,r),d(e,t,n,r)]}};t.exports=O},{139:139,15:15,20:20,21:21,22:22,91:91,95:95}],4:[function(e,t,n){"use strict";function r(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var o={boxFlex:!0,boxFlexGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,strokeDashoffset:!0,strokeOpacity:!0,strokeWidth:!0},i=["Webkit","ms","Moz","O"];Object.keys(o).forEach(function(e){i.forEach(function(t){o[r(t,e)]=o[e]})});var a={background:{backgroundImage:!0,backgroundPosition:!0,backgroundRepeat:!0,backgroundColor:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0}},u={isUnitlessNumber:o,shorthandPropertyExpansions:a};t.exports=u},{}],5:[function(e,t,n){"use strict";var r=e(4),o=e(21),i=(e(106),e(111)),a=e(131),u=e(141),s=(e(150),u(function(e){return a(e)})),l="cssFloat";o.canUseDOM&&void 0===document.documentElement.style.cssFloat&&(l="styleFloat");var c={createMarkupForStyles:function(e){var t="";for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];null!=r&&(t+=s(n)+":",t+=i(n,r)+";")}return t||null},setValueForStyles:function(e,t){var n=e.style;for(var o in t)if(t.hasOwnProperty(o)){var a=i(o,t[o]);if("float"===o&&(o=l),a)n[o]=a;else{var u=r.shorthandPropertyExpansions[o];if(u)for(var s in u)n[s]="";else n[o]=""}}}};t.exports=c},{106:106,111:111,131:131,141:141,150:150,21:21,4:4}],6:[function(e,t,n){"use strict";function r(){this._callbacks=null,this._contexts=null}var o=e(28),i=e(27),a=e(133);i(r.prototype,{enqueue:function(e,t){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(e),this._contexts.push(t)},notifyAll:function(){var e=this._callbacks,t=this._contexts;if(e){a(e.length===t.length),this._callbacks=null,this._contexts=null;for(var n=0,r=e.length;r>n;n++)e[n].call(t[n]);e.length=0,t.length=0}},reset:function(){this._callbacks=null,this._contexts=null},destructor:function(){this.reset()}}),o.addPoolingTo(r),t.exports=r},{133:133,27:27,28:28}],7:[function(e,t,n){"use strict";function r(e){return"SELECT"===e.nodeName||"INPUT"===e.nodeName&&"file"===e.type}function o(e){var t=x.getPooled(T.change,R,e);E.accumulateTwoPhaseDispatches(t),_.batchedUpdates(i,t)}function i(e){C.enqueueEvents(e),C.processEventQueue()}function a(e,t){P=e,R=t,P.attachEvent("onchange",o)}function u(){P&&(P.detachEvent("onchange",o),P=null,R=null)}function s(e,t,n){return e===I.topChange?n:void 0}function l(e,t,n){e===I.topFocus?(u(),a(t,n)):e===I.topBlur&&u()}function c(e,t){P=e,R=t,w=e.value,O=Object.getOwnPropertyDescriptor(e.constructor.prototype,"value"),Object.defineProperty(P,"value",k),P.attachEvent("onpropertychange",d)}function p(){P&&(delete P.value,P.detachEvent("onpropertychange",d),P=null,R=null,w=null,O=null)}function d(e){if("value"===e.propertyName){var t=e.srcElement.value;t!==w&&(w=t,o(e))}}function f(e,t,n){return e===I.topInput?n:void 0}function h(e,t,n){e===I.topFocus?(p(),c(t,n)):e===I.topBlur&&p()}function m(e,t,n){return e!==I.topSelectionChange&&e!==I.topKeyUp&&e!==I.topKeyDown||!P||P.value===w?void 0:(w=P.value,R)}function v(e){return"INPUT"===e.nodeName&&("checkbox"===e.type||"radio"===e.type)}function g(e,t,n){return e===I.topClick?n:void 0}var y=e(15),C=e(17),E=e(20),b=e(21),_=e(85),x=e(93),D=e(134),M=e(136),N=e(139),I=y.topLevelTypes,T={change:{phasedRegistrationNames:{bubbled:N({onChange:null}),captured:N({onChangeCapture:null})},dependencies:[I.topBlur,I.topChange,I.topClick,I.topFocus,I.topInput,I.topKeyDown,I.topKeyUp,I.topSelectionChange]}},P=null,R=null,w=null,O=null,S=!1;b.canUseDOM&&(S=D("change")&&(!("documentMode"in document)||document.documentMode>8));var A=!1;b.canUseDOM&&(A=D("input")&&(!("documentMode"in document)||document.documentMode>9));var k={get:function(){return O.get.call(this)},set:function(e){w=""+e,O.set.call(this,e)}},L={eventTypes:T,extractEvents:function(e,t,n,o){var i,a;if(r(t)?S?i=s:a=l:M(t)?A?i=f:(i=m,a=h):v(t)&&(i=g),i){var u=i(e,t,n);if(u){var c=x.getPooled(T.change,u,o);return E.accumulateTwoPhaseDispatches(c),c}}a&&a(e,t,n)}};t.exports=L},{134:134,136:136,139:139,15:15,17:17,20:20,21:21,85:85,93:93}],8:[function(e,t,n){"use strict";var r=0,o={createReactRootIndex:function(){return r++}};t.exports=o},{}],9:[function(e,t,n){"use strict";function r(e,t,n){e.insertBefore(t,e.childNodes[n]||null)}var o=e(12),i=e(70),a=e(145),u=e(133),s={dangerouslyReplaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup,updateTextContent:a,processUpdates:function(e,t){for(var n,s=null,l=null,c=0;ct||o.hasOverloadedBooleanValue[e]&&t===!1}var o=e(10),i=e(143),a=(e(150),{createMarkupForID:function(e){return o.ID_ATTRIBUTE_NAME+"="+i(e)},createMarkupForProperty:function(e,t){if(o.isStandardName.hasOwnProperty(e)&&o.isStandardName[e]){if(r(e,t))return"";var n=o.getAttributeName[e];return o.hasBooleanValue[e]||o.hasOverloadedBooleanValue[e]&&t===!0?n:n+"="+i(t)}return o.isCustomAttribute(e)?null==t?"":e+"="+i(t):null},setValueForProperty:function(e,t,n){if(o.isStandardName.hasOwnProperty(t)&&o.isStandardName[t]){var i=o.getMutationMethod[t];if(i)i(e,n);else if(r(t,n))this.deleteValueForProperty(e,t);else if(o.mustUseAttribute[t])e.setAttribute(o.getAttributeName[t],""+n);else{var a=o.getPropertyName[t];o.hasSideEffects[t]&&""+e[a]==""+n||(e[a]=n)}}else o.isCustomAttribute(t)&&(null==n?e.removeAttribute(t):e.setAttribute(t,""+n))},deleteValueForProperty:function(e,t){if(o.isStandardName.hasOwnProperty(t)&&o.isStandardName[t]){var n=o.getMutationMethod[t];if(n)n(e,void 0);else if(o.mustUseAttribute[t])e.removeAttribute(o.getAttributeName[t]);else{var r=o.getPropertyName[t],i=o.getDefaultValueForProperty(e.nodeName,r);o.hasSideEffects[t]&&""+e[r]===i||(e[r]=i)}}else o.isCustomAttribute(t)&&e.removeAttribute(t)}});t.exports=a},{10:10,143:143,150:150}],12:[function(e,t,n){"use strict";function r(e){return e.substring(1,e.indexOf(" "))}var o=e(21),i=e(110),a=e(112),u=e(125),s=e(133),l=/^(<[^ \/>]+)/,c="data-danger-index",p={dangerouslyRenderMarkup:function(e){s(o.canUseDOM);for(var t,n={},p=0;ps;s++){var c=u[s];if(c){var p=c.extractEvents(e,t,n,o);p&&(a=i(a,p))}}return a},enqueueEvents:function(e){e&&(l=i(l,e))},processEventQueue:function(){var e=l;l=null,a(e,c),u(!l)},__purge:function(){s={}},__getListenerBank:function(){return s}};t.exports=d},{103:103,118:118,133:133,18:18,19:19}],18:[function(e,t,n){"use strict";function r(){if(u)for(var e in s){var t=s[e],n=u.indexOf(e);if(a(n>-1),!l.plugins[n]){a(t.extractEvents),l.plugins[n]=t;var r=t.eventTypes;for(var i in r)a(o(r[i],t,i))}}}function o(e,t,n){a(!l.eventNameDispatchConfigs.hasOwnProperty(n)),l.eventNameDispatchConfigs[n]=e;var r=e.phasedRegistrationNames;if(r){for(var o in r)if(r.hasOwnProperty(o)){var u=r[o];i(u,t,n)}return!0}return e.registrationName?(i(e.registrationName,t,n),!0):!1}function i(e,t,n){a(!l.registrationNameModules[e]),l.registrationNameModules[e]=t,l.registrationNameDependencies[e]=t.eventTypes[n].dependencies}var a=e(133),u=null,s={},l={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},injectEventPluginOrder:function(e){a(!u),u=Array.prototype.slice.call(e),r()},injectEventPluginsByName:function(e){var t=!1;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];s.hasOwnProperty(n)&&s[n]===o||(a(!s[n]),s[n]=o,t=!0)}t&&r()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return l.registrationNameModules[t.registrationName]||null;for(var n in t.phasedRegistrationNames)if(t.phasedRegistrationNames.hasOwnProperty(n)){var r=l.registrationNameModules[t.phasedRegistrationNames[n]];if(r)return r}return null},_resetEventPlugins:function(){u=null;for(var e in s)s.hasOwnProperty(e)&&delete s[e];l.plugins.length=0;var t=l.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=l.registrationNameModules;for(var o in r)r.hasOwnProperty(o)&&delete r[o]}};t.exports=l},{133:133}],19:[function(e,t,n){"use strict";function r(e){return e===v.topMouseUp||e===v.topTouchEnd||e===v.topTouchCancel}function o(e){return e===v.topMouseMove||e===v.topTouchMove}function i(e){return e===v.topMouseDown||e===v.topTouchStart}function a(e,t){var n=e._dispatchListeners,r=e._dispatchIDs;if(Array.isArray(n))for(var o=0;oe&&n[e]===o[e];e++);var a=r-e;for(t=1;a>=t&&n[r-t]===o[i-t];t++);var u=t>1?1-t:void 0;return this._fallbackText=o.slice(e,u),this._fallbackText}}),o.addPoolingTo(r),t.exports=r},{128:128,27:27,28:28}],23:[function(e,t,n){"use strict";var r,o=e(10),i=e(21),a=o.injection.MUST_USE_ATTRIBUTE,u=o.injection.MUST_USE_PROPERTY,s=o.injection.HAS_BOOLEAN_VALUE,l=o.injection.HAS_SIDE_EFFECTS,c=o.injection.HAS_NUMERIC_VALUE,p=o.injection.HAS_POSITIVE_NUMERIC_VALUE,d=o.injection.HAS_OVERLOADED_BOOLEAN_VALUE;if(i.canUseDOM){var f=document.implementation;r=f&&f.hasFeature&&f.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")}var h={isCustomAttribute:RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/),Properties:{accept:null,acceptCharset:null,accessKey:null,action:null,allowFullScreen:a|s,allowTransparency:a,alt:null,async:s,autoComplete:null,autoPlay:s,cellPadding:null,cellSpacing:null,charSet:a,checked:u|s,classID:a,className:r?a:u,cols:a|p,colSpan:null,content:null,contentEditable:null,contextMenu:a,controls:u|s,coords:null,crossOrigin:null,data:null,dateTime:a,defer:s,dir:null,disabled:a|s,download:d,draggable:null,encType:null,form:a,formAction:a,formEncType:a,formMethod:a,formNoValidate:s,formTarget:a,frameBorder:a,headers:null,height:a,hidden:a|s,high:null,href:null,hrefLang:null,htmlFor:null,httpEquiv:null,icon:null,id:u,label:null,lang:null,list:a,loop:u|s,low:null,manifest:a,marginHeight:null,marginWidth:null,max:null,maxLength:a,media:a,mediaGroup:null,method:null,min:null,multiple:u|s,muted:u|s,name:null,noValidate:s,open:s,optimum:null,pattern:null,placeholder:null,poster:null,preload:null,radioGroup:null,readOnly:u|s,rel:null,required:s,role:a,rows:a|p,rowSpan:null,sandbox:null,scope:null,scoped:s,scrolling:null,seamless:a|s,selected:u|s,shape:null,size:a|p,sizes:a,span:p,spellCheck:null,src:null,srcDoc:u,srcSet:a,start:c,step:null,style:null,tabIndex:null,target:null,title:null,type:null,useMap:null,value:u|l,width:a,wmode:a,autoCapitalize:null,autoCorrect:null,itemProp:a,itemScope:a|s,itemType:a,itemID:a,itemRef:a,property:null,unselectable:a},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMPropertyNames:{autoCapitalize:"autocapitalize",autoComplete:"autocomplete",autoCorrect:"autocorrect",autoFocus:"autofocus",autoPlay:"autoplay",encType:"encoding",hrefLang:"hreflang",radioGroup:"radiogroup",spellCheck:"spellcheck",srcDoc:"srcdoc",srcSet:"srcset"}};t.exports=h},{10:10,21:21}],24:[function(e,t,n){"use strict";function r(e){l(null==e.props.checkedLink||null==e.props.valueLink)}function o(e){r(e),l(null==e.props.value&&null==e.props.onChange)}function i(e){r(e),l(null==e.props.checked&&null==e.props.onChange)}function a(e){this.props.valueLink.requestChange(e.target.value)}function u(e){this.props.checkedLink.requestChange(e.target.checked)}var s=e(76),l=e(133),c={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},p={Mixin:{propTypes:{value:function(e,t,n){return!e[t]||c[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},checked:function(e,t,n){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")},onChange:s.func}},getValue:function(e){return e.props.valueLink?(o(e),e.props.valueLink.value):e.props.value},getChecked:function(e){return e.props.checkedLink?(i(e),e.props.checkedLink.value):e.props.checked},getOnChange:function(e){return e.props.valueLink?(o(e),a):e.props.checkedLink?(i(e),u):e.props.onChange}};t.exports=p},{133:133,76:76}],25:[function(e,t,n){"use strict";function r(e){e.remove()}var o=e(30),i=e(103),a=e(118),u=e(133),s={trapBubbledEvent:function(e,t){u(this.isMounted());var n=this.getDOMNode();u(n);var r=o.trapBubbledEvent(e,t,n);this._localEventListeners=i(this._localEventListeners,r)},componentWillUnmount:function(){this._localEventListeners&&a(this._localEventListeners,r)}};t.exports=s},{103:103,118:118,133:133,30:30}],26:[function(e,t,n){"use strict";var r=e(15),o=e(112),i=r.topLevelTypes,a={eventTypes:null,extractEvents:function(e,t,n,r){if(e===i.topTouchStart){var a=r.target;a&&!a.onclick&&(a.onclick=o)}}};t.exports=a},{112:112,15:15}],27:[function(e,t,n){"use strict";function r(e,t){if(null==e)throw new TypeError("Object.assign target cannot be null or undefined");for(var n=Object(e),r=Object.prototype.hasOwnProperty,o=1;ol;l++){var d=u[l];i.hasOwnProperty(d)&&i[d]||(d===s.topWheel?c("wheel")?v.ReactEventListener.trapBubbledEvent(s.topWheel,"wheel",n):c("mousewheel")?v.ReactEventListener.trapBubbledEvent(s.topWheel,"mousewheel",n):v.ReactEventListener.trapBubbledEvent(s.topWheel,"DOMMouseScroll",n):d===s.topScroll?c("scroll",!0)?v.ReactEventListener.trapCapturedEvent(s.topScroll,"scroll",n):v.ReactEventListener.trapBubbledEvent(s.topScroll,"scroll",v.ReactEventListener.WINDOW_HANDLE):d===s.topFocus||d===s.topBlur?(c("focus",!0)?(v.ReactEventListener.trapCapturedEvent(s.topFocus,"focus",n),v.ReactEventListener.trapCapturedEvent(s.topBlur,"blur",n)):c("focusin")&&(v.ReactEventListener.trapBubbledEvent(s.topFocus,"focusin",n),v.ReactEventListener.trapBubbledEvent(s.topBlur,"focusout",n)),i[s.topBlur]=!0,i[s.topFocus]=!0):h.hasOwnProperty(d)&&v.ReactEventListener.trapBubbledEvent(d,h[d],n),i[d]=!0)}},trapBubbledEvent:function(e,t,n){ 13 | return v.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return v.ReactEventListener.trapCapturedEvent(e,t,n)},ensureScrollValueMonitoring:function(){if(!d){var e=s.refreshScrollValues;v.ReactEventListener.monitorScrollValue(e),d=!0}},eventNameDispatchConfigs:i.eventNameDispatchConfigs,registrationNameModules:i.registrationNameModules,putListener:i.putListener,getListener:i.getListener,deleteListener:i.deleteListener,deleteAllListeners:i.deleteAllListeners});t.exports=v},{102:102,134:134,15:15,17:17,18:18,27:27,59:59}],31:[function(e,t,n){"use strict";var r=e(79),o=e(116),i=e(132),a=e(147),u={instantiateChildren:function(e,t,n){var r=o(e);for(var a in r)if(r.hasOwnProperty(a)){var u=r[a],s=i(u,null);r[a]=s}return r},updateChildren:function(e,t,n,u){var s=o(t);if(!s&&!e)return null;var l;for(l in s)if(s.hasOwnProperty(l)){var c=e&&e[l],p=c&&c._currentElement,d=s[l];if(a(p,d))r.receiveComponent(c,d,n,u),s[l]=c;else{c&&r.unmountComponent(c,l);var f=i(d,null);s[l]=f}}for(l in e)!e.hasOwnProperty(l)||s&&s.hasOwnProperty(l)||r.unmountComponent(e[l]);return s},unmountChildren:function(e){for(var t in e){var n=e[t];r.unmountComponent(n)}}};t.exports=u},{116:116,132:132,147:147,79:79}],32:[function(e,t,n){"use strict";function r(e,t){this.forEachFunction=e,this.forEachContext=t}function o(e,t,n,r){var o=e;o.forEachFunction.call(o.forEachContext,t,r)}function i(e,t,n){if(null==e)return e;var i=r.getPooled(t,n);f(e,o,i),r.release(i)}function a(e,t,n){this.mapResult=e,this.mapFunction=t,this.mapContext=n}function u(e,t,n,r){var o=e,i=o.mapResult,a=!i.hasOwnProperty(n);if(a){var u=o.mapFunction.call(o.mapContext,t,r);i[n]=u}}function s(e,t,n){if(null==e)return e;var r={},o=a.getPooled(r,t,n);return f(e,u,o),a.release(o),d.create(r)}function l(e,t,n,r){return null}function c(e,t){return f(e,l,null)}var p=e(28),d=e(61),f=e(149),h=(e(150),p.twoArgumentPooler),m=p.threeArgumentPooler;p.addPoolingTo(r,h),p.addPoolingTo(a,m);var v={forEach:i,map:s,count:c};t.exports=v},{149:149,150:150,28:28,61:61}],33:[function(e,t,n){"use strict";function r(e,t){var n=D.hasOwnProperty(t)?D[t]:null;N.hasOwnProperty(t)&&y(n===_.OVERRIDE_BASE),e.hasOwnProperty(t)&&y(n===_.DEFINE_MANY||n===_.DEFINE_MANY_MERGED)}function o(e,t){if(t){y("function"!=typeof t),y(!d.isValidElement(t));var n=e.prototype;t.hasOwnProperty(b)&&M.mixins(e,t.mixins);for(var o in t)if(t.hasOwnProperty(o)&&o!==b){var i=t[o];if(r(n,o),M.hasOwnProperty(o))M[o](e,i);else{var a=D.hasOwnProperty(o),l=n.hasOwnProperty(o),c=i&&i.__reactDontBind,p="function"==typeof i,f=p&&!a&&!l&&!c;if(f)n.__reactAutoBindMap||(n.__reactAutoBindMap={}),n.__reactAutoBindMap[o]=i,n[o]=i;else if(l){var h=D[o];y(a&&(h===_.DEFINE_MANY_MERGED||h===_.DEFINE_MANY)),h===_.DEFINE_MANY_MERGED?n[o]=u(n[o],i):h===_.DEFINE_MANY&&(n[o]=s(n[o],i))}else n[o]=i}}}}function i(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var o=n in M;y(!o);var i=n in e;y(!i),e[n]=r}}}function a(e,t){y(e&&t&&"object"==typeof e&&"object"==typeof t);for(var n in t)t.hasOwnProperty(n)&&(y(void 0===e[n]),e[n]=t[n]);return e}function u(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return a(o,n),a(o,r),o}}function s(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function l(e,t){var n=t.bind(e);return n}function c(e){for(var t in e.__reactAutoBindMap)if(e.__reactAutoBindMap.hasOwnProperty(t)){var n=e.__reactAutoBindMap[t];e[t]=l(e,f.guard(n,e.constructor.displayName+"."+t))}}var p=e(34),d=(e(39),e(55)),f=e(58),h=e(65),m=e(66),v=(e(75),e(74),e(84)),g=e(27),y=e(133),C=e(138),E=e(139),b=(e(150),E({mixins:null})),_=C({DEFINE_ONCE:null,DEFINE_MANY:null,OVERRIDE_BASE:null,DEFINE_MANY_MERGED:null}),x=[],D={mixins:_.DEFINE_MANY,statics:_.DEFINE_MANY,propTypes:_.DEFINE_MANY,contextTypes:_.DEFINE_MANY,childContextTypes:_.DEFINE_MANY,getDefaultProps:_.DEFINE_MANY_MERGED,getInitialState:_.DEFINE_MANY_MERGED,getChildContext:_.DEFINE_MANY_MERGED,render:_.DEFINE_ONCE,componentWillMount:_.DEFINE_MANY,componentDidMount:_.DEFINE_MANY,componentWillReceiveProps:_.DEFINE_MANY,shouldComponentUpdate:_.DEFINE_ONCE,componentWillUpdate:_.DEFINE_MANY,componentDidUpdate:_.DEFINE_MANY,componentWillUnmount:_.DEFINE_MANY,updateComponent:_.OVERRIDE_BASE},M={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n";return this._createOpenTagMarkupAndPutListeners(t)+this._createContentMarkup(t,n)+o},_createOpenTagMarkupAndPutListeners:function(e){var t=this._currentElement.props,n="<"+this._tag;for(var r in t)if(t.hasOwnProperty(r)){var i=t[r];if(null!=i)if(b.hasOwnProperty(r))o(this._rootNodeID,r,i,e);else{r===x&&(i&&(i=this._previousStyleCopy=m({},t.style)),i=u.createMarkupForStyles(i));var a=l.createMarkupForProperty(r,i);a&&(n+=" "+a)}}if(e.renderToStaticMarkup)return n+">";var s=l.createMarkupForID(this._rootNodeID);return n+" "+s+">"},_createContentMarkup:function(e,t){var n="";("listing"===this._tag||"pre"===this._tag||"textarea"===this._tag)&&(n="\n");var r=this._currentElement.props,o=r.dangerouslySetInnerHTML;if(null!=o){if(null!=o.__html)return n+o.__html}else{var i=_[typeof r.children]?r.children:null,a=null!=i?null:r.children;if(null!=i)return n+v(i);if(null!=a){var u=this.mountChildren(a,e,t);return n+u.join("")}}return n},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,n,o){r(this._currentElement.props),this._updateDOMProperties(t.props,e),this._updateDOMChildren(t.props,e,o)},_updateDOMProperties:function(e,t){var n,r,i,a=this._currentElement.props;for(n in e)if(!a.hasOwnProperty(n)&&e.hasOwnProperty(n))if(n===x){var u=this._previousStyleCopy;for(r in u)u.hasOwnProperty(r)&&(i=i||{},i[r]="");this._previousStyleCopy=null}else b.hasOwnProperty(n)?C(this._rootNodeID,n):(s.isStandardName[n]||s.isCustomAttribute(n))&&M.deletePropertyByID(this._rootNodeID,n);for(n in a){var l=a[n],c=n===x?this._previousStyleCopy:e[n];if(a.hasOwnProperty(n)&&l!==c)if(n===x)if(l?l=this._previousStyleCopy=m({},l):this._previousStyleCopy=null,c){for(r in c)!c.hasOwnProperty(r)||l&&l.hasOwnProperty(r)||(i=i||{},i[r]="");for(r in l)l.hasOwnProperty(r)&&c[r]!==l[r]&&(i=i||{},i[r]=l[r])}else i=l;else b.hasOwnProperty(n)?o(this._rootNodeID,n,l,t):(s.isStandardName[n]||s.isCustomAttribute(n))&&M.updatePropertyByID(this._rootNodeID,n,l)}i&&M.updateStylesByID(this._rootNodeID,i)},_updateDOMChildren:function(e,t,n){var r=this._currentElement.props,o=_[typeof e.children]?e.children:null,i=_[typeof r.children]?r.children:null,a=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,u=r.dangerouslySetInnerHTML&&r.dangerouslySetInnerHTML.__html,s=null!=o?null:e.children,l=null!=i?null:r.children,c=null!=o||null!=a,p=null!=i||null!=u;null!=s&&null==l?this.updateChildren(null,t,n):c&&!p&&this.updateTextContent(""),null!=i?o!==i&&this.updateTextContent(""+i):null!=u?a!==u&&M.updateInnerHTMLByID(this._rootNodeID,u):null!=l&&this.updateChildren(l,t,n)},unmountComponent:function(){this.unmountChildren(),c.deleteAllListeners(this._rootNodeID),p.unmountIDFromEnvironment(this._rootNodeID),this._rootNodeID=null}},h.measureMethods(a,"ReactDOMComponent",{mountComponent:"mountComponent",updateComponent:"updateComponent"}),m(a.prototype,a.Mixin,f.Mixin),a.injection={injectIDOperations:function(e){a.BackendIDOperations=M=e}},t.exports=a},{10:10,11:11,114:114,133:133,134:134,139:139,150:150,27:27,30:30,35:35,5:5,68:68,69:69,73:73}],43:[function(e,t,n){"use strict";var r=e(15),o=e(25),i=e(29),a=e(33),u=e(55),s=u.createFactory("form"),l=a.createClass({displayName:"ReactDOMForm",tagName:"FORM",mixins:[i,o],render:function(){return s(this.props)},componentDidMount:function(){this.trapBubbledEvent(r.topLevelTypes.topReset,"reset"),this.trapBubbledEvent(r.topLevelTypes.topSubmit,"submit")}});t.exports=l},{15:15,25:25,29:29,33:33,55:55}],44:[function(e,t,n){"use strict";var r=e(5),o=e(9),i=e(11),a=e(68),u=e(73),s=e(133),l=e(144),c={dangerouslySetInnerHTML:"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.",style:"`style` must be set using `updateStylesByID()`."},p={updatePropertyByID:function(e,t,n){var r=a.getNode(e);s(!c.hasOwnProperty(t)),null!=n?i.setValueForProperty(r,t,n):i.deleteValueForProperty(r,t)},deletePropertyByID:function(e,t,n){var r=a.getNode(e);s(!c.hasOwnProperty(t)),i.deleteValueForProperty(r,t,n)},updateStylesByID:function(e,t){var n=a.getNode(e);r.setValueForStyles(n,t)},updateInnerHTMLByID:function(e,t){var n=a.getNode(e);l(n,t)},updateTextContentByID:function(e,t){var n=a.getNode(e);o.updateTextContent(n,t)},dangerouslyReplaceNodeWithMarkupByID:function(e,t){var n=a.getNode(e);o.dangerouslyReplaceNodeWithMarkup(n,t)},dangerouslyProcessChildrenUpdates:function(e,t){for(var n=0;nl;l++){var h=s[l];if(h!==i&&h.form===i.form){var v=c.getID(h);f(v);var g=m[v];f(g),p.asap(r,g)}}}return t}});t.exports=v},{11:11,133:133,2:2,24:24,27:27,29:29,33:33,55:55,68:68,85:85}],48:[function(e,t,n){"use strict";var r=e(29),o=e(33),i=e(55),a=(e(150),i.createFactory("option")),u=o.createClass({displayName:"ReactDOMOption",tagName:"OPTION",mixins:[r],componentWillMount:function(){},render:function(){return a(this.props,this.props.children)}});t.exports=u},{150:150,29:29,33:33,55:55}],49:[function(e,t,n){"use strict";function r(){if(this._pendingUpdate){this._pendingUpdate=!1;var e=u.getValue(this);null!=e&&this.isMounted()&&i(this,e)}}function o(e,t,n){if(null==e[t])return null;if(e.multiple){if(!Array.isArray(e[t]))return new Error("The `"+t+"` prop supplied to must be a scalar value if `multiple` is false.")}function i(e,t){var n,r,o,i=e.getDOMNode().options;if(e.props.multiple){for(n={},r=0,o=t.length;o>r;r++)n[""+t[r]]=!0;for(r=0,o=i.length;o>r;r++){var a=n.hasOwnProperty(i[r].value);i[r].selected!==a&&(i[r].selected=a)}}else{for(n=""+t,r=0,o=i.length;o>r;r++)if(i[r].value===n)return void(i[r].selected=!0);i.length&&(i[0].selected=!0)}}var a=e(2),u=e(24),s=e(29),l=e(33),c=e(55),p=e(85),d=e(27),f=c.createFactory("select"),h=l.createClass({displayName:"ReactDOMSelect",tagName:"SELECT",mixins:[a,u.Mixin,s],propTypes:{defaultValue:o,value:o},render:function(){var e=d({},this.props);return e.onChange=this._handleChange,e.value=null,f(e,this.props.children)},componentWillMount:function(){this._pendingUpdate=!1},componentDidMount:function(){var e=u.getValue(this);null!=e?i(this,e):null!=this.props.defaultValue&&i(this,this.props.defaultValue)},componentDidUpdate:function(e){var t=u.getValue(this);null!=t?(this._pendingUpdate=!1,i(this,t)):!e.multiple!=!this.props.multiple&&(null!=this.props.defaultValue?i(this,this.props.defaultValue):i(this,this.props.multiple?[]:""))},_handleChange:function(e){var t,n=u.getOnChange(this);return n&&(t=n.call(this,e)),this._pendingUpdate=!0,p.asap(r,this),t}});t.exports=h},{2:2,24:24,27:27,29:29,33:33,55:55,85:85}],50:[function(e,t,n){"use strict";function r(e,t,n,r){return e===n&&t===r}function o(e){var t=document.selection,n=t.createRange(),r=n.text.length,o=n.duplicate();o.moveToElementText(e),o.setEndPoint("EndToStart",n);var i=o.text.length,a=i+r;return{start:i,end:a}}function i(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,o=t.anchorOffset,i=t.focusNode,a=t.focusOffset,u=t.getRangeAt(0),s=r(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),l=s?0:u.toString().length,c=u.cloneRange();c.selectNodeContents(e),c.setEnd(u.startContainer,u.startOffset);var p=r(c.startContainer,c.startOffset,c.endContainer,c.endOffset),d=p?0:c.toString().length,f=d+l,h=document.createRange();h.setStart(n,o),h.setEnd(i,a);var m=h.collapsed;return{start:m?f:d,end:m?d:f}}function a(e,t){var n,r,o=document.selection.createRange().duplicate();"undefined"==typeof t.end?(n=t.start,r=n):t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart("character",n),o.setEndPoint("EndToStart",o),o.moveEnd("character",r-n),o.select()}function u(e,t){if(window.getSelection){var n=window.getSelection(),r=e[c()].length,o=Math.min(t.start,r),i="undefined"==typeof t.end?o:Math.min(t.end,r);if(!n.extend&&o>i){var a=i;i=o,o=a}var u=l(e,o),s=l(e,i);if(u&&s){var p=document.createRange();p.setStart(u.node,u.offset),n.removeAllRanges(),o>i?(n.addRange(p),n.extend(s.node,s.offset)):(p.setEnd(s.node,s.offset),n.addRange(p))}}}var s=e(21),l=e(126),c=e(128),p=s.canUseDOM&&"selection"in document&&!("getSelection"in window),d={getOffsets:p?o:i,setOffsets:p?a:u};t.exports=d},{126:126,128:128,21:21}],51:[function(e,t,n){"use strict";var r=e(11),o=e(35),i=e(42),a=e(27),u=e(114),s=function(e){};a(s.prototype,{construct:function(e){this._currentElement=e,this._stringText=""+e,this._rootNodeID=null,this._mountIndex=0},mountComponent:function(e,t,n){this._rootNodeID=e;var o=u(this._stringText);return t.renderToStaticMarkup?o:""+o+""},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=""+e;n!==this._stringText&&(this._stringText=n,i.BackendIDOperations.updateTextContentByID(this._rootNodeID,n))}},unmountComponent:function(){o.unmountIDFromEnvironment(this._rootNodeID)}}),t.exports=s},{11:11,114:114,27:27,35:35,42:42}],52:[function(e,t,n){"use strict";function r(){this.isMounted()&&this.forceUpdate()}var o=e(2),i=e(11),a=e(24),u=e(29),s=e(33),l=e(55),c=e(85),p=e(27),d=e(133),f=(e(150),l.createFactory("textarea")),h=s.createClass({displayName:"ReactDOMTextarea",tagName:"TEXTAREA",mixins:[o,a.Mixin,u],getInitialState:function(){var e=this.props.defaultValue,t=this.props.children;null!=t&&(d(null==e),Array.isArray(t)&&(d(t.length<=1),t=t[0]),e=""+t),null==e&&(e="");var n=a.getValue(this);return{initialValue:""+(null!=n?n:e)}},render:function(){var e=p({},this.props);return d(null==e.dangerouslySetInnerHTML),e.defaultValue=null,e.value=null,e.onChange=this._handleChange,f(e,this.state.initialValue)},componentDidUpdate:function(e,t,n){var r=a.getValue(this);if(null!=r){var o=this.getDOMNode();i.setValueForProperty(o,"value",""+r)}},_handleChange:function(e){var t,n=a.getOnChange(this);return n&&(t=n.call(this,e)),c.asap(r,this),t}});t.exports=h},{11:11,133:133,150:150,2:2,24:24,27:27,29:29,33:33,55:55,85:85}],53:[function(e,t,n){"use strict";function r(){this.reinitializeTransaction()}var o=e(85),i=e(101),a=e(27),u=e(112),s={initialize:u,close:function(){d.isBatchingUpdates=!1}},l={initialize:u,close:o.flushBatchedUpdates.bind(o)},c=[l,s];a(r.prototype,i.Mixin,{getTransactionWrappers:function(){return c}});var p=new r,d={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,o){var i=d.isBatchingUpdates;d.isBatchingUpdates=!0,i?e(t,n,r,o):p.perform(e,null,t,n,r,o)}};t.exports=d},{101:101,112:112,27:27,85:85}],54:[function(e,t,n){"use strict";function r(e){return h.createClass({tagName:e.toUpperCase(),render:function(){return new T(e,null,null,null,null,this.props)}})}function o(){R.EventEmitter.injectReactEventListener(P),R.EventPluginHub.injectEventPluginOrder(s),R.EventPluginHub.injectInstanceHandle(w),R.EventPluginHub.injectMount(O),R.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:L,EnterLeaveEventPlugin:l,ChangeEventPlugin:a,MobileSafariClickEventPlugin:d,SelectEventPlugin:A,BeforeInputEventPlugin:i}),R.NativeComponent.injectGenericComponentClass(g),R.NativeComponent.injectTextComponentClass(I),R.NativeComponent.injectAutoWrapper(r),R.Class.injectMixin(f),R.NativeComponent.injectComponentClasses({button:y,form:C,iframe:_,img:E,input:x,option:D,select:M,textarea:N,html:F("html"),head:F("head"),body:F("body")}),R.DOMProperty.injectDOMPropertyConfig(p),R.DOMProperty.injectDOMPropertyConfig(U),R.EmptyComponent.injectEmptyComponent("noscript"),R.Updates.injectReconcileTransaction(S),R.Updates.injectBatchingStrategy(v),R.RootIndex.injectCreateReactRootIndex(c.canUseDOM?u.createReactRootIndex:k.createReactRootIndex),R.Component.injectEnvironment(m),R.DOMComponent.injectIDOperations(b)}var i=e(3),a=e(7),u=e(8),s=e(13),l=e(14),c=e(21),p=e(23),d=e(26),f=e(29),h=e(33),m=e(35),v=e(53),g=e(42),y=e(41),C=e(43),E=e(46),b=e(44),_=e(45),x=e(47),D=e(48),M=e(49),N=e(52),I=e(51),T=e(55),P=e(60),R=e(62),w=e(64),O=e(68),S=e(78),A=e(87),k=e(88),L=e(89),U=e(86),F=e(109); 14 | 15 | t.exports={inject:o}},{109:109,13:13,14:14,21:21,23:23,26:26,29:29,3:3,33:33,35:35,41:41,42:42,43:43,44:44,45:45,46:46,47:47,48:48,49:49,51:51,52:52,53:53,55:55,60:60,62:62,64:64,68:68,7:7,78:78,8:8,86:86,87:87,88:88,89:89}],55:[function(e,t,n){"use strict";var r=e(38),o=e(39),i=e(27),a=(e(150),{key:!0,ref:!0}),u=function(e,t,n,r,o,i){this.type=e,this.key=t,this.ref=n,this._owner=r,this._context=o,this.props=i};u.prototype={_isReactElement:!0},u.createElement=function(e,t,n){var i,s={},l=null,c=null;if(null!=t){c=void 0===t.ref?null:t.ref,l=void 0===t.key?null:""+t.key;for(i in t)t.hasOwnProperty(i)&&!a.hasOwnProperty(i)&&(s[i]=t[i])}var p=arguments.length-2;if(1===p)s.children=n;else if(p>1){for(var d=Array(p),f=0;p>f;f++)d[f]=arguments[f+2];s.children=d}if(e&&e.defaultProps){var h=e.defaultProps;for(i in h)"undefined"==typeof s[i]&&(s[i]=h[i])}return new u(e,l,c,o.current,r.current,s)},u.createFactory=function(e){var t=u.createElement.bind(null,e);return t.type=e,t},u.cloneAndReplaceProps=function(e,t){var n=new u(e.type,e.key,e.ref,e._owner,e._context,t);return n},u.cloneElement=function(e,t,n){var r,s=i({},e.props),l=e.key,c=e.ref,p=e._owner;if(null!=t){void 0!==t.ref&&(c=t.ref,p=o.current),void 0!==t.key&&(l=""+t.key);for(r in t)t.hasOwnProperty(r)&&!a.hasOwnProperty(r)&&(s[r]=t[r])}var d=arguments.length-2;if(1===d)s.children=n;else if(d>1){for(var f=Array(d),h=0;d>h;h++)f[h]=arguments[h+2];s.children=f}return new u(e.type,l,c,p,e._context,s)},u.isValidElement=function(e){var t=!(!e||!e._isReactElement);return t},t.exports=u},{150:150,27:27,38:38,39:39}],56:[function(e,t,n){"use strict";function r(){if(y.current){var e=y.current.getName();if(e)return" Check the render method of `"+e+"`."}return""}function o(e){var t=e&&e.getPublicInstance();if(!t)return void 0;var n=t.constructor;return n?n.displayName||n.name||void 0:void 0}function i(){var e=y.current;return e&&o(e)||void 0}function a(e,t){e._store.validated||null!=e.key||(e._store.validated=!0,s('Each child in an array or iterator should have a unique "key" prop.',e,t))}function u(e,t,n){D.test(e)&&s("Child objects should have non-numeric keys so ordering is preserved.",t,n)}function s(e,t,n){var r=i(),a="string"==typeof n?n:n.displayName||n.name,u=r||a,s=_[e]||(_[e]={});if(!s.hasOwnProperty(u)){s[u]=!0;var l="";if(t&&t._owner&&t._owner!==y.current){var c=o(t._owner);l=" It was passed a child from "+c+"."}}}function l(e,t){if(Array.isArray(e))for(var n=0;n");var u="";o&&(u=" The element was created by "+o+".")}}function d(e,t){return e!==e?t!==t:0===e&&0===t?1/e===1/t:e===t}function f(e){if(e._store){var t=e._store.originalProps,n=e.props;for(var r in n)n.hasOwnProperty(r)&&(t.hasOwnProperty(r)&&d(t[r],n[r])||(p(r,e),t[r]=n[r]))}}function h(e){if(null!=e.type){var t=C.getComponentClassForElement(e),n=t.displayName||t.name;t.propTypes&&c(n,t.propTypes,e.props,g.prop),"function"==typeof t.getDefaultProps}}var m=e(55),v=e(61),g=e(75),y=(e(74),e(39)),C=e(71),E=e(124),b=e(133),_=(e(150),{}),x={},D=/^\d+$/,M={},N={checkAndWarnForMutatedProps:f,createElement:function(e,t,n){var r=m.createElement.apply(this,arguments);if(null==r)return r;for(var o=2;oo;o++){t=e.ancestors[o];var a=p.getID(t)||"";v._handleTopLevel(e.topLevelType,t,a,e.nativeEvent)}}function a(e){var t=m(window);e(t)}var u=e(16),s=e(21),l=e(28),c=e(64),p=e(68),d=e(85),f=e(27),h=e(123),m=e(129);f(o.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),l.addPoolingTo(o,l.twoArgumentPooler);var v={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:s.canUseDOM?window:null,setHandleTopLevel:function(e){v._handleTopLevel=e},setEnabled:function(e){v._enabled=!!e},isEnabled:function(){return v._enabled},trapBubbledEvent:function(e,t,n){var r=n;return r?u.listen(r,t,v.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){var r=n;return r?u.capture(r,t,v.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=a.bind(null,e);u.listen(window,"scroll",t)},dispatchEvent:function(e,t){if(v._enabled){var n=o.getPooled(e,t);try{d.batchedUpdates(i,n)}finally{o.release(n)}}}};t.exports=v},{123:123,129:129,16:16,21:21,27:27,28:28,64:64,68:68,85:85}],61:[function(e,t,n){"use strict";var r=(e(55),e(150),{create:function(e){return e},extract:function(e){return e},extractIfFragment:function(e){return e}});t.exports=r},{150:150,55:55}],62:[function(e,t,n){"use strict";var r=e(10),o=e(17),i=e(36),a=e(33),u=e(57),s=e(30),l=e(71),c=e(42),p=e(73),d=e(81),f=e(85),h={Component:i.injection,Class:a.injection,DOMComponent:c.injection,DOMProperty:r.injection,EmptyComponent:u.injection,EventPluginHub:o.injection,EventEmitter:s.injection,NativeComponent:l.injection,Perf:p.injection,RootIndex:d.injection,Updates:f.injection};t.exports=h},{10:10,17:17,30:30,33:33,36:36,42:42,57:57,71:71,73:73,81:81,85:85}],63:[function(e,t,n){"use strict";function r(e){return i(document.documentElement,e)}var o=e(50),i=e(107),a=e(117),u=e(119),s={hasSelectionCapabilities:function(e){return e&&("INPUT"===e.nodeName&&"text"===e.type||"TEXTAREA"===e.nodeName||"true"===e.contentEditable)},getSelectionInformation:function(){var e=u();return{focusedElem:e,selectionRange:s.hasSelectionCapabilities(e)?s.getSelection(e):null}},restoreSelection:function(e){var t=u(),n=e.focusedElem,o=e.selectionRange;t!==n&&r(n)&&(s.hasSelectionCapabilities(n)&&s.setSelection(n,o),a(n))},getSelection:function(e){var t;if("selectionStart"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&"INPUT"===e.nodeName){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart("character",-e.value.length),end:-n.moveEnd("character",-e.value.length)})}else t=o.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,r=t.end;if("undefined"==typeof r&&(r=n),"selectionStart"in e)e.selectionStart=n,e.selectionEnd=Math.min(r,e.value.length);else if(document.selection&&"INPUT"===e.nodeName){var i=e.createTextRange();i.collapse(!0),i.moveStart("character",n),i.moveEnd("character",r-n),i.select()}else o.setOffsets(e,t)}};t.exports=s},{107:107,117:117,119:119,50:50}],64:[function(e,t,n){"use strict";function r(e){return f+e.toString(36)}function o(e,t){return e.charAt(t)===f||t===e.length}function i(e){return""===e||e.charAt(0)===f&&e.charAt(e.length-1)!==f}function a(e,t){return 0===t.indexOf(e)&&o(t,e.length)}function u(e){return e?e.substr(0,e.lastIndexOf(f)):""}function s(e,t){if(d(i(e)&&i(t)),d(a(e,t)),e===t)return e;var n,r=e.length+h;for(n=r;n=a;a++)if(o(e,a)&&o(t,a))r=a;else if(e.charAt(a)!==t.charAt(a))break;var u=e.substr(0,r);return d(i(u)),u}function c(e,t,n,r,o,i){e=e||"",t=t||"",d(e!==t);var l=a(t,e);d(l||a(e,t));for(var c=0,p=l?u:s,f=e;;f=p(f,t)){var h;if(o&&f===e||i&&f===t||(h=n(f,l,r)),h===!1||f===t)break;d(c++1){var t=e.indexOf(f,1);return t>-1?e.substr(0,t):e}return null},traverseEnterLeave:function(e,t,n,r,o){var i=l(e,t);i!==e&&c(e,i,n,r,!1,!0),i!==t&&c(i,t,n,o,!0,!1)},traverseTwoPhase:function(e,t,n){e&&(c("",e,t,n,!0,!1),c(e,"",t,n,!1,!0))},traverseAncestors:function(e,t,n){c("",e,t,n,!0,!1)},_getFirstCommonAncestorID:l,_getNextDescendantID:s,isAncestorIDOf:a,SEPARATOR:f};t.exports=v},{133:133,81:81}],65:[function(e,t,n){"use strict";var r={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalInstance=t}};t.exports=r},{}],66:[function(e,t,n){"use strict";var r={currentlyMountingInstance:null,currentlyUnmountingInstance:null};t.exports=r},{}],67:[function(e,t,n){"use strict";var r=e(104),o={CHECKSUM_ATTR_NAME:"data-react-checksum",addChecksumToMarkup:function(e){var t=r(e);return e.replace(">"," "+o.CHECKSUM_ATTR_NAME+'="'+t+'">')},canReuseMarkup:function(e,t){var n=t.getAttribute(o.CHECKSUM_ATTR_NAME);n=n&&parseInt(n,10);var i=r(e);return i===n}};t.exports=o},{104:104}],68:[function(e,t,n){"use strict";function r(e,t){for(var n=Math.min(e.length,t.length),r=0;n>r;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}function o(e){var t=P(e);return t&&K.getID(t)}function i(e){var t=a(e);if(t)if(L.hasOwnProperty(t)){var n=L[t];n!==e&&(w(!c(n,t)),L[t]=e)}else L[t]=e;return t}function a(e){return e&&e.getAttribute&&e.getAttribute(k)||""}function u(e,t){var n=a(e);n!==t&&delete L[n],e.setAttribute(k,t),L[t]=e}function s(e){return L.hasOwnProperty(e)&&c(L[e],e)||(L[e]=K.findReactNodeByID(e)),L[e]}function l(e){var t=b.get(e)._rootNodeID;return C.isNullComponentID(t)?null:(L.hasOwnProperty(t)&&c(L[t],t)||(L[t]=K.findReactNodeByID(t)),L[t])}function c(e,t){if(e){w(a(e)===t);var n=K.findReactContainerForID(t);if(n&&T(n,e))return!0}return!1}function p(e){delete L[e]}function d(e){var t=L[e];return t&&c(t,e)?void(W=t):!1}function f(e){W=null,E.traverseAncestors(e,d);var t=W;return W=null,t}function h(e,t,n,r,o){var i=D.mountComponent(e,t,r,I);e._isTopLevel=!0,K._mountImageIntoNode(i,n,o)}function m(e,t,n,r){var o=N.ReactReconcileTransaction.getPooled();o.perform(h,null,e,t,n,o,r),N.ReactReconcileTransaction.release(o)}var v=e(10),g=e(30),y=(e(39),e(55)),C=(e(56),e(57)),E=e(64),b=e(65),_=e(67),x=e(73),D=e(79),M=e(84),N=e(85),I=e(113),T=e(107),P=e(127),R=e(132),w=e(133),O=e(144),S=e(147),A=(e(150),E.SEPARATOR),k=v.ID_ATTRIBUTE_NAME,L={},U=1,F=9,B={},V={},j=[],W=null,K={_instancesByReactRootID:B,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r){return K.scrollMonitor(n,function(){M.enqueueElementInternal(e,t),r&&M.enqueueCallbackInternal(e,r)}),e},_registerComponent:function(e,t){w(t&&(t.nodeType===U||t.nodeType===F)),g.ensureScrollValueMonitoring();var n=K.registerContainer(t);return B[n]=e,n},_renderNewRootComponent:function(e,t,n){var r=R(e,null),o=K._registerComponent(r,t);return N.batchedUpdates(m,r,o,t,n),r},render:function(e,t,n){w(y.isValidElement(e));var r=B[o(t)];if(r){var i=r._currentElement;if(S(i,e))return K._updateRootComponent(r,e,t,n).getPublicInstance();K.unmountComponentAtNode(t)}var a=P(t),u=a&&K.isRenderedByReact(a),s=u&&!r,l=K._renderNewRootComponent(e,t,s).getPublicInstance();return n&&n.call(l),l},constructAndRenderComponent:function(e,t,n){var r=y.createElement(e,t);return K.render(r,n)},constructAndRenderComponentByID:function(e,t,n){var r=document.getElementById(n);return w(r),K.constructAndRenderComponent(e,t,r)},registerContainer:function(e){var t=o(e);return t&&(t=E.getReactRootIDFromNodeID(t)),t||(t=E.createReactRootID()),V[t]=e,t},unmountComponentAtNode:function(e){w(e&&(e.nodeType===U||e.nodeType===F));var t=o(e),n=B[t];return n?(K.unmountComponentFromNode(n,e),delete B[t],delete V[t],!0):!1},unmountComponentFromNode:function(e,t){for(D.unmountComponent(e),t.nodeType===F&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)},findReactContainerForID:function(e){var t=E.getReactRootIDFromNodeID(e),n=V[t];return n},findReactNodeByID:function(e){var t=K.findReactContainerForID(e);return K.findComponentRoot(t,e)},isRenderedByReact:function(e){if(1!==e.nodeType)return!1;var t=K.getID(e);return t?t.charAt(0)===A:!1},getFirstReactDOM:function(e){for(var t=e;t&&t.parentNode!==t;){if(K.isRenderedByReact(t))return t;t=t.parentNode}return null},findComponentRoot:function(e,t){var n=j,r=0,o=f(t)||e;for(n[0]=o.firstChild,n.length=1;r>",_=u(),x=d(),D={array:o("array"),bool:o("boolean"),func:o("function"),number:o("number"),object:o("object"),string:o("string"),any:i(),arrayOf:a,element:_,instanceOf:s,node:x,objectOf:c,oneOf:l,oneOfType:p,shape:f};t.exports=D},{112:112,55:55,61:61,74:74}],77:[function(e,t,n){"use strict";function r(){this.listenersToPut=[]}var o=e(28),i=e(30),a=e(27);a(r.prototype,{enqueuePutListener:function(e,t,n){this.listenersToPut.push({rootNodeID:e,propKey:t,propValue:n})},putListeners:function(){for(var e=0;en;n++){var r=g[n],o=r._pendingCallbacks;if(r._pendingCallbacks=null,f.performUpdateIfNecessary(r,e.reconcileTransaction),o)for(var i=0;i":">","<":"<",'"':""","'":"'"},a=/[&><"']/g;t.exports=o},{}],115:[function(e,t,n){"use strict";function r(e){return null==e?null:u(e)?e:o.has(e)?i.getNodeFromInstance(e):(a(null==e.render||"function"!=typeof e.render),void a(!1))}{var o=(e(39),e(65)),i=e(68),a=e(133),u=e(135);e(150)}t.exports=r},{133:133,135:135,150:150,39:39,65:65,68:68}],116:[function(e,t,n){"use strict";function r(e,t,n){var r=e,o=!r.hasOwnProperty(n);o&&null!=t&&(r[n]=t)}function o(e){if(null==e)return e;var t={};return i(e,r,t),t}{var i=e(149);e(150)}t.exports=o},{149:149,150:150}],117:[function(e,t,n){"use strict";function r(e){try{e.focus()}catch(t){}}t.exports=r},{}],118:[function(e,t,n){"use strict";var r=function(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)};t.exports=r},{}],119:[function(e,t,n){function r(){try{return document.activeElement||document.body}catch(e){return document.body}}t.exports=r},{}],120:[function(e,t,n){"use strict";function r(e){var t,n=e.keyCode;return"charCode"in e?(t=e.charCode,0===t&&13===n&&(t=13)):t=n,t>=32||13===t?t:0}t.exports=r},{}],121:[function(e,t,n){"use strict";function r(e){if(e.key){var t=i[e.key]||e.key;if("Unidentified"!==t)return t}if("keypress"===e.type){var n=o(e);return 13===n?"Enter":String.fromCharCode(n)}return"keydown"===e.type||"keyup"===e.type?a[e.keyCode]||"Unidentified":""}var o=e(120),i={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},a={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};t.exports=r},{120:120}],122:[function(e,t,n){"use strict";function r(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var r=i[e];return r?!!n[r]:!1}function o(e){return r}var i={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};t.exports=o},{}],123:[function(e,t,n){"use strict";function r(e){var t=e.target||e.srcElement||window;return 3===t.nodeType?t.parentNode:t}t.exports=r},{}],124:[function(e,t,n){"use strict";function r(e){var t=e&&(o&&e[o]||e[i]);return"function"==typeof t?t:void 0}var o="function"==typeof Symbol&&Symbol.iterator,i="@@iterator";t.exports=r},{}],125:[function(e,t,n){function r(e){return i(!!a),d.hasOwnProperty(e)||(e="*"),u.hasOwnProperty(e)||("*"===e?a.innerHTML="":a.innerHTML="<"+e+">",u[e]=!a.firstChild),u[e]?d[e]:null}var o=e(21),i=e(133),a=o.canUseDOM?document.createElement("div"):null,u={circle:!0,clipPath:!0,defs:!0,ellipse:!0,g:!0,line:!0,linearGradient:!0,path:!0,polygon:!0,polyline:!0,radialGradient:!0,rect:!0,stop:!0,text:!0},s=[1,'"],l=[1,"","
"],c=[3,"","
"],p=[1,"",""],d={"*":[1,"?
","
"],area:[1,"",""],col:[2,"","
"],legend:[1,"
","
"],param:[1,"",""],tr:[2,"","
"],optgroup:s,option:s,caption:l,colgroup:l,tbody:l,tfoot:l,thead:l,td:c,th:c,circle:p,clipPath:p,defs:p,ellipse:p,g:p,line:p,linearGradient:p,path:p,polygon:p,polyline:p,radialGradient:p,rect:p,stop:p,text:p};t.exports=r},{133:133,21:21}],126:[function(e,t,n){"use strict";function r(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function o(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function i(e,t){for(var n=r(e),i=0,a=0;n;){if(3===n.nodeType){if(a=i+n.textContent.length,t>=i&&a>=t)return{node:n,offset:t-i};i=a}n=r(o(n))}}t.exports=i},{}],127:[function(e,t,n){"use strict";function r(e){return e?e.nodeType===o?e.documentElement:e.firstChild:null}var o=9;t.exports=r},{}],128:[function(e,t,n){"use strict";function r(){return!i&&o.canUseDOM&&(i="textContent"in document.documentElement?"textContent":"innerText"),i}var o=e(21),i=null;t.exports=r},{21:21}],129:[function(e,t,n){"use strict";function r(e){return e===window?{x:window.pageXOffset||document.documentElement.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}t.exports=r},{}],130:[function(e,t,n){function r(e){return e.replace(o,"-$1").toLowerCase()}var o=/([A-Z])/g;t.exports=r},{}],131:[function(e,t,n){"use strict";function r(e){return o(e).replace(i,"-ms-")}var o=e(130),i=/^ms-/;t.exports=r},{130:130}],132:[function(e,t,n){"use strict";function r(e){return"function"==typeof e&&"undefined"!=typeof e.prototype&&"function"==typeof e.prototype.mountComponent&&"function"==typeof e.prototype.receiveComponent}function o(e,t){var n;if((null===e||e===!1)&&(e=a.emptyElement),"object"==typeof e){var o=e;n=t===o.type&&"string"==typeof o.type?u.createInternalComponent(o):r(o.type)?new o.type(o):new c}else"string"==typeof e||"number"==typeof e?n=u.createInstanceForText(e):l(!1);return n.construct(e),n._mountIndex=0,n._mountImage=null,n}var i=e(37),a=e(57),u=e(71),s=e(27),l=e(133),c=(e(150),function(){});s(c.prototype,i.Mixin,{_instantiateReactComponent:o}),t.exports=o},{133:133,150:150,27:27,37:37,57:57,71:71}],133:[function(e,t,n){"use strict";var r=function(e,t,n,r,o,i,a,u){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,o,i,a,u],c=0;s=new Error("Invariant Violation: "+t.replace(/%s/g,function(){return l[c++]}))}throw s.framesToPop=1,s}};t.exports=r},{}],134:[function(e,t,n){"use strict";function r(e,t){if(!i.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,r=n in document;if(!r){var a=document.createElement("div");a.setAttribute(n,"return;"),r="function"==typeof a[n]}return!r&&o&&"wheel"===e&&(r=document.implementation.hasFeature("Events.wheel","3.0")),r}var o,i=e(21);i.canUseDOM&&(o=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0),t.exports=r},{21:21}],135:[function(e,t,n){function r(e){return!(!e||!("function"==typeof Node?e instanceof Node:"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName))}t.exports=r},{}],136:[function(e,t,n){"use strict";function r(e){return e&&("INPUT"===e.nodeName&&o[e.type]||"TEXTAREA"===e.nodeName)}var o={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};t.exports=r},{}],137:[function(e,t,n){function r(e){return o(e)&&3==e.nodeType}var o=e(135);t.exports=r},{135:135}],138:[function(e,t,n){"use strict";var r=e(133),o=function(e){var t,n={};r(e instanceof Object&&!Array.isArray(e));for(t in e)e.hasOwnProperty(t)&&(n[t]=t);return n};t.exports=o},{133:133}],139:[function(e,t,n){var r=function(e){var t;for(t in e)if(e.hasOwnProperty(t))return t;return null};t.exports=r},{}],140:[function(e,t,n){"use strict";function r(e,t,n){if(!e)return null;var r={};for(var i in e)o.call(e,i)&&(r[i]=t.call(n,e[i],i,e));return r}var o=Object.prototype.hasOwnProperty;t.exports=r},{}],141:[function(e,t,n){"use strict";function r(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}t.exports=r},{}],142:[function(e,t,n){"use strict";function r(e){return i(o.isValidElement(e)),e}var o=e(55),i=e(133);t.exports=r},{133:133,55:55}],143:[function(e,t,n){"use strict";function r(e){return'"'+o(e)+'"'}var o=e(114);t.exports=r},{114:114}],144:[function(e,t,n){"use strict";var r=e(21),o=/^[ \r\n\t\f]/,i=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,a=function(e,t){e.innerHTML=t};if("undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction&&(a=function(e,t){MSApp.execUnsafeLocalFunction(function(){e.innerHTML=t})}),r.canUseDOM){var u=document.createElement("div");u.innerHTML=" ",""===u.innerHTML&&(a=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),o.test(t)||"<"===t[0]&&i.test(t)){e.innerHTML="\ufeff"+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t})}t.exports=a},{21:21}],145:[function(e,t,n){"use strict";var r=e(21),o=e(114),i=e(144),a=function(e,t){e.textContent=t};r.canUseDOM&&("textContent"in document.documentElement||(a=function(e,t){i(e,o(t))})),t.exports=a},{114:114,144:144,21:21}],146:[function(e,t,n){"use strict";function r(e,t){if(e===t)return!0;var n;for(n in e)if(e.hasOwnProperty(n)&&(!t.hasOwnProperty(n)||e[n]!==t[n]))return!1;for(n in t)if(t.hasOwnProperty(n)&&!e.hasOwnProperty(n))return!1;return!0}t.exports=r},{}],147:[function(e,t,n){"use strict";function r(e,t){if(null!=e&&null!=t){var n=typeof e,r=typeof t;if("string"===n||"number"===n)return"string"===r||"number"===r;if("object"===r&&e.type===t.type&&e.key===t.key){var o=e._owner===t._owner;return o}}return!1}e(150);t.exports=r},{150:150}],148:[function(e,t,n){function r(e){var t=e.length;if(o(!Array.isArray(e)&&("object"==typeof e||"function"==typeof e)),o("number"==typeof t),o(0===t||t-1 in e),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(n){}for(var r=Array(t),i=0;t>i;i++)r[i]=e[i];return r}var o=e(133);t.exports=r},{133:133}],149:[function(e,t,n){"use strict";function r(e){return v[e]}function o(e,t){return e&&null!=e.key?a(e.key):t.toString(36)}function i(e){return(""+e).replace(g,r)}function a(e){return"$"+i(e)}function u(e,t,n,r,i){var s=typeof e;if(("undefined"===s||"boolean"===s)&&(e=null),null===e||"string"===s||"number"===s||l.isValidElement(e))return r(i,e,""===t?h+o(e,0):t,n),1;var p,v,g,y=0;if(Array.isArray(e))for(var C=0;C 2 | 3 | 4 | 5 | 6 | 7 | Rendering Large Datasets With ReactJS 8 | 9 | 10 | 11 | 12 | 13 | 14 |

15 | Rendering Large Datasets With ReactJS 16 |

17 | 18 |
19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/react.jsx: -------------------------------------------------------------------------------- 1 | (function() { 2 | 3 | // I manage the Demo widget. 4 | var Demo = React.createClass({ 5 | 6 | // I provide the initial view-model, before the component is mounted. 7 | getInitialState: function() { 8 | 9 | // We'll start out with a grid with 10,000 items. 10 | return({ 11 | grid: this.generateGrid( 1000, 10 ), 12 | form: { 13 | filter: "" 14 | } 15 | }); 16 | 17 | }, 18 | 19 | 20 | // --- 21 | // PUBLIC METHODS. 22 | // --- 23 | 24 | 25 | // I render the view using the current state and properties collections. 26 | render: function() { 27 | 28 | if ( this.state.grid.length ) { 29 | 30 | var dataPoints = ( this.state.grid.length * this.state.grid[ 0 ].items.length ); 31 | 32 | } else { 33 | 34 | var dataPoints = 0; 35 | 36 | } 37 | 38 | var visibleCount = this.getVisibleCount(); 39 | 40 | return( 41 |
42 | 51 | 52 | 56 |
57 | ); 58 | 59 | }, 60 | 61 | 62 | // I repopulate the grid with data. This will help separate processing 63 | // performance characteristics from page-load processing. 64 | remountGrid: function() { 65 | 66 | this.setState({ 67 | grid: this.generateGrid( 1000, 10 ), 68 | form: { 69 | filter: "" 70 | } 71 | }); 72 | 73 | }, 74 | 75 | 76 | // I update the state for filtering. 77 | setFilter: function( newFilter ) { 78 | 79 | // When we update the filter, we don't have to mutate any other state 80 | // since the filtering is actually applied in the render() methods. 81 | this.setState({ 82 | form: { 83 | filter: newFilter 84 | } 85 | }); 86 | 87 | }, 88 | 89 | 90 | // I clear the grid of data. This will help separate processing performance 91 | // characteristics from page-load processing. 92 | unmountGrid: function() { 93 | 94 | this.setState({ 95 | grid: [], 96 | form: { 97 | filter: "" 98 | } 99 | }); 100 | 101 | }, 102 | 103 | 104 | // --- 105 | // PRIVATE METHODS. 106 | // --- 107 | 108 | 109 | // I calculate and return the visible count of items based on the current 110 | // state of the filtering. 111 | getVisibleCount: function() { 112 | 113 | var count = 0; 114 | 115 | for ( var r = 0, rowCount = this.state.grid.length ; r < rowCount ; r++ ) { 116 | 117 | var row = this.state.grid[ r ]; 118 | 119 | for ( var c = 0, columnCount = row.items.length ; c < columnCount ; c++ ) { 120 | 121 | var item = row.items[ c ]; 122 | 123 | var isHidden = ( this.state.form.filter && ( item.value.indexOf( this.state.form.filter ) === -1 ) ); 124 | 125 | if ( ! isHidden ) { 126 | 127 | count++; 128 | 129 | } 130 | 131 | } 132 | 133 | } 134 | 135 | return( count ); 136 | 137 | }, 138 | 139 | 140 | // I generate a grid of items with the given dimensions. The grid is 141 | // represented as a two dimensional grid, of sorts. Each row has an object 142 | // that has an items collection. 143 | generateGrid: function( rowCount, columnCount ) { 144 | 145 | var valuePoints = [ 146 | "Daenerys", "Jon", "Sansa", "Arya", "Stannis", "Gregor", "Tyrion", 147 | "Theon", "Joffrey", "Ramsay", "Cersei", "Bran", "Margaery", 148 | "Melisandre", "Daario", "Jamie", "Eddard", "Myrcella", "Robb", 149 | "Jorah", "Petyr", "Tommen", "Sandor", "Oberyn", "Drogo", "Ygritte" 150 | ]; 151 | 152 | var valueIndex = 0; 153 | 154 | var grid = []; 155 | 156 | for ( var r = 0 ; r < rowCount ; r++ ) { 157 | 158 | var row = { 159 | id: r, 160 | items: [] 161 | }; 162 | 163 | for ( var c = 0 ; c < columnCount ; c++ ) { 164 | 165 | row.items.push({ 166 | id: ( r + "-" + c ), 167 | value: valuePoints[ valueIndex ], 168 | isHiddenByFilter: false 169 | }); 170 | 171 | if ( ++valueIndex >= valuePoints.length ) { 172 | 173 | valueIndex = 0; 174 | 175 | } 176 | 177 | } 178 | 179 | grid.push( row ); 180 | 181 | } 182 | 183 | return( grid ); 184 | 185 | } 186 | 187 | }); 188 | 189 | 190 | // --------------------------------------------------------------------------- // 191 | // --------------------------------------------------------------------------- // 192 | 193 | 194 | // I manage the Form widget. 195 | var DemoForm = React.createClass({ 196 | 197 | // I handle user-based changes on the input form. When the user updates the 198 | // filtering, we need to let the calling context know about it. 199 | handleFilterChange: function( event ) { 200 | 201 | this.props.onFilterChange( this.refs.filter.getDOMNode().value ); 202 | 203 | }, 204 | 205 | 206 | // I handle the user's desire to remount the data. 207 | handleRemount: function( event ) { 208 | 209 | this.props.onRemount(); 210 | 211 | }, 212 | 213 | 214 | // I handle the user's desire to unmount the data. 215 | handleUnmount: function( event ) { 216 | 217 | this.props.onUnmount(); 218 | 219 | }, 220 | 221 | 222 | // I render the view using the current state and properties collections. 223 | render: function() { 224 | 225 | var fitlerInsight = null; 226 | 227 | // If the user has entered filter text, we want to show some insight into 228 | // the breadth of the filtering. 229 | // -- 230 | // CAUTION: We have to have these awkward and explicit spaces { " " } 231 | // because the JSX strips out certain pieces of whitespace, leaving 232 | // the input butted-up against the label. 233 | if ( this.props.filter ) { 234 | 235 | fitlerInsight = ( 236 | 237 | — 238 | Filtering { this.props.filter } 239 | { " " } over { this.props.dataPoints } data points, 240 | { " " } { this.props.visibleCount } found. 241 | 242 | ); 243 | 244 | } 245 | 246 | // Provide some tooling to unmount and remount the data. 247 | if ( this.props.isMounted ) { 248 | 249 | var mountAction = Unmount Grid; 250 | 251 | } else { 252 | 253 | var mountAction = Remount Grid; 254 | 255 | } 256 | 257 | // CAUTION: We have to have these awkward and explicit spaces { " " } 258 | // because the JSX strips out certain pieces of whitespace, leaving 259 | // the input butted-up against the label. 260 | return( 261 |
262 | Filter Data: 263 | { " " } 264 | 270 | { " " } 271 | { fitlerInsight } 272 | { " " } 273 | { mountAction } 274 |
275 | ); 276 | 277 | } 278 | 279 | }); 280 | 281 | 282 | // --------------------------------------------------------------------------- // 283 | // --------------------------------------------------------------------------- // 284 | 285 | 286 | // I manage the Table widget. 287 | var DemoTable = React.createClass({ 288 | 289 | // I render the view using the current state and properties collections. 290 | render: function() { 291 | 292 | // If the table is being filtered, we want to add a class to the table to 293 | // set a default style for all the non-hidden elements. 294 | var tableClasses = this.props.filter 295 | ? "filtered" 296 | : null 297 | ; 298 | 299 | // Creating a local reference so we don't have to .bind() the iterator. 300 | var filter = this.props.filter; 301 | 302 | // Translate the grid into a collection of rows. 303 | var rows = this.props.grid.map( 304 | function transformRow( row ) { 305 | 306 | return( 307 | 312 | ); 313 | 314 | } 315 | ); 316 | 317 | return( 318 | 319 | 320 | { rows } 321 | 322 |
323 | ); 324 | 325 | } 326 | 327 | }); 328 | 329 | 330 | // --------------------------------------------------------------------------- // 331 | // --------------------------------------------------------------------------- // 332 | 333 | 334 | // I manage the Table rows. 335 | var DemoTableRow = React.createClass({ 336 | 337 | // I render the view using the current state and properties collections. 338 | render: function() { 339 | 340 | var columns = [ 341 | 342 | { this.props.row.id } 343 | 344 | ]; 345 | 346 | // Creating a local reference so we don't have to .bind() the iterator. 347 | var filter = this.props.filter; 348 | 349 | // Translate each item into a TD element. If there is filtering being 350 | // applied, some of the TD elements will have the "hidden" class. 351 | this.props.row.items.forEach( 352 | function transformItem( item ) { 353 | 354 | var classes = "item"; 355 | 356 | if ( filter && ( item.value.indexOf( filter ) === -1 ) ) { 357 | 358 | classes += " hidden"; 359 | 360 | } 361 | 362 | columns.push( 363 | 364 | { item.value } 365 | 366 | ); 367 | 368 | } 369 | ); 370 | 371 | return( 372 | 373 | { columns } 374 | 375 | ); 376 | 377 | } 378 | 379 | }); 380 | 381 | 382 | // --------------------------------------------------------------------------- // 383 | // --------------------------------------------------------------------------- // 384 | 385 | 386 | // Render the root Demo and mount it inside the given element. 387 | React.render( , document.getElementById( "content" ) ); 388 | 389 | }()); 390 | -------------------------------------------------------------------------------- /tests/angular-1-mount-grid.conf.js: -------------------------------------------------------------------------------- 1 | 2 | exports.config = { 3 | 4 | directConnect: true, 5 | 6 | capabilities: { 7 | browserName: 'chrome', 8 | chromeOptions: { 9 | // Important for benchpress to get timeline data from the browser 10 | 'args': ['--js-flags=--expose-gc'], 11 | 'perfLoggingPrefs': { 12 | 'traceCategories': 'blink.console,disabled-by-default-devtools.timeline' 13 | } 14 | }, 15 | loggingPrefs: { 16 | performance: 'ALL' 17 | } 18 | }, 19 | 20 | specs: [ 21 | './angular-1-mount-grid.spec.js' 22 | ], 23 | framework: 'jasmine2', 24 | 25 | onPrepare: function () { 26 | var originalBrowser = browser; 27 | var _tmpBrowser; 28 | beforeEach(function () { 29 | global.browser = originalBrowser.forkNewDriverInstance(); 30 | global.element = global.browser.element; 31 | global.$ = global.browser.$; 32 | global.$$ = global.browser.$$; 33 | }); 34 | afterEach(function () { 35 | global.browser.quit(); 36 | global.browser = originalBrowser; 37 | }); 38 | }, 39 | 40 | jasmineNodeOpts: { 41 | showColors: true, 42 | defaultTimeoutInterval: 30000 43 | } 44 | }; 45 | -------------------------------------------------------------------------------- /tests/angular-1-mount-grid.spec.js: -------------------------------------------------------------------------------- 1 | var benchpress = require('benchpress'); 2 | 3 | var runner = new benchpress.Runner([ 4 | benchpress.SeleniumWebDriverAdapter.PROTRACTOR_BINDINGS, 5 | benchpress.Validator.bindTo(benchpress.RegressionSlopeValidator), 6 | benchpress.bind(benchpress.RegressionSlopeValidator.SAMPLE_SIZE).toValue(20), 7 | benchpress.bind(benchpress.RegressionSlopeValidator.METRIC).toValue('scriptTime'), 8 | benchpress.bind(benchpress.Options.FORCE_GC).toValue(true) 9 | ]); 10 | 11 | describe('grid', function() { 12 | 13 | it('mount', function(done) { 14 | 15 | browser.ignoreSynchronization = false; 16 | browser.get('http://localhost:5001/angular1.html'); 17 | 18 | runner.sample({ 19 | id: 'angular-1-mount-grid', 20 | prepare: function () { 21 | return $('#unmount-grid').click(); 22 | }, 23 | execute: function() { 24 | return $('#remount-grid').click(); 25 | } 26 | }).then(done, done.fail); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /tests/angular-2-mount-grid.conf.js: -------------------------------------------------------------------------------- 1 | 2 | exports.config = { 3 | 4 | directConnect: true, 5 | 6 | capabilities: { 7 | browserName: 'chrome', 8 | chromeOptions: { 9 | // Important for benchpress to get timeline data from the browser 10 | 'args': ['--js-flags=--expose-gc'], 11 | 'perfLoggingPrefs': { 12 | 'traceCategories': 'blink.console,disabled-by-default-devtools.timeline' 13 | } 14 | }, 15 | loggingPrefs: { 16 | performance: 'ALL' 17 | } 18 | }, 19 | 20 | specs: [ 21 | './angular-2-mount-grid.spec.js' 22 | ], 23 | framework: 'jasmine2', 24 | 25 | onPrepare: function () { 26 | var originalBrowser = browser; 27 | var _tmpBrowser; 28 | beforeEach(function () { 29 | global.browser = originalBrowser.forkNewDriverInstance(); 30 | global.element = global.browser.element; 31 | global.$ = global.browser.$; 32 | global.$$ = global.browser.$$; 33 | }); 34 | afterEach(function () { 35 | global.browser.quit(); 36 | global.browser = originalBrowser; 37 | }); 38 | }, 39 | 40 | jasmineNodeOpts: { 41 | showColors: true, 42 | defaultTimeoutInterval: 30000 43 | } 44 | }; 45 | -------------------------------------------------------------------------------- /tests/angular-2-mount-grid.spec.js: -------------------------------------------------------------------------------- 1 | var benchpress = require('benchpress'); 2 | var q = require('q'); 3 | 4 | var runner = new benchpress.Runner([ 5 | benchpress.SeleniumWebDriverAdapter.PROTRACTOR_BINDINGS, 6 | benchpress.Validator.bindTo(benchpress.RegressionSlopeValidator), 7 | benchpress.bind(benchpress.RegressionSlopeValidator.SAMPLE_SIZE).toValue(20), 8 | benchpress.bind(benchpress.RegressionSlopeValidator.METRIC).toValue('scriptTime'), 9 | benchpress.bind(benchpress.Options.FORCE_GC).toValue(true) 10 | ]); 11 | 12 | describe('grid', function() { 13 | 14 | it('mount', function(done) { 15 | 16 | browser.ignoreSynchronization = true; 17 | browser.get('http://localhost:5001/angular2.html'); 18 | 19 | runner.sample({ 20 | id: 'angular-2-mount-grid', 21 | prepare: function () { 22 | var deferred = q.defer(); 23 | var checkForInitialized = function() { 24 | browser.findElements(by.css('#unmount-grid')).then(function(buttonList){ 25 | if(buttonList.length) { 26 | $('#unmount-grid').click().then(function() { 27 | deferred.resolve(); 28 | }); 29 | } 30 | else { 31 | setTimeout(checkForInitialized, 100); 32 | } 33 | }); 34 | }; 35 | setTimeout(checkForInitialized, 100); 36 | return deferred.promise; 37 | }, 38 | execute: function() { 39 | return $('#remount-grid').click(); 40 | } 41 | }).then(done, done.fail); 42 | }); 43 | }); 44 | -------------------------------------------------------------------------------- /tests/react-mount-grid.conf.js: -------------------------------------------------------------------------------- 1 | 2 | exports.config = { 3 | 4 | directConnect: true, 5 | 6 | capabilities: { 7 | browserName: 'chrome', 8 | chromeOptions: { 9 | // Important for benchpress to get timeline data from the browser 10 | 'args': ['--js-flags=--expose-gc'], 11 | 'perfLoggingPrefs': { 12 | 'traceCategories': 'blink.console,disabled-by-default-devtools.timeline' 13 | } 14 | }, 15 | loggingPrefs: { 16 | performance: 'ALL' 17 | } 18 | }, 19 | 20 | specs: [ 21 | './react-mount-grid.spec.js' 22 | ], 23 | framework: 'jasmine2', 24 | 25 | onPrepare: function () { 26 | var originalBrowser = browser; 27 | var _tmpBrowser; 28 | beforeEach(function () { 29 | global.browser = originalBrowser.forkNewDriverInstance(); 30 | global.element = global.browser.element; 31 | global.$ = global.browser.$; 32 | global.$$ = global.browser.$$; 33 | }); 34 | afterEach(function () { 35 | global.browser.quit(); 36 | global.browser = originalBrowser; 37 | }); 38 | }, 39 | 40 | jasmineNodeOpts: { 41 | showColors: true, 42 | defaultTimeoutInterval: 30000 43 | } 44 | }; 45 | -------------------------------------------------------------------------------- /tests/react-mount-grid.spec.js: -------------------------------------------------------------------------------- 1 | var benchpress = require('benchpress'); 2 | 3 | var runner = new benchpress.Runner([ 4 | benchpress.SeleniumWebDriverAdapter.PROTRACTOR_BINDINGS, 5 | benchpress.Validator.bindTo(benchpress.RegressionSlopeValidator), 6 | benchpress.bind(benchpress.RegressionSlopeValidator.SAMPLE_SIZE).toValue(20), 7 | benchpress.bind(benchpress.RegressionSlopeValidator.METRIC).toValue('scriptTime'), 8 | benchpress.bind(benchpress.Options.FORCE_GC).toValue(true) 9 | ]); 10 | 11 | describe('grid', function() { 12 | 13 | it('mount', function(done) { 14 | 15 | browser.ignoreSynchronization = true; 16 | browser.get('http://localhost:5001/react.html'); 17 | 18 | runner.sample({ 19 | id: 'react-mount-grid', 20 | prepare: function () { 21 | return $('#unmount-grid').click(); 22 | }, 23 | execute: function() { 24 | return $('#remount-grid').click(); 25 | } 26 | }).then(done, done.fail); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /typings/es6-promise/es6-promise.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for es6-promise 2 | // Project: https://github.com/jakearchibald/ES6-Promise 3 | // Definitions by: François de Campredon , vvakame 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | interface Thenable { 7 | then(onFulfilled?: (value: R) => U | Thenable, onRejected?: (error: any) => U | Thenable): Thenable; 8 | then(onFulfilled?: (value: R) => U | Thenable, onRejected?: (error: any) => void): Thenable; 9 | } 10 | 11 | declare class Promise implements Thenable { 12 | /** 13 | * If you call resolve in the body of the callback passed to the constructor, 14 | * your promise is fulfilled with result object passed to resolve. 15 | * If you call reject your promise is rejected with the object passed to resolve. 16 | * For consistency and debugging (eg stack traces), obj should be an instanceof Error. 17 | * Any errors thrown in the constructor callback will be implicitly passed to reject(). 18 | */ 19 | constructor(callback: (resolve : (value?: R | Thenable) => void, reject: (error?: any) => void) => void); 20 | 21 | /** 22 | * onFulfilled is called when/if "promise" resolves. onRejected is called when/if "promise" rejects. 23 | * Both are optional, if either/both are omitted the next onFulfilled/onRejected in the chain is called. 24 | * Both callbacks have a single parameter , the fulfillment value or rejection reason. 25 | * "then" returns a new promise equivalent to the value you return from onFulfilled/onRejected after being passed through Promise.resolve. 26 | * If an error is thrown in the callback, the returned promise rejects with that error. 27 | * 28 | * @param onFulfilled called when/if "promise" resolves 29 | * @param onRejected called when/if "promise" rejects 30 | */ 31 | then(onFulfilled?: (value: R) => U | Thenable, onRejected?: (error: any) => U | Thenable): Promise; 32 | then(onFulfilled?: (value: R) => U | Thenable, onRejected?: (error: any) => void): Promise; 33 | 34 | /** 35 | * Sugar for promise.then(undefined, onRejected) 36 | * 37 | * @param onRejected called when/if "promise" rejects 38 | */ 39 | catch(onRejected?: (error: any) => U | Thenable): Promise; 40 | } 41 | 42 | declare module Promise { 43 | /** 44 | * Make a new promise from the thenable. 45 | * A thenable is promise-like in as far as it has a "then" method. 46 | */ 47 | function resolve(value?: R | Thenable): Promise; 48 | 49 | /** 50 | * Make a promise that rejects to obj. For consistency and debugging (eg stack traces), obj should be an instanceof Error 51 | */ 52 | function reject(error: any): Promise; 53 | 54 | /** 55 | * Make a promise that fulfills when every item in the array fulfills, and rejects if (and when) any item rejects. 56 | * the array passed to all can be a mixture of promise-like objects and other objects. 57 | * The fulfillment value is an array (in order) of fulfillment values. The rejection value is the first rejection value. 58 | */ 59 | function all(promises: (R | Thenable)[]): Promise; 60 | 61 | /** 62 | * Make a Promise that fulfills when any item fulfills, and rejects if any item rejects. 63 | */ 64 | function race(promises: (R | Thenable)[]): Promise; 65 | } 66 | 67 | declare module 'es6-promise' { 68 | var foo: typeof Promise; // Temp variable to reference Promise in local context 69 | module rsvp { 70 | export var Promise: typeof foo; 71 | } 72 | export = rsvp; 73 | } 74 | -------------------------------------------------------------------------------- /typings/rx/rx-lite.d.ts: -------------------------------------------------------------------------------- 1 | // DefinitelyTyped: partial 2 | 3 | // This file contains common part of defintions for rx.d.ts and rx.lite.d.ts 4 | // Do not include the file separately. 5 | 6 | declare module Rx { 7 | export module internals { 8 | function isEqual(left: any, right: any): boolean; 9 | function addRef(xs: Observable, r: { getDisposable(): IDisposable; }): Observable; 10 | 11 | // Priority Queue for Scheduling 12 | export class PriorityQueue { 13 | constructor(capacity: number); 14 | 15 | length: number; 16 | 17 | isHigherPriority(left: number, right: number): boolean; 18 | percolate(index: number): void; 19 | heapify(index: number): void; 20 | peek(): ScheduledItem; 21 | removeAt(index: number): void; 22 | dequeue(): ScheduledItem; 23 | enqueue(item: ScheduledItem): void; 24 | remove(item: ScheduledItem): boolean; 25 | 26 | static count: number; 27 | } 28 | 29 | export class ScheduledItem { 30 | constructor(scheduler: IScheduler, state: any, action: (scheduler: IScheduler, state: any) => IDisposable, dueTime: TTime, comparer?: (x: TTime, y: TTime) => number); 31 | 32 | scheduler: IScheduler; 33 | state: TTime; 34 | action: (scheduler: IScheduler, state: any) => IDisposable; 35 | dueTime: TTime; 36 | comparer: (x: TTime, y: TTime) => number; 37 | disposable: SingleAssignmentDisposable; 38 | 39 | invoke(): void; 40 | compareTo(other: ScheduledItem): number; 41 | isCancelled(): boolean; 42 | invokeCore(): IDisposable; 43 | } 44 | } 45 | 46 | export module config { 47 | export var Promise: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise; }; 48 | } 49 | 50 | export module helpers { 51 | function noop(): void; 52 | function notDefined(value: any): boolean; 53 | function isScheduler(value: any): boolean; 54 | function identity(value: T): T; 55 | function defaultNow(): number; 56 | function defaultComparer(left: any, right: any): boolean; 57 | function defaultSubComparer(left: any, right: any): number; 58 | function defaultKeySerializer(key: any): string; 59 | function defaultError(err: any): void; 60 | function isPromise(p: any): boolean; 61 | function asArray(...args: T[]): T[]; 62 | function not(value: any): boolean; 63 | function isFunction(value: any): boolean; 64 | } 65 | 66 | export interface IDisposable { 67 | dispose(): void; 68 | } 69 | 70 | export class CompositeDisposable implements IDisposable { 71 | constructor (...disposables: IDisposable[]); 72 | constructor (disposables: IDisposable[]); 73 | 74 | isDisposed: boolean; 75 | length: number; 76 | 77 | dispose(): void; 78 | add(item: IDisposable): void; 79 | remove(item: IDisposable): boolean; 80 | toArray(): IDisposable[]; 81 | } 82 | 83 | export class Disposable implements IDisposable { 84 | constructor(action: () => void); 85 | 86 | static create(action: () => void): IDisposable; 87 | static empty: IDisposable; 88 | 89 | dispose(): void; 90 | } 91 | 92 | // Single assignment 93 | export class SingleAssignmentDisposable implements IDisposable { 94 | constructor(); 95 | 96 | isDisposed: boolean; 97 | current: IDisposable; 98 | 99 | dispose(): void ; 100 | getDisposable(): IDisposable; 101 | setDisposable(value: IDisposable): void ; 102 | } 103 | 104 | // SerialDisposable it's an alias of SingleAssignmentDisposable 105 | export class SerialDisposable extends SingleAssignmentDisposable { 106 | constructor(); 107 | } 108 | 109 | export class RefCountDisposable implements IDisposable { 110 | constructor(disposable: IDisposable); 111 | 112 | dispose(): void; 113 | 114 | isDisposed: boolean; 115 | getDisposable(): IDisposable; 116 | } 117 | 118 | export interface IScheduler { 119 | now(): number; 120 | 121 | schedule(action: () => void): IDisposable; 122 | scheduleWithState(state: TState, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable; 123 | scheduleWithAbsolute(dueTime: number, action: () => void): IDisposable; 124 | scheduleWithAbsoluteAndState(state: TState, dueTime: number, action: (scheduler: IScheduler, state: TState) =>IDisposable): IDisposable; 125 | scheduleWithRelative(dueTime: number, action: () => void): IDisposable; 126 | scheduleWithRelativeAndState(state: TState, dueTime: number, action: (scheduler: IScheduler, state: TState) =>IDisposable): IDisposable; 127 | 128 | scheduleRecursive(action: (action: () =>void ) =>void ): IDisposable; 129 | scheduleRecursiveWithState(state: TState, action: (state: TState, action: (state: TState) =>void ) =>void ): IDisposable; 130 | scheduleRecursiveWithAbsolute(dueTime: number, action: (action: (dueTime: number) => void) => void): IDisposable; 131 | scheduleRecursiveWithAbsoluteAndState(state: TState, dueTime: number, action: (state: TState, action: (state: TState, dueTime: number) => void) => void): IDisposable; 132 | scheduleRecursiveWithRelative(dueTime: number, action: (action: (dueTime: number) =>void ) =>void ): IDisposable; 133 | scheduleRecursiveWithRelativeAndState(state: TState, dueTime: number, action: (state: TState, action: (state: TState, dueTime: number) =>void ) =>void ): IDisposable; 134 | 135 | schedulePeriodic(period: number, action: () => void): IDisposable; 136 | schedulePeriodicWithState(state: TState, period: number, action: (state: TState) => TState): IDisposable; 137 | } 138 | 139 | export interface Scheduler extends IScheduler { 140 | } 141 | 142 | export interface SchedulerStatic { 143 | new ( 144 | now: () => number, 145 | schedule: (state: any, action: (scheduler: IScheduler, state: any) => IDisposable) => IDisposable, 146 | scheduleRelative: (state: any, dueTime: number, action: (scheduler: IScheduler, state: any) => IDisposable) => IDisposable, 147 | scheduleAbsolute: (state: any, dueTime: number, action: (scheduler: IScheduler, state: any) => IDisposable) => IDisposable): Scheduler; 148 | 149 | normalize(timeSpan: number): number; 150 | 151 | immediate: IScheduler; 152 | currentThread: ICurrentThreadScheduler; 153 | timeout: IScheduler; 154 | } 155 | 156 | export var Scheduler: SchedulerStatic; 157 | 158 | // Current Thread IScheduler 159 | interface ICurrentThreadScheduler extends IScheduler { 160 | scheduleRequired(): boolean; 161 | } 162 | 163 | // Notifications 164 | export class Notification { 165 | accept(observer: IObserver): void; 166 | accept(onNext: (value: T) => TResult, onError?: (exception: any) => TResult, onCompleted?: () => TResult): TResult; 167 | toObservable(scheduler?: IScheduler): Observable; 168 | hasValue: boolean; 169 | equals(other: Notification): boolean; 170 | kind: string; 171 | value: T; 172 | exception: any; 173 | 174 | static createOnNext(value: T): Notification; 175 | static createOnError(exception: any): Notification; 176 | static createOnCompleted(): Notification; 177 | } 178 | 179 | /** 180 | * Promise A+ 181 | */ 182 | export interface IPromise { 183 | then(onFulfilled: (value: T) => IPromise, onRejected: (reason: any) => IPromise): IPromise; 184 | then(onFulfilled: (value: T) => IPromise, onRejected?: (reason: any) => R): IPromise; 185 | then(onFulfilled: (value: T) => R, onRejected: (reason: any) => IPromise): IPromise; 186 | then(onFulfilled?: (value: T) => R, onRejected?: (reason: any) => R): IPromise; 187 | } 188 | 189 | // Observer 190 | export interface IObserver { 191 | onNext(value: T): void; 192 | onError(exception: any): void; 193 | onCompleted(): void; 194 | } 195 | 196 | export interface Observer extends IObserver { 197 | toNotifier(): (notification: Notification) => void; 198 | asObserver(): Observer; 199 | } 200 | 201 | interface ObserverStatic { 202 | create(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observer; 203 | fromNotifier(handler: (notification: Notification, thisArg?: any) => void): Observer; 204 | } 205 | 206 | export var Observer: ObserverStatic; 207 | 208 | export interface IObservable { 209 | subscribe(observer: Observer): IDisposable; 210 | subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable; 211 | 212 | subscribeOnNext(onNext: (value: T) => void, thisArg?: any): IDisposable; 213 | subscribeOnError(onError: (exception: any) => void, thisArg?: any): IDisposable; 214 | subscribeOnCompleted(onCompleted: () => void, thisArg?: any): IDisposable; 215 | } 216 | 217 | export interface Observable extends IObservable { 218 | forEach(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable; // alias for subscribe 219 | toArray(): Observable; 220 | 221 | catch(handler: (exception: any) => Observable): Observable; 222 | catchException(handler: (exception: any) => Observable): Observable; // alias for catch 223 | catch(handler: (exception: any) => IPromise): Observable; 224 | catchException(handler: (exception: any) => IPromise): Observable; // alias for catch 225 | catch(second: Observable): Observable; 226 | catchException(second: Observable): Observable; // alias for catch 227 | combineLatest(second: Observable, resultSelector: (v1: T, v2: T2) => TResult): Observable; 228 | combineLatest(second: IPromise, resultSelector: (v1: T, v2: T2) => TResult): Observable; 229 | combineLatest(second: Observable, third: Observable, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 230 | combineLatest(second: Observable, third: IPromise, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 231 | combineLatest(second: IPromise, third: Observable, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 232 | combineLatest(second: IPromise, third: IPromise, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 233 | combineLatest(second: Observable, third: Observable, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 234 | combineLatest(second: Observable, third: Observable, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 235 | combineLatest(second: Observable, third: IPromise, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 236 | combineLatest(second: Observable, third: IPromise, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 237 | combineLatest(second: IPromise, third: Observable, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 238 | combineLatest(second: IPromise, third: Observable, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 239 | combineLatest(second: IPromise, third: IPromise, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 240 | combineLatest(second: IPromise, third: IPromise, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 241 | combineLatest(second: Observable, third: Observable, fourth: Observable, fifth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable; 242 | combineLatest(souces: Observable[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable; 243 | combineLatest(souces: IPromise[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable; 244 | concat(...sources: Observable[]): Observable; 245 | concat(...sources: IPromise[]): Observable; 246 | concat(sources: Observable[]): Observable; 247 | concat(sources: IPromise[]): Observable; 248 | concatAll(): T; 249 | concatObservable(): T; // alias for concatAll 250 | concatMap(selector: (value: T, index: number) => Observable, resultSelector: (value1: T, value2: T2, index: number) => R): Observable; // alias for selectConcat 251 | concatMap(selector: (value: T, index: number) => IPromise, resultSelector: (value1: T, value2: T2, index: number) => R): Observable; // alias for selectConcat 252 | concatMap(selector: (value: T, index: number) => Observable): Observable; // alias for selectConcat 253 | concatMap(selector: (value: T, index: number) => IPromise): Observable; // alias for selectConcat 254 | concatMap(sequence: Observable): Observable; // alias for selectConcat 255 | merge(maxConcurrent: number): T; 256 | merge(other: Observable): Observable; 257 | merge(other: IPromise): Observable; 258 | mergeAll(): T; 259 | mergeObservable(): T; // alias for mergeAll 260 | skipUntil(other: Observable): Observable; 261 | skipUntil(other: IPromise): Observable; 262 | switch(): T; 263 | switchLatest(): T; // alias for switch 264 | takeUntil(other: Observable): Observable; 265 | takeUntil(other: IPromise): Observable; 266 | zip(second: Observable, resultSelector: (v1: T, v2: T2) => TResult): Observable; 267 | zip(second: IPromise, resultSelector: (v1: T, v2: T2) => TResult): Observable; 268 | zip(second: Observable, third: Observable, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 269 | zip(second: Observable, third: IPromise, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 270 | zip(second: IPromise, third: Observable, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 271 | zip(second: IPromise, third: IPromise, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 272 | zip(second: Observable, third: Observable, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 273 | zip(second: Observable, third: Observable, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 274 | zip(second: Observable, third: IPromise, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 275 | zip(second: Observable, third: IPromise, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 276 | zip(second: IPromise, third: Observable, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 277 | zip(second: IPromise, third: Observable, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 278 | zip(second: IPromise, third: IPromise, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 279 | zip(second: IPromise, third: IPromise, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 280 | zip(second: Observable, third: Observable, fourth: Observable, fifth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable; 281 | zip(second: Observable[], resultSelector: (left: T, ...right: TOther[]) => TResult): Observable; 282 | zip(second: IPromise[], resultSelector: (left: T, ...right: TOther[]) => TResult): Observable; 283 | 284 | asObservable(): Observable; 285 | dematerialize(): Observable; 286 | distinctUntilChanged(skipParameter: boolean, comparer: (x: T, y: T) => boolean): Observable; 287 | distinctUntilChanged(keySelector?: (value: T) => TValue, comparer?: (x: TValue, y: TValue) => boolean): Observable; 288 | do(observer: Observer): Observable; 289 | doAction(observer: Observer): Observable; // alias for do 290 | tap(observer: Observer): Observable; // alias for do 291 | do(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable; 292 | doAction(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable; // alias for do 293 | tap(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable; // alias for do 294 | 295 | doOnNext(onNext: (value: T) => void, thisArg?: any): Observable; 296 | doOnError(onError: (exception: any) => void, thisArg?: any): Observable; 297 | doOnCompleted(onCompleted: () => void, thisArg?: any): Observable; 298 | tapOnNext(onNext: (value: T) => void, thisArg?: any): Observable; 299 | tapOnError(onError: (exception: any) => void, thisArg?: any): Observable; 300 | tapOnCompleted(onCompleted: () => void, thisArg?: any): Observable; 301 | 302 | finally(action: () => void): Observable; 303 | finallyAction(action: () => void): Observable; // alias for finally 304 | ignoreElements(): Observable; 305 | materialize(): Observable>; 306 | repeat(repeatCount?: number): Observable; 307 | retry(retryCount?: number): Observable; 308 | scan(seed: TAcc, accumulator: (acc: TAcc, value: T) => TAcc): Observable; 309 | scan(accumulator: (acc: T, value: T) => T): Observable; 310 | skipLast(count: number): Observable; 311 | startWith(...values: T[]): Observable; 312 | startWith(scheduler: IScheduler, ...values: T[]): Observable; 313 | takeLast(count: number): Observable; 314 | takeLastBuffer(count: number): Observable; 315 | 316 | select(selector: (value: T, index: number, source: Observable) => TResult, thisArg?: any): Observable; 317 | map(selector: (value: T, index: number, source: Observable) => TResult, thisArg?: any): Observable; // alias for select 318 | pluck(prop: string): Observable; 319 | selectMany(selector: (value: T) => Observable, resultSelector: (item: T, other: TOther) => TResult): Observable; 320 | selectMany(selector: (value: T) => IPromise, resultSelector: (item: T, other: TOther) => TResult): Observable; 321 | selectMany(selector: (value: T) => Observable): Observable; 322 | selectMany(selector: (value: T) => IPromise): Observable; 323 | selectMany(other: Observable): Observable; 324 | selectMany(other: IPromise): Observable; 325 | flatMap(selector: (value: T) => Observable, resultSelector: (item: T, other: TOther) => TResult): Observable; // alias for selectMany 326 | flatMap(selector: (value: T) => IPromise, resultSelector: (item: T, other: TOther) => TResult): Observable; // alias for selectMany 327 | flatMap(selector: (value: T) => Observable): Observable; // alias for selectMany 328 | flatMap(selector: (value: T) => IPromise): Observable; // alias for selectMany 329 | flatMap(other: Observable): Observable; // alias for selectMany 330 | flatMap(other: IPromise): Observable; // alias for selectMany 331 | 332 | selectConcat(selector: (value: T, index: number) => Observable, resultSelector: (value1: T, value2: T2, index: number) => R): Observable; 333 | selectConcat(selector: (value: T, index: number) => IPromise, resultSelector: (value1: T, value2: T2, index: number) => R): Observable; 334 | selectConcat(selector: (value: T, index: number) => Observable): Observable; 335 | selectConcat(selector: (value: T, index: number) => IPromise): Observable; 336 | selectConcat(sequence: Observable): Observable; 337 | 338 | /** 339 | * Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then 340 | * transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. 341 | * @param selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. 342 | * @param [thisArg] Object to use as this when executing callback. 343 | * @returns An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences 344 | * and that at any point in time produces the elements of the most recent inner observable sequence that has been received. 345 | */ 346 | selectSwitch(selector: (value: T, index: number, source: Observable) => Observable, thisArg?: any): Observable; 347 | /** 348 | * Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then 349 | * transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. 350 | * @param selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. 351 | * @param [thisArg] Object to use as this when executing callback. 352 | * @returns An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences 353 | * and that at any point in time produces the elements of the most recent inner observable sequence that has been received. 354 | */ 355 | flatMapLatest(selector: (value: T, index: number, source: Observable) => Observable, thisArg?: any): Observable; // alias for selectSwitch 356 | /** 357 | * Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then 358 | * transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. 359 | * @param selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. 360 | * @param [thisArg] Object to use as this when executing callback. 361 | * @since 2.2.28 362 | * @returns An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences 363 | * and that at any point in time produces the elements of the most recent inner observable sequence that has been received. 364 | */ 365 | switchMap(selector: (value: T, index: number, source: Observable) => TResult, thisArg?: any): Observable; // alias for selectSwitch 366 | 367 | skip(count: number): Observable; 368 | skipWhile(predicate: (value: T, index: number, source: Observable) => boolean, thisArg?: any): Observable; 369 | take(count: number, scheduler?: IScheduler): Observable; 370 | takeWhile(predicate: (value: T, index: number, source: Observable) => boolean, thisArg?: any): Observable; 371 | where(predicate: (value: T, index: number, source: Observable) => boolean, thisArg?: any): Observable; 372 | filter(predicate: (value: T, index: number, source: Observable) => boolean, thisArg?: any): Observable; // alias for where 373 | 374 | /** 375 | * Converts an existing observable sequence to an ES6 Compatible Promise 376 | * @example 377 | * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise); 378 | * @param promiseCtor The constructor of the promise. 379 | * @returns An ES6 compatible promise with the last value from the observable sequence. 380 | */ 381 | toPromise>(promiseCtor: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): TPromise; }): TPromise; 382 | /** 383 | * Converts an existing observable sequence to an ES6 Compatible Promise 384 | * @example 385 | * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise); 386 | * 387 | * // With config 388 | * Rx.config.Promise = RSVP.Promise; 389 | * var promise = Rx.Observable.return(42).toPromise(); 390 | * @param [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise. 391 | * @returns An ES6 compatible promise with the last value from the observable sequence. 392 | */ 393 | toPromise(promiseCtor?: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise; }): IPromise; 394 | 395 | // Experimental Flattening 396 | 397 | /** 398 | * Performs a exclusive waiting for the first to finish before subscribing to another observable. 399 | * Observables that come in between subscriptions will be dropped on the floor. 400 | * Can be applied on `Observable>` or `Observable>`. 401 | * @since 2.2.28 402 | * @returns A exclusive observable with only the results that happen when subscribed. 403 | */ 404 | exclusive(): Observable; 405 | 406 | /** 407 | * Performs a exclusive map waiting for the first to finish before subscribing to another observable. 408 | * Observables that come in between subscriptions will be dropped on the floor. 409 | * Can be applied on `Observable>` or `Observable>`. 410 | * @since 2.2.28 411 | * @param selector Selector to invoke for every item in the current subscription. 412 | * @param [thisArg] An optional context to invoke with the selector parameter. 413 | * @returns {An exclusive observable with only the results that happen when subscribed. 414 | */ 415 | exclusiveMap(selector: (value: I, index: number, source: Observable) => R, thisArg?: any): Observable; 416 | } 417 | 418 | interface ObservableStatic { 419 | create(subscribe: (observer: Observer) => IDisposable): Observable; 420 | create(subscribe: (observer: Observer) => () => void): Observable; 421 | create(subscribe: (observer: Observer) => void): Observable; 422 | createWithDisposable(subscribe: (observer: Observer) => IDisposable): Observable; 423 | defer(observableFactory: () => Observable): Observable; 424 | defer(observableFactory: () => IPromise): Observable; 425 | empty(scheduler?: IScheduler): Observable; 426 | 427 | /** 428 | * This method creates a new Observable sequence from an array object. 429 | * @param array An array-like or iterable object to convert to an Observable sequence. 430 | * @param mapFn Map function to call on every element of the array. 431 | * @param [thisArg] The context to use calling the mapFn if provided. 432 | * @param [scheduler] Optional scheduler to use for scheduling. If not provided, defaults to Scheduler.currentThread. 433 | */ 434 | from(array: T[], mapFn: (value: T, index: number) => TResult, thisArg?: any, scheduler?: IScheduler): Observable; 435 | /** 436 | * This method creates a new Observable sequence from an array object. 437 | * @param array An array-like or iterable object to convert to an Observable sequence. 438 | * @param [mapFn] Map function to call on every element of the array. 439 | * @param [thisArg] The context to use calling the mapFn if provided. 440 | * @param [scheduler] Optional scheduler to use for scheduling. If not provided, defaults to Scheduler.currentThread. 441 | */ 442 | from(array: T[], mapFn?: (value: T, index: number) => T, thisArg?: any, scheduler?: IScheduler): Observable; 443 | 444 | /** 445 | * This method creates a new Observable sequence from an array-like object. 446 | * @param array An array-like or iterable object to convert to an Observable sequence. 447 | * @param mapFn Map function to call on every element of the array. 448 | * @param [thisArg] The context to use calling the mapFn if provided. 449 | * @param [scheduler] Optional scheduler to use for scheduling. If not provided, defaults to Scheduler.currentThread. 450 | */ 451 | from(array: { length: number;[index: number]: T; }, mapFn: (value: T, index: number) => TResult, thisArg?: any, scheduler?: IScheduler): Observable; 452 | /** 453 | * This method creates a new Observable sequence from an array-like object. 454 | * @param array An array-like or iterable object to convert to an Observable sequence. 455 | * @param [mapFn] Map function to call on every element of the array. 456 | * @param [thisArg] The context to use calling the mapFn if provided. 457 | * @param [scheduler] Optional scheduler to use for scheduling. If not provided, defaults to Scheduler.currentThread. 458 | */ 459 | from(array: { length: number;[index: number]: T; }, mapFn?: (value: T, index: number) => T, thisArg?: any, scheduler?: IScheduler): Observable; 460 | 461 | /** 462 | * This method creates a new Observable sequence from an array-like or iterable object. 463 | * @param array An array-like or iterable object to convert to an Observable sequence. 464 | * @param [mapFn] Map function to call on every element of the array. 465 | * @param [thisArg] The context to use calling the mapFn if provided. 466 | * @param [scheduler] Optional scheduler to use for scheduling. If not provided, defaults to Scheduler.currentThread. 467 | */ 468 | from(iterable: any, mapFn?: (value: any, index: number) => T, thisArg?: any, scheduler?: IScheduler): Observable; 469 | 470 | fromArray(array: T[], scheduler?: IScheduler): Observable; 471 | fromArray(array: { length: number;[index: number]: T; }, scheduler?: IScheduler): Observable; 472 | 473 | /** 474 | * Converts an iterable into an Observable sequence 475 | * 476 | * @example 477 | * var res = Rx.Observable.fromIterable(new Map()); 478 | * var res = Rx.Observable.fromIterable(function* () { yield 42; }); 479 | * var res = Rx.Observable.fromIterable(new Set(), Rx.Scheduler.timeout); 480 | * @param generator Generator to convert from. 481 | * @param [scheduler] Scheduler to run the enumeration of the input sequence on. 482 | * @returns The observable sequence whose elements are pulled from the given generator sequence. 483 | */ 484 | fromIterable(generator: () => { next(): { done: boolean; value?: T; }; }, scheduler?: IScheduler): Observable; 485 | 486 | /** 487 | * Converts an iterable into an Observable sequence 488 | * 489 | * @example 490 | * var res = Rx.Observable.fromIterable(new Map()); 491 | * var res = Rx.Observable.fromIterable(new Set(), Rx.Scheduler.timeout); 492 | * @param iterable Iterable to convert from. 493 | * @param [scheduler] Scheduler to run the enumeration of the input sequence on. 494 | * @returns The observable sequence whose elements are pulled from the given generator sequence. 495 | */ 496 | fromIterable(iterable: {}, scheduler?: IScheduler): Observable; // todo: can't describe ES6 Iterable via TypeScript type system 497 | generate(initialState: TState, condition: (state: TState) => boolean, iterate: (state: TState) => TState, resultSelector: (state: TState) => TResult, scheduler?: IScheduler): Observable; 498 | never(): Observable; 499 | 500 | /** 501 | * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. 502 | * 503 | * @example 504 | * var res = Rx.Observable.of(1, 2, 3); 505 | * @since 2.2.28 506 | * @returns The observable sequence whose elements are pulled from the given arguments. 507 | */ 508 | of(...values: T[]): Observable; 509 | 510 | /** 511 | * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. 512 | * @example 513 | * var res = Rx.Observable.ofWithScheduler(Rx.Scheduler.timeout, 1, 2, 3); 514 | * @since 2.2.28 515 | * @param [scheduler] A scheduler to use for scheduling the arguments. 516 | * @returns The observable sequence whose elements are pulled from the given arguments. 517 | */ 518 | ofWithScheduler(scheduler?: IScheduler, ...values: T[]): Observable; 519 | range(start: number, count: number, scheduler?: IScheduler): Observable; 520 | repeat(value: T, repeatCount?: number, scheduler?: IScheduler): Observable; 521 | return(value: T, scheduler?: IScheduler): Observable; 522 | /** 523 | * @since 2.2.28 524 | */ 525 | just(value: T, scheduler?: IScheduler): Observable; // alias for return 526 | returnValue(value: T, scheduler?: IScheduler): Observable; // alias for return 527 | throw(exception: Error, scheduler?: IScheduler): Observable; 528 | throw(exception: any, scheduler?: IScheduler): Observable; 529 | throwException(exception: Error, scheduler?: IScheduler): Observable; // alias for throw 530 | throwException(exception: any, scheduler?: IScheduler): Observable; // alias for throw 531 | throwError(error: Error, scheduler?: IScheduler): Observable; // alias for throw 532 | throwError(error: any, scheduler?: IScheduler): Observable; // alias for throw 533 | 534 | catch(sources: Observable[]): Observable; 535 | catch(sources: IPromise[]): Observable; 536 | catchException(sources: Observable[]): Observable; // alias for catch 537 | catchException(sources: IPromise[]): Observable; // alias for catch 538 | catchError(sources: Observable[]): Observable; // alias for catch 539 | catchError(sources: IPromise[]): Observable; // alias for catch 540 | catch(...sources: Observable[]): Observable; 541 | catch(...sources: IPromise[]): Observable; 542 | catchException(...sources: Observable[]): Observable; // alias for catch 543 | catchException(...sources: IPromise[]): Observable; // alias for catch 544 | catchError(...sources: Observable[]): Observable; // alias for catch 545 | catchError(...sources: IPromise[]): Observable; // alias for catch 546 | 547 | combineLatest(first: Observable, second: Observable, resultSelector: (v1: T, v2: T2) => TResult): Observable; 548 | combineLatest(first: IPromise, second: Observable, resultSelector: (v1: T, v2: T2) => TResult): Observable; 549 | combineLatest(first: Observable, second: IPromise, resultSelector: (v1: T, v2: T2) => TResult): Observable; 550 | combineLatest(first: IPromise, second: IPromise, resultSelector: (v1: T, v2: T2) => TResult): Observable; 551 | combineLatest(first: Observable, second: Observable, third: Observable, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 552 | combineLatest(first: Observable, second: Observable, third: IPromise, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 553 | combineLatest(first: Observable, second: IPromise, third: Observable, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 554 | combineLatest(first: Observable, second: IPromise, third: IPromise, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 555 | combineLatest(first: IPromise, second: Observable, third: Observable, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 556 | combineLatest(first: IPromise, second: Observable, third: IPromise, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 557 | combineLatest(first: IPromise, second: IPromise, third: Observable, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 558 | combineLatest(first: IPromise, second: IPromise, third: IPromise, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable; 559 | combineLatest(first: Observable, second: Observable, third: Observable, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 560 | combineLatest(first: Observable, second: Observable, third: Observable, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 561 | combineLatest(first: Observable, second: Observable, third: IPromise, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 562 | combineLatest(first: Observable, second: Observable, third: IPromise, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 563 | combineLatest(first: Observable, second: IPromise, third: Observable, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 564 | combineLatest(first: Observable, second: IPromise, third: Observable, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 565 | combineLatest(first: Observable, second: IPromise, third: IPromise, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 566 | combineLatest(first: Observable, second: IPromise, third: IPromise, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 567 | combineLatest(first: IPromise, second: Observable, third: Observable, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 568 | combineLatest(first: IPromise, second: Observable, third: Observable, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 569 | combineLatest(first: IPromise, second: Observable, third: IPromise, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 570 | combineLatest(first: IPromise, second: Observable, third: IPromise, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 571 | combineLatest(first: IPromise, second: IPromise, third: Observable, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 572 | combineLatest(first: IPromise, second: IPromise, third: Observable, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 573 | combineLatest(first: IPromise, second: IPromise, third: IPromise, fourth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 574 | combineLatest(first: IPromise, second: IPromise, third: IPromise, fourth: IPromise, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable; 575 | combineLatest(first: Observable, second: Observable, third: Observable, fourth: Observable, fifth: Observable, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable; 576 | combineLatest(souces: Observable[], resultSelector: (...otherValues: TOther[]) => TResult): Observable; 577 | combineLatest(souces: IPromise[], resultSelector: (...otherValues: TOther[]) => TResult): Observable; 578 | 579 | concat(...sources: Observable[]): Observable; 580 | concat(...sources: IPromise[]): Observable; 581 | concat(sources: Observable[]): Observable; 582 | concat(sources: IPromise[]): Observable; 583 | merge(...sources: Observable[]): Observable; 584 | merge(...sources: IPromise[]): Observable; 585 | merge(sources: Observable[]): Observable; 586 | merge(sources: IPromise[]): Observable; 587 | merge(scheduler: IScheduler, ...sources: Observable[]): Observable; 588 | merge(scheduler: IScheduler, ...sources: IPromise[]): Observable; 589 | merge(scheduler: IScheduler, sources: Observable[]): Observable; 590 | merge(scheduler: IScheduler, sources: IPromise[]): Observable; 591 | 592 | pairs(obj: { [key: string]: T }, scheduler?: IScheduler): Observable<[string, T]>; 593 | 594 | zip(first: Observable, sources: Observable[], resultSelector: (item1: T1, ...right: T2[]) => TResult): Observable; 595 | zip(first: Observable, sources: IPromise[], resultSelector: (item1: T1, ...right: T2[]) => TResult): Observable; 596 | zip(source1: Observable, source2: Observable, resultSelector: (item1: T1, item2: T2) => TResult): Observable; 597 | zip(source1: Observable, source2: IPromise, resultSelector: (item1: T1, item2: T2) => TResult): Observable; 598 | zip(source1: Observable, source2: Observable, source3: Observable, resultSelector: (item1: T1, item2: T2, item3: T3) => TResult): Observable; 599 | zip(source1: Observable, source2: Observable, source3: IPromise, resultSelector: (item1: T1, item2: T2, item3: T3) => TResult): Observable; 600 | zip(source1: Observable, source2: IPromise, source3: Observable, resultSelector: (item1: T1, item2: T2, item3: T3) => TResult): Observable; 601 | zip(source1: Observable, source2: IPromise, source3: IPromise, resultSelector: (item1: T1, item2: T2, item3: T3) => TResult): Observable; 602 | zip(source1: Observable, source2: Observable, source3: Observable, source4: Observable, resultSelector: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable; 603 | zip(source1: Observable, source2: Observable, source3: Observable, source4: IPromise, resultSelector: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable; 604 | zip(source1: Observable, source2: Observable, source3: IPromise, source4: Observable, resultSelector: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable; 605 | zip(source1: Observable, source2: Observable, source3: IPromise, source4: IPromise, resultSelector: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable; 606 | zip(source1: Observable, source2: IPromise, source3: Observable, source4: Observable, resultSelector: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable; 607 | zip(source1: Observable, source2: IPromise, source3: Observable, source4: IPromise, resultSelector: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable; 608 | zip(source1: Observable, source2: IPromise, source3: IPromise, source4: Observable, resultSelector: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable; 609 | zip(source1: Observable, source2: IPromise, source3: IPromise, source4: IPromise, resultSelector: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable; 610 | zip(source1: Observable, source2: Observable, source3: Observable, source4: Observable, source5: Observable, resultSelector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TResult): Observable; 611 | zipArray(...sources: Observable[]): Observable; 612 | zipArray(sources: Observable[]): Observable; 613 | 614 | /** 615 | * Converts a Promise to an Observable sequence 616 | * @param promise An ES6 Compliant promise. 617 | * @returns An Observable sequence which wraps the existing promise success and failure. 618 | */ 619 | fromPromise(promise: IPromise): Observable; 620 | } 621 | 622 | export var Observable: ObservableStatic; 623 | 624 | interface ISubject extends Observable, Observer, IDisposable { 625 | hasObservers(): boolean; 626 | } 627 | 628 | export interface Subject extends ISubject { 629 | } 630 | 631 | interface SubjectStatic { 632 | new (): Subject; 633 | create(observer?: Observer, observable?: Observable): ISubject; 634 | } 635 | 636 | export var Subject: SubjectStatic; 637 | 638 | export interface AsyncSubject extends Subject { 639 | } 640 | 641 | interface AsyncSubjectStatic { 642 | new (): AsyncSubject; 643 | } 644 | 645 | export var AsyncSubject: AsyncSubjectStatic; 646 | } 647 | -------------------------------------------------------------------------------- /typings/rx/rx.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for RxJS v2.2.28 2 | // Project: http://rx.codeplex.com/ 3 | // Definitions by: gsino , Igor Oleinikov 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | /// 7 | 8 | declare module Rx { 9 | export interface IScheduler { 10 | catch(handler: (exception: any) => boolean): IScheduler; 11 | catchException(handler: (exception: any) => boolean): IScheduler; 12 | } 13 | 14 | // Observer 15 | export interface Observer { 16 | checked(): Observer; 17 | } 18 | 19 | interface ObserverStatic { 20 | /** 21 | * Schedules the invocation of observer methods on the given scheduler. 22 | * @param scheduler Scheduler to schedule observer messages on. 23 | * @returns Observer whose messages are scheduled on the given scheduler. 24 | */ 25 | notifyOn(scheduler: IScheduler): Observer; 26 | } 27 | 28 | export interface Observable { 29 | observeOn(scheduler: IScheduler): Observable; 30 | subscribeOn(scheduler: IScheduler): Observable; 31 | 32 | amb(rightSource: Observable): Observable; 33 | amb(rightSource: IPromise): Observable; 34 | onErrorResumeNext(second: Observable): Observable; 35 | onErrorResumeNext(second: IPromise): Observable; 36 | bufferWithCount(count: number, skip?: number): Observable; 37 | windowWithCount(count: number, skip?: number): Observable>; 38 | defaultIfEmpty(defaultValue?: T): Observable; 39 | distinct(skipParameter: boolean, valueSerializer: (value: T) => string): Observable; 40 | distinct(keySelector?: (value: T) => TKey, keySerializer?: (key: TKey) => string): Observable; 41 | groupBy(keySelector: (value: T) => TKey, skipElementSelector?: boolean, keySerializer?: (key: TKey) => string): Observable>; 42 | groupBy(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, keySerializer?: (key: TKey) => string): Observable>; 43 | groupByUntil(keySelector: (value: T) => TKey, skipElementSelector: boolean, durationSelector: (group: GroupedObservable) => Observable, keySerializer?: (key: TKey) => string): Observable>; 44 | groupByUntil(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, durationSelector: (group: GroupedObservable) => Observable, keySerializer?: (key: TKey) => string): Observable>; 45 | } 46 | 47 | interface ObservableStatic { 48 | using(resourceFactory: () => TResource, observableFactory: (resource: TResource) => Observable): Observable; 49 | amb(...sources: Observable[]): Observable; 50 | amb(...sources: IPromise[]): Observable; 51 | amb(sources: Observable[]): Observable; 52 | amb(sources: IPromise[]): Observable; 53 | onErrorResumeNext(...sources: Observable[]): Observable; 54 | onErrorResumeNext(...sources: IPromise[]): Observable; 55 | onErrorResumeNext(sources: Observable[]): Observable; 56 | onErrorResumeNext(sources: IPromise[]): Observable; 57 | } 58 | 59 | interface GroupedObservable extends Observable { 60 | key: TKey; 61 | underlyingObservable: Observable; 62 | } 63 | } 64 | 65 | declare module "rx" { 66 | export = Rx 67 | } 68 | --------------------------------------------------------------------------------