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')]]
+
+
+ +
+
+ +
+ All calendars +
+ + + +
+
+
+ + +
+
+
`; + } + + 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"