diff --git a/package.json b/package.json index cc389e2..75c9abb 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,9 @@ "version": "3.6.0", "description": "Zabbix plugin for Grafana", "scripts": { - "build": "webpack --config webpack/webpack.prod.conf.js", - "dev": "webpack --config webpack/webpack.dev.conf.js", - "watch": "webpack --config webpack/webpack.dev.conf.js", + "build": "webpack --config webpack/webpack.prod.conf.js --progress --colors", + "dev": "webpack --config webpack/webpack.dev.conf.js --progress --colors", + "watch": "webpack --config webpack/webpack.dev.conf.js --progress --colors", "test": "jest", "jest": "jest --notify --watch", "codecov": "jest --coverage && codecov", @@ -24,10 +24,19 @@ "url": "https://github.com/alexanderzobnin/grafana-zabbix/issues" }, "devDependencies": { + "@types/grafana": "github:CorpGlory/types-grafana", + "@types/jest": "^23.1.1", + "@types/jquery": "^3.3.0", + "@types/lodash": "^4.14.104", + "@types/moment": "^2.13.0", + "@types/react": "^16.4.6", "babel-core": "^6.26.3", "babel-jest": "^23.6.0", "babel-loader": "^7.1.2", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-preset-env": "^1.7.0", + "babel-preset-react": "^6.24.1", "benchmark": "^2.1.4", "clean-webpack-plugin": "^0.1.19", "codecov": "^3.1.0", @@ -49,9 +58,16 @@ "moment": "~2.21.0", "ng-annotate-webpack-plugin": "^0.3.0", "node-sass": "^4.9.4", + "prop-types": "^15.6.2", + "react-popper": "^0.7.5", + "react-table": "^6.8.6", "sass-loader": "^7.1.0", "style-loader": "^0.23.1", "tether-drop": "^1.4.2", + "ts-jest": "^22.4.6", + "ts-loader": "^4.4.1", + "tslint": "^5.11.0", + "typescript": "^2.9.2", "webpack": "^4.22.0", "webpack-cli": "^3.1.2" }, diff --git a/src/panel-triggers/components/EventTag.tsx b/src/panel-triggers/components/EventTag.tsx new file mode 100644 index 0000000..30459bb --- /dev/null +++ b/src/panel-triggers/components/EventTag.tsx @@ -0,0 +1,105 @@ +import React from 'react'; +import { ZBXTag } from '../types'; + +const TAG_COLORS = [ + '#E24D42', + '#1F78C1', + '#BA43A9', + '#705DA0', + '#466803', + '#508642', + '#447EBC', + '#C15C17', + '#890F02', + '#757575', + '#0A437C', + '#6D1F62', + '#584477', + '#629E51', + '#2F4F4F', + '#BF1B00', + '#806EB7', + '#8a2eb8', + '#699e00', + '#000000', + '#3F6833', + '#2F575E', + '#99440A', + '#E0752D', + '#0E4AB4', + '#58140C', + '#052B51', + '#511749', + '#3F2B5B', +]; + +const TAG_BORDER_COLORS = [ + '#FF7368', + '#459EE7', + '#E069CF', + '#9683C6', + '#6C8E29', + '#76AC68', + '#6AA4E2', + '#E7823D', + '#AF3528', + '#9B9B9B', + '#3069A2', + '#934588', + '#7E6A9D', + '#88C477', + '#557575', + '#E54126', + '#A694DD', + '#B054DE', + '#8FC426', + '#262626', + '#658E59', + '#557D84', + '#BF6A30', + '#FF9B53', + '#3470DA', + '#7E3A32', + '#2B5177', + '#773D6F', + '#655181', +]; + +/** + * Returns tag badge background and border colors based on hashed tag name. + * @param name tag name + */ +export function getTagColorsFromName(name: string): { color: string; borderColor: string } { + const hash = djb2(name.toLowerCase()); + const color = TAG_COLORS[Math.abs(hash % TAG_COLORS.length)]; + const borderColor = TAG_BORDER_COLORS[Math.abs(hash % TAG_BORDER_COLORS.length)]; + return { color, borderColor }; +} + +function djb2(str) { + let hash = 5381; + for (let i = 0; i < str.length; i++) { + hash = (hash << 5) + hash + str.charCodeAt(i); /* hash * 33 + c */ + } + return hash; +} + +interface EventTagProps { + tag: ZBXTag; +} + +function EventTag(props: EventTagProps) { + const { tag } = props; + const tagColor = getTagColorsFromName(tag.tag); + const style: React.CSSProperties = { + background: tagColor.color, + borderColor: tagColor.borderColor, + }; + return ( + + {tag.tag}: {tag.value} + + ); +} + +export default EventTag; diff --git a/src/panel-triggers/components/Problems.tsx b/src/panel-triggers/components/Problems.tsx new file mode 100644 index 0000000..77533ee --- /dev/null +++ b/src/panel-triggers/components/Problems.tsx @@ -0,0 +1,354 @@ +import React, { PureComponent } from 'react'; +import ReactTable from 'react-table'; +import EventTag from './EventTag'; +import Tooltip from './Tooltip'; +import { ProblemsPanelOptions, Trigger, ZBXItem, ZBXAcknowledge, ZBXHost, ZBXGroup } from '../types'; +import * as utils from '../../datasource-zabbix/utils'; + +export interface ProblemListProps { + problems: Trigger[]; + panelOptions: ProblemsPanelOptions; + loading?: boolean; +} + +export class ProblemList extends PureComponent { + buildColumns() { + const result = []; + const options = this.props.panelOptions; + const problems = this.props.problems; + const timeColWidth = problems && problems.length ? problems[0].lastchange.length * 9 : 160; + const highlightNewerThan = options.highlightNewEvents && options.highlightNewerThan; + const statusCell = props => StatusCell(props, options.okEventColor, DEFAULT_PROBLEM_COLOR, highlightNewerThan); + const columns = [ + { Header: 'Host', accessor: 'host', show: options.hostField }, + { Header: 'Host (Technical Name)', accessor: 'hostTechName', show: options.hostTechNameField }, + { Header: 'Host Groups', accessor: 'groups', show: options.hostGroups, Cell: GroupCell }, + { Header: 'Proxy', accessor: 'proxy', show: options.hostProxy }, + { Header: 'Severity', accessor: 'severity', show: options.severityField, className: 'problem-severity', width: 120, Cell: SeverityCell }, + { Header: 'Status', accessor: 'value', show: options.statusField, width: 100, Cell: statusCell }, + { Header: 'Problem', accessor: 'description', minWidth: 200, Cell: ProblemCell}, + { Header: 'Tags', accessor: 'tags', show: options.showTags, className: 'problem-tags', Cell: TagCell }, + { Header: 'Time', accessor: 'lastchange', className: 'last-change', width: timeColWidth }, + { Header: 'Details', className: 'custom-expander', width: 60, expander: true, Expander: CustomExpander }, + ]; + for (const column of columns) { + if (column.show || column.show === undefined) { + delete column.show; + result.push(column); + } + } + return result; + } + + render() { + console.log(this.props.problems, this.props.panelOptions); + const columns = this.buildColumns(); + // const data = this.props.problems.map(p => [p.host, p.description]); + return ( +
+ } + /> +
+ ); + } +} + +// interface CellProps { +// row: any; +// original: any; +// } + +function SeverityCell(props) { + // console.log(props); + return ( +
+ {props.value} +
+ ); +} + +const DEFAULT_OK_COLOR = 'rgb(56, 189, 113)'; +const DEFAULT_PROBLEM_COLOR = 'rgb(215, 0, 0)'; + +function StatusCell(props, okColor = DEFAULT_OK_COLOR, problemColor = DEFAULT_PROBLEM_COLOR, highlightNewerThan?: string) { + // console.log(props); + const status = props.value === '0' ? 'RESOLVED' : 'PROBLEM'; + const color = props.value === '0' ? okColor : problemColor; + let newProblem = false; + if (highlightNewerThan) { + newProblem = isNewProblem(props.original, highlightNewerThan); + } + return ( + {status} + ); +} + +function GroupCell(props) { + let groups = ""; + if (props.value && props.value.length) { + groups = props.value.map(g => g.name).join(', '); + } + return ( + {groups} + ); +} + +function ProblemCell(props) { + const comments = props.original.comments; + return ( +
+ {props.value} + {/* {comments && } */} +
+ ); +} + +function TagCell(props) { + const tags = props.value || []; + return [ + tags.map(tag => ) + ]; +} + +function CustomExpander(props) { + return ( + + + + ); +} + +interface FAIconProps { + icon: string; + customClass?: string; +} + +function FAIcon(props: FAIconProps) { + return ( + + + + ); +} + +interface ProblemItemProps { + item: ZBXItem; + showName?: boolean; +} + +function ProblemItem(props: ProblemItemProps) { + const { item, showName } = props; + return ( +
+ + {showName && {item.name}: } + {item.lastvalue} +
+ ); +} + +interface ProblemItemsProps { + items: ZBXItem[]; +} + +class ProblemItems extends PureComponent { + render() { + const { items } = this.props; + return (items.length > 1 ? + items.map(item => ) : + + ); + } +} + +interface AcknowledgesListProps { + acknowledges: ZBXAcknowledge[]; +} + +function AcknowledgesList(props: AcknowledgesListProps) { + const { acknowledges } = props; + return ( +
+
+ {acknowledges.map(ack => {ack.time})} +
+
+ {acknowledges.map(ack => {ack.user})} +
+
+ {acknowledges.map(ack => {ack.message})} +
+
+ ); +} + +interface ProblemGroupsProps { + groups: ZBXGroup[]; + className?: string; +} + +function ProblemGroups(props: ProblemGroupsProps) { + let groups = ""; + if (props.groups && props.groups.length) { + groups = props.groups.map(g => g.name).join(', '); + } + return ( +
+ + {groups} +
+ ); +} + +interface ProblemHostsProps { + hosts: ZBXHost[]; + className?: string; +} + +function ProblemHosts(props: ProblemHostsProps) { + let hosts = ""; + if (props.hosts && props.hosts.length) { + hosts = props.hosts.map(g => g.name).join(', '); + } + return ( +
+ + {hosts} +
+ ); +} + +interface ProblemStatusBarProps { + problem: Trigger; +} + +function ProblemStatusBar(props: ProblemStatusBarProps) { + const { problem } = props; + const multiEvent = problem.type === '1'; + const link = problem.url && problem.url !== ''; + const maintenance = problem.maintenance; + const manualClose = problem.manual_close === '1'; + const error = problem.error && problem.error !== ''; + const stateUnknown = problem.state === '1'; + const closeByTag = problem.correlation_mode === '1'; + return ( +
+ + + + + + + +
+ ); +} + +interface ProblemStatusBarItemProps { + icon: string; + fired?: boolean; + link?: string; + tooltip?: string; +} + +function ProblemStatusBarItem(props: ProblemStatusBarItemProps) { + const { fired, icon, link, tooltip } = props; + let item = ( +
+ +
+ ); + if (tooltip && fired) { + item = ( + + {item} + + ); + } + return link ? {item} : item; +} + +class ProblemDetails extends PureComponent { + constructor(props) { + super(props); + this.state = { + show: false + }; + } + + componentDidMount() { + requestAnimationFrame(() => { + this.setState({ show: true }); + }); + } + + render() { + const problem = this.props.original as Trigger; + const displayClass = this.state.show ? 'show' : ''; + let groups = ""; + if (problem && problem.groups) { + groups = problem.groups.map(g => g.name).join(', '); + } + return ( +
+
+ {/*
Problem Details
*/} +
+
+
+ + {problem.age} +
+ {problem.items && } +
+ +
+ {problem.comments && +
+ Description:  + {problem.comments} +
+ } +
+ {problem.tags && problem.tags.map(tag => )} +
+
+ {problem.acknowledges && +
+
Acknowledges
+ +
+ } +
+
+ + {problem.datasource} +
+ {problem.proxy && +
+ + {problem.proxy} +
+ } + {problem.groups && } + {problem.hosts && } +
+
+ ); + } +} + +function isNewProblem(problem: Trigger, highlightNewerThan: string): boolean { + try { + const highlightIntervalMs = utils.parseInterval(highlightNewerThan); + const durationSec = (Date.now() - problem.lastchangeUnix * 1000); + return durationSec < highlightIntervalMs; + } catch (e) { + return false; + } +} diff --git a/src/panel-triggers/components/Tooltip.tsx b/src/panel-triggers/components/Tooltip.tsx new file mode 100644 index 0000000..bc76e50 --- /dev/null +++ b/src/panel-triggers/components/Tooltip.tsx @@ -0,0 +1,91 @@ +import React, { PureComponent } from 'react'; +import { Manager, Popper, Arrow, Target } from 'react-popper'; + +interface IwithTooltipProps { + placement?: string; + content: string | ((props: any) => JSX.Element); + className?: string; +} + +export function withTooltip(WrappedComponent) { + return class extends React.Component { + constructor(props) { + super(props); + + this.setState = this.setState.bind(this); + this.state = { + placement: this.props.placement || 'auto', + show: false, + }; + } + + componentWillReceiveProps(nextProps) { + if (nextProps.placement && nextProps.placement !== this.state.placement) { + this.setState(prevState => { + return { + ...prevState, + placement: nextProps.placement, + }; + }); + } + } + + renderContent(content) { + if (typeof content === 'function') { + // If it's a function we assume it's a React component + const ReactComponent = content; + return ; + } + return content; + } + + render() { + const { content, className } = this.props; + + return ( + + + {this.state.show ? ( + + {this.renderContent(content)} + + + ) : null} + + ); + } + }; +} + +interface Props { + tooltipSetState: (prevState: object) => void; +} + +class Tooltip extends PureComponent { + showTooltip = () => { + const { tooltipSetState } = this.props; + + tooltipSetState(prevState => ({ + ...prevState, + show: true, + })); + }; + + hideTooltip = () => { + const { tooltipSetState } = this.props; + tooltipSetState(prevState => ({ + ...prevState, + show: false, + })); + }; + + render() { + return ( + + {this.props.children} + + ); + } +} + +export default withTooltip(Tooltip); diff --git a/src/panel-triggers/triggers_panel_ctrl.js b/src/panel-triggers/triggers_panel_ctrl.js index 6edcf87..ea46bd0 100644 --- a/src/panel-triggers/triggers_panel_ctrl.js +++ b/src/panel-triggers/triggers_panel_ctrl.js @@ -1,3 +1,5 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; import _ from 'lodash'; import $ from 'jquery'; import moment from 'moment'; @@ -6,6 +8,7 @@ import {PanelCtrl} from 'grafana/app/plugins/sdk'; import {triggerPanelOptionsTab} from './options_tab'; import {triggerPanelTriggersTab} from './triggers_tab'; import {migratePanelSchema, CURRENT_SCHEMA_VERSION} from './migrations'; +import { ProblemList } from './components/Problems'; const ZABBIX_DS_ID = 'alexanderzobnin-zabbix-datasource'; @@ -680,9 +683,25 @@ export class TriggerPanelCtrl extends PanelCtrl { appendPaginationControls(footerElem); rootElem.css({'max-height': getContentHeight()}); rootElem.css({'height': getContentHeight()}); + renderProblems(); setFontSize(); } + function renderProblems() { + console.debug('rendering ProblemsList React component'); + // console.log(ctrl); + let panelOptions = {}; + for (let prop in PANEL_DEFAULTS) { + panelOptions[prop] = ctrl.panel[prop]; + } + const problemsListProps = { + problems: ctrl.triggerList, + panelOptions, + }; + const problemsReactElem = React.createElement(ProblemList, problemsListProps); + ReactDOM.render(problemsReactElem, elem.find('.panel-content')[0]); + } + let unbindDestroy = scope.$on('$destroy', function() { elem.off('click', '.triggers-panel-page-link'); unbindDestroy(); diff --git a/src/panel-triggers/types.ts b/src/panel-triggers/types.ts new file mode 100644 index 0000000..1e57383 --- /dev/null +++ b/src/panel-triggers/types.ts @@ -0,0 +1,153 @@ +export interface ProblemsPanelOptions { + schemaVersion: number; + datasources: any[]; + targets: Map; + // Fields + hostField?: boolean; + hostTechNameField?: boolean; + hostGroups?: boolean; + hostProxy?: boolean; + showTags?: boolean; + statusField?: boolean; + severityField?: boolean; + descriptionField?: boolean; + descriptionAtNewLine?: boolean; + // Options + hostsInMaintenance?: boolean; + showTriggers?: 'all triggers' | 'unacknowledged' | 'acknowledges'; + sortTriggersBy?: { + text: string; + value: 'lastchange' | 'priority'; + }; + showEvents?: { + text: 'All' | 'OK' | 'Problems'; + value: 1 | Array<0 | 1>; + }; + limit?: number; + // View options + fontSize?: string; + pageSize?: number; + highlightBackground?: boolean; + highlightNewEvents?: boolean; + highlightNewerThan?: string; + customLastChangeFormat?: boolean; + lastChangeFormat?: string; + // Triggers severity and colors + triggerSeverity?: TriggerSeverity[]; + okEventColor?: TriggerColor; + ackEventColor?: TriggerColor; +} + +export interface ProblemsPanelTarget { + group: { + filter: string + }; + host: { + filter: string + }; + application: { + filter: string + }; + trigger: { + filter: string + }; + tags: { + filter: string + }; + proxy: { + filter: string + }; +} + +export interface TriggerSeverity { + priority: number; + severity: string; + color: TriggerColor; + show: boolean; +} + +export type TriggerColor = string; + +export interface Trigger { + acknowledges?: ZBXAcknowledge[]; + age?: string; + color?: TriggerColor; + comments?: string; + correlation_mode?: string; + correlation_tag?: string; + datasource?: string; + description?: string; + error?: string; + expression?: string; + flags?: string; + groups?: ZBXGroup[]; + host?: string; + hostTechName?: string; + hosts?: ZBXHost[]; + items?: ZBXItem[]; + lastEvent?: ZBXEvent; + lastchange?: string; + lastchangeUnix?: number; + maintenance?: boolean; + manual_close?: string; + priority?: string; + proxy?: string; + recovery_expression?: string; + recovery_mode?: string; + severity?: string; + state?: string; + status?: string; + tags?: ZBXTag[]; + templateid?: string; + /** Whether the trigger can generate multiple problem events. */ + type?: string; + url?: string; + value?: string; +} + +export interface ZBXGroup { + groupid: string; + name: string; +} + +export interface ZBXHost { + hostid: string; + name: string; +} + +export interface ZBXItem { + itemid: string; + name: string; + key_: string; + lastvalue?: string; +} + +export interface ZBXEvent { + eventid: string; + clock: string; + ns?: string; + value?: string; + source?: string; + object?: string; + objectid?: string; + acknowledged?: string; +} + +export interface ZBXTag { + tag: string; + value?: string; +} + +export interface ZBXAcknowledge { + acknowledgeid: string; + eventid: string; + userid: string; + action: string; + clock: string; + time: string; + message?: string; + user: string; + alias: string; + name: string; + surname: string; +} diff --git a/src/sass/_panel-problems.scss b/src/sass/_panel-problems.scss new file mode 100644 index 0000000..6608429 --- /dev/null +++ b/src/sass/_panel-problems.scss @@ -0,0 +1,354 @@ +.panel-problems { + height: 100%; + + .fa-icon-container { + padding-right: 0.4rem; + color: $gray-2; + i { + width: 1rem; + } + } + + // styles + .ReactTable { + height: 100%; + display: flex; + flex-direction: column; + + .rt-tr-group { + flex: 0 0 auto; + border-bottom: solid 1px $problems-border-color; + border-left: solid 2px rgba(0, 0, 0, 0); + + &:last-child { + border-bottom: solid 1px $problems-border-color; + } + + &:hover { + border-left: solid 2px rgba($blue, 0.5); + } + + .rt-tr { + .rt-td { + border: 0; + } + + &:hover { + background: lighten($dark-3, 2%); + box-shadow: 0px 0px 5px rgba($blue, 0.5); + z-index: 1; + } + &.-even { + background: lighten($dark-3, 1%); + &:hover { + background: lighten($dark-3, 4%); + } + } + } + } + + .rt-noData { + z-index: 2; + } + + .pagination-bottom { + margin-top: auto; + flex: 1 0 auto; + display: flex; + flex-direction: column; + + .-pagination { + margin-top: auto; + height: 3rem; + + .-previous { + flex: 1; + } + + .-center { + flex: 3; + + .-pageJump { + margin: 0px 0.4rem; + } + + .select-wrap select { + width: 8rem; + } + } + + .-next { + flex: 1; + } + } + } + + .problem-severity { + padding: 0px; + + .severity-cell { + width: 100%; + height: 100%; + padding: 0.45em 0 0.45em 1.1em; + } + } + + .problem-status--new { + animation: blink-opacity 2s ease-in-out infinite; + } + + // .problem-description { + // font-weight: 500; + // } + + .rt-tr .rt-td { + &.custom-expander { + text-align: center; + padding-left: 0rem; + i { + color: #676767; + font-size: 1.2rem; + } + & .expanded { + i { + color: $blue; + } + } + // background: linear-gradient(to bottom, $dark-5 50%, $dark-2 50%); + // background-size: 100% 200%; + // background-position: right bottom; + // transition: all .3s ease-out; + } + &.custom-expander:hover { + // background-position: right top; + background-color: lighten($dark-3, 8%); + i { + color: $blue; + } + } + &.last-change { + text-align: left; + } + } + + .comments-icon { + float: right; + padding-right: 0.6rem; + i { + color: $gray-2; + } + } + + .problem-tags { + &.rt-td { + padding-left: 0.6rem; + } + .label-tag, .zbx-tag { + margin-right: 0.6rem; + } + } + + .problem-details-container { + display: flex; + background-color: $dark-3; + border: 1px solid $problems-border-color; + border-bottom-width: 0px; + + max-height: 0; + opacity: 0; + overflow: hidden; + transition: all 0.3s ease-out; + + &.show { + max-height: 16rem; + opacity: 1; + } + + .problem-details-row { + display: flex; + margin-bottom: 0.6rem; + + .problem-value-container { + flex: 1 0 auto; + } + } + + .problem-details { + position: relative; + flex: 10 0 auto; + padding: 0.5rem 1rem; + display: flex; + flex-direction: column; + } + + .description-label { + font-weight: 500; + font-style: italic; + color: $text-color-muted; + } + + .problem-age { + font-weight: 500; + } + + .problem-tags { + padding-top: 0.6rem; + padding-bottom: 0.6rem; + margin-top: auto; + } + + .problem-item-name { + color: $text-color-muted; + } + + .problem-item-value { + font-weight: 500; + } + + .problem-statusbar { + // margin-top: auto; + margin-bottom: 0.6rem; + display: flex; + flex-direction: row; + // max-width: 13rem; + + .problem-statusbar-item { + width: 3rem; + height: 2rem; + padding: 0.4rem 0.4rem 0.4rem 1rem; + background: $dark-2; + margin-right: 2px; + border-radius: 2px; + // border: 1px solid $dark-5; + + &:hover { + background: darken($dark-2, 2%); + } + + &.muted { + .fa-icon-container { + color: $dark-3; + } + } + &.fired { + box-shadow: 0px 0px 10px rgba($orange, 0.1); + .fa-icon-container { + color: $orange; + text-shadow: 0px 0px 10px rgba($orange, 0.5); + // animation: fade-in 1s ease-out; + } + } + } + } + + .problem-details-middle { + flex: 1 0 auto; + padding: 0.5rem 1rem; + // border: 1px solid $dark-4; + border-width: 0 1px; + border-style: solid; + border-color: $dark-4; + overflow: auto; + } + + .problem-ack-list { + display: flex; + overflow: auto; + + .problem-ack-col { + display: flex; + flex-direction: column; + padding-right: 0.8rem; + } + + .problem-ack-time, + .problem-ack-user { + color: $text-color-muted; + } + // span { + // padding-right: 0.6rem; + // } + } + + + .problem-details-right { + // flex: 1 0 auto; + padding: 0.5rem 2rem; + // background: $dark-4; + color: $text-color-muted; + + .problem-details-right-item { + margin-bottom: 0.2rem; + } + } + + .problem-maintenance { + .fa-icon-container { + color: $orange; + } + } + + .problem-multi-event-type { + i { + color: $orange; + text-shadow: 0px 0px 10px $orange; + animation: blink-shadow 2s ease-out infinite; + } + } + } + + // .rt-tr-group { + // transition: top 1s ease-out; + // animation: all 1s ease; + // } + } +} + +@keyframes slide-down { + 0% { + opacity: 0; + transform: translateY(-20px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes blink-opacity { + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@keyframes fade-in { + 0% { + color: $dark-3; + text-shadow: unset; + } + 100% { + color: $orange; + text-shadow: 0px 0px 10px rgba($orange, 0.5); + } +} + +@keyframes blink-shadow { + 0% { + opacity: 1; + text-shadow: 0px 0px 3px $orange; + } + 50% { + opacity: 0.3; + text-shadow: 0px 0px 10px $orange; + } + 100% { + opacity: 1; + text-shadow: 0px 0px 2px $orange; + } +} diff --git a/src/sass/_variables.dark.scss b/src/sass/_variables.dark.scss index 4b94817..44d235c 100644 --- a/src/sass/_variables.dark.scss +++ b/src/sass/_variables.dark.scss @@ -13,7 +13,7 @@ $gray-4: #D8D9DA; $gray-5: #ECECEC; $gray-6: #f4f5f8; $gray-7: #fbfbfb; -$gray-blue: #292a2d; +$gray-blue: #292a2d; $white: #fff; @@ -33,8 +33,10 @@ $regex: #d69e2e; $body-bg: rgb(20,20,20); $body-color: $gray-4; $text-color: $gray-4; +$text-color-muted: $gray-2; $tight-form-func-bg: #333; $grafanaListAccent: lighten($dark-2, 2%); $zbx-tag-color: $gray-5; $zbx-text-highlighted: $white; +$problems-border-color: $dark-1; diff --git a/src/sass/_variables.light.scss b/src/sass/_variables.light.scss index d926d11..bc5725d 100644 --- a/src/sass/_variables.light.scss +++ b/src/sass/_variables.light.scss @@ -32,8 +32,10 @@ $regex: #aa7b1d; $body-bg : $white; $body-color: $gray-1; $text-color: $gray-1; +$text-color-muted: $gray-2; $tight-form-func-bg: $gray-5; $grafanaListAccent: $gray-5; $zbx-tag-color: $gray-6; $zbx-text-highlighted: $black; +$problems-border-color: $dark-1; diff --git a/src/sass/grafana-zabbix.scss b/src/sass/grafana-zabbix.scss index e340307..cc1c2f1 100644 --- a/src/sass/grafana-zabbix.scss +++ b/src/sass/grafana-zabbix.scss @@ -1,3 +1,4 @@ @import 'variables'; @import 'panel-triggers'; +@import 'panel-problems'; @import 'query_editor'; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..999b8b9 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "moduleResolution": "node", + "target": "es5", + "lib": [ + "es6", + "dom" + ], + "rootDir": "./src", + "jsx": "react", + "module": "esnext", + "declaration": false, + "allowSyntheticDefaultImports": true, + "inlineSourceMap": false, + "sourceMap": true, + "noEmitOnError": false, + "emitDecoratorMetadata": false, + "experimentalDecorators": true, + "noImplicitReturns": true, + "noImplicitThis": false, + "noImplicitUseStrict": false, + "noImplicitAny": false, + "noUnusedLocals": false, + "baseUrl": "./src" + } +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..4c7ea71 --- /dev/null +++ b/tslint.json @@ -0,0 +1,76 @@ +{ + "rules": { + "array-type": [true, "array-simple"], + "arrow-return-shorthand": true, + "ban": [true, + {"name": "Array", "message": "tsstyle#array-constructor"} + ], + "ban-types": [true, + ["Object", "Use {} instead."], + ["String", "Use 'string' instead."], + ["Number", "Use 'number' instead."], + ["Boolean", "Use 'boolean' instead."] + ], + "interface-name": [true, "never-prefix"], + "no-string-throw": true, + "no-unused-expression": true, + "no-unused-variable": false, + "no-use-before-declare": false, + "no-duplicate-variable": true, + "curly": true, + "class-name": true, + "semicolon": [true, "always", "ignore-bound-class-methods"], + "triple-equals": [true, "allow-null-check"], + "comment-format": [false, "check-space"], + "eofline": true, + "forin": false, + "indent": [true, "spaces", 2], + "jsdoc-format": true, + "label-position": true, + "max-line-length": [true, 150], + "member-access": [true, "no-public"], + "new-parens": true, + "no-angle-bracket-type-assertion": true, + "no-arg": true, + "no-bitwise": false, + "no-conditional-assignment": true, + "no-console": [true, "debug", "info", "time", "timeEnd", "trace"], + "no-construct": true, + "no-debugger": true, + "no-empty": false, + "no-eval": true, + "no-inferrable-types": true, + "no-namespace": [true, "allow-declarations"], + "no-reference": true, + "no-shadowed-variable": false, + "no-string-literal": false, + "no-switch-case-fall-through": false, + "no-trailing-whitespace": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [true, "check-open-brace", "check-catch", "check-else"], + "only-arrow-functions": [true, "allow-declarations", "allow-named-functions"], + "prefer-const": true, + "radix": true, + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "variable-name": [ + true, + "check-format", + "ban-keywords", + "allow-leading-underscore", + "allow-trailing-underscore", + "allow-pascal-case" + ], + "use-isnan": true, + "whitespace": [true, "check-branch", "check-decl", "check-type", "check-preblock"] + } +} diff --git a/webpack/webpack.base.conf.js b/webpack/webpack.base.conf.js index b74f5d5..414ba44 100644 --- a/webpack/webpack.base.conf.js +++ b/webpack/webpack.base.conf.js @@ -53,7 +53,7 @@ module.exports = { ExtractTextPluginDark, ], resolve: { - extensions: [".js", ".html", ".scss"] + extensions: [".js", ".ts", ".tsx", ".html", ".scss"] }, module: { rules: [ @@ -67,6 +67,13 @@ module.exports = { } } }, + { + test: /\.tsx?$/, + exclude: /node_modules|external/, + loaders: [ + "ts-loader" + ], + }, { test: /\.html$/, use: { diff --git a/yarn.lock b/yarn.lock index 691785c..dd79759 100644 --- a/yarn.lock +++ b/yarn.lock @@ -108,11 +108,57 @@ lodash "^4.17.5" to-fast-properties "^2.0.0" +"@types/grafana@github:CorpGlory/types-grafana": + version "4.6.3" + resolved "https://codeload.github.com/CorpGlory/types-grafana/tar.gz/2ce6e54491a247b9dbfe6b809e43daf2002e8260" + +"@types/jest@^23.1.1": + version "23.3.9" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.9.tgz#c16b55186ee73ae65e001fbee69d392c51337ad1" + integrity sha512-wNMwXSUcwyYajtbayfPp55tSayuDVU6PfY5gzvRSj80UvxdXEJOVPnUVajaOp7NgXLm+1e2ZDLULmpsU9vDvQw== + +"@types/jquery@^3.3.0": + version "3.3.22" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.22.tgz#cde55dc8f83207dffd16205b05f97ce824581735" + integrity sha512-a4JDcIhJhHYnoWCkG3xT2CZxXZeA92JeREESorg0DMQ3ZsjuKF48h7XK4l5Gl2GRa/ItGRpKMT0pyK88yRgqXQ== + dependencies: + "@types/sizzle" "*" + +"@types/lodash@^4.14.104": + version "4.14.118" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.118.tgz#247bab39bfcc6d910d4927c6e06cbc70ec376f27" + integrity sha512-iiJbKLZbhSa6FYRip/9ZDX6HXhayXLDGY2Fqws9cOkEQ6XeKfaxB0sC541mowZJueYyMnVUmmG+al5/4fCDrgw== + +"@types/moment@^2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@types/moment/-/moment-2.13.0.tgz#604ebd189bc3bc34a1548689404e61a2a4aac896" + integrity sha1-YE69GJvDvDShVIaJQE5hoqSqyJY= + dependencies: + moment "*" + "@types/node@*": version "10.9.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.2.tgz#f0ab8dced5cd6c56b26765e1c0d9e4fdcc9f2a00" integrity sha512-pwZnkVyCGJ3LsQ0/3flQK5lCFao4esIzwUVzzk5NvL9vnkEyDhNf4fhHzUMHvyr56gNZywWTS2MR0euabMSz4A== +"@types/prop-types@*": + version "15.5.6" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.6.tgz#9c03d3fed70a8d517c191b7734da2879b50ca26c" + integrity sha512-ZBFR7TROLVzCkswA3Fmqq+IIJt62/T7aY/Dmz+QkU7CaW2QFqAitCE8Ups7IzmGhcN1YWMBT4Qcoc07jU9hOJQ== + +"@types/react@^16.4.6": + version "16.7.7" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.7.7.tgz#1e5e23e7dd922968ed4b484cdec00a5402c9f31b" + integrity sha512-dJiq7CKxD1XJ/GqmbnsQisFnzG4z5lntKBw9X9qeSrguxFbrrhGa8cK9s0ONBp8wL1EfGfofEDVhjen26U46pw== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + +"@types/sizzle@*": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" + integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== + "@webassemblyjs/ast@1.7.8": version "1.7.8" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.8.tgz#f31f480debeef957f01b623f27eabc695fa4fe8f" @@ -398,6 +444,14 @@ ansi-styles@~1.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -475,11 +529,26 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + 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" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + array-slice@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" @@ -612,7 +681,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -babel-code-frame@^6.26.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" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -669,6 +738,15 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" +babel-helper-builder-react-jsx@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" + integrity sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + esutils "^2.0.2" + babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" @@ -822,6 +900,11 @@ babel-plugin-istanbul@^4.1.6: istanbul-lib-instrument "^1.10.1" test-exclude "^4.2.1" +babel-plugin-jest-hoist@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b" + integrity sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ== + babel-plugin-jest-hoist@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" @@ -832,12 +915,27 @@ babel-plugin-syntax-async-functions@^6.8.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= + babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= -babel-plugin-syntax-object-rest-spread@^6.13.0: +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + integrity sha1-TDqyCiryaqIM0lmVw5jE63AxDI0= + +babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + +babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= @@ -856,6 +954,16 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-syntax-async-functions "^6.8.0" babel-runtime "^6.22.0" +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" @@ -951,7 +1059,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.26.2: version "6.26.2" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== @@ -1055,6 +1163,54 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" +babel-plugin-transform-flow-strip-types@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + integrity sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988= + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-display-name@^6.23.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" + integrity sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-self@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" + integrity sha1-322AqdomEqEh5t3XVYvL7PBuY24= + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-source@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" + integrity sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY= + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" + integrity sha1-hAoCjn30YN/DotKfDA2R9jduZqM= + dependencies: + babel-helper-builder-react-jsx "^6.24.1" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" @@ -1106,6 +1262,21 @@ babel-preset-env@^1.7.0: invariant "^2.2.2" semver "^5.3.0" +babel-preset-flow@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + integrity sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0= + dependencies: + babel-plugin-transform-flow-strip-types "^6.22.0" + +babel-preset-jest@^22.4.3: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39" + integrity sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA== + dependencies: + babel-plugin-jest-hoist "^22.4.4" + babel-plugin-syntax-object-rest-spread "^6.13.0" + babel-preset-jest@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" @@ -1114,6 +1285,18 @@ babel-preset-jest@^23.2.0: babel-plugin-jest-hoist "^23.2.0" babel-plugin-syntax-object-rest-spread "^6.13.0" +babel-preset-react@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" + integrity sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A= + dependencies: + babel-plugin-syntax-jsx "^6.3.13" + babel-plugin-transform-react-display-name "^6.23.0" + babel-plugin-transform-react-jsx "^6.24.1" + babel-plugin-transform-react-jsx-self "^6.22.0" + babel-plugin-transform-react-jsx-source "^6.22.0" + babel-preset-flow "^6.23.0" + babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -1294,7 +1477,7 @@ browser-process-hrtime@^0.1.2: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= -browser-resolve@^1.11.3: +browser-resolve@^1.11.2, browser-resolve@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== @@ -1394,7 +1577,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^1.0.0: +builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= @@ -1515,7 +1698,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3, chalk@~1.1.0: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@~2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== @@ -1533,6 +1716,22 @@ chalk@~0.4.0: has-color "~0.1.0" strip-ansi "~0.1.0" +chokidar@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" @@ -1588,6 +1787,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@^2.2.5: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + clean-css@4.2.x: version "4.2.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" @@ -1727,6 +1931,11 @@ commander@2.17.x, commander@~2.17.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== +commander@^2.12.1: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" @@ -1849,6 +2058,23 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cpx@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f" + integrity sha1-GFvgGFEdhycN7czCkxceN2VauI8= + dependencies: + babel-runtime "^6.9.2" + chokidar "^1.6.0" + duplexer "^0.1.1" + glob "^7.0.5" + glob2base "^0.0.12" + minimatch "^3.0.2" + mkdirp "^0.5.1" + resolve "^1.1.7" + safe-buffer "^5.0.1" + shell-quote "^1.6.1" + subarg "^1.0.0" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -1976,6 +2202,11 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" +csstype@^2.2.0: + version "2.5.7" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.7.tgz#bf9235d5872141eccfb2d16d82993c6b149179ff" + integrity sha512-Nt5VDyOTIIV4/nRFswoCKps1R5CD1hkiyjBE9/thNaNZILLEviVw9yWQw15+O+CpNjQKB/uvdcxFFOrSflY3Yw== + cst@^0.4.3: version "0.4.10" resolved "https://registry.yarnpkg.com/cst/-/cst-0.4.10.tgz#9c05c825290a762f0a85c0aabb8c0fe035ae8516" @@ -2220,6 +2451,11 @@ domutils@1.5: dom-serializer "0" domelementtype "1" +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + duplexify@^3.4.2, duplexify@^3.6.0: version "3.6.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" @@ -2268,7 +2504,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^4.1.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" integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== @@ -2481,6 +2717,18 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" +expect@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674" + integrity sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA== + dependencies: + ansi-styles "^3.2.0" + jest-diff "^22.4.3" + jest-get-type "^22.4.3" + jest-matcher-utils "^22.4.3" + jest-message-util "^22.4.3" + jest-regex-util "^22.4.3" + expect@^23.5.0: version "23.5.0" resolved "https://registry.yarnpkg.com/expect/-/expect-23.5.0.tgz#18999a0eef8f8acf99023fde766d9c323c2562ed" @@ -2651,6 +2899,11 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ= + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -2774,6 +3027,15 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-extra@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.0.tgz#0f0afb290bb3deb87978da816fcd3c7797f3a817" + integrity sha512-lk2cUCo8QzbiEWEbt7Cw3m27WMiRG321xsssbcIpfMhpRjrlC08WBOVQqj1/nQYYNnPtyIhP1oqLO3QwT2tPCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" @@ -2805,7 +3067,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.2, fsevents@^1.2.3: +fsevents@^1.0.0, fsevents@^1.2.2, fsevents@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== @@ -2904,6 +3166,13 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY= + dependencies: + find-index "^0.1.1" + glob@^5.0.1, glob@~5.0.0: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -3893,6 +4162,23 @@ jest-cli@^23.5.0: which "^1.2.12" yargs "^11.0.0" +jest-config@^22.4.3, jest-config@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a" + integrity sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A== + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^22.4.1" + jest-environment-node "^22.4.1" + jest-get-type "^22.1.0" + jest-jasmine2 "^22.4.4" + jest-regex-util "^22.1.0" + jest-resolve "^22.4.2" + jest-util "^22.4.1" + jest-validate "^22.4.4" + pretty-format "^22.4.0" + jest-config@^23.5.0: version "23.5.0" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.5.0.tgz#3770fba03f7507ee15f3b8867c742e48f31a9773" @@ -3913,6 +4199,16 @@ jest-config@^23.5.0: micromatch "^2.3.11" pretty-format "^23.5.0" +jest-diff@^22.4.0, jest-diff@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030" + integrity sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA== + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.4.3" + pretty-format "^22.4.3" + jest-diff@^23.5.0: version "23.5.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.5.0.tgz#250651a433dd0050290a07642946cc9baaf06fba" @@ -3938,6 +4234,15 @@ jest-each@^23.5.0: chalk "^2.0.1" pretty-format "^23.5.0" +jest-environment-jsdom@^22.4.1: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e" + integrity sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w== + dependencies: + jest-mock "^22.4.3" + jest-util "^22.4.3" + jsdom "^11.5.1" + jest-environment-jsdom@^23.4.0: version "23.4.0" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" @@ -3947,6 +4252,14 @@ jest-environment-jsdom@^23.4.0: jest-util "^23.4.0" jsdom "^11.5.1" +jest-environment-node@^22.4.1: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129" + integrity sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA== + dependencies: + jest-mock "^22.4.3" + jest-util "^22.4.3" + jest-environment-node@^23.4.0: version "23.4.0" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" @@ -3955,7 +4268,7 @@ jest-environment-node@^23.4.0: jest-mock "^23.2.0" jest-util "^23.4.0" -jest-get-type@^22.1.0: +jest-get-type@^22.1.0, jest-get-type@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== @@ -3974,6 +4287,23 @@ jest-haste-map@^23.5.0: micromatch "^2.3.11" sane "^2.0.0" +jest-jasmine2@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz#c55f92c961a141f693f869f5f081a79a10d24e23" + integrity sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw== + dependencies: + chalk "^2.0.1" + co "^4.6.0" + expect "^22.4.0" + graceful-fs "^4.1.11" + is-generator-fn "^1.0.0" + jest-diff "^22.4.0" + jest-matcher-utils "^22.4.0" + jest-message-util "^22.4.0" + jest-snapshot "^22.4.0" + jest-util "^22.4.1" + source-map-support "^0.5.0" + jest-jasmine2@^23.5.0: version "23.5.0" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.5.0.tgz#05fe7f1788e650eeb5a03929e6461ea2e9f3db53" @@ -3999,6 +4329,15 @@ jest-leak-detector@^23.5.0: dependencies: pretty-format "^23.5.0" +jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff" + integrity sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA== + dependencies: + chalk "^2.0.1" + jest-get-type "^22.4.3" + pretty-format "^22.4.3" + jest-matcher-utils@^23.5.0: version "23.5.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.5.0.tgz#0e2ea67744cab78c9ab15011c4d888bdd3e49e2a" @@ -4008,6 +4347,17 @@ jest-matcher-utils@^23.5.0: jest-get-type "^22.1.0" pretty-format "^23.5.0" +jest-message-util@^22.4.0, jest-message-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7" + integrity sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA== + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + jest-message-util@^23.4.0: version "23.4.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" @@ -4019,11 +4369,21 @@ jest-message-util@^23.4.0: slash "^1.0.0" stack-utils "^1.0.1" +jest-mock@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7" + integrity sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q== + jest-mock@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ= +jest-regex-util@^22.1.0, jest-regex-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af" + integrity sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg== + jest-regex-util@^23.3.0: version "23.3.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" @@ -4037,6 +4397,14 @@ jest-resolve-dependencies@^23.5.0: jest-regex-util "^23.3.0" jest-snapshot "^23.5.0" +jest-resolve@^22.4.2: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea" + integrity sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw== + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + jest-resolve@^23.5.0: version "23.5.0" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.5.0.tgz#3b8e7f67e84598f0caf63d1530bd8534a189d0e6" @@ -4097,6 +4465,18 @@ jest-serializer@^23.0.1: resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU= +jest-snapshot@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2" + integrity sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ== + dependencies: + chalk "^2.0.1" + jest-diff "^22.4.3" + jest-matcher-utils "^22.4.3" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^22.4.3" + jest-snapshot@^23.5.0: version "23.5.0" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.5.0.tgz#cc368ebd8513e1175e2a7277f37a801b7358ae79" @@ -4113,6 +4493,19 @@ jest-snapshot@^23.5.0: pretty-format "^23.5.0" semver "^5.5.0" +jest-util@^22.4.1, jest-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac" + integrity sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ== + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^22.4.3" + mkdirp "^0.5.1" + source-map "^0.6.0" + jest-util@^23.4.0: version "23.4.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" @@ -4127,6 +4520,17 @@ jest-util@^23.4.0: slash "^1.0.0" source-map "^0.6.0" +jest-validate@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d" + integrity sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg== + dependencies: + chalk "^2.0.1" + jest-config "^22.4.4" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^22.4.0" + jest-validate@^23.5.0: version "23.5.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.5.0.tgz#f5df8f761cf43155e1b2e21d6e9de8a2852d0231" @@ -4400,6 +4804,18 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + jsonlint@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/jsonlint/-/jsonlint-1.6.3.tgz#cb5e31efc0b78291d0d862fbef05900adf212988" @@ -4621,7 +5037,7 @@ longest@^1.0.1: resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -4760,7 +5176,7 @@ merge@^1.2.0: resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= -micromatch@^2.3.11: +micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= @@ -4852,7 +5268,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.0, 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" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -4916,6 +5332,11 @@ mkdirp@0.5.1, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi dependencies: minimist "0.0.8" +moment@*: + version "2.22.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" + integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= + moment@~2.21.0: version "2.21.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" @@ -5183,7 +5604,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.0, normalize-path@^2.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" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -5705,6 +6126,11 @@ pn@^1.0.0, pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +popper.js@^1.12.5: + version "1.14.6" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.6.tgz#ab20dd4edf9288b8b3b6531c47c361107b60b4b0" + integrity sha512-AGwHGQBKumlk/MDfrSOf0JHhJCImdDMcGNoqKmKkU+68GFazv3CQ6q9r7Ja1sKDZmYWTckY/uLyEznheTDycnA== + 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" @@ -5765,6 +6191,14 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= +pretty-format@^22.4.0, pretty-format@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" + integrity sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ== + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + pretty-format@^23.5.0: version "23.5.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.5.0.tgz#0f9601ad9da70fe690a269cd3efca732c210687c" @@ -5817,6 +6251,14 @@ prompts@^0.1.9: kleur "^2.0.1" sisteransi "^0.1.1" +prop-types@^15.5.10, prop-types@^15.6.2: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -5925,6 +6367,21 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-popper@^0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-0.7.5.tgz#71c25946f291db381231281f6b95729e8b801596" + integrity sha512-ya9dhhGCf74JTOB2uyksEHhIGw7w9tNZRUJF73lEq2h4H5JT6MBa4PdT4G+sx6fZwq+xKZAL/sVNAIuojPn7Dg== + dependencies: + popper.js "^1.12.5" + prop-types "^15.5.10" + +react-table@^6.8.6: + version "6.8.6" + resolved "https://registry.yarnpkg.com/react-table/-/react-table-6.8.6.tgz#a0ad8b4839319052d5befc012603fb161e52ede3" + integrity sha1-oK2LSDkxkFLVvvwBJgP7Fh5S7eM= + dependencies: + classnames "^2.2.5" + 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" @@ -6198,7 +6655,7 @@ resolve@1.1.7, resolve@~1.1.0: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.1.7: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== @@ -6339,6 +6796,11 @@ scss-tokenizer@^0.2.3: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== +semver@^5.0.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -6408,6 +6870,16 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shell-quote@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + shelljs@0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" @@ -6501,7 +6973,7 @@ source-map-support@^0.4.0, source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.6: +source-map-support@^0.5.0, source-map-support@^0.5.5, source-map-support@^0.5.6: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== @@ -6786,6 +7258,13 @@ style-loader@^0.23.1: loader-utils "^1.1.0" schema-utils "^1.0.0" +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= + dependencies: + minimist "^1.1.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -6987,11 +7466,64 @@ tryor@~0.1.2: resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" integrity sha1-gUXkynyv9ArN48z5Rui4u3W0Fys= -tslib@^1.9.0: +ts-jest@^22.4.6: + version "22.4.6" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-22.4.6.tgz#a5d7f5e8b809626d1f4143209d301287472ec344" + integrity sha512-kYQ6g1G1AU+bOO9rv+SSQXg4WTcni6Wx3AM48iHni0nP1vIuhdNRjKTE9Cxx36Ix/IOV7L85iKu07dgXJzH2pQ== + dependencies: + babel-core "^6.26.3" + babel-plugin-istanbul "^4.1.6" + babel-plugin-transform-es2015-modules-commonjs "^6.26.2" + babel-preset-jest "^22.4.3" + cpx "^1.5.0" + fs-extra "6.0.0" + jest-config "^22.4.3" + lodash "^4.17.10" + pkg-dir "^2.0.0" + source-map-support "^0.5.5" + yargs "^11.0.0" + +ts-loader@^4.4.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.5.0.tgz#a1ce70b2dc799941fb2197605f0d67874097859b" + integrity sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^3.1.4" + semver "^5.0.1" + +tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== +tslint@^5.11.0: + version "5.11.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" + integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0= + dependencies: + babel-code-frame "^6.22.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^3.2.0" + glob "^7.1.1" + js-yaml "^3.7.0" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.27.2" + +tsutils@^2.27.2: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -7021,6 +7553,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== + uglify-es@^3.3.4: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" @@ -7113,6 +7650,11 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"