diff --git a/.eslintrc-hound.json b/.eslintrc-hound.json
index ed4a480274..bbb71918c2 100644
--- a/.eslintrc-hound.json
+++ b/.eslintrc-hound.json
@@ -9,6 +9,11 @@
"settings": {
"react": {
"pragma": "h"
+ },
+ "import/resolver": {
+ "webpack": {
+ "config": "webpack.config.js"
+ }
}
},
"globals": {
diff --git a/package.json b/package.json
index 27f981d0fc..244c494e55 100644
--- a/package.json
+++ b/package.json
@@ -66,14 +66,17 @@
"chart.js": "~2.7.2",
"chartjs-chart-timeline": "^0.2.1",
"es6-object-assign": "^1.1.0",
+ "eslint-import-resolver-webpack": "^0.10.0",
"fecha": "^2.3.3",
"home-assistant-js-websocket": "2.0.1",
"intl-messageformat": "^2.2.0",
"leaflet": "^1.0.2",
"marked": "^0.3.19",
"mdn-polyfills": "^5.5.0",
- "moment": "^2.20.0",
+ "moment": "^2.22.1",
"preact": "^8.2.6",
+ "preact-compat": "^3.18.0",
+ "react-big-calendar": "^0.19.1",
"unfetch": "^3.0.0",
"web-animations-js": "^2.3.1",
"xss": "^0.3.8"
diff --git a/polymer.json b/polymer.json
index 6ea0714b0f..89fad124a0 100644
--- a/polymer.json
+++ b/polymer.json
@@ -31,7 +31,8 @@
"**/ha-paper-slider.js",
"**/ha-iconset-svg.js",
"**/ha-script-editor.js",
- "**/ha-automation-editor.js"
+ "**/ha-automation-editor.js",
+ "**/ha-big-calendar.js"
]
},
"builds": [
diff --git a/src/layouts/partial-panel-resolver.js b/src/layouts/partial-panel-resolver.js
index 3fd673eef3..0a7c9afe4d 100644
--- a/src/layouts/partial-panel-resolver.js
+++ b/src/layouts/partial-panel-resolver.js
@@ -77,6 +77,10 @@ function ensureLoaded(panel) {
imported = import(/* webpackChunkName: "panel-shopping-list" */ '../panels/shopping-list/ha-panel-shopping-list.js');
break;
+ case 'calendar':
+ imported = import(/* webpackChunkName: "panel-calendar" */ '../panels/calendar/ha-panel-calendar.js');
+ break;
+
default:
imported = null;
}
diff --git a/src/panels/calendar/ha-big-calendar.js b/src/panels/calendar/ha-big-calendar.js
new file mode 100644
index 0000000000..7aa3d8e8f8
--- /dev/null
+++ b/src/panels/calendar/ha-big-calendar.js
@@ -0,0 +1,83 @@
+import { html } from '@polymer/polymer/lib/utils/html-tag.js';
+import { PolymerElement } from '@polymer/polymer/polymer-element.js';
+
+/* eslint-disable */
+import { render } from 'react-dom';
+import React from 'react';
+/* eslint-enable */
+import BigCalendar from 'react-big-calendar';
+import moment from 'moment';
+import EventsMixin from '../../mixins/events-mixin.js';
+
+import '../../resources/ha-style.js';
+
+BigCalendar.setLocalizer(BigCalendar.momentLocalizer(moment));
+
+const DEFAULT_VIEW = 'month';
+
+class HaBigCalendar extends EventsMixin(PolymerElement) {
+ static get template() {
+ return html`
+
+
+
`;
+ }
+
+ update(events) {
+ const allViews = BigCalendar.Views.values;
+
+ const BCElement = React.createElement(
+ BigCalendar,
+ { events: events,
+ views: allViews,
+ popup: true,
+ onNavigate: (date, viewName) => this.fire('navigate', { date, viewName }),
+ onView: viewName => this.fire('view', { viewName }),
+ eventPropGetter: this.setEventStyle,
+ defaultView: this.defaultView,
+ defaultDate: new Date(),
+ }
+ );
+ render(BCElement, this.$.root);
+ }
+
+ setEventStyle(event) {
+ // https://stackoverflow.com/questions/34587067/change-color-of-react-big-calendar-events
+ const newStyle = {};
+ if (event.color) {
+ newStyle.backgroundColor = event.color;
+ }
+ return { style: newStyle };
+ }
+
+ static get properties() {
+ return {
+ dateUpdated: Object,
+
+ viewUpdated: Object,
+
+ defaultView: {
+ type: String,
+ value: DEFAULT_VIEW
+ },
+
+ defaultDate: {
+ type: Object,
+ value: new Date()
+ },
+
+ events: {
+ type: Array,
+ observer: 'update',
+ },
+
+ };
+ }
+}
+
+customElements.define('ha-big-calendar', HaBigCalendar);
diff --git a/src/panels/calendar/ha-panel-calendar.js b/src/panels/calendar/ha-panel-calendar.js
new file mode 100644
index 0000000000..36a8677b6d
--- /dev/null
+++ b/src/panels/calendar/ha-panel-calendar.js
@@ -0,0 +1,229 @@
+import '@polymer/app-layout/app-header-layout/app-header-layout.js';
+import '@polymer/app-layout/app-header/app-header.js';
+import '@polymer/app-layout/app-toolbar/app-toolbar.js';
+import '@polymer/paper-listbox/paper-listbox.js';
+import '@polymer/paper-card/paper-card.js';
+import '@polymer/paper-checkbox/paper-checkbox.js';
+import '@polymer/paper-item/paper-item.js';
+import { html } from '@polymer/polymer/lib/utils/html-tag.js';
+import { PolymerElement } from '@polymer/polymer/polymer-element.js';
+import moment from 'moment';
+import dates from 'react-big-calendar/lib/utils/dates';
+
+import '../../components/ha-menu-button.js';
+import '../../resources/ha-style.js';
+import './ha-big-calendar.js';
+
+import LocalizeMixin from '../../mixins/localize-mixin.js';
+
+const DEFAULT_VIEW = 'month';
+
+/*
+ * @appliesMixin LocalizeMixin
+ */
+class HaPanelCalendar extends LocalizeMixin(PolymerElement) {
+ static get template() {
+ return html`
+
+
+
+
+
+
+ [[localize('panel.calendar')]]
+
+
+
+
+
+
+
+
+
+
+
+
+ [[item.name]]
+
+
+
+
+
+
+
+
+
+
+ `;
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._fetchData = this._fetchData.bind(this);
+ // TODO implement calendar_updated event
+ // this.hass.connection.subscribeEvents(this._fetchData, 'calendar_updated')
+ // .then(function (unsub) { this._unsubEvents = unsub; }.bind(this));
+ this._fetchCalendar();
+ }
+
+ _fetchCalendar() {
+ // Fetch calendar list
+ this.hass.callApi('get', 'calendars')
+ .then((result) => {
+ this.calendars = result;
+ });
+ }
+
+ _fetchData() {
+ // TODO: Improve me
+ var start = dates.firstVisibleDay(this.currentDate).toISOString();
+ var end = dates.lastVisibleDay(this.currentDate).toISOString();
+ // var dates = this._getDateRange();
+ // var start = dates[0];
+ // var end = dates[1];
+ // Fetch calendar list
+ this._fetchCalendar();
+ // Fetch events for selected calendar
+ const params = encodeURI(`?start=${start}&end=${end}`);
+ const calls = this.selectedCalendars.map(cal => this.hass.callApi('get', `calendar/${cal}${params}`));
+ Promise.all(calls).then((results) => {
+ var tmpEvents = [];
+
+ results.forEach((res) => {
+ res.forEach((ev) => {
+ ev.start = new Date(ev.start);
+ if (ev.end) {
+ ev.end = new Date(ev.end);
+ } else {
+ ev.end = null;
+ }
+ tmpEvents.push(ev);
+ });
+ });
+ this.events = tmpEvents;
+ });
+ }
+
+ _getDateRange() {
+ // TODO: Delete me
+ var startDate;
+ var endDate;
+ if (this.currentView === 'day') {
+ startDate = moment(this.currentDate).startOf('day');
+ endDate = moment(this.currentDate).startOf('day');
+ } else if (this.currentView === 'week') {
+ startDate = moment(this.currentDate).startOf('isoWeek');
+ endDate = moment(this.currentDate).endOf('isoWeek');
+ } else if (this.currentView === 'month') {
+ startDate = moment(this.currentDate).startOf('month').subtract(7, 'days');
+ endDate = moment(this.currentDate).endOf('month').add(7, 'days');
+ } else if (this.currentView === 'agenda') {
+ startDate = moment(this.currentDate).startOf('day');
+ endDate = moment(this.currentDate).endOf('day').add(1, 'month');
+ }
+ return [startDate.toISOString(), endDate.toISOString()];
+ }
+
+ handleView(ev) {
+ // Calendar view changed
+ this.currentView = ev.detail.viewName;
+ this._fetchData();
+ }
+
+ handleNavigate(ev) {
+ // Calendar date range changed
+ this.currentDate = ev.detail.date;
+ this.currentView = ev.detail.viewName;
+ this._fetchData();
+ }
+
+ checkAll(ev) {
+ // Check all calendars
+ if (ev.target.checked) {
+ const selectedIndex = this.selectedCalendars
+ .map(x => this.calendars.map(y => y.entity_id).indexOf(x));
+ for (let i = 0; i < this.calendars.length; i++) {
+ if (selectedIndex.indexOf(i) === -1) {
+ this.$.calendar_list.selectIndex(i);
+ }
+ }
+ }
+ }
+
+ static get properties() {
+ return {
+ hass: Object,
+
+ currentView: {
+ type: String,
+ value: DEFAULT_VIEW
+ },
+
+ currentDate: {
+ type: Object,
+ value: new Date()
+ },
+
+ events: {
+ type: Array,
+ value: [],
+ },
+
+ calendars: {
+ type: Array,
+ value: [],
+ },
+
+ selectedCalendars: {
+ type: Array,
+ value: [],
+ },
+
+ narrow: {
+ type: Boolean,
+ value: false,
+ },
+
+ showMenu: {
+ type: Boolean,
+ value: false,
+ },
+
+ };
+ }
+}
+
+customElements.define('ha-panel-calendar', HaPanelCalendar);
diff --git a/webpack.config.js b/webpack.config.js
index c54b48740c..361ad5b35d 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -70,6 +70,7 @@ function createConfig(isProdBuild, latestBuild) {
copyPluginOpts.push({ from: 'node_modules/@polymer/font-roboto-local/fonts', to: 'fonts' });
copyPluginOpts.push('node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js')
copyPluginOpts.push('node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js.map')
+ copyPluginOpts.push({ from: 'node_modules/react-big-calendar/lib/css/react-big-calendar.css', to: `panels/calendar/` });
copyPluginOpts.push({ from: 'node_modules/leaflet/dist/leaflet.css', to: `images/leaflet/` });
copyPluginOpts.push({ from: 'node_modules/leaflet/dist/images', to: `images/leaflet/` });
entry['hass-icons'] = './src/entrypoints/hass-icons.js';
@@ -175,6 +176,16 @@ function createConfig(isProdBuild, latestBuild) {
chunkFilename: chunkFilename,
path: path.resolve(__dirname, buildPath),
publicPath,
+ },
+ resolve: {
+ alias: {
+ 'react': 'preact-compat',
+ 'react-dom': 'preact-compat',
+ // Not necessary unless you consume a module using `createClass`
+ 'create-react-class': 'preact-compat/lib/create-react-class',
+ // Not necessary unless you consume a module requiring `react-dom-factories`
+ 'react-dom-factories': 'preact-compat/lib/react-dom-factories'
+ }
}
}
}
diff --git a/yarn.lock b/yarn.lock
index 0336f2b69e..da54c9757e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2188,6 +2188,10 @@ array-find-index@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+array-find@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8"
+
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
@@ -3871,6 +3875,10 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
+classnames@^2.1.3, classnames@^2.2.5:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
+
clean-css@3.4.x:
version "3.4.28"
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff"
@@ -4462,6 +4470,10 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
+date-arithmetic@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/date-arithmetic/-/date-arithmetic-3.1.0.tgz#1fcd03dbd504b9dbee2b9078c85a5f1c7d3cc2d3"
+
date-fns@^1.27.2:
version "1.29.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
@@ -4734,6 +4746,10 @@ doctrine@^2.0.0, doctrine@^2.0.2, doctrine@^2.1.0:
dependencies:
esutils "^2.0.2"
+"dom-helpers@^2.3.0 || ^3.0.0", dom-helpers@^3.2.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
+
dom-serializer@0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@@ -4960,6 +4976,14 @@ enhanced-resolve@^4.0.0:
memory-fs "^0.4.0"
tapable "^1.0.0"
+enhanced-resolve@~0.9.0:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.2.0"
+ tapable "^0.1.8"
+
entities@^1.1.1, entities@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
@@ -5060,6 +5084,21 @@ eslint-import-resolver-node@^0.3.1:
debug "^2.6.8"
resolve "^1.2.0"
+eslint-import-resolver-webpack@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.10.0.tgz#b6f2468dc3e8b4ea076e5d75bece8da932789b07"
+ dependencies:
+ array-find "^1.0.0"
+ debug "^2.6.8"
+ enhanced-resolve "~0.9.0"
+ find-root "^1.1.0"
+ has "^1.0.1"
+ interpret "^1.0.0"
+ lodash "^4.17.4"
+ node-libs-browser "^1.0.0 || ^2.0.0"
+ resolve "^1.4.0"
+ semver "^5.3.0"
+
eslint-module-utils@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449"
@@ -5629,6 +5668,10 @@ find-replace@^2.0.1:
array-back "^2.0.0"
test-value "^3.0.0"
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
+
find-up@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -6895,6 +6938,12 @@ ignore@^3.3.3, ignore@^3.3.5:
version "3.3.8"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b"
+immutability-helper@^2.1.2:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-2.7.0.tgz#4ea9916cc8f45142ec3e3f0fce75fa5d66fa1b38"
+ dependencies:
+ invariant "^2.2.0"
+
import-lazy@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
@@ -7024,7 +7073,7 @@ into-stream@^3.1.0:
from2 "^2.1.1"
p-is-promise "^1.1.0"
-invariant@^2.2.0, invariant@^2.2.2:
+invariant@^2.1.0, invariant@^2.2.0, invariant@^2.2.2:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
dependencies:
@@ -8336,6 +8385,10 @@ mem@^1.1.0:
dependencies:
mimic-fn "^1.0.0"
+memory-fs@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290"
+
memory-fs@^0.4.0, memory-fs@~0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@@ -8596,7 +8649,7 @@ mocha@^5.0.0:
mkdirp "0.5.1"
supports-color "4.4.0"
-moment@^2.10.2, moment@^2.20.0, moment@^2.22.0:
+moment@^2.10.2, moment@^2.22.0, moment@^2.22.1:
version "2.22.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad"
@@ -8772,7 +8825,7 @@ node-fetch@^1.0.1:
encoding "^0.1.11"
is-stream "^1.0.1"
-node-libs-browser@^2.0.0:
+"node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
dependencies:
@@ -9816,6 +9869,26 @@ posix-character-classes@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+preact-compat@^3.18.0:
+ version "3.18.0"
+ resolved "https://registry.yarnpkg.com/preact-compat/-/preact-compat-3.18.0.tgz#ca430cc1f67193fb9feaf7c510832957b2ebe701"
+ dependencies:
+ immutability-helper "^2.1.2"
+ preact-render-to-string "^3.6.0"
+ preact-transition-group "^1.1.0"
+ prop-types "^15.5.8"
+ standalone-react-addons-pure-render-mixin "^0.1.1"
+
+preact-render-to-string@^3.6.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-3.7.0.tgz#7db4177454bc01395e0d01d6ac07bc5e838e31ee"
+ dependencies:
+ pretty-format "^3.5.1"
+
+preact-transition-group@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/preact-transition-group/-/preact-transition-group-1.1.1.tgz#f0a49327ea515ece34ea2be864c4a7d29e5d6e10"
+
preact@^8.2.6:
version "8.2.7"
resolved "https://registry.yarnpkg.com/preact/-/preact-8.2.7.tgz#316249fb678cd5e93e7cee63cea7bfb62dbd6814"
@@ -9844,6 +9917,10 @@ pretty-bytes@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
+pretty-format@^3.5.1:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385"
+
pretty-hrtime@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
@@ -9901,6 +9978,21 @@ promisify-node@^0.4.0:
nodegit-promise "~4.0.0"
object-assign "^4.0.1"
+prop-types-extra@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.0.tgz#32609910ea2dcf190366bacd3490d5a6412a605f"
+ dependencies:
+ react-is "^16.3.2"
+ warning "^3.0.0"
+
+prop-types@^15.5.10, prop-types@^15.5.8:
+ version "15.6.1"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
+ dependencies:
+ fbjs "^0.8.16"
+ loose-envify "^1.3.1"
+ object-assign "^4.1.1"
+
prop-types@^15.6.0:
version "15.6.0"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
@@ -10058,6 +10150,41 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
+react-big-calendar@^0.19.1:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/react-big-calendar/-/react-big-calendar-0.19.1.tgz#ace5a24009bef21c09378f162c2234f9b34a7975"
+ dependencies:
+ classnames "^2.1.3"
+ date-arithmetic "^3.0.0"
+ dom-helpers "^2.3.0 || ^3.0.0"
+ invariant "^2.1.0"
+ lodash "^4.17.4"
+ prop-types "^15.5.8"
+ react-overlays "^0.7.0"
+ react-prop-types "^0.4.0"
+ uncontrollable "^4.0.0"
+ warning "^2.0.0"
+
+react-is@^16.3.2:
+ version "16.3.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22"
+
+react-overlays@^0.7.0:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.7.4.tgz#ef2ec652c3444ab8aa014262b18f662068e56d5c"
+ dependencies:
+ classnames "^2.2.5"
+ dom-helpers "^3.2.1"
+ prop-types "^15.5.10"
+ prop-types-extra "^1.0.1"
+ warning "^3.0.0"
+
+react-prop-types@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/react-prop-types/-/react-prop-types-0.4.0.tgz#f99b0bfb4006929c9af2051e7c1414a5c75b93d0"
+ dependencies:
+ warning "^3.0.0"
+
read-all-stream@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa"
@@ -11259,6 +11386,10 @@ stacky@^1.3.1:
chalk "^1.1.1"
lodash "^3.0.0"
+standalone-react-addons-pure-render-mixin@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/standalone-react-addons-pure-render-mixin/-/standalone-react-addons-pure-render-mixin-0.1.1.tgz#3c7409f4c79c40de9ac72c616cf679a994f37551"
+
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -11537,6 +11668,10 @@ table@4.0.2:
slice-ansi "1.0.0"
string-width "^2.1.1"
+tapable@^0.1.8:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4"
+
tapable@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
@@ -11935,6 +12070,12 @@ unc-path-regex@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
+uncontrollable@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-4.1.0.tgz#e0358291252e1865222d90939b19f2f49f81c1a9"
+ dependencies:
+ invariant "^2.1.0"
+
underscore.string@3.3.4:
version "3.3.4"
resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db"
@@ -12328,6 +12469,18 @@ walkdir@^0.0.11:
version "0.0.11"
resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532"
+warning@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/warning/-/warning-2.1.0.tgz#21220d9c63afc77a8c92111e011af705ce0c6901"
+ dependencies:
+ loose-envify "^1.0.0"
+
+warning@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
+ dependencies:
+ loose-envify "^1.0.0"
+
watchpack@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"