diff --git a/.babelrc b/.babelrc index 67c39e13d..2999e570e 100644 --- a/.babelrc +++ b/.babelrc @@ -1,8 +1,22 @@ { - "presets": ["@babel/preset-env", "@babel/preset-react"], + "presets": [ + "@babel/preset-env", + [ + "@babel/preset-react", + { + "runtime": "automatic" + } + ] + ], "plugins": [ - "@babel/plugin-proposal-class-properties", - "@babel/plugin-proposal-object-rest-spread" + "@babel/plugin-transform-class-properties", + "@babel/plugin-transform-object-rest-spread", + [ + "@babel/plugin-transform-react-jsx", + { + "runtime": "automatic" + } + ] ], "env": { "production": { @@ -10,11 +24,15 @@ [ "react-remove-properties", { - "properties": ["data-testid"] + "properties": [ + "data-testid" + ] } ] ], - "ignore": ["src/lib/__tests__/**"] + "ignore": [ + "src/lib/__tests__/**" + ] } } } diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index ef898e76b..000000000 --- a/.eslintrc +++ /dev/null @@ -1,34 +0,0 @@ -{ - "plugins": [ - "react", - "jest", - "prettier" - ], - "env": { - "jest/globals": true, - "browser": true, - "node": true, - "es6": true - }, - "rules": { - "react/jsx-uses-react": 2, - "react/jsx-uses-vars": 2, - "react/no-unused-prop-types": 2, - "react/react-in-jsx-scope": 2, - "no-labels": 0, - "arrow-parens": 0 - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "prettier", - "prettier/react" - ], - "parser": "babel-eslint", - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "sourceType": "module" - } -} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..39d4ed38b --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,41 @@ +{ + "env": { + "browser": true, + "jest/globals": true, + "node": true, + "es6": true + }, + "settings": { + "react": { + "version": "detect" + } + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react/recommended", + "prettier" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint", + "react", + "jest", + "prettier" + ], + "rules": { + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-explicit-any": "off", + "react/jsx-uses-vars": 2, + "react/no-children-prop": 0, + "react/no-unused-prop-types": 0, + "no-labels": 0, + "arrow-parens": 0, + "react/jsx-uses-react": "off", + "react/react-in-jsx-scope": "off" + } +} diff --git a/.gitignore b/.gitignore index 2db738b4f..7337d0ea4 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ package-lock.json coverage *.orig +dist diff --git a/.prettierrc b/.prettierrc index fd496a820..e853dcdbb 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,4 +1,6 @@ { + "printWidth": 120, "singleQuote": true, - "semi": false + "semi": false, + "trailingComma": "all" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a0fac65e..8ebbe51a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,25 @@ and this project adheres (more or less) to [Semantic Versioning](http://semver.o ## Unreleased +## 0.30.0 (beta) +Huge update made by @Remco4EF and @remcoblumink + * full rewrite to typescript + * uses Vite as bundler + * Updates dependencies to latest versions + * Updates react usage to 18+ + * REMOVED enzyme for tests --> testing does not work atm + + +## 0.28.0 + +* Add unit argument to onZoom and onTimeChange callbacks @hckr #655 * Add `className` prop to Timeline component to override `react-calendar-timeline` class #682 +* support zoom level seconds #835 @horizon-plaza +* custom buffer prop (help with controlled scrolling) @Ilaiwi +* Fix injecting custom vertical line's class names for time periods longer than day @RafikiTiki +* fix Context Menu unintentionally disabled by default @dsgipe #769 +* delete props `headerLabelFormats` and `subHeaderLabelFormats` not you can pass `formatLabel` function to `DateHeader` with label width and start and end time of intervals + ## 0.26.7 @@ -49,11 +67,11 @@ Using controlled scroll and react-spring to trigger scrolling and create an anim * add documentation for `onItemDeselect` #350 @ilaiwi * solve a bug where `onItemDeselect` is not triggered as expected for several item clicks #350 @ilaiwi -* fix row height on browser scaling #615 @gaston-niglia +* fix row height on browser scaling #615 @gaston-niglia ### Packages -update to `node-sass@4.12.0` for newer versions of node. +update to `node-sass@4.12.0` for newer versions of node. ## 0.26.2 @@ -85,7 +103,7 @@ you can as well solve the issue without upgrading by adding the following style #### Breaking -* Removed `` in favour of allowing for custom component to be rendered on move or resize. Check out the demo in `demo/app/demo-custom-info-label` for an example on how to display your own custom info label or [this example](https://codesandbox.io/s/timeline-demo-info-label-neec9). +* Removed `` in favour of allowing for custom component to be rendered on move or resize. Check out the demo in `demo/app/demo-custom-info-label` for an example on how to display your own custom info label or [this example](https://codesandbox.io/s/timeline-demo-info-label-neec9). ## 0.25.4 @@ -383,7 +401,7 @@ from 'react-calendar-timeline' * added `stickyHeader` to disable/enable timeline header sticking on scroll. * removed `fullUpdate` prop and functionality. Labels rely on `position: sticky` to show for items that start before `visibleTimeStart`. This (should) greatly improve scroll performance. -* removed extraneous css such as `text-align: center` on `.rct-item`, `.rct-item-overflow` to simplify the dom structure of `Item.js` +* removed extraneous css such as `text-align: center` on `.rct-item`, `.rct-item-overflow` to simplify the dom structure of `Item.tsx` * added `headerRef` callback to receive a reference to the header element. Due to the change in how the header positioning is implemented (i.e. using `position: sticky`), there is a need to use a polyfill in [certain browsers](https://caniuse.com/#feat=css-sticky) that don't support `position: sticky`. With a reference to the header dom element, you can use a polyfill to apply sticky behavior. * `minimumWidthForItemContentVisibility` prop to control at what width inner item content is rendered. diff --git a/README.md b/README.md index daa482dbb..bfb10cfa3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,28 @@ + # React Calendar Timeline A modern and responsive React timeline component. +**🎉 Version 0.30.0-beta.1 Now Available!** + +We're excited to announce the beta release of v0.30.0 which includes: +- Full TypeScript rewrite +- Vite as bundler +- Updated dependencies to latest versions +- React 18+ support + +The beta version is available via: +```bash +npm install react-calendar-timeline@beta +``` + +We encourage users to try out the beta and provide feedback before the stable release. Please report any issues on GitHub. + + Note: Testing framework has been updated and some tests are currently being migrated. + +# ⚠️⚠️⚠️⚠️ HELP WANTED +please email me [ahmad.ilaiwi@gmail.com](mailto:ahmad.ilaiwi@gmail.com) and we will setup some time to speak and see if you can help maintain this library. + ![calendar demo](https://raw.githubusercontent.com/namespace-ee/react-calendar-timeline/master/demo.gif) Checkout the [examples here](https://github.com/namespace-ee/react-calendar-timeline/tree/master/examples)! @@ -140,6 +161,14 @@ The exact viewport of the calendar. When these are specified, scrolling in the c **Note that you need to provide either `defaultTimeStart/End` or `visibleTimeStart/End` for the timeline to function** +## buffer + +a number (default to 3) which represents the extra timeline rendered on right and lift of the visible area which the user will scroll through before the time rerenders. + +more explication in section [behind the scenes](#behind-the-scenes) + +Note: setting buffer to 1 will disable the scrolling on the timeline + ## selected An array with id's corresponding to id's in items (`item.id`). If this prop is set you have to manage the selected items yourself within the `onItemSelect` handler to update the property with new id's and use `onItemDeselect` handler to clear selection. This overwrites the default behaviour of selecting one item on click. @@ -202,6 +231,7 @@ What percentage of the height of the line is taken by the item? Default `0.65` Smallest time the calendar can zoom to in milliseconds. Default `60 * 60 * 1000` (1 hour) +__notes__: please note than second won't show up unless you change this to `60 * 1000` ## maxZoom Largest time the calendar can zoom to in milliseconds. Default `5 * 365.24 * 86400 * 1000` (5 years) @@ -312,7 +342,7 @@ Called when an empty spot on the canvas was double clicked. Get the group ID and Called when the canvas is clicked by the right button of the mouse. Note: If this property is set the default context menu doesn't appear -## onZoom(timelineContext) +## onZoom(timelineContext, unit) Called when the timeline is zoomed, either via mouse/pinch zoom or clicking header to change timeline units @@ -342,7 +372,7 @@ function (action, item, time, resizeEdge) { ``` -## onTimeChange(visibleTimeStart, visibleTimeEnd, updateScrollCanvas) +## onTimeChange(visibleTimeStart, visibleTimeEnd, updateScrollCanvas, unit) A function that's called when the user tries to scroll. Call the passed `updateScrollCanvas(start, end)` with the updated visibleTimeStart and visibleTimeEnd (as unix timestamps in milliseconds) to change the scroll behavior, for example to limit scrolling. @@ -435,8 +465,8 @@ Rather than applying props on the element yourself and to avoid your props being * onTouchEnd: event handler * onDoubleClick: event handler * onContextMenu: event handler - * style: inline object - + * style: inline object + \*\* _the given styles will only override the styles that are not a requirement for positioning the item. Other styles like `color`, `radius` and others_ @@ -915,6 +945,12 @@ by default we provide a responsive format for the dates based on the label width mediumLong: 'HH:mm', medium: 'HH:mm', short: 'mm', + }, + second: { + "long": 'mm:ss', + mediumLong: 'mm:ss', + medium: 'mm:ss', + "short": 'ss' } } ``` @@ -1236,6 +1272,8 @@ This results in a visually endless scrolling canvas with optimal performance. Extensibility and usability: While some parameters (`onTimeChange`, `moveResizeValidator`) might be hard to configure, these are design decisions to make it as extensible as possible. If you have recipes for common tasks regarding those parameters, send a PR to add them to this doc. +Note: 3x can be controlled by changing the buffer + ## Interaction To interact and navigate within the timeline there are the following options for the user: @@ -1263,7 +1301,7 @@ $ yarn start Check http://0.0.0.0:8888/ in your browser and have fun! -Please run `npm run lint` before you send a pull request. `npm run jest` runs the tests. +Please run `npm run lint` before you send a pull request. `npm run test` runs the jest tests. - - + + + + + + + Vite + React + TS + + +
+ + diff --git a/demo/index.js b/demo/index.js deleted file mode 100644 index 6cc990bef..000000000 --- a/demo/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom' -import 'react-calendar-timeline-css' -import App from './app' - -const render = AppToRender => { - ReactDOM.render(, document.getElementById('root')) -} - -render(App) - -if (module.hot) { - module.hot.accept('./app', () => { - const NextApp = require('./app').default - - render(NextApp) - }) -} diff --git a/demo/package.json b/demo/package.json new file mode 100644 index 000000000..78e8d766d --- /dev/null +++ b/demo/package.json @@ -0,0 +1,35 @@ +{ + "name": "react-calendar-timeline-demos", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint react-calendar-timeline-demos --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.27.0", + "react-router": "^6.27.0" + }, + "packageManager": "npm@8.19.2", + "resolutions": { + "react-calendar-timeline": "../src/index.ts" + }, + "devDependencies": { + "@types/randomcolor": "^0.5.9", + "@types/react": "^18.3.11", + "@types/react-dom": "^18.3.1", + "@typescript-eslint/eslint-plugin": "^8.8.1", + "@typescript-eslint/parser": "^8.8.1", + "@vitejs/plugin-react-swc": "^3.7.1", + "eslint": "^8.57.1", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.12", + "typescript": "^5.6.3", + "vite": "^5.4.8" + } +} diff --git a/demo/public/vite.svg b/demo/public/vite.svg new file mode 100644 index 000000000..ee9fadaf9 --- /dev/null +++ b/demo/public/vite.svg @@ -0,0 +1 @@ + diff --git a/demo/src/App.tsx b/demo/src/App.tsx new file mode 100644 index 000000000..184bfb751 --- /dev/null +++ b/demo/src/App.tsx @@ -0,0 +1,105 @@ +import { ComponentType } from 'react' +import { + createBrowserRouter, + Link, + RouteObject, + RouterProvider, +} from 'react-router-dom' + +import DemoMain from './demo-main' +import DemoPerformance from './demo-performance' +import DemoTreePGroups from './demo-tree-groups' +import LinkedTimelines from './demo-linked-timelines' +import ElementResize from './demo-element-resize' +import Renderers from './demo-renderers' +import VerticalClasses from './demo-vertical-classes' +import CustomItems from './demo-custom-items' +import CustomHeaders from './demo-headers' +import CustomInfoLabel from './demo-custom-info-label' +import ControledSelect from './demo-controlled-select' +import ControlledScrolling from './demo-controlled-scrolling' +const loader = () => 'loading' +const routes: RouteObject[] = [ + { + path: '/', + Component: withLayout(DemoMain), + loader, + }, + { + path: '/DemoPerformance', + Component: withLayout(DemoPerformance), + loader, + }, + { + path: '/DemoTreePGroups', + Component: withLayout(DemoTreePGroups), + }, + { + path: '/LinkedTimelines', + Component: withLayout(LinkedTimelines), + }, + { + path: '/ElementResize', + Component: withLayout(ElementResize), + }, + { + path: '/Renderers', + Component: withLayout(Renderers), + }, + { + path: '/VerticalClasses', + Component: withLayout(VerticalClasses), + }, + { + path: '/CustomItems', + Component: withLayout(CustomItems), + }, + { + path: '/CustomHeaders', + Component: withLayout(CustomHeaders), + }, + { + path: '/CustomInfoLabel', + Component: withLayout(CustomInfoLabel), + }, + { + path: '/ControledSelect', + Component: withLayout(ControledSelect), + }, + { + path: '/ControlledScrolling', + Component: withLayout(ControlledScrolling), + }, +] + +function Menu() { + return ( +
+ Choose the demo: + {routes.map((key) => ( + + {key.path === '/' ? 'Home' : key.path!.replace('/', '')} + + ))} +
+ ) +} + +function withLayout(Component: ComponentType) { + return function Layout() { + return ( +
+ +
+ +
+
+ ) + } +} + +function App() { + return +} + +export default App diff --git a/demo/src/assets/react.svg b/demo/src/assets/react.svg new file mode 100644 index 000000000..8e0e0f15c --- /dev/null +++ b/demo/src/assets/react.svg @@ -0,0 +1 @@ + diff --git a/demo/src/demo-controlled-scrolling/index.jsx b/demo/src/demo-controlled-scrolling/index.jsx new file mode 100644 index 000000000..4c657e9f7 --- /dev/null +++ b/demo/src/demo-controlled-scrolling/index.jsx @@ -0,0 +1,213 @@ +/* eslint-disable no-console */ +import React, { Component } from 'react' +import dayjs from 'dayjs' + +import Timeline, { + TimelineMarkers, + TimelineHeaders, + TodayMarker, + CustomMarker, + CursorMarker, + CustomHeader, + SidebarHeader, + DateHeader, +} from 'react-calendar-timeline' + +import generateFakeData from '../generate-fake-data' + +var minTime = dayjs().add(-6, 'months').valueOf() +var maxTime = dayjs().add(6, 'months').valueOf() + +var keys = { + groupIdKey: 'id', + groupTitleKey: 'title', + groupRightTitleKey: 'rightTitle', + itemIdKey: 'id', + itemTitleKey: 'title', + itemDivTitleKey: 'title', + itemGroupKey: 'group', + itemTimeStartKey: 'start', + itemTimeEndKey: 'end', +} + +export default class App extends Component { + constructor(props) { + super(props) + + const { groups, items } = generateFakeData() + const visibleTimeStart = dayjs().startOf('day').valueOf() + const visibleTimeEnd = dayjs().startOf('day').add(1, 'day').valueOf() + + this.state = { + groups, + items, + visibleTimeStart, + visibleTimeEnd, + } + } + + handleCanvasClick = (groupId, time) => { + console.log('Canvas clicked', groupId, dayjs(time).format()) + } + + handleCanvasDoubleClick = (groupId, time) => { + console.log('Canvas double clicked', groupId, dayjs(time).format()) + } + + handleCanvasContextMenu = (group, time) => { + console.log('Canvas context menu', group, dayjs(time).format()) + } + + handleItemClick = (itemId, _, time) => { + console.log('Clicked: ' + itemId, dayjs(time).format()) + } + + handleItemSelect = (itemId, _, time) => { + console.log('Selected: ' + itemId, dayjs(time).format()) + } + + handleItemDoubleClick = (itemId, _, time) => { + console.log('Double Click: ' + itemId, dayjs(time).format()) + } + + handleItemContextMenu = (itemId, _, time) => { + console.log('Context Menu: ' + itemId, dayjs(time).format()) + } + + handleItemMove = (itemId, dragTime, newGroupOrder) => { + const { items, groups } = this.state + + const group = groups[newGroupOrder] + + this.setState({ + items: items.map((item) => + item.id === itemId + ? Object.assign({}, item, { + start: dragTime, + end: dragTime + (item.end - item.start), + group: group.id, + }) + : item, + ), + }) + + console.log('Moved', itemId, dragTime, newGroupOrder) + } + + handleItemResize = (itemId, time, edge) => { + const { items } = this.state + + this.setState({ + items: items.map((item) => + item.id === itemId + ? Object.assign({}, item, { + start: edge === 'left' ? time : item.start, + end: edge === 'left' ? item.end : time, + }) + : item, + ), + }) + + console.log('Resized', itemId, time, edge) + } + + // this limits the timeline to -6 months ... +6 months + handleTimeChange = (visibleTimeStart, visibleTimeEnd, updateScrollCanvas) => { + if (visibleTimeStart < minTime && visibleTimeEnd > maxTime) { + updateScrollCanvas(minTime, maxTime) + } else if (visibleTimeStart < minTime) { + updateScrollCanvas(minTime, minTime + (visibleTimeEnd - visibleTimeStart)) + } else if (visibleTimeEnd > maxTime) { + updateScrollCanvas(maxTime - (visibleTimeEnd - visibleTimeStart), maxTime) + } else { + updateScrollCanvas(visibleTimeStart, visibleTimeEnd) + } + } + + moveResizeValidator = (action, item, time) => { + if (time < new Date().getTime()) { + var newTime = + Math.ceil(new Date().getTime() / (15 * 60 * 1000)) * (15 * 60 * 1000) + return newTime + } + + return time + } + + onPrevClick = () => { + this.setState((state) => { + const zoom = state.visibleTimeEnd - state.visibleTimeStart + return { + visibleTimeStart: state.visibleTimeStart - zoom, + visibleTimeEnd: state.visibleTimeEnd - zoom, + } + }) + } + + onNextClick = () => { + this.setState((state) => { + const zoom = state.visibleTimeEnd - state.visibleTimeStart + console.log({ + visibleTimeStart: state.visibleTimeStart + zoom, + visibleTimeEnd: state.visibleTimeEnd + zoom, + }) + return { + visibleTimeStart: state.visibleTimeStart + zoom, + visibleTimeEnd: state.visibleTimeEnd + zoom, + } + }) + } + + render() { + const { groups, items, visibleTimeStart, visibleTimeEnd } = this.state + + return ( +
+ + + Above The Left
} + canMove + canResize="right" + canSelect + itemsSorted + itemTouchSendsClick={false} + stackItems + itemHeightRatio={0.75} + visibleTimeStart={visibleTimeStart} + visibleTimeEnd={visibleTimeEnd} + onCanvasClick={this.handleCanvasClick} + onCanvasDoubleClick={this.handleCanvasDoubleClick} + onCanvasContextMenu={this.handleCanvasContextMenu} + onItemClick={this.handleItemClick} + onItemSelect={this.handleItemSelect} + onItemContextMenu={this.handleItemContextMenu} + onItemMove={this.handleItemMove} + onItemResize={this.handleItemResize} + onItemDoubleClick={this.handleItemDoubleClick} + buffer={1} + onTimeChange={this.handleTimeChange} + // moveResizeValidator={this.moveResizeValidator} + > + + + + + {({ styles }) => { + const newStyles = { ...styles, backgroundColor: 'blue' } + return
+ }} + + + + +
+ ) + } +} diff --git a/demo/src/demo-controlled-select/index.jsx b/demo/src/demo-controlled-select/index.jsx new file mode 100644 index 000000000..dc9b1b4dc --- /dev/null +++ b/demo/src/demo-controlled-select/index.jsx @@ -0,0 +1,154 @@ +/* eslint-disable no-console */ +import React, { Component } from 'react' +import dayjs from 'dayjs' + +import Timeline, { TimelineMarkers, TimelineHeaders, TodayMarker, CustomMarker, CursorMarker, CustomHeader, SidebarHeader, DateHeader } from 'react-calendar-timeline' + +import generateFakeData from '../generate-fake-data' + +var minTime = dayjs().add(-6, 'months').valueOf() +var maxTime = dayjs().add(6, 'months').valueOf() + +var keys = { + groupIdKey: 'id', + groupTitleKey: 'title', + groupRightTitleKey: 'rightTitle', + itemIdKey: 'id', + itemTitleKey: 'title', + itemDivTitleKey: 'title', + itemGroupKey: 'group', + itemTimeStartKey: 'start', + itemTimeEndKey: 'end', +} + +export default class App extends Component { + constructor(props) { + super(props) + + const { groups, items } = generateFakeData() + const defaultTimeStart = dayjs().startOf('day').toDate().valueOf() + const defaultTimeEnd = dayjs().startOf('day').add(1, 'day').toDate().valueOf() + + this.state = { + groups, + items, + defaultTimeStart, + defaultTimeEnd, + selected: undefined, + } + } + + handleCanvasClick = (groupId, time) => { + console.log('Canvas clicked', groupId, dayjs(time).format()) + } + + handleCanvasDoubleClick = (groupId, time) => { + console.log('Canvas double clicked', groupId, dayjs(time).format()) + } + + handleCanvasContextMenu = (group, time) => { + console.log('Canvas context menu', group, dayjs(time).format()) + } + + handleItemClick = (itemId, _, time) => { + console.log('Clicked: ' + itemId, dayjs(time).format()) + } + + handleItemSelect = (itemId, _, time) => { + this.setState({ + selected: [itemId], + }) + console.log('Selected: ' + itemId, dayjs(time).format()) + } + + handleItemDeselect = () => { + this.setState({ selected: undefined }) + } + + handleItemDoubleClick = (itemId, _, time) => { + console.log('Double Click: ' + itemId, dayjs(time).format()) + } + + handleItemContextMenu = (itemId, _, time) => { + console.log('Context Menu: ' + itemId, dayjs(time).format()) + } + + handleItemMove = (itemId, dragTime, newGroupOrder) => { + const { items, groups } = this.state + + const group = groups[newGroupOrder] + + this.setState({ + items: items.map((item) => + item.id === itemId + ? Object.assign({}, item, { + start: dragTime, + end: dragTime + (item.end - item.start), + group: group.id, + }) + : item, + ), + }) + + console.log('Moved', itemId, dragTime, newGroupOrder) + } + + handleItemResize = (itemId, time, edge) => { + const { items } = this.state + + this.setState({ + items: items.map((item) => + item.id === itemId + ? Object.assign({}, item, { + start: edge === 'left' ? time : item.start, + end: edge === 'left' ? item.end : time, + }) + : item, + ), + }) + + console.log('Resized', itemId, time, edge) + } + + // this limits the timeline to -6 months ... +6 months + handleTimeChange = (visibleTimeStart, visibleTimeEnd, updateScrollCanvas) => { + if (visibleTimeStart < minTime && visibleTimeEnd > maxTime) { + updateScrollCanvas(minTime, maxTime) + } else if (visibleTimeStart < minTime) { + updateScrollCanvas(minTime, minTime + (visibleTimeEnd - visibleTimeStart)) + } else if (visibleTimeEnd > maxTime) { + updateScrollCanvas(maxTime - (visibleTimeEnd - visibleTimeStart), maxTime) + } else { + updateScrollCanvas(visibleTimeStart, visibleTimeEnd) + } + } + + moveResizeValidator = (action, item, time) => { + if (time < new Date().getTime()) { + var newTime = Math.ceil(new Date().getTime() / (15 * 60 * 1000)) * (15 * 60 * 1000) + return newTime + } + + return time + } + + render() { + const { groups, items, defaultTimeStart, defaultTimeEnd } = this.state + + return ( + Above The Left} canMove canResize="right" canSelect itemsSorted itemTouchSendsClick={false} stackItems itemHeightRatio={0.75} defaultTimeStart={defaultTimeStart} defaultTimeEnd={defaultTimeEnd} onCanvasClick={this.handleCanvasClick} onCanvasDoubleClick={this.handleCanvasDoubleClick} onCanvasContextMenu={this.handleCanvasContextMenu} onItemClick={this.handleItemClick} onItemSelect={this.handleItemSelect} onItemContextMenu={this.handleItemContextMenu} onItemMove={this.handleItemMove} onItemResize={this.handleItemResize} onItemDoubleClick={this.handleItemDoubleClick} onTimeChange={this.handleTimeChange} moveResizeValidator={this.moveResizeValidator} selected={this.state.selected} onItemDeselect={this.handleItemDeselect}> + + + + + {({ styles }) => { + const newStyles = { ...styles, backgroundColor: 'blue' } + return
+ }} + + + + + ) + } +} diff --git a/demo/app/demo-custom-info-label/CustomInfoLabel.js b/demo/src/demo-custom-info-label/CustomInfoLabel.jsx similarity index 100% rename from demo/app/demo-custom-info-label/CustomInfoLabel.js rename to demo/src/demo-custom-info-label/CustomInfoLabel.jsx diff --git a/demo/app/demo-custom-info-label/index.js b/demo/src/demo-custom-info-label/index.jsx similarity index 95% rename from demo/app/demo-custom-info-label/index.js rename to demo/src/demo-custom-info-label/index.jsx index a2f3b9012..8fda47ded 100644 --- a/demo/app/demo-custom-info-label/index.js +++ b/demo/src/demo-custom-info-label/index.jsx @@ -1,5 +1,5 @@ import React, { Component } from 'react' -import moment from 'moment' +import dayjs from 'dayjs' import Timeline from 'react-calendar-timeline' import CustomInfoLabel from './CustomInfoLabel' @@ -24,10 +24,10 @@ export default class App extends Component { super(props) const { groups, items } = generateFakeData(5, 20) - const defaultTimeStart = moment() + const defaultTimeStart = dayjs() .startOf('day') .toDate() - const defaultTimeEnd = moment() + const defaultTimeEnd = dayjs() .startOf('day') .add(1, 'day') .toDate() @@ -86,7 +86,7 @@ export default class App extends Component { handleItemDrag = ({ eventType, itemId, time, edge, newGroupOrder }) => { const group = this.state.groups[newGroupOrder] const infoLabelGroupTitle = group ? group.title : '' - const infoLabelTime = moment(time).format('dddd, MMMM Do YYYY') + const infoLabelTime = dayjs(time).format('dddd, MMMM Do YYYY') let heading = '' switch (eventType) { case 'move': diff --git a/demo/app/demo-custom-items/index.js b/demo/src/demo-custom-items/index.jsx similarity index 88% rename from demo/app/demo-custom-items/index.js rename to demo/src/demo-custom-items/index.jsx index 73a3e8d10..e563e0013 100644 --- a/demo/app/demo-custom-items/index.js +++ b/demo/src/demo-custom-items/index.jsx @@ -1,234 +1,234 @@ -import React, { Component } from 'react' -import moment from 'moment' - -import Timeline from 'react-calendar-timeline' -// import containerResizeDetector from 'react-calendar-timeline/lib/resize-detector/container' - -import generateFakeData from '../generate-fake-data' - -var minTime = moment() - .add(-6, 'months') - .valueOf() -var maxTime = moment() - .add(6, 'months') - .valueOf() - -var keys = { - groupIdKey: 'id', - groupTitleKey: 'title', - groupRightTitleKey: 'rightTitle', - itemIdKey: 'id', - itemTitleKey: 'title', - itemDivTitleKey: 'title', - itemGroupKey: 'group', - itemTimeStartKey: 'start', - itemTimeEndKey: 'end' -} - -export default class App extends Component { - constructor(props) { - super(props) - - const { groups, items } = generateFakeData() - const defaultTimeStart = moment() - .startOf('day') - .toDate() - const defaultTimeEnd = moment() - .startOf('day') - .add(1, 'day') - .toDate() - - this.state = { - groups, - items, - defaultTimeStart, - defaultTimeEnd - } - } - - handleCanvasClick = (groupId, time, event) => { - console.log('Canvas clicked', groupId, moment(time).format()) - } - - handleCanvasContextMenu = (group, time, e) => { - console.log('Canvas context menu', group, moment(time).format()) - } - - handleItemClick = (itemId, _, time) => { - console.log('Clicked: ' + itemId, moment(time).format()) - } - - handleItemSelect = (itemId, _, time) => { - console.log('Selected: ' + itemId, moment(time).format()) - } - - handleItemDoubleClick = (itemId, _, time) => { - console.log('Double Click: ' + itemId, moment(time).format()) - } - - handleItemContextMenu = (itemId, _, time) => { - console.log('Context Menu: ' + itemId, moment(time).format()) - } - - handleItemMove = (itemId, dragTime, newGroupOrder) => { - const { items, groups } = this.state - - const group = groups[newGroupOrder] - - this.setState({ - items: items.map( - item => - item.id === itemId - ? Object.assign({}, item, { - start: dragTime, - end: dragTime + (item.end - item.start), - group: group.id - }) - : item - ) - }) - - console.log('Moved', itemId, dragTime, newGroupOrder) - } - - handleItemResize = (itemId, time, edge) => { - const { items } = this.state - - this.setState({ - items: items.map( - item => - item.id === itemId - ? Object.assign({}, item, { - start: edge === 'left' ? time : item.start, - end: edge === 'left' ? item.end : time - }) - : item - ) - }) - - console.log('Resized', itemId, time, edge) - } - - // this limits the timeline to -6 months ... +6 months - handleTimeChange = (visibleTimeStart, visibleTimeEnd, updateScrollCanvas) => { - if (visibleTimeStart < minTime && visibleTimeEnd > maxTime) { - updateScrollCanvas(minTime, maxTime) - } else if (visibleTimeStart < minTime) { - updateScrollCanvas(minTime, minTime + (visibleTimeEnd - visibleTimeStart)) - } else if (visibleTimeEnd > maxTime) { - updateScrollCanvas(maxTime - (visibleTimeEnd - visibleTimeStart), maxTime) - } else { - updateScrollCanvas(visibleTimeStart, visibleTimeEnd) - } - } - - moveResizeValidator = (action, item, time, resizeEdge) => { - if (time < new Date().getTime()) { - var newTime = - Math.ceil(new Date().getTime() / (15 * 60 * 1000)) * (15 * 60 * 1000) - return newTime - } - - return time - } - - itemRenderer = ({ - item, - timelineContext, - itemContext, - getItemProps, - getResizeProps, - }) => { - const { left: leftResizeProps, right: rightResizeProps } = getResizeProps() - const backgroundColor = itemContext.selected ? itemContext.dragging ? 'red' : item.selectedBgColor : item.bgColor; - const borderColor = itemContext.resizing ? 'red' : item.color; - return ( -
- {itemContext.useResizeHandle ? ( -
- ) : null} - -
- {itemContext.title} -
- - - {itemContext.useResizeHandle ? ( -
- ) : null} -
- ) - } - - // groupRenderer = ({ group }) => { - // return ( - //
- // {group.title} - //
- // ) - // } - - render() { - const { groups, items, defaultTimeStart, defaultTimeEnd } = this.state - console.log("render") - return ( - Above The Left
} - // rightSidebarWidth={150} - // rightSidebarContent={
Above The Right
} - - canMove - canResize="right" - canSelect - itemsSorted - itemTouchSendsClick={false} - stackItems - itemHeightRatio={0.75} - lineHeight={40} - showCursorLine - // resizeDetector={containerResizeDetector} - - defaultTimeStart={defaultTimeStart} - defaultTimeEnd={defaultTimeEnd} - itemRenderer={this.itemRenderer} - // groupRenderer={this.groupRenderer} - - onCanvasClick={this.handleCanvasClick} - onCanvasContextMenu={this.handleCanvasContextMenu} - onItemClick={this.handleItemClick} - onItemSelect={this.handleItemSelect} - onItemContextMenu={this.handleItemContextMenu} - onItemMove={this.handleItemMove} - onItemResize={this.handleItemResize} - onItemDoubleClick={this.handleItemDoubleClick} - onTimeChange={this.handleTimeChange} - moveResizeValidator={this.moveResizeValidator} - /> - ) - } -} +import React, { Component } from 'react' +import dayjs from 'dayjs' + +import Timeline from 'react-calendar-timeline' +// import containerResizeDetector from 'react-calendar-timeline/lib/resize-detector/container' + +import generateFakeData from '../generate-fake-data' + +var minTime = dayjs() + .add(-6, 'months') + .valueOf() +var maxTime = dayjs() + .add(6, 'months') + .valueOf() + +var keys = { + groupIdKey: 'id', + groupTitleKey: 'title', + groupRightTitleKey: 'rightTitle', + itemIdKey: 'id', + itemTitleKey: 'title', + itemDivTitleKey: 'title', + itemGroupKey: 'group', + itemTimeStartKey: 'start', + itemTimeEndKey: 'end' +} + +export default class App extends Component { + constructor(props) { + super(props) + + const { groups, items } = generateFakeData() + const defaultTimeStart = dayjs() + .startOf('day') + .toDate() + const defaultTimeEnd = dayjs() + .startOf('day') + .add(1, 'day') + .toDate() + + this.state = { + groups, + items, + defaultTimeStart, + defaultTimeEnd + } + } + + handleCanvasClick = (groupId, time, event) => { + console.log('Canvas clicked', groupId, dayjs(time).format()) + } + + handleCanvasContextMenu = (group, time, e) => { + console.log('Canvas context menu', group, dayjs(time).format()) + } + + handleItemClick = (itemId, _, time) => { + console.log('Clicked: ' + itemId, dayjs(time).format()) + } + + handleItemSelect = (itemId, _, time) => { + console.log('Selected: ' + itemId, dayjs(time).format()) + } + + handleItemDoubleClick = (itemId, _, time) => { + console.log('Double Click: ' + itemId, dayjs(time).format()) + } + + handleItemContextMenu = (itemId, _, time) => { + console.log('Context Menu: ' + itemId, dayjs(time).format()) + } + + handleItemMove = (itemId, dragTime, newGroupOrder) => { + const { items, groups } = this.state + + const group = groups[newGroupOrder] + + this.setState({ + items: items.map( + item => + item.id === itemId + ? Object.assign({}, item, { + start: dragTime, + end: dragTime + (item.end - item.start), + group: group.id + }) + : item + ) + }) + + console.log('Moved', itemId, dragTime, newGroupOrder) + } + + handleItemResize = (itemId, time, edge) => { + const { items } = this.state + + this.setState({ + items: items.map( + item => + item.id === itemId + ? Object.assign({}, item, { + start: edge === 'left' ? time : item.start, + end: edge === 'left' ? item.end : time + }) + : item + ) + }) + + console.log('Resized', itemId, time, edge) + } + + // this limits the timeline to -6 months ... +6 months + handleTimeChange = (visibleTimeStart, visibleTimeEnd, updateScrollCanvas) => { + if (visibleTimeStart < minTime && visibleTimeEnd > maxTime) { + updateScrollCanvas(minTime, maxTime) + } else if (visibleTimeStart < minTime) { + updateScrollCanvas(minTime, minTime + (visibleTimeEnd - visibleTimeStart)) + } else if (visibleTimeEnd > maxTime) { + updateScrollCanvas(maxTime - (visibleTimeEnd - visibleTimeStart), maxTime) + } else { + updateScrollCanvas(visibleTimeStart, visibleTimeEnd) + } + } + + moveResizeValidator = (action, item, time, resizeEdge) => { + if (time < new Date().getTime()) { + var newTime = + Math.ceil(new Date().getTime() / (15 * 60 * 1000)) * (15 * 60 * 1000) + return newTime + } + + return time + } + + itemRenderer = ({ + item, + timelineContext, + itemContext, + getItemProps, + getResizeProps, + }) => { + const { left: leftResizeProps, right: rightResizeProps } = getResizeProps() + const backgroundColor = itemContext.selected ? itemContext.dragging ? 'red' : item.selectedBgColor : item.bgColor; + const borderColor = itemContext.resizing ? 'red' : item.color; + return ( +
+ {itemContext.useResizeHandle ? ( +
+ ) : null} + +
+ {itemContext.title} +
+ + + {itemContext.useResizeHandle ? ( +
+ ) : null} +
+ ) + } + + // groupRenderer = ({ group }) => { + // return ( + //
+ // {group.title} + //
+ // ) + // } + + render() { + const { groups, items, defaultTimeStart, defaultTimeEnd } = this.state + console.log("render") + return ( + Above The Left
} + // rightSidebarWidth={150} + // rightSidebarContent={
Above The Right
} + + canMove + canResize="right" + canSelect + itemsSorted + itemTouchSendsClick={false} + stackItems + itemHeightRatio={0.75} + lineHeight={40} + showCursorLine + // resizeDetector={containerResizeDetector} + + defaultTimeStart={defaultTimeStart} + defaultTimeEnd={defaultTimeEnd} + itemRenderer={this.itemRenderer} + // groupRenderer={this.groupRenderer} + + onCanvasClick={this.handleCanvasClick} + onCanvasContextMenu={this.handleCanvasContextMenu} + onItemClick={this.handleItemClick} + onItemSelect={this.handleItemSelect} + onItemContextMenu={this.handleItemContextMenu} + onItemMove={this.handleItemMove} + onItemResize={this.handleItemResize} + onItemDoubleClick={this.handleItemDoubleClick} + onTimeChange={this.handleTimeChange} + moveResizeValidator={this.moveResizeValidator} + /> + ) + } +} diff --git a/demo/app/demo-element-resize/index.js b/demo/src/demo-element-resize/index.jsx similarity index 96% rename from demo/app/demo-element-resize/index.js rename to demo/src/demo-element-resize/index.jsx index ff25558fe..367b5c0c8 100644 --- a/demo/app/demo-element-resize/index.js +++ b/demo/src/demo-element-resize/index.jsx @@ -1,5 +1,5 @@ import React, { Component } from 'react' -import moment from 'moment' +import dayjs from 'dayjs' import Timeline from 'react-calendar-timeline' import containerResizeDetector from '../../../src/resize-detector/container' @@ -26,10 +26,10 @@ export default class App extends Component { super(props) const { groups, items } = generateFakeData(10, 200) - const defaultTimeStart = moment() + const defaultTimeStart = dayjs() .startOf('day') .toDate() - const defaultTimeEnd = moment() + const defaultTimeEnd = dayjs() .startOf('day') .add(1, 'day') .toDate() diff --git a/demo/app/demo-headers/index.js b/demo/src/demo-headers/index.jsx similarity index 94% rename from demo/app/demo-headers/index.js rename to demo/src/demo-headers/index.jsx index 459ee48d0..058804966 100644 --- a/demo/app/demo-headers/index.js +++ b/demo/src/demo-headers/index.jsx @@ -1,6 +1,6 @@ /* eslint-disable no-console */ import React, { Component } from 'react' -import moment from 'moment' +import dayjs from 'dayjs' import Timeline, { TimelineMarkers, @@ -15,10 +15,10 @@ import Timeline, { import generateFakeData from '../generate-fake-data' -var minTime = moment() +var minTime = dayjs() .add(-6, 'months') .valueOf() -var maxTime = moment() +var maxTime = dayjs() .add(6, 'months') .valueOf() @@ -39,10 +39,10 @@ export default class App extends Component { super(props) const { groups, items } = generateFakeData() - const defaultTimeStart = moment() + const defaultTimeStart = dayjs() .startOf('day') .toDate() - const defaultTimeEnd = moment() + const defaultTimeEnd = dayjs() .startOf('day') .add(1, 'day') .toDate() @@ -62,31 +62,31 @@ export default class App extends Component { } handleCanvasClick = (groupId, time) => { - console.log('Canvas clicked', groupId, moment(time).format()) + console.log('Canvas clicked', groupId, dayjs(time).format()) } handleCanvasDoubleClick = (groupId, time) => { - console.log('Canvas double clicked', groupId, moment(time).format()) + console.log('Canvas double clicked', groupId, dayjs(time).format()) } handleCanvasContextMenu = (group, time) => { - console.log('Canvas context menu', group, moment(time).format()) + console.log('Canvas context menu', group, dayjs(time).format()) } handleItemClick = (itemId, _, time) => { - console.log('Clicked: ' + itemId, moment(time).format()) + console.log('Clicked: ' + itemId, dayjs(time).format()) } handleItemSelect = (itemId, _, time) => { - console.log('Selected: ' + itemId, moment(time).format()) + console.log('Selected: ' + itemId, dayjs(time).format()) } handleItemDoubleClick = (itemId, _, time) => { - console.log('Double Click: ' + itemId, moment(time).format()) + console.log('Double Click: ' + itemId, dayjs(time).format()) } handleItemContextMenu = (itemId, _, time) => { - console.log('Context Menu: ' + itemId, moment(time).format()) + console.log('Context Menu: ' + itemId, dayjs(time).format()) } handleItemMove = (itemId, dragTime, newGroupOrder) => { @@ -346,14 +346,14 @@ export default class App extends Component { diff --git a/demo/app/demo-linked-timelines/index.js b/demo/src/demo-linked-timelines/index.jsx similarity index 96% rename from demo/app/demo-linked-timelines/index.js rename to demo/src/demo-linked-timelines/index.jsx index 8ec0af119..f5a8b16ba 100644 --- a/demo/app/demo-linked-timelines/index.js +++ b/demo/src/demo-linked-timelines/index.jsx @@ -1,7 +1,7 @@ /* eslint-disable no-console */ /* eslint-disable no-console */ import React, { Component } from 'react' -import moment from 'moment' +import dayjs from 'dayjs' import Timeline from 'react-calendar-timeline' // import containerResizeDetector from 'react-calendar-timeline/lib/resize-detector/container' @@ -27,10 +27,10 @@ export default class App extends Component { const { groups: groups1, items: items1 } = generateFakeData(5, 400) const { groups: groups2, items: items2 } = generateFakeData(5, 400) - const visibleTimeStart = moment() + const visibleTimeStart = dayjs() .startOf('day') .valueOf() - const visibleTimeEnd = moment() + const visibleTimeEnd = dayjs() .startOf('day') .add(1, 'day') .valueOf() diff --git a/demo/src/demo-main/groups.json b/demo/src/demo-main/groups.json new file mode 100644 index 000000000..3a18a49d5 --- /dev/null +++ b/demo/src/demo-main/groups.json @@ -0,0 +1,70 @@ +[ + { + "id": 10, + "title": "U.S. President" + }, + { + "id": 20, + "title": "Windows" + }, + { + "id": 21, + "title": "Android" + }, + { + "id": 22, + "title": "RPG Maker" + }, + { + "id": 40, + "title": "Pokemon game" + }, + { + "id": 30, + "title": "Nintendo console" + }, + { + "id": 31, + "title": "Nintendo handheld" + }, + { + "id": 32, + "title": "Sony console" + }, + { + "id": 33, + "title": "Sony handheld" + }, + { + "id": 34, + "title": "Microsoft console" + }, + { + "id": 35, + "title": "Sega console" + }, + { + "id": 41, + "title": "Mario game" + }, + { + "id": 42, + "title": "Zelda game" + }, + { + "id": 49, + "title": "GTA game" + }, + { + "id": 50, + "title": "Best Picture" + }, + { + "id": 51, + "title": "Star Wars movies" + }, + { + "id": 52, + "title": "Marvel movies (MCU)" + } +] diff --git a/demo/app/demo-main/index.js b/demo/src/demo-main/index.jsx similarity index 59% rename from demo/app/demo-main/index.js rename to demo/src/demo-main/index.jsx index 6c8fd3c22..bb1f3e964 100644 --- a/demo/app/demo-main/index.js +++ b/demo/src/demo-main/index.jsx @@ -1,26 +1,13 @@ -/* eslint-disable no-console */ -import React, { Component } from 'react' -import moment from 'moment' - -import Timeline, { - TimelineMarkers, - TimelineHeaders, - TodayMarker, - CustomMarker, - CursorMarker, - CustomHeader, - SidebarHeader, - DateHeader -} from 'react-calendar-timeline' +import React from 'react' +import { Component } from 'react' +import dayjs from 'dayjs' + +import Timeline, { TimelineMarkers, TodayMarker, CustomMarker, CursorMarker } from '../../../src/index' import generateFakeData from '../generate-fake-data' -var minTime = moment() - .add(-6, 'months') - .valueOf() -var maxTime = moment() - .add(6, 'months') - .valueOf() +var minTime = dayjs().add(-6, 'months').valueOf() +var maxTime = dayjs().add(6, 'months').valueOf() var keys = { groupIdKey: 'id', @@ -30,8 +17,8 @@ var keys = { itemTitleKey: 'title', itemDivTitleKey: 'title', itemGroupKey: 'group', - itemTimeStartKey: 'start', - itemTimeEndKey: 'end' + itemTimeStartKey: 'start_time', + itemTimeEndKey: 'end_time', } export default class App extends Component { @@ -39,48 +26,49 @@ export default class App extends Component { super(props) const { groups, items } = generateFakeData() - const defaultTimeStart = moment() - .startOf('day') - .toDate() - const defaultTimeEnd = moment() - .startOf('day') - .add(1, 'day') - .toDate() + const defaultTimeStart = dayjs(items[0].start_time).startOf('day').toDate().valueOf() + const defaultTimeEnd = dayjs(items[0].end_time).startOf('day').add(1, 'day').toDate().valueOf() this.state = { groups, - items, + items: items.map((item) => { + return { + ...item, + start_time: dayjs(item.start_time).valueOf(), + end_time: dayjs(item.end_time).valueOf(), + } + }), defaultTimeStart, - defaultTimeEnd + defaultTimeEnd, } } handleCanvasClick = (groupId, time) => { - console.log('Canvas clicked', groupId, moment(time).format()) + console.log('Canvas clicked', groupId, dayjs(time).format()) } handleCanvasDoubleClick = (groupId, time) => { - console.log('Canvas double clicked', groupId, moment(time).format()) + console.log('Canvas double clicked', groupId, dayjs(time).format()) } handleCanvasContextMenu = (group, time) => { - console.log('Canvas context menu', group, moment(time).format()) + console.log('Canvas context menu', group, dayjs(time).format()) } handleItemClick = (itemId, _, time) => { - console.log('Clicked: ' + itemId, moment(time).format()) + console.log('Clicked: ' + itemId, dayjs(time).format()) } handleItemSelect = (itemId, _, time) => { - console.log('Selected: ' + itemId, moment(time).format()) + console.log('Selected: ' + itemId, dayjs(time).format()) } handleItemDoubleClick = (itemId, _, time) => { - console.log('Double Click: ' + itemId, moment(time).format()) + console.log('Double Click: ' + itemId, dayjs(time).format()) } handleItemContextMenu = (itemId, _, time) => { - console.log('Context Menu: ' + itemId, moment(time).format()) + console.log('Context Menu: ' + itemId, dayjs(time).format()) } handleItemMove = (itemId, dragTime, newGroupOrder) => { @@ -89,16 +77,15 @@ export default class App extends Component { const group = groups[newGroupOrder] this.setState({ - items: items.map( - item => - item.id === itemId - ? Object.assign({}, item, { - start: dragTime, - end: dragTime + (item.end - item.start), - group: group.id - }) - : item - ) + items: items.map((item) => + item.id === itemId + ? Object.assign({}, item, { + start: dragTime, + end: dragTime + (item.end - item.start), + group: group.id, + }) + : item, + ), }) console.log('Moved', itemId, dragTime, newGroupOrder) @@ -108,15 +95,14 @@ export default class App extends Component { const { items } = this.state this.setState({ - items: items.map( - item => - item.id === itemId - ? Object.assign({}, item, { - start: edge === 'left' ? time : item.start, - end: edge === 'left' ? item.end : time - }) - : item - ) + items: items.map((item) => + item.id === itemId + ? Object.assign({}, item, { + start: edge === 'left' ? time : item.start, + end: edge === 'left' ? item.end : time, + }) + : item, + ), }) console.log('Resized', itemId, time, edge) @@ -135,10 +121,13 @@ export default class App extends Component { } } + handleZoom = (timelineContext, unit) => { + console.log('Zoomed', timelineContext, unit) + } + moveResizeValidator = (action, item, time) => { if (time < new Date().getTime()) { - var newTime = - Math.ceil(new Date().getTime() / (15 * 60 * 1000)) * (15 * 60 * 1000) + var newTime = Math.ceil(new Date().getTime() / (15 * 60 * 1000)) * (15 * 60 * 1000) return newTime } @@ -162,8 +151,6 @@ export default class App extends Component { itemTouchSendsClick={false} stackItems itemHeightRatio={0.75} - defaultTimeStart={defaultTimeStart} - defaultTimeEnd={defaultTimeEnd} onCanvasClick={this.handleCanvasClick} onCanvasDoubleClick={this.handleCanvasDoubleClick} onCanvasContextMenu={this.handleCanvasContextMenu} @@ -174,29 +161,24 @@ export default class App extends Component { onItemResize={this.handleItemResize} onItemDoubleClick={this.handleItemDoubleClick} onTimeChange={this.handleTimeChange} + onZoom={this.handleZoom} moveResizeValidator={this.moveResizeValidator} + buffer={3} + minZoom={365.24 * 86400 * 1000} // 1 year + maxZoom={365.24 * 86400 * 1000 * 20} // 20 years + defaultTimeStart={defaultTimeStart} + defaultTimeEnd={defaultTimeEnd} > - - + + {({ styles }) => { const newStyles = { ...styles, backgroundColor: 'blue' } return
}} - + {/* */} ) diff --git a/demo/src/demo-main/items.json b/demo/src/demo-main/items.json new file mode 100644 index 000000000..0b41fe033 --- /dev/null +++ b/demo/src/demo-main/items.json @@ -0,0 +1,1971 @@ +[ + { + "title": "Windows NT 3.1", + "start_time": "1993-06-30T21:00:00.000Z", + "id": 1, + "group": 20, + "canMove": false, + "end_time": "1996-05-31T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9c2fc" + } + } + }, + { + "title": "Windows NT 4.0", + "start_time": "1996-05-31T21:00:00.000Z", + "id": 2, + "group": 20, + "canMove": false, + "end_time": "2000-01-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9c2fc" + } + } + }, + { + "title": "Windows 2000", + "start_time": "2000-01-31T22:00:00.000Z", + "id": 3, + "group": 20, + "canMove": false, + "end_time": "2001-07-31T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcc8c7" + } + } + }, + { + "title": "Windows XP", + "start_time": "2001-07-31T21:00:00.000Z", + "id": 4, + "group": 20, + "canMove": false, + "end_time": "2009-09-30T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcaebd" + } + } + }, + { + "title": "Windows 7", + "start_time": "2009-09-30T21:00:00.000Z", + "id": 5, + "group": 20, + "canMove": false, + "end_time": "2012-09-30T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#72eace" + } + } + }, + { + "title": "Windows 8", + "start_time": "2012-09-30T21:00:00.000Z", + "id": 6, + "group": 20, + "canMove": false, + "end_time": "2015-06-30T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#8af5f7" + } + } + }, + { + "title": "Windows 10", + "start_time": "2015-06-30T21:00:00.000Z", + "id": 7, + "group": 20, + "canMove": false, + "end_time": "2023-12-22T14:00:45.112Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f4dd73" + } + } + }, + { + "title": "RPG Maker 95", + "start_time": "1996-12-31T22:00:00.000Z", + "id": 8, + "group": 22, + "canMove": false, + "end_time": "1999-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ddfc8f" + } + } + }, + { + "title": "RPG Maker 2000", + "start_time": "1999-12-31T22:00:00.000Z", + "id": 9, + "group": 22, + "canMove": false, + "end_time": "2002-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#84cbf4" + } + } + }, + { + "title": "RPG Maker 2003", + "start_time": "2002-12-31T22:00:00.000Z", + "id": 10, + "group": 22, + "canMove": false, + "end_time": "2004-06-21T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#afaaef" + } + } + }, + { + "title": "RPG Maker XP", + "start_time": "2004-06-21T21:00:00.000Z", + "id": 11, + "group": 22, + "canMove": false, + "end_time": "2008-02-28T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ccf7ff" + } + } + }, + { + "title": "RPG Maker VX", + "start_time": "2008-02-28T22:00:00.000Z", + "id": 12, + "group": 22, + "canMove": false, + "end_time": "2012-03-14T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#e6c7fc" + } + } + }, + { + "title": "RPG Maker VX Ace", + "start_time": "2012-03-14T22:00:00.000Z", + "id": 13, + "group": 22, + "canMove": false, + "end_time": "2015-10-22T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#a6c0ed" + } + } + }, + { + "title": "RPG Maker MV", + "start_time": "2015-10-22T21:00:00.000Z", + "id": 14, + "group": 22, + "canMove": false, + "end_time": "2020-08-19T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#7ced76" + } + } + }, + { + "title": "RPG Maker MZ", + "start_time": "2020-08-19T21:00:00.000Z", + "id": 15, + "group": 22, + "canMove": false, + "end_time": "2023-12-22T14:00:45.112Z", + "itemProps": { + "style": { + "color": "black", + "background": "#a4f9f2" + } + } + }, + { + "title": "George W. Bush", + "start_time": "2000-10-31T22:00:00.000Z", + "id": 16, + "group": 10, + "canMove": false, + "end_time": "2008-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#efa27c" + } + } + }, + { + "title": "Barack Obama", + "start_time": "2008-10-31T22:00:00.000Z", + "id": 17, + "group": 10, + "canMove": false, + "end_time": "2016-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#bc91ea" + } + } + }, + { + "title": "Donald Trump", + "start_time": "2016-10-31T22:00:00.000Z", + "color": "red", + "id": 18, + "group": 10, + "canMove": false, + "end_time": "2020-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#c7f0fc" + } + } + }, + { + "title": "Joe Biden", + "start_time": "2020-10-31T22:00:00.000Z", + "color": "red", + "id": 19, + "group": 10, + "canMove": false, + "end_time": "2023-12-22T14:00:45.112Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcdca4" + } + } + }, + { + "title": "Pokemon Red and Blue", + "start_time": "1995-12-31T22:00:00.000Z", + "id": 20, + "group": 40, + "canMove": false, + "end_time": "1998-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ccf9a4" + } + } + }, + { + "title": "Pokemon Gold and Silver", + "start_time": "1998-12-31T22:00:00.000Z", + "id": 21, + "group": 40, + "canMove": false, + "end_time": "2001-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9869a" + } + } + }, + { + "title": "Pokemon Ruby and Sapphire", + "start_time": "2001-12-31T22:00:00.000Z", + "id": 22, + "group": 40, + "canMove": false, + "end_time": "2005-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f4a69a" + } + } + }, + { + "title": "Pokemon Diamond and Pearl", + "start_time": "2005-12-31T22:00:00.000Z", + "id": 23, + "group": 40, + "canMove": false, + "end_time": "2009-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f2fcae" + } + } + }, + { + "title": "Pokemon Black and White", + "start_time": "2009-12-31T22:00:00.000Z", + "id": 24, + "group": 40, + "canMove": false, + "end_time": "2012-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ec9bf7" + } + } + }, + { + "title": "Pokemon X and Y", + "start_time": "2012-12-31T22:00:00.000Z", + "id": 25, + "group": 40, + "canMove": false, + "end_time": "2015-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#79fcad" + } + } + }, + { + "title": "Pokemon Sun and Moon", + "start_time": "2015-12-31T22:00:00.000Z", + "id": 26, + "group": 40, + "canMove": false, + "end_time": "2018-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#e8736a" + } + } + }, + { + "title": "Pokemon Sword and Shield", + "start_time": "2018-12-31T22:00:00.000Z", + "id": 27, + "group": 40, + "canMove": false, + "end_time": "2023-12-22T14:00:45.113Z", + "itemProps": { + "style": { + "color": "black", + "background": "#83f276" + } + } + }, + { + "title": "NES", + "start_time": "1985-09-30T21:00:00.000Z", + "id": 28, + "group": 30, + "canMove": false, + "end_time": "1991-07-31T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#70f496" + } + } + }, + { + "title": "SNES", + "start_time": "1991-07-31T21:00:00.000Z", + "id": 29, + "group": 30, + "canMove": false, + "end_time": "1996-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#b0a6f4" + } + } + }, + { + "title": "N64", + "start_time": "1996-10-31T22:00:00.000Z", + "id": 30, + "group": 30, + "canMove": false, + "end_time": "2001-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#9ce1fc" + } + } + }, + { + "title": "GameCube", + "start_time": "2001-10-31T22:00:00.000Z", + "id": 31, + "group": 30, + "canMove": false, + "end_time": "2006-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#80d5fc" + } + } + }, + { + "title": "Wii", + "start_time": "2006-10-31T22:00:00.000Z", + "id": 32, + "group": 30, + "canMove": false, + "end_time": "2012-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f99d72" + } + } + }, + { + "title": "Wii U", + "start_time": "2012-10-31T22:00:00.000Z", + "id": 33, + "group": 30, + "canMove": false, + "end_time": "2017-02-28T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#a784f9" + } + } + }, + { + "title": "Nintendo Switch", + "start_time": "2017-02-28T22:00:00.000Z", + "id": 34, + "group": 30, + "canMove": false, + "end_time": "2023-12-22T14:00:45.113Z", + "itemProps": { + "style": { + "color": "black", + "background": "#9dc6ea" + } + } + }, + { + "title": "Game Boy", + "start_time": "1988-12-31T21:00:00.000Z", + "id": 35, + "group": 31, + "canMove": false, + "end_time": "1997-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#8ef9d2" + } + } + }, + { + "title": "Game Boy Color", + "start_time": "1997-12-31T22:00:00.000Z", + "id": 36, + "group": 31, + "canMove": false, + "end_time": "2000-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9d1a2" + } + } + }, + { + "title": "Game Boy Advance", + "start_time": "2000-12-31T22:00:00.000Z", + "id": 37, + "group": 31, + "canMove": false, + "end_time": "2002-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#e1fcae" + } + } + }, + { + "title": "Game Boy Advance SP", + "start_time": "2002-12-31T22:00:00.000Z", + "id": 38, + "group": 31, + "canMove": false, + "end_time": "2003-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcc5c4" + } + } + }, + { + "title": "Nintendo DS", + "start_time": "2003-12-31T22:00:00.000Z", + "id": 39, + "group": 31, + "canMove": false, + "end_time": "2008-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#a5b1ef" + } + } + }, + { + "title": "Nintendo DSi", + "start_time": "2008-12-31T22:00:00.000Z", + "id": 40, + "group": 31, + "canMove": false, + "end_time": "2010-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9c2fc" + } + } + }, + { + "title": "Nintendo 3DS", + "start_time": "2010-12-31T22:00:00.000Z", + "id": 41, + "group": 31, + "canMove": false, + "end_time": "2017-02-28T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#7773f4" + } + } + }, + { + "title": "Nintendo Switch", + "start_time": "2017-02-28T22:00:00.000Z", + "id": 42, + "group": 31, + "canMove": false, + "end_time": "2023-12-22T14:00:45.113Z", + "itemProps": { + "style": { + "color": "black", + "background": "#9dc6ea" + } + } + }, + { + "title": "PlayStation", + "start_time": "1993-12-31T22:00:00.000Z", + "id": 43, + "group": 32, + "canMove": false, + "end_time": "2000-06-30T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ee71f7" + } + } + }, + { + "title": "PlayStation 2", + "start_time": "2000-06-30T21:00:00.000Z", + "id": 44, + "group": 32, + "canMove": false, + "end_time": "2005-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcd19c" + } + } + }, + { + "title": "PlayStation 3", + "start_time": "2005-12-31T22:00:00.000Z", + "id": 45, + "group": 32, + "canMove": false, + "end_time": "2013-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fce8a1" + } + } + }, + { + "title": "PlayStation 4", + "start_time": "2013-10-31T22:00:00.000Z", + "id": 46, + "group": 32, + "canMove": false, + "end_time": "2020-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9fcae" + } + } + }, + { + "title": "PlayStation 5", + "start_time": "2020-10-31T22:00:00.000Z", + "id": 47, + "group": 32, + "canMove": false, + "end_time": "2023-12-22T14:00:45.113Z", + "itemProps": { + "style": { + "color": "black", + "background": "#e7fcae" + } + } + }, + { + "title": "PlayStation Portable", + "start_time": "2005-03-23T22:00:00.000Z", + "id": 48, + "group": 33, + "canMove": false, + "end_time": "2012-02-14T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f7a8ac" + } + } + }, + { + "title": "PlayStation Vita", + "start_time": "2012-02-14T22:00:00.000Z", + "end_time": "2019-02-28T22:00:00.000Z", + "id": 49, + "group": 33, + "canMove": false, + "itemProps": { + "style": { + "color": "black", + "background": "#dff791" + } + } + }, + { + "title": "Xbox", + "start_time": "2001-10-31T22:00:00.000Z", + "id": 50, + "group": 34, + "canMove": false, + "end_time": "2005-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f4adf3" + } + } + }, + { + "title": "Xbox 360", + "start_time": "2005-10-31T22:00:00.000Z", + "id": 51, + "group": 34, + "canMove": false, + "end_time": "2013-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#d0f271" + } + } + }, + { + "title": "Xbox One", + "start_time": "2013-10-31T22:00:00.000Z", + "id": 52, + "group": 34, + "canMove": false, + "end_time": "2020-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#a19df2" + } + } + }, + { + "title": "Xbox Series X/S", + "start_time": "2020-10-31T22:00:00.000Z", + "id": 53, + "group": 34, + "canMove": false, + "end_time": "2023-12-22T14:00:45.113Z", + "itemProps": { + "style": { + "color": "black", + "background": "#c396e8" + } + } + }, + { + "title": "Sega Master System", + "start_time": "1985-12-31T21:00:00.000Z", + "id": 54, + "group": 35, + "canMove": false, + "end_time": "1989-07-31T20:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#8ae5ea" + } + } + }, + { + "title": "Sega Genesis", + "start_time": "1989-07-31T20:00:00.000Z", + "id": 55, + "group": 35, + "canMove": false, + "end_time": "1992-09-30T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#88f7c3" + } + } + }, + { + "title": "Sega CD", + "start_time": "1992-09-30T22:00:00.000Z", + "id": 56, + "group": 35, + "canMove": false, + "end_time": "1994-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f6fc9f" + } + } + }, + { + "title": "32X", + "start_time": "1994-10-31T22:00:00.000Z", + "id": 57, + "group": 35, + "canMove": false, + "end_time": "1995-04-30T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#bf8bf9" + } + } + }, + { + "title": "Sega Saturn", + "start_time": "1995-04-30T21:00:00.000Z", + "id": 58, + "group": 35, + "canMove": false, + "end_time": "1999-08-31T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#d8ed6f" + } + } + }, + { + "title": "Dreamcast", + "start_time": "1999-08-31T21:00:00.000Z", + "end_time": "2000-12-31T22:00:00.000Z", + "id": 59, + "group": 35, + "canMove": false, + "itemProps": { + "style": { + "color": "black", + "background": "#bb9ced" + } + } + }, + { + "title": "Super Mario Bros.", + "start_time": "1984-12-31T21:00:00.000Z", + "id": 60, + "group": 41, + "canMove": false, + "end_time": "1987-12-31T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ef77c7" + } + } + }, + { + "title": "Super Mario Bros. 2", + "start_time": "1987-12-31T21:00:00.000Z", + "id": 61, + "group": 41, + "canMove": false, + "end_time": "1988-05-31T20:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9f59d" + } + } + }, + { + "title": "Super Mario Bros. 3", + "start_time": "1988-05-31T20:00:00.000Z", + "id": 62, + "group": 41, + "canMove": false, + "end_time": "1990-10-31T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#e5f79e" + } + } + }, + { + "title": "World", + "start_time": "1990-10-31T21:00:00.000Z", + "id": 63, + "group": 41, + "canMove": false, + "end_time": "1994-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f4a4c0" + } + } + }, + { + "title": "World 2: Yoshi's Island", + "start_time": "1994-12-31T22:00:00.000Z", + "id": 64, + "group": 41, + "canMove": false, + "end_time": "1995-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9ee86" + } + } + }, + { + "title": "Super Mario 64", + "start_time": "1995-12-31T22:00:00.000Z", + "id": 65, + "group": 41, + "canMove": false, + "end_time": "2001-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcce92" + } + } + }, + { + "title": "Sunshine", + "start_time": "2001-12-31T22:00:00.000Z", + "id": 66, + "group": 41, + "canMove": false, + "end_time": "2006-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcc7e7" + } + } + }, + { + "title": "Galaxy", + "start_time": "2006-12-31T22:00:00.000Z", + "id": 67, + "group": 41, + "canMove": false, + "end_time": "2009-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#7564d6" + } + } + }, + { + "title": "Galaxy 2", + "start_time": "2009-12-31T22:00:00.000Z", + "id": 68, + "group": 41, + "canMove": false, + "end_time": "2012-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f49aaf" + } + } + }, + { + "title": "3D World", + "start_time": "2012-12-31T22:00:00.000Z", + "id": 69, + "group": 41, + "canMove": false, + "end_time": "2014-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f490a6" + } + } + }, + { + "title": "Maker", + "start_time": "2014-12-31T22:00:00.000Z", + "id": 70, + "group": 41, + "canMove": false, + "end_time": "2017-10-26T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f4a8af" + } + } + }, + { + "title": "Odyssey", + "start_time": "2017-10-26T21:00:00.000Z", + "id": 71, + "group": 41, + "canMove": false, + "end_time": "2019-06-27T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#eefc9f" + } + } + }, + { + "title": "Maker 2", + "start_time": "2019-06-27T21:00:00.000Z", + "id": 72, + "group": 41, + "canMove": false, + "end_time": "2023-12-22T14:00:45.113Z", + "itemProps": { + "style": { + "color": "black", + "background": "#b0f276" + } + } + }, + { + "title": "Grand Theft Auto", + "start_time": "1996-12-31T22:00:00.000Z", + "id": 73, + "canMove": false, + "end_time": "1998-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9bbe0" + } + } + }, + { + "title": "GTA 2", + "start_time": "1998-12-31T22:00:00.000Z", + "id": 74, + "canMove": false, + "end_time": "2000-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#d2fca9" + } + } + }, + { + "title": "GTA III", + "start_time": "2000-12-31T22:00:00.000Z", + "id": 75, + "canMove": false, + "end_time": "2001-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f4a1a7" + } + } + }, + { + "title": "GTA: Vice City", + "start_time": "2001-12-31T22:00:00.000Z", + "id": 76, + "canMove": false, + "end_time": "2003-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#c4a3ed" + } + } + }, + { + "title": "GTA: San Andreas", + "start_time": "2003-12-31T22:00:00.000Z", + "id": 77, + "canMove": false, + "end_time": "2007-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#7cf9ac" + } + } + }, + { + "title": "GTA IV", + "start_time": "2007-12-31T22:00:00.000Z", + "id": 78, + "canMove": false, + "end_time": "2012-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#adcbf4" + } + } + }, + { + "title": "GTA V", + "start_time": "2012-12-31T22:00:00.000Z", + "id": 79, + "canMove": false, + "end_time": "2023-12-22T14:00:45.113Z", + "itemProps": { + "style": { + "color": "black", + "background": "#b8b0f4" + } + } + }, + { + "title": "1.5 Cupcake", + "start_time": "2009-04-26T21:00:00.000Z", + "id": 80, + "group": 21, + "canMove": false, + "end_time": "2009-09-14T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#b1f99d" + } + } + }, + { + "title": "1.6 Donut", + "start_time": "2009-09-14T21:00:00.000Z", + "id": 81, + "group": 21, + "canMove": false, + "end_time": "2009-10-25T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#d2fc9c" + } + } + }, + { + "title": "2.0 Eclair", + "start_time": "2009-10-25T22:00:00.000Z", + "id": 82, + "group": 21, + "canMove": false, + "end_time": "2010-05-19T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f389f4" + } + } + }, + { + "title": "2.2 Froyo", + "start_time": "2010-05-19T21:00:00.000Z", + "id": 83, + "group": 21, + "canMove": false, + "end_time": "2010-12-05T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#b8ffb2" + } + } + }, + { + "title": "2.3 Gingerbread", + "start_time": "2010-12-05T22:00:00.000Z", + "id": 84, + "group": 21, + "canMove": false, + "end_time": "2011-02-21T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#c38fe8" + } + } + }, + { + "title": "3.0 Honeycomb", + "start_time": "2011-02-21T22:00:00.000Z", + "id": 85, + "group": 21, + "canMove": false, + "end_time": "2011-10-17T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#81f9c3" + } + } + }, + { + "title": "4.0 Ice Cream Sandwich", + "start_time": "2011-10-17T21:00:00.000Z", + "id": 86, + "group": 21, + "canMove": false, + "end_time": "2012-07-08T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#e9c4fc" + } + } + }, + { + "title": "4.1 Jelly Bean", + "start_time": "2012-07-08T21:00:00.000Z", + "id": 87, + "group": 21, + "canMove": false, + "end_time": "2013-10-30T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f287a9" + } + } + }, + { + "title": "4.4 KitKat", + "start_time": "2013-10-30T22:00:00.000Z", + "id": 88, + "group": 21, + "canMove": false, + "end_time": "2014-11-11T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#e5ccff" + } + } + }, + { + "title": "5.0 Lollipop", + "start_time": "2014-11-11T22:00:00.000Z", + "id": 89, + "group": 21, + "canMove": false, + "end_time": "2015-10-04T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ffccd8" + } + } + }, + { + "title": "6.0 Marshmallow", + "start_time": "2015-10-04T21:00:00.000Z", + "id": 90, + "group": 21, + "canMove": false, + "end_time": "2016-09-02T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#70a7f4" + } + } + }, + { + "title": "7.0 Nougat", + "start_time": "2016-09-02T21:00:00.000Z", + "id": 91, + "group": 21, + "canMove": false, + "end_time": "2017-08-20T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#c3ef70" + } + } + }, + { + "title": "8.0 Oreo", + "start_time": "2017-08-20T21:00:00.000Z", + "id": 92, + "group": 21, + "canMove": false, + "end_time": "2018-08-05T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#a4bdf4" + } + } + }, + { + "title": "9.0 Pie", + "start_time": "2018-08-05T21:00:00.000Z", + "id": 93, + "group": 21, + "canMove": false, + "end_time": "2019-09-02T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f785c4" + } + } + }, + { + "title": "10", + "start_time": "2019-09-02T21:00:00.000Z", + "id": 94, + "group": 21, + "canMove": false, + "end_time": "2020-09-07T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9bb84" + } + } + }, + { + "title": "11", + "start_time": "2020-09-07T21:00:00.000Z", + "id": 95, + "group": 21, + "canMove": false, + "end_time": "2023-12-22T14:00:45.114Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f7d891" + } + } + }, + { + "title": "The Legend of Zelda", + "start_time": "1987-10-31T21:00:00.000Z", + "id": 96, + "group": 42, + "canMove": false, + "end_time": "1988-10-31T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#a0f7bf" + } + } + }, + { + "title": "Zelda II", + "start_time": "1988-10-31T21:00:00.000Z", + "id": 97, + "group": 42, + "canMove": false, + "end_time": "1991-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcdfc2" + } + } + }, + { + "title": "A Link to the Past", + "start_time": "1991-10-31T22:00:00.000Z", + "id": 98, + "group": 42, + "canMove": false, + "end_time": "1998-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ef77c7" + } + } + }, + { + "title": "Ocarina of Time", + "start_time": "1998-10-31T22:00:00.000Z", + "id": 99, + "group": 42, + "canMove": false, + "end_time": "2000-03-31T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcd588" + } + } + }, + { + "title": "Majora's Mask", + "start_time": "2000-03-31T21:00:00.000Z", + "id": 100, + "group": 42, + "canMove": false, + "end_time": "2002-11-30T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#94f7c5" + } + } + }, + { + "title": "The Wind Waker", + "start_time": "2002-11-30T22:00:00.000Z", + "id": 101, + "group": 42, + "canMove": false, + "end_time": "2006-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#7ef7ed" + } + } + }, + { + "title": "Twilight Princess", + "start_time": "2006-10-31T22:00:00.000Z", + "id": 102, + "group": 42, + "canMove": false, + "end_time": "2011-10-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#b0d4fc" + } + } + }, + { + "title": "Skyward Sword", + "start_time": "2011-10-31T22:00:00.000Z", + "id": 103, + "group": 42, + "canMove": false, + "end_time": "2017-02-28T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9bca7" + } + } + }, + { + "title": "Breath of the Wild", + "start_time": "2017-02-28T22:00:00.000Z", + "id": 104, + "group": 42, + "canMove": false, + "end_time": "2023-12-22T14:00:45.114Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9de98" + } + } + }, + { + "title": "Star Wars", + "start_time": "1977-05-24T21:00:00.000Z", + "id": 105, + "group": 51, + "canMove": false, + "end_time": "1980-05-20T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#a9f995" + } + } + }, + { + "title": "The Empire Strikes Back", + "start_time": "1980-05-20T21:00:00.000Z", + "id": 106, + "group": 51, + "canMove": false, + "end_time": "1983-05-24T20:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f9eaa7" + } + } + }, + { + "title": "Return of the Jedi", + "start_time": "1983-05-24T20:00:00.000Z", + "id": 107, + "group": 51, + "canMove": false, + "end_time": "2023-12-22T14:00:45.114Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ea6e70" + } + } + }, + { + "title": "Titanic", + "start_time": "1996-12-31T22:00:00.000Z", + "id": 108, + "group": 50, + "canMove": false, + "end_time": "1997-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#d7b2f4" + } + } + }, + { + "title": "Shakespeare in Love", + "start_time": "1997-12-31T22:00:00.000Z", + "id": 109, + "group": 50, + "canMove": false, + "end_time": "1998-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#8b91e5" + } + } + }, + { + "title": "American Beauty", + "start_time": "1998-12-31T22:00:00.000Z", + "id": 110, + "group": 50, + "canMove": false, + "end_time": "1999-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ed8c7d" + } + } + }, + { + "title": "Gladiator", + "start_time": "1999-12-31T22:00:00.000Z", + "id": 111, + "group": 50, + "canMove": false, + "end_time": "2000-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f779ea" + } + } + }, + { + "title": "A Beautiful Mind", + "start_time": "2000-12-31T22:00:00.000Z", + "id": 112, + "group": 50, + "canMove": false, + "end_time": "2001-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#ed8c7d" + } + } + }, + { + "title": "Chicago", + "start_time": "2001-12-31T22:00:00.000Z", + "id": 113, + "group": 50, + "canMove": false, + "end_time": "2002-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#b9e0f7" + } + } + }, + { + "title": "The Return of the King", + "start_time": "2002-12-31T22:00:00.000Z", + "id": 114, + "group": 50, + "canMove": false, + "end_time": "2003-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#b2fca9" + } + } + }, + { + "title": "Million Dollar Baby", + "start_time": "2003-12-31T22:00:00.000Z", + "id": 115, + "group": 50, + "canMove": false, + "end_time": "2004-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f7b7af" + } + } + }, + { + "title": "Crash", + "start_time": "2004-12-31T22:00:00.000Z", + "id": 116, + "group": 50, + "canMove": false, + "end_time": "2005-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcc6bd" + } + } + }, + { + "title": "The Departed", + "start_time": "2005-12-31T22:00:00.000Z", + "id": 117, + "group": 50, + "canMove": false, + "end_time": "2006-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#c3f99d" + } + } + }, + { + "title": "No Country for Old Men", + "start_time": "2006-12-31T22:00:00.000Z", + "id": 118, + "group": 50, + "canMove": false, + "end_time": "2007-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f990ac" + } + } + }, + { + "title": "Slumdog Millionaire", + "start_time": "2007-12-31T22:00:00.000Z", + "id": 119, + "group": 50, + "canMove": false, + "end_time": "2008-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f7e4af" + } + } + }, + { + "title": "The Hurt Locker", + "start_time": "2008-12-31T22:00:00.000Z", + "id": 120, + "group": 50, + "canMove": false, + "end_time": "2009-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#d7f99f" + } + } + }, + { + "title": "The King's Speech", + "start_time": "2009-12-31T22:00:00.000Z", + "id": 121, + "group": 50, + "canMove": false, + "end_time": "2010-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fca197" + } + } + }, + { + "title": "The Artist", + "start_time": "2010-12-31T22:00:00.000Z", + "id": 122, + "group": 50, + "canMove": false, + "end_time": "2011-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcfc99" + } + } + }, + { + "title": "Argo", + "start_time": "2011-12-31T22:00:00.000Z", + "id": 123, + "group": 50, + "canMove": false, + "end_time": "2012-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f7b4e5" + } + } + }, + { + "title": "12 Years a Slave", + "start_time": "2012-12-31T22:00:00.000Z", + "id": 124, + "group": 50, + "canMove": false, + "end_time": "2013-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#7489f2" + } + } + }, + { + "title": "Birdman", + "start_time": "2013-12-31T22:00:00.000Z", + "id": 125, + "group": 50, + "canMove": false, + "end_time": "2014-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f4ef86" + } + } + }, + { + "title": "Spotlight", + "start_time": "2014-12-31T22:00:00.000Z", + "id": 126, + "group": 50, + "canMove": false, + "end_time": "2015-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#90f9be" + } + } + }, + { + "title": "Moonlight", + "start_time": "2015-12-31T22:00:00.000Z", + "id": 127, + "group": 50, + "canMove": false, + "end_time": "2016-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f28cd0" + } + } + }, + { + "title": "The Shape of Water", + "start_time": "2016-12-31T22:00:00.000Z", + "id": 128, + "group": 50, + "canMove": false, + "end_time": "2017-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#8bf4b7" + } + } + }, + { + "title": "Green Book", + "start_time": "2017-12-31T22:00:00.000Z", + "id": 129, + "group": 50, + "canMove": false, + "end_time": "2018-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcd3c2" + } + } + }, + { + "title": "Parasite", + "start_time": "2018-12-31T22:00:00.000Z", + "id": 130, + "group": 50, + "canMove": false, + "end_time": "2023-12-22T14:00:45.114Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcdeae" + } + } + }, + { + "title": "Iron Man", + "start_time": "2008-05-01T21:00:00.000Z", + "id": 131, + "group": 52, + "canMove": false, + "end_time": "2009-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#f4b077" + } + } + }, + { + "title": "Iron Man 2", + "start_time": "2009-12-31T22:00:00.000Z", + "id": 132, + "group": 52, + "canMove": false, + "end_time": "2012-05-03T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#93f99a" + } + } + }, + { + "title": "The Avengers", + "start_time": "2012-05-03T21:00:00.000Z", + "id": 133, + "group": 52, + "canMove": false, + "end_time": "2012-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#fcaeb7" + } + } + }, + { + "title": "Iron Man 3", + "start_time": "2012-12-31T22:00:00.000Z", + "id": 134, + "group": 52, + "canMove": false, + "end_time": "2014-07-31T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#9df9ba" + } + } + }, + { + "title": "Guardians of the Galaxy", + "start_time": "2014-07-31T21:00:00.000Z", + "id": 135, + "group": 52, + "canMove": false, + "end_time": "2014-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#b790f9" + } + } + }, + { + "title": "Avengers: Age of Ultron", + "start_time": "2014-12-31T22:00:00.000Z", + "id": 136, + "group": 52, + "canMove": false, + "end_time": "2016-11-03T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#cff771" + } + } + }, + { + "title": "Dr. Strange", + "start_time": "2016-11-03T22:00:00.000Z", + "id": 137, + "group": 52, + "canMove": false, + "end_time": "2016-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#9ff9da" + } + } + }, + { + "title": "Guardians of the Galaxy Vol. 2", + "start_time": "2016-12-31T22:00:00.000Z", + "id": 138, + "group": 52, + "canMove": false, + "end_time": "2017-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#c1fc9c" + } + } + }, + { + "title": "Black Panther", + "start_time": "2017-12-31T22:00:00.000Z", + "id": 139, + "group": 52, + "canMove": false, + "end_time": "2018-04-26T21:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#a1f984" + } + } + }, + { + "title": "Avengers: Infinity War", + "start_time": "2018-04-26T21:00:00.000Z", + "id": 140, + "group": 52, + "canMove": false, + "end_time": "2018-12-31T22:00:00.000Z", + "itemProps": { + "style": { + "color": "black", + "background": "#6fe8e8" + } + } + }, + { + "title": "Avengers: Endgame", + "start_time": "2018-12-31T22:00:00.000Z", + "id": 141, + "group": 52, + "canMove": false, + "end_time": "2023-12-22T14:00:45.114Z", + "itemProps": { + "style": { + "color": "black", + "background": "#d3f9a4" + } + } + } +] diff --git a/demo/app/demo-performance/index.js b/demo/src/demo-performance/index.jsx similarity index 72% rename from demo/app/demo-performance/index.js rename to demo/src/demo-performance/index.jsx index 97c940d00..aa4a515f2 100644 --- a/demo/app/demo-performance/index.js +++ b/demo/src/demo-performance/index.jsx @@ -1,17 +1,13 @@ /* eslint-disable no-console */ import React, { Component } from 'react' -import moment from 'moment' +import dayjs from 'dayjs' import Timeline from 'react-calendar-timeline' import generateFakeData from '../generate-fake-data' -var minTime = moment() - .add(-6, 'months') - .valueOf() -var maxTime = moment() - .add(6, 'months') - .valueOf() +var minTime = dayjs().add(-6, 'months').valueOf() +var maxTime = dayjs().add(6, 'months').valueOf() var keys = { groupIdKey: 'id', @@ -22,7 +18,7 @@ var keys = { itemDivTitleKey: 'title', itemGroupKey: 'group', itemTimeStartKey: 'start', - itemTimeEndKey: 'end' + itemTimeEndKey: 'end', } export default class App extends Component { @@ -30,45 +26,47 @@ export default class App extends Component { super(props) const { groups, items } = generateFakeData(100, 10000) - const defaultTimeStart = moment() - .startOf('month') - .toDate() - const defaultTimeEnd = moment() - .endOf('month') - .toDate() - - groups[0].stackItems = false; - groups[0].height = 300; + const defaultTimeStart = dayjs().startOf('month').valueOf() + const defaultTimeEnd = dayjs().endOf('month').valueOf() + + groups[0].stackItems = false + groups[0].height = 300 this.state = { groups, - items, + items: items.map((item) => { + return { + ...item, + start: dayjs(item.start).valueOf(), + end: dayjs(item.end).valueOf(), + } + }), defaultTimeStart, - defaultTimeEnd + defaultTimeEnd, } } handleCanvasClick = (groupId, time) => { - console.log('Canvas clicked', groupId, moment(time).format()) + console.log('Canvas clicked', groupId, dayjs(time).format()) } handleCanvasContextMenu = (group, time) => { - console.log('Canvas context menu', group, moment(time).format()) + console.log('Canvas context menu', group, dayjs(time).format()) } handleItemClick = (itemId, _, time) => { - console.log('Clicked: ' + itemId, moment(time).format()) + console.log('Clicked: ' + itemId, dayjs(time).format()) } handleItemSelect = (itemId, _, time) => { - console.log('Selected: ' + itemId, moment(time).format()) + console.log('Selected: ' + itemId, dayjs(time).format()) } handleItemDoubleClick = (itemId, _, time) => { - console.log('Double Click: ' + itemId, moment(time).format()) + console.log('Double Click: ' + itemId, dayjs(time).format()) } handleItemContextMenu = (itemId, _, time) => { - console.log('Context Menu: ' + itemId, moment(time).format()) + console.log('Context Menu: ' + itemId, dayjs(time).format()) } handleItemMove = (itemId, dragTime, newGroupOrder) => { @@ -77,16 +75,15 @@ export default class App extends Component { const group = groups[newGroupOrder] this.setState({ - items: items.map( - item => - item.id === itemId - ? Object.assign({}, item, { - start: dragTime, - end: dragTime + (item.end - item.start), - group: group.id - }) - : item - ) + items: items.map((item) => + item.id === itemId + ? Object.assign({}, item, { + start: dragTime, + end: dragTime + (item.end - item.start), + group: group.id, + }) + : item, + ), }) console.log('Moved', itemId, dragTime, newGroupOrder) @@ -96,15 +93,14 @@ export default class App extends Component { const { items } = this.state this.setState({ - items: items.map( - item => - item.id === itemId - ? Object.assign({}, item, { - start: edge === 'left' ? time : item.start, - end: edge === 'left' ? item.end : time - }) - : item - ) + items: items.map((item) => + item.id === itemId + ? Object.assign({}, item, { + start: edge === 'left' ? time : item.start, + end: edge === 'left' ? item.end : time, + }) + : item, + ), }) console.log('Resized', itemId, time, edge) @@ -176,7 +172,6 @@ export default class App extends Component { defaultTimeEnd={defaultTimeEnd} // itemRenderer={this.itemRenderer} // groupRenderer={this.groupRenderer} - onCanvasClick={this.handleCanvasClick} onCanvasContextMenu={this.handleCanvasContextMenu} onItemClick={this.handleItemClick} diff --git a/demo/app/demo-renderers/index.js b/demo/src/demo-renderers/index.jsx similarity index 70% rename from demo/app/demo-renderers/index.js rename to demo/src/demo-renderers/index.jsx index 898dfb426..265308a78 100644 --- a/demo/app/demo-renderers/index.js +++ b/demo/src/demo-renderers/index.jsx @@ -1,19 +1,16 @@ /* eslint-disable no-console */ -import React, { Component } from 'react' -import moment from 'moment' +import { Component } from 'react' +import dayjs from 'dayjs' import Timeline from 'react-calendar-timeline' import generateFakeData from '../generate-fake-data' -var minTime = moment() - .add(-6, 'months') - .valueOf() -var maxTime = moment() - .add(6, 'months') - .valueOf() +const minTime = dayjs().add(-6, 'months').valueOf() +const maxTime = dayjs().add(6, 'months').valueOf() -var keys = { +const keys = { + groupLabelKey: 'title', groupIdKey: 'id', groupTitleKey: 'title', groupRightTitleKey: 'rightTitle', @@ -22,13 +19,22 @@ var keys = { itemDivTitleKey: 'title', itemGroupKey: 'group', itemTimeStartKey: 'start', - itemTimeEndKey: 'end' + itemTimeEndKey: 'end', } class GroupRenderer extends Component { render() { // console.log("heading rendering"); - return
NameMetadata
; + return ( + + + + + + + +
NameMetadata
+ ) } } @@ -37,43 +43,39 @@ export default class App extends Component { super(props) const { groups, items } = generateFakeData(100, 5000) - const visibleTimeStart = moment() - .startOf('month') - .toDate().valueOf() - const visibleTimeEnd = moment() - .endOf('month') - .toDate().valueOf() + const visibleTimeStart = dayjs().startOf('month').toDate().valueOf() + const visibleTimeEnd = dayjs().endOf('month').toDate().valueOf() this.state = { groups, items, visibleTimeStart, - visibleTimeEnd + visibleTimeEnd, } } handleCanvasClick = (groupId, time) => { - console.log('Canvas clicked', groupId, moment(time).format()) + console.log('Canvas clicked', groupId, dayjs(time).format()) } handleCanvasContextMenu = (group, time) => { - console.log('Canvas context menu', group, moment(time).format()) + console.log('Canvas context menu', group, dayjs(time).format()) } handleItemClick = (itemId, _, time) => { - console.log('Clicked: ' + itemId, moment(time).format()) + console.log('Clicked: ' + itemId, dayjs(time).format()) } handleItemSelect = (itemId, _, time) => { - console.log('Selected: ' + itemId, moment(time).format()) + console.log('Selected: ' + itemId, dayjs(time).format()) } handleItemDoubleClick = (itemId, _, time) => { - console.log('Double Click: ' + itemId, moment(time).format()) + console.log('Double Click: ' + itemId, dayjs(time).format()) } handleItemContextMenu = (itemId, _, time) => { - console.log('Context Menu: ' + itemId, moment(time).format()) + console.log('Context Menu: ' + itemId, dayjs(time).format()) } handleItemMove = (itemId, dragTime, newGroupOrder) => { @@ -82,16 +84,15 @@ export default class App extends Component { const group = groups[newGroupOrder] this.setState({ - items: items.map( - item => - item.id === itemId - ? Object.assign({}, item, { - start: dragTime, - end: dragTime + (item.end - item.start), - group: group.id - }) - : item - ) + items: items.map((item) => + item.id === itemId + ? Object.assign({}, item, { + start: dragTime, + end: dragTime + (item.end - item.start), + group: group.id, + }) + : item, + ), }) console.log('Moved', itemId, dragTime, newGroupOrder) @@ -101,15 +102,14 @@ export default class App extends Component { const { items } = this.state this.setState({ - items: items.map( - item => - item.id === itemId - ? Object.assign({}, item, { - start: edge === 'left' ? time : item.start, - end: edge === 'left' ? item.end : time - }) - : item - ) + items: items.map((item) => + item.id === itemId + ? Object.assign({}, item, { + start: edge === 'left' ? time : item.start, + end: edge === 'left' ? item.end : time, + }) + : item, + ), }) console.log('Resized', itemId, time, edge) @@ -117,11 +117,10 @@ export default class App extends Component { // this limits the timeline to -6 months ... +6 months handleTimeChange = (visibleTimeStart, visibleTimeEnd, updateScrollCanvas) => { - if (visibleTimeStart < minTime && visibleTimeEnd > maxTime) { this.setState({ visibleTimeStart: minTime, - visibleTimeEnd: maxTime + visibleTimeEnd: maxTime, }) //updateScrollCanvas(minTime, maxTime) } else if (visibleTimeStart < minTime) { @@ -131,8 +130,8 @@ export default class App extends Component { } else { this.setState({ visibleTimeStart, - visibleTimeEnd - }); + visibleTimeEnd, + }) //updateScrollCanvas(visibleTimeStart, visibleTimeEnd) } } @@ -179,13 +178,11 @@ export default class App extends Component { keys={keys} sidebarWidth={150} sidebarContent={} - // rightSidebarWidth={150} - // rightSidebarContent={
Above The Right
} - + rightSidebarWidth={150} + rightSidebarContent={
Above The Right
} canMove canResize="right" canSelect - itemsSorted itemTouchSendsClick={false} stackItems itemHeightRatio={0.75} @@ -195,7 +192,6 @@ export default class App extends Component { visibleTimeEnd={visibleTimeEnd} // itemRenderer={this.itemRenderer} groupRenderer={this.groupRenderer} - onCanvasClick={this.handleCanvasClick} onCanvasContextMenu={this.handleCanvasContextMenu} onItemClick={this.handleItemClick} diff --git a/demo/app/demo-tree-groups/index.js b/demo/src/demo-tree-groups/index.jsx similarity index 96% rename from demo/app/demo-tree-groups/index.js rename to demo/src/demo-tree-groups/index.jsx index 63cb3ea2e..3c3806425 100644 --- a/demo/app/demo-tree-groups/index.js +++ b/demo/src/demo-tree-groups/index.jsx @@ -1,5 +1,5 @@ import React, { Component } from 'react' -import moment from 'moment' +import dayjs from 'dayjs' import Timeline from 'react-calendar-timeline' @@ -23,10 +23,10 @@ export default class App extends Component { super(props) const { groups, items } = generateFakeData() - const defaultTimeStart = moment() + const defaultTimeStart = dayjs() .startOf('day') .toDate() - const defaultTimeEnd = moment() + const defaultTimeEnd = dayjs() .startOf('day') .add(1, 'day') .toDate() diff --git a/demo/src/demo-vertical-classes/index.jsx b/demo/src/demo-vertical-classes/index.jsx new file mode 100644 index 000000000..472989c29 --- /dev/null +++ b/demo/src/demo-vertical-classes/index.jsx @@ -0,0 +1,121 @@ +import dayjs from 'dayjs' +import React, { Component } from 'react' + +import generateFakeData from '../generate-fake-data' +import Timeline from 'react-calendar-timeline' + +const format = 'DD.MM.YYYY' +const holidays = [ + dayjs('01.01.2018', format), + dayjs('06.01.2018', format), + dayjs('30.03.2018', format), + dayjs('01.04.2018', format), + dayjs('02.04.2018', format), + dayjs('01.05.2018', format), + dayjs('10.05.2018', format), + dayjs('20.05.2018', format), + dayjs('21.05.2018', format), + dayjs('31.05.2018', format), + dayjs('15.08.2018', format), + dayjs('26.10.2018', format), + dayjs('01.11.2018', format), + dayjs('08.12.2018', format), + dayjs('24.12.2018', format), + dayjs('25.12.2018', format), + dayjs('26.12.2018', format), + dayjs('31.12.2018', format), +] + +const keys = { + groupIdKey: 'id', + groupTitleKey: 'title', + groupRightTitleKey: 'rightTitle', + itemIdKey: 'id', + itemTitleKey: 'title', + itemDivTitleKey: 'title', + itemGroupKey: 'group', + itemTimeStartKey: 'start', + itemTimeEndKey: 'end', +} + +export default class App extends Component { + constructor(props) { + super(props) + + const { groups, items } = generateFakeData() + const defaultTimeStart = dayjs().startOf('day').toDate() + const defaultTimeEnd = dayjs().startOf('day').add(1, 'day').toDate() + + this.state = { + groups, + items, + defaultTimeStart, + defaultTimeEnd, + } + } + + getMinutesOfDay = (date) => { + return date.hour() * 60 + date.minute() + } + + verticalLineClassNamesForTime = (timeStart, timeEnd) => { + const currentTimeStart = dayjs(timeStart) + const currentTimeEnd = dayjs(timeEnd) + + let classes = [] + + // check for public holidays + for (let holiday of holidays) { + if ( + holiday.isSame(currentTimeStart, 'day') && + holiday.isSame(currentTimeEnd, 'day') + ) { + classes.push('holiday') + } + } + + // highlight lunch break (12:00-13:00) + const lunchStart = dayjs().hour(12).minute(0).second(0) + const lunchEnd = dayjs().hour(13).minute(0).second(0) + if ( + this.getMinutesOfDay(currentTimeStart) >= + this.getMinutesOfDay(lunchStart) && + this.getMinutesOfDay(currentTimeEnd) <= this.getMinutesOfDay(lunchEnd) + ) { + classes.push('lunch') + } + + return classes + } + + render() { + const { groups, items, defaultTimeStart, defaultTimeEnd } = this.state + + return ( +
+ In this example we have public holidays we want to highlight. +
+ Also we want to visually highlight a blocking range (e.g. lunch break). +
+
+ Above The Left
} + canMove + canResize="right" + canSelect + itemsSorted + itemTouchSendsClick={false} + stackItems + itemHeightRatio={0.75} + defaultTimeStart={defaultTimeStart} + defaultTimeEnd={defaultTimeEnd} + verticalLineClassNamesForTime={this.verticalLineClassNamesForTime} + /> +
+ ) + } +} diff --git a/demo/src/generate-fake-data.js b/demo/src/generate-fake-data.js new file mode 100644 index 000000000..9b3ba414c --- /dev/null +++ b/demo/src/generate-fake-data.js @@ -0,0 +1,70 @@ +import { faker } from '@faker-js/faker' +import randomColor from 'randomcolor' +import dayjs from 'dayjs' + +export default function (groupCount = 30, itemCount = 1000, daysInPast = 30) { + let randomSeed = Math.floor(Math.random() * 1000) + let groups = [] + for (let i = 0; i < groupCount; i++) { + groups.push({ + id: `${i + 1}`, + title: faker.person.firstName(), + rightTitle: faker.person.lastName(), + label: `Label ${faker.person.firstName()}`, + bgColor: randomColor({ luminosity: 'light', seed: randomSeed + i }), + }) + } + + let items = [] + for (let i = 0; i < itemCount; i++) { + const startDate = + faker.date.recent({ days: daysInPast }).valueOf() + + daysInPast * 0.3 * 86400 * 1000 + const startValue = + Math.floor(dayjs(startDate).valueOf() / 10000000) * 10000000 + const endValue = dayjs( + startDate + faker.number.int({ min: 2, max: 20 }) * 15 * 60 * 1000, + ).valueOf() + + items.push({ + id: i + '', + group: faker.number.int({ min: 1, max: groups.length }) + '', + title: faker.hacker.phrase(), + start: startValue, + end: endValue, + canMove: startValue > new Date().getTime(), + canResize: + startValue > new Date().getTime() + ? endValue > new Date().getTime() + ? 'both' + : 'left' + : endValue > new Date().getTime() + ? 'right' + : false, + className: + dayjs(startDate).day() === 6 || dayjs(startDate).day() === 0 + ? 'item-weekend' + : '', + bgColor: randomColor({ + luminosity: 'light', + seed: randomSeed + i, + format: 'rgba', + alpha: 0.6, + }), + selectedBgColor: randomColor({ + luminosity: 'light', + seed: randomSeed + i, + format: 'rgba', + alpha: 1, + }), + color: randomColor({ luminosity: 'dark', seed: randomSeed + i }), + itemProps: { + 'data-tip': faker.hacker.phrase(), + }, + }) + } + + items = items.sort((a, b) => b - a) + + return { groups, items } +} diff --git a/demo/src/main.tsx b/demo/src/main.tsx new file mode 100644 index 000000000..00acb6aff --- /dev/null +++ b/demo/src/main.tsx @@ -0,0 +1,11 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './normalize.css' +import './styles.scss' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/demo/src/normalize.css b/demo/src/normalize.css new file mode 100644 index 000000000..192eb9ce4 --- /dev/null +++ b/demo/src/normalize.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/demo/app/styles.scss b/demo/src/styles.scss similarity index 94% rename from demo/app/styles.scss rename to demo/src/styles.scss index c80509aec..0acc45c6d 100644 --- a/demo/app/styles.scss +++ b/demo/src/styles.scss @@ -2,6 +2,9 @@ body { font-family: 'Lato'; margin: 0; font-size: 13px; + min-height: 100vh; + display: flex; + flex-direction: column; } .react-calendar-timeline .rct-item.item-weekend { diff --git a/demo/src/vite-env.d.ts b/demo/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/demo/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/demo/tsconfig.json b/demo/tsconfig.json new file mode 100644 index 000000000..b9166fcc2 --- /dev/null +++ b/demo/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "paths": { + "react-calendar-timeline": ["../src/index.ts"] + }, + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "allowJs": true, + "noImplicitAny": false, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src" + ], + "references": [{ "path": "./tsconfig.node.json"}] +} diff --git a/demo/tsconfig.node.json b/demo/tsconfig.node.json new file mode 100644 index 000000000..b5a343184 --- /dev/null +++ b/demo/tsconfig.node.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": [ + "vite.config.ts" + ] +} diff --git a/demo/vite.config.ts b/demo/vite.config.ts new file mode 100644 index 000000000..85f75086f --- /dev/null +++ b/demo/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' +import { resolve } from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + resolve: { + alias: { + 'react-calendar-timeline': resolve(__dirname, '../src'), + }, + }, + plugins: [react()], +}) diff --git a/index.js b/index.js index 6e92639c6..e1b0a5c3e 100644 --- a/index.js +++ b/index.js @@ -1,3 +1 @@ -import Timeline from './lib/lib/Timeline' - -export default Timeline +export * from './dist/react-calendar-timeline.es.js' diff --git a/package.json b/package.json index 8c7387bdc..eb3aeaca1 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,37 @@ { "name": "react-calendar-timeline", - "version": "0.26.7", - "description": "react calendar timeline", - "main": "lib/index.js", + "version": "0.30.0-beta.2", + "description": "react-calendar-timeline", + "packageManager": "npm@10.1.0", "scripts": { - "build": "npm run build:lib", - "build:demo": "echo '!!! Building Demo' && cross-env NODE_ENV=production webpack --progress", - "build:lib": "echo '!!! Building Library' && rimraf lib && cross-env NODE_ENV=production babel src --out-dir lib && node-sass src/lib/Timeline.scss lib/Timeline.css && sed -i'.bak' 's/Timeline\\.scss/Timeline\\.css/g' lib/lib/Timeline.js && rm lib/lib/Timeline.js.bak", - "lint": "eslint --ext .js --ext .jsx ./src", - "lint:fix": "prettier-eslint --parser babylon --write \"src/**/*.js\"", - "prepublish": "npm run build:lib", - "start": "webpack-dev-server --hot --host 0.0.0.0 --display-modules", + "build": "tsc && vite build", + "lint": "eslint --ext .ts --ext .tsx ./src", + "lint:fix": "npm run lint --fix", "test": "jest", "test:watch": "jest --watch" }, + "main": "./dist/react-calendar-timeline.umd.js", + "module": "./dist/react-calendar-timeline.es.js", + "exports": { + "./styles.css": "./dist/styles.css", + ".": { + "types": [ + "./dist/index.d.ts" + ], + "import": "./dist/react-calendar-timeline.es.js", + "require": "./dist/react-calendar-timeline.umd.js" + } + }, + "types": "./dist/index.d.ts", "files": [ - "lib", - "src" + "dist" ], "homepage": "https://github.com/namespace-ee/react-calendar-timeline", "repository": { "type": "git", "url": "https://github.com/namespace-ee/react-calendar-timeline.git" }, + "private": false, "author": "Marius Andra ", "contributors": [ { @@ -55,6 +64,10 @@ { "name": "Kevin Mann", "url": "https://github.com/kevinmanncito" + }, + { + "name": "Remco Blumink", + "url": "" } ], "license": "MIT", @@ -64,92 +77,54 @@ "react-component", "timeline" ], - "standard": { - "parser": "babel-eslint" - }, - "jest": { - "verbose": true, - "testMatch": [ - "**/__tests__/**/*.js" - ], - "setupFilesAfterEnv": [ - "/config/jest-setup.js" - ], - "collectCoverageFrom": [ - "src/**/*.{js,jsx}" - ], - "modulePaths": [ - "/src/", - "/__tests__" - ], - "testPathIgnorePatterns": [ - "/node_modules", - "/__tests__/test-utility" - ], - "watchPlugins": [ - "jest-watch-typeahead/filename", - "jest-watch-typeahead/testname" - ] - }, "dependencies": { - "classnames": "^2.2.6", - "create-react-context": "^0.2.2", - "element-resize-detector": "^1.1.12", - "lodash.isequal": "^4.5.0", - "memoize-one": "^5.1.1" + "classnames": "^2.5.1", + "element-resize-detector": "^1.2.4", + "lodash": "^4.17.21", + "memoize-one": "^6.0.0" }, "peerDependencies": { - "interactjs": "^1.3.4", - "moment": "*", - "prop-types": "^15.6.2", - "react": ">=16.3", - "react-dom": ">=16.3" + "dayjs": ">=1.10.0", + "interactjs": "1.10.27", + "react": ">=18", + "react-dom": ">=18" }, "devDependencies": { - "@babel/cli": "^7.5.0", - "@babel/core": "^7.5.0", - "@babel/plugin-proposal-class-properties": "^7.5.0", - "@babel/plugin-proposal-object-rest-spread": "^7.5.2", - "@babel/preset-env": "^7.5.2", - "@babel/preset-react": "^7.0.0", - "babel-eslint": "^7.1.1", - "babel-jest": "^24.8.0", - "babel-loader": "^8.0.6", - "babel-plugin-react-remove-properties": "^0.3.0", - "cross-env": "^5.1.4", - "css-loader": "~0.26.0", - "enzyme": "^3.10.0", - "enzyme-adapter-react-16": "^1.14.0", - "eslint": "^4.16.0", - "eslint-config-prettier": "^2.9.0", - "eslint-config-standard": "^6.2.1", - "eslint-plugin-jest": "^21.6.1", - "eslint-plugin-prettier": "^2.5.0", - "eslint-plugin-promise": "^3.4.0", - "eslint-plugin-react": "^7.5.1", - "eslint-plugin-standard": "^2.0.1", - "faker": "^4.1.0", - "interactjs": "^1.3.4", - "jest": "^24.8.0", - "jest-dom": "^3.5.0", - "jest-watch-typeahead": "^0.3.1", - "jsdom": "^11.5.1", - "moment": "^2.11.1", - "node-sass": "^4.12.0", - "prettier": "^1.10.2", - "prettier-eslint-cli": "^4.7.0", - "prop-types": "^15.6.2", - "randomcolor": "^0.5.3", - "react": "^16.2.0", - "react-dom": "^16.2.0", - "react-router-dom": "^4.1.1", - "react-testing-library": "^6.0.3", - "regenerator-runtime": "^0.13.2", - "rimraf": "^2.6.2", - "sass-loader": "^7.0.3", - "style-loader": "~0.13.0", - "webpack": "^4.16.3", - "webpack-cli": "^3.1.0", - "webpack-dev-server": "^3.1.5" + "rollup-plugin-typescript-paths": "^1.5.0", + "@types/lodash": "^4.14.202", + "@rollup/plugin-typescript": "^12.1.0", + "@faker-js/faker": "^9.0.3", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@types/element-resize-detector": "^1.1.6", + "@types/react": "^18.2.41", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^8.8.1", + "@typescript-eslint/parser": "^8.8.1", + "@vitejs/plugin-react-swc": "^3.7.1", + "cross-env": "^7.0.3", + "dayjs": "^1.11.10", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jest": "^28.8.3", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-promise": "^7.1.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.5", + "interactjs": "1.10.27", + "jest": "^29.7.0", + "jest-watch-typeahead": "^2.2.2", + "jsdom": "^25.0.1", + "prettier": "^3.1.0", + "prettier-eslint-cli": "^8.0.1", + "randomcolor": "^0.6.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "sass": "^1.69.5", + "typescript": "^5.2.2", + "vite": "^5.4.8", + "vite-plugin-dts": "^4.2.4", + "vite-plugin-lib-inject-css": "^2.1.1" } } diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 1c1233da9..000000000 --- a/src/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import Timeline from './lib/Timeline' - -export { - default as TimelineMarkers -} from './lib/markers/public/TimelineMarkers' -export { default as TodayMarker } from './lib/markers/public/TodayMarker' -export { default as CustomMarker } from './lib/markers/public/CustomMarker' -export { default as CursorMarker } from './lib/markers/public/CursorMarker' -export { default as TimelineHeaders } from './lib/headers/TimelineHeaders' -export {default as SidebarHeader} from './lib/headers/SidebarHeader' -export {default as CustomHeader} from './lib/headers/CustomHeader' -export {default as DateHeader} from './lib/headers/DateHeader' -export default Timeline diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 000000000..7a25bd6c0 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,27 @@ +import Timeline, { ReactCalendarTimelineProps, ReactCalendarTimelineState, OnTimeChange } from './lib/Timeline' + +export { default as TimelineMarkers } from './lib/markers/public/TimelineMarkers' +export { default as TodayMarker } from './lib/markers/public/TodayMarker' +export type { TodayMarkerProps } from './lib/markers/public/TodayMarker' +export { default as CustomMarker } from './lib/markers/public/CustomMarker' +export { default as CursorMarker } from './lib/markers/public/CursorMarker' +export type { CursorMarkerProps } from './lib/markers/public/CursorMarker' +export { default as TimelineHeaders } from './lib/headers/TimelineHeaders' +export type { TimelineHeadersWrapperProps as TimelineHeadersProps } from './lib/headers/TimelineHeaders' +export { default as SidebarHeader } from './lib/headers/SidebarHeader' +export type { SidebarWrapperProps as SidebarHeaderProps } from './lib/headers/SidebarHeader' +export { default as CustomHeader } from './lib/headers/CustomHeader' +export type { CustomHeaderWrapperProps as CustomHeaderProps } from './lib/headers/CustomHeader' +export { default as DateHeader } from './lib/headers/DateHeader' +export type { DateHeaderWrapper as DateHeaderProps } from './lib/headers/DateHeader' +export * as calendarUtils from './lib/utility/calendar' +export * from './lib/types/main' +export * from './lib/default-config' + +export { default as GroupRow } from './lib/row/GroupRow' +export { default as RowItems } from './lib/items/Items' + +export { TimelineContext } from './lib/timeline/TimelineStateContext' +export { Timeline } +export type { ReactCalendarTimelineProps, ReactCalendarTimelineState, OnTimeChange } +export default Timeline diff --git a/src/lib/Timeline.scss b/src/lib/Timeline.scss index 586b3edf3..cdec5aabd 100644 --- a/src/lib/Timeline.scss +++ b/src/lib/Timeline.scss @@ -158,8 +158,6 @@ $weekend: rgba(250, 246, 225, 0.5); } .rct-calendar-header { - border: 1px solid #bbb, - + border: 1px solid #bbb } - } diff --git a/src/lib/Timeline.js b/src/lib/Timeline.tsx similarity index 53% rename from src/lib/Timeline.js rename to src/lib/Timeline.tsx index d152220ca..39999583f 100644 --- a/src/lib/Timeline.js +++ b/src/lib/Timeline.tsx @@ -1,173 +1,168 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import moment from 'moment' - -import Items from './items/Items' +import React, { Component, MouseEvent } from 'react' +import Items, { CanResize } from './items/Items' import Sidebar from './layout/Sidebar' import Columns from './columns/Columns' -import GroupRows from './row/GroupRows' +import GroupRows, { RowClickEvent } from './row/GroupRows' import ScrollElement from './scroll/ScrollElement' import MarkerCanvas from './markers/MarkerCanvas' import windowResizeDetector from '../resize-detector/window' - import { getMinUnit, - getNextUnit, calculateTimeForXPosition, calculateScrollCanvas, getCanvasBoundariesFromVisibleTime, getCanvasWidth, - stackTimelineItems + stackTimelineItems, } from './utility/calendar' -import { _get, _length } from './utility/generic' -import { - defaultKeys, - defaultTimeSteps, - defaultHeaderLabelFormats, - defaultSubHeaderLabelFormats -} from './default-config' +import { _get } from './utility/generic' +import { defaultKeys, defaultTimeSteps } from './default-config' import { TimelineStateProvider } from './timeline/TimelineStateContext' import { TimelineMarkersProvider } from './markers/TimelineMarkersContext' import { TimelineHeadersProvider } from './headers/HeadersContext' import TimelineHeaders from './headers/TimelineHeaders' -import DateHeader from './headers/DateHeader' -import SidebarHeader from './headers/SidebarHeader' - -export default class ReactCalendarTimeline extends Component { - static propTypes = { - groups: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).isRequired, - items: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).isRequired, - sidebarWidth: PropTypes.number, - rightSidebarWidth: PropTypes.number, - dragSnap: PropTypes.number, - minResizeWidth: PropTypes.number, - stickyHeader: PropTypes.bool, - lineHeight: PropTypes.number, - itemHeightRatio: PropTypes.number, - - minZoom: PropTypes.number, - maxZoom: PropTypes.number, - - clickTolerance: PropTypes.number, - - canChangeGroup: PropTypes.bool, - canMove: PropTypes.bool, - canResize: PropTypes.oneOf([true, false, 'left', 'right', 'both']), - useResizeHandle: PropTypes.bool, - canSelect: PropTypes.bool, - - stackItems: PropTypes.bool, - - traditionalZoom: PropTypes.bool, - - itemTouchSendsClick: PropTypes.bool, - - horizontalLineClassNamesForGroup: PropTypes.func, - - onItemMove: PropTypes.func, - onItemResize: PropTypes.func, - onItemClick: PropTypes.func, - onItemSelect: PropTypes.func, - onItemDeselect: PropTypes.func, - onCanvasClick: PropTypes.func, - onItemDoubleClick: PropTypes.func, - onItemContextMenu: PropTypes.func, - onCanvasDoubleClick: PropTypes.func, - onCanvasContextMenu: PropTypes.func, - onZoom: PropTypes.func, - onItemDrag: PropTypes.func, - - moveResizeValidator: PropTypes.func, - - itemRenderer: PropTypes.func, - groupRenderer: PropTypes.func, - - className: PropTypes.string, - style: PropTypes.object, - - keys: PropTypes.shape({ - groupIdKey: PropTypes.string, - groupTitleKey: PropTypes.string, - groupLabelKey: PropTypes.string, - groupRightTitleKey: PropTypes.string, - itemIdKey: PropTypes.string, - itemTitleKey: PropTypes.string, - itemDivTitleKey: PropTypes.string, - itemGroupKey: PropTypes.string, - itemTimeStartKey: PropTypes.string, - itemTimeEndKey: PropTypes.string - }), - headerRef: PropTypes.func, - scrollRef: PropTypes.func, - - timeSteps: PropTypes.shape({ - second: PropTypes.number, - minute: PropTypes.number, - hour: PropTypes.number, - day: PropTypes.number, - month: PropTypes.number, - year: PropTypes.number - }), - - defaultTimeStart: PropTypes.object, - defaultTimeEnd: PropTypes.object, - - visibleTimeStart: PropTypes.number, - visibleTimeEnd: PropTypes.number, - onTimeChange: PropTypes.func, - onBoundsChange: PropTypes.func, - - selected: PropTypes.array, - - headerLabelFormats: PropTypes.shape({ - yearShort: PropTypes.string, - yearLong: PropTypes.string, - monthShort: PropTypes.string, - monthMedium: PropTypes.string, - monthMediumLong: PropTypes.string, - monthLong: PropTypes.string, - dayShort: PropTypes.string, - dayLong: PropTypes.string, - hourShort: PropTypes.string, - hourMedium: PropTypes.string, - hourMediumLong: PropTypes.string, - hourLong: PropTypes.string - }), - - subHeaderLabelFormats: PropTypes.shape({ - yearShort: PropTypes.string, - yearLong: PropTypes.string, - monthShort: PropTypes.string, - monthMedium: PropTypes.string, - monthLong: PropTypes.string, - dayShort: PropTypes.string, - dayMedium: PropTypes.string, - dayMediumLong: PropTypes.string, - dayLong: PropTypes.string, - hourShort: PropTypes.string, - hourLong: PropTypes.string, - minuteShort: PropTypes.string, - minuteLong: PropTypes.string - }), - - resizeDetector: PropTypes.shape({ - addListener: PropTypes.func, - removeListener: PropTypes.func - }), - - verticalLineClassNamesForTime: PropTypes.func, - - children: PropTypes.node - } +import { DateHeader } from './headers/DateHeader' +import { + dateType, + ElementWithSecret, + Id, + OnItemDragObjectMove, + OnItemDragObjectResize, + ReactCalendarGroupRendererProps, + TimelineContext, + TimelineGroupBase, + TimelineItemBase, + TimelineKeys, + TimelineTimeSteps, + Unit, +} from './types/main' +import { ItemDimension } from './types/dimension' +import dayjs, { Dayjs } from 'dayjs' +import { ItemProps, ResizeEdge } from './items/Item' +import './Timeline.scss' +import localizedFormat from 'dayjs/plugin/localizedFormat' + +dayjs.extend(localizedFormat) + +export type OnTimeChange = ( + visibleTimeStart: number, + visibleTimeEnd: number, + updateScrollCanvas: ( + start: dateType, + end: dateType, + forceUpdateDimensions?: boolean, + items?: CustomItem[], + groups?: CustomGroup[], + ) => void, + unit: Unit, +) => any + +export type ReactCalendarTimelineProps< + CustomItem extends TimelineItemBase, + CustomGroup extends TimelineGroupBase = TimelineGroupBase, +> = { + children?: React.ReactNode + groups: CustomGroup[] + items: CustomItem[] + keys: TimelineKeys + defaultTimeStart: number + defaultTimeEnd: number + visibleTimeStart?: dateType + visibleTimeEnd?: dateType + selected?: Id[] | undefined + sidebarWidth: number + sidebarContent?: React.ReactNode | undefined + rightSidebarWidth: number + rightSidebarContent?: React.ReactNode | undefined + dragSnap?: number + minResizeWidth?: number | undefined + lineHeight: number + itemHeightRatio: number + minZoom: number + maxZoom: number + clickTolerance?: number | undefined + canMove?: boolean | undefined + canChangeGroup?: boolean | undefined + canResize?: CanResize + useResizeHandle?: boolean | undefined + canSelect?: boolean + stackItems: boolean + traditionalZoom?: boolean | undefined + itemTouchSendsClick?: boolean | undefined + timeSteps: TimelineTimeSteps + scrollRef?: (el: HTMLDivElement) => void + onItemDrag?(itemDragObject: OnItemDragObjectMove | OnItemDragObjectResize): void + onItemMove?(itemId: Id, dragTime: number, newGroupOrder: number): void + onItemResize?(itemId: Id, endTimeOrStartTime: number, edge: ResizeEdge): void + onItemSelect?(itemId: Id, e: any, time: number): void + onItemDeselect?(e: React.SyntheticEvent): void + onItemClick?(itemId: Id, e: React.SyntheticEvent, time: number): void + onItemDoubleClick?(itemId: Id, e: React.SyntheticEvent, time: number): void + onItemContextMenu?(itemId: Id, e: React.SyntheticEvent, time: number): void + onCanvasClick?(groupId: Id, time: number, e: React.SyntheticEvent): void + onCanvasDoubleClick?(groupId: Id, time: number, e: React.SyntheticEvent): void + onCanvasContextMenu?(groupId: Id, time: number, e: React.SyntheticEvent): void + onZoom?(timelineContext: TimelineContext, unit: Unit): void + moveResizeValidator?: ItemProps['moveResizeValidator'] + onTimeChange?: OnTimeChange + onBoundsChange?(canvasTimeStart: number, canvasTimeEnd: number): any + itemRenderer?: ItemProps['itemRenderer'] + groupRenderer?: ((props: ReactCalendarGroupRendererProps) => React.ReactNode) | undefined + resizeDetector?: + | { + addListener?: (x: any) => void + removeListener: (x: any) => void + } + | undefined + verticalLineClassNamesForTime?: (start: number, end: number) => string[] + horizontalLineClassNamesForGroup?: ((group: CustomGroup) => string[]) | undefined + buffer?: number + // Fields that are in propTypes but not documented + headerRef?: (el: HTMLDivElement) => void + className?: string + style?: React.CSSProperties +} - static defaultProps = { +export type ReactCalendarTimelineState< + CustomItem extends TimelineItemBase = TimelineItemBase, + CustomGroup extends TimelineGroupBase = TimelineGroupBase, +> = { + width: number + visibleTimeStart: number + visibleTimeEnd: number + canvasTimeStart: dateType + canvasTimeEnd: dateType + selectedItem: Id | null + dragTime: number | null + dragGroupTitle: string | null + resizeTime: number | null + resizingItem: Id | null + resizingEdge: 'left' | 'right' | null + items?: CustomItem[] + groups?: CustomGroup[] + draggingItem?: Id | null + newGroupOrder: number + dimensionItems: ItemDimension[] + height: number + groupHeights: number[] + groupTops: number[] +} + +export default class ReactCalendarTimeline< + CustomItem extends TimelineItemBase = TimelineItemBase, + CustomGroup extends TimelineGroupBase = TimelineGroupBase, +> extends Component< + ReactCalendarTimelineProps, + ReactCalendarTimelineState +> { + static setDayjsLocale = dayjs.locale + public static defaultProps = { sidebarWidth: 150, rightSidebarWidth: 0, dragSnap: 1000 * 60 * 15, // 15min minResizeWidth: 20, - stickyHeader: true, lineHeight: 30, itemHeightRatio: 0.65, + buffer: 3, minZoom: 60 * 60 * 1000, // 1 hour maxZoom: 5 * 365.24 * 86400 * 1000, // 5 years @@ -219,10 +214,10 @@ export default class ReactCalendarTimeline extends Component { // which needs to update the props visibleTimeStart and visibleTimeEnd to the ones passed visibleTimeStart: null, visibleTimeEnd: null, - onTimeChange: function( - visibleTimeStart, - visibleTimeEnd, - updateScrollCanvas + onTimeChange: function ( + visibleTimeStart: dateType, + visibleTimeEnd: dateType, + updateScrollCanvas: (visibleTimeStart: dateType, visibleTimeEnd: dateType) => void, ) { updateScrollCanvas(visibleTimeStart, visibleTimeEnd) }, @@ -230,71 +225,67 @@ export default class ReactCalendarTimeline extends Component { onBoundsChange: null, children: null, - headerLabelFormats: defaultHeaderLabelFormats, - subHeaderLabelFormats: defaultSubHeaderLabelFormats, - - selected: null - } - - static childContextTypes = { - getTimelineContext: PropTypes.func - } - - getChildContext() { - return { - getTimelineContext: () => { - return this.getTimelineContext() - } - } + selected: null, } - getTimelineContext = () => { - const { - width, - visibleTimeStart, - visibleTimeEnd, - canvasTimeStart, - canvasTimeEnd - } = this.state - + getTimelineContext = (): TimelineContext => { + const { width, visibleTimeStart, visibleTimeEnd, canvasTimeStart, canvasTimeEnd } = this.state + const zoom = visibleTimeEnd - visibleTimeStart + const canvasWidth = getCanvasWidth(width, this.props.buffer!) + const minUnit = getMinUnit(zoom, width, this.props.timeSteps) return { + canvasWidth, + timelineUnit: minUnit, timelineWidth: width, visibleTimeStart, visibleTimeEnd, canvasTimeStart, - canvasTimeEnd + canvasTimeEnd, } } - constructor(props) { + getTimelineUnit = () => { + const { width, visibleTimeStart, visibleTimeEnd } = this.state + + const { timeSteps } = this.props + + const zoom = visibleTimeEnd - visibleTimeStart + const minUnit = getMinUnit(zoom, width, timeSteps) + + return minUnit as Unit + } + + state: ReactCalendarTimelineState + + constructor(props: ReactCalendarTimelineProps) { super(props) this.getSelected = this.getSelected.bind(this) this.hasSelectedItem = this.hasSelectedItem.bind(this) - this.isItemSelected= this.isItemSelected.bind(this) + this.isItemSelected = this.isItemSelected.bind(this) - let visibleTimeStart = null - let visibleTimeEnd = null + let visibleTimeStart: number | null = null + let visibleTimeEnd: number | null = null if (this.props.defaultTimeStart && this.props.defaultTimeEnd) { - visibleTimeStart = this.props.defaultTimeStart.valueOf() - visibleTimeEnd = this.props.defaultTimeEnd.valueOf() + visibleTimeStart = this.props.defaultTimeStart //.valueOf() + visibleTimeEnd = this.props.defaultTimeEnd //.valueOf() } else if (this.props.visibleTimeStart && this.props.visibleTimeEnd) { visibleTimeStart = this.props.visibleTimeStart visibleTimeEnd = this.props.visibleTimeEnd } else { //throwing an error because neither default or visible time props provided throw new Error( - 'You must provide either "defaultTimeStart" and "defaultTimeEnd" or "visibleTimeStart" and "visibleTimeEnd" to initialize the Timeline' + 'You must provide either "defaultTimeStart" and "defaultTimeEnd" or "visibleTimeStart" and "visibleTimeEnd" to initialize the Timeline', ) } const [canvasTimeStart, canvasTimeEnd] = getCanvasBoundariesFromVisibleTime( visibleTimeStart, - visibleTimeEnd + visibleTimeEnd, + props.buffer!, ) - - this.state = { + const state: Partial = { width: 1000, visibleTimeStart: visibleTimeStart, visibleTimeEnd: visibleTimeEnd, @@ -305,41 +296,33 @@ export default class ReactCalendarTimeline extends Component { dragGroupTitle: null, resizeTime: null, resizingItem: null, - resizingEdge: null + resizingEdge: null, + newGroupOrder: 0, //CHECK } - - const canvasWidth = getCanvasWidth(this.state.width) - - const { - dimensionItems, - height, - groupHeights, - groupTops - } = stackTimelineItems( + const canvasWidth = getCanvasWidth(state.width!, props.buffer!) + const { dimensionItems, height, groupHeights, groupTops } = stackTimelineItems( props.items, props.groups, canvasWidth, - this.state.canvasTimeStart, - this.state.canvasTimeEnd, + state.canvasTimeStart!, + state.canvasTimeEnd!, props.keys, props.lineHeight, props.itemHeightRatio, props.stackItems, - this.state.draggingItem, - this.state.resizingItem, - this.state.dragTime, - this.state.resizingEdge, - this.state.resizeTime, - this.state.newGroupOrder + state.draggingItem, + state.resizingItem, + state.dragTime!, + state.resizingEdge!, + state.resizeTime!, + state.newGroupOrder!, ) - /* eslint-disable react/no-direct-mutation-state */ - this.state.dimensionItems = dimensionItems - this.state.height = height - this.state.groupHeights = groupHeights - this.state.groupTops = groupTops - - /* eslint-enable */ + state.dimensionItems = dimensionItems + state.height = height + state.groupHeights = groupHeights + state.groupTops = groupTops + this.state = state as ReactCalendarTimelineState } componentDidMount() { @@ -351,7 +334,7 @@ export default class ReactCalendarTimeline extends Component { windowResizeDetector.addListener(this) - this.lastTouchDistance = null + //this.lastTouchDistance = null //TODO do we need this? } componentWillUnmount() { @@ -362,12 +345,12 @@ export default class ReactCalendarTimeline extends Component { windowResizeDetector.removeListener(this) } - static getDerivedStateFromProps(nextProps, prevState) { + static getDerivedStateFromProps(nextProps: ReactCalendarTimelineProps, prevState: ReactCalendarTimelineState) { const { visibleTimeStart, visibleTimeEnd, items, groups } = nextProps // This is a gross hack pushing items and groups in to state only to allow // For the forceUpdate check - let derivedState = { items, groups } + const derivedState = { items, groups } // if the items or groups have changed we must re-render const forceUpdate = items !== prevState.items || groups !== prevState.groups @@ -377,19 +360,11 @@ export default class ReactCalendarTimeline extends Component { // Get the new canvas position Object.assign( derivedState, - calculateScrollCanvas( - visibleTimeStart, - visibleTimeEnd, - forceUpdate, - items, - groups, - nextProps, - prevState - ) + calculateScrollCanvas(visibleTimeStart, visibleTimeEnd, forceUpdate, items, groups, nextProps, prevState), ) } else if (forceUpdate) { // Calculate new item stack position as canvas may have changed - const canvasWidth = getCanvasWidth(prevState.width) + const canvasWidth = getCanvasWidth(prevState.width, nextProps.buffer!) Object.assign( derivedState, stackTimelineItems( @@ -407,62 +382,51 @@ export default class ReactCalendarTimeline extends Component { prevState.dragTime, prevState.resizingEdge, prevState.resizeTime, - prevState.newGroupOrder - ) + prevState.newGroupOrder, + ), ) } - + return derivedState } - componentDidUpdate(prevProps, prevState) { + scrollComponent: HTMLDivElement | null = null + scrollHeaderRef: HTMLDivElement | null = null + + componentDidUpdate(_: ReactCalendarTimelineProps, prevState: ReactCalendarTimelineState) { const newZoom = this.state.visibleTimeEnd - this.state.visibleTimeStart const oldZoom = prevState.visibleTimeEnd - prevState.visibleTimeStart // are we changing zoom? Report it! if (this.props.onZoom && newZoom !== oldZoom) { - this.props.onZoom(this.getTimelineContext()) + this.props.onZoom(this.getTimelineContext(), this.getTimelineUnit()) } // The bounds have changed? Report it! - if ( - this.props.onBoundsChange && - this.state.canvasTimeStart !== prevState.canvasTimeStart - ) { - this.props.onBoundsChange( - this.state.canvasTimeStart, - this.state.canvasTimeStart + newZoom * 3 - ) + if (this.props.onBoundsChange && this.state.canvasTimeStart !== prevState.canvasTimeStart) { + this.props.onBoundsChange(this.state.canvasTimeStart, this.state.canvasTimeStart + newZoom * 3) } // Check the scroll is correct const scrollLeft = Math.round( - this.state.width * - (this.state.visibleTimeStart - this.state.canvasTimeStart) / - newZoom + (this.state.width * (this.state.visibleTimeStart - this.state.canvasTimeStart)) / newZoom, ) const componentScrollLeft = Math.round( - prevState.width * - (prevState.visibleTimeStart - prevState.canvasTimeStart) / - oldZoom + (prevState.width * (prevState.visibleTimeStart - prevState.canvasTimeStart)) / oldZoom, ) + if (componentScrollLeft !== scrollLeft) { - this.scrollComponent.scrollLeft = scrollLeft - this.scrollHeaderRef.scrollLeft = scrollLeft + this.scrollComponent!.scrollLeft = scrollLeft + this.scrollHeaderRef!.scrollLeft = scrollLeft } } resize = (props = this.props) => { - const { width: containerWidth } = this.container.getBoundingClientRect() + const { width: containerWidth } = this.container.current?.getBoundingClientRect() ?? { width: 0 } - let width = containerWidth - props.sidebarWidth - props.rightSidebarWidth - const canvasWidth = getCanvasWidth(width) - const { - dimensionItems, - height, - groupHeights, - groupTops - } = stackTimelineItems( + const width = containerWidth - props.sidebarWidth - props.rightSidebarWidth + const canvasWidth = getCanvasWidth(width, props.buffer!) + const { dimensionItems, height, groupHeights, groupTops } = stackTimelineItems( props.items, props.groups, canvasWidth, @@ -477,7 +441,7 @@ export default class ReactCalendarTimeline extends Component { this.state.dragTime, this.state.resizingEdge, this.state.resizeTime, - this.state.newGroupOrder + this.state.newGroupOrder, ) // this is needed by dragItem since it uses pageY from the drag events @@ -488,41 +452,44 @@ export default class ReactCalendarTimeline extends Component { dimensionItems, height, groupHeights, - groupTops + groupTops, }) - - this.scrollComponent.scrollLeft = width - this.scrollHeaderRef.scrollLeft = width + //initial scroll left is the buffer - 1 (1 is visible area) divided by 2 (2 is the buffer split on the right and left of the timeline) + const scrollLeft = width * ((props.buffer! - 1) / 2) + if (this.scrollComponent) { + this.scrollComponent.scrollLeft = scrollLeft + } + if (this.scrollHeaderRef) { + this.scrollHeaderRef.scrollLeft = scrollLeft + } } - onScroll = scrollX => { + onScroll = (scrollX: number) => { const width = this.state.width const canvasTimeStart = this.state.canvasTimeStart const zoom = this.state.visibleTimeEnd - this.state.visibleTimeStart - const visibleTimeStart = canvasTimeStart + zoom * scrollX / width + const visibleTimeStart = canvasTimeStart + (zoom * scrollX) / width - if ( - this.state.visibleTimeStart !== visibleTimeStart || - this.state.visibleTimeEnd !== visibleTimeStart + zoom - ) { - this.props.onTimeChange( + if (this.state.visibleTimeStart !== visibleTimeStart || this.state.visibleTimeEnd !== visibleTimeStart + zoom) { + this.props.onTimeChange?.( visibleTimeStart, visibleTimeStart + zoom, - this.updateScrollCanvas + this.updateScrollCanvas, + this.getTimelineUnit(), ) } } // called when the visible time changes updateScrollCanvas = ( - visibleTimeStart, - visibleTimeEnd, - forceUpdateDimensions, + visibleTimeStart: dateType, + visibleTimeEnd: dateType, + forceUpdateDimensions: boolean = false, items = this.props.items, - groups = this.props.groups + groups = this.props.groups, ) => { this.setState( calculateScrollCanvas( @@ -532,63 +499,58 @@ export default class ReactCalendarTimeline extends Component { items, groups, this.props, - this.state - ) + this.state, + ), ) } - handleWheelZoom = (speed, xPosition, deltaY) => { - this.changeZoom(1.0 + speed * deltaY / 500, xPosition / this.state.width) + handleWheelZoom = (speed: number, xPosition: number, deltaY: number) => { + this.changeZoom(1.0 + (speed * deltaY) / 500, xPosition / this.state.width) } - changeZoom = (scale, offset = 0.5) => { + changeZoom = (scale: number, offset = 0.5) => { const { minZoom, maxZoom } = this.props const oldZoom = this.state.visibleTimeEnd - this.state.visibleTimeStart - const newZoom = Math.min( - Math.max(Math.round(oldZoom * scale), minZoom), - maxZoom - ) // min 1 min, max 20 years - const newVisibleTimeStart = Math.round( - this.state.visibleTimeStart + (oldZoom - newZoom) * offset - ) - - this.props.onTimeChange( - newVisibleTimeStart, - newVisibleTimeStart + newZoom, - this.updateScrollCanvas - ) + const newZoom = Math.min(Math.max(Math.round(oldZoom * scale), minZoom), maxZoom) // min 1 min, max 20 years + const newVisibleTimeStart = Math.round(this.state.visibleTimeStart + (oldZoom - newZoom) * offset) + if (this.props.onTimeChange) { + this.props.onTimeChange( + newVisibleTimeStart, + newVisibleTimeStart + newZoom, + this.updateScrollCanvas, + this.getTimelineUnit(), + ) + } } - showPeriod = (from, to) => { - let visibleTimeStart = from.valueOf() - let visibleTimeEnd = to.valueOf() + showPeriod = (from: Dayjs, to: Dayjs) => { + const visibleTimeStart = from.valueOf() + const visibleTimeEnd = to.valueOf() - let zoom = visibleTimeEnd - visibleTimeStart + const zoom = visibleTimeEnd - visibleTimeStart // can't zoom in more than to show one hour - if (zoom < 360000) { + if (zoom < this.props.minZoom) { return } - this.props.onTimeChange( + this.props.onTimeChange?.( visibleTimeStart, visibleTimeStart + zoom, - this.updateScrollCanvas + this.updateScrollCanvas, + this.getTimelineUnit(), ) } - selectItem = (item, clickType, e) => { - if ( - this.isItemSelected(item) || - (this.props.itemTouchSendsClick && clickType === 'touch') - ) { + selectItem: ItemProps['onSelect'] = (item, clickType, e) => { + if (this.isItemSelected(item) || (this.props.itemTouchSendsClick && clickType === 'touch')) { if (item && this.props.onItemClick) { - const time = this.timeFromItemEvent(e) + const time = this.timeFromItemEvent(e as MouseEvent) this.props.onItemClick(item, e, time) } } else { this.setState({ selectedItem: item }) if (item && this.props.onItemSelect) { - const time = this.timeFromItemEvent(e) + const time = this.timeFromItemEvent(e as MouseEvent) this.props.onItemSelect(item, e, time) } else if (item === null && this.props.onItemDeselect) { this.props.onItemDeselect(e) // this isnt in the docs. Is this function even used? @@ -596,14 +558,14 @@ export default class ReactCalendarTimeline extends Component { } } - doubleClickItem = (item, e) => { + doubleClickItem: ItemProps['onItemDoubleClick'] = (item, e) => { if (this.props.onItemDoubleClick) { const time = this.timeFromItemEvent(e) this.props.onItemDoubleClick(item, e, time) } } - contextMenuClickItem = (item, e) => { + contextMenuClickItem: ItemProps['onContextMenu'] = (item, e) => { if (this.props.onItemContextMenu) { const time = this.timeFromItemEvent(e) this.props.onItemContextMenu(item, e, time) @@ -613,8 +575,8 @@ export default class ReactCalendarTimeline extends Component { // TODO: this is very similar to timeFromItemEvent, aside from which element to get offsets // from. Look to consolidate the logic for determining coordinate to time // as well as generalizing how we get time from click on the canvas - getTimeFromRowClickEvent = e => { - const { dragSnap } = this.props + getTimeFromRowClickEvent = (e: MouseEvent) => { + const { dragSnap, buffer } = this.props const { width, canvasTimeStart, canvasTimeEnd } = this.state // this gives us distance from left of row element, so event is in // context of the row element, not client or page @@ -624,19 +586,19 @@ export default class ReactCalendarTimeline extends Component { canvasTimeStart, canvasTimeEnd, - getCanvasWidth(width), - offsetX + getCanvasWidth(width, buffer!), + offsetX, ) - time = Math.floor(time / dragSnap) * dragSnap + time = Math.floor(time / dragSnap!) * dragSnap! return time } - timeFromItemEvent = e => { + timeFromItemEvent = (e: MouseEvent) => { const { width, visibleTimeStart, visibleTimeEnd } = this.state - const { dragSnap } = this.props + const dragSnap = this.props.dragSnap! - const scrollComponent = this.scrollComponent + const scrollComponent = this.scrollComponent! const { left: scrollX } = scrollComponent.getBoundingClientRect() const xRelativeToTimeline = e.clientX - scrollX @@ -651,74 +613,100 @@ export default class ReactCalendarTimeline extends Component { return time } - dragItem = (item, dragTime, newGroupOrder) => { - let newGroup = this.props.groups[newGroupOrder] + dragItem: ItemProps['onDrag'] = (item, dragTime, newGroupOrder) => { + const newGroup = this.props.groups[newGroupOrder] const keys = this.props.keys this.setState({ draggingItem: item, dragTime: dragTime, newGroupOrder: newGroupOrder, - dragGroupTitle: newGroup ? _get(newGroup, keys.groupLabelKey) : '' + dragGroupTitle: newGroup ? _get(newGroup, keys.groupLabelKey) : '', }) this.updatingItem({ eventType: 'move', itemId: item, time: dragTime, - newGroupOrder + newGroupOrder, }) } - dropItem = (item, dragTime, newGroupOrder) => { + dropItem: ItemProps['onDrop'] = (item, dragTime, newGroupOrder) => { this.setState({ draggingItem: null, dragTime: null, dragGroupTitle: null }) if (this.props.onItemMove) { this.props.onItemMove(item, dragTime, newGroupOrder) } } - resizingItem = (item, resizeTime, edge) => { + resizingItem: ItemProps['onResizing'] = (item, resizeTime, edge) => { this.setState({ resizingItem: item, resizingEdge: edge, - resizeTime: resizeTime + resizeTime: resizeTime, }) this.updatingItem({ eventType: 'resize', itemId: item, time: resizeTime, - edge + edge: edge || undefined, }) } - resizedItem = (item, resizeTime, edge, timeDelta) => { + resizedItem: ItemProps['onResized'] = (item, resizeTime, edge, timeDelta) => { this.setState({ resizingItem: null, resizingEdge: null, resizeTime: null }) if (this.props.onItemResize && timeDelta !== 0) { - this.props.onItemResize(item, resizeTime, edge) + this.props.onItemResize(item, resizeTime, edge!) } } - updatingItem = ({ eventType, itemId, time, edge, newGroupOrder }) => { + updatingItem = ({ + eventType, + itemId, + time, + edge, + newGroupOrder, + }: { + eventType: 'move' | 'resize' + itemId: Id + time: number + edge?: ResizeEdge + newGroupOrder?: number + }) => { if (this.props.onItemDrag) { - this.props.onItemDrag({ eventType, itemId, time, edge, newGroupOrder }) + if (eventType === 'move') { + this.props.onItemDrag({ + eventType, + itemId, + time, + newGroupOrder: newGroupOrder!, + }) + } else { + this.props.onItemDrag({ + eventType, + itemId, + time, + edge, + }) + } } } columns( - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - minUnit, - timeSteps, - height + canvasTimeStart: number, + canvasTimeEnd: number, + canvasWidth: number, + minUnit: keyof TimelineTimeSteps, + timeSteps: TimelineTimeSteps, + height: number, ) { return ( { + handleRowClick: RowClickEvent = (e, rowIndex) => { // shouldnt this be handled by the user, as far as when to deselect an item? if (this.hasSelectedItem()) { - this.selectItem(null) + this.selectItem(null, 'click', e) } if (this.props.onCanvasClick == null) return const time = this.getTimeFromRowClickEvent(e) - const groupId = _get( - this.props.groups[rowIndex], - this.props.keys.groupIdKey - ) + const groupId = _get(this.props.groups[rowIndex], this.props.keys.groupIdKey) this.props.onCanvasClick(groupId, time, e) } - handleRowDoubleClick = (e, rowIndex) => { + handleRowDoubleClick: RowClickEvent = (e, rowIndex) => { if (this.props.onCanvasDoubleClick == null) return const time = this.getTimeFromRowClickEvent(e) - const groupId = _get( - this.props.groups[rowIndex], - this.props.keys.groupIdKey - ) + const groupId = _get(this.props.groups[rowIndex], this.props.keys.groupIdKey) this.props.onCanvasDoubleClick(groupId, time, e) } - handleScrollContextMenu = (e, rowIndex) => { + handleScrollContextMenu: RowClickEvent = (e, rowIndex) => { if (this.props.onCanvasContextMenu == null) return const timePosition = this.getTimeFromRowClickEvent(e) - const groupId = _get( - this.props.groups[rowIndex], - this.props.keys.groupIdKey - ) + const groupId = _get(this.props.groups[rowIndex], this.props.keys.groupIdKey) if (this.props.onCanvasContextMenu) { e.preventDefault() @@ -770,34 +749,35 @@ export default class ReactCalendarTimeline extends Component { } } - rows(canvasWidth, groupHeights, groups) { + rows(canvasWidth: number, groupHeights: number[], groups: typeof this.props.groups) { return ( ) } - items( + items({ canvasTimeStart, - zoom, canvasTimeEnd, canvasWidth, - minUnit, dimensionItems, - groupHeights, - groupTops - ) { + groupTops, + }: { + canvasTimeStart: number + canvasTimeEnd: number + canvasWidth: number + dimensionItems: ItemDimension[] + groupTops: number[] + }) { return ( { + handleHeaderRef = (el: HTMLDivElement) => { this.scrollHeaderRef = el - this.props.headerRef(el) + if (this.props.headerRef) { + this.props.headerRef(el) + } } - sidebar(height, groupHeights) { + sidebar(height: number, groupHeights: number[]) { const { sidebarWidth } = this.props return ( sidebarWidth && ( @@ -852,7 +834,7 @@ export default class ReactCalendarTimeline extends Component { ) } - rightSidebar(height, groupHeights) { + rightSidebar(height: number, groupHeights: number[]) { const { rightSidebarWidth } = this.props return ( rightSidebarWidth && ( @@ -871,34 +853,32 @@ export default class ReactCalendarTimeline extends Component { /** * check if child of type TimelineHeader - * refer to for explanation https://github.com/gaearon/react-hot-loader#checking-element-types + * refer to for explanation https://github.com/gaearon/react-hot-loader#checking-element-types */ - isTimelineHeader = (child) => { - if(child.type === undefined) return false - return child.type.secretKey ===TimelineHeaders.secretKey + isTimelineHeader = (child: ElementWithSecret) => { + if (child.type === undefined) return false + return child.type.secretKey === TimelineHeaders.secretKey } - + childrenWithProps( - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - dimensionItems, - groupHeights, - groupTops, - height, - visibleTimeStart, - visibleTimeEnd, - minUnit, - timeSteps + canvasTimeStart: number, + canvasTimeEnd: number, + canvasWidth: number, + dimensionItems: any[], + groupHeights: number[], + groupTops: number[], + height: number, + visibleTimeStart: number, + visibleTimeEnd: number, + minUnit: keyof TimelineTimeSteps, + timeSteps: TimelineTimeSteps, ) { if (!this.props.children) { return null } // convert to an array and remove the nulls - const childArray = Array.isArray(this.props.children) - ? this.props.children.filter(c => c) - : [this.props.children] + const childArray = Array.isArray(this.props.children) ? this.props.children.filter((c) => c) : [this.props.children] const childProps = { canvasTimeStart, @@ -915,10 +895,10 @@ export default class ReactCalendarTimeline extends Component { selected: this.getSelected(), height: height, minUnit: minUnit, - timeSteps: timeSteps + timeSteps: timeSteps, } - return React.Children.map(childArray, child => { + return React.Children.map(childArray, (child) => { if (!this.isTimelineHeader(child)) { return React.cloneElement(child, childProps) } else { @@ -930,8 +910,8 @@ export default class ReactCalendarTimeline extends Component { renderHeaders = () => { if (this.props.children) { let headerRenderer - React.Children.map(this.props.children, child => { - if (this.isTimelineHeader(child)) { + React.Children.map(this.props.children, (child) => { + if (this.isTimelineHeader(child as ElementWithSecret)) { headerRenderer = child } }) @@ -948,47 +928,36 @@ export default class ReactCalendarTimeline extends Component { } getSelected() { - return this.state.selectedItem && !this.props.selected - ? [this.state.selectedItem] - : this.props.selected || []; + return this.state.selectedItem && !this.props.selected ? [this.state.selectedItem] : this.props.selected || [] } - hasSelectedItem(){ - if(!Array.isArray(this.props.selected)) return !!this.state.selectedItem + hasSelectedItem() { + if (!Array.isArray(this.props.selected)) return !!this.state.selectedItem return this.props.selected.length > 0 } - isItemSelected(itemId){ + isItemSelected(itemId: string | null) { const selectedItems = this.getSelected() - return selectedItems.some(i => i === itemId) + return selectedItems.some((i) => i === itemId) } - getScrollElementRef = el => { - this.props.scrollRef(el) + + getScrollElementRef = (el: HTMLDivElement) => { + if (this.props.scrollRef) { + this.props.scrollRef(el) + } this.scrollComponent = el } + container = React.createRef() + render() { - const { - items, - groups, - sidebarWidth, - rightSidebarWidth, - timeSteps, - traditionalZoom - } = this.props - const { - draggingItem, - resizingItem, - width, - visibleTimeStart, - visibleTimeEnd, - canvasTimeStart, - canvasTimeEnd - } = this.state + const { items, groups, sidebarWidth, rightSidebarWidth, timeSteps, traditionalZoom, buffer } = this.props + const { draggingItem, resizingItem, width, visibleTimeStart, visibleTimeEnd, canvasTimeStart, canvasTimeEnd } = + this.state let { dimensionItems, height, groupHeights, groupTops } = this.state const zoom = visibleTimeEnd - visibleTimeStart - const canvasWidth = getCanvasWidth(width) + const canvasWidth = getCanvasWidth(width, buffer!) const minUnit = getMinUnit(zoom, width, timeSteps) const isInteractingWithItem = !!draggingItem || !!resizingItem @@ -1009,7 +978,7 @@ export default class ReactCalendarTimeline extends Component { this.state.dragTime, this.state.resizingEdge, this.state.resizeTime, - this.state.newGroupOrder + this.state.newGroupOrder, ) dimensionItems = stackResults.dimensionItems height = stackResults.height @@ -1018,7 +987,7 @@ export default class ReactCalendarTimeline extends Component { } const outerComponentStyle = { - height: `${height}px` + height: `${height}px`, } return ( @@ -1041,7 +1010,7 @@ export default class ReactCalendarTimeline extends Component { >
(this.container = el)} + ref={this.container} className={`react-calendar-timeline ${this.props.className}`} > {this.renderHeaders()} @@ -1053,30 +1022,19 @@ export default class ReactCalendarTimeline extends Component { height={height} onZoom={this.changeZoom} onWheelZoom={this.handleWheelZoom} - traditionalZoom={traditionalZoom} + traditionalZoom={!!traditionalZoom} onScroll={this.onScroll} - isInteractingWithItem={isInteractingWithItem} > - {this.columns( - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - minUnit, - timeSteps, - height - )} + {this.columns(canvasTimeStart, canvasTimeEnd, canvasWidth, minUnit, timeSteps, height)} {this.rows(canvasWidth, groupHeights, groups)} - {this.items( + {this.items({ canvasTimeStart, - zoom, canvasTimeEnd, canvasWidth, - minUnit, dimensionItems, - groupHeights, - groupTops - )} + groupTops, + })} {this.childrenWithProps( canvasTimeStart, canvasTimeEnd, @@ -1088,13 +1046,11 @@ export default class ReactCalendarTimeline extends Component { visibleTimeStart, visibleTimeEnd, minUnit, - timeSteps + timeSteps, )} - {rightSidebarWidth > 0 - ? this.rightSidebar(height, groupHeights) - : null} + {rightSidebarWidth > 0 ? this.rightSidebar(height, groupHeights) : null}
diff --git a/src/lib/columns/Columns.js b/src/lib/columns/Columns.js deleted file mode 100644 index 7447d596e..000000000 --- a/src/lib/columns/Columns.js +++ /dev/null @@ -1,115 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' - -import { iterateTimes } from '../utility/calendar' -import { TimelineStateConsumer } from '../timeline/TimelineStateContext' - -const passThroughPropTypes = { - canvasTimeStart: PropTypes.number.isRequired, - canvasTimeEnd: PropTypes.number.isRequired, - canvasWidth: PropTypes.number.isRequired, - lineCount: PropTypes.number.isRequired, - minUnit: PropTypes.string.isRequired, - timeSteps: PropTypes.object.isRequired, - height: PropTypes.number.isRequired, - verticalLineClassNamesForTime: PropTypes.func -} - -class Columns extends Component { - static propTypes = { - ...passThroughPropTypes, - getLeftOffsetFromDate: PropTypes.func.isRequired - } - - shouldComponentUpdate(nextProps) { - return !( - nextProps.canvasTimeStart === this.props.canvasTimeStart && - nextProps.canvasTimeEnd === this.props.canvasTimeEnd && - nextProps.canvasWidth === this.props.canvasWidth && - nextProps.lineCount === this.props.lineCount && - nextProps.minUnit === this.props.minUnit && - nextProps.timeSteps === this.props.timeSteps && - nextProps.height === this.props.height && - nextProps.verticalLineClassNamesForTime === - this.props.verticalLineClassNamesForTime - ) - } - - render() { - const { - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - minUnit, - timeSteps, - height, - verticalLineClassNamesForTime, - getLeftOffsetFromDate - } = this.props - const ratio = canvasWidth / (canvasTimeEnd - canvasTimeStart) - - let lines = [] - - iterateTimes( - canvasTimeStart, - canvasTimeEnd, - minUnit, - timeSteps, - (time, nextTime) => { - const minUnitValue = time.get(minUnit === 'day' ? 'date' : minUnit) - const firstOfType = minUnitValue === (minUnit === 'day' ? 1 : 0) - - let classNamesForTime = [] - if (verticalLineClassNamesForTime) { - classNamesForTime = verticalLineClassNamesForTime( - time.unix() * 1000, // turn into ms, which is what verticalLineClassNamesForTime expects - nextTime.unix() * 1000 - 1 - ) - } - - // TODO: rename or remove class that has reference to vertical-line - const classNames = - 'rct-vl' + - (firstOfType ? ' rct-vl-first' : '') + - (minUnit === 'day' || minUnit === 'hour' || minUnit === 'minute' - ? ` rct-day-${time.day()} ` - : '') + - classNamesForTime.join(' ') - - const left = getLeftOffsetFromDate(time.valueOf()) - const right = getLeftOffsetFromDate(nextTime.valueOf()) - lines.push( -
- ) - } - ) - - return
{lines}
- } -} - -const ColumnsWrapper = ({ ...props }) => { - return ( - - {({ getLeftOffsetFromDate }) => ( - - )} - - ) -} - -ColumnsWrapper.defaultProps = { - ...passThroughPropTypes -} - -export default ColumnsWrapper \ No newline at end of file diff --git a/src/lib/columns/Columns.tsx b/src/lib/columns/Columns.tsx new file mode 100644 index 000000000..2159e1d90 --- /dev/null +++ b/src/lib/columns/Columns.tsx @@ -0,0 +1,99 @@ +import React, { Component, FC } from 'react' + +import { iterateTimes } from '../utility/calendar' +import { TimelineStateConsumer } from '../timeline/TimelineStateContext' +import { TimelineTimeSteps } from '../types/main' + +type WrapperColumnsProps = { + canvasTimeStart: number + canvasTimeEnd: number + canvasWidth: number + lineCount: number + minUnit: keyof TimelineTimeSteps + timeSteps: TimelineTimeSteps + height: number + verticalLineClassNamesForTime?: (a: number, b: number) => string[] +} + +type ColumnsProps = WrapperColumnsProps & { + getLeftOffsetFromDate: (time: number) => number +} + +class Columns extends Component { + shouldComponentUpdate(nextProps: ColumnsProps) { + return !( + nextProps.canvasTimeStart === this.props.canvasTimeStart && + nextProps.canvasTimeEnd === this.props.canvasTimeEnd && + nextProps.canvasWidth === this.props.canvasWidth && + nextProps.lineCount === this.props.lineCount && + nextProps.minUnit === this.props.minUnit && + nextProps.timeSteps === this.props.timeSteps && + nextProps.height === this.props.height && + nextProps.verticalLineClassNamesForTime === this.props.verticalLineClassNamesForTime + ) + } + + render() { + const { + canvasTimeStart, + canvasTimeEnd, + // canvasWidth, + minUnit, + timeSteps, + height, + verticalLineClassNamesForTime, + getLeftOffsetFromDate, + } = this.props + //const ratio = canvasWidth / (canvasTimeEnd - canvasTimeStart) + + const lines: React.JSX.Element[] = [] + + iterateTimes(canvasTimeStart, canvasTimeEnd, minUnit, timeSteps, (time, nextTime) => { + const minUnitValue = time.get(minUnit === 'day' ? 'date' : minUnit) + const firstOfType = minUnitValue === (minUnit === 'day' ? 1 : 0) + + let classNamesForTime: string[] = [] + if (verticalLineClassNamesForTime) { + classNamesForTime = verticalLineClassNamesForTime( + time.unix() * 1000, // turn into ms, which is what verticalLineClassNamesForTime expects + nextTime.unix() * 1000 - 1, + ) + } + + // TODO: rename or remove class that has reference to vertical-line + const classNames = + 'rct-vl' + + (firstOfType ? ' rct-vl-first' : '') + + (minUnit === 'day' || minUnit === 'hour' || minUnit === 'minute' ? ` rct-day-${time.day()} ` : ' ') + + classNamesForTime.join(' ') + + const left = getLeftOffsetFromDate(time.valueOf()) + const right = getLeftOffsetFromDate(nextTime.valueOf()) + lines.push( +
, + ) + }) + + return
{lines}
+ } +} + +const ColumnsWrapper: FC = ({ ...props }) => { + return ( + + {({ getLeftOffsetFromDate }) => } + + ) +} + +export default ColumnsWrapper diff --git a/src/lib/default-config.js b/src/lib/default-config.ts similarity index 50% rename from src/lib/default-config.js rename to src/lib/default-config.ts index d79ed4ec9..464575d67 100644 --- a/src/lib/default-config.js +++ b/src/lib/default-config.ts @@ -8,7 +8,7 @@ export const defaultKeys = { itemDivTitleKey: 'title', itemGroupKey: 'group', itemTimeStartKey: 'start_time', - itemTimeEndKey: 'end_time' + itemTimeEndKey: 'end_time', } export const defaultTimeSteps = { @@ -17,78 +17,56 @@ export const defaultTimeSteps = { hour: 1, day: 1, month: 1, - year: 1 + year: 1, } -export const defaultHeaderFormats = { +type UnitValue = { + long: string + mediumLong: string + medium: string + short: string +} +export const defaultHeaderFormats: Record = { year: { long: 'YYYY', mediumLong: 'YYYY', medium: 'YYYY', - short: 'YY' + short: 'YY', }, month: { long: 'MMMM YYYY', mediumLong: 'MMMM', medium: 'MMMM', - short: 'MM/YY' + short: 'MM/YY', }, week: { long: 'w', mediumLong: 'w', medium: 'w', - short: 'w' + short: 'w', }, day: { long: 'dddd, LL', mediumLong: 'dddd, LL', medium: 'dd D', - short: 'D' + short: 'D', }, hour: { long: 'dddd, LL, HH:00', mediumLong: 'L, HH:00', medium: 'HH:00', - short: 'HH' + short: 'HH', }, minute: { long: 'HH:mm', mediumLong: 'HH:mm', medium: 'HH:mm', short: 'mm', - } -} - -//TODO: delete this -export const defaultHeaderLabelFormats = { - yearShort: 'YY', - yearLong: 'YYYY', - monthShort: 'MM/YY', - monthMedium: 'MM/YYYY', - monthMediumLong: 'MMM YYYY', - monthLong: 'MMMM YYYY', - dayShort: 'L', - dayLong: 'dddd, LL', - hourShort: 'HH', - hourMedium: 'HH:00', - hourMediumLong: 'L, HH:00', - hourLong: 'dddd, LL, HH:00', - time: 'LLL' -} - -//TODO: delete this -export const defaultSubHeaderLabelFormats = { - yearShort: 'YY', - yearLong: 'YYYY', - monthShort: 'MM', - monthMedium: 'MMM', - monthLong: 'MMMM', - dayShort: 'D', - dayMedium: 'dd D', - dayMediumLong: 'ddd, Do', - dayLong: 'dddd, Do', - hourShort: 'HH', - hourLong: 'HH:00', - minuteShort: 'mm', - minuteLong: 'HH:mm' + }, + second: { + long: 'mm:ss', + mediumLong: 'mm:ss', + medium: 'mm:ss', + short: 'ss', + }, } diff --git a/src/lib/headers/CustomDateHeader.js b/src/lib/headers/CustomDateHeader.js deleted file mode 100644 index 860f4d411..000000000 --- a/src/lib/headers/CustomDateHeader.js +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react' -import Interval from './Interval' -export function CustomDateHeader({ - headerContext: { intervals, unit }, - getRootProps, - getIntervalProps, - showPeriod, - data: { - style, - intervalRenderer, - className, - getLabelFormat, - unitProp, - headerData - } -}) { - return ( -
- {intervals.map(interval => { - const intervalText = getLabelFormat( - [interval.startTime, interval.endTime], - unit, - interval.labelWidth - ) - return ( - - ) - })} -
- ) -} diff --git a/src/lib/headers/CustomDateHeader.tsx b/src/lib/headers/CustomDateHeader.tsx new file mode 100644 index 000000000..3af277f6c --- /dev/null +++ b/src/lib/headers/CustomDateHeader.tsx @@ -0,0 +1,60 @@ +import React from 'react' +import Interval from './Interval' +import { Interval as IntervalType, IntervalRenderer } from '../types/main' +import { Dayjs } from 'dayjs' +import { SelectUnits } from '../utility/calendar' +import { GetIntervalPropsType } from './types' + +export interface CustomDateHeaderProps { + headerContext: { + intervals: IntervalType[] + unit: SelectUnits + } + timelineContext: { + timelineWidth: number + visibleTimeStart: number + visibleTimeEnd: number + canvasTimeStart: number + canvasTimeEnd: number + } + getRootProps: (props?: any) => any + getIntervalProps: GetIntervalPropsType + showPeriod: (start: Dayjs, end: Dayjs) => void + data: { + style: React.CSSProperties + intervalRenderer: (props: IntervalRenderer) => React.ReactNode + className?: string + getLabelFormat: (interval: [Dayjs, Dayjs], unit: string, labelWidth: number) => string + unitProp?: 'primaryHeader' + headerData?: Data + } +} + +export function CustomDateHeader({ + headerContext: { intervals, unit }, + getRootProps, + getIntervalProps, + showPeriod, + data: { style, intervalRenderer, className, getLabelFormat, unitProp, headerData }, +}: CustomDateHeaderProps) { + return ( +
+ {intervals.map((interval) => { + const intervalText = getLabelFormat([interval.startTime, interval.endTime], unit, interval.labelWidth!) + return ( + + ) + })} +
+ ) +} diff --git a/src/lib/headers/CustomHeader.js b/src/lib/headers/CustomHeader.js deleted file mode 100644 index a07bfc8c5..000000000 --- a/src/lib/headers/CustomHeader.js +++ /dev/null @@ -1,239 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { TimelineHeadersConsumer } from './HeadersContext' -import { TimelineStateConsumer } from '../timeline/TimelineStateContext' -import { iterateTimes, calculateXPositionForTime } from '../utility/calendar' - -export class CustomHeader extends React.Component { - static propTypes = { - //component props - children: PropTypes.func.isRequired, - unit: PropTypes.string.isRequired, - //Timeline context - timeSteps: PropTypes.object.isRequired, - visibleTimeStart: PropTypes.number.isRequired, - visibleTimeEnd: PropTypes.number.isRequired, - canvasTimeStart: PropTypes.number.isRequired, - canvasTimeEnd: PropTypes.number.isRequired, - canvasWidth: PropTypes.number.isRequired, - showPeriod: PropTypes.func.isRequired, - headerData: PropTypes.object, - getLeftOffsetFromDate: PropTypes.func.isRequired, - height: PropTypes.number.isRequired, - } - constructor(props) { - super(props) - const { - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - unit, - timeSteps, - showPeriod, - getLeftOffsetFromDate - } = props - - const intervals = this.getHeaderIntervals({ - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - unit, - timeSteps, - showPeriod, - getLeftOffsetFromDate - }) - - this.state = { - intervals - } - } - - shouldComponentUpdate(nextProps) { - if ( - nextProps.canvasTimeStart !== this.props.canvasTimeStart || - nextProps.canvasTimeEnd !== this.props.canvasTimeEnd || - nextProps.canvasWidth !== this.props.canvasWidth || - nextProps.unit !== this.props.unit || - nextProps.timeSteps !== this.props.timeSteps || - nextProps.showPeriod !== this.props.showPeriod || - nextProps.children !== this.props.children || - nextProps.headerData !== this.props.headerData - ) { - return true - } - return false - } - - componentWillReceiveProps(nextProps) { - if ( - nextProps.canvasTimeStart !== this.props.canvasTimeStart || - nextProps.canvasTimeEnd !== this.props.canvasTimeEnd || - nextProps.canvasWidth !== this.props.canvasWidth || - nextProps.unit !== this.props.unit || - nextProps.timeSteps !== this.props.timeSteps || - nextProps.showPeriod !== this.props.showPeriod - ) { - const { - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - unit, - timeSteps, - showPeriod, - getLeftOffsetFromDate - } = nextProps - - const intervals = this.getHeaderIntervals({ - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - unit, - timeSteps, - showPeriod, - getLeftOffsetFromDate - }) - - this.setState({ intervals }) - } - } - - getHeaderIntervals = ({ - canvasTimeStart, - canvasTimeEnd, - unit, - timeSteps, - getLeftOffsetFromDate - }) => { - const intervals = [] - iterateTimes( - canvasTimeStart, - canvasTimeEnd, - unit, - timeSteps, - (startTime, endTime) => { - const left = getLeftOffsetFromDate(startTime.valueOf()) - const right = getLeftOffsetFromDate(endTime.valueOf()) - const width = right - left - intervals.push({ - startTime, - endTime, - labelWidth: width, - left - }) - } - ) - return intervals - } - - getRootProps = (props = {}) => { - const { style } = props - return { - style: Object.assign({}, style ? style : {}, { - position: 'relative', - width: this.props.canvasWidth, - height: this.props.height, - }) - } - } - - getIntervalProps = (props = {}) => { - const { interval, style } = props - if (!interval) - throw new Error('you should provide interval to the prop getter') - const { startTime, labelWidth, left } = interval - return { - style: this.getIntervalStyle({ - style, - startTime, - labelWidth, - canvasTimeStart: this.props.canvasTimeStart, - unit: this.props.unit, - left - }), - key: `label-${startTime.valueOf()}` - } - } - - getIntervalStyle = ({ left, labelWidth, style }) => { - return { - ...style, - left, - width: labelWidth, - position: 'absolute' - } - } - - getStateAndHelpers = () => { - const { - canvasTimeStart, - canvasTimeEnd, - unit, - showPeriod, - timelineWidth, - visibleTimeStart, - visibleTimeEnd, - headerData, - } = this.props - //TODO: only evaluate on changing params - return { - timelineContext: { - timelineWidth, - visibleTimeStart, - visibleTimeEnd, - canvasTimeStart, - canvasTimeEnd - }, - headerContext: { - unit, - intervals: this.state.intervals - }, - getRootProps: this.getRootProps, - getIntervalProps: this.getIntervalProps, - showPeriod, - data: headerData, - } - } - - render() { - const props = this.getStateAndHelpers() - const Renderer = this.props.children - return - } -} - -const CustomHeaderWrapper = ({ children, unit, headerData, height }) => ( - - {({ getTimelineState, showPeriod, getLeftOffsetFromDate }) => { - const timelineState = getTimelineState() - return ( - - {({ timeSteps }) => ( - - )} - - ) - }} - -) - -CustomHeaderWrapper.propTypes = { - children: PropTypes.func.isRequired, - unit: PropTypes.string, - headerData: PropTypes.object, - height: PropTypes.number, -} - -CustomHeaderWrapper.defaultProps = { - height: 30, -} - -export default CustomHeaderWrapper diff --git a/src/lib/headers/CustomHeader.tsx b/src/lib/headers/CustomHeader.tsx new file mode 100644 index 000000000..c81b63239 --- /dev/null +++ b/src/lib/headers/CustomHeader.tsx @@ -0,0 +1,214 @@ +import React, { CSSProperties, ReactNode } from 'react' +import { useTimelineHeadersContext } from './HeadersContext' +import { useTimelineState } from '../timeline/TimelineStateContext' +import { iterateTimes } from '../utility/calendar' +import { Interval, TimelineTimeSteps } from '../types/main' +import { Dayjs } from 'dayjs' +import { CustomDateHeaderProps } from './CustomDateHeader' +import isEqual from 'lodash/isEqual' +import { GetIntervalPropsType } from './types' + +export type CustomHeaderProps = { + children: (p: CustomDateHeaderProps) => ReactNode + unit: keyof TimelineTimeSteps + timeSteps: any + visibleTimeStart: number + visibleTimeEnd: number + canvasTimeStart: number + canvasTimeEnd: number + canvasWidth: number + showPeriod: (start: Dayjs, end: Dayjs) => void + headerData?: Data + getLeftOffsetFromDate: (date: any) => number + height: number + timelineWidth: number +} + +type GetHeaderIntervalsParams = { + canvasTimeStart: number + canvasTimeEnd: number + unit: keyof TimelineTimeSteps + timeSteps: any + getLeftOffsetFromDate: (date: any) => number +} + +type GetHeaderIntervalsFn = (params: GetHeaderIntervalsParams) => Interval[] + +type State = { + intervals: Interval[] +} + +class CustomHeader extends React.Component, State> { + constructor(props: CustomHeaderProps) { + super(props) + const { canvasTimeStart, canvasTimeEnd, unit, timeSteps, getLeftOffsetFromDate } = props + + const intervals = this.getHeaderIntervals({ + canvasTimeStart, + canvasTimeEnd, + unit, + timeSteps, + getLeftOffsetFromDate, + }) + + this.state = { + intervals, + } + } + + static defaultProps = { + height: 30, + } + + /*shouldComponentUpdate(nextProps: CustomHeaderProps) { + if ( + nextProps.canvasTimeStart !== this.props.canvasTimeStart || + nextProps.canvasTimeEnd !== this.props.canvasTimeEnd || + nextProps.canvasWidth !== this.props.canvasWidth || + nextProps.unit !== this.props.unit || + nextProps.timeSteps !== this.props.timeSteps || + nextProps.showPeriod !== this.props.showPeriod || + nextProps.children !== this.props.children || + nextProps.headerData !== this.props.headerData + ) { + return true + } + return false + }*/ + componentDidUpdate(prevProps: CustomHeaderProps) { + if ( + !isEqual(prevProps, this.props) + //prevProps.canvasTimeStart !== this.props.canvasTimeStart || + //prevProps.canvasTimeEnd !== this.props.canvasTimeEnd || + //prevProps.canvasWidth !== this.props.canvasWidth || + //prevProps.unit !== this.props.unit || + //prevProps.timeSteps !== this.props.timeSteps || + //prevProps.showPeriod !== this.props.showPeriod + ) { + const { canvasTimeStart, canvasTimeEnd, unit, timeSteps, getLeftOffsetFromDate } = this.props + + const intervals = this.getHeaderIntervals({ + canvasTimeStart, + canvasTimeEnd, + unit, + timeSteps, + getLeftOffsetFromDate, + }) + + this.setState({ intervals }) + } + } + + getHeaderIntervals: GetHeaderIntervalsFn = ({ + canvasTimeStart, + canvasTimeEnd, + unit, + timeSteps, + getLeftOffsetFromDate, + }) => { + const intervals: Interval[] = [] + iterateTimes(canvasTimeStart, canvasTimeEnd, unit, timeSteps, (startTime, endTime) => { + const left = getLeftOffsetFromDate(startTime.valueOf()) + const right = getLeftOffsetFromDate(endTime.valueOf()) + const width = right - left + intervals.push({ + startTime, + endTime, + labelWidth: width, + left, + }) + }) + return intervals + } + + getRootProps = (props: { style?: CSSProperties } = {}) => { + const { style } = props + return { + style: Object.assign({}, style ? style : {}, { + position: 'relative', + width: this.props.canvasWidth, + height: this.props.height, + }), + } + } + + getIntervalProps: GetIntervalPropsType = (props: { interval?: Interval; style?: CSSProperties } = {}) => { + const { interval, style } = props + if (!interval) throw new Error('you should provide interval to the prop getter') + const { startTime, labelWidth, left } = interval + return { + style: { + ...style, + left, + width: labelWidth, + position: 'absolute', + }, + key: `label-${startTime.valueOf()}`, + } + } + + getStateAndHelpers = (): CustomDateHeaderProps => { + const { + canvasTimeStart, + canvasTimeEnd, + timelineWidth, + visibleTimeStart, + visibleTimeEnd, + unit, + showPeriod, + headerData, + } = this.props + //TODO: only evaluate on changing params + + return { + timelineContext: { + timelineWidth, + visibleTimeStart, + visibleTimeEnd, + canvasTimeStart, + canvasTimeEnd, + }, + headerContext: { + unit, + intervals: this.state.intervals, + }, + getRootProps: this.getRootProps, + getIntervalProps: this.getIntervalProps, + showPeriod, + data: headerData as any, + } + } + + render() { + const props = this.getStateAndHelpers() + const Renderer = this.props.children + return + } +} + +export type CustomHeaderWrapperProps = { + children: (p: CustomDateHeaderProps) => ReactNode + unit?: keyof TimelineTimeSteps + headerData?: Data + height?: number | undefined +} + +function CustomHeaderWrapper({ children, unit, headerData, height }: CustomHeaderWrapperProps) { + const { getTimelineState, showPeriod, getLeftOffsetFromDate } = useTimelineState() + const timelineState = getTimelineState() + const { timeSteps } = useTimelineHeadersContext() + return ( + + ) +} + +export default CustomHeaderWrapper diff --git a/src/lib/headers/DateHeader.js b/src/lib/headers/DateHeader.js deleted file mode 100644 index 44191e77a..000000000 --- a/src/lib/headers/DateHeader.js +++ /dev/null @@ -1,160 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { TimelineStateConsumer } from '../timeline/TimelineStateContext' -import CustomHeader from './CustomHeader' -import { getNextUnit } from '../utility/calendar' -import { defaultHeaderFormats } from '../default-config' -import memoize from 'memoize-one' -import { CustomDateHeader } from './CustomDateHeader' - -class DateHeader extends React.Component { - static propTypes = { - unit: PropTypes.string, - style: PropTypes.object, - className: PropTypes.string, - timelineUnit: PropTypes.string, - labelFormat: PropTypes.oneOfType([ - PropTypes.func, - PropTypes.objectOf(PropTypes.objectOf(PropTypes.string)), - PropTypes.string - ]).isRequired, - intervalRenderer: PropTypes.func, - headerData: PropTypes.object, - height: PropTypes.number - } - - getHeaderUnit = () => { - if (this.props.unit === 'primaryHeader') { - return getNextUnit(this.props.timelineUnit) - } else if (this.props.unit) { - return this.props.unit - } - return this.props.timelineUnit - } - - getRootStyle = memoize(style => { - return { - height: 30, - ...style - } - }) - - getLabelFormat = (interval, unit, labelWidth) => { - const { labelFormat } = this.props - if (typeof labelFormat === 'string') { - const startTime = interval[0] - return startTime.format(labelFormat) - } else if (typeof labelFormat === 'function') { - return labelFormat(interval, unit, labelWidth) - } else { - throw new Error('labelFormat should be function or string') - } - } - - getHeaderData = memoize( - ( - intervalRenderer, - style, - className, - getLabelFormat, - unitProp, - headerData - ) => { - return { - intervalRenderer, - style, - className, - getLabelFormat, - unitProp, - headerData - } - } - ) - - render() { - const unit = this.getHeaderUnit() - const { headerData, height } = this.props - return ( - - ) - } -} - -const DateHeaderWrapper = ({ - unit, - labelFormat, - style, - className, - intervalRenderer, - headerData, - height -}) => ( - - {({ getTimelineState }) => { - const timelineState = getTimelineState() - return ( - - ) - }} - -) - -DateHeaderWrapper.propTypes = { - style: PropTypes.object, - className: PropTypes.string, - unit: PropTypes.string, - labelFormat: PropTypes.oneOfType([ - PropTypes.func, - PropTypes.objectOf(PropTypes.objectOf(PropTypes.string)), - PropTypes.string - ]), - intervalRenderer: PropTypes.func, - headerData: PropTypes.object, - height: PropTypes.number -} - -DateHeaderWrapper.defaultProps = { - labelFormat: formatLabel -} - -function formatLabel( - [timeStart, timeEnd], - unit, - labelWidth, - formatOptions = defaultHeaderFormats -) { - let format - if (labelWidth >= 150) { - format = formatOptions[unit]['long'] - } else if (labelWidth >= 100) { - format = formatOptions[unit]['mediumLong'] - } else if (labelWidth >= 50) { - format = formatOptions[unit]['medium'] - } else { - format = formatOptions[unit]['short'] - } - return timeStart.format(format) -} - -export default DateHeaderWrapper diff --git a/src/lib/headers/DateHeader.tsx b/src/lib/headers/DateHeader.tsx new file mode 100644 index 000000000..ed9e27343 --- /dev/null +++ b/src/lib/headers/DateHeader.tsx @@ -0,0 +1,163 @@ +import React, { CSSProperties, ReactNode } from 'react' +import { TimelineStateConsumer } from '../timeline/TimelineStateContext' +import CustomHeader from './CustomHeader' +import { getNextUnit, SelectUnits } from '../utility/calendar' +import { defaultHeaderFormats } from '../default-config' +import memoize from 'memoize-one' +import { CustomDateHeader } from './CustomDateHeader' +import { IntervalRenderer, SidebarHeaderChildrenFnProps, TimelineTimeSteps } from '../types/main' +import { Dayjs, UnitType } from 'dayjs' + +type GetHeaderData = ( + intervalRenderer: (p: IntervalRenderer) => ReactNode, + style: React.CSSProperties, + className: string | undefined, + getLabelFormat: (interval: [Dayjs, Dayjs], unit: keyof typeof defaultHeaderFormats, labelWidth: number) => string, + unitProp: UnitType | 'primaryHeader' | undefined, + headerData: Data | undefined, +) => { + intervalRenderer?: IntervalRenderer + style: React.CSSProperties + className: string + getLabelFormat: (interval: [Dayjs, Dayjs], unit: keyof typeof defaultHeaderFormats, labelWidth: number) => string + unitProp: UnitType | 'primaryHeader' | undefined + headerData: Data +} +export interface DateHeaderProps { + style?: CSSProperties | undefined + className?: string | undefined + unit?: keyof TimelineTimeSteps | 'primaryHeader' | undefined + timelineUnit: SelectUnits + labelFormat?: + | string + | (([startTime, endTime]: [Dayjs, Dayjs], unit: UnitType | 'primaryHeader', labelWidth: number) => string) + | undefined + intervalRenderer?: (props: IntervalRenderer) => ReactNode + headerData?: Data | undefined + children?: ((props: SidebarHeaderChildrenFnProps) => ReactNode) | undefined + height?: number | undefined +} + +class DateHeaderInner extends React.Component> { + getHeaderUnit = (): keyof TimelineTimeSteps => { + if (this.props.unit === 'primaryHeader') { + return getNextUnit(this.props.timelineUnit) + } else if (this.props.unit) { + return this.props.unit + } + return this.props.timelineUnit + } + + getRootStyle = memoize((style) => { + return { + height: 30, + ...style, + } + }) + + getLabelFormat = (interval: [Dayjs, Dayjs], unit: keyof typeof defaultHeaderFormats, labelWidth: number) => { + const { labelFormat } = this.props + if (typeof labelFormat === 'string') { + const startTime = interval[0] + return startTime.format(labelFormat) + } else if (typeof labelFormat === 'function') { + return labelFormat(interval, unit as UnitType, labelWidth) + } else { + throw new Error('labelFormat should be function or string') + } + } + + getHeaderData: GetHeaderData = memoize( + (intervalRenderer, style, className, getLabelFormat, unitProp, headerData) => { + return { + intervalRenderer, + style, + className, + getLabelFormat, + unitProp, + headerData, + } + }, + ) + + render() { + const unit = this.getHeaderUnit() + const { height } = this.props + return ( + + ) + } +} + +export type DateHeaderWrapper = { + unit?: keyof TimelineTimeSteps | 'primaryHeader' + labelFormat?: typeof formatLabel + style?: CSSProperties + className?: string + intervalRenderer?: (props: IntervalRenderer) => ReactNode + headerData?: Data + height?: number +} + +export function DateHeader({ + labelFormat, + unit, + style, + className, + intervalRenderer, + headerData, + height, +}: DateHeaderWrapper) { + return ( + + {({ getTimelineState }) => { + const timelineState = getTimelineState() + return ( + + ) + }} + + ) +} + +function formatLabel( + [timeStart]: [Dayjs, Dayjs], + unit: keyof typeof defaultHeaderFormats, + labelWidth: number, + formatOptions = defaultHeaderFormats, +) { + let format + if (labelWidth >= 150) { + format = formatOptions[unit]['long'] + } else if (labelWidth >= 100) { + format = formatOptions[unit]['mediumLong'] + } else if (labelWidth >= 50) { + format = formatOptions[unit]['medium'] + } else { + format = formatOptions[unit]['short'] + } + return timeStart.format(format) +} + +export default DateHeader diff --git a/src/lib/headers/HeadersContext.js b/src/lib/headers/HeadersContext.js deleted file mode 100644 index d2a6830fe..000000000 --- a/src/lib/headers/HeadersContext.js +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import createReactContext from 'create-react-context' -import { noop } from '../utility/generic' - -const defaultContextState = { - registerScroll: () => { - // eslint-disable-next-line - console.warn('default registerScroll header used') - return noop - }, - rightSidebarWidth: 0, - leftSidebarWidth: 150, - timeSteps: {} -} - -const { Consumer, Provider } = createReactContext(defaultContextState) - - -export class TimelineHeadersProvider extends React.Component { - static propTypes = { - children: PropTypes.element.isRequired, - rightSidebarWidth: PropTypes.number, - leftSidebarWidth: PropTypes.number.isRequired, - //TODO: maybe this should be skipped? - timeSteps: PropTypes.object.isRequired, - registerScroll: PropTypes.func.isRequired, - } - - - render() { - const contextValue = { - rightSidebarWidth: this.props.rightSidebarWidth, - leftSidebarWidth: this.props.leftSidebarWidth, - timeSteps: this.props.timeSteps, - registerScroll: this.props.registerScroll, - } - return {this.props.children} - } -} - -export const TimelineHeadersConsumer = Consumer diff --git a/src/lib/headers/HeadersContext.tsx b/src/lib/headers/HeadersContext.tsx new file mode 100644 index 000000000..77fe0578b --- /dev/null +++ b/src/lib/headers/HeadersContext.tsx @@ -0,0 +1,38 @@ +import React, { ReactNode, useContext } from 'react' +import { noop } from '../utility/generic' + +const defaultContextState = { + registerScroll: () => { + // eslint-disable-next-line + console.warn('default registerScroll header used') + return noop + }, + rightSidebarWidth: 0, + leftSidebarWidth: 150, + timeSteps: {}, +} + +const HeaderContext = React.createContext(defaultContextState) + +export type TimelineHeadersProviderProps = { + children: ReactNode + rightSidebarWidth?: number + leftSidebarWidth: number + //TODO: maybe this should be skipped? + timeSteps: object + registerScroll: (e: HTMLDivElement) => void +} +export class TimelineHeadersProvider extends React.Component { + render() { + const contextValue = { + rightSidebarWidth: this.props.rightSidebarWidth, + leftSidebarWidth: this.props.leftSidebarWidth, + timeSteps: this.props.timeSteps, + registerScroll: this.props.registerScroll, + } as typeof defaultContextState + return {this.props.children} + } +} + +export const TimelineHeadersContext = HeaderContext +export const useTimelineHeadersContext = () => useContext(TimelineHeadersContext) diff --git a/src/lib/headers/Interval.js b/src/lib/headers/Interval.tsx similarity index 53% rename from src/lib/headers/Interval.js rename to src/lib/headers/Interval.tsx index 25abef2ea..c1822d303 100644 --- a/src/lib/headers/Interval.js +++ b/src/lib/headers/Interval.tsx @@ -1,20 +1,23 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { getNextUnit } from '../utility/calendar' +import React, { HTMLAttributes, ReactNode } from 'react' +import { getNextUnit, SelectUnits } from '../utility/calendar' import { composeEvents } from '../utility/events' +import { Dayjs } from 'dayjs' +import { IntervalRenderer, Interval as IntervalType, GetIntervalProps } from '../types/main' +import { GetIntervalPropsType } from './types' -class Interval extends React.PureComponent { - static propTypes = { - intervalRenderer: PropTypes.func, - unit: PropTypes.string.isRequired, - interval: PropTypes.object.isRequired, - showPeriod: PropTypes.func.isRequired, - intervalText: PropTypes.string.isRequired, - primaryHeader: PropTypes.bool.isRequired, - getIntervalProps: PropTypes.func.isRequired, - headerData: PropTypes.object - } +export type IntervalProps = { + intervalRenderer: (p: IntervalRenderer) => ReactNode + unit: SelectUnits + interval: IntervalType + showPeriod: (startTime: Dayjs, endTime: Dayjs) => void + intervalText: string + primaryHeader: boolean + getIntervalProps: GetIntervalPropsType + + headerData?: Data +} +class Interval extends React.PureComponent> { onIntervalClick = () => { const { primaryHeader, interval, unit, showPeriod } = this.props if (primaryHeader) { @@ -27,13 +30,13 @@ class Interval extends React.PureComponent { } } - getIntervalProps = (props = {}) => { + getIntervalProps = (props: GetIntervalProps = {}): HTMLAttributes & { key: string } => { return { ...this.props.getIntervalProps({ interval: this.props.interval, - ...props + ...props, }), - onClick: composeEvents(this.onIntervalClick, props.onClick) + onClick: composeEvents(this.onIntervalClick, props.onClick), } } @@ -46,19 +49,19 @@ class Interval extends React.PureComponent { getIntervalProps={this.getIntervalProps} intervalContext={{ interval, - intervalText + intervalText, }} data={headerData} /> ) } - + const { key, ...rest } = this.getIntervalProps() return (
{intervalText}
diff --git a/src/lib/headers/SidebarHeader.js b/src/lib/headers/SidebarHeader.js deleted file mode 100644 index 5087e538c..000000000 --- a/src/lib/headers/SidebarHeader.js +++ /dev/null @@ -1,72 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { TimelineHeadersConsumer } from './HeadersContext' -import { LEFT_VARIANT, RIGHT_VARIANT } from './constants' - -class SidebarHeader extends React.PureComponent { - static propTypes = { - children: PropTypes.func.isRequired, - rightSidebarWidth: PropTypes.number, - leftSidebarWidth: PropTypes.number.isRequired, - variant: PropTypes.string, - headerData: PropTypes.object - } - - getRootProps = (props = {}) => { - const { style } = props - const width = - this.props.variant === RIGHT_VARIANT - ? this.props.rightSidebarWidth - : this.props.leftSidebarWidth - return { - style: { - ...style, - width, - } - } - } - - getStateAndHelpers = () => { - return { - getRootProps: this.getRootProps, - data: this.props.headerData, - } - } - - render() { - const props = this.getStateAndHelpers() - const Renderer = this.props.children - return - } -} - -const SidebarWrapper = ({ children, variant, headerData }) => ( - - {({ leftSidebarWidth, rightSidebarWidth }) => { - return ( - - ) - }} - -) - -SidebarWrapper.propTypes = { - children: PropTypes.func.isRequired, - variant: PropTypes.string, - headerData: PropTypes.object -} - -SidebarWrapper.defaultProps = { - variant: LEFT_VARIANT, - children: ({ getRootProps }) =>
-} - -SidebarWrapper.secretKey = "SidebarHeader" - -export default SidebarWrapper diff --git a/src/lib/headers/SidebarHeader.tsx b/src/lib/headers/SidebarHeader.tsx new file mode 100644 index 000000000..6b968780d --- /dev/null +++ b/src/lib/headers/SidebarHeader.tsx @@ -0,0 +1,71 @@ +import { ComponentType, CSSProperties, HTMLProps, PureComponent } from 'react' +import { useTimelineHeadersContext } from './HeadersContext' +import { LEFT_VARIANT, RIGHT_VARIANT } from './constants' + +type SidebarHeaderProps = { + children: ComponentType<{ getRootProps: GetRootProps; data: any }> + rightSidebarWidth?: number + leftSidebarWidth: number + variant: typeof LEFT_VARIANT | typeof RIGHT_VARIANT + headerData?: any +} + +class SidebarHeader extends PureComponent { + getRootProps = (props: { style?: CSSProperties } = {}) => { + const { style } = props + const width = this.props.variant === RIGHT_VARIANT ? this.props.rightSidebarWidth : this.props.leftSidebarWidth + return { + style: { + ...style, + width, + }, + } + } + + getStateAndHelpers = () => { + return { + getRootProps: this.getRootProps, + data: this.props.headerData, + } + } + + render() { + const props = this.getStateAndHelpers() + const Renderer = this.props.children + return + } +} + +type GetRootProps = () => HTMLProps + +export type SidebarWrapperProps = { + children?: ComponentType<{ getRootProps: GetRootProps; data: any }> + variant?: typeof LEFT_VARIANT | typeof RIGHT_VARIANT + headerData?: any +} + +const defaultChildren: SidebarWrapperProps['children'] = ({ + getRootProps, +}: { + getRootProps: GetRootProps + data: any +}) =>
+ +const SidebarWrapper = (props: SidebarWrapperProps) => { + const { children, variant = LEFT_VARIANT, headerData } = props + const { leftSidebarWidth, rightSidebarWidth } = useTimelineHeadersContext() + return ( + + {children || defaultChildren} + + ) +} + +SidebarWrapper.secretKey = 'SidebarHeader' + +export default SidebarWrapper diff --git a/src/lib/headers/TimelineHeaders.js b/src/lib/headers/TimelineHeaders.js deleted file mode 100644 index 882780efa..000000000 --- a/src/lib/headers/TimelineHeaders.js +++ /dev/null @@ -1,145 +0,0 @@ -import React from 'react' -import classNames from 'classnames' -import { TimelineHeadersConsumer } from './HeadersContext' -import PropTypes from 'prop-types' -import SidebarHeader from './SidebarHeader' -import { RIGHT_VARIANT } from './constants' -class TimelineHeaders extends React.Component { - static propTypes = { - registerScroll: PropTypes.func.isRequired, - leftSidebarWidth: PropTypes.number.isRequired, - rightSidebarWidth: PropTypes.number.isRequired, - style: PropTypes.object, - children: PropTypes.node, - className: PropTypes.string, - calendarHeaderStyle: PropTypes.object, - calendarHeaderClassName: PropTypes.string, - headerRef: PropTypes.func - } - - constructor(props) { - super(props) - } - - getRootStyle = () => { - return { - ...this.props.style, - display: 'flex', - width: '100%' - } - } - - getCalendarHeaderStyle = () => { - const { - leftSidebarWidth, - rightSidebarWidth, - calendarHeaderStyle - } = this.props - return { - ...calendarHeaderStyle, - overflow: 'hidden', - width: `calc(100% - ${leftSidebarWidth + rightSidebarWidth}px)` - } - } - - handleRootRef = element => { - if (this.props.headerRef) { - this.props.headerRef(element) - } - } - - /** - * check if child of type SidebarHeader - * refer to for explanation https://github.com/gaearon/react-hot-loader#checking-element-types - */ - isSidebarHeader = (child) => { - if(child.type === undefined) return false - return child.type.secretKey ===SidebarHeader.secretKey - } - - render() { - let rightSidebarHeader - let leftSidebarHeader - let calendarHeaders = [] - const children = Array.isArray(this.props.children) - ? this.props.children.filter(c => c) - : [this.props.children] - React.Children.map(children, child => { - if (this.isSidebarHeader(child)) { - if (child.props.variant === RIGHT_VARIANT) { - rightSidebarHeader = child - } else { - leftSidebarHeader = child - } - } else { - calendarHeaders.push(child) - } - }) - if (!leftSidebarHeader) { - leftSidebarHeader = - } - if (!rightSidebarHeader && this.props.rightSidebarWidth) { - rightSidebarHeader = - } - return ( -
- {leftSidebarHeader} -
- {calendarHeaders} -
- {rightSidebarHeader} -
- ) - } -} - -const TimelineHeadersWrapper = ({ - children, - style, - className, - calendarHeaderStyle, - calendarHeaderClassName -}) => ( - - {({ leftSidebarWidth, rightSidebarWidth, registerScroll }) => { - return ( - - {children} - - ) - }} - -) - -TimelineHeadersWrapper.propTypes = { - style: PropTypes.object, - children: PropTypes.node, - className: PropTypes.string, - calendarHeaderStyle: PropTypes.object, - calendarHeaderClassName: PropTypes.string -} - -TimelineHeadersWrapper.secretKey = "TimelineHeaders" - -export default TimelineHeadersWrapper diff --git a/src/lib/headers/TimelineHeaders.tsx b/src/lib/headers/TimelineHeaders.tsx new file mode 100644 index 000000000..122ff5577 --- /dev/null +++ b/src/lib/headers/TimelineHeaders.tsx @@ -0,0 +1,122 @@ +import React, { ReactNode, LegacyRef, CSSProperties } from 'react' +import classNames from 'classnames' +import { useTimelineHeadersContext } from './HeadersContext' +import SidebarHeader from './SidebarHeader' +import { RIGHT_VARIANT } from './constants' +import { ElementWithSecret } from '../types/main' + +export type TimelineHeadersProps = { + registerScroll: LegacyRef + leftSidebarWidth: number + rightSidebarWidth: number + style?: React.CSSProperties + children?: ReactNode + className?: string + calendarHeaderStyle?: React.CSSProperties + calendarHeaderClassName?: string +} +class TimelineHeaders extends React.Component { + getRootStyle = () => { + return { + ...this.props.style, + display: 'flex', + width: '100%', + } + } + + getCalendarHeaderStyle = () => { + const { leftSidebarWidth, rightSidebarWidth, calendarHeaderStyle } = this.props + return { + ...calendarHeaderStyle, + overflow: 'hidden', + width: `calc(100% - ${leftSidebarWidth + rightSidebarWidth}px)`, + } + } + + /** + * check if child of type SidebarHeader + * refer to for explanation https://github.com/gaearon/react-hot-loader#checking-element-types + */ + isSidebarHeader = (child: ElementWithSecret) => { + if (child.type === undefined) return false + return child.type.secretKey === SidebarHeader.secretKey + } + + render() { + let rightSidebarHeader + let leftSidebarHeader + const calendarHeaders: ElementWithSecret[] = [] + const children: ElementWithSecret[] = Array.isArray(this.props.children) + ? this.props.children.filter((c) => c) + : [this.props.children] + React.Children.map(children, (child) => { + if (this.isSidebarHeader(child)) { + if (child?.props?.variant === RIGHT_VARIANT) { + rightSidebarHeader = child + } else { + leftSidebarHeader = child + } + } else { + calendarHeaders.push(child) + } + }) + if (!leftSidebarHeader) { + leftSidebarHeader = + } + if (!rightSidebarHeader && this.props.rightSidebarWidth) { + rightSidebarHeader = + } + return ( +
+ {leftSidebarHeader} +
+ {calendarHeaders} +
+ {rightSidebarHeader} +
+ ) + } +} + +export interface TimelineHeadersWrapperProps { + children: ReactNode + style?: CSSProperties + className?: string + calendarHeaderStyle?: CSSProperties + calendarHeaderClassName?: string +} +const TimelineHeadersWrapper = ({ + children, + style, + className, + calendarHeaderStyle, + calendarHeaderClassName, +}: TimelineHeadersWrapperProps) => { + const { leftSidebarWidth, rightSidebarWidth, registerScroll } = useTimelineHeadersContext() + return ( + + {children} + + ) +} + +TimelineHeadersWrapper.secretKey = 'TimelineHeaders' + +export default TimelineHeadersWrapper diff --git a/src/lib/headers/constants.js b/src/lib/headers/constants.ts similarity index 100% rename from src/lib/headers/constants.js rename to src/lib/headers/constants.ts diff --git a/src/lib/headers/types.ts b/src/lib/headers/types.ts new file mode 100644 index 000000000..4c398bc03 --- /dev/null +++ b/src/lib/headers/types.ts @@ -0,0 +1,9 @@ +import { HTMLAttributes } from 'react' +import { Interval } from '../types/main' + +export type GetIntervalPropsParams = { + interval: Interval +} & HTMLAttributes +export type GetIntervalPropsType = (props?: GetIntervalPropsParams) => HTMLAttributes & { + key: string +} diff --git a/src/lib/interaction/PreventClickOnDrag.js b/src/lib/interaction/PreventClickOnDrag.js deleted file mode 100644 index 50d260698..000000000 --- a/src/lib/interaction/PreventClickOnDrag.js +++ /dev/null @@ -1,40 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' - -class PreventClickOnDrag extends Component { - static propTypes = { - children: PropTypes.element.isRequired, - onClick: PropTypes.func.isRequired, - clickTolerance: PropTypes.number.isRequired - } - - handleMouseDown = evt => { - this.originClickX = evt.clientX - } - - handleMouseUp = evt => { - if (Math.abs(this.originClickX - evt.clientX) > this.props.clickTolerance) { - this.cancelClick = true - } - } - - handleClick = evt => { - if (!this.cancelClick) { - this.props.onClick(evt) - } - - this.cancelClick = false - this.originClickX = null - } - - render() { - const childElement = React.Children.only(this.props.children) - return React.cloneElement(childElement, { - onMouseDown: this.handleMouseDown, - onMouseUp: this.handleMouseUp, - onClick: this.handleClick - }) - } -} - -export default PreventClickOnDrag diff --git a/src/lib/interaction/PreventClickOnDrag.tsx b/src/lib/interaction/PreventClickOnDrag.tsx new file mode 100644 index 000000000..792b2042c --- /dev/null +++ b/src/lib/interaction/PreventClickOnDrag.tsx @@ -0,0 +1,43 @@ +import React, { Component, MouseEventHandler } from 'react' + +type Props = { + children: React.ReactElement + onClick: MouseEventHandler + clickTolerance?: number +} +class PreventClickOnDrag extends Component { + handleMouseDown: MouseEventHandler = (evt) => { + this.originClickX = evt.clientX + } + + handleMouseUp: MouseEventHandler = (evt) => { + if ( + this.props.clickTolerance !== undefined && + Math.abs(this.originClickX - evt.clientX) > this.props.clickTolerance + ) { + this.cancelClick = true + } + } + + handleClick: MouseEventHandler = (evt) => { + if (!this.cancelClick) { + this.props.onClick(evt) + } + + this.cancelClick = false + this.originClickX = null + } + private originClickX: any + private cancelClick: boolean = false + + render() { + const childElement = React.Children.only(this.props.children) + return React.cloneElement(childElement, { + onMouseDown: this.handleMouseDown, + onMouseUp: this.handleMouseUp, + onClick: this.handleClick, + }) + } +} + +export default PreventClickOnDrag diff --git a/src/lib/items/Item.js b/src/lib/items/Item.js deleted file mode 100644 index 2099a1a1a..000000000 --- a/src/lib/items/Item.js +++ /dev/null @@ -1,633 +0,0 @@ -import { Component } from 'react' -import PropTypes from 'prop-types' -import interact from 'interactjs' -import moment from 'moment' - -import { _get, deepObjectCompare } from '../utility/generic' -import { composeEvents } from '../utility/events' -import { defaultItemRenderer } from './defaultItemRenderer' -import { coordinateToTimeRatio } from '../utility/calendar' -import { getSumScroll, getSumOffset } from '../utility/dom-helpers' -import { - overridableStyles, - selectedStyle, - selectedAndCanMove, - selectedAndCanResizeLeft, - selectedAndCanResizeLeftAndDragLeft, - selectedAndCanResizeRight, - selectedAndCanResizeRightAndDragRight, - leftResizeStyle, - rightResizeStyle -} from './styles' -export default class Item extends Component { - // removed prop type check for SPEED! - // they are coming from a trusted component anyway - // (this complicates performance debugging otherwise) - static propTypes = { - canvasTimeStart: PropTypes.number.isRequired, - canvasTimeEnd: PropTypes.number.isRequired, - canvasWidth: PropTypes.number.isRequired, - order: PropTypes.object, - - dragSnap: PropTypes.number, - minResizeWidth: PropTypes.number, - selected: PropTypes.bool, - - canChangeGroup: PropTypes.bool.isRequired, - canMove: PropTypes.bool.isRequired, - canResizeLeft: PropTypes.bool.isRequired, - canResizeRight: PropTypes.bool.isRequired, - - keys: PropTypes.object.isRequired, - item: PropTypes.object.isRequired, - - onSelect: PropTypes.func, - onDrag: PropTypes.func, - onDrop: PropTypes.func, - onResizing: PropTypes.func, - onResized: PropTypes.func, - onContextMenu: PropTypes.func, - itemRenderer: PropTypes.func, - - itemProps: PropTypes.object, - canSelect: PropTypes.bool, - dimensions: PropTypes.object, - groupTops: PropTypes.array, - useResizeHandle: PropTypes.bool, - moveResizeValidator: PropTypes.func, - onItemDoubleClick: PropTypes.func, - - scrollRef: PropTypes.object - } - - static defaultProps = { - selected: false, - itemRenderer: defaultItemRenderer - } - - static contextTypes = { - getTimelineContext: PropTypes.func - } - - constructor(props) { - super(props) - - this.cacheDataFromProps(props) - - this.state = { - interactMounted: false, - - dragging: null, - dragStart: null, - preDragPosition: null, - dragTime: null, - dragGroupDelta: null, - - resizing: null, - resizeEdge: null, - resizeStart: null, - resizeTime: null - } - } - - shouldComponentUpdate(nextProps, nextState) { - var shouldUpdate = - nextState.dragging !== this.state.dragging || - nextState.dragTime !== this.state.dragTime || - nextState.dragGroupDelta !== this.state.dragGroupDelta || - nextState.resizing !== this.state.resizing || - nextState.resizeTime !== this.state.resizeTime || - nextProps.keys !== this.props.keys || - !deepObjectCompare(nextProps.itemProps, this.props.itemProps) || - nextProps.selected !== this.props.selected || - nextProps.item !== this.props.item || - nextProps.canvasTimeStart !== this.props.canvasTimeStart || - nextProps.canvasTimeEnd !== this.props.canvasTimeEnd || - nextProps.canvasWidth !== this.props.canvasWidth || - (nextProps.order ? nextProps.order.index : undefined) !== - (this.props.order ? this.props.order.index : undefined) || - nextProps.dragSnap !== this.props.dragSnap || - nextProps.minResizeWidth !== this.props.minResizeWidth || - nextProps.canChangeGroup !== this.props.canChangeGroup || - nextProps.canSelect !== this.props.canSelect || - nextProps.canMove !== this.props.canMove || - nextProps.canResizeLeft !== this.props.canResizeLeft || - nextProps.canResizeRight !== this.props.canResizeRight || - nextProps.dimensions !== this.props.dimensions - return shouldUpdate - } - - cacheDataFromProps(props) { - this.itemId = _get(props.item, props.keys.itemIdKey) - this.itemTitle = _get(props.item, props.keys.itemTitleKey) - this.itemDivTitle = props.keys.itemDivTitleKey - ? _get(props.item, props.keys.itemDivTitleKey) - : this.itemTitle - this.itemTimeStart = _get(props.item, props.keys.itemTimeStartKey) - this.itemTimeEnd = _get(props.item, props.keys.itemTimeEndKey) - } - - getTimeRatio() { - const { canvasTimeStart, canvasTimeEnd, canvasWidth } = this.props - return coordinateToTimeRatio(canvasTimeStart, canvasTimeEnd, canvasWidth) - } - - dragTimeSnap(dragTime, considerOffset) { - const { dragSnap } = this.props - if (dragSnap) { - const offset = considerOffset ? moment().utcOffset() * 60 * 1000 : 0 - return Math.round(dragTime / dragSnap) * dragSnap - offset % dragSnap - } else { - return dragTime - } - } - - resizeTimeSnap(dragTime) { - const { dragSnap } = this.props - if (dragSnap) { - const endTime = this.itemTimeEnd % dragSnap - return Math.round((dragTime - endTime) / dragSnap) * dragSnap + endTime - } else { - return dragTime - } - } - - dragTime(e) { - const startTime = moment(this.itemTimeStart) - - if (this.state.dragging) { - return this.dragTimeSnap(this.timeFor(e) + this.state.dragStart.offset, true) - } else { - return startTime - } - } - - timeFor(e) { - const ratio = coordinateToTimeRatio(this.props.canvasTimeStart, this.props.canvasTimeEnd, this.props.canvasWidth) - - const offset = getSumOffset(this.props.scrollRef).offsetLeft - const scrolls = getSumScroll(this.props.scrollRef) - - return (e.pageX - offset + scrolls.scrollLeft) * ratio + this.props.canvasTimeStart; - } - - dragGroupDelta(e) { - const { groupTops, order } = this.props - if (this.state.dragging) { - if (!this.props.canChangeGroup) { - return 0 - } - let groupDelta = 0 - - const offset = getSumOffset(this.props.scrollRef).offsetTop - const scrolls = getSumScroll(this.props.scrollRef) - - for (var key of Object.keys(groupTops)) { - var groupTop = groupTops[key] - if (e.pageY - offset + scrolls.scrollTop > groupTop) { - groupDelta = parseInt(key, 10) - order.index - } else { - break - } - } - - if (this.props.order.index + groupDelta < 0) { - return 0 - this.props.order.index - } else { - return groupDelta - } - } else { - return 0 - } - } - - resizeTimeDelta(e, resizeEdge) { - const length = this.itemTimeEnd - this.itemTimeStart - const timeDelta = this.dragTimeSnap( - (e.pageX - this.state.resizeStart) * this.getTimeRatio() - ) - - if ( - length + (resizeEdge === 'left' ? -timeDelta : timeDelta) < - (this.props.dragSnap || 1000) - ) { - if (resizeEdge === 'left') { - return length - (this.props.dragSnap || 1000) - } else { - return (this.props.dragSnap || 1000) - length - } - } else { - return timeDelta - } - } - - mountInteract() { - const leftResize = this.props.useResizeHandle ? ".rct-item-handler-resize-left" : true - const rightResize = this.props.useResizeHandle ? ".rct-item-handler-resize-right" : true - - interact(this.item) - .resizable({ - edges: { - left: this.canResizeLeft() && leftResize, - right: this.canResizeRight() && rightResize, - top: false, - bottom: false - }, - enabled: - this.props.selected && (this.canResizeLeft() || this.canResizeRight()) - }) - .draggable({ - enabled: this.props.selected && this.canMove() - }) - .styleCursor(false) - .on('dragstart', e => { - if (this.props.selected) { - const clickTime = this.timeFor(e); - this.setState({ - dragging: true, - dragStart: { - x: e.pageX, - y: e.pageY, - offset: this.itemTimeStart - clickTime }, - preDragPosition: { x: e.target.offsetLeft, y: e.target.offsetTop }, - dragTime: this.itemTimeStart, - dragGroupDelta: 0 - }) - } else { - return false - } - }) - .on('dragmove', e => { - if (this.state.dragging) { - let dragTime = this.dragTime(e) - let dragGroupDelta = this.dragGroupDelta(e) - if (this.props.moveResizeValidator) { - dragTime = this.props.moveResizeValidator( - 'move', - this.props.item, - dragTime - ) - } - - if (this.props.onDrag) { - this.props.onDrag( - this.itemId, - dragTime, - this.props.order.index + dragGroupDelta - ) - } - - this.setState({ - dragTime: dragTime, - dragGroupDelta: dragGroupDelta - }) - } - }) - .on('dragend', e => { - if (this.state.dragging) { - if (this.props.onDrop) { - let dragTime = this.dragTime(e) - - if (this.props.moveResizeValidator) { - dragTime = this.props.moveResizeValidator( - 'move', - this.props.item, - dragTime - ) - } - - this.props.onDrop( - this.itemId, - dragTime, - this.props.order.index + this.dragGroupDelta(e) - ) - } - - this.setState({ - dragging: false, - dragStart: null, - preDragPosition: null, - dragTime: null, - dragGroupDelta: null - }) - } - }) - .on('resizestart', e => { - if (this.props.selected) { - this.setState({ - resizing: true, - resizeEdge: null, // we don't know yet - resizeStart: e.pageX, - resizeTime: 0 - }) - } else { - return false - } - }) - .on('resizemove', e => { - if (this.state.resizing) { - let resizeEdge = this.state.resizeEdge - - if (!resizeEdge) { - resizeEdge = e.deltaRect.left !== 0 ? 'left' : 'right' - this.setState({ resizeEdge }) - } - let resizeTime = this.resizeTimeSnap(this.timeFor(e)) - - if (this.props.moveResizeValidator) { - resizeTime = this.props.moveResizeValidator( - 'resize', - this.props.item, - resizeTime, - resizeEdge - ) - } - - if (this.props.onResizing) { - this.props.onResizing(this.itemId, resizeTime, resizeEdge) - } - - this.setState({ - resizeTime - }) - } - }) - .on('resizeend', e => { - if (this.state.resizing) { - const { resizeEdge } = this.state - let resizeTime = this.resizeTimeSnap(this.timeFor(e)) - - if (this.props.moveResizeValidator) { - resizeTime = this.props.moveResizeValidator( - 'resize', - this.props.item, - resizeTime, - resizeEdge - ) - } - - if (this.props.onResized) { - this.props.onResized( - this.itemId, - resizeTime, - resizeEdge, - this.resizeTimeDelta(e, resizeEdge) - ) - } - this.setState({ - resizing: null, - resizeStart: null, - resizeEdge: null, - resizeTime: null - }) - } - }) - .on('tap', e => { - this.actualClick(e, e.pointerType === 'mouse' ? 'click' : 'touch') - }) - - this.setState({ - interactMounted: true - }) - } - - canResizeLeft(props = this.props) { - if (!props.canResizeLeft) { - return false - } - let width = parseInt(props.dimensions.width, 10) - return width >= props.minResizeWidth - } - - canResizeRight(props = this.props) { - if (!props.canResizeRight) { - return false - } - let width = parseInt(props.dimensions.width, 10) - return width >= props.minResizeWidth - } - - canMove(props = this.props) { - return !!props.canMove - } - - componentDidUpdate(prevProps) { - this.cacheDataFromProps(this.props) - let { interactMounted } = this.state - const couldDrag = prevProps.selected && this.canMove(prevProps) - const couldResizeLeft = - prevProps.selected && this.canResizeLeft(prevProps) - const couldResizeRight = - prevProps.selected && this.canResizeRight(prevProps) - const willBeAbleToDrag = this.props.selected && this.canMove(this.props) - const willBeAbleToResizeLeft = - this.props.selected && this.canResizeLeft(this.props) - const willBeAbleToResizeRight = - this.props.selected && this.canResizeRight(this.props) - - if(!!this.item){ - if (this.props.selected && !interactMounted) { - this.mountInteract() - interactMounted = true - } - if ( - interactMounted && - (couldResizeLeft !== willBeAbleToResizeLeft || - couldResizeRight !== willBeAbleToResizeRight) - ) { - const leftResize = this.props.useResizeHandle ? this.dragLeft : true - const rightResize = this.props.useResizeHandle ? this.dragRight : true - - interact(this.item).resizable({ - enabled: willBeAbleToResizeLeft || willBeAbleToResizeRight, - edges: { - top: false, - bottom: false, - left: willBeAbleToResizeLeft && leftResize, - right: willBeAbleToResizeRight && rightResize - } - }) - } - if (interactMounted && couldDrag !== willBeAbleToDrag) { - interact(this.item).draggable({ enabled: willBeAbleToDrag }) - } - } - else{ - interactMounted= false; - } - this.setState({ - interactMounted, - }) - - } - - onMouseDown = e => { - if (!this.state.interactMounted) { - e.preventDefault() - this.startedClicking = true - } - } - - onMouseUp = e => { - if (!this.state.interactMounted && this.startedClicking) { - this.startedClicking = false - this.actualClick(e, 'click') - } - } - - onTouchStart = e => { - if (!this.state.interactMounted) { - e.preventDefault() - this.startedTouching = true - } - } - - onTouchEnd = e => { - if (!this.state.interactMounted && this.startedTouching) { - this.startedTouching = false - this.actualClick(e, 'touch') - } - } - - handleDoubleClick = e => { - e.stopPropagation() - if (this.props.onItemDoubleClick) { - this.props.onItemDoubleClick(this.itemId, e) - } - } - - handleContextMenu = e => { - if (this.props.onContextMenu) { - e.preventDefault() - e.stopPropagation() - this.props.onContextMenu(this.itemId, e) - } - } - - actualClick(e, clickType) { - if (this.props.canSelect && this.props.onSelect) { - this.props.onSelect(this.itemId, clickType, e) - } - } - - getItemRef = el => (this.item = el) - getDragLeftRef = el => (this.dragLeft = el) - getDragRightRef = el => (this.dragRight = el) - - getItemProps = (props = {}) => { - //TODO: maybe shouldnt include all of these classes - const classNames = - 'rct-item' + - (this.props.item.className ? ` ${this.props.item.className}` : '') - - return { - key: this.itemId, - ref: this.getItemRef, - title: this.itemDivTitle, - className: classNames + ` ${props.className ? props.className : ''}`, - onMouseDown: composeEvents(this.onMouseDown, props.onMouseDown), - onMouseUp: composeEvents(this.onMouseUp, props.onMouseUp), - onTouchStart: composeEvents(this.onTouchStart, props.onTouchStart), - onTouchEnd: composeEvents(this.onTouchEnd, props.onTouchEnd), - onDoubleClick: composeEvents(this.handleDoubleClick, props.onDoubleClick), - onContextMenu: composeEvents(this.handleContextMenu, props.onContextMenu), - style: Object.assign({}, this.getItemStyle(props)) - } - } - - getResizeProps = (props = {}) => { - let leftName = "rct-item-handler rct-item-handler-left rct-item-handler-resize-left" - if (props.leftClassName) { - leftName += ` ${props.leftClassName}` - } - - let rightName = "rct-item-handler rct-item-handler-right rct-item-handler-resize-right" - if (props.rightClassName) { - rightName += ` ${props.rightClassName}` - } - return { - left: { - ref: this.getDragLeftRef, - className: leftName, - style: Object.assign({}, leftResizeStyle, props.leftStyle) - }, - right: { - ref: this.getDragRightRef, - className: rightName, - style: Object.assign({}, rightResizeStyle, props.rightStyle) - } - } - } - - getItemStyle(props) { - const dimensions = this.props.dimensions - - const baseStyles = { - position: 'absolute', - boxSizing: 'border-box', - left: `${dimensions.left}px`, - top: `${dimensions.top}px`, - width: `${dimensions.width}px`, - height: `${dimensions.height}px`, - lineHeight: `${dimensions.height}px` - } - - const finalStyle = Object.assign( - {}, - overridableStyles, - this.props.selected ? selectedStyle : {}, - this.props.selected & this.canMove(this.props) ? selectedAndCanMove : {}, - this.props.selected & this.canResizeLeft(this.props) - ? selectedAndCanResizeLeft - : {}, - this.props.selected & this.canResizeLeft(this.props) & this.state.dragging - ? selectedAndCanResizeLeftAndDragLeft - : {}, - this.props.selected & this.canResizeRight(this.props) - ? selectedAndCanResizeRight - : {}, - this.props.selected & - this.canResizeRight(this.props) & - this.state.dragging - ? selectedAndCanResizeRightAndDragRight - : {}, - props.style, - baseStyles - ) - return finalStyle - } - - render() { - if (typeof this.props.order === 'undefined' || this.props.order === null) { - return null - } - - const timelineContext = this.context.getTimelineContext() - const itemContext = { - dimensions: this.props.dimensions, - useResizeHandle: this.props.useResizeHandle, - title: this.itemTitle, - canMove: this.canMove(this.props), - canResizeLeft: this.canResizeLeft(this.props), - canResizeRight: this.canResizeRight(this.props), - selected: this.props.selected, - dragging: this.state.dragging, - dragStart: this.state.dragStart, - dragTime: this.state.dragTime, - dragGroupDelta: this.state.dragGroupDelta, - resizing: this.state.resizing, - resizeEdge: this.state.resizeEdge, - resizeStart: this.state.resizeStart, - resizeTime: this.state.resizeTime, - width: this.props.dimensions.width - } - - return this.props.itemRenderer({ - item: this.props.item, - timelineContext, - itemContext, - getItemProps: this.getItemProps, - getResizeProps: this.getResizeProps - }) - } -} diff --git a/src/lib/items/Item.tsx b/src/lib/items/Item.tsx new file mode 100644 index 000000000..c670f9953 --- /dev/null +++ b/src/lib/items/Item.tsx @@ -0,0 +1,676 @@ +import { + Component, + CSSProperties, + HTMLAttributes, + LegacyRef, + MouseEvent, + MouseEventHandler, + ReactNode, + TouchEvent, + TouchEventHandler, +} from 'react' +import interact from 'interactjs' +import dayjs from 'dayjs' +import utc from 'dayjs/plugin/utc' +import { _get } from '../utility/generic' +import { composeEvents } from '../utility/events' +import { defaultItemRenderer } from './defaultItemRenderer' +import { coordinateToTimeRatio } from '../utility/calendar' +import { getSumOffset, getSumScroll } from '../utility/dom-helpers' +import { + leftResizeStyle, + overridableStyles, + rightResizeStyle, + selectedAndCanMove, + selectedAndCanResizeLeft, + selectedAndCanResizeLeftAndDragLeft, + selectedAndCanResizeRight, + selectedAndCanResizeRightAndDragRight, + selectedStyle, +} from './styles' +import { Id, ItemContext, TimelineItemBase, TimelineKeys } from '../types/main' +import { TimelineContext, TimelineContextType } from '../timeline/TimelineStateContext' +import isEqual from 'lodash/isEqual' + +dayjs.extend(utc) + +export type ResizeEdge = 'left' | 'right' + +type OnSelect = ( + itemId: string | null, + clickType: 'click' | 'touch', + event: MouseEvent | TouchEvent, +) => void + +export type ItemProps> = { + canvasTimeStart: number + canvasTimeEnd: number + canvasWidth: number + minResizeWidth?: number + order: { index: number } + dragSnap?: number + itemProps?: HTMLAttributes + onDrag: (itemId: string, dragTime: number, newGroupOrder: number) => void + onDrop: (itemId: string, dragTime: number, newGroupOrder: number) => void + onResizing: (itemId: string, time: number, resizeEdge: ResizeEdge | null) => void + onResized: (itemId: string, time: number, resizeEdge: ResizeEdge | null, delta: number) => void + moveResizeValidator?: ( + action: 'move' | 'resize', + item: TimelineItemBase, + time: number, + resizeEdge?: ResizeEdge | null, + ) => number + itemRenderer?: (props: ItemRendererProps) => ReactNode + selected: boolean + canChangeGroup?: boolean + canMove?: boolean + canSelect?: boolean + dimensions?: ItemContext['dimensions'] + useResizeHandle?: boolean + canResizeLeft: any + canResizeRight: any + + keys: TimelineKeys + item: CustomItem + + onSelect: OnSelect + onContextMenu?: (i: Id, e: MouseEvent) => void + groupTops: any + onItemDoubleClick: (i: Id, e: MouseEvent) => void + scrollRef: HTMLElement | null +} + +type DragProps = { offset: number; x: number; y: number } + +interface ItemState { + interactMounted: boolean + dragging: boolean + dragStart: null | DragProps + preDragPosition: { x: number; y: number } | null + dragTime: null | number + dragGroupDelta: null | number + resizing: boolean + resizeEdge: null | 'left' | 'right' + resizeStart: null | number + resizeTime: null | number +} + +export type GetItemPropsParams = HTMLAttributes & { + leftClassName?: string + rightClassName?: string + leftStyle?: CSSProperties + rightStyle?: CSSProperties +} + +export interface ItemRendererProps> { + item: CustomItem + timelineContext: TimelineContextType + itemContext: ItemContext + getItemProps: (params: GetItemPropsParams) => HTMLAttributes + getResizeProps: GetResizeProps +} +type GetResizePropsDirection = { + ref: LegacyRef + className: string + style: CSSProperties +} +export type GetResizeProps = (params?: GetItemPropsParams) => { + right: GetResizePropsDirection + left: GetResizePropsDirection +} + +export default class Item> extends Component< + ItemProps, + ItemState +> { + static defaultProps = { + selected: false, + itemRenderer: defaultItemRenderer, + } + declare context: TimelineContextType + static contextType = TimelineContext + + state: ItemState = { + interactMounted: false, + + dragging: false, + dragStart: null, + preDragPosition: null, + dragTime: null, + dragGroupDelta: null, + + resizing: false, + resizeEdge: null, + resizeStart: null, + resizeTime: null, + } + private itemId: string = '' + private itemTitle: string = '' + private itemDivTitle?: string + private itemTimeStart?: number + private itemTimeEnd?: number + private item?: HTMLElement + private dragLeft?: HTMLElement + private dragRight?: HTMLElement + private startedClicking: boolean = false + private startedTouching: boolean = false + private dragInProgress: boolean = false + + constructor(props: ItemProps) { + super(props) + + this.cacheDataFromProps(props) + } + + shouldComponentUpdate(nextProps: ItemProps, nextState: ItemState) { + /*const shouldUpdate = + nextState.dragging !== this.state.dragging || + nextState.dragTime !== this.state.dragTime || + nextState.dragGroupDelta !== this.state.dragGroupDelta || + nextState.resizing !== this.state.resizing || + nextState.resizeTime !== this.state.resizeTime || + nextProps.keys !== this.props.keys || + !deepObjectCompare(nextProps.itemProps, this.props.itemProps) || + nextProps.selected !== this.props.selected || + nextProps.item !== this.props.item || + nextProps.canvasTimeStart !== this.props.canvasTimeStart || + nextProps.canvasTimeEnd !== this.props.canvasTimeEnd || + nextProps.canvasWidth !== this.props.canvasWidth || + (nextProps.order ? nextProps.order.index : undefined) !== + (this.props.order ? this.props.order.index : undefined) || + nextProps.dragSnap !== this.props.dragSnap || + nextProps.minResizeWidth !== this.props.minResizeWidth || + nextProps.canChangeGroup !== this.props.canChangeGroup || + nextProps.canSelect !== this.props.canSelect || + nextProps.canMove !== this.props.canMove || + nextProps.canResizeLeft !== this.props.canResizeLeft || + nextProps.canResizeRight !== this.props.canResizeRight || + nextProps.dimensions !== this.props.dimensions*/ + return !isEqual(this.props, nextProps) || !isEqual(this.state, nextState) + } + + cacheDataFromProps(props: ItemProps) { + this.itemId = _get(props.item, props.keys.itemIdKey) + this.itemTitle = _get(props.item, props.keys.itemTitleKey) + this.itemDivTitle = props.keys.itemDivTitleKey ? _get(props.item, props.keys.itemDivTitleKey) : this.itemTitle + this.itemTimeStart = _get(props.item, props.keys.itemTimeStartKey) + this.itemTimeEnd = _get(props.item, props.keys.itemTimeEndKey) + } + + getTimeRatio() { + const { canvasTimeStart, canvasTimeEnd, canvasWidth } = this.props + return coordinateToTimeRatio(canvasTimeStart, canvasTimeEnd, canvasWidth) + } + + dragTimeSnap(dragTime: number, considerOffset?: boolean) { + const { dragSnap } = this.props + if (dragSnap) { + const offset = considerOffset ? dayjs().utcOffset() * 60 * 1000 : 0 + return Math.round(dragTime / dragSnap) * dragSnap - (offset % dragSnap) + } else { + return dragTime + } + } + + resizeTimeSnap(dragTime: number) { + const { dragSnap } = this.props + if (dragSnap) { + const endTime = this.itemTimeEnd! % dragSnap + return Math.round((dragTime - endTime) / dragSnap) * dragSnap + endTime + } else { + return dragTime + } + } + + dragTime(e: MouseEvent) { + const startTime = dayjs(this.itemTimeStart) + + if (this.state.dragging) { + return this.dragTimeSnap(this.timeFor(e) + this.state.dragStart!.offset, true) + } else { + return startTime.valueOf() + } + } + + timeFor(e: MouseEvent) { + const ratio = coordinateToTimeRatio(this.props.canvasTimeStart, this.props.canvasTimeEnd, this.props.canvasWidth) + + const offset = getSumOffset(this.props.scrollRef!).offsetLeft + const scrolls = getSumScroll(this.props.scrollRef!) + + return (e.pageX - offset + scrolls.scrollLeft) * ratio + this.props.canvasTimeStart + } + + dragGroupDelta(e: MouseEvent) { + const { groupTops, order } = this.props + if (this.state.dragging) { + if (!this.props.canChangeGroup) { + return 0 + } + let groupDelta = 0 + + const offset = getSumOffset(this.props.scrollRef!).offsetTop + const scrolls = getSumScroll(this.props.scrollRef!) + + for (const key of Object.keys(groupTops)) { + const groupTop = groupTops[key] + if (e.pageY - offset + scrolls.scrollTop > groupTop) { + groupDelta = parseInt(key, 10) - order!.index + } else { + break + } + } + + if (this.props.order!.index + groupDelta < 0) { + return 0 - this.props.order.index + } else { + return groupDelta + } + } else { + return 0 + } + } + + resizeTimeDelta(e: MouseEvent, resizeEdge: ResizeEdge | null) { + const length = this.itemTimeEnd! - this.itemTimeStart! + const timeDelta = this.dragTimeSnap((e.pageX - this.state.resizeStart!) * this.getTimeRatio()) + + if (length + (resizeEdge === 'left' ? -timeDelta : timeDelta) < (this.props.dragSnap || 1000)) { + if (resizeEdge === 'left') { + return length - (this.props.dragSnap || 1000) + } else { + return (this.props.dragSnap || 1000) - length + } + } else { + return timeDelta + } + } + + mountInteract() { + const leftResize = this.props.useResizeHandle ? '.rct-item-handler-resize-left' : true + const rightResize = this.props.useResizeHandle ? '.rct-item-handler-resize-right' : true + + interact(this.item!) + .resizable({ + edges: { + left: this.canResizeLeft() && leftResize, + right: this.canResizeRight() && rightResize, + top: false, + bottom: false, + }, + enabled: this.props.selected && (this.canResizeLeft() || this.canResizeRight()), + }) + .draggable({ + enabled: this.props.selected && this.canMove(), + }) + .styleCursor(false) + .on('dragstart', (e) => { + if (this.props.selected) { + this.dragInProgress = true + this.fireInteractEvent(true) + const clickTime = this.timeFor(e) + this.setState({ + dragging: true, + dragStart: { + x: e.pageX, + y: e.pageY, + offset: this.itemTimeStart! - clickTime, + }, + preDragPosition: { x: e.target.offsetLeft, y: e.target.offsetTop }, + dragTime: this.itemTimeStart!, + dragGroupDelta: 0, + }) + } else { + return false + } + }) + .on('dragmove', (e) => { + if (this.state.dragging) { + this.setState((state) => { + // stop updating when dropped already + if (!this.dragInProgress) { + return { ...state } + } + let dragTime = this.dragTime(e) + const dragGroupDelta = this.dragGroupDelta(e) + if (this.props.moveResizeValidator) { + dragTime = this.props.moveResizeValidator('move', this.props.item, dragTime) + } + + if (this.props.onDrag) { + this.props.onDrag(this.itemId!, dragTime, this.props.order.index + dragGroupDelta) + } + + return { + dragTime: dragTime, + dragGroupDelta: dragGroupDelta, + } + }) + } + }) + .on('dragend', (e) => { + if (this.state.dragging) { + if (this.props.onDrop) { + this.dragInProgress = false + this.fireInteractEvent(false) + let dragTime = this.dragTime(e) + + if (this.props.moveResizeValidator) { + dragTime = this.props.moveResizeValidator('move', this.props.item, dragTime) + } + + this.props.onDrop(this.itemId!, dragTime, this.props.order.index + this.dragGroupDelta(e)) + } + + this.setState({ + dragging: false, + dragStart: null, + preDragPosition: null, + dragTime: null, + dragGroupDelta: null, + }) + } + }) + .on('resizestart', (e) => { + if (this.props.selected) { + this.fireInteractEvent(true) + this.setState({ + resizing: true, + resizeEdge: null, // we don't know yet + resizeStart: e.pageX, + resizeTime: 0, + }) + } else { + return false + } + }) + .on('resizemove', (e) => { + if (this.state.resizing) { + let resizeEdge = this.state.resizeEdge + + if (!resizeEdge) { + resizeEdge = e.deltaRect.left !== 0 ? 'left' : 'right' + this.setState({ resizeEdge }) + } + let resizeTime = this.resizeTimeSnap(this.timeFor(e)) + + if (this.props.moveResizeValidator) { + resizeTime = this.props.moveResizeValidator('resize', this.props.item, resizeTime, resizeEdge) + } + + if (this.props.onResizing) { + this.props.onResizing(this.itemId, resizeTime, resizeEdge) + } + + this.setState({ + resizeTime, + }) + } + }) + .on('resizeend', (e) => { + if (this.state.resizing) { + this.fireInteractEvent(false) + const { resizeEdge } = this.state + let resizeTime = this.resizeTimeSnap(this.timeFor(e)) + + if (this.props.moveResizeValidator) { + resizeTime = this.props.moveResizeValidator('resize', this.props.item, resizeTime, resizeEdge) + } + + if (this.props.onResized) { + this.props.onResized(this.itemId, resizeTime, resizeEdge, this.resizeTimeDelta(e, resizeEdge)) + } + this.setState({ + resizing: false, + resizeStart: null, + resizeEdge: null, + resizeTime: null, + }) + } + }) + .on('tap', (e) => { + this.actualClick(e, e.pointerType === 'mouse' ? 'click' : 'touch') + }) + + this.setState({ + interactMounted: true, + }) + } + + canResizeLeft(props = this.props) { + if (!props.canResizeLeft || props.minResizeWidth === undefined) { + return false + } + const width = parseInt(props.dimensions!.width?.toString(), 10) + return width >= props.minResizeWidth + } + + canResizeRight(props = this.props) { + if (!props.canResizeRight || props.minResizeWidth === undefined) { + return false + } + const width = parseInt(props.dimensions!.width?.toString(), 10) + return width >= props.minResizeWidth + } + + canMove(props = this.props) { + return !!props.canMove + } + fireInteractEvent = (itemInteraction: boolean) => { + if (this.item) { + const event = new CustomEvent('itemInteraction', { + bubbles: true, + detail: { + itemInteraction, + }, + }) + this.item.dispatchEvent(event) + } + } + + componentDidUpdate(prevProps: ItemProps) { + this.cacheDataFromProps(this.props) + let { interactMounted } = this.state + const couldDrag = prevProps.selected && this.canMove(prevProps) + const couldResizeLeft = prevProps.selected && this.canResizeLeft(prevProps) + const couldResizeRight = prevProps.selected && this.canResizeRight(prevProps) + const willBeAbleToDrag = this.props.selected && this.canMove(this.props) + const willBeAbleToResizeLeft = this.props.selected && this.canResizeLeft(this.props) + const willBeAbleToResizeRight = this.props.selected && this.canResizeRight(this.props) + + if (this.item) { + if (this.props.selected && !interactMounted) { + this.mountInteract() + interactMounted = true + } + if ( + interactMounted && + (couldResizeLeft !== willBeAbleToResizeLeft || couldResizeRight !== willBeAbleToResizeRight) + ) { + const leftResize = this.props.useResizeHandle ? this.dragLeft : true + const rightResize = this.props.useResizeHandle ? this.dragRight : true + + interact(this.item).resizable({ + enabled: willBeAbleToResizeLeft || willBeAbleToResizeRight, + edges: { + top: false, + bottom: false, + left: willBeAbleToResizeLeft && leftResize, + right: willBeAbleToResizeRight && rightResize, + }, + }) + } + if (interactMounted && couldDrag !== willBeAbleToDrag) { + interact(this.item).draggable({ enabled: willBeAbleToDrag }) + } + } else { + interactMounted = false + } + if (interactMounted !== this.state.interactMounted) { + this.setState({ + interactMounted, + }) + } + } + + onMouseDown: MouseEventHandler = (e) => { + if (!this.state.interactMounted) { + e.preventDefault() + this.startedClicking = true + } + } + + onMouseUp: MouseEventHandler = (e) => { + if (!this.state.interactMounted && this.startedClicking) { + this.startedClicking = false + this.actualClick(e, 'click') + } + } + + onTouchStart: TouchEventHandler = (e) => { + if (!this.state.interactMounted) { + e.preventDefault() + this.startedTouching = true + } + } + + onTouchEnd: TouchEventHandler = (e) => { + if (!this.state.interactMounted && this.startedTouching) { + this.startedTouching = false + this.actualClick(e, 'touch') + } + } + + handleDoubleClick: MouseEventHandler = (e) => { + e.stopPropagation() + if (this.props.onItemDoubleClick) { + this.props.onItemDoubleClick(this.itemId, e) + } + } + + handleContextMenu: MouseEventHandler = (e) => { + if (this.props.onContextMenu) { + e.preventDefault() + e.stopPropagation() + this.props.onContextMenu(this.itemId, e) + } + } + + actualClick(e: MouseEvent | TouchEvent, clickType: 'click' | 'touch') { + if (this.props.canSelect && this.props.onSelect) { + this.props.onSelect(this.itemId!, clickType, e) + } + } + + getItemRef = (el: HTMLElement) => (this.item = el) + getDragLeftRef = (el: HTMLElement) => (this.dragLeft = el) + getDragRightRef = (el: HTMLElement) => (this.dragRight = el) + + getItemProps = (props: GetItemPropsParams = {}) => { + //TODO: maybe shouldnt include all of these classes + const classNames = 'rct-item' + (this.props.item.className ? ` ${this.props.item.className}` : '') + + return { + key: this.itemId, + ref: this.getItemRef, + title: this.itemDivTitle, + className: classNames + ` ${props.className ? props.className : ''}`, + onMouseDown: composeEvents(this.onMouseDown, props.onMouseDown), + onMouseUp: composeEvents(this.onMouseUp, props.onMouseUp), + onTouchStart: composeEvents(this.onTouchStart, props.onTouchStart), + onTouchEnd: composeEvents(this.onTouchEnd, props.onTouchEnd), + onDoubleClick: composeEvents(this.handleDoubleClick, props.onDoubleClick), + onContextMenu: composeEvents(this.handleContextMenu, props.onContextMenu), + style: Object.assign({}, this.getItemStyle(props)), + } + } + + getResizeProps = (props: GetItemPropsParams = {} as GetItemPropsParams) => { + let leftName = 'rct-item-handler rct-item-handler-left rct-item-handler-resize-left' + if (props.leftClassName) { + leftName += ` ${props.leftClassName}` + } + + let rightName = 'rct-item-handler rct-item-handler-right rct-item-handler-resize-right' + if (props.rightClassName) { + rightName += ` ${props.rightClassName}` + } + return { + left: { + ref: this.getDragLeftRef, + className: leftName, + style: Object.assign({}, leftResizeStyle, props.leftStyle), + }, + right: { + ref: this.getDragRightRef, + className: rightName, + style: Object.assign({}, rightResizeStyle, props.rightStyle), + }, + } as ReturnType + } + + getItemStyle(props: GetItemPropsParams) { + const dimensions = this.props.dimensions! + + const baseStyles = { + position: 'absolute', + boxSizing: 'border-box', + left: `${dimensions.left}px`, + top: `${dimensions.top}px`, + width: `${dimensions.width}px`, + height: `${dimensions.height}px`, + lineHeight: `${dimensions.height}px`, + } + + const finalStyle = Object.assign( + {}, + overridableStyles, + this.props.selected ? selectedStyle : {}, + this.props.selected && this.canMove(this.props) ? selectedAndCanMove : {}, + this.props.selected && this.canResizeLeft(this.props) ? selectedAndCanResizeLeft : {}, + this.props.selected && this.canResizeLeft(this.props) && this.state.dragging + ? selectedAndCanResizeLeftAndDragLeft + : {}, + this.props.selected && this.canResizeRight(this.props) ? selectedAndCanResizeRight : {}, + this.props.selected && this.canResizeRight(this.props) && this.state.dragging + ? selectedAndCanResizeRightAndDragRight + : {}, + props.style, + baseStyles, + ) + return finalStyle + } + + render() { + if (typeof this.props.order === 'undefined' || this.props.order === null) { + return null + } + + const timelineContext = this.context + const itemContext: ItemContext = { + dimensions: this.props.dimensions!, + useResizeHandle: !!this.props.useResizeHandle, + title: this.itemTitle, + canMove: this.canMove(this.props), + canResizeLeft: this.canResizeLeft(this.props), + canResizeRight: this.canResizeRight(this.props), + selected: this.props.selected, + dragging: this.state.dragging, + dragStart: this.state.dragStart, + dragTime: this.state.dragTime, + dragGroupDelta: this.state.dragGroupDelta, + resizing: this.state.resizing, + resizeEdge: this.state.resizeEdge, + resizeStart: this.state.resizeStart, + resizeTime: this.state.resizeTime, + } + + return this.props?.itemRenderer?.({ + item: this.props.item, + timelineContext, + itemContext, + getItemProps: this.getItemProps, + getResizeProps: this.getResizeProps, + }) + } +} diff --git a/src/lib/items/Items.js b/src/lib/items/Items.tsx similarity index 51% rename from src/lib/items/Items.js rename to src/lib/items/Items.tsx index 87173f895..23ef05a74 100644 --- a/src/lib/items/Items.js +++ b/src/lib/items/Items.tsx @@ -1,67 +1,62 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import Item from './Item' -// import ItemGroup from './ItemGroup' - +import { Component } from 'react' +import Item, { ItemProps } from './Item' import { _get, arraysEqual, keyBy } from '../utility/generic' import { getGroupOrders, getVisibleItems } from '../utility/calendar' +import { Id, TimelineGroupBase, TimelineItemBase, TimelineKeys } from '../types/main' +import { ItemDimension } from '../types/dimension' + +export type CanResize = true | false | 'left' | 'right' | 'both' +type ItemsProps> = { + groups: TimelineGroupBase[] + items: CustomItem[] + dimensionItems: ItemDimension[] + selected?: Id[] + + canvasTimeStart: number + canvasTimeEnd: number + canvasWidth: number + + dragSnap?: number + minResizeWidth?: number + selectedItem?: Id + + canChangeGroup?: boolean + canMove?: boolean + canResize?: CanResize + canSelect?: boolean + keys: TimelineKeys + moveResizeValidator?: ItemProps['moveResizeValidator'] + itemSelect: ItemProps['onSelect'] + itemDrag: ItemProps['onDrag'] + itemDrop: ItemProps['onDrop'] + itemResizing: ItemProps['onResizing'] + itemResized: ItemProps['onResized'] + onItemDoubleClick: ItemProps['onItemDoubleClick'] + onItemContextMenu?: ItemProps['onContextMenu'] + itemRenderer?: ItemProps['itemRenderer'] + groupTops: number[] + useResizeHandle?: boolean + scrollRef: HTMLElement | null + // Add more props if needed +} + +type ItemsState = object -const canResizeLeft = (item, canResize) => { - const value = - _get(item, 'canResize') !== undefined ? _get(item, 'canResize') : canResize +function canResizeLeft>(item: CustomItem, canResize?: CanResize) { + const value = _get(item, 'canResize') !== undefined ? _get(item, 'canResize') : canResize return value === 'left' || value === 'both' } -const canResizeRight = (item, canResize) => { - const value = - _get(item, 'canResize') !== undefined ? _get(item, 'canResize') : canResize +function canResizeRight>(item: CustomItem, canResize?: CanResize) { + const value = _get(item, 'canResize') !== undefined ? _get(item, 'canResize') : canResize return value === 'right' || value === 'both' || value === true } -export default class Items extends Component { - static propTypes = { - groups: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).isRequired, - items: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).isRequired, - - canvasTimeStart: PropTypes.number.isRequired, - canvasTimeEnd: PropTypes.number.isRequired, - canvasWidth: PropTypes.number.isRequired, - - dragSnap: PropTypes.number, - minResizeWidth: PropTypes.number, - selectedItem: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - - canChangeGroup: PropTypes.bool.isRequired, - canMove: PropTypes.bool.isRequired, - canResize: PropTypes.oneOf([true, false, 'left', 'right', 'both']), - canSelect: PropTypes.bool, - - keys: PropTypes.object.isRequired, - - moveResizeValidator: PropTypes.func, - itemSelect: PropTypes.func, - itemDrag: PropTypes.func, - itemDrop: PropTypes.func, - itemResizing: PropTypes.func, - itemResized: PropTypes.func, - - onItemDoubleClick: PropTypes.func, - onItemContextMenu: PropTypes.func, - - itemRenderer: PropTypes.func, - selected: PropTypes.array, - - dimensionItems: PropTypes.array, - groupTops: PropTypes.array, - useResizeHandle: PropTypes.bool, - scrollRef: PropTypes.object - } - - static defaultProps = { - selected: [] - } - - shouldComponentUpdate(nextProps) { +export default class Items> extends Component< + ItemsProps, + ItemsState +> { + shouldComponentUpdate(nextProps: ItemsProps) { return !( arraysEqual(nextProps.groups, this.props.groups) && arraysEqual(nextProps.items, this.props.items) && @@ -77,74 +72,53 @@ export default class Items extends Component { nextProps.canChangeGroup === this.props.canChangeGroup && nextProps.canMove === this.props.canMove && nextProps.canResize === this.props.canResize && - nextProps.canSelect === this.props.canSelect + nextProps.canSelect === this.props.canSelect ) } - isSelected(item, itemIdKey) { + isSelected(item: CustomItem, itemIdKey: string) { if (!this.props.selected) { return this.props.selectedItem === _get(item, itemIdKey) } else { - let target = _get(item, itemIdKey) + const target = _get(item, itemIdKey) as string | number return this.props.selected.includes(target) } } - getVisibleItems(canvasTimeStart, canvasTimeEnd) { + getVisibleItems(canvasTimeStart: number, canvasTimeEnd: number) { const { keys, items } = this.props return getVisibleItems(items, canvasTimeStart, canvasTimeEnd, keys) } render() { - const { - canvasTimeStart, - canvasTimeEnd, - dimensionItems, - keys, - groups - } = this.props + const { canvasTimeStart, canvasTimeEnd, dimensionItems, keys, groups } = this.props const { itemIdKey, itemGroupKey } = keys const groupOrders = getGroupOrders(groups, keys) - const visibleItems = this.getVisibleItems( - canvasTimeStart, - canvasTimeEnd, - groupOrders - ) + const visibleItems = this.getVisibleItems(canvasTimeStart, canvasTimeEnd) const sortedDimensionItems = keyBy(dimensionItems, 'id') return (
{visibleItems - .filter(item => sortedDimensionItems[_get(item, itemIdKey)]) - .map(item => ( + .filter((item) => sortedDimensionItems[_get(item, itemIdKey)]) + .map((item) => ( { - const { left: leftResizeProps, right: rightResizeProps } = getResizeProps() - return ( -
- {itemContext.useResizeHandle ?
: ''} - -
- {itemContext.title} -
- - {itemContext.useResizeHandle ?
: ''} -
- ) -} - -// TODO: update this to actual prop types. Too much to change before release -// future me, forgive me. -defaultItemRenderer.propTypes = { - item: PropTypes.any, - itemContext: PropTypes.any, - getItemProps: PropTypes.any, - getResizeProps: PropTypes.any -} diff --git a/src/lib/items/defaultItemRenderer.tsx b/src/lib/items/defaultItemRenderer.tsx new file mode 100644 index 000000000..55a477f35 --- /dev/null +++ b/src/lib/items/defaultItemRenderer.tsx @@ -0,0 +1,25 @@ +import { HTMLAttributes } from 'react' +import { GetItemPropsParams, GetResizeProps, ItemProps } from './Item' +import { ItemContext, TimelineItemBase } from '../types/main' + +type Props> = { + item: ItemProps + itemContext: ItemContext + getItemProps: (p?: GetItemPropsParams) => HTMLAttributes + getResizeProps: GetResizeProps +} + +export function defaultItemRenderer>({ item, itemContext, getItemProps, getResizeProps }: Props) { + const { left: leftResizeProps, right: rightResizeProps } = getResizeProps() + return ( +
+ {itemContext.useResizeHandle ?
: ''} + +
+ {itemContext.title} +
+ + {itemContext.useResizeHandle ?
: ''} +
+ ) +} diff --git a/src/lib/items/styles.js b/src/lib/items/styles.js deleted file mode 100644 index 7c247e882..000000000 --- a/src/lib/items/styles.js +++ /dev/null @@ -1,53 +0,0 @@ - export const overridableStyles = { - fontSize: 12, - color: 'white', - cursor: 'pointer', - background: '#2196f3', - border: '1px solid #1a6fb3', - zIndex: 80 -} -export const selectedStyle = { - background: '#ffc107', - border: '1px solid #ff9800', - zIndex: 82 -} -export const selectedAndCanMove = { - cursor: 'move' -} -export const selectedAndCanResizeLeft = { - borderLeftWidth: 3 -} -export const selectedAndCanResizeLeftAndDragLeft = { - cursor: 'w-resize' -} -export const selectedAndCanResizeRight = { - borderRightWidth: 3 -} -export const selectedAndCanResizeRightAndDragRight = { - cursor: 'e-resize' -} - -export const leftResizeStyle = { - position: "absolute", - width: 24, - maxWidth: "20%", - minWidth: 2, - height: "100%", - top: 0, - left: 0, - cursor: "pointer", - zIndex: 88, - } - - - export const rightResizeStyle = { - position: "absolute", - width: 24, - maxWidth: "20%", - minWidth: 2, - height: "100%", - top: 0, - right: 0, - cursor: "pointer", - zIndex: 88, - } diff --git a/src/lib/items/styles.ts b/src/lib/items/styles.ts new file mode 100644 index 000000000..da597a1c7 --- /dev/null +++ b/src/lib/items/styles.ts @@ -0,0 +1,53 @@ +export const overridableStyles = { + fontSize: 12, + color: 'white', + cursor: 'pointer', + background: '#2196f3', + border: '1px solid #1a6fb3', + zIndex: 80, +} +export const selectedStyle = { + background: '#ffc107', + border: '1px solid #ff9800', + zIndex: 82, +} +export const selectedAndCanMove = { + willChange: 'left, top, width', + cursor: 'move', +} +export const selectedAndCanResizeLeft = { + borderLeftWidth: 3, +} +export const selectedAndCanResizeLeftAndDragLeft = { + cursor: 'w-resize', +} +export const selectedAndCanResizeRight = { + borderRightWidth: 3, +} +export const selectedAndCanResizeRightAndDragRight = { + cursor: 'e-resize', +} + +export const leftResizeStyle = { + position: 'absolute', + width: 24, + maxWidth: '20%', + minWidth: 2, + height: '100%', + top: 0, + left: 0, + cursor: 'pointer', + zIndex: 88, +} + +export const rightResizeStyle = { + position: 'absolute', + width: 24, + maxWidth: '20%', + minWidth: 2, + height: '100%', + top: 0, + right: 0, + cursor: 'pointer', + zIndex: 88, +} diff --git a/src/lib/layout/Sidebar.js b/src/lib/layout/Sidebar.js deleted file mode 100644 index 399e9316f..000000000 --- a/src/lib/layout/Sidebar.js +++ /dev/null @@ -1,85 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' - -import { _get, arraysEqual } from '../utility/generic' - -export default class Sidebar extends Component { - static propTypes = { - groups: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).isRequired, - width: PropTypes.number.isRequired, - height: PropTypes.number.isRequired, - groupHeights: PropTypes.array.isRequired, - keys: PropTypes.object.isRequired, - groupRenderer: PropTypes.func, - isRightSidebar: PropTypes.bool, - } - - shouldComponentUpdate(nextProps) { - return !( - nextProps.keys === this.props.keys && - nextProps.width === this.props.width && - nextProps.height === this.props.height && - arraysEqual(nextProps.groups, this.props.groups) && - arraysEqual(nextProps.groupHeights, this.props.groupHeights) - ) - } - - renderGroupContent(group, isRightSidebar, groupTitleKey, groupRightTitleKey) { - if (this.props.groupRenderer) { - return React.createElement(this.props.groupRenderer, { - group, - isRightSidebar - }) - } else { - return _get(group, isRightSidebar ? groupRightTitleKey : groupTitleKey) - } - } - - render() { - const { width, groupHeights, height, isRightSidebar } = this.props - - const { groupIdKey, groupTitleKey, groupRightTitleKey } = this.props.keys - - const sidebarStyle = { - width: `${width}px`, - height: `${height}px` - } - - const groupsStyle = { - width: `${width}px` - } - - let groupLines = this.props.groups.map((group, index) => { - const elementStyle = { - height: `${groupHeights[index]}px`, - lineHeight: `${groupHeights[index]}px` - } - - return ( -
- {this.renderGroupContent( - group, - isRightSidebar, - groupTitleKey, - groupRightTitleKey - )} -
- ) - }) - - return ( -
-
{groupLines}
-
- ) - } -} diff --git a/src/lib/layout/Sidebar.tsx b/src/lib/layout/Sidebar.tsx new file mode 100644 index 000000000..4d42524bd --- /dev/null +++ b/src/lib/layout/Sidebar.tsx @@ -0,0 +1,65 @@ +import React, { Component } from 'react' + +import { _get, arraysEqual } from '../utility/generic' +import { ReactCalendarGroupRendererProps, TimelineGroupBase, TimelineKeys } from '../types/main' + +type Props = { + groups: CustomGroup[] + width: number + height: number + groupHeights: number[] + keys: TimelineKeys + groupRenderer?: (props: ReactCalendarGroupRendererProps) => React.ReactNode + isRightSidebar?: boolean +} + +export default class Sidebar extends Component> { + shouldComponentUpdate(nextProps: Props) { + return !(nextProps.keys === this.props.keys && nextProps.width === this.props.width && nextProps.height === this.props.height && arraysEqual(nextProps.groups, this.props.groups) && arraysEqual(nextProps.groupHeights, this.props.groupHeights)) + } + + renderGroupContent(group: CustomGroup, isRightSidebar: boolean = false, groupTitleKey: string, groupRightTitleKey: string) { + if (this.props.groupRenderer) { + return React.createElement(this.props.groupRenderer, { + group, + isRightSidebar, + }) + } else { + return _get(group, isRightSidebar ? groupRightTitleKey : groupTitleKey) + } + } + + render() { + const { width, groupHeights, height, isRightSidebar } = this.props + + const { groupIdKey, groupTitleKey, groupRightTitleKey } = this.props.keys + + const sidebarStyle = { + width: `${width}px`, + height: `${height}px`, + } + + const groupsStyle = { + width: `${width}px`, + } + + const groupLines = this.props.groups.map((group, index) => { + const elementStyle = { + height: `${groupHeights[index]}px`, + lineHeight: `${groupHeights[index]}px`, + } + + return ( +
+ {this.renderGroupContent(group, isRightSidebar, groupTitleKey, groupRightTitleKey)} +
+ ) + }) + + return ( +
+
{groupLines}
+
+ ) + } +} diff --git a/src/lib/markers/MarkerCanvas.js b/src/lib/markers/MarkerCanvas.tsx similarity index 60% rename from src/lib/markers/MarkerCanvas.js rename to src/lib/markers/MarkerCanvas.tsx index d41750c95..6ee91e2c9 100644 --- a/src/lib/markers/MarkerCanvas.js +++ b/src/lib/markers/MarkerCanvas.tsx @@ -1,33 +1,39 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { MarkerCanvasProvider } from './MarkerCanvasContext' +import React, { MouseEventHandler, PropsWithChildren } from 'react' +import { + MarkerCanvasContext, + MarkerCanvasProvider, +} from './MarkerCanvasContext' import TimelineMarkersRenderer from './TimelineMarkersRenderer' import { TimelineStateConsumer } from '../timeline/TimelineStateContext' // expand to fill entire parent container (ScrollElement) -const staticStyles = { +const staticStyles: React.CSSProperties = { position: 'absolute', left: 0, right: 0, top: 0, - bottom: 0 + bottom: 0, +} + +type MarkerCanvasProps = { + getDateFromLeftOffsetPosition: (offset: number) => number } /** * Renders registered markers and exposes a mouse over listener for * CursorMarkers to subscribe to */ -class MarkerCanvas extends React.Component { - static propTypes = { - getDateFromLeftOffsetPosition: PropTypes.func.isRequired, - children: PropTypes.node - } - - handleMouseMove = evt => { - if (this.subscription != null) { +class MarkerCanvas extends React.Component< + PropsWithChildren +> { + handleMouseMove: MouseEventHandler = (evt) => { + if (this.subscription !== null) { const { pageX } = evt // FIXME: dont use getBoundingClientRect. Use passed in scroll amount - const { left: containerLeft } = this.containerEl.getBoundingClientRect() + const { left: containerLeft } = + this.containerEl.current?.getBoundingClientRect() ?? { + left: 0, + } // number of pixels from left we are on canvas // we do this calculation as pageX is based on x from viewport whereas @@ -39,29 +45,34 @@ class MarkerCanvas extends React.Component { this.subscription({ leftOffset: canvasX, date, - isCursorOverCanvas: true + isCursorOverCanvas: true, }) } } - handleMouseLeave = () => { - if (this.subscription != null) { + handleMouseLeave: MouseEventHandler = () => { + if (this.subscription !== null) { // tell subscriber that we're not on canvas this.subscription({ leftOffset: 0, date: 0, isCursorOverCanvas: false }) } } - handleMouseMoveSubscribe = sub => { + handleMouseMoveSubscribe: MarkerCanvasContext['subscribeToMouseOver'] = ( + sub, + ) => { this.subscription = sub return () => { this.subscription = null } } - state = { - subscribeToMouseOver: this.handleMouseMoveSubscribe + state: MarkerCanvasContext = { + subscribeToMouseOver: this.handleMouseMoveSubscribe, } + containerEl = React.createRef() + private subscription: ((s: any) => void) | null = null + render() { return ( @@ -69,7 +80,7 @@ class MarkerCanvas extends React.Component { style={staticStyles} onMouseMove={this.handleMouseMove} onMouseLeave={this.handleMouseLeave} - ref={el => (this.containerEl = el)} + ref={this.containerEl} > {this.props.children} @@ -79,7 +90,9 @@ class MarkerCanvas extends React.Component { } } -const MarkerCanvasWrapper = props => ( +const MarkerCanvasWrapper = ( + props: Omit, +) => ( {({ getDateFromLeftOffsetPosition }) => ( { - console.warn('"subscribeToMouseOver" default func is being used') - } -} -/* eslint-enable */ - -const { Consumer, Provider } = createReactContext(defaultContextState) - -export const MarkerCanvasProvider = Provider -export const MarkerCanvasConsumer = Consumer diff --git a/src/lib/markers/MarkerCanvasContext.ts b/src/lib/markers/MarkerCanvasContext.ts new file mode 100644 index 000000000..3b93f62d0 --- /dev/null +++ b/src/lib/markers/MarkerCanvasContext.ts @@ -0,0 +1,27 @@ +import React from 'react' + +const defaultContextState = { + subscribeToMouseOver: () => { + console.warn('"subscribeToMouseOver" default func is being used') + return () => {} + }, +} + +export type HandleCanvasMouseOver = ({ + leftOffset, + date, + isCursorOverCanvas, +}: { + leftOffset: number + date: number + isCursorOverCanvas: boolean +}) => void +export type MarkerCanvasContext = { + subscribeToMouseOver: (p: HandleCanvasMouseOver) => () => void +} + +const { Consumer, Provider } = + React.createContext(defaultContextState) + +export const MarkerCanvasProvider = Provider +export const MarkerCanvasConsumer = Consumer diff --git a/src/lib/markers/TimelineMarkersContext.js b/src/lib/markers/TimelineMarkersContext.js deleted file mode 100644 index 474a36e28..000000000 --- a/src/lib/markers/TimelineMarkersContext.js +++ /dev/null @@ -1,82 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import createReactContext from 'create-react-context' -import { noop } from '../utility/generic' - -const defaultContextState = { - markers: [], - subscribeMarker: () => { - // eslint-disable-next-line - console.warn('default subscribe marker used') - return noop - } -} - -const { Consumer, Provider } = createReactContext(defaultContextState) - -// REVIEW: is this the best way to manage ids? -let _id = 0 -const createId = () => { - _id += 1 - return _id + 1 -} - -export class TimelineMarkersProvider extends React.Component { - static propTypes = { - children: PropTypes.element.isRequired - } - - handleSubscribeToMarker = newMarker => { - newMarker = { - ...newMarker, - // REVIEW: in the event that we accept id to be passed to the Marker components, this line would override those - id: createId() - } - - this.setState(state => { - return { - markers: [...state.markers, newMarker] - } - }) - return { - unsubscribe: () => { - this.setState(state => { - return { - markers: state.markers.filter(marker => marker.id !== newMarker.id) - } - }) - }, - getMarker: () => { - return newMarker - } - } - } - - handleUpdateMarker = updateMarker => { - const markerIndex = this.state.markers.findIndex( - marker => marker.id === updateMarker.id - ) - if (markerIndex < 0) return - this.setState(state => { - return { - markers: [ - ...state.markers.slice(0, markerIndex), - updateMarker, - ...state.markers.slice(markerIndex + 1) - ] - } - }) - } - - state = { - markers: [], - subscribeMarker: this.handleSubscribeToMarker, - updateMarker: this.handleUpdateMarker - } - - render() { - return {this.props.children} - } -} - -export const TimelineMarkersConsumer = Consumer diff --git a/src/lib/markers/TimelineMarkersContext.tsx b/src/lib/markers/TimelineMarkersContext.tsx new file mode 100644 index 000000000..66738c1e9 --- /dev/null +++ b/src/lib/markers/TimelineMarkersContext.tsx @@ -0,0 +1,103 @@ +import React, { PropsWithChildren } from 'react' +import { noop } from '../utility/generic' +import { MarkerType } from './markerType' + +export type SubscribeReturn = { + unsubscribe: () => void + getMarker: () => MarkerType +} +type TimelineMarkersContextValue = { + markers: MarkerType[] + subscribeMarker: (newe: MarkerType) => SubscribeReturn; + updateMarker: (upd: MarkerType) => void +} + +const defaultContextState: TimelineMarkersContextValue = { + markers: [], + subscribeMarker: () => { + // eslint-disable-next-line + console.warn('default subscribe marker used') + return { + unsubscribe: noop, + getMarker: noop + } as SubscribeReturn + }, + updateMarker: () => { + // eslint-disable-next-line + console.warn('default subscribe marker used') + return noop + }, +} + +const { Consumer, Provider } = + React.createContext(defaultContextState) + +// REVIEW: is this the best way to manage ids? +let _id = 0 +const createId = () => { + _id += 1 + return _id + 1 +} + +export class TimelineMarkersProvider extends React.Component< + PropsWithChildren, + TimelineMarkersContextValue +> { + handleSubscribeToMarker = (newMarker: MarkerType): SubscribeReturn => { + newMarker = { + ...newMarker, + // REVIEW: in the event that we accept id to be passed to the Marker components, this line would override those + id: createId(), + } + + this.setState((state) => { + return { + markers: [...state.markers, newMarker], + } + }) + return { + unsubscribe: () => { + this.setState((state) => { + return { + markers: state.markers.filter( + (marker) => marker.id !== newMarker.id, + ), + } + }) + }, + getMarker: () => { + return newMarker + }, + } + } + + handleUpdateMarker = (updateMarker: MarkerType) => { + const markerIndex = this.state.markers.findIndex( + (marker) => marker.id === updateMarker.id, + ) + if (markerIndex < 0) return + this.setState((state) => { + return { + markers: [ + ...state.markers.slice(0, markerIndex), + updateMarker, + ...state.markers.slice(markerIndex + 1), + ], + } + }) + } + constructor(props: any) { + super(props) + this.state = { + markers: [], + subscribeMarker: this.handleSubscribeToMarker, + updateMarker: this.handleUpdateMarker, + } + } + + render() { + return {this.props.children} + } +} + +export const TimelineMarkersConsumer = Consumer diff --git a/src/lib/markers/TimelineMarkersRenderer.js b/src/lib/markers/TimelineMarkersRenderer.tsx similarity index 67% rename from src/lib/markers/TimelineMarkersRenderer.js rename to src/lib/markers/TimelineMarkersRenderer.tsx index db96f6496..5e29368c2 100644 --- a/src/lib/markers/TimelineMarkersRenderer.js +++ b/src/lib/markers/TimelineMarkersRenderer.tsx @@ -1,4 +1,3 @@ -import React from 'react' import { TimelineMarkersConsumer } from './TimelineMarkersContext' import { TimelineMarkerType } from './markerType' import TodayMarker from './implementations/TodayMarker' @@ -10,26 +9,42 @@ import CursorMarker from './implementations/CursorMarker' const TimelineMarkersRenderer = () => { return ( - {({ getLeftOffsetFromDate }) => ( + {({ getLeftOffsetFromDate, getTimelineState }) => ( {({ markers }) => { - return markers.map(marker => { + const timelineState = getTimelineState() + return markers.map((marker) => { switch (marker.type) { case TimelineMarkerType.Today: + if ( + !( + new Date().valueOf() >= timelineState.canvasTimeStart && + new Date().valueOf() <= timelineState.canvasTimeEnd + ) + ) + return null return ( ) case TimelineMarkerType.Custom: + //filter out cursors outside canvas start/end + if ( + !( + marker.date! >= timelineState.canvasTimeStart && + marker.date! <= timelineState.canvasTimeEnd + ) + ) + return null return ( ) diff --git a/src/lib/markers/implementations/CursorMarker.js b/src/lib/markers/implementations/CursorMarker.tsx similarity index 51% rename from src/lib/markers/implementations/CursorMarker.js rename to src/lib/markers/implementations/CursorMarker.tsx index cc628090e..90be5aeed 100644 --- a/src/lib/markers/implementations/CursorMarker.js +++ b/src/lib/markers/implementations/CursorMarker.tsx @@ -1,13 +1,26 @@ import React from 'react' -import PropTypes from 'prop-types' -import { - createMarkerStylesWithLeftOffset, - createDefaultRenderer -} from './shared' -import { MarkerCanvasConsumer } from '../MarkerCanvasContext' +import { createMarkerStylesWithLeftOffset, createDefaultRenderer } from './shared' +import { HandleCanvasMouseOver, MarkerCanvasConsumer } from '../MarkerCanvasContext' +import { MarkerRendererType } from '../markerType' const defaultRenderer = createDefaultRenderer('default-cursor-marker') +type CursorMarkerWrapperProps = { + getLeftOffsetFromDate: (date: number) => number + renderer?: MarkerRendererType + //interval: number +} + +type CursorMarkerProps = CursorMarkerWrapperProps & { + subscribeToCanvasMouseOver: (p: HandleCanvasMouseOver) => () => void +} + +type CursorMarkerStat = { + leftOffset: number + date: number + isShowingCursor: boolean +} + /** * CursorMarker implementation subscribes to 'subscribeToCanvasMouseOver' on mount. * This subscription is passed in via MarkerCanvasConsumer, which is wired up to @@ -18,44 +31,38 @@ const defaultRenderer = createDefaultRenderer('default-cursor-marker') * isCursorOverCanvas - whether the user cursor is over the canvas. This is set to 'false' * when the user mouseleaves the element */ -class CursorMarker extends React.Component { - static propTypes = { - subscribeToCanvasMouseOver: PropTypes.func.isRequired, - renderer: PropTypes.func - } - - static defaultProps = { - renderer: defaultRenderer +class CursorMarker extends React.Component { + public static defaultProps = { + renderer: defaultRenderer, } - constructor() { - super() + constructor(props: any) { + super(props) this.state = { leftOffset: 0, date: 0, - isShowingCursor: false + isShowingCursor: false, } } - handleCanvasMouseOver = ({ leftOffset, date, isCursorOverCanvas }) => { + handleCanvasMouseOver = ({ leftOffset, date, isCursorOverCanvas }: { leftOffset: number; date: number; isCursorOverCanvas: boolean }) => { this.setState({ leftOffset, date, - isShowingCursor: isCursorOverCanvas + isShowingCursor: isCursorOverCanvas, }) } + private unsubscribe?: ReturnType componentDidMount() { - this.unsubscribe = this.props.subscribeToCanvasMouseOver( - this.handleCanvasMouseOver - ) + this.unsubscribe = this.props.subscribeToCanvasMouseOver(this.handleCanvasMouseOver) } componentWillUnmount() { - if (this.unsubscribe != null) { + if (this.unsubscribe) { this.unsubscribe() - this.unsubscribe = null + this.unsubscribe = undefined } } @@ -65,22 +72,16 @@ class CursorMarker extends React.Component { if (!isShowingCursor) return null const styles = createMarkerStylesWithLeftOffset(leftOffset) - + if(!this.props.renderer)return null; return this.props.renderer({ styles, date }) } } -// TODO: turn into HOC? -const CursorMarkerWrapper = props => { +const CursorMarkerWrapper = (props: CursorMarkerWrapperProps) => { return ( {({ subscribeToMouseOver }) => { - return ( - - ) + return }} ) diff --git a/src/lib/markers/implementations/CustomMarker.js b/src/lib/markers/implementations/CustomMarker.js deleted file mode 100644 index a72f750be..000000000 --- a/src/lib/markers/implementations/CustomMarker.js +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { - createMarkerStylesWithLeftOffset, - createDefaultRenderer -} from './shared' - -const defaultCustomMarkerRenderer = createDefaultRenderer( - 'default-customer-marker-id' -) -/** - * CustomMarker that is placed based on passed in date prop - */ -class CustomMarker extends React.Component { - static propTypes = { - getLeftOffsetFromDate: PropTypes.func.isRequired, - renderer: PropTypes.func, - date: PropTypes.number.isRequired - } - - static defaultProps = { - renderer: defaultCustomMarkerRenderer - } - render() { - const { date } = this.props - const leftOffset = this.props.getLeftOffsetFromDate(date) - - const styles = createMarkerStylesWithLeftOffset(leftOffset) - return this.props.renderer({ styles, date }) - } -} - -export default CustomMarker diff --git a/src/lib/markers/implementations/CustomMarker.tsx b/src/lib/markers/implementations/CustomMarker.tsx new file mode 100644 index 000000000..96f5072c7 --- /dev/null +++ b/src/lib/markers/implementations/CustomMarker.tsx @@ -0,0 +1,28 @@ +import React from 'react' +import { createMarkerStylesWithLeftOffset, createDefaultRenderer } from './shared' +import { MarkerRendererType } from '../markerType' + +const defaultCustomMarkerRenderer = createDefaultRenderer('default-customer-marker-id') +type CustomMarkerProps = { + date: number + getLeftOffsetFromDate: (date: number) => number + renderer: MarkerRendererType +} + +/** + * CustomMarker that is placed based on passed in date prop + */ +class CustomMarker extends React.Component { + public static defaultProps = { + renderer: defaultCustomMarkerRenderer, + } + render() { + const { date } = this.props + const leftOffset = this.props.getLeftOffsetFromDate(date) + + const styles = createMarkerStylesWithLeftOffset(leftOffset) + return this.props.renderer({ styles, date }) + } +} + +export default CustomMarker diff --git a/src/lib/markers/implementations/TodayMarker.js b/src/lib/markers/implementations/TodayMarker.tsx similarity index 62% rename from src/lib/markers/implementations/TodayMarker.js rename to src/lib/markers/implementations/TodayMarker.tsx index 5f243fe51..fd5040b3c 100644 --- a/src/lib/markers/implementations/TodayMarker.js +++ b/src/lib/markers/implementations/TodayMarker.tsx @@ -1,47 +1,48 @@ import React from 'react' -import PropTypes from 'prop-types' import { createMarkerStylesWithLeftOffset, - createDefaultRenderer + createDefaultRenderer, } from './shared' +import { MarkerRendererType } from '../markerType' const defaultRenderer = createDefaultRenderer('default-today-line') +type TodayMarkerProps = { + getLeftOffsetFromDate: (date: number) => number + renderer: MarkerRendererType + interval: number +} + /** Marker that is placed based on current date. This component updates itself on * a set interval, dictated by the 'interval' prop. */ -class TodayMarker extends React.Component { - static propTypes = { - getLeftOffsetFromDate: PropTypes.func.isRequired, - renderer: PropTypes.func, - interval: PropTypes.number.isRequired - } - - static defaultProps = { - renderer: defaultRenderer +class TodayMarker extends React.Component { + public static defaultProps = { + renderer: defaultRenderer, } state = { - date: Date.now() + date: Date.now(), } + private intervalToken: NodeJS.Timeout | undefined componentDidMount() { this.intervalToken = this.createIntervalUpdater(this.props.interval) } - componentDidUpdate(prevProps) { + componentDidUpdate(prevProps: TodayMarkerProps) { if (prevProps.interval !== this.props.interval) { clearInterval(this.intervalToken) this.intervalToken = this.createIntervalUpdater(this.props.interval) } } - createIntervalUpdater(interval) { + createIntervalUpdater(interval: number) { return setInterval(() => { this.setState({ - date: Date.now() // FIXME: use date utils pass in as props - }); - }, interval); + date: Date.now(), // FIXME: use date utils pass in as props + }) + }, interval) } componentWillUnmount() { diff --git a/src/lib/markers/implementations/shared.js b/src/lib/markers/implementations/shared.tsx similarity index 61% rename from src/lib/markers/implementations/shared.js rename to src/lib/markers/implementations/shared.tsx index 17855e791..e6ec20b3a 100644 --- a/src/lib/markers/implementations/shared.js +++ b/src/lib/markers/implementations/shared.tsx @@ -3,7 +3,7 @@ import React from 'react' /** * Baseline styles to get the marker to render correctly */ -const criticalStyles = { +const criticalStyles: React.CSSProperties = { position: 'absolute', top: 0, bottom: 0, @@ -12,19 +12,23 @@ const criticalStyles = { // by default, pointer events (specifically click) will // "pass through". This is added so that CursorMarker // will not get in the way of canvas click - pointerEvents: 'none' + pointerEvents: 'none', } // FIXME: this creates a new object each time in render // might want to memoize this? -export const createMarkerStylesWithLeftOffset = leftOffset => ({ +export const createMarkerStylesWithLeftOffset = (leftOffset: number) => ({ ...criticalStyles, - left: leftOffset + left: leftOffset, }) -export const createDefaultRenderer = dataTestidValue => { +export const createDefaultRenderer = (dataTestidValue: string | undefined) => { // eslint-disable-next-line - return function DefaultMarkerRenderer({ styles }) { + return function DefaultMarkerRenderer({ + styles, + }: { + styles: React.CSSProperties + }) { return
} } diff --git a/src/lib/markers/markerType.js b/src/lib/markers/markerType.js deleted file mode 100644 index d85af0439..000000000 --- a/src/lib/markers/markerType.js +++ /dev/null @@ -1,5 +0,0 @@ -export const TimelineMarkerType = { - Today: 'Today', - Custom: 'Custom', - Cursor: 'Cursor' -} diff --git a/src/lib/markers/markerType.ts b/src/lib/markers/markerType.ts new file mode 100644 index 000000000..ef3954c8c --- /dev/null +++ b/src/lib/markers/markerType.ts @@ -0,0 +1,18 @@ +import React, { ReactNode } from 'react' + +export enum TimelineMarkerType { + Today = 'Today', + Custom = 'Custom', + Cursor = 'Cursor', +} + +export type MarkerType = { + date?: number + type: TimelineMarkerType + renderer?: MarkerRendererType + interval?: number + id?: number +} + +export type MarkerRendererTypeProps = { styles: React.CSSProperties; date: number } +export type MarkerRendererType = ({ styles, date }: MarkerRendererTypeProps) => ReactNode diff --git a/src/lib/markers/public/CursorMarker.js b/src/lib/markers/public/CursorMarker.js deleted file mode 100644 index ef4318272..000000000 --- a/src/lib/markers/public/CursorMarker.js +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { TimelineMarkersConsumer } from '../TimelineMarkersContext' -import { TimelineMarkerType } from '../markerType' - -class CursorMarker extends React.Component { - static propTypes = { - subscribeMarker: PropTypes.func.isRequired, - children: PropTypes.func - } - - componentDidMount() { - const { unsubscribe } = this.props.subscribeMarker({ - type: TimelineMarkerType.Cursor, - renderer: this.props.children - }) - this.unsubscribe = unsubscribe - } - - componentWillUnmount() { - if (this.unsubscribe != null) { - this.unsubscribe() - this.unsubscribe = null - } - } - render() { - return null - } -} - -// TODO: turn into HOC? -const CursorMarkerWrapper = props => { - return ( - - {({ subscribeMarker }) => ( - - )} - - ) -} - -CursorMarkerWrapper.displayName = 'CursorMarkerWrapper' - -export default CursorMarkerWrapper diff --git a/src/lib/markers/public/CursorMarker.tsx b/src/lib/markers/public/CursorMarker.tsx new file mode 100644 index 000000000..791e12dc2 --- /dev/null +++ b/src/lib/markers/public/CursorMarker.tsx @@ -0,0 +1,38 @@ +import { Component } from 'react' +import { SubscribeReturn, TimelineMarkersConsumer } from '../TimelineMarkersContext' +import { MarkerRendererType, MarkerType, TimelineMarkerType } from '../markerType' + +export type CursorMarkerProps = { + subscribeMarker: (m: MarkerType) => SubscribeReturn + children: MarkerRendererType +} +class CursorMarker extends Component { + private unsubscribe: (() => void) | null = null + componentDidMount() { + const { unsubscribe } = this.props.subscribeMarker({ + type: TimelineMarkerType.Cursor, + renderer: this.props.children, + }) + this.unsubscribe = unsubscribe + } + + componentWillUnmount() { + if (this.unsubscribe != null) { + this.unsubscribe() + this.unsubscribe = null + } + } + render() { + return null + } +} + +// TODO: turn into HOC? + +const CursorMarkerWrapper = (props: Pick) => { + return {({ subscribeMarker }) => } +} + +CursorMarkerWrapper.displayName = 'CursorMarkerWrapper' + +export default CursorMarkerWrapper diff --git a/src/lib/markers/public/CustomMarker.js b/src/lib/markers/public/CustomMarker.tsx similarity index 56% rename from src/lib/markers/public/CustomMarker.js rename to src/lib/markers/public/CustomMarker.tsx index bf2b0fcf3..fa707e0f5 100644 --- a/src/lib/markers/public/CustomMarker.js +++ b/src/lib/markers/public/CustomMarker.tsx @@ -1,17 +1,27 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { TimelineMarkersConsumer } from '../TimelineMarkersContext' -import { TimelineMarkerType } from '../markerType' - -class CustomMarker extends React.Component { - static propTypes = { - subscribeMarker: PropTypes.func.isRequired, - updateMarker: PropTypes.func.isRequired, - children: PropTypes.func, - date: PropTypes.number.isRequired - } +import { Component } from 'react' +import { + SubscribeReturn, + TimelineMarkersConsumer, +} from '../TimelineMarkersContext' +import { + MarkerRendererType, + MarkerType, + TimelineMarkerType, +} from '../markerType' + +type noop = () => any - componentDidUpdate(prevProps) { +type CustomMarkerProps = { + date: number + children: MarkerRendererType + updateMarker: (marker: MarkerType) => void + subscribeMarker: (newe: MarkerType) => SubscribeReturn +} +class CustomMarker extends Component { + private unsubscribe: noop | null = null + private getMarker: noop | null = null + + componentDidUpdate(prevProps: CustomMarkerProps) { if (prevProps.date !== this.props.date && this.getMarker) { const marker = this.getMarker() this.props.updateMarker({ ...marker, date: this.props.date }) @@ -22,7 +32,7 @@ class CustomMarker extends React.Component { const { unsubscribe, getMarker } = this.props.subscribeMarker({ type: TimelineMarkerType.Custom, renderer: this.props.children, - date: this.props.date + date: this.props.date, }) this.unsubscribe = unsubscribe this.getMarker = getMarker @@ -40,8 +50,10 @@ class CustomMarker extends React.Component { } } +type Props = Pick + // TODO: turn into HOC? -const CustomMarkerWrapper = props => { +const CustomMarkerWrapper = (props: Props) => { return ( {({ subscribeMarker, updateMarker }) => ( diff --git a/src/lib/markers/public/TimelineMarkers.js b/src/lib/markers/public/TimelineMarkers.tsx similarity index 78% rename from src/lib/markers/public/TimelineMarkers.js rename to src/lib/markers/public/TimelineMarkers.tsx index bbc6377b6..bf9538740 100644 --- a/src/lib/markers/public/TimelineMarkers.js +++ b/src/lib/markers/public/TimelineMarkers.tsx @@ -12,8 +12,13 @@ */ +import { ReactNode } from 'react' + +type Props = { + children?: ReactNode +} // If we decide to pass in props to TimelineMarkers, then yes, this is necessary. -const TimelineMarkers = props => { +const TimelineMarkers = (props: Props) => { return props.children || null } diff --git a/src/lib/markers/public/TodayMarker.js b/src/lib/markers/public/TodayMarker.js deleted file mode 100644 index b58c24e95..000000000 --- a/src/lib/markers/public/TodayMarker.js +++ /dev/null @@ -1,63 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { TimelineMarkersConsumer } from '../TimelineMarkersContext' -import { TimelineMarkerType } from '../markerType' - -class TodayMarker extends React.Component { - static propTypes = { - subscribeMarker: PropTypes.func.isRequired, - updateMarker: PropTypes.func.isRequired, - interval: PropTypes.number, - children: PropTypes.func - } - - static defaultProps = { - interval: 1000 * 10 // default to ten seconds - } - - componentDidMount() { - const { unsubscribe, getMarker } = this.props.subscribeMarker({ - type: TimelineMarkerType.Today, - renderer: this.props.children, - interval: this.props.interval - }) - this.unsubscribe = unsubscribe - this.getMarker = getMarker - } - - componentWillUnmount() { - if (this.unsubscribe != null) { - this.unsubscribe() - this.unsubscribe = null - } - } - - componentDidUpdate(prevProps) { - if (prevProps.interval !== this.props.interval && this.getMarker) { - const marker = this.getMarker() - this.props.updateMarker({ - ...marker, - interval: this.props.interval, - }) - } - } - - render() { - return null - } -} - -// TODO: turn into HOC? -const TodayMarkerWrapper = props => { - return ( - - {({ subscribeMarker, updateMarker }) => ( - - )} - - ) -} - -TodayMarkerWrapper.displayName = 'TodayMarkerWrapper' - -export default TodayMarkerWrapper diff --git a/src/lib/markers/public/TodayMarker.tsx b/src/lib/markers/public/TodayMarker.tsx new file mode 100644 index 000000000..182ff2317 --- /dev/null +++ b/src/lib/markers/public/TodayMarker.tsx @@ -0,0 +1,58 @@ +import React from 'react' +import { SubscribeReturn, TimelineMarkersConsumer } from '../TimelineMarkersContext' +import { MarkerRendererType, MarkerType, TimelineMarkerType } from '../markerType' + +export type TodayMarkerProps = { + interval?: number + updateMarker: (marker: MarkerType) => void + subscribeMarker: (m: MarkerType) => SubscribeReturn + children?: MarkerRendererType +} + +class TodayMarker extends React.Component { + static defaultProps = { + interval: 1000 * 10, // default to ten seconds + } + private unsubscribe: (() => void) | null = null + private getMarker: (() => MarkerType) | null = null + + componentDidMount() { + const { unsubscribe, getMarker } = this.props.subscribeMarker({ + type: TimelineMarkerType.Today, + renderer: this.props.children, + interval: this.props.interval, + }) + this.unsubscribe = unsubscribe + this.getMarker = getMarker + } + + componentWillUnmount() { + if (this.unsubscribe != null) { + this.unsubscribe() + this.unsubscribe = null + } + } + + componentDidUpdate(prevProps: TodayMarkerProps) { + if (prevProps.interval !== this.props.interval && this.getMarker) { + const marker = this.getMarker() + this.props.updateMarker({ + ...marker, + interval: this.props.interval, + }) + } + } + + render() { + return null + } +} + +// TODO: turn into HOC? +const TodayMarkerWrapper = (props: Omit) => { + return {({ subscribeMarker, updateMarker }) => } +} + +TodayMarkerWrapper.displayName = 'TodayMarkerWrapper' + +export default TodayMarkerWrapper diff --git a/src/lib/row/GroupRow.js b/src/lib/row/GroupRow.js deleted file mode 100644 index 65aaa7ff3..000000000 --- a/src/lib/row/GroupRow.js +++ /dev/null @@ -1,47 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import PreventClickOnDrag from '../interaction/PreventClickOnDrag' - -class GroupRow extends Component { - static propTypes = { - onClick: PropTypes.func.isRequired, - onDoubleClick: PropTypes.func.isRequired, - onContextMenu: PropTypes.func.isRequired, - isEvenRow: PropTypes.bool.isRequired, - style: PropTypes.object.isRequired, - clickTolerance: PropTypes.number.isRequired, - group: PropTypes.object.isRequired, - horizontalLineClassNamesForGroup: PropTypes.func - } - - render() { - const { - onContextMenu, - onDoubleClick, - isEvenRow, - style, - onClick, - clickTolerance, - horizontalLineClassNamesForGroup, - group - } = this.props - - let classNamesForGroup = []; - if (horizontalLineClassNamesForGroup) { - classNamesForGroup = horizontalLineClassNamesForGroup(group); - } - - return ( - -
- - ) - } -} - -export default GroupRow diff --git a/src/lib/row/GroupRow.tsx b/src/lib/row/GroupRow.tsx new file mode 100644 index 000000000..0c0a7b9a3 --- /dev/null +++ b/src/lib/row/GroupRow.tsx @@ -0,0 +1,48 @@ +import React, { Component, MouseEventHandler } from 'react' +import PreventClickOnDrag from '../interaction/PreventClickOnDrag' + +interface GroupRowProps { + onClick: MouseEventHandler + onDoubleClick?: MouseEventHandler + onContextMenu?: MouseEventHandler + isEvenRow?: boolean + style?: React.CSSProperties + clickTolerance?: number | undefined + group: T + horizontalLineClassNamesForGroup?: (group: T) => string[] +} + +class GroupRow extends Component> { + render() { + const { + onContextMenu, + onDoubleClick, + isEvenRow, + style, + onClick, + clickTolerance, + horizontalLineClassNamesForGroup, + group, + } = this.props + + let classNamesForGroup: string[] = [] + if (horizontalLineClassNamesForGroup) { + classNamesForGroup = horizontalLineClassNamesForGroup(group) + } + + return ( + +
+ + ) + } +} + +export default GroupRow diff --git a/src/lib/row/GroupRows.js b/src/lib/row/GroupRows.tsx similarity index 55% rename from src/lib/row/GroupRows.js rename to src/lib/row/GroupRows.tsx index b7b1ae1d4..35bbc1618 100644 --- a/src/lib/row/GroupRows.js +++ b/src/lib/row/GroupRows.tsx @@ -1,21 +1,22 @@ -import PropTypes from 'prop-types' import React, { Component } from 'react' import GroupRow from './GroupRow' -export default class GroupRows extends Component { - static propTypes = { - canvasWidth: PropTypes.number.isRequired, - lineCount: PropTypes.number.isRequired, - groupHeights: PropTypes.array.isRequired, - onRowClick: PropTypes.func.isRequired, - onRowDoubleClick: PropTypes.func.isRequired, - clickTolerance: PropTypes.number.isRequired, - groups: PropTypes.array.isRequired, - horizontalLineClassNamesForGroup: PropTypes.func, - onRowContextClick: PropTypes.func.isRequired, - } +export type RowClickEvent = (evt: React.MouseEvent, index: number) => void + +export interface GroupRowsProps { + canvasWidth: number + lineCount: number + groupHeights: number[] + onRowClick: RowClickEvent + onRowDoubleClick: RowClickEvent + clickTolerance?: number + groups: T[] + horizontalLineClassNamesForGroup?: (group: T) => string[] + onRowContextClick: RowClickEvent +} - shouldComponentUpdate(nextProps) { +export default class GroupRows extends Component> { + shouldComponentUpdate(nextProps: GroupRowsProps) { return !( nextProps.canvasWidth === this.props.canvasWidth && nextProps.lineCount === this.props.lineCount && @@ -36,24 +37,24 @@ export default class GroupRows extends Component { horizontalLineClassNamesForGroup, onRowContextClick, } = this.props - let lines = [] + const lines: React.ReactNode[] = [] for (let i = 0; i < lineCount; i++) { lines.push( onRowContextClick(evt, i)} - onClick={evt => onRowClick(evt, i)} - onDoubleClick={evt => onRowDoubleClick(evt, i)} + onContextMenu={(evt) => onRowContextClick(evt, i)} + onClick={(evt) => onRowClick(evt, i)} + onDoubleClick={(evt) => onRowDoubleClick(evt, i)} key={`horizontal-line-${i}`} isEvenRow={i % 2 === 0} group={groups[i]} horizontalLineClassNamesForGroup={horizontalLineClassNamesForGroup} style={{ width: `${canvasWidth}px`, - height: `${groupHeights[i]}px` + height: `${groupHeights[i]}px`, }} - /> + />, ) } diff --git a/src/lib/scroll/ScrollElement.js b/src/lib/scroll/ScrollElement.tsx similarity index 50% rename from src/lib/scroll/ScrollElement.js rename to src/lib/scroll/ScrollElement.tsx index 5f79ae6cd..eb8b715e3 100644 --- a/src/lib/scroll/ScrollElement.js +++ b/src/lib/scroll/ScrollElement.tsx @@ -1,24 +1,32 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' +import { Component, CSSProperties, MouseEventHandler, ReactNode, TouchEventHandler } from 'react' import { getParentPosition } from '../utility/dom-helpers' -class ScrollElement extends Component { - static propTypes = { - children: PropTypes.element.isRequired, - width: PropTypes.number.isRequired, - height: PropTypes.number.isRequired, - traditionalZoom: PropTypes.bool.isRequired, - scrollRef: PropTypes.func.isRequired, - isInteractingWithItem: PropTypes.bool.isRequired, - onZoom: PropTypes.func.isRequired, - onWheelZoom: PropTypes.func.isRequired, - onScroll: PropTypes.func.isRequired - } +type Props = { + children: ReactNode + width: number + height: number + traditionalZoom: boolean + scrollRef: (e: HTMLDivElement) => void + onZoom: (n: number, m: number) => void + onWheelZoom: (speed: number, xPosition: number, deltaY: number) => void + onScroll: (n: number) => void +} + +type State = { + isDragging: boolean +} - constructor() { - super() +class ScrollElement extends Component { + scrollComponent: HTMLDivElement | null = null + private dragLastPosition: number | null = null + private lastTouchDistance: number | null = null + private singleTouchStart: { x: number; y: number; screenY: number } | null = null + private lastSingleTouch: { x: number; y: number; screenY: number } | null = null + private isItemInteraction: boolean = false + constructor(props: Props) { + super(props) this.state = { - isDragging: false + isDragging: false, } } @@ -26,28 +34,26 @@ class ScrollElement extends Component { * needed to handle scrolling with trackpad */ handleScroll = () => { - const scrollX = this.scrollComponent.scrollLeft + const scrollX = this.scrollComponent!.scrollLeft this.props.onScroll(scrollX) } - refHandler = el => { + refHandler = (el: HTMLDivElement) => { this.scrollComponent = el this.props.scrollRef(el) - if(el){ - el.addEventListener('wheel', this.handleWheel, {passive: false}); + if (el) { + el.addEventListener('wheel', this.handleWheel, { passive: false }) + el.addEventListener('itemInteraction', this.handleItemInteract) } } - - handleWheel = e => { - const { traditionalZoom } = this.props - - + handleWheel = (e: WheelEvent) => { + //const { traditionalZoom } = this.props // zoom in the time dimension if (e.ctrlKey || e.metaKey || e.altKey) { e.preventDefault() - const parentPosition = getParentPosition(e.currentTarget) + const parentPosition = getParentPosition(e.currentTarget as HTMLElement) const xPosition = e.clientX - parentPosition.x const speed = e.ctrlKey ? 10 : e.metaKey ? 3 : 1 @@ -57,62 +63,57 @@ class ScrollElement extends Component { } else if (e.shiftKey) { e.preventDefault() // shift+scroll event from a touchpad has deltaY property populated; shift+scroll event from a mouse has deltaX - this.props.onScroll(this.scrollComponent.scrollLeft + (e.deltaY || e.deltaX)) + this.props.onScroll(this.scrollComponent!.scrollLeft + (e.deltaY || e.deltaX)) // no modifier pressed? we prevented the default event, so scroll or zoom as needed } } - handleMouseDown = e => { + handleMouseDown: MouseEventHandler = (e) => { if (e.button === 0) { - this.dragStartPosition = e.pageX this.dragLastPosition = e.pageX this.setState({ - isDragging: true + isDragging: true, }) } } - handleMouseMove = e => { + handleMouseMove: MouseEventHandler = (e) => { // this.props.onMouseMove(e) //why is interacting with item important? - if (this.state.isDragging && !this.props.isInteractingWithItem) { - this.props.onScroll(this.scrollComponent.scrollLeft + this.dragLastPosition - e.pageX) + if (this.state.isDragging && !this.isItemInteraction) { + this.props.onScroll(this.scrollComponent!.scrollLeft + this.dragLastPosition! - e.pageX) this.dragLastPosition = e.pageX } } handleMouseUp = () => { - this.dragStartPosition = null this.dragLastPosition = null this.setState({ - isDragging: false + isDragging: false, }) } handleMouseLeave = () => { // this.props.onMouseLeave(e) - this.dragStartPosition = null this.dragLastPosition = null this.setState({ - isDragging: false + isDragging: false, }) } - handleTouchStart = e => { + handleTouchStart: TouchEventHandler = (e) => { if (e.touches.length === 2) { e.preventDefault() - this.lastTouchDistance = Math.abs( - e.touches[0].screenX - e.touches[1].screenX - ) + this.lastTouchDistance = Math.abs(e.touches[0].screenX - e.touches[1].screenX) this.singleTouchStart = null this.lastSingleTouch = null } else if (e.touches.length === 1) { e.preventDefault() - let x = e.touches[0].clientX - let y = e.touches[0].clientY + const x = e.touches[0].clientX + const y = e.touches[0].clientY this.lastTouchDistance = null this.singleTouchStart = { x: x, y: y, screenY: window.pageYOffset } @@ -120,40 +121,36 @@ class ScrollElement extends Component { } } - handleTouchMove = e => { - const { isInteractingWithItem, width, onZoom } = this.props - if (isInteractingWithItem) { + handleTouchMove: TouchEventHandler = (e) => { + const { width, onZoom } = this.props + if (this.isItemInteraction) { e.preventDefault() return } if (this.lastTouchDistance && e.touches.length === 2) { e.preventDefault() - let touchDistance = Math.abs(e.touches[0].screenX - e.touches[1].screenX) - let parentPosition = getParentPosition(e.currentTarget) - let xPosition = - (e.touches[0].screenX + e.touches[1].screenX) / 2 - parentPosition.x + const touchDistance = Math.abs(e.touches[0].screenX - e.touches[1].screenX) + const parentPosition = getParentPosition(e.currentTarget as HTMLElement) + const xPosition = (e.touches[0].screenX + e.touches[1].screenX) / 2 - parentPosition.x if (touchDistance !== 0 && this.lastTouchDistance !== 0) { onZoom(this.lastTouchDistance / touchDistance, xPosition / width) this.lastTouchDistance = touchDistance } } else if (this.lastSingleTouch && e.touches.length === 1) { e.preventDefault() - let x = e.touches[0].clientX - let y = e.touches[0].clientY - let deltaX = x - this.lastSingleTouch.x - let deltaX0 = x - this.singleTouchStart.x - let deltaY0 = y - this.singleTouchStart.y - this.lastSingleTouch = { x: x, y: y } - let moveX = Math.abs(deltaX0) * 3 > Math.abs(deltaY0) - let moveY = Math.abs(deltaY0) * 3 > Math.abs(deltaX0) + const x = e.touches[0].clientX + const y = e.touches[0].clientY + const deltaX = x - this.lastSingleTouch.x + const deltaX0 = x - this.singleTouchStart!.x + const deltaY0 = y - this.singleTouchStart!.y + this.lastSingleTouch = { x: x, y: y, screenY: window.pageYOffset } + const moveX = Math.abs(deltaX0) * 3 > Math.abs(deltaY0) + const moveY = Math.abs(deltaY0) * 3 > Math.abs(deltaX0) if (deltaX !== 0 && moveX) { - this.props.onScroll(this.scrollComponent.scrollLeft - deltaX) + this.props.onScroll(this.scrollComponent!.scrollLeft - deltaX) } if (moveY) { - window.scrollTo( - window.pageXOffset, - this.singleTouchStart.screenY - deltaY0 - ) + window.scrollTo(window.pageXOffset, this.singleTouchStart!.screenY - deltaY0) } } } @@ -167,10 +164,14 @@ class ScrollElement extends Component { this.singleTouchStart = null } } + handleItemInteract = (e: Event) => { + this.isItemInteraction = (e as CustomEvent<{ itemInteraction: boolean }>).detail.itemInteraction + } - componentWillUnmount(){ - if(this.scrollComponent){ - this.scrollComponent.removeEventListener('wheel', this.handleWheel); + componentWillUnmount() { + if (this.scrollComponent) { + this.scrollComponent.removeEventListener('wheel', this.handleWheel) + this.scrollComponent.removeEventListener('itemInteraction', this.handleItemInteract) } } @@ -178,11 +179,11 @@ class ScrollElement extends Component { const { width, height, children } = this.props const { isDragging } = this.state - const scrollComponentStyle = { + const scrollComponentStyle: CSSProperties = { width: `${width}px`, height: `${height + 20}px`, //20px to push the scroll element down off screen...? cursor: isDragging ? 'move' : 'default', - position: 'relative' + position: 'relative', } return ( @@ -202,7 +203,6 @@ class ScrollElement extends Component { > {children}
- ) } } diff --git a/src/lib/timeline/TimelineStateContext.js b/src/lib/timeline/TimelineStateContext.js deleted file mode 100644 index 681f37ca8..000000000 --- a/src/lib/timeline/TimelineStateContext.js +++ /dev/null @@ -1,112 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import createReactContext from 'create-react-context' -import { - calculateXPositionForTime, - calculateTimeForXPosition -} from '../utility/calendar' - -/* this context will hold all information regarding timeline state: - 1. timeline width - 2. visible time start and end - 3. canvas time start and end - 4. helpers for calculating left offset of items (and really...anything) -*/ - -/* eslint-disable no-console */ -const defaultContextState = { - getTimelineState: () => { - console.warn('"getTimelineState" default func is being used') - }, - getLeftOffsetFromDate: () => { - console.warn('"getLeftOffsetFromDate" default func is being used') - }, - getDateFromLeftOffsetPosition: () => { - console.warn('"getDateFromLeftOffsetPosition" default func is being used') - }, - showPeriod: () => { - console.warn('"showPeriod" default func is being used') - } -} -/* eslint-enable */ - -const { Consumer, Provider } = createReactContext(defaultContextState) - -export class TimelineStateProvider extends React.Component { - /* eslint-disable react/no-unused-prop-types */ - static propTypes = { - children: PropTypes.element.isRequired, - visibleTimeStart: PropTypes.number.isRequired, - visibleTimeEnd: PropTypes.number.isRequired, - canvasTimeStart: PropTypes.number.isRequired, - canvasTimeEnd: PropTypes.number.isRequired, - canvasWidth: PropTypes.number.isRequired, - showPeriod: PropTypes.func.isRequired, - timelineUnit: PropTypes.string.isRequired, - timelineWidth: PropTypes.number.isRequired, - } - - constructor(props) { - super(props) - - this.state = { - timelineContext: { - getTimelineState: this.getTimelineState, - getLeftOffsetFromDate: this.getLeftOffsetFromDate, - getDateFromLeftOffsetPosition: this.getDateFromLeftOffsetPosition, - showPeriod: this.props.showPeriod, - } - } - } - - getTimelineState = () => { - const { - visibleTimeStart, - visibleTimeEnd, - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - timelineUnit, - timelineWidth, - } = this.props - return { - visibleTimeStart, - visibleTimeEnd, - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - timelineUnit, - timelineWidth, - } // REVIEW, - } - - getLeftOffsetFromDate = date => { - const { canvasTimeStart, canvasTimeEnd, canvasWidth } = this.props - return calculateXPositionForTime( - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - date - ) - } - - getDateFromLeftOffsetPosition = leftOffset => { - const { canvasTimeStart, canvasTimeEnd, canvasWidth } = this.props - return calculateTimeForXPosition( - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - leftOffset - ) - } - - render() { - return ( - - {this.props.children} - - ) - } -} - -export const TimelineStateConsumer = Consumer diff --git a/src/lib/timeline/TimelineStateContext.tsx b/src/lib/timeline/TimelineStateContext.tsx new file mode 100644 index 000000000..68d0f285e --- /dev/null +++ b/src/lib/timeline/TimelineStateContext.tsx @@ -0,0 +1,109 @@ +import React, { PropsWithChildren, useContext } from 'react' + +import { calculateXPositionForTime, calculateTimeForXPosition, SelectUnits } from '../utility/calendar' +import { TimelineContext as TimelineContextValue } from '../types/main' +import { Dayjs } from 'dayjs' + +/* this context will hold all information regarding timeline state: + 1. timeline width + 2. visible time start and end + 3. canvas time start and end + 4. helpers for calculating left offset of items (and really...anything) +*/ + +/* eslint-disable no-console */ +const defaultContextState: TimelineContextType = { + getTimelineState: () => { + console.warn('"getTimelineState" default func is being used') + return {} as TimelineContextValue + }, + getLeftOffsetFromDate: () => { + console.warn('"getLeftOffsetFromDate" default func is being used') + return 0 + }, + getDateFromLeftOffsetPosition: () => { + console.warn('"getDateFromLeftOffsetPosition" default func is being used') + return 0 + }, + showPeriod: () => { + console.warn('"showPeriod" default func is being used') + }, +} +/* eslint-enable */ + +export const TimelineContext = React.createContext(defaultContextState) +const { Consumer, Provider } = TimelineContext + +type TimelineStartProps = { + visibleTimeStart: number + visibleTimeEnd: number + canvasTimeStart: number + canvasTimeEnd: number + canvasWidth: number + showPeriod: (from: Dayjs, to: Dayjs) => void + timelineUnit: SelectUnits + timelineWidth: number +} +export type TimelineContextType = { + getTimelineState: () => TimelineContextValue + getLeftOffsetFromDate: (date: number) => number + getDateFromLeftOffsetPosition: (leftOffset: number) => number + showPeriod: (from: Dayjs, to: Dayjs) => void +} + +type TimelineState = { + timelineContext: TimelineContextType +} + +export class TimelineStateProvider extends React.Component, TimelineState> { + constructor(props: PropsWithChildren) { + super(props) + + this.state = { + timelineContext: { + getTimelineState: this.getTimelineState, + getLeftOffsetFromDate: this.getLeftOffsetFromDate, + getDateFromLeftOffsetPosition: this.getDateFromLeftOffsetPosition, + showPeriod: this.props.showPeriod, + }, + } + } + + getTimelineState = () => { + const { + visibleTimeStart, + visibleTimeEnd, + canvasTimeStart, + canvasTimeEnd, + canvasWidth, + timelineUnit, + timelineWidth, + } = this.props + return { + visibleTimeStart, + visibleTimeEnd, + canvasTimeStart, + canvasTimeEnd, + canvasWidth, + timelineUnit, + timelineWidth, + } as TimelineContextValue // REVIEW, + } + + getLeftOffsetFromDate = (date: number): number => { + const { canvasTimeStart, canvasTimeEnd, canvasWidth } = this.props + return calculateXPositionForTime(canvasTimeStart, canvasTimeEnd, canvasWidth, date) + } + + getDateFromLeftOffsetPosition = (leftOffset: number) => { + const { canvasTimeStart, canvasTimeEnd, canvasWidth } = this.props + return calculateTimeForXPosition(canvasTimeStart, canvasTimeEnd, canvasWidth, leftOffset) + } + + render() { + return {this.props.children} + } +} + +export const TimelineStateConsumer = Consumer +export const useTimelineState = () => useContext(TimelineContext) diff --git a/src/lib/types/dimension.ts b/src/lib/types/dimension.ts new file mode 100644 index 000000000..377802246 --- /dev/null +++ b/src/lib/types/dimension.ts @@ -0,0 +1,16 @@ +import { GroupOrder, Id } from './main' + +export type Dimension = { + collisionLeft: number + collisionWidth: number + height: number + isDragging: boolean + left: number + order: GroupOrder + originalLeft: number + stack: boolean + top: number | null + width: number +} + +export type ItemDimension = { id: Id; dimensions: Dimension } diff --git a/src/lib/types/main.ts b/src/lib/types/main.ts new file mode 100644 index 000000000..7871d5cea --- /dev/null +++ b/src/lib/types/main.ts @@ -0,0 +1,252 @@ +import { Dayjs } from 'dayjs' +import { ReactNode, CSSProperties, HTMLProps, MouseEventHandler, Ref, Component, ReactElement } from 'react' +import { Dimension, ItemDimension } from './dimension' +import { ResizeEdge } from '../items/Item' +import { SelectUnits } from '../utility/calendar' + +export type Id = number | string + +export interface TimelineGroupBase { + id: Id + title: ReactNode + rightTitle?: ReactNode | undefined + height?: number | undefined + stackItems?: boolean | undefined + dimensions?: Dimension | undefined +} + +export type GroupOrder = { index: number; group: TimelineGroupBase } +export type GroupOrders = Record + +export type GroupedItem = { + index: number + group: TimelineGroupBase + items: ItemDimension[] +} + +export interface TimelineItemBase { + id: Id + group: Id + title?: ReactNode | undefined + start_time: DateType + end_time: DateType + canMove?: boolean | undefined + canResize?: boolean | 'left' | 'right' | 'both' | undefined + canChangeGroup?: boolean | undefined + className?: string | undefined + style?: CSSProperties | undefined + itemProps?: HTMLProps + isOverlay?: boolean | undefined + dimensions?: Dimension | undefined +} + +export interface TimelineContext { + timelineWidth: number + visibleTimeStart: number + visibleTimeEnd: number + canvasTimeStart: number + canvasTimeEnd: number + canvasWidth: number + timelineUnit: SelectUnits +} + +export type GroupStack = { + groupHeight: number + verticalMargin: number + itemTop: number +} + +export interface ItemContext { + dimensions: { + collisionLeft: number + collisionWidth: number + height: number + isDragging: boolean + left: number + order: GroupOrder + originalLeft: number + stack: boolean + top: number | null + width: number + } + useResizeHandle: boolean + title: string + canMove: boolean + canResizeLeft: boolean + canResizeRight: boolean + selected: boolean + dragging: boolean + dragStart: { + x: number + y: number + } | null + dragTime: number | null + dragGroupDelta: number | null + resizing: boolean + resizeEdge: 'left' | 'right' | null + resizeStart: number | null + resizeTime: number | null +} + +export interface ReactCalendarGroupRendererProps { + group: CustomGroup + isRightSidebar?: boolean | undefined +} + +export interface OnItemDragObjectBase { + itemId: Id + time: number +} + +export interface OnItemDragObjectMove extends OnItemDragObjectBase { + eventType: 'move' + newGroupOrder: number +} + +export interface OnItemDragObjectResize extends OnItemDragObjectBase { + eventType: 'resize' + edge?: ResizeEdge | undefined +} + +export interface TimelineKeys { + groupIdKey: string + groupTitleKey: string + groupLabelKey: string + groupRightTitleKey: string + itemIdKey: string + itemTitleKey: string + itemDivTitleKey: string + itemGroupKey: string + itemTimeStartKey: string + itemTimeEndKey: string +} + +export type dateType = number //| undefined; + +export interface TimelineTimeSteps { + second: number + minute: number + hour: number + day: number + month: number + year: number +} + +export class TimelineMarkers extends Component {} + +export interface CustomMarkerChildrenProps { + styles: CSSProperties + date: number +} + +export interface MarkerProps { + date: Date | number + children?: ((props: CustomMarkerChildrenProps) => ReactNode) | undefined +} + +export class CustomMarker extends Component {} + +export interface TodayMarkerProps extends MarkerProps { + interval?: number | undefined +} + +export class TodayMarker extends Component {} + +export type CursorMarkerProps = Omit + +export class CursorMarker extends Component {} + +export interface TimelineHeadersProps { + children?: ReactNode + style?: CSSProperties | undefined + className?: string | undefined + calendarHeaderStyle?: CSSProperties | undefined + calendarHeaderClassName?: string | undefined + headerRef?: Ref | undefined +} + +export class TimelineHeaders extends Component {} + +export interface SidebarHeaderChildrenFnProps { + getRootProps: (propsToOverride?: { style: CSSProperties }) => { + style: CSSProperties + } + data: Data +} + +export interface SidebarHeaderProps { + variant?: 'left' | 'right' | undefined + headerData?: Data | undefined + children: (props: SidebarHeaderChildrenFnProps) => ReactNode +} + +export class SidebarHeader extends Component> {} + +export type Unit = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'isoWeek' | 'month' | 'year' + +export interface IntervalContext { + interval: Interval + intervalText: string +} + +export interface GetIntervalProps { + interval?: Interval | undefined + style?: CSSProperties | undefined + onClick?: MouseEventHandler | undefined +} + +export interface IntervalRenderer { + intervalContext: IntervalContext + getIntervalProps: (props?: GetIntervalProps) => HTMLProps + data?: Data | undefined +} + +export interface Interval { + startTime: Dayjs + endTime: Dayjs + labelWidth?: number + left?: number +} + +export interface HeaderContext { + intervals: Array<{ startTime: Dayjs; endTime: Dayjs }> + unit: string +} + +export interface CustomHeaderPropsChildrenFnProps { + timelineContext: TimelineContext + headerContext: HeaderContext + getIntervalProps: (props?: GetIntervalProps) => Required & { key: string | number } + getRootProps: (propsToOverride?: { style: CSSProperties }) => { + style: CSSProperties + } + showPeriod: (startDate: Dayjs | number, endDate: Dayjs | number) => void + data: Data +} + +export interface CustomHeaderProps { + unit?: Unit | undefined + headerData?: Data | undefined + height?: number | undefined + children: (props?: CustomHeaderPropsChildrenFnProps) => ReactNode +} + +export class CustomHeader extends Component> {} + +// export const defaultKeys: TimelineKeys; +// export const defaultTimeSteps: TimelineTimeSteps; +// export const defaultHeaderFormats: LabelFormat; + +// export default class ReactCalendarTimeline< +// CustomItem extends TimelineItemBase = TimelineItemBase, +// CustomGroup extends TimelineGroupBase = TimelineGroupBase, +// > extends Component> {} + +export type ElementWithSecret = ReactElement & { + props: { + variant: string + } + type: { + secretKey: string + } +} diff --git a/src/lib/utility/calendar.js b/src/lib/utility/calendar.tsx similarity index 57% rename from src/lib/utility/calendar.js rename to src/lib/utility/calendar.tsx index be501951b..435a3949f 100644 --- a/src/lib/utility/calendar.js +++ b/src/lib/utility/calendar.tsx @@ -1,5 +1,18 @@ -import moment from 'moment' +/* eslint-disable no-var */ +import dayjs, { Dayjs } from 'dayjs' import { _get } from './generic' +import { Dimension, ItemDimension } from '../types/dimension' +import { + GroupedItem, + GroupOrders, + GroupStack, + Id, + TimelineGroupBase, + TimelineItemBase, + TimelineKeys, + TimelineTimeSteps, +} from '../types/main' +import { ReactCalendarTimelineProps, ReactCalendarTimelineState } from '../Timeline' /** * Calculate the ms / pixel ratio of the timeline state @@ -8,11 +21,7 @@ import { _get } from './generic' * @param {number} canvasWidth * @returns {number} */ -export function coordinateToTimeRatio( - canvasTimeStart, - canvasTimeEnd, - canvasWidth -) { +export function coordinateToTimeRatio(canvasTimeStart: number, canvasTimeEnd: number, canvasWidth: number): number { return (canvasTimeEnd - canvasTimeStart) / canvasWidth } @@ -26,11 +35,11 @@ export function coordinateToTimeRatio( * @returns {number} */ export function calculateXPositionForTime( - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - time -) { + canvasTimeStart: number, + canvasTimeEnd: number, + canvasWidth: number, + time: number, +): number { const widthToZoomRatio = canvasWidth / (canvasTimeEnd - canvasTimeStart) const timeOffset = time - canvasTimeStart @@ -47,11 +56,11 @@ export function calculateXPositionForTime( * @returns {number} */ export function calculateTimeForXPosition( - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - leftOffset -) { + canvasTimeStart: number, + canvasTimeEnd: number, + canvasWidth: number, + leftOffset: number, +): number { const timeToPxRatio = (canvasTimeEnd - canvasTimeStart) / canvasWidth const timeFromCanvasTimeStart = timeToPxRatio * leftOffset @@ -59,16 +68,22 @@ export function calculateTimeForXPosition( return timeFromCanvasTimeStart + canvasTimeStart } -export function iterateTimes(start, end, unit, timeSteps, callback) { - let time = moment(start).startOf(unit) +export function iterateTimes( + start: number, + end: number, + unit: keyof TimelineTimeSteps, + timeSteps: TimelineTimeSteps, + callback: (time: Dayjs, nextTime: Dayjs) => void, +) { + let time = dayjs(start).startOf(unit) if (timeSteps[unit] && timeSteps[unit] > 1) { - let value = time.get(unit) - time.set(unit, value - value % timeSteps[unit]) + const value = time.get(unit) + time.set(unit, value - (value % timeSteps[unit])) } while (time.valueOf() < end) { - let nextTime = moment(time).add(timeSteps[unit] || 1, `${unit}s`) + const nextTime = dayjs(time).add(timeSteps[unit] || 1, unit as dayjs.ManipulateType) callback(time, nextTime) time = nextTime } @@ -91,40 +106,39 @@ export function iterateTimes(start, end, unit, timeSteps, callback) { // i think this is the distance between cell lines export const minCellWidth = 17 -export function getMinUnit(zoom, width, timeSteps) { +export function getMinUnit(zoom: number, width: number, timeSteps: TimelineTimeSteps) { // for supporting weeks, its important to remember that each of these // units has a natural progression to the other. i.e. a year is 12 months // a month is 24 days, a day is 24 hours. // with weeks this isnt the case so weeks needs to be handled specially - let timeDividers = { + const timeDividers: Record = { second: 1000, minute: 60, hour: 60, day: 24, month: 30, - year: 12 + year: 12, } - let minUnit = 'year' + let minUnit: keyof TimelineTimeSteps = 'year' // this timespan is in ms initially let nextTimeSpanInUnitContext = zoom - Object.keys(timeDividers).some(unit => { + Object.keys(timeDividers).some((unit) => { + const unitKey = unit as keyof TimelineTimeSteps // converts previous time span to current unit // (e.g. milliseconds to seconds, seconds to minutes, etc) - nextTimeSpanInUnitContext = nextTimeSpanInUnitContext / timeDividers[unit] + nextTimeSpanInUnitContext = nextTimeSpanInUnitContext / timeDividers[unitKey] // timeSteps is " // With what step to display different units. E.g. 15 for minute means only minutes 0, 15, 30 and 45 will be shown." // how many cells would be rendered given this time span, for this unit? // e.g. for time span of 60 minutes, and time step of 1, we would render 60 cells - const cellsToBeRenderedForCurrentUnit = - nextTimeSpanInUnitContext / timeSteps[unit] + const cellsToBeRenderedForCurrentUnit = nextTimeSpanInUnitContext / timeSteps[unitKey] // what is happening here? why 3 if time steps are greater than 1?? - const cellWidthToUse = - timeSteps[unit] && timeSteps[unit] > 1 ? 3 * minCellWidth : minCellWidth + const cellWidthToUse = timeSteps[unitKey] && timeSteps[unitKey] > 1 ? 3 * minCellWidth : minCellWidth // for the minWidth of a cell, how many cells would be rendered given // the current pixel width @@ -134,7 +148,7 @@ export function getMinUnit(zoom, width, timeSteps) { if (cellsToBeRenderedForCurrentUnit < minimumCellsToRenderUnit) { // for the current zoom, the number of cells we'd need to render all parts of this unit // is less than the minimum number of cells needed at minimum cell width - minUnit = unit + minUnit = unit as keyof TimelineTimeSteps return true } }) @@ -142,19 +156,23 @@ export function getMinUnit(zoom, width, timeSteps) { return minUnit } -export function getNextUnit(unit) { - let nextUnits = { - second: 'minute', - minute: 'hour', - hour: 'day', - day: 'month', - month: 'year', - year: 'year' - } - if (!nextUnits[unit]) { - throw new Error(`unit ${unit} in not acceptable`) +export type SelectUnits = 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year' +export type SelectUnitsRes = Exclude + +export const NEXT_UNITS: Record = { + second: 'minute', + minute: 'hour', + hour: 'day', + day: 'month', + month: 'year', + year: 'year', +} + +export function getNextUnit(unit: SelectUnits): SelectUnitsRes { + if (!NEXT_UNITS[unit]) { + throw new Error(`unit ${unit} is not acceptable`) } - return nextUnits[unit] + return NEXT_UNITS[unit] } /** @@ -175,16 +193,22 @@ export function calculateInteractionNewTimes({ isDragging, isResizing, resizingEdge, - resizeTime -}) { + resizeTime, +}: { + itemTimeStart: number + itemTimeEnd: number + dragTime: number | null + isDragging: boolean + isResizing: boolean + resizingEdge: 'left' | 'right' | null + resizeTime: number | null +}): [number, number] { const originalItemRange = itemTimeEnd - itemTimeStart - const itemStart = - isResizing && resizingEdge === 'left' ? resizeTime : itemTimeStart - const itemEnd = - isResizing && resizingEdge === 'right' ? resizeTime : itemTimeEnd + const itemStart = isResizing && resizingEdge === 'left' && resizeTime ? resizeTime : itemTimeStart + const itemEnd = isResizing && resizingEdge === 'right' && resizeTime ? resizeTime : itemTimeEnd return [ - isDragging ? dragTime : itemStart, - isDragging ? dragTime + originalItemRange : itemEnd + isDragging && dragTime ? dragTime : itemStart, + isDragging && dragTime ? dragTime + originalItemRange : itemEnd, ] } @@ -193,36 +217,30 @@ export function calculateDimensions({ itemTimeEnd, canvasTimeStart, canvasTimeEnd, - canvasWidth -}) { + canvasWidth, +}: { + itemTimeStart: number + itemTimeEnd: number + canvasTimeStart: number + canvasTimeEnd: number + canvasWidth: number +}): Partial { const itemTimeRange = itemTimeEnd - itemTimeStart // restrict startTime and endTime to be bounded by canvasTimeStart and canvasTimeEnd const effectiveStartTime = Math.max(itemTimeStart, canvasTimeStart) const effectiveEndTime = Math.min(itemTimeEnd, canvasTimeEnd) - const left = calculateXPositionForTime( - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - effectiveStartTime - ) - const right = calculateXPositionForTime( - canvasTimeStart, - canvasTimeEnd, - canvasWidth, - effectiveEndTime - ) + const left = calculateXPositionForTime(canvasTimeStart, canvasTimeEnd, canvasWidth, effectiveStartTime) + const right = calculateXPositionForTime(canvasTimeStart, canvasTimeEnd, canvasWidth, effectiveEndTime) const itemWidth = right - left - const dimensions = { + return { left: left, width: Math.max(itemWidth, 3), collisionLeft: itemTimeStart, - collisionWidth: itemTimeRange + collisionWidth: itemTimeRange, } - - return dimensions } /** @@ -231,13 +249,16 @@ export function calculateDimensions({ * @param {*} keys the keys object * @returns Ordered hash of objects with their array index and group */ -export function getGroupOrders(groups, keys) { +export function getGroupOrders(groups: TimelineGroupBase[], keys: TimelineKeys) { const { groupIdKey } = keys - let groupOrders = {} + const groupOrders: GroupOrders = {} for (let i = 0; i < groups.length; i++) { - groupOrders[_get(groups[i], groupIdKey)] = { index: i, group: groups[i] } + groupOrders[_get(groups[i], groupIdKey) as string] = { + index: i, + group: groups[i], + } } return groupOrders @@ -248,23 +269,23 @@ export function getGroupOrders(groups, keys) { * @param {*} items list of all items * @param {*} groupOrders the result of getGroupOrders */ -export function getGroupedItems(items, groupOrders) { - var groupedItems = {} - var keys = Object.keys(groupOrders) +export function getGroupedItems(items: ItemDimension[], groupOrders: GroupOrders) { + const groupedItems: Record = {} + const keys = Object.keys(groupOrders) // Initialize with result object for each group for (let i = 0; i < keys.length; i++) { const groupOrder = groupOrders[keys[i]] groupedItems[i] = { index: groupOrder.index, group: groupOrder.group, - items: [] + items: [], } } // Populate groups for (let i = 0; i < items.length; i++) { - if (items[i].dimensions.order !== undefined) { - const groupItem = groupedItems[items[i].dimensions.order.index] + if (items[i].dimensions !== undefined && items[i].dimensions?.order !== undefined) { + const groupItem = groupedItems[items[i].dimensions?.order.index ?? 0] if (groupItem) { groupItem.items.push(items[i]) } @@ -274,28 +295,31 @@ export function getGroupedItems(items, groupOrders) { return groupedItems } -export function getVisibleItems(items, canvasTimeStart, canvasTimeEnd, keys) { +export function getVisibleItems< + CustomItem extends TimelineItemBase = TimelineItemBase, + // CustomGroup extends TimelineGroupBase = TimelineGroupBase, +>(items: CustomItem[], canvasTimeStart: number, canvasTimeEnd: number, keys: TimelineKeys) { const { itemTimeStartKey, itemTimeEndKey } = keys - return items.filter(item => { - return ( - _get(item, itemTimeStartKey) <= canvasTimeEnd && - _get(item, itemTimeEndKey) >= canvasTimeStart - ) + return items.filter((item) => { + const afterStart = dayjs(_get(item, itemTimeStartKey)).valueOf() <= canvasTimeEnd + const beforeEnd = dayjs(_get(item, itemTimeEndKey)).valueOf() >= canvasTimeStart + + return afterStart && beforeEnd }) } const EPSILON = 0.001 -export function collision(a, b, lineHeight, collisionPadding = EPSILON) { +export function collision(a: Dimension, b: Dimension, collisionPadding: number = EPSILON) { // 2d collisions detection - https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection - var verticalMargin = 0 + const verticalMargin = 0 return ( a.collisionLeft + collisionPadding < b.collisionLeft + b.collisionWidth && a.collisionLeft + a.collisionWidth - collisionPadding > b.collisionLeft && - a.top - verticalMargin + collisionPadding < b.top + b.height && - a.top + a.height + verticalMargin - collisionPadding > b.top + a.top! - verticalMargin + collisionPadding < b.top! + b.height && + a.top! + a.height + verticalMargin - collisionPadding > b.top! ) } @@ -304,29 +328,27 @@ export function collision(a, b, lineHeight, collisionPadding = EPSILON) { * is being stacked */ export function groupStack( - lineHeight, - item, - group, - groupHeight, - groupTop, - itemIndex -) { + lineHeight: number, + item: ItemDimension, + group: ItemDimension[], + groupHeight: number, + groupTop: number, + itemIndex: number, +): GroupStack { // calculate non-overlapping positions let curHeight = groupHeight - let verticalMargin = (lineHeight - item.dimensions.height) / 2 + const verticalMargin = (lineHeight - item.dimensions.height) / 2 if (item.dimensions.stack && item.dimensions.top === null) { item.dimensions.top = groupTop + verticalMargin curHeight = Math.max(curHeight, lineHeight) do { - var collidingItem = null + // converting it to a const create an infinite loop (why?) + // noinspection ES6ConvertVarToLetConst + var collidingItem: null | ItemDimension = null //Items are placed from i=0 onwards, only check items with index < i - for (var j = itemIndex - 1, jj = 0; j >= jj; j--) { - var other = group[j] - if ( - other.dimensions.top !== null && - other.dimensions.stack && - collision(item.dimensions, other.dimensions, lineHeight) - ) { + for (let j = itemIndex - 1, jj = 0; j >= jj; j--) { + const other = group[j] + if (other.dimensions.top !== null && other.dimensions.stack && collision(item.dimensions, other.dimensions)) { collidingItem = other break } else { @@ -336,63 +358,63 @@ export function groupStack( if (collidingItem != null) { // There is a collision. Reposition the items above the colliding element - item.dimensions.top = collidingItem.dimensions.top + lineHeight - curHeight = Math.max( - curHeight, - item.dimensions.top + item.dimensions.height + verticalMargin - groupTop - ) + item.dimensions.top = collidingItem.dimensions.top! + lineHeight + curHeight = Math.max(curHeight, item.dimensions.top + item.dimensions.height + verticalMargin - groupTop) } } while (collidingItem) } return { groupHeight: curHeight, verticalMargin, - itemTop: item.dimensions.top + itemTop: item.dimensions.top!, } - } // Calculate the position of this item for a group that is not being stacked -export function groupNoStack(lineHeight, item, groupHeight, groupTop) { - let verticalMargin = (lineHeight - item.dimensions.height) / 2 - if (item.dimensions.top === null) { +export function groupNoStack( + lineHeight: number, + item: ItemDimension, + groupHeight: number, + groupTop: number, +): GroupStack { + const verticalMargin = (lineHeight - (item.dimensions?.height ?? 1)) / 2 + if (item.dimensions && item.dimensions.top === null) { item.dimensions.top = groupTop + verticalMargin groupHeight = Math.max(groupHeight, lineHeight) } - return { groupHeight, verticalMargin: 0, itemTop: item.dimensions.top } + return { groupHeight, verticalMargin: 0, itemTop: item.dimensions?.top ?? 0 } } -function sum(arr = []) { +function sum(arr: number[] = []) { return arr.reduce((acc, i) => acc + i, 0) } /** * Stack all groups - * @param {*} items items to be stacked + * @param itemsDimensions * @param {*} groupOrders the groupOrders object * @param {*} lineHeight * @param {*} stackItems should items be stacked? */ -export function stackAll(itemsDimensions, groupOrders, lineHeight, stackItems) { - var groupHeights = [] - var groupTops = [] +export function stackAll( + itemsDimensions: ItemDimension[], + groupOrders: GroupOrders, + lineHeight: number, + stackItems: boolean, +) { + const groupHeights: number[] = [] + const groupTops: number[] = [] - var groupedItems = getGroupedItems(itemsDimensions, groupOrders) + const groupedItems = getGroupedItems(itemsDimensions, groupOrders) - for (var index in groupedItems) { + for (const index in groupedItems) { const groupItems = groupedItems[index] const { items: itemsDimensions, group } = groupItems const groupTop = sum(groupHeights) // Is group being stacked? - const isGroupStacked = - group.stackItems !== undefined ? group.stackItems : stackItems - const { groupHeight, verticalMargin } = stackGroup( - itemsDimensions, - isGroupStacked, - lineHeight, - groupTop - ) + const isGroupStacked = group.stackItems !== undefined ? group.stackItems : stackItems + const { groupHeight } = stackGroup(itemsDimensions, isGroupStacked, lineHeight, groupTop) // If group height is overridden, push new height // Do this late as item position still needs to be calculated groupTops.push(groupTop) @@ -402,39 +424,35 @@ export function stackAll(itemsDimensions, groupOrders, lineHeight, stackItems) { groupHeights.push(Math.max(groupHeight, lineHeight)) } } - + return { height: sum(groupHeights), groupHeights, - groupTops + groupTops, } } /** - * - * @param {*} itemsDimensions - * @param {*} isGroupStacked - * @param {*} lineHeight - * @param {*} groupTop + * + * @param {*} itemsDimensions + * @param {*} isGroupStacked + * @param {*} lineHeight + * @param {*} groupTop */ -export function stackGroup(itemsDimensions, isGroupStacked, lineHeight, groupTop) { - var groupHeight = 0 - var verticalMargin = 0 +export function stackGroup( + itemsDimensions: ItemDimension[], + isGroupStacked: boolean, + lineHeight: number, + groupTop: number, +) { + let groupHeight = 0 + let verticalMargin = 0 // Find positions for each item in group for (let itemIndex = 0; itemIndex < itemsDimensions.length; itemIndex++) { - let r = {} - if (isGroupStacked) { - r = groupStack( - lineHeight, - itemsDimensions[itemIndex], - itemsDimensions, - groupHeight, - groupTop, - itemIndex - ) - } else { - r = groupNoStack(lineHeight, itemsDimensions[itemIndex], groupHeight, groupTop) - } + const r = isGroupStacked + ? groupStack(lineHeight, itemsDimensions[itemIndex], itemsDimensions, groupHeight, groupTop, itemIndex) + : groupNoStack(lineHeight, itemsDimensions[itemIndex], groupHeight, groupTop) + groupHeight = r.groupHeight verticalMargin = r.verticalMargin } @@ -460,30 +478,28 @@ export function stackGroup(itemsDimensions, isGroupStacked, lineHeight, groupTop * @param {number} resizeTime * @param {number} newGroupOrder */ -export function stackTimelineItems( - items, - groups, - canvasWidth, - canvasTimeStart, - canvasTimeEnd, - keys, - lineHeight, - itemHeightRatio, - stackItems, - draggingItem, - resizingItem, - dragTime, - resizingEdge, - resizeTime, - newGroupOrder +export function stackTimelineItems< + CustomItem extends TimelineItemBase = TimelineItemBase, + CustomGroup extends TimelineGroupBase = TimelineGroupBase, +>( + items: CustomItem[], + groups: CustomGroup[], + canvasWidth: number, + canvasTimeStart: number, + canvasTimeEnd: number, + keys: TimelineKeys, + lineHeight: number, + itemHeightRatio: number, + stackItems: boolean, + draggingItem: Id | null | undefined, + resizingItem: Id | null | undefined, + dragTime: number | null, + resizingEdge: 'left' | 'right' | null, + resizeTime: number | null, + newGroupOrder: number, ) { - const visibleItems = getVisibleItems( - items, - canvasTimeStart, - canvasTimeEnd, - keys - ) - const visibleItemsWithInteraction = visibleItems.map(item => + const visibleItems = getVisibleItems(items, canvasTimeStart, canvasTimeEnd, keys) + const visibleItemsWithInteraction = visibleItems.map((item) => getItemWithInteractions({ item, keys, @@ -493,8 +509,8 @@ export function stackTimelineItems( resizingEdge, resizeTime, groups, - newGroupOrder - }) + newGroupOrder, + }), ) // if there are no groups return an empty array of dimensions @@ -503,14 +519,14 @@ export function stackTimelineItems( dimensionItems: [], height: 0, groupHeights: [], - groupTops: [] + groupTops: [], } } // Get the order of groups based on their id key const groupOrders = getGroupOrders(groups, keys) - let dimensionItems = visibleItemsWithInteraction - .map(item => + const dimensionItems = visibleItemsWithInteraction + .map((item) => getItemDimensions({ item, keys, @@ -519,17 +535,12 @@ export function stackTimelineItems( canvasWidth, groupOrders, lineHeight, - itemHeightRatio - }) + itemHeightRatio, + }), ) - .filter(item => !!item) + .filter((item) => !!item) as ItemDimension[] // Get a new array of groupOrders holding the stacked items - const { height, groupHeights, groupTops } = stackAll( - dimensionItems, - groupOrders, - lineHeight, - stackItems - ) + const { height, groupHeights, groupTops } = stackAll(dimensionItems, groupOrders, lineHeight, stackItems) return { dimensionItems, height, groupHeights, groupTops } } @@ -538,7 +549,7 @@ export function stackTimelineItems( * @param {*} width * @param {*} buffer */ -export function getCanvasWidth(width, buffer = 3) { +export function getCanvasWidth(width: number, buffer: number) { return width * buffer } @@ -553,7 +564,7 @@ export function getCanvasWidth(width, buffer = 3) { * @param {*} lineHeight * @param {*} itemHeightRatio */ -export function getItemDimensions({ +export function getItemDimensions>({ item, keys, canvasTimeStart, @@ -561,15 +572,24 @@ export function getItemDimensions({ canvasWidth, groupOrders, lineHeight, - itemHeightRatio -}) { + itemHeightRatio, +}: { + item: CustomItem + keys: TimelineKeys + canvasTimeStart: number + canvasTimeEnd: number + canvasWidth: number + groupOrders: GroupOrders + lineHeight: number + itemHeightRatio: number +}): ItemDimension | undefined { const itemId = _get(item, keys.itemIdKey) - let dimension = calculateDimensions({ + const dimension = calculateDimensions({ itemTimeStart: _get(item, keys.itemTimeStartKey), itemTimeEnd: _get(item, keys.itemTimeEndKey), canvasTimeStart, canvasTimeEnd, - canvasWidth + canvasWidth, }) if (dimension) { dimension.top = null @@ -578,7 +598,7 @@ export function getItemDimensions({ dimension.height = lineHeight * itemHeightRatio return { id: itemId, - dimensions: dimension + dimensions: dimension as Dimension, } } } @@ -596,7 +616,10 @@ export function getItemDimensions({ * @param {*} groups * @param {*} newGroupOrder */ -export function getItemWithInteractions({ +export function getItemWithInteractions< + CustomItem extends TimelineItemBase, + CustomGroup extends TimelineGroupBase = TimelineGroupBase, +>({ item, keys, draggingItem, @@ -605,7 +628,17 @@ export function getItemWithInteractions({ resizingEdge, resizeTime, groups, - newGroupOrder + newGroupOrder, +}: { + item: CustomItem + keys: TimelineKeys + draggingItem: Id | null | undefined + resizingItem: Id | null | undefined + dragTime: number | null + resizingEdge: 'left' | 'right' | null + resizeTime: number | null + groups: CustomGroup[] + newGroupOrder: number }) { if (!resizingItem && !draggingItem) return item const itemId = _get(item, keys.itemIdKey) @@ -618,31 +651,27 @@ export function getItemWithInteractions({ isResizing, dragTime, resizingEdge, - resizeTime + resizeTime, }) - const newItem = { + return { ...item, [keys.itemTimeStartKey]: itemTimeStart, [keys.itemTimeEndKey]: itemTimeEnd, - [keys.itemGroupKey]: isDragging - ? _get(groups[newGroupOrder], keys.groupIdKey) - : _get(item, keys.itemGroupKey) + [keys.itemGroupKey]: isDragging ? _get(groups[newGroupOrder], keys.groupIdKey) : _get(item, keys.itemGroupKey), } - return newItem } /** * get canvas start and end time from visible start and end time * @param {number} visibleTimeStart * @param {number} visibleTimeEnd + * @param buffer */ -export function getCanvasBoundariesFromVisibleTime( - visibleTimeStart, - visibleTimeEnd -) { +export function getCanvasBoundariesFromVisibleTime(visibleTimeStart: number, visibleTimeEnd: number, buffer: number) { const zoom = visibleTimeEnd - visibleTimeStart - const canvasTimeStart = visibleTimeStart - (visibleTimeEnd - visibleTimeStart) - const canvasTimeEnd = canvasTimeStart + zoom * 3 + // buffer - 1 (1 is visible area) divided by 2 (2 is the buffer split on the right and left of the timeline) + const canvasTimeStart = visibleTimeStart - (zoom * (buffer - 1)) / 2 + const canvasTimeEnd = canvasTimeStart + zoom * buffer return [canvasTimeStart, canvasTimeEnd] } @@ -658,41 +687,51 @@ export function getCanvasBoundariesFromVisibleTime( * @param {*} props * @param {*} state */ -export function calculateScrollCanvas( - visibleTimeStart, - visibleTimeEnd, - forceUpdateDimensions, - items, - groups, - props, - state -) { +export function calculateScrollCanvas< + P extends ReactCalendarTimelineProps, + S extends ReactCalendarTimelineState, +>( + visibleTimeStart: number, + visibleTimeEnd: number, + forceUpdateDimensions: boolean, + items: any, + groups: any, + props: P, + state: S, +): S { + const buffer = props.buffer const oldCanvasTimeStart = state.canvasTimeStart + const oldCanvasTimeEnd = state.canvasTimeEnd const oldZoom = state.visibleTimeEnd - state.visibleTimeStart const newZoom = visibleTimeEnd - visibleTimeStart - const newState = { visibleTimeStart, visibleTimeEnd } + const newState: S = { + ...state, + visibleTimeStart, + visibleTimeEnd, + } // Check if the current canvas covers the new times const canKeepCanvas = newZoom === oldZoom && visibleTimeStart >= oldCanvasTimeStart + oldZoom * 0.5 && - visibleTimeStart <= oldCanvasTimeStart + oldZoom * 1.5 && + visibleTimeStart <= oldCanvasTimeEnd - oldZoom * 1.5 && visibleTimeEnd >= oldCanvasTimeStart + oldZoom * 1.5 && - visibleTimeEnd <= oldCanvasTimeStart + oldZoom * 2.5 + visibleTimeEnd <= oldCanvasTimeEnd - oldZoom * 0.5 if (!canKeepCanvas || forceUpdateDimensions) { const [canvasTimeStart, canvasTimeEnd] = getCanvasBoundariesFromVisibleTime( visibleTimeStart, - visibleTimeEnd + visibleTimeEnd, + buffer!, ) newState.canvasTimeStart = canvasTimeStart newState.canvasTimeEnd = canvasTimeEnd const mergedState = { ...state, - ...newState + ...newState, } - const canvasWidth = getCanvasWidth(mergedState.width) + const canvasWidth = getCanvasWidth(mergedState.width, props.buffer!) // The canvas cannot be kept, so calculate the new items position Object.assign( @@ -712,8 +751,8 @@ export function calculateScrollCanvas( mergedState.dragTime, mergedState.resizingEdge, mergedState.resizeTime, - mergedState.newGroupOrder - ) + mergedState.newGroupOrder, + ), ) } return newState diff --git a/src/lib/utility/dom-helpers.js b/src/lib/utility/dom-helpers.js deleted file mode 100644 index 127355f6c..000000000 --- a/src/lib/utility/dom-helpers.js +++ /dev/null @@ -1,49 +0,0 @@ -// TODO: can we use getBoundingClientRect instead?? -// last place this is used is in "handleWheel" in ScrollElement -export function getParentPosition(element) { - var xPosition = 0 - var yPosition = 0 - var first = true - - while (element) { - if ( - !element.offsetParent && - element.tagName === 'BODY' && - element.scrollLeft === 0 && - element.scrollTop === 0 - ) { - element = document.scrollingElement || element - } - xPosition += - element.offsetLeft - (first ? 0 : element.scrollLeft) + element.clientLeft - yPosition += - element.offsetTop - (first ? 0 : element.scrollTop) + element.clientTop - element = element.offsetParent - first = false - } - return { x: xPosition, y: yPosition } -} - -export function getSumScroll(node) { - if (node === document.body) { - return {scrollLeft: 0, scrollTop: 0} - } else { - const parent = getSumScroll(node.parentNode) - return ({ - scrollLeft: node.scrollLeft + parent.scrollLeft, - scrollTop: node.scrollTop + parent.scrollTop - }) - } -} - -export function getSumOffset(node) { - if (node === document.body || !node.offsetParent) { - return {offsetLeft: 0, offsetTop: 0} - } else { - const parent = getSumOffset(node.offsetParent) - return ({ - offsetLeft: node.offsetLeft + parent.offsetLeft, - offsetTop: node.offsetTop + parent.offsetTop - }) - } -} diff --git a/src/lib/utility/dom-helpers.ts b/src/lib/utility/dom-helpers.ts new file mode 100644 index 000000000..58539f869 --- /dev/null +++ b/src/lib/utility/dom-helpers.ts @@ -0,0 +1,59 @@ +// TODO: can we use getBoundingClientRect instead?? +// last place this is used is in "handleWheel" in ScrollElement +export function getParentPosition(element: HTMLElement) { + let xPosition = 0 + let yPosition = 0 + let first = true + + while (element) { + if ( + !element.offsetParent && + element.tagName === 'BODY' && + element.scrollLeft === 0 && + element.scrollTop === 0 + ) { + element = document.scrollingElement as HTMLElement || element + } + xPosition += + element.offsetLeft - (first ? 0 : element.scrollLeft) + element.clientLeft + yPosition += + element.offsetTop - (first ? 0 : element.scrollTop) + element.clientTop + element = element.offsetParent as HTMLElement + first = false + } + return { x: xPosition, y: yPosition } +} + +interface ScrollPosition { + scrollLeft: number; + scrollTop: number; +} + +export function getSumScroll(node: HTMLElement): ScrollPosition { + if (node === document.body) { + return { scrollLeft: 0, scrollTop: 0 }; + } else { + const parent = getSumScroll(node.parentNode as HTMLElement); + return { + scrollLeft: node.scrollLeft + parent.scrollLeft, + scrollTop: node.scrollTop + parent.scrollTop, + }; + } +} + +interface OffsetPosition { + offsetLeft: number; + offsetTop: number; +} + +export function getSumOffset(node: HTMLElement): OffsetPosition { + if (node === document.body || !node.offsetParent) { + return { offsetLeft: 0, offsetTop: 0 }; + } else { + const parent = getSumOffset(node.offsetParent as HTMLElement); + return { + offsetLeft: node.offsetLeft + parent.offsetLeft, + offsetTop: node.offsetTop + parent.offsetTop, + }; + } +} diff --git a/src/lib/utility/events.js b/src/lib/utility/events.js deleted file mode 100644 index 66856153f..000000000 --- a/src/lib/utility/events.js +++ /dev/null @@ -1,6 +0,0 @@ -export function composeEvents(...fns) { - return (event, ...args) => { - event.preventDefault() - fns.forEach(fn => fn && fn(event, ...args)) - } -} \ No newline at end of file diff --git a/src/lib/utility/events.ts b/src/lib/utility/events.ts new file mode 100644 index 000000000..ddc302df7 --- /dev/null +++ b/src/lib/utility/events.ts @@ -0,0 +1,9 @@ +import { SyntheticEvent } from 'react' + +type Fn = (event: T, ...args: any) => void +export function composeEvents>(...fns: (Fn | undefined)[]) { + return (event: T, ...args: any ) => { + event.preventDefault() + fns.forEach(fn => fn && fn(event, ...args)) + } +} diff --git a/src/lib/utility/generic.js b/src/lib/utility/generic.js deleted file mode 100644 index 3e4ae1527..000000000 --- a/src/lib/utility/generic.js +++ /dev/null @@ -1,36 +0,0 @@ -import isEqual from 'lodash.isequal' - -// so we could use both immutable.js objects and regular objects - -export function _get(object, key) { - return typeof object.get === 'function' ? object.get(key) : object[key] -} - -export function _length(object) { - return typeof object.count === 'function' ? object.count() : object.length -} - -export function arraysEqual(array1, array2) { - return ( - _length(array1) === _length(array2) && - array1.every((element, index) => { - return element === _get(array2, index) - }) - ) -} - -export function deepObjectCompare(obj1, obj2) { - return isEqual(obj1, obj2) -} - -export function keyBy(value, key) { - let obj = {} - - value.forEach(function(element) { - obj[element[key]] = element - }) - - return obj -} - -export function noop() {} diff --git a/src/lib/utility/generic.ts b/src/lib/utility/generic.ts new file mode 100644 index 000000000..4dd6b504c --- /dev/null +++ b/src/lib/utility/generic.ts @@ -0,0 +1,45 @@ +import isEqual from 'lodash/isEqual' + +// so we could use both immutable.js objects and regular objects + +type GetObject = { + get?: (key: string) => any + [key: string]: any +} + +export function _get(object: GetObject, key: string) { + return typeof object.get === 'function' ? object.get(key) : object[key] +} + +interface CountObject { + count?(): number; + length?: number; +} +export function _length(object: CountObject) { + return typeof object.count === 'function' ? object.count() : object.length +} + +export function arraysEqual(array1: T[], array2: T[]): boolean { + return ( + _length(array1) === _length(array2) && + array1.every((element, index) => { + return element === _get(array2, index.toString()); + }) + ); +} + +export function deepObjectCompare(obj1: any, obj2: any): boolean { + return isEqual(obj1, obj2); +} + +export function keyBy(value: T[], key: keyof T): Record { + const obj: Record = {}; + + value.forEach((element) => { + obj[element[key] as string] = element; + }); + + return obj; +} + +export function noop() {} diff --git a/src/resize-detector/container.js b/src/resize-detector/container.js deleted file mode 100644 index 0adfc67cf..000000000 --- a/src/resize-detector/container.js +++ /dev/null @@ -1,24 +0,0 @@ -import elementResizeDetectorMaker from 'element-resize-detector' - -function addListener(component) { - component._erd = elementResizeDetectorMaker({ - strategy: 'scroll' - }) - - component._erdWidth = component.container.offsetWidth - - component._erd.listenTo(component.container, element => { - var width = element.offsetWidth - - if (component._erdWidth !== width) { - component.resize(component.props) - component._erdWidth = width - } - }) -} - -function removeListener(component) { - component._erd.removeAllListeners(component.container) -} - -export default { addListener, removeListener } diff --git a/src/resize-detector/container.ts b/src/resize-detector/container.ts new file mode 100644 index 000000000..5dbd9c643 --- /dev/null +++ b/src/resize-detector/container.ts @@ -0,0 +1,36 @@ + +import elementResizeDetectorMaker from 'element-resize-detector' + +function addListener(component: ListenerParam) { + component._erd = elementResizeDetectorMaker({ + strategy: 'scroll' + }) + + component._erdWidth = component.container.offsetWidth + + component._erd.listenTo(component.container, (element: HTMLElement) => { + const width = element.offsetWidth + + if (component._erdWidth !== width) { + component.resize(component.props) + component._erdWidth = width + } + }) +} + +export type ListenerParam = { + _erd: { + listenTo: (container: HTMLElement, callback: (element: HTMLElement) => void) => void + removeAllListeners: (container: HTMLElement) => void + }, + props: T, + resize: (props: T) => void, + _erdWidth: number, + container: HTMLElement +} + +function removeListener(component: ListenerParam) { + component._erd.removeAllListeners(component.container) +} + +export default { addListener, removeListener } diff --git a/src/resize-detector/index.ts b/src/resize-detector/index.ts new file mode 100644 index 000000000..caf3de5bb --- /dev/null +++ b/src/resize-detector/index.ts @@ -0,0 +1,6 @@ +import type { ListenerParam } from './container' +import containerListeners from './container' +import windowListeners from './window' + +export type { ListenerParam } +export { containerListeners, windowListeners } diff --git a/src/resize-detector/window.js b/src/resize-detector/window.js deleted file mode 100644 index 078769ca8..000000000 --- a/src/resize-detector/window.js +++ /dev/null @@ -1,15 +0,0 @@ -function addListener(component) { - component._resizeEventListener = { - handleEvent: () => { - component.resize() - } - } - - window.addEventListener('resize', component._resizeEventListener) -} - -function removeListener(component) { - window.removeEventListener('resize', component._resizeEventListener) -} - -export default { addListener, removeListener } diff --git a/src/resize-detector/window.ts b/src/resize-detector/window.ts new file mode 100644 index 000000000..ec86123c4 --- /dev/null +++ b/src/resize-detector/window.ts @@ -0,0 +1,14 @@ +function addListener(component: { + _resizeEventListener?: (e: UIEvent) => void + resize: () => void +}) { + component._resizeEventListener = () => component.resize() + + window.addEventListener('resize', component._resizeEventListener) +} + +function removeListener(component: Record) { + window.removeEventListener('resize', component._resizeEventListener!) +} + +export default { addListener, removeListener } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..02d994499 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": false, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strictNullChecks": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/index.ts", "src/index.d.ts"], + "exclude": ["node_modules"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 000000000..42872c59f --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.mts b/vite.config.mts new file mode 100644 index 000000000..b1044fd91 --- /dev/null +++ b/vite.config.mts @@ -0,0 +1,52 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' +import { resolve } from 'path' +import { libInjectCss } from 'vite-plugin-lib-inject-css' +import typescript from '@rollup/plugin-typescript' +import { typescriptPaths } from 'rollup-plugin-typescript-paths' + +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + copyPublicDir: false, + outDir: 'dist', + sourcemap: true, + lib: { + entry: { + index: resolve('src', 'index.ts'), + styles: resolve('src/lib', 'Timeline.scss'), + 'resize-detector': resolve('src/resize-detector', 'index.ts'), + }, + name: 'react-calendar-timeline', + fileName: (format, entryName) => `react-calendar-timeline.${entryName}.${format}.js`, + }, + rollupOptions: { + external: ['react', 'react/jsx-runtime', 'react-dom', 'react-dom/client'], + output: { + globals: { + react: 'React', + }, + }, + plugins: [ + typescriptPaths({ + preserveExtensions: true, + }), + typescript({ + outDir: 'dist', + declaration: true, + }), + ], + }, + }, + resolve: { + alias: { + index: resolve(__dirname, 'src', 'index.ts'), + 'react-calendar-timeline/lib/Timeline.css': resolve(__dirname, 'src/lib', 'Timeline.scss'), + 'react-calendar-timeline/resize-detector': resolve(__dirname, 'src/resize-detector', 'index.ts'), + }, + }, + server: { + port: 3000, + }, + plugins: [react(), libInjectCss()], +}) diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 3f1dc0ceb..000000000 --- a/webpack.config.js +++ /dev/null @@ -1,54 +0,0 @@ -const path = require('path') - -const port = process.env.PORT || 8888 - -const config = { - devtool: 'cheap-eval-source-map', - context: path.join(__dirname, './demo'), - entry: { - // vendor: ['react', 'react-dom', 'faker', 'interactjs', 'moment'], - demo: [ - `webpack-dev-server/client?http://0.0.0.0:${port}`, - 'webpack/hot/only-dev-server', - './index.js' - ] - }, - output: { - path: path.join(__dirname, './build'), - publicPath: '', - chunkFilename: '[name].bundle.js', - filename: '[name].bundle.js' - }, - mode: 'development', - module: { - rules: [ - { - test: /\.scss$/, - loader: 'style-loader!css-loader!sass-loader' - }, - { - test: /\.(js|jsx)$/, - exclude: /node_modules/, - loaders: ['babel-loader'] - } - ] - }, - resolve: { - extensions: ['.js', '.jsx'], - modules: [path.resolve('./demo'), 'node_modules'], - alias: { - '~': path.join(__dirname, './demo'), - 'react-calendar-timeline': path.join(__dirname, './src'), - 'react-calendar-timeline-css': path.join( - __dirname, - './src/lib/Timeline.scss' - ) - } - }, - devServer: { - contentBase: './demo', - port - } -} - -module.exports = config diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index adaeacef0..000000000 --- a/yarn.lock +++ /dev/null @@ -1,8651 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/cli@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.5.0.tgz#f403c930692e28ecfa3bf02a9e7562b474f38271" - dependencies: - commander "^2.8.1" - convert-source-map "^1.1.0" - fs-readdir-recursive "^1.1.0" - glob "^7.0.0" - lodash "^4.17.11" - mkdirp "^0.5.1" - output-file-sync "^2.0.0" - slash "^2.0.0" - source-map "^0.5.0" - optionalDependencies: - chokidar "^2.0.4" - -"@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/core@^7.1.0", "@babel/core@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.0.tgz#6ed6a2881ad48a732c5433096d96d1b0ee5eb734" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/helpers" "^7.5.0" - "@babel/parser" "^7.5.0" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.0" - "@babel/types" "^7.5.0" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.11" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.4.0", "@babel/generator@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.0.tgz#f20e4b7a91750ee8b63656073d843d2a736dca4a" - dependencies: - "@babel/types" "^7.5.0" - jsesc "^2.5.1" - lodash "^4.17.11" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-builder-react-jsx@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" - dependencies: - "@babel/types" "^7.3.0" - esutils "^2.0.0" - -"@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/helper-create-class-features-plugin@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.0.tgz#02edb97f512d44ba23b3227f1bf2ed43454edac5" - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.4" - "@babel/helper-split-export-declaration" "^7.4.4" - -"@babel/helper-define-map@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.4.4" - lodash "^4.17.11" - -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-member-expression-to-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.4.4" - lodash "^4.17.11" - -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" - dependencies: - lodash "^4.17.11" - -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" - dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" - -"@babel/helpers@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.0.tgz#7f0c17666e7ed8355ed6eff643dde12fb681ddb4" - dependencies: - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.0" - "@babel/types" "^7.5.0" - -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.0.tgz#3e0713dff89ad6ae37faec3b29dcfc5c979770b7" - -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - -"@babel/plugin-proposal-class-properties@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.0.tgz#5bc6a0537d286fcb4fd4e89975adbca334987007" - dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-proposal-dynamic-import@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@^7.5.2": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.2.tgz#ec92b0c6419074ea7af77c78b7c5d42041f2f5a9" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" - -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-jsx@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-async-to-generator@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoping@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.11" - -"@babel/plugin-transform-classes@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.4.4" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.4" - "@babel/helper-split-export-declaration" "^7.4.4" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" - -"@babel/plugin-transform-duplicate-keys@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-for-of@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-amd@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-commonjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" - dependencies: - "@babel/helper-module-transforms" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-systemjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" - dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-umd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" - dependencies: - regexp-tree "^0.1.6" - -"@babel/plugin-transform-new-target@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-object-super@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - -"@babel/plugin-transform-parameters@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - dependencies: - "@babel/helper-call-delegate" "^7.4.4" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-property-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz#583b10c49cf057e237085bcbd8cc960bd83bd96b" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" - dependencies: - "@babel/helper-builder-react-jsx" "^7.3.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@babel/plugin-transform-regenerator@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" - dependencies: - regenerator-transform "^0.14.0" - -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.2.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-template-literals@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-unicode-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" - -"@babel/preset-env@^7.5.2": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.2.tgz#34a46f01aed617b174b8dbaf8fed9239300343d0" - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-dynamic-import" "^7.5.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.5.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.5.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.4.4" - "@babel/plugin-transform-classes" "^7.4.4" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.5.0" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/plugin-transform-duplicate-keys" "^7.5.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.4.4" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.5.0" - "@babel/plugin-transform-modules-systemjs" "^7.5.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" - "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.5" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.5.0" - browserslist "^4.6.0" - core-js-compat "^3.1.1" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.5.0" - -"@babel/preset-react@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - -"@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.0.tgz#4216d6586854ef5c3c4592dab56ec7eb78485485" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.0" - "@babel/types" "^7.5.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.11" - -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.0.tgz#e47d43840c2e7f9105bc4d3a2c371b4d0c7832ab" - dependencies: - esutils "^2.0.2" - lodash "^4.17.11" - to-fast-properties "^2.0.0" - -"@cnakazawa/watch@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@jest/console@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" - dependencies: - "@jest/source-map" "^24.3.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/core@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.8.0.tgz#fbbdcd42a41d0d39cddbc9f520c8bab0c33eed5b" - dependencies: - "@jest/console" "^24.7.1" - "@jest/reporters" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-changed-files "^24.8.0" - jest-config "^24.8.0" - jest-haste-map "^24.8.0" - jest-message-util "^24.8.0" - jest-regex-util "^24.3.0" - jest-resolve-dependencies "^24.8.0" - jest-runner "^24.8.0" - jest-runtime "^24.8.0" - jest-snapshot "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" - jest-watcher "^24.8.0" - micromatch "^3.1.10" - p-each-series "^1.0.0" - pirates "^4.0.1" - realpath-native "^1.1.0" - rimraf "^2.5.4" - strip-ansi "^5.0.0" - -"@jest/environment@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.8.0.tgz#0342261383c776bdd652168f68065ef144af0eac" - dependencies: - "@jest/fake-timers" "^24.8.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" - jest-mock "^24.8.0" - -"@jest/fake-timers@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.8.0.tgz#2e5b80a4f78f284bcb4bd5714b8e10dd36a8d3d1" - dependencies: - "@jest/types" "^24.8.0" - jest-message-util "^24.8.0" - jest-mock "^24.8.0" - -"@jest/reporters@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.8.0.tgz#075169cd029bddec54b8f2c0fc489fd0b9e05729" - dependencies: - "@jest/environment" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - istanbul-lib-coverage "^2.0.2" - istanbul-lib-instrument "^3.0.1" - istanbul-lib-report "^2.0.4" - istanbul-lib-source-maps "^3.0.1" - istanbul-reports "^2.1.1" - jest-haste-map "^24.8.0" - jest-resolve "^24.8.0" - jest-runtime "^24.8.0" - jest-util "^24.8.0" - jest-worker "^24.6.0" - node-notifier "^5.2.1" - slash "^2.0.0" - source-map "^0.6.0" - string-length "^2.0.0" - -"@jest/source-map@^24.3.0": - version "24.3.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/test-result@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.8.0.tgz#7675d0aaf9d2484caa65e048d9b467d160f8e9d3" - dependencies: - "@jest/console" "^24.7.1" - "@jest/types" "^24.8.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/test-sequencer@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz#2f993bcf6ef5eb4e65e8233a95a3320248cf994b" - dependencies: - "@jest/test-result" "^24.8.0" - jest-haste-map "^24.8.0" - jest-runner "^24.8.0" - jest-runtime "^24.8.0" - -"@jest/transform@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.8.0.tgz#628fb99dce4f9d254c6fd9341e3eea262e06fef5" - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^24.8.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.8.0" - jest-regex-util "^24.3.0" - jest-util "^24.8.0" - micromatch "^3.1.10" - realpath-native "^1.1.0" - slash "^2.0.0" - source-map "^0.6.1" - write-file-atomic "2.4.1" - -"@jest/types@^24.5.0": - version "24.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.5.0.tgz#feee214a4d0167b0ca447284e95a57aa10b3ee95" - dependencies: - "@types/istanbul-lib-coverage" "^1.1.0" - "@types/yargs" "^12.0.9" - -"@jest/types@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.8.0.tgz#f31e25948c58f0abd8c845ae26fcea1491dea7ad" - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^12.0.9" - -"@sheerun/mutationobserver-shim@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#8013f2af54a2b7d735f71560ff360d3a8176a87b" - -"@types/babel__core@^7.1.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" - dependencies: - "@babel/types" "^7.3.0" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - -"@types/istanbul-lib-coverage@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#2cc2ca41051498382b43157c8227fea60363f94a" - -"@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/node@*": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5" - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - -"@types/yargs@^12.0.2": - version "12.0.12" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" - -"@types/yargs@^12.0.9": - version "12.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.10.tgz#17a8ec65cd8e88f51b418ceb271af18d3137df67" - -"@webassemblyjs/ast@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" - dependencies: - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - debug "^3.1.0" - mamacro "^0.0.3" - -"@webassemblyjs/floating-point-hex-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" - -"@webassemblyjs/helper-api-error@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" - -"@webassemblyjs/helper-buffer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" - dependencies: - debug "^3.1.0" - -"@webassemblyjs/helper-code-frame@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" - dependencies: - "@webassemblyjs/wast-printer" "1.5.13" - -"@webassemblyjs/helper-fsm@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" - -"@webassemblyjs/helper-module-context@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" - dependencies: - debug "^3.1.0" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" - -"@webassemblyjs/helper-wasm-section@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - debug "^3.1.0" - -"@webassemblyjs/ieee754@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" - dependencies: - ieee754 "^1.1.11" - -"@webassemblyjs/leb128@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" - dependencies: - long "4.0.0" - -"@webassemblyjs/utf8@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" - -"@webassemblyjs/wasm-edit@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/helper-wasm-section" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - "@webassemblyjs/wast-printer" "1.5.13" - debug "^3.1.0" - -"@webassemblyjs/wasm-gen@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" - -"@webassemblyjs/wasm-opt@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - debug "^3.1.0" - -"@webassemblyjs/wasm-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" - -"@webassemblyjs/wast-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/floating-point-hex-parser" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-code-frame" "1.5.13" - "@webassemblyjs/helper-fsm" "1.5.13" - long "^3.2.0" - mamacro "^0.0.3" - -"@webassemblyjs/wast-printer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - long "^3.2.0" - -abab@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -accepts@~1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" - dependencies: - 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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - dependencies: - acorn "^5.0.0" - -acorn-globals@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" - dependencies: - acorn "^5.0.0" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.0.0, acorn@^5.1.2, acorn@^5.2.1: - version "5.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" - -acorn@^5.5.0: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - -acorn@^5.6.2: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" - -airbnb-prop-types@^2.13.2: - version "2.13.2" - resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.13.2.tgz#43147a5062dd2a4a5600e748a47b64004cc5f7fc" - dependencies: - array.prototype.find "^2.0.4" - function.prototype.name "^1.1.0" - has "^1.0.3" - is-regex "^1.0.4" - object-is "^1.0.1" - object.assign "^4.1.0" - object.entries "^1.1.0" - prop-types "^15.7.2" - prop-types-exact "^1.2.0" - react-is "^16.8.6" - -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@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - 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" - -ajv@^6.5.5: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ansi-escapes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" - -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.1.0, ansi-styles@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - 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" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -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@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - -array-flatten@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" - -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -array.prototype.find@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.0.tgz#630f2eaf70a39e608ac3573e45cf8ccd0ede9ad7" - dependencies: - define-properties "^1.1.3" - es-abstract "^1.13.0" - -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" - -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.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - dependencies: - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - -async@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" - -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" - -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - -babel-code-frame@^6.11.0, babel-code-frame@^6.22.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: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-eslint@^7.1.1: - version "7.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" - dependencies: - babel-code-frame "^6.22.0" - babel-traverse "^6.23.1" - babel-types "^6.23.0" - babylon "^6.17.0" - -babel-jest@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.8.0.tgz#5c15ff2b28e20b0f45df43fe6b7f2aae93dba589" - dependencies: - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.6.0" - chalk "^2.4.2" - slash "^2.0.0" - -babel-loader@^8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" - dependencies: - find-cache-dir "^2.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - pify "^4.0.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - dependencies: - object.assign "^4.1.0" - -babel-plugin-istanbul@^5.1.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz#841d16b9a58eeb407a0ddce622ba02fe87a752ba" - dependencies: - find-up "^3.0.0" - istanbul-lib-instrument "^3.3.0" - test-exclude "^5.2.3" - -babel-plugin-jest-hoist@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" - dependencies: - "@types/babel__traverse" "^7.0.6" - -babel-plugin-react-remove-properties@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-react-remove-properties/-/babel-plugin-react-remove-properties-0.3.0.tgz#7b623fb3c424b6efb4edc9b1ae4cc50e7154b87f" - -babel-preset-jest@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" - dependencies: - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.6.0" - -babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-traverse@^6.23.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.23.0, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.17.0, babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -batch-processor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - dependencies: - tweetnacl "^0.14.3" - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - -body-parser@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" - on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - -boolify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/boolify/-/boolify-1.0.1.tgz#b5c09e17cacd113d11b7bb3ed384cc012994d86b" - -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - dependencies: - hoek "4.x.x" - -brace-expansion@^1.1.7: - 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" - -braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browser-process-hrtime@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - dependencies: - resolve "1.1.7" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - dependencies: - pako "~1.0.5" - -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" - -browserslist@^4.6.0, browserslist@^4.6.2: - version "4.6.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.3.tgz#0530cbc6ab0c1f3fc8c819c72377ba55cf647f05" - dependencies: - caniuse-lite "^1.0.30000975" - electron-to-chromium "^1.3.164" - node-releases "^1.1.23" - -bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - -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" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase-keys@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000791" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000791.tgz#06787f56caef4300a17e35d137447123bdf536f9" - -caniuse-lite@^1.0.30000975: - version "1.0.30000979" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000979.tgz#92f16d00186a6cf20d6c5711bb6e042a3d667029" - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - dependencies: - rsvp "^4.8.4" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -chalk@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.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: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, 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.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - -chardet@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029" - -cheerio@^1.0.0-rc.2: - version "1.0.0-rc.2" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" - -chokidar@^2.0.0, chokidar@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" - optionalDependencies: - fsevents "^1.2.2" - -chokidar@^2.0.4: - version "2.1.6" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - -chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - dependencies: - tslib "^1.9.0" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - dependencies: - chalk "^1.1.3" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -classnames@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - -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-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -clone-deep@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" - dependencies: - for-own "^1.0.0" - is-plain-object "^2.0.4" - kind-of "^6.0.0" - shallow-clone "^1.0.0" - -clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - dependencies: - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - dependencies: - color-name "^1.1.1" - -color-name@^1.0.0, color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - dependencies: - color-name "^1.0.0" - -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" - -colors@0.5.x: - version "0.5.1" - resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" - -colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - -combined-stream@1.0.6, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - dependencies: - delayed-stream "~1.0.0" - -commander@^2.8.1, commander@~2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - -common-tags@^1.4.0: - version "1.7.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.2.tgz#24d9768c63d253a56ecff93845b44b4df1d52771" - dependencies: - babel-runtime "^6.26.0" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -compressible@~2.0.11: - version "2.0.12" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" - dependencies: - mime-db ">= 1.30.0 < 2" - -compression@^1.5.2: - version "1.7.1" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" - dependencies: - accepts "~1.3.4" - bytes "3.0.0" - compressible "~2.0.11" - debug "2.6.9" - on-headers "~1.0.1" - safe-buffer "5.1.1" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -concat-stream@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -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" - -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - -content-type-parser@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - -convert-source-map@^1.1.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.4.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -core-js-compat@^3.1.1: - version "3.1.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.4.tgz#e4d0c40fbd01e65b1d457980fe4112d4358a7408" - dependencies: - browserslist "^4.6.2" - core-js-pure "3.1.4" - semver "^6.1.1" - -core-js-pure@3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.4.tgz#5fa17dc77002a169a3566cc48dc774d2e13e3769" - -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: - 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" - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -create-react-context@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.2.tgz#9836542f9aaa22868cd7d4a6f82667df38019dca" - dependencies: - fbjs "^0.8.0" - gud "^1.0.0" - -cross-env@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.1.4.tgz#f61c14291f7cc653bb86457002ea80a04699d022" - dependencies: - cross-spawn "^5.1.0" - is-windows "^1.0.0" - -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" - which "^1.2.9" - -cross-spawn@^5.0.1, cross-spawn@^5.1.0: - 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@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - dependencies: - boom "5.x.x" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -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" - -css-loader@~0.26.0: - version "0.26.4" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz#b61e9e30db94303e6ffc892f10ecd09ad025a1fd" - dependencies: - babel-code-frame "^6.11.0" - css-selector-tokenizer "^0.7.0" - cssnano ">=2.6.1 <4" - loader-utils "^1.0.2" - lodash.camelcase "^4.3.0" - object-assign "^4.0.1" - postcss "^5.0.6" - postcss-modules-extract-imports "^1.0.0" - postcss-modules-local-by-default "^1.0.1" - postcss-modules-scope "^1.0.0" - postcss-modules-values "^1.1.0" - source-list-map "^0.1.7" - -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - -css-selector-tokenizer@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" - dependencies: - cssesc "^0.1.0" - fastparse "^1.1.1" - regexpu-core "^1.0.0" - -css-what@2.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" - -css.escape@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - -css@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz#f861f4ba61e79bedc962aa548e5780fd95cbc6be" - dependencies: - inherits "^2.0.1" - source-map "^0.1.38" - source-map-resolve "^0.5.1" - urix "^0.1.0" - -cssesc@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" - -"cssnano@>=2.6.1 <4": - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" - -"cssstyle@>= 0.2.37 < 0.3.0": - version "0.2.37" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" - dependencies: - cssom "0.3.x" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -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.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decamelize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" - dependencies: - xregexp "4.0.0" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -deep-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -del@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" - dependencies: - globby "^6.1.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - p-map "^1.1.1" - pify "^3.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - -depd@~1.1.1, 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" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - -detect-node@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" - -diff-sequences@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -discontinuous-range@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" - -dlv@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.1.tgz#c79d96bfe659a5568001250ed2aaf653992bdd3f" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - -dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - dependencies: - buffer-indexof "^1.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - dependencies: - esutils "^2.0.2" - -dom-serializer@0, dom-serializer@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" - dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" - -dom-testing-library@^3.18.2: - version "3.18.2" - resolved "https://registry.yarnpkg.com/dom-testing-library/-/dom-testing-library-3.18.2.tgz#07d65166743ad3299b7bee5b488e9622c31241bc" - dependencies: - "@babel/runtime" "^7.3.4" - "@sheerun/mutationobserver-shim" "^0.3.2" - pretty-format "^24.5.0" - wait-for-expect "^1.1.0" - -domain-browser@^1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" - -domelementtype@1, domelementtype@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" - -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" - -domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.0.tgz#81fe5df81b3f057052cde3a9fa9bf536a85b9ab0" - -domhandler@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" - dependencies: - domelementtype "1" - -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff" - dependencies: - dom-serializer "0" - domelementtype "1" - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -electron-releases@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/electron-releases/-/electron-releases-2.1.0.tgz#c5614bf811f176ce3c836e368a0625782341fd4e" - -electron-to-chromium@^1.2.7: - version "1.3.30" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.30.tgz#9666f532a64586651fc56a72513692e820d06a80" - dependencies: - electron-releases "^2.1.0" - -electron-to-chromium@^1.3.164: - version "1.3.187" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.187.tgz#fea64435f370892c0f27aded1bbdcb6f235c592b" - -element-resize-detector@^1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.1.12.tgz#8b3fd6eedda17f9c00b360a0ea2df9927ae80ba2" - dependencies: - batch-processor "^1.0.0" - -elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - -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" - dependencies: - iconv-lite "~0.4.13" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - dependencies: - once "^1.4.0" - -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -entities@^1.1.1, entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" - -enzyme-adapter-react-16@^1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.14.0.tgz#204722b769172bcf096cb250d33e6795c1f1858f" - dependencies: - enzyme-adapter-utils "^1.12.0" - has "^1.0.3" - object.assign "^4.1.0" - object.values "^1.1.0" - prop-types "^15.7.2" - react-is "^16.8.6" - react-test-renderer "^16.0.0-0" - semver "^5.7.0" - -enzyme-adapter-utils@^1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.0.tgz#96e3730d76b872f593e54ce1c51fa3a451422d93" - dependencies: - airbnb-prop-types "^2.13.2" - function.prototype.name "^1.1.0" - object.assign "^4.1.0" - object.fromentries "^2.0.0" - prop-types "^15.7.2" - semver "^5.6.0" - -enzyme@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.10.0.tgz#7218e347c4a7746e133f8e964aada4a3523452f6" - dependencies: - array.prototype.flat "^1.2.1" - cheerio "^1.0.0-rc.2" - function.prototype.name "^1.1.0" - has "^1.0.3" - html-element-map "^1.0.0" - is-boolean-object "^1.0.0" - is-callable "^1.1.4" - is-number-object "^1.0.3" - is-regex "^1.0.4" - is-string "^1.0.4" - is-subset "^0.1.1" - lodash.escape "^4.0.1" - lodash.isequal "^4.5.0" - object-inspect "^1.6.0" - object-is "^1.0.1" - object.assign "^4.1.0" - object.entries "^1.0.4" - object.values "^1.0.4" - raf "^3.4.0" - rst-selector-parser "^2.2.3" - string.prototype.trim "^1.1.2" - -errno@^0.1.3: - version "0.1.6" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026" - dependencies: - prr "~1.0.1" - -errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.5.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" - -es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" - 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" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.45" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653" - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "1" - -es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - -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: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -escodegen@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.5.6" - -eslint-config-prettier@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz#ec07bc1d01f87d09f61d3840d112dc8a9791e30b" - dependencies: - get-stdin "^5.0.1" - -eslint-config-standard@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-6.2.1.tgz#d3a68aafc7191639e7ee441e7348739026354292" - -eslint-plugin-jest@^21.6.1: - version "21.27.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.27.2.tgz#2a795b7c3b5e707df48a953d651042bd01d7b0a8" - -eslint-plugin-prettier@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz#b4312dcf2c1d965379d7f9d5b5f8aaadc6a45904" - dependencies: - fast-diff "^1.1.1" - jest-docblock "^21.0.0" - -eslint-plugin-promise@^3.4.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz#65ebf27a845e3c1e9d6f6a5622ddd3801694b621" - -eslint-plugin-react@^7.5.1: - version "7.14.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.2.tgz#94c193cc77a899ac0ecbb2766fbef88685b7ecc1" - dependencies: - array-includes "^3.0.3" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.1.0" - object.entries "^1.1.0" - object.fromentries "^2.0.0" - object.values "^1.1.0" - prop-types "^15.7.2" - resolve "^1.10.1" - -eslint-plugin-standard@^2.0.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-2.3.1.tgz#6765bd2a6d9ecdc7bdf1b145ae4bb30e2b7b86f8" - -eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - -eslint@^4.0.0, eslint@^4.5.0: - version "4.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.16.0.tgz#934ada9e98715e1d7bbfd6f6f0519ed2fab35cc1" - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.2" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "^4.0.1" - text-table "~0.2.0" - -eslint@^4.16.0: - version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" - -espree@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" - dependencies: - acorn "^5.2.1" - acorn-jsx "^3.0.0" - -espree@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" - dependencies: - estraverse "^4.1.0" - object-assign "^4.0.1" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -esutils@^2.0.0, esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -eventsource@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" - dependencies: - original ">=0.0.5" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.8.0.tgz#471f8ec256b7b6129ca2524b2a62f030df38718d" - dependencies: - "@jest/types" "^24.8.0" - ansi-styles "^3.2.0" - jest-get-type "^24.8.0" - jest-matcher-utils "^24.8.0" - jest-message-util "^24.8.0" - jest-regex-util "^24.3.0" - -express@^4.16.2: - 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" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.1, extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - -external-editor@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -external-editor@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.0.tgz#dc35c48c6f98a30ca27a20e9687d7f3c77704bb6" - dependencies: - chardet "^0.5.0" - iconv-lite "^0.4.22" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - -faker@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - -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-diff@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - -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" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -fastparse@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" - -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" - dependencies: - websocket-driver ">=0.5.1" - -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - dependencies: - bser "^2.0.0" - -fbjs@^0.8.0: - version "0.8.17" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - -fbjs@^0.8.16: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.9" - -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" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.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" - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - -find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - dependencies: - locate-path "^3.0.0" - -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -flatten@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" - -flush-write-stream@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" - -for-in@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - dependencies: - for-in "^1.0.1" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - dependencies: - asynckit "^0.4.0" - combined-stream "1.0.6" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - dependencies: - minipass "^2.2.1" - -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - -fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" - -fstream@^1.0.0, fstream@^1.0.2: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -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.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.0.tgz#8bd763cc0af860a859cc5d49384d74b932cd2327" - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - is-callable "^1.1.3" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - dependencies: - globule "^1.0.0" - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-stdin@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@~7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules-path@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" - -globals@^11.0.1: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.1.0.tgz#632644457f5f0e3ae711807183700ebf2e4633e4" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globule@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - -graceful-fs@^4.1.15: - version "4.2.0" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - -handle-thing@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" - -handlebars@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -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" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - -history@^4.7.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" - dependencies: - invariant "^2.2.1" - loose-envify "^1.2.0" - resolve-pathname "^2.2.0" - value-equal "^0.4.0" - warning "^3.0.0" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoek@4.x.x: - version "4.2.1" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" - -hoist-non-react-statics@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz#343db84c6018c650778898240135a1420ee22ce0" - -hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-comment-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" - -html-element-map@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.0.1.tgz#3c4fcb4874ebddfe4283b51c8994e7713782b592" - dependencies: - array-filter "^1.0.0" - -html-encoding-sniffer@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - dependencies: - whatwg-encoding "^1.0.1" - -html-entities@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - -htmlparser2@^3.9.1: - version "3.9.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" - dependencies: - domelementtype "^1.3.0" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^2.0.2" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - -http-errors@1.6.2, http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-parser-js@>=0.4.0: - version "0.4.9" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1" - -http-proxy-middleware@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" - dependencies: - http-proxy "^1.16.2" - is-glob "^4.0.0" - lodash "^4.17.5" - micromatch "^3.1.9" - -http-proxy@^1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" - dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - -iconv-lite@0.4.19, iconv-lite@^0.4.17, 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.22, iconv-lite@^0.4.4: - 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" - -ieee754@^1.1.11: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - -ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - dependencies: - minimatch "^3.0.4" - -ignore@^3.2.7, ignore@^3.3.3: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" - -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -in-publish@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -indent-string@^3.0.0, indent-string@^3.1.0, indent-string@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -inquirer@^3.0.6: - 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@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.0.0.tgz#e8c20303ddc15bbfc2c12a6213710ccd9e1413d8" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.0" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.1.0" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -interactjs@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/interactjs/-/interactjs-1.3.4.tgz#9d5aa886f8fa03ea2f6c711e688792e3d3bde1ff" - -internal-ip@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" - dependencies: - meow "^3.3.0" - -interpret@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" - -invariant@^2.2.1: - 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.2, invariant@^2.2.4: - 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" - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - -ipaddr.js@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" - -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" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-boolean-object@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" - -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - dependencies: - ci-info "^2.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - dependencies: - is-extglob "^2.1.1" - -is-number-object@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - -is-resolvable@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.1.tgz#acca1cd36dbe44b974b924321555a70ba03b1cf4" - -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" - -is-string@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" - -is-subset@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" - -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - dependencies: - html-comment-regex "^1.1.0" - -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - dependencies: - has-symbols "^1.0.0" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-windows@^1.0.0, is-windows@^1.0.2: - 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" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - -istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" - -istanbul-lib-report@^2.0.4: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" - -istanbul-lib-source-maps@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" - source-map "^0.6.1" - -istanbul-reports@^2.1.1: - version "2.2.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" - dependencies: - handlebars "^4.1.2" - -jest-changed-files@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.8.0.tgz#7e7eb21cf687587a85e50f3d249d1327e15b157b" - dependencies: - "@jest/types" "^24.8.0" - execa "^1.0.0" - throat "^4.0.0" - -jest-cli@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.8.0.tgz#b075ac914492ed114fa338ade7362a301693e989" - dependencies: - "@jest/core" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" - chalk "^2.0.1" - exit "^0.1.2" - import-local "^2.0.0" - is-ci "^2.0.0" - jest-config "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" - prompts "^2.0.1" - realpath-native "^1.1.0" - yargs "^12.0.2" - -jest-config@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.8.0.tgz#77db3d265a6f726294687cbbccc36f8a76ee0f4f" - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.8.0" - "@jest/types" "^24.8.0" - babel-jest "^24.8.0" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^24.8.0" - jest-environment-node "^24.8.0" - jest-get-type "^24.8.0" - jest-jasmine2 "^24.8.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" - micromatch "^3.1.10" - pretty-format "^24.8.0" - realpath-native "^1.1.0" - -jest-diff@^24.0.0, jest-diff@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.8.0.tgz#146435e7d1e3ffdf293d53ff97e193f1d1546172" - dependencies: - chalk "^2.0.1" - diff-sequences "^24.3.0" - jest-get-type "^24.8.0" - pretty-format "^24.8.0" - -jest-docblock@^21.0.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" - -jest-docblock@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" - dependencies: - detect-newline "^2.1.0" - -jest-dom@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/jest-dom/-/jest-dom-3.5.0.tgz#715908b545c0d66a0eba9d21fc59357fac024f43" - dependencies: - chalk "^2.4.1" - css "^2.2.3" - css.escape "^1.5.1" - jest-diff "^24.0.0" - jest-matcher-utils "^24.0.0" - lodash "^4.17.11" - pretty-format "^24.0.0" - redent "^2.0.0" - -jest-each@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.8.0.tgz#a05fd2bf94ddc0b1da66c6d13ec2457f35e52775" - dependencies: - "@jest/types" "^24.8.0" - chalk "^2.0.1" - jest-get-type "^24.8.0" - jest-util "^24.8.0" - pretty-format "^24.8.0" - -jest-environment-jsdom@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz#300f6949a146cabe1c9357ad9e9ecf9f43f38857" - dependencies: - "@jest/environment" "^24.8.0" - "@jest/fake-timers" "^24.8.0" - "@jest/types" "^24.8.0" - jest-mock "^24.8.0" - jest-util "^24.8.0" - jsdom "^11.5.1" - -jest-environment-node@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.8.0.tgz#d3f726ba8bc53087a60e7a84ca08883a4c892231" - dependencies: - "@jest/environment" "^24.8.0" - "@jest/fake-timers" "^24.8.0" - "@jest/types" "^24.8.0" - jest-mock "^24.8.0" - jest-util "^24.8.0" - -jest-get-type@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.8.0.tgz#a7440de30b651f5a70ea3ed7ff073a32dfe646fc" - -jest-haste-map@^24.8.0: - version "24.8.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.8.1.tgz#f39cc1d2b1d907e014165b4bd5a957afcb992982" - dependencies: - "@jest/types" "^24.8.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.4.0" - jest-util "^24.8.0" - jest-worker "^24.6.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - -jest-jasmine2@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz#a9c7e14c83dd77d8b15e820549ce8987cc8cd898" - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^24.8.0" - is-generator-fn "^2.0.0" - jest-each "^24.8.0" - jest-matcher-utils "^24.8.0" - jest-message-util "^24.8.0" - jest-runtime "^24.8.0" - jest-snapshot "^24.8.0" - jest-util "^24.8.0" - pretty-format "^24.8.0" - throat "^4.0.0" - -jest-leak-detector@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz#c0086384e1f650c2d8348095df769f29b48e6980" - dependencies: - pretty-format "^24.8.0" - -jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz#2bce42204c9af12bde46f83dc839efe8be832495" - dependencies: - chalk "^2.0.1" - jest-diff "^24.8.0" - jest-get-type "^24.8.0" - pretty-format "^24.8.0" - -jest-message-util@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.8.0.tgz#0d6891e72a4beacc0292b638685df42e28d6218b" - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-mock@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.8.0.tgz#2f9d14d37699e863f1febf4e4d5a33b7fdbbde56" - dependencies: - "@jest/types" "^24.8.0" - -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - -jest-regex-util@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" - -jest-resolve-dependencies@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz#19eec3241f2045d3f990dba331d0d7526acff8e0" - dependencies: - "@jest/types" "^24.8.0" - jest-regex-util "^24.3.0" - jest-snapshot "^24.8.0" - -jest-resolve@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.8.0.tgz#84b8e5408c1f6a11539793e2b5feb1b6e722439f" - dependencies: - "@jest/types" "^24.8.0" - browser-resolve "^1.11.3" - chalk "^2.0.1" - jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" - -jest-runner@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.8.0.tgz#4f9ae07b767db27b740d7deffad0cf67ccb4c5bb" - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" - chalk "^2.4.2" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-config "^24.8.0" - jest-docblock "^24.3.0" - jest-haste-map "^24.8.0" - jest-jasmine2 "^24.8.0" - jest-leak-detector "^24.8.0" - jest-message-util "^24.8.0" - jest-resolve "^24.8.0" - jest-runtime "^24.8.0" - jest-util "^24.8.0" - jest-worker "^24.6.0" - source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runtime@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.8.0.tgz#05f94d5b05c21f6dc54e427cd2e4980923350620" - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.8.0" - "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" - "@types/yargs" "^12.0.2" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.1.15" - jest-config "^24.8.0" - jest-haste-map "^24.8.0" - jest-message-util "^24.8.0" - jest-mock "^24.8.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.8.0" - jest-snapshot "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" - realpath-native "^1.1.0" - slash "^2.0.0" - strip-bom "^3.0.0" - yargs "^12.0.2" - -jest-serializer@^24.4.0: - version "24.4.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" - -jest-snapshot@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.8.0.tgz#3bec6a59da2ff7bc7d097a853fb67f9d415cb7c6" - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^24.8.0" - chalk "^2.0.1" - expect "^24.8.0" - jest-diff "^24.8.0" - jest-matcher-utils "^24.8.0" - jest-message-util "^24.8.0" - jest-resolve "^24.8.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^24.8.0" - semver "^5.5.0" - -jest-util@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.8.0.tgz#41f0e945da11df44cc76d64ffb915d0716f46cd1" - dependencies: - "@jest/console" "^24.7.1" - "@jest/fake-timers" "^24.8.0" - "@jest/source-map" "^24.3.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - -jest-validate@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.8.0.tgz#624c41533e6dfe356ffadc6e2423a35c2d3b4849" - dependencies: - "@jest/types" "^24.8.0" - camelcase "^5.0.0" - chalk "^2.0.1" - jest-get-type "^24.8.0" - leven "^2.1.0" - pretty-format "^24.8.0" - -jest-watch-typeahead@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.3.1.tgz#47701024b64b444aa325d801b4b3a6d61ed70701" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.4.1" - jest-watcher "^24.3.0" - slash "^2.0.0" - string-length "^2.0.0" - strip-ansi "^5.0.0" - -jest-watcher@^24.3.0, jest-watcher@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.8.0.tgz#58d49915ceddd2de85e238f6213cef1c93715de4" - dependencies: - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" - "@types/yargs" "^12.0.9" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - jest-util "^24.8.0" - string-length "^2.0.0" - -jest-worker@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" - dependencies: - merge-stream "^1.0.1" - supports-color "^6.1.0" - -jest@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.8.0.tgz#d5dff1984d0d1002196e9b7f12f75af1b2809081" - dependencies: - import-local "^2.0.0" - jest-cli "^24.8.0" - -js-base64@^2.1.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" - -js-base64@^2.1.9: - version "2.4.0" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa" - -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - -js-yaml@^3.9.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jsdom@^11.5.1: - version "11.5.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.5.1.tgz#5df753b8d0bca20142ce21f4f6c039f99a992929" - dependencies: - abab "^1.0.3" - acorn "^5.1.2" - acorn-globals "^4.0.0" - array-equal "^1.0.0" - browser-process-hrtime "^0.1.2" - content-type-parser "^1.0.1" - cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.2.37 < 0.3.0" - domexception "^1.0.0" - escodegen "^1.9.0" - html-encoding-sniffer "^1.0.1" - left-pad "^1.2.0" - nwmatcher "^1.4.3" - parse5 "^3.0.2" - pn "^1.0.0" - request "^2.83.0" - request-promise-native "^1.0.3" - sax "^1.2.1" - symbol-tree "^3.2.1" - tough-cookie "^2.3.3" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.1" - whatwg-url "^6.3.0" - xml-name-validator "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - 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" - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - dependencies: - minimist "^1.2.0" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jsx-ast-utils@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz#4d4973ebf8b9d2837ee91a8208cc66f3a2776cfb" - dependencies: - array-includes "^3.0.3" - object.assign "^4.1.0" - -killable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -kleur@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - dependencies: - invert-kv "^2.0.0" - -left-pad@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee" - -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - -loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - -lodash.escape@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - -lodash.merge@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - -lodash.tail@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" - -lodash.unescape@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" - -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.0.0, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - -lodash@^4.13.1, lodash@^4.15.0, lodash@^4.3.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - -lodash@^4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - -log-symbols@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - dependencies: - chalk "^2.0.1" - -loglevel-colored-level-prefix@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" - dependencies: - chalk "^1.1.3" - loglevel "^1.4.1" - -loglevel@^1.4.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" - -loglevelnext@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" - dependencies: - es6-symbol "^3.1.1" - object.assign "^4.1.0" - -long@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - -long@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - -loose-envify@^1.0.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -loud-rejection@^1.0.0, loud-rejection@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lru-cache@^4.0.1, lru-cache@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -macaddress@^0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - dependencies: - pify "^3.0.0" - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-plural@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.1.1.tgz#5658ce9d337487077daed221854c8cef9dd75749" - optionalDependencies: - minimist "^1.2.0" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - dependencies: - tmpl "1.0.x" - -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -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" - -md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - dependencies: - mimic-fn "^1.0.0" - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memoize-one@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" - integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^3.3.0, meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - -messageformat-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-1.1.0.tgz#13ba2250a76bbde8e0fca0dbb3475f95c594a90a" - -messageformat@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-1.1.1.tgz#ceaa2e6c86929d4807058275a7372b1bd963bdf6" - dependencies: - glob "~7.0.6" - make-plural "^4.1.1" - messageformat-parser "^1.1.0" - nopt "~3.0.6" - reserved-words "^0.1.2" - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.40.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - -"mime-db@>= 1.30.0 < 2": - version "1.32.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" - -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.17, 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-types@~2.1.15, mime-types@~2.1.16: - 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.19: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - dependencies: - mime-db "1.40.0" - -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - -mime@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" - -mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - dependencies: - minipass "^2.2.1" - -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.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mixin-object@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" - dependencies: - for-in "^0.1.3" - is-extendable "^0.1.1" - -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -moment@^2.11.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -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.12.1, nan@^2.13.2: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - -nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - -nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-odd "^2.0.0" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -nearley@^2.7.10: - version "2.11.0" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.11.0.tgz#5e626c79a6cd2f6ab9e7e5d5805e7668967757ae" - dependencies: - nomnom "~1.6.2" - railroad-diagrams "^1.0.0" - randexp "^0.4.2" - -needle@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - -neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" - -neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - -next-tick@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - -nice-try@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-forge@0.7.5: - version "0.7.5" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" - -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - -node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.0" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - -node-notifier@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - dependencies: - growly "^1.3.0" - semver "^5.4.1" - shellwords "^0.1.1" - which "^1.3.0" - -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-releases@^1.1.23: - version "1.1.25" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.25.tgz#0c2d7dbc7fed30fbe02a9ee3007b8c90bf0133d3" - dependencies: - semver "^5.3.0" - -node-sass@^4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash "^4.17.11" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.13.2" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "^2.2.4" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -nomnom@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.6.2.tgz#84a66a260174408fc5b77a18f888eccc44fb6971" - dependencies: - colors "0.5.x" - underscore "~1.4.4" - -"nopt@2 || 3", nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - dependencies: - abbrev "1" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - -normalize-url@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" - -npm-packlist@^1.1.6: - version "1.1.11" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - dependencies: - path-key "^2.0.0" - -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" - dependencies: - boolbase "~1.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -nwmatcher@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" - -oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - -object-is@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" - -object-keys@^1.0.11, object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" - -object-keys@^1.0.12: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.entries@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" - -object.entries@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" - dependencies: - define-properties "^1.1.3" - es-abstract "^1.12.0" - function-bind "^1.1.1" - has "^1.0.3" - -object.fromentries@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.11.0" - function-bind "^1.1.1" - has "^1.0.1" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -object.values@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" - -object.values@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" - dependencies: - define-properties "^1.1.3" - es-abstract "^1.12.0" - function-bind "^1.1.1" - has "^1.0.3" - -obuf@^1.0.0, obuf@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -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.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" - dependencies: - is-wsl "^1.1.0" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -original@>=0.0.5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" - dependencies: - url-parse "1.0.x" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -output-file-sync@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" - dependencies: - graceful-fs "^4.1.11" - is-plain-obj "^1.1.0" - mkdirp "^0.5.1" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - -p-each-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" - dependencies: - p-reduce "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - -p-limit@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - dependencies: - p-limit "^2.0.0" - -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - -p-try@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - -pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -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" - -parse5@^3.0.1, parse5@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - dependencies: - "@types/node" "*" - -parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - -path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - dependencies: - isarray "0.0.1" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - dependencies: - pify "^3.0.0" - -pbkdf2@^3.0.3: - version "3.0.16" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - dependencies: - find-up "^3.0.0" - -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - -pn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - -portfinder@^1.0.9: - version "1.0.13" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" - dependencies: - async "^1.5.2" - debug "^2.2.0" - mkdirp "0.5.x" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" - dependencies: - postcss "^5.0.4" - uniqid "^4.0.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" - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - -postcss-modules-extract-imports@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" - dependencies: - postcss "^6.0.1" - -postcss-modules-local-by-default@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-scope@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-values@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" - -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - dependencies: - postcss "^5.0.5" - -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - dependencies: - postcss "^5.0.4" - -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" - -postcss@^6.0.1: - version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.16.tgz#112e2fe2a6d2109be0957687243170ea5589e146" - dependencies: - chalk "^2.3.0" - source-map "^0.6.1" - supports-color "^5.1.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -prettier-eslint-cli@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/prettier-eslint-cli/-/prettier-eslint-cli-4.7.0.tgz#66421dd8e03ea67d6ba28d9e16b0de01559bc8ad" - dependencies: - arrify "^1.0.1" - babel-runtime "^6.23.0" - boolify "^1.0.0" - camelcase-keys "^4.1.0" - chalk "2.3.0" - common-tags "^1.4.0" - eslint "^4.5.0" - find-up "^2.1.0" - get-stdin "^5.0.1" - glob "^7.1.1" - ignore "^3.2.7" - indent-string "^3.1.0" - lodash.memoize "^4.1.2" - loglevel-colored-level-prefix "^1.0.0" - messageformat "^1.0.2" - prettier-eslint "^8.5.0" - rxjs "^5.3.0" - yargs "10.0.3" - -prettier-eslint@^8.5.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.8.1.tgz#38505163274742f2a0b31653c39e40f37ebd07da" - dependencies: - babel-runtime "^6.26.0" - common-tags "^1.4.0" - dlv "^1.1.0" - eslint "^4.0.0" - indent-string "^3.2.0" - lodash.merge "^4.6.0" - loglevel-colored-level-prefix "^1.0.0" - prettier "^1.7.0" - pretty-format "^22.0.3" - require-relative "^0.8.7" - typescript "^2.5.1" - typescript-eslint-parser "^11.0.0" - -prettier@^1.10.2, prettier@^1.7.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.10.2.tgz#1af8356d1842276a99a5b5529c82dd9e9ad3cc93" - -pretty-format@^22.0.3: - version "22.1.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.1.0.tgz#2277605b40ed4529ae4db51ff62f4be817647914" - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -pretty-format@^24.0.0, pretty-format@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.8.0.tgz#8dae7044f58db7cb8be245383b565a963e3c27f2" - dependencies: - "@jest/types" "^24.8.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -pretty-format@^24.5.0: - version "24.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.5.0.tgz#cc69a0281a62cd7242633fc135d6930cd889822d" - dependencies: - "@jest/types" "^24.5.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - -progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - dependencies: - asap "~2.0.3" - -prompts@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.1.0.tgz#bf90bc71f6065d255ea2bdc0fe6520485c1b45db" - dependencies: - kleur "^3.0.2" - sisteransi "^1.0.0" - -prop-types-exact@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" - dependencies: - has "^1.0.3" - object.assign "^4.1.0" - reflect.ownkeys "^0.2.0" - -prop-types@^15.5.4, prop-types@^15.6.0: - version "15.6.0" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.3.1" - object-assign "^4.1.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" - -prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -proxy-addr@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.8.0" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -psl@^1.1.24: - version "1.4.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" - -public-encrypt@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - -pump@^2.0.0, 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" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -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.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - -qs@6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - -qs@~6.5.1, qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - -querystringify@0.0.x: - version "0.0.4" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" - -querystringify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" - -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - -raf@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" - dependencies: - performance-now "^2.1.0" - -railroad-diagrams@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" - -randexp@^0.4.2: - version "0.4.6" - resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" - dependencies: - discontinuous-range "1.0.0" - ret "~0.1.10" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - dependencies: - safe-buffer "^5.1.0" - -randomcolor@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/randomcolor/-/randomcolor-0.5.3.tgz#7f90f2f2a7f6d5a52232161eeaeeaea9ac3b5815" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.0.3, range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-dom@^16.2.0: - 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-is@^16.4.1: - version "16.4.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e" - -react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" - -react-router-dom@^4.1.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.2.2.tgz#c8a81df3adc58bba8a76782e946cbd4eae649b8d" - dependencies: - history "^4.7.2" - invariant "^2.2.2" - loose-envify "^1.3.1" - prop-types "^15.5.4" - react-router "^4.2.0" - warning "^3.0.0" - -react-router@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.2.0.tgz#61f7b3e3770daeb24062dae3eedef1b054155986" - dependencies: - history "^4.7.2" - hoist-non-react-statics "^2.3.0" - invariant "^2.2.2" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.5.4" - warning "^3.0.0" - -react-test-renderer@^16.0.0-0: - version "16.4.1" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.1.tgz#f2fb30c2c7b517db6e5b10ed20bb6b0a7ccd8d70" - dependencies: - fbjs "^0.8.16" - object-assign "^4.1.1" - prop-types "^15.6.0" - react-is "^16.4.1" - -react-testing-library@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/react-testing-library/-/react-testing-library-6.0.3.tgz#8b5d276a353c17ce4f7486015bb7a1c8827c442c" - dependencies: - "@babel/runtime" "^7.4.2" - dom-testing-library "^3.18.2" - -react@^16.2.0: - 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" - object-assign "^4.1.1" - prop-types "^15.6.0" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^2.0.2, readable-stream@^2.2.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -realpath-native@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - dependencies: - util.promisify "^1.0.0" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" - dependencies: - balanced-match "^0.4.2" - -reflect.ownkeys@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" - -regenerate-unicode-properties@^8.0.2: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - dependencies: - regenerate "^1.4.0" - -regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" - -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - -regenerator-runtime@^0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" - -regenerator-transform@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" - dependencies: - private "^0.1.6" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp-tree@^0.1.6: - version "0.1.10" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" - -regexpp@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - -regexpu-core@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regexpu-core@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.0.2" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - dependencies: - lodash "^4.13.1" - -request-promise-native@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" - -request@^2.83.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@^2.87.0, request@^2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - -require-relative@^0.8.7: - version "0.8.7" - resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" - -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - -reserved-words@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - dependencies: - resolve-from "^3.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" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - -resolve-pathname@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - -resolve@^1.10.1, resolve@^1.3.2: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - dependencies: - path-parse "^1.0.6" - -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" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -rimraf@2, rimraf@^2.2.8, 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: - glob "^7.0.5" - -rimraf@^2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rst-selector-parser@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" - dependencies: - lodash.flattendeep "^4.4.0" - nearley "^2.7.10" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - -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" - -rxjs@^5.3.0: - version "5.5.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" - dependencies: - symbol-observable "1.0.1" - -rxjs@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" - dependencies: - tslib "^1.9.0" - -safe-buffer@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sass-graph@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^7.0.0" - -sass-loader@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.3.tgz#6ca10871a1cc7549f8143db5a9958242c4e4ca2a" - dependencies: - clone-deep "^2.0.1" - loader-utils "^1.0.1" - lodash.tail "^4.1.1" - neo-async "^2.5.0" - pify "^3.0.0" - -sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -schema-utils@^0.4.4, 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" - -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - -selfsigned@^1.9.1: - version "1.10.3" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz#d628ecf9e3735f84e8bafba936b3cf85bea43823" - dependencies: - node-forge "0.7.5" - -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -semver@5.4.1, semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - -semver@^5.6.0, semver@^5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - -semver@^6.0.0, semver@^6.1.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" - -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -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.5.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" - -serve-index@^1.7.2: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -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" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4, setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-clone@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" - dependencies: - is-extendable "^0.1.1" - kind-of "^5.0.0" - mixin-object "^2.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -sisteransi@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.2.tgz#ec57d64b6f25c4f26c0e2c7dd23f2d7f12f7e418" - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - dependencies: - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sntp@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" - dependencies: - hoek "4.x.x" - -sockjs-client@1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83" - dependencies: - debug "^2.6.6" - eventsource "0.1.6" - faye-websocket "~0.11.0" - inherits "^2.0.1" - json3 "^3.3.2" - url-parse "^1.1.8" - -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - dependencies: - faye-websocket "^0.10.0" - uuid "^3.0.1" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" - -source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" - -source-map-resolve@^0.5.0, source-map-resolve@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -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.1.38: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" - -spdy-transport@^2.0.18: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" - dependencies: - debug "^2.6.8" - detect-node "^2.0.3" - hpack.js "^2.1.6" - obuf "^1.1.1" - readable-stream "^2.2.9" - safe-buffer "^5.0.1" - wbuf "^1.7.2" - -spdy@^3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" - dependencies: - debug "^2.6.8" - handle-thing "^1.2.5" - http-deceiver "^1.2.7" - safe-buffer "^5.0.1" - select-hose "^2.0.0" - spdy-transport "^2.0.18" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - safer-buffer "^2.0.2" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.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" - -stack-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"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" - -stdout-stream@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" - dependencies: - readable-stream "^2.0.1" - -stealthy-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - 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.trim@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.0" - function-bind "^1.0.2" - -string_decoder@^1.0.0, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - dependencies: - safe-buffer "~5.1.0" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -stringstream@~0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" - -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: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - dependencies: - ansi-regex "^4.1.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - -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.13.0: - version "0.13.2" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz#74533384cf698c7104c7951150b49717adc2f3bb" - dependencies: - loader-utils "^1.0.2" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - -supports-color@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - dependencies: - has-flag "^2.0.0" - -supports-color@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" - 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" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - dependencies: - has-flag "^3.0.0" - -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - -symbol-tree@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - -table@4.0.2, table@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -tapable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" - -tar@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -tar@^4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" - -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - -through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -thunky@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" - -timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - dependencies: - setimmediate "^1.0.4" - -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" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@>=2.3.3, tough-cookie@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - dependencies: - punycode "^1.4.1" - -tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - dependencies: - punycode "^1.4.1" - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -tr46@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - dependencies: - punycode "^2.1.0" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -"true-case-path@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" - dependencies: - glob "^6.0.4" - -tslib@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.15: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" - dependencies: - 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" - -typescript-eslint-parser@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-11.0.0.tgz#37dba6a0130dd307504aa4b4b21b0d3dc7d4e9f2" - dependencies: - lodash.unescape "4.0.1" - semver "5.4.1" - -typescript@^2.5.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" - -ua-parser-js@^0.7.18: - version "0.7.18" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" - -ua-parser-js@^0.7.9: - version "0.7.17" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" - -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -uglify-js@^3.1.4: - version "3.6.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" - dependencies: - commander "~2.20.0" - source-map "~0.6.1" - -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" - -underscore@~1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - -uniqid@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" - dependencies: - macaddress "^0.2.8" - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - -unique-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" - dependencies: - imurmurhash "^0.1.4" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - -upath@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - -uri-js@^4.2.1, uri-js@^4.2.2: - 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" - -url-join@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" - -url-parse@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" - dependencies: - querystringify "0.0.x" - requires-port "1.0.x" - -url-parse@^1.1.8: - version "1.2.0" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986" - dependencies: - querystringify "~1.0.0" - requires-port "~1.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" - dependencies: - kind-of "^6.0.2" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util.promisify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - -uuid@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - -uuid@^3.1.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - -uuid@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - -v8-compile-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" - -validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -value-equal@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - -vendors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - dependencies: - indexof "0.0.1" - -wait-for-expect@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-1.1.1.tgz#9cd10e07d52810af9e0aaf509872e38f3c3d81ae" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - dependencies: - makeerror "1.0.x" - -warning@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" - dependencies: - loose-envify "^1.0.0" - -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - dependencies: - chokidar "^2.0.2" - graceful-fs "^4.1.2" - neo-async "^2.5.0" - -wbuf@^1.1.0, wbuf@^1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - dependencies: - minimalistic-assert "^1.0.0" - -webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - -webpack-cli@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.0.tgz#d71a83687dcfeb758fdceeb0fe042f96bcf62994" - dependencies: - chalk "^2.4.1" - cross-spawn "^6.0.5" - enhanced-resolve "^4.0.0" - global-modules-path "^2.1.0" - import-local "^1.0.0" - inquirer "^6.0.0" - interpret "^1.1.0" - loader-utils "^1.1.0" - supports-color "^5.4.0" - v8-compile-cache "^2.0.0" - yargs "^12.0.1" - -webpack-dev-middleware@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.1.3.tgz#8b32aa43da9ae79368c1bf1183f2b6cf5e1f39ed" - dependencies: - loud-rejection "^1.6.0" - memory-fs "~0.4.1" - mime "^2.1.0" - path-is-absolute "^1.0.0" - range-parser "^1.0.3" - url-join "^4.0.0" - webpack-log "^1.0.1" - -webpack-dev-server@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.5.tgz#87477252e1ac6789303fb8cd3e585fa5d508a401" - dependencies: - ansi-html "0.0.7" - array-includes "^3.0.3" - bonjour "^3.5.0" - chokidar "^2.0.0" - compression "^1.5.2" - connect-history-api-fallback "^1.3.0" - debug "^3.1.0" - del "^3.0.0" - express "^4.16.2" - html-entities "^1.2.0" - http-proxy-middleware "~0.18.0" - import-local "^1.0.0" - internal-ip "1.2.0" - ip "^1.1.5" - killable "^1.0.0" - loglevel "^1.4.1" - opn "^5.1.0" - portfinder "^1.0.9" - selfsigned "^1.9.1" - serve-index "^1.7.2" - sockjs "0.3.19" - sockjs-client "1.1.5" - spdy "^3.4.1" - strip-ansi "^3.0.0" - supports-color "^5.1.0" - webpack-dev-middleware "3.1.3" - webpack-log "^1.1.2" - yargs "11.0.0" - -webpack-log@^1.0.1, webpack-log@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" - dependencies: - chalk "^2.1.0" - log-symbols "^2.1.0" - loglevelnext "^1.0.1" - uuid "^3.1.0" - -webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@^4.16.3: - version "4.16.3" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.3.tgz#861be3176d81e7e3d71c66c8acc9bba35588b525" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/wasm-edit" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" - json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.0.0" - uglifyjs-webpack-plugin "^1.2.4" - watchpack "^1.5.0" - webpack-sources "^1.0.1" - -websocket-driver@>=0.5.1: - version "0.7.0" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" - dependencies: - http-parser-js ">=0.4.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - -whatwg-encoding@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" - dependencies: - iconv-lite "0.4.19" - -whatwg-fetch@>=0.10.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" - -whatwg-url@^6.3.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.0" - webidl-conversions "^4.0.1" - -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - -which@1, which@^1.2.9, which@^1.3.0: - 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.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - dependencies: - string-width "^1.0.2 || 2" - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - dependencies: - errno "~0.1.7" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - dependencies: - mkdirp "^0.5.1" - -xml-name-validator@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" - -xregexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -"y18n@^3.2.1 || ^4.0.0", 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" - -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - -yargs-parser@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - dependencies: - camelcase "^4.1.0" - -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - dependencies: - camelcase "^3.0.0" - -yargs-parser@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - dependencies: - camelcase "^4.1.0" - -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - dependencies: - camelcase "^4.1.0" - -yargs@10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae" - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^8.0.0" - -yargs@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b" - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - -yargs@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2" - dependencies: - cliui "^4.0.0" - decamelize "^2.0.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^10.1.0" - -yargs@^12.0.2: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - -yargs@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.0"