From 882f64e9d030346d2a98e3e8e4731c24a134822d Mon Sep 17 00:00:00 2001 From: Brian Lovin Date: Mon, 12 Mar 2018 22:42:11 -0500 Subject: [PATCH 01/14] Add members count to community view --- src/views/community/index.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/views/community/index.js b/src/views/community/index.js index 3c7c577ea3..2cf2eb3859 100644 --- a/src/views/community/index.js +++ b/src/views/community/index.js @@ -309,7 +309,11 @@ class CommunityView extends React.Component { selectedView === 'search' && } - Members + + Members ({community.metaData && + community.metaData.members && + community.metaData.members.toLocaleString()}) + From 524544a9ef6f53aeaeb2703dd9d9830ec170c86c Mon Sep 17 00:00:00 2001 From: Brian Lovin Date: Mon, 12 Mar 2018 22:44:28 -0500 Subject: [PATCH 02/14] Move channels list to right column --- src/components/listItems/style.js | 3 +-- src/views/community/index.js | 9 +++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/listItems/style.js b/src/components/listItems/style.js index 03050a0e66..006ba1bb66 100644 --- a/src/components/listItems/style.js +++ b/src/components/listItems/style.js @@ -96,8 +96,7 @@ export const ActionContainer = styled(FlexCol)` export const StyledCard = styled.div` flex-direction: column; - margin-top: 32px; - margin-left: 32px; + margin-top: 8px; display: ${props => (props.smallOnly ? 'none' : 'flex')}; @media (max-width: 768px) { diff --git a/src/views/community/index.js b/src/views/community/index.js index 2cf2eb3859..4c54744aec 100644 --- a/src/views/community/index.js +++ b/src/views/community/index.js @@ -223,10 +223,6 @@ class CommunityView extends React.Component { )} - @@ -309,6 +305,11 @@ class CommunityView extends React.Component { selectedView === 'search' && } + + Members ({community.metaData && community.metaData.members && From 8d3bce75d7f4fba85cabfe5b6bccc09c11d43982 Mon Sep 17 00:00:00 2001 From: Brian Lovin Date: Mon, 12 Mar 2018 22:58:52 -0500 Subject: [PATCH 03/14] Small styling and copy changes --- src/components/listItems/style.js | 1 - src/views/community/components/channelList.js | 47 +++++++++---------- src/views/community/components/memberGrid.js | 19 +++----- src/views/community/index.js | 5 +- 4 files changed, 32 insertions(+), 40 deletions(-) diff --git a/src/components/listItems/style.js b/src/components/listItems/style.js index 006ba1bb66..5af96039f3 100644 --- a/src/components/listItems/style.js +++ b/src/components/listItems/style.js @@ -96,7 +96,6 @@ export const ActionContainer = styled(FlexCol)` export const StyledCard = styled.div` flex-direction: column; - margin-top: 8px; display: ${props => (props.smallOnly ? 'none' : 'flex')}; @media (max-width: 768px) { diff --git a/src/views/community/components/channelList.js b/src/views/community/components/channelList.js index 184df98ad8..32e159b2bd 100644 --- a/src/views/community/components/channelList.js +++ b/src/views/community/components/channelList.js @@ -5,19 +5,15 @@ import { connect } from 'react-redux'; import compose from 'recompose/compose'; import { ChannelListItem } from '../../../components/listItems'; import { ChannelProfile } from '../../../components/profile'; -import { IconButton } from '../../../components/buttons'; +import { OutlineButton } from '../../../components/buttons'; import Icon from '../../../components/icons'; import { openModal } from '../../../actions/modals'; import viewNetworkHandler from '../../../components/viewNetworkHandler'; import { LoadingCard } from '../../../components/loading'; import getCommunityChannels from 'shared/graphql/queries/community/getCommunityChannelConnection'; import type { GetCommunityChannelConnectionType } from 'shared/graphql/queries/community/getCommunityChannelConnection'; -import { - StyledCard, - ListHeader, - ListHeading, - ListContainer, -} from '../../../components/listItems/style'; +import { StyledCard, ListContainer } from '../../../components/listItems/style'; +import { ColumnHeading } from '../style'; type Props = { data: { @@ -80,18 +76,7 @@ class ChannelList extends React.Component { return ( - - Channels - {isOwner && ( - - dispatch(openModal('CREATE_CHANNEL_MODAL', community)) - } - /> - )} - + Channels {/* user isn't logged in, channel list is used for navigation @@ -148,11 +133,8 @@ class ChannelList extends React.Component { {sortedNonJoinedChannels.length > 0 && isMember && ( - - - New channels - - + + New channels
    {sortedNonJoinedChannels.map(channel => { @@ -167,8 +149,23 @@ class ChannelList extends React.Component { })}
-
+ )} + + {isOwner && ( + + dispatch(openModal('CREATE_CHANNEL_MODAL', community)) + } + > + Create a channel + + )}
); } diff --git a/src/views/community/components/memberGrid.js b/src/views/community/components/memberGrid.js index 514e4508c2..53485d63f6 100644 --- a/src/views/community/components/memberGrid.js +++ b/src/views/community/components/memberGrid.js @@ -4,13 +4,13 @@ import compose from 'recompose/compose'; import getCommunityMembersQuery, { type GetCommunityMembersType, } from 'shared/graphql/queries/community/getCommunityMembers'; -import { FlexCol } from '../../../components/globals'; -import { Card } from '../../../components/card'; -import { LoadingList } from '../../../components/loading'; -import { UserListItem } from '../../../components/listItems'; -import viewNetworkHandler from '../../../components/viewNetworkHandler'; -import ViewError from '../../../components/viewError'; -import { StyledButton } from '../style'; +import { FlexCol } from 'src/components/globals'; +import { Card } from 'src/components/card'; +import { LoadingList } from 'src/components/loading'; +import { UserListItem } from 'src/components/listItems'; +import viewNetworkHandler from 'src/components/viewNetworkHandler'; +import ViewError from 'src/components/viewError'; +import { OutlineButton } from 'src/components/buttons'; type Props = { data: { @@ -45,11 +45,6 @@ class CommunityMemberGrid extends React.Component { }); return ; })} - {community.members.pageInfo.hasNextPage && ( - fetchMore()}> - View more... - - )} ); } diff --git a/src/views/community/index.js b/src/views/community/index.js index 4c54744aec..36c831acc5 100644 --- a/src/views/community/index.js +++ b/src/views/community/index.js @@ -311,9 +311,10 @@ class CommunityView extends React.Component { /> - Members ({community.metaData && + Top Members ({community.metaData && community.metaData.members && - community.metaData.members.toLocaleString()}) + community.metaData.members.toLocaleString()}{' '} + total)
From b0af9cbcf1c74292d2d06e8d87259800c3bd7456 Mon Sep 17 00:00:00 2001 From: Brian Lovin Date: Mon, 12 Mar 2018 23:29:07 -0500 Subject: [PATCH 04/14] Add granular channel notification controls on community view --- src/components/listItems/style.js | 2 +- src/components/profile/style.js | 6 -- .../toggleChannelNotifications/index.js | 79 +++++++++++++++++++ src/components/upsell/joinChannel.js | 3 - src/views/community/components/channelList.js | 62 +++++++++++---- src/views/community/components/memberGrid.js | 7 +- src/views/community/style.js | 15 ++++ src/views/status/style.js | 1 - src/views/thread/index.js | 2 +- 9 files changed, 145 insertions(+), 32 deletions(-) create mode 100644 src/components/toggleChannelNotifications/index.js diff --git a/src/components/listItems/style.js b/src/components/listItems/style.js index 5af96039f3..fe978b9801 100644 --- a/src/components/listItems/style.js +++ b/src/components/listItems/style.js @@ -62,7 +62,7 @@ export const Row = styled(FlexRow)` export const Heading = styled(H3)` font-weight: 500; - font-size: 14px; + font-size: 16px; transition: ${Transition.hover.off}; line-height: 1.2; display: flex; diff --git a/src/components/profile/style.js b/src/components/profile/style.js index edee166721..4ab9c9c465 100644 --- a/src/components/profile/style.js +++ b/src/components/profile/style.js @@ -12,7 +12,6 @@ import { import { Button, OutlineButton, IconButton } from '../buttons'; import { ReputationWrapper } from '../reputation/style'; import Card from '../card'; -import { Heading } from '../listItems/style'; export const ProfileHeader = styled(FlexRow)` padding: 16px; @@ -78,11 +77,6 @@ export const FullProfile = styled.div` margin-top: -64px; background-color: ${props => props.theme.bg.default}; - ${Heading} { - font-size: 16px; - color: ${props => props.theme.text.alt}; - } - @media (max-width: 768px) { margin-top: -48px; } diff --git a/src/components/toggleChannelNotifications/index.js b/src/components/toggleChannelNotifications/index.js new file mode 100644 index 0000000000..c58027ba72 --- /dev/null +++ b/src/components/toggleChannelNotifications/index.js @@ -0,0 +1,79 @@ +// @flow +import * as React from 'react'; +import { connect } from 'react-redux'; +import compose from 'recompose/compose'; +import { addToastWithTimeout } from '../../actions/toasts'; +import type { GetChannelType } from 'shared/graphql/queries/channel/getChannel'; +import toggleChannelNotificationsMutation, { + type ToggleChannelNotificationsType, +} from 'shared/graphql/mutations/channel/toggleChannelNotifications'; + +type Props = { + channel: { + ...$Exact, + }, + toggleChannelNotifications: Function, + dispatch: Function, + render: Function, +}; + +type State = { isLoading: boolean }; + +class ToggleChannelNotifications extends React.Component { + state = { isLoading: false }; + + init = () => { + this.setState({ + isLoading: true, + }); + + return this.toggleNotifications(); + }; + + terminate = () => { + this.setState({ + isLoading: false, + }); + }; + + toggleNotifications = () => { + const { channel } = this.props; + + this.setState({ + isLoading: true, + }); + + this.props + .toggleChannelNotifications(channel.id) + .then(({ data }: ToggleChannelNotificationsType) => { + this.setState({ + isLoading: false, + }); + + const { toggleChannelNotifications } = data; + + const value = + toggleChannelNotifications.channelPermissions.receiveNotifications; + const type = value ? 'success' : 'neutral'; + const str = value + ? 'Notifications activated!' + : 'Notifications turned off.'; + this.props.dispatch(addToastWithTimeout(type, str)); + return; + }) + .catch(err => { + this.setState({ + isLoading: false, + }); + this.props.dispatch(addToastWithTimeout('error', err.message)); + }); + }; + + render() { + return
{this.props.render(this.state)}
; + } +} + +export default compose(connect(), toggleChannelNotificationsMutation)( + ToggleChannelNotifications +); diff --git a/src/components/upsell/joinChannel.js b/src/components/upsell/joinChannel.js index 75de7cdd03..ac65bd9d80 100644 --- a/src/components/upsell/joinChannel.js +++ b/src/components/upsell/joinChannel.js @@ -6,10 +6,7 @@ import toggleChannelSubscriptionMutation from 'shared/graphql/mutations/channel/ import type { ToggleChannelSubscriptionType } from 'shared/graphql/mutations/channel/toggleChannelSubscription'; import { addToastWithTimeout } from '../../actions/toasts'; import { track } from '../../helpers/events'; -import { NullState } from './index'; import { - Title, - Subtitle, JoinChannelContainer, JoinChannelContent, JoinChannelTitle, diff --git a/src/views/community/components/channelList.js b/src/views/community/components/channelList.js index 32e159b2bd..43ddd10b2a 100644 --- a/src/views/community/components/channelList.js +++ b/src/views/community/components/channelList.js @@ -9,11 +9,16 @@ import { OutlineButton } from '../../../components/buttons'; import Icon from '../../../components/icons'; import { openModal } from '../../../actions/modals'; import viewNetworkHandler from '../../../components/viewNetworkHandler'; -import { LoadingCard } from '../../../components/loading'; +import { LoadingCard, Loading } from '../../../components/loading'; import getCommunityChannels from 'shared/graphql/queries/community/getCommunityChannelConnection'; import type { GetCommunityChannelConnectionType } from 'shared/graphql/queries/community/getCommunityChannelConnection'; import { StyledCard, ListContainer } from '../../../components/listItems/style'; -import { ColumnHeading } from '../style'; +import { + ColumnHeading, + ChannelListItemRow, + ToggleNotificationsContainer, +} from '../style'; +import ToggleChannelNotifications from 'src/components/toggleChannelNotifications'; type Props = { data: { @@ -113,19 +118,48 @@ class ChannelList extends React.Component { {sortedJoinedChannels.map(channel => { if (!channel) return null; return ( - - + - - - + + + ( + + {state.isLoading ? ( + + ) : ( + + )} + + )} + /> + ); })} diff --git a/src/views/community/components/memberGrid.js b/src/views/community/components/memberGrid.js index 53485d63f6..f1fecc5977 100644 --- a/src/views/community/components/memberGrid.js +++ b/src/views/community/components/memberGrid.js @@ -10,7 +10,6 @@ import { LoadingList } from 'src/components/loading'; import { UserListItem } from 'src/components/listItems'; import viewNetworkHandler from 'src/components/viewNetworkHandler'; import ViewError from 'src/components/viewError'; -import { OutlineButton } from 'src/components/buttons'; type Props = { data: { @@ -23,11 +22,7 @@ type Props = { class CommunityMemberGrid extends React.Component { render() { - const { - data: { community, fetchMore }, - isLoading, - isFetchingMore, - } = this.props; + const { data: { community }, isLoading } = this.props; if (community) { const { edges: members } = community.members; diff --git a/src/views/community/style.js b/src/views/community/style.js index 272319a434..01a9b82f15 100644 --- a/src/views/community/style.js +++ b/src/views/community/style.js @@ -7,6 +7,7 @@ import { Transition, zIndex, Gradient, + Tooltip, } from '../../components/globals'; import { DesktopSegment, @@ -222,3 +223,17 @@ export const ColumnHeading = styled.div` margin-top: 16px; border-bottom: 2px solid ${props => props.theme.bg.border}; `; + +export const ChannelListItemRow = styled.div` + display: flex; +`; + +export const ToggleNotificationsContainer = styled.div` + display: flex; + color: ${props => props.theme.text.alt}; + justify-content: center; + align-items: center; + height: 100%; + cursor: pointer; + ${Tooltip}; +`; diff --git a/src/views/status/style.js b/src/views/status/style.js index 89ad0b659b..db7a105dfc 100644 --- a/src/views/status/style.js +++ b/src/views/status/style.js @@ -1,6 +1,5 @@ // @flow import styled from 'styled-components'; -import { hexa } from 'src/components/globals'; export const Bar = styled.div` display: grid; diff --git a/src/views/thread/index.js b/src/views/thread/index.js index 64aa1e0df8..16a0510760 100644 --- a/src/views/thread/index.js +++ b/src/views/thread/index.js @@ -17,7 +17,7 @@ import { getThreadByMatch, getThreadByMatchQuery, } from 'shared/graphql/queries/thread/getThread'; -import { NullState, UpsellSignIn } from '../../components/upsell'; +import { NullState } from '../../components/upsell'; import JoinChannel from '../../components/upsell/joinChannel'; import { toState } from 'shared/draft-utils'; import LoadingView from './components/loading'; From 80e7dd2843f37df930b56f1b893de30de36777df Mon Sep 17 00:00:00 2001 From: Maximilian Stoiber Date: Tue, 13 Mar 2018 09:27:33 +0100 Subject: [PATCH 05/14] Plug the memory leak and stop the db connections from crashing **TL;DR: Rework our asyncify util and all the subscriptions once more to both plug the memory leak and stop our db connections from crashing.** Yesterday, while just sitting around and daydreaming I finally saw the light and understood why the shit that has been happening with our API has been happening. There are two phases to this story: The first phase is the phase of memory leaks and the second phase is the more recent one of database connection errors. We had those memory leaks, and I investigated them and reworked our entire subscriptions setup so that each user would get one changefeed per subscription. That worked beautifully, but unfortunately we started getting errors of db connections dropping. Thanks to @thelinuxlich I realized that those were happening because it turns out changefeeds don't scale well, especially not to hundreds at a time. This patch fixes the connection dropping by reverting back to a setup similar to our earlier version where we only have 4 changefeeds total and then filter the live results on the server per listener. Now you might be thinking "Hold on but didn't we have memory leaks then?", and we totally did and the great thing is that I realised why: The old `asyncify` util would buffer incoming live results. It would buffer all incoming results for any subscriber that came after. That means after six hours of production traffic we'd have buffered hundreds of messages and threads in memory, which led to the server running out of memory, which led to it crashing. So this time, I've reworked our asyncify util again but without that buffering, which means we'll have the stability of the connections by only having 4 changefeed open, but we also won't have memory leaks. Win win! :tada: --- iris/models/directMessageThread.js | 5 +- iris/models/message.js | 6 +- iris/models/notification.js | 10 +- iris/models/thread.js | 9 +- iris/subscriptions/directMessageThread.js | 15 ++- iris/subscriptions/message.js | 44 ++++---- iris/subscriptions/notification.js | 29 ++---- iris/subscriptions/thread.js | 13 +-- iris/utils/asyncify.js | 117 +++++++++------------- 9 files changed, 92 insertions(+), 156 deletions(-) diff --git a/iris/models/directMessageThread.js b/iris/models/directMessageThread.js index 54d29dfdb5..bb505259b9 100644 --- a/iris/models/directMessageThread.js +++ b/iris/models/directMessageThread.js @@ -80,9 +80,7 @@ const hasChanged = (field: string) => .ne(db.row('new_val')(field)); const THREAD_LAST_ACTIVE_CHANGED = hasChanged('threadLastActive'); -const listenToUpdatedDirectMessageThreads = (userId: string) => ( - cb: Function -): Function => { +const listenToUpdatedDirectMessageThreads = (cb: Function): Function => { return db .table('directMessageThreads') .changes({ @@ -90,7 +88,6 @@ const listenToUpdatedDirectMessageThreads = (userId: string) => ( }) .filter(NEW_DOCUMENTS.or(THREAD_LAST_ACTIVE_CHANGED))('new_val') .eqJoin('id', db.table('usersDirectMessageThreads'), { index: 'threadId' }) - .filter({ right: { userId } }) .without({ right: ['id', 'createdAt', 'threadId', 'lastActive', 'lastSeen'], }) diff --git a/iris/models/message.js b/iris/models/message.js index 3bbc104ad7..4121ef6ce4 100644 --- a/iris/models/message.js +++ b/iris/models/message.js @@ -149,13 +149,9 @@ export const storeMessage = ( }); }; -export const listenToNewMessagesInThread = (threadId: string) => ( - cb: Function -): Function => { +export const listenToNewMessages = (cb: Function): Function => { return db .table('messages') - .getAll(threadId, { index: 'threadId' }) - .filter(db.row.hasFields('deletedAt').not()) .changes({ includeInitial: false, }) diff --git a/iris/models/notification.js b/iris/models/notification.js index 7d93707021..f7a3e91f93 100644 --- a/iris/models/notification.js +++ b/iris/models/notification.js @@ -62,16 +62,13 @@ const hasChanged = (field: string) => const MODIFIED_AT_CHANGED = hasChanged('entityAddedAt'); -export const listenToNewNotifications = (userId: string) => ( - cb: Function -): Function => { +export const listenToNewNotifications = (cb: Function): Function => { return db .table('usersNotifications') .changes({ includeInitial: false, }) .filter(NEW_DOCUMENTS.or(MODIFIED_AT_CHANGED))('new_val') - .filter({ userId }) .eqJoin('notificationId', db.table('notifications')) .without({ left: ['notificationId', 'createdAt', 'id', 'entityAddedAt'], @@ -81,16 +78,13 @@ export const listenToNewNotifications = (userId: string) => ( .run(eachAsyncNewValue(cb)); }; -export const listenToNewDirectMessageNotifications = (userId: string) => ( - cb: Function -) => { +export const listenToNewDirectMessageNotifications = (cb: Function) => { return db .table('usersNotifications') .changes({ includeInitial: false, }) .filter(NEW_DOCUMENTS.or(MODIFIED_AT_CHANGED))('new_val') - .filter({ userId }) .eqJoin('notificationId', db.table('notifications')) .without({ left: ['notificationId', 'createdAt', 'id', 'entityAddedAt'], diff --git a/iris/models/thread.js b/iris/models/thread.js index a6baa66a8f..f6a346533d 100644 --- a/iris/models/thread.js +++ b/iris/models/thread.js @@ -505,17 +505,12 @@ const hasChanged = (field: string) => .ne(db.row('new_val')(field)); const LAST_ACTIVE_CHANGED = hasChanged('lastActive'); -export const listenToUpdatedThreads = (channelIds: Array) => ( - cb: Function -): Function => { +export const listenToUpdatedThreads = (cb: Function): Function => { return db .table('threads') .changes({ includeInitial: false, }) - .filter(NEW_DOCUMENTS.or(LAST_ACTIVE_CHANGED)) - .filter(thread => - db.expr(channelIds).contains(thread('new_val')('channelId')) - )('new_val') + .filter(NEW_DOCUMENTS.or(LAST_ACTIVE_CHANGED))('new_val') .run(eachAsyncNewValue(cb)); }; diff --git a/iris/subscriptions/directMessageThread.js b/iris/subscriptions/directMessageThread.js index 2f7f854d93..640dbea514 100644 --- a/iris/subscriptions/directMessageThread.js +++ b/iris/subscriptions/directMessageThread.js @@ -16,6 +16,10 @@ import type { GraphQLContext } from '../'; import type { GraphQLResolveInfo } from 'graphql'; import type { DBDirectMessageThread } from '../models/directMessageThread'; +const addNewDirectMessageThreadListener = asyncify( + listenToUpdatedDirectMessageThreads +); + module.exports = { Subscription: { directMessageThreadUpdated: { @@ -32,20 +36,13 @@ module.exports = { ); debug(`@${user.username || user.id} listening to updated DM threads`); - return asyncify(listenToUpdatedDirectMessageThreads(user.id), { + return addNewDirectMessageThreadListener({ + filter: thread => thread.userId === user.id, onError: err => { // Don't crash the whole API server on error in the listener console.error(err); Raven.captureException(err); }, - onClose: cursor => { - if (cursor) { - /* ignore errors that happen when closing the cursor */ - try { - cursor.close(() => {}); - } catch (err) {} - } - }, }); }, }, diff --git a/iris/subscriptions/message.js b/iris/subscriptions/message.js index c0520d8e4a..e7420167eb 100644 --- a/iris/subscriptions/message.js +++ b/iris/subscriptions/message.js @@ -2,13 +2,15 @@ const debug = require('debug')('iris:subscriptions:messages'); import { getThread } from '../models/thread'; import { getDirectMessageThread } from '../models/directMessageThread'; -import { userCanViewChannel, userCanViewDirectMessageThread } from './utils'; +import { listenToNewMessages } from '../models/message'; +import UserError from '../utils/UserError'; import asyncify from '../utils/asyncify'; -import { listenToNewMessagesInThread } from '../models/message'; +import { userCanViewChannel, userCanViewDirectMessageThread } from './utils'; import { trackUserThreadLastSeenQueue } from 'shared/bull/queues.js'; -import UserError from '../utils/UserError'; import Raven from 'shared/raven'; +const addMessageListener = asyncify(listenToNewMessages); + import type { Message } from '../models/message'; import type { GraphQLContext } from '../'; import type { GraphQLResolveInfo } from 'graphql'; @@ -53,29 +55,19 @@ module.exports = { } debug(`${moniker} listening to new messages in ${thread}`); - return asyncify(listenToNewMessagesInThread(thread), { - onError: err => { - // Don't crash the whole API server on error in the listener - console.error(err); - Raven.captureException(err); - }, - onClose: cursor => { - // Once the user unsubscribes record a new threadLastSeen - if (user && user.id) { - trackUserThreadLastSeenQueue.add({ - threadId: thread, - userId: user.id, - timestamp: Date.now(), - }); - } - if (cursor) { - /* ignore errors that happen when closing the cursor */ - try { - cursor.close(() => {}); - } catch (err) {} - } - }, - }); + try { + return addMessageListener({ + filter: message => message.threadId === thread, + onError: err => { + // Don't crash the whole API server on error in the listener + console.error(err); + Raven.captureException(err); + }, + }); + } catch (err) { + console.error(err); + Raven.captureException(err); + } }, }, }, diff --git a/iris/subscriptions/notification.js b/iris/subscriptions/notification.js index 9ec0cf3126..488010e6dc 100644 --- a/iris/subscriptions/notification.js +++ b/iris/subscriptions/notification.js @@ -11,6 +11,11 @@ import Raven from 'shared/raven'; import type { GraphQLContext } from '../'; import type { GraphQLResolveInfo } from 'graphql'; +const addNotificationListener = asyncify(listenToNewNotifications); +const addDMNotificationListener = asyncify( + listenToNewDirectMessageNotifications +); + module.exports = { Subscription: { notificationAdded: { @@ -27,20 +32,14 @@ module.exports = { ); debug(`@${user.username || user.id} listening to notifications`); - return asyncify(listenToNewNotifications(user.id), { + return addNotificationListener({ + filter: notification => + notification && notification.userId === user.id, onError: err => { // Don't crash the whole API server on error in the listener console.error(err); Raven.captureException(err); }, - onClose: cursor => { - if (cursor) { - /* ignore errors that happen when closing the cursor */ - try { - cursor.close(() => {}); - } catch (err) {} - } - }, }); }, }, @@ -58,20 +57,14 @@ module.exports = { ); debug(`@${user.username || user.id} listening to DM notifications`); - return asyncify(listenToNewDirectMessageNotifications(user.id), { + return addDMNotificationListener({ + filter: notification => + notification && notification.userId === user.id, onError: err => { // Don't crash the whole API server on error in the listener console.error(err); Raven.captureException(err); }, - onClose: cursor => { - if (cursor) { - /* ignore errors that happen when closing the cursor */ - try { - cursor.close(() => {}); - } catch (err) {} - } - }, }); }, }, diff --git a/iris/subscriptions/thread.js b/iris/subscriptions/thread.js index a4af28332c..17b543a4ed 100644 --- a/iris/subscriptions/thread.js +++ b/iris/subscriptions/thread.js @@ -13,6 +13,8 @@ import Raven from 'shared/raven'; import type { GraphQLContext } from '../'; import type { GraphQLResolveInfo } from 'graphql'; +const addThreadListener = asyncify(listenToUpdatedThreads); + module.exports = { Subscription: { threadUpdated: { @@ -51,20 +53,13 @@ module.exports = { ids.length } channels` ); - return asyncify(listenToUpdatedThreads(ids), { + return addThreadListener({ + filter: thread => thread && ids.includes(thread.channelId), onError: err => { // Don't crash the whole API server on error in the listener console.error(err); Raven.captureException(err); }, - onClose: cursor => { - if (cursor) { - /* ignore errors that happen when closing the cursor */ - try { - cursor.close(() => {}); - } catch (err) {} - } - }, }); }, }, diff --git a/iris/utils/asyncify.js b/iris/utils/asyncify.js index 25d62156e5..2b3427df09 100644 --- a/iris/utils/asyncify.js +++ b/iris/utils/asyncify.js @@ -1,89 +1,66 @@ // @flow -// Turn a callback-based listener into an async iterator -// Based on https://github.com/apollographql/graphql-subscriptions/blob/master/src/event-emitter-to-async-iterator.ts -const debug = require('debug')('iris:utils:asyncify'); +// Turn a callback-based listener into many async iterators without buffering import { $$asyncIterator } from 'iterall'; -type Listener = ((arg: any) => void) => Promise; - -type onError = (err: Error) => void; +type Listener = ((arg: any) => void) => Promise; const defaultOnError = (err: Error) => { throw new Error(err); }; type Options = {| - onError?: onError, - onClose?: Function, + onError?: (err: Error) => void, + filter?: (arg: any) => boolean, |}; -const asyncify = ( - listener: Listener, - { onError = defaultOnError, onClose }: Options = {} -) => { - try { - let pullQueue = []; - let pushQueue = []; - let listening = true; - let listenerReturnValue; - // Start listener - listener(value => pushValue(value)) - .then(a => { - listenerReturnValue = a; - }) - .catch(err => { - onError(err); - }); +type Watcher = { + filter?: (arg: any) => boolean, + callback?: ({ done: boolean, value: any }) => void, +}; - function pushValue(value) { - if (pullQueue.length !== 0) { - pullQueue.shift()({ value, done: false }); - } else { - pushQueue.push(value); +const asyncify = (listener: Listener) => { + let watchers: Array = []; + listener(value => { + watchers.forEach(watcher => { + if (watcher.callback && (!watcher.filter || watcher.filter(value))) { + watcher.callback({ done: false, value }); } - } + }); + }); - function pullValue() { - return new Promise(resolve => { - if (pushQueue.length !== 0) { - resolve({ value: pushQueue.shift(), done: false }); - } else { - pullQueue.push(resolve); - } - }); - } - - function emptyQueue() { - if (listening) { - listening = false; - pullQueue.forEach(resolve => resolve({ value: undefined, done: true })); - pullQueue = []; - pushQueue = []; - onClose && onClose(listenerReturnValue); + return ({ filter, onError = defaultOnError }: Options = {}) => { + let watcher: Watcher = { filter }; + let watching = true; + const cleanup = () => { + if (watching) { + watching = false; + watchers = watchers.filter(w => w !== watcher); } + }; + try { + return { + next: () => + new Promise(resolve => { + watcher.callback = resolve; + watchers.push(watcher); + }), + return: () => { + cleanup(); + return Promise.resolve({ done: true }); + }, + throw: err => { + cleanup(); + onError(err); + return Promise.reject(err); + }, + [$$asyncIterator]() { + return this; + }, + }; + } catch (err) { + onError(err); } - - return ({ - next() { - return listening ? pullValue() : this.return(); - }, - return() { - emptyQueue(); - return Promise.resolve({ value: undefined, done: true }); - }, - throw(error) { - emptyQueue(); - onError(error); - return Promise.reject(error); - }, - [$$asyncIterator]() { - return this; - }, - }: any); - } catch (err) { - debug(err); - onError(err); - } + }; }; export default asyncify; From 30f95aefa760b06bfa186f62327ad8dba50e9c60 Mon Sep 17 00:00:00 2001 From: Maximilian Stoiber Date: Tue, 13 Mar 2018 11:21:28 +0100 Subject: [PATCH 06/14] Revert "Revert "Consistent linkification in messages"" This reverts commit f0204f6553f097c000b05977f75cb196ef04f0d3. --- shared/clients/draft-js/links-decorator/core.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/shared/clients/draft-js/links-decorator/core.js b/shared/clients/draft-js/links-decorator/core.js index 95d24c08ef..10778c5e3a 100644 --- a/shared/clients/draft-js/links-decorator/core.js +++ b/shared/clients/draft-js/links-decorator/core.js @@ -1,7 +1,6 @@ // @flow import React from 'react'; -import findWithRegex from 'find-with-regex'; -import { URL } from 'shared/regexps'; +import linkStrategy from 'draft-js-linkify-plugin/lib/linkStrategy'; import normalizeUrl from '../../../normalize-url'; import type { ContentBlock } from 'draft-js/lib/ContentBlock'; import type { ComponentType, Node } from 'react'; @@ -20,10 +19,7 @@ let i = 0; const createLinksDecorator = ( Component: ComponentType ) => ({ - strategy: ( - contentBlock: ContentBlock, - callback: (...args?: Array) => any - ) => findWithRegex(URL, contentBlock, callback), + strategy: linkStrategy, component: ({ decoratedText, children }: DecoratorComponentProps) => ( Date: Tue, 13 Mar 2018 11:38:31 +0100 Subject: [PATCH 07/14] Fix linkification --- shared/normalize-url.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/shared/normalize-url.js b/shared/normalize-url.js index f5cf500a30..dbda59b14b 100644 --- a/shared/normalize-url.js +++ b/shared/normalize-url.js @@ -1,14 +1,14 @@ // @flow -const PROTOCOL = /(http(s?)):\/\//gi; +const STARTS_WITH_PROTOCOL = /^https?:\/\//i; -const addProtocolToString = (string: string) => { - // if the string starts with http or https, we are good - if (PROTOCOL.test(string)) { - return string; +// Note(@mxstbr): This method assumes that a string passed into it is already verified to be an URL +// it'll just append https:// to anything that doesn't look like an URL +const addProtocolToString = (url: string) => { + if (STARTS_WITH_PROTOCOL.test(url)) { + return url; } else { - // otherwise it doesn't start with a protocol, prepend http - return `http://${string}`; + return `https://${url}`; } }; From a220c0ae6c642446cf4cd64223d8263e674f7dcf Mon Sep 17 00:00:00 2001 From: Maximilian Stoiber Date: Tue, 13 Mar 2018 11:44:12 +0100 Subject: [PATCH 08/14] Add tests to normalize-url --- shared/test/normalize-url.test.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 shared/test/normalize-url.test.js diff --git a/shared/test/normalize-url.test.js b/shared/test/normalize-url.test.js new file mode 100644 index 0000000000..92ef88ac37 --- /dev/null +++ b/shared/test/normalize-url.test.js @@ -0,0 +1,30 @@ +// @flow +import normalizeUrl from '../normalize-url'; + +type Input = string; +type Output = string; + +// If only Input is provided it tests for input === output +type TestCase = [Input, Output]; + +type TestCases = { + [testName: string]: TestCase, +}; + +const testCases: TestCases = { + 'should do nothing to https URLs': [ + 'https://github.com', + 'https://github.com', + ], + 'should do nothing to http URLs': ['http://github.com', 'http://github.com'], + 'should add https:// in front of URLs without protocol': [ + 'github.com', + 'https://github.com', + ], +}; + +Object.keys(testCases).forEach(name => { + it(name, () => { + expect(normalizeUrl(testCases[name][0])).toEqual(testCases[name][1]); + }); +}); From f1b50f8401d71ae4f79d8f55f7ff562d2f5852f4 Mon Sep 17 00:00:00 2001 From: Maximilian Stoiber Date: Tue, 13 Mar 2018 15:18:39 +0100 Subject: [PATCH 09/14] Add Danger --- .gitignore | 3 +- dangerfile.js | 66 ++ flow-typed/npm/danger-plugin-jest_vx.x.x.js | 39 + .../danger-plugin-no-test-shortcuts_vx.x.x.js | 32 + flow-typed/npm/danger-plugin-yarn_vx.x.x.js | 46 ++ flow-typed/npm/danger_vx.x.x.js | 592 +++++++++++++ package.json | 6 +- yarn.lock | 780 +++++++++++++++++- 8 files changed, 1518 insertions(+), 46 deletions(-) create mode 100644 dangerfile.js create mode 100644 flow-typed/npm/danger-plugin-jest_vx.x.x.js create mode 100644 flow-typed/npm/danger-plugin-no-test-shortcuts_vx.x.x.js create mode 100644 flow-typed/npm/danger-plugin-yarn_vx.x.x.js create mode 100644 flow-typed/npm/danger_vx.x.x.js diff --git a/.gitignore b/.gitignore index bc9fa29741..0d6fc5347a 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,5 @@ test-extend.js stats.json iris/.env .expo -mobile/.expo \ No newline at end of file +mobile/.expo +test-results.json diff --git a/dangerfile.js b/dangerfile.js new file mode 100644 index 0000000000..239e73f667 --- /dev/null +++ b/dangerfile.js @@ -0,0 +1,66 @@ +// @flow +import path from 'path'; +import { warn, fail, message, markdown, schedule, danger } from 'danger'; +import yarn from 'danger-plugin-yarn'; +import jest from 'danger-plugin-jest'; +import noTestShortcuts from 'danger-plugin-no-test-shortcuts'; + +const APP_FOLDERS = [ + 'admin', + 'athena', + 'chronos', + 'hermes', + 'hyperion', + 'iris', + 'mercury', + 'shared', + 'src', + 'vulcan', +]; +const CHECKBOXES = /^- \[[x]] *(.*)?$/gim; +const possibleAutoLabels = { + wip: 'WIP: Building', + 'needs testing': 'WIP: Needs Testing', + 'ready for review': 'WIP: Ready for Review', +}; + +// Make sure people describe what their PR is about +if (danger.github.pr.body.length < 10) { + fail('Please add a description to your PR.'); +} + +// Add automatic labels to the PR +schedule(async () => { + const pr = danger.github.pr; + const api = danger.github.api; + const checkedBoxes = pr.body.match(CHECKBOXES); + if (!checkedBoxes || checkedBoxes.length === 0) return; + + const matches = checkedBoxes.map(result => result[1]); + + const matchingLabels = matches.filter(match => + Object.keys(possibleAutoLabels).includes(match.toLowerCase()) + ); + + if (!matchingLabels || matchingLabels.length === 0) return; + + await api.issues.addLabels({ + owner: pr.owner, + repo: pr.repo, + number: pr.number, + labels: matchingLabels, + }); +}); + +// Make sure the yarn.lock file is updated when dependencies get added and log any added dependencies +APP_FOLDERS.forEach(folder => { + schedule(yarn(path.join(__dirname, folder, 'package.json'))); +}); + +// Log test failures if there are any +jest(); + +// Make sure nobody does a it.only and blocks our entire test-suite from running +noTestShortcuts({ + predicate: filePath => filePath.endsWith('.test.js'), +}); diff --git a/flow-typed/npm/danger-plugin-jest_vx.x.x.js b/flow-typed/npm/danger-plugin-jest_vx.x.x.js new file mode 100644 index 0000000000..8617997fc8 --- /dev/null +++ b/flow-typed/npm/danger-plugin-jest_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 0bc9953088789fa140d0772a738d8153 +// flow-typed version: <>/danger-plugin-jest_v^1.1.0/flow_v0.66.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'danger-plugin-jest' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'danger-plugin-jest' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'danger-plugin-jest/dist/index' { + declare module.exports: any; +} + +declare module 'danger-plugin-jest/dist/types' { + declare module.exports: any; +} + +// Filename aliases +declare module 'danger-plugin-jest/dist/index.js' { + declare module.exports: $Exports<'danger-plugin-jest/dist/index'>; +} +declare module 'danger-plugin-jest/dist/types.js' { + declare module.exports: $Exports<'danger-plugin-jest/dist/types'>; +} diff --git a/flow-typed/npm/danger-plugin-no-test-shortcuts_vx.x.x.js b/flow-typed/npm/danger-plugin-no-test-shortcuts_vx.x.x.js new file mode 100644 index 0000000000..e71ca2faa8 --- /dev/null +++ b/flow-typed/npm/danger-plugin-no-test-shortcuts_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 6eac443fa8195b12d311468f9d3dfcb8 +// flow-typed version: <>/danger-plugin-no-test-shortcuts_v^2.0.0/flow_v0.66.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'danger-plugin-no-test-shortcuts' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'danger-plugin-no-test-shortcuts' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'danger-plugin-no-test-shortcuts/dist/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'danger-plugin-no-test-shortcuts/dist/index.js' { + declare module.exports: $Exports<'danger-plugin-no-test-shortcuts/dist/index'>; +} diff --git a/flow-typed/npm/danger-plugin-yarn_vx.x.x.js b/flow-typed/npm/danger-plugin-yarn_vx.x.x.js new file mode 100644 index 0000000000..f653b2085e --- /dev/null +++ b/flow-typed/npm/danger-plugin-yarn_vx.x.x.js @@ -0,0 +1,46 @@ +// flow-typed signature: 7b69917a67b22d12810ba89bc8ffdec2 +// flow-typed version: <>/danger-plugin-yarn_v^1.2.1/flow_v0.66.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'danger-plugin-yarn' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'danger-plugin-yarn' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'danger-plugin-yarn/dist/danger-mock' { + declare module.exports: any; +} + +declare module 'danger-plugin-yarn/dist/index' { + declare module.exports: any; +} + +declare module 'danger-plugin-yarn/dist/index.test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'danger-plugin-yarn/dist/danger-mock.js' { + declare module.exports: $Exports<'danger-plugin-yarn/dist/danger-mock'>; +} +declare module 'danger-plugin-yarn/dist/index.js' { + declare module.exports: $Exports<'danger-plugin-yarn/dist/index'>; +} +declare module 'danger-plugin-yarn/dist/index.test.js' { + declare module.exports: $Exports<'danger-plugin-yarn/dist/index.test'>; +} diff --git a/flow-typed/npm/danger_vx.x.x.js b/flow-typed/npm/danger_vx.x.x.js new file mode 100644 index 0000000000..48ebcc48fc --- /dev/null +++ b/flow-typed/npm/danger_vx.x.x.js @@ -0,0 +1,592 @@ +// flow-typed signature: 9a4f89440762daa780f3c48b41660b25 +// flow-typed version: <>/danger_v3.x/flow_v0.66.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'danger' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'danger' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'danger/dangerfile.circle' { + declare module.exports: any; +} + +declare module 'danger/dangerfile.flow' { + declare module.exports: any; +} + +declare module 'danger/distribution/api/fetch' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/ci_source_helpers' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/ci_source' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/get_ci_source' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Bitrise' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/BuddyBuild' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Buildkite' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Circle' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Codeship' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/DockerCloud' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Drone' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Fake' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/index' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Jenkins' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/local-repo' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Nevercode' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Semaphore' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Surf' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/Travis' { + declare module.exports: any; +} + +declare module 'danger/distribution/ci_source/providers/VSTS' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/ci/runner' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/danger-ci' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/danger-init' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/danger-local' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/danger-pr' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/danger-process' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/danger-runner' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/danger' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/init/add-to-ci' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/init/default-dangerfile' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/init/get-repo-slug' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/init/interfaces' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/init/state-setup' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/utils/dangerRunToRunnerCLI' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/utils/file-utils' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/utils/getRuntimeCISource' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/utils/reporting' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/utils/runDangerSubprocess' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/utils/sharedDangerfileArgs' { + declare module.exports: any; +} + +declare module 'danger/distribution/commands/utils/validateDangerfileExists' { + declare module.exports: any; +} + +declare module 'danger/distribution/danger' { + declare module.exports: any; +} + +declare module 'danger/distribution/dsl/Aliases' { + declare module.exports: any; +} + +declare module 'danger/distribution/dsl/cli-args' { + declare module.exports: any; +} + +declare module 'danger/distribution/dsl/Commit' { + declare module.exports: any; +} + +declare module 'danger/distribution/dsl/DangerDSL' { + declare module.exports: any; +} + +declare module 'danger/distribution/dsl/DangerResults' { + declare module.exports: any; +} + +declare module 'danger/distribution/dsl/DangerUtilsDSL' { + declare module.exports: any; +} + +declare module 'danger/distribution/dsl/GitDSL' { + declare module.exports: any; +} + +declare module 'danger/distribution/dsl/GitHubDSL' { + declare module.exports: any; +} + +declare module 'danger/distribution/dsl/Violation' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/FakePlatform' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/git/diffToGitJSONDSL' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/git/gitJSONToGitDSL' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/git/localGetCommits' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/git/localGetDiff' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/git/localGetFileAtSHA' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/GitHub' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/github/GitHubAPI' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/github/GitHubGit' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/github/GitHubUtils' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/github/pullRequestParser' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/LocalGit' { + declare module.exports: any; +} + +declare module 'danger/distribution/platforms/platform' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/danger-dsl-json' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/Dangerfile' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/DangerUtils' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/dslGenerator' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/Executor' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/json-to-context' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/jsonToDSL' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/runners/inline' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/runners/runner' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/runners/utils/cleanDangerfile' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/runners/utils/resultsForCaughtError' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/runners/utils/transpiler' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/runners/vm2' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/templates/exceptionRaisedTemplate' { + declare module.exports: any; +} + +declare module 'danger/distribution/runner/templates/githubIssueTemplate' { + declare module.exports: any; +} + +declare module 'danger/wallaby' { + declare module.exports: any; +} + +// Filename aliases +declare module 'danger/dangerfile.circle.js' { + declare module.exports: $Exports<'danger/dangerfile.circle'>; +} +declare module 'danger/dangerfile.flow.js' { + declare module.exports: $Exports<'danger/dangerfile.flow'>; +} +declare module 'danger/distribution/api/fetch.js' { + declare module.exports: $Exports<'danger/distribution/api/fetch'>; +} +declare module 'danger/distribution/ci_source/ci_source_helpers.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/ci_source_helpers'>; +} +declare module 'danger/distribution/ci_source/ci_source.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/ci_source'>; +} +declare module 'danger/distribution/ci_source/get_ci_source.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/get_ci_source'>; +} +declare module 'danger/distribution/ci_source/providers/Bitrise.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Bitrise'>; +} +declare module 'danger/distribution/ci_source/providers/BuddyBuild.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/BuddyBuild'>; +} +declare module 'danger/distribution/ci_source/providers/Buildkite.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Buildkite'>; +} +declare module 'danger/distribution/ci_source/providers/Circle.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Circle'>; +} +declare module 'danger/distribution/ci_source/providers/Codeship.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Codeship'>; +} +declare module 'danger/distribution/ci_source/providers/DockerCloud.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/DockerCloud'>; +} +declare module 'danger/distribution/ci_source/providers/Drone.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Drone'>; +} +declare module 'danger/distribution/ci_source/providers/Fake.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Fake'>; +} +declare module 'danger/distribution/ci_source/providers/index.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/index'>; +} +declare module 'danger/distribution/ci_source/providers/Jenkins.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Jenkins'>; +} +declare module 'danger/distribution/ci_source/providers/local-repo.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/local-repo'>; +} +declare module 'danger/distribution/ci_source/providers/Nevercode.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Nevercode'>; +} +declare module 'danger/distribution/ci_source/providers/Semaphore.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Semaphore'>; +} +declare module 'danger/distribution/ci_source/providers/Surf.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Surf'>; +} +declare module 'danger/distribution/ci_source/providers/Travis.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/Travis'>; +} +declare module 'danger/distribution/ci_source/providers/VSTS.js' { + declare module.exports: $Exports<'danger/distribution/ci_source/providers/VSTS'>; +} +declare module 'danger/distribution/commands/ci/runner.js' { + declare module.exports: $Exports<'danger/distribution/commands/ci/runner'>; +} +declare module 'danger/distribution/commands/danger-ci.js' { + declare module.exports: $Exports<'danger/distribution/commands/danger-ci'>; +} +declare module 'danger/distribution/commands/danger-init.js' { + declare module.exports: $Exports<'danger/distribution/commands/danger-init'>; +} +declare module 'danger/distribution/commands/danger-local.js' { + declare module.exports: $Exports<'danger/distribution/commands/danger-local'>; +} +declare module 'danger/distribution/commands/danger-pr.js' { + declare module.exports: $Exports<'danger/distribution/commands/danger-pr'>; +} +declare module 'danger/distribution/commands/danger-process.js' { + declare module.exports: $Exports<'danger/distribution/commands/danger-process'>; +} +declare module 'danger/distribution/commands/danger-runner.js' { + declare module.exports: $Exports<'danger/distribution/commands/danger-runner'>; +} +declare module 'danger/distribution/commands/danger.js' { + declare module.exports: $Exports<'danger/distribution/commands/danger'>; +} +declare module 'danger/distribution/commands/init/add-to-ci.js' { + declare module.exports: $Exports<'danger/distribution/commands/init/add-to-ci'>; +} +declare module 'danger/distribution/commands/init/default-dangerfile.js' { + declare module.exports: $Exports<'danger/distribution/commands/init/default-dangerfile'>; +} +declare module 'danger/distribution/commands/init/get-repo-slug.js' { + declare module.exports: $Exports<'danger/distribution/commands/init/get-repo-slug'>; +} +declare module 'danger/distribution/commands/init/interfaces.js' { + declare module.exports: $Exports<'danger/distribution/commands/init/interfaces'>; +} +declare module 'danger/distribution/commands/init/state-setup.js' { + declare module.exports: $Exports<'danger/distribution/commands/init/state-setup'>; +} +declare module 'danger/distribution/commands/utils/dangerRunToRunnerCLI.js' { + declare module.exports: $Exports<'danger/distribution/commands/utils/dangerRunToRunnerCLI'>; +} +declare module 'danger/distribution/commands/utils/file-utils.js' { + declare module.exports: $Exports<'danger/distribution/commands/utils/file-utils'>; +} +declare module 'danger/distribution/commands/utils/getRuntimeCISource.js' { + declare module.exports: $Exports<'danger/distribution/commands/utils/getRuntimeCISource'>; +} +declare module 'danger/distribution/commands/utils/reporting.js' { + declare module.exports: $Exports<'danger/distribution/commands/utils/reporting'>; +} +declare module 'danger/distribution/commands/utils/runDangerSubprocess.js' { + declare module.exports: $Exports<'danger/distribution/commands/utils/runDangerSubprocess'>; +} +declare module 'danger/distribution/commands/utils/sharedDangerfileArgs.js' { + declare module.exports: $Exports<'danger/distribution/commands/utils/sharedDangerfileArgs'>; +} +declare module 'danger/distribution/commands/utils/validateDangerfileExists.js' { + declare module.exports: $Exports<'danger/distribution/commands/utils/validateDangerfileExists'>; +} +declare module 'danger/distribution/danger.js' { + declare module.exports: $Exports<'danger/distribution/danger'>; +} +declare module 'danger/distribution/dsl/Aliases.js' { + declare module.exports: $Exports<'danger/distribution/dsl/Aliases'>; +} +declare module 'danger/distribution/dsl/cli-args.js' { + declare module.exports: $Exports<'danger/distribution/dsl/cli-args'>; +} +declare module 'danger/distribution/dsl/Commit.js' { + declare module.exports: $Exports<'danger/distribution/dsl/Commit'>; +} +declare module 'danger/distribution/dsl/DangerDSL.js' { + declare module.exports: $Exports<'danger/distribution/dsl/DangerDSL'>; +} +declare module 'danger/distribution/dsl/DangerResults.js' { + declare module.exports: $Exports<'danger/distribution/dsl/DangerResults'>; +} +declare module 'danger/distribution/dsl/DangerUtilsDSL.js' { + declare module.exports: $Exports<'danger/distribution/dsl/DangerUtilsDSL'>; +} +declare module 'danger/distribution/dsl/GitDSL.js' { + declare module.exports: $Exports<'danger/distribution/dsl/GitDSL'>; +} +declare module 'danger/distribution/dsl/GitHubDSL.js' { + declare module.exports: $Exports<'danger/distribution/dsl/GitHubDSL'>; +} +declare module 'danger/distribution/dsl/Violation.js' { + declare module.exports: $Exports<'danger/distribution/dsl/Violation'>; +} +declare module 'danger/distribution/platforms/FakePlatform.js' { + declare module.exports: $Exports<'danger/distribution/platforms/FakePlatform'>; +} +declare module 'danger/distribution/platforms/git/diffToGitJSONDSL.js' { + declare module.exports: $Exports<'danger/distribution/platforms/git/diffToGitJSONDSL'>; +} +declare module 'danger/distribution/platforms/git/gitJSONToGitDSL.js' { + declare module.exports: $Exports<'danger/distribution/platforms/git/gitJSONToGitDSL'>; +} +declare module 'danger/distribution/platforms/git/localGetCommits.js' { + declare module.exports: $Exports<'danger/distribution/platforms/git/localGetCommits'>; +} +declare module 'danger/distribution/platforms/git/localGetDiff.js' { + declare module.exports: $Exports<'danger/distribution/platforms/git/localGetDiff'>; +} +declare module 'danger/distribution/platforms/git/localGetFileAtSHA.js' { + declare module.exports: $Exports<'danger/distribution/platforms/git/localGetFileAtSHA'>; +} +declare module 'danger/distribution/platforms/GitHub.js' { + declare module.exports: $Exports<'danger/distribution/platforms/GitHub'>; +} +declare module 'danger/distribution/platforms/github/GitHubAPI.js' { + declare module.exports: $Exports<'danger/distribution/platforms/github/GitHubAPI'>; +} +declare module 'danger/distribution/platforms/github/GitHubGit.js' { + declare module.exports: $Exports<'danger/distribution/platforms/github/GitHubGit'>; +} +declare module 'danger/distribution/platforms/github/GitHubUtils.js' { + declare module.exports: $Exports<'danger/distribution/platforms/github/GitHubUtils'>; +} +declare module 'danger/distribution/platforms/github/pullRequestParser.js' { + declare module.exports: $Exports<'danger/distribution/platforms/github/pullRequestParser'>; +} +declare module 'danger/distribution/platforms/LocalGit.js' { + declare module.exports: $Exports<'danger/distribution/platforms/LocalGit'>; +} +declare module 'danger/distribution/platforms/platform.js' { + declare module.exports: $Exports<'danger/distribution/platforms/platform'>; +} +declare module 'danger/distribution/runner/danger-dsl-json.js' { + declare module.exports: $Exports<'danger/distribution/runner/danger-dsl-json'>; +} +declare module 'danger/distribution/runner/Dangerfile.js' { + declare module.exports: $Exports<'danger/distribution/runner/Dangerfile'>; +} +declare module 'danger/distribution/runner/DangerUtils.js' { + declare module.exports: $Exports<'danger/distribution/runner/DangerUtils'>; +} +declare module 'danger/distribution/runner/dslGenerator.js' { + declare module.exports: $Exports<'danger/distribution/runner/dslGenerator'>; +} +declare module 'danger/distribution/runner/Executor.js' { + declare module.exports: $Exports<'danger/distribution/runner/Executor'>; +} +declare module 'danger/distribution/runner/json-to-context.js' { + declare module.exports: $Exports<'danger/distribution/runner/json-to-context'>; +} +declare module 'danger/distribution/runner/jsonToDSL.js' { + declare module.exports: $Exports<'danger/distribution/runner/jsonToDSL'>; +} +declare module 'danger/distribution/runner/runners/inline.js' { + declare module.exports: $Exports<'danger/distribution/runner/runners/inline'>; +} +declare module 'danger/distribution/runner/runners/runner.js' { + declare module.exports: $Exports<'danger/distribution/runner/runners/runner'>; +} +declare module 'danger/distribution/runner/runners/utils/cleanDangerfile.js' { + declare module.exports: $Exports<'danger/distribution/runner/runners/utils/cleanDangerfile'>; +} +declare module 'danger/distribution/runner/runners/utils/resultsForCaughtError.js' { + declare module.exports: $Exports<'danger/distribution/runner/runners/utils/resultsForCaughtError'>; +} +declare module 'danger/distribution/runner/runners/utils/transpiler.js' { + declare module.exports: $Exports<'danger/distribution/runner/runners/utils/transpiler'>; +} +declare module 'danger/distribution/runner/runners/vm2.js' { + declare module.exports: $Exports<'danger/distribution/runner/runners/vm2'>; +} +declare module 'danger/distribution/runner/templates/exceptionRaisedTemplate.js' { + declare module.exports: $Exports<'danger/distribution/runner/templates/exceptionRaisedTemplate'>; +} +declare module 'danger/distribution/runner/templates/githubIssueTemplate.js' { + declare module.exports: $Exports<'danger/distribution/runner/templates/githubIssueTemplate'>; +} +declare module 'danger/wallaby.js' { + declare module.exports: $Exports<'danger/wallaby'>; +} diff --git a/package.json b/package.json index e93ed2d9ad..1638d42aec 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,9 @@ "backpack-core": "^0.4.1", "cheerio": "^1.0.0-rc.2", "cross-env": "^5.0.5", + "danger": "^3.1.8", + "danger-plugin-jest": "^1.1.0", + "danger-plugin-yarn": "^1.2.1", "eslint": "^4.15.0", "eslint-plugin-flowtype": "^2.39.1", "eslint-plugin-jest": "^21.6.1", @@ -61,6 +64,7 @@ "cookie-session": "^2.0.0-beta.3", "cors": "^2.8.3", "css.escape": "^1.5.1", + "danger-plugin-no-test-shortcuts": "^2.0.0", "dataloader": "^1.3.0", "debounce": "^1.1.0", "debug": "^2.6.8", @@ -213,7 +217,7 @@ "build:web": "cross-env NODE_PATH=./ react-app-rewired build", "jest": "cross-env NODE_PATH=./ jest", "test": "npm run jest -- --runInBand --watch", - "test:ci": "npm run jest -- --forceExit", + "test:ci": "npm run jest -- --forceExit --outputFile test-results.json --json", "flow": "flow", "db:migrate": "npm run rethinkdb:migrate -- up", "db:drop": "npm run rethinkdb:migrate -- down", diff --git a/yarn.lock b/yarn.lock index 06e95ebc0b..b9102565c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -118,6 +118,17 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" +"@octokit/rest@^14.0.4": + version "14.0.9" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-14.0.9.tgz#d5e0a00dcb78901dd7b2ef852acfc0aea7c479ef" + dependencies: + before-after-hook "^1.1.0" + debug "^3.1.0" + is-array-buffer "^1.0.0" + is-stream "^1.1.0" + lodash "^4.17.4" + url-template "^2.0.8" + "@types/async@2.0.47": version "2.0.47" resolved "https://registry.yarnpkg.com/@types/async/-/async-2.0.47.tgz#f49ba1dd1f189486beb6e1d070a850f6ab4bd521" @@ -134,7 +145,7 @@ version "0.5.3" resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.5.3.tgz#91b728599544efbb7386d8b6633693a3c2e7ade5" -abab@^1.0.3, abab@^1.0.4: +abab@^1.0.0, abab@^1.0.3, abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -155,6 +166,12 @@ acorn-dynamic-import@^2.0.0: dependencies: acorn "^4.0.3" +acorn-globals@^1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" + dependencies: + acorn "^2.1.0" + acorn-globals@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" @@ -173,6 +190,10 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" +acorn@^2.1.0, acorn@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" + acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -483,6 +504,26 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +args@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/args/-/args-2.6.1.tgz#b2590ed4168cd31b62444199bdc5166bb1920c2f" + dependencies: + camelcase "4.1.0" + chalk "1.1.3" + minimist "1.2.0" + pkginfo "0.4.0" + string-similarity "1.1.0" + +args@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/args/-/args-3.0.2.tgz#850bb8e881f3139203a5e4cb176431092b562c2d" + dependencies: + camelcase "4.1.0" + chalk "1.1.3" + minimist "1.2.0" + pkginfo "0.4.0" + string-similarity "1.1.0" + aria-query@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" @@ -642,6 +683,13 @@ async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" +async-to-gen@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-to-gen/-/async-to-gen-1.3.3.tgz#d52c9fb4801f0df44abc4d2de1870b48b60e20bb" + dependencies: + babylon "^6.14.0" + magic-string "^0.19.0" + async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -735,7 +783,7 @@ babel-cli@^6.24.1: optionalDependencies: chokidar "^1.6.1" -babel-code-frame@6.26.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@6.26.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0, babel-code-frame@^6.8.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: @@ -787,6 +835,17 @@ babel-eslint@^8.0.1: eslint-scope "~3.7.1" eslint-visitor-keys "^1.0.0" +babel-generator@6.11.4: + version "6.11.4" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.11.4.tgz#14f6933abb20c62666d27e3b7b9f5b9dc0712a9a" + dependencies: + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.10.2" + detect-indent "^3.0.1" + lodash "^4.2.0" + source-map "^0.5.0" + babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" @@ -947,7 +1006,7 @@ babel-loader@^7.1.0: loader-utils "^1.0.2" mkdirp "^0.5.1" -babel-messages@^6.23.0: +babel-messages@^6.23.0, babel-messages@^6.8.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" dependencies: @@ -1310,7 +1369,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-polyfill@^6.26.0: +babel-polyfill@^6.23.0, babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" dependencies: @@ -1433,7 +1492,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@6.26.0, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@6.26.0, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: @@ -1450,6 +1509,20 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" +babel-traverse@6.12.0: + version "6.12.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.12.0.tgz#f22f54fa0d6eeb7f63585246bab6e637858f5d94" + dependencies: + babel-code-frame "^6.8.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.9.0" + babylon "^6.7.0" + debug "^2.2.0" + globals "^8.3.0" + invariant "^2.2.0" + lodash "^4.2.0" + babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" @@ -1464,7 +1537,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-tr invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.10.2, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0, babel-types@^6.9.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -1473,11 +1546,15 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24 lodash "^4.17.4" to-fast-properties "^1.0.3" +babylon@6.14.1: + version "6.14.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" + babylon@7.0.0-beta.40, babylon@^7.0.0-beta.40: version "7.0.0-beta.40" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.40.tgz#91fc8cd56d5eb98b28e6fde41045f2957779940a" -babylon@^6.17.0, babylon@^6.18.0: +babylon@^6.14.0, babylon@^6.17.0, babylon@^6.18.0, babylon@^6.7.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -1538,6 +1615,10 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +basic-auth@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" + batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -1548,6 +1629,10 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +before-after-hook@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.1.0.tgz#83165e15a59460d13702cb8febd6a1807896db5a" + bfj-node4@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/bfj-node4/-/bfj-node4-5.2.1.tgz#3a6aa2730cf6911ba2afb836c2f88f015d718f3f" @@ -1577,6 +1662,10 @@ block-stream@*: dependencies: inherits "~2.0.0" +bluebird@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + "bluebird@>= 2.3.2 < 3", bluebird@^2.10.2: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" @@ -1637,7 +1726,19 @@ boom@5.x.x: dependencies: hoek "4.x.x" -boxen@^1.2.1: +boxen@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^1.1.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^0.1.0" + widest-line "^1.0.0" + +boxen@^1.0.0, boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" dependencies: @@ -1834,6 +1935,10 @@ bytebuffer@~5: dependencies: long "~3" +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -1880,6 +1985,10 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" +camelcase@4.1.0, camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -1892,10 +2001,6 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" -camelcase@^4.0.0, camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - caniuse-api@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" @@ -1983,7 +2088,19 @@ check-types@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.3.0.tgz#468f571a4435c24248f5fd0cb0e8d87c3c341e7d" -cheerio@^0.22.0: +cheerio@0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "~3.8.1" + lodash "^4.1.0" + optionalDependencies: + jsdom "^7.0.2" + +cheerio@0.22.0, cheerio@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" dependencies: @@ -2127,6 +2244,18 @@ clipboard@^1.6.1, clipboard@^1.7.1: select "^1.1.2" tiny-emitter "^2.0.0" +clipboardy@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.1.1.tgz#75b5a7ac50d83c98025fb6303298c6a9007c16c7" + dependencies: + execa "^0.6.0" + +clipboardy@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.1.4.tgz#51b17574fc682588e2dd295cfa6e6aa109eab5ee" + dependencies: + execa "^0.6.0" + cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -2186,6 +2315,10 @@ color-convert@^1.3.0, color-convert@^1.9.0: dependencies: color-name "^1.1.1" +color-logger@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018" + 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" @@ -2250,7 +2383,7 @@ compressible@~2.0.13: dependencies: mime-db ">= 1.33.0 < 2" -compression@^1.5.2: +compression@^1.5.2, compression@^1.6.2: version "1.7.2" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" dependencies: @@ -2469,6 +2602,13 @@ cross-env@^5.0.5: cross-spawn "^5.1.0" is-windows "^1.0.0" +cross-spawn-async@^2.1.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" + dependencies: + lru-cache "^4.0.0" + which "^1.2.8" + cross-spawn@5.1.0, 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" @@ -2621,11 +2761,11 @@ csso@~2.3.1: clap "^1.0.9" source-map "^0.5.3" -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "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": +"cssstyle@>= 0.2.29 < 0.3.0", "cssstyle@>= 0.2.37 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" dependencies: @@ -2653,6 +2793,68 @@ damerau-levenshtein@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" +danger-plugin-jest@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/danger-plugin-jest/-/danger-plugin-jest-1.1.0.tgz#9b53e14a0483e6de5a65f8d58fbb6a8121a948d4" + dependencies: + strip-ansi "^4.0.0" + optionalDependencies: + serve "^5.1.5" + +danger-plugin-no-test-shortcuts@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/danger-plugin-no-test-shortcuts/-/danger-plugin-no-test-shortcuts-2.0.0.tgz#02dbb72455819454d36cd5952e2ff0f47df810da" + dependencies: + lodash "^4.17.4" + +danger-plugin-yarn@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/danger-plugin-yarn/-/danger-plugin-yarn-1.2.1.tgz#e161d898ab3ddd5a80695c38471205476af9da81" + dependencies: + date-fns "^1.28.5" + lodash.flatten "^4.4.0" + lodash.includes "^4.3.0" + node-fetch "^1.7.1" + semver "^5.4.1" + optionalDependencies: + esdoc "^0.5.2" + +danger@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/danger/-/danger-3.1.8.tgz#dd7cdb2e155bb02d9413bcce936b9aae64977029" + dependencies: + "@octokit/rest" "^14.0.4" + babel-polyfill "^6.23.0" + chalk "^2.3.0" + commander "^2.13.0" + debug "^3.1.0" + get-stdin "^5.0.1" + hyperlinker "^1.0.0" + jsome "^2.3.25" + json5 "^0.5.1" + jsonpointer "^4.0.1" + lodash.find "^4.6.0" + lodash.includes "^4.3.0" + lodash.isobject "^3.0.2" + lodash.keys "^4.0.8" + node-cleanup "^2.1.2" + node-fetch "^1.7.3" + parse-diff "^0.4.0" + parse-git-config "^1.1.1" + parse-github-url "^1.0.2" + parse-link-header "^1.0.1" + pinpoint "^1.1.0" + readline-sync "^1.4.7" + require-from-string "^2.0.1" + rfc6902 "^2.2.2" + supports-hyperlinks "^1.0.1" + vm2 patriksimek/vm2#custom_files + voca "^1.4.0" + +dargs@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -2663,7 +2865,7 @@ dataloader@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" -date-fns@^1.27.2: +date-fns@^1.27.2, date-fns@^1.28.5: version "1.29.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" @@ -2679,6 +2881,12 @@ debug@0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.0.tgz#f5be05ec0434c992d79940e50b2695cfb2e01b08" +debug@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + debug@2.6.9, debug@^2.2.0, debug@^2.3.2, debug@^2.3.3, debug@^2.5.2, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2810,7 +3018,7 @@ 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.0, depd@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -2829,6 +3037,14 @@ destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" +detect-indent@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -2854,6 +3070,13 @@ detect-port-alt@1.1.5: address "^1.0.1" debug "^2.6.0" +detect-port@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.2.1.tgz#a2c0a048aa9df2b703fc54bb4436ce2118f09b5a" + dependencies: + address "^1.0.1" + debug "^2.6.0" + diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -2951,6 +3174,12 @@ domhandler@2.1: dependencies: domelementtype "1" +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + dependencies: + domelementtype "1" + domhandler@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" @@ -2963,7 +3192,7 @@ domutils@1.1: dependencies: domelementtype "1" -domutils@1.5.1: +domutils@1.5, domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" dependencies: @@ -3218,6 +3447,10 @@ enhanced-resolve@^3.4.0: object-assign "^4.0.1" tapable "^0.2.7" +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -3327,7 +3560,7 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.1" es6-symbol "^3.1.1" -escape-html@~1.0.3: +escape-html@1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -3355,6 +3588,22 @@ escope@^3.6.0: esrecurse "^4.1.0" estraverse "^4.1.1" +esdoc@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/esdoc/-/esdoc-0.5.2.tgz#cbfd0b20e3d1cacc23c93c328eed987e21ba0067" + dependencies: + babel-generator "6.11.4" + babel-traverse "6.12.0" + babylon "6.14.1" + cheerio "0.22.0" + color-logger "0.0.3" + escape-html "1.0.3" + fs-extra "1.0.0" + ice-cap "0.0.4" + marked "0.3.6" + minimist "1.2.0" + taffydb "2.7.2" + eslint-config-react-app@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-2.1.0.tgz#23c909f71cbaff76b945b831d2d814b8bde169eb" @@ -3586,7 +3835,7 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -etag@~1.8.1: +etag@~1.8.0, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" @@ -3640,6 +3889,29 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" +execa@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" + dependencies: + cross-spawn-async "^2.1.1" + is-stream "^1.1.0" + npm-run-path "^1.0.0" + object-assign "^4.0.1" + path-key "^1.0.0" + strip-eof "^1.0.0" + +execa@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" + 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@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -3959,6 +4231,10 @@ fileset@^2.0.2: glob "^7.0.3" minimatch "^3.0.3" +filesize@3.5.10: + version "3.5.10" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f" + filesize@3.5.11: version "3.5.11" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee" @@ -4130,6 +4406,10 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -4146,6 +4426,18 @@ from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +fs-extra@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + fs-extra@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" @@ -4242,10 +4534,18 @@ get-document@1: version "1.0.0" resolved "https://registry.yarnpkg.com/get-document/-/get-document-1.0.0.tgz#4821bce66f1c24cb0331602be6cb6b12c4f01c4b" +get-port@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.1.0.tgz#ef01b18a84ca6486970ff99e54446141a73ffd3e" + 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" @@ -4266,6 +4566,14 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +git-config-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-1.0.1.tgz#6d33f7ed63db0d0e118131503bab3aca47d54664" + dependencies: + extend-shallow "^2.0.1" + fs-exists-sync "^0.1.0" + homedir-polyfill "^1.0.0" + github@0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/github/-/github-0.2.4.tgz#24fa7f0e13fa11b946af91134c51982a91ce538b" @@ -4338,6 +4646,10 @@ globals@^11.0.1, globals@^11.1.0: version "11.3.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" +globals@^8.3.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-8.18.0.tgz#93d4a62bdcac38cfafafc47d6b034768cb0ffcb4" + globals@^9.17.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -4525,6 +4837,16 @@ 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.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + handlebars@^4.0.3: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" @@ -4713,7 +5035,7 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.1: +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" dependencies: @@ -4794,11 +5116,21 @@ htmlparser2@~3.3.0: domutils "1.1" readable-stream "1.0" +htmlparser2@~3.8.1: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + 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: +http-errors@1.6.2, http-errors@~1.6.1, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" dependencies: @@ -4860,6 +5192,21 @@ https-proxy-agent@^2.1.0: agent-base "^4.1.0" debug "^3.1.0" +hyperlinker@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" + +ice-cap@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" + dependencies: + cheerio "0.20.0" + color-logger "0.0.3" + +iconv-lite@0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + 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" @@ -5051,7 +5398,7 @@ ioredis@^3.1.4: redis-commands "^1.2.0" redis-parser "^2.4.0" -ip@^1.1.0, ip@^1.1.5: +ip@1.1.5, ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -5075,10 +5422,18 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-1.0.0.tgz#f32497a0509d109423f472003f98bab6a8ea34cb" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" +is-async-supported@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-async-supported/-/is-async-supported-1.2.0.tgz#20d58ac4d6707eb1cb3712dd38480c0536f27c07" + 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" @@ -5405,7 +5760,7 @@ isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" -isstream@~0.1.2: +isstream@0.1.2, isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -6247,6 +6602,26 @@ jsdom@^11.5.1: ws "^4.0.0" xml-name-validator "^3.0.0" +jsdom@^7.0.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" + dependencies: + abab "^1.0.0" + acorn "^2.4.0" + acorn-globals "^1.0.4" + cssom ">= 0.3.0 < 0.4.0" + cssstyle ">= 0.2.29 < 0.3.0" + escodegen "^1.6.1" + nwmatcher ">= 1.3.7 < 2.0.0" + parse5 "^1.5.1" + request "^2.55.0" + sax "^1.1.4" + symbol-tree ">= 3.1.0 < 4.0.0" + tough-cookie "^2.2.0" + webidl-conversions "^2.0.0" + whatwg-url-compat "~0.6.5" + xml-name-validator ">= 2.0.1 < 3.0.0" + jsdom@^9.12.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" @@ -6283,6 +6658,14 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" +jsome@^2.3.25: + version "2.5.0" + resolved "https://registry.yarnpkg.com/jsome/-/jsome-2.5.0.tgz#5e417eef4341ffeb83ee8bfa9265b36d56fe49ed" + dependencies: + chalk "^2.3.0" + json-stringify-safe "^5.0.1" + yargs "^11.0.0" + json-loader@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" @@ -6313,7 +6696,7 @@ json-stringify-pretty-compact@^1.0.4: version "1.1.0" resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-1.1.0.tgz#4fa5b898f61a287d64828691baa822a41f3ad5ab" -json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1, 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" @@ -6347,6 +6730,10 @@ jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" +jsonpointer@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + jsonwebtoken@^8.0.1: version "8.2.0" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.2.0.tgz#690ec3a9e7e95e2884347ce3e9eb9d389aa598b3" @@ -6452,6 +6839,10 @@ lazy-cache@^2.0.2: dependencies: set-getter "^0.1.0" +lazy-req@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -6650,6 +7041,10 @@ lodash.filter@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" +lodash.find@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + lodash.flatten@^4.2.0, lodash.flatten@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" @@ -6698,7 +7093,7 @@ lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" -lodash.keys@^4.2.0: +lodash.keys@^4.0.8, lodash.keys@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" @@ -6775,7 +7170,7 @@ lodash.values@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" -"lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1: +"lodash@>=3.5 <5", lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" @@ -6825,6 +7220,13 @@ lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" +lru-cache@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -6836,6 +7238,12 @@ macaddress@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" +magic-string@^0.19.0: + version "0.19.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.19.1.tgz#14d768013caf2ec8fdea16a49af82fc377e75201" + dependencies: + vlq "^0.2.1" + make-dir@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" @@ -6866,6 +7274,10 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +marked@0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + "match-stream@>= 0.0.2 < 1": version "0.0.2" resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" @@ -6946,6 +7358,31 @@ methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" +micro-compress@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micro-compress/-/micro-compress-1.0.0.tgz#53f5a80b4ad0320ca165a559b6e3df145d4f704f" + dependencies: + compression "^1.6.2" + +micro@7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/micro/-/micro-7.3.3.tgz#8261c56d2a31a7df93986eff86441396f2b4b070" + dependencies: + args "2.6.1" + async-to-gen "1.3.3" + bluebird "3.5.0" + boxen "1.1.0" + chalk "1.1.3" + clipboardy "1.1.1" + get-port "3.1.0" + ip "1.1.5" + is-async-supported "1.2.0" + isstream "0.1.2" + media-typer "0.3.0" + node-version "1.0.0" + raw-body "2.2.0" + update-notifier "2.1.0" + micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" @@ -6993,12 +7430,26 @@ miller-rabin@^4.0.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@2.1.15: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: mime-db "~1.33.0" +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -7049,7 +7500,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: +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" @@ -7162,11 +7613,15 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-cleanup@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-cleanup/-/node-cleanup-2.1.2.tgz#7ac19abd297e09a7f72a71545d951b517e4dde2c" + node-env-file@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/node-env-file/-/node-env-file-0.1.8.tgz#fccb7b050f735b5a33da9eb937cf6f1ab457fb69" -node-fetch@^1.0.1, node-fetch@^1.6.1: +node-fetch@^1.0.1, node-fetch@^1.6.1, node-fetch@^1.7.1, node-fetch@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" dependencies: @@ -7234,6 +7689,10 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" +node-version@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.0.0.tgz#1b9b9584a9a7f7a6123f215cd14a652bf21ab19e" + nodemon@^1.11.0: version "1.17.1" resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.17.1.tgz#cdb4bc53d7a86d6162143a1a44d7adf927d8652f" @@ -7300,6 +7759,12 @@ npm-path@^2.0.2: dependencies: which "^1.2.10" +npm-run-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" + dependencies: + path-key "^1.0.0" + 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" @@ -7337,7 +7802,7 @@ 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.3.9 < 2.0.0", nwmatcher@^1.4.3: +"nwmatcher@>= 1.3.7 < 2.0.0", "nwmatcher@>= 1.3.9 < 2.0.0", nwmatcher@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" @@ -7443,6 +7908,12 @@ opener@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" +opn@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + dependencies: + is-wsl "^1.1.0" + opn@5.2.0, opn@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" @@ -7607,6 +8078,23 @@ parse-asn1@^5.0.0: evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" +parse-diff@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/parse-diff/-/parse-diff-0.4.2.tgz#b173390e916564e8c70ccd37756047941e5b3ef2" + +parse-git-config@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-1.1.1.tgz#d3a9984317132f57398712bba438e129590ddf8c" + dependencies: + extend-shallow "^2.0.1" + fs-exists-sync "^0.1.0" + git-config-path "^1.0.1" + ini "^1.3.4" + +parse-github-url@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -7622,6 +8110,12 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-link-header@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-link-header/-/parse-link-header-1.0.1.tgz#bedfe0d2118aeb84be75e7b025419ec8a61140a7" + dependencies: + xtend "~4.0.1" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -7727,6 +8221,10 @@ 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@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" + path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -7745,6 +8243,12 @@ path-to-regexp@^1.0.1, path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-type@2.0.0, path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -7753,12 +8257,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - dependencies: - pify "^2.0.0" - pause-stream@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" @@ -7813,6 +8311,10 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pinpoint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pinpoint/-/pinpoint-1.1.0.tgz#0cf7757a6977f1bf7f6a32207b709e377388e874" + pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" @@ -7825,6 +8327,10 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" +pkginfo@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.0.tgz#349dbb7ffd38081fcadc0853df687f0c7744cd65" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" @@ -8423,6 +8929,14 @@ raven@^2.0.2: timed-out "4.0.1" uuid "3.0.0" +raw-body@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" + unpipe "1.0.0" + raw-body@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" @@ -8719,6 +9233,15 @@ readable-stream@1.0, readable-stream@~1.0.0, readable-stream@~1.0.31: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3: version "2.3.5" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" @@ -8740,6 +9263,10 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" +readline-sync@^1.4.7: + version "1.4.9" + resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.9.tgz#3eda8e65f23cd2a17e61301b1f0003396af5ecda" + realpath-native@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" @@ -8911,6 +9438,12 @@ repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" +repeating@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -8958,6 +9491,33 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" +request@^2.55.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + 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.74.0, request@^2.79.0, request@^2.83.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" @@ -8993,6 +9553,10 @@ require-from-string@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" +require-from-string@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff" + 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" @@ -9093,6 +9657,10 @@ rethinkdbdash@^2.3.29, rethinkdbdash@^2.3.31: dependencies: bluebird ">= 3.0.1" +rfc6902@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/rfc6902/-/rfc6902-2.2.2.tgz#518a4e9caac1688f3d94c9df2fdcdb6ce21f29be" + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -9200,7 +9768,7 @@ sax@0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/sax/-/sax-0.4.2.tgz#39f3b601733d6bec97105b242a2a40fd6978ac3c" -sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: +sax@^1.1.4, 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" @@ -9247,6 +9815,24 @@ semver-diff@^2.0.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +send@0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" + dependencies: + debug "2.6.7" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" @@ -9290,6 +9876,31 @@ serve-static@1.13.1: parseurl "~1.3.2" send "0.16.1" +serve@^5.1.5: + version "5.2.4" + resolved "https://registry.yarnpkg.com/serve/-/serve-5.2.4.tgz#4742c05f65a2330f788cdde901cd7a09b23a99f6" + dependencies: + args "3.0.2" + basic-auth "1.1.0" + bluebird "3.5.0" + boxen "1.1.0" + chalk "1.1.3" + clipboardy "1.1.4" + dargs "5.1.0" + detect-port "1.2.1" + filesize "3.5.10" + fs-extra "3.0.1" + handlebars "4.0.10" + ip "1.1.5" + micro "7.3.3" + micro-compress "1.0.0" + mime-types "2.1.15" + node-version "1.0.0" + opn "5.1.0" + path-type "2.0.0" + send "0.15.3" + update-notifier "2.2.0" + serviceworker-cache-polyfill@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz#de19ee73bef21ab3c0740a37b33db62464babdeb" @@ -9718,6 +10329,12 @@ string-replace-to-array@^1.0.3: lodash.flatten "^4.2.0" lodash.isstring "^4.0.1" +string-similarity@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-1.1.0.tgz#3c66498858a465ec7c40c7d81739bbd995904914" + dependencies: + lodash "^4.13.1" + 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" @@ -9867,12 +10484,19 @@ supports-color@^4.2.1: dependencies: has-flag "^2.0.0" -supports-color@^5.2.0, supports-color@^5.3.0: +supports-color@^5.0.0, supports-color@^5.2.0, supports-color@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" dependencies: has-flag "^3.0.0" +supports-hyperlinks@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" + dependencies: + has-flag "^2.0.0" + supports-color "^5.0.0" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -9923,7 +10547,7 @@ symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" -symbol-tree@^3.2.1, symbol-tree@^3.2.2: +"symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.1, symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -9953,6 +10577,10 @@ table@^4.0.1, table@^4.0.2: slice-ansi "1.0.0" string-width "^2.1.1" +taffydb@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" + tapable@^0.2.7: version "0.2.8" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" @@ -9978,6 +10606,12 @@ tar@^2.2.1: fstream "^1.0.2" inherits "2" +term-size@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" + dependencies: + execa "^0.4.0" + term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" @@ -10110,7 +10744,7 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" -tough-cookie@>=2.3.3, tough-cookie@^2.3.2, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@>=2.3.3, tough-cookie@^2.2.0, tough-cookie@^2.3.2, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: @@ -10122,7 +10756,7 @@ tr46@^1.0.0: dependencies: punycode "^2.1.0" -tr46@~0.0.3: +tr46@~0.0.1, tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -10304,6 +10938,32 @@ upath@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d" +update-notifier@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" + dependencies: + boxen "^1.0.0" + chalk "^1.0.0" + configstore "^3.0.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + lazy-req "^2.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +update-notifier@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.2.0.tgz#1b5837cf90c0736d88627732b661c138f86de72f" + dependencies: + boxen "^1.0.0" + chalk "^1.0.0" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + update-notifier@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" @@ -10358,6 +11018,10 @@ url-parse@^1.1.8: querystringify "~1.0.0" requires-port "~1.0.0" +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" @@ -10463,12 +11127,24 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vlq@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + 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" +vm2@patriksimek/vm2#custom_files: + version "3.5.0" + resolved "https://codeload.github.com/patriksimek/vm2/tar.gz/7e82f90ac705fc44fad044147cb0df09b4c79a57" + +voca@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/voca/-/voca-1.4.0.tgz#e15ac58b38290b72acc0c330366b6cc7984924d7" + w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" @@ -10522,6 +11198,10 @@ web-push@^3.2.2: minimist "^1.2.0" urlsafe-base64 "^1.0.0" +webidl-conversions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10686,6 +11366,12 @@ whatwg-fetch@2.0.3, 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-compat@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf" + dependencies: + tr46 "~0.0.1" + whatwg-url@^4.3.0: version "4.8.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" @@ -10719,7 +11405,7 @@ which@1.2.x: dependencies: isexe "^2.0.0" -which@^1.2.10, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: +which@^1.2.10, which@^1.2.12, which@^1.2.14, which@^1.2.8, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: @@ -10731,6 +11417,12 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2" +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" + widest-line@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" @@ -10832,7 +11524,7 @@ xml-char-classes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" -xml-name-validator@^2.0.1: +"xml-name-validator@>= 2.0.1 < 3.0.0", 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" From cd12eee9935a5cf41cf6f49ab7eee619b408ddaf Mon Sep 17 00:00:00 2001 From: Maximilian Stoiber Date: Tue, 13 Mar 2018 15:25:33 +0100 Subject: [PATCH 10/14] Fix noTestShortcuts --- dangerfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dangerfile.js b/dangerfile.js index 239e73f667..616f6b5afd 100644 --- a/dangerfile.js +++ b/dangerfile.js @@ -62,5 +62,5 @@ jest(); // Make sure nobody does a it.only and blocks our entire test-suite from running noTestShortcuts({ - predicate: filePath => filePath.endsWith('.test.js'), + testFilePredicate: filePath => filePath.endsWith('.test.js'), }); From 0ea3b9b741a5e5676f96b48c158a2930fc7e495e Mon Sep 17 00:00:00 2001 From: Maximilian Stoiber Date: Tue, 13 Mar 2018 15:51:27 +0100 Subject: [PATCH 11/14] Fix checkbox detection --- dangerfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dangerfile.js b/dangerfile.js index 616f6b5afd..7b60d69edb 100644 --- a/dangerfile.js +++ b/dangerfile.js @@ -17,7 +17,7 @@ const APP_FOLDERS = [ 'src', 'vulcan', ]; -const CHECKBOXES = /^- \[[x]] *(.*)?$/gim; +const CHECKBOXES = /^- \[x\] *(.*)?$/gim; const possibleAutoLabels = { wip: 'WIP: Building', 'needs testing': 'WIP: Needs Testing', From cf7c4cc60c493c6cc38f03645bb1d2a4f8271195 Mon Sep 17 00:00:00 2001 From: Maximilian Stoiber Date: Tue, 13 Mar 2018 15:52:33 +0100 Subject: [PATCH 12/14] Update PR template with labels checkboxes --- .github/PULL_REQUEST_TEMPLATE.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6f21bd9133..d52ae19134 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -13,3 +13,13 @@ YES ## Release notes - + From b01528fc5a38f5df0302a9aa024a7571ada0ee0b Mon Sep 17 00:00:00 2001 From: Maximilian Stoiber Date: Tue, 13 Mar 2018 16:40:17 +0100 Subject: [PATCH 13/14] Fix message bubbles Oopsies --- src/components/message/style.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/message/style.js b/src/components/message/style.js index f6a93e7c75..150f12dce1 100644 --- a/src/components/message/style.js +++ b/src/components/message/style.js @@ -309,7 +309,7 @@ export const Line = styled.pre` export const Paragraph = styled.p` line-height: 1.5; - & ~ & { + &:not(:empty) ~ &:not(:empty) { margin-top: 1em; } `; From e84e5f914b674dc2412961f7481cc1b5c976c7b5 Mon Sep 17 00:00:00 2001 From: Maximilian Stoiber Date: Tue, 13 Mar 2018 17:07:28 +0100 Subject: [PATCH 14/14] 2.1.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1f0b0d47f2..c4c1555a00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Spectrum", - "version": "2.1.5", + "version": "2.1.6", "private": true, "devDependencies": { "babel-cli": "^6.24.1",