diff --git a/.eslintrc b/.eslintrc index bf875e99c..e761f5d6a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -5,3 +5,9 @@ extends: rules: global-require: off + no-unused-vars: [2, { + vars: all, + args: after-used, + varsIgnorePattern: ^_, + argsIgnorePattern: ^_, + }] diff --git a/examples/App.js b/examples/App.js index 24f6badff..b6dee8809 100644 --- a/examples/App.js +++ b/examples/App.js @@ -7,8 +7,6 @@ import { render } from 'react-dom' import localizer from 'react-big-calendar/lib/localizers/globalize' import globalize from 'globalize' -localizer(globalize) - import 'bootstrap/dist/css/bootstrap.min.css' import 'font-awesome/css/font-awesome.min.css' @@ -25,13 +23,40 @@ import Resource from './demos/resource' import DndResource from './demos/dndresource' import Timeslots from './demos/timeslots' import Dnd from './demos/dnd' +import Dropdown from 'react-bootstrap/lib/Dropdown' +import MenuItem from 'react-bootstrap/lib/MenuItem' + +const globalizeLocalizer = localizer(globalize) let demoRoot = 'https://github.com/intljusticemission/react-big-calendar/tree/master/examples/demos' +const EXAMPLES = { + basic: 'Basic Calendar', + selectable: 'Create events', + cultures: 'Localization', + popup: 'Show more via a popup', + timeslots: 'Custom Time Grids', + rendering: 'Customized Component Rendering', + customView: 'Custom Calendar Views', + resource: 'Resource Scheduling', + dnd: 'Addon: Drag and drop', +} + class Example extends React.Component { - state = { selected: 'basic' } + constructor(...args) { + super(...args) + const hash = (window.location.hash || '').slice(1) + + this.state = { + selected: EXAMPLES[hash] ? hash : 'basic', + } + } + + select = selected => { + this.setState({ selected }) + } render() { let selected = this.state.selected let Current = { @@ -74,62 +99,8 @@ class Example extends React.Component {
-
- -
-
-
+
+
@@ -137,7 +108,21 @@ class Example extends React.Component {
- + + + {EXAMPLES[selected]} + + + {Object.entries(EXAMPLES).map(([key, title]) => ( + this.select(key)}> + {title} + + ))} + + +
+
+
@@ -149,11 +134,8 @@ class Example extends React.Component {
) } - - select = (selected, e) => { - e.preventDefault() - this.setState({ selected }) - } } -render(, document.getElementById('app')) +document.addEventListener('DOMContentLoaded', () => { + render(, document.getElementById('app')) +}) diff --git a/examples/Intro.md b/examples/Intro.md index fc339ef82..2c9af0303 100644 --- a/examples/Intro.md +++ b/examples/Intro.md @@ -22,11 +22,12 @@ import moment from 'moment' // Setup the localizer by providing the moment (or globalize) Object // to the correct localizer. -BigCalendar.momentLocalizer(moment) // or globalizeLocalizer +const localizer = BigCalendar.momentLocalizer(moment) // or globalizeLocalizer const MyCalendar = props => (
BigCalendar.Views[k]) -let Basic = () => ( +let Basic = ({ localizer }) => ( ) diff --git a/examples/demos/cultures.js b/examples/demos/cultures.js index 360dbec66..f54a7935b 100644 --- a/examples/demos/cultures.js +++ b/examples/demos/cultures.js @@ -11,12 +11,13 @@ class Cultures extends React.Component { state = { culture: 'fr' } render() { + const { localizer } = this.props let cultures = ['en', 'en-GB', 'es', 'fr', 'ar-AE'] let rtl = this.state.culture === 'ar-AE' return ( -

+
{' '} -

+
) diff --git a/examples/demos/customHeader.js b/examples/demos/customHeader.js index d3ab4db12..667392d19 100644 --- a/examples/demos/customHeader.js +++ b/examples/demos/customHeader.js @@ -12,9 +12,10 @@ let MyCustomHeader = ({ label }) => (
) -let CustomHeader = () => ( +let CustomHeader = ({ localizer }) => ( { return `My awesome week: ${date.toLocaleDateString()}` } -let CustomView = () => ( +let CustomView = ({ localizer }) => ( { + resizeEvent = ({ event, start, end }) => { const { events } = this.state const nextEvents = events.map(existingEvent => { @@ -49,38 +55,39 @@ class Dnd extends React.Component { events: nextEvents, }) - alert(`${event.title} was resized to ${start}-${end}`) + //alert(`${event.title} was resized to ${start}-${end}`) } newEvent(event) { - let idList = this.state.events.map((a) => a.id); - let newId = Math.max(...idList) + 1; - let hour = { - id: newId, - title: 'New Event', - allDay: event.slots.length == 1, - start: event.start, - end: event.end, - } - this.setState({ - events: this.state.events.concat([hour]) - }); + // let idList = this.state.events.map(a => a.id) + // let newId = Math.max(...idList) + 1 + // let hour = { + // id: newId, + // title: 'New Event', + // allDay: event.slots.length == 1, + // start: event.start, + // end: event.end, + // } + // this.setState({ + // events: this.state.events.concat([hour]), + // }) } render() { return ( ) } } -export default DragDropContext(HTML5Backend)(Dnd) +export default Dnd diff --git a/examples/demos/dndresource.js b/examples/demos/dndresource.js index fae4895f5..17ae2114f 100644 --- a/examples/demos/dndresource.js +++ b/examples/demos/dndresource.js @@ -1,6 +1,4 @@ import React from 'react' -import HTML5Backend from 'react-dnd-html5-backend' -import { DragDropContext } from 'react-dnd' import BigCalendar from 'react-big-calendar' import withDragAndDrop from 'react-big-calendar/lib/addons/dragAndDrop' @@ -8,7 +6,6 @@ import 'react-big-calendar/lib/addons/dragAndDrop/styles.less' const DragAndDropCalendar = withDragAndDrop(BigCalendar) -let allViews = Object.keys(BigCalendar.Views).map(k => BigCalendar.Views[k]) const events = [ { id: 0, @@ -57,16 +54,23 @@ class Dnd extends React.Component { this.moveEvent = this.moveEvent.bind(this) } - moveEvent({ event, start, end, resourceId }) { - console.log('moveEvent.args=', { event, start, end, resourceId }) + moveEvent({ event, start, end, resourceId, isAllDay: droppedOnAllDaySlot }) { const { events } = this.state const idx = events.indexOf(event) - const updatedEvent = { ...event, start, end, resourceId } - console.log('events', events) + let allDay = event.allDay + + if (!event.allDay && droppedOnAllDaySlot) { + allDay = true + } else if (event.allDay && !droppedOnAllDaySlot) { + allDay = false + } + + const updatedEvent = { ...event, start, end, resourceId, allDay } + const nextEvents = [...events] nextEvents.splice(idx, 1, updatedEvent) - console.log('nextEvents', nextEvents) + this.setState({ events: nextEvents, }) @@ -90,6 +94,7 @@ class Dnd extends React.Component { return ( ( +let Popup = ({ localizer }) => (

Click the "+x more" link on any calendar day that cannot fit all the days events to see an inline popup of all the events.

- +
) diff --git a/examples/demos/rendering.js b/examples/demos/rendering.js index a257f42df..b694f8b2d 100644 --- a/examples/demos/rendering.js +++ b/examples/demos/rendering.js @@ -39,9 +39,10 @@ const customSlotPropGetter = date => { else return {} } -let Rendering = () => ( +let Rendering = ({ localizer }) => ( ( +let Resource = ({ localizer }) => ( ( +let Selectable = ({ localizer }) => (

Click an event to see more info, or drag the mouse over the calendar to @@ -11,6 +11,7 @@ let Selectable = () => ( ( +let Timeslots = ({ localizer }) => ( diff --git a/examples/events.js b/examples/events.js index 9709c7997..dbf1fa702 100644 --- a/examples/events.js +++ b/examples/events.js @@ -31,7 +31,7 @@ export default [ id: 4, title: 'Some Event', start: new Date(2015, 3, 9, 0, 0, 0), - end: new Date(2015, 3, 9, 0, 0, 0), + end: new Date(2015, 3, 10, 0, 0, 0), }, { id: 5, @@ -85,6 +85,12 @@ export default [ start: new Date(2015, 3, 17, 19, 30, 0), end: new Date(2015, 3, 18, 2, 0, 0), }, + { + id: 12.5, + title: 'Late Same Night Event', + start: new Date(2015, 3, 17, 19, 30, 0), + end: new Date(2015, 3, 17, 23, 30, 0), + }, { id: 13, title: 'Multi-day Event', diff --git a/examples/styles.less b/examples/styles.less index 84e3af3d4..459a6238e 100644 --- a/examples/styles.less +++ b/examples/styles.less @@ -2,6 +2,7 @@ @import "~bootstrap/less/variables.less"; @blue: #3174ad; +@pink: #ad3173; html { font-size: 10px; @@ -9,12 +10,26 @@ html { body { font-size: 16px; + font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color"; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } h4 { margin-top: 20px; } +a { + transform: all 200ms; + + &, + &:hover, + &:focus, + &:active { + text-decoration: none; + } +} + .jumbotron { background-color: @blue; color: white; @@ -48,9 +63,9 @@ h4 { .example { font-size: 14px; padding: 0 40px; - min-height: ~"calc(100vh - 20px)"; + min-height: ~"calc(100vh - 100px)"; min-height: max-content; - height: ~"calc(100vh - 20px)"; + height: ~"calc(100vh - 100px)"; width: 100%; margin: auto; @@ -112,11 +127,45 @@ h4 > a > code { padding: 0; } -.view-source { - font-size: 90%; - float: right; + +.examples--header { + padding: 0 40px; + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 15px; - margin-left: auto; +} + +.examples--dropdown { + +} + +.dropdown--toggle { + font-size: 18px; + font-weight: 600; + border-radius: 3px; + transition: all 200ms; + + &, + &:hover, + &:focus, + &:active { + color: @pink; + text-decoration: none; + } + + &:hover, + &:focus, + &:active { + color: darken(@pink, 5%); + border: 1px solid @pink; + text-decoration: none; + } +} + +.examples--view-source { + font-size: 90%; } .callout { diff --git a/package.json b/package.json index cdc4d57df..b6b555328 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,8 @@ "react-dom": "^15.3.0 || ^16.0.0" }, "devDependencies": { - "@storybook/react": "3.2.16", + "@storybook/addon-actions": "^3.4.8", + "@storybook/react": "3.4.8", "babel-cli": "^6.7.5", "babel-core": "^6.7.6", "babel-eslint": "^6.0.2", @@ -85,12 +86,10 @@ "moment": "^2.17.1", "mt-changelog": "^0.6.1", "prettier": "^1.9.1", - "react": "^16.2.0", - "react-bootstrap": "^0.28.0", - "react-dnd": "^2.1.4", - "react-dnd-html5-backend": "^2.1.2", + "react": "^16.4.1", + "react-bootstrap": "^0.32.1", "react-docgen": "^2.14.1", - "react-dom": "^16.2.0", + "react-dom": "^16.4.1", "release-script": "^1.0.0", "rimraf": "^2.4.2", "webpack": "^3.10.0", @@ -103,6 +102,7 @@ "dom-helpers": "^2.3.0 || ^3.0.0", "invariant": "^2.1.0", "lodash": "^4.17.4", + "memoize-one": "^4.0.0", "prop-types": "^15.5.8", "react-overlays": "^0.7.0", "react-prop-types": "^0.4.0", diff --git a/src/Agenda.js b/src/Agenda.js index 24b16360b..9a41df6da 100644 --- a/src/Agenda.js +++ b/src/Agenda.js @@ -4,12 +4,8 @@ import classes from 'dom-helpers/class' import getWidth from 'dom-helpers/query/width' import scrollbarSize from 'dom-helpers/util/scrollbarSize' -import localizer from './localizer' -import message from './utils/messages' import dates from './utils/dates' import { navigate } from './utils/constants' -import { accessor as get } from './utils/accessors' -import { accessor, dateFormat, dateRangeFormat } from './utils/propTypes' import { inRange } from './utils/eventLevels' import { isSelected } from './utils/selection' @@ -18,24 +14,13 @@ class Agenda extends React.Component { events: PropTypes.array, date: PropTypes.instanceOf(Date), length: PropTypes.number.isRequired, - titleAccessor: accessor.isRequired, - tooltipAccessor: accessor.isRequired, - allDayAccessor: accessor.isRequired, - startAccessor: accessor.isRequired, - endAccessor: accessor.isRequired, - eventPropGetter: PropTypes.func, - selected: PropTypes.object, - agendaDateFormat: dateFormat, - agendaTimeFormat: dateFormat, - agendaTimeRangeFormat: dateRangeFormat, - culture: PropTypes.string, + selected: PropTypes.object, + accessors: PropTypes.object.isRequired, components: PropTypes.object.isRequired, - messages: PropTypes.shape({ - date: PropTypes.string, - time: PropTypes.string, - }), + getters: PropTypes.object.isRequired, + localizer: PropTypes.object.isRequired, } static defaultProps = { @@ -51,15 +36,15 @@ class Agenda extends React.Component { } render() { - let { length, date, events, startAccessor } = this.props - let messages = message(this.props.messages) + let { length, date, events, accessors, localizer } = this.props + let { messages } = localizer let end = dates.add(date, length, 'day') let range = dates.range(date, end, 'day') - events = events.filter(event => inRange(event, date, end, this.props)) + events = events.filter(event => inRange(event, date, end, accessors)) - events.sort((a, b) => +get(a, startAccessor) - +get(b, startAccessor)) + events.sort((a, b) => +accessors.start(a) - +accessors.start(b)) return (
@@ -89,39 +74,35 @@ class Agenda extends React.Component { renderDay = (day, events, dayKey) => { let { - culture, - components, - titleAccessor, - agendaDateFormat, - eventPropGetter, - startAccessor, - endAccessor, selected, + getters, + accessors, + localizer, + components: { event: Event, date: AgendaDate }, } = this.props - let EventComponent = components.event - let DateComponent = components.date - events = events.filter(e => - inRange(e, dates.startOf(day, 'day'), dates.endOf(day, 'day'), this.props) + inRange(e, dates.startOf(day, 'day'), dates.endOf(day, 'day'), accessors) ) return events.map((event, idx) => { - const { className, style } = eventPropGetter - ? eventPropGetter( - event, - get(event, startAccessor), - get(event, endAccessor), - isSelected(event, selected) - ) - : {} - let dateLabel = - idx === 0 && localizer.format(day, agendaDateFormat, culture) + let title = accessors.title(event) + let end = accessors.end(event) + let start = accessors.start(event) + + const userProps = getters.eventProp( + event, + start, + end, + isSelected(event, selected) + ) + + let dateLabel = idx === 0 && localizer.format(day, 'agendaDateFormat') let first = idx === 0 ? ( - {DateComponent ? ( - + {AgendaDate ? ( + ) : ( dateLabel )} @@ -130,20 +111,18 @@ class Agenda extends React.Component { false ) - let title = get(event, titleAccessor) - return ( - + {first} {this.timeRangeLabel(day, event)} - {EventComponent ? ( - - ) : ( - title - )} + {Event ? : title} ) @@ -151,33 +130,22 @@ class Agenda extends React.Component { } timeRangeLabel = (day, event) => { - let { - endAccessor, - startAccessor, - allDayAccessor, - culture, - messages, - components, - } = this.props + let { accessors, localizer, components } = this.props let labelClass = '', TimeComponent = components.time, - label = message(messages).allDay + label = localizer.messages.allDay - let start = get(event, startAccessor) - let end = get(event, endAccessor) + let end = accessors.end(event) + let start = accessors.start(event) - if (!get(event, allDayAccessor)) { + if (!accessors.allDay(event)) { if (dates.eq(start, end, 'day')) { - label = localizer.format( - { start, end }, - this.props.agendaTimeRangeFormat, - culture - ) + label = localizer.format({ start, end }, 'agendaTimeRangeFormat') } else if (dates.eq(day, start, 'day')) { - label = localizer.format(start, this.props.agendaTimeFormat, culture) + label = localizer.format(start, 'agendaTimeFormat') } else if (dates.eq(day, end, 'day')) { - label = localizer.format(end, this.props.agendaTimeFormat, culture) + label = localizer.format(end, 'agendaTimeFormat') } } @@ -242,12 +210,9 @@ Agenda.navigate = (date, action, { length = Agenda.defaultProps.length }) => { } } -Agenda.title = ( - start, - { length = Agenda.defaultProps.length, formats, culture } -) => { +Agenda.title = (start, { length = Agenda.defaultProps.length, localizer }) => { let end = dates.add(start, length, 'day') - return localizer.format({ start, end }, formats.agendaHeaderFormat, culture) + return localizer.format({ start, end }, 'agendaHeaderFormat') } export default Agenda diff --git a/src/BackgroundCells.js b/src/BackgroundCells.js index bd808c9f0..ecc6af5e2 100644 --- a/src/BackgroundCells.js +++ b/src/BackgroundCells.js @@ -5,20 +5,17 @@ import cn from 'classnames' import dates from './utils/dates' import { notify } from './utils/helpers' -import { elementType } from './utils/propTypes' -import { - dateCellSelection, - slotWidth, - getCellAtX, - pointInBox, -} from './utils/selection' +import { dateCellSelection, getSlotAtX, pointInBox } from './utils/selection' import Selection, { getBoundsForNode, isEvent } from './Selection' class BackgroundCells extends React.Component { static propTypes = { date: PropTypes.instanceOf(Date), getNow: PropTypes.func.isRequired, - cellWrapperComponent: elementType, + + getters: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + container: PropTypes.func, dayPropGetter: PropTypes.func, selectable: PropTypes.oneOf([true, false, 'ignoreEvents']), @@ -59,10 +56,10 @@ class BackgroundCells extends React.Component { render() { let { range, - cellWrapperComponent: Wrapper, - dayPropGetter, - date: currentDate, getNow, + getters, + date: currentDate, + components: { dateCellWrapper: Wrapper }, } = this.props let { selecting, startIdx, endIdx } = this.state let current = getNow() @@ -71,8 +68,7 @@ class BackgroundCells extends React.Component {
{range.map((date, index) => { let selected = selecting && index >= startIdx && index <= endIdx - const { className, style } = - (dayPropGetter && dayPropGetter(date)) || {} + const { className, style } = getters.dayProp(date) return ( @@ -107,14 +103,7 @@ class BackgroundCells extends React.Component { let { range, rtl } = this.props if (pointInBox(rowBox, point)) { - let width = slotWidth(getBoundsForNode(node), range.length) - let currentCell = getCellAtX( - rowBox, - point.x, - width, - rtl, - range.length - ) + let currentCell = getSlotAtX(rowBox, point.x, rtl, range.length) this._selectSlot({ startIdx: currentCell, diff --git a/src/BackgroundWrapper.js b/src/BackgroundWrapper.js index 5ca568376..1bc6e67f7 100644 --- a/src/BackgroundWrapper.js +++ b/src/BackgroundWrapper.js @@ -1,16 +1,3 @@ -import React from 'react' -import PropTypes from 'prop-types' +import NoopWrapper from './NoopWrapper' -class BackgroundWrapper extends React.Component { - render() { - return this.props.children - } -} - -BackgroundWrapper.propTypes = { - children: PropTypes.element, - value: PropTypes.instanceOf(Date), - range: PropTypes.arrayOf(PropTypes.instanceOf(Date)), -} - -export default BackgroundWrapper +export default NoopWrapper diff --git a/src/Calendar.js b/src/Calendar.js index 590a299fd..4b5efd508 100644 --- a/src/Calendar.js +++ b/src/Calendar.js @@ -13,18 +13,18 @@ import warning from 'warning' import { notify } from './utils/helpers' import { navigate, views } from './utils/constants' -import defaultFormats from './formats' +import { mergeWithDefaults } from './localizer' import message from './utils/messages' import moveDate from './utils/move' import VIEWS from './Views' import Toolbar from './Toolbar' -import EventWrapper from './EventWrapper' -import BackgroundWrapper from './BackgroundWrapper' +import NoopWrapper from './NoopWrapper' import omit from 'lodash/omit' import defaults from 'lodash/defaults' import transform from 'lodash/transform' import mapValues from 'lodash/mapValues' +import { wrapAccessor } from './utils/accessors' function viewNames(_views) { return !Array.isArray(_views) ? Object.keys(_views) : _views @@ -60,6 +60,8 @@ function isValidView(view, { views: _views }) { */ class Calendar extends React.Component { static propTypes = { + localizer: PropTypes.object.isRequired, + /** * Props passed to main calendar `
`. * @@ -644,6 +646,7 @@ class Calendar extends React.Component { components: PropTypes.shape({ event: elementType, eventWrapper: elementType, + eventContainerWrapper: elementType, dayWrapper: elementType, dateCellWrapper: elementType, timeGutterHeader: elementType, @@ -715,6 +718,68 @@ class Calendar extends React.Component { getNow: () => new Date(), } + constructor(...args) { + super(...args) + this.state = { + context: this.getContext(this.props), + } + } + componentWillReceiveProps(nextProps) { + this.setState({ context: this.getContext(nextProps) }) + } + + getContext({ + startAccessor, + endAccessor, + allDayAccessor, + tooltipAccessor, + titleAccessor, + resourceAccessor, + resourceIdAccessor, + resourceTitleAccessor, + eventPropGetter, + slotPropGetter, + dayPropGetter, + view, + views, + localizer, + culture, + messages = {}, + components = {}, + formats = {}, + }) { + let names = viewNames(views) + const msgs = message(messages) + return { + viewNames: names, + localizer: mergeWithDefaults(localizer, culture, formats, msgs), + getters: { + eventProp: (...args) => + (eventPropGetter && eventPropGetter(...args)) || {}, + slotProp: (...args) => + (slotPropGetter && slotPropGetter(...args)) || {}, + dayProp: (...args) => (dayPropGetter && dayPropGetter(...args)) || {}, + }, + components: defaults(components[view] || {}, omit(components, names), { + eventWrapper: NoopWrapper, + eventContainerWrapper: NoopWrapper, + dayWrapper: NoopWrapper, + dateCellWrapper: NoopWrapper, + weekWrapper: NoopWrapper, + }), + accessors: { + start: wrapAccessor(startAccessor), + end: wrapAccessor(endAccessor), + allDay: wrapAccessor(allDayAccessor), + tooltip: wrapAccessor(tooltipAccessor), + title: wrapAccessor(titleAccessor), + resource: wrapAccessor(resourceAccessor), + resourceId: wrapAccessor(resourceIdAccessor), + resourceTitle: wrapAccessor(resourceTitleAccessor), + }, + } + } + getViews = () => { const views = this.props.views @@ -755,38 +820,32 @@ class Calendar extends React.Component { toolbar, events, culture, - components = {}, - formats = {}, - messages = {}, style, className, elementProps, date: current, getNow, length, + showMultiDayTimes, + components: _0, + formats: _1, + messages: _2, ...props } = this.props current = current || getNow() - formats = defaultFormats(formats) - messages = message(messages) - let View = this.getView() - let names = viewNames(this.props.views) - - let viewComponents = defaults( - components[view] || {}, - omit(components, names), - { - eventWrapper: EventWrapper, - dayWrapper: BackgroundWrapper, - dateCellWrapper: BackgroundWrapper, - } - ) + const { + accessors, + components, + getters, + localizer, + viewNames, + } = this.state.context let CalToolbar = components.toolbar || Toolbar - const label = View.title(current, { formats, culture, length }) + const label = View.title(current, { localizer, length }) return (
)} seg.left <= slot && seg.right >= slot +import * as DateSlotMetrics from './utils/DateSlotMetrics' const propTypes = { date: PropTypes.instanceOf(Date), @@ -20,6 +17,7 @@ const propTypes = { range: PropTypes.array.isRequired, rtl: PropTypes.bool, + resourceId: PropTypes.any, renderForMeasure: PropTypes.bool, renderHeader: PropTypes.func, @@ -30,17 +28,20 @@ const propTypes = { onShowMore: PropTypes.func, onSelectSlot: PropTypes.func, + onSelect: PropTypes.func, onSelectEnd: PropTypes.func, onSelectStart: PropTypes.func, + onDoubleClick: PropTypes.func, dayPropGetter: PropTypes.func, getNow: PropTypes.func.isRequired, - startAccessor: accessor.isRequired, - endAccessor: accessor.isRequired, + isAllDay: PropTypes.bool, + + accessors: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + getters: PropTypes.object.isRequired, + localizer: PropTypes.object.isRequired, - eventComponent: elementType, - eventWrapperComponent: elementType.isRequired, - dateCellWrapperComponent: elementType, minRows: PropTypes.number.isRequired, maxRows: PropTypes.number.isRequired, } @@ -51,6 +52,12 @@ const defaultProps = { } class DateContentRow extends React.Component { + constructor(...args) { + super(...args) + + this.slotMetrics = DateSlotMetrics.getSlotMetrics() + } + handleSelectSlot = slot => { const { range, onSelectSlot } = this.props @@ -59,15 +66,13 @@ class DateContentRow extends React.Component { handleShowMore = slot => { const { range, onShowMore } = this.props + let metrics = this.slotMetrics(this.props) let row = qsa(findDOMNode(this), '.rbc-row-bg')[0] let cell if (row) cell = row.children[slot - 1] - let events = this.segments - .filter(seg => isSegmentInSlot(seg, slot)) - .map(seg => seg.event) - + let events = metrics.getEventsForSlot(slot) onShowMore(events, range[slot - 1], cell, slot) } @@ -131,46 +136,46 @@ class DateContentRow extends React.Component { const { date, rtl, - events, range, className, + selected, selectable, - dayPropGetter, renderForMeasure, - startAccessor, - endAccessor, + + accessors, + getters, + components, + getNow, renderHeader, - minRows, - maxRows, - dateCellWrapperComponent, - eventComponent, - eventWrapperComponent, + onSelect, + localizer, onSelectStart, onSelectEnd, + onDoubleClick, + resourceId, longPressThreshold, - ...props + isAllDay, } = this.props if (renderForMeasure) return this.renderDummy() - let { first, last } = endOfRange(range) + let metrics = this.slotMetrics(this.props) + let { levels, extra } = metrics - let segments = (this.segments = events.map(evt => - eventSegments( - evt, - first, - last, - { - startAccessor, - endAccessor, - }, - range - ) - )) + let WeekWrapper = components.weekWrapper - let { levels, extra } = eventLevels(segments, Math.max(maxRows - 1, 1)) - while (levels.length < minRows) levels.push([]) + const eventRowProps = { + selected, + accessors, + getters, + localizer, + components, + onSelect, + onDoubleClick, + resourceId, + slotMetrics: metrics, + } return (
@@ -181,47 +186,32 @@ class DateContentRow extends React.Component { range={range} selectable={selectable} container={this.getContainer} - dayPropGetter={dayPropGetter} + getters={getters} onSelectStart={onSelectStart} onSelectEnd={onSelectEnd} onSelectSlot={this.handleSelectSlot} - cellWrapperComponent={dateCellWrapperComponent} + components={components} longPressThreshold={longPressThreshold} />
{renderHeader && ( -
+
{range.map(this.renderHeadingCell)}
)} - {levels.map((segs, idx) => ( - - ))} - {!!extra.length && ( - - )} + + {levels.map((segs, idx) => ( + + ))} + {!!extra.length && ( + + )} +
) diff --git a/src/Day.js b/src/Day.js index c592ecf9d..26ee9e209 100644 --- a/src/Day.js +++ b/src/Day.js @@ -4,7 +4,6 @@ import React from 'react' import dates from './utils/dates' import { navigate } from './utils/constants' import TimeGrid from './TimeGrid' -import localizer from './localizer' class Day extends React.Component { static propTypes = { @@ -36,7 +35,6 @@ Day.navigate = (date, action) => { } } -Day.title = (date, { formats, culture }) => - localizer.format(date, formats.dayHeaderFormat, culture) +Day.title = (date, { localizer }) => localizer.format(date, 'dayHeaderFormat') export default Day diff --git a/src/DayColumn.js b/src/DayColumn.js index e0f6a1d25..44ed7da85 100644 --- a/src/DayColumn.js +++ b/src/DayColumn.js @@ -7,18 +7,15 @@ import Selection, { getBoundsForNode, isEvent } from './Selection' import dates from './utils/dates' import * as TimeSlotUtils from './utils/TimeSlots' import { isSelected } from './utils/selection' -import localizer from './localizer' import { notify } from './utils/helpers' -import { accessor, elementType, dateFormat } from './utils/propTypes' -import { accessor as get } from './utils/accessors' import * as DayEventLayout from './utils/DayEventLayout' import TimeSlotGroup from './TimeSlotGroup' +import TimeGridEvent from './TimeGridEvent' class DayColumn extends React.Component { static propTypes = { events: PropTypes.array.isRequired, - components: PropTypes.object, step: PropTypes.number.isRequired, date: PropTypes.instanceOf(Date).isRequired, min: PropTypes.instanceOf(Date).isRequired, @@ -26,20 +23,15 @@ class DayColumn extends React.Component { getNow: PropTypes.func.isRequired, rtl: PropTypes.bool, - titleAccessor: accessor, - tooltipAccessor: accessor, - allDayAccessor: accessor.isRequired, - startAccessor: accessor.isRequired, - endAccessor: accessor.isRequired, - - selectRangeFormat: dateFormat, - eventTimeRangeFormat: dateFormat, - eventTimeRangeStartFormat: dateFormat, - eventTimeRangeEndFormat: dateFormat, + + accessors: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + getters: PropTypes.object.isRequired, + localizer: PropTypes.object.isRequired, + showMultiDayTimes: PropTypes.bool, culture: PropTypes.string, timeslots: PropTypes.number, - messages: PropTypes.object, selected: PropTypes.object, selectable: PropTypes.oneOf([true, false, 'ignoreEvents']), @@ -53,12 +45,6 @@ class DayColumn extends React.Component { className: PropTypes.string, dragThroughEvents: PropTypes.bool, - eventPropGetter: PropTypes.func, - dayPropGetter: PropTypes.func, - slotPropGetter: PropTypes.func, - timeSlotWrapperComponent: elementType, - eventComponent: elementType, - eventWrapperComponent: elementType.isRequired, resource: PropTypes.any, } @@ -97,12 +83,11 @@ class DayColumn extends React.Component { rtl, date, getNow, - selectRangeFormat, - culture, - slotPropGetter, resource, - timeSlotWrapperComponent, - dayPropGetter, + accessors, + localizer, + getters: { dayProp, ...getters }, + components: { eventContainerWrapper: EventContainer, ...components }, } = this.props let { slotMetrics } = this @@ -110,7 +95,7 @@ class DayColumn extends React.Component { let selectDates = { start: startDate, end: endDate } - const { className, style } = (dayPropGetter && dayPropGetter(max)) || {} + const { className, style } = dayProp(max) const current = getNow() return ( @@ -129,19 +114,26 @@ class DayColumn extends React.Component { key={idx} group={grp} resource={resource} - slotPropGetter={slotPropGetter} - timeSlotWrapperComponent={timeSlotWrapperComponent} + getters={getters} + components={components} /> ))} -
- {this.renderEvents()} -
+ +
+ {this.renderEvents()} +
+
{selecting && (
- - {localizer.format(selectDates, selectRangeFormat, culture)} - + {localizer.format(selectDates, 'selectRangeFormat')}
)}
@@ -150,119 +142,62 @@ class DayColumn extends React.Component { renderEvents = () => { let { - components: { event: EventComponent }, - culture, - endAccessor, - eventPropGetter, - eventTimeRangeEndFormat, - eventTimeRangeFormat, - eventTimeRangeStartFormat, - eventWrapperComponent: EventWrapper, events, - max, - messages, - min, rtl: isRtl, selected, - startAccessor, + accessors, + localizer, + getters, + components, step, timeslots, - titleAccessor, - tooltipAccessor, } = this.props + const { slotMetrics } = this + const { messages } = localizer + let styledEvents = DayEventLayout.getStyledEvents({ events, - startAccessor, - endAccessor, - slotMetrics: this.slotMetrics, - minimumStartDifference: Math.ceil((step * timeslots) / 2), + accessors, + slotMetrics, + minimumStartDifference: Math.ceil(step * timeslots / 2), }) return styledEvents.map(({ event, style }, idx) => { - let _eventTimeRangeFormat = eventTimeRangeFormat - let _continuesPrior = false - let _continuesAfter = false - let start = get(event, startAccessor) - let end = get(event, endAccessor) - - if (start < min) { - start = min - _continuesPrior = true - _eventTimeRangeFormat = eventTimeRangeEndFormat - } - - if (end > max) { - end = max - _continuesAfter = true - _eventTimeRangeFormat = eventTimeRangeStartFormat - } - - let continuesPrior = this.slotMetrics.startsBefore(start) - let continuesAfter = this.slotMetrics.startsAfter(end) - - let title = get(event, titleAccessor) - let tooltip = get(event, tooltipAccessor) + let end = accessors.end(event) + let start = accessors.start(event) + let format = 'eventTimeRangeFormat' let label - if (_continuesPrior && _continuesAfter) { - label = messages.allDay - } else { - label = localizer.format({ start, end }, _eventTimeRangeFormat, culture) - } - let _isSelected = isSelected(event, selected) + const startsBeforeDay = slotMetrics.startsBeforeDay(start) + const startsAfterDay = slotMetrics.startsAfterDay(end) - if (eventPropGetter) - var { style: xStyle, className } = eventPropGetter( - event, - start, - end, - _isSelected - ) + if (startsBeforeDay) format = 'eventTimeRangeEndFormat' + else if (startsAfterDay) format = 'eventTimeRangeStartFormat' - let { height, top, width, xOffset } = style + if (startsBeforeDay && startsAfterDay) label = messages.allDay + else label = localizer.format({ start, end }, format) - let wrapperProps = { - event, - continuesPrior: _continuesPrior, - continuesAfter: _continuesAfter, - } + let continuesEarlier = startsBeforeDay || slotMetrics.startsBefore(start) + let continuesLater = startsAfterDay || slotMetrics.startsAfter(end) return ( - -
this._select(event, e)} - onDoubleClick={e => this._doubleClick(event, e)} - className={cn('rbc-event', className, { - 'rbc-selected': _isSelected, - 'rbc-event-continues-earlier': continuesPrior, - 'rbc-event-continues-later': continuesAfter, - 'rbc-event-continues-day-prior': _continuesPrior, - 'rbc-event-continues-day-after': _continuesAfter, - })} - > -
{label}
-
- {EventComponent ? ( - - ) : ( - title - )} -
-
-
+ this._select(event, e)} + onDoubleClick={e => this._doubleClick(event, e)} + /> ) }) } @@ -297,12 +232,10 @@ class DayColumn extends React.Component { } } - let selectionState = ({ y }) => { - let { top, bottom } = getBoundsForNode(node) - - let range = Math.abs(top - bottom) - let currentSlot = this.slotMetrics.closestSlotToPosition( - (y - top) / range + let selectionState = point => { + let currentSlot = this.slotMetrics.closestSlotFromPoint( + point, + getBoundsForNode(node) ) if (!this.state.selecting) this._initialSlot = currentSlot diff --git a/src/EventCell.js b/src/EventCell.js index 6f0ca3032..c44a8f98c 100644 --- a/src/EventCell.js +++ b/src/EventCell.js @@ -2,8 +2,6 @@ import PropTypes from 'prop-types' import React from 'react' import cn from 'classnames' import dates from './utils/dates' -import { accessor, elementType } from './utils/propTypes' -import { accessor as get } from './utils/accessors' let propTypes = { event: PropTypes.object.isRequired, @@ -12,90 +10,79 @@ let propTypes = { selected: PropTypes.bool, isAllDay: PropTypes.bool, - eventPropGetter: PropTypes.func, - titleAccessor: accessor, - tooltipAccessor: accessor, - allDayAccessor: accessor, - startAccessor: accessor, - endAccessor: accessor, + continuesPrior: PropTypes.bool, + continuesAfter: PropTypes.bool, - eventComponent: elementType, - eventWrapperComponent: elementType.isRequired, - onSelect: PropTypes.func.isRequired, - onDoubleClick: PropTypes.func.isRequired, + accessors: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + getters: PropTypes.object.isRequired, + localizer: PropTypes.object.isRequired, + + onSelect: PropTypes.func, + onDoubleClick: PropTypes.func, } class EventCell extends React.Component { render() { let { + style, className, event, selected, isAllDay, - eventPropGetter, - startAccessor, - endAccessor, - titleAccessor, - tooltipAccessor, - allDayAccessor, - slotStart, - slotEnd, onSelect, onDoubleClick, - eventComponent: Event, - eventWrapperComponent: EventWrapper, + localizer, + continuesPrior, + continuesAfter, + accessors, + getters, + children, + components: { event: Event, eventWrapper: EventWrapper }, ...props } = this.props - let title = get(event, titleAccessor), - tooltip = get(event, tooltipAccessor), - end = get(event, endAccessor), - start = get(event, startAccessor), - allDay = get(event, allDayAccessor), - showAsAllDay = - isAllDay || - allDay || - dates.diff(start, dates.ceil(end, 'day'), 'day') > 1, - continuesPrior = dates.lt(start, slotStart, 'day'), - continuesAfter = dates.gte(end, slotEnd, 'day') + let title = accessors.title(event) + let tooltip = accessors.tooltip(event) + let end = accessors.end(event) + let start = accessors.start(event) + let allDay = accessors.allDay(event) - if (eventPropGetter) - var { style, className: xClassName } = eventPropGetter( - event, - start, - end, - selected - ) + let showAsAllDay = + isAllDay || allDay || dates.diff(start, dates.ceil(end, 'day'), 'day') > 1 - let wrapperProps = { - event, - allDay, - continuesPrior, - continuesAfter, - } + let userProps = getters.eventProp(event, start, end, selected) + + const content = ( +
+ {Event ? ( + + ) : ( + title + )} +
+ ) return ( - // give EventWrapper some extra info to help it determine whether it - // it's in a row, etc. Useful for dnd, etc. - +
onSelect(event, e)} - onDoubleClick={e => onDoubleClick(event, e)} + onClick={e => onSelect && onSelect(event, e)} + onDoubleClick={e => onDoubleClick && onDoubleClick(event, e)} > -
- {Event ? ( - - ) : ( - title - )} -
+ {typeof children === 'function' ? children(content) : content}
) diff --git a/src/EventEndingRow.js b/src/EventEndingRow.js index ee92cf93f..16e47c6b7 100644 --- a/src/EventEndingRow.js +++ b/src/EventEndingRow.js @@ -2,7 +2,6 @@ import PropTypes from 'prop-types' import React from 'react' import EventRowMixin from './EventRowMixin' import { eventLevels } from './utils/eventLevels' -import message from './utils/messages' import range from 'lodash/range' let isSegmentInSlot = (seg, slot) => seg.left <= slot && seg.right >= slot @@ -13,7 +12,6 @@ class EventEndingRow extends React.Component { static propTypes = { segments: PropTypes.array, slots: PropTypes.number, - messages: PropTypes.object, onShowMore: PropTypes.func, ...EventRowMixin.propTypes, } @@ -22,14 +20,14 @@ class EventEndingRow extends React.Component { } render() { - let { segments, slots: slotCount } = this.props + let { segments, slotMetrics: { slots } } = this.props let rowSegments = eventLevels(segments).levels[0] let current = 1, lastEnd = 1, row = [] - while (current <= slotCount) { + while (current <= slots) { let key = '_lvl_' + current let { event, left, right, span } = @@ -46,20 +44,20 @@ class EventEndingRow extends React.Component { let content = EventRowMixin.renderEvent(this.props, event) if (gap) { - row.push(EventRowMixin.renderSpan(slotCount, gap, key + '_gap')) + row.push(EventRowMixin.renderSpan(slots, gap, key + '_gap')) } - row.push(EventRowMixin.renderSpan(slotCount, span, key, content)) + row.push(EventRowMixin.renderSpan(slots, span, key, content)) lastEnd = current = right + 1 } else { if (gap) { - row.push(EventRowMixin.renderSpan(slotCount, gap, key + '_gap')) + row.push(EventRowMixin.renderSpan(slots, gap, key + '_gap')) } row.push( EventRowMixin.renderSpan( - slotCount, + slots, 1, key, this.renderShowMore(segments, current) @@ -83,7 +81,7 @@ class EventEndingRow extends React.Component { } renderShowMore(segments, slot) { - let messages = message(this.props.messages) + let { localizer } = this.props let count = eventsInSlot(segments, slot) return count ? ( @@ -93,7 +91,7 @@ class EventEndingRow extends React.Component { className={'rbc-show-more'} onClick={e => this.showMore(slot, e)} > - {messages.showMore(count)} + {localizer.messages.showMore(count)} ) : ( false diff --git a/src/EventRow.js b/src/EventRow.js index f1e01dd14..f1e98a13b 100644 --- a/src/EventRow.js +++ b/src/EventRow.js @@ -1,4 +1,5 @@ import PropTypes from 'prop-types' +import cn from 'classnames' import React from 'react' import EventRowMixin from './EventRowMixin' @@ -11,12 +12,12 @@ class EventRow extends React.Component { ...EventRowMixin.defaultProps, } render() { - let { segments, slots } = this.props + let { segments, slotMetrics: { slots }, className } = this.props let lastEnd = 1 return ( -
+
{segments.reduce((row, { event, left, right, span }, li) => { let key = '_lvl_' + li let gap = left - lastEnd diff --git a/src/EventRowMixin.js b/src/EventRowMixin.js index 998bc8206..5e9221715 100644 --- a/src/EventRowMixin.js +++ b/src/EventRowMixin.js @@ -1,29 +1,21 @@ import PropTypes from 'prop-types' import React from 'react' -import { findDOMNode } from 'react-dom' import EventCell from './EventCell' -import getHeight from 'dom-helpers/query/height' -import { accessor, elementType } from './utils/propTypes' import { isSelected } from './utils/selection' /* eslint-disable react/prop-types */ export default { propTypes: { - slots: PropTypes.number.isRequired, - end: PropTypes.instanceOf(Date), - start: PropTypes.instanceOf(Date), + slotMetrics: PropTypes.object.isRequired, selected: PropTypes.object, isAllDay: PropTypes.bool, - eventPropGetter: PropTypes.func, - titleAccessor: accessor, - tooltipAccessor: accessor, - allDayAccessor: accessor, - startAccessor: accessor, - endAccessor: accessor, - eventComponent: elementType, - eventWrapperComponent: elementType.isRequired, + accessors: PropTypes.object.isRequired, + localizer: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + getters: PropTypes.object.isRequired, + onSelect: PropTypes.func, onDoubleClick: PropTypes.func, }, @@ -31,44 +23,36 @@ export default { defaultProps: { segments: [], selected: {}, - slots: 7, }, renderEvent(props, event) { let { - eventPropGetter, selected, - isAllDay, - start, - end, - startAccessor, - endAccessor, - titleAccessor, - tooltipAccessor, - allDayAccessor, - eventComponent, - eventWrapperComponent, + isAllDay: _, + accessors, + getters, onSelect, onDoubleClick, + localizer, + slotMetrics, + components, } = props + let continuesPrior = slotMetrics.continuesPrior(event) + let continuesAfter = slotMetrics.continuesAfter(event) + return ( ) }, @@ -87,8 +71,4 @@ export default {
) }, - - getRowHeight() { - getHeight(findDOMNode(this)) - }, } diff --git a/src/EventWrapper.js b/src/EventWrapper.js index 1275eb27d..1bc6e67f7 100644 --- a/src/EventWrapper.js +++ b/src/EventWrapper.js @@ -1,9 +1,3 @@ -import React from 'react' +import NoopWrapper from './NoopWrapper' -class EventWrapper extends React.Component { - render() { - return this.props.children - } -} - -export default EventWrapper +export default NoopWrapper diff --git a/src/Month.js b/src/Month.js index 3f82b5dee..919b90358 100644 --- a/src/Month.js +++ b/src/Month.js @@ -4,7 +4,6 @@ import { findDOMNode } from 'react-dom' import cn from 'classnames' import dates from './utils/dates' -import localizer from './localizer' import chunk from 'lodash/chunk' import { navigate, views } from './utils/constants' @@ -18,11 +17,10 @@ import DateContentRow from './DateContentRow' import Header from './Header' import DateHeader from './DateHeader' -import { accessor, dateFormat } from './utils/propTypes' import { inRange, sortEvents } from './utils/eventLevels' -let eventsForWeek = (evts, start, end, props) => - evts.filter(e => inRange(e, start, end, props)) +let eventsForWeek = (evts, start, end, accessors) => + evts.filter(e => inRange(e, start, end, accessors)) let propTypes = { events: PropTypes.array.isRequired, @@ -35,20 +33,13 @@ let propTypes = { getNow: PropTypes.func.isRequired, scrollToTime: PropTypes.instanceOf(Date), - eventPropGetter: PropTypes.func, - dayPropGetter: PropTypes.func, - - culture: PropTypes.string, - dayFormat: dateFormat, - rtl: PropTypes.bool, width: PropTypes.number, - titleAccessor: accessor.isRequired, - tooltipAccessor: accessor.isRequired, - allDayAccessor: accessor.isRequired, - startAccessor: accessor.isRequired, - endAccessor: accessor.isRequired, + accessors: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + getters: PropTypes.object.isRequired, + localizer: PropTypes.object.isRequired, selected: PropTypes.object, selectable: PropTypes.oneOf([true, false, 'ignoreEvents']), @@ -62,13 +53,8 @@ let propTypes = { onDrillDown: PropTypes.func, getDrilldownView: PropTypes.func.isRequired, - dateFormat, - - weekdayFormat: dateFormat, popup: PropTypes.bool, - messages: PropTypes.object, - components: PropTypes.object.isRequired, popupOffset: PropTypes.oneOfType([ PropTypes.number, PropTypes.shape({ @@ -131,8 +117,8 @@ class MonthView extends React.Component { } render() { - let { date, culture, weekdayFormat, className } = this.props, - month = dates.visibleDays(date, culture), + let { date, localizer, className } = this.props, + month = dates.visibleDays(date, localizer), weeks = chunk(month, 7) this._weekCount = weeks.length @@ -140,7 +126,7 @@ class MonthView extends React.Component { return (
- {this.renderHeaders(weeks[0], weekdayFormat, culture)} + {this.renderHeaders(weeks[0])}
{weeks.map(this.renderWeek)} {this.props.popup && this.renderOverlay()} @@ -153,24 +139,20 @@ class MonthView extends React.Component { events, components, selectable, - titleAccessor, - tooltipAccessor, - startAccessor, - endAccessor, - allDayAccessor, getNow, - eventPropGetter, - dayPropGetter, - messages, selected, date, + localizer, longPressThreshold, + accessors, + getters, } = this.props const { needLimitMeasure, rowLimit } = this.state - events = eventsForWeek(events, week[0], week[week.length - 1], this.props) - events.sort((a, b) => sortEvents(a, b, this.props)) + events = eventsForWeek(events, week[0], week[week.length - 1], accessors) + + events.sort((a, b) => sortEvents(a, b, accessors)) return ( @@ -209,17 +184,12 @@ class MonthView extends React.Component { } readerDateHeading = ({ date, className, ...props }) => { - let { - date: currentDate, - getDrilldownView, - dateFormat, - culture, - } = this.props + let { date: currentDate, getDrilldownView, localizer } = this.props let isOffRange = dates.month(date) !== dates.month(currentDate) let isCurrent = dates.eq(date, currentDate, 'day') let drilldownView = getDrilldownView(date) - let label = localizer.format(date, dateFormat, culture) + let label = localizer.format(date, 'dateFormat') let DateHeaderComponent = this.props.components.dateHeader || DateHeader return ( @@ -242,19 +212,18 @@ class MonthView extends React.Component { ) } - renderHeaders(row, format, culture) { + renderHeaders(row) { + let { localizer, components } = this.props let first = row[0] let last = row[row.length - 1] - let HeaderComponent = this.props.components.header || Header + let HeaderComponent = components.header || Header return dates.range(first, last, 'day').map((day, idx) => (
)) @@ -262,7 +231,7 @@ class MonthView extends React.Component { renderOverlay() { let overlay = (this.state && this.state.overlay) || {} - let { components } = this.props + let { accessors, localizer, components, getters, selected } = this.props return ( this.setState({ overlay: null })} > { } } -MonthView.title = (date, { formats, culture }) => - localizer.format(date, formats.monthHeaderFormat, culture) +MonthView.title = (date, { localizer }) => + localizer.format(date, 'monthHeaderFormat') export default MonthView diff --git a/src/NoopWrapper.js b/src/NoopWrapper.js new file mode 100644 index 000000000..e40ed1e3d --- /dev/null +++ b/src/NoopWrapper.js @@ -0,0 +1,5 @@ +function NoopWrapper(props) { + return props.children +} + +export default NoopWrapper diff --git a/src/Popup.js b/src/Popup.js index 1dcbc5f99..af3b9a45c 100644 --- a/src/Popup.js +++ b/src/Popup.js @@ -3,11 +3,10 @@ import React from 'react' import getOffset from 'dom-helpers/query/offset' import getScrollTop from 'dom-helpers/query/scrollTop' import getScrollLeft from 'dom-helpers/query/scrollLeft' +import dates from './utils/dates' import EventCell from './EventCell' import { isSelected } from './utils/selection' -import localizer from './localizer' -import { elementType, dateFormat } from './utils/propTypes' const propTypes = { position: PropTypes.object, @@ -20,10 +19,17 @@ const propTypes = { ]), events: PropTypes.array, selected: PropTypes.object, - eventComponent: elementType, - eventWrapperComponent: elementType, - dayHeaderFormat: dateFormat, + + accessors: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + getters: PropTypes.object.isRequired, + localizer: PropTypes.object.isRequired, + onSelect: PropTypes.func, + onDoubleClick: PropTypes.func, + slotStart: PropTypes.number, + slotEnd: PropTypes.number, } + class Popup extends React.Component { componentDidMount() { let { popupOffset = 5 } = this.props, @@ -49,9 +55,14 @@ class Popup extends React.Component { let { events, selected, - eventComponent, - eventWrapperComponent, - ...props + getters, + accessors, + components, + onSelect, + onDoubleClick, + slotStart, + slotEnd, + localizer, } = this.props let { left, width, top } = this.props.position, @@ -67,19 +78,20 @@ class Popup extends React.Component { return (
- {localizer.format( - props.slotStart, - props.dayHeaderFormat, - props.culture - )} + {localizer.format(slotStart, 'dayHeaderFormat')}
{events.map((event, idx) => ( ))} diff --git a/src/Selection.js b/src/Selection.js index d3f2188a2..d5c9e7c69 100644 --- a/src/Selection.js +++ b/src/Selection.js @@ -3,7 +3,7 @@ import closest from 'dom-helpers/query/closest' import events from 'dom-helpers/events' function addEventListener(type, handler, target = document) { - events.on(target, type, handler) + events.on(target, type, handler, { passive: false }) return { remove() { events.off(target, type, handler) @@ -15,9 +15,13 @@ function isOverContainer(container, x, y) { return !container || contains(container, document.elementFromPoint(x, y)) } -export function isEvent(node, { clientX, clientY }) { +export function getEventNodeFromPoint(node, { clientX, clientY }) { let target = document.elementFromPoint(clientX, clientY) - return !!closest(target, '.rbc-event', node) + return closest(target, '.rbc-event', node) +} + +export function isEvent(node, bounds) { + return !!getEventNodeFromPoint(node, bounds) } function getEventCoordinates(e) { diff --git a/src/TimeGrid.js b/src/TimeGrid.js index bb727b8bb..9260311c2 100644 --- a/src/TimeGrid.js +++ b/src/TimeGrid.js @@ -10,9 +10,7 @@ import TimeGutter from './TimeGutter' import getWidth from 'dom-helpers/query/width' import TimeGridHeader from './TimeGridHeader' -import { accessor, dateFormat } from './utils/propTypes' import { notify } from './utils/helpers' -import { accessor as get } from './utils/accessors' import { inRange, sortEvents } from './utils/eventLevels' export default class TimeGrid extends Component { @@ -21,30 +19,22 @@ export default class TimeGrid extends Component { resources: PropTypes.array, step: PropTypes.number, + timeslots: PropTypes.number, range: PropTypes.arrayOf(PropTypes.instanceOf(Date)), min: PropTypes.instanceOf(Date), max: PropTypes.instanceOf(Date), getNow: PropTypes.func.isRequired, scrollToTime: PropTypes.instanceOf(Date), - eventPropGetter: PropTypes.func, - dayPropGetter: PropTypes.func, - dayFormat: dateFormat, showMultiDayTimes: PropTypes.bool, - culture: PropTypes.string, rtl: PropTypes.bool, width: PropTypes.number, - titleAccessor: accessor.isRequired, - tooltipAccessor: accessor.isRequired, - allDayAccessor: accessor.isRequired, - startAccessor: accessor.isRequired, - endAccessor: accessor.isRequired, - resourceAccessor: accessor.isRequired, - - resourceIdAccessor: accessor.isRequired, - resourceTitleAccessor: accessor.isRequired, + accessors: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + getters: PropTypes.object.isRequired, + localizer: PropTypes.object.isRequired, selected: PropTypes.object, selectable: PropTypes.oneOf([true, false, 'ignoreEvents']), @@ -58,9 +48,6 @@ export default class TimeGrid extends Component { onDoubleClickEvent: PropTypes.func, onDrillDown: PropTypes.func, getDrilldownView: PropTypes.func.isRequired, - - messages: PropTypes.object, - components: PropTypes.object.isRequired, } static defaultProps = { @@ -150,44 +137,27 @@ export default class TimeGrid extends Component { } renderEvents(range, events, today, resources) { - let { - min, - max, - endAccessor, - startAccessor, - resourceAccessor, - resourceIdAccessor, - components, - } = this.props + let { min, max, components, accessors, localizer } = this.props return range.map((date, idx) => { let daysEvents = events.filter(event => - dates.inRange( - date, - get(event, startAccessor), - get(event, endAccessor), - 'day' - ) + dates.inRange(date, accessors.start(event), accessors.end(event), 'day') ) return resources.map((resource, id) => { + const resourceId = accessors.resourceId(resource) let eventsToDisplay = !resource ? daysEvents - : daysEvents.filter( - event => - get(event, resourceAccessor) === - get(resource, resourceIdAccessor) - ) + : daysEvents.filter(event => accessors.resource(event) === resourceId) return ( { - if (inRange(event, start, end, this.props)) { - let eStart = get(event, startAccessor), - eEnd = get(event, endAccessor) + if (inRange(event, start, end, accessors)) { + let eStart = accessors.start(event), + eEnd = accessors.end(event) if ( - get(event, allDayAccessor) || + accessors.allDay(event) || (dates.isJustDate(eStart) && dates.isJustDate(eEnd)) || (!showMultiDayTimes && !dates.eq(eStart, eEnd, 'day')) ) { @@ -242,7 +213,7 @@ export default class TimeGrid extends Component { } }) - allDayEvents.sort((a, b) => sortEvents(a, b, this.props)) + allDayEvents.sort((a, b) => sortEvents(a, b, accessors)) return (
@@ -251,28 +222,15 @@ export default class TimeGrid extends Component { events={allDayEvents} width={width} getNow={getNow} - dayFormat={this.props.dayFormat} - culture={this.props.culture} + localizer={localizer} resources={resources} selected={selected} selectable={this.props.selectable} - startAccessor={startAccessor} - endAccessor={endAccessor} - titleAccessor={this.props.titleAccessor} - tooltipAccessor={this.props.tooltipAccessor} - allDayAccessor={this.props.allDayAccessor} - resourceAccessor={this.props.resourceAccessor} - resourceIdAccessor={this.props.resourceIdAccessor} - resourceTitleAccessor={this.props.resourceTitleAccessor} + accessors={accessors} + getters={getters} + components={components} isOverflowing={this.state.isOverflowing} - dayPropGetter={this.props.dayPropGetter} - eventPropGetter={eventPropGetter} longPressThreshold={longPressThreshold} - headerComponent={components.header} - eventComponent={components.event} - eventWrapperComponent={components.eventWrapper} - dateCellWrapperComponent={components.dateCellWrapper} - timeGutterHeaderComponent={components.timeGutterHeader} onSelectSlot={this.handleSelectAllDaySlot} onSelectEvent={this.handleSelectAlldayEvent} onDoubleClickEvent={this.props.onDoubleClickEvent} @@ -281,9 +239,14 @@ export default class TimeGrid extends Component { />
{this.renderEvents(range, rangeEvents, getNow(), resources || [null])} diff --git a/src/TimeGridEvent.js b/src/TimeGridEvent.js new file mode 100644 index 000000000..de43dfdfa --- /dev/null +++ b/src/TimeGridEvent.js @@ -0,0 +1,63 @@ +import cn from 'classnames' +import React from 'react' + +/* eslint-disable react/prop-types */ +function TimeGridEvent(props) { + const { + style, + className, + event, + accessors, + isRtl, + selected, + label, + continuesEarlier, + continuesLater, + getters, + components: { event: Event, eventWrapper: EventWrapper }, + } = props + let title = accessors.title(event) + let tooltip = accessors.tooltip(event) + let end = accessors.end(event) + let start = accessors.start(event) + + let userProps = getters.eventProp(event, start, end, selected) + + let { height, top, width, xOffset } = style + const inner = [ +
+ {label} +
, +
+ {Event ? : title} +
, + ] + + return ( + +
+ {inner} +
+
+ ) +} + +export default TimeGridEvent diff --git a/src/TimeGridHeader.js b/src/TimeGridHeader.js index f7016cf57..f94810d5a 100644 --- a/src/TimeGridHeader.js +++ b/src/TimeGridHeader.js @@ -4,12 +4,9 @@ import scrollbarSize from 'dom-helpers/util/scrollbarSize' import React from 'react' import dates from './utils/dates' -import { elementType, accessor, dateFormat } from './utils/propTypes' -import localizer from './localizer' import DateContentRow from './DateContentRow' import Header from './Header' import { notify } from './utils/helpers' -import { accessor as get } from './utils/accessors' class TimeGridHeader extends React.Component { static propTypes = { @@ -19,43 +16,24 @@ class TimeGridHeader extends React.Component { getNow: PropTypes.func.isRequired, isOverflowing: PropTypes.bool, - dayFormat: dateFormat, - eventPropGetter: PropTypes.func, - dayPropGetter: PropTypes.func, - culture: PropTypes.string, - rtl: PropTypes.bool, width: PropTypes.number, - titleAccessor: accessor.isRequired, - tooltipAccessor: accessor.isRequired, - allDayAccessor: accessor.isRequired, - startAccessor: accessor.isRequired, - endAccessor: accessor.isRequired, - resourceAccessor: accessor.isRequired, - - resourceIdAccessor: accessor.isRequired, - resourceTitleAccessor: accessor.isRequired, + localizer: PropTypes.object.isRequired, + accessors: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + getters: PropTypes.object.isRequired, selected: PropTypes.object, selectable: PropTypes.oneOf([true, false, 'ignoreEvents']), longPressThreshold: PropTypes.number, - headerComponent: elementType, - eventComponent: elementType, - eventWrapperComponent: elementType.isRequired, - dateCellWrapperComponent: elementType, - timeGutterHeaderComponent: elementType, - onSelectSlot: PropTypes.func, onSelectEvent: PropTypes.func, onDoubleClickEvent: PropTypes.func, onDrillDown: PropTypes.func, getDrilldownView: PropTypes.func.isRequired, } - static defaultProps = { - headerComponent: Header, - } handleHeaderClick = (date, view, e) => { e.preventDefault() @@ -63,7 +41,7 @@ class TimeGridHeader extends React.Component { } renderHeaderResources(range, resources) { - const { resourceTitleAccessor, getNow } = this.props + const { accessors, getNow } = this.props const today = getNow() return range.map((date, i) => { @@ -76,7 +54,7 @@ class TimeGridHeader extends React.Component { dates.eq(date, today, 'day') && 'rbc-today' )} > - {get(resource, resourceTitleAccessor)} + {accessors.resourceTitle(resource)}
) }) @@ -85,30 +63,23 @@ class TimeGridHeader extends React.Component { renderHeaderCells(range) { let { - dayFormat, - culture, - dayPropGetter, + localizer, getDrilldownView, getNow, - headerComponent: Header, + getters: { dayProp }, + components: { header: HeaderComponent = Header }, } = this.props const today = getNow() return range.map((date, i) => { let drilldownView = getDrilldownView(date) - let label = localizer.format(date, dayFormat, culture) + let label = localizer.format(date, 'dayFormat') - const { className, style } = (dayPropGetter && dayPropGetter(date)) || {} + const { className, style } = dayProp(date) let header = ( -
+ ) return ( @@ -135,21 +106,56 @@ class TimeGridHeader extends React.Component { ) }) } + renderRow = resource => { + let { + events, + rtl, + selectable, + getNow, + range, + getters, + localizer, + accessors, + components, + } = this.props + + const resourceId = accessors.resourceId(resource) + let eventsToDisplay = resource + ? events.filter(event => accessors.resource(event) === resourceId) + : events + + return ( + + ) + } render() { let { width, - events, rtl, - selectable, resources, - getNow, range, isOverflowing, - eventComponent, - dateCellWrapperComponent, - eventWrapperComponent, - timeGutterHeaderComponent: TimeGutterHeader, + components: { timeGutterHeader: TimeGutterHeader }, } = this.props let style = {} @@ -177,31 +183,13 @@ class TimeGridHeader extends React.Component {
)} - + {resources ? ( +
+ {resources.map(resource => this.renderRow(resource))} +
+ ) : ( + this.renderRow() + )}
) diff --git a/src/TimeGutter.js b/src/TimeGutter.js index 8f0db2564..6a6b2975a 100644 --- a/src/TimeGutter.js +++ b/src/TimeGutter.js @@ -3,8 +3,6 @@ import PropTypes from 'prop-types' import React, { Component } from 'react' import * as TimeSlotUtils from './utils/TimeSlots' -import { dateFormat } from './utils/propTypes' -import localizer from './localizer' import TimeSlotGroup from './TimeSlotGroup' export default class TimeGutter extends Component { @@ -15,8 +13,7 @@ export default class TimeGutter extends Component { step: PropTypes.number.isRequired, getNow: PropTypes.func.isRequired, - timeGutterFormat: dateFormat, - culture: PropTypes.string, + localizer: PropTypes.object.isRequired, resource: PropTypes.string, } @@ -39,18 +36,18 @@ export default class TimeGutter extends Component { renderSlot = (value, idx) => { if (idx !== 0) return null - const { timeGutterFormat, getNow, culture } = this.props + const { localizer, getNow } = this.props const isNow = this.slotMetrics.dateIsInGroup(getNow(), idx) return ( - {localizer.format(value, timeGutterFormat, culture)} + {localizer.format(value, 'timeGutterFormat')} ) } render() { - const { culture, resource } = this.props + const { resource } = this.props return (
@@ -59,7 +56,6 @@ export default class TimeGutter extends Component { diff --git a/src/TimeSlot.js b/src/TimeSlot.js deleted file mode 100644 index add35e784..000000000 --- a/src/TimeSlot.js +++ /dev/null @@ -1,36 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import cn from 'classnames' -import { elementType } from './utils/propTypes' - -export default class TimeSlot extends Component { - static propTypes = { - timeSlotWrapperComponent: elementType, - value: PropTypes.instanceOf(Date).isRequired, - showLabel: PropTypes.bool, - slotPropGetter: PropTypes.func, - resource: PropTypes.string, - } - - static defaultProps = { - showLabel: false, - content: '', - } - - render() { - const { value, slotPropGetter, resource, children } = this.props - const Wrapper = this.props.timeSlotWrapperComponent - const { className, style } = (slotPropGetter && slotPropGetter(value)) || {} - - return ( - -
- {children} -
-
- ) - } -} diff --git a/src/TimeSlotGroup.js b/src/TimeSlotGroup.js index 74a7192d6..bdc3003c7 100644 --- a/src/TimeSlotGroup.js +++ b/src/TimeSlotGroup.js @@ -2,19 +2,15 @@ import cn from 'classnames' import PropTypes from 'prop-types' import React, { Component } from 'react' -import { elementType } from './utils/propTypes' import BackgroundWrapper from './BackgroundWrapper' export default class TimeSlotGroup extends Component { static propTypes = { renderSlot: PropTypes.func, - timeSlotWrapperComponent: elementType, group: PropTypes.array.isRequired, - slotPropGetter: PropTypes.func, resource: PropTypes.any, - } - static defaultProps = { - timeSlotWrapperComponent: BackgroundWrapper, + components: PropTypes.object, + getters: PropTypes.object, } render() { @@ -22,15 +18,14 @@ export default class TimeSlotGroup extends Component { renderSlot, resource, group, - slotPropGetter, - timeSlotWrapperComponent: Wrapper, + getters, + components: { timeSlotWrapper: Wrapper = BackgroundWrapper } = {}, } = this.props return (
{group.map((value, idx) => { - const slotProps = (slotPropGetter && slotPropGetter(value)) || {} - + const slotProps = getters ? getters.slotProp(value) : {} return (
diff --git a/src/Week.js b/src/Week.js index 7a01acb11..7e8a1508d 100644 --- a/src/Week.js +++ b/src/Week.js @@ -1,7 +1,6 @@ import PropTypes from 'prop-types' import React from 'react' import dates from './utils/dates' -import localizer from './localizer' import { navigate } from './utils/constants' import TimeGrid from './TimeGrid' @@ -33,21 +32,17 @@ Week.navigate = (date, action) => { } } -Week.range = (date, { culture }) => { - let firstOfWeek = localizer.startOfWeek(culture) +Week.range = (date, { localizer }) => { + let firstOfWeek = localizer.startOfWeek() let start = dates.startOf(date, 'week', firstOfWeek) let end = dates.endOf(date, 'week', firstOfWeek) return dates.range(start, end) } -Week.title = (date, { formats, culture }) => { - let [start, ...rest] = Week.range(date, { culture }) - return localizer.format( - { start, end: rest.pop() }, - formats.dayRangeHeaderFormat, - culture - ) +Week.title = (date, { localizer }) => { + let [start, ...rest] = Week.range(date, { localizer }) + return localizer.format({ start, end: rest.pop() }, 'dayRangeHeaderFormat') } export default Week diff --git a/src/WorkWeek.js b/src/WorkWeek.js index bb148d1bb..d13086b20 100644 --- a/src/WorkWeek.js +++ b/src/WorkWeek.js @@ -3,7 +3,6 @@ import React from 'react' import Week from './Week' import TimeGrid from './TimeGrid' -import localizer from './localizer' function workWeekRange(date, options) { return Week.range(date, options).filter( @@ -34,13 +33,10 @@ WorkWeek.range = (date, options) => { WorkWeek.navigate = Week.navigate -WorkWeek.title = (date, { formats, culture }) => { - let [start, ...rest] = workWeekRange(date, { culture }) - return localizer.format( - { start, end: rest.pop() }, - formats.dayRangeHeaderFormat, - culture - ) +WorkWeek.title = (date, { localizer }) => { + let [start, ...rest] = workWeekRange(date, { localizer }) + + return localizer.format({ start, end: rest.pop() }, 'dayRangeHeaderFormat') } export default WorkWeek diff --git a/src/addons/dragAndDrop/DraggableEventWrapper.js b/src/addons/dragAndDrop/DraggableEventWrapper.js deleted file mode 100644 index 6cf8331f1..000000000 --- a/src/addons/dragAndDrop/DraggableEventWrapper.js +++ /dev/null @@ -1,192 +0,0 @@ -import PropTypes from 'prop-types' -import React from 'react' -import { DragSource } from 'react-dnd' -import { getEmptyImage } from 'react-dnd-html5-backend' -import cn from 'classnames' -import compose from './compose' -import { accessor } from '../../utils/propTypes' -import { accessor as get } from '../../utils/accessors' - -import BigCalendar from '../../index' - -class DraggableEventWrapper extends React.Component { - static contextTypes = { - components: PropTypes.object, - draggableAccessor: accessor, - resizableAccessor: accessor, - } - - static propTypes = { - event: PropTypes.object.isRequired, - - connectDragSource: PropTypes.func.isRequired, - connectTopDragPreview: PropTypes.func.isRequired, - connectTopDragSource: PropTypes.func.isRequired, - connectBottomDragPreview: PropTypes.func.isRequired, - connectBottomDragSource: PropTypes.func.isRequired, - connectLeftDragPreview: PropTypes.func.isRequired, - connectLeftDragSource: PropTypes.func.isRequired, - connectRightDragPreview: PropTypes.func.isRequired, - connectRightDragSource: PropTypes.func.isRequired, - - draggable: PropTypes.bool, - allDay: PropTypes.bool, - isRow: PropTypes.bool, - continuesPrior: PropTypes.bool, - continuesAfter: PropTypes.bool, - isDragging: PropTypes.bool, - isResizing: PropTypes.bool, - } - - componentDidMount() { - // this is needed to prevent the backend from - // screenshot'ing the event during a resize which - // would be very confusing visually - const emptyImage = getEmptyImage() - const previewOptions = { captureDraggingState: true } - this.props.connectTopDragPreview(emptyImage, previewOptions) - this.props.connectBottomDragPreview(emptyImage, previewOptions) - this.props.connectLeftDragPreview(emptyImage, previewOptions) - this.props.connectRightDragPreview(emptyImage, previewOptions) - } - - render() { - const { components } = this.context - const EventWrapper = - components.eventWrapper || BigCalendar.components.eventWrapper - - let { - connectDragSource, - connectTopDragSource, - connectBottomDragSource, - connectLeftDragSource, - connectRightDragSource, - isDragging, - isResizing, - children, - event, - allDay, - isRow, - continuesPrior, - continuesAfter, - } = this.props - - let { draggableAccessor, resizableAccessor } = this.context - - let isDraggable = draggableAccessor ? !!get(event, draggableAccessor) : true - - /* Event is not draggable, no need to wrap it */ - if (!isDraggable) { - return children - } - - let StartAnchor = null, - EndAnchor = null - - /* - * The resizability of events depends on whether they are - * allDay events and how they are displayed. - * - * 1. If the event is being shown in an event row (because - * it is an allDay event shown in the header row or because as - * in month view the view is showing all events as rows) then we - * allow east-west resizing. - * - * 2. Otherwise the event is being displayed - * normally, we can drag it north-south to resize the times. - * - * See `DropWrappers` for handling of the drop of such events. - * - * Notwithstanding the above, we never show drag anchors for - * events which continue beyond current component. This happens - * in the middle of events when showMultiDay is true, and to - * events at the edges of the calendar's min/max location. - */ - - let isResizable = resizableAccessor ? !!get(event, resizableAccessor) : true - - if (isResizable) { - if (isRow || allDay) { - const anchor = ( -
-
-
- ) - StartAnchor = !continuesPrior && connectLeftDragSource(anchor) - EndAnchor = !continuesAfter && connectRightDragSource(anchor) - } else { - const anchor = ( -
-
-
- ) - StartAnchor = !continuesPrior && connectTopDragSource(anchor) - EndAnchor = !continuesAfter && connectBottomDragSource(anchor) - } - - /* - * props.children is the singular component. - * BigCalendar positions the Event abolutely and we - * need the anchors to be part of that positioning. - * So we insert the anchors inside the Event's children - * rather than wrap the Event here as the latter approach - * would lose the positioning. - */ - const childrenWithAnchors = ( -
- {StartAnchor} - {children.props.children} - {EndAnchor} -
- ) - - children = React.cloneElement(children, { - className: cn( - children.props.className, - isDragging && 'rbc-addons-dnd-dragging', - isResizing && 'rbc-addons-dnd-resizing' - ), - children: childrenWithAnchors, // replace original event child with anchor-embellished child - }) - } - - return ( - - {connectDragSource(children)} - - ) - } -} - -/* drag sources */ -const makeEventSource = anchor => ({ - beginDrag: ({ event }) => ({ event, anchor }), - //canDrag: ({ event }) => true, // support per-event dragability/sizability -}) - -export default compose( - DragSource('event', makeEventSource('drop'), (connect, monitor) => ({ - connectDragSource: connect.dragSource(), - isDragging: monitor.isDragging(), - })), - DragSource('event', makeEventSource('resizeTop'), (connect, monitor) => ({ - connectTopDragSource: connect.dragSource(), - connectTopDragPreview: connect.dragPreview(), - isResizing: monitor.isDragging(), - })), - DragSource('event', makeEventSource('resizeBottom'), (connect, monitor) => ({ - connectBottomDragSource: connect.dragSource(), - connectBottomDragPreview: connect.dragPreview(), - isResizing: monitor.isDragging(), - })), - DragSource('event', makeEventSource('resizeLeft'), (connect, monitor) => ({ - connectLeftDragSource: connect.dragSource(), - connectLeftDragPreview: connect.dragPreview(), - isResizing: monitor.isDragging(), - })), - DragSource('event', makeEventSource('resizeRight'), (connect, monitor) => ({ - connectRightDragSource: connect.dragSource(), - connectRightDragPreview: connect.dragPreview(), - isResizing: monitor.isDragging(), - })) -)(DraggableEventWrapper) diff --git a/src/addons/dragAndDrop/DropWrappers.js b/src/addons/dragAndDrop/DropWrappers.js deleted file mode 100644 index 210549a27..000000000 --- a/src/addons/dragAndDrop/DropWrappers.js +++ /dev/null @@ -1,233 +0,0 @@ -import PropTypes from 'prop-types' -import React from 'react' -import { DropTarget } from 'react-dnd' -import cn from 'classnames' -import noop from 'lodash/noop' - -import { accessor } from '../../utils/propTypes' -import { accessor as get } from '../../utils/accessors' -import dates from '../../utils/dates' -import BigCalendar from '../../index' - -function getEventDropProps(start, end, dropDate, droppedInAllDay) { - // Calculate duration between original start and end dates - const duration = dates.diff(start, end) - - /* - * If the event is dropped in a "Day" cell, preserve an event's start time by extracting the hours and minutes off - * the original start date and add it to newDate.value - * - * note: this behavior remains for backward compatibility, but might be counter-intuitive to some: - * dragging an event from the grid to the day header might more commonly mean "make this an allDay event - * on that day" - but the behavior here implements "keep the times of the event, but move it to the - * new day". - * - * To permit either interpretation, we embellish a new `allDay` parameter which determines whether the - * event was dropped on the day header or not. - */ - - const nextStart = droppedInAllDay ? dates.merge(dropDate, start) : dropDate - const nextEnd = dates.add(nextStart, duration, 'milliseconds') - - return { - start: nextStart, - end: nextEnd, - allDay: droppedInAllDay, - } -} - -class DropWrapper extends React.Component { - static propTypes = { - connectDropTarget: PropTypes.func.isRequired, - isOver: PropTypes.bool, - range: PropTypes.arrayOf(PropTypes.instanceOf(Date)), - type: PropTypes.string, - value: PropTypes.instanceOf(Date), - } - - static contextTypes = { - onEventDrop: PropTypes.func, - onEventResize: PropTypes.func, - components: PropTypes.object, - dragDropManager: PropTypes.object, - startAccessor: accessor, - endAccessor: accessor, - allDayAccessor: accessor, - step: PropTypes.number, - } - - // TODO: this is WIP to retain the drag offset so the - // drag target better tracks the mouseDown location, not - // just the top of the event. - // - // constructor(...args) { - // super(...args); - // this.state = { isOver: false }; - // } - // - // componentWillMount() { - // let monitor = this.context.dragDropManager.getMonitor() - // - // this.monitor = monitor - // - // this.unsubscribeToStateChange = monitor - // .subscribeToStateChange(this.handleStateChange) - // - // this.unsubscribeToOffsetChange = monitor - // .subscribeToOffsetChange(this.handleOffsetChange) - // } - // - // componentWillUnmount() { - // this.monitor = null - // this.unsubscribeToStateChange() - // this.unsubscribeToOffsetChange() - // } - // - // handleStateChange = () => { - // const event = this.monitor.getItem(); - // if (!event && this.state.isOver) { - // this.setState({ isOver: false }); - // } - // } - // - // handleOffsetChange = () => { - // const { value } = this.props; - // const { start, end } = this.monitor.getItem(); - // - // const isOver = dates.inRange(value, start, end, 'minute'); - // if (this.state.isOver !== isOver) { - // this.setState({ isOver }); - // } - // }; - - render() { - const { - connectDropTarget, - children, - isOver, - range, - type, - value, - } = this.props - - // Check if wrapper component of this type was passed in, otherwise use library default - const { components } = this.context - const BackgroundWrapper = components[type] || BigCalendar.components[type] - const backgroundWrapperProps = { - value, - } - - if (range) { - backgroundWrapperProps.range = range - } - - let resultingChildren = children - if (isOver) { - resultingChildren = React.cloneElement(children, { - className: cn(children.props.className, 'rbc-addons-dnd-over'), - }) - } - - return ( - - {connectDropTarget(resultingChildren)} - - ) - } -} - -function createDropWrapper(type) { - function collectTarget(connect, monitor) { - return { - type, - connectDropTarget: connect.dropTarget(), - isOver: monitor.isOver(), - } - } - - const dropTarget = { - drop(_, monitor, { props, context }) { - const itemType = monitor.getItemType() - if (itemType !== 'event') return - - const item = monitor.getItem() - const { event, anchor } = item - const { value, resource } = props - const { - onEventDrop = noop, - onEventResize = noop, - startAccessor, - endAccessor, - allDayAccessor, - step, - } = context - - let start = get(event, startAccessor) - let end = get(event, endAccessor) - let allDay = get(event, allDayAccessor) - let droppedInAllDay = type === 'dateCellWrapper' - - switch (anchor) { - case 'drop': - onEventDrop({ - event, - ...getEventDropProps(start, end, value, droppedInAllDay), - resourceId: resource, - }) - return // all the other cases issue resize action... - - // the remaining cases are all resizes... - - case 'resizeTop': - // dragging the top means the event isn't an allDay - // dropping into the header changes the date, preserves the time - // dropping elsewhere is just a normal resize - start = droppedInAllDay ? dates.merge(value, start) : value - break - - case 'resizeBottom': - // dragging the bottom means the event isn't an allDay - // dropping into the header changes the date, preserves the time - // dropping elsewhere is just a normal resize - // ... but end dates are exclusive so advance it the next slot (e.g. just past the end of this one) - end = droppedInAllDay - ? dates.merge(value, end) - : dates.add(value, step, 'minutes') - break - - case 'resizeLeft': - // dragging the left means we're dragging something from an event row - // all cases are the same: - // preserve its start time, but change the date (works for both allDay and non-allDay) - start = dates.merge(value, start) - break - - case 'resizeRight': - // dragging the right means we're dragging something from an event row - // this case is tricky: for non-allDay events, we just want to change - // the end date (preserving the end time). For allDay events, we want to change - // the end date to one day later than the drop date because end dates are exclusive - end = allDay ? dates.add(value, 1, 'day') : dates.merge(value, end) - break - - default: - return // don't issue resize - } - - // fall here for all of the resize cases - // note: the 'drop' param is here for backward compatibility - maybe remove in future? - onEventResize('drop', { - event, - start, - end, - resourceId: resource, - allDay: droppedInAllDay, - }) - }, - } - - return DropTarget('event', dropTarget, collectTarget)(DropWrapper) -} - -export const DroppableDateCellWrapper = createDropWrapper('dateCellWrapper') -export const DroppableDayWrapper = createDropWrapper('dayWrapper') diff --git a/src/addons/dragAndDrop/EventContainerWrapper.js b/src/addons/dragAndDrop/EventContainerWrapper.js new file mode 100644 index 000000000..06117cd14 --- /dev/null +++ b/src/addons/dragAndDrop/EventContainerWrapper.js @@ -0,0 +1,265 @@ +import PropTypes from 'prop-types' +import React from 'react' +import dates from '../../utils/dates' +import { findDOMNode } from 'react-dom' + +import Selection, { + getBoundsForNode, + getEventNodeFromPoint, +} from '../../Selection' +import TimeGridEvent from '../../TimeGridEvent' +import { dragAccessors } from './common' +import NoopWrapper from '../../NoopWrapper' + +const pointerInColumn = (node, x, y) => { + const { left, right, top } = getBoundsForNode(node) + return x < right + 10 && x > left && (y == null || y > top) +} +const propTypes = {} + +class EventContainerWrapper extends React.Component { + static propTypes = { + accessors: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + getters: PropTypes.object.isRequired, + localizer: PropTypes.object.isRequired, + slotMetrics: PropTypes.object.isRequired, + resource: PropTypes.any, + } + + static contextTypes = { + onEventDrop: PropTypes.func, + onEventResize: PropTypes.func, + dragAndDropAction: PropTypes.object, + onMove: PropTypes.func, + onResize: PropTypes.func, + } + + constructor(...args) { + super(...args) + this.state = {} + } + + componentDidMount() { + this._selectable() + } + + componentWillUnmount() { + this._teardownSelectable() + } + + reset() { + if (this.state.event) + this.setState({ event: null, top: null, height: null }) + } + + update(event, { startDate, endDate, top, height }) { + this.setState() + + const { event: lastEvent } = this.state + if ( + lastEvent && + startDate === lastEvent.start && + endDate === lastEvent.end + ) { + return + } + + this.setState({ + top, + height, + event: { ...event, start: startDate, end: endDate }, + }) + } + + handleMove = ({ event }, point, node) => { + const { slotMetrics } = this.props + + if (!pointerInColumn(node, point.x, point.y)) { + this.reset() + return + } + + let currentSlot = slotMetrics.closestSlotFromPoint( + { y: point.y - this.eventOffsetTop, x: point.x }, + getBoundsForNode(node) + ) + + let end = dates.add( + currentSlot, + dates.diff(event.start, event.end, 'minutes'), + 'minutes' + ) + + this.update(event, slotMetrics.getRange(currentSlot, end)) + } + + handleResize({ event, direction }, point, node) { + let start, end + const { accessors, slotMetrics } = this.props + const bounds = getBoundsForNode(node) + + let currentSlot = slotMetrics.closestSlotFromPoint(point, bounds) + if (direction === 'UP') { + end = accessors.end(event) + start = dates.min(currentSlot, slotMetrics.closestSlotFromDate(end, -1)) + } else if (direction === 'DOWN') { + start = accessors.start(event) + end = dates.max(currentSlot, slotMetrics.closestSlotFromDate(start)) + } + + this.update(event, slotMetrics.getRange(start, end)) + } + + _selectable = () => { + let node = findDOMNode(this) + let selector = (this._selector = new Selection(() => + node.closest('.rbc-time-view') + )) + + selector.on('beforeSelect', point => { + const { action } = this.context.dragAndDropAction + const eventNode = getEventNodeFromPoint(node, point) + + if (!eventNode) return false + this.eventOffsetTop = point.y - getBoundsForNode(eventNode).top + + return ( + action === 'move' || + (action === 'resize' && pointerInColumn(node, point.x, point.y)) + ) + }) + + let handler = box => { + const { dragAndDropAction } = this.context + + switch (dragAndDropAction.action) { + case 'move': + this.handleMove(dragAndDropAction, box, node) + break + case 'resize': + this.handleResize(dragAndDropAction, box, node) + break + } + } + + selector.on('selecting', handler) + + selector.on('select', () => { + const { dragAndDropAction } = this.context + + switch (dragAndDropAction.action) { + case 'move': + this.handleEventDrop() + break + case 'resize': + this.handleEventResize() + break + } + + this._isInitialContainer = false + }) + + selector.on('click', () => { + this._isInitialContainer = false + this.context.onMove(null) + }) + } + + handleEventDrop = () => { + if (!this.state.event) return + + const { resource } = this.props + const { start, end } = this.state.event + const { dragAndDropAction, onMove, onEventDrop } = this.context + + this.reset() + + onMove(null) + + onEventDrop({ + end, + start, + event: dragAndDropAction.event, + resourceId: resource, + }) + } + + handleEventResize = () => { + const { event } = this.state + + const { dragAndDropAction, onResize, onEventResize } = this.context + + this.reset() + + onResize(null) + + onEventResize({ + event: dragAndDropAction.event, + start: event.start, + end: event.end, + }) + } + + _teardownSelectable = () => { + if (!this._selector) return + this._selector.teardown() + this._selector = null + } + + render() { + const { + children, + accessors, + components, + getters, + slotMetrics, + localizer, + } = this.props + + let { event, top, height } = this.state + + if (!event) return children + + const events = children.props.children + const { start, end } = event + + let label + let format = 'eventTimeRangeFormat' + + const startsBeforeDay = slotMetrics.startsBeforeDay(start) + const startsAfterDay = slotMetrics.startsAfterDay(end) + + if (startsBeforeDay) format = 'eventTimeRangeEndFormat' + else if (startsAfterDay) format = 'eventTimeRangeStartFormat' + + if (startsBeforeDay && startsAfterDay) label = localizer.messages.allDay + else label = localizer.format({ start, end }, format) + + return React.cloneElement(children, { + children: ( + + {events} + + {event && ( + + )} + + ), + }) + } +} + +EventContainerWrapper.propTypes = propTypes + +export default EventContainerWrapper diff --git a/src/addons/dragAndDrop/EventWrapper.js b/src/addons/dragAndDrop/EventWrapper.js new file mode 100644 index 000000000..3e3875037 --- /dev/null +++ b/src/addons/dragAndDrop/EventWrapper.js @@ -0,0 +1,168 @@ +import PropTypes from 'prop-types' +import React from 'react' +import cn from 'classnames' +import { accessor } from '../../utils/propTypes' +import { accessor as get } from '../../utils/accessors' + +import BigCalendar from '../../index' + +class EventWrapper extends React.Component { + static contextTypes = { + components: PropTypes.object, + draggableAccessor: accessor, + resizableAccessor: accessor, + onMove: PropTypes.func.isRequired, + onResize: PropTypes.func.isRequired, + dragAndDropAction: PropTypes.object, + } + + static propTypes = { + type: PropTypes.oneOf(['date', 'time']), + event: PropTypes.object.isRequired, + + draggable: PropTypes.bool, + allDay: PropTypes.bool, + isRow: PropTypes.bool, + continuesPrior: PropTypes.bool, + continuesAfter: PropTypes.bool, + isDragging: PropTypes.bool, + isResizing: PropTypes.bool, + } + + handleResizeUp = e => { + if (e.button !== 0) return + e.stopPropagation() + this.context.onResize(this.props.event, 'UP') + } + handleResizeDown = e => { + if (e.button !== 0) return + e.stopPropagation() + this.context.onResize(this.props.event, 'DOWN') + } + handleResizeLeft = e => { + if (e.button !== 0) return + e.stopPropagation() + this.context.onResize(this.props.event, 'LEFT') + } + handleResizeRight = e => { + if (e.button !== 0) return + e.stopPropagation() + this.context.onResize(this.props.event, 'RIGHT') + } + handleStartDragging = e => { + if (e.button === 0) this.context.onMove(this.props.event) + } + + renderAnchor(direction) { + const cls = direction === 'Up' || direction === 'Down' ? 'ns' : 'ew' + return ( +
+
+
+ ) + } + + render() { + const { components } = this.context + const EventWrapper = + components.eventWrapper || BigCalendar.components.eventWrapper + + let { + isResizing, + children, + event, + allDay, + type, + continuesPrior, + continuesAfter, + } = this.props + + if (event.__isPreview) + return React.cloneElement(children, { + className: cn(children.props.className, 'rbc-addons-dnd-drag-preview'), + }) + + let { draggableAccessor, resizableAccessor } = this.context + + let isDraggable = draggableAccessor ? !!get(event, draggableAccessor) : true + + /* Event is not draggable, no need to wrap it */ + if (!isDraggable) { + return children + } + + let StartAnchor = null, + EndAnchor = null + + /* + * The resizability of events depends on whether they are + * allDay events and how they are displayed. + * + * 1. If the event is being shown in an event row (because + * it is an allDay event shown in the header row or because as + * in month view the view is showing all events as rows) then we + * allow east-west resizing. + * + * 2. Otherwise the event is being displayed + * normally, we can drag it north-south to resize the times. + * + * See `DropWrappers` for handling of the drop of such events. + * + * Notwithstanding the above, we never show drag anchors for + * events which continue beyond current component. This happens + * in the middle of events when showMultiDay is true, and to + * events at the edges of the calendar's min/max location. + */ + + let isResizable = resizableAccessor ? !!get(event, resizableAccessor) : true + + if (isResizable) { + if (type === 'date') { + StartAnchor = !continuesPrior && this.renderAnchor('Left') + EndAnchor = !continuesAfter && this.renderAnchor('Right') + } else { + StartAnchor = !continuesPrior && this.renderAnchor('Up') + EndAnchor = !continuesAfter && this.renderAnchor('Down') + } + + const isDragging = this.context.dragAndDropAction.event === event + + /* + * props.children is the singular component. + * BigCalendar positions the Event abolutely and we + * need the anchors to be part of that positioning. + * So we insert the anchors inside the Event's children + * rather than wrap the Event here as the latter approach + * would lose the positioning. + */ + children = React.cloneElement(children, { + onMouseDown: this.handleStartDragging, + onTouchStart: this.handleStartDragging, + className: cn( + children.props.className, + isDragging && 'rbc-addons-dnd-dragging', + isResizing && 'rbc-addons-dnd-resizing' + ), + // replace original event child with anchor-embellished child + children: ( +
+ {StartAnchor} + {children.props.children} + {EndAnchor} +
+ ), + }) + } + + return ( + + {children} + + ) + } +} + +export default EventWrapper diff --git a/src/addons/dragAndDrop/WeekWrapper.js b/src/addons/dragAndDrop/WeekWrapper.js new file mode 100644 index 000000000..d3379e733 --- /dev/null +++ b/src/addons/dragAndDrop/WeekWrapper.js @@ -0,0 +1,284 @@ +import PropTypes from 'prop-types' +import React from 'react' +import dates from '../../utils/dates' +import { getSlotAtX, pointInBox } from '../../utils/selection' +import { findDOMNode } from 'react-dom' + +import { eventSegments } from '../../utils/eventLevels' +import Selection, { getBoundsForNode } from '../../Selection' +import EventRow from '../../EventRow' +import { dragAccessors } from './common' + +const propTypes = {} + +const eventTimes = (event, accessors) => { + let start = accessors.start(event) + let end = accessors.end(event) + + const isZeroDuration = + dates.eq(start, end, 'minutes') && start.getMinutes() === 0 + // make zero duration midnight events at least one day long + if (isZeroDuration) end = dates.add(end, 1, 'day') + return { start, end } +} + +class WeekWrapper extends React.Component { + static propTypes = { + isAllDay: PropTypes.bool, + slotMetrics: PropTypes.object.isRequired, + accessors: PropTypes.object.isRequired, + getters: PropTypes.object.isRequired, + components: PropTypes.object.isRequired, + resourceId: PropTypes.any, + } + + static contextTypes = { + onEventDrop: PropTypes.func, + onEventResize: PropTypes.func, + + onMove: PropTypes.func, + onResize: PropTypes.func, + dragAndDropAction: PropTypes.object, + } + + constructor(...args) { + super(...args) + this.state = {} + } + + componentDidMount() { + this._selectable() + } + + componentWillUnmount() { + this._teardownSelectable() + } + + reset() { + if (this.state.segment) this.setState({ segment: null }) + } + + update(event, start, end) { + const segment = eventSegments( + { ...event, end, start, __isPreview: true }, + this.props.slotMetrics.range, + dragAccessors + ) + + const { segment: lastSegment } = this.state + if ( + lastSegment && + segment.span === lastSegment.span && + segment.left === lastSegment.left && + segment.right === lastSegment.right + ) { + return + } + this.setState({ segment }) + } + + handleMove = ({ event }, { x, y }, node) => { + const metrics = this.props.slotMetrics + const { accessors } = this.props + + if (!event) return + + let rowBox = getBoundsForNode(node) + + if (!pointInBox(rowBox, { x, y })) { + this.reset() + return + } + + // Make sure to maintain the time of the start date while moving it to the new slot + let start = dates.merge( + metrics.getDateForSlot(getSlotAtX(rowBox, x, false, metrics.slots)), + accessors.start(event) + ) + + let end = dates.add( + start, + dates.diff(accessors.start(event), accessors.end(event), 'minutes'), + 'minutes' + ) + + this.update(event, start, end) + } + + handleResize({ event, direction }, point, node) { + const { accessors, slotMetrics: metrics } = this.props + + let { start, end } = eventTimes(event, accessors) + + let rowBox = getBoundsForNode(node) + let cursorInRow = pointInBox(rowBox, point) + + if (direction === 'RIGHT') { + if (cursorInRow) { + if (metrics.last < start) return this.reset() + // add min + end = dates.add( + metrics.getDateForSlot( + getSlotAtX(rowBox, point.x, false, metrics.slots) + ), + 1, + 'day' + ) + } else if ( + dates.inRange(start, metrics.first, metrics.last) || + (rowBox.bottom < point.y && +metrics.first > +start) + ) { + end = dates.add(metrics.last, 1, 'milliseconds') + } else { + this.setState({ segment: null }) + return + } + + end = dates.max(end, dates.add(start, 1, 'day')) + } else if (direction === 'LEFT') { + // inbetween Row + if (cursorInRow) { + if (metrics.first > end) return this.reset() + + start = metrics.getDateForSlot( + getSlotAtX(rowBox, point.x, false, metrics.slots) + ) + } else if ( + dates.inRange(end, metrics.first, metrics.last) || + (rowBox.top > point.y && +metrics.last < +end) + ) { + start = dates.add(metrics.first, -1, 'milliseconds') + } else { + this.reset() + return + } + + start = dates.min(dates.add(end, -1, 'day'), start) + } + + this.update(event, start, end) + } + + _selectable = () => { + let node = findDOMNode(this).closest('.rbc-month-row, .rbc-allday-cell') + let container = node.closest('.rbc-month-view, .rbc-time-view') + + let selector = (this._selector = new Selection(() => container)) + + selector.on('beforeSelect', point => { + const { isAllDay } = this.props + const { action } = this.context.dragAndDropAction + + return ( + action === 'move' || + (action === 'resize' && + (!isAllDay || pointInBox(getBoundsForNode(node), point))) + ) + }) + + let handler = box => { + const { dragAndDropAction } = this.context + + switch (dragAndDropAction.action) { + case 'move': + this.handleMove(dragAndDropAction, box, node) + break + case 'resize': + this.handleResize(dragAndDropAction, box, node) + break + } + } + + selector.on('selecting', handler) + selector.on('selectStart', handler) + + selector.on('select', box => { + const { dragAndDropAction } = this.context + + switch (dragAndDropAction.action) { + case 'move': + this.handleEventDrop() + break + case 'resize': + this.handleEventResize(box, node) + break + } + }) + + selector.on('click', () => { + this.context.onMove(null) + }) + } + + handleEventResize = (box, node) => { + const { segment } = this.state + + if (!segment || !pointInBox(getBoundsForNode(node), box)) return + const { dragAndDropAction, onResize, onEventResize } = this.context + + this.reset() + + onResize(null) + + onEventResize({ + event: dragAndDropAction.event, + start: segment.event.start, + end: segment.event.end, + }) + } + + handleEventDrop = () => { + const { resourceId } = this.props + const { segment } = this.state + + if (!segment) return + const { dragAndDropAction, onMove, onEventDrop } = this.context + + this.reset() + + onMove(null) + + onEventDrop({ + resourceId, + event: dragAndDropAction.event, + start: segment.event.start, + end: segment.event.end, + isAllDay: true, + }) + } + + _teardownSelectable = () => { + if (!this._selector) return + this._selector.teardown() + this._selector = null + } + + render() { + const { children, accessors } = this.props + + let { segment } = this.state + + return ( +
+ {children} + + {segment && ( + + )} +
+ ) + } +} + +WeekWrapper.propTypes = propTypes + +export default WeekWrapper diff --git a/src/addons/dragAndDrop/common.js b/src/addons/dragAndDrop/common.js new file mode 100644 index 000000000..6e52746fc --- /dev/null +++ b/src/addons/dragAndDrop/common.js @@ -0,0 +1,6 @@ +import { wrapAccessor } from '../../utils/accessors' + +export const dragAccessors = { + start: wrapAccessor(e => e.start), + end: wrapAccessor(e => e.end), +} diff --git a/src/addons/dragAndDrop/compose.js b/src/addons/dragAndDrop/compose.js deleted file mode 100644 index b06708985..000000000 --- a/src/addons/dragAndDrop/compose.js +++ /dev/null @@ -1,11 +0,0 @@ -export default function compose(...funcs) { - if (funcs.length === 0) { - return arg => arg - } - - if (funcs.length === 1) { - return funcs[0] - } - - return funcs.reduce((a, b) => (...args) => a(b(...args))) -} diff --git a/src/addons/dragAndDrop/styles.less b/src/addons/dragAndDrop/styles.less index 7f790a185..87bf3456b 100644 --- a/src/addons/dragAndDrop/styles.less +++ b/src/addons/dragAndDrop/styles.less @@ -1,15 +1,22 @@ @import '../../less/variables.less'; .rbc-addons-dnd { - .rbc-row-content { - pointer-events: none; + .rbc-addons-dnd-row-body { + position: relative; + } + .rbc-addons-dnd-drag-row { + position: absolute; + top: 0; + left: 0; + right: 0; + } - & .rbc-show-more, - & .rbc-event { - pointer-events: all; - } + .rbc-addons-dnd-dragging { + opacity: .25; + touch-action: manipulation; } + .rbc-addons-dnd-over { background-color: rgba( red(@date-selection-bg-color), @@ -19,21 +26,15 @@ ); } - .rbc-events-container { - pointer-events: none; - } - .rbc-event { transition: opacity 150ms; - pointer-events: all; &:hover { .rbc-addons-dnd-resize-ns-icon, .rbc-addons-dnd-resize-ew-icon { display: block; } } } - &.rbc-addons-dnd-is-dragging .rbc-event { - pointer-events: none; + &.rbc-addons-dnd-is-dragging .rbc-event:not(.rbc-addons-dnd-dragging):not(.rbc-addons-dnd-drag-preview) { opacity: .50; } diff --git a/src/addons/dragAndDrop/withDragAndDrop.js b/src/addons/dragAndDrop/withDragAndDrop.js index 3771c7b5b..20054d660 100644 --- a/src/addons/dragAndDrop/withDragAndDrop.js +++ b/src/addons/dragAndDrop/withDragAndDrop.js @@ -1,19 +1,11 @@ import PropTypes from 'prop-types' import React from 'react' -import { DragDropContext } from 'react-dnd' import cn from 'classnames' import { accessor } from '../../utils/propTypes' -import DraggableEventWrapper from './DraggableEventWrapper' -import { DroppableDayWrapper, DroppableDateCellWrapper } from './DropWrappers' - -let html5Backend - -try { - html5Backend = require('react-dnd-html5-backend') -} catch (err) { - /* optional dep missing */ -} +import EventWrapper from './EventWrapper' +import EventContainerWrapper from './EventContainerWrapper' +import WeekWrapper from './WeekWrapper' /** * Creates a higher-order component (HOC) supporting drag & drop and optionally resizing @@ -55,10 +47,7 @@ try { * @param {*} Calendar * @param {*} backend */ -export default function withDragAndDrop( - Calendar, - { backend = html5Backend } = {} -) { +export default function withDragAndDrop(Calendar) { class DragAndDropCalendar extends React.Component { static propTypes = { onEventDrop: PropTypes.func, @@ -92,9 +81,11 @@ export default function withDragAndDrop( static childContextTypes = { onEventDrop: PropTypes.func, onEventResize: PropTypes.func, + onMove: PropTypes.func, + onResize: PropTypes.func, + dragAndDropAction: PropTypes.object, + components: PropTypes.object, - startAccessor: accessor, - endAccessor: accessor, draggableAccessor: accessor, resizableAccessor: accessor, step: PropTypes.number, @@ -104,44 +95,35 @@ export default function withDragAndDrop( return { onEventDrop: this.props.onEventDrop, onEventResize: this.props.onEventResize, - components: this.props.components, - startAccessor: this.props.startAccessor, - endAccessor: this.props.endAccessor, step: this.props.step, + components: this.props.components, draggableAccessor: this.props.draggableAccessor, resizableAccessor: this.props.resizableAccessor, - } - } - constructor(...args) { - super(...args) - this.state = { isDragging: false } - } + onResize: (event, direction) => + this.setState({ + dragAndDropAction: event + ? { action: 'resize', event, direction } + : {}, + }), - componentWillMount() { - let monitor = this.context.dragDropManager.getMonitor() - this.monitor = monitor - this.unsubscribeToStateChange = monitor.subscribeToStateChange( - this.handleStateChange - ) - } + onMove: event => + this.setState({ + dragAndDropAction: event ? { action: 'move', event } : {}, + }), - componentWillUnmount() { - this.monitor = null - this.unsubscribeToStateChange() + dragAndDropAction: this.state.dragAndDropAction, + } } - handleStateChange = () => { - const isDragging = !!this.monitor.getItem() - - if (isDragging !== this.state.isDragging) { - setTimeout(() => this.setState({ isDragging })) - } + constructor(...args) { + super(...args) + this.state = { isDragging: false, dragAndDropAction: {} } } render() { const { selectable, components, ...props } = this.props - + const { dragAndDropAction } = this.state delete props.onEventDrop delete props.onEventResize @@ -150,23 +132,19 @@ export default function withDragAndDrop( props.className = cn( props.className, 'rbc-addons-dnd', - this.state.isDragging && 'rbc-addons-dnd-is-dragging' + dragAndDropAction.action && 'rbc-addons-dnd-is-dragging' ) props.components = { ...components, - dateCellWrapper: DroppableDateCellWrapper, - dayWrapper: DroppableDayWrapper, - eventWrapper: DraggableEventWrapper, + eventWrapper: EventWrapper, + eventContainerWrapper: EventContainerWrapper, + weekWrapper: WeekWrapper, } return } } - if (backend === false) { - return DragAndDropCalendar - } else { - return DragDropContext(backend)(DragAndDropCalendar) - } + return DragAndDropCalendar } diff --git a/src/formats.js b/src/formats.js deleted file mode 100644 index da29d5163..000000000 --- a/src/formats.js +++ /dev/null @@ -1,61 +0,0 @@ -import dates from './utils/dates' - -function inSame12Hr(start, end) { - let s = 12 - dates.hours(start) - let e = 12 - dates.hours(end) - return (s <= 0 && e <= 0) || (s >= 0 && e >= 0) -} - -let dateRangeFormat = ({ start, end }, culture, local) => - local.format(start, 'd', culture) + ' — ' + local.format(end, 'd', culture) - -let timeRangeFormat = ({ start, end }, culture, local) => - local.format(start, 'h:mmtt', culture) + - ' — ' + - local.format(end, inSame12Hr(start, end) ? 'h:mm' : 'h:mmtt', culture) - -let timeRangeStartFormat = ({ start, end }, culture, local) => - local.format(start, 'h:mmtt', culture) + ' — ' - -let timeRangeEndFormat = ({ start, end }, culture, local) => - ' — ' + local.format(end, 'h:mmtt', culture) - -let weekRangeFormat = ({ start, end }, culture, local) => - local.format(start, 'MMM dd', culture) + - ' - ' + - local.format(end, dates.eq(start, end, 'month') ? 'dd' : 'MMM dd', culture) - -let formats = { - dateFormat: 'dd', - dayFormat: 'ddd dd/MM', - weekdayFormat: 'ddd', - - selectRangeFormat: timeRangeFormat, - eventTimeRangeFormat: timeRangeFormat, - eventTimeRangeStartFormat: timeRangeStartFormat, - eventTimeRangeEndFormat: timeRangeEndFormat, - - timeGutterFormat: 'h:mm tt', - - monthHeaderFormat: 'MMMM yyyy', - dayHeaderFormat: 'dddd MMM dd', - dayRangeHeaderFormat: weekRangeFormat, - agendaHeaderFormat: dateRangeFormat, - - agendaDateFormat: 'ddd MMM dd', - agendaTimeFormat: 'hh:mm tt', - agendaTimeRangeFormat: timeRangeFormat, -} - -export function set(_formats) { - if (arguments.length > 1) _formats = { [_formats]: arguments[1] } - - Object.assign(formats, _formats) -} - -export default function format(fmts) { - return { - ...formats, - ...fmts, - } -} diff --git a/src/index.js b/src/index.js index 124115110..5f87f846a 100644 --- a/src/index.js +++ b/src/index.js @@ -1,14 +1,12 @@ import Calendar from './Calendar' import EventWrapper from './EventWrapper' import BackgroundWrapper from './BackgroundWrapper' -import { set as setLocalizer } from './localizer' import momentLocalizer from './localizers/moment' import globalizeLocalizer from './localizers/globalize' import move from './utils/move' import { views, navigate } from './utils/constants' Object.assign(Calendar, { - setLocalizer, globalizeLocalizer, momentLocalizer, Views: views, diff --git a/src/less/event.less b/src/less/event.less index 513a3bcdd..c46bf3764 100644 --- a/src/less/event.less +++ b/src/less/event.less @@ -45,12 +45,3 @@ border-bottom-right-radius: 0; } -.rbc-event-continues-day-after { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -.rbc-event-continues-day-prior { - border-top-left-radius: 0; - border-top-right-radius: 0; -} diff --git a/src/less/time-column.less b/src/less/time-column.less index 008f77fd2..c682ed0a3 100644 --- a/src/less/time-column.less +++ b/src/less/time-column.less @@ -35,7 +35,8 @@ bottom: 0; left: 0; position: absolute; - right: 10px; + right: 0; + margin-right: 10px; top: 0; &.rbc-is-rtl { diff --git a/src/less/time-grid.less b/src/less/time-grid.less index 98beb3025..10612c7de 100644 --- a/src/less/time-grid.less +++ b/src/less/time-grid.less @@ -31,6 +31,10 @@ box-sizing: content-box; width: 100%; position: relative; + + } + .rbc-allday-cell + .rbc-allday-cell { + border-left: 1px solid @cell-border; } .rbc-allday-events { diff --git a/src/localizer.js b/src/localizer.js index cdaca1a63..ec97fd129 100644 --- a/src/localizer.js +++ b/src/localizer.js @@ -17,16 +17,12 @@ function _format(localizer, formatter, value, format, culture) { return result } -class DateLocalizer { +export class DateLocalizer { constructor(spec) { invariant( typeof spec.format === 'function', 'date localizer `format(..)` must be a function' ) - invariant( - typeof spec.parse === 'function', - 'date localizer `parse(..)` must be a function' - ) invariant( typeof spec.firstOfWeek === 'function', 'date localizer `firstOfWeek(..)` must be a function' @@ -34,59 +30,28 @@ class DateLocalizer { this.propType = spec.propType || localePropType - this.formats = spec.formats this.startOfWeek = spec.firstOfWeek - + this.formats = spec.formats this.format = (...args) => _format(this, spec.format, ...args) - - this.parse = (value, format, culture) => { - let result = spec.parse.call(this, value, format, culture) - - invariant( - result == null || (result instanceof Date && !isNaN(result.getTime())), - 'date localizer `parse(..)` must return a valid Date, null, or undefined' - ) - - return result - } } } -let localizer = { - parse: error, - format: error, - startOfWeek: error, -} - -export function set(newLocalizer) { - if (!newLocalizer.__isLocalizer__) { - newLocalizer = new DateLocalizer(newLocalizer) - newLocalizer.__isLocalizer__ = true +export function mergeWithDefaults( + localizer, + culture, + formatOverrides, + messages +) { + const formats = { + ...localizer.formats, + ...formatOverrides, } - localizer = newLocalizer - return localizer -} - -let exp = { - parse(...args) { - return localizer.parse(...args) - }, - - format(...args) { - return localizer.format(...args) - }, - - startOfWeek(...args) { - return localizer.startOfWeek(...args) - }, -} - -export default exp - -function error() { - throw new Error( - 'You have not selected a localization strategy for Big Calendar. ' + - 'Please use either of the two included.' - ) + return { + ...localizer, + messages, + startOfWeek: () => localizer.startOfWeek(culture), + format: (value, format) => + localizer.format(value, formats[format] || format, culture), + } } diff --git a/src/localizers/globalize.js b/src/localizers/globalize.js index 963864aa9..c5419b638 100644 --- a/src/localizers/globalize.js +++ b/src/localizers/globalize.js @@ -1,8 +1,7 @@ import dates from '../utils/dates' import oldGlobalize from './oldGlobalize' +import { DateLocalizer } from '../localizer' import warning from 'warning' -import { set } from '../formats' -import { set as setLocalizer } from '../localizer' let dateRangeFormat = ({ start, end }, culture, local) => local.format(start, { date: 'short' }, culture) + @@ -82,16 +81,9 @@ export default function(globalize) { if (!globalize.load) return oldGlobalize(globalize) - set(formats) - - return setLocalizer({ + return new DateLocalizer({ firstOfWeek, - - parse(value, format, culture) { - format = typeof format === 'string' ? { raw: format } : format - return locale(culture).parseDate(value, format) - }, - + formats, format(value, format, culture) { format = typeof format === 'string' ? { raw: format } : format return locale(culture).formatDate(value, format) diff --git a/src/localizers/moment.js b/src/localizers/moment.js index 23490055d..72cf446c9 100644 --- a/src/localizers/moment.js +++ b/src/localizers/moment.js @@ -1,6 +1,5 @@ import dates from '../utils/dates' -import { set } from '../formats' -import { set as setLocalizer } from '../localizer' +import { DateLocalizer } from '../localizer' let dateRangeFormat = ({ start, end }, culture, local) => local.format(start, 'L', culture) + ' — ' + local.format(end, 'L', culture) @@ -44,18 +43,13 @@ export let formats = { export default function(moment) { let locale = (m, c) => (c ? m.locale(c) : m) - set(formats) - - return setLocalizer({ + return new DateLocalizer({ + formats, firstOfWeek(culture) { let data = culture ? moment.localeData(culture) : moment.localeData() return data ? data.firstDayOfWeek() : 0 }, - parse(value, format, culture) { - return locale(moment(value, format), culture).toDate() - }, - format(value, format, culture) { return locale(moment(value), culture).format(format) }, diff --git a/src/localizers/oldGlobalize.js b/src/localizers/oldGlobalize.js index fb046ec0b..b866fa610 100644 --- a/src/localizers/oldGlobalize.js +++ b/src/localizers/oldGlobalize.js @@ -1,6 +1,5 @@ import dates from '../utils/dates' -import { set } from '../formats' -import { set as setLocalizer } from '../localizer' +import { DateLocalizer } from '../localizer' let dateRangeFormat = ({ start, end }, culture, local) => local.format(start, 'd', culture) + ' — ' + local.format(end, 'd', culture) @@ -51,15 +50,9 @@ export default function(globalize) { return (culture && culture.calendar.firstDay) || 0 } - set(formats) - - return setLocalizer({ + return new DateLocalizer({ firstOfWeek, - - parse(value, format, culture) { - return globalize.parseDate(value, format, culture) - }, - + formats, format(value, format, culture) { return globalize.format(value, format, culture) }, diff --git a/src/utils/DateSlotMetrics.js b/src/utils/DateSlotMetrics.js new file mode 100644 index 000000000..8e630e7b2 --- /dev/null +++ b/src/utils/DateSlotMetrics.js @@ -0,0 +1,65 @@ +import memoize from 'memoize-one' +import dates from './dates' +import { eventSegments, endOfRange, eventLevels } from './eventLevels' + +let isSegmentInSlot = (seg, slot) => seg.left <= slot && seg.right >= slot + +const isEqual = (a, b) => a.range === b.range && a.events === b.events + +export function getSlotMetrics() { + return memoize(options => { + const { range, events, maxRows, minRows, accessors } = options + let { first, last } = endOfRange(range) + + let segments = events.map(evt => eventSegments(evt, range, accessors)) + + let { levels, extra } = eventLevels(segments, Math.max(maxRows - 1, 1)) + while (levels.length < minRows) levels.push([]) + + return { + first, + last, + + levels, + extra, + range, + slots: range.length, + + clone(args) { + const metrics = getSlotMetrics() + return metrics({ ...options, ...args }) + }, + + getDateForSlot(slotNumber) { + return range[slotNumber] + }, + + getSlotForDate(date) { + return range.find(r => dates.eq(r, date, 'day')) + }, + + getEventsForSlot(slot) { + return segments + .filter(seg => isSegmentInSlot(seg, slot)) + .map(seg => seg.event) + }, + + continuesPrior(event) { + return dates.lt(accessors.start(event), first, 'day') + }, + + continuesAfter(event) { + const eventEnd = accessors.end(event) + const singleDayDuration = dates.eq( + accessors.start(event), + eventEnd, + 'minutes' + ) + + return singleDayDuration + ? dates.gte(eventEnd, last, 'minutes') + : dates.gt(eventEnd, last, 'minutes') + }, + } + }, isEqual) +} diff --git a/src/utils/DayEventLayout.js b/src/utils/DayEventLayout.js index b9e87c0d4..80610c45a 100644 --- a/src/utils/DayEventLayout.js +++ b/src/utils/DayEventLayout.js @@ -1,8 +1,7 @@ import sortBy from 'lodash/sortBy' -import { accessor as get } from './accessors' class Event { - constructor(data, { startAccessor, endAccessor, slotMetrics }) { + constructor(data, { accessors, slotMetrics }) { const { start, startDate, @@ -10,7 +9,7 @@ class Event { endDate, top, height, - } = slotMetrics.getRange(get(data, startAccessor), get(data, endAccessor)) + } = slotMetrics.getRange(accessors.start(data), accessors.end(data)) this.start = start this.end = end @@ -129,10 +128,17 @@ function sortByRender(events) { return sorted } -function getStyledEvents({ events, minimumStartDifference, ...props }) { +function getStyledEvents({ + events, + minimumStartDifference, + slotMetrics, + accessors, +}) { // Create proxy events and order them so that we don't have // to fiddle with z-indexes. - const proxies = events.map(event => new Event(event, props)) + const proxies = events.map( + event => new Event(event, { slotMetrics, accessors }) + ) const eventsInRenderOrder = sortByRender(proxies) // Group overlapping events, while keeping order. diff --git a/src/utils/TimeSlots.js b/src/utils/TimeSlots.js index 0731370c7..75f7ff2cd 100644 --- a/src/utils/TimeSlots.js +++ b/src/utils/TimeSlots.js @@ -95,12 +95,34 @@ export function getSlotMetrics({ min: start, max: end, step, timeslots }) { return slots[slot] }, + closestSlotFromPoint(point, boundaryRect) { + let range = Math.abs(boundaryRect.top - boundaryRect.bottom) + return this.closestSlotToPosition((point.y - boundaryRect.top) / range) + }, + + closestSlotFromDate(date, offset = 0) { + if (dates.lt(date, start, 'minutes')) return slots[0] + + const diffMins = dates.diff(start, date, 'minutes') + return slots[(diffMins - diffMins % step) / step + offset] + }, + + startsBeforeDay(date) { + return dates.lt(date, start, 'day') + }, + + startsAfterDay(date) { + return dates.gt(date, end, 'day') + }, + startsBefore(date) { return dates.lt(dates.merge(start, date), start, 'minutes') }, + startsAfter(date) { return dates.gt(dates.merge(end, date), end, 'minutes') }, + getRange(rangeStart, rangeEnd) { rangeStart = dates.min(end, dates.max(start, rangeStart)) rangeEnd = dates.min(end, dates.max(start, rangeEnd)) diff --git a/src/utils/accessors.js b/src/utils/accessors.js index 8becc3083..0aed6f2ed 100644 --- a/src/utils/accessors.js +++ b/src/utils/accessors.js @@ -19,3 +19,5 @@ export function accessor(data, field) { return value } + +export const wrapAccessor = acc => data => accessor(data, acc) diff --git a/src/utils/dates.js b/src/utils/dates.js index c28159797..23f6811d1 100644 --- a/src/utils/dates.js +++ b/src/utils/dates.js @@ -1,6 +1,5 @@ /* eslint no-fallthrough: off */ import dateMath from 'date-arithmetic' -import localizer from '../localizer' const MILLI = { seconds: 1000, @@ -20,21 +19,21 @@ let dates = { return MONTHS.map(i => dates.month(date, i)) }, - firstVisibleDay(date, culture) { + firstVisibleDay(date, localizer) { let firstOfMonth = dates.startOf(date, 'month') - return dates.startOf(firstOfMonth, 'week', localizer.startOfWeek(culture)) + return dates.startOf(firstOfMonth, 'week', localizer.startOfWeek()) }, - lastVisibleDay(date, culture) { + lastVisibleDay(date, localizer) { let endOfMonth = dates.endOf(date, 'month') - return dates.endOf(endOfMonth, 'week', localizer.startOfWeek(culture)) + return dates.endOf(endOfMonth, 'week', localizer.startOfWeek()) }, - visibleDays(date, culture) { - let current = dates.firstVisibleDay(date, culture), - last = dates.lastVisibleDay(date, culture), + visibleDays(date, localizer) { + let current = dates.firstVisibleDay(date, localizer), + last = dates.lastVisibleDay(date, localizer), days = [] while (dates.lte(current, last, 'day')) { diff --git a/src/utils/eventLevels.js b/src/utils/eventLevels.js index bf3af37f6..900fabc4b 100644 --- a/src/utils/eventLevels.js +++ b/src/utils/eventLevels.js @@ -1,6 +1,5 @@ import findIndex from 'lodash/findIndex' import dates from './dates' -import { accessor as get } from './accessors' export function endOfRange(dateRange, unit = 'day') { return { @@ -9,16 +8,12 @@ export function endOfRange(dateRange, unit = 'day') { } } -export function eventSegments( - event, - first, - last, - { startAccessor, endAccessor }, - range -) { +export function eventSegments(event, range, accessors) { + let { first, last } = endOfRange(range) + let slots = dates.diff(first, last, 'day') - let start = dates.max(dates.startOf(get(event, startAccessor), 'day'), first) - let end = dates.min(dates.ceil(get(event, endAccessor), 'day'), last) + let start = dates.max(dates.startOf(accessors.start(event), 'day'), first) + let end = dates.min(dates.ceil(accessors.end(event), 'day'), last) let padding = findIndex(range, x => dates.eq(x, start, 'day')) let span = dates.diff(start, end, 'day') @@ -60,9 +55,9 @@ export function eventLevels(rowSegments, limit = Infinity) { return { levels, extra } } -export function inRange(e, start, end, { startAccessor, endAccessor }) { - let eStart = dates.startOf(get(e, startAccessor), 'day') - let eEnd = get(e, endAccessor) +export function inRange(e, start, end, accessors) { + let eStart = dates.startOf(accessors.start(e), 'day') + let eEnd = accessors.end(e) let startsBeforeEnd = dates.lte(eStart, end, 'day') // when the event is zero duration we need to handle a bit differently @@ -79,31 +74,27 @@ export function segsOverlap(seg, otherSegs) { ) } -export function sortEvents( - evtA, - evtB, - { startAccessor, endAccessor, allDayAccessor } -) { +export function sortEvents(evtA, evtB, accessors) { let startSort = - +dates.startOf(get(evtA, startAccessor), 'day') - - +dates.startOf(get(evtB, startAccessor), 'day') + +dates.startOf(accessors.start(evtA), 'day') - + +dates.startOf(accessors.start(evtB), 'day') let durA = dates.diff( - get(evtA, startAccessor), - dates.ceil(get(evtA, endAccessor), 'day'), + accessors.start(evtA), + dates.ceil(accessors.end(evtA), 'day'), 'day' ) let durB = dates.diff( - get(evtB, startAccessor), - dates.ceil(get(evtB, endAccessor), 'day'), + accessors.start(evtB), + dates.ceil(accessors.end(evtB), 'day'), 'day' ) return ( startSort || // sort by start Day first Math.max(durB, 1) - Math.max(durA, 1) || // events spanning multiple days go first - !!get(evtB, allDayAccessor) - !!get(evtA, allDayAccessor) || // then allDay single day events - +get(evtA, startAccessor) - +get(evtB, startAccessor) + !!accessors.allDay(evtB) - !!accessors.allDay(evtA) || // then allDay single day events + +accessors.start(evtA) - +accessors.start(evtB) ) // then sort by start time } diff --git a/src/utils/messages.js b/src/utils/messages.js index 0fdb1a1bc..27575c345 100644 --- a/src/utils/messages.js +++ b/src/utils/messages.js @@ -1,5 +1,3 @@ -import invariant from 'invariant' - let defaultMessages = { date: 'Date', time: 'Time', @@ -19,20 +17,6 @@ let defaultMessages = { showMore: total => `+${total} more`, } -export function set(key, msg) { - invariant( - messages.hasOwnProperty(key), - `The message key: "${key}" is not a valid message name. ` + - `valid keys are: ${Object.keys(messages).join(', ')}` - ) - - messages[key] = msg -} - -export function result(msg, ...args) { - return typeof msg === 'function' ? msg(args) : msg -} - export default function messages(msgs) { return { ...defaultMessages, diff --git a/src/utils/propTypes.js b/src/utils/propTypes.js index a557b19c1..e4c935e8a 100644 --- a/src/utils/propTypes.js +++ b/src/utils/propTypes.js @@ -1,24 +1,10 @@ import PropTypes from 'prop-types' -import localizer from '../localizer' import elementType from 'react-prop-types/lib/elementType' import all from 'react-prop-types/lib/all' import { views as Views } from './constants' -import createChainableTypeChecker from 'react-prop-types/lib/utils/createChainableTypeChecker' - export { elementType } -// export contextShape = React.PropTypes.shape({ -// formats: React.PropTypes.object.isRequired, -// messages: React.PropTypes.object.isRequired, -// accessors: React.PropTypes.shape({ -// titleAccessor: accessor, -// startAccessor: accessor, -// endAccessor: accessor, -// allDayAccessor: accessor, -// }).isRequired, -// }).isRequired, - export let eventComponent = PropTypes.oneOfType([ elementType, PropTypes.shape({ @@ -33,9 +19,7 @@ let viewNames = Object.keys(Views).map(k => Views[k]) export let accessor = PropTypes.oneOfType([PropTypes.string, PropTypes.func]) -export let dateFormat = createChainableTypeChecker( - (...args) => localizer.propType && localizer.propType(...args) -) +export let dateFormat = PropTypes.any export let dateRangeFormat = PropTypes.func diff --git a/src/utils/selection.js b/src/utils/selection.js index a9c27024f..2756279c7 100644 --- a/src/utils/selection.js +++ b/src/utils/selection.js @@ -10,7 +10,8 @@ export function slotWidth(rowBox, slots) { return cellWidth } -export function getCellAtX(rowBox, x, cellWidth, rtl, slots) { +export function getSlotAtX(rowBox, x, rtl, slots) { + const cellWidth = slotWidth(rowBox, slots) return rtl ? slots - 1 - Math.floor((x - rowBox.left) / cellWidth) : Math.floor((x - rowBox.left) / cellWidth) @@ -28,7 +29,7 @@ export function dateCellSelection(start, rowBox, box, slots, rtl) { let cellWidth = slotWidth(rowBox, slots) // cell under the mouse - let currentSlot = getCellAtX(rowBox, box.x, cellWidth, rtl, slots) + let currentSlot = getSlotAtX(rowBox, box.x, rtl, slots) // Identify row as either the initial row // or the row under the current mouse point diff --git a/stories/Calendar.js b/stories/Calendar.js index 93133d032..a88834371 100644 --- a/stories/Calendar.js +++ b/stories/Calendar.js @@ -2,540 +2,120 @@ import { storiesOf, action } from '@storybook/react' import moment from 'moment' import React from 'react' -import Calendar from '../src' -import momentLocalizer from '../src/localizers/moment.js' import '../src/less/styles.less' import '../src/addons/dragAndDrop/styles.less' import demoEvents from '../examples/events' -import createEvents from './createEvents' -import customComponents from './customComponents' -import resources from './resourceEvents' -import withDragAndDrop from '../src/addons/dragAndDrop' +import createEvents from './helpers/createEvents' +import customComponents from './helpers/customComponents' -/* eslint-disable react/prop-types */ +import { events, Calendar } from './helpers' -// Setup the localizer by providing the moment (or globalize) Object -// to the correct localizer. -momentLocalizer(moment) // or globalizeLocalizer - -const events = [ - { - title: 'test', - start: moment() - .add(1, 'days') - .subtract(5, 'hours') - .toDate(), - end: moment() - .add(1, 'days') - .subtract(4, 'hours') - .toDate(), - allDay: false, - }, - { - title: 'test larger', - start: moment() - .startOf('day') - .add(5, 'hours') - .toDate(), - end: moment() - .startOf('day') - .add(10, 'hours') - .toDate(), - allDay: false, - }, - - { - title: 'test larger', - start: moment() - .startOf('day') - .add(15, 'hours') - .toDate(), - end: moment() - .startOf('day') - .add(23, 'hours') - .toDate(), - allDay: false, - }, - { - title: 'test all day', - start: moment() - .startOf('day') - .toDate(), - end: moment() - .startOf('day') - .add(1, 'day') - .toDate(), - allDay: true, - }, - { - title: 'test 2 days', - start: moment() - .startOf('day') - .toDate(), - end: moment() - .startOf('day') - .add(2, 'days') - .toDate(), - allDay: true, - }, - { - title: 'test multi-day', - start: moment().toDate(), - end: moment() - .add(3, 'days') - .toDate(), - allDay: false, - }, -] - -const DragAndDropCalendar = withDragAndDrop(Calendar) - -const DragableCalendar = props => { - return ( - ( + - ) -} - -storiesOf('module.Calendar.week', module) - .add('demo', () => { - return ( -
- -
- ) - }) + )) .add('default view', () => { return ( -
- -
- ) - }) - .add('Daylight savings', () => { - return ( -
- -
- ) - }) - .add('event layout', () => { - return ( -
- -
- ) - }) - .add('resource', () => { - return ( -
- -
+ ) }) + .add('selectable', () => { return ( -
- -
- ) - }) - .add('selectable, step 15, 4 timeslots', () => { - return ( -
- -
- ) - }) - .add('selectable, step 10, 6 timeslots', () => { - return ( -
- -
- ) - }) - .add('selectable, step 5, 6 timeslots', () => { - return ( -
- -
- ) - }) - .add('selectable, 3 timeslots', () => { - return ( -
- moment('9:30am', 'h:mma').toDate()} - min={moment('12:00am', 'h:mma').toDate()} - max={moment('11:59pm', 'h:mma').toDate()} - events={events} - onSelectEvent={action('event selected')} - onSelectSlot={action('slot selected')} - defaultDate={new Date()} - /> -
- ) - }) - .add('first of the week all-day event', () => { - return ( -
- -
- ) - }) - .add('end of the week all-day event', () => { - return ( -
- -
- ) - }) - .add('event at end of week', () => { - return ( -
- -
- ) - }) - .add('event at start of week', () => { - return ( -
- -
- ) - }) - .add('events on a constrained day column', () => { - return ( -
- -
+ ) }) .add('add custom date header', () => { return ( -
- ( - {label} - Custom date header - ), - }, - }} - /> -
- ) - }) - .add('add custom dateCellWrapper', () => { - return ( -
- -
- ) - }) - .add('add custom dayWrapper', () => { - return ( -
- -
- ) - }) - .add('add custom eventWrapper', () => { - return ( -
- -
- ) - }) - .add('no duration', () => { - return ( -
- {/* should display all three events */} - -
+ ( + {label} - Custom date header + ), + }, + }} + /> ) }) .add('complex day view layout', () => { return ( -
- -
+ ) }) .add('multi-day', () => { return ( -
- {/* should display all three events */} - -
+ /* should display all three events */ + ) }) .add('agenda view - with length prop', () => { return ( -
- {/* should display as title toolbar (from now to now + 14 days) */} - -
+ /* should display as title toolbar (from now to now + 14 days) */ + ) }) - .add( - 'event should end after week start to be eligible to be displayed in that week', - () => { - return ( -
- {/* should display all three events */} - -
- ) - } - ) .add('custom now is the first of the month', () => { const customNow = () => { let now = new Date() @@ -543,134 +123,65 @@ storiesOf('module.Calendar.week', module) return now } return ( -
- -
- ) - }) - .add('draggable and resizable', () => { - return ( -
- -
- ) - }) - .add('draggable and resizable with non-default steps and timeslots', () => { - return ( -
- -
- ) - }) - .add('draggable and resizable with showMultiDayTimes', () => { - return ( -
- -
+ ) }) - .add('draggable and resizable with custom dateCellWrapper', () => { + + .add('custom time gutter header', () => { + const TimeGutter = () =>

Custom gutter text

+ return ( -
- -
+ ) }) - .add('draggable and resizable with custom dayWrapper', () => { + .add('add custom dateCellWrapper', () => { return ( -
- -
+ ) }) - .add('draggable and resizable with custom eventWrapper', () => { + .add('add custom dayWrapper', () => { return ( -
- -
+ ) }) - .add('custom time gutter header', () => { - const TimeGutter = () =>

Custom gutter text

- + .add('add custom eventWrapper', () => { return ( -
- -
+ ) }) diff --git a/stories/DragAndDrop.js b/stories/DragAndDrop.js new file mode 100644 index 000000000..550058186 --- /dev/null +++ b/stories/DragAndDrop.js @@ -0,0 +1,94 @@ +import React from 'react' +import { storiesOf, action } from '@storybook/react' + +import { events, Calendar, DragAndDropCalendar } from './helpers' +import customComponents from './helpers/customComponents' + +storiesOf('Drag and Drop') + .add('draggable and resizable', () => { + return ( + + ) + }) + .add('draggable and resizable with non-default steps and timeslots', () => { + return ( + + ) + }) + .add('draggable and resizable with showMultiDayTimes', () => { + return ( + + ) + }) + .add('draggable and resizable with custom dateCellWrapper', () => { + return ( + + ) + }) + .add('draggable and resizable with custom dayWrapper', () => { + return ( + + ) + }) + .add('draggable and resizable with custom eventWrapper', () => { + return ( + + ) + }) diff --git a/stories/Durations.js b/stories/Durations.js new file mode 100644 index 000000000..a6a06565d --- /dev/null +++ b/stories/Durations.js @@ -0,0 +1,30 @@ +import React from 'react' +import { storiesOf } from '@storybook/react' +import moment from 'moment' + +import { Calendar, DragableCalendar } from './helpers' + +storiesOf('Event Durations').add('Daylight savings', () => { + return ( + + ) +}) diff --git a/stories/Layout.js b/stories/Layout.js new file mode 100644 index 000000000..27791fc18 --- /dev/null +++ b/stories/Layout.js @@ -0,0 +1,183 @@ +import React from 'react' +import { storiesOf } from '@storybook/react' +import moment from 'moment' + +import { events, Calendar, DragAndDropCalendar } from './helpers' +import createEvents from './helpers/createEvents' + +storiesOf('Layout Issues') + .add('event layout', () => { + return ( + + ) + }) + .add('first of the week all-day event', () => { + return ( + + ) + }) + .add('end of the week all-day event', () => { + return ( + + ) + }) + .add('event at end of week', () => { + return ( + + ) + }) + .add('event at start of week', () => { + return ( + + ) + }) + .add('events on a constrained day column', () => { + return ( + + ) + }) + .add('no duration', () => { + return ( + /* should display all three events */ + + ) + }) + .add('Single days should only span one slot, multi-days multiple', () => { + return ( + + ) + }) + .add('zero duration oddities', () => { + return ( + + ) + }) diff --git a/stories/Resources.js b/stories/Resources.js new file mode 100644 index 000000000..73e709d2e --- /dev/null +++ b/stories/Resources.js @@ -0,0 +1,9 @@ +import React from 'react' +import { storiesOf } from '@storybook/react' + +import { DragableCalendar } from './helpers' +import resources from './helpers/resourceEvents' + +storiesOf('Resources').add('demo', () => ( + +)) diff --git a/stories/Timeslots.js b/stories/Timeslots.js new file mode 100644 index 000000000..4d043bc9b --- /dev/null +++ b/stories/Timeslots.js @@ -0,0 +1,72 @@ +import { storiesOf, action } from '@storybook/react' +import moment from 'moment' +import React from 'react' + +import { events, Calendar } from './helpers' +/* eslint-disable react/prop-types */ + +storiesOf('Timeslots', module) + .add('selectable, step 15, 4 timeslots', () => { + return ( + + ) + }) + .add('selectable, step 10, 6 timeslots', () => { + return ( + + ) + }) + .add('selectable, step 5, 6 timeslots', () => { + return ( + + ) + }) + .add('selectable, 3 timeslots', () => { + return ( + moment('9:30am', 'h:mma').toDate()} + min={moment('12:00am', 'h:mma').toDate()} + max={moment('11:59pm', 'h:mma').toDate()} + events={events} + onSelectEvent={action('event selected')} + onSelectSlot={action('slot selected')} + defaultDate={new Date()} + /> + ) + }) diff --git a/stories/createEvents.js b/stories/helpers/createEvents.js similarity index 100% rename from stories/createEvents.js rename to stories/helpers/createEvents.js diff --git a/stories/customComponents.js b/stories/helpers/customComponents.js similarity index 100% rename from stories/customComponents.js rename to stories/helpers/customComponents.js diff --git a/stories/helpers/index.js b/stories/helpers/index.js new file mode 100644 index 000000000..55917d9a7 --- /dev/null +++ b/stories/helpers/index.js @@ -0,0 +1,115 @@ +import { addDecorator } from '@storybook/react' +import { action } from '@storybook/addon-actions' + +import moment from 'moment' +import React from 'react' + +import BaseCalendar from '../../src' +import momentLocalizer from '../../src/localizers/moment.js' + +import '../../src/less/styles.less' +import '../../src/addons/dragAndDrop/styles.less' + +import withDragAndDrop from '../../src/addons/dragAndDrop' + +addDecorator(function WithHeigt(fn) { + return
{fn()}
+}) + +const localizer = momentLocalizer(moment) + +export resourcesEvents from './resourceEvents' + +export const date = (...args) => moment(...args).toDate() + +export const Calendar = props => ( + +) + +Object.assign(Calendar, BaseCalendar) + +export const DragAndDropCalendar = withDragAndDrop(Calendar) + +export const DragableCalendar = props => { + return ( + + ) +} + +export const events = [ + { + title: 'test', + start: moment() + .add(1, 'days') + .subtract(5, 'hours') + .toDate(), + end: moment() + .add(1, 'days') + .subtract(4, 'hours') + .toDate(), + allDay: false, + }, + { + title: 'test larger', + start: moment() + .startOf('day') + .add(5, 'hours') + .toDate(), + end: moment() + .startOf('day') + .add(10, 'hours') + .toDate(), + allDay: false, + }, + + { + title: 'test larger', + start: moment() + .startOf('day') + .add(15, 'hours') + .toDate(), + end: moment() + .startOf('day') + .add(23, 'hours') + .toDate(), + allDay: false, + }, + { + title: 'test all day', + start: moment() + .startOf('day') + .toDate(), + end: moment() + .startOf('day') + .add(1, 'day') + .toDate(), + allDay: true, + }, + { + title: 'test 2 days', + start: moment() + .startOf('day') + .toDate(), + end: moment() + .startOf('day') + .add(2, 'days') + .toDate(), + allDay: true, + }, + { + title: 'test multi-day', + start: moment().toDate(), + end: moment() + .add(3, 'days') + .toDate(), + allDay: false, + }, +] diff --git a/stories/resourceEvents.js b/stories/helpers/resourceEvents.js similarity index 100% rename from stories/resourceEvents.js rename to stories/helpers/resourceEvents.js diff --git a/stories/index.js b/stories/index.js index 90a32f265..c7652eee5 100644 --- a/stories/index.js +++ b/stories/index.js @@ -1 +1,6 @@ import './Calendar' +import './DragAndDrop' +import './Resources' +import './Timeslots' +import './Layout' +import './Durations' diff --git a/test/utils/DayEventLayout.test.js b/test/utils/DayEventLayout.test.js index 959fa4abb..c0d96ed0d 100644 --- a/test/utils/DayEventLayout.test.js +++ b/test/utils/DayEventLayout.test.js @@ -7,14 +7,14 @@ describe('getStyledEvents', () => { const min = dates.startOf(d(), 'day') const max = dates.endOf(d(), 'day') const slotMetrics = getSlotMetrics({ min, max, step: 30, timeslots: 4 }) + const accessors = { start: e => e.start, end: e => e.end } describe('matrix', () => { function compare(title, events, expectedResults) { it(title, () => { const styledEvents = getStyledEvents({ events, - startAccessor: 'start', - endAccessor: 'end', + accessors, slotMetrics, minimumStartDifference: 10, }) diff --git a/test/utils/eventLevels.test.js b/test/utils/eventLevels.test.js index a6d89dd16..746fdafe6 100644 --- a/test/utils/eventLevels.test.js +++ b/test/utils/eventLevels.test.js @@ -29,11 +29,9 @@ describe('endOfRange', () => { describe('eventSegments', () => { const event = { start: new Date(2017, 0, 8), end: new Date(2017, 0, 11, 12) } - const accessors = { startAccessor: 'start', endAccessor: 'end' } + const accessors = { start: e => e.start, end: e => e.end } test('it includes the original event in the returned object', () => { - const first = new Date(2017, 0, 8) - const last = new Date(2017, 0, 12) const range = [ new Date(2017, 0, 8), new Date(2017, 0, 9), @@ -41,14 +39,12 @@ describe('eventSegments', () => { new Date(2017, 0, 11), ] - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.event).toEqual(event) }) describe('when the event spans the full range', () => { - const first = new Date(2017, 0, 8) - const last = new Date(2017, 0, 12) const range = [ new Date(2017, 0, 8), new Date(2017, 0, 9), @@ -57,27 +53,25 @@ describe('eventSegments', () => { ] test('it sets span equal to the number of days the event spans', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.span).toBe(4) }) test('it sets left equal to one', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.left).toBe(1) }) test('it sets right equal to the length of the range', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.right).toBe(4) }) }) describe('when the event starts before the range and ends at the end of the range', () => { - const first = new Date(2017, 0, 9) - const last = new Date(2017, 0, 12) const range = [ new Date(2017, 0, 9), new Date(2017, 0, 10), @@ -85,27 +79,25 @@ describe('eventSegments', () => { ] test('it sets span equal to the number of days the range spans', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.span).toBe(3) }) test('it sets left equal to one', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.left).toBe(1) }) test('it sets right equal to the length of the range', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.right).toBe(3) }) }) describe('when the event starts at the start of the range and ends after it', () => { - const first = new Date(2017, 0, 8) - const last = new Date(2017, 0, 11) const range = [ new Date(2017, 0, 8), new Date(2017, 0, 9), @@ -113,27 +105,25 @@ describe('eventSegments', () => { ] test('it sets span equal to the number of days the range spans', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.span).toBe(3) }) test('it sets left equal to one', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.left).toBe(1) }) test('it sets right equal to the length of the range', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.right).toBe(3) }) }) describe('when the event starts and ends within the range', () => { - const first = new Date(2017, 0, 7) - const last = new Date(2017, 0, 13) const range = [ new Date(2017, 0, 7), new Date(2017, 0, 8), @@ -144,19 +134,19 @@ describe('eventSegments', () => { ] test('it sets span equal to the number of days the event spans', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.span).toBe(4) }) test('it sets left equal to the 1-based index into the range where the event starts', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.left).toBe(2) }) test('it sets right equal to the 1-based index into the range where the event ends', () => { - const result = eventSegments(event, first, last, accessors, range) + const result = eventSegments(event, range, accessors) expect(result.right).toBe(5) }) @@ -263,7 +253,7 @@ describe('inRange', () => { const rangeStart = new Date(2017, 4, 1) const rangeEnd = new Date(2017, 5, 1) - const accessors = { startAccessor: 'start', endAccessor: 'end' } + const accessors = { start: e => e.start, end: e => e.end } describe('matrix', () => { function compare(title, event, [rangeStart, rangeEnd], result = true) { @@ -474,9 +464,9 @@ describe('segsOverlap', () => { describe('sortEvents', () => { const accessors = { - startAccessor: 'start', - endAccessor: 'end', - allDayAccessor: 'allDay', + start: e => e.start, + end: e => e.end, + allDay: e => e.allDay, } describe('when the events start on different calendar days', () => { diff --git a/yarn.lock b/yarn.lock index 2d55d4024..a13630134 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,48 +2,93 @@ # yarn lockfile v1 -"@storybook/addon-actions@^3.2.16": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-3.3.7.tgz#edc2d4fe3472a3f542d7c3ed990400b5433e58fc" +"@babel/parser@7.0.0-beta.53": + version "7.0.0-beta.53" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-beta.53.tgz#1f45eb617bf9463d482b2c04d349d9e4edbf4892" + +"@storybook/addon-actions@3.4.8", "@storybook/addon-actions@^3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-3.4.8.tgz#557bae7c7cc60be9d5199ff972b028de8b574f92" dependencies: + "@storybook/components" "3.4.8" + babel-runtime "^6.26.0" deep-equal "^1.0.1" + glamor "^2.20.40" + glamorous "^4.12.1" global "^4.3.2" - make-error "^1.3.2" - prop-types "^15.6.0" + make-error "^1.3.4" + prop-types "^15.6.1" react-inspector "^2.2.2" - uuid "^3.1.0" + uuid "^3.2.1" -"@storybook/addon-links@^3.2.16": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-3.3.7.tgz#df3114718bc7f0a39b6cdc61e301363768d7f2a0" +"@storybook/addon-links@3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-3.4.8.tgz#303e2e37c8abf1861accc95dd9c5f9274bf528ad" dependencies: - "@storybook/components" "^3.3.7" + "@storybook/components" "3.4.8" + babel-runtime "^6.26.0" global "^4.3.2" - prop-types "^15.5.10" + prop-types "^15.6.1" -"@storybook/addons@^3.2.16": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-3.3.7.tgz#cc27f4ba9da47810f7eae4013224fb5f72b22ffd" +"@storybook/addons@3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-3.4.8.tgz#ff1142d8f0963dd28b7c6f88dc9d3be170ac6600" -"@storybook/channel-postmessage@^3.2.16": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-3.3.7.tgz#15bcc1525a27429348485fafb2fcbcb1091b72e1" +"@storybook/channel-postmessage@3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-3.4.8.tgz#4df9b315f6ceff07f33334a633f24c7b81a3ac28" dependencies: - "@storybook/channels" "^3.3.7" + "@storybook/channels" "3.4.8" global "^4.3.2" json-stringify-safe "^5.0.1" -"@storybook/channels@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-3.3.7.tgz#227d1aac8d8d227354bdcfcef1e4ad5bee6afc44" +"@storybook/channels@3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-3.4.8.tgz#df0aff0d20a9597402e76caa7e5ddb088ede3591" -"@storybook/components@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-3.3.7.tgz#6f64d56e9516907cd077e66564b8171a5745bc82" +"@storybook/client-logger@3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-3.4.8.tgz#82d6e1c2cb3e37184cc597a933f64b38fb61b88b" + +"@storybook/components@3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-3.4.8.tgz#45934d9a25374e68152826a162e61b9732871eaf" dependencies: glamor "^2.20.40" - glamorous "^4.11.2" - prop-types "^15.6.0" + glamorous "^4.12.1" + prop-types "^15.6.1" + +"@storybook/core@3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-3.4.8.tgz#a7f077175081b9e957cd3b04442c01606271fd2d" + dependencies: + "@storybook/addons" "3.4.8" + "@storybook/channel-postmessage" "3.4.8" + "@storybook/client-logger" "3.4.8" + "@storybook/node-logger" "3.4.8" + "@storybook/ui" "3.4.8" + autoprefixer "^7.2.6" + babel-runtime "^6.26.0" + chalk "^2.3.2" + commander "^2.15.0" + css-loader "^0.28.11" + dotenv "^5.0.1" + events "^2.0.0" + express "^4.16.3" + file-loader "^1.1.11" + global "^4.3.2" + json-loader "^0.5.7" + postcss-flexbugs-fixes "^3.2.0" + postcss-loader "^2.1.2" + prop-types "^15.6.1" + qs "^6.5.1" + serve-favicon "^2.4.5" + shelljs "^0.8.1" + style-loader "^0.20.3" + url-loader "^0.6.2" + webpack "^3.11.0" + webpack-dev-middleware "^1.12.2" + webpack-hot-middleware "^2.22.1" "@storybook/mantra-core@^1.7.2": version "1.7.2" @@ -53,6 +98,19 @@ "@storybook/react-simple-di" "^1.2.1" babel-runtime "6.x.x" +"@storybook/node-logger@3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-3.4.8.tgz#8f8abcd51920545c7458385b0b30199ae48ad78a" + dependencies: + npmlog "^4.1.2" + +"@storybook/podda@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@storybook/podda/-/podda-1.2.3.tgz#53c4a1a3f8c7bbd5755dff5c34576fd1af9d38ba" + dependencies: + babel-runtime "^6.11.6" + immutable "^3.8.1" + "@storybook/react-komposer@^2.0.1", "@storybook/react-komposer@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@storybook/react-komposer/-/react-komposer-2.0.3.tgz#f9e12a9586b2ce95c24c137eabb8b71527ddb369" @@ -78,97 +136,75 @@ dependencies: babel-runtime "^6.5.0" -"@storybook/react@3.2.16": - version "3.2.16" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-3.2.16.tgz#9a0eaecbc7ba6c97e89ce1d17dee7a2af68260c9" - dependencies: - "@storybook/addon-actions" "^3.2.16" - "@storybook/addon-links" "^3.2.16" - "@storybook/addons" "^3.2.16" - "@storybook/channel-postmessage" "^3.2.16" - "@storybook/ui" "^3.2.16" - airbnb-js-shims "^1.3.0" - autoprefixer "^7.1.6" - babel-core "^6.26.0" - babel-loader "^7.1.2" - babel-plugin-react-docgen "^1.8.0" +"@storybook/react@3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-3.4.8.tgz#857b83778abb0547525637b084d2fe684a53fc81" + dependencies: + "@storybook/addon-actions" "3.4.8" + "@storybook/addon-links" "3.4.8" + "@storybook/addons" "3.4.8" + "@storybook/channel-postmessage" "3.4.8" + "@storybook/client-logger" "3.4.8" + "@storybook/core" "3.4.8" + "@storybook/node-logger" "3.4.8" + "@storybook/ui" "3.4.8" + airbnb-js-shims "^1.4.1" + babel-loader "^7.1.4" + babel-plugin-macros "^2.2.0" + babel-plugin-react-docgen "^1.9.0" babel-plugin-transform-regenerator "^6.26.0" babel-plugin-transform-runtime "^6.23.0" babel-preset-env "^1.6.1" - babel-preset-minify "^0.2.0" + babel-preset-minify "^0.3.0" babel-preset-react "^6.24.1" - babel-preset-react-app "^3.1.0" babel-preset-stage-0 "^6.24.1" babel-runtime "^6.26.0" - case-sensitive-paths-webpack-plugin "^2.1.1" - chalk "^2.3.0" - commander "^2.11.0" - common-tags "^1.4.0" - configstore "^3.1.1" - core-js "^2.5.1" - css-loader "^0.28.7" - express "^4.16.2" - file-loader "^1.1.5" + case-sensitive-paths-webpack-plugin "^2.1.2" + common-tags "^1.7.2" + core-js "^2.5.3" + dotenv-webpack "^1.5.5" find-cache-dir "^1.0.0" glamor "^2.20.40" - glamorous "^4.11.0" + glamorous "^4.12.1" global "^4.3.2" - json-loader "^0.5.7" - json-stringify-safe "^5.0.1" + html-loader "^0.5.5" + html-webpack-plugin "^2.30.1" json5 "^0.5.1" lodash.flattendeep "^4.4.0" - lodash.pick "^4.4.0" - postcss-flexbugs-fixes "^3.2.0" - postcss-loader "^2.0.8" - prop-types "^15.6.0" - qs "^6.5.1" + markdown-loader "^2.0.2" + prop-types "^15.6.1" + react-dev-utils "^5.0.0" redux "^3.7.2" - request "^2.83.0" - serve-favicon "^2.4.5" - shelljs "^0.7.8" - style-loader "^0.18.2" - url-loader "^0.6.2" + uglifyjs-webpack-plugin "^1.2.4" util-deprecate "^1.0.2" - uuid "^3.1.0" - webpack "^3.8.1" - webpack-dev-middleware "^1.12.0" - webpack-hot-middleware "^2.20.0" + webpack "^3.11.0" + webpack-hot-middleware "^2.22.1" -"@storybook/ui@^3.2.16": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-3.3.7.tgz#6d58b65955e47ac65588b7244c587fe28df3a1f3" +"@storybook/ui@3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-3.4.8.tgz#73245f02a714cc3de0bb1b62261ec64b6d0d65ae" dependencies: - "@storybook/components" "^3.3.7" + "@storybook/components" "3.4.8" "@storybook/mantra-core" "^1.7.2" + "@storybook/podda" "^1.2.3" "@storybook/react-komposer" "^2.0.3" babel-runtime "^6.26.0" deep-equal "^1.0.1" - events "^1.1.1" + events "^2.0.0" fuse.js "^3.2.0" global "^4.3.2" - json-stringify-safe "^5.0.1" keycode "^2.1.9" lodash.debounce "^4.0.8" lodash.pick "^4.4.0" lodash.sortby "^4.7.0" - podda "^1.2.2" - prop-types "^15.6.0" + lodash.throttle "^4.1.1" + prop-types "^15.6.1" qs "^6.5.1" - react-fuzzy "^0.5.1" + react-fuzzy "^0.5.2" react-icons "^2.2.7" - react-inspector "^2.2.2" - react-modal "^3.1.10" - react-split-pane "^0.1.74" + react-modal "^3.3.2" + react-split-pane "^0.1.77" react-treebeard "^2.1.0" - redux "^3.7.2" - -"@types/inline-style-prefixer@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/inline-style-prefixer/-/inline-style-prefixer-3.0.1.tgz#8541e636b029124b747952e9a28848286d2b5bf6" - -"@types/react@^16.0.18": - version "16.0.34" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.34.tgz#7a8f795afd8a404a9c4af9539b24c75d3996914e" abab@^1.0.3: version "1.0.4" @@ -185,6 +221,13 @@ accepts@~1.3.4: mime-types "~2.1.16" negotiator "0.6.1" +accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + acorn-dynamic-import@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" @@ -215,22 +258,29 @@ acorn@^5.0.0, acorn@^5.2.1: version "5.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" -airbnb-js-shims@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-1.4.0.tgz#b920b0bc9fafe8b8ae2a073f29fb10303b1b2b18" +address@1.0.3, address@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" + +airbnb-js-shims@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-1.6.0.tgz#b0675d05113e928c89bfa5b7b80b7399de8cee2a" dependencies: array-includes "^3.0.3" - array.prototype.flatmap "^1.1.1" - array.prototype.flatten "^1.1.1" - es5-shim "^4.5.9" + array.prototype.flat "^1.2.1" + array.prototype.flatmap "^1.2.1" + array.prototype.flatten "^1.2.1" + es5-shim "^4.5.10" es6-shim "^0.35.3" - function.prototype.name "^1.0.3" + function.prototype.name "^1.1.0" object.entries "^1.0.4" object.getownpropertydescriptors "^2.0.3" object.values "^1.0.4" promise.prototype.finally "^3.1.0" + string.prototype.matchall "^3.0.0" string.prototype.padend "^3.0.0" string.prototype.padstart "^3.0.0" + symbol.prototype.description "^1.0.0" ajv-keywords@^1.0.0: version "1.5.1" @@ -240,6 +290,10 @@ ajv-keywords@^2.0.0, ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" +ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + ajv@^4.7.0, ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" @@ -256,6 +310,15 @@ ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^6.1.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.1" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -302,6 +365,12 @@ ansi-styles@^3.1.0, ansi-styles@^3.2.0: dependencies: color-convert "^1.9.0" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + any-observable@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242" @@ -373,6 +442,10 @@ array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + 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" @@ -396,6 +469,14 @@ array-includes@^3.0.3: define-properties "^1.1.2" es-abstract "^1.7.0" +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -421,17 +502,25 @@ array.prototype.find@^2.0.1: define-properties "^1.1.2" es-abstract "^1.7.0" -array.prototype.flatmap@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.1.1.tgz#dbb6c44693c2a2a2fcab24e551dfbf47f67fde03" +array.prototype.flat@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz#812db8f02cad24d3fab65dd67eabe3b8903494a4" dependencies: define-properties "^1.1.2" es-abstract "^1.10.0" function-bind "^1.1.1" -array.prototype.flatten@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatten/-/array.prototype.flatten-1.1.1.tgz#301b351aa8a632356ee2f5311c6c8e8f50d318cc" +array.prototype.flatmap@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.1.tgz#3103cd4826ef90019c9b0a4839b2535fa6faf4e9" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.10.0" + function-bind "^1.1.1" + +array.prototype.flatten@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatten/-/array.prototype.flatten-1.2.1.tgz#a77ae1b64524ce373b137fade324d12040d3c680" dependencies: define-properties "^1.1.2" es-abstract "^1.10.0" @@ -441,7 +530,7 @@ arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" -asap@^2.0.6, asap@~2.0.3: +asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -479,6 +568,14 @@ ast-types@0.10.1: version "0.10.1" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd" +ast-types@0.11.5: + version "0.11.5" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.5.tgz#9890825d660c03c28339f315e9fa0a360e31ec28" + +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -520,7 +617,7 @@ autoprefixer@^6.0.0, autoprefixer@^6.3.1: postcss "^5.2.16" postcss-value-parser "^3.2.3" -autoprefixer@^7.1.4, autoprefixer@^7.1.6: +autoprefixer@^7.1.4: version "7.2.4" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.4.tgz#29b367c03876a29bfd3721260d945e3545666c8d" dependencies: @@ -531,6 +628,17 @@ autoprefixer@^7.1.4, autoprefixer@^7.1.6: postcss "^6.0.15" postcss-value-parser "^3.2.3" +autoprefixer@^7.2.6: + version "7.2.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc" + dependencies: + browserslist "^2.11.3" + caniuse-lite "^1.0.30000805" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.17" + postcss-value-parser "^3.2.3" + aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" @@ -564,7 +672,7 @@ babel-cli@^6.7.5: optionalDependencies: chokidar "^1.6.1" -babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: +babel-code-frame@6.26.0, babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: @@ -661,9 +769,9 @@ babel-helper-define-map@^6.24.1: babel-types "^6.26.0" lodash "^4.17.4" -babel-helper-evaluate-path@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.2.0.tgz#0bb2eb01996c0cef53c5e8405e999fe4a0244c08" +babel-helper-evaluate-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.3.0.tgz#2439545e0b6eae5b7f49b790acbebd6b9a73df20" babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" @@ -682,9 +790,9 @@ babel-helper-explode-class@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-flip-expressions@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.2.0.tgz#160d2090a3d9f9c64a750905321a0bc218f884ec" +babel-helper-flip-expressions@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.3.0.tgz#f5b6394bd5219b43cf8f7b201535ed540c6e7fa2" babel-helper-function-name@^6.24.1: version "6.24.1" @@ -714,13 +822,13 @@ babel-helper-is-nodes-equiv@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" -babel-helper-is-void-0@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.2.0.tgz#6ed0ada8a9b1c5b6e88af6b47c1b3b5c080860eb" +babel-helper-is-void-0@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.3.0.tgz#95570d20bd27b2206f68083ae9980ee7003d8fe7" -babel-helper-mark-eval-scopes@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.2.0.tgz#7648aaf2ec92aae9b09a20ad91e8df5e1fcc94b2" +babel-helper-mark-eval-scopes@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.3.0.tgz#b4731314fdd7a89091271a5213b4e12d236e29e8" babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" @@ -747,9 +855,9 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-remove-or-void@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.2.0.tgz#8e46ad5b30560d57d7510b3fd93f332ee7c67386" +babel-helper-remove-or-void@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.3.0.tgz#f43c86147c8fcc395a9528cbb31e7ff49d7e16e3" babel-helper-replace-supers@^6.24.1: version "6.24.1" @@ -762,9 +870,9 @@ babel-helper-replace-supers@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-to-multiple-sequence-expressions@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.2.0.tgz#d1a419634c6cb301f27858c659167cfee0a9d318" +babel-helper-to-multiple-sequence-expressions@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.3.0.tgz#8da2275ccc26995566118f7213abfd9af7214427" babel-helpers@^6.24.1: version "6.24.1" @@ -788,6 +896,14 @@ babel-loader@^7.1.2: loader-utils "^1.0.2" mkdirp "^0.5.1" +babel-loader@^7.1.4: + version "7.1.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" + dependencies: + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" @@ -808,14 +924,6 @@ babel-plugin-dev-expression@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/babel-plugin-dev-expression/-/babel-plugin-dev-expression-0.2.1.tgz#d4a7beefefbb50e3f2734990a82a2486cf9eb9ee" -babel-plugin-dynamic-import-node@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz#bd1d88ac7aaf98df4917c384373b04d971a2b37a" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - babel-plugin-istanbul@^4.0.0: version "4.1.5" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" @@ -832,82 +940,88 @@ babel-plugin-jsx-fragment@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/babel-plugin-jsx-fragment/-/babel-plugin-jsx-fragment-4.0.3.tgz#78d1ea66185014370a760bc98b35ab8f14104d92" -babel-plugin-minify-builtins@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz#317f824b0907210b6348671bb040ca072e2e0c82" +babel-plugin-macros@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.3.0.tgz#1538e6339cbcbf093f334dc2f10f5f53043e3fda" dependencies: - babel-helper-evaluate-path "^0.2.0" + cosmiconfig "^4.0.0" -babel-plugin-minify-constant-folding@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.2.0.tgz#8c70b528b2eb7c13e94d95c8789077d4cdbc3970" +babel-plugin-minify-builtins@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.3.0.tgz#4740117a6a784063aaf8f092989cf9e4bd484860" dependencies: - babel-helper-evaluate-path "^0.2.0" + babel-helper-evaluate-path "^0.3.0" -babel-plugin-minify-dead-code-elimination@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.2.0.tgz#e8025ee10a1e5e4f202633a6928ce892c33747e3" +babel-plugin-minify-constant-folding@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.3.0.tgz#687e40336bd4ddd921e0e197f0006235ac184bb9" + dependencies: + babel-helper-evaluate-path "^0.3.0" + +babel-plugin-minify-dead-code-elimination@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.3.0.tgz#a323f686c404b824186ba5583cf7996cac81719e" dependencies: - babel-helper-evaluate-path "^0.2.0" - babel-helper-mark-eval-scopes "^0.2.0" - babel-helper-remove-or-void "^0.2.0" + babel-helper-evaluate-path "^0.3.0" + babel-helper-mark-eval-scopes "^0.3.0" + babel-helper-remove-or-void "^0.3.0" lodash.some "^4.6.0" -babel-plugin-minify-flip-comparisons@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.2.0.tgz#0c9c8e93155c8f09dedad8118b634c259f709ef5" +babel-plugin-minify-flip-comparisons@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.3.0.tgz#6627893a409c9f30ef7f2c89e0c6eea7ee97ddc4" dependencies: - babel-helper-is-void-0 "^0.2.0" + babel-helper-is-void-0 "^0.3.0" -babel-plugin-minify-guarded-expressions@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.2.0.tgz#8a8c950040fce3e258a12e6eb21eab94ad7235ab" +babel-plugin-minify-guarded-expressions@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.3.0.tgz#2552d96189ef45d9a463f1a6b5e4fa110703ac8d" dependencies: - babel-helper-flip-expressions "^0.2.0" + babel-helper-flip-expressions "^0.3.0" -babel-plugin-minify-infinity@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.2.0.tgz#30960c615ddbc657c045bb00a1d8eb4af257cf03" +babel-plugin-minify-infinity@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.3.0.tgz#c5ec0edd433517cf31b3af17077c202beb48bbe7" -babel-plugin-minify-mangle-names@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.2.0.tgz#719892297ff0106a6ec1a4b0fc062f1f8b6a8529" +babel-plugin-minify-mangle-names@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.3.0.tgz#f28561bad0dd2f0380816816bb946e219b3b6135" dependencies: - babel-helper-mark-eval-scopes "^0.2.0" + babel-helper-mark-eval-scopes "^0.3.0" -babel-plugin-minify-numeric-literals@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.2.0.tgz#5746e851700167a380c05e93f289a7070459a0d1" +babel-plugin-minify-numeric-literals@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.3.0.tgz#b57734a612e8a592005407323c321119f27d4b40" -babel-plugin-minify-replace@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.2.0.tgz#3c1f06bc4e6d3e301eacb763edc1be611efc39b0" +babel-plugin-minify-replace@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.3.0.tgz#980125bbf7cbb5a637439de9d0b1b030a4693893" -babel-plugin-minify-simplify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.2.0.tgz#21ceec4857100c5476d7cef121f351156e5c9bc0" +babel-plugin-minify-simplify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.3.0.tgz#14574cc74d21c81d3060fafa041010028189f11b" dependencies: - babel-helper-flip-expressions "^0.2.0" + babel-helper-flip-expressions "^0.3.0" babel-helper-is-nodes-equiv "^0.0.1" - babel-helper-to-multiple-sequence-expressions "^0.2.0" + babel-helper-to-multiple-sequence-expressions "^0.3.0" -babel-plugin-minify-type-constructors@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.2.0.tgz#7f3b6458be0863cfd59e9985bed6d134aa7a2e17" +babel-plugin-minify-type-constructors@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.3.0.tgz#7f5a86ef322c4746364e3c591b8514eeafea6ad4" dependencies: - babel-helper-is-void-0 "^0.2.0" + babel-helper-is-void-0 "^0.3.0" babel-plugin-object-assign@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/babel-plugin-object-assign/-/babel-plugin-object-assign-1.2.1.tgz#40eaf89086b436312c2247d16812a9ad32db0998" -babel-plugin-react-docgen@^1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-1.8.1.tgz#6e08e057f5dcd46b434e7553e971baa604dae377" +babel-plugin-react-docgen@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-1.9.0.tgz#2e79aeed2f93b53a172398f93324fdcf9f02e01f" dependencies: babel-types "^6.24.1" - lodash "4.x.x" - react-docgen "^2.15.0" + lodash "^4.17.0" + react-docgen "^3.0.0-beta11" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" @@ -933,7 +1047,7 @@ babel-plugin-syntax-do-expressions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" -babel-plugin-syntax-dynamic-import@6.18.0, babel-plugin-syntax-dynamic-import@^6.18.0: +babel-plugin-syntax-dynamic-import@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" @@ -989,7 +1103,7 @@ babel-plugin-transform-class-constructor-call@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-class-properties@6.24.1, babel-plugin-transform-class-properties@^6.23.0, babel-plugin-transform-class-properties@^6.24.1: +babel-plugin-transform-class-properties@^6.23.0, babel-plugin-transform-class-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" dependencies: @@ -1212,21 +1326,21 @@ babel-plugin-transform-function-bind@^6.22.0: babel-plugin-syntax-function-bind "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-inline-consecutive-adds@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz#15dae78921057f4004f8eafd79e15ddc5f12f426" +babel-plugin-transform-inline-consecutive-adds@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.3.0.tgz#f07d93689c0002ed2b2b62969bdd99f734e03f57" -babel-plugin-transform-member-expression-literals@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.5.tgz#e06ae305cf48d819822e93a70d79269f04d89eec" +babel-plugin-transform-member-expression-literals@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz#37039c9a0c3313a39495faac2ff3a6b5b9d038bf" -babel-plugin-transform-merge-sibling-variables@^6.8.6: - version "6.8.6" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.6.tgz#6d21efa5ee4981f71657fae716f9594bb2622aef" +babel-plugin-transform-merge-sibling-variables@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz#85b422fc3377b449c9d1cde44087203532401dae" -babel-plugin-transform-minify-booleans@^6.8.3: - version "6.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.3.tgz#5906ed776d3718250519abf1bace44b0b613ddf9" +babel-plugin-transform-minify-booleans@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz#acbb3e56a3555dd23928e4b582d285162dd2b198" babel-plugin-transform-object-assign@^6.22.0: version "6.22.0" @@ -1234,46 +1348,40 @@ babel-plugin-transform-object-assign@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-object-rest-spread@6.26.0, babel-plugin-transform-object-rest-spread@^6.22.0, babel-plugin-transform-object-rest-spread@^6.23.0: +babel-plugin-transform-object-rest-spread@^6.22.0, babel-plugin-transform-object-rest-spread@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.26.0" -babel-plugin-transform-property-literals@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.5.tgz#67ed5930b34805443452c8b9690c7ebe1e206c40" +babel-plugin-transform-property-literals@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz#98c1d21e255736573f93ece54459f6ce24985d39" dependencies: esutils "^2.0.2" -babel-plugin-transform-react-constant-elements@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz#2f119bf4d2cdd45eb9baaae574053c604f6147dd" - dependencies: - babel-runtime "^6.22.0" - babel-plugin-transform-react-display-name@^6.23.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-react-jsx-self@6.22.0, babel-plugin-transform-react-jsx-self@^6.22.0: +babel-plugin-transform-react-jsx-self@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" dependencies: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-react-jsx-source@6.22.0, babel-plugin-transform-react-jsx-source@^6.22.0: +babel-plugin-transform-react-jsx-source@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" dependencies: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-react-jsx@6.24.1, babel-plugin-transform-react-jsx@^6.24.1: +babel-plugin-transform-react-jsx@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" dependencies: @@ -1281,39 +1389,39 @@ babel-plugin-transform-react-jsx@6.24.1, babel-plugin-transform-react-jsx@^6.24. babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-regenerator@6.26.0, babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.26.0: +babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" dependencies: regenerator-transform "^0.10.0" -babel-plugin-transform-regexp-constructors@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.2.0.tgz#6aa5dd0acc515db4be929bbcec4ed4c946c534a3" +babel-plugin-transform-regexp-constructors@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.3.0.tgz#9bb2c8dd082271a5cb1b3a441a7c52e8fd07e0f5" -babel-plugin-transform-remove-console@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.5.tgz#fde9d2d3d725530b0fadd8d31078402410386810" +babel-plugin-transform-remove-console@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780" -babel-plugin-transform-remove-debugger@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.5.tgz#809584d412bf918f071fdf41e1fdb15ea89cdcd5" +babel-plugin-transform-remove-debugger@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz#42b727631c97978e1eb2d199a7aec84a18339ef2" -babel-plugin-transform-remove-undefined@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.2.0.tgz#94f052062054c707e8d094acefe79416b63452b1" +babel-plugin-transform-remove-undefined@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.3.0.tgz#03f5f0071867781e9beabbc7b77bf8095fd3f3ec" dependencies: - babel-helper-evaluate-path "^0.2.0" + babel-helper-evaluate-path "^0.3.0" -babel-plugin-transform-runtime@6.23.0, babel-plugin-transform-runtime@^6.23.0: +babel-plugin-transform-runtime@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-simplify-comparison-operators@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.5.tgz#a838786baf40cc33a93b95ae09e05591227e43bf" +babel-plugin-transform-simplify-comparison-operators@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz#f62afe096cab0e1f68a2d753fdf283888471ceb9" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" @@ -1322,9 +1430,9 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-undefined-to-void@^6.8.3: - version "6.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.3.tgz#fc52707f6ee1ddc71bb91b0d314fbefdeef9beb4" +babel-plugin-transform-undefined-to-void@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz#be241ca81404030678b748717322b89d0c8fe280" babel-polyfill@^6.26.0: version "6.26.0" @@ -1334,7 +1442,7 @@ babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@1.6.1, babel-preset-env@^1.1.8, babel-preset-env@^1.6.1: +babel-preset-env@^1.1.8, babel-preset-env@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" dependencies: @@ -1398,52 +1506,35 @@ babel-preset-jest@^21.2.0: babel-plugin-jest-hoist "^21.2.0" babel-plugin-syntax-object-rest-spread "^6.13.0" -babel-preset-minify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz#006566552d9b83834472273f306c0131062a0acc" - dependencies: - babel-plugin-minify-builtins "^0.2.0" - babel-plugin-minify-constant-folding "^0.2.0" - babel-plugin-minify-dead-code-elimination "^0.2.0" - babel-plugin-minify-flip-comparisons "^0.2.0" - babel-plugin-minify-guarded-expressions "^0.2.0" - babel-plugin-minify-infinity "^0.2.0" - babel-plugin-minify-mangle-names "^0.2.0" - babel-plugin-minify-numeric-literals "^0.2.0" - babel-plugin-minify-replace "^0.2.0" - babel-plugin-minify-simplify "^0.2.0" - babel-plugin-minify-type-constructors "^0.2.0" - babel-plugin-transform-inline-consecutive-adds "^0.2.0" - babel-plugin-transform-member-expression-literals "^6.8.5" - babel-plugin-transform-merge-sibling-variables "^6.8.6" - babel-plugin-transform-minify-booleans "^6.8.3" - babel-plugin-transform-property-literals "^6.8.5" - babel-plugin-transform-regexp-constructors "^0.2.0" - babel-plugin-transform-remove-console "^6.8.5" - babel-plugin-transform-remove-debugger "^6.8.5" - babel-plugin-transform-remove-undefined "^0.2.0" - babel-plugin-transform-simplify-comparison-operators "^6.8.5" - babel-plugin-transform-undefined-to-void "^6.8.3" +babel-preset-minify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.3.0.tgz#7db64afa75f16f6e06c0aa5f25195f6f36784d77" + dependencies: + babel-plugin-minify-builtins "^0.3.0" + babel-plugin-minify-constant-folding "^0.3.0" + babel-plugin-minify-dead-code-elimination "^0.3.0" + babel-plugin-minify-flip-comparisons "^0.3.0" + babel-plugin-minify-guarded-expressions "^0.3.0" + babel-plugin-minify-infinity "^0.3.0" + babel-plugin-minify-mangle-names "^0.3.0" + babel-plugin-minify-numeric-literals "^0.3.0" + babel-plugin-minify-replace "^0.3.0" + babel-plugin-minify-simplify "^0.3.0" + babel-plugin-minify-type-constructors "^0.3.0" + babel-plugin-transform-inline-consecutive-adds "^0.3.0" + babel-plugin-transform-member-expression-literals "^6.9.0" + babel-plugin-transform-merge-sibling-variables "^6.9.0" + babel-plugin-transform-minify-booleans "^6.9.0" + babel-plugin-transform-property-literals "^6.9.0" + babel-plugin-transform-regexp-constructors "^0.3.0" + babel-plugin-transform-remove-console "^6.9.0" + babel-plugin-transform-remove-debugger "^6.9.0" + babel-plugin-transform-remove-undefined "^0.3.0" + babel-plugin-transform-simplify-comparison-operators "^6.9.0" + babel-plugin-transform-undefined-to-void "^6.9.0" lodash.isplainobject "^4.0.6" -babel-preset-react-app@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.0.tgz#d77f6061ab9d7bf4b3cdc86b7cde9ded0df03e48" - dependencies: - babel-plugin-dynamic-import-node "1.1.0" - babel-plugin-syntax-dynamic-import "6.18.0" - babel-plugin-transform-class-properties "6.24.1" - babel-plugin-transform-object-rest-spread "6.26.0" - babel-plugin-transform-react-constant-elements "6.23.0" - babel-plugin-transform-react-jsx "6.24.1" - babel-plugin-transform-react-jsx-self "6.22.0" - babel-plugin-transform-react-jsx-source "6.22.0" - babel-plugin-transform-regenerator "6.26.0" - babel-plugin-transform-runtime "6.23.0" - babel-preset-env "1.6.1" - babel-preset-react "6.24.1" - -babel-preset-react@6.24.1, babel-preset-react@^6.24.1: +babel-preset-react@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" dependencies: @@ -1508,12 +1599,6 @@ babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-runtime@^5.8.25: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-5.8.38.tgz#1c0b02eb63312f5f087ff20450827b425c9d4c19" - dependencies: - core-js "^1.0.0" - babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" @@ -1603,7 +1688,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.4.7, bluebird@^3.5.0: +bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -1667,6 +1752,13 @@ bowser@^1.0.0, bowser@^1.7.3: version "1.9.1" resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.1.tgz#f86ef2132e8cb10b3eb6ea5af018758c587020db" +brace-expansion@^1.0.0: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -1778,6 +1870,13 @@ browserslist@^2.1.2, browserslist@^2.10.2: caniuse-lite "^1.0.30000784" electron-to-chromium "^1.3.30" +browserslist@^2.11.3: + version "2.11.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + dependencies: + caniuse-lite "^1.0.30000792" + electron-to-chromium "^1.3.30" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -1830,6 +1929,24 @@ cacache@^10.0.1: unique-filename "^1.1.0" y18n "^3.2.1" +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1905,9 +2022,13 @@ caniuse-lite@^1.0.30000784: version "1.0.30000789" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000789.tgz#2e3d937b267133f63635ef7f441fac66360fc889" -case-sensitive-paths-webpack-plugin@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz#3d29ced8c1f124bf6f53846fb3f5894731fdc909" +caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805: + version "1.0.30000865" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" + +case-sensitive-paths-webpack-plugin@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.2.tgz#c899b52175763689224571dad778742e133f0192" case@^1.3.2: version "1.5.4" @@ -1932,7 +2053,7 @@ chain-function@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -1942,6 +2063,14 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" @@ -1950,6 +2079,10 @@ chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + child-process-promise@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-1.1.0.tgz#131e01a705f15ed4a05d554dd5e032e52612cf30" @@ -2023,7 +2156,7 @@ class-utils@^0.3.5: lazy-cache "^2.0.2" static-extend "^0.1.1" -classnames@^2.1.3, classnames@^2.1.5, classnames@^2.2.5: +classnames@^2.1.3, classnames@^2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" @@ -2039,6 +2172,12 @@ cli-cursor@^1.0.1, cli-cursor@^1.0.2: dependencies: restore-cursor "^1.0.1" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + cli-spinners@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" @@ -2162,12 +2301,20 @@ commander@2.12.x, commander@^2.11.0, commander@^2.8.1, commander@^2.9.0, command version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" -common-tags@^1.3.1, common-tags@^1.4.0: +commander@2.16.x, commander@^2.15.0, commander@~2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + +common-tags@^1.3.1: version "1.7.1" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.1.tgz#ffc4b8aef2bede5625e8e0c43230cb5ee0424632" dependencies: babel-runtime "^6.26.0" +common-tags@^1.7.2: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2216,17 +2363,6 @@ concat-stream@^1.5.0, concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" -configstore@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - connect-history-api-fallback@^1.3.0: version "1.5.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" @@ -2292,10 +2428,14 @@ core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.5.1: +core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" +core-js@^2.5.3: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2321,6 +2461,15 @@ cosmiconfig@^3.1.0: parse-json "^3.0.0" require-from-string "^2.0.1" +cosmiconfig@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + require-from-string "^2.0.1" + cp-file@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-2.3.0.tgz#72778324941d664abd8b5377d24635d0c42505bd" @@ -2377,19 +2526,19 @@ create-react-class@^15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" +cross-spawn@5.1.0, cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: lru-cache "^4.0.1" + shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" dependencies: lru-cache "^4.0.1" - shebang-command "^1.2.0" which "^1.2.9" cryptiles@2.x.x: @@ -2420,10 +2569,6 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" @@ -2448,6 +2593,25 @@ css-literal-loader@^0.2.0: lodash "^4.17.2" memory-fs "^0.3.0" +css-loader@^0.28.11: + version "0.28.11" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + cssnano "^3.10.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + object-assign "^4.1.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + css-loader@^0.28.7: version "0.28.8" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.8.tgz#ff36381464dea18fe60f2601a060ba6445886bd5" @@ -2546,6 +2710,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" +csstype@^2.2.0: + version "2.5.6" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.6.tgz#2ae1db2319642d8b80a668d2d025c6196071e788" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -2580,7 +2748,7 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -2684,6 +2852,10 @@ depd@1.1.1, depd@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -2709,6 +2881,13 @@ detect-node@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + dependencies: + address "^1.0.1" + debug "^2.6.0" + diff@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" @@ -2721,19 +2900,6 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -disposables@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/disposables/-/disposables-1.0.2.tgz#36c6a674475f55a2d6913567a601444e487b4b6e" - -dnd-core@^2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-2.5.4.tgz#0c70a8dcbb609c0b222e275fcae9fa83e5897397" - dependencies: - asap "^2.0.6" - invariant "^2.0.0" - lodash "^4.2.0" - redux "^3.7.1" - dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -2770,14 +2936,10 @@ dom-converter@~0.1: dependencies: utila "~0.3" -"dom-helpers@^2.3.0 || ^3.0.0", dom-helpers@^3.2.0, dom-helpers@^3.2.1: +"dom-helpers@^2.3.0 || ^3.0.0", dom-helpers@^3.2.0, dom-helpers@^3.2.1, dom-helpers@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6" -dom-helpers@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-2.4.0.tgz#9bb4b245f637367b1fa670274272aa28fe06c367" - dom-serializer@0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -2820,11 +2982,19 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" +dotenv-webpack@^1.5.5: + version "1.5.7" + resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-1.5.7.tgz#c44395ab21d1fd28d79a90942a7b14b1debd145f" dependencies: - is-obj "^1.0.0" + dotenv "^5.0.1" + +dotenv@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" duplexify@^3.1.2, duplexify@^3.4.2: version "3.5.1" @@ -2886,6 +3056,10 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" @@ -2941,6 +3115,16 @@ es-abstract@^1.10.0, es-abstract@^1.4.3, es-abstract@^1.5.1, es-abstract@^1.6.1, is-callable "^1.1.3" is-regex "^1.0.4" +es-abstract@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + es-to-primitive@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" @@ -2956,7 +3140,7 @@ es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: es6-iterator "~2.0.1" es6-symbol "~3.1.1" -es5-shim@^4.5.9: +es5-shim@^4.5.10: version "4.5.10" resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.10.tgz#b7e17ef4df2a145b821f1497b50c25cf94026205" @@ -3000,6 +3184,13 @@ es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: d "1" es5-ext "~0.10.14" +es6-templates@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" + dependencies: + recast "~0.11.12" + through "~2.3.6" + es6-weak-map@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" @@ -3013,7 +3204,7 @@ escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3153,7 +3344,7 @@ esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -esprima@^3.1.3: +esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -3197,10 +3388,14 @@ eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" -events@^1.0.0, events@^1.1.1: +events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +events@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" + eventsource@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" @@ -3276,6 +3471,12 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + expect@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b" @@ -3329,6 +3530,41 @@ express@^4.16.2: utils-merge "1.0.1" vary "~1.1.2" +express@^4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -3346,6 +3582,14 @@ extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -3386,6 +3630,10 @@ fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -3439,6 +3687,12 @@ figures@^1.3.5, figures@^1.7.0: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" @@ -3452,12 +3706,12 @@ file-loader@^0.11.2: dependencies: loader-utils "^1.0.2" -file-loader@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.6.tgz#7b9a8f2c58f00a77fddf49e940f7ac978a3ea0e8" +file-loader@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" dependencies: loader-utils "^1.0.2" - schema-utils "^0.3.0" + schema-utils "^0.4.5" filename-regex@^2.0.0: version "2.0.1" @@ -3470,6 +3724,10 @@ fileset@^2.0.2: glob "^7.0.3" minimatch "^3.0.3" +filesize@3.5.11: + version "3.5.11" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee" + fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -3501,6 +3759,18 @@ finalhandler@1.1.0: statuses "~1.3.1" unpipe "~1.0.0" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" @@ -3670,7 +3940,7 @@ function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" -function.prototype.name@^1.0.3: +function.prototype.name@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.0.tgz#8bd763cc0af860a859cc5d49384d74b932cd2327" dependencies: @@ -3757,16 +4027,17 @@ glamor@^2.20.40: prop-types "^15.5.10" through "^2.3.8" -glamorous@^4.11.0, glamorous@^4.11.2: - version "4.11.2" - resolved "https://registry.yarnpkg.com/glamorous/-/glamorous-4.11.2.tgz#ce144c6a53e247ddf0896ad6faddebf78c49d864" +glamorous@^4.12.1: + version "4.13.1" + resolved "https://registry.yarnpkg.com/glamorous/-/glamorous-4.13.1.tgz#8909afcbc7f09133c6eb26bedcc1250c1f774312" dependencies: brcast "^3.0.0" + csstype "^2.2.0" fast-memoize "^2.2.7" html-tag-names "^1.1.1" is-function "^1.0.1" is-plain-object "^2.0.4" - react-html-attributes "^1.3.0" + react-html-attributes "^1.4.2" svg-tag-names "^1.1.0" glob-base@^0.3.0: @@ -3820,6 +4091,24 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@1.0.0, global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + global@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" @@ -3887,6 +4176,12 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" +gzip-size@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" + dependencies: + duplexer "^0.1.1" + handle-thing@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" @@ -3946,6 +4241,10 @@ has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" @@ -4049,10 +4348,6 @@ hoist-non-react-statics@1.x.x, hoist-non-react-statics@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb" -hoist-non-react-statics@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz#343db84c6018c650778898240135a1420ee22ce0" - home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -4060,6 +4355,12 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" +homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + hosted-git-info@^2.1.4: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" @@ -4091,6 +4392,16 @@ html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" +html-loader@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea" + dependencies: + es6-templates "^0.2.3" + fastparse "^1.1.1" + html-minifier "^3.5.8" + loader-utils "^1.1.0" + object-assign "^4.1.1" + html-minifier@^3.2.3: version "3.5.8" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.8.tgz#5ccdb1f73a0d654e6090147511f6e6b2ee312700" @@ -4104,11 +4415,23 @@ html-minifier@^3.2.3: relateurl "0.2.x" uglify-js "3.3.x" +html-minifier@^3.5.8: + version "3.5.19" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.19.tgz#ed53c4b7326fe507bc3a1adbcc3bbb56660a2ebd" + dependencies: + camel-case "3.0.x" + clean-css "4.1.x" + commander "2.16.x" + he "1.1.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + html-tag-names@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/html-tag-names/-/html-tag-names-1.1.2.tgz#f65168964c5a9c82675efda882875dcb2a875c22" -html-webpack-plugin@^2.28.0: +html-webpack-plugin@^2.28.0, html-webpack-plugin@^2.30.1: version "2.30.1" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz#7f9c421b7ea91ec460f56527d78df484ee7537d5" dependencies: @@ -4197,6 +4520,12 @@ iconv-lite@0.4.19, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@^0.4.17: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -4227,6 +4556,18 @@ immutable@^3.8.1: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + dependencies: + import-from "^2.1.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + dependencies: + resolve-from "^3.0.0" + import-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/import-loader/-/import-loader-1.0.1.tgz#73f1a8400f4e928051b4d9a6754dff4c0ba2bab4" @@ -4286,7 +4627,7 @@ inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" -ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -4304,6 +4645,25 @@ inline-style-prefixer@^3.0.6: bowser "^1.7.3" css-in-js-utils "^2.0.0" +inquirer@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + inquirer@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" @@ -4332,12 +4692,18 @@ interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" -invariant@^2.0.0, invariant@^2.1.0, invariant@^2.1.2, invariant@^2.2.2: +invariant@^2.1.0, invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: loose-envify "^1.0.0" +invariant@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -4350,6 +4716,10 @@ ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" +ipaddr.js@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" + is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -4530,7 +4900,7 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-obj@^1.0.0, is-obj@^1.0.1: +is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -4608,6 +4978,10 @@ is-resolvable@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.1.tgz#acca1cd36dbe44b974b924321555a70ba03b1cf4" +is-root@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-1.0.0.tgz#07b6c233bc394cd9d02ba15c966bd6660d6342d5" + is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -4644,6 +5018,10 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" @@ -5031,10 +5409,18 @@ json-loader@^0.5.4, json-loader@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -5078,7 +5464,11 @@ jsx-ast-utils@^1.3.4: version "1.4.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" -keycode@^2.1.0, keycode@^2.1.9: +keycode@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" + +keycode@^2.1.9: version "2.1.9" resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.1.9.tgz#964a23c54e4889405b4861a5c9f0480d45141dfa" @@ -5291,10 +5681,6 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" -lodash-compat@^3.10.1: - version "3.10.2" - resolved "https://registry.yarnpkg.com/lodash-compat/-/lodash-compat-3.10.2.tgz#c6940128a9d30f8e902cd2cf99fd0cba4ecfc183" - lodash-es@^4.2.1: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" @@ -5392,18 +5778,26 @@ lodash.tail@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@4.x.x, lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.4: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - lodash@^3.10.1, lodash@^3.8.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@^4.17.0: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -5465,9 +5859,9 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" -make-error@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.2.tgz#8762ffad2444dd8ff1f7c819629fa28e24fea1c4" +make-error@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" makeerror@1.0.x: version "1.0.11" @@ -5498,10 +5892,21 @@ markdown-jsx-loader@^3.0.2: marked "^0.3.6" prismjs "^1.3.0" +markdown-loader@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/markdown-loader/-/markdown-loader-2.0.2.tgz#1cdcf11307658cd611046d7db34c2fe80542af7c" + dependencies: + loader-utils "^1.1.0" + marked "^0.3.9" + marked@^0.3.5, marked@^0.3.6: version "0.3.12" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.12.tgz#7cf25ff2252632f3fe2406bde258e94eee927519" +marked@^0.3.9: + version "0.3.19" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" + math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" @@ -5523,6 +5928,10 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" +memoize-one@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-4.0.0.tgz#fc5e2f1427a216676a62ec652cf7398cfad123db" + memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" @@ -5619,12 +6028,22 @@ mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" +mime-db@~1.35.0: + version "1.35.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" + mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: mime-db "~1.30.0" +mime-types@~2.1.18: + version "2.1.19" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" + dependencies: + mime-db "~1.35.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -5655,7 +6074,13 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: - brace-expansion "^1.1.7" + brace-expansion "^1.1.7" + +minimatch@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" minimist@0.0.8: version "0.0.8" @@ -5684,6 +6109,21 @@ mississippi@^1.3.0: stream-each "^1.1.0" through2 "^2.0.0" +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" @@ -5749,6 +6189,10 @@ mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + nan@^2.3.0, nan@^2.3.2: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" @@ -5976,7 +6420,7 @@ npm-which@^3.0.1: npm-path "^2.0.2" which "^1.2.10" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -6112,6 +6556,18 @@ onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +opn@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" + dependencies: + is-wsl "^1.1.0" + opn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" @@ -6173,7 +6629,7 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -6269,6 +6725,17 @@ parse-json@^3.0.0: dependencies: error-ex "^1.3.1" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" @@ -6385,13 +6852,6 @@ pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" -podda@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/podda/-/podda-1.2.2.tgz#15b0edbd334ade145813343f5ecf9c10a71cf500" - dependencies: - babel-runtime "^6.11.6" - immutable "^3.8.1" - portfinder@^1.0.9: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" @@ -6480,6 +6940,13 @@ postcss-load-config@^1.2.0: postcss-load-options "^1.2.0" postcss-load-plugins "^2.3.0" +postcss-load-config@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" + dependencies: + cosmiconfig "^4.0.0" + import-cwd "^2.0.0" + postcss-load-options@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" @@ -6494,7 +6961,7 @@ postcss-load-plugins@^2.3.0: cosmiconfig "^2.1.1" object-assign "^4.1.0" -postcss-loader@^2.0.6, postcss-loader@^2.0.8: +postcss-loader@^2.0.6: version "2.0.10" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.0.10.tgz#090db0540140bd56a7a7f717c41bc29aeef4c674" dependencies: @@ -6503,6 +6970,15 @@ postcss-loader@^2.0.6, postcss-loader@^2.0.8: postcss-load-config "^1.2.0" schema-utils "^0.3.0" +postcss-loader@^2.1.2: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740" + dependencies: + loader-utils "^1.1.0" + postcss "^6.0.0" + postcss-load-config "^2.0.0" + schema-utils "^0.4.0" + postcss-merge-idents@^2.1.5: version "2.1.7" resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" @@ -6570,6 +7046,12 @@ postcss-modules-extract-imports@^1.1.0: dependencies: postcss "^6.0.1" +postcss-modules-extract-imports@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" + dependencies: + postcss "^6.0.1" + postcss-modules-local-by-default@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" @@ -6688,6 +7170,14 @@ postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.15: source-map "^0.6.1" supports-color "^5.1.0" +postcss@^6.0.17: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -6776,6 +7266,13 @@ prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8, loose-envify "^1.3.1" object-assign "^4.1.1" +prop-types@^15.6.1, prop-types@^15.6.2: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + proxy-addr@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" @@ -6783,6 +7280,13 @@ proxy-addr@~2.0.2: forwarded "~0.1.2" ipaddr.js "1.5.2" +proxy-addr@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.6.0" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -6808,6 +7312,13 @@ pump@^1.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pumpify@^1.3.3: version "1.3.5" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" @@ -6824,6 +7335,10 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -6918,20 +7433,22 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-bootstrap@^0.28.0: - version "0.28.5" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.28.5.tgz#393ab59ad66071a6a7bae0fda7518cdd228f2baf" - dependencies: - babel-runtime "^5.8.25" - classnames "^2.1.5" - dom-helpers "^2.4.0" - invariant "^2.1.2" - keycode "^2.1.0" - lodash-compat "^3.10.1" - react-overlays "^0.6.0" - react-prop-types "^0.3.0" - uncontrollable "^3.1.3" - warning "^2.1.0" +react-bootstrap@^0.32.1: + version "0.32.1" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.32.1.tgz#60624c1b48a39d773ef6cce6421a4f33ecc166bb" + dependencies: + babel-runtime "^6.11.6" + classnames "^2.2.5" + dom-helpers "^3.2.0" + invariant "^2.2.1" + keycode "^2.1.2" + prop-types "^15.5.10" + prop-types-extra "^1.0.1" + react-overlays "^0.8.0" + react-prop-types "^0.4.0" + react-transition-group "^2.0.0" + uncontrollable "^4.1.0" + warning "^3.0.0" react-component-metadata@^3.0.0: version "3.1.0" @@ -6942,24 +7459,30 @@ react-component-metadata@^3.0.0: babylon "^6.7.0" lodash "^3.8.0" -react-dnd-html5-backend@^2.1.2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-2.5.4.tgz#974ad083f67b12d56977a5b171f5ffeb29d78352" - dependencies: - lodash "^4.2.0" - -react-dnd@^2.1.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-2.5.4.tgz#0b6dc5e9d0dfc2909f4f4fe736e5534f3afd1bd9" - dependencies: - disposables "^1.0.1" - dnd-core "^2.5.4" - hoist-non-react-statics "^2.1.0" - invariant "^2.1.0" - lodash "^4.2.0" - prop-types "^15.5.10" +react-dev-utils@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-5.0.1.tgz#1f396e161fe44b595db1b186a40067289bf06613" + dependencies: + address "1.0.3" + babel-code-frame "6.26.0" + chalk "1.1.3" + cross-spawn "5.1.0" + detect-port-alt "1.1.6" + escape-string-regexp "1.0.5" + filesize "3.5.11" + global-modules "1.0.0" + gzip-size "3.0.0" + inquirer "3.3.0" + is-root "1.0.0" + opn "5.2.0" + react-error-overlay "^4.0.0" + recursive-readdir "2.2.1" + shell-quote "1.6.1" + sockjs-client "1.1.4" + strip-ansi "3.0.1" + text-table "0.2.0" -react-docgen@^2.14.1, react-docgen@^2.15.0: +react-docgen@^2.14.1: version "2.20.0" resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-2.20.0.tgz#41a6da483a34a4aaed041a9909f5e61864d681cb" dependencies: @@ -6971,27 +7494,43 @@ react-docgen@^2.14.1, react-docgen@^2.15.0: node-dir "^0.1.10" recast "^0.12.6" -react-dom@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044" +react-docgen@^3.0.0-beta11: + version "3.0.0-rc.0" + resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-3.0.0-rc.0.tgz#6452afc31649d651c9bafce9b94a470581530b76" + dependencies: + "@babel/parser" "7.0.0-beta.53" + async "^2.1.4" + babel-runtime "^6.9.2" + commander "^2.9.0" + doctrine "^2.0.0" + node-dir "^0.1.10" + recast "^0.15.0" + +react-dom@^16.4.1: + version "16.4.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.1.tgz#7f8b0223b3a5fbe205116c56deb85de32685dad6" dependencies: fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.0" -react-fuzzy@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/react-fuzzy/-/react-fuzzy-0.5.1.tgz#295c2a4079ad39402e05605d9d7accd2db8527b6" +react-error-overlay@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.0.tgz#d198408a85b4070937a98667f500c832f86bd5d4" + +react-fuzzy@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/react-fuzzy/-/react-fuzzy-0.5.2.tgz#fc13bf6f0b785e5fefe908724efebec4935eaefe" dependencies: babel-runtime "^6.23.0" classnames "^2.2.5" fuse.js "^3.0.1" prop-types "^15.5.9" -react-html-attributes@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/react-html-attributes/-/react-html-attributes-1.4.1.tgz#97b5ec710da68833598c8be6f89ac436216840a5" +react-html-attributes@^1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/react-html-attributes/-/react-html-attributes-1.4.3.tgz#8c36c35fce6b750938d286af428ed1da7625186e" dependencies: html-element-attributes "^1.0.0" @@ -7012,21 +7551,17 @@ react-inspector@^2.2.2: babel-runtime "^6.26.0" is-dom "^1.0.9" -react-modal@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.1.10.tgz#8898b5cc4ebba78adbb8dea4c55a69818aa682cc" +react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + +react-modal@^3.3.2: + version "3.5.1" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.5.1.tgz#33d38527def90ea324848f7d63e53acc4468a451" dependencies: exenv "^1.2.0" prop-types "^15.5.10" - warning "^3.0.0" - -react-overlays@^0.6.0: - version "0.6.12" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.6.12.tgz#a079c750cc429d7db4c7474a95b4b54033e255c3" - dependencies: - classnames "^2.2.5" - dom-helpers "^3.2.0" - react-prop-types "^0.4.0" + react-lifecycles-compat "^3.0.0" warning "^3.0.0" react-overlays@^0.7.0: @@ -7039,11 +7574,16 @@ react-overlays@^0.7.0: prop-types-extra "^1.0.1" warning "^3.0.0" -react-prop-types@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/react-prop-types/-/react-prop-types-0.3.2.tgz#e2763ac6f3a80199d8981c3647c44b0554c97b7f" +react-overlays@^0.8.0: + version "0.8.3" + resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.8.3.tgz#fad65eea5b24301cca192a169f5dddb0b20d3ac5" dependencies: - warning "^2.0.0" + classnames "^2.2.5" + dom-helpers "^3.2.1" + prop-types "^15.5.10" + prop-types-extra "^1.0.1" + react-transition-group "^2.2.0" + warning "^3.0.0" react-prop-types@^0.4.0: version "0.4.0" @@ -7051,14 +7591,13 @@ react-prop-types@^0.4.0: dependencies: warning "^3.0.0" -react-split-pane@^0.1.74: - version "0.1.74" - resolved "https://registry.yarnpkg.com/react-split-pane/-/react-split-pane-0.1.74.tgz#cf79fc98b51ab0763fdc778749b810a102b036ca" +react-split-pane@^0.1.77: + version "0.1.82" + resolved "https://registry.yarnpkg.com/react-split-pane/-/react-split-pane-0.1.82.tgz#42fbb9fd4823f05e037de0dab3cd6cf9bf0cf4ea" dependencies: - "@types/inline-style-prefixer" "^3.0.0" - "@types/react" "^16.0.18" inline-style-prefixer "^3.0.6" prop-types "^15.5.10" + react-lifecycles-compat "^3.0.4" react-style-proptype "^3.0.0" react-style-proptype@^3.0.0: @@ -7077,6 +7616,15 @@ react-transition-group@^1.1.2: prop-types "^15.5.6" warning "^3.0.0" +react-transition-group@^2.0.0, react-transition-group@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.4.0.tgz#1d9391fabfd82e016f26fabd1eec329dbd922b5a" + dependencies: + dom-helpers "^3.3.1" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-lifecycles-compat "^3.0.4" + react-treebeard@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/react-treebeard/-/react-treebeard-2.1.0.tgz#fbd5cf51089b6f09a9b18350ab3bddf736e57800" @@ -7088,9 +7636,9 @@ react-treebeard@^2.1.0: shallowequal "^0.2.2" velocity-react "^1.3.1" -react@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba" +react@^16.4.1: + version "16.4.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.4.1.tgz#de51ba5764b5dbcd1f9079037b862bd26b82fe32" dependencies: fbjs "^0.8.16" loose-envify "^1.1.0" @@ -7175,12 +7723,36 @@ recast@^0.12.6: private "~0.1.5" source-map "~0.6.1" +recast@^0.15.0: + version "0.15.3" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.15.3.tgz#5fc1fd1c8e2d4d027ee3977a176bbb8d1c83305e" + dependencies: + ast-types "0.11.5" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.6.1" + +recast@~0.11.12: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" dependencies: resolve "^1.1.6" +recursive-readdir@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99" + dependencies: + minimatch "3.0.3" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -7202,7 +7774,7 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" -redux@^3.7.1, redux@^3.7.2: +redux@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" dependencies: @@ -7243,6 +7815,12 @@ regex-not@^1.0.0: dependencies: extend-shallow "^2.0.1" +regexp.prototype.flags@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" + dependencies: + define-properties "^1.1.2" + regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -7312,7 +7890,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2, request@^2.60.0, request@^2.79.0, request@^2.83.0: +request@2, request@^2.60.0, request@^2.79.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" dependencies: @@ -7424,6 +8002,13 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" +resolve-dir@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" @@ -7453,13 +8038,20 @@ restore-cursor@^1.0.1: exit-hook "^1.0.0" onetime "^1.0.0" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -7478,12 +8070,28 @@ run-async@^0.1.0: dependencies: once "^1.3.0" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" dependencies: aproba "^1.1.1" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + rx-lite@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" @@ -7498,6 +8106,10 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + sane@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56" @@ -7541,6 +8153,13 @@ schema-utils@^0.3.0: dependencies: ajv "^5.0.0" +schema-utils@^0.4.0, schema-utils@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + schema-utils@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.3.tgz#e2a594d3395834d5e15da22b48be13517859458e" @@ -7595,6 +8214,24 @@ send@0.16.1: range-parser "~1.2.0" statuses "~1.3.1" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + serialize-javascript@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005" @@ -7630,6 +8267,15 @@ serve-static@1.13.1: parseurl "~1.3.2" send "0.16.1" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -7706,11 +8352,20 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" +shell-quote@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + shelljs@^0.5.1: version "0.5.3" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113" -shelljs@^0.7.5, shelljs@^0.7.8: +shelljs@^0.7.5: version "0.7.8" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" dependencies: @@ -7718,6 +8373,14 @@ shelljs@^0.7.5, shelljs@^0.7.8: interpret "^1.0.0" rechoir "^0.6.2" +shelljs@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + shellwords@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -7821,7 +8484,7 @@ source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6: +source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -7902,6 +8565,12 @@ ssri@^5.0.0: dependencies: safe-buffer "^5.1.0" +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + dependencies: + safe-buffer "^5.1.1" + staged-git-files@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35" @@ -7913,7 +8582,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2": +"statuses@>= 1.3.1 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" @@ -7980,13 +8649,23 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: +string-width@^2.0.0, string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string.prototype.matchall@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-3.0.0.tgz#66f4d8dd5c6c6cea4dffb55ec5f3184a8dd0dd59" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has-symbols "^1.0.0" + regexp.prototype.flags "^1.2.0" + string.prototype.padend@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" @@ -8025,7 +8704,7 @@ stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" dependencies: @@ -8065,13 +8744,6 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -style-loader@^0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.18.2.tgz#cc31459afbcd6d80b7220ee54b291a9fd66ff5eb" - dependencies: - loader-utils "^1.0.2" - schema-utils "^0.3.0" - style-loader@^0.19.0: version "0.19.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.19.1.tgz#591ffc80bcefe268b77c5d9ebc0505d772619f85" @@ -8079,6 +8751,13 @@ style-loader@^0.19.0: loader-utils "^1.0.2" schema-utils "^0.3.0" +style-loader@^0.20.3: + version "0.20.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.20.3.tgz#ebef06b89dec491bcb1fdb3452e913a6fd1c10c4" + dependencies: + loader-utils "^1.1.0" + schema-utils "^0.4.5" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -8101,6 +8780,12 @@ supports-color@^5.1.0: dependencies: has-flag "^2.0.0" +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + svg-tag-names@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/svg-tag-names/-/svg-tag-names-1.1.1.tgz#9641b29ef71025ee094c7043f7cdde7d99fbd50a" @@ -8133,6 +8818,12 @@ symbol-tree@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" +symbol.prototype.description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.0.tgz#6e355660eb1e44ca8ad53a68fdb72ef131ca4b12" + dependencies: + has-symbols "^1.0.0" + table@^3.7.8: version "3.8.3" resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" @@ -8183,7 +8874,7 @@ test-exclude@^4.1.1: read-pkg-up "^1.0.1" require-main-filename "^1.0.1" -text-table@~0.2.0: +text-table@0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -8198,7 +8889,7 @@ through2@^2.0.0: readable-stream "^2.1.5" xtend "~4.0.1" -through@^2.3.6, through@^2.3.8: +through@^2.3.6, through@^2.3.8, through@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -8220,6 +8911,12 @@ tiny-emitter@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -8312,6 +9009,13 @@ type-is@~1.6.15: media-typer "0.3.0" mime-types "~2.1.15" +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -8334,6 +9038,13 @@ uglify-js@3.3.x: commander "~2.12.1" source-map "~0.6.1" +uglify-js@3.4.x: + version "3.4.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.5.tgz#650889c0766cf0f6fd5346cea09cd212f544be69" + dependencies: + commander "~2.16.0" + source-map "~0.6.1" + uglify-js@^2.6, uglify-js@^2.8.29: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -8368,6 +9079,19 @@ uglifyjs-webpack-plugin@^1.0.0-beta.2: webpack-sources "^1.1.0" worker-farm "^1.5.2" +uglifyjs-webpack-plugin@^1.2.4: + version "1.2.7" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -8376,13 +9100,7 @@ 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@^3.1.3: - version "3.3.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-3.3.1.tgz#e23b402e7a4c69b1853fb4b43ce34b6480c65b6f" - dependencies: - invariant "^2.1.0" - -uncontrollable@^4.0.0: +uncontrollable@^4.0.0, uncontrollable@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-4.1.0.tgz#e0358291252e1865222d90939b19f2f49f81c1a9" dependencies: @@ -8423,12 +9141,6 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - dependencies: - crypto-random-string "^1.0.0" - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -8444,6 +9156,12 @@ upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" +uri-js@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -8521,6 +9239,10 @@ uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" +uuid@^3.2.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + v8flags@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" @@ -8575,7 +9297,7 @@ walker@~1.0.5: dependencies: makeerror "1.0.x" -warning@^2.0.0, warning@^2.1.0: +warning@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/warning/-/warning-2.1.0.tgz#21220d9c63afc77a8c92111e011af705ce0c6901" dependencies: @@ -8648,7 +9370,7 @@ webpack-atoms@^4.1.2: node-sass "^4.5.3" sass-loader "^6.0.6" -webpack-dev-middleware@1.12.2, webpack-dev-middleware@^1.12.0: +webpack-dev-middleware@1.12.2, webpack-dev-middleware@^1.12.2: version "1.12.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" dependencies: @@ -8690,9 +9412,9 @@ webpack-dev-server@^2.9.5: webpack-dev-middleware "1.12.2" yargs "6.6.0" -webpack-hot-middleware@^2.20.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.21.0.tgz#7b3c113a7a4b301c91e0749573c7aab28b414b52" +webpack-hot-middleware@^2.22.1: + version "2.22.3" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.22.3.tgz#ae6025d57d656085c5b716b44e0bc0f796787776" dependencies: ansi-html "0.0.7" html-entities "^1.2.0" @@ -8706,7 +9428,7 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^3.10.0, webpack@^3.6.0, webpack@^3.8.1: +webpack@^3.10.0, webpack@^3.6.0: version "3.10.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.10.0.tgz#5291b875078cf2abf42bdd23afe3f8f96c17d725" dependencies: @@ -8733,6 +9455,33 @@ webpack@^3.10.0, webpack@^3.6.0, webpack@^3.8.1: webpack-sources "^1.0.1" yargs "^8.0.2" +webpack@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + async "^2.1.2" + enhanced-resolve "^3.4.0" + escope "^3.6.0" + interpret "^1.0.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + mkdirp "~0.5.0" + node-libs-browser "^2.0.0" + source-map "^0.5.3" + supports-color "^4.2.1" + tapable "^0.2.7" + uglifyjs-webpack-plugin "^0.4.6" + watchpack "^1.4.0" + webpack-sources "^1.0.1" + yargs "^8.0.2" + websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" @@ -8779,6 +9528,12 @@ which@1, which@^1.2.10, which@^1.2.12, which@^1.2.9: dependencies: isexe "^2.0.0" +which@^1.2.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" @@ -8823,7 +9578,7 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^2.0.0, write-file-atomic@^2.1.0: +write-file-atomic@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: @@ -8837,10 +9592,6 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - xml-char-classes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" @@ -8857,6 +9608,10 @@ y18n@^3.2.0, y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"