From 03ad4202b861742f34e251fd64d81af504b88a6e Mon Sep 17 00:00:00 2001 From: Kata Date: Fri, 22 Mar 2019 07:01:08 -0500 Subject: [PATCH] DiscordService: swap to eris and refactor the entire service while we're at it. --- .babelrc | 1 + api/auth.js | 4 +- bot/index.js | 13 + flow-typed/eris.js | 2229 ++++++++++++++++++++++++++++++++++++++ package.json | 19 +- rpc/_autoloader.js | 7 +- rpc/_security.js | 42 + rpc/index.js | 12 + rpc/servers.js | 10 +- services/discord.js | 462 ++++---- services/presentation.js | 21 +- services/server.js | 2 +- ui/.babelrc | 3 +- yarn.lock | 1660 ++++++++++++++++++++++++++-- 14 files changed, 4075 insertions(+), 410 deletions(-) create mode 100644 bot/index.js create mode 100644 flow-typed/eris.js create mode 100644 rpc/_security.js diff --git a/.babelrc b/.babelrc index 1d42ce1..fe644e2 100644 --- a/.babelrc +++ b/.babelrc @@ -7,6 +7,7 @@ "plugins": [ "@babel/plugin-syntax-dynamic-import", "@babel/plugin-proposal-class-properties", + "@babel/plugin-proposal-optional-chaining", ["@babel/plugin-transform-runtime", { "helpers": false }] ], diff --git a/api/auth.js b/api/auth.js index 8f28cad..02deca7 100644 --- a/api/auth.js +++ b/api/auth.js @@ -19,7 +19,7 @@ export default (R: Router, $: AppContext) => { console.log(ctx.session.expiresAt >= new Date(), ctx.session.expiresAt, new Date()) if (ctx.session.accessToken === undefined || ctx.session.expiresAt >= new Date()) { - const data = await $.discord.getAuthToken(token) + const data = await $.discord.initializeOAuth(token) ctx.session.accessToken = data.access_token ctx.session.refreshToken = data.refresh_token ctx.session.expiresAt = new Date() + ctx.expires_in @@ -105,7 +105,7 @@ export default (R: Router, $: AppContext) => { } try { - const tokens = await $.discord.getAuthToken(code) + const tokens = await $.discord.initializeOAuth(code) const user = await $.discord.getUserFromToken(tokens.access_token) $.auth.injectSessionFromOAuth(ctx, tokens, user.id) return ctx.redirect(r || '/') diff --git a/bot/index.js b/bot/index.js new file mode 100644 index 0000000..fb6a35e --- /dev/null +++ b/bot/index.js @@ -0,0 +1,13 @@ +// @flow +import type DiscordService from '../services/discord' +import logger from '../logger' +const log = logger(__filename) + +export default class Bot { + svc: DiscordService + log: typeof log + constructor (DS: DiscordService) { + this.svc = DS + this.log = log + } +} diff --git a/flow-typed/eris.js b/flow-typed/eris.js new file mode 100644 index 0000000..8bac3a3 --- /dev/null +++ b/flow-typed/eris.js @@ -0,0 +1,2229 @@ +// @flow +/** + * Flowtype definitions for eris + * Generated by Flowgen from a Typescript Definition + * Flowgen v1.8.0 + * Author: [Katalina T.](http://twitter.com/kayteh) + * Repo: http://github.com/kayteh/roleypoly + */ + +declare module 'eris' { + import type EventEmitter from 'events' + + import type { Readable as ReadableStream } from 'stream' + + declare interface JSONCache { + [s: string]: any; + } + declare interface SimpleJSON { + toJSON(simple?: boolean): JSONCache; + } + declare interface NestedJSON { + toJSON(arg?: any, cache?: Array): JSONCache; + } + declare type TextableChannel = TextChannel | PrivateChannel | GroupChannel; + declare type AnyChannel = + | TextChannel + | VoiceChannel + | CategoryChannel + | PrivateChannel + | GroupChannel; + declare type AnyGuildChannel = TextChannel | VoiceChannel | CategoryChannel; + declare interface CreateInviteOptions { + maxAge?: number; + maxUses?: number; + temporary?: boolean; + } + declare interface Invitable { + getInvites(): Promise; + createInvite( + options?: CreateInviteOptions, + reason?: string + ): Promise; + } + declare interface Textable { + lastMessageID: string; + messages: Collection; + sendTyping(): Promise; + getMessage(messageID: string): Promise; + getMessages( + limit?: number, + before?: string, + after?: string, + around?: string + ): Promise; + getPins(): Promise; + createMessage( + content: MessageContent, + file?: MessageFile + ): Promise; + editMessage(messageID: string, content: MessageContent): Promise; + pinMessage(messageID: string): Promise; + unpinMessage(messageID: string): Promise; + getMessageReaction( + messageID: string, + reaction: string, + limit?: number, + before?: string, + after?: string + ): Promise; + addMessageReaction( + messageID: string, + reaction: string, + userID?: string + ): Promise; + removeMessageReaction( + messageID: string, + reaction: string, + userID?: string + ): Promise; + removeMessageReactions(messageID: string): Promise; + deleteMessage(messageID: string, reason?: string): Promise; + unsendMessage(messageID: string): Promise; + } + declare interface OldCall { + participants: string[]; + endedTimestamp?: number; + ringing: string[]; + region: string; + unavailable: boolean; + } + declare interface OldChannel { + name: string; + position: string; + topic?: string; + bitrate?: number; + permissionOverwrites: Collection; + } + declare type FriendSuggestionReasons = Array<{ + type: number, + platform_type: string, + name: string + }>; + declare interface MemberPartial { + id: string; + user: User; + } + declare interface OldPresence { + status: string; + game?: { + name: string, + type: number, + url?: string + }; + } + declare interface OldVoiceState { + mute: boolean; + deaf: boolean; + selfMute: boolean; + selfDeaf: boolean; + } + declare interface Emittable { + on(event: string, listener: Function): *; + on(event: "ready" | "disconnect", listener: () => void): *; + on( + event: "callCreate" | "callRing" | "callDelete", + listener: (call: Call) => void + ): *; + on( + event: "callUpdate", + listener: (call: Call, oldCall: OldCall) => void + ): *; + on( + event: "channelCreate" | "channelDelete", + listener: (channel: AnyChannel) => void + ): *; + on( + event: "channelPinUpdate", + listener: ( + channel: TextableChannel, + timestamp: number, + oldTimestamp: number + ) => void + ): *; + on( + event: "channelRecipientAdd" | "channelRecipientRemove", + listener: (channel: GroupChannel, user: User) => void + ): *; + on( + event: "channelUpdate", + listener: (channel: AnyChannel, oldChannel: OldChannel) => void + ): *; + on( + event: "friendSuggestionCreate", + listener: (user: User, reasons: FriendSuggestionReasons) => void + ): *; + on(event: "friendSuggestionDelete", listener: (user: User) => void): *; + on( + event: "guildAvailable" | "guildBanAdd" | "guildBanRemove", + listener: (guild: Guild, user: User) => void + ): *; + on( + event: "guildDelete" | "guildUnavailable" | "guildCreate", + listener: (guild: Guild) => void + ): *; + on( + event: "guildEmojisUpdate", + listener: (guild: Guild, emojis: Emoji[], oldEmojis: Emoji[]) => void + ): *; + on( + event: "guildMemberAdd", + listener: (guild: Guild, member: Member) => void + ): *; + on( + event: "guildMemberChunk", + listener: (guild: Guild, members: Member[]) => void + ): *; + on( + event: "guildMemberRemove", + listener: (guild: Guild, member: Member | MemberPartial) => void + ): *; + on( + event: "guildMemberUpdate", + listener: ( + guild: Guild, + member: Member, + oldMember: { + roles: string[], + nick?: string + } + ) => void + ): *; + on( + event: "guildRoleCreate" | "guildRoleDelete", + listener: (guild: Guild, role: Role) => void + ): *; + on( + event: "guildRoleUpdate", + listener: (guild: Guild, role: Role, oldRole: RoleOptions) => void + ): *; + on( + event: "guildUpdate", + listener: (guild: Guild, oldGuild: GuildOptions) => void + ): *; + on(event: "hello", listener: (trace: string[], id: number) => void): *; + on(event: "messageCreate", listener: (message: Message) => void): *; + on( + event: "messageDelete" | "messageReactionRemoveAll", + listener: (message: PossiblyUncachedMessage) => void + ): *; + on( + event: "messageDeleteBulk", + listener: (messages: PossiblyUncachedMessage[]) => void + ): *; + on( + event: "messageReactionAdd" | "messageReactionRemove", + listener: ( + message: PossiblyUncachedMessage, + emoji: Emoji, + userID: string + ) => void + ): *; + on( + event: "messageUpdate", + listener: ( + message: Message, + oldMessage?: { + attachments: Attachment[], + embeds: Embed[], + content: string, + editedTimestamp?: number, + mentionedBy?: any, + tts: boolean, + mentions: string[], + roleMentions: string[], + channelMentions: string[] + } + ) => void + ): *; + on( + event: "presenceUpdate", + listener: ( + other: Member | Relationship, + oldPresence?: OldPresence + ) => void + ): *; + on( + event: "rawWS" | "unknown", + listener: (packet: RawPacket, id: number) => void + ): *; + on( + event: "relationshipAdd" | "relationshipRemove", + listener: (relationship: Relationship) => void + ): *; + on( + event: "relationshipUpdate", + listener: ( + relationship: Relationship, + oldRelationship: { + type: number + } + ) => void + ): *; + on( + event: "shardPreReady" | "connect", + listener: (id: number) => void + ): *; + on( + event: "typingStart", + listener: (channel: TextableChannel, user: User) => void + ): *; + on( + event: "unavailableGuildCreate", + listener: (guild: UnavailableGuild) => void + ): *; + on( + event: "userUpdate", + listener: ( + user: User, + oldUser: { + username: string, + discriminator: string, + avatar?: string + } + ) => void + ): *; + on( + event: "voiceChannelJoin", + listener: (member: Member, newChannel: VoiceChannel) => void + ): *; + on( + event: "voiceChannelLeave", + listener: (member: Member, oldChannel: VoiceChannel) => void + ): *; + on( + event: "voiceChannelSwitch", + listener: ( + member: Member, + newChannel: VoiceChannel, + oldChannel: VoiceChannel + ) => void + ): *; + on( + event: "voiceStateUpdate", + listener: (member: Member, oldState: OldVoiceState) => void + ): *; + on( + event: "warn" | "debug", + listener: (message: string, id: number) => void + ): *; + } + declare interface IConstants { + DefaultAvatarHashes: string[]; + ImageFormats: string[]; + GatewayOPCodes: { + [key: string]: number + }; + GATEWAY_VERSION: number; + Permissions: { + [key: string]: number + }; + VoiceOPCodes: { + [key: string]: number + }; + SystemJoinMessages: string[]; + AuditLogActions: { + [key: string]: number + }; + } + declare export var Constants: IConstants; + declare interface WebhookPayload { + content?: string; + file?: + | { + file: Buffer, + name: string + } + | Array<{ + file: Buffer, + name: string + }>; + embeds?: EmbedOptions[]; + username?: string; + avatarURL?: string; + tts?: boolean; + wait?: boolean; + disableEveryone?: boolean; + } + declare interface EmbedBase { + title?: string; + description?: string; + url?: string; + timestamp?: string; + color?: number; + footer?: { + text: string, + icon_url?: string, + proxy_icon_url?: string + }; + image?: { + url?: string, + proxy_url?: string, + height?: number, + width?: number + }; + thumbnail?: { + url?: string, + proxy_url?: string, + height?: number, + width?: number + }; + video?: { + url: string, + height?: number, + width?: number + }; + provider?: { + name: string, + url?: string + }; + fields?: Array<{ + name?: string, + value?: string, + inline?: boolean + }>; + author?: { + name: string, + url?: string, + icon_url?: string, + proxy_icon_url?: string + }; + } + declare type Embed = { + type: string + } & EmbedBase; + declare type EmbedOptions = { + type?: string + } & EmbedBase; + declare interface Webhook { + name: string; + channel_id: string; + token: string; + avatar?: string; + guild_id: string; + id: string; + user: { + username: string, + discriminator: string, + id: string, + avatar?: string + }; + } + declare interface GuildEmbed { + channel_id?: string; + enabled: boolean; + } + declare interface Attachment { + url: string; + proxy_url: string; + size: number; + id: string; + filename: string; + } + declare interface VoiceRegion { + name: string; + deprecated: boolean; + custom: boolean; + vip: boolean; + optimal: boolean; + id: string; + } + declare interface UserSettings { + theme: string; + status: string; + show_current_game: boolean; + restricted_guilds: string[]; + render_reactions: boolean; + render_embeds: boolean; + message_display_compact: boolean; + locale: string; + inline_embed_media: boolean; + inline_attachment_media: boolean; + guild_positions: string[]; + friend_source_flags: { + all: boolean + }; + explicit_content_filter: number; + enable_tts_command: boolean; + developer_mode: boolean; + detect_platform_accounts: boolean; + default_guilds_restricted: boolean; + convert_emojis: boolean; + afk_timeout: number; + } + declare interface GuildSettings { + suppress_everyone: boolean; + muted: boolean; + mobile_push: boolean; + message_notifications: number; + guild_id: string; + channel_override: Array<{ + muted: boolean, + message_notifications: number, + channel_id: string + }>; + } + declare interface UserProfile { + premium_since?: number; + mutual_guilds: Array<{ + nick?: string, + id: string + }>; + user: { + username: string, + discriminator: string, + flags: number, + id: string, + avatar?: string + }; + connected_accounts: Array<{ + verified: boolean, + type: string, + id: string, + name: string + }>; + } + declare interface Connection { + verified: boolean; + revoked: boolean; + integrations: any[]; + visibility: number; + friend_sync: boolean; + type: string; + id: string; + name: string; + } + declare interface GuildAuditLog { + users: User[]; + entries: GuildAuditLogEntry[]; + } + declare interface BaseData { + id: string; + [key: string]: {}; + } + declare type MessageContent = + | string + | { + content?: string, + tts?: boolean, + disableEveryone?: boolean, + embed?: EmbedOptions + }; + declare interface MessageFile { + file: Buffer | string; + name: string; + } + declare interface EmojiBase { + name: string; + icon?: string; + } + declare type EmojiOptions = { + roles?: string[] + } & EmojiBase; + declare type Emoji = { + roles: string[] + } & EmojiBase; + declare interface IntegrationOptions { + expireBehavior: string; + expireGracePeriod: string; + enableEmoticons: string; + } + declare interface GuildOptions { + name?: string; + region?: string; + icon?: string; + verificationLevel?: number; + defaultNotifications?: number; + afkChannelID?: string; + afkTimeout?: number; + ownerID?: string; + splash?: string; + } + declare interface MemberOptions { + roles?: string[]; + nick?: string; + mute?: boolean; + deaf?: boolean; + channelID?: string; + } + declare interface RoleOptions { + name?: string; + permissions?: number; + color?: number; + hoist?: boolean; + mentionable?: boolean; + } + declare interface GamePresence { + name: string; + type?: number; + url?: string; + } + declare interface SearchOptions { + sortBy?: string; + sortOrder?: string; + content?: string; + authorID?: string; + minID?: string; + maxID?: string; + limit?: number; + offset?: number; + contextSize?: number; + has?: string; + embedProviders?: string; + embedTypes?: string; + attachmentExtensions?: string; + attachmentFilename?: string; + channelIDs: string[]; + } + declare interface SearchResults { + totalResults: number; + results: Array< + Array< + Message & { + hit?: boolean + } + > + >; + } + declare interface VoiceResourceOptions { + inlineVolume?: boolean; + voiceDataTimeout?: number; + inputArgs?: string[]; + encoderArgs?: string[]; + format?: string; + frameDuration?: number; + frameSize?: number; + sampleRate?: number; + } + declare type PossiblyUncachedMessage = + | Message + | { + id: string, + channel: TextableChannel + }; + declare interface RawPacket { + op: number; + t?: string; + d?: any; + s?: number; + } + declare type ClientOptions = $Shape<{ + autoreconnect: boolean; + compress: boolean; + connectionTimeout: number; + disableEvents: { + [s: string]: boolean + }; + disableEveryone: boolean; + firstShardID: number; + getAllUsers: boolean; + guildCreateTimeout: number; + largeThreshold: number; + lastShardID: number; + maxShards: number | "auto"; + messageLimit: number; + opusOnly: boolean; + restMode: boolean; + seedVoiceConnections: boolean; + defaultImageFormat: string; + defaultImageSize: number; + ws: any; + latencyThreshold: number; + }> + declare type CommandClientOptions = $Shape<{ + defaultHelpCommand: boolean; + description: string; + ignoreBots: boolean; + ignoreSelf: boolean; + name: string; + owner: string; + prefix: string | string[]; + defaultCommandOptions: CommandOptions; + }> + declare interface Hooks { + preCommand?: (msg: Message, args: string[]) => void; + postCheck?: (msg: Message, args: string[], checksPassed: boolean) => void; + postExecution?: ( + msg: Message, + args: string[], + executionSuccess: boolean + ) => void; + postCommand?: (msg: Message, args: string[], sent?: Message) => void; + } + declare type GenericCheckFunction = (msg: Message) => T; + declare type CommandOptions = $Shape<{ + aliases?: string[]; + caseInsensitive?: boolean; + deleteCommand?: boolean; + argsRequired?: boolean; + guildOnly?: boolean; + dmOnly?: boolean; + description?: string; + fullDescription?: string; + usage?: string; + hooks?: Hooks; + requirements?: { + userIDs?: string[] | GenericCheckFunction, + roleIDs?: string[] | GenericCheckFunction, + roleNames?: string[] | GenericCheckFunction, + permissions?: + | { + [s: string]: boolean + } + | GenericCheckFunction<{ + [s: string]: boolean + }>, + custom?: GenericCheckFunction + }; + cooldown?: number; + cooldownExclusions?: { + userIDs?: string[], + guildIDs?: string[], + channelIDs?: string[] + }; + restartCooldown?: boolean; + cooldownReturns?: number; + cooldownMessage?: string | GenericCheckFunction; + invalidUsageMessage?: string | GenericCheckFunction; + permissionMessage?: string | GenericCheckFunction; + errorMessage?: string | GenericCheckFunction; + reactionButtons?: Array<{ + emoji: string, + type: string, + response: CommandGenerator + }>; + reactionButtonTimeout?: number; + defaultSubcommandOptions?: CommandOptions; + hidden?: boolean; + }> + declare type CommandGeneratorFunction = ( + msg: Message, + args: string[] + ) => Promise | Promise | MessageContent | void; + declare type CommandGenerator = + | CommandGeneratorFunction + | MessageContent + | MessageContent[] + | CommandGeneratorFunction[]; + declare export class ShardManager extends Collection { + constructor(client: Client): *; + connect(shard: Shard): void; + spawn(id: number): void; + toJSON(): string; + } + declare export default class Client extends events$EventEmitter implements SimpleJSON, Emittable { + token: string; + gatewayURL: string; + bot: boolean; + options: ClientOptions; + channelGuildMap: { + [s: string]: string + }; + shards: ShardManager; + guilds: Collection; + privateChannelMap: { + [s: string]: string + }; + privateChannels: Collection; + groupChannels: Collection; + voiceConnections: Collection; + guildShardMap: { + [s: string]: number + }; + startTime: number; + unavailableGuilds: Collection; + uptime: number; + user: ExtendedUser; + users: Collection; + relationships: Collection; + userGuildSettings: { + [s: string]: GuildSettings + }; + userSettings: UserSettings; + notes: { + [s: string]: string + }; + constructor(token: string, options?: ClientOptions): *; + connect(): Promise; + getGateway(): Promise; + getBotGateway(): Promise<{ + url: string, + shards: number + }>; + disconnect(options: { + reconnect: boolean + }): void; + joinVoiceChannel( + channelID: string, + options?: { + shared?: boolean, + opusOnly?: boolean + } + ): Promise; + leaveVoiceChannel(channelID: string): void; + closeVoiceConnection(guildID: string): void; + editAFK(afk: boolean): void; + editStatus(status?: string, game?: GamePresence): void; + getChannel(channelID: string): AnyChannel; + createChannel( + guildID: string, + name: string, + type?: number, + reason?: string, + parentID?: string + ): Promise; + editChannel( + channelID: string, + options: { + name?: string, + icon?: string, + ownerID?: string, + topic?: string, + bitrate?: number, + userLimit?: number, + nsfw?: boolean, + parentID?: string + }, + reason?: string + ): Promise; + editChannelPosition(channelID: string, position: number): Promise; + deleteChannel(channelID: string, reason?: string): Promise; + sendChannelTyping(channelID: string): Promise; + editChannelPermission( + channelID: string, + overwriteID: string, + allow: number, + deny: number, + type: string, + reason?: string + ): Promise; + deleteChannelPermission( + channelID: string, + overwriteID: string, + reason?: string + ): Promise; + getChannelInvites(channelID: string): Promise; + createChannelInvite( + channelID: string, + options?: { + maxAge?: number, + maxUses?: number, + temporary?: boolean, + unique?: boolean + }, + reason?: string + ): Promise; + getChannelWebhooks(channelID: string): Promise; + getWebhook(webhookID: string, token?: string): Promise; + createChannelWebhook( + channelID: string, + options: { + name: string, + avatar: string + }, + reason?: string + ): Promise; + editWebhook( + webhookID: string, + options: { + name?: string, + avatar?: string + }, + token?: string, + reason?: string + ): Promise; + executeWebhook( + webhookID: string, + token: string, + options: WebhookPayload + ): Promise; + executeSlackWebhook( + webhookID: string, + token: string, + options?: { + wait?: boolean + } + ): Promise; + deleteWebhook( + webhookID: string, + token?: string, + reason?: string + ): Promise; + getGuildWebhooks(guildID: string): Promise; + getGuildAuditLogs( + guildID: string, + limit?: number, + before?: string, + actionType?: number + ): Promise; + createGuildEmoji( + guildID: string, + options: EmojiOptions, + reason?: string + ): Promise; + editGuildEmoji( + guildID: string, + emojiID: string, + options: { + name?: string, + roles?: string[] + }, + reason?: string + ): Promise; + deleteGuildEmoji( + guildID: string, + emojiID: string, + reason?: string + ): Promise; + createRole( + guildID: string, + options?: RoleOptions, + reason?: string + ): Promise; + editRole( + guildID: string, + roleID: string, + options: RoleOptions, + reason?: string + ): Promise; + editRolePosition( + guildID: string, + roleID: string, + position: number + ): Promise; + deleteRole(guildID: string, roleID: string, reason?: string): Promise; + getPruneCount(guildID: string, days: number): Promise; + pruneMembers( + guildID: string, + days: number, + reason?: string + ): Promise; + getVoiceRegions(guildID: string): Promise; + getInvite(inviteID: string, withCounts?: boolean): Promise; + acceptInvite(inviteID: string): Promise; + deleteInvite(inviteID: string, reason?: string): Promise; + getSelf(): Promise; + editSelf(options: { + username?: string, + avatar?: string + }): Promise; + getDMChannel(userID: string): Promise; + createGroupChannel(userIDs: string[]): Promise; + getMessage(channelID: string, messageID: string): Promise; + getMessages( + channelID: string, + limit?: number, + before?: string, + after?: string, + around?: string + ): Promise; + getPins(channelID: string): Promise; + createMessage( + channelID: string, + content: MessageContent, + file?: MessageFile + ): Promise; + editMessage( + channelID: string, + messageID: string, + content: MessageContent + ): Promise; + pinMessage(channelID: string, messageID: string): Promise; + unpinMessage(channelID: string, messageID: string): Promise; + getMessageReaction( + channelID: string, + messageID: string, + reaction: string, + limit?: number, + before?: string, + after?: string + ): Promise; + addMessageReaction( + channelID: string, + messageID: string, + reaction: string, + userID?: string + ): Promise; + removeMessageReaction( + channelID: string, + messageID: string, + reaction: string, + userID?: string + ): Promise; + removeMessageReactions(channelID: string, messageID: string): Promise; + deleteMessage( + channelID: string, + messageID: string, + reason?: string + ): Promise; + deleteMessages( + channelID: string, + messageIDs: string[], + reason?: string + ): Promise; + purgeChannel( + channelID: string, + limit?: number, + filter?: (m: Message) => boolean, + before?: string, + after?: string + ): Promise; + getGuildEmbed(guildID: string): Promise; + getGuildIntegrations(guildID: string): Promise; + editGuildIntegration( + guildID: string, + integrationID: string, + options: IntegrationOptions + ): Promise; + deleteGuildIntegration( + guildID: string, + integrationID: string + ): Promise; + syncGuildIntegration(guildID: string, integrationID: string): Promise; + getGuildInvites(guildID: string): Promise; + banGuildMember( + guildID: string, + userID: string, + deleteMessageDays?: number, + reason?: string + ): Promise; + unbanGuildMember( + guildID: string, + userID: string, + reason?: string + ): Promise; + createGuild(name: string, region: string, icon?: string): Promise; + editGuild( + guildID: string, + options: GuildOptions, + reason?: string + ): Promise; + getGuildBans( + guildID: string + ): Promise< + Array<{ + reason?: string, + user: User + }> + >; + editGuildMember( + guildID: string, + memberID: string, + options: MemberOptions, + reason?: string + ): Promise; + addGuildMemberRole( + guildID: string, + memberID: string, + roleID: string, + reason?: string + ): Promise; + removeGuildMemberRole( + guildID: string, + memberID: string, + roleID: string, + reason?: string + ): Promise; + editNickname(guildID: string, nick: string, reason?: string): Promise; + kickGuildMember( + guildID: string, + userID: string, + reason?: string + ): Promise; + deleteGuild(guildID: string): Promise; + leaveGuild(guildID: string): Promise; + getOAuthApplication( + appID?: string + ): Promise<{ + description: string, + name: string, + owner: { + username: string, + discriminator: string, + id: string, + avatar?: string + }, + bot_public: boolean, + bot_require_code_grant: boolean, + id: string, + icon?: string + }>; + addRelationship(userID: string, block?: boolean): Promise; + removeRelationship(userID: string): Promise; + addGroupRecipient(groupID: string, userID: string): Promise; + removeGroupRecipient(groupID: string, userID: string): Promise; + getUserProfile(userID: string): Promise; + editUserNote(userID: string, note: string): Promise; + deleteUserNote(userID: string): Promise; + getSelfConnections(): Promise; + editSelfConnection( + platform: string, + id: string, + data: { + friendSync: boolean, + visibility: number + } + ): Promise; + deleteSelfConnection(platform: string, id: string): Promise; + getSelfSettings(): Promise; + editSelfSettings(data: UserSettings): Promise; + getSelfMFACodes( + password: string, + regenerate?: boolean + ): Promise<{ + backup_codes: Array<{ + code: string, + consumed: boolean + }> + }>; + enableSelfMFATOTP( + secret: string, + code: string + ): Promise<{ + token: string, + backup_codes: Array<{ + code: string, + consumed: boolean + }> + }>; + disableSelfMFATOTP( + code: string + ): Promise<{ + token: string + }>; + getSelfBilling(): Promise<{ + premium_subscription?: { + status: number, + ended_at?: string, + canceled_at?: string, + created_at: string, + current_period_end?: string, + current_period_start?: string, + plan: string + }, + payment_source?: { + type: string, + brand: string, + invalid: boolean, + last_4: number, + expires_year: number, + expires_month: number + }, + payment_gateway?: string + }>; + getSelfPayments(): Promise< + Array<{ + status: number, + amount_refunded: number, + description: string, + created_at: string, + currency: string, + amount: number + }> + >; + addSelfPremiumSubscription(token: string, plan: string): Promise; + deleteSelfPremiumSubscription(): Promise; + getRESTChannel(channelID: string): Promise; + getRESTGuild(guildID: string): Promise; + getRESTGuilds( + limit?: number, + before?: string, + after?: string + ): Promise; + getRESTGuildChannels(guildID: string): Promise; + getRESTGuildEmojis(guildID: string): Promise; + getRESTGuildEmoji(guildID: string, emojiID: string): Promise; + getRESTGuildMembers( + guildID: string, + limit?: number, + after?: string + ): Promise; + getRESTGuildMember(guildID: string, memberID: string): Promise; + getRESTGuildRoles(guildID: string): Promise; + getRESTUser(userID: string): Promise; + searchChannelMessages( + channelID: string, + query: SearchOptions + ): Promise; + searchGuildMessages( + guildID: string, + query: SearchOptions + ): Promise; + on(event: string, listener: Function): *; + on(event: "ready" | "disconnect", listener: () => void): *; + on( + event: "callCreate" | "callRing" | "callDelete", + listener: (call: Call) => void + ): *; + on( + event: "callUpdate", + listener: (call: Call, oldCall: OldCall) => void + ): *; + on( + event: "channelCreate" | "channelDelete", + listener: (channel: AnyChannel) => void + ): *; + on( + event: "channelPinUpdate", + listener: ( + channel: TextableChannel, + timestamp: number, + oldTimestamp: number + ) => void + ): *; + on( + event: "channelRecipientAdd" | "channelRecipientRemove", + listener: (channel: GroupChannel, user: User) => void + ): *; + on( + event: "channelUpdate", + listener: (channel: AnyChannel, oldChannel: OldChannel) => void + ): *; + on( + event: "friendSuggestionCreate", + listener: (user: User, reasons: FriendSuggestionReasons) => void + ): *; + on(event: "friendSuggestionDelete", listener: (user: User) => void): *; + on( + event: "guildAvailable" | "guildBanAdd" | "guildBanRemove", + listener: (guild: Guild, user: User) => void + ): *; + on( + event: "guildDelete" | "guildUnavailable" | "guildCreate", + listener: (guild: Guild) => void + ): *; + on( + event: "guildEmojisUpdate", + listener: (guild: Guild, emojis: Emoji[], oldEmojis: Emoji[]) => void + ): *; + on( + event: "guildMemberAdd", + listener: (guild: Guild, member: Member) => void + ): *; + on( + event: "guildMemberChunk", + listener: (guild: Guild, members: Member[]) => void + ): *; + on( + event: "guildMemberRemove", + listener: (guild: Guild, member: Member | MemberPartial) => void + ): *; + on( + event: "guildMemberUpdate", + listener: ( + guild: Guild, + member: Member, + oldMember: { + roles: string[], + nick?: string + } + ) => void + ): *; + on( + event: "guildRoleCreate" | "guildRoleDelete", + listener: (guild: Guild, role: Role) => void + ): *; + on( + event: "guildRoleUpdate", + listener: (guild: Guild, role: Role, oldRole: RoleOptions) => void + ): *; + on( + event: "guildUpdate", + listener: (guild: Guild, oldGuild: GuildOptions) => void + ): *; + on(event: "hello", listener: (trace: string[], id: number) => void): *; + on(event: "messageCreate", listener: (message: Message) => void): *; + on( + event: "messageDelete" | "messageReactionRemoveAll", + listener: (message: PossiblyUncachedMessage) => void + ): *; + on( + event: "messageDeleteBulk", + listener: (messages: PossiblyUncachedMessage[]) => void + ): *; + on( + event: "messageReactionAdd" | "messageReactionRemove", + listener: ( + message: PossiblyUncachedMessage, + emoji: Emoji, + userID: string + ) => void + ): *; + on( + event: "messageUpdate", + listener: ( + message: Message, + oldMessage?: { + attachments: Attachment[], + embeds: Embed[], + content: string, + editedTimestamp?: number, + mentionedBy?: any, + tts: boolean, + mentions: string[], + roleMentions: string[], + channelMentions: string[] + } + ) => void + ): *; + on( + event: "presenceUpdate", + listener: ( + other: Member | Relationship, + oldPresence?: OldPresence + ) => void + ): *; + on( + event: "rawWS" | "unknown", + listener: (packet: RawPacket, id: number) => void + ): *; + on( + event: "relationshipAdd" | "relationshipRemove", + listener: (relationship: Relationship) => void + ): *; + on( + event: "relationshipUpdate", + listener: ( + relationship: Relationship, + oldRelationship: { + type: number + } + ) => void + ): *; + on( + event: "typingStart", + listener: (channel: TextableChannel, user: User) => void + ): *; + on( + event: "unavailableGuildCreate", + listener: (guild: UnavailableGuild) => void + ): *; + on( + event: "userUpdate", + listener: ( + user: User, + oldUser: { + username: string, + discriminator: string, + avatar?: string + } + ) => void + ): *; + on( + event: "voiceChannelJoin", + listener: (member: Member, newChannel: VoiceChannel) => void + ): *; + on( + event: "voiceChannelLeave", + listener: (member: Member, oldChannel: VoiceChannel) => void + ): *; + on( + event: "voiceChannelSwitch", + listener: ( + member: Member, + newChannel: VoiceChannel, + oldChannel: VoiceChannel + ) => void + ): *; + on( + event: "voiceStateUpdate", + listener: (member: Member, oldState: OldVoiceState) => void + ): *; + on( + event: "warn" | "debug", + listener: (message: string, id: number) => void + ): *; + on( + event: "shardDisconnect" | "error" | "shardPreReady" | "connect", + listener: (err: Error, id: number) => void + ): *; + on( + event: "shardReady" | "shardResume", + listener: (id: number) => void + ): *; + toJSON(simple?: boolean): JSONCache; + } + declare export class VoiceConnection extends events$EventEmitter implements SimpleJSON { + id: string; + channelID: string; + connecting: boolean; + ready: boolean; + playing: boolean; + paused: boolean; + volume: number; + current: { + startTime: number, + playTime: number, + pausedTimestamp?: number, + pausedTime?: number, + options: VoiceResourceOptions + }; + constructor( + id: string, + options?: { + shard?: Shard, + shared?: boolean, + opusOnly?: boolean + } + ): *; + pause(): void; + play( + resource: ReadableStream | string, + options?: VoiceResourceOptions + ): void; + receive(type: string): VoiceDataStream; + resume(): void; + setVolume(volume: number): void; + stopPlaying(): void; + switchChannel(channelID: string): void; + updateVoiceState(selfMute: boolean, selfDeaf: boolean): void; + on(event: "debug" | "warn", listener: (message: string) => void): *; + on(event: "error" | "disconnect", listener: (err: Error) => void): *; + on(event: "pong", listener: (latency: number) => void): *; + on(event: "speakingStart", listener: (userID: string) => void): *; + on(event: "end", listener: () => void): *; + on(event: string, listener: (e: mixed, ...args: Array) => void): *; + toJSON(simple?: boolean): JSONCache; + } + declare export class SharedStream extends events$EventEmitter { + playing: boolean; + ended: boolean; + volume: number; + speaking: boolean; + current: { + startTime: number, + playTime: number, + pausedTimestamp?: number, + pausedTime?: number, + options: VoiceResourceOptions + }; + add(connection: VoiceConnection): void; + play( + resource: ReadableStream | string, + options: VoiceResourceOptions + ): void; + remove(connection: VoiceConnection): void; + setVolume(volume: number): void; + stopPlaying(): void; + } + declare class VoiceDataStream { + type: string; + constructor(type: string): *; + } + declare export class VoiceConnectionManager + extends Collection implements SimpleJSON { + constructor(vcObject: () => T): *; + join( + guildID: string, + channelID: string, + options: VoiceResourceOptions + ): Promise; + leave(guildID: string): void; + switch(guildID: string, channelID: string): void; + toJSON(simple?: boolean): JSONCache; + } + declare class Base implements SimpleJSON { + id: string; + createdAt: number; + constructor(id: string): *; + inspect(): *; + toJSON(simple?: boolean): JSONCache; + } + declare export class Bucket { + tokens: number; + lastReset: number; + lastSend: number; + tokenLimit: number; + interval: number; + constructor( + tokenLimit: number, + interval: number, + latencyRef: { + latency: number + } + ): *; + queue(func: Function): void; + } + declare export class Collection extends Map { + baseObject: (...args: any[]) => T; + limit: number; + constructor(baseObject: (...args: any[]) => T, limit?: number): *; + add(obj: T, extra?: any, replace?: boolean): T; + find(func: (i: T) => boolean): T; + random(): T; + filter(func: (i: T) => boolean): T[]; + map(func: (i: T) => R): R[]; + update(obj: T, extra?: any, replace?: boolean): T; + remove( + obj: + | T + | { + id: string + } + ): T; + } + declare export class Call extends Base { + id: string; + createdAt: number; + channel: GroupChannel; + voiceStates: Collection; + participants: string[]; + endedTimestamp: number; + ringing: string[]; + region: string; + unavailable: boolean; + constructor(data: BaseData, channel: GroupChannel): *; + } + declare export class Channel extends Base { + id: string; + mention: string; + type: number; + createdAt: number; + constructor(data: BaseData): *; + } + declare export class ExtendedUser extends User { + email: string; + verified: boolean; + mfaEnabled: boolean; + } + declare export class GroupChannel extends PrivateChannel { + recipients: Collection; + name: string; + icon: string; + iconURL: string; + ownerID: string; + edit(options: { + name?: string, + icon?: string, + ownerID?: string + }): Promise; + addRecipient(userID: string): Promise; + removeRecipient(userID: string): Promise; + dynamicIconURL(format: string, size: number): string; + } + declare export class Guild extends Base { + id: string; + createdAt: number; + name: string; + verificationLevel: number; + region: string; + icon: string; + afkChannelID: string; + systemChannelID: string; + afkTimeout: number; + defaultNotifications: number; + mfaLevel: number; + joinedAt: number; + ownerID: string; + splash: string; + unavailable: boolean; + large: boolean; + maxPresences: number; + channels: Collection; + members: Collection; + memberCount: number; + roles: Collection; + shard: Shard; + features: string[]; + emojis: Emoji[]; + iconURL: string; + explicitContentFilter: number; + constructor(data: BaseData, client: Client): *; + fetchAllMembers(): void; + dynamicIconURL(format: string, size: number): string; + createChannel( + name: string, + type: string, + parentID?: string + ): Promise; + createEmoji( + options: { + name: string, + image: string, + roles?: string[] + }, + reason?: string + ): Promise; + editEmoji( + emojiID: string, + options: { + name: string, + roles?: string[] + }, + reason?: string + ): Promise; + deleteEmoji(emojiID: string, reason?: string): Promise; + createRole(options: RoleOptions, reason?: string): Promise; + getPruneCount(days: number): Promise; + pruneMembers(days: number, reason?: string): Promise; + getRESTChannels(): Promise; + getRESTEmojis(): Promise; + getRESTEmoji(emojiID: string): Promise; + getRESTMembers(limit?: number, after?: string): Promise; + getRESTMember(memberID: string): Promise; + getRESTRoles(): Promise; + getEmbed(): Promise; + getVoiceRegions(): Promise; + leaveVoiceChannel(): void; + editRole(roleID: string, options: RoleOptions): Promise; + deleteRole(roleID: string): Promise; + getAuditLogs( + limit?: number, + before?: string, + actionType?: number + ): Promise; + getIntegrations(): Promise; + editIntegration( + integrationID: string, + options: IntegrationOptions + ): Promise; + syncIntegration(integrationID: string): Promise; + deleteIntegration(integrationID: string): Promise; + getInvites(): Promise; + editMember( + memberID: string, + options: MemberOptions, + reason?: string + ): Promise; + addMemberRole( + memberID: string, + roleID: string, + reason?: string + ): Promise; + removeMemberRole( + memberID: string, + roleID: string, + reason?: string + ): Promise; + kickMember(userID: string, reason?: string): Promise; + banMember( + userID: string, + deleteMessageDays?: number, + reason?: string + ): Promise; + unbanMember(userID: string, reason?: string): Promise; + edit(options: GuildOptions, reason?: string): Promise; + delete(): Promise; + leave(): Promise; + getBans(): Promise; + editNickname(nick: string): Promise; + getWebhooks(): Promise; + } + declare export class GuildAuditLogEntry extends Base { + id: string; + guild: Guild; + actionType: number; + reason: string; + user: User; + targetID: string; + target: Guild | AnyGuildChannel | Member | Invite | Role | any; + before: any; + after: any; + count: number; + channel: AnyGuildChannel; + deleteMemberDays: number; + membersRemoved: number; + member: Member | any; + role: Role | any; + constructor(data: BaseData, guild: Guild): *; + } + declare export class GuildChannel extends Channel { + guild: Guild; + parentID: string; + name: string; + position: number; + permissionOverwrites: Collection; + nsfw: boolean; + constructor(data: BaseData, guild: Guild): *; + getInvites(): Promise; + createInvite( + options?: CreateInviteOptions, + reason?: string + ): Promise; + permissionsOf(memberID: string): Permission; + edit( + options: { + name?: string, + topic?: string, + bitrate?: number, + userLimit?: number, + nsfw?: boolean + }, + reason?: string + ): Promise; + editPosition(position: number): Promise; + delete(reason?: string): Promise; + editPermission( + overwriteID: string, + allow: number, + deny: number, + type: string, + reason?: string + ): Promise; + deletePermission(overwriteID: string, reason?: string): Promise; + } + declare export class CategoryChannel extends GuildChannel { + channels: Collection; + } + declare export class TextChannel extends GuildChannel implements Textable, Invitable { + topic: string; + lastMessageID: string; + messages: Collection; + constructor(data: BaseData, guild: Guild, messageLimit: number): *; + getInvites(): Promise; + createInvite( + options?: CreateInviteOptions, + reason?: string + ): Promise; + getWebhooks(): Promise; + createWebhook( + options: { + name: string, + avatar: string + }, + reason?: string + ): Promise; + sendTyping(): Promise; + getMessage(messageID: string): Promise; + getMessages( + limit?: number, + before?: string, + after?: string, + around?: string + ): Promise; + getPins(): Promise; + createMessage( + content: MessageContent, + file?: MessageFile + ): Promise; + editMessage(messageID: string, content: MessageContent): Promise; + pinMessage(messageID: string): Promise; + unpinMessage(messageID: string): Promise; + getMessageReaction( + messageID: string, + reaction: string, + limit?: number, + before?: string, + after?: string + ): Promise; + addMessageReaction( + messageID: string, + reaction: string, + userID?: string + ): Promise; + removeMessageReaction( + messageID: string, + reaction: string, + userID?: string + ): Promise; + removeMessageReactions(messageID: string): Promise; + deleteMessage(messageID: string, reason?: string): Promise; + unsendMessage(messageID: string): Promise; + } + declare export class VoiceChannel extends GuildChannel implements Invitable { + bitrate: number; + userLimit: number; + voiceMembers: Collection; + join(options: VoiceResourceOptions): Promise; + leave(): void; + } + declare export class GuildIntegration extends Base { + id: string; + createdAt: number; + name: string; + type: string; + roleID: string; + user: User; + account: { + id: string, + name: string + }; + enabled: boolean; + syncing: boolean; + expireBehavior: number; + expireGracePeriod: number; + enableEmoticons: boolean; + subscriberCount: number; + syncedAt: number; + constructor(data: BaseData, guild: Guild): *; + edit(options: { + expireBehavior: string, + expireGracePeriod: string, + enableEmoticons: string + }): Promise; + delete(): Promise; + sync(): Promise; + } + declare export class Invite implements SimpleJSON { + code: string; + channel: { + id: string, + name: string + }; + guild: { + id: string, + name: string, + splash?: string, + icon?: string, + textChannelCount?: number, + voiceChannelCount?: number + }; + inviter: User; + uses: number; + maxUses: number; + maxAge: number; + temporary: boolean; + createdAt: number; + revoked: boolean; + presenceCount: number; + memberCount: number; + constructor(data: BaseData, client: Client): *; + delete(reason?: string): Promise; + toJSON(simple?: boolean): JSONCache; + } + declare export class Member extends Base { + id: string; + mention: string; + guild: Guild; + joinedAt: number; + status: string; + game: GamePresence; + voiceState: VoiceState; + nick: string; + roles: string[]; + user: User; + permission: Permission; + defaultAvatar: string; + createdAt: number; + bot: boolean; + username: string; + discriminator: string; + avatar: string; + defaultAvatarURL: string; + avatarURL: string; + staticAvatarURL: string; + constructor(data: BaseData, guild: Guild): *; + edit(options: MemberOptions, reason?: string): Promise; + addRole(roleID: string, reason?: string): Promise; + removeRole(roleID: string, reason?: string): Promise; + kick(reason?: string): Promise; + ban(deleteMessageDays?: number, reason?: string): Promise; + unban(reason?: string): Promise; + } + declare export class Message extends Base { + id: string; + createdAt: number; + channel: TextableChannel; + timestamp: number; + type: number; + author: User; + member: Member; + mentions: User[]; + content: string; + cleanContent: string; + roleMentions: string[]; + channelMentions: string[]; + editedTimestamp: number; + tts: boolean; + mentionEveryone: boolean; + attachments: Attachment[]; + embeds: Embed[]; + reactions: { + [s: string]: any, + count: number, + me: boolean + }; + prefix: string; + command: Command; + constructor(data: BaseData, client: Client): *; + edit(content: MessageContent): Promise; + pin(): Promise; + unpin(): Promise; + getReaction( + reaction: string, + limit?: number, + before?: string, + after?: string + ): Promise; + addReaction(reaction: string, userID?: string): Promise; + removeReaction(reaction: string, userID?: string): Promise; + removeReactions(): Promise; + delete(reason?: string): Promise; + } + declare export class Permission { + allow: number; + deny: number; + json: { + [s: string]: boolean + }; + constructor(allow: number, deny: number): *; + has(permission: string): boolean; + } + declare export class PermissionOverwrite extends Permission { + id: string; + createdAt: number; + type: string; + constructor(data: { + allow: number, + deny: number + }): *; + } + declare export class PrivateChannel extends Channel implements Textable { + lastMessageID: string; + recipient: User; + messages: Collection; + ring(recipient: string[]): void; + syncCall(): void; + leave(): Promise; + sendTyping(): Promise; + getMessage(messageID: string): Promise; + getMessages( + limit?: number, + before?: string, + after?: string, + around?: string + ): Promise; + getPins(): Promise; + createMessage( + content: MessageContent, + file?: MessageFile + ): Promise; + editMessage(messageID: string, content: MessageContent): Promise; + pinMessage(messageID: string): Promise; + unpinMessage(messageID: string): Promise; + getMessageReaction( + messageID: string, + reaction: string, + limit?: number, + before?: string, + after?: string + ): Promise; + addMessageReaction( + messageID: string, + reaction: string, + userID?: string + ): Promise; + removeMessageReaction( + messageID: string, + reaction: string, + userID?: string + ): Promise; + removeMessageReactions(messageID: string): Promise; + deleteMessage(messageID: string, reason?: string): Promise; + unsendMessage(messageID: string): Promise; + } + declare export class Relationship { + id: string; + user: User; + type: number; + status: string; + game: GamePresence; + constructor(data: BaseData, client: Client): *; + } + declare export class Role extends Base { + id: string; + createdAt: number; + guild: Guild; + mention: string; + name: string; + mentionable: boolean; + managed: boolean; + hoist: boolean; + color: number; + position: number; + permissions: Permission; + json: { + [s: string]: boolean + }; + constructor(data: BaseData, guild: Guild): *; + edit(options: RoleOptions, reason?: string): Promise; + editPosition(position: number): Promise; + delete(reason?: string): Promise; + } + declare export class UnavailableGuild extends Base { + id: string; + createdAt: number; + unavailable: boolean; + shard: Shard; + constructor(data: BaseData, client: Client): *; + } + declare export class User extends Base { + id: string; + mention: string; + defaultAvatar: string; + createdAt: number; + bot: boolean; + username: string; + discriminator: string; + avatar: string; + defaultAvatarURL: string; + avatarURL: string; + staticAvatarURL: string; + constructor(data: BaseData, client: Client): *; + dynamicAvatarURL(format?: string, size?: number): string; + getDMChannel(): Promise; + addRelationship(block?: boolean): Promise; + removeRelationship(): Promise; + getProfile(): Promise; + editNote(note: string): Promise; + deleteNote(): Promise; + } + declare export class VoiceState extends Base implements NestedJSON { + id: string; + createdAt: number; + sessionID: string; + channelID: string; + mute: boolean; + deaf: boolean; + suppress: boolean; + selfMute: boolean; + selfDeaf: boolean; + constructor(data: BaseData): *; + toJSON(arg?: any, cache?: Array): JSONCache; + } + declare export class Shard extends events$EventEmitter implements SimpleJSON, Emittable { + id: number; + connecting: boolean; + ready: boolean; + discordServerTrace: string[]; + status: string; + lastHeartbeatReceived: number; + lastHeartbeatSent: number; + latency: number; + constructor(id: number, client: Client): *; + connect(): void; + disconnect(options?: { + reconnect: boolean + }): void; + editAFK(afk: boolean): void; + editStatus(status?: string, game?: GamePresence): void; + on(event: string, listener: Function): *; + on(event: "ready" | "disconnect", listener: () => void): *; + on( + event: "callCreate" | "callRing" | "callDelete", + listener: (call: Call) => void + ): *; + on( + event: "callUpdate", + listener: (call: Call, oldCall: OldCall) => void + ): *; + on( + event: "channelCreate" | "channelDelete", + listener: (channel: AnyChannel) => void + ): *; + on( + event: "channelPinUpdate", + listener: ( + channel: TextableChannel, + timestamp: number, + oldTimestamp: number + ) => void + ): *; + on( + event: "channelRecipientAdd" | "channelRecipientRemove", + listener: (channel: GroupChannel, user: User) => void + ): *; + on( + event: "channelUpdate", + listener: (channel: AnyChannel, oldChannel: OldChannel) => void + ): *; + on( + event: "friendSuggestionCreate", + listener: (user: User, reasons: FriendSuggestionReasons) => void + ): *; + on(event: "friendSuggestionDelete", listener: (user: User) => void): *; + on( + event: "guildAvailable" | "guildBanAdd" | "guildBanRemove", + listener: (guild: Guild, user: User) => void + ): *; + on( + event: "guildDelete" | "guildUnavailable" | "guildCreate", + listener: (guild: Guild) => void + ): *; + on( + event: "guildEmojisUpdate", + listener: (guild: Guild, emojis: Emoji[], oldEmojis: Emoji[]) => void + ): *; + on( + event: "guildMemberAdd", + listener: (guild: Guild, member: Member) => void + ): *; + on( + event: "guildMemberChunk", + listener: (guild: Guild, members: Member[]) => void + ): *; + on( + event: "guildMemberRemove", + listener: (guild: Guild, member: Member | MemberPartial) => void + ): *; + on( + event: "guildMemberUpdate", + listener: ( + guild: Guild, + member: Member, + oldMember: { + roles: string[], + nick?: string + } + ) => void + ): *; + on( + event: "guildRoleCreate" | "guildRoleDelete", + listener: (guild: Guild, role: Role) => void + ): *; + on( + event: "guildRoleUpdate", + listener: (guild: Guild, role: Role, oldRole: RoleOptions) => void + ): *; + on( + event: "guildUpdate", + listener: (guild: Guild, oldGuild: GuildOptions) => void + ): *; + on(event: "hello", listener: (trace: string[], id: number) => void): *; + on(event: "messageCreate", listener: (message: Message) => void): *; + on( + event: "messageDelete" | "messageReactionRemoveAll", + listener: (message: PossiblyUncachedMessage) => void + ): *; + on( + event: "messageDeleteBulk", + listener: (messages: PossiblyUncachedMessage[]) => void + ): *; + on( + event: "messageReactionAdd" | "messageReactionRemove", + listener: ( + message: PossiblyUncachedMessage, + emoji: Emoji, + userID: string + ) => void + ): *; + on( + event: "messageUpdate", + listener: ( + message: Message, + oldMessage?: { + attachments: Attachment[], + embeds: Embed[], + content: string, + editedTimestamp?: number, + mentionedBy?: any, + tts: boolean, + mentions: string[], + roleMentions: string[], + channelMentions: string[] + } + ) => void + ): *; + on( + event: "presenceUpdate", + listener: ( + other: Member | Relationship, + oldPresence?: OldPresence + ) => void + ): *; + on( + event: "rawWS" | "unknown", + listener: (packet: RawPacket, id: number) => void + ): *; + on( + event: "relationshipAdd" | "relationshipRemove", + listener: (relationship: Relationship) => void + ): *; + on( + event: "relationshipUpdate", + listener: ( + relationship: Relationship, + oldRelationship: { + type: number + } + ) => void + ): *; + on( + event: "shardPreReady" | "connect", + listener: (id: number) => void + ): *; + on( + event: "typingStart", + listener: (channel: TextableChannel, user: User) => void + ): *; + on( + event: "unavailableGuildCreate", + listener: (guild: UnavailableGuild) => void + ): *; + on( + event: "userUpdate", + listener: ( + user: User, + oldUser: { + username: string, + discriminator: string, + avatar?: string + } + ) => void + ): *; + on( + event: "voiceChannelJoin", + listener: (member: Member, newChannel: VoiceChannel) => void + ): *; + on( + event: "voiceChannelLeave", + listener: (member: Member, oldChannel: VoiceChannel) => void + ): *; + on( + event: "voiceChannelSwitch", + listener: ( + member: Member, + newChannel: VoiceChannel, + oldChannel: VoiceChannel + ) => void + ): *; + on( + event: "voiceStateUpdate", + listener: (member: Member, oldState: OldVoiceState) => void + ): *; + on( + event: "warn" | "debug", + listener: (message: string, id: number) => void + ): *; + on(event: "disconnect", listener: (err: Error) => void): *; + on(event: "resume", listener: () => void): *; + toJSON(simple?: boolean): JSONCache; + sendWS(op: number, _data: { [key: string]: any }): void; + } + declare export class Command { + subcommands: { + [s: string]: Command + }; + constructor( + label: string, + generate: CommandGenerator, + options?: CommandOptions + ): *; + registerSubcommandAlias(alias: string, label: string): void; + registerSubcommand( + label: string, + generator: CommandGenerator, + options?: CommandOptions + ): void; + unregisterSubcommand(label: string): void; + } + declare export class CommandClient extends Client { + commands: { + [s: string]: Command + }; + constructor( + token: string, + options?: ClientOptions, + commandOptions?: CommandClientOptions + ): *; + onMessageCreate(msg: Message): void; + registerGuildPrefix(guildID: string, prefix: string[] | string): void; + registerCommandAlias(alias: string, label: string): void; + registerCommand( + label: string, + generator: CommandGenerator, + options?: CommandOptions + ): Command; + unregisterCommand(label: string): void; + } +} diff --git a/package.json b/package.json index 8c2f58d..c1d2fab 100644 --- a/package.json +++ b/package.json @@ -8,17 +8,19 @@ "build": "npm-run-all build:*", "build:ui": "NODE_ENV=production next build ui", "build:server": "NODE_ENV=production babel --delete-dir-on-start -d dist .", - "build:move": "mkdir dist/ui; cp -R ui/.next dist/ui/.next", - "remotedebug": "remotedebug_ios_webkit_adapter --port=9000 > /dev/null &" + "remotedebug": "remotedebug_ios_webkit_adapter --port=9000 > /dev/null", + "test": "jest" }, "dependencies": { "@discordjs/uws": "^11.149.1", - "@primer/components": "^11.0.0", + "@primer/components": "^12.0.0", + "bufferutil": "^4.0.1", "chalk": "^2.4.2", "color": "^3.1.0", - "discord.js": "^11.4.2", "dotenv": "^7.0.0", - "erlpack": "hammerandchisel/erlpack", + "eris": "^0.9.0", + "erlpack": "discordapp/erlpack", + "eventemitter3": "^3.1.0", "fast-redux": "^0.7.1", "fnv-plus": "^1.2.12", "glob": "^7.1.3", @@ -51,15 +53,17 @@ "socket.io": "^2.2.0", "styled-components": "^4.1.3", "superagent": "^4.1.0", - "uuid": "^3.3.2" + "zlib-sync": "^0.1.4" }, "devDependencies": { "@babel/cli": "^7.2.3", "@babel/node": "^7.2.2", + "@babel/core": "^7.4.0", "@babel/plugin-proposal-class-properties": "^7.4.0", + "@babel/plugin-proposal-optional-chaining": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-transform-runtime": "^7.4.0", - "@babel/preset-env": "^7.4.1", + "@babel/preset-env": "^7.4.2", "@babel/preset-flow": "^7.0.0", "babel-eslint": "^10.0.1", "babel-plugin-styled-components": "^1.10.0", @@ -68,6 +72,7 @@ "eslint-plugin-flowtype": "^3.4.2", "flow-bin": "^0.95.1", "flow-typed": "^2.5.1", + "jest": "^24.5.0", "npm-run-all": "^4.1.5", "standard": "12.0.1" }, diff --git a/rpc/_autoloader.js b/rpc/_autoloader.js index dee254c..bf41f1d 100644 --- a/rpc/_autoloader.js +++ b/rpc/_autoloader.js @@ -18,6 +18,9 @@ export default (ctx: AppContext, forceClear: ?boolean = false): { const filename = path.basename(a) const dirname = path.dirname(a) + const pathname = a.replace('rpc/', '') + delete require.cache[require.resolve(pathname)] + // internal stuff if (filename.startsWith('_')) { log.debug(`skipping ${a}`) @@ -37,10 +40,6 @@ export default (ctx: AppContext, forceClear: ?boolean = false): { log.debug(`mounting ${a}`) try { - const pathname = a.replace('rpc/', '') - - delete require.cache[require.resolve(pathname)] - const r = require(pathname) let o = r if (o.default) { diff --git a/rpc/_security.js b/rpc/_security.js new file mode 100644 index 0000000..4cc5634 --- /dev/null +++ b/rpc/_security.js @@ -0,0 +1,42 @@ +// @flow +import { type AppContext } from '../Roleypoly' +import { type Context } from 'koa' +import RPCError from './_error' + +// import logger from '../logger' +// const log = logger(__filename) + +const PermissionError = new RPCError('User does not have permission to call this RPC.', 403) + +// export const bot = (fn: Function) => (secret: string, ...args: any[]) => { +// if (secret !== process.env.SHARED_SECRET) { +// log.error('unauthenticated bot request', { secret }) +// return { err: 'unauthenticated' } +// } + +// return fn(...args) +// } + +export const root = ($: AppContext, fn: Function) => (ctx: Context, ...args: any[]) => { + if ($.discord.isRoot(ctx.session.userId)) { + return fn(ctx, ...args) + } + + throw PermissionError +} + +export const manager = ($: AppContext, fn: Function) => (ctx: Context, server: string, ...args: any[]) => { + if ($.discord.canManageRoles(server, ctx.session.userId)) { + return fn(ctx, server, ...args) + } + + throw PermissionError +} + +export const member = ($: AppContext, fn: Function) => (ctx: Context, server: string, ...args: any[]) => { + if ($.discord.isMember(server, ctx.session.userId)) { + return fn(ctx, server, ...args) + } + + throw PermissionError +} diff --git a/rpc/index.js b/rpc/index.js index 1dbc315..11c0b92 100644 --- a/rpc/index.js +++ b/rpc/index.js @@ -86,6 +86,18 @@ export default class RPCServer { } } + /** + * For internally called stuff, such as from a bot shard. + */ + async call (fn: string, ...args: any[]) { + if (!(fn in this.rpcMap)) { + throw new RPCError(`RPC call ${fn}(...) not found.`, 404) + } + + const call = this.rpcMap[fn] + return call(...args) + } + rpcError (ctx: Context & {body: any}, msg: ?string, err: ?Error = null, code: ?number = null) { log.error('rpc error', { msg, err }) diff --git a/rpc/servers.js b/rpc/servers.js index 157bdff..d820dc3 100644 --- a/rpc/servers.js +++ b/rpc/servers.js @@ -1,17 +1,19 @@ // @flow import { type AppContext } from '../Roleypoly' import { type Context } from 'koa' -import { type Guild } from 'discord.js' +import { type Guild } from 'eris' +import { root } from './_security' export default ($: AppContext) => ({ - listRelevantServers (ctx: Context) { + + rootGetAllServers: root($, (ctx: Context) => { return $.discord.client.guilds.map<{ url: string, name: string, members: number, roles: number - }>((g: Guild) => ({ url: `${$.config.appUrl}/s/${g.id}`, name: g.name, members: g.members.array().length, roles: g.roles.array().length })) - }, + }>((g: Guild) => ({ url: `${$.config.appUrl}/s/${g.id}`, name: g.name, members: g.memberCount, roles: g.roles.size })) + }), getServerSlug (ctx: Context, id: string) { const srv = $.discord.client.guilds.get(id) diff --git a/services/discord.js b/services/discord.js index 3d82b11..19555df 100644 --- a/services/discord.js +++ b/services/discord.js @@ -1,18 +1,45 @@ // @flow import Service from './Service' +import type { AppContext } from '../Roleypoly' +import Bot from '../bot' +import Eris, { type Member, Role, type Guild, type Permission as ErisPermission } from 'eris' +import LRU from 'lru-cache' +// $FlowFixMe +import { OrderedSet } from 'immutable' import superagent from 'superagent' -// import invariant from 'invariant' -import { type AppContext } from '../Roleypoly' -import { - type Message, - type Guild, - type Role, - type GuildMember, - type Collection, - Client -} from 'discord.js' import type { AuthTokens } from './auth' +type DiscordServiceConfig = { + token: string, + clientId: string, + clientSecret: string, + rootUsers: Set, + isBot: boolean +} + +export type Permissions = { + canManageRoles: boolean, + isAdmin: boolean, + faked?: boolean, + __faked?: Permissions +} + +type CachedRole = { + id: string, + position: number +} + +type OAuthRequestData = { + grant_type: 'authorization_code', + code: string +} | { + grant_type: 'refresh_token', + refresh_token: string +} | { + grant_type: 'access_token', + token: string +} + export type UserPartial = { id: string, username: string, @@ -20,153 +47,201 @@ export type UserPartial = { avatar: string } -export type Permissions = { - isAdmin: boolean, - canManageRoles: boolean -} +export default class DiscordService extends Service { + ctx: AppContext + bot: Bot + client: Eris -type ChatCommandHandler = (message: Message, matches: string[], reply: (text: string) => Promise) => Promise|void -type ChatCommand = { - regex: RegExp, - handler: ChatCommandHandler -} + cfg: DiscordServiceConfig -class DiscordService extends Service { - botToken: string = process.env.DISCORD_BOT_TOKEN || '' - clientId: string = process.env.DISCORD_CLIENT_ID || '' - clientSecret: string = process.env.DISCORD_CLIENT_SECRET || '' - oauthCallback: string = process.env.OAUTH_AUTH_CALLBACK || '' - isBot: boolean = process.env.IS_BOT === 'true' + // a small cache of role data for checking viability + ownRoleCache: LRU + + oauthCallback: string - appUrl: string - botCallback: string - rootUsers: Set - client: Client - cmds: ChatCommand[] constructor (ctx: AppContext) { super(ctx) - this.appUrl = ctx.config.appUrl + this.ctx = ctx - this.oauthCallback = `${this.appUrl}/api/oauth/callback` - this.botCallback = `${this.appUrl}/api/oauth/bot/callback` - this.rootUsers = new Set((process.env.ROOT_USERS || '').split(',')) + this.cfg = { + rootUsers: new Set((process.env.ROOT_USERS || '').split(',')), + token: process.env.DISCORD_BOT_TOKEN || '', + clientId: process.env.DISCORD_CLIENT_ID || '', + clientSecret: process.env.DISCORD_CLIENT_SECRET || '', + isBot: process.env.IS_BOT === 'true' + } - this.client = new Client() - this.client.options.disableEveryone = true + this.oauthCallback = `${ctx.config.appUrl}/api/oauth/callback` - this._cmds() + this.ownRoleCache = new LRU() - this.startBot() - } - - ownGm (server: string) { - return this.gm(server, this.client.user.id) - } - - fakeGm ({ id = '0', nickname = '[none]', displayHexColor = '#ffffff' }: $Shape<{ id: string, nickname: string, displayHexColor: string }>) { // eslint-disable-line no-undef - return { id, nickname, displayHexColor, __faked: true, roles: { has () { return false } } } + if (this.cfg.isBot) { + this.client = new Eris(this.cfg.token, { + disableEveryone: true, + maxShards: 'auto', + messageLimit: 10, + disableEvents: { + CHANNEL_PINS_UPDATE: true, + USER_SETTINGS_UPDATE: true, + USER_NOTE_UPDATE: true, + RELATIONSHIP_ADD: true, + RELATIONSHIP_REMOVE: true, + GUILD_BAN_ADD: true, + GUILD_BAN_REMOVE: true, + TYPING_START: true, + MESSAGE_UPDATE: true, + MESSAGE_DELETE: true, + MESSAGE_DELETE_BULK: true, + VOICE_STATE_UPDATE: true + } + }) + this.bot = new Bot(this) + } else { + this.client = new Eris(`Bot ${this.cfg.token}`, { + restMode: true + }) + } } isRoot (id: string): boolean { - return this.rootUsers.has(id) + return this.cfg.rootUsers.has(id) } - async startBot () { - await this.client.login(this.botToken) - - // not all roleypolys are bots. - if (this.isBot) { - this.log.info('this roleypoly is a bot') - this.client.on('message', this.handleMessage.bind(this)) - this.client.on('guildCreate', this.handleJoin.bind(this)) - } - - for (let server of this.client.guilds.array()) { - await this.ctx.server.ensure(server) - } + getRelevantServers (user: string) { + return this.client.guilds.filter(guild => guild.members.has(user)) } - getRelevantServers (userId: string): Collection { - return this.client.guilds.filter((g) => g.members.has(userId)) + gm (serverId: string, userId: string): ?Member { + return this.client.guilds.get(serverId)?.members.get(userId) } - gm (serverId: string, userId: string): ?GuildMember { - const s = this.client.guilds.get(serverId) - if (s == null) { - return null - } - return s.members.get(userId) + ownGm (serverId: string) { + return this.gm(serverId, this.client.user.id) + } + + fakeGm ({ id = '0', nickname = '[none]', displayHexColor = '#ffffff' }: $Shape): $Shape { + return { id, nickname, displayHexColor, __faked: true, roles: { has () { return false } } } } getRoles (server: string) { - const s = this.client.guilds.get(server) - if (s == null) { - return null - } - return s.roles + return this.client.guilds.get(server)?.roles } - getPermissions (gm: GuildMember): Permissions { + getOwnPermHeight (server: Guild): number { + if (this.ownRoleCache.has(server)) { + return this.ownRoleCache.get(server).position + } + + const gm = this.ownGm(server.id) + const g = gm?.guild + const r: Role = OrderedSet(gm?.roles).map(id => g?.roles.get(id)).sortBy(r => r.position).last({ position: 0, id: '0' }) + this.ownRoleCache.set(server, { + id: r.id, + position: r.position + }) + + return r.position + } + + calcPerms (permable: Role | Member): Permissions { + const p: ErisPermission = (permable instanceof Role) ? permable.permissions : permable.permission + return { + isAdmin: p.has('administrator'), + canManageRoles: p.has('manageRoles') || p.has('administrator') + } + } + + getPermissions (gm: Member): Permissions { + const real = this.calcPerms(gm) + if (this.isRoot(gm.id)) { return { isAdmin: true, - canManageRoles: true + canManageRoles: true, + faked: true, + __faked: real } } - return { - isAdmin: gm.permissions.has('ADMINISTRATOR'), - canManageRoles: gm.permissions.has('MANAGE_ROLES', true) - } + return real } safeRole (server: string, role: string) { - const rl = this.getRoles(server) - if (rl == null) { - throw new Error(`safeRole can't see ${server}`) - } - const r: ?Role = rl.get(role) + const r = this.getRoles(server)?.get(role) if (r == null) { throw new Error(`safeRole can't find ${role} in ${server}`) } - return r.editable && !r.hasPermission('MANAGE_ROLES', false, true) + return this.roleIsEditable(r) && !this.calcPerms(r).canManageRoles } - // oauth step 2 flow, grab the auth token via code - async getAuthToken (code: string): Promise { - const url = 'https://discordapp.com/api/oauth2/token' - try { - const rsp = - await superagent - .post(url) - .set('Content-Type', 'application/x-www-form-urlencoded') - .send({ - client_id: this.clientId, - client_secret: this.clientSecret, - grant_type: 'authorization_code', - code: code, - redirect_uri: this.oauthCallback - }) + roleIsEditable (role: Role): boolean { + // role will be LOWER than my own + return this.getOwnPermHeight(role.guild) > role.position + } - return rsp.body + async oauthRequest (path: string, data: OAuthRequestData) { + const url = `https://discordapp.com/api/oauth2/${path}` + try { + const rsp = await superagent.post(url) + .set('Content-Type', 'application/x-www-form-urlencoded') + .set('User-Agent', 'DiscordBot (https://roleypoly.com, 2.x.x) OAuthHandler/1.0') + .send({ + client_id: this.cfg.clientId, + client_secret: this.cfg.clientSecret, + redirect_uri: this.oauthCallback, + ...data + }) + + return (rsp.body: AuthTokens) } catch (e) { - this.log.error('getAuthToken failed', e) + this.log.error('oauthRequest failed', { e, path }) throw e } } - async getUserFromToken (authToken?: string): Promise { + initializeOAuth (code: string) { + return this.oauthRequest('token', { + grant_type: 'authorization_code', + code + }) + } + + refreshOAuth ({ refreshToken }: { refreshToken: string }) { + return this.oauthRequest('token', { + grant_type: 'refresh_token', + refresh_token: refreshToken + }) + } + + revokeOAuth ({ accessToken }: { accessToken: string }) { + return this.oauthRequest('token/revoke', { + grant_type: 'access_token', + token: accessToken + }) + } + + getUserPartial (userId: string): ?UserPartial { + const u = this.client.users.get(userId) + if (u == null) { + return null + } + + return { + username: u.username, + discriminator: u.discriminator, + avatar: u.avatarURL, + id: u.id + } + } + + async getUserFromToken (authToken: string): Promise { const url = 'https://discordapp.com/api/v6/users/@me' try { - if (authToken == null || authToken === '') { - throw new Error('not logged in') - } + const rsp = await superagent.get(url) + .set('User-Agent', 'DiscordBot (https://roleypoly.com, 2.x.x) OAuthHandler/1.0') + .set('Authorization', `Bearer ${authToken}`) - const rsp = - await superagent - .get(url) - .set('Authorization', `Bearer ${authToken}`) return rsp.body } catch (e) { this.log.error('getUser error', e) @@ -174,142 +249,19 @@ class DiscordService extends Service { } } - getUserPartial (userId: string): ?UserPartial { - const U = this.client.users.get(userId) - if (U == null) { - return null - } - - return { - username: U.username, - discriminator: U.discriminator, - avatar: U.displayAvatarURL, - id: U.id - } - } - - async refreshOAuth ({ refreshToken }: { refreshToken: string }): Promise { - const url = 'https://discordapp.com/api/oauth2/token' - try { - const rsp = - await superagent - .post(url) - .set('Content-Type', 'application/x-www-form-urlencoded') - .send({ - client_id: this.clientId, - client_secret: this.clientSecret, - grant_type: 'refresh_token', - refresh_token: refreshToken, - redirect_uri: this.oauthCallback - }) - - return rsp.body - } catch (e) { - this.log.error('refreshOAuth failed', e) - throw e - } - } - - async revokeOAuth ({ accessToken }: { accessToken: string }) { - const url = 'https://discordapp.com/api/oauth2/token/revoke' - try { - const rsp = - await superagent - .post(url) - .set('Content-Type', 'application/x-www-form-urlencoded') - .send({ - client_id: this.clientId, - client_secret: this.clientSecret, - grant_type: 'access_token', - token: accessToken, - redirect_uri: this.oauthCallback - }) - - return rsp.body - } catch (e) { - this.log.error('revokeOAuth failed', e) - throw e - } - } - - // returns oauth authorize url with IDENTIFY permission - // we only need IDENTIFY because we only use it for matching IDs from the bot getAuthUrl (state: string): string { - return `https://discordapp.com/oauth2/authorize?client_id=${this.clientId}&redirect_uri=${this.oauthCallback}&response_type=code&scope=identify&state=${state}` + return `https://discordapp.com/oauth2/authorize?client_id=${this.cfg.clientId}&redirect_uri=${this.oauthCallback}&response_type=code&scope=identify&state=${state}` } // returns the bot join url with MANAGE_ROLES permission // MANAGE_ROLES is the only permission we really need. getBotJoinUrl (): string { - return `https://discordapp.com/oauth2/authorize?client_id=${this.clientId}&scope=bot&permissions=268435456` + return `https://discordapp.com/oauth2/authorize?client_id=${this.cfg.clientId}&scope=bot&permissions=268435456` } - mentionResponse (message: Message) { - message.channel.send(`🔰 Assign your roles here! ${this.appUrl}/s/${message.guild.id}`, { disableEveryone: true }) - } - - _cmds () { - const cmds = [ - { - regex: /say (.*)/, - handler (message, matches, r) { - r(matches[0]) - } - }, - { - regex: /set username (.*)/, - async handler (message, matches) { - const { username } = this.client.user - await this.client.user.setUsername(matches[0]) - message.channel.send(`Username changed from ${username} to ${matches[0]}`) - } - }, - { - regex: /stats/, - async handler (message, matches) { - const t = [ - `**Stats** 📈`, - '', - `👩‍❤️‍👩 **Users Served:** ${this.client.guilds.reduce((acc, g) => acc + g.memberCount, 0)}`, - `🔰 **Servers:** ${this.client.guilds.size}`, - `💮 **Roles Seen:** ${this.client.guilds.reduce((acc, g) => acc + g.roles.size, 0)}` - ] - message.channel.send(t.join('\n')) - } - } - ] - // prefix regex with ^ for ease of code - .map(({ regex, ...rest }) => ({ regex: new RegExp(`^${regex.source}`, regex.flags), ...rest })) - - this.cmds = cmds - return cmds - } - - async handleCommand (message: Message) { - const cmd = message.content.replace(`<@${this.client.user.id}> `, '') - this.log.debug(`got command from ${message.author.username}`, cmd) - for (let { regex, handler } of this.cmds) { - const match = regex.exec(cmd) - if (match !== null) { - this.log.debug('command accepted', { cmd, match }) - try { - await handler.call(this, message, match.slice(1)) - return - } catch (e) { - this.log.error('command errored', { e, cmd, message }) - message.channel.send(`❌ **An error occured.** ${e}`) - return - } - } - } - - // nothing matched? - this.mentionResponse(message) - } - - async issueChallenge (message: Message) { + async issueChallenge (author: string) { // Create a challenge - const chall = await this.ctx.auth.createDMChallenge(message.author.id) + const chall = await this.ctx.auth.createDMChallenge(author) const randomLines = [ '🐄 A yellow cow is only as bright as it lets itself be. ✨', @@ -324,7 +276,7 @@ class DiscordService extends Service { '🛠 I am completely open source, check me out!~ ' ] - message.channel.send([ + return ([ '**Hey there!** ', '', `Use this secret code: **${chall.human}**`, @@ -336,37 +288,11 @@ class DiscordService extends Service { ].join('\n')) } - handleDM (message: Message) { - switch (message.content.toLowerCase()) { - case 'login': - case 'auth': - case 'log in': - this.issueChallenge(message) - } + canManageRoles (server: string, user: string) { + return this.getPermissions(this.gm(server, user)).canManageRoles } - handleMessage (message: Message) { - if (message.author.bot) { // drop bot messages - return - } - - if (message.channel.type === 'dm') { - // handle dm - return this.handleDM(message) - } - - if (message.mentions.users.has(this.client.user.id)) { - if (this.rootUsers.has(message.author.id)) { - this.handleCommand(message) - } else { - this.mentionResponse(message) - } - } - } - - async handleJoin (guild: Guild) { - await this.ctx.server.ensure(guild) + isMember (server: string, user: string) { + return this.gm(server, user) != null } } - -module.exports = DiscordService diff --git a/services/presentation.js b/services/presentation.js index 6ab527e..b9a3208 100644 --- a/services/presentation.js +++ b/services/presentation.js @@ -7,9 +7,9 @@ import { type ServerModel } from '../models/Server' import type DiscordService, { Permissions } from './discord' import { type Guild, - type GuildMember, + type Member, type Collection -} from 'discord.js' +} from 'eris' import areduce from '../util/areduce' export type ServerSlug = { @@ -60,21 +60,6 @@ class PresentationService extends Service { } } - async oldPresentableServers (collection: Collection, userId: string) { - this.log.deprecated('use presentableServers instead of oldPresentableServers') - - let servers = [] - - for (let server of collection.array()) { - const gm = server.members.get(userId) - - // $FlowFixMe this is deprecated, forget adding more check code. - servers.push(await this.presentableServer(server, gm)) - } - - return servers - } - presentableServers (collection: Collection, userId: string) { return areduce(collection.array(), async (acc, server) => { const gm = server.members.get(userId) @@ -87,7 +72,7 @@ class PresentationService extends Service { }, []) } - async presentableServer (server: Guild, gm: GuildMember, { incRoles = true }: { incRoles: boolean } = {}): Promise { + async presentableServer (server: Guild, gm: Member, { incRoles = true }: { incRoles: boolean } = {}): Promise { const sd = await this.ctx.server.get(server.id) return { diff --git a/services/server.js b/services/server.js index ed8bf07..f12967f 100644 --- a/services/server.js +++ b/services/server.js @@ -4,7 +4,7 @@ import { type AppContext } from '../Roleypoly' import type PresentationService from './presentation' import { type Guild -} from 'discord.js' +} from 'eris' import { type ServerModel, type Category } from '../models/Server' export default class ServerService extends Service { diff --git a/ui/.babelrc b/ui/.babelrc index dac5dd0..9b6db32 100644 --- a/ui/.babelrc +++ b/ui/.babelrc @@ -3,6 +3,7 @@ "next/babel", "@babel/preset-flow" ], "plugins": [ - [ "styled-components", { "ssr": true } ] + [ "styled-components", { "ssr": true } ], + "@babel/plugin-proposal-optional-chaining" ] } diff --git a/yarn.lock b/yarn.lock index cb55dec..15f6b2e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -46,6 +46,37 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.1.0", "@babel/core@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.0.tgz#248fd6874b7d755010bfe61f557461d4f446d9e9" + integrity sha512-Dzl7U0/T69DFOTwqz/FJdnOSWS57NpjNfCwMKHABr589Lg8uX1RrlBIJ7L5Dubt/xkLsx0xH5EBFzlBVes1ayA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.0" + "@babel/parser" "^7.4.0" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.0.0", "@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== + dependencies: + "@babel/types" "^7.4.0" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/generator@^7.1.2", "@babel/generator@^7.2.2": version "7.3.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.3.tgz#185962ade59a52e00ca2bdfcfd1d58e528d4e39e" @@ -57,17 +88,6 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" - integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== - dependencies: - "@babel/types" "^7.4.0" - jsesc "^2.5.1" - lodash "^4.17.11" - source-map "^0.5.0" - trim-right "^1.0.1" - "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -294,6 +314,15 @@ "@babel/traverse" "^7.1.5" "@babel/types" "^7.3.0" +"@babel/helpers@^7.4.0": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.2.tgz#3bdfa46a552ca77ef5a0f8551be5f0845ae989be" + integrity sha512-gQR1eQeroDzFBikhrCccm5Gs2xBjZ57DNjGbqTaHo911IpmSxflOQWMAHPw/TXk8L3isv7s9lYzUkexOeTQUYg== + dependencies: + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" + "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -319,6 +348,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.3.tgz#092d450db02bdb6ccb1ca8ffd47d8774a91aef87" integrity sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg== +"@babel/parser@^7.1.0": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.2.tgz#b4521a400cb5a871eab3890787b4bc1326d38d91" + integrity sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g== + "@babel/parser@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.0.tgz#6de669e73ac3a32c754280d0fef8fca6aad2c416" @@ -393,6 +427,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" +"@babel/plugin-proposal-optional-chaining@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz#ae454f4c21c6c2ce8cb2397dc332ae8b420c5441" + integrity sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex@^7.0.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" @@ -474,6 +516,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-optional-chaining@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz#a59d6ae8c167e7608eaa443fda9fa8fa6bf21dff" + integrity sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" @@ -691,10 +740,10 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz#140b52985b2d6ef0cb092ef3b29502b990f9cd50" - integrity sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz#800391136d6cbcc80728dbdba3c1c6e46f86c12e" + integrity sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ== dependencies: regexp-tree "^0.1.0" @@ -905,10 +954,10 @@ js-levenshtein "^1.1.3" semver "^5.3.0" -"@babel/preset-env@^7.4.1": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.1.tgz#80e19ad76f62fb136d57ee4b963db3e8a6840bad" - integrity sha512-uC2DeVb6ljdjBGhJCyHxNZfSJEVgPdUm2R5cX85GCl1Qreo5sMM5g85ntqtzRF7XRYGgnRmV5we9cdlvo1wJvg== +"@babel/preset-env@^7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.2.tgz#2f5ba1de2daefa9dcca653848f96c7ce2e406676" + integrity sha512-OEz6VOZaI9LW08CWVS3d9g/0jZA6YCn1gsKIy/fut7yZCJti5Lm1/Hi+uo/U+ODm7g4I6gULrCP+/+laT8xAsA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -938,7 +987,7 @@ "@babel/plugin-transform-modules-commonjs" "^7.4.0" "@babel/plugin-transform-modules-systemjs" "^7.4.0" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.2" "@babel/plugin-transform-new-target" "^7.4.0" "@babel/plugin-transform-object-super" "^7.2.0" "@babel/plugin-transform-parameters" "^7.4.0" @@ -1026,6 +1075,15 @@ "@babel/parser" "^7.1.2" "@babel/types" "^7.1.2" +"@babel/template@^7.0.0", "@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" @@ -1083,18 +1141,19 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + "@discordjs/uws@^11.149.1": version "11.149.1" resolved "https://registry.yarnpkg.com/@discordjs/uws/-/uws-11.149.1.tgz#2e86f2825f43bed43d2e69eaf30a07d2dd8e8946" integrity sha512-TmbwZaeXDSCq0ckmf2q10Fkt1220gu9AZJ/UvtQjsi2jyJDjy0i0OwL4/eb3vc9Cwr0mpC9EbfzltQ2si0qUiQ== -"@emotion/is-prop-valid@^0.6.8": - version "0.6.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.6.8.tgz#68ad02831da41213a2089d2cab4e8ac8b30cbd85" - integrity sha512-IMSL7ekYhmFlILXcouA6ket3vV7u9BqStlXzbKOF9HBtpUPMMlHU+bBxrLOa2NvleVwNIxeq/zL8LafLbeUXcA== - dependencies: - "@emotion/memoize" "^0.6.6" - "@emotion/is-prop-valid@^0.7.3": version "0.7.3" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz#a6bf4fa5387cbba59d44e698a4680f481a8da6cc" @@ -1107,11 +1166,6 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz#e93c13942592cf5ef01aa8297444dc192beee52f" integrity sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg== -"@emotion/memoize@^0.6.6": - version "0.6.6" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.6.6.tgz#004b98298d04c7ca3b4f50ca2035d4f60d2eed1b" - integrity sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ== - "@emotion/unitless@^0.7.0": version "0.7.3" resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.3.tgz#6310a047f12d21a1036fb031317219892440416f" @@ -1124,6 +1178,143 @@ dependencies: prop-types "^15.6.1" +"@jest/console@^24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.3.0.tgz#7bd920d250988ba0bf1352c4493a48e1cb97671e" + integrity sha512-NaCty/OOei6rSDcbPdMiCbYCI0KGFGPgGO6B09lwWt5QTxnkuhKYET9El5u5z1GAcSxkQmSMtM63e24YabCWqA== + dependencies: + "@jest/source-map" "^24.3.0" + "@types/node" "*" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.5.0.tgz#2cefc6a69e9ebcae1da8f7c75f8a257152ba1ec0" + integrity sha512-RDZArRzAs51YS7dXG1pbXbWGxK53rvUu8mCDYsgqqqQ6uSOaTjcVyBl2Jce0exT2rSLk38ca7az7t2f3b0/oYQ== + dependencies: + "@jest/console" "^24.3.0" + "@jest/reporters" "^24.5.0" + "@jest/test-result" "^24.5.0" + "@jest/transform" "^24.5.0" + "@jest/types" "^24.5.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.5.0" + jest-config "^24.5.0" + jest-haste-map "^24.5.0" + jest-message-util "^24.5.0" + jest-regex-util "^24.3.0" + jest-resolve-dependencies "^24.5.0" + jest-runner "^24.5.0" + jest-runtime "^24.5.0" + jest-snapshot "^24.5.0" + jest-util "^24.5.0" + jest-validate "^24.5.0" + jest-watcher "^24.5.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + pirates "^4.0.1" + realpath-native "^1.1.0" + rimraf "^2.5.4" + strip-ansi "^5.0.0" + +"@jest/environment@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.5.0.tgz#a2557f7808767abea3f9e4cc43a172122a63aca8" + integrity sha512-tzUHR9SHjMXwM8QmfHb/EJNbF0fjbH4ieefJBvtwO8YErLTrecc1ROj0uo2VnIT6SlpEGZnvdCK6VgKYBo8LsA== + dependencies: + "@jest/fake-timers" "^24.5.0" + "@jest/transform" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/node" "*" + jest-mock "^24.5.0" + +"@jest/fake-timers@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.5.0.tgz#4a29678b91fd0876144a58f8d46e6c62de0266f0" + integrity sha512-i59KVt3QBz9d+4Qr4QxsKgsIg+NjfuCjSOWj3RQhjF5JNy+eVJDhANQ4WzulzNCHd72srMAykwtRn5NYDGVraw== + dependencies: + "@jest/types" "^24.5.0" + "@types/node" "*" + jest-message-util "^24.5.0" + jest-mock "^24.5.0" + +"@jest/reporters@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.5.0.tgz#9363a210d0daa74696886d9cb294eb8b3ad9b4d9" + integrity sha512-vfpceiaKtGgnuC3ss5czWOihKOUSyjJA4M4udm6nH8xgqsuQYcyDCi4nMMcBKsHXWgz9/V5G7iisnZGfOh1w6Q== + dependencies: + "@jest/environment" "^24.5.0" + "@jest/test-result" "^24.5.0" + "@jest/transform" "^24.5.0" + "@jest/types" "^24.5.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-api "^2.1.1" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-source-maps "^3.0.1" + jest-haste-map "^24.5.0" + jest-resolve "^24.5.0" + jest-runtime "^24.5.0" + jest-util "^24.5.0" + jest-worker "^24.4.0" + node-notifier "^5.2.1" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" + integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.5.0.tgz#ab66fb7741a04af3363443084e72ea84861a53f2" + integrity sha512-u66j2vBfa8Bli1+o3rCaVnVYa9O8CAFZeqiqLVhnarXtreSXG33YQ6vNYBogT7+nYiFNOohTU21BKiHlgmxD5A== + dependencies: + "@jest/console" "^24.3.0" + "@jest/types" "^24.5.0" + "@types/istanbul-lib-coverage" "^1.1.0" + +"@jest/transform@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.5.0.tgz#6709fc26db918e6af63a985f2cc3c464b4cf99d9" + integrity sha512-XSsDz1gdR/QMmB8UCKlweAReQsZrD/DK7FuDlNo/pE8EcKMrfi2kqLRk8h8Gy/PDzgqJj64jNEzOce9pR8oj1w== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.5.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.5.0" + jest-regex-util "^24.3.0" + jest-util "^24.5.0" + micromatch "^3.1.10" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.5.0.tgz#feee214a4d0167b0ca447284e95a57aa10b3ee95" + integrity sha512-kN7RFzNMf2R8UDadPOl6ReyI+MT8xfqRuAnuVL+i4gwjv/zubdDK+EDeLHYwq1j0CSSR2W/MmgaRlMZJzXdmVA== + dependencies: + "@types/istanbul-lib-coverage" "^1.1.0" + "@types/yargs" "^12.0.9" + "@octokit/rest@^15.2.6": version "15.18.1" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.1.tgz#ec7fb0f8775ef64dc095fae6635411d3fbff9b62" @@ -1139,10 +1330,10 @@ universal-user-agent "^2.0.0" url-template "^2.0.8" -"@primer/components@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@primer/components/-/components-11.0.0.tgz#ae8d4bfe6ecb86bba7f0c79d1bc4cc8ce1b9cb88" - integrity sha512-dPRUgcx1BjnKc7u6FSH8ytMMXXYDhNMWP/R/vzaMSCGdVwiQHY8yPGaFNEjp9GOMUQCd5/DRrgvzvzvgeE022w== +"@primer/components@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@primer/components/-/components-12.0.0.tgz#662b5322602cf715d821287a191678c88e993fe2" + integrity sha512-kzqUQzCV2/oeZ2m953fWt3whtVLo8Dc801fju2NsUl+h9NemtQph+n0FDAKb4UaXLTfNUb2rXlnHHeU/Ab5SVw== dependencies: "@githubprimer/octicons-react" "8.1.2" babel-plugin-macros "2.4.2" @@ -1155,15 +1346,62 @@ react "16.8.0" react-bodymovin "2.0.0" react-dom "16.8.0" - styled-components "4.1.2" styled-system "3.1.3" system-components "3.0.1" +"@types/babel__core@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.0.tgz#710f2487dda4dcfd010ca6abb2b4dc7394365c51" + integrity sha512-wJTeJRt7BToFx3USrCDs2BhEi4ijBInTQjOIukj6a/5tEkwpFMVZ+1ppgmE+Q/FQyc5P/VWUbx7I9NELrKruHA== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" + integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" + integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/istanbul-lib-coverage@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#2cc2ca41051498382b43157c8227fea60363f94a" + integrity sha512-ohkhb9LehJy+PA40rDtGAji61NCgdtKLAlFoYp4cnuuQEswwdK3vz9SOIkkyc3wrk8dzjphQApNs56yyXLStaQ== + "@types/node@*": version "10.12.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.1.tgz#da61b64a2930a80fa708e57c45cd5441eb379d5b" integrity sha512-i1sl+WCX2OCHeUi9oi7PiCNUtYFrpWhpcx878vpeq/tlZTKzcFdHePlyFHVbWqeuKN0SRPl/9ZFDSTsfv9h7VQ== +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": + version "12.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.10.tgz#17a8ec65cd8e88f51b418ceb271af18d3137df67" + integrity sha512-WsVzTPshvCSbHThUduGGxbmnwcpkgSctHGHTqzWyFg4lYAuV5qXlyFPOsP3OWqCINfmg/8VXP+zJaa4OxEsBQQ== + "@webassemblyjs/ast@1.7.11": version "1.7.11" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -1317,6 +1555,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1335,12 +1578,30 @@ acorn-dynamic-import@^4.0.0: resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== +acorn-globals@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" + integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + acorn-jsx@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== -acorn@^6.0.2: +acorn-walk@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1, acorn@^6.0.2: version "6.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== @@ -1417,12 +1678,17 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -1442,6 +1708,13 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +append-transform@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" + integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== + dependencies: + default-require-extensions "^2.0.0" + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -1487,6 +1760,11 @@ array-differ@^1.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" @@ -1532,7 +1810,7 @@ arraybuffer.slice@~0.0.7: resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -arrify@^1.0.0: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= @@ -1575,6 +1853,11 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + async-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -1592,6 +1875,13 @@ async-sema@2.1.4: dependencies: double-ended-queue "2.1.0-0" +async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1654,6 +1944,19 @@ babel-eslint@^10.0.1: eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" +babel-jest@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.5.0.tgz#0ea042789810c2bec9065f7c8ab4dc18e1d28559" + integrity sha512-0fKCXyRwxFTJL0UXDJiT2xYxO9Lu2vBd9n+cC+eDjESzcVG3s2DRGAxbzJX21fceB1WYoBjAh8pQ83dKcl003g== + dependencies: + "@jest/transform" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.3.0" + chalk "^2.4.2" + slash "^2.0.0" + babel-loader@8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.2.tgz#2079b8ec1628284a929241da3d90f5b3de2a5ae5" @@ -1664,6 +1967,22 @@ babel-loader@8.0.2: mkdirp "^0.5.1" util.promisify "^1.0.0" +babel-plugin-istanbul@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz#7981590f1956d75d67630ba46f0c22493588c893" + integrity sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ== + dependencies: + find-up "^3.0.0" + istanbul-lib-instrument "^3.0.0" + test-exclude "^5.0.0" + +babel-plugin-jest-hoist@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.3.0.tgz#f2e82952946f6e40bb0a75d266a3790d854c8b5b" + integrity sha512-nWh4N1mVH55Tzhx2isvUN5ebM5CDUvIpXPZYMRazQughie/EqGnbR+czzoQlhUmJG9pPJmYDRhvocotb2THl1w== + dependencies: + "@types/babel__traverse" "^7.0.6" + babel-plugin-macros@2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.4.2.tgz#21b1a2e82e2130403c5ff785cba6548e9b644b28" @@ -1719,6 +2038,14 @@ babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" +babel-preset-jest@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.3.0.tgz#db88497e18869f15b24d9c0e547d8e0ab950796d" + integrity sha512-VGTV2QYBa/Kn3WCOKdfS31j9qomaXSgJqi65B6o05/1GsJyj9LVhSljM9ro4S+IBGj/ENhNBuH9bpqzztKAQSw== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.3.0" + babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -1906,6 +2233,18 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -1983,6 +2322,13 @@ browserslist@^4.4.2, browserslist@^4.5.1: electron-to-chromium "^1.3.116" node-releases "^1.1.11" +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= + dependencies: + node-int64 "^0.4.0" + btoa-lite@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" @@ -2053,6 +2399,13 @@ buffers@~0.1.1: resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= +bufferutil@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" + integrity sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA== + dependencies: + node-gyp-build "~3.7.0" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -2142,11 +2495,21 @@ callsites@^2.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= +callsites@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" + integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== + camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= +camelcase@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" + integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ== + camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -2162,6 +2525,13 @@ caniuse-lite@^1.0.30000949: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000951.tgz#c7c2fd4d71080284c8677dd410368df8d83688fe" integrity sha512-eRhP+nQ6YUkIcNQ6hnvdhMkdc7n3zadog0KXNRxAZTT2kHjUb1yGn71OrPhSn8MOvlX97g5CR97kGVj8fMsXWg== +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + case-sensitive-paths-webpack-plugin@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.2.tgz#c899b52175763689224571dad778742e133f0192" @@ -2179,7 +2549,7 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" -chalk@2.4.2, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2249,6 +2619,11 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -2298,6 +2673,15 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + cls-bluebird@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee" @@ -2379,7 +2763,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.8.1: +commander@^2.8.1, commander@~2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== @@ -2394,6 +2778,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +compare-versions@^3.2.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" + integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== + component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" @@ -2463,7 +2852,7 @@ content-type@^1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@1.6.0, convert-source-map@^1.1.0: +convert-source-map@1.6.0, convert-source-map@^1.1.0, convert-source-map@^1.4.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -2645,6 +3034,18 @@ css-to-react-native@^2.2.2: css-color-keywords "^1.0.0" postcss-value-parser "^3.3.0" +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== + +cssstyle@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.1.tgz#3aceb2759eaf514ac1a21628d723d6043a819495" + integrity sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A== + dependencies: + cssom "0.3.x" + cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -2669,6 +3070,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -2714,7 +3124,7 @@ debug@~4.1.0: dependencies: ms "^2.1.1" -decamelize@^1.1.1: +decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -2746,6 +3156,13 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +default-require-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" + integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= + dependencies: + strip-bom "^3.0.0" + define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -2855,6 +3272,16 @@ detect-libc@^1.0.2, detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +diff-sequences@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" + integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -2864,17 +3291,6 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -discord.js@^11.4.2: - version "11.4.2" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-11.4.2.tgz#54586981926521572051f2a30b984aad2b49786e" - integrity sha512-MDwpu0lMFTjqomijDl1Ed9miMQe6kB4ifKdP28QZllmLv/HVOJXhatRgjS8urp/wBlOfx+qAYSXcdI5cKGYsfg== - dependencies: - long "^4.0.0" - prism-media "^0.0.3" - snekfetch "^3.6.4" - tweetnacl "^1.0.0" - ws "^4.0.0" - doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" @@ -2895,6 +3311,13 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + dotenv@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c" @@ -3039,9 +3462,19 @@ enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" -erlpack@hammerandchisel/erlpack: +eris@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/eris/-/eris-0.9.0.tgz#a2796839f7768cd40645c2c6b1bf0c86ba3147f3" + integrity sha512-U3/fv/wF2nA7Pc003v2cMXfTXvz8OySZYE21Zpx3ipm5sKbHWjcwDGdNXbp2Nb7fUip/IIjA/5540YDcqyQSvQ== + dependencies: + ws "^6.0.0" + optionalDependencies: + opusscript "^0.0.4" + tweetnacl "^1.0.0" + +erlpack@discordapp/erlpack: version "0.1.0" - resolved "https://codeload.github.com/hammerandchisel/erlpack/tar.gz/674ebfd3439ba4b7ce616709821d27630f7cdc61" + resolved "https://codeload.github.com/discordapp/erlpack/tar.gz/674ebfd3439ba4b7ce616709821d27630f7cdc61" dependencies: bindings "^1.2.1" nan "^2.1.0" @@ -3119,6 +3552,18 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-standard-jsx@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz#90c9aa16ac2c4f8970c13fc7efc608bacd02da70" @@ -3288,6 +3733,11 @@ espree@^4.0.0: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -3307,7 +3757,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= @@ -3327,6 +3777,11 @@ event-source-polyfill@0.0.12: resolved "https://registry.yarnpkg.com/event-source-polyfill/-/event-source-polyfill-0.0.12.tgz#e539cd67fdef2760a16aa5262fa98134df52e3af" integrity sha1-5TnNZ/3vJ2ChaqUmL6mBNN9S468= +eventemitter3@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + events@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" @@ -3340,6 +3795,11 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -3353,6 +3813,24 @@ execa@^0.10.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -3371,6 +3849,18 @@ expand-template@^1.0.2: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.1.tgz#981f188c0c3a87d2e28f559bc541426ff94f21dd" integrity sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg== +expect@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.5.0.tgz#492fb0df8378d8474cc84b827776b069f46294ed" + integrity sha512-p2Gmc0CLxOgkyA93ySWmHFYHUPFIHG6XZ06l7WArWAsrqYVaVEkOU5NtT5i68KUyGKbkQgDCkiT65bWmdoL6Bw== + dependencies: + "@jest/types" "^24.5.0" + ansi-styles "^3.2.0" + jest-get-type "^24.3.0" + jest-matcher-utils "^24.5.0" + jest-message-util "^24.5.0" + jest-regex-util "^24.3.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -3444,6 +3934,13 @@ fast-redux@^0.7.1: resolved "https://registry.yarnpkg.com/fast-redux/-/fast-redux-0.7.1.tgz#10e1fb6977032ed2da35f50b61db866c4d6d591a" integrity sha512-ojkXsXcKuUZclvFJD3K0mKMkHvo7HMZ0PdeKANf4qSQXRFc2VwmquSbAGAwKDO8ZM3HbNBmQFpJQD8uLvLx/aw== +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + dependencies: + bser "^2.0.0" + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -3464,6 +3961,14 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +fileset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -3712,6 +4217,13 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -3749,7 +4261,7 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -3819,6 +4331,22 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.4, graceful-fs@^4.1.6: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +handlebars@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.1.tgz#6e4e41c18ebe7719ae4d38e5aca3d32fa3dd23d3" + integrity sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -3972,6 +4500,13 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" @@ -4056,7 +4591,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.17, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4113,6 +4648,14 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -4187,6 +4730,11 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -4233,6 +4781,13 @@ is-callable@^1.1.3, is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-class-hotfix@~0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz#a527d31fb23279281dde5f385c77b5de70a72435" @@ -4316,6 +4871,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-generator-fn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.0.0.tgz#038c31b774709641bda678b1f06a4e3227c10b3e" + integrity sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g== + is-generator-function-name@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-generator-function-name/-/is-generator-function-name-1.0.0.tgz#254fff9ff56b5dd9a78c129453ab19e593b62f3e" @@ -4441,6 +5001,11 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -4478,6 +5043,77 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +istanbul-api@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.1.tgz#194b773f6d9cbc99a9258446848b0f988951c4d0" + integrity sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw== + dependencies: + async "^2.6.1" + compare-versions "^3.2.1" + fileset "^2.0.3" + istanbul-lib-coverage "^2.0.3" + istanbul-lib-hook "^2.0.3" + istanbul-lib-instrument "^3.1.0" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.2" + istanbul-reports "^2.1.1" + js-yaml "^3.12.0" + make-dir "^1.3.0" + minimatch "^3.0.4" + once "^1.4.0" + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#0b891e5ad42312c2b9488554f603795f9a2211ba" + integrity sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw== + +istanbul-lib-hook@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz#e0e581e461c611be5d0e5ef31c5f0109759916fb" + integrity sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA== + dependencies: + append-transform "^1.0.0" + +istanbul-lib-instrument@^3.0.0, istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz#a2b5484a7d445f1f311e93190813fa56dfb62971" + integrity sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA== + dependencies: + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.3" + semver "^5.5.0" + +istanbul-lib-report@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz#bfd324ee0c04f59119cb4f07dab157d09f24d7e4" + integrity sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA== + dependencies: + istanbul-lib-coverage "^2.0.3" + make-dir "^1.3.0" + supports-color "^6.0.0" + +istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz#f1e817229a9146e8424a28e5d69ba220fda34156" + integrity sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.3" + make-dir "^1.3.0" + rimraf "^2.6.2" + source-map "^0.6.1" + +istanbul-reports@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.1.1.tgz#72ef16b4ecb9a4a7bd0e2001e00f95d1eec8afa9" + integrity sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw== + dependencies: + handlebars "^4.1.0" + isurl@^1.0.0-alpha5: version "1.0.0" resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" @@ -4486,6 +5122,356 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" +jest-changed-files@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.5.0.tgz#4075269ee115d87194fd5822e642af22133cf705" + integrity sha512-Ikl29dosYnTsH9pYa1Tv9POkILBhN/TLZ37xbzgNsZ1D2+2n+8oEZS2yP1BrHn/T4Rs4Ggwwbp/x8CKOS5YJOg== + dependencies: + "@jest/types" "^24.5.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.5.0.tgz#598139d3446d1942fb7dc93944b9ba766d756d4b" + integrity sha512-P+Jp0SLO4KWN0cGlNtC7JV0dW1eSFR7eRpoOucP2UM0sqlzp/bVHeo71Omonvigrj9AvCKy7NtQANtqJ7FXz8g== + dependencies: + "@jest/core" "^24.5.0" + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.5.0" + jest-util "^24.5.0" + jest-validate "^24.5.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^12.0.2" + +jest-config@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.5.0.tgz#404d1bc6bb81aed6bd1890d07e2dca9fbba2e121" + integrity sha512-t2UTh0Z2uZhGBNVseF8wA2DS2SuBiLOL6qpLq18+OZGfFUxTM7BzUVKyHFN/vuN+s/aslY1COW95j1Rw81huOQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.5.0" + babel-jest "^24.5.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.5.0" + jest-environment-node "^24.5.0" + jest-get-type "^24.3.0" + jest-jasmine2 "^24.5.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.5.0" + jest-util "^24.5.0" + jest-validate "^24.5.0" + micromatch "^3.1.10" + pretty-format "^24.5.0" + realpath-native "^1.1.0" + +jest-diff@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.5.0.tgz#a2d8627964bb06a91893c0fbcb28ab228c257652" + integrity sha512-mCILZd9r7zqL9Uh6yNoXjwGQx0/J43OD2vvWVKwOEOLZliQOsojXwqboubAQ+Tszrb6DHGmNU7m4whGeB9YOqw== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.3.0" + jest-get-type "^24.3.0" + pretty-format "^24.5.0" + +jest-docblock@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" + integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.5.0.tgz#da14d017a1b7d0f01fb458d338314cafe7f72318" + integrity sha512-6gy3Kh37PwIT5sNvNY2VchtIFOOBh8UCYnBlxXMb5sr5wpJUDPTUATX2Axq1Vfk+HWTMpsYPeVYp4TXx5uqUBw== + dependencies: + "@jest/types" "^24.5.0" + chalk "^2.0.1" + jest-get-type "^24.3.0" + jest-util "^24.5.0" + pretty-format "^24.5.0" + +jest-environment-jsdom@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.5.0.tgz#1c3143063e1374100f8c2723a8b6aad23b6db7eb" + integrity sha512-62Ih5HbdAWcsqBx2ktUnor/mABBo1U111AvZWcLKeWN/n/gc5ZvDBKe4Og44fQdHKiXClrNGC6G0mBo6wrPeGQ== + dependencies: + "@jest/environment" "^24.5.0" + "@jest/fake-timers" "^24.5.0" + "@jest/types" "^24.5.0" + jest-mock "^24.5.0" + jest-util "^24.5.0" + jsdom "^11.5.1" + +jest-environment-node@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.5.0.tgz#763eebdf529f75b60aa600c6cf8cb09873caa6ab" + integrity sha512-du6FuyWr/GbKLsmAbzNF9mpr2Iu2zWSaq/BNHzX+vgOcts9f2ayXBweS7RAhr+6bLp6qRpMB6utAMF5Ygktxnw== + dependencies: + "@jest/environment" "^24.5.0" + "@jest/fake-timers" "^24.5.0" + "@jest/types" "^24.5.0" + jest-mock "^24.5.0" + jest-util "^24.5.0" + +jest-get-type@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.3.0.tgz#582cfd1a4f91b5cdad1d43d2932f816d543c65da" + integrity sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow== + +jest-haste-map@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.5.0.tgz#3f17d0c548b99c0c96ed2893f9c0ccecb2eb9066" + integrity sha512-mb4Yrcjw9vBgSvobDwH8QUovxApdimGcOkp+V1ucGGw4Uvr3VzZQBJhNm1UY3dXYm4XXyTW2G7IBEZ9pM2ggRQ== + dependencies: + "@jest/types" "^24.5.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.4.0" + jest-util "^24.5.0" + jest-worker "^24.4.0" + micromatch "^3.1.10" + sane "^4.0.3" + +jest-jasmine2@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.5.0.tgz#e6af4d7f73dc527d007cca5a5b177c0bcc29d111" + integrity sha512-sfVrxVcx1rNUbBeyIyhkqZ4q+seNKyAG6iM0S2TYBdQsXjoFDdqWFfsUxb6uXSsbimbXX/NMkJIwUZ1uT9+/Aw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.5.0" + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.5.0" + is-generator-fn "^2.0.0" + jest-each "^24.5.0" + jest-matcher-utils "^24.5.0" + jest-message-util "^24.5.0" + jest-runtime "^24.5.0" + jest-snapshot "^24.5.0" + jest-util "^24.5.0" + pretty-format "^24.5.0" + throat "^4.0.0" + +jest-leak-detector@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.5.0.tgz#21ae2b3b0da252c1171cd494f75696d65fb6fa89" + integrity sha512-LZKBjGovFRx3cRBkqmIg+BZnxbrLqhQl09IziMk3oeh1OV81Hg30RUIx885mq8qBv1PA0comB9bjKcuyNO1bCQ== + dependencies: + pretty-format "^24.5.0" + +jest-matcher-utils@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.5.0.tgz#5995549dcf09fa94406e89526e877b094dad8770" + integrity sha512-QM1nmLROjLj8GMGzg5VBra3I9hLpjMPtF1YqzQS3rvWn2ltGZLrGAO1KQ9zUCVi5aCvrkbS5Ndm2evIP9yZg1Q== + dependencies: + chalk "^2.0.1" + jest-diff "^24.5.0" + jest-get-type "^24.3.0" + pretty-format "^24.5.0" + +jest-message-util@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.5.0.tgz#181420a65a7ef2e8b5c2f8e14882c453c6d41d07" + integrity sha512-6ZYgdOojowCGiV0D8WdgctZEAe+EcFU+KrVds+0ZjvpZurUW2/oKJGltJ6FWY2joZwYXN5VL36GPV6pNVRqRnQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.5.0.tgz#976912c99a93f2a1c67497a9414aa4d9da4c7b76" + integrity sha512-ZnAtkWrKf48eERgAOiUxVoFavVBziO2pAi2MfZ1+bGXVkDfxWLxU0//oJBkgwbsv6OAmuLBz4XFFqvCFMqnGUw== + dependencies: + "@jest/types" "^24.5.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" + integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== + +jest-resolve-dependencies@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.5.0.tgz#1a0dae9cdd41349ca4a84148b3e78da2ba33fd4b" + integrity sha512-dRVM1D+gWrFfrq2vlL5P9P/i8kB4BOYqYf3S7xczZ+A6PC3SgXYSErX/ScW/469pWMboM1uAhgLF+39nXlirCQ== + dependencies: + "@jest/types" "^24.5.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.5.0" + +jest-resolve@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.5.0.tgz#8c16ba08f60a1616c3b1cd7afb24574f50a24d04" + integrity sha512-ZIfGqLX1Rg8xJpQqNjdoO8MuxHV1q/i2OO1hLXjgCWFWs5bsedS8UrOdgjUqqNae6DXA+pCyRmdcB7lQEEbXew== + dependencies: + "@jest/types" "^24.5.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.5.0.tgz#9be26ece4fd4ab3dfb528b887523144b7c5ffca8" + integrity sha512-oqsiS9TkIZV5dVkD+GmbNfWBRPIvxqmlTQ+AQUJUQ07n+4xTSDc40r+aKBynHw9/tLzafC00DIbJjB2cOZdvMA== + dependencies: + "@jest/console" "^24.3.0" + "@jest/environment" "^24.5.0" + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.5.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.5.0" + jest-jasmine2 "^24.5.0" + jest-leak-detector "^24.5.0" + jest-message-util "^24.5.0" + jest-resolve "^24.5.0" + jest-runtime "^24.5.0" + jest-util "^24.5.0" + jest-worker "^24.4.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.5.0.tgz#3a76e0bfef4db3896d5116e9e518be47ba771aa2" + integrity sha512-GTFHzfLdwpaeoDPilNpBrorlPoNZuZrwKKzKJs09vWwHo+9TOsIIuszK8cWOuKC7ss07aN1922Ge8fsGdsqCuw== + dependencies: + "@jest/console" "^24.3.0" + "@jest/environment" "^24.5.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/yargs" "^12.0.2" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.5.0" + jest-haste-map "^24.5.0" + jest-message-util "^24.5.0" + jest-mock "^24.5.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.5.0" + jest-snapshot "^24.5.0" + jest-util "^24.5.0" + jest-validate "^24.5.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^12.0.2" + +jest-serializer@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" + integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== + +jest-snapshot@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.5.0.tgz#e5d224468a759fd19e36f01217aac912f500f779" + integrity sha512-eBEeJb5ROk0NcpodmSKnCVgMOo+Qsu5z9EDl3tGffwPzK1yV37mjGWF2YeIz1NkntgTzP+fUL4s09a0+0dpVWA== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.5.0" + chalk "^2.0.1" + expect "^24.5.0" + jest-diff "^24.5.0" + jest-matcher-utils "^24.5.0" + jest-message-util "^24.5.0" + jest-resolve "^24.5.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.5.0" + semver "^5.5.0" + +jest-util@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.5.0.tgz#9d9cb06d9dcccc8e7cc76df91b1635025d7baa84" + integrity sha512-Xy8JsD0jvBz85K7VsTIQDuY44s+hYJyppAhcsHsOsGisVtdhar6fajf2UOf2mEVEgh15ZSdA0zkCuheN8cbr1Q== + dependencies: + "@jest/console" "^24.3.0" + "@jest/fake-timers" "^24.5.0" + "@jest/source-map" "^24.3.0" + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/node" "*" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.5.0.tgz#62fd93d81214c070bb2d7a55f329a79d8057c7de" + integrity sha512-gg0dYszxjgK2o11unSIJhkOFZqNRQbWOAB2/LOUdsd2LfD9oXiMeuee8XsT0iRy5EvSccBgB4h/9HRbIo3MHgQ== + dependencies: + "@jest/types" "^24.5.0" + camelcase "^5.0.0" + chalk "^2.0.1" + jest-get-type "^24.3.0" + leven "^2.1.0" + pretty-format "^24.5.0" + +jest-watcher@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.5.0.tgz#da7bd9cb5967e274889b42078c8f501ae1c47761" + integrity sha512-/hCpgR6bg0nKvD3nv4KasdTxuhwfViVMHUATJlnGCD0r1QrmIssimPbmc5KfAQblAVxkD8xrzuij9vfPUk1/rA== + dependencies: + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/node" "*" + "@types/yargs" "^12.0.9" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.5.0" + string-length "^2.0.0" + +jest-worker@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.4.0.tgz#fbc452b0120bb5c2a70cdc88fa132b48eeb11dd0" + integrity sha512-BH9X/klG9vxwoO99ZBUbZFfV8qO0XNZ5SIiCyYK2zOuJBl6YJVAeNIQjcoOVNu4HGEHeYEKsUWws8kSlSbZ9YQ== + dependencies: + "@types/node" "*" + merge-stream "^1.0.1" + supports-color "^6.1.0" + +jest@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.5.0.tgz#38f11ae2c2baa2f86c2bc4d8a91d2b51612cd19a" + integrity sha512-lxL+Fq5/RH7inxxmfS2aZLCf8MsS+YCUBfeiNO6BWz/MmjhDGaIEA/2bzEf9q4Q0X+mtFHiinHFvQ0u+RvW/qQ== + dependencies: + import-local "^2.0.0" + jest-cli "^24.5.0" + js-levenshtein@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" @@ -4509,6 +5495,14 @@ js-yaml@^3.11.0: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.12.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" + integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^3.9.0: version "3.12.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" @@ -4527,6 +5521,38 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -4574,6 +5600,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -4637,6 +5670,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +kleur@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.2.tgz#83c7ec858a41098b613d5998a7b653962b504f68" + integrity sha512-3h7B2WRT5LNXOtQiAaWonilegHcPSf9nLVXlSTci8lu1dZUuui61+EsPEZqSVxY7rXYmB2DVKMQILxaO5WL61Q== + koa-better-router@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/koa-better-router/-/koa-better-router-2.1.1.tgz#8498664659204bedfb7cb72f99c8ca1f17d6628f" @@ -4764,6 +5802,23 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4857,16 +5912,16 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -4899,13 +5954,27 @@ macos-release@^2.0.0: resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.0.0.tgz#7dddf4caf79001a851eb4fba7fb6034f251276ab" integrity sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A== -make-dir@^1.0.0: +make-dir@^1.0.0, make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -4951,6 +6020,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.2.0.tgz#5ee057680ed9cb8dad8a78d820f9a8897a102025" + integrity sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + memoize-one@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-4.1.0.tgz#a2387c58c03fff27ca390c31b764a79addf3f906" @@ -4969,6 +6047,13 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + methods@^1.1.1, methods@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5040,6 +6125,11 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde" + integrity sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA== + mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -5067,11 +6157,16 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.0, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + minipass@^2.2.1, minipass@^2.3.3: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" @@ -5185,6 +6280,11 @@ nan@^2.6.2: resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== +nan@^2.8.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd" + integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA== + nanoid@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-1.2.1.tgz#922bf6c10e35f7b208993768dad643577c907adf" @@ -5236,7 +6336,7 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= -neo-async@^2.5.0: +neo-async@^2.5.0, neo-async@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== @@ -5338,6 +6438,11 @@ node-fetch@^2.1.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== +node-gyp-build@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" + integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w== + node-gyp@^3.6.2: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" @@ -5356,6 +6461,11 @@ node-gyp@^3.6.2: tar "^2.0.0" which "1" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + node-libs-browser@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" @@ -5390,6 +6500,17 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= +node-notifier@^5.2.1: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" @@ -5512,6 +6633,11 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.1.tgz#08d6d75e69fd791bdea31507ffafe8c843b67e9c" + integrity sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -5604,7 +6730,15 @@ only@~0.0.2: resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= -optionator@^0.8.2: +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= @@ -5616,6 +6750,11 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" +opusscript@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/opusscript/-/opusscript-0.0.4.tgz#c718edcfdcd2a1f55fadb266dd07268d4a46afde" + integrity sha512-bEPZFE2lhUJYQD5yfTFO4RhbRZ937x6hRwBC1YoGacT35bwDVwKFP1+amU8NYfZL/v4EU7ZTU3INTqzYAnuP7Q== + os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" @@ -5633,6 +6772,15 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + os-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.0.0.tgz#e1434dbfddb8e74b44c98b56797d951b7648a5d9" @@ -5668,11 +6816,28 @@ p-cancelable@^0.3.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" + integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -5706,6 +6871,11 @@ p-map@^1.1.1: resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + p-timeout@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" @@ -5774,6 +6944,11 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" @@ -5979,7 +7154,7 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.0: +pirates@^4.0.0, pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== @@ -6022,6 +7197,11 @@ pluralize@^7.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -6085,6 +7265,16 @@ prepend-http@^1.0.1: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= +pretty-format@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.5.0.tgz#cc69a0281a62cd7242633fc135d6930cd889822d" + integrity sha512-/3RuSghukCf8Riu5Ncve0iI+BzVkbRU5EeUoArKARZobREycuH5O4waxvaNIloEXdb0qwgmEAed5vTpX1HNROQ== + dependencies: + "@jest/types" "^24.5.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + primer-alerts@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/primer-alerts/-/primer-alerts-2.0.0.tgz#5596b439ddd633f867938c7076b269e0ee5fbc69" @@ -6371,11 +7561,6 @@ primer@^11.0.0: primer-truncate "2.0.0" primer-utilities "5.0.0" -prism-media@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-0.0.3.tgz#8842d4fae804f099d3b48a9a38e3c2bab6f4855b" - integrity sha512-c9KkNifSMU/iXT8FFTaBwBMr+rdVcN+H/uNv1o+CuFeTThNZNTOrQ+RgXA1yL/DeLk098duAeRPP3QNPNbhxYQ== - private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -6413,6 +7598,14 @@ promise@^7.0.1: dependencies: asap "~2.0.3" +prompts@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" + integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA== + dependencies: + kleur "^3.0.2" + sisteransi "^1.0.0" + prop-types-exact@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" @@ -6449,7 +7642,7 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: +psl@^1.1.24, psl@^1.1.28: version "1.1.31" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== @@ -6509,7 +7702,7 @@ punycode@^1.2.4, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -6621,6 +7814,11 @@ react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.3.tgz#4ad8b029c2a718fc0cfc746c8d4e1b7221e5387d" integrity sha512-Y4rC1ZJmsxxkkPuMLwvKvlL1Zfpbcu+Bf4ZigkHup3v9EfdYhAlWAaVyA19olXq2o2mGn0w+dFKvk3pVVlYcIA== +react-is@^16.8.4: + version "16.8.4" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.4.tgz#90f336a68c3a29a096a3d648ab80e87ec61482a2" + integrity sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA== + react-redux@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-6.0.1.tgz#0d423e2c1cb10ada87293d47e7de7c329623ba4d" @@ -6676,6 +7874,14 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -6747,6 +7953,13 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + recursive-copy@2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/recursive-copy/-/recursive-copy-2.0.6.tgz#d590f9eb5f165b96a1b80bc8f9cbcb5c6f9c89e9" @@ -6896,6 +8109,22 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -6940,6 +8169,13 @@ require-uncached@^1.0.3: caller-path "^0.1.0" resolve-from "^1.0.0" +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" @@ -6955,6 +8191,11 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + resolve@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" @@ -7011,6 +8252,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rsvp@^4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" + integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -7054,6 +8300,21 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -7237,6 +8498,11 @@ shell-quote@^1.6.1: array-reduce "~0.0.0" jsonify "~0.0.0" +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + shimmer@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.0.tgz#f966f7555789763e74d8841193685a5e78736665" @@ -7268,6 +8534,11 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +sisteransi@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" + integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -7315,11 +8586,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -snekfetch@^3.6.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/snekfetch/-/snekfetch-3.6.4.tgz#d13e80a616d892f3d38daae4289f4d258a645120" - integrity sha512-NjxjITIj04Ffqid5lqr7XdgwM7X61c/Dns073Ly170bPQHLm6jkmelye/eglS++1nfTWktpP6Y2bFXjdPlQqdw== - socket.io-adapter@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" @@ -7382,6 +8648,14 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.5.6: + version "0.5.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" + integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@^0.5.9, source-map-support@~0.5.9: version "0.5.10" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" @@ -7477,6 +8751,11 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + standard-engine@~9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-9.0.0.tgz#d3a3d74c4c1b91f51a1e66362465261ca7610316" @@ -7525,6 +8804,11 @@ statuses@~1.3.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -7562,6 +8846,14 @@ string-hash@1.1.3: resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -7571,7 +8863,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -7630,6 +8922,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -7652,22 +8951,6 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -styled-components@4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-4.1.2.tgz#f8a685e3b2bcd03c5beac7f2c02bb6ad237da9b3" - integrity sha512-NdvWatJ2WLqZxAvto+oH0k7GAC/TlAUJTrHoXJddjbCrU6U23EmVbb9LXJBF+d6q6hH+g9nQYOWYPUeX/Vlc2w== - dependencies: - "@emotion/is-prop-valid" "^0.6.8" - "@emotion/unitless" "^0.7.0" - babel-plugin-styled-components ">= 1" - css-to-react-native "^2.2.2" - memoize-one "^4.0.0" - prop-types "^15.5.4" - react-is "^16.6.0" - stylis "^3.5.0" - stylis-rule-sheet "^0.0.10" - supports-color "^5.5.0" - styled-components@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-4.1.3.tgz#4472447208e618b57e84deaaeb6acd34a5e0fe9b" @@ -7751,6 +9034,13 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" +supports-color@^6.0.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + symbol-observable@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" @@ -7761,6 +9051,11 @@ symbol-observable@^1.2.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + system-components@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/system-components/-/system-components-3.0.1.tgz#a4e7d8a7b184aa0612245a4f1bd54b408132e0c0" @@ -7853,11 +9148,26 @@ terser@3.16.1, terser@^3.16.1: source-map "~0.6.1" source-map-support "~0.5.9" +test-exclude@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1" + integrity sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA== + dependencies: + arrify "^1.0.1" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^1.0.1" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -7890,6 +9200,11 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" @@ -7950,6 +9265,14 @@ toposort-class@^1.0.1: resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg= +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -7958,6 +9281,13 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + "traverse@>=0.3.0 <0.4": version "0.3.9" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" @@ -8022,6 +9352,14 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +uglify-js@^3.1.4: + version "3.5.1" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.1.tgz#29cb91e76c9941899bc74b075ad0e6da9250abd5" + integrity sha512-kI+3c+KphOAKIikQsZoT2oDsVYH5qvhpTtFObfMCdhPAYnjSvmW4oTWMhvDD4jtAGHJwztlBXQgozGcq3Xw9oQ== + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + uid-safe@^2.1.3: version "2.1.5" resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" @@ -8261,6 +9599,20 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +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" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -8270,6 +9622,11 @@ watchpack@^1.5.0: graceful-fs "^4.1.2" neo-async "^2.5.0" +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webpack-dev-middleware@3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" @@ -8343,11 +9700,46 @@ webpack@4.29.0: watchpack "^1.5.0" webpack-sources "^1.3.0" +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + which-pm-runs@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" @@ -8386,6 +9778,11 @@ wkx@^0.4.6: dependencies: "@types/node" "*" +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -8419,6 +9816,15 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -8426,13 +9832,19 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -ws@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" - integrity sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA== +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.0.tgz#13806d9913b2a5f3cbb9ba47b563c002cbc7c526" + integrity sha512-deZYUNlt2O4buFCa3t5bKLf8A7FPP/TVjwOeVNpw818Ma5nk4MLXls2eoEGS39o8119QIYxTrTDoPQ5B/gTD6w== dependencies: async-limiter "~1.0.0" - safe-buffer "~5.1.0" ws@~6.1.0: version "6.1.2" @@ -8441,6 +9853,11 @@ ws@~6.1.0: dependencies: async-limiter "~1.0.0" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xmlhttprequest-ssl@~1.5.4: version "1.5.5" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" @@ -8456,7 +9873,7 @@ y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= -y18n@^4.0.0: +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== @@ -8471,6 +9888,14 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" @@ -8479,6 +9904,24 @@ yargs-parser@^2.4.1: camelcase "^3.0.0" lodash.assign "^4.0.6" +yargs@^12.0.2: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + yargs@^4.2.0: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" @@ -8508,3 +9951,10 @@ ylru@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ== + +zlib-sync@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/zlib-sync/-/zlib-sync-0.1.4.tgz#510db6ea89040d4ff6fa22cd3936f5c1a2ad0987" + integrity sha512-DRy+RONKzy/J6skNmq8ZBXtVAIoB4qbun+FCChlSlEvF7s9LJ0wzUXjVwl4tQ/jYT8V+LPzCg/sTcRj4E0g0fQ== + dependencies: + nan "^2.8.0"