diff --git a/app/app.js b/app/app.js
index e44f010..f98f884 100644
--- a/app/app.js
+++ b/app/app.js
@@ -4,6 +4,8 @@ var React = require('react'),
ReactDOM = require('react-dom'),
App = require('./components/app'),
Dashboard = require('./components/dashboard'),
+ ProjectView = require('./components/projects/view'),
+ BuildView = require('./components/builds/view'),
connect = require('./connect'),
resources = require('./resources'),
Router = require('react-router');
@@ -17,18 +19,13 @@ var routes = (
name: 'dashboard',
path: '/',
handler: Dashboard
- })
- //Route({
- //name: 'project',
- //path: 'projects/:name',
- //handler: Components.Project.View
- //}),
- //Route({name: 'build', path: 'builds/:id', handler: Components.Build.View}),
- //Route({
- //name: 'buildLog',
- //path: 'builds/:buildId/log',
- //handler: Components.BuildLog
- //})
+ }),
+ Route({
+ name: 'project',
+ path: 'projects/:name',
+ handler: ProjectView
+ }),
+ Route({name: 'build', path: 'builds/:id', handler: BuildView})
)
);
diff --git a/app/components/app/index.js b/app/components/app/index.js
index 8832c34..e17d273 100644
--- a/app/components/app/index.js
+++ b/app/components/app/index.js
@@ -9,6 +9,7 @@ var React = require('react'),
var Component = React.createClass({
componentDidMount: function() {
console.log('read all projects in component');
+ console.log(ProjectActions);
ProjectActions.readAll();
},
render: function() {
diff --git a/static/js/app/components/builds/view.jade b/app/components/builds/view/index.jade
similarity index 100%
rename from static/js/app/components/builds/view.jade
rename to app/components/builds/view/index.jade
diff --git a/app/components/builds/view/index.js b/app/components/builds/view/index.js
new file mode 100644
index 0000000..13a7928
--- /dev/null
+++ b/app/components/builds/view/index.js
@@ -0,0 +1,51 @@
+'use strict';
+
+var _ = require('underscore'),
+ React = require('react'),
+ Router = require('react-router'),
+ Reflux = require('reflux'),
+ ProjectActions = require('../../../actions/project'),
+ BuildActions = require('../../../actions/build'),
+ buildStore = require('../../../stores/build'),
+ Terminal = require('../../terminal'),
+ BuildSidebar = require('./sidebar'),
+ CommonComponents = require('../../common'),
+ template = require('./index.jade');
+
+var Component = React.createClass({
+ mixins: [Reflux.ListenerMixin],
+ statics: {
+ willTransitionTo: function(transition, params, query) {
+ BuildActions.read(Number(params.id));
+ }
+ },
+ componentDidMount: function() {
+ this.listenTo(buildStore, this.updateBuild);
+ },
+ updateBuild: function(build) {
+ if (build) {
+ BuildActions.readAll({projectName: build.project.name});
+ }
+ this.setState({build: build});
+ },
+ render: template.locals(_({
+ Terminal: Terminal,
+ Link: Router.Link,
+ BuildSidebar: BuildSidebar
+ }).extend(CommonComponents)),
+ getInitialState: function() {
+ return {
+ build: null,
+ showConsole: false
+ };
+ },
+ toggleConsole: function() {
+ var consoleState = !this.state.showConsole;
+ if (consoleState) {
+ BuildActions.readTerminalOutput(this.state.build);
+ }
+ this.setState({showConsole: consoleState});
+ }
+});
+
+module.exports = Component;
diff --git a/static/js/app/components/buildSidebar/index.jade b/app/components/builds/view/sidebar/index.jade
similarity index 100%
rename from static/js/app/components/buildSidebar/index.jade
rename to app/components/builds/view/sidebar/index.jade
diff --git a/app/components/builds/view/sidebar/index.js b/app/components/builds/view/sidebar/index.js
new file mode 100644
index 0000000..7a83800
--- /dev/null
+++ b/app/components/builds/view/sidebar/index.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var _ = require('underscore'),
+ React = require('react'),
+ Reflux = require('reflux'),
+ Router = require('react-router'),
+ buildsStore = require('../../../../stores/builds'),
+ template = require('./index.jade'),
+ CommonComponents = require('../../../common');
+
+module.exports = React.createClass({
+ mixins: [
+ Reflux.connectFilter(buildsStore, 'items', function(items) {
+ var projectName = this.props.projectName;
+ if (projectName) {
+ return _(items).filter(function(item) {
+ return item.project && item.project.name === projectName;
+ });
+ } else {
+ return items;
+ }
+ })
+ ],
+ render: template.locals(_({
+ Link: Router.Link
+ }).extend(CommonComponents))
+});
diff --git a/app/components/header/index.js b/app/components/header/index.js
index 72bea9a..8c2afe8 100644
--- a/app/components/header/index.js
+++ b/app/components/header/index.js
@@ -2,7 +2,7 @@
var React = require('react'),
Router = require('react-router'),
- ProjectsSelector = require('../projects-selector'),
+ ProjectsSelector = require('../projects/selector'),
template = require('./index.jade');
var Component = React.createClass({
diff --git a/app/components/projects-selector/index.jade b/app/components/projects/selector/index.jade
similarity index 100%
rename from app/components/projects-selector/index.jade
rename to app/components/projects/selector/index.jade
diff --git a/app/components/projects-selector/index.js b/app/components/projects/selector/index.js
similarity index 89%
rename from app/components/projects-selector/index.js
rename to app/components/projects/selector/index.js
index c32ad33..d971fa7 100644
--- a/app/components/projects-selector/index.js
+++ b/app/components/projects/selector/index.js
@@ -4,10 +4,10 @@ var React = require('react'),
ReactDOM = require('react-dom'),
Router = require('react-router'),
Reflux = require('reflux'),
- ProjectActions = require('../../actions/project'),
- projectsStore = require('../../stores/project'),
+ ProjectActions = require('../../../actions/project'),
+ projectsStore = require('../../../stores/projects'),
template = require('./index.jade'),
- Scm = require('../common/scm');
+ Scm = require('../../common/scm');
module.exports = React.createClass({
mixins: [Reflux.ListenerMixin, Router.Navigation],
diff --git a/static/js/app/components/projects/view/index.jade b/app/components/projects/view/index.jade
similarity index 100%
rename from static/js/app/components/projects/view/index.jade
rename to app/components/projects/view/index.jade
diff --git a/app/components/projects/view/index.js b/app/components/projects/view/index.js
new file mode 100644
index 0000000..72b9390
--- /dev/null
+++ b/app/components/projects/view/index.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var _ = require('underscore'),
+ React = require('react'),
+ Reflux = require('reflux'),
+ ProjectActions = require('../../../actions/project'),
+ BuildActions = require('../../../actions/build'),
+ projectStore = require('../../../stores/project'),
+ Builds = require('../../builds/list'),
+ CommonComponents = require('../../common'),
+ template = require('./index.jade');
+
+module.exports = React.createClass({
+ mixins: [
+ Reflux.connectFilter(projectStore, 'project', function(project) {
+ if (project.name === this.props.params.name) {
+ return project;
+ } else {
+ if (this.state) {
+ return this.state.project;
+ } else {
+ return projectStore.getInitialState();
+ }
+ }
+ })
+ ],
+ statics: {
+ willTransitionTo: function(transition, params, query) {
+ ProjectActions.read({name: params.name});
+ BuildActions.readAll({projectName: params.name});
+ }
+ },
+ onBuildProject: function() {
+ if (this.state.project.name) {
+ console.log(this.state.project.name);
+ ProjectActions.run(this.state.project.name);
+ }
+ },
+ render: template.locals(
+ _({Builds: Builds}).extend(CommonComponents)
+ )
+});
diff --git a/static/js/app/components/terminal/terminal.jade b/app/components/terminal/index.jade
similarity index 100%
rename from static/js/app/components/terminal/terminal.jade
rename to app/components/terminal/index.jade
diff --git a/app/components/terminal/index.js b/app/components/terminal/index.js
new file mode 100644
index 0000000..9e65a1a
--- /dev/null
+++ b/app/components/terminal/index.js
@@ -0,0 +1,100 @@
+'use strict';
+
+var _ = require('underscore'),
+ React = require('react'),
+ Reflux = require('reflux'),
+ terminalStore = require('../../stores/terminal'),
+ ansiUp = require('ansi_up'),
+ template = require('./index.jade');
+
+var Component = React.createClass({
+ mixins: [Reflux.ListenerMixin],
+
+ shouldScrollBottom: true,
+ data: [],
+ linesCount: 0,
+
+ componentDidMount: function() {
+ this.listenTo(terminalStore, this.updateItems);
+ var node = document.getElementsByClassName('terminal')[0];
+ this.initialScrollPosition = node.getBoundingClientRect().top;
+
+ window.onscroll = this.onScroll;
+ },
+ componentWillUnmount: function() {
+ window.onscroll = null;
+ },
+ prepareRow: function(row) {
+ return ansiUp.ansi_to_html(row.replace('\r', ''));
+ },
+ prepareOutput: function(output) {
+ var self = this;
+ return output.map(function(row) {
+ return self.prepareRow(row);
+ });
+ },
+ getTerminal: function() {
+ return document.getElementsByClassName('terminal')[0];
+ },
+ getBody: function() {
+ return document.getElementsByTagName('body')[0];
+ },
+ onScroll: function() {
+ var node = this.getTerminal(),
+ body = this.getBody();
+
+ this.shouldScrollBottom = window.innerHeight + body.scrollTop >=
+ node.offsetHeight + this.initialScrollPosition;
+ },
+ ensureScrollPosition: function() {
+ if (this.shouldScrollBottom) {
+ var node = this.getTerminal(),
+ body = this.getBody();
+
+ body.scrollTop = this.initialScrollPosition + node.offsetHeight;
+ }
+ },
+ makeCodeLineContent: function(line) {
+ return '' + '' +
+ '
' + this.prepareRow(line) + '
';
+ },
+ makeCodeLine: function(line, index) {
+ return '' +
+ this.makeCodeLineContent(line) + '
';
+ },
+ renderBuffer: _.throttle(function() {
+ var data = this.data,
+ currentLinesCount = data.length,
+ terminal = document.getElementsByClassName('terminal_code')[0],
+ rows = terminal.childNodes;
+
+ if (rows.length) {
+ // replace our last node
+ var index = this.linesCount - 1;
+ rows[index].innerHTML = this.makeCodeLineContent(data[index]);
+ }
+
+ var self = this;
+ terminal.insertAdjacentHTML('beforeend',
+ _(data.slice(this.linesCount)).map(function(line, index) {
+ return self.makeCodeLine(line, self.linesCount + index);
+ }).join('')
+ );
+
+ this.linesCount = currentLinesCount;
+ this.ensureScrollPosition();
+ }, 100),
+ updateItems: function(build) {
+ // listen just our console update
+ if (build.buildId === this.props.build) {
+ this.data = build.data;
+ this.renderBuffer();
+ }
+ },
+ shouldComponentUpdate: function() {
+ return false;
+ },
+ render: template
+});
+
+module.exports = Component;
diff --git a/app/stores/projects.js b/app/stores/projects.js
index db4d095..3a5e31b 100644
--- a/app/stores/projects.js
+++ b/app/stores/projects.js
@@ -4,6 +4,7 @@ var Reflux = require('reflux'),
ProjectActions = require('../actions/project'),
resource = require('../resources').projects;
+console.log('resource', resource);
var Store = Reflux.createStore({
listenables: ProjectActions,
onRun: function(projectName) {
@@ -12,6 +13,7 @@ var Store = Reflux.createStore({
});
},
onReadAll: function(params) {
+ console.log('on read all in store');
var self = this;
resource.sync('readAll', params, function(err, projects) {
if (err) throw err;
diff --git a/app/stores/terminal.js b/app/stores/terminal.js
index bd5c659..a7afca1 100644
--- a/app/stores/terminal.js
+++ b/app/stores/terminal.js
@@ -3,7 +3,7 @@
var _ = require('underscore'),
Reflux = require('reflux'),
BuildActions = require('../actions/build'),
- connect = require('app/connect');
+ connect = require('../connect').data;
var Store = Reflux.createStore({
listenables: BuildActions,
diff --git a/lib/utils.js b/lib/utils.js
index 352db2d..3a47012 100644
--- a/lib/utils.js
+++ b/lib/utils.js
@@ -1,7 +1,7 @@
'use strict';
var _ = require('underscore'),
- sharedUtils = require('../static/js/shared/utils');
+ sharedUtils = require('../app/utils');
_(exports).extend(sharedUtils);
diff --git a/package.json b/package.json
index 68af5f3..43e7225 100644
--- a/package.json
+++ b/package.json
@@ -9,8 +9,8 @@
"makeTestRepos": "rm -rf test/repos/{mercurial,git}; cd test/repos/ && tar -xf mercurial.tar.gz && tar -xf git.tar.gz",
"test": "npm run makeTestRepos && mocha --bail --reporter=spec --timeout 4000",
"watchLess": "catw -c 'lessc static/css/index.less' 'static/css/**/*.less' > static/css/index.css",
- "watchJs": "watchify app/app.js -t react-jade -o static/js/app.build.js -dv",
- "dev": "npm run watchJs & nodemon app.js",
+ "watchJs": "watchify app/app.js -t ./transforms/jade.js -o static/js/app.build.js -dv",
+ "dev": "npm run watchLess & npm run watchJs & nodemon app.js",
"sync": "npm install && npm prune && bower install && bower prune",
"buildJs": "r.js -o static/js/requirejs/buid.js",
"buildClean": "rm static/index.html",
@@ -44,13 +44,22 @@
},
"homepage": "https://github.com/node-ci/nci",
"dependencies": {
+ "ansi_up": "^1.3.0",
+ "bootstrap": "^3.3.6",
+ "browserify": "^12.0.1",
"chokidar": "1.0.3",
"colors": "1.1.2",
"cron": "1.0.9",
"data.io": "0.3.0",
+ "font-awesome": "^4.5.0",
+ "history": "^1.13.1",
"moment": "^2.10.6",
"nlevel": "1.0.3",
"node-static": "0.7.6",
+ "react-dom": "^0.14.3",
+ "react-jade": "^2.5.0",
+ "react-router": "^0.13.5",
+ "reflux": "^0.3.0",
"socket.io": "1.3.5",
"socket.io-client": "^1.3.7",
"through": "2.3.6",
@@ -58,20 +67,16 @@
"underscore": "1.8.3"
},
"devDependencies": {
- "bower": "1.4.1",
"catw": "^1.0.1",
"expect.js": "0.3.1",
- "gulp": "3.8.11",
- "gulp-less": "3.0.3",
- "gulp-nodemon": "2.0.3",
"jade": "1.11.0",
- "main-bower-files": "2.7.0",
+ "jshint": "^2.9.1-rc1",
"memdown": "1.1.0",
"mocha": "1.18.2",
"nci-yaml-reader": "0.1.0",
"nodemon": "1.3.7",
"nrun": "0.1.4",
- "requirejs": "2.1.19",
- "sinon": "1.14.1"
+ "sinon": "1.14.1",
+ "watchify": "^3.6.1"
}
}
diff --git a/static/css/index.less b/static/css/index.less
index b52f0c8..7b4505e 100644
--- a/static/css/index.less
+++ b/static/css/index.less
@@ -1,15 +1,15 @@
/*@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,700&subset=latin,cyrillic-ext);*/
-@bowerPath: "../js/libs";
+@libPath: "../../node_modules";
// bootstrap
-@import "@{bowerPath}/bootstrap/less/bootstrap.less";
+@import "@{libPath}/bootstrap/less/bootstrap.less";
/*//flatly*/
@import "./sources/common/variables-flatly.less";
//font-awesome
-@import "@{bowerPath}/font-awesome/less/font-awesome.less";
+@import "@{libPath}/font-awesome/less/font-awesome.less";
//variables
@import "./sources/common/variables.less";
diff --git a/static/js/app.build.js b/static/js/app.build.js
index 71765a4..e69de29 100644
--- a/static/js/app.build.js
+++ b/static/js/app.build.js
@@ -1,36399 +0,0 @@
-(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o>>> builds = ", JSON.stringify(this.state.items).length, this.state.items);
- tags.push(function() {
- var tags = [];
- var $$obj = this.state.items;
- if ("number" == typeof $$obj.length) for (var index = 0, $$l = $$obj.length; $$l > index; index++) {
- var build = $$obj[index];
- tags.push(React.createElement(Item, {
- build: build,
- key: build.id
- }));
- } else {
- var $$l = 0;
- for (var index in $$obj) {
- $$l++;
- var build = $$obj[index];
- tags.push(React.createElement(Item, {
- build: build,
- key: build.id
- }));
- }
- }
- return tags;
- }.call(this));
- return tags;
- }.call(this))));
- }).call(this, "Item" in locals_for_with ? locals_for_with.Item : typeof Item !== "undefined" ? Item : undefined, "JSON" in locals_for_with ? locals_for_with.JSON : typeof JSON !== "undefined" ? JSON : undefined, "console" in locals_for_with ? locals_for_with.console : typeof console !== "undefined" ? console : undefined);
- if (tags.length === 1 && !Array.isArray(tags[0])) {
- return tags.pop();
- }
- tags.unshift("div", null);
- return React.createElement.apply(React, tags);
- };
-
- fn.locals = function setLocals(locals) {
- var render = this;
- function newRender(additionalLocals) {
- var newLocals = {};
- for (var key in locals) {
- newLocals[key] = locals[key];
- }
- if (additionalLocals) {
- for (var key in additionalLocals) {
- newLocals[key] = additionalLocals[key];
- }
- }
- return render.call(this, newLocals);
- }
- newRender.locals = setLocals;
- return newRender;
- };;
- return fn;
-}(React))
-},{"react":230}],9:[function(require,module,exports){
-'use strict';
-
-var _ = require('underscore'),
- React = require('react'),
- Reflux = require('reflux'),
- Item = require('../item'),
- buildsStore = require('../../../stores/builds'),
- template = require('./index.jade');
-
-var Component = React.createClass({
- mixins: [
- Reflux.connectFilter(buildsStore, 'items', function(items) {
- var projectName = this.props.projectName;
- if (projectName) {
- return _(items).filter(function(item) {
- return item.project && item.project.name === projectName;
- });
- } else {
- return items;
- }
- })
- ],
- render: template.locals({
- Item: Item
- })
-});
-
-module.exports = Component;
-
-},{"../../../stores/builds":27,"../item":7,"./index.jade":8,"react":230,"reflux":247,"underscore":298}],10:[function(require,module,exports){
-'use strict';
-
-var React = require('react'),
- template = require('./template.jade'),
- moment = require('moment');
-
-var Component = React.createClass({
- render: template.locals({
- moment: moment
- })
-});
-
-module.exports = Component;
-
-},{"./template.jade":11,"moment":31,"react":230}],11:[function(require,module,exports){
-var React = require("react");
-module.exports = (function (React) {
- var fn = function(locals) {
- var tags = [];
- var locals_for_with = locals || {};
- (function(moment) {
- var date = moment(this.props.value);
- tags.push(React.createElement("span", {
- title: date.format("YYYY-MM-DD HH:mm:ss")
- }, date.fromNow()));
- }).call(this, "moment" in locals_for_with ? locals_for_with.moment : typeof moment !== "undefined" ? moment : undefined);
- if (tags.length === 1 && !Array.isArray(tags[0])) {
- return tags.pop();
- }
- tags.unshift("div", null);
- return React.createElement.apply(React, tags);
- };
-
- fn.locals = function setLocals(locals) {
- var render = this;
- function newRender(additionalLocals) {
- var newLocals = {};
- for (var key in locals) {
- newLocals[key] = locals[key];
- }
- if (additionalLocals) {
- for (var key in additionalLocals) {
- newLocals[key] = additionalLocals[key];
- }
- }
- return render.call(this, newLocals);
- }
- newRender.locals = setLocals;
- return newRender;
- };;
- return fn;
-}(React))
-},{"react":230}],12:[function(require,module,exports){
-var React = require("react");
-module.exports = (function (React) {
- var fn = function(locals) {
- var tags = [];
- var locals_for_with = locals || {};
- (function(Math) {
- var sec = this.props.value / 1e3;
- sec = sec >= 1 ? Math.round(sec) : +sec.toFixed(2);
- var min = sec >= 60 ? Math.round(sec / 60) : 0;
- var suffix = this.props.withSuffix ? "in " : "";
- var ending = 1 === min ? "" : "s";
- var title = this.props.title || sec + " second" + ending;
- tags.push(React.createElement("span", {
- title: title
- }, suffix + (min ? min + " minunte" : sec + " second") + ending));
- }).call(this, "Math" in locals_for_with ? locals_for_with.Math : typeof Math !== "undefined" ? Math : undefined);
- if (tags.length === 1 && !Array.isArray(tags[0])) {
- return tags.pop();
- }
- tags.unshift("div", null);
- return React.createElement.apply(React, tags);
- };
-
- fn.locals = function setLocals(locals) {
- var render = this;
- function newRender(additionalLocals) {
- var newLocals = {};
- for (var key in locals) {
- newLocals[key] = locals[key];
- }
- if (additionalLocals) {
- for (var key in additionalLocals) {
- newLocals[key] = additionalLocals[key];
- }
- }
- return render.call(this, newLocals);
- }
- newRender.locals = setLocals;
- return newRender;
- };;
- return fn;
-}(React))
-},{"react":230}],13:[function(require,module,exports){
-'use strict';
-
-var React = require('react'),
- template = require('./index.jade'),
- moment = require('moment');
-
-var Component = React.createClass({
- render: template.locals({
- moment: moment
- })
-});
-
-module.exports = Component;
-
-},{"./index.jade":12,"moment":31,"react":230}],14:[function(require,module,exports){
-'use strict';
-
-var DateTime = require('./dateTime'),
- Duration = require('./duration'),
- Progress = require('./progress'),
- Scm = require('./scm');
-
-module.exports = {
- DateTime: DateTime,
- Scm: Scm,
- Duration: Duration,
- Progress: Progress
-};
-
-},{"./dateTime":10,"./duration":13,"./progress":16,"./scm":18}],15:[function(require,module,exports){
-var React = require("react");
-module.exports = (function (React) {
- var fn = function(locals) {
- var tags = [];
- function jade_fix_style(style) {
- return "string" == typeof style ? style.split(";").filter(function(str) {
- return str.split(":").length > 1;
- }).reduce(function(obj, style) {
- obj[style.split(":")[0]] = style.split(":").slice(1).join(":");
- return obj;
- }, {}) : style;
- }
- tags.push(React.createElement("div", {
- className: "progress"
- }, React.createElement("div", {
- style: jade_fix_style({
- width: this.state.percent + "%"
- }),
- className: "progress-bar progress-bar-success"
- })));
- if (tags.length === 1 && !Array.isArray(tags[0])) {
- return tags.pop();
- }
- tags.unshift("div", null);
- return React.createElement.apply(React, tags);
- };
-
- fn.locals = function setLocals(locals) {
- var render = this;
- function newRender(additionalLocals) {
- var newLocals = {};
- for (var key in locals) {
- newLocals[key] = locals[key];
- }
- if (additionalLocals) {
- for (var key in additionalLocals) {
- newLocals[key] = additionalLocals[key];
- }
- }
- return render.call(this, newLocals);
- }
- newRender.locals = setLocals;
- return newRender;
- };;
- return fn;
-}(React))
-},{"react":230}],16:[function(require,module,exports){
-'use strict';
-
-var React = require('react'),
- _ = require('underscore'),
- template = require('./index.jade');
-
-module.exports = React.createClass({
- render: template,
- _computePercent: function() {
- var build = this.props.build;
- return Math.round((Date.now() - build.startDate) /
- build.project.avgBuildDuration * 100);
- },
- componentDidMount: function() {
- var self = this;
- var updateCallback = function() {
- if (self.props.build.status === 'in-progress') {
- if (self.isMounted()) {
- self.setState({percent: self._computePercent()});
- _.delay(updateCallback, 100);
- }
- }
- };
-
- updateCallback();
- },
- getInitialState: function() {
- return {
- percent: this._computePercent()
- };
- }
-});
-
-},{"./index.jade":15,"react":230,"underscore":298}],17:[function(require,module,exports){
-var React = require("react");
-module.exports = (function (React) {
- var fn = function(locals) {
- var tags = [];
- this.props.scm && ("mercurial" === this.props.scm ? tags.push(React.createElement("i", {
- className: "fa fa-fw fa-bitbucket"
- })) : tags.push(React.createElement("i", {
- className: "fa fa-fw fa-github"
- })));
- if (tags.length === 1 && !Array.isArray(tags[0])) {
- return tags.pop();
- }
- tags.unshift("div", null);
- return React.createElement.apply(React, tags);
- };
-
- fn.locals = function setLocals(locals) {
- var render = this;
- function newRender(additionalLocals) {
- var newLocals = {};
- for (var key in locals) {
- newLocals[key] = locals[key];
- }
- if (additionalLocals) {
- for (var key in additionalLocals) {
- newLocals[key] = additionalLocals[key];
- }
- }
- return render.call(this, newLocals);
- }
- newRender.locals = setLocals;
- return newRender;
- };;
- return fn;
-}(React))
-},{"react":230}],18:[function(require,module,exports){
-'use strict';
-
-var React = require('react'),
- template = require('./index.jade');
-
-module.exports = React.createClass({
- render: template
-});
-
-
-},{"./index.jade":17,"react":230}],19:[function(require,module,exports){
-var React = require("react");
-module.exports = (function (React) {
- var fn = function(locals) {
- var tags = [];
- var locals_for_with = locals || {};
- (function(BuildsList) {
- tags.push(React.createElement("div", {
- className: "main-row"
- }, React.createElement("div", {
- className: "row"
- }, React.createElement("div", {
- className: "col-md-8 col-sm-12"
- }, React.createElement("h2", {}, "Builds history"), React.createElement(BuildsList, {})))));
- }).call(this, "BuildsList" in locals_for_with ? locals_for_with.BuildsList : typeof BuildsList !== "undefined" ? BuildsList : undefined);
- if (tags.length === 1 && !Array.isArray(tags[0])) {
- return tags.pop();
- }
- tags.unshift("div", null);
- return React.createElement.apply(React, tags);
- };
-
- fn.locals = function setLocals(locals) {
- var render = this;
- function newRender(additionalLocals) {
- var newLocals = {};
- for (var key in locals) {
- newLocals[key] = locals[key];
- }
- if (additionalLocals) {
- for (var key in additionalLocals) {
- newLocals[key] = additionalLocals[key];
- }
- }
- return render.call(this, newLocals);
- }
- newRender.locals = setLocals;
- return newRender;
- };;
- return fn;
-}(React))
-},{"react":230}],20:[function(require,module,exports){
-'use strict';
-
-var React = require('react'),
- Router = require('react-router'),
- ProjectActions = require('../../actions/project'),
- BuildActions = require('../../actions/build'),
- BuildsList = require('../builds/list'),
- template = require('./index.jade');
-
-module.exports = React.createClass({
- componentWillMount: function() {
- ProjectActions.readAll();
- BuildActions.readAll();
- },
- render: template.locals({
- Link: Router.Link,
- BuildsList: BuildsList
- })
-});
-
-},{"../../actions/build":1,"../../actions/project":2,"../builds/list":9,"./index.jade":19,"react":230,"react-router":57}],21:[function(require,module,exports){
-var React = require("react");
-module.exports = (function (React) {
- var fn = function(locals) {
- var tags = [];
- var locals_for_with = locals || {};
- (function(Link, ProjectsSelector) {
- tags.push(React.createElement("div", {
- className: "navbar navbar-default navbar-fixed-top"
- }, React.createElement("div", {
- className: "container-fluid"
- }, React.createElement("div", {
- className: "navbar-header"
- }, React.createElement(Link, {
- to: "dashboard",
- className: "navbar-brand"
- }, React.createElement("span", {}, "NCI"))), React.createElement("div", {
- className: "collapse navbar-collapse"
- }, React.createElement("div", {
- style: {
- paddingTop: "11px"
- },
- className: "navbar-form navbar-left"
- }, React.createElement(ProjectsSelector, {}))))));
- }).call(this, "Link" in locals_for_with ? locals_for_with.Link : typeof Link !== "undefined" ? Link : undefined, "ProjectsSelector" in locals_for_with ? locals_for_with.ProjectsSelector : typeof ProjectsSelector !== "undefined" ? ProjectsSelector : undefined);
- if (tags.length === 1 && !Array.isArray(tags[0])) {
- return tags.pop();
- }
- tags.unshift("div", null);
- return React.createElement.apply(React, tags);
- };
-
- fn.locals = function setLocals(locals) {
- var render = this;
- function newRender(additionalLocals) {
- var newLocals = {};
- for (var key in locals) {
- newLocals[key] = locals[key];
- }
- if (additionalLocals) {
- for (var key in additionalLocals) {
- newLocals[key] = additionalLocals[key];
- }
- }
- return render.call(this, newLocals);
- }
- newRender.locals = setLocals;
- return newRender;
- };;
- return fn;
-}(React))
-},{"react":230}],22:[function(require,module,exports){
-'use strict';
-
-var React = require('react'),
- Router = require('react-router'),
- ProjectsSelector = require('../projects-selector'),
- template = require('./index.jade');
-
-var Component = React.createClass({
- render: template.locals({
- Link: Router.Link,
- ProjectsSelector: ProjectsSelector
- })
-});
-
-module.exports = Component;
-
-},{"../projects-selector":24,"./index.jade":21,"react":230,"react-router":57}],23:[function(require,module,exports){
-var React = require("react");
-module.exports = (function (React) {
- var fn = function(locals) {
- var tags = [];
- var locals_for_with = locals || {};
- (function(Link, Scm) {
- var jade_interp;
- tags.push(React.createElement.apply(React, [ "div", {
- href: "javascript:void(0);",
- className: "projects-selector"
- } ].concat(function() {
- var tags = [];
- if (this.state.showSearch) {
- tags.push(React.createElement("input", {
- type: "text",
- value: this.state.searchQuery,
- onChange: this.onSearchChange,
- ref: this.onInputMount,
- onBlur: this.onBlurSearch,
- className: "projects-selector_input"
- }));
- tags.push(React.createElement("ul", {
- className: "projects-selector_items"
- }, function() {
- var tags = [];
- var $$obj = this.state.projects;
- if ("number" == typeof $$obj.length) for (var $index = 0, $$l = $$obj.length; $$l > $index; $index++) {
- var project = $$obj[$index];
- tags.push(React.createElement("li", {
- key: project.name,
- className: "projects-selector_item"
- }, React.createElement(Link, {
- to: "project",
- params: {
- name: project.name
- },
- onMouseDown: (jade_interp = this, jade_interp.onSelectProject.bind(jade_interp, project.name)),
- className: "projects-selector_item_link"
- }, React.createElement(Scm, {
- scm: project.scm.type
- }), React.createElement("span", {}, " "), React.createElement("span", {}, project.name)), React.createElement("a", {
- href: "javascript:void(0);",
- onMouseDown: (jade_interp = this, jade_interp.onRunProject.bind(jade_interp, project.name)),
- className: "projects-selector_item_run"
- }, React.createElement("i", {
- className: "fa fa-fw fa-play"
- }))));
- } else {
- var $$l = 0;
- for (var $index in $$obj) {
- $$l++;
- var project = $$obj[$index];
- tags.push(React.createElement("li", {
- key: project.name,
- className: "projects-selector_item"
- }, React.createElement(Link, {
- to: "project",
- params: {
- name: project.name
- },
- onMouseDown: (jade_interp = this, jade_interp.onSelectProject.bind(jade_interp, project.name)),
- className: "projects-selector_item_link"
- }, React.createElement(Scm, {
- scm: project.scm.type
- }), React.createElement("span", {}, " "), React.createElement("span", {}, project.name)), React.createElement("a", {
- href: "javascript:void(0);",
- onMouseDown: (jade_interp = this, jade_interp.onRunProject.bind(jade_interp, project.name)),
- className: "projects-selector_item_run"
- }, React.createElement("i", {
- className: "fa fa-fw fa-play"
- }))));
- }
- }
- return tags;
- }.call(this)));
- } else tags.push(React.createElement("span", {
- onClick: this.onSearchProject,
- className: "projects-selector_preview"
- }, React.createElement("i", {
- className: "fa fa-fw fa-bars"
- }), React.createElement("span", {
- className: "projects-selector_preview_text"
- }, "Select a project...")));
- return tags;
- }.call(this))));
- }).call(this, "Link" in locals_for_with ? locals_for_with.Link : typeof Link !== "undefined" ? Link : undefined, "Scm" in locals_for_with ? locals_for_with.Scm : typeof Scm !== "undefined" ? Scm : undefined);
- if (tags.length === 1 && !Array.isArray(tags[0])) {
- return tags.pop();
- }
- tags.unshift("div", null);
- return React.createElement.apply(React, tags);
- };
-
- fn.locals = function setLocals(locals) {
- var render = this;
- function newRender(additionalLocals) {
- var newLocals = {};
- for (var key in locals) {
- newLocals[key] = locals[key];
- }
- if (additionalLocals) {
- for (var key in additionalLocals) {
- newLocals[key] = additionalLocals[key];
- }
- }
- return render.call(this, newLocals);
- }
- newRender.locals = setLocals;
- return newRender;
- };;
- return fn;
-}(React))
-},{"react":230}],24:[function(require,module,exports){
-'use strict';
-
-var React = require('react'),
- ReactDOM = require('react-dom'),
- Router = require('react-router'),
- Reflux = require('reflux'),
- ProjectActions = require('../../actions/project'),
- projectsStore = require('../../stores/project'),
- template = require('./index.jade'),
- Scm = require('../common/scm');
-
-module.exports = React.createClass({
- mixins: [Reflux.ListenerMixin, Router.Navigation],
- componentDidMount: function() {
- this.listenTo(projectsStore, this.updateItems);
- },
- getInitialState: function() {
- return {
- showSearch: false,
- projects: []
- };
- },
- onRunProject: function(projectName) {
- ProjectActions.run(projectName);
- this.setState({showSearch: false});
- },
- onSelectProject: function(name) {
- this.transitionTo('project', {name: name});
- },
- updateItems: function(projects) {
- this.setState({projects: projects});
- },
- onSearchProject: function() {
- this.setState({showSearch: true});
- },
- onInputMount: function(component) {
- var node = ReactDOM.findDOMNode(component);
- if (node) {
- node.focus();
- }
- },
- onBlurSearch: function() {
- this.setState({showSearch: false});
- },
- onSearchChange: function(event) {
- var query = event.target.value;
- this.setState({searchQuery: query});
- ProjectActions.readAll({nameQuery: query});
- },
- render: template.locals({
- Link: Router.Link,
- Scm: Scm
- })
-});
-
-},{"../../actions/project":2,"../../stores/project":28,"../common/scm":18,"./index.jade":23,"react":230,"react-dom":32,"react-router":57,"reflux":247}],25:[function(require,module,exports){
-'use strict';
-
-var socketio = require('socket.io-client'),
- dataio = require('data.io/data.io'),
- io = socketio(),
- data = dataio(io);
-
-module.exports.io = io;
-module.exports.data = data;
-
-},{"data.io/data.io":30,"socket.io-client":250}],26:[function(require,module,exports){
-'use strict';
-
-var connect = require('./connect'),
- projects = connect.data.resource('projects'),
- builds = connect.data.resource('builds');
-
-module.exports = {
- projects: projects,
- builds: builds
-};
-
-},{"./connect":25}],27:[function(require,module,exports){
-'use strict';
-
-var _ = require('underscore'),
- Reflux = require('reflux'),
- BuildActions = require('../actions/build'),
- resources = require('../resources'),
- resource = resources.builds;
-
-var Store = Reflux.createStore({
- listenables: BuildActions,
- builds: [],
-
- getInitialState: function() {
- return this.builds;
- },
-
- onChanged: function(data) {
- var oldBuild = _(this.builds).findWhere({id: data.buildId});
- if (oldBuild) {
- _(oldBuild).extend(data.changes);
- } else {
- this.builds.unshift(
- _({id: data.buildId}).extend(data.changes)
- );
- }
-
- this.trigger(this.builds);
- },
-
- onCancelled: function(data) {
- // WORKAROUND: client that trigger `onCancel` gets one `onCancelled`
- // call other clients get 2 calls (second with empty data)
- if (!data) {
- return;
- }
- var index = _(this.builds).findIndex({id: data.buildId});
- if (index !== -1) {
- this.builds.splice(index, 1);
- }
-
- this.trigger(this.builds);
- },
-
- init: function() {
- resource.subscribe('change', this.onChanged);
- resource.subscribe('cancel', this.onCancelled);
- },
-
- onReadAll: function(params) {
- var self = this;
- resource.sync('readAll', params, function(err, builds) {
- if (err) throw err;
- self.builds = builds;
- self.trigger(self.builds);
- });
- },
-
- onCancel: function(buildId) {
- resource.sync('cancel', {buildId: buildId}, function(err) {
- if (err) throw err;
- });
- }
-});
-
-module.exports = Store;
-
-
-},{"../actions/build":1,"../resources":26,"reflux":247,"underscore":298}],28:[function(require,module,exports){
-'use strict';
-
-var _ = require('underscore'),
- Reflux = require('reflux'),
- ProjectActions = require('../actions/project'),
- resources = require('../resources'),
- resource = resources.projects;
-
-var Store = Reflux.createStore({
- listenables: ProjectActions,
- project: {},
-
- getInitialState: function() {
- return this.project;
- },
-
- onChange: function(data, action) {
- this.trigger(data.project);
- },
-
- init: function() {
- resource.subscribe('change', this.onChange);
- },
-
- onRead: function(params) {
- var self = this;
- resource.sync('read', params, function(err, project) {
- if (err) throw err;
- self.project = project;
- self.trigger(self.project);
- });
- }
-});
-
-module.exports = Store;
-
-},{"../actions/project":2,"../resources":26,"reflux":247,"underscore":298}],29:[function(require,module,exports){
-'use strict';
-
-var utils = {};
-
-utils.prune = function(str, length) {
- var result = '',
- words = str.split(' ');
-
- do {
- result += words.shift() + ' ';
- } while (words.length && result.length < length);
-
- return result.replace(/ $/, words.length ? '...' : '');
-};
-
-module.exports = utils;
-
-},{}],30:[function(require,module,exports){
-(function(name, root, factory) {
- if (typeof exports === 'object') {
- module.exports = factory();
- } else if (typeof define === 'function' && define.amd) {
- define(factory);
- } else {
- root[name] = factory();
- }
-}('data', this, function() {
-
- function Resource(name, socket) {
- this.name = name;
- this.socket = socket.io.socket('/' + this.name);
- }
-
- Resource.prototype.sync = function(action, data, options, callback) {
- if (callback === undefined) {
- if (options === undefined && typeof data === 'function') {
- callback = data;
- data = {};
- options = {};
- } else if (typeof options === 'function') {
- callback = options;
- options = {};
- }
- }
-
- this.socket.emit('sync', action, data, options, callback);
- };
-
- Resource.prototype.subscribe = function() {
- var args = [].slice.apply(arguments);
- var callback = args.pop();
- var actions = args.length ? args : ['*'];
-
- var valid = function(action) {
- return actions.indexOf(action) !== -1;
- };
-
- this.socket.on('sync', function(action, data) {
- if (valid(action) || valid('*')) {
- callback(data, { action: action });
- }
- });
- };
-
- return function(socket) {
- return {
- resource: function(name) {
- return new Resource(name, socket);
- }
- };
- };
-
-}));
-
-},{}],31:[function(require,module,exports){
-//! moment.js
-//! version : 2.10.6
-//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
-//! license : MIT
-//! momentjs.com
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- global.moment = factory()
-}(this, function () { 'use strict';
-
- var hookCallback;
-
- function utils_hooks__hooks () {
- return hookCallback.apply(null, arguments);
- }
-
- // This is done to register the method called with moment()
- // without creating circular dependencies.
- function setHookCallback (callback) {
- hookCallback = callback;
- }
-
- function isArray(input) {
- return Object.prototype.toString.call(input) === '[object Array]';
- }
-
- function isDate(input) {
- return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
- }
-
- function map(arr, fn) {
- var res = [], i;
- for (i = 0; i < arr.length; ++i) {
- res.push(fn(arr[i], i));
- }
- return res;
- }
-
- function hasOwnProp(a, b) {
- return Object.prototype.hasOwnProperty.call(a, b);
- }
-
- function extend(a, b) {
- for (var i in b) {
- if (hasOwnProp(b, i)) {
- a[i] = b[i];
- }
- }
-
- if (hasOwnProp(b, 'toString')) {
- a.toString = b.toString;
- }
-
- if (hasOwnProp(b, 'valueOf')) {
- a.valueOf = b.valueOf;
- }
-
- return a;
- }
-
- function create_utc__createUTC (input, format, locale, strict) {
- return createLocalOrUTC(input, format, locale, strict, true).utc();
- }
-
- function defaultParsingFlags() {
- // We need to deep clone this object.
- return {
- empty : false,
- unusedTokens : [],
- unusedInput : [],
- overflow : -2,
- charsLeftOver : 0,
- nullInput : false,
- invalidMonth : null,
- invalidFormat : false,
- userInvalidated : false,
- iso : false
- };
- }
-
- function getParsingFlags(m) {
- if (m._pf == null) {
- m._pf = defaultParsingFlags();
- }
- return m._pf;
- }
-
- function valid__isValid(m) {
- if (m._isValid == null) {
- var flags = getParsingFlags(m);
- m._isValid = !isNaN(m._d.getTime()) &&
- flags.overflow < 0 &&
- !flags.empty &&
- !flags.invalidMonth &&
- !flags.invalidWeekday &&
- !flags.nullInput &&
- !flags.invalidFormat &&
- !flags.userInvalidated;
-
- if (m._strict) {
- m._isValid = m._isValid &&
- flags.charsLeftOver === 0 &&
- flags.unusedTokens.length === 0 &&
- flags.bigHour === undefined;
- }
- }
- return m._isValid;
- }
-
- function valid__createInvalid (flags) {
- var m = create_utc__createUTC(NaN);
- if (flags != null) {
- extend(getParsingFlags(m), flags);
- }
- else {
- getParsingFlags(m).userInvalidated = true;
- }
-
- return m;
- }
-
- var momentProperties = utils_hooks__hooks.momentProperties = [];
-
- function copyConfig(to, from) {
- var i, prop, val;
-
- if (typeof from._isAMomentObject !== 'undefined') {
- to._isAMomentObject = from._isAMomentObject;
- }
- if (typeof from._i !== 'undefined') {
- to._i = from._i;
- }
- if (typeof from._f !== 'undefined') {
- to._f = from._f;
- }
- if (typeof from._l !== 'undefined') {
- to._l = from._l;
- }
- if (typeof from._strict !== 'undefined') {
- to._strict = from._strict;
- }
- if (typeof from._tzm !== 'undefined') {
- to._tzm = from._tzm;
- }
- if (typeof from._isUTC !== 'undefined') {
- to._isUTC = from._isUTC;
- }
- if (typeof from._offset !== 'undefined') {
- to._offset = from._offset;
- }
- if (typeof from._pf !== 'undefined') {
- to._pf = getParsingFlags(from);
- }
- if (typeof from._locale !== 'undefined') {
- to._locale = from._locale;
- }
-
- if (momentProperties.length > 0) {
- for (i in momentProperties) {
- prop = momentProperties[i];
- val = from[prop];
- if (typeof val !== 'undefined') {
- to[prop] = val;
- }
- }
- }
-
- return to;
- }
-
- var updateInProgress = false;
-
- // Moment prototype object
- function Moment(config) {
- copyConfig(this, config);
- this._d = new Date(config._d != null ? config._d.getTime() : NaN);
- // Prevent infinite loop in case updateOffset creates new moment
- // objects.
- if (updateInProgress === false) {
- updateInProgress = true;
- utils_hooks__hooks.updateOffset(this);
- updateInProgress = false;
- }
- }
-
- function isMoment (obj) {
- return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
- }
-
- function absFloor (number) {
- if (number < 0) {
- return Math.ceil(number);
- } else {
- return Math.floor(number);
- }
- }
-
- function toInt(argumentForCoercion) {
- var coercedNumber = +argumentForCoercion,
- value = 0;
-
- if (coercedNumber !== 0 && isFinite(coercedNumber)) {
- value = absFloor(coercedNumber);
- }
-
- return value;
- }
-
- function compareArrays(array1, array2, dontConvert) {
- var len = Math.min(array1.length, array2.length),
- lengthDiff = Math.abs(array1.length - array2.length),
- diffs = 0,
- i;
- for (i = 0; i < len; i++) {
- if ((dontConvert && array1[i] !== array2[i]) ||
- (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
- diffs++;
- }
- }
- return diffs + lengthDiff;
- }
-
- function Locale() {
- }
-
- var locales = {};
- var globalLocale;
-
- function normalizeLocale(key) {
- return key ? key.toLowerCase().replace('_', '-') : key;
- }
-
- // pick the locale from the array
- // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
- // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
- function chooseLocale(names) {
- var i = 0, j, next, locale, split;
-
- while (i < names.length) {
- split = normalizeLocale(names[i]).split('-');
- j = split.length;
- next = normalizeLocale(names[i + 1]);
- next = next ? next.split('-') : null;
- while (j > 0) {
- locale = loadLocale(split.slice(0, j).join('-'));
- if (locale) {
- return locale;
- }
- if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
- //the next array item is better than a shallower substring of this one
- break;
- }
- j--;
- }
- i++;
- }
- return null;
- }
-
- function loadLocale(name) {
- var oldLocale = null;
- // TODO: Find a better way to register and load all the locales in Node
- if (!locales[name] && typeof module !== 'undefined' &&
- module && module.exports) {
- try {
- oldLocale = globalLocale._abbr;
- require('./locale/' + name);
- // because defineLocale currently also sets the global locale, we
- // want to undo that for lazy loaded locales
- locale_locales__getSetGlobalLocale(oldLocale);
- } catch (e) { }
- }
- return locales[name];
- }
-
- // This function will load locale and then set the global locale. If
- // no arguments are passed in, it will simply return the current global
- // locale key.
- function locale_locales__getSetGlobalLocale (key, values) {
- var data;
- if (key) {
- if (typeof values === 'undefined') {
- data = locale_locales__getLocale(key);
- }
- else {
- data = defineLocale(key, values);
- }
-
- if (data) {
- // moment.duration._locale = moment._locale = data;
- globalLocale = data;
- }
- }
-
- return globalLocale._abbr;
- }
-
- function defineLocale (name, values) {
- if (values !== null) {
- values.abbr = name;
- locales[name] = locales[name] || new Locale();
- locales[name].set(values);
-
- // backwards compat for now: also set the locale
- locale_locales__getSetGlobalLocale(name);
-
- return locales[name];
- } else {
- // useful for testing
- delete locales[name];
- return null;
- }
- }
-
- // returns locale data
- function locale_locales__getLocale (key) {
- var locale;
-
- if (key && key._locale && key._locale._abbr) {
- key = key._locale._abbr;
- }
-
- if (!key) {
- return globalLocale;
- }
-
- if (!isArray(key)) {
- //short-circuit everything else
- locale = loadLocale(key);
- if (locale) {
- return locale;
- }
- key = [key];
- }
-
- return chooseLocale(key);
- }
-
- var aliases = {};
-
- function addUnitAlias (unit, shorthand) {
- var lowerCase = unit.toLowerCase();
- aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
- }
-
- function normalizeUnits(units) {
- return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
- }
-
- function normalizeObjectUnits(inputObject) {
- var normalizedInput = {},
- normalizedProp,
- prop;
-
- for (prop in inputObject) {
- if (hasOwnProp(inputObject, prop)) {
- normalizedProp = normalizeUnits(prop);
- if (normalizedProp) {
- normalizedInput[normalizedProp] = inputObject[prop];
- }
- }
- }
-
- return normalizedInput;
- }
-
- function makeGetSet (unit, keepTime) {
- return function (value) {
- if (value != null) {
- get_set__set(this, unit, value);
- utils_hooks__hooks.updateOffset(this, keepTime);
- return this;
- } else {
- return get_set__get(this, unit);
- }
- };
- }
-
- function get_set__get (mom, unit) {
- return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();
- }
-
- function get_set__set (mom, unit, value) {
- return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
- }
-
- // MOMENTS
-
- function getSet (units, value) {
- var unit;
- if (typeof units === 'object') {
- for (unit in units) {
- this.set(unit, units[unit]);
- }
- } else {
- units = normalizeUnits(units);
- if (typeof this[units] === 'function') {
- return this[units](value);
- }
- }
- return this;
- }
-
- function zeroFill(number, targetLength, forceSign) {
- var absNumber = '' + Math.abs(number),
- zerosToFill = targetLength - absNumber.length,
- sign = number >= 0;
- return (sign ? (forceSign ? '+' : '') : '-') +
- Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
- }
-
- var formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
-
- var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
-
- var formatFunctions = {};
-
- var formatTokenFunctions = {};
-
- // token: 'M'
- // padded: ['MM', 2]
- // ordinal: 'Mo'
- // callback: function () { this.month() + 1 }
- function addFormatToken (token, padded, ordinal, callback) {
- var func = callback;
- if (typeof callback === 'string') {
- func = function () {
- return this[callback]();
- };
- }
- if (token) {
- formatTokenFunctions[token] = func;
- }
- if (padded) {
- formatTokenFunctions[padded[0]] = function () {
- return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
- };
- }
- if (ordinal) {
- formatTokenFunctions[ordinal] = function () {
- return this.localeData().ordinal(func.apply(this, arguments), token);
- };
- }
- }
-
- function removeFormattingTokens(input) {
- if (input.match(/\[[\s\S]/)) {
- return input.replace(/^\[|\]$/g, '');
- }
- return input.replace(/\\/g, '');
- }
-
- function makeFormatFunction(format) {
- var array = format.match(formattingTokens), i, length;
-
- for (i = 0, length = array.length; i < length; i++) {
- if (formatTokenFunctions[array[i]]) {
- array[i] = formatTokenFunctions[array[i]];
- } else {
- array[i] = removeFormattingTokens(array[i]);
- }
- }
-
- return function (mom) {
- var output = '';
- for (i = 0; i < length; i++) {
- output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
- }
- return output;
- };
- }
-
- // format date using native date object
- function formatMoment(m, format) {
- if (!m.isValid()) {
- return m.localeData().invalidDate();
- }
-
- format = expandFormat(format, m.localeData());
- formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
-
- return formatFunctions[format](m);
- }
-
- function expandFormat(format, locale) {
- var i = 5;
-
- function replaceLongDateFormatTokens(input) {
- return locale.longDateFormat(input) || input;
- }
-
- localFormattingTokens.lastIndex = 0;
- while (i >= 0 && localFormattingTokens.test(format)) {
- format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
- localFormattingTokens.lastIndex = 0;
- i -= 1;
- }
-
- return format;
- }
-
- var match1 = /\d/; // 0 - 9
- var match2 = /\d\d/; // 00 - 99
- var match3 = /\d{3}/; // 000 - 999
- var match4 = /\d{4}/; // 0000 - 9999
- var match6 = /[+-]?\d{6}/; // -999999 - 999999
- var match1to2 = /\d\d?/; // 0 - 99
- var match1to3 = /\d{1,3}/; // 0 - 999
- var match1to4 = /\d{1,4}/; // 0 - 9999
- var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999
-
- var matchUnsigned = /\d+/; // 0 - inf
- var matchSigned = /[+-]?\d+/; // -inf - inf
-
- var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
-
- var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
-
- // any word (or two) characters or numbers including two/three word month in arabic.
- var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
-
- var regexes = {};
-
- function isFunction (sth) {
- // https://github.com/moment/moment/issues/2325
- return typeof sth === 'function' &&
- Object.prototype.toString.call(sth) === '[object Function]';
- }
-
-
- function addRegexToken (token, regex, strictRegex) {
- regexes[token] = isFunction(regex) ? regex : function (isStrict) {
- return (isStrict && strictRegex) ? strictRegex : regex;
- };
- }
-
- function getParseRegexForToken (token, config) {
- if (!hasOwnProp(regexes, token)) {
- return new RegExp(unescapeFormat(token));
- }
-
- return regexes[token](config._strict, config._locale);
- }
-
- // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
- function unescapeFormat(s) {
- return s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
- return p1 || p2 || p3 || p4;
- }).replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
- }
-
- var tokens = {};
-
- function addParseToken (token, callback) {
- var i, func = callback;
- if (typeof token === 'string') {
- token = [token];
- }
- if (typeof callback === 'number') {
- func = function (input, array) {
- array[callback] = toInt(input);
- };
- }
- for (i = 0; i < token.length; i++) {
- tokens[token[i]] = func;
- }
- }
-
- function addWeekParseToken (token, callback) {
- addParseToken(token, function (input, array, config, token) {
- config._w = config._w || {};
- callback(input, config._w, config, token);
- });
- }
-
- function addTimeToArrayFromToken(token, input, config) {
- if (input != null && hasOwnProp(tokens, token)) {
- tokens[token](input, config._a, config, token);
- }
- }
-
- var YEAR = 0;
- var MONTH = 1;
- var DATE = 2;
- var HOUR = 3;
- var MINUTE = 4;
- var SECOND = 5;
- var MILLISECOND = 6;
-
- function daysInMonth(year, month) {
- return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
- }
-
- // FORMATTING
-
- addFormatToken('M', ['MM', 2], 'Mo', function () {
- return this.month() + 1;
- });
-
- addFormatToken('MMM', 0, 0, function (format) {
- return this.localeData().monthsShort(this, format);
- });
-
- addFormatToken('MMMM', 0, 0, function (format) {
- return this.localeData().months(this, format);
- });
-
- // ALIASES
-
- addUnitAlias('month', 'M');
-
- // PARSING
-
- addRegexToken('M', match1to2);
- addRegexToken('MM', match1to2, match2);
- addRegexToken('MMM', matchWord);
- addRegexToken('MMMM', matchWord);
-
- addParseToken(['M', 'MM'], function (input, array) {
- array[MONTH] = toInt(input) - 1;
- });
-
- addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
- var month = config._locale.monthsParse(input, token, config._strict);
- // if we didn't find a month name, mark the date as invalid.
- if (month != null) {
- array[MONTH] = month;
- } else {
- getParsingFlags(config).invalidMonth = input;
- }
- });
-
- // LOCALES
-
- var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
- function localeMonths (m) {
- return this._months[m.month()];
- }
-
- var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
- function localeMonthsShort (m) {
- return this._monthsShort[m.month()];
- }
-
- function localeMonthsParse (monthName, format, strict) {
- var i, mom, regex;
-
- if (!this._monthsParse) {
- this._monthsParse = [];
- this._longMonthsParse = [];
- this._shortMonthsParse = [];
- }
-
- for (i = 0; i < 12; i++) {
- // make the regex if we don't have it already
- mom = create_utc__createUTC([2000, i]);
- if (strict && !this._longMonthsParse[i]) {
- this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
- this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
- }
- if (!strict && !this._monthsParse[i]) {
- regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
- this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
- }
- // test the regex
- if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
- return i;
- } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
- return i;
- } else if (!strict && this._monthsParse[i].test(monthName)) {
- return i;
- }
- }
- }
-
- // MOMENTS
-
- function setMonth (mom, value) {
- var dayOfMonth;
-
- // TODO: Move this out of here!
- if (typeof value === 'string') {
- value = mom.localeData().monthsParse(value);
- // TODO: Another silent failure?
- if (typeof value !== 'number') {
- return mom;
- }
- }
-
- dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
- mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
- return mom;
- }
-
- function getSetMonth (value) {
- if (value != null) {
- setMonth(this, value);
- utils_hooks__hooks.updateOffset(this, true);
- return this;
- } else {
- return get_set__get(this, 'Month');
- }
- }
-
- function getDaysInMonth () {
- return daysInMonth(this.year(), this.month());
- }
-
- function checkOverflow (m) {
- var overflow;
- var a = m._a;
-
- if (a && getParsingFlags(m).overflow === -2) {
- overflow =
- a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :
- a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
- a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
- a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
- a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
- a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
- -1;
-
- if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
- overflow = DATE;
- }
-
- getParsingFlags(m).overflow = overflow;
- }
-
- return m;
- }
-
- function warn(msg) {
- if (utils_hooks__hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) {
- console.warn('Deprecation warning: ' + msg);
- }
- }
-
- function deprecate(msg, fn) {
- var firstTime = true;
-
- return extend(function () {
- if (firstTime) {
- warn(msg + '\n' + (new Error()).stack);
- firstTime = false;
- }
- return fn.apply(this, arguments);
- }, fn);
- }
-
- var deprecations = {};
-
- function deprecateSimple(name, msg) {
- if (!deprecations[name]) {
- warn(msg);
- deprecations[name] = true;
- }
- }
-
- utils_hooks__hooks.suppressDeprecationWarnings = false;
-
- var from_string__isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
-
- var isoDates = [
- ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
- ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
- ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
- ['GGGG-[W]WW', /\d{4}-W\d{2}/],
- ['YYYY-DDD', /\d{4}-\d{3}/]
- ];
-
- // iso time formats and regexes
- var isoTimes = [
- ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/],
- ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
- ['HH:mm', /(T| )\d\d:\d\d/],
- ['HH', /(T| )\d\d/]
- ];
-
- var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
-
- // date from iso format
- function configFromISO(config) {
- var i, l,
- string = config._i,
- match = from_string__isoRegex.exec(string);
-
- if (match) {
- getParsingFlags(config).iso = true;
- for (i = 0, l = isoDates.length; i < l; i++) {
- if (isoDates[i][1].exec(string)) {
- config._f = isoDates[i][0];
- break;
- }
- }
- for (i = 0, l = isoTimes.length; i < l; i++) {
- if (isoTimes[i][1].exec(string)) {
- // match[6] should be 'T' or space
- config._f += (match[6] || ' ') + isoTimes[i][0];
- break;
- }
- }
- if (string.match(matchOffset)) {
- config._f += 'Z';
- }
- configFromStringAndFormat(config);
- } else {
- config._isValid = false;
- }
- }
-
- // date from iso format or fallback
- function configFromString(config) {
- var matched = aspNetJsonRegex.exec(config._i);
-
- if (matched !== null) {
- config._d = new Date(+matched[1]);
- return;
- }
-
- configFromISO(config);
- if (config._isValid === false) {
- delete config._isValid;
- utils_hooks__hooks.createFromInputFallback(config);
- }
- }
-
- utils_hooks__hooks.createFromInputFallback = deprecate(
- 'moment construction falls back to js Date. This is ' +
- 'discouraged and will be removed in upcoming major ' +
- 'release. Please refer to ' +
- 'https://github.com/moment/moment/issues/1407 for more info.',
- function (config) {
- config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
- }
- );
-
- function createDate (y, m, d, h, M, s, ms) {
- //can't just apply() to create a date:
- //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
- var date = new Date(y, m, d, h, M, s, ms);
-
- //the date constructor doesn't accept years < 1970
- if (y < 1970) {
- date.setFullYear(y);
- }
- return date;
- }
-
- function createUTCDate (y) {
- var date = new Date(Date.UTC.apply(null, arguments));
- if (y < 1970) {
- date.setUTCFullYear(y);
- }
- return date;
- }
-
- addFormatToken(0, ['YY', 2], 0, function () {
- return this.year() % 100;
- });
-
- addFormatToken(0, ['YYYY', 4], 0, 'year');
- addFormatToken(0, ['YYYYY', 5], 0, 'year');
- addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
-
- // ALIASES
-
- addUnitAlias('year', 'y');
-
- // PARSING
-
- addRegexToken('Y', matchSigned);
- addRegexToken('YY', match1to2, match2);
- addRegexToken('YYYY', match1to4, match4);
- addRegexToken('YYYYY', match1to6, match6);
- addRegexToken('YYYYYY', match1to6, match6);
-
- addParseToken(['YYYYY', 'YYYYYY'], YEAR);
- addParseToken('YYYY', function (input, array) {
- array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input);
- });
- addParseToken('YY', function (input, array) {
- array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input);
- });
-
- // HELPERS
-
- function daysInYear(year) {
- return isLeapYear(year) ? 366 : 365;
- }
-
- function isLeapYear(year) {
- return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
- }
-
- // HOOKS
-
- utils_hooks__hooks.parseTwoDigitYear = function (input) {
- return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
- };
-
- // MOMENTS
-
- var getSetYear = makeGetSet('FullYear', false);
-
- function getIsLeapYear () {
- return isLeapYear(this.year());
- }
-
- addFormatToken('w', ['ww', 2], 'wo', 'week');
- addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
-
- // ALIASES
-
- addUnitAlias('week', 'w');
- addUnitAlias('isoWeek', 'W');
-
- // PARSING
-
- addRegexToken('w', match1to2);
- addRegexToken('ww', match1to2, match2);
- addRegexToken('W', match1to2);
- addRegexToken('WW', match1to2, match2);
-
- addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
- week[token.substr(0, 1)] = toInt(input);
- });
-
- // HELPERS
-
- // firstDayOfWeek 0 = sun, 6 = sat
- // the day of the week that starts the week
- // (usually sunday or monday)
- // firstDayOfWeekOfYear 0 = sun, 6 = sat
- // the first week is the week that contains the first
- // of this day of the week
- // (eg. ISO weeks use thursday (4))
- function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
- var end = firstDayOfWeekOfYear - firstDayOfWeek,
- daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
- adjustedMoment;
-
-
- if (daysToDayOfWeek > end) {
- daysToDayOfWeek -= 7;
- }
-
- if (daysToDayOfWeek < end - 7) {
- daysToDayOfWeek += 7;
- }
-
- adjustedMoment = local__createLocal(mom).add(daysToDayOfWeek, 'd');
- return {
- week: Math.ceil(adjustedMoment.dayOfYear() / 7),
- year: adjustedMoment.year()
- };
- }
-
- // LOCALES
-
- function localeWeek (mom) {
- return weekOfYear(mom, this._week.dow, this._week.doy).week;
- }
-
- var defaultLocaleWeek = {
- dow : 0, // Sunday is the first day of the week.
- doy : 6 // The week that contains Jan 1st is the first week of the year.
- };
-
- function localeFirstDayOfWeek () {
- return this._week.dow;
- }
-
- function localeFirstDayOfYear () {
- return this._week.doy;
- }
-
- // MOMENTS
-
- function getSetWeek (input) {
- var week = this.localeData().week(this);
- return input == null ? week : this.add((input - week) * 7, 'd');
- }
-
- function getSetISOWeek (input) {
- var week = weekOfYear(this, 1, 4).week;
- return input == null ? week : this.add((input - week) * 7, 'd');
- }
-
- addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
-
- // ALIASES
-
- addUnitAlias('dayOfYear', 'DDD');
-
- // PARSING
-
- addRegexToken('DDD', match1to3);
- addRegexToken('DDDD', match3);
- addParseToken(['DDD', 'DDDD'], function (input, array, config) {
- config._dayOfYear = toInt(input);
- });
-
- // HELPERS
-
- //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
- function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
- var week1Jan = 6 + firstDayOfWeek - firstDayOfWeekOfYear, janX = createUTCDate(year, 0, 1 + week1Jan), d = janX.getUTCDay(), dayOfYear;
- if (d < firstDayOfWeek) {
- d += 7;
- }
-
- weekday = weekday != null ? 1 * weekday : firstDayOfWeek;
-
- dayOfYear = 1 + week1Jan + 7 * (week - 1) - d + weekday;
-
- return {
- year: dayOfYear > 0 ? year : year - 1,
- dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear
- };
- }
-
- // MOMENTS
-
- function getSetDayOfYear (input) {
- var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
- return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
- }
-
- // Pick the first defined of two or three arguments.
- function defaults(a, b, c) {
- if (a != null) {
- return a;
- }
- if (b != null) {
- return b;
- }
- return c;
- }
-
- function currentDateArray(config) {
- var now = new Date();
- if (config._useUTC) {
- return [now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()];
- }
- return [now.getFullYear(), now.getMonth(), now.getDate()];
- }
-
- // convert an array to a date.
- // the array should mirror the parameters below
- // note: all values past the year are optional and will default to the lowest possible value.
- // [year, month, day , hour, minute, second, millisecond]
- function configFromArray (config) {
- var i, date, input = [], currentDate, yearToUse;
-
- if (config._d) {
- return;
- }
-
- currentDate = currentDateArray(config);
-
- //compute day of the year from weeks and weekdays
- if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
- dayOfYearFromWeekInfo(config);
- }
-
- //if the day of the year is set, figure out what it is
- if (config._dayOfYear) {
- yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
-
- if (config._dayOfYear > daysInYear(yearToUse)) {
- getParsingFlags(config)._overflowDayOfYear = true;
- }
-
- date = createUTCDate(yearToUse, 0, config._dayOfYear);
- config._a[MONTH] = date.getUTCMonth();
- config._a[DATE] = date.getUTCDate();
- }
-
- // Default to current date.
- // * if no year, month, day of month are given, default to today
- // * if day of month is given, default month and year
- // * if month is given, default only year
- // * if year is given, don't default anything
- for (i = 0; i < 3 && config._a[i] == null; ++i) {
- config._a[i] = input[i] = currentDate[i];
- }
-
- // Zero out whatever was not defaulted, including time
- for (; i < 7; i++) {
- config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
- }
-
- // Check for 24:00:00.000
- if (config._a[HOUR] === 24 &&
- config._a[MINUTE] === 0 &&
- config._a[SECOND] === 0 &&
- config._a[MILLISECOND] === 0) {
- config._nextDay = true;
- config._a[HOUR] = 0;
- }
-
- config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
- // Apply timezone offset from input. The actual utcOffset can be changed
- // with parseZone.
- if (config._tzm != null) {
- config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
- }
-
- if (config._nextDay) {
- config._a[HOUR] = 24;
- }
- }
-
- function dayOfYearFromWeekInfo(config) {
- var w, weekYear, week, weekday, dow, doy, temp;
-
- w = config._w;
- if (w.GG != null || w.W != null || w.E != null) {
- dow = 1;
- doy = 4;
-
- // TODO: We need to take the current isoWeekYear, but that depends on
- // how we interpret now (local, utc, fixed offset). So create
- // a now version of current config (take local/utc/offset flags, and
- // create now).
- weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year);
- week = defaults(w.W, 1);
- weekday = defaults(w.E, 1);
- } else {
- dow = config._locale._week.dow;
- doy = config._locale._week.doy;
-
- weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year);
- week = defaults(w.w, 1);
-
- if (w.d != null) {
- // weekday -- low day numbers are considered next week
- weekday = w.d;
- if (weekday < dow) {
- ++week;
- }
- } else if (w.e != null) {
- // local weekday -- counting starts from begining of week
- weekday = w.e + dow;
- } else {
- // default to begining of week
- weekday = dow;
- }
- }
- temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);
-
- config._a[YEAR] = temp.year;
- config._dayOfYear = temp.dayOfYear;
- }
-
- utils_hooks__hooks.ISO_8601 = function () {};
-
- // date from string and format string
- function configFromStringAndFormat(config) {
- // TODO: Move this to another part of the creation flow to prevent circular deps
- if (config._f === utils_hooks__hooks.ISO_8601) {
- configFromISO(config);
- return;
- }
-
- config._a = [];
- getParsingFlags(config).empty = true;
-
- // This array is used to make a Date, either with `new Date` or `Date.UTC`
- var string = '' + config._i,
- i, parsedInput, tokens, token, skipped,
- stringLength = string.length,
- totalParsedInputLength = 0;
-
- tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
-
- for (i = 0; i < tokens.length; i++) {
- token = tokens[i];
- parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
- if (parsedInput) {
- skipped = string.substr(0, string.indexOf(parsedInput));
- if (skipped.length > 0) {
- getParsingFlags(config).unusedInput.push(skipped);
- }
- string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
- totalParsedInputLength += parsedInput.length;
- }
- // don't parse if it's not a known token
- if (formatTokenFunctions[token]) {
- if (parsedInput) {
- getParsingFlags(config).empty = false;
- }
- else {
- getParsingFlags(config).unusedTokens.push(token);
- }
- addTimeToArrayFromToken(token, parsedInput, config);
- }
- else if (config._strict && !parsedInput) {
- getParsingFlags(config).unusedTokens.push(token);
- }
- }
-
- // add remaining unparsed input length to the string
- getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
- if (string.length > 0) {
- getParsingFlags(config).unusedInput.push(string);
- }
-
- // clear _12h flag if hour is <= 12
- if (getParsingFlags(config).bigHour === true &&
- config._a[HOUR] <= 12 &&
- config._a[HOUR] > 0) {
- getParsingFlags(config).bigHour = undefined;
- }
- // handle meridiem
- config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
-
- configFromArray(config);
- checkOverflow(config);
- }
-
-
- function meridiemFixWrap (locale, hour, meridiem) {
- var isPm;
-
- if (meridiem == null) {
- // nothing to do
- return hour;
- }
- if (locale.meridiemHour != null) {
- return locale.meridiemHour(hour, meridiem);
- } else if (locale.isPM != null) {
- // Fallback
- isPm = locale.isPM(meridiem);
- if (isPm && hour < 12) {
- hour += 12;
- }
- if (!isPm && hour === 12) {
- hour = 0;
- }
- return hour;
- } else {
- // this is not supposed to happen
- return hour;
- }
- }
-
- function configFromStringAndArray(config) {
- var tempConfig,
- bestMoment,
-
- scoreToBeat,
- i,
- currentScore;
-
- if (config._f.length === 0) {
- getParsingFlags(config).invalidFormat = true;
- config._d = new Date(NaN);
- return;
- }
-
- for (i = 0; i < config._f.length; i++) {
- currentScore = 0;
- tempConfig = copyConfig({}, config);
- if (config._useUTC != null) {
- tempConfig._useUTC = config._useUTC;
- }
- tempConfig._f = config._f[i];
- configFromStringAndFormat(tempConfig);
-
- if (!valid__isValid(tempConfig)) {
- continue;
- }
-
- // if there is any input that was not parsed add a penalty for that format
- currentScore += getParsingFlags(tempConfig).charsLeftOver;
-
- //or tokens
- currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
-
- getParsingFlags(tempConfig).score = currentScore;
-
- if (scoreToBeat == null || currentScore < scoreToBeat) {
- scoreToBeat = currentScore;
- bestMoment = tempConfig;
- }
- }
-
- extend(config, bestMoment || tempConfig);
- }
-
- function configFromObject(config) {
- if (config._d) {
- return;
- }
-
- var i = normalizeObjectUnits(config._i);
- config._a = [i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond];
-
- configFromArray(config);
- }
-
- function createFromConfig (config) {
- var res = new Moment(checkOverflow(prepareConfig(config)));
- if (res._nextDay) {
- // Adding is smart enough around DST
- res.add(1, 'd');
- res._nextDay = undefined;
- }
-
- return res;
- }
-
- function prepareConfig (config) {
- var input = config._i,
- format = config._f;
-
- config._locale = config._locale || locale_locales__getLocale(config._l);
-
- if (input === null || (format === undefined && input === '')) {
- return valid__createInvalid({nullInput: true});
- }
-
- if (typeof input === 'string') {
- config._i = input = config._locale.preparse(input);
- }
-
- if (isMoment(input)) {
- return new Moment(checkOverflow(input));
- } else if (isArray(format)) {
- configFromStringAndArray(config);
- } else if (format) {
- configFromStringAndFormat(config);
- } else if (isDate(input)) {
- config._d = input;
- } else {
- configFromInput(config);
- }
-
- return config;
- }
-
- function configFromInput(config) {
- var input = config._i;
- if (input === undefined) {
- config._d = new Date();
- } else if (isDate(input)) {
- config._d = new Date(+input);
- } else if (typeof input === 'string') {
- configFromString(config);
- } else if (isArray(input)) {
- config._a = map(input.slice(0), function (obj) {
- return parseInt(obj, 10);
- });
- configFromArray(config);
- } else if (typeof(input) === 'object') {
- configFromObject(config);
- } else if (typeof(input) === 'number') {
- // from milliseconds
- config._d = new Date(input);
- } else {
- utils_hooks__hooks.createFromInputFallback(config);
- }
- }
-
- function createLocalOrUTC (input, format, locale, strict, isUTC) {
- var c = {};
-
- if (typeof(locale) === 'boolean') {
- strict = locale;
- locale = undefined;
- }
- // object construction must be done this way.
- // https://github.com/moment/moment/issues/1423
- c._isAMomentObject = true;
- c._useUTC = c._isUTC = isUTC;
- c._l = locale;
- c._i = input;
- c._f = format;
- c._strict = strict;
-
- return createFromConfig(c);
- }
-
- function local__createLocal (input, format, locale, strict) {
- return createLocalOrUTC(input, format, locale, strict, false);
- }
-
- var prototypeMin = deprecate(
- 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',
- function () {
- var other = local__createLocal.apply(null, arguments);
- return other < this ? this : other;
- }
- );
-
- var prototypeMax = deprecate(
- 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',
- function () {
- var other = local__createLocal.apply(null, arguments);
- return other > this ? this : other;
- }
- );
-
- // Pick a moment m from moments so that m[fn](other) is true for all
- // other. This relies on the function fn to be transitive.
- //
- // moments should either be an array of moment objects or an array, whose
- // first element is an array of moment objects.
- function pickBy(fn, moments) {
- var res, i;
- if (moments.length === 1 && isArray(moments[0])) {
- moments = moments[0];
- }
- if (!moments.length) {
- return local__createLocal();
- }
- res = moments[0];
- for (i = 1; i < moments.length; ++i) {
- if (!moments[i].isValid() || moments[i][fn](res)) {
- res = moments[i];
- }
- }
- return res;
- }
-
- // TODO: Use [].sort instead?
- function min () {
- var args = [].slice.call(arguments, 0);
-
- return pickBy('isBefore', args);
- }
-
- function max () {
- var args = [].slice.call(arguments, 0);
-
- return pickBy('isAfter', args);
- }
-
- function Duration (duration) {
- var normalizedInput = normalizeObjectUnits(duration),
- years = normalizedInput.year || 0,
- quarters = normalizedInput.quarter || 0,
- months = normalizedInput.month || 0,
- weeks = normalizedInput.week || 0,
- days = normalizedInput.day || 0,
- hours = normalizedInput.hour || 0,
- minutes = normalizedInput.minute || 0,
- seconds = normalizedInput.second || 0,
- milliseconds = normalizedInput.millisecond || 0;
-
- // representation for dateAddRemove
- this._milliseconds = +milliseconds +
- seconds * 1e3 + // 1000
- minutes * 6e4 + // 1000 * 60
- hours * 36e5; // 1000 * 60 * 60
- // Because of dateAddRemove treats 24 hours as different from a
- // day when working around DST, we need to store them separately
- this._days = +days +
- weeks * 7;
- // It is impossible translate months into days without knowing
- // which months you are are talking about, so we have to store
- // it separately.
- this._months = +months +
- quarters * 3 +
- years * 12;
-
- this._data = {};
-
- this._locale = locale_locales__getLocale();
-
- this._bubble();
- }
-
- function isDuration (obj) {
- return obj instanceof Duration;
- }
-
- function offset (token, separator) {
- addFormatToken(token, 0, 0, function () {
- var offset = this.utcOffset();
- var sign = '+';
- if (offset < 0) {
- offset = -offset;
- sign = '-';
- }
- return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
- });
- }
-
- offset('Z', ':');
- offset('ZZ', '');
-
- // PARSING
-
- addRegexToken('Z', matchOffset);
- addRegexToken('ZZ', matchOffset);
- addParseToken(['Z', 'ZZ'], function (input, array, config) {
- config._useUTC = true;
- config._tzm = offsetFromString(input);
- });
-
- // HELPERS
-
- // timezone chunker
- // '+10:00' > ['10', '00']
- // '-1530' > ['-15', '30']
- var chunkOffset = /([\+\-]|\d\d)/gi;
-
- function offsetFromString(string) {
- var matches = ((string || '').match(matchOffset) || []);
- var chunk = matches[matches.length - 1] || [];
- var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
- var minutes = +(parts[1] * 60) + toInt(parts[2]);
-
- return parts[0] === '+' ? minutes : -minutes;
- }
-
- // Return a moment from input, that is local/utc/zone equivalent to model.
- function cloneWithOffset(input, model) {
- var res, diff;
- if (model._isUTC) {
- res = model.clone();
- diff = (isMoment(input) || isDate(input) ? +input : +local__createLocal(input)) - (+res);
- // Use low-level api, because this fn is low-level api.
- res._d.setTime(+res._d + diff);
- utils_hooks__hooks.updateOffset(res, false);
- return res;
- } else {
- return local__createLocal(input).local();
- }
- }
-
- function getDateOffset (m) {
- // On Firefox.24 Date#getTimezoneOffset returns a floating point.
- // https://github.com/moment/moment/pull/1871
- return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
- }
-
- // HOOKS
-
- // This function will be called whenever a moment is mutated.
- // It is intended to keep the offset in sync with the timezone.
- utils_hooks__hooks.updateOffset = function () {};
-
- // MOMENTS
-
- // keepLocalTime = true means only change the timezone, without
- // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
- // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
- // +0200, so we adjust the time as needed, to be valid.
- //
- // Keeping the time actually adds/subtracts (one hour)
- // from the actual represented time. That is why we call updateOffset
- // a second time. In case it wants us to change the offset again
- // _changeInProgress == true case, then we have to adjust, because
- // there is no such time in the given timezone.
- function getSetOffset (input, keepLocalTime) {
- var offset = this._offset || 0,
- localAdjust;
- if (input != null) {
- if (typeof input === 'string') {
- input = offsetFromString(input);
- }
- if (Math.abs(input) < 16) {
- input = input * 60;
- }
- if (!this._isUTC && keepLocalTime) {
- localAdjust = getDateOffset(this);
- }
- this._offset = input;
- this._isUTC = true;
- if (localAdjust != null) {
- this.add(localAdjust, 'm');
- }
- if (offset !== input) {
- if (!keepLocalTime || this._changeInProgress) {
- add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false);
- } else if (!this._changeInProgress) {
- this._changeInProgress = true;
- utils_hooks__hooks.updateOffset(this, true);
- this._changeInProgress = null;
- }
- }
- return this;
- } else {
- return this._isUTC ? offset : getDateOffset(this);
- }
- }
-
- function getSetZone (input, keepLocalTime) {
- if (input != null) {
- if (typeof input !== 'string') {
- input = -input;
- }
-
- this.utcOffset(input, keepLocalTime);
-
- return this;
- } else {
- return -this.utcOffset();
- }
- }
-
- function setOffsetToUTC (keepLocalTime) {
- return this.utcOffset(0, keepLocalTime);
- }
-
- function setOffsetToLocal (keepLocalTime) {
- if (this._isUTC) {
- this.utcOffset(0, keepLocalTime);
- this._isUTC = false;
-
- if (keepLocalTime) {
- this.subtract(getDateOffset(this), 'm');
- }
- }
- return this;
- }
-
- function setOffsetToParsedOffset () {
- if (this._tzm) {
- this.utcOffset(this._tzm);
- } else if (typeof this._i === 'string') {
- this.utcOffset(offsetFromString(this._i));
- }
- return this;
- }
-
- function hasAlignedHourOffset (input) {
- input = input ? local__createLocal(input).utcOffset() : 0;
-
- return (this.utcOffset() - input) % 60 === 0;
- }
-
- function isDaylightSavingTime () {
- return (
- this.utcOffset() > this.clone().month(0).utcOffset() ||
- this.utcOffset() > this.clone().month(5).utcOffset()
- );
- }
-
- function isDaylightSavingTimeShifted () {
- if (typeof this._isDSTShifted !== 'undefined') {
- return this._isDSTShifted;
- }
-
- var c = {};
-
- copyConfig(c, this);
- c = prepareConfig(c);
-
- if (c._a) {
- var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a);
- this._isDSTShifted = this.isValid() &&
- compareArrays(c._a, other.toArray()) > 0;
- } else {
- this._isDSTShifted = false;
- }
-
- return this._isDSTShifted;
- }
-
- function isLocal () {
- return !this._isUTC;
- }
-
- function isUtcOffset () {
- return this._isUTC;
- }
-
- function isUtc () {
- return this._isUTC && this._offset === 0;
- }
-
- var aspNetRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/;
-
- // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
- // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
- var create__isoRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;
-
- function create__createDuration (input, key) {
- var duration = input,
- // matching against regexp is expensive, do it on demand
- match = null,
- sign,
- ret,
- diffRes;
-
- if (isDuration(input)) {
- duration = {
- ms : input._milliseconds,
- d : input._days,
- M : input._months
- };
- } else if (typeof input === 'number') {
- duration = {};
- if (key) {
- duration[key] = input;
- } else {
- duration.milliseconds = input;
- }
- } else if (!!(match = aspNetRegex.exec(input))) {
- sign = (match[1] === '-') ? -1 : 1;
- duration = {
- y : 0,
- d : toInt(match[DATE]) * sign,
- h : toInt(match[HOUR]) * sign,
- m : toInt(match[MINUTE]) * sign,
- s : toInt(match[SECOND]) * sign,
- ms : toInt(match[MILLISECOND]) * sign
- };
- } else if (!!(match = create__isoRegex.exec(input))) {
- sign = (match[1] === '-') ? -1 : 1;
- duration = {
- y : parseIso(match[2], sign),
- M : parseIso(match[3], sign),
- d : parseIso(match[4], sign),
- h : parseIso(match[5], sign),
- m : parseIso(match[6], sign),
- s : parseIso(match[7], sign),
- w : parseIso(match[8], sign)
- };
- } else if (duration == null) {// checks for null or undefined
- duration = {};
- } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
- diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to));
-
- duration = {};
- duration.ms = diffRes.milliseconds;
- duration.M = diffRes.months;
- }
-
- ret = new Duration(duration);
-
- if (isDuration(input) && hasOwnProp(input, '_locale')) {
- ret._locale = input._locale;
- }
-
- return ret;
- }
-
- create__createDuration.fn = Duration.prototype;
-
- function parseIso (inp, sign) {
- // We'd normally use ~~inp for this, but unfortunately it also
- // converts floats to ints.
- // inp may be undefined, so careful calling replace on it.
- var res = inp && parseFloat(inp.replace(',', '.'));
- // apply sign while we're at it
- return (isNaN(res) ? 0 : res) * sign;
- }
-
- function positiveMomentsDifference(base, other) {
- var res = {milliseconds: 0, months: 0};
-
- res.months = other.month() - base.month() +
- (other.year() - base.year()) * 12;
- if (base.clone().add(res.months, 'M').isAfter(other)) {
- --res.months;
- }
-
- res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
-
- return res;
- }
-
- function momentsDifference(base, other) {
- var res;
- other = cloneWithOffset(other, base);
- if (base.isBefore(other)) {
- res = positiveMomentsDifference(base, other);
- } else {
- res = positiveMomentsDifference(other, base);
- res.milliseconds = -res.milliseconds;
- res.months = -res.months;
- }
-
- return res;
- }
-
- function createAdder(direction, name) {
- return function (val, period) {
- var dur, tmp;
- //invert the arguments, but complain about it
- if (period !== null && !isNaN(+period)) {
- deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');
- tmp = val; val = period; period = tmp;
- }
-
- val = typeof val === 'string' ? +val : val;
- dur = create__createDuration(val, period);
- add_subtract__addSubtract(this, dur, direction);
- return this;
- };
- }
-
- function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) {
- var milliseconds = duration._milliseconds,
- days = duration._days,
- months = duration._months;
- updateOffset = updateOffset == null ? true : updateOffset;
-
- if (milliseconds) {
- mom._d.setTime(+mom._d + milliseconds * isAdding);
- }
- if (days) {
- get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding);
- }
- if (months) {
- setMonth(mom, get_set__get(mom, 'Month') + months * isAdding);
- }
- if (updateOffset) {
- utils_hooks__hooks.updateOffset(mom, days || months);
- }
- }
-
- var add_subtract__add = createAdder(1, 'add');
- var add_subtract__subtract = createAdder(-1, 'subtract');
-
- function moment_calendar__calendar (time, formats) {
- // We want to compare the start of today, vs this.
- // Getting start-of-today depends on whether we're local/utc/offset or not.
- var now = time || local__createLocal(),
- sod = cloneWithOffset(now, this).startOf('day'),
- diff = this.diff(sod, 'days', true),
- format = diff < -6 ? 'sameElse' :
- diff < -1 ? 'lastWeek' :
- diff < 0 ? 'lastDay' :
- diff < 1 ? 'sameDay' :
- diff < 2 ? 'nextDay' :
- diff < 7 ? 'nextWeek' : 'sameElse';
- return this.format(formats && formats[format] || this.localeData().calendar(format, this, local__createLocal(now)));
- }
-
- function clone () {
- return new Moment(this);
- }
-
- function isAfter (input, units) {
- var inputMs;
- units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
- if (units === 'millisecond') {
- input = isMoment(input) ? input : local__createLocal(input);
- return +this > +input;
- } else {
- inputMs = isMoment(input) ? +input : +local__createLocal(input);
- return inputMs < +this.clone().startOf(units);
- }
- }
-
- function isBefore (input, units) {
- var inputMs;
- units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
- if (units === 'millisecond') {
- input = isMoment(input) ? input : local__createLocal(input);
- return +this < +input;
- } else {
- inputMs = isMoment(input) ? +input : +local__createLocal(input);
- return +this.clone().endOf(units) < inputMs;
- }
- }
-
- function isBetween (from, to, units) {
- return this.isAfter(from, units) && this.isBefore(to, units);
- }
-
- function isSame (input, units) {
- var inputMs;
- units = normalizeUnits(units || 'millisecond');
- if (units === 'millisecond') {
- input = isMoment(input) ? input : local__createLocal(input);
- return +this === +input;
- } else {
- inputMs = +local__createLocal(input);
- return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));
- }
- }
-
- function diff (input, units, asFloat) {
- var that = cloneWithOffset(input, this),
- zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4,
- delta, output;
-
- units = normalizeUnits(units);
-
- if (units === 'year' || units === 'month' || units === 'quarter') {
- output = monthDiff(this, that);
- if (units === 'quarter') {
- output = output / 3;
- } else if (units === 'year') {
- output = output / 12;
- }
- } else {
- delta = this - that;
- output = units === 'second' ? delta / 1e3 : // 1000
- units === 'minute' ? delta / 6e4 : // 1000 * 60
- units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
- units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
- units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
- delta;
- }
- return asFloat ? output : absFloor(output);
- }
-
- function monthDiff (a, b) {
- // difference in months
- var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
- // b is in (anchor - 1 month, anchor + 1 month)
- anchor = a.clone().add(wholeMonthDiff, 'months'),
- anchor2, adjust;
-
- if (b - anchor < 0) {
- anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
- // linear across the month
- adjust = (b - anchor) / (anchor - anchor2);
- } else {
- anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
- // linear across the month
- adjust = (b - anchor) / (anchor2 - anchor);
- }
-
- return -(wholeMonthDiff + adjust);
- }
-
- utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
-
- function toString () {
- return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
- }
-
- function moment_format__toISOString () {
- var m = this.clone().utc();
- if (0 < m.year() && m.year() <= 9999) {
- if ('function' === typeof Date.prototype.toISOString) {
- // native implementation is ~50x faster, use it when we can
- return this.toDate().toISOString();
- } else {
- return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
- }
- } else {
- return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
- }
- }
-
- function format (inputString) {
- var output = formatMoment(this, inputString || utils_hooks__hooks.defaultFormat);
- return this.localeData().postformat(output);
- }
-
- function from (time, withoutSuffix) {
- if (!this.isValid()) {
- return this.localeData().invalidDate();
- }
- return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
- }
-
- function fromNow (withoutSuffix) {
- return this.from(local__createLocal(), withoutSuffix);
- }
-
- function to (time, withoutSuffix) {
- if (!this.isValid()) {
- return this.localeData().invalidDate();
- }
- return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
- }
-
- function toNow (withoutSuffix) {
- return this.to(local__createLocal(), withoutSuffix);
- }
-
- function locale (key) {
- var newLocaleData;
-
- if (key === undefined) {
- return this._locale._abbr;
- } else {
- newLocaleData = locale_locales__getLocale(key);
- if (newLocaleData != null) {
- this._locale = newLocaleData;
- }
- return this;
- }
- }
-
- var lang = deprecate(
- 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
- function (key) {
- if (key === undefined) {
- return this.localeData();
- } else {
- return this.locale(key);
- }
- }
- );
-
- function localeData () {
- return this._locale;
- }
-
- function startOf (units) {
- units = normalizeUnits(units);
- // the following switch intentionally omits break keywords
- // to utilize falling through the cases.
- switch (units) {
- case 'year':
- this.month(0);
- /* falls through */
- case 'quarter':
- case 'month':
- this.date(1);
- /* falls through */
- case 'week':
- case 'isoWeek':
- case 'day':
- this.hours(0);
- /* falls through */
- case 'hour':
- this.minutes(0);
- /* falls through */
- case 'minute':
- this.seconds(0);
- /* falls through */
- case 'second':
- this.milliseconds(0);
- }
-
- // weeks are a special case
- if (units === 'week') {
- this.weekday(0);
- }
- if (units === 'isoWeek') {
- this.isoWeekday(1);
- }
-
- // quarters are also special
- if (units === 'quarter') {
- this.month(Math.floor(this.month() / 3) * 3);
- }
-
- return this;
- }
-
- function endOf (units) {
- units = normalizeUnits(units);
- if (units === undefined || units === 'millisecond') {
- return this;
- }
- return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
- }
-
- function to_type__valueOf () {
- return +this._d - ((this._offset || 0) * 60000);
- }
-
- function unix () {
- return Math.floor(+this / 1000);
- }
-
- function toDate () {
- return this._offset ? new Date(+this) : this._d;
- }
-
- function toArray () {
- var m = this;
- return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
- }
-
- function toObject () {
- var m = this;
- return {
- years: m.year(),
- months: m.month(),
- date: m.date(),
- hours: m.hours(),
- minutes: m.minutes(),
- seconds: m.seconds(),
- milliseconds: m.milliseconds()
- };
- }
-
- function moment_valid__isValid () {
- return valid__isValid(this);
- }
-
- function parsingFlags () {
- return extend({}, getParsingFlags(this));
- }
-
- function invalidAt () {
- return getParsingFlags(this).overflow;
- }
-
- addFormatToken(0, ['gg', 2], 0, function () {
- return this.weekYear() % 100;
- });
-
- addFormatToken(0, ['GG', 2], 0, function () {
- return this.isoWeekYear() % 100;
- });
-
- function addWeekYearFormatToken (token, getter) {
- addFormatToken(0, [token, token.length], 0, getter);
- }
-
- addWeekYearFormatToken('gggg', 'weekYear');
- addWeekYearFormatToken('ggggg', 'weekYear');
- addWeekYearFormatToken('GGGG', 'isoWeekYear');
- addWeekYearFormatToken('GGGGG', 'isoWeekYear');
-
- // ALIASES
-
- addUnitAlias('weekYear', 'gg');
- addUnitAlias('isoWeekYear', 'GG');
-
- // PARSING
-
- addRegexToken('G', matchSigned);
- addRegexToken('g', matchSigned);
- addRegexToken('GG', match1to2, match2);
- addRegexToken('gg', match1to2, match2);
- addRegexToken('GGGG', match1to4, match4);
- addRegexToken('gggg', match1to4, match4);
- addRegexToken('GGGGG', match1to6, match6);
- addRegexToken('ggggg', match1to6, match6);
-
- addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
- week[token.substr(0, 2)] = toInt(input);
- });
-
- addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
- week[token] = utils_hooks__hooks.parseTwoDigitYear(input);
- });
-
- // HELPERS
-
- function weeksInYear(year, dow, doy) {
- return weekOfYear(local__createLocal([year, 11, 31 + dow - doy]), dow, doy).week;
- }
-
- // MOMENTS
-
- function getSetWeekYear (input) {
- var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;
- return input == null ? year : this.add((input - year), 'y');
- }
-
- function getSetISOWeekYear (input) {
- var year = weekOfYear(this, 1, 4).year;
- return input == null ? year : this.add((input - year), 'y');
- }
-
- function getISOWeeksInYear () {
- return weeksInYear(this.year(), 1, 4);
- }
-
- function getWeeksInYear () {
- var weekInfo = this.localeData()._week;
- return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
- }
-
- addFormatToken('Q', 0, 0, 'quarter');
-
- // ALIASES
-
- addUnitAlias('quarter', 'Q');
-
- // PARSING
-
- addRegexToken('Q', match1);
- addParseToken('Q', function (input, array) {
- array[MONTH] = (toInt(input) - 1) * 3;
- });
-
- // MOMENTS
-
- function getSetQuarter (input) {
- return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
- }
-
- addFormatToken('D', ['DD', 2], 'Do', 'date');
-
- // ALIASES
-
- addUnitAlias('date', 'D');
-
- // PARSING
-
- addRegexToken('D', match1to2);
- addRegexToken('DD', match1to2, match2);
- addRegexToken('Do', function (isStrict, locale) {
- return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
- });
-
- addParseToken(['D', 'DD'], DATE);
- addParseToken('Do', function (input, array) {
- array[DATE] = toInt(input.match(match1to2)[0], 10);
- });
-
- // MOMENTS
-
- var getSetDayOfMonth = makeGetSet('Date', true);
-
- addFormatToken('d', 0, 'do', 'day');
-
- addFormatToken('dd', 0, 0, function (format) {
- return this.localeData().weekdaysMin(this, format);
- });
-
- addFormatToken('ddd', 0, 0, function (format) {
- return this.localeData().weekdaysShort(this, format);
- });
-
- addFormatToken('dddd', 0, 0, function (format) {
- return this.localeData().weekdays(this, format);
- });
-
- addFormatToken('e', 0, 0, 'weekday');
- addFormatToken('E', 0, 0, 'isoWeekday');
-
- // ALIASES
-
- addUnitAlias('day', 'd');
- addUnitAlias('weekday', 'e');
- addUnitAlias('isoWeekday', 'E');
-
- // PARSING
-
- addRegexToken('d', match1to2);
- addRegexToken('e', match1to2);
- addRegexToken('E', match1to2);
- addRegexToken('dd', matchWord);
- addRegexToken('ddd', matchWord);
- addRegexToken('dddd', matchWord);
-
- addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config) {
- var weekday = config._locale.weekdaysParse(input);
- // if we didn't get a weekday name, mark the date as invalid
- if (weekday != null) {
- week.d = weekday;
- } else {
- getParsingFlags(config).invalidWeekday = input;
- }
- });
-
- addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
- week[token] = toInt(input);
- });
-
- // HELPERS
-
- function parseWeekday(input, locale) {
- if (typeof input !== 'string') {
- return input;
- }
-
- if (!isNaN(input)) {
- return parseInt(input, 10);
- }
-
- input = locale.weekdaysParse(input);
- if (typeof input === 'number') {
- return input;
- }
-
- return null;
- }
-
- // LOCALES
-
- var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
- function localeWeekdays (m) {
- return this._weekdays[m.day()];
- }
-
- var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
- function localeWeekdaysShort (m) {
- return this._weekdaysShort[m.day()];
- }
-
- var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
- function localeWeekdaysMin (m) {
- return this._weekdaysMin[m.day()];
- }
-
- function localeWeekdaysParse (weekdayName) {
- var i, mom, regex;
-
- this._weekdaysParse = this._weekdaysParse || [];
-
- for (i = 0; i < 7; i++) {
- // make the regex if we don't have it already
- if (!this._weekdaysParse[i]) {
- mom = local__createLocal([2000, 1]).day(i);
- regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
- this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
- }
- // test the regex
- if (this._weekdaysParse[i].test(weekdayName)) {
- return i;
- }
- }
- }
-
- // MOMENTS
-
- function getSetDayOfWeek (input) {
- var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
- if (input != null) {
- input = parseWeekday(input, this.localeData());
- return this.add(input - day, 'd');
- } else {
- return day;
- }
- }
-
- function getSetLocaleDayOfWeek (input) {
- var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
- return input == null ? weekday : this.add(input - weekday, 'd');
- }
-
- function getSetISODayOfWeek (input) {
- // behaves the same as moment#day except
- // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
- // as a setter, sunday should belong to the previous week.
- return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
- }
-
- addFormatToken('H', ['HH', 2], 0, 'hour');
- addFormatToken('h', ['hh', 2], 0, function () {
- return this.hours() % 12 || 12;
- });
-
- function meridiem (token, lowercase) {
- addFormatToken(token, 0, 0, function () {
- return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
- });
- }
-
- meridiem('a', true);
- meridiem('A', false);
-
- // ALIASES
-
- addUnitAlias('hour', 'h');
-
- // PARSING
-
- function matchMeridiem (isStrict, locale) {
- return locale._meridiemParse;
- }
-
- addRegexToken('a', matchMeridiem);
- addRegexToken('A', matchMeridiem);
- addRegexToken('H', match1to2);
- addRegexToken('h', match1to2);
- addRegexToken('HH', match1to2, match2);
- addRegexToken('hh', match1to2, match2);
-
- addParseToken(['H', 'HH'], HOUR);
- addParseToken(['a', 'A'], function (input, array, config) {
- config._isPm = config._locale.isPM(input);
- config._meridiem = input;
- });
- addParseToken(['h', 'hh'], function (input, array, config) {
- array[HOUR] = toInt(input);
- getParsingFlags(config).bigHour = true;
- });
-
- // LOCALES
-
- function localeIsPM (input) {
- // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
- // Using charAt should be more compatible.
- return ((input + '').toLowerCase().charAt(0) === 'p');
- }
-
- var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
- function localeMeridiem (hours, minutes, isLower) {
- if (hours > 11) {
- return isLower ? 'pm' : 'PM';
- } else {
- return isLower ? 'am' : 'AM';
- }
- }
-
-
- // MOMENTS
-
- // Setting the hour should keep the time, because the user explicitly
- // specified which hour he wants. So trying to maintain the same hour (in
- // a new timezone) makes sense. Adding/subtracting hours does not follow
- // this rule.
- var getSetHour = makeGetSet('Hours', true);
-
- addFormatToken('m', ['mm', 2], 0, 'minute');
-
- // ALIASES
-
- addUnitAlias('minute', 'm');
-
- // PARSING
-
- addRegexToken('m', match1to2);
- addRegexToken('mm', match1to2, match2);
- addParseToken(['m', 'mm'], MINUTE);
-
- // MOMENTS
-
- var getSetMinute = makeGetSet('Minutes', false);
-
- addFormatToken('s', ['ss', 2], 0, 'second');
-
- // ALIASES
-
- addUnitAlias('second', 's');
-
- // PARSING
-
- addRegexToken('s', match1to2);
- addRegexToken('ss', match1to2, match2);
- addParseToken(['s', 'ss'], SECOND);
-
- // MOMENTS
-
- var getSetSecond = makeGetSet('Seconds', false);
-
- addFormatToken('S', 0, 0, function () {
- return ~~(this.millisecond() / 100);
- });
-
- addFormatToken(0, ['SS', 2], 0, function () {
- return ~~(this.millisecond() / 10);
- });
-
- addFormatToken(0, ['SSS', 3], 0, 'millisecond');
- addFormatToken(0, ['SSSS', 4], 0, function () {
- return this.millisecond() * 10;
- });
- addFormatToken(0, ['SSSSS', 5], 0, function () {
- return this.millisecond() * 100;
- });
- addFormatToken(0, ['SSSSSS', 6], 0, function () {
- return this.millisecond() * 1000;
- });
- addFormatToken(0, ['SSSSSSS', 7], 0, function () {
- return this.millisecond() * 10000;
- });
- addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
- return this.millisecond() * 100000;
- });
- addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
- return this.millisecond() * 1000000;
- });
-
-
- // ALIASES
-
- addUnitAlias('millisecond', 'ms');
-
- // PARSING
-
- addRegexToken('S', match1to3, match1);
- addRegexToken('SS', match1to3, match2);
- addRegexToken('SSS', match1to3, match3);
-
- var token;
- for (token = 'SSSS'; token.length <= 9; token += 'S') {
- addRegexToken(token, matchUnsigned);
- }
-
- function parseMs(input, array) {
- array[MILLISECOND] = toInt(('0.' + input) * 1000);
- }
-
- for (token = 'S'; token.length <= 9; token += 'S') {
- addParseToken(token, parseMs);
- }
- // MOMENTS
-
- var getSetMillisecond = makeGetSet('Milliseconds', false);
-
- addFormatToken('z', 0, 0, 'zoneAbbr');
- addFormatToken('zz', 0, 0, 'zoneName');
-
- // MOMENTS
-
- function getZoneAbbr () {
- return this._isUTC ? 'UTC' : '';
- }
-
- function getZoneName () {
- return this._isUTC ? 'Coordinated Universal Time' : '';
- }
-
- var momentPrototype__proto = Moment.prototype;
-
- momentPrototype__proto.add = add_subtract__add;
- momentPrototype__proto.calendar = moment_calendar__calendar;
- momentPrototype__proto.clone = clone;
- momentPrototype__proto.diff = diff;
- momentPrototype__proto.endOf = endOf;
- momentPrototype__proto.format = format;
- momentPrototype__proto.from = from;
- momentPrototype__proto.fromNow = fromNow;
- momentPrototype__proto.to = to;
- momentPrototype__proto.toNow = toNow;
- momentPrototype__proto.get = getSet;
- momentPrototype__proto.invalidAt = invalidAt;
- momentPrototype__proto.isAfter = isAfter;
- momentPrototype__proto.isBefore = isBefore;
- momentPrototype__proto.isBetween = isBetween;
- momentPrototype__proto.isSame = isSame;
- momentPrototype__proto.isValid = moment_valid__isValid;
- momentPrototype__proto.lang = lang;
- momentPrototype__proto.locale = locale;
- momentPrototype__proto.localeData = localeData;
- momentPrototype__proto.max = prototypeMax;
- momentPrototype__proto.min = prototypeMin;
- momentPrototype__proto.parsingFlags = parsingFlags;
- momentPrototype__proto.set = getSet;
- momentPrototype__proto.startOf = startOf;
- momentPrototype__proto.subtract = add_subtract__subtract;
- momentPrototype__proto.toArray = toArray;
- momentPrototype__proto.toObject = toObject;
- momentPrototype__proto.toDate = toDate;
- momentPrototype__proto.toISOString = moment_format__toISOString;
- momentPrototype__proto.toJSON = moment_format__toISOString;
- momentPrototype__proto.toString = toString;
- momentPrototype__proto.unix = unix;
- momentPrototype__proto.valueOf = to_type__valueOf;
-
- // Year
- momentPrototype__proto.year = getSetYear;
- momentPrototype__proto.isLeapYear = getIsLeapYear;
-
- // Week Year
- momentPrototype__proto.weekYear = getSetWeekYear;
- momentPrototype__proto.isoWeekYear = getSetISOWeekYear;
-
- // Quarter
- momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter;
-
- // Month
- momentPrototype__proto.month = getSetMonth;
- momentPrototype__proto.daysInMonth = getDaysInMonth;
-
- // Week
- momentPrototype__proto.week = momentPrototype__proto.weeks = getSetWeek;
- momentPrototype__proto.isoWeek = momentPrototype__proto.isoWeeks = getSetISOWeek;
- momentPrototype__proto.weeksInYear = getWeeksInYear;
- momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear;
-
- // Day
- momentPrototype__proto.date = getSetDayOfMonth;
- momentPrototype__proto.day = momentPrototype__proto.days = getSetDayOfWeek;
- momentPrototype__proto.weekday = getSetLocaleDayOfWeek;
- momentPrototype__proto.isoWeekday = getSetISODayOfWeek;
- momentPrototype__proto.dayOfYear = getSetDayOfYear;
-
- // Hour
- momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour;
-
- // Minute
- momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute;
-
- // Second
- momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond;
-
- // Millisecond
- momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond;
-
- // Offset
- momentPrototype__proto.utcOffset = getSetOffset;
- momentPrototype__proto.utc = setOffsetToUTC;
- momentPrototype__proto.local = setOffsetToLocal;
- momentPrototype__proto.parseZone = setOffsetToParsedOffset;
- momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset;
- momentPrototype__proto.isDST = isDaylightSavingTime;
- momentPrototype__proto.isDSTShifted = isDaylightSavingTimeShifted;
- momentPrototype__proto.isLocal = isLocal;
- momentPrototype__proto.isUtcOffset = isUtcOffset;
- momentPrototype__proto.isUtc = isUtc;
- momentPrototype__proto.isUTC = isUtc;
-
- // Timezone
- momentPrototype__proto.zoneAbbr = getZoneAbbr;
- momentPrototype__proto.zoneName = getZoneName;
-
- // Deprecations
- momentPrototype__proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
- momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
- momentPrototype__proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);
- momentPrototype__proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779', getSetZone);
-
- var momentPrototype = momentPrototype__proto;
-
- function moment__createUnix (input) {
- return local__createLocal(input * 1000);
- }
-
- function moment__createInZone () {
- return local__createLocal.apply(null, arguments).parseZone();
- }
-
- var defaultCalendar = {
- sameDay : '[Today at] LT',
- nextDay : '[Tomorrow at] LT',
- nextWeek : 'dddd [at] LT',
- lastDay : '[Yesterday at] LT',
- lastWeek : '[Last] dddd [at] LT',
- sameElse : 'L'
- };
-
- function locale_calendar__calendar (key, mom, now) {
- var output = this._calendar[key];
- return typeof output === 'function' ? output.call(mom, now) : output;
- }
-
- var defaultLongDateFormat = {
- LTS : 'h:mm:ss A',
- LT : 'h:mm A',
- L : 'MM/DD/YYYY',
- LL : 'MMMM D, YYYY',
- LLL : 'MMMM D, YYYY h:mm A',
- LLLL : 'dddd, MMMM D, YYYY h:mm A'
- };
-
- function longDateFormat (key) {
- var format = this._longDateFormat[key],
- formatUpper = this._longDateFormat[key.toUpperCase()];
-
- if (format || !formatUpper) {
- return format;
- }
-
- this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
- return val.slice(1);
- });
-
- return this._longDateFormat[key];
- }
-
- var defaultInvalidDate = 'Invalid date';
-
- function invalidDate () {
- return this._invalidDate;
- }
-
- var defaultOrdinal = '%d';
- var defaultOrdinalParse = /\d{1,2}/;
-
- function ordinal (number) {
- return this._ordinal.replace('%d', number);
- }
-
- function preParsePostFormat (string) {
- return string;
- }
-
- var defaultRelativeTime = {
- future : 'in %s',
- past : '%s ago',
- s : 'a few seconds',
- m : 'a minute',
- mm : '%d minutes',
- h : 'an hour',
- hh : '%d hours',
- d : 'a day',
- dd : '%d days',
- M : 'a month',
- MM : '%d months',
- y : 'a year',
- yy : '%d years'
- };
-
- function relative__relativeTime (number, withoutSuffix, string, isFuture) {
- var output = this._relativeTime[string];
- return (typeof output === 'function') ?
- output(number, withoutSuffix, string, isFuture) :
- output.replace(/%d/i, number);
- }
-
- function pastFuture (diff, output) {
- var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
- return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
- }
-
- function locale_set__set (config) {
- var prop, i;
- for (i in config) {
- prop = config[i];
- if (typeof prop === 'function') {
- this[i] = prop;
- } else {
- this['_' + i] = prop;
- }
- }
- // Lenient ordinal parsing accepts just a number in addition to
- // number + (possibly) stuff coming from _ordinalParseLenient.
- this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
- }
-
- var prototype__proto = Locale.prototype;
-
- prototype__proto._calendar = defaultCalendar;
- prototype__proto.calendar = locale_calendar__calendar;
- prototype__proto._longDateFormat = defaultLongDateFormat;
- prototype__proto.longDateFormat = longDateFormat;
- prototype__proto._invalidDate = defaultInvalidDate;
- prototype__proto.invalidDate = invalidDate;
- prototype__proto._ordinal = defaultOrdinal;
- prototype__proto.ordinal = ordinal;
- prototype__proto._ordinalParse = defaultOrdinalParse;
- prototype__proto.preparse = preParsePostFormat;
- prototype__proto.postformat = preParsePostFormat;
- prototype__proto._relativeTime = defaultRelativeTime;
- prototype__proto.relativeTime = relative__relativeTime;
- prototype__proto.pastFuture = pastFuture;
- prototype__proto.set = locale_set__set;
-
- // Month
- prototype__proto.months = localeMonths;
- prototype__proto._months = defaultLocaleMonths;
- prototype__proto.monthsShort = localeMonthsShort;
- prototype__proto._monthsShort = defaultLocaleMonthsShort;
- prototype__proto.monthsParse = localeMonthsParse;
-
- // Week
- prototype__proto.week = localeWeek;
- prototype__proto._week = defaultLocaleWeek;
- prototype__proto.firstDayOfYear = localeFirstDayOfYear;
- prototype__proto.firstDayOfWeek = localeFirstDayOfWeek;
-
- // Day of Week
- prototype__proto.weekdays = localeWeekdays;
- prototype__proto._weekdays = defaultLocaleWeekdays;
- prototype__proto.weekdaysMin = localeWeekdaysMin;
- prototype__proto._weekdaysMin = defaultLocaleWeekdaysMin;
- prototype__proto.weekdaysShort = localeWeekdaysShort;
- prototype__proto._weekdaysShort = defaultLocaleWeekdaysShort;
- prototype__proto.weekdaysParse = localeWeekdaysParse;
-
- // Hours
- prototype__proto.isPM = localeIsPM;
- prototype__proto._meridiemParse = defaultLocaleMeridiemParse;
- prototype__proto.meridiem = localeMeridiem;
-
- function lists__get (format, index, field, setter) {
- var locale = locale_locales__getLocale();
- var utc = create_utc__createUTC().set(setter, index);
- return locale[field](utc, format);
- }
-
- function list (format, index, field, count, setter) {
- if (typeof format === 'number') {
- index = format;
- format = undefined;
- }
-
- format = format || '';
-
- if (index != null) {
- return lists__get(format, index, field, setter);
- }
-
- var i;
- var out = [];
- for (i = 0; i < count; i++) {
- out[i] = lists__get(format, i, field, setter);
- }
- return out;
- }
-
- function lists__listMonths (format, index) {
- return list(format, index, 'months', 12, 'month');
- }
-
- function lists__listMonthsShort (format, index) {
- return list(format, index, 'monthsShort', 12, 'month');
- }
-
- function lists__listWeekdays (format, index) {
- return list(format, index, 'weekdays', 7, 'day');
- }
-
- function lists__listWeekdaysShort (format, index) {
- return list(format, index, 'weekdaysShort', 7, 'day');
- }
-
- function lists__listWeekdaysMin (format, index) {
- return list(format, index, 'weekdaysMin', 7, 'day');
- }
-
- locale_locales__getSetGlobalLocale('en', {
- ordinalParse: /\d{1,2}(th|st|nd|rd)/,
- ordinal : function (number) {
- var b = number % 10,
- output = (toInt(number % 100 / 10) === 1) ? 'th' :
- (b === 1) ? 'st' :
- (b === 2) ? 'nd' :
- (b === 3) ? 'rd' : 'th';
- return number + output;
- }
- });
-
- // Side effect imports
- utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale);
- utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale);
-
- var mathAbs = Math.abs;
-
- function duration_abs__abs () {
- var data = this._data;
-
- this._milliseconds = mathAbs(this._milliseconds);
- this._days = mathAbs(this._days);
- this._months = mathAbs(this._months);
-
- data.milliseconds = mathAbs(data.milliseconds);
- data.seconds = mathAbs(data.seconds);
- data.minutes = mathAbs(data.minutes);
- data.hours = mathAbs(data.hours);
- data.months = mathAbs(data.months);
- data.years = mathAbs(data.years);
-
- return this;
- }
-
- function duration_add_subtract__addSubtract (duration, input, value, direction) {
- var other = create__createDuration(input, value);
-
- duration._milliseconds += direction * other._milliseconds;
- duration._days += direction * other._days;
- duration._months += direction * other._months;
-
- return duration._bubble();
- }
-
- // supports only 2.0-style add(1, 's') or add(duration)
- function duration_add_subtract__add (input, value) {
- return duration_add_subtract__addSubtract(this, input, value, 1);
- }
-
- // supports only 2.0-style subtract(1, 's') or subtract(duration)
- function duration_add_subtract__subtract (input, value) {
- return duration_add_subtract__addSubtract(this, input, value, -1);
- }
-
- function absCeil (number) {
- if (number < 0) {
- return Math.floor(number);
- } else {
- return Math.ceil(number);
- }
- }
-
- function bubble () {
- var milliseconds = this._milliseconds;
- var days = this._days;
- var months = this._months;
- var data = this._data;
- var seconds, minutes, hours, years, monthsFromDays;
-
- // if we have a mix of positive and negative values, bubble down first
- // check: https://github.com/moment/moment/issues/2166
- if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
- (milliseconds <= 0 && days <= 0 && months <= 0))) {
- milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
- days = 0;
- months = 0;
- }
-
- // The following code bubbles up values, see the tests for
- // examples of what that means.
- data.milliseconds = milliseconds % 1000;
-
- seconds = absFloor(milliseconds / 1000);
- data.seconds = seconds % 60;
-
- minutes = absFloor(seconds / 60);
- data.minutes = minutes % 60;
-
- hours = absFloor(minutes / 60);
- data.hours = hours % 24;
-
- days += absFloor(hours / 24);
-
- // convert days to months
- monthsFromDays = absFloor(daysToMonths(days));
- months += monthsFromDays;
- days -= absCeil(monthsToDays(monthsFromDays));
-
- // 12 months -> 1 year
- years = absFloor(months / 12);
- months %= 12;
-
- data.days = days;
- data.months = months;
- data.years = years;
-
- return this;
- }
-
- function daysToMonths (days) {
- // 400 years have 146097 days (taking into account leap year rules)
- // 400 years have 12 months === 4800
- return days * 4800 / 146097;
- }
-
- function monthsToDays (months) {
- // the reverse of daysToMonths
- return months * 146097 / 4800;
- }
-
- function as (units) {
- var days;
- var months;
- var milliseconds = this._milliseconds;
-
- units = normalizeUnits(units);
-
- if (units === 'month' || units === 'year') {
- days = this._days + milliseconds / 864e5;
- months = this._months + daysToMonths(days);
- return units === 'month' ? months : months / 12;
- } else {
- // handle milliseconds separately because of floating point math errors (issue #1867)
- days = this._days + Math.round(monthsToDays(this._months));
- switch (units) {
- case 'week' : return days / 7 + milliseconds / 6048e5;
- case 'day' : return days + milliseconds / 864e5;
- case 'hour' : return days * 24 + milliseconds / 36e5;
- case 'minute' : return days * 1440 + milliseconds / 6e4;
- case 'second' : return days * 86400 + milliseconds / 1000;
- // Math.floor prevents floating point math errors here
- case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
- default: throw new Error('Unknown unit ' + units);
- }
- }
- }
-
- // TODO: Use this.as('ms')?
- function duration_as__valueOf () {
- return (
- this._milliseconds +
- this._days * 864e5 +
- (this._months % 12) * 2592e6 +
- toInt(this._months / 12) * 31536e6
- );
- }
-
- function makeAs (alias) {
- return function () {
- return this.as(alias);
- };
- }
-
- var asMilliseconds = makeAs('ms');
- var asSeconds = makeAs('s');
- var asMinutes = makeAs('m');
- var asHours = makeAs('h');
- var asDays = makeAs('d');
- var asWeeks = makeAs('w');
- var asMonths = makeAs('M');
- var asYears = makeAs('y');
-
- function duration_get__get (units) {
- units = normalizeUnits(units);
- return this[units + 's']();
- }
-
- function makeGetter(name) {
- return function () {
- return this._data[name];
- };
- }
-
- var milliseconds = makeGetter('milliseconds');
- var seconds = makeGetter('seconds');
- var minutes = makeGetter('minutes');
- var hours = makeGetter('hours');
- var days = makeGetter('days');
- var months = makeGetter('months');
- var years = makeGetter('years');
-
- function weeks () {
- return absFloor(this.days() / 7);
- }
-
- var round = Math.round;
- var thresholds = {
- s: 45, // seconds to minute
- m: 45, // minutes to hour
- h: 22, // hours to day
- d: 26, // days to month
- M: 11 // months to year
- };
-
- // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
- function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
- return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
- }
-
- function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) {
- var duration = create__createDuration(posNegDuration).abs();
- var seconds = round(duration.as('s'));
- var minutes = round(duration.as('m'));
- var hours = round(duration.as('h'));
- var days = round(duration.as('d'));
- var months = round(duration.as('M'));
- var years = round(duration.as('y'));
-
- var a = seconds < thresholds.s && ['s', seconds] ||
- minutes === 1 && ['m'] ||
- minutes < thresholds.m && ['mm', minutes] ||
- hours === 1 && ['h'] ||
- hours < thresholds.h && ['hh', hours] ||
- days === 1 && ['d'] ||
- days < thresholds.d && ['dd', days] ||
- months === 1 && ['M'] ||
- months < thresholds.M && ['MM', months] ||
- years === 1 && ['y'] || ['yy', years];
-
- a[2] = withoutSuffix;
- a[3] = +posNegDuration > 0;
- a[4] = locale;
- return substituteTimeAgo.apply(null, a);
- }
-
- // This function allows you to set a threshold for relative time strings
- function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) {
- if (thresholds[threshold] === undefined) {
- return false;
- }
- if (limit === undefined) {
- return thresholds[threshold];
- }
- thresholds[threshold] = limit;
- return true;
- }
-
- function humanize (withSuffix) {
- var locale = this.localeData();
- var output = duration_humanize__relativeTime(this, !withSuffix, locale);
-
- if (withSuffix) {
- output = locale.pastFuture(+this, output);
- }
-
- return locale.postformat(output);
- }
-
- var iso_string__abs = Math.abs;
-
- function iso_string__toISOString() {
- // for ISO strings we do not use the normal bubbling rules:
- // * milliseconds bubble up until they become hours
- // * days do not bubble at all
- // * months bubble up until they become years
- // This is because there is no context-free conversion between hours and days
- // (think of clock changes)
- // and also not between days and months (28-31 days per month)
- var seconds = iso_string__abs(this._milliseconds) / 1000;
- var days = iso_string__abs(this._days);
- var months = iso_string__abs(this._months);
- var minutes, hours, years;
-
- // 3600 seconds -> 60 minutes -> 1 hour
- minutes = absFloor(seconds / 60);
- hours = absFloor(minutes / 60);
- seconds %= 60;
- minutes %= 60;
-
- // 12 months -> 1 year
- years = absFloor(months / 12);
- months %= 12;
-
-
- // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
- var Y = years;
- var M = months;
- var D = days;
- var h = hours;
- var m = minutes;
- var s = seconds;
- var total = this.asSeconds();
-
- if (!total) {
- // this is the same as C#'s (Noda) and python (isodate)...
- // but not other JS (goog.date)
- return 'P0D';
- }
-
- return (total < 0 ? '-' : '') +
- 'P' +
- (Y ? Y + 'Y' : '') +
- (M ? M + 'M' : '') +
- (D ? D + 'D' : '') +
- ((h || m || s) ? 'T' : '') +
- (h ? h + 'H' : '') +
- (m ? m + 'M' : '') +
- (s ? s + 'S' : '');
- }
-
- var duration_prototype__proto = Duration.prototype;
-
- duration_prototype__proto.abs = duration_abs__abs;
- duration_prototype__proto.add = duration_add_subtract__add;
- duration_prototype__proto.subtract = duration_add_subtract__subtract;
- duration_prototype__proto.as = as;
- duration_prototype__proto.asMilliseconds = asMilliseconds;
- duration_prototype__proto.asSeconds = asSeconds;
- duration_prototype__proto.asMinutes = asMinutes;
- duration_prototype__proto.asHours = asHours;
- duration_prototype__proto.asDays = asDays;
- duration_prototype__proto.asWeeks = asWeeks;
- duration_prototype__proto.asMonths = asMonths;
- duration_prototype__proto.asYears = asYears;
- duration_prototype__proto.valueOf = duration_as__valueOf;
- duration_prototype__proto._bubble = bubble;
- duration_prototype__proto.get = duration_get__get;
- duration_prototype__proto.milliseconds = milliseconds;
- duration_prototype__proto.seconds = seconds;
- duration_prototype__proto.minutes = minutes;
- duration_prototype__proto.hours = hours;
- duration_prototype__proto.days = days;
- duration_prototype__proto.weeks = weeks;
- duration_prototype__proto.months = months;
- duration_prototype__proto.years = years;
- duration_prototype__proto.humanize = humanize;
- duration_prototype__proto.toISOString = iso_string__toISOString;
- duration_prototype__proto.toString = iso_string__toISOString;
- duration_prototype__proto.toJSON = iso_string__toISOString;
- duration_prototype__proto.locale = locale;
- duration_prototype__proto.localeData = localeData;
-
- // Deprecations
- duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString);
- duration_prototype__proto.lang = lang;
-
- // Side effect imports
-
- addFormatToken('X', 0, 0, 'unix');
- addFormatToken('x', 0, 0, 'valueOf');
-
- // PARSING
-
- addRegexToken('x', matchSigned);
- addRegexToken('X', matchTimestamp);
- addParseToken('X', function (input, array, config) {
- config._d = new Date(parseFloat(input, 10) * 1000);
- });
- addParseToken('x', function (input, array, config) {
- config._d = new Date(toInt(input));
- });
-
- // Side effect imports
-
-
- utils_hooks__hooks.version = '2.10.6';
-
- setHookCallback(local__createLocal);
-
- utils_hooks__hooks.fn = momentPrototype;
- utils_hooks__hooks.min = min;
- utils_hooks__hooks.max = max;
- utils_hooks__hooks.utc = create_utc__createUTC;
- utils_hooks__hooks.unix = moment__createUnix;
- utils_hooks__hooks.months = lists__listMonths;
- utils_hooks__hooks.isDate = isDate;
- utils_hooks__hooks.locale = locale_locales__getSetGlobalLocale;
- utils_hooks__hooks.invalid = valid__createInvalid;
- utils_hooks__hooks.duration = create__createDuration;
- utils_hooks__hooks.isMoment = isMoment;
- utils_hooks__hooks.weekdays = lists__listWeekdays;
- utils_hooks__hooks.parseZone = moment__createInZone;
- utils_hooks__hooks.localeData = locale_locales__getLocale;
- utils_hooks__hooks.isDuration = isDuration;
- utils_hooks__hooks.monthsShort = lists__listMonthsShort;
- utils_hooks__hooks.weekdaysMin = lists__listWeekdaysMin;
- utils_hooks__hooks.defineLocale = defineLocale;
- utils_hooks__hooks.weekdaysShort = lists__listWeekdaysShort;
- utils_hooks__hooks.normalizeUnits = normalizeUnits;
- utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold;
-
- var _moment = utils_hooks__hooks;
-
- return _moment;
-
-}));
-},{}],32:[function(require,module,exports){
-'use strict';
-
-module.exports = require('react/lib/ReactDOM');
-
-},{"react/lib/ReactDOM":109}],33:[function(require,module,exports){
-/**
- * Represents a cancellation caused by navigating away
- * before the previous transition has fully resolved.
- */
-"use strict";
-
-function Cancellation() {}
-
-module.exports = Cancellation;
-},{}],34:[function(require,module,exports){
-'use strict';
-
-var invariant = require('invariant');
-var canUseDOM = require('can-use-dom');
-
-var History = {
-
- /**
- * The current number of entries in the history.
- *
- * Note: This property is read-only.
- */
- length: 1,
-
- /**
- * Sends the browser back one entry in the history.
- */
- back: function back() {
- invariant(canUseDOM, 'Cannot use History.back without a DOM');
-
- // Do this first so that History.length will
- // be accurate in location change listeners.
- History.length -= 1;
-
- window.history.back();
- }
-
-};
-
-module.exports = History;
-},{"can-use-dom":67,"invariant":68}],35:[function(require,module,exports){
-/* jshint -W084 */
-'use strict';
-
-var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-var PathUtils = require('./PathUtils');
-
-function deepSearch(route, pathname, query) {
- // Check the subtree first to find the most deeply-nested match.
- var childRoutes = route.childRoutes;
- if (childRoutes) {
- var match, childRoute;
- for (var i = 0, len = childRoutes.length; i < len; ++i) {
- childRoute = childRoutes[i];
-
- if (childRoute.isDefault || childRoute.isNotFound) continue; // Check these in order later.
-
- if (match = deepSearch(childRoute, pathname, query)) {
- // A route in the subtree matched! Add this route and we're done.
- match.routes.unshift(route);
- return match;
- }
- }
- }
-
- // No child routes matched; try the default route.
- var defaultRoute = route.defaultRoute;
- if (defaultRoute && (params = PathUtils.extractParams(defaultRoute.path, pathname))) return new Match(pathname, params, query, [route, defaultRoute]);
-
- // Does the "not found" route match?
- var notFoundRoute = route.notFoundRoute;
- if (notFoundRoute && (params = PathUtils.extractParams(notFoundRoute.path, pathname))) return new Match(pathname, params, query, [route, notFoundRoute]);
-
- // Last attempt: check this route.
- var params = PathUtils.extractParams(route.path, pathname);
- if (params) return new Match(pathname, params, query, [route]);
-
- return null;
-}
-
-var Match = (function () {
- _createClass(Match, null, [{
- key: 'findMatch',
-
- /**
- * Attempts to match depth-first a route in the given route's
- * subtree against the given path and returns the match if it
- * succeeds, null if no match can be made.
- */
- value: function findMatch(routes, path) {
- var pathname = PathUtils.withoutQuery(path);
- var query = PathUtils.extractQuery(path);
- var match = null;
-
- for (var i = 0, len = routes.length; match == null && i < len; ++i) match = deepSearch(routes[i], pathname, query);
-
- return match;
- }
- }]);
-
- function Match(pathname, params, query, routes) {
- _classCallCheck(this, Match);
-
- this.pathname = pathname;
- this.params = params;
- this.query = query;
- this.routes = routes;
- }
-
- return Match;
-})();
-
-module.exports = Match;
-},{"./PathUtils":37}],36:[function(require,module,exports){
-'use strict';
-
-var PropTypes = require('./PropTypes');
-
-/**
- * A mixin for components that modify the URL.
- *
- * Example:
- *
- * var MyLink = React.createClass({
- * mixins: [ Router.Navigation ],
- * handleClick(event) {
- * event.preventDefault();
- * this.transitionTo('aRoute', { the: 'params' }, { the: 'query' });
- * },
- * render() {
- * return (
- * Click me!
- * );
- * }
- * });
- */
-var Navigation = {
-
- contextTypes: {
- router: PropTypes.router.isRequired
- },
-
- /**
- * Returns an absolute URL path created from the given route
- * name, URL parameters, and query values.
- */
- makePath: function makePath(to, params, query) {
- return this.context.router.makePath(to, params, query);
- },
-
- /**
- * Returns a string that may safely be used as the href of a
- * link to the route with the given name.
- */
- makeHref: function makeHref(to, params, query) {
- return this.context.router.makeHref(to, params, query);
- },
-
- /**
- * Transitions to the URL specified in the arguments by pushing
- * a new URL onto the history stack.
- */
- transitionTo: function transitionTo(to, params, query) {
- this.context.router.transitionTo(to, params, query);
- },
-
- /**
- * Transitions to the URL specified in the arguments by replacing
- * the current URL in the history stack.
- */
- replaceWith: function replaceWith(to, params, query) {
- this.context.router.replaceWith(to, params, query);
- },
-
- /**
- * Transitions to the previous URL.
- */
- goBack: function goBack() {
- return this.context.router.goBack();
- }
-
-};
-
-module.exports = Navigation;
-},{"./PropTypes":38}],37:[function(require,module,exports){
-'use strict';
-
-var invariant = require('invariant');
-var assign = require('object-assign');
-var qs = require('qs');
-
-var paramCompileMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$]*)|[*.()\[\]\\+|{}^$]/g;
-var paramInjectMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$?]*[?]?)|[*]/g;
-var paramInjectTrailingSlashMatcher = /\/\/\?|\/\?\/|\/\?(?![^\/=]+=.*$)/g;
-var queryMatcher = /\?(.*)$/;
-
-var _compiledPatterns = {};
-
-function compilePattern(pattern) {
- if (!(pattern in _compiledPatterns)) {
- var paramNames = [];
- var source = pattern.replace(paramCompileMatcher, function (match, paramName) {
- if (paramName) {
- paramNames.push(paramName);
- return '([^/?#]+)';
- } else if (match === '*') {
- paramNames.push('splat');
- return '(.*?)';
- } else {
- return '\\' + match;
- }
- });
-
- _compiledPatterns[pattern] = {
- matcher: new RegExp('^' + source + '$', 'i'),
- paramNames: paramNames
- };
- }
-
- return _compiledPatterns[pattern];
-}
-
-var PathUtils = {
-
- /**
- * Returns true if the given path is absolute.
- */
- isAbsolute: function isAbsolute(path) {
- return path.charAt(0) === '/';
- },
-
- /**
- * Joins two URL paths together.
- */
- join: function join(a, b) {
- return a.replace(/\/*$/, '/') + b;
- },
-
- /**
- * Returns an array of the names of all parameters in the given pattern.
- */
- extractParamNames: function extractParamNames(pattern) {
- return compilePattern(pattern).paramNames;
- },
-
- /**
- * Extracts the portions of the given URL path that match the given pattern
- * and returns an object of param name => value pairs. Returns null if the
- * pattern does not match the given path.
- */
- extractParams: function extractParams(pattern, path) {
- var _compilePattern = compilePattern(pattern);
-
- var matcher = _compilePattern.matcher;
- var paramNames = _compilePattern.paramNames;
-
- var match = path.match(matcher);
-
- if (!match) return null;
-
- var params = {};
-
- paramNames.forEach(function (paramName, index) {
- params[paramName] = match[index + 1];
- });
-
- return params;
- },
-
- /**
- * Returns a version of the given route path with params interpolated. Throws
- * if there is a dynamic segment of the route path for which there is no param.
- */
- injectParams: function injectParams(pattern, params) {
- params = params || {};
-
- var splatIndex = 0;
-
- return pattern.replace(paramInjectMatcher, function (match, paramName) {
- paramName = paramName || 'splat';
-
- // If param is optional don't check for existence
- if (paramName.slice(-1) === '?') {
- paramName = paramName.slice(0, -1);
-
- if (params[paramName] == null) return '';
- } else {
- invariant(params[paramName] != null, 'Missing "%s" parameter for path "%s"', paramName, pattern);
- }
-
- var segment;
- if (paramName === 'splat' && Array.isArray(params[paramName])) {
- segment = params[paramName][splatIndex++];
-
- invariant(segment != null, 'Missing splat # %s for path "%s"', splatIndex, pattern);
- } else {
- segment = params[paramName];
- }
-
- return segment;
- }).replace(paramInjectTrailingSlashMatcher, '/');
- },
-
- /**
- * Returns an object that is the result of parsing any query string contained
- * in the given path, null if the path contains no query string.
- */
- extractQuery: function extractQuery(path) {
- var match = path.match(queryMatcher);
- return match && qs.parse(match[1]);
- },
-
- /**
- * Returns a version of the given path without the query string.
- */
- withoutQuery: function withoutQuery(path) {
- return path.replace(queryMatcher, '');
- },
-
- /**
- * Returns a version of the given path with the parameters in the given
- * query merged into the query string.
- */
- withQuery: function withQuery(path, query) {
- var existingQuery = PathUtils.extractQuery(path);
-
- if (existingQuery) query = query ? assign(existingQuery, query) : existingQuery;
-
- var queryString = qs.stringify(query, { arrayFormat: 'brackets' });
-
- if (queryString) return PathUtils.withoutQuery(path) + '?' + queryString;
-
- return PathUtils.withoutQuery(path);
- }
-
-};
-
-module.exports = PathUtils;
-},{"invariant":68,"object-assign":69,"qs":70}],38:[function(require,module,exports){
-'use strict';
-
-var assign = require('react/lib/Object.assign');
-var ReactPropTypes = require('react').PropTypes;
-var Route = require('./Route');
-
-var PropTypes = assign({}, ReactPropTypes, {
-
- /**
- * Indicates that a prop should be falsy.
- */
- falsy: function falsy(props, propName, componentName) {
- if (props[propName]) return new Error('<' + componentName + '> should not have a "' + propName + '" prop');
- },
-
- /**
- * Indicates that a prop should be a Route object.
- */
- route: ReactPropTypes.instanceOf(Route),
-
- /**
- * Indicates that a prop should be a Router object.
- */
- //router: ReactPropTypes.instanceOf(Router) // TODO
- router: ReactPropTypes.func
-
-});
-
-module.exports = PropTypes;
-},{"./Route":40,"react":230,"react/lib/Object.assign":96}],39:[function(require,module,exports){
-/**
- * Encapsulates a redirect to the given route.
- */
-"use strict";
-
-function Redirect(to, params, query) {
- this.to = to;
- this.params = params;
- this.query = query;
-}
-
-module.exports = Redirect;
-},{}],40:[function(require,module,exports){
-'use strict';
-
-var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-var assign = require('react/lib/Object.assign');
-var invariant = require('invariant');
-var warning = require('./warning');
-var PathUtils = require('./PathUtils');
-
-var _currentRoute;
-
-var Route = (function () {
- _createClass(Route, null, [{
- key: 'createRoute',
-
- /**
- * Creates and returns a new route. Options may be a URL pathname string
- * with placeholders for named params or an object with any of the following
- * properties:
- *
- * - name The name of the route. This is used to lookup a
- * route relative to its parent route and should be
- * unique among all child routes of the same parent
- * - path A URL pathname string with optional placeholders
- * that specify the names of params to extract from
- * the URL when the path matches. Defaults to `/${name}`
- * when there is a name given, or the path of the parent
- * route, or /
- * - ignoreScrollBehavior True to make this route (and all descendants) ignore
- * the scroll behavior of the router
- * - isDefault True to make this route the default route among all
- * its siblings
- * - isNotFound True to make this route the "not found" route among
- * all its siblings
- * - onEnter A transition hook that will be called when the
- * router is going to enter this route
- * - onLeave A transition hook that will be called when the
- * router is going to leave this route
- * - handler A React component that will be rendered when
- * this route is active
- * - parentRoute The parent route to use for this route. This option
- * is automatically supplied when creating routes inside
- * the callback to another invocation of createRoute. You
- * only ever need to use this when declaring routes
- * independently of one another to manually piece together
- * the route hierarchy
- *
- * The callback may be used to structure your route hierarchy. Any call to
- * createRoute, createDefaultRoute, createNotFoundRoute, or createRedirect
- * inside the callback automatically uses this route as its parent.
- */
- value: function createRoute(options, callback) {
- options = options || {};
-
- if (typeof options === 'string') options = { path: options };
-
- var parentRoute = _currentRoute;
-
- if (parentRoute) {
- warning(options.parentRoute == null || options.parentRoute === parentRoute, 'You should not use parentRoute with createRoute inside another route\'s child callback; it is ignored');
- } else {
- parentRoute = options.parentRoute;
- }
-
- var name = options.name;
- var path = options.path || name;
-
- if (path && !(options.isDefault || options.isNotFound)) {
- if (PathUtils.isAbsolute(path)) {
- if (parentRoute) {
- invariant(path === parentRoute.path || parentRoute.paramNames.length === 0, 'You cannot nest path "%s" inside "%s"; the parent requires URL parameters', path, parentRoute.path);
- }
- } else if (parentRoute) {
- // Relative paths extend their parent.
- path = PathUtils.join(parentRoute.path, path);
- } else {
- path = '/' + path;
- }
- } else {
- path = parentRoute ? parentRoute.path : '/';
- }
-
- if (options.isNotFound && !/\*$/.test(path)) path += '*'; // Auto-append * to the path of not found routes.
-
- var route = new Route(name, path, options.ignoreScrollBehavior, options.isDefault, options.isNotFound, options.onEnter, options.onLeave, options.handler);
-
- if (parentRoute) {
- if (route.isDefault) {
- invariant(parentRoute.defaultRoute == null, '%s may not have more than one default route', parentRoute);
-
- parentRoute.defaultRoute = route;
- } else if (route.isNotFound) {
- invariant(parentRoute.notFoundRoute == null, '%s may not have more than one not found route', parentRoute);
-
- parentRoute.notFoundRoute = route;
- }
-
- parentRoute.appendChild(route);
- }
-
- // Any routes created in the callback
- // use this route as their parent.
- if (typeof callback === 'function') {
- var currentRoute = _currentRoute;
- _currentRoute = route;
- callback.call(route, route);
- _currentRoute = currentRoute;
- }
-
- return route;
- }
-
- /**
- * Creates and returns a route that is rendered when its parent matches
- * the current URL.
- */
- }, {
- key: 'createDefaultRoute',
- value: function createDefaultRoute(options) {
- return Route.createRoute(assign({}, options, { isDefault: true }));
- }
-
- /**
- * Creates and returns a route that is rendered when its parent matches
- * the current URL but none of its siblings do.
- */
- }, {
- key: 'createNotFoundRoute',
- value: function createNotFoundRoute(options) {
- return Route.createRoute(assign({}, options, { isNotFound: true }));
- }
-
- /**
- * Creates and returns a route that automatically redirects the transition
- * to another route. In addition to the normal options to createRoute, this
- * function accepts the following options:
- *
- * - from An alias for the `path` option. Defaults to *
- * - to The path/route/route name to redirect to
- * - params The params to use in the redirect URL. Defaults
- * to using the current params
- * - query The query to use in the redirect URL. Defaults
- * to using the current query
- */
- }, {
- key: 'createRedirect',
- value: function createRedirect(options) {
- return Route.createRoute(assign({}, options, {
- path: options.path || options.from || '*',
- onEnter: function onEnter(transition, params, query) {
- transition.redirect(options.to, options.params || params, options.query || query);
- }
- }));
- }
- }]);
-
- function Route(name, path, ignoreScrollBehavior, isDefault, isNotFound, onEnter, onLeave, handler) {
- _classCallCheck(this, Route);
-
- this.name = name;
- this.path = path;
- this.paramNames = PathUtils.extractParamNames(this.path);
- this.ignoreScrollBehavior = !!ignoreScrollBehavior;
- this.isDefault = !!isDefault;
- this.isNotFound = !!isNotFound;
- this.onEnter = onEnter;
- this.onLeave = onLeave;
- this.handler = handler;
- }
-
- /**
- * Appends the given route to this route's child routes.
- */
-
- _createClass(Route, [{
- key: 'appendChild',
- value: function appendChild(route) {
- invariant(route instanceof Route, 'route.appendChild must use a valid Route');
-
- if (!this.childRoutes) this.childRoutes = [];
-
- this.childRoutes.push(route);
- }
- }, {
- key: 'toString',
- value: function toString() {
- var string = '';
-
- return string;
- }
- }]);
-
- return Route;
-})();
-
-module.exports = Route;
-},{"./PathUtils":37,"./warning":66,"invariant":68,"react/lib/Object.assign":96}],41:[function(require,module,exports){
-'use strict';
-
-var invariant = require('invariant');
-var canUseDOM = require('can-use-dom');
-var getWindowScrollPosition = require('./getWindowScrollPosition');
-
-function shouldUpdateScroll(state, prevState) {
- if (!prevState) return true;
-
- // Don't update scroll position when only the query has changed.
- if (state.pathname === prevState.pathname) return false;
-
- var routes = state.routes;
- var prevRoutes = prevState.routes;
-
- var sharedAncestorRoutes = routes.filter(function (route) {
- return prevRoutes.indexOf(route) !== -1;
- });
-
- return !sharedAncestorRoutes.some(function (route) {
- return route.ignoreScrollBehavior;
- });
-}
-
-/**
- * Provides the router with the ability to manage window scroll position
- * according to its scroll behavior.
- */
-var ScrollHistory = {
-
- statics: {
-
- /**
- * Records curent scroll position as the last known position for the given URL path.
- */
- recordScrollPosition: function recordScrollPosition(path) {
- if (!this.scrollHistory) this.scrollHistory = {};
-
- this.scrollHistory[path] = getWindowScrollPosition();
- },
-
- /**
- * Returns the last known scroll position for the given URL path.
- */
- getScrollPosition: function getScrollPosition(path) {
- if (!this.scrollHistory) this.scrollHistory = {};
-
- return this.scrollHistory[path] || null;
- }
-
- },
-
- componentWillMount: function componentWillMount() {
- invariant(this.constructor.getScrollBehavior() == null || canUseDOM, 'Cannot use scroll behavior without a DOM');
- },
-
- componentDidMount: function componentDidMount() {
- this._updateScroll();
- },
-
- componentDidUpdate: function componentDidUpdate(prevProps, prevState) {
- this._updateScroll(prevState);
- },
-
- _updateScroll: function _updateScroll(prevState) {
- if (!shouldUpdateScroll(this.state, prevState)) return;
-
- var scrollBehavior = this.constructor.getScrollBehavior();
-
- if (scrollBehavior) scrollBehavior.updateScrollPosition(this.constructor.getScrollPosition(this.state.path), this.state.action);
- }
-
-};
-
-module.exports = ScrollHistory;
-},{"./getWindowScrollPosition":56,"can-use-dom":67,"invariant":68}],42:[function(require,module,exports){
-'use strict';
-
-var PropTypes = require('./PropTypes');
-
-/**
- * A mixin for components that need to know the path, routes, URL
- * params and query that are currently active.
- *
- * Example:
- *
- * var AboutLink = React.createClass({
- * mixins: [ Router.State ],
- * render() {
- * var className = this.props.className;
- *
- * if (this.isActive('about'))
- * className += ' is-active';
- *
- * return React.DOM.a({ className: className }, this.props.children);
- * }
- * });
- */
-var State = {
-
- contextTypes: {
- router: PropTypes.router.isRequired
- },
-
- /**
- * Returns the current URL path.
- */
- getPath: function getPath() {
- return this.context.router.getCurrentPath();
- },
-
- /**
- * Returns the current URL path without the query string.
- */
- getPathname: function getPathname() {
- return this.context.router.getCurrentPathname();
- },
-
- /**
- * Returns an object of the URL params that are currently active.
- */
- getParams: function getParams() {
- return this.context.router.getCurrentParams();
- },
-
- /**
- * Returns an object of the query params that are currently active.
- */
- getQuery: function getQuery() {
- return this.context.router.getCurrentQuery();
- },
-
- /**
- * Returns an array of the routes that are currently active.
- */
- getRoutes: function getRoutes() {
- return this.context.router.getCurrentRoutes();
- },
-
- /**
- * A helper method to determine if a given route, params, and query
- * are active.
- */
- isActive: function isActive(to, params, query) {
- return this.context.router.isActive(to, params, query);
- }
-
-};
-
-module.exports = State;
-},{"./PropTypes":38}],43:[function(require,module,exports){
-/* jshint -W058 */
-
-'use strict';
-
-var Cancellation = require('./Cancellation');
-var Redirect = require('./Redirect');
-
-/**
- * Encapsulates a transition to a given path.
- *
- * The willTransitionTo and willTransitionFrom handlers receive
- * an instance of this class as their first argument.
- */
-function Transition(path, retry) {
- this.path = path;
- this.abortReason = null;
- // TODO: Change this to router.retryTransition(transition)
- this.retry = retry.bind(this);
-}
-
-Transition.prototype.abort = function (reason) {
- if (this.abortReason == null) this.abortReason = reason || 'ABORT';
-};
-
-Transition.prototype.redirect = function (to, params, query) {
- this.abort(new Redirect(to, params, query));
-};
-
-Transition.prototype.cancel = function () {
- this.abort(new Cancellation());
-};
-
-Transition.from = function (transition, routes, components, callback) {
- routes.reduce(function (callback, route, index) {
- return function (error) {
- if (error || transition.abortReason) {
- callback(error);
- } else if (route.onLeave) {
- try {
- route.onLeave(transition, components[index], callback);
-
- // If there is no callback in the argument list, call it automatically.
- if (route.onLeave.length < 3) callback();
- } catch (e) {
- callback(e);
- }
- } else {
- callback();
- }
- };
- }, callback)();
-};
-
-Transition.to = function (transition, routes, params, query, callback) {
- routes.reduceRight(function (callback, route) {
- return function (error) {
- if (error || transition.abortReason) {
- callback(error);
- } else if (route.onEnter) {
- try {
- route.onEnter(transition, params, query, callback);
-
- // If there is no callback in the argument list, call it automatically.
- if (route.onEnter.length < 4) callback();
- } catch (e) {
- callback(e);
- }
- } else {
- callback();
- }
- };
- }, callback)();
-};
-
-module.exports = Transition;
-},{"./Cancellation":33,"./Redirect":39}],44:[function(require,module,exports){
-/**
- * Actions that modify the URL.
- */
-'use strict';
-
-var LocationActions = {
-
- /**
- * Indicates a new location is being pushed to the history stack.
- */
- PUSH: 'push',
-
- /**
- * Indicates the current location should be replaced.
- */
- REPLACE: 'replace',
-
- /**
- * Indicates the most recent entry should be removed from the history stack.
- */
- POP: 'pop'
-
-};
-
-module.exports = LocationActions;
-},{}],45:[function(require,module,exports){
-'use strict';
-
-var LocationActions = require('../actions/LocationActions');
-
-/**
- * A scroll behavior that attempts to imitate the default behavior
- * of modern browsers.
- */
-var ImitateBrowserBehavior = {
-
- updateScrollPosition: function updateScrollPosition(position, actionType) {
- switch (actionType) {
- case LocationActions.PUSH:
- case LocationActions.REPLACE:
- window.scrollTo(0, 0);
- break;
- case LocationActions.POP:
- if (position) {
- window.scrollTo(position.x, position.y);
- } else {
- window.scrollTo(0, 0);
- }
- break;
- }
- }
-
-};
-
-module.exports = ImitateBrowserBehavior;
-},{"../actions/LocationActions":44}],46:[function(require,module,exports){
-/**
- * A scroll behavior that always scrolls to the top of the page
- * after a transition.
- */
-"use strict";
-
-var ScrollToTopBehavior = {
-
- updateScrollPosition: function updateScrollPosition() {
- window.scrollTo(0, 0);
- }
-
-};
-
-module.exports = ScrollToTopBehavior;
-},{}],47:[function(require,module,exports){
-/**
- * This component is necessary to get around a context warning
- * present in React 0.13.0. It sovles this by providing a separation
- * between the "owner" and "parent" contexts.
- */
-
-'use strict';
-
-var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
-
-var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-var React = require('react');
-
-var ContextWrapper = (function (_React$Component) {
- _inherits(ContextWrapper, _React$Component);
-
- function ContextWrapper() {
- _classCallCheck(this, ContextWrapper);
-
- _get(Object.getPrototypeOf(ContextWrapper.prototype), 'constructor', this).apply(this, arguments);
- }
-
- _createClass(ContextWrapper, [{
- key: 'render',
- value: function render() {
- return this.props.children;
- }
- }]);
-
- return ContextWrapper;
-})(React.Component);
-
-module.exports = ContextWrapper;
-},{"react":230}],48:[function(require,module,exports){
-'use strict';
-
-var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-var PropTypes = require('../PropTypes');
-var RouteHandler = require('./RouteHandler');
-var Route = require('./Route');
-
-/**
- * A component is a special kind of that
- * renders when its parent matches but none of its siblings do.
- * Only one such route may be used at any given level in the
- * route hierarchy.
- */
-
-var DefaultRoute = (function (_Route) {
- _inherits(DefaultRoute, _Route);
-
- function DefaultRoute() {
- _classCallCheck(this, DefaultRoute);
-
- _get(Object.getPrototypeOf(DefaultRoute.prototype), 'constructor', this).apply(this, arguments);
- }
-
- // TODO: Include these in the above class definition
- // once we can use ES7 property initializers.
- // https://github.com/babel/babel/issues/619
-
- return DefaultRoute;
-})(Route);
-
-DefaultRoute.propTypes = {
- name: PropTypes.string,
- path: PropTypes.falsy,
- children: PropTypes.falsy,
- handler: PropTypes.func.isRequired
-};
-
-DefaultRoute.defaultProps = {
- handler: RouteHandler
-};
-
-module.exports = DefaultRoute;
-},{"../PropTypes":38,"./Route":52,"./RouteHandler":53}],49:[function(require,module,exports){
-'use strict';
-
-var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
-
-var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-var React = require('react');
-var assign = require('react/lib/Object.assign');
-var PropTypes = require('../PropTypes');
-
-function isLeftClickEvent(event) {
- return event.button === 0;
-}
-
-function isModifiedEvent(event) {
- return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);
-}
-
-/**
- * components are used to create an element that links to a route.
- * When that route is active, the link gets an "active" class name (or the
- * value of its `activeClassName` prop).
- *
- * For example, assuming you have the following route:
- *
- *
- *
- * You could use the following component to link to that route:
- *
- *
- *
- * In addition to params, links may pass along query string parameters
- * using the `query` prop.
- *
- *
- */
-
-var Link = (function (_React$Component) {
- _inherits(Link, _React$Component);
-
- function Link() {
- _classCallCheck(this, Link);
-
- _get(Object.getPrototypeOf(Link.prototype), 'constructor', this).apply(this, arguments);
- }
-
- // TODO: Include these in the above class definition
- // once we can use ES7 property initializers.
- // https://github.com/babel/babel/issues/619
-
- _createClass(Link, [{
- key: 'handleClick',
- value: function handleClick(event) {
- var allowTransition = true;
- var clickResult;
-
- if (this.props.onClick) clickResult = this.props.onClick(event);
-
- if (isModifiedEvent(event) || !isLeftClickEvent(event)) return;
-
- if (clickResult === false || event.defaultPrevented === true) allowTransition = false;
-
- event.preventDefault();
-
- if (allowTransition) this.context.router.transitionTo(this.props.to, this.props.params, this.props.query);
- }
-
- /**
- * Returns the value of the "href" attribute to use on the DOM element.
- */
- }, {
- key: 'getHref',
- value: function getHref() {
- return this.context.router.makeHref(this.props.to, this.props.params, this.props.query);
- }
-
- /**
- * Returns the value of the "class" attribute to use on the DOM element, which contains
- * the value of the activeClassName property when this is active.
- */
- }, {
- key: 'getClassName',
- value: function getClassName() {
- var className = this.props.className;
-
- if (this.getActiveState()) className += ' ' + this.props.activeClassName;
-
- return className;
- }
- }, {
- key: 'getActiveState',
- value: function getActiveState() {
- return this.context.router.isActive(this.props.to, this.props.params, this.props.query);
- }
- }, {
- key: 'render',
- value: function render() {
- var props = assign({}, this.props, {
- href: this.getHref(),
- className: this.getClassName(),
- onClick: this.handleClick.bind(this)
- });
-
- if (props.activeStyle && this.getActiveState()) props.style = props.activeStyle;
-
- return React.DOM.a(props, this.props.children);
- }
- }]);
-
- return Link;
-})(React.Component);
-
-Link.contextTypes = {
- router: PropTypes.router.isRequired
-};
-
-Link.propTypes = {
- activeClassName: PropTypes.string.isRequired,
- to: PropTypes.oneOfType([PropTypes.string, PropTypes.route]).isRequired,
- params: PropTypes.object,
- query: PropTypes.object,
- activeStyle: PropTypes.object,
- onClick: PropTypes.func
-};
-
-Link.defaultProps = {
- activeClassName: 'active',
- className: ''
-};
-
-module.exports = Link;
-},{"../PropTypes":38,"react":230,"react/lib/Object.assign":96}],50:[function(require,module,exports){
-'use strict';
-
-var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-var PropTypes = require('../PropTypes');
-var RouteHandler = require('./RouteHandler');
-var Route = require('./Route');
-
-/**
- * A is a special kind of that
- * renders when the beginning of its parent's path matches
- * but none of its siblings do, including any .
- * Only one such route may be used at any given level in the
- * route hierarchy.
- */
-
-var NotFoundRoute = (function (_Route) {
- _inherits(NotFoundRoute, _Route);
-
- function NotFoundRoute() {
- _classCallCheck(this, NotFoundRoute);
-
- _get(Object.getPrototypeOf(NotFoundRoute.prototype), 'constructor', this).apply(this, arguments);
- }
-
- // TODO: Include these in the above class definition
- // once we can use ES7 property initializers.
- // https://github.com/babel/babel/issues/619
-
- return NotFoundRoute;
-})(Route);
-
-NotFoundRoute.propTypes = {
- name: PropTypes.string,
- path: PropTypes.falsy,
- children: PropTypes.falsy,
- handler: PropTypes.func.isRequired
-};
-
-NotFoundRoute.defaultProps = {
- handler: RouteHandler
-};
-
-module.exports = NotFoundRoute;
-},{"../PropTypes":38,"./Route":52,"./RouteHandler":53}],51:[function(require,module,exports){
-'use strict';
-
-var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-var PropTypes = require('../PropTypes');
-var Route = require('./Route');
-
-/**
- * A component is a special kind of that always
- * redirects to another route when it matches.
- */
-
-var Redirect = (function (_Route) {
- _inherits(Redirect, _Route);
-
- function Redirect() {
- _classCallCheck(this, Redirect);
-
- _get(Object.getPrototypeOf(Redirect.prototype), 'constructor', this).apply(this, arguments);
- }
-
- // TODO: Include these in the above class definition
- // once we can use ES7 property initializers.
- // https://github.com/babel/babel/issues/619
-
- return Redirect;
-})(Route);
-
-Redirect.propTypes = {
- path: PropTypes.string,
- from: PropTypes.string, // Alias for path.
- to: PropTypes.string,
- handler: PropTypes.falsy
-};
-
-// Redirects should not have a default handler
-Redirect.defaultProps = {};
-
-module.exports = Redirect;
-},{"../PropTypes":38,"./Route":52}],52:[function(require,module,exports){
-'use strict';
-
-var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
-
-var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-var React = require('react');
-var invariant = require('invariant');
-var PropTypes = require('../PropTypes');
-var RouteHandler = require('./RouteHandler');
-
-/**
- * components specify components that are rendered to the page when the
- * URL matches a given pattern.
- *
- * Routes are arranged in a nested tree structure. When a new URL is requested,
- * the tree is searched depth-first to find a route whose path matches the URL.
- * When one is found, all routes in the tree that lead to it are considered
- * "active" and their components are rendered into the DOM, nested in the same
- * order as they are in the tree.
- *
- * The preferred way to configure a router is using JSX. The XML-like syntax is
- * a great way to visualize how routes are laid out in an application.
- *
- * var routes = [
- *
- *
- *
- *
- *
- * ];
- *
- * Router.run(routes, function (Handler) {
- * React.render(, document.body);
- * });
- *
- * Handlers for Route components that contain children can render their active
- * child route using a element.
- *
- * var App = React.createClass({
- * render: function () {
- * return (
- *
- *
- *
- * );
- * }
- * });
- *
- * If no handler is provided for the route, it will render a matched child route.
- */
-
-var Route = (function (_React$Component) {
- _inherits(Route, _React$Component);
-
- function Route() {
- _classCallCheck(this, Route);
-
- _get(Object.getPrototypeOf(Route.prototype), 'constructor', this).apply(this, arguments);
- }
-
- // TODO: Include these in the above class definition
- // once we can use ES7 property initializers.
- // https://github.com/babel/babel/issues/619
-
- _createClass(Route, [{
- key: 'render',
- value: function render() {
- invariant(false, '%s elements are for router configuration only and should not be rendered', this.constructor.name);
- }
- }]);
-
- return Route;
-})(React.Component);
-
-Route.propTypes = {
- name: PropTypes.string,
- path: PropTypes.string,
- handler: PropTypes.func,
- ignoreScrollBehavior: PropTypes.bool
-};
-
-Route.defaultProps = {
- handler: RouteHandler
-};
-
-module.exports = Route;
-},{"../PropTypes":38,"./RouteHandler":53,"invariant":68,"react":230}],53:[function(require,module,exports){
-'use strict';
-
-var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
-
-var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-var React = require('react');
-var ContextWrapper = require('./ContextWrapper');
-var assign = require('react/lib/Object.assign');
-var PropTypes = require('../PropTypes');
-
-var REF_NAME = '__routeHandler__';
-
-/**
- * A component renders the active child route handler
- * when routes are nested.
- */
-
-var RouteHandler = (function (_React$Component) {
- _inherits(RouteHandler, _React$Component);
-
- function RouteHandler() {
- _classCallCheck(this, RouteHandler);
-
- _get(Object.getPrototypeOf(RouteHandler.prototype), 'constructor', this).apply(this, arguments);
- }
-
- // TODO: Include these in the above class definition
- // once we can use ES7 property initializers.
- // https://github.com/babel/babel/issues/619
-
- _createClass(RouteHandler, [{
- key: 'getChildContext',
- value: function getChildContext() {
- return {
- routeDepth: this.context.routeDepth + 1
- };
- }
- }, {
- key: 'componentDidMount',
- value: function componentDidMount() {
- this._updateRouteComponent(this.refs[REF_NAME]);
- }
- }, {
- key: 'componentDidUpdate',
- value: function componentDidUpdate() {
- this._updateRouteComponent(this.refs[REF_NAME]);
- }
- }, {
- key: 'componentWillUnmount',
- value: function componentWillUnmount() {
- this._updateRouteComponent(null);
- }
- }, {
- key: '_updateRouteComponent',
- value: function _updateRouteComponent(component) {
- this.context.router.setRouteComponentAtDepth(this.getRouteDepth(), component);
- }
- }, {
- key: 'getRouteDepth',
- value: function getRouteDepth() {
- return this.context.routeDepth;
- }
- }, {
- key: 'createChildRouteHandler',
- value: function createChildRouteHandler(props) {
- var route = this.context.router.getRouteAtDepth(this.getRouteDepth());
-
- if (route == null) return null;
-
- var childProps = assign({}, props || this.props, {
- ref: REF_NAME,
- params: this.context.router.getCurrentParams(),
- query: this.context.router.getCurrentQuery()
- });
-
- return React.createElement(route.handler, childProps);
- }
- }, {
- key: 'render',
- value: function render() {
- var handler = this.createChildRouteHandler();
- // for things like that don't like null
- return handler ? React.createElement(
- ContextWrapper,
- null,
- handler
- ) : React.createElement('script', null);
- }
- }]);
-
- return RouteHandler;
-})(React.Component);
-
-RouteHandler.contextTypes = {
- routeDepth: PropTypes.number.isRequired,
- router: PropTypes.router.isRequired
-};
-
-RouteHandler.childContextTypes = {
- routeDepth: PropTypes.number.isRequired
-};
-
-module.exports = RouteHandler;
-},{"../PropTypes":38,"./ContextWrapper":47,"react":230,"react/lib/Object.assign":96}],54:[function(require,module,exports){
-(function (process){
-/* jshint -W058 */
-'use strict';
-
-var React = require('react');
-var warning = require('./warning');
-var invariant = require('invariant');
-var canUseDOM = require('can-use-dom');
-var LocationActions = require('./actions/LocationActions');
-var ImitateBrowserBehavior = require('./behaviors/ImitateBrowserBehavior');
-var HashLocation = require('./locations/HashLocation');
-var HistoryLocation = require('./locations/HistoryLocation');
-var RefreshLocation = require('./locations/RefreshLocation');
-var StaticLocation = require('./locations/StaticLocation');
-var ScrollHistory = require('./ScrollHistory');
-var createRoutesFromReactChildren = require('./createRoutesFromReactChildren');
-var isReactChildren = require('./isReactChildren');
-var Transition = require('./Transition');
-var PropTypes = require('./PropTypes');
-var Redirect = require('./Redirect');
-var History = require('./History');
-var Cancellation = require('./Cancellation');
-var Match = require('./Match');
-var Route = require('./Route');
-var supportsHistory = require('./supportsHistory');
-var PathUtils = require('./PathUtils');
-
-/**
- * The default location for new routers.
- */
-var DEFAULT_LOCATION = canUseDOM ? HashLocation : '/';
-
-/**
- * The default scroll behavior for new routers.
- */
-var DEFAULT_SCROLL_BEHAVIOR = canUseDOM ? ImitateBrowserBehavior : null;
-
-function hasProperties(object, properties) {
- for (var propertyName in properties) if (properties.hasOwnProperty(propertyName) && object[propertyName] !== properties[propertyName]) return false;
-
- return true;
-}
-
-function hasMatch(routes, route, prevParams, nextParams, prevQuery, nextQuery) {
- return routes.some(function (r) {
- if (r !== route) return false;
-
- var paramNames = route.paramNames;
- var paramName;
-
- // Ensure that all params the route cares about did not change.
- for (var i = 0, len = paramNames.length; i < len; ++i) {
- paramName = paramNames[i];
-
- if (nextParams[paramName] !== prevParams[paramName]) return false;
- }
-
- // Ensure the query hasn't changed.
- return hasProperties(prevQuery, nextQuery) && hasProperties(nextQuery, prevQuery);
- });
-}
-
-function addRoutesToNamedRoutes(routes, namedRoutes) {
- var route;
- for (var i = 0, len = routes.length; i < len; ++i) {
- route = routes[i];
-
- if (route.name) {
- invariant(namedRoutes[route.name] == null, 'You may not have more than one route named "%s"', route.name);
-
- namedRoutes[route.name] = route;
- }
-
- if (route.childRoutes) addRoutesToNamedRoutes(route.childRoutes, namedRoutes);
- }
-}
-
-function routeIsActive(activeRoutes, routeName) {
- return activeRoutes.some(function (route) {
- return route.name === routeName;
- });
-}
-
-function paramsAreActive(activeParams, params) {
- for (var property in params) if (String(activeParams[property]) !== String(params[property])) return false;
-
- return true;
-}
-
-function queryIsActive(activeQuery, query) {
- for (var property in query) if (String(activeQuery[property]) !== String(query[property])) return false;
-
- return true;
-}
-
-/**
- * Creates and returns a new router using the given options. A router
- * is a ReactComponent class that knows how to react to changes in the
- * URL and keep the contents of the page in sync.
- *
- * Options may be any of the following:
- *
- * - routes (required) The route config
- * - location The location to use. Defaults to HashLocation when
- * the DOM is available, "/" otherwise
- * - scrollBehavior The scroll behavior to use. Defaults to ImitateBrowserBehavior
- * when the DOM is available, null otherwise
- * - onError A function that is used to handle errors
- * - onAbort A function that is used to handle aborted transitions
- *
- * When rendering in a server-side environment, the location should simply
- * be the URL path that was used in the request, including the query string.
- */
-function createRouter(options) {
- options = options || {};
-
- if (isReactChildren(options)) options = { routes: options };
-
- var mountedComponents = [];
- var location = options.location || DEFAULT_LOCATION;
- var scrollBehavior = options.scrollBehavior || DEFAULT_SCROLL_BEHAVIOR;
- var state = {};
- var nextState = {};
- var pendingTransition = null;
- var dispatchHandler = null;
-
- if (typeof location === 'string') location = new StaticLocation(location);
-
- if (location instanceof StaticLocation) {
- warning(!canUseDOM || process.env.NODE_ENV === 'test', 'You should not use a static location in a DOM environment because ' + 'the router will not be kept in sync with the current URL');
- } else {
- invariant(canUseDOM || location.needsDOM === false, 'You cannot use %s without a DOM', location);
- }
-
- // Automatically fall back to full page refreshes in
- // browsers that don't support the HTML history API.
- if (location === HistoryLocation && !supportsHistory()) location = RefreshLocation;
-
- var Router = React.createClass({
-
- displayName: 'Router',
-
- statics: {
-
- isRunning: false,
-
- cancelPendingTransition: function cancelPendingTransition() {
- if (pendingTransition) {
- pendingTransition.cancel();
- pendingTransition = null;
- }
- },
-
- clearAllRoutes: function clearAllRoutes() {
- Router.cancelPendingTransition();
- Router.namedRoutes = {};
- Router.routes = [];
- },
-
- /**
- * Adds routes to this router from the given children object (see ReactChildren).
- */
- addRoutes: function addRoutes(routes) {
- if (isReactChildren(routes)) routes = createRoutesFromReactChildren(routes);
-
- addRoutesToNamedRoutes(routes, Router.namedRoutes);
-
- Router.routes.push.apply(Router.routes, routes);
- },
-
- /**
- * Replaces routes of this router from the given children object (see ReactChildren).
- */
- replaceRoutes: function replaceRoutes(routes) {
- Router.clearAllRoutes();
- Router.addRoutes(routes);
- Router.refresh();
- },
-
- /**
- * Performs a match of the given path against this router and returns an object
- * with the { routes, params, pathname, query } that match. Returns null if no
- * match can be made.
- */
- match: function match(path) {
- return Match.findMatch(Router.routes, path);
- },
-
- /**
- * Returns an absolute URL path created from the given route
- * name, URL parameters, and query.
- */
- makePath: function makePath(to, params, query) {
- var path;
- if (PathUtils.isAbsolute(to)) {
- path = to;
- } else {
- var route = to instanceof Route ? to : Router.namedRoutes[to];
-
- invariant(route instanceof Route, 'Cannot find a route named "%s"', to);
-
- path = route.path;
- }
-
- return PathUtils.withQuery(PathUtils.injectParams(path, params), query);
- },
-
- /**
- * Returns a string that may safely be used as the href of a link
- * to the route with the given name, URL parameters, and query.
- */
- makeHref: function makeHref(to, params, query) {
- var path = Router.makePath(to, params, query);
- return location === HashLocation ? '#' + path : path;
- },
-
- /**
- * Transitions to the URL specified in the arguments by pushing
- * a new URL onto the history stack.
- */
- transitionTo: function transitionTo(to, params, query) {
- var path = Router.makePath(to, params, query);
-
- if (pendingTransition) {
- // Replace so pending location does not stay in history.
- location.replace(path);
- } else {
- location.push(path);
- }
- },
-
- /**
- * Transitions to the URL specified in the arguments by replacing
- * the current URL in the history stack.
- */
- replaceWith: function replaceWith(to, params, query) {
- location.replace(Router.makePath(to, params, query));
- },
-
- /**
- * Transitions to the previous URL if one is available. Returns true if the
- * router was able to go back, false otherwise.
- *
- * Note: The router only tracks history entries in your application, not the
- * current browser session, so you can safely call this function without guarding
- * against sending the user back to some other site. However, when using
- * RefreshLocation (which is the fallback for HistoryLocation in browsers that
- * don't support HTML5 history) this method will *always* send the client back
- * because we cannot reliably track history length.
- */
- goBack: function goBack() {
- if (History.length > 1 || location === RefreshLocation) {
- location.pop();
- return true;
- }
-
- warning(false, 'goBack() was ignored because there is no router history');
-
- return false;
- },
-
- handleAbort: options.onAbort || function (abortReason) {
- if (location instanceof StaticLocation) throw new Error('Unhandled aborted transition! Reason: ' + abortReason);
-
- if (abortReason instanceof Cancellation) {
- return;
- } else if (abortReason instanceof Redirect) {
- location.replace(Router.makePath(abortReason.to, abortReason.params, abortReason.query));
- } else {
- location.pop();
- }
- },
-
- handleError: options.onError || function (error) {
- // Throw so we don't silently swallow async errors.
- throw error; // This error probably originated in a transition hook.
- },
-
- handleLocationChange: function handleLocationChange(change) {
- Router.dispatch(change.path, change.type);
- },
-
- /**
- * Performs a transition to the given path and calls callback(error, abortReason)
- * when the transition is finished. If both arguments are null the router's state
- * was updated. Otherwise the transition did not complete.
- *
- * In a transition, a router first determines which routes are involved by beginning
- * with the current route, up the route tree to the first parent route that is shared
- * with the destination route, and back down the tree to the destination route. The
- * willTransitionFrom hook is invoked on all route handlers we're transitioning away
- * from, in reverse nesting order. Likewise, the willTransitionTo hook is invoked on
- * all route handlers we're transitioning to.
- *
- * Both willTransitionFrom and willTransitionTo hooks may either abort or redirect the
- * transition. To resolve asynchronously, they may use the callback argument. If no
- * hooks wait, the transition is fully synchronous.
- */
- dispatch: function dispatch(path, action) {
- Router.cancelPendingTransition();
-
- var prevPath = state.path;
- var isRefreshing = action == null;
-
- if (prevPath === path && !isRefreshing) return; // Nothing to do!
-
- // Record the scroll position as early as possible to
- // get it before browsers try update it automatically.
- if (prevPath && action === LocationActions.PUSH) Router.recordScrollPosition(prevPath);
-
- var match = Router.match(path);
-
- warning(match != null, 'No route matches path "%s". Make sure you have somewhere in your routes', path, path);
-
- if (match == null) match = {};
-
- var prevRoutes = state.routes || [];
- var prevParams = state.params || {};
- var prevQuery = state.query || {};
-
- var nextRoutes = match.routes || [];
- var nextParams = match.params || {};
- var nextQuery = match.query || {};
-
- var fromRoutes, toRoutes;
- if (prevRoutes.length) {
- fromRoutes = prevRoutes.filter(function (route) {
- return !hasMatch(nextRoutes, route, prevParams, nextParams, prevQuery, nextQuery);
- });
-
- toRoutes = nextRoutes.filter(function (route) {
- return !hasMatch(prevRoutes, route, prevParams, nextParams, prevQuery, nextQuery);
- });
- } else {
- fromRoutes = [];
- toRoutes = nextRoutes;
- }
-
- var transition = new Transition(path, Router.replaceWith.bind(Router, path));
- pendingTransition = transition;
-
- var fromComponents = mountedComponents.slice(prevRoutes.length - fromRoutes.length);
-
- Transition.from(transition, fromRoutes, fromComponents, function (error) {
- if (error || transition.abortReason) return dispatchHandler.call(Router, error, transition); // No need to continue.
-
- Transition.to(transition, toRoutes, nextParams, nextQuery, function (error) {
- dispatchHandler.call(Router, error, transition, {
- path: path,
- action: action,
- pathname: match.pathname,
- routes: nextRoutes,
- params: nextParams,
- query: nextQuery
- });
- });
- });
- },
-
- /**
- * Starts this router and calls callback(router, state) when the route changes.
- *
- * If the router's location is static (i.e. a URL path in a server environment)
- * the callback is called only once. Otherwise, the location should be one of the
- * Router.*Location objects (e.g. Router.HashLocation or Router.HistoryLocation).
- */
- run: function run(callback) {
- invariant(!Router.isRunning, 'Router is already running');
-
- dispatchHandler = function (error, transition, newState) {
- if (error) Router.handleError(error);
-
- if (pendingTransition !== transition) return;
-
- pendingTransition = null;
-
- if (transition.abortReason) {
- Router.handleAbort(transition.abortReason);
- } else {
- callback.call(Router, Router, nextState = newState);
- }
- };
-
- if (!(location instanceof StaticLocation)) {
- if (location.addChangeListener) location.addChangeListener(Router.handleLocationChange);
-
- Router.isRunning = true;
- }
-
- // Bootstrap using the current path.
- Router.refresh();
- },
-
- refresh: function refresh() {
- Router.dispatch(location.getCurrentPath(), null);
- },
-
- stop: function stop() {
- Router.cancelPendingTransition();
-
- if (location.removeChangeListener) location.removeChangeListener(Router.handleLocationChange);
-
- Router.isRunning = false;
- },
-
- getLocation: function getLocation() {
- return location;
- },
-
- getScrollBehavior: function getScrollBehavior() {
- return scrollBehavior;
- },
-
- getRouteAtDepth: function getRouteAtDepth(routeDepth) {
- var routes = state.routes;
- return routes && routes[routeDepth];
- },
-
- setRouteComponentAtDepth: function setRouteComponentAtDepth(routeDepth, component) {
- mountedComponents[routeDepth] = component;
- },
-
- /**
- * Returns the current URL path + query string.
- */
- getCurrentPath: function getCurrentPath() {
- return state.path;
- },
-
- /**
- * Returns the current URL path without the query string.
- */
- getCurrentPathname: function getCurrentPathname() {
- return state.pathname;
- },
-
- /**
- * Returns an object of the currently active URL parameters.
- */
- getCurrentParams: function getCurrentParams() {
- return state.params;
- },
-
- /**
- * Returns an object of the currently active query parameters.
- */
- getCurrentQuery: function getCurrentQuery() {
- return state.query;
- },
-
- /**
- * Returns an array of the currently active routes.
- */
- getCurrentRoutes: function getCurrentRoutes() {
- return state.routes;
- },
-
- /**
- * Returns true if the given route, params, and query are active.
- */
- isActive: function isActive(to, params, query) {
- if (PathUtils.isAbsolute(to)) return to === state.path;
-
- return routeIsActive(state.routes, to) && paramsAreActive(state.params, params) && (query == null || queryIsActive(state.query, query));
- }
-
- },
-
- mixins: [ScrollHistory],
-
- propTypes: {
- children: PropTypes.falsy
- },
-
- childContextTypes: {
- routeDepth: PropTypes.number.isRequired,
- router: PropTypes.router.isRequired
- },
-
- getChildContext: function getChildContext() {
- return {
- routeDepth: 1,
- router: Router
- };
- },
-
- getInitialState: function getInitialState() {
- return state = nextState;
- },
-
- componentWillReceiveProps: function componentWillReceiveProps() {
- this.setState(state = nextState);
- },
-
- componentWillUnmount: function componentWillUnmount() {
- Router.stop();
- },
-
- render: function render() {
- var route = Router.getRouteAtDepth(0);
- return route ? React.createElement(route.handler, this.props) : null;
- }
-
- });
-
- Router.clearAllRoutes();
-
- if (options.routes) Router.addRoutes(options.routes);
-
- return Router;
-}
-
-module.exports = createRouter;
-}).call(this,require('_process'))
-
-},{"./Cancellation":33,"./History":34,"./Match":35,"./PathUtils":37,"./PropTypes":38,"./Redirect":39,"./Route":40,"./ScrollHistory":41,"./Transition":43,"./actions/LocationActions":44,"./behaviors/ImitateBrowserBehavior":45,"./createRoutesFromReactChildren":55,"./isReactChildren":58,"./locations/HashLocation":59,"./locations/HistoryLocation":60,"./locations/RefreshLocation":61,"./locations/StaticLocation":62,"./supportsHistory":65,"./warning":66,"_process":299,"can-use-dom":67,"invariant":68,"react":230}],55:[function(require,module,exports){
-/* jshint -W084 */
-'use strict';
-
-var React = require('react');
-var assign = require('react/lib/Object.assign');
-var warning = require('./warning');
-var DefaultRoute = require('./components/DefaultRoute');
-var NotFoundRoute = require('./components/NotFoundRoute');
-var Redirect = require('./components/Redirect');
-var Route = require('./Route');
-
-function checkPropTypes(componentName, propTypes, props) {
- componentName = componentName || 'UnknownComponent';
-
- for (var propName in propTypes) {
- if (propTypes.hasOwnProperty(propName)) {
- var error = propTypes[propName](props, propName, componentName);
-
- if (error instanceof Error) warning(false, error.message);
- }
- }
-}
-
-function createRouteOptions(props) {
- var options = assign({}, props);
- var handler = options.handler;
-
- if (handler) {
- options.onEnter = handler.willTransitionTo;
- options.onLeave = handler.willTransitionFrom;
- }
-
- return options;
-}
-
-function createRouteFromReactElement(element) {
- if (!React.isValidElement(element)) return;
-
- var type = element.type;
- var props = assign({}, type.defaultProps, element.props);
-
- if (type.propTypes) checkPropTypes(type.displayName, type.propTypes, props);
-
- if (type === DefaultRoute) return Route.createDefaultRoute(createRouteOptions(props));
-
- if (type === NotFoundRoute) return Route.createNotFoundRoute(createRouteOptions(props));
-
- if (type === Redirect) return Route.createRedirect(createRouteOptions(props));
-
- return Route.createRoute(createRouteOptions(props), function () {
- if (props.children) createRoutesFromReactChildren(props.children);
- });
-}
-
-/**
- * Creates and returns an array of routes created from the given
- * ReactChildren, all of which should be one of , ,
- * , or , e.g.:
- *
- * var { createRoutesFromReactChildren, Route, Redirect } = require('react-router');
- *
- * var routes = createRoutesFromReactChildren(
- *
- *
- *
- *
- *
- *
- * );
- */
-function createRoutesFromReactChildren(children) {
- var routes = [];
-
- React.Children.forEach(children, function (child) {
- if (child = createRouteFromReactElement(child)) routes.push(child);
- });
-
- return routes;
-}
-
-module.exports = createRoutesFromReactChildren;
-},{"./Route":40,"./components/DefaultRoute":48,"./components/NotFoundRoute":50,"./components/Redirect":51,"./warning":66,"react":230,"react/lib/Object.assign":96}],56:[function(require,module,exports){
-'use strict';
-
-var invariant = require('invariant');
-var canUseDOM = require('can-use-dom');
-
-/**
- * Returns the current scroll position of the window as { x, y }.
- */
-function getWindowScrollPosition() {
- invariant(canUseDOM, 'Cannot get current scroll position without a DOM');
-
- return {
- x: window.pageXOffset || document.documentElement.scrollLeft,
- y: window.pageYOffset || document.documentElement.scrollTop
- };
-}
-
-module.exports = getWindowScrollPosition;
-},{"can-use-dom":67,"invariant":68}],57:[function(require,module,exports){
-'use strict';
-
-exports.DefaultRoute = require('./components/DefaultRoute');
-exports.Link = require('./components/Link');
-exports.NotFoundRoute = require('./components/NotFoundRoute');
-exports.Redirect = require('./components/Redirect');
-exports.Route = require('./components/Route');
-exports.ActiveHandler = require('./components/RouteHandler');
-exports.RouteHandler = exports.ActiveHandler;
-
-exports.HashLocation = require('./locations/HashLocation');
-exports.HistoryLocation = require('./locations/HistoryLocation');
-exports.RefreshLocation = require('./locations/RefreshLocation');
-exports.StaticLocation = require('./locations/StaticLocation');
-exports.TestLocation = require('./locations/TestLocation');
-
-exports.ImitateBrowserBehavior = require('./behaviors/ImitateBrowserBehavior');
-exports.ScrollToTopBehavior = require('./behaviors/ScrollToTopBehavior');
-
-exports.History = require('./History');
-exports.Navigation = require('./Navigation');
-exports.State = require('./State');
-
-exports.createRoute = require('./Route').createRoute;
-exports.createDefaultRoute = require('./Route').createDefaultRoute;
-exports.createNotFoundRoute = require('./Route').createNotFoundRoute;
-exports.createRedirect = require('./Route').createRedirect;
-exports.createRoutesFromReactChildren = require('./createRoutesFromReactChildren');
-
-exports.create = require('./createRouter');
-exports.run = require('./runRouter');
-},{"./History":34,"./Navigation":36,"./Route":40,"./State":42,"./behaviors/ImitateBrowserBehavior":45,"./behaviors/ScrollToTopBehavior":46,"./components/DefaultRoute":48,"./components/Link":49,"./components/NotFoundRoute":50,"./components/Redirect":51,"./components/Route":52,"./components/RouteHandler":53,"./createRouter":54,"./createRoutesFromReactChildren":55,"./locations/HashLocation":59,"./locations/HistoryLocation":60,"./locations/RefreshLocation":61,"./locations/StaticLocation":62,"./locations/TestLocation":63,"./runRouter":64}],58:[function(require,module,exports){
-'use strict';
-
-var React = require('react');
-
-function isValidChild(object) {
- return object == null || React.isValidElement(object);
-}
-
-function isReactChildren(object) {
- return isValidChild(object) || Array.isArray(object) && object.every(isValidChild);
-}
-
-module.exports = isReactChildren;
-},{"react":230}],59:[function(require,module,exports){
-'use strict';
-
-var LocationActions = require('../actions/LocationActions');
-var History = require('../History');
-
-var _listeners = [];
-var _isListening = false;
-var _actionType;
-
-function notifyChange(type) {
- if (type === LocationActions.PUSH) History.length += 1;
-
- var change = {
- path: HashLocation.getCurrentPath(),
- type: type
- };
-
- _listeners.forEach(function (listener) {
- listener.call(HashLocation, change);
- });
-}
-
-function ensureSlash() {
- var path = HashLocation.getCurrentPath();
-
- if (path.charAt(0) === '/') return true;
-
- HashLocation.replace('/' + path);
-
- return false;
-}
-
-function onHashChange() {
- if (ensureSlash()) {
- // If we don't have an _actionType then all we know is the hash
- // changed. It was probably caused by the user clicking the Back
- // button, but may have also been the Forward button or manual
- // manipulation. So just guess 'pop'.
- var curActionType = _actionType;
- _actionType = null;
- notifyChange(curActionType || LocationActions.POP);
- }
-}
-
-/**
- * A Location that uses `window.location.hash`.
- */
-var HashLocation = {
-
- addChangeListener: function addChangeListener(listener) {
- _listeners.push(listener);
-
- // Do this BEFORE listening for hashchange.
- ensureSlash();
-
- if (!_isListening) {
- if (window.addEventListener) {
- window.addEventListener('hashchange', onHashChange, false);
- } else {
- window.attachEvent('onhashchange', onHashChange);
- }
-
- _isListening = true;
- }
- },
-
- removeChangeListener: function removeChangeListener(listener) {
- _listeners = _listeners.filter(function (l) {
- return l !== listener;
- });
-
- if (_listeners.length === 0) {
- if (window.removeEventListener) {
- window.removeEventListener('hashchange', onHashChange, false);
- } else {
- window.removeEvent('onhashchange', onHashChange);
- }
-
- _isListening = false;
- }
- },
-
- push: function push(path) {
- _actionType = LocationActions.PUSH;
- window.location.hash = path;
- },
-
- replace: function replace(path) {
- _actionType = LocationActions.REPLACE;
- window.location.replace(window.location.pathname + window.location.search + '#' + path);
- },
-
- pop: function pop() {
- _actionType = LocationActions.POP;
- History.back();
- },
-
- getCurrentPath: function getCurrentPath() {
- return decodeURI(
- // We can't use window.location.hash here because it's not
- // consistent across browsers - Firefox will pre-decode it!
- window.location.href.split('#')[1] || '');
- },
-
- toString: function toString() {
- return '';
- }
-
-};
-
-module.exports = HashLocation;
-},{"../History":34,"../actions/LocationActions":44}],60:[function(require,module,exports){
-'use strict';
-
-var LocationActions = require('../actions/LocationActions');
-var History = require('../History');
-
-var _listeners = [];
-var _isListening = false;
-
-function notifyChange(type) {
- var change = {
- path: HistoryLocation.getCurrentPath(),
- type: type
- };
-
- _listeners.forEach(function (listener) {
- listener.call(HistoryLocation, change);
- });
-}
-
-function onPopState(event) {
- if (event.state === undefined) return; // Ignore extraneous popstate events in WebKit.
-
- notifyChange(LocationActions.POP);
-}
-
-/**
- * A Location that uses HTML5 history.
- */
-var HistoryLocation = {
-
- addChangeListener: function addChangeListener(listener) {
- _listeners.push(listener);
-
- if (!_isListening) {
- if (window.addEventListener) {
- window.addEventListener('popstate', onPopState, false);
- } else {
- window.attachEvent('onpopstate', onPopState);
- }
-
- _isListening = true;
- }
- },
-
- removeChangeListener: function removeChangeListener(listener) {
- _listeners = _listeners.filter(function (l) {
- return l !== listener;
- });
-
- if (_listeners.length === 0) {
- if (window.addEventListener) {
- window.removeEventListener('popstate', onPopState, false);
- } else {
- window.removeEvent('onpopstate', onPopState);
- }
-
- _isListening = false;
- }
- },
-
- push: function push(path) {
- window.history.pushState({ path: path }, '', path);
- History.length += 1;
- notifyChange(LocationActions.PUSH);
- },
-
- replace: function replace(path) {
- window.history.replaceState({ path: path }, '', path);
- notifyChange(LocationActions.REPLACE);
- },
-
- pop: History.back,
-
- getCurrentPath: function getCurrentPath() {
- return decodeURI(window.location.pathname + window.location.search);
- },
-
- toString: function toString() {
- return '';
- }
-
-};
-
-module.exports = HistoryLocation;
-},{"../History":34,"../actions/LocationActions":44}],61:[function(require,module,exports){
-'use strict';
-
-var HistoryLocation = require('./HistoryLocation');
-var History = require('../History');
-
-/**
- * A Location that uses full page refreshes. This is used as
- * the fallback for HistoryLocation in browsers that do not
- * support the HTML5 history API.
- */
-var RefreshLocation = {
-
- push: function push(path) {
- window.location = path;
- },
-
- replace: function replace(path) {
- window.location.replace(path);
- },
-
- pop: History.back,
-
- getCurrentPath: HistoryLocation.getCurrentPath,
-
- toString: function toString() {
- return '';
- }
-
-};
-
-module.exports = RefreshLocation;
-},{"../History":34,"./HistoryLocation":60}],62:[function(require,module,exports){
-'use strict';
-
-var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-var invariant = require('invariant');
-
-function throwCannotModify() {
- invariant(false, 'You cannot modify a static location');
-}
-
-/**
- * A location that only ever contains a single path. Useful in
- * stateless environments like servers where there is no path history,
- * only the path that was used in the request.
- */
-
-var StaticLocation = (function () {
- function StaticLocation(path) {
- _classCallCheck(this, StaticLocation);
-
- this.path = path;
- }
-
- // TODO: Include these in the above class definition
- // once we can use ES7 property initializers.
- // https://github.com/babel/babel/issues/619
-
- _createClass(StaticLocation, [{
- key: 'getCurrentPath',
- value: function getCurrentPath() {
- return this.path;
- }
- }, {
- key: 'toString',
- value: function toString() {
- return '';
- }
- }]);
-
- return StaticLocation;
-})();
-
-StaticLocation.prototype.push = throwCannotModify;
-StaticLocation.prototype.replace = throwCannotModify;
-StaticLocation.prototype.pop = throwCannotModify;
-
-module.exports = StaticLocation;
-},{"invariant":68}],63:[function(require,module,exports){
-'use strict';
-
-var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-
-var invariant = require('invariant');
-var LocationActions = require('../actions/LocationActions');
-var History = require('../History');
-
-/**
- * A location that is convenient for testing and does not require a DOM.
- */
-
-var TestLocation = (function () {
- function TestLocation(history) {
- _classCallCheck(this, TestLocation);
-
- this.history = history || [];
- this.listeners = [];
- this.needsDOM = false;
- this._updateHistoryLength();
- }
-
- _createClass(TestLocation, [{
- key: '_updateHistoryLength',
- value: function _updateHistoryLength() {
- History.length = this.history.length;
- }
- }, {
- key: '_notifyChange',
- value: function _notifyChange(type) {
- var change = {
- path: this.getCurrentPath(),
- type: type
- };
-
- for (var i = 0, len = this.listeners.length; i < len; ++i) this.listeners[i].call(this, change);
- }
- }, {
- key: 'addChangeListener',
- value: function addChangeListener(listener) {
- this.listeners.push(listener);
- }
- }, {
- key: 'removeChangeListener',
- value: function removeChangeListener(listener) {
- this.listeners = this.listeners.filter(function (l) {
- return l !== listener;
- });
- }
- }, {
- key: 'push',
- value: function push(path) {
- this.history.push(path);
- this._updateHistoryLength();
- this._notifyChange(LocationActions.PUSH);
- }
- }, {
- key: 'replace',
- value: function replace(path) {
- invariant(this.history.length, 'You cannot replace the current path with no history');
-
- this.history[this.history.length - 1] = path;
-
- this._notifyChange(LocationActions.REPLACE);
- }
- }, {
- key: 'pop',
- value: function pop() {
- this.history.pop();
- this._updateHistoryLength();
- this._notifyChange(LocationActions.POP);
- }
- }, {
- key: 'getCurrentPath',
- value: function getCurrentPath() {
- return this.history[this.history.length - 1];
- }
- }, {
- key: 'toString',
- value: function toString() {
- return '';
- }
- }]);
-
- return TestLocation;
-})();
-
-module.exports = TestLocation;
-},{"../History":34,"../actions/LocationActions":44,"invariant":68}],64:[function(require,module,exports){
-'use strict';
-
-var createRouter = require('./createRouter');
-
-/**
- * A high-level convenience method that creates, configures, and
- * runs a router in one shot. The method signature is:
- *
- * Router.run(routes[, location ], callback);
- *
- * Using `window.location.hash` to manage the URL, you could do:
- *
- * Router.run(routes, function (Handler) {
- * React.render(, document.body);
- * });
- *
- * Using HTML5 history and a custom "cursor" prop:
- *
- * Router.run(routes, Router.HistoryLocation, function (Handler) {
- * React.render(, document.body);
- * });
- *
- * Returns the newly created router.
- *
- * Note: If you need to specify further options for your router such
- * as error/abort handling or custom scroll behavior, use Router.create
- * instead.
- *
- * var router = Router.create(options);
- * router.run(function (Handler) {
- * // ...
- * });
- */
-function runRouter(routes, location, callback) {
- if (typeof location === 'function') {
- callback = location;
- location = null;
- }
-
- var router = createRouter({
- routes: routes,
- location: location
- });
-
- router.run(callback);
-
- return router;
-}
-
-module.exports = runRouter;
-},{"./createRouter":54}],65:[function(require,module,exports){
-'use strict';
-
-function supportsHistory() {
- /*! taken from modernizr
- * https://github.com/Modernizr/Modernizr/blob/master/LICENSE
- * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js
- * changed to avoid false negatives for Windows Phones: https://github.com/rackt/react-router/issues/586
- */
- var ua = navigator.userAgent;
- if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) {
- return false;
- }
- return window.history && 'pushState' in window.history;
-}
-
-module.exports = supportsHistory;
-},{}],66:[function(require,module,exports){
-(function (process){
-/**
- * Copyright 2014-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of https://github.com/facebook/react/tree/0.13-stable.
- * An additional grant of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule warning
- */
-
-"use strict";
-
-/**
- * Similar to invariant but only logs a warning if the condition is not met.
- * This can be used to log issues in development environments in critical
- * paths. Removing the logging code for production environments will keep the
- * same logic and follow the same code paths.
- */
-
-var __DEV__ = process.env.NODE_ENV !== 'production';
-
-var warning = function warning() {};
-
-if (__DEV__) {
- warning = function (condition, format) {
- for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
- args[_key - 2] = arguments[_key];
- }
-
- if (format === undefined) {
- throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');
- }
-
- if (format.length < 10 || /^[s\W]*$/.test(format)) {
- throw new Error('The warning format should be able to uniquely identify this ' + 'warning. Please, use a more descriptive format than: ' + format);
- }
-
- if (format.indexOf('Failed Composite propType: ') === 0) {
- return; // Ignore CompositeComponent proptype check.
- }
-
- if (!condition) {
- var argIndex = 0;
- var message = 'Warning: ' + format.replace(/%s/g, function () {
- return args[argIndex++];
- });
- console.warn(message);
- try {
- // --- Welcome to debugging React ---
- // This error was thrown as a convenience so that you can use this stack
- // to find the callsite that caused this warning to fire.
- throw new Error(message);
- } catch (x) {}
- }
- };
-}
-
-module.exports = warning;
-}).call(this,require('_process'))
-
-},{"_process":299}],67:[function(require,module,exports){
-var canUseDOM = !!(
- typeof window !== 'undefined' &&
- window.document &&
- window.document.createElement
-);
-
-module.exports = canUseDOM;
-},{}],68:[function(require,module,exports){
-(function (process){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- */
-
-'use strict';
-
-/**
- * Use invariant() to assert state which your program assumes to be true.
- *
- * Provide sprintf-style format (only %s is supported) and arguments
- * to provide information about what broke and what you were
- * expecting.
- *
- * The invariant message will be stripped in production, but the invariant
- * will remain to ensure logic does not differ in production.
- */
-
-var invariant = function(condition, format, a, b, c, d, e, f) {
- if (process.env.NODE_ENV !== 'production') {
- if (format === undefined) {
- throw new Error('invariant requires an error message argument');
- }
- }
-
- if (!condition) {
- var error;
- if (format === undefined) {
- error = new Error(
- 'Minified exception occurred; use the non-minified dev environment ' +
- 'for the full error message and additional helpful warnings.'
- );
- } else {
- var args = [a, b, c, d, e, f];
- var argIndex = 0;
- error = new Error(
- format.replace(/%s/g, function() { return args[argIndex++]; })
- );
- error.name = 'Invariant Violation';
- }
-
- error.framesToPop = 1; // we don't care about invariant's own frame
- throw error;
- }
-};
-
-module.exports = invariant;
-
-}).call(this,require('_process'))
-
-},{"_process":299}],69:[function(require,module,exports){
-'use strict';
-
-function ToObject(val) {
- if (val == null) {
- throw new TypeError('Object.assign cannot be called with null or undefined');
- }
-
- return Object(val);
-}
-
-module.exports = Object.assign || function (target, source) {
- var from;
- var keys;
- var to = ToObject(target);
-
- for (var s = 1; s < arguments.length; s++) {
- from = arguments[s];
- keys = Object.keys(Object(from));
-
- for (var i = 0; i < keys.length; i++) {
- to[keys[i]] = from[keys[i]];
- }
- }
-
- return to;
-};
-
-},{}],70:[function(require,module,exports){
-module.exports = require('./lib/');
-
-},{"./lib/":71}],71:[function(require,module,exports){
-// Load modules
-
-var Stringify = require('./stringify');
-var Parse = require('./parse');
-
-
-// Declare internals
-
-var internals = {};
-
-
-module.exports = {
- stringify: Stringify,
- parse: Parse
-};
-
-},{"./parse":72,"./stringify":73}],72:[function(require,module,exports){
-// Load modules
-
-var Utils = require('./utils');
-
-
-// Declare internals
-
-var internals = {
- delimiter: '&',
- depth: 5,
- arrayLimit: 20,
- parameterLimit: 1000
-};
-
-
-internals.parseValues = function (str, options) {
-
- var obj = {};
- var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit);
-
- for (var i = 0, il = parts.length; i < il; ++i) {
- var part = parts[i];
- var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1;
-
- if (pos === -1) {
- obj[Utils.decode(part)] = '';
- }
- else {
- var key = Utils.decode(part.slice(0, pos));
- var val = Utils.decode(part.slice(pos + 1));
-
- if (Object.prototype.hasOwnProperty(key)) {
- continue;
- }
-
- if (!obj.hasOwnProperty(key)) {
- obj[key] = val;
- }
- else {
- obj[key] = [].concat(obj[key]).concat(val);
- }
- }
- }
-
- return obj;
-};
-
-
-internals.parseObject = function (chain, val, options) {
-
- if (!chain.length) {
- return val;
- }
-
- var root = chain.shift();
-
- var obj = {};
- if (root === '[]') {
- obj = [];
- obj = obj.concat(internals.parseObject(chain, val, options));
- }
- else {
- var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root;
- var index = parseInt(cleanRoot, 10);
- var indexString = '' + index;
- if (!isNaN(index) &&
- root !== cleanRoot &&
- indexString === cleanRoot &&
- index >= 0 &&
- index <= options.arrayLimit) {
-
- obj = [];
- obj[index] = internals.parseObject(chain, val, options);
- }
- else {
- obj[cleanRoot] = internals.parseObject(chain, val, options);
- }
- }
-
- return obj;
-};
-
-
-internals.parseKeys = function (key, val, options) {
-
- if (!key) {
- return;
- }
-
- // The regex chunks
-
- var parent = /^([^\[\]]*)/;
- var child = /(\[[^\[\]]*\])/g;
-
- // Get the parent
-
- var segment = parent.exec(key);
-
- // Don't allow them to overwrite object prototype properties
-
- if (Object.prototype.hasOwnProperty(segment[1])) {
- return;
- }
-
- // Stash the parent if it exists
-
- var keys = [];
- if (segment[1]) {
- keys.push(segment[1]);
- }
-
- // Loop through children appending to the array until we hit depth
-
- var i = 0;
- while ((segment = child.exec(key)) !== null && i < options.depth) {
-
- ++i;
- if (!Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) {
- keys.push(segment[1]);
- }
- }
-
- // If there's a remainder, just add whatever is left
-
- if (segment) {
- keys.push('[' + key.slice(segment.index) + ']');
- }
-
- return internals.parseObject(keys, val, options);
-};
-
-
-module.exports = function (str, options) {
-
- if (str === '' ||
- str === null ||
- typeof str === 'undefined') {
-
- return {};
- }
-
- options = options || {};
- options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter;
- options.depth = typeof options.depth === 'number' ? options.depth : internals.depth;
- options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit;
- options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit;
-
- var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str;
- var obj = {};
-
- // Iterate over the keys and setup the new object
-
- var keys = Object.keys(tempObj);
- for (var i = 0, il = keys.length; i < il; ++i) {
- var key = keys[i];
- var newObj = internals.parseKeys(key, tempObj[key], options);
- obj = Utils.merge(obj, newObj);
- }
-
- return Utils.compact(obj);
-};
-
-},{"./utils":74}],73:[function(require,module,exports){
-// Load modules
-
-var Utils = require('./utils');
-
-
-// Declare internals
-
-var internals = {
- delimiter: '&',
- arrayPrefixGenerators: {
- brackets: function (prefix, key) {
- return prefix + '[]';
- },
- indices: function (prefix, key) {
- return prefix + '[' + key + ']';
- },
- repeat: function (prefix, key) {
- return prefix;
- }
- }
-};
-
-
-internals.stringify = function (obj, prefix, generateArrayPrefix) {
-
- if (Utils.isBuffer(obj)) {
- obj = obj.toString();
- }
- else if (obj instanceof Date) {
- obj = obj.toISOString();
- }
- else if (obj === null) {
- obj = '';
- }
-
- if (typeof obj === 'string' ||
- typeof obj === 'number' ||
- typeof obj === 'boolean') {
-
- return [encodeURIComponent(prefix) + '=' + encodeURIComponent(obj)];
- }
-
- var values = [];
-
- if (typeof obj === 'undefined') {
- return values;
- }
-
- var objKeys = Object.keys(obj);
- for (var i = 0, il = objKeys.length; i < il; ++i) {
- var key = objKeys[i];
- if (Array.isArray(obj)) {
- values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix));
- }
- else {
- values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix));
- }
- }
-
- return values;
-};
-
-
-module.exports = function (obj, options) {
-
- options = options || {};
- var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
-
- var keys = [];
-
- if (typeof obj !== 'object' ||
- obj === null) {
-
- return '';
- }
-
- var arrayFormat;
- if (options.arrayFormat in internals.arrayPrefixGenerators) {
- arrayFormat = options.arrayFormat;
- }
- else if ('indices' in options) {
- arrayFormat = options.indices ? 'indices' : 'repeat';
- }
- else {
- arrayFormat = 'indices';
- }
-
- var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];
-
- var objKeys = Object.keys(obj);
- for (var i = 0, il = objKeys.length; i < il; ++i) {
- var key = objKeys[i];
- keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix));
- }
-
- return keys.join(delimiter);
-};
-
-},{"./utils":74}],74:[function(require,module,exports){
-// Load modules
-
-
-// Declare internals
-
-var internals = {};
-
-
-exports.arrayToObject = function (source) {
-
- var obj = {};
- for (var i = 0, il = source.length; i < il; ++i) {
- if (typeof source[i] !== 'undefined') {
-
- obj[i] = source[i];
- }
- }
-
- return obj;
-};
-
-
-exports.merge = function (target, source) {
-
- if (!source) {
- return target;
- }
-
- if (typeof source !== 'object') {
- if (Array.isArray(target)) {
- target.push(source);
- }
- else {
- target[source] = true;
- }
-
- return target;
- }
-
- if (typeof target !== 'object') {
- target = [target].concat(source);
- return target;
- }
-
- if (Array.isArray(target) &&
- !Array.isArray(source)) {
-
- target = exports.arrayToObject(target);
- }
-
- var keys = Object.keys(source);
- for (var k = 0, kl = keys.length; k < kl; ++k) {
- var key = keys[k];
- var value = source[key];
-
- if (!target[key]) {
- target[key] = value;
- }
- else {
- target[key] = exports.merge(target[key], value);
- }
- }
-
- return target;
-};
-
-
-exports.decode = function (str) {
-
- try {
- return decodeURIComponent(str.replace(/\+/g, ' '));
- } catch (e) {
- return str;
- }
-};
-
-
-exports.compact = function (obj, refs) {
-
- if (typeof obj !== 'object' ||
- obj === null) {
-
- return obj;
- }
-
- refs = refs || [];
- var lookup = refs.indexOf(obj);
- if (lookup !== -1) {
- return refs[lookup];
- }
-
- refs.push(obj);
-
- if (Array.isArray(obj)) {
- var compacted = [];
-
- for (var i = 0, il = obj.length; i < il; ++i) {
- if (typeof obj[i] !== 'undefined') {
- compacted.push(obj[i]);
- }
- }
-
- return compacted;
- }
-
- var keys = Object.keys(obj);
- for (i = 0, il = keys.length; i < il; ++i) {
- var key = keys[i];
- obj[key] = exports.compact(obj[key], refs);
- }
-
- return obj;
-};
-
-
-exports.isRegExp = function (obj) {
- return Object.prototype.toString.call(obj) === '[object RegExp]';
-};
-
-
-exports.isBuffer = function (obj) {
-
- if (obj === null ||
- typeof obj === 'undefined') {
-
- return false;
- }
-
- return !!(obj.constructor &&
- obj.constructor.isBuffer &&
- obj.constructor.isBuffer(obj));
-};
-
-},{}],75:[function(require,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule AutoFocusUtils
- * @typechecks static-only
- */
-
-'use strict';
-
-var ReactMount = require('./ReactMount');
-
-var findDOMNode = require('./findDOMNode');
-var focusNode = require('fbjs/lib/focusNode');
-
-var Mixin = {
- componentDidMount: function () {
- if (this.props.autoFocus) {
- focusNode(findDOMNode(this));
- }
- }
-};
-
-var AutoFocusUtils = {
- Mixin: Mixin,
-
- focusDOMComponent: function () {
- focusNode(ReactMount.getNode(this._rootNodeID));
- }
-};
-
-module.exports = AutoFocusUtils;
-},{"./ReactMount":139,"./findDOMNode":182,"fbjs/lib/focusNode":212}],76:[function(require,module,exports){
-/**
- * Copyright 2013-2015 Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule BeforeInputEventPlugin
- * @typechecks static-only
- */
-
-'use strict';
-
-var EventConstants = require('./EventConstants');
-var EventPropagators = require('./EventPropagators');
-var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
-var FallbackCompositionState = require('./FallbackCompositionState');
-var SyntheticCompositionEvent = require('./SyntheticCompositionEvent');
-var SyntheticInputEvent = require('./SyntheticInputEvent');
-
-var keyOf = require('fbjs/lib/keyOf');
-
-var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
-var START_KEYCODE = 229;
-
-var canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window;
-
-var documentMode = null;
-if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) {
- documentMode = document.documentMode;
-}
-
-// Webkit offers a very useful `textInput` event that can be used to
-// directly represent `beforeInput`. The IE `textinput` event is not as
-// useful, so we don't use it.
-var canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto();
-
-// In IE9+, we have access to composition events, but the data supplied
-// by the native compositionend event may be incorrect. Japanese ideographic
-// spaces, for instance (\u3000) are not recorded correctly.
-var useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
-
-/**
- * Opera <= 12 includes TextEvent in window, but does not fire
- * text input events. Rely on keypress instead.
- */
-function isPresto() {
- var opera = window.opera;
- return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12;
-}
-
-var SPACEBAR_CODE = 32;
-var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
-
-var topLevelTypes = EventConstants.topLevelTypes;
-
-// Events and their corresponding property names.
-var eventTypes = {
- beforeInput: {
- phasedRegistrationNames: {
- bubbled: keyOf({ onBeforeInput: null }),
- captured: keyOf({ onBeforeInputCapture: null })
- },
- dependencies: [topLevelTypes.topCompositionEnd, topLevelTypes.topKeyPress, topLevelTypes.topTextInput, topLevelTypes.topPaste]
- },
- compositionEnd: {
- phasedRegistrationNames: {
- bubbled: keyOf({ onCompositionEnd: null }),
- captured: keyOf({ onCompositionEndCapture: null })
- },
- dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionEnd, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]
- },
- compositionStart: {
- phasedRegistrationNames: {
- bubbled: keyOf({ onCompositionStart: null }),
- captured: keyOf({ onCompositionStartCapture: null })
- },
- dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionStart, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]
- },
- compositionUpdate: {
- phasedRegistrationNames: {
- bubbled: keyOf({ onCompositionUpdate: null }),
- captured: keyOf({ onCompositionUpdateCapture: null })
- },
- dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionUpdate, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]
- }
-};
-
-// Track whether we've ever handled a keypress on the space key.
-var hasSpaceKeypress = false;
-
-/**
- * Return whether a native keypress event is assumed to be a command.
- * This is required because Firefox fires `keypress` events for key commands
- * (cut, copy, select-all, etc.) even though no character is inserted.
- */
-function isKeypressCommand(nativeEvent) {
- return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&
- // ctrlKey && altKey is equivalent to AltGr, and is not a command.
- !(nativeEvent.ctrlKey && nativeEvent.altKey);
-}
-
-/**
- * Translate native top level events into event types.
- *
- * @param {string} topLevelType
- * @return {object}
- */
-function getCompositionEventType(topLevelType) {
- switch (topLevelType) {
- case topLevelTypes.topCompositionStart:
- return eventTypes.compositionStart;
- case topLevelTypes.topCompositionEnd:
- return eventTypes.compositionEnd;
- case topLevelTypes.topCompositionUpdate:
- return eventTypes.compositionUpdate;
- }
-}
-
-/**
- * Does our fallback best-guess model think this event signifies that
- * composition has begun?
- *
- * @param {string} topLevelType
- * @param {object} nativeEvent
- * @return {boolean}
- */
-function isFallbackCompositionStart(topLevelType, nativeEvent) {
- return topLevelType === topLevelTypes.topKeyDown && nativeEvent.keyCode === START_KEYCODE;
-}
-
-/**
- * Does our fallback mode think that this event is the end of composition?
- *
- * @param {string} topLevelType
- * @param {object} nativeEvent
- * @return {boolean}
- */
-function isFallbackCompositionEnd(topLevelType, nativeEvent) {
- switch (topLevelType) {
- case topLevelTypes.topKeyUp:
- // Command keys insert or clear IME input.
- return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
- case topLevelTypes.topKeyDown:
- // Expect IME keyCode on each keydown. If we get any other
- // code we must have exited earlier.
- return nativeEvent.keyCode !== START_KEYCODE;
- case topLevelTypes.topKeyPress:
- case topLevelTypes.topMouseDown:
- case topLevelTypes.topBlur:
- // Events are not possible without cancelling IME.
- return true;
- default:
- return false;
- }
-}
-
-/**
- * Google Input Tools provides composition data via a CustomEvent,
- * with the `data` property populated in the `detail` object. If this
- * is available on the event object, use it. If not, this is a plain
- * composition event and we have nothing special to extract.
- *
- * @param {object} nativeEvent
- * @return {?string}
- */
-function getDataFromCustomEvent(nativeEvent) {
- var detail = nativeEvent.detail;
- if (typeof detail === 'object' && 'data' in detail) {
- return detail.data;
- }
- return null;
-}
-
-// Track the current IME composition fallback object, if any.
-var currentComposition = null;
-
-/**
- * @param {string} topLevelType Record from `EventConstants`.
- * @param {DOMEventTarget} topLevelTarget The listening component root node.
- * @param {string} topLevelTargetID ID of `topLevelTarget`.
- * @param {object} nativeEvent Native browser event.
- * @return {?object} A SyntheticCompositionEvent.
- */
-function extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
- var eventType;
- var fallbackData;
-
- if (canUseCompositionEvent) {
- eventType = getCompositionEventType(topLevelType);
- } else if (!currentComposition) {
- if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
- eventType = eventTypes.compositionStart;
- }
- } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
- eventType = eventTypes.compositionEnd;
- }
-
- if (!eventType) {
- return null;
- }
-
- if (useFallbackCompositionData) {
- // The current composition is stored statically and must not be
- // overwritten while composition continues.
- if (!currentComposition && eventType === eventTypes.compositionStart) {
- currentComposition = FallbackCompositionState.getPooled(topLevelTarget);
- } else if (eventType === eventTypes.compositionEnd) {
- if (currentComposition) {
- fallbackData = currentComposition.getData();
- }
- }
- }
-
- var event = SyntheticCompositionEvent.getPooled(eventType, topLevelTargetID, nativeEvent, nativeEventTarget);
-
- if (fallbackData) {
- // Inject data generated from fallback path into the synthetic event.
- // This matches the property of native CompositionEventInterface.
- event.data = fallbackData;
- } else {
- var customData = getDataFromCustomEvent(nativeEvent);
- if (customData !== null) {
- event.data = customData;
- }
- }
-
- EventPropagators.accumulateTwoPhaseDispatches(event);
- return event;
-}
-
-/**
- * @param {string} topLevelType Record from `EventConstants`.
- * @param {object} nativeEvent Native browser event.
- * @return {?string} The string corresponding to this `beforeInput` event.
- */
-function getNativeBeforeInputChars(topLevelType, nativeEvent) {
- switch (topLevelType) {
- case topLevelTypes.topCompositionEnd:
- return getDataFromCustomEvent(nativeEvent);
- case topLevelTypes.topKeyPress:
- /**
- * If native `textInput` events are available, our goal is to make
- * use of them. However, there is a special case: the spacebar key.
- * In Webkit, preventing default on a spacebar `textInput` event
- * cancels character insertion, but it *also* causes the browser
- * to fall back to its default spacebar behavior of scrolling the
- * page.
- *
- * Tracking at:
- * https://code.google.com/p/chromium/issues/detail?id=355103
- *
- * To avoid this issue, use the keypress event as if no `textInput`
- * event is available.
- */
- var which = nativeEvent.which;
- if (which !== SPACEBAR_CODE) {
- return null;
- }
-
- hasSpaceKeypress = true;
- return SPACEBAR_CHAR;
-
- case topLevelTypes.topTextInput:
- // Record the characters to be added to the DOM.
- var chars = nativeEvent.data;
-
- // If it's a spacebar character, assume that we have already handled
- // it at the keypress level and bail immediately. Android Chrome
- // doesn't give us keycodes, so we need to blacklist it.
- if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
- return null;
- }
-
- return chars;
-
- default:
- // For other native event types, do nothing.
- return null;
- }
-}
-
-/**
- * For browsers that do not provide the `textInput` event, extract the
- * appropriate string to use for SyntheticInputEvent.
- *
- * @param {string} topLevelType Record from `EventConstants`.
- * @param {object} nativeEvent Native browser event.
- * @return {?string} The fallback string for this `beforeInput` event.
- */
-function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
- // If we are currently composing (IME) and using a fallback to do so,
- // try to extract the composed characters from the fallback object.
- if (currentComposition) {
- if (topLevelType === topLevelTypes.topCompositionEnd || isFallbackCompositionEnd(topLevelType, nativeEvent)) {
- var chars = currentComposition.getData();
- FallbackCompositionState.release(currentComposition);
- currentComposition = null;
- return chars;
- }
- return null;
- }
-
- switch (topLevelType) {
- case topLevelTypes.topPaste:
- // If a paste event occurs after a keypress, throw out the input
- // chars. Paste events should not lead to BeforeInput events.
- return null;
- case topLevelTypes.topKeyPress:
- /**
- * As of v27, Firefox may fire keypress events even when no character
- * will be inserted. A few possibilities:
- *
- * - `which` is `0`. Arrow keys, Esc key, etc.
- *
- * - `which` is the pressed key code, but no char is available.
- * Ex: 'AltGr + d` in Polish. There is no modified character for
- * this key combination and no character is inserted into the
- * document, but FF fires the keypress for char code `100` anyway.
- * No `input` event will occur.
- *
- * - `which` is the pressed key code, but a command combination is
- * being used. Ex: `Cmd+C`. No character is inserted, and no
- * `input` event will occur.
- */
- if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {
- return String.fromCharCode(nativeEvent.which);
- }
- return null;
- case topLevelTypes.topCompositionEnd:
- return useFallbackCompositionData ? null : nativeEvent.data;
- default:
- return null;
- }
-}
-
-/**
- * Extract a SyntheticInputEvent for `beforeInput`, based on either native
- * `textInput` or fallback behavior.
- *
- * @param {string} topLevelType Record from `EventConstants`.
- * @param {DOMEventTarget} topLevelTarget The listening component root node.
- * @param {string} topLevelTargetID ID of `topLevelTarget`.
- * @param {object} nativeEvent Native browser event.
- * @return {?object} A SyntheticInputEvent.
- */
-function extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
- var chars;
-
- if (canUseTextInputEvent) {
- chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
- } else {
- chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
- }
-
- // If no characters are being inserted, no BeforeInput event should
- // be fired.
- if (!chars) {
- return null;
- }
-
- var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, topLevelTargetID, nativeEvent, nativeEventTarget);
-
- event.data = chars;
- EventPropagators.accumulateTwoPhaseDispatches(event);
- return event;
-}
-
-/**
- * Create an `onBeforeInput` event to match
- * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
- *
- * This event plugin is based on the native `textInput` event
- * available in Chrome, Safari, Opera, and IE. This event fires after
- * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
- *
- * `beforeInput` is spec'd but not implemented in any browsers, and
- * the `input` event does not provide any useful information about what has
- * actually been added, contrary to the spec. Thus, `textInput` is the best
- * available event to identify the characters that have actually been inserted
- * into the target node.
- *
- * This plugin is also responsible for emitting `composition` events, thus
- * allowing us to share composition fallback code for both `beforeInput` and
- * `composition` event types.
- */
-var BeforeInputEventPlugin = {
-
- eventTypes: eventTypes,
-
- /**
- * @param {string} topLevelType Record from `EventConstants`.
- * @param {DOMEventTarget} topLevelTarget The listening component root node.
- * @param {string} topLevelTargetID ID of `topLevelTarget`.
- * @param {object} nativeEvent Native browser event.
- * @return {*} An accumulation of synthetic events.
- * @see {EventPluginHub.extractEvents}
- */
- extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
- return [extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget)];
- }
-};
-
-module.exports = BeforeInputEventPlugin;
-},{"./EventConstants":88,"./EventPropagators":92,"./FallbackCompositionState":93,"./SyntheticCompositionEvent":164,"./SyntheticInputEvent":168,"fbjs/lib/ExecutionEnvironment":204,"fbjs/lib/keyOf":222}],77:[function(require,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule CSSProperty
- */
-
-'use strict';
-
-/**
- * CSS properties which accept numbers but are not in units of "px".
- */
-var isUnitlessNumber = {
- animationIterationCount: true,
- boxFlex: true,
- boxFlexGroup: true,
- boxOrdinalGroup: true,
- columnCount: true,
- flex: true,
- flexGrow: true,
- flexPositive: true,
- flexShrink: true,
- flexNegative: true,
- flexOrder: true,
- fontWeight: true,
- lineClamp: true,
- lineHeight: true,
- opacity: true,
- order: true,
- orphans: true,
- tabSize: true,
- widows: true,
- zIndex: true,
- zoom: true,
-
- // SVG-related properties
- fillOpacity: true,
- stopOpacity: true,
- strokeDashoffset: true,
- strokeOpacity: true,
- strokeWidth: true
-};
-
-/**
- * @param {string} prefix vendor-specific prefix, eg: Webkit
- * @param {string} key style name, eg: transitionDuration
- * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
- * WebkitTransitionDuration
- */
-function prefixKey(prefix, key) {
- return prefix + key.charAt(0).toUpperCase() + key.substring(1);
-}
-
-/**
- * Support style names that may come passed in prefixed by adding permutations
- * of vendor prefixes.
- */
-var prefixes = ['Webkit', 'ms', 'Moz', 'O'];
-
-// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
-// infinite loop, because it iterates over the newly added props too.
-Object.keys(isUnitlessNumber).forEach(function (prop) {
- prefixes.forEach(function (prefix) {
- isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
- });
-});
-
-/**
- * Most style properties can be unset by doing .style[prop] = '' but IE8
- * doesn't like doing that with shorthand properties so for the properties that
- * IE8 breaks on, which are listed here, we instead unset each of the
- * individual properties. See http://bugs.jquery.com/ticket/12385.
- * The 4-value 'clock' properties like margin, padding, border-width seem to
- * behave without any problems. Curiously, list-style works too without any
- * special prodding.
- */
-var shorthandPropertyExpansions = {
- background: {
- backgroundAttachment: true,
- backgroundColor: true,
- backgroundImage: true,
- backgroundPositionX: true,
- backgroundPositionY: true,
- backgroundRepeat: true
- },
- backgroundPosition: {
- backgroundPositionX: true,
- backgroundPositionY: true
- },
- border: {
- borderWidth: true,
- borderStyle: true,
- borderColor: true
- },
- borderBottom: {
- borderBottomWidth: true,
- borderBottomStyle: true,
- borderBottomColor: true
- },
- borderLeft: {
- borderLeftWidth: true,
- borderLeftStyle: true,
- borderLeftColor: true
- },
- borderRight: {
- borderRightWidth: true,
- borderRightStyle: true,
- borderRightColor: true
- },
- borderTop: {
- borderTopWidth: true,
- borderTopStyle: true,
- borderTopColor: true
- },
- font: {
- fontStyle: true,
- fontVariant: true,
- fontWeight: true,
- fontSize: true,
- lineHeight: true,
- fontFamily: true
- },
- outline: {
- outlineWidth: true,
- outlineStyle: true,
- outlineColor: true
- }
-};
-
-var CSSProperty = {
- isUnitlessNumber: isUnitlessNumber,
- shorthandPropertyExpansions: shorthandPropertyExpansions
-};
-
-module.exports = CSSProperty;
-},{}],78:[function(require,module,exports){
-(function (process){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule CSSPropertyOperations
- * @typechecks static-only
- */
-
-'use strict';
-
-var CSSProperty = require('./CSSProperty');
-var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
-var ReactPerf = require('./ReactPerf');
-
-var camelizeStyleName = require('fbjs/lib/camelizeStyleName');
-var dangerousStyleValue = require('./dangerousStyleValue');
-var hyphenateStyleName = require('fbjs/lib/hyphenateStyleName');
-var memoizeStringOnly = require('fbjs/lib/memoizeStringOnly');
-var warning = require('fbjs/lib/warning');
-
-var processStyleName = memoizeStringOnly(function (styleName) {
- return hyphenateStyleName(styleName);
-});
-
-var hasShorthandPropertyBug = false;
-var styleFloatAccessor = 'cssFloat';
-if (ExecutionEnvironment.canUseDOM) {
- var tempStyle = document.createElement('div').style;
- try {
- // IE8 throws "Invalid argument." if resetting shorthand style properties.
- tempStyle.font = '';
- } catch (e) {
- hasShorthandPropertyBug = true;
- }
- // IE8 only supports accessing cssFloat (standard) as styleFloat
- if (document.documentElement.style.cssFloat === undefined) {
- styleFloatAccessor = 'styleFloat';
- }
-}
-
-if (process.env.NODE_ENV !== 'production') {
- // 'msTransform' is correct, but the other prefixes should be capitalized
- var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
-
- // style values shouldn't contain a semicolon
- var badStyleValueWithSemicolonPattern = /;\s*$/;
-
- var warnedStyleNames = {};
- var warnedStyleValues = {};
-
- var warnHyphenatedStyleName = function (name) {
- if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
- return;
- }
-
- warnedStyleNames[name] = true;
- process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?', name, camelizeStyleName(name)) : undefined;
- };
-
- var warnBadVendoredStyleName = function (name) {
- if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
- return;
- }
-
- warnedStyleNames[name] = true;
- process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)) : undefined;
- };
-
- var warnStyleValueWithSemicolon = function (name, value) {
- if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
- return;
- }
-
- warnedStyleValues[value] = true;
- process.env.NODE_ENV !== 'production' ? warning(false, 'Style property values shouldn\'t contain a semicolon. ' + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')) : undefined;
- };
-
- /**
- * @param {string} name
- * @param {*} value
- */
- var warnValidStyle = function (name, value) {
- if (name.indexOf('-') > -1) {
- warnHyphenatedStyleName(name);
- } else if (badVendoredStyleNamePattern.test(name)) {
- warnBadVendoredStyleName(name);
- } else if (badStyleValueWithSemicolonPattern.test(value)) {
- warnStyleValueWithSemicolon(name, value);
- }
- };
-}
-
-/**
- * Operations for dealing with CSS properties.
- */
-var CSSPropertyOperations = {
-
- /**
- * Serializes a mapping of style properties for use as inline styles:
- *
- * > createMarkupForStyles({width: '200px', height: 0})
- * "width:200px;height:0;"
- *
- * Undefined values are ignored so that declarative programming is easier.
- * The result should be HTML-escaped before insertion into the DOM.
- *
- * @param {object} styles
- * @return {?string}
- */
- createMarkupForStyles: function (styles) {
- var serialized = '';
- for (var styleName in styles) {
- if (!styles.hasOwnProperty(styleName)) {
- continue;
- }
- var styleValue = styles[styleName];
- if (process.env.NODE_ENV !== 'production') {
- warnValidStyle(styleName, styleValue);
- }
- if (styleValue != null) {
- serialized += processStyleName(styleName) + ':';
- serialized += dangerousStyleValue(styleName, styleValue) + ';';
- }
- }
- return serialized || null;
- },
-
- /**
- * Sets the value for multiple styles on a node. If a value is specified as
- * '' (empty string), the corresponding style property will be unset.
- *
- * @param {DOMElement} node
- * @param {object} styles
- */
- setValueForStyles: function (node, styles) {
- var style = node.style;
- for (var styleName in styles) {
- if (!styles.hasOwnProperty(styleName)) {
- continue;
- }
- if (process.env.NODE_ENV !== 'production') {
- warnValidStyle(styleName, styles[styleName]);
- }
- var styleValue = dangerousStyleValue(styleName, styles[styleName]);
- if (styleName === 'float') {
- styleName = styleFloatAccessor;
- }
- if (styleValue) {
- style[styleName] = styleValue;
- } else {
- var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName];
- if (expansion) {
- // Shorthand property that IE8 won't like unsetting, so unset each
- // component to placate it
- for (var individualStyleName in expansion) {
- style[individualStyleName] = '';
- }
- } else {
- style[styleName] = '';
- }
- }
- }
- }
-
-};
-
-ReactPerf.measureMethods(CSSPropertyOperations, 'CSSPropertyOperations', {
- setValueForStyles: 'setValueForStyles'
-});
-
-module.exports = CSSPropertyOperations;
-}).call(this,require('_process'))
-
-},{"./CSSProperty":77,"./ReactPerf":145,"./dangerousStyleValue":179,"_process":299,"fbjs/lib/ExecutionEnvironment":204,"fbjs/lib/camelizeStyleName":206,"fbjs/lib/hyphenateStyleName":217,"fbjs/lib/memoizeStringOnly":224,"fbjs/lib/warning":229}],79:[function(require,module,exports){
-(function (process){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule CallbackQueue
- */
-
-'use strict';
-
-var PooledClass = require('./PooledClass');
-
-var assign = require('./Object.assign');
-var invariant = require('fbjs/lib/invariant');
-
-/**
- * A specialized pseudo-event module to help keep track of components waiting to
- * be notified when their DOM representations are available for use.
- *
- * This implements `PooledClass`, so you should never need to instantiate this.
- * Instead, use `CallbackQueue.getPooled()`.
- *
- * @class ReactMountReady
- * @implements PooledClass
- * @internal
- */
-function CallbackQueue() {
- this._callbacks = null;
- this._contexts = null;
-}
-
-assign(CallbackQueue.prototype, {
-
- /**
- * Enqueues a callback to be invoked when `notifyAll` is invoked.
- *
- * @param {function} callback Invoked when `notifyAll` is invoked.
- * @param {?object} context Context to call `callback` with.
- * @internal
- */
- enqueue: function (callback, context) {
- this._callbacks = this._callbacks || [];
- this._contexts = this._contexts || [];
- this._callbacks.push(callback);
- this._contexts.push(context);
- },
-
- /**
- * Invokes all enqueued callbacks and clears the queue. This is invoked after
- * the DOM representation of a component has been created or updated.
- *
- * @internal
- */
- notifyAll: function () {
- var callbacks = this._callbacks;
- var contexts = this._contexts;
- if (callbacks) {
- !(callbacks.length === contexts.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : invariant(false) : undefined;
- this._callbacks = null;
- this._contexts = null;
- for (var i = 0; i < callbacks.length; i++) {
- callbacks[i].call(contexts[i]);
- }
- callbacks.length = 0;
- contexts.length = 0;
- }
- },
-
- /**
- * Resets the internal queue.
- *
- * @internal
- */
- reset: function () {
- this._callbacks = null;
- this._contexts = null;
- },
-
- /**
- * `PooledClass` looks for this.
- */
- destructor: function () {
- this.reset();
- }
-
-});
-
-PooledClass.addPoolingTo(CallbackQueue);
-
-module.exports = CallbackQueue;
-}).call(this,require('_process'))
-
-},{"./Object.assign":96,"./PooledClass":97,"_process":299,"fbjs/lib/invariant":218}],80:[function(require,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule ChangeEventPlugin
- */
-
-'use strict';
-
-var EventConstants = require('./EventConstants');
-var EventPluginHub = require('./EventPluginHub');
-var EventPropagators = require('./EventPropagators');
-var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
-var ReactUpdates = require('./ReactUpdates');
-var SyntheticEvent = require('./SyntheticEvent');
-
-var getEventTarget = require('./getEventTarget');
-var isEventSupported = require('./isEventSupported');
-var isTextInputElement = require('./isTextInputElement');
-var keyOf = require('fbjs/lib/keyOf');
-
-var topLevelTypes = EventConstants.topLevelTypes;
-
-var eventTypes = {
- change: {
- phasedRegistrationNames: {
- bubbled: keyOf({ onChange: null }),
- captured: keyOf({ onChangeCapture: null })
- },
- dependencies: [topLevelTypes.topBlur, topLevelTypes.topChange, topLevelTypes.topClick, topLevelTypes.topFocus, topLevelTypes.topInput, topLevelTypes.topKeyDown, topLevelTypes.topKeyUp, topLevelTypes.topSelectionChange]
- }
-};
-
-/**
- * For IE shims
- */
-var activeElement = null;
-var activeElementID = null;
-var activeElementValue = null;
-var activeElementValueProp = null;
-
-/**
- * SECTION: handle `change` event
- */
-function shouldUseChangeEvent(elem) {
- var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
- return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
-}
-
-var doesChangeEventBubble = false;
-if (ExecutionEnvironment.canUseDOM) {
- // See `handleChange` comment below
- doesChangeEventBubble = isEventSupported('change') && (!('documentMode' in document) || document.documentMode > 8);
-}
-
-function manualDispatchChangeEvent(nativeEvent) {
- var event = SyntheticEvent.getPooled(eventTypes.change, activeElementID, nativeEvent, getEventTarget(nativeEvent));
- EventPropagators.accumulateTwoPhaseDispatches(event);
-
- // If change and propertychange bubbled, we'd just bind to it like all the
- // other events and have it go through ReactBrowserEventEmitter. Since it
- // doesn't, we manually listen for the events and so we have to enqueue and
- // process the abstract event manually.
- //
- // Batching is necessary here in order to ensure that all event handlers run
- // before the next rerender (including event handlers attached to ancestor
- // elements instead of directly on the input). Without this, controlled
- // components don't work properly in conjunction with event bubbling because
- // the component is rerendered and the value reverted before all the event
- // handlers can run. See https://github.com/facebook/react/issues/708.
- ReactUpdates.batchedUpdates(runEventInBatch, event);
-}
-
-function runEventInBatch(event) {
- EventPluginHub.enqueueEvents(event);
- EventPluginHub.processEventQueue(false);
-}
-
-function startWatchingForChangeEventIE8(target, targetID) {
- activeElement = target;
- activeElementID = targetID;
- activeElement.attachEvent('onchange', manualDispatchChangeEvent);
-}
-
-function stopWatchingForChangeEventIE8() {
- if (!activeElement) {
- return;
- }
- activeElement.detachEvent('onchange', manualDispatchChangeEvent);
- activeElement = null;
- activeElementID = null;
-}
-
-function getTargetIDForChangeEvent(topLevelType, topLevelTarget, topLevelTargetID) {
- if (topLevelType === topLevelTypes.topChange) {
- return topLevelTargetID;
- }
-}
-function handleEventsForChangeEventIE8(topLevelType, topLevelTarget, topLevelTargetID) {
- if (topLevelType === topLevelTypes.topFocus) {
- // stopWatching() should be a noop here but we call it just in case we
- // missed a blur event somehow.
- stopWatchingForChangeEventIE8();
- startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID);
- } else if (topLevelType === topLevelTypes.topBlur) {
- stopWatchingForChangeEventIE8();
- }
-}
-
-/**
- * SECTION: handle `input` event
- */
-var isInputEventSupported = false;
-if (ExecutionEnvironment.canUseDOM) {
- // IE9 claims to support the input event but fails to trigger it when
- // deleting text, so we ignore its input events
- isInputEventSupported = isEventSupported('input') && (!('documentMode' in document) || document.documentMode > 9);
-}
-
-/**
- * (For old IE.) Replacement getter/setter for the `value` property that gets
- * set on the active element.
- */
-var newValueProp = {
- get: function () {
- return activeElementValueProp.get.call(this);
- },
- set: function (val) {
- // Cast to a string so we can do equality checks.
- activeElementValue = '' + val;
- activeElementValueProp.set.call(this, val);
- }
-};
-
-/**
- * (For old IE.) Starts tracking propertychange events on the passed-in element
- * and override the value property so that we can distinguish user events from
- * value changes in JS.
- */
-function startWatchingForValueChange(target, targetID) {
- activeElement = target;
- activeElementID = targetID;
- activeElementValue = target.value;
- activeElementValueProp = Object.getOwnPropertyDescriptor(target.constructor.prototype, 'value');
-
- // Not guarded in a canDefineProperty check: IE8 supports defineProperty only
- // on DOM elements
- Object.defineProperty(activeElement, 'value', newValueProp);
- activeElement.attachEvent('onpropertychange', handlePropertyChange);
-}
-
-/**
- * (For old IE.) Removes the event listeners from the currently-tracked element,
- * if any exists.
- */
-function stopWatchingForValueChange() {
- if (!activeElement) {
- return;
- }
-
- // delete restores the original property definition
- delete activeElement.value;
- activeElement.detachEvent('onpropertychange', handlePropertyChange);
-
- activeElement = null;
- activeElementID = null;
- activeElementValue = null;
- activeElementValueProp = null;
-}
-
-/**
- * (For old IE.) Handles a propertychange event, sending a `change` event if
- * the value of the active element has changed.
- */
-function handlePropertyChange(nativeEvent) {
- if (nativeEvent.propertyName !== 'value') {
- return;
- }
- var value = nativeEvent.srcElement.value;
- if (value === activeElementValue) {
- return;
- }
- activeElementValue = value;
-
- manualDispatchChangeEvent(nativeEvent);
-}
-
-/**
- * If a `change` event should be fired, returns the target's ID.
- */
-function getTargetIDForInputEvent(topLevelType, topLevelTarget, topLevelTargetID) {
- if (topLevelType === topLevelTypes.topInput) {
- // In modern browsers (i.e., not IE8 or IE9), the input event is exactly
- // what we want so fall through here and trigger an abstract event
- return topLevelTargetID;
- }
-}
-
-// For IE8 and IE9.
-function handleEventsForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) {
- if (topLevelType === topLevelTypes.topFocus) {
- // In IE8, we can capture almost all .value changes by adding a
- // propertychange handler and looking for events with propertyName
- // equal to 'value'
- // In IE9, propertychange fires for most input events but is buggy and
- // doesn't fire when text is deleted, but conveniently, selectionchange
- // appears to fire in all of the remaining cases so we catch those and
- // forward the event if the value has changed
- // In either case, we don't want to call the event handler if the value
- // is changed from JS so we redefine a setter for `.value` that updates
- // our activeElementValue variable, allowing us to ignore those changes
- //
- // stopWatching() should be a noop here but we call it just in case we
- // missed a blur event somehow.
- stopWatchingForValueChange();
- startWatchingForValueChange(topLevelTarget, topLevelTargetID);
- } else if (topLevelType === topLevelTypes.topBlur) {
- stopWatchingForValueChange();
- }
-}
-
-// For IE8 and IE9.
-function getTargetIDForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) {
- if (topLevelType === topLevelTypes.topSelectionChange || topLevelType === topLevelTypes.topKeyUp || topLevelType === topLevelTypes.topKeyDown) {
- // On the selectionchange event, the target is just document which isn't
- // helpful for us so just check activeElement instead.
- //
- // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
- // propertychange on the first input event after setting `value` from a
- // script and fires only keydown, keypress, keyup. Catching keyup usually
- // gets it and catching keydown lets us fire an event for the first
- // keystroke if user does a key repeat (it'll be a little delayed: right
- // before the second keystroke). Other input methods (e.g., paste) seem to
- // fire selectionchange normally.
- if (activeElement && activeElement.value !== activeElementValue) {
- activeElementValue = activeElement.value;
- return activeElementID;
- }
- }
-}
-
-/**
- * SECTION: handle `click` event
- */
-function shouldUseClickEvent(elem) {
- // Use the `click` event to detect changes to checkbox and radio inputs.
- // This approach works across all browsers, whereas `change` does not fire
- // until `blur` in IE8.
- return elem.nodeName && elem.nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
-}
-
-function getTargetIDForClickEvent(topLevelType, topLevelTarget, topLevelTargetID) {
- if (topLevelType === topLevelTypes.topClick) {
- return topLevelTargetID;
- }
-}
-
-/**
- * This plugin creates an `onChange` event that normalizes change events
- * across form elements. This event fires at a time when it's possible to
- * change the element's value without seeing a flicker.
- *
- * Supported elements are:
- * - input (see `isTextInputElement`)
- * - textarea
- * - select
- */
-var ChangeEventPlugin = {
-
- eventTypes: eventTypes,
-
- /**
- * @param {string} topLevelType Record from `EventConstants`.
- * @param {DOMEventTarget} topLevelTarget The listening component root node.
- * @param {string} topLevelTargetID ID of `topLevelTarget`.
- * @param {object} nativeEvent Native browser event.
- * @return {*} An accumulation of synthetic events.
- * @see {EventPluginHub.extractEvents}
- */
- extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
-
- var getTargetIDFunc, handleEventFunc;
- if (shouldUseChangeEvent(topLevelTarget)) {
- if (doesChangeEventBubble) {
- getTargetIDFunc = getTargetIDForChangeEvent;
- } else {
- handleEventFunc = handleEventsForChangeEventIE8;
- }
- } else if (isTextInputElement(topLevelTarget)) {
- if (isInputEventSupported) {
- getTargetIDFunc = getTargetIDForInputEvent;
- } else {
- getTargetIDFunc = getTargetIDForInputEventIE;
- handleEventFunc = handleEventsForInputEventIE;
- }
- } else if (shouldUseClickEvent(topLevelTarget)) {
- getTargetIDFunc = getTargetIDForClickEvent;
- }
-
- if (getTargetIDFunc) {
- var targetID = getTargetIDFunc(topLevelType, topLevelTarget, topLevelTargetID);
- if (targetID) {
- var event = SyntheticEvent.getPooled(eventTypes.change, targetID, nativeEvent, nativeEventTarget);
- event.type = 'change';
- EventPropagators.accumulateTwoPhaseDispatches(event);
- return event;
- }
- }
-
- if (handleEventFunc) {
- handleEventFunc(topLevelType, topLevelTarget, topLevelTargetID);
- }
- }
-
-};
-
-module.exports = ChangeEventPlugin;
-},{"./EventConstants":88,"./EventPluginHub":89,"./EventPropagators":92,"./ReactUpdates":157,"./SyntheticEvent":166,"./getEventTarget":188,"./isEventSupported":193,"./isTextInputElement":194,"fbjs/lib/ExecutionEnvironment":204,"fbjs/lib/keyOf":222}],81:[function(require,module,exports){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule ClientReactRootIndex
- * @typechecks
- */
-
-'use strict';
-
-var nextReactRootIndex = 0;
-
-var ClientReactRootIndex = {
- createReactRootIndex: function () {
- return nextReactRootIndex++;
- }
-};
-
-module.exports = ClientReactRootIndex;
-},{}],82:[function(require,module,exports){
-(function (process){
-/**
- * Copyright 2013-2015, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- * @providesModule DOMChildrenOperations
- * @typechecks static-only
- */
-
-'use strict';
-
-var Danger = require('./Danger');
-var ReactMultiChildUpdateTypes = require('./ReactMultiChildUpdateTypes');
-var ReactPerf = require('./ReactPerf');
-
-var setInnerHTML = require('./setInnerHTML');
-var setTextContent = require('./setTextContent');
-var invariant = require('fbjs/lib/invariant');
-
-/**
- * Inserts `childNode` as a child of `parentNode` at the `index`.
- *
- * @param {DOMElement} parentNode Parent node in which to insert.
- * @param {DOMElement} childNode Child node to insert.
- * @param {number} index Index at which to insert the child.
- * @internal
- */
-function insertChildAt(parentNode, childNode, index) {
- // By exploiting arrays returning `undefined` for an undefined index, we can
- // rely exclusively on `insertBefore(node, null)` instead of also using
- // `appendChild(node)`. However, using `undefined` is not allowed by all
- // browsers so we must replace it with `null`.
-
- // fix render order error in safari
- // IE8 will throw error when index out of list size.
- var beforeChild = index >= parentNode.childNodes.length ? null : parentNode.childNodes.item(index);
-
- parentNode.insertBefore(childNode, beforeChild);
-}
-
-/**
- * Operations for updating with DOM children.
- */
-var DOMChildrenOperations = {
-
- dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup,
-
- updateTextContent: setTextContent,
-
- /**
- * Updates a component's children by processing a series of updates. The
- * update configurations are each expected to have a `parentNode` property.
- *
- * @param {array