diff --git a/.docker/Dockerfile b/.docker/Dockerfile index f356f252eda5..6f23d27c3e2b 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,6 +1,6 @@ FROM rocketchat/base:8 -ENV RC_VERSION 0.64.0-develop +ENV RC_VERSION 0.65.0 MAINTAINER buildmaster@rocket.chat diff --git a/.docker/Dockerfile.rhel b/.docker/Dockerfile.rhel index 935c47ff829f..44bd00d0034a 100644 --- a/.docker/Dockerfile.rhel +++ b/.docker/Dockerfile.rhel @@ -1,6 +1,6 @@ FROM registry.access.redhat.com/rhscl/nodejs-8-rhel7 -ENV RC_VERSION 0.64.0-develop +ENV RC_VERSION 0.65.0 MAINTAINER buildmaster@rocket.chat diff --git a/.eslintrc b/.eslintrc index 7b20950289e6..32ba25020b8a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -131,6 +131,7 @@ "parentCall" : false, "Promise" : false, "Random" : false, + "ReactiveDict" : false, "ReactiveVar" : false, "Reload" : false, "RocketChat" : true, diff --git a/.github/history.json b/.github/history.json index f5c429911baf..7bf4445fff56 100644 --- a/.github/history.json +++ b/.github/history.json @@ -12264,5 +12264,2359 @@ "graywolf336" ] } - ] -} + ], + "0.64.0-rc.0": [ + { + "pr": "10532", + "title": "Included missing lib for migrations", + "userLogin": "Hudell", + "milestone": "0.64.0", + "contributors": [ + "Hudell", + "rodrigok" + ] + }, + { + "pr": "10502", + "title": "[NEW] Option to mute group mentions (@all and @here)", + "userLogin": "Hudell", + "milestone": "0.64.0", + "contributors": [ + "Hudell", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "9906", + "title": "[NEW] GDPR - Right to access and Data Portability", + "userLogin": "Hudell", + "milestone": "0.64.0", + "contributors": [ + "Hudell", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "9922", + "title": "[BREAK] Validate incoming message schema", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.0", + "contributors": [ + "MarcosSpessatto", + "ggazzo" + ] + }, + { + "pr": "9950", + "title": "[NEW] Broadcast Channels", + "userLogin": "ggazzo", + "milestone": "0.64.0", + "contributors": [ + "ggazzo", + "web-flow", + "sampaiodiego", + "rodrigok" + ] + }, + { + "pr": "10480", + "title": "[FIX] Add user object to responses in /*.files Rest endpoints", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.0", + "contributors": [ + "MarcosSpessatto", + "rodrigok" + ] + }, + { + "pr": "10517", + "title": "[NEW] Option to ignore users on channels", + "userLogin": "ggazzo", + "milestone": "0.64.0", + "contributors": [ + "ggazzo", + "gdelavald", + "web-flow", + "karlprieb" + ] + }, + { + "pr": "10110", + "title": "[NEW] Search Provider Framework", + "userLogin": "tkurz", + "milestone": "0.64.0", + "contributors": [ + "tkurz", + "web-flow" + ] + }, + { + "pr": "10473", + "title": "[FIX] Missing user data on files uploaded through the API", + "userLogin": "Hudell", + "milestone": "0.64.0", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10498", + "title": "[FIX] Rename method to clean history of messages", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10410", + "title": "[FIX] REST spotlight API wasn't allowing searches with # and @", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10505", + "title": "Develop sync", + "userLogin": "graywolf336", + "contributors": [ + "geekgonecrazy", + "web-flow", + "graywolf336", + "nsuchy", + "rodrigok", + "rafaelks", + "engelgabriel" + ] + }, + { + "pr": "10442", + "title": "[NEW] REST API endpoint `/directory`", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10482", + "title": "[FIX] Dropdown elements were using old styles", + "userLogin": "kaiiiiiiiii", + "milestone": "0.64.0", + "contributors": [ + "kaiiiiiiiii" + ] + }, + { + "pr": "10513", + "title": "Fix: Remove \"secret\" from REST endpoint /settings.oauth response", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10403", + "title": "[FIX] Directory sort and column sizes were wrong", + "userLogin": "ggazzo", + "milestone": "0.64.0", + "contributors": [ + "ggazzo", + "web-flow", + "karlprieb" + ] + }, + { + "pr": "10299", + "title": "[FIX] REST API OAuth services endpoint were missing fields and flag to indicate custom services", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10446", + "title": "[FIX] Error messages weren't been displayed when email verification fails", + "userLogin": "Hudell", + "milestone": "0.64.0", + "contributors": [ + "Hudell", + "karlprieb", + "web-flow" + ] + }, + { + "pr": "10454", + "title": "[FIX] Wrong column positions in the directory search for users", + "userLogin": "sumedh123", + "milestone": "0.64.0", + "contributors": [ + "sumedh123", + "karlprieb", + "web-flow" + ] + }, + { + "pr": "10463", + "title": "[FIX] Custom fields was misaligned in registration form", + "userLogin": "dschuan", + "milestone": "0.64.0", + "contributors": [ + "dschuan", + "web-flow" + ] + }, + { + "pr": "10341", + "title": "[FIX] Unique identifier file not really being unique", + "userLogin": "abernix", + "milestone": "0.64.0", + "contributors": [ + "abernix", + "web-flow", + "geekgonecrazy" + ] + }, + { + "pr": "10335", + "title": "[OTHER] More Listeners for Apps & Utilize Promises inside Apps", + "userLogin": "graywolf336", + "milestone": "0.64.0", + "contributors": [ + "graywolf336" + ] + }, + { + "pr": "10404", + "title": "[FIX] Empty panel after changing a user's username", + "userLogin": "Hudell", + "milestone": "0.64.0", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10418", + "title": " [FIX] Russian translation of \"False\"", + "userLogin": "strangerintheq", + "contributors": [ + "strangerintheq", + "web-flow" + ] + }, + { + "pr": "10496", + "title": "[FIX] Links being embedded inside of blockquotes", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10485", + "title": "[FIX] The 'channel.messages' REST API Endpoint error", + "userLogin": "rafaelks", + "milestone": "0.64.0", + "contributors": [ + "rafaelks", + "web-flow" + ] + }, + { + "pr": "10487", + "title": "[OTHER] Develop sync", + "userLogin": "graywolf336", + "contributors": [ + "geekgonecrazy", + "web-flow", + "graywolf336" + ] + }, + { + "pr": "10358", + "title": "[FIX] Button on user info contextual bar scrolling with the content", + "userLogin": "okaybroda", + "milestone": "0.64.0", + "contributors": [ + "okaybroda", + "ggazzo", + "web-flow", + "karlprieb", + "graywolf336" + ] + }, + { + "pr": "9824", + "title": "[FIX] \"Idle Time Limit\" using milliseconds instead of seconds", + "userLogin": "kaiiiiiiiii", + "milestone": "0.64.0", + "contributors": [ + "kaiiiiiiiii", + "web-flow", + "geekgonecrazy", + "sampaiodiego", + "graywolf336" + ] + }, + { + "pr": "10259", + "title": "[NEW] Body of the payload on an incoming webhook is included on the request object", + "userLogin": "Hudell", + "milestone": "0.64.0", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10387", + "title": "[FIX] Missing i18n translation key for \"Unread\"", + "userLogin": "Hudell", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "9729", + "title": "[FIX] Owner unable to delete channel or group from APIs", + "userLogin": "c0dzilla", + "milestone": "0.64.0", + "contributors": [ + "c0dzilla", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "10371", + "title": "[NEW] REST endpoint to recover forgotten password", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10354", + "title": "[NEW] REST endpoint to report messages", + "userLogin": "MarcosSpessatto", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10108", + "title": "[NEW] Livechat setting to customize ended conversation message", + "userLogin": "renatobecker", + "milestone": "0.64.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "10369", + "title": "[FIX] Livechat translation files being ignored", + "userLogin": "renatobecker", + "milestone": "0.64.0", + "contributors": [ + "renatobecker", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "7964", + "title": "[NEW] Twilio MMS support for LiveChat integration", + "userLogin": "t3hchipmunk", + "milestone": "0.64.0", + "contributors": [ + "t3hchipmunk", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "6673", + "title": "[FIX] Missing page \"not found\"", + "userLogin": "Prakharsvnit", + "milestone": "0.64.0", + "contributors": [ + "Prakharsvnit", + "web-flow", + "geekgonecrazy", + "karlprieb" + ] + }, + { + "pr": "10083", + "title": "[FIX] \"Highlight Words\" wasn't working with more than one word", + "userLogin": "nemaniarjun", + "milestone": "0.64.0", + "contributors": [ + "nemaniarjun", + "gdelavald", + "web-flow" + ] + }, + { + "pr": "10171", + "title": "[FIX] Missing \"Administration\" menu for user with manage-emoji permission", + "userLogin": "c0dzilla", + "milestone": "0.64.0", + "contributors": [ + "c0dzilla", + "karlprieb", + "web-flow" + ] + }, + { + "pr": "10395", + "title": "[FIX] Message view mode setting was missing at user's preferences ", + "userLogin": "kaiiiiiiiii", + "milestone": "0.64.0", + "contributors": [ + "kaiiiiiiiii", + "karlprieb", + "web-flow" + ] + }, + { + "pr": "10399", + "title": "[FIX] Profile image was not being shown in user's directory search", + "userLogin": "sumedh123", + "milestone": "0.64.0", + "contributors": [ + "sumedh123", + "karlprieb", + "web-flow" + ] + }, + { + "pr": "10342", + "title": "[NEW] REST API endpoint `rooms.favorite` to favorite and unfavorite rooms", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10428", + "title": "[FIX] Wrong positioning of popover when using RTL languages", + "userLogin": "ggazzo", + "milestone": "0.64.0", + "contributors": [ + "ggazzo", + "karlprieb", + "web-flow" + ] + }, + { + "pr": "10472", + "title": "[FIX] Messages was grouping wrong some times when server is slow", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald", + "karlprieb", + "web-flow" + ] + }, + { + "pr": "10225", + "title": "[FIX] GitLab authentication scope was too open, reduced to read only access", + "userLogin": "rafaelks", + "milestone": "0.64.0", + "contributors": [ + "rafaelks", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "10344", + "title": "[FIX] Renaming agent's username within Livechat's department", + "userLogin": "renatobecker", + "milestone": "0.64.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "10394", + "title": "[FIX] Missing RocketApps input types", + "userLogin": "ggazzo", + "milestone": "0.64.0", + "contributors": [ + "ggazzo", + "web-flow", + "graywolf336", + "karlprieb" + ] + }, + { + "pr": "10221", + "title": "[FIX] Livechat desktop notifications not being displayed", + "userLogin": "renatobecker", + "milestone": "0.64.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "10336", + "title": "Change Docker-Compose to use mmapv1 storage engine for mongo", + "userLogin": "geekgonecrazy", + "milestone": "0.64.0", + "contributors": [ + "geekgonecrazy", + "web-flow" + ] + }, + { + "pr": "10396", + "title": "[NEW] Add internal API to handle room announcements", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10409", + "title": "[FIX] Autocomplete list when inviting a user was partial hidden", + "userLogin": "karlprieb", + "milestone": "0.64.0", + "contributors": [ + "karlprieb", + "web-flow" + ] + }, + { + "pr": "10423", + "title": "[FIX] Remove a user from the user's list when creating a new channel removes the wrong user", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald", + "karlprieb", + "web-flow" + ] + }, + { + "pr": "10430", + "title": "[FIX] Room's name was cutting instead of having ellipses on sidebar", + "userLogin": "ggazzo", + "milestone": "0.64.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "10435", + "title": "Add some missing translations", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10437", + "title": "[NEW] Add message preview when quoting another message", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10438", + "title": "[FIX] Button to delete rooms by the owners wasn't appearing", + "userLogin": "ggazzo", + "milestone": "0.64.0", + "contributors": [ + "ggazzo", + "karlprieb", + "web-flow" + ] + }, + { + "pr": "10439", + "title": "[NEW] Prevent the browser to autocomplete some setting fields", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10441", + "title": "[OTHER] Removed the developer warning on the rest api", + "userLogin": "graywolf336", + "milestone": "0.64.0", + "contributors": [ + "graywolf336" + ] + }, + { + "pr": "10444", + "title": "[NEW] Shows user's real name on autocomplete popup", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10414", + "title": "[NEW] Automatically trigger Redhat registry build when tagging new release", + "userLogin": "geekgonecrazy", + "milestone": "0.64.0", + "contributors": [ + "geekgonecrazy" + ] + }, + { + "pr": "10397", + "title": "Fix and improve vietnamese translation", + "userLogin": "tttt-conan", + "contributors": [ + "tttt-conan", + "TDiNguyen", + "graywolf336", + "web-flow" + ] + }, + { + "pr": "10411", + "title": "[BREAK] The property \"settings\" is no longer available to regular users via rest api", + "userLogin": "graywolf336", + "milestone": "0.64.0", + "contributors": [ + "graywolf336" + ] + }, + { + "pr": "9946", + "title": "[FIX] Updated OpenShift Template to take an Image as a Param", + "userLogin": "christianh814", + "contributors": [ + "christianh814", + "web-flow", + "geekgonecrazy" + ] + }, + { + "pr": "10405", + "title": "Use Node 8.9 for CI build", + "userLogin": "rodrigok", + "milestone": "0.64.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "9576", + "title": "[FIX] Incoming integrations being able to trigger an empty message with a GET", + "userLogin": "graywolf336", + "milestone": "0.64.0", + "contributors": [ + "graywolf336" + ] + }, + { + "pr": "10360", + "title": "Update allowed labels for bot", + "userLogin": "TwizzyDizzy", + "contributors": [ + "TwizzyDizzy", + "web-flow" + ] + }, + { + "pr": "10384", + "title": "Remove @core team mention from Pull Request template", + "userLogin": "rodrigok", + "milestone": "0.64.0", + "contributors": [ + "rodrigok", + "web-flow" + ] + }, + { + "pr": "10390", + "title": "[FIX] Snaps installations are breaking on avatar requests", + "userLogin": "rodrigok", + "milestone": "0.64.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10234", + "title": "New issue template for *Release Process*", + "userLogin": "rodrigok", + "milestone": "0.64.0", + "contributors": [ + "rodrigok", + "geekgonecrazy", + "web-flow" + ] + }, + { + "pr": "10376", + "title": "Master into Develop Branch Sync", + "userLogin": "graywolf336", + "contributors": [ + "sampaiodiego", + "rodrigok", + "web-flow", + "graywolf336" + ] + }, + { + "pr": "10504", + "title": "Release 0.63.3", + "userLogin": "graywolf336", + "contributors": [ + "rafaelks", + "graywolf336" + ] + }, + { + "pr": "10476", + "title": "Release 0.63.2", + "userLogin": "graywolf336", + "contributors": [ + "graywolf336", + "web-flow" + ] + }, + { + "pr": "10408", + "title": "add redhat dockerfile to master", + "userLogin": "geekgonecrazy", + "contributors": [ + "geekgonecrazy" + ] + } + ], + "0.64.0-rc.1": [ + { + "pr": "10545", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "milestone": "0.64.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10544", + "title": "Regression: Revert announcement structure", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald", + "rodrigok", + "web-flow" + ] + }, + { + "pr": "10543", + "title": "Regression: Upload was not working", + "userLogin": "rodrigok", + "milestone": "0.64.0", + "contributors": [ + "rodrigok" + ] + } + ], + "0.64.0-rc.2": [ + { + "pr": "10549", + "title": "Deps update", + "userLogin": "engelgabriel", + "milestone": "0.64.0", + "contributors": [ + "engelgabriel", + "web-flow" + ] + }, + { + "pr": "10560", + "title": "Regression: /api/v1/settings.oauth not returning clientId for Twitter", + "userLogin": "cardoso", + "milestone": "0.64.0", + "contributors": [ + "cardoso", + "web-flow" + ] + }, + { + "pr": "10555", + "title": "Regression: Webhooks breaking due to restricted test", + "userLogin": "rodrigok", + "milestone": "0.64.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10559", + "title": "Regression: Rooms and Apps weren't playing nice with each other", + "userLogin": "graywolf336", + "milestone": "0.64.0", + "contributors": [ + "graywolf336" + ] + }, + { + "pr": "10554", + "title": "Regression: Fix announcement bar being displayed without content", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald" + ] + } + ], + "0.64.0-rc.3": [ + { + "pr": "10550", + "title": "[FIX] Wordpress oAuth authentication wasn't behaving correctly", + "userLogin": "kaiiiiiiiii", + "milestone": "0.64.0", + "contributors": [ + "kaiiiiiiiii" + ] + }, + { + "pr": "10553", + "title": "Regression: Inconsistent response of settings.oauth endpoint", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10571", + "title": "Regression: Remove added mentions on quote/reply", + "userLogin": "gdelavald", + "milestone": "0.64.0", + "contributors": [ + "gdelavald", + "rodrigok" + ] + }, + { + "pr": "10573", + "title": "Regression: Attachments and fields incorrectly failing on validation", + "userLogin": "graywolf336", + "milestone": "0.64.0", + "contributors": [ + "graywolf336" + ] + } + ], + "0.64.0-rc.4": [ + { + "pr": "10558", + "title": "[FIX] Switch buttons were cutting in RTL mode", + "userLogin": "ggazzo", + "milestone": "0.64.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "10574", + "title": "[NEW] Add information regarding Zapier and Bots to the integrations page", + "userLogin": "graywolf336", + "milestone": "0.64.0", + "contributors": [ + "graywolf336" + ] + }, + { + "pr": "10575", + "title": "Regression: Rocket.Chat App author link opens in same window", + "userLogin": "kaiiiiiiiii", + "milestone": "0.64.0", + "contributors": [ + "kaiiiiiiiii", + "web-flow" + ] + }, + { + "pr": "10503", + "title": "[FIX] Stop Firefox announcement overflowing viewport", + "userLogin": "brendangadd", + "milestone": "0.64.0", + "contributors": [ + "brendangadd", + "web-flow" + ] + } + ], + "0.64.0": [ + { + "pr": "10591", + "title": "Regression: Various search provider fixes", + "userLogin": "tkurz", + "milestone": "0.64.0", + "contributors": [ + "tkurz", + "web-flow", + "engelgabriel", + "sampaiodiego" + ] + }, + { + "pr": "10596", + "title": "Regression: /api/v1/settings.oauth not sending needed info for SAML & CAS", + "userLogin": "cardoso", + "milestone": "0.64.0", + "contributors": [ + "cardoso", + "web-flow" + ] + }, + { + "pr": "10598", + "title": "Regression: Apps and Livechats not getting along well with each other", + "userLogin": "graywolf336", + "milestone": "0.64.0", + "contributors": [ + "graywolf336" + ] + }, + { + "pr": "10551", + "title": " [FIX] Missing \"Administration\" menu for users with some administration permissions", + "userLogin": "kaiiiiiiiii", + "milestone": "0.64.0", + "contributors": [ + "kaiiiiiiiii" + ] + }, + { + "pr": "10599", + "title": "[FIX] Member list search with no results", + "userLogin": "ggazzo", + "milestone": "0.64.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "10586", + "title": "Development: Add Visual Studio Code debugging configuration", + "userLogin": "graywolf336", + "contributors": [ + "graywolf336" + ] + }, + { + "pr": "10576", + "title": "[FIX] Integrations with room data not having the usernames filled in", + "userLogin": "graywolf336", + "milestone": "0.64.0", + "contributors": [ + "graywolf336", + "sampaiodiego", + "web-flow" + ] + } + ], + "0.64.1": [ + { + "pr": "10597", + "title": "[NEW] Store the last sent message to show bellow the room's name by default", + "userLogin": "graywolf336", + "milestone": "0.64.1", + "contributors": [ + "graywolf336", + "engelgabriel", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "10529", + "title": "Support passing extra connection options to the Mongo driver", + "userLogin": "saplla", + "milestone": "0.64.1", + "contributors": [ + "saplla", + "web-flow", + "engelgabriel" + ] + }, + { + "pr": "10615", + "title": "[FIX] E-mails were hidden some information", + "userLogin": "rodrigok", + "milestone": "0.64.1", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10611", + "title": "Regression: Updating an App on multi-instance servers wasn't working", + "userLogin": "graywolf336", + "milestone": "0.64.1", + "contributors": [ + "graywolf336", + "engelgabriel", + "web-flow" + ] + }, + { + "pr": "10627", + "title": "[FIX] Regression on 0.64.0 was freezing the application when posting some URLs", + "userLogin": "rodrigok", + "milestone": "0.64.1", + "contributors": [ + "rodrigok", + "sampaiodiego" + ] + }, + { + "pr": "10648", + "title": "Dependencies update", + "userLogin": "engelgabriel", + "milestone": "0.64.1", + "contributors": [ + "engelgabriel" + ] + } + ], + "0.64.2-rc.0": [ + { + "pr": "10736", + "title": "More improvements on send notifications logic", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "rodrigok", + "sampaiodiego" + ] + }, + { + "pr": "10720", + "title": "[FIX] Send a message when muted returns inconsistent result in chat.sendMessage", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.2", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10733", + "title": "[FIX] Regression: Empty content on announcement modal", + "userLogin": "gdelavald", + "milestone": "0.64.2", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10607", + "title": "[NEW] Add REST endpoints `channels.roles` & `groups.roles`", + "userLogin": "cardoso", + "milestone": "0.64.2", + "contributors": [ + "cardoso", + "web-flow", + "rafaelks" + ] + }, + { + "pr": "10724", + "title": "[NEW] Add more options for Wordpress OAuth configuration", + "userLogin": "Hudell", + "milestone": "0.64.2", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10523", + "title": "[NEW] Setup Wizard", + "userLogin": "karlprieb", + "milestone": "0.64.2", + "contributors": [ + "karlprieb", + "engelgabriel", + "web-flow" + ] + }, + { + "pr": "10691", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10686", + "title": "[NEW] Improvements to notifications logic", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego", + "rodrigok", + "web-flow" + ] + }, + { + "pr": "10705", + "title": "[FIX] Missing attachment description when Rocket.Chat Apps were enabled", + "userLogin": "Hudell", + "milestone": "0.64.2", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10445", + "title": "[FIX] Improve desktop notification formatting", + "userLogin": "Sameesunkaria", + "milestone": "0.64.2", + "contributors": [ + "Sameesunkaria", + "engelgabriel", + "web-flow" + ] + }, + { + "pr": "10524", + "title": "Add `npm run postinstall` into example build script", + "userLogin": "peccu", + "milestone": "0.64.2", + "contributors": [ + "peccu", + "web-flow", + "engelgabriel" + ] + }, + { + "pr": "10678", + "title": "[FIX] Message box emoji icon was flickering when typing a text", + "userLogin": "gdelavald", + "milestone": "0.64.2", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10674", + "title": "Correct links in README file", + "userLogin": "winterstefan", + "milestone": "0.64.2", + "contributors": [ + "winterstefan" + ] + }, + { + "pr": "10665", + "title": "[FIX] Channel owner was being set as muted when creating a read-only channel", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.2", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10681", + "title": "[FIX] SAML wasn't working correctly when running multiple instances", + "userLogin": "Hudell", + "milestone": "0.64.2", + "contributors": [ + "Hudell", + "rodrigok", + "web-flow" + ] + } + ], + "0.64.2-rc.1": [ + { + "pr": "10789", + "title": "Prometheus: Improve metric names", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10788", + "title": "Improvement to push notifications on direct messages", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "10786", + "title": "Better metric for notifications", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10779", + "title": "Add badge back to push notifications", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "10776", + "title": "Wizard improvements", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10766", + "title": "Add setting and expose prometheus on port 9100", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok", + "sampaiodiego" + ] + }, + { + "pr": "10760", + "title": "Regression: Fix notifications for direct messages", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego" + ] + } + ], + "0.64.2-rc.2": [ + { + "pr": "10798", + "title": "Prometheus: Add metric to track hooks time", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10802", + "title": "Regression: Autorun of wizard was not destroyed after completion", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10803", + "title": "Prometheus: Fix notification metric", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10804", + "title": "Regression: Fix wrong wizard field name", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10793", + "title": "[FIX] Not escaping special chars on mentions", + "userLogin": "erhan-", + "milestone": "0.64.2", + "contributors": [ + "erhan-", + "sampaiodiego" + ] + } + ], + "0.64.2": [ + { + "pr": "10812", + "title": "Release 0.64.2", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "Hudell", + "rodrigok", + "web-flow", + "MarcosSpessatto", + "winterstefan", + "gdelavald", + "peccu", + "Sameesunkaria", + "sampaiodiego", + "engelgabriel", + "karlprieb", + "cardoso", + "erhan-" + ] + }, + { + "pr": "10798", + "title": "Prometheus: Add metric to track hooks time", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10802", + "title": "Regression: Autorun of wizard was not destroyed after completion", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10803", + "title": "Prometheus: Fix notification metric", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10804", + "title": "Regression: Fix wrong wizard field name", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10793", + "title": "[FIX] Not escaping special chars on mentions", + "userLogin": "erhan-", + "milestone": "0.64.2", + "contributors": [ + "erhan-", + "sampaiodiego" + ] + }, + { + "pr": "10789", + "title": "Prometheus: Improve metric names", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10788", + "title": "Improvement to push notifications on direct messages", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "10786", + "title": "Better metric for notifications", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10779", + "title": "Add badge back to push notifications", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "10776", + "title": "Wizard improvements", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10766", + "title": "Add setting and expose prometheus on port 9100", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok", + "sampaiodiego" + ] + }, + { + "pr": "10760", + "title": "Regression: Fix notifications for direct messages", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "10736", + "title": "More improvements on send notifications logic", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "rodrigok", + "sampaiodiego" + ] + }, + { + "pr": "10720", + "title": "[FIX] Send a message when muted returns inconsistent result in chat.sendMessage", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.2", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10733", + "title": "[FIX] Regression: Empty content on announcement modal", + "userLogin": "gdelavald", + "milestone": "0.64.2", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10607", + "title": "[NEW] Add REST endpoints `channels.roles` & `groups.roles`", + "userLogin": "cardoso", + "milestone": "0.64.2", + "contributors": [ + "cardoso", + "web-flow", + "rafaelks" + ] + }, + { + "pr": "10724", + "title": "[NEW] Add more options for Wordpress OAuth configuration", + "userLogin": "Hudell", + "milestone": "0.64.2", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10523", + "title": "[NEW] Setup Wizard", + "userLogin": "karlprieb", + "milestone": "0.64.2", + "contributors": [ + "karlprieb", + "engelgabriel", + "web-flow" + ] + }, + { + "pr": "10691", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10686", + "title": "[NEW] Improvements to notifications logic", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego", + "rodrigok", + "web-flow" + ] + }, + { + "pr": "10705", + "title": "[FIX] Missing attachment description when Rocket.Chat Apps were enabled", + "userLogin": "Hudell", + "milestone": "0.64.2", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10445", + "title": "[FIX] Improve desktop notification formatting", + "userLogin": "Sameesunkaria", + "milestone": "0.64.2", + "contributors": [ + "Sameesunkaria", + "engelgabriel", + "web-flow" + ] + }, + { + "pr": "10524", + "title": "Add `npm run postinstall` into example build script", + "userLogin": "peccu", + "milestone": "0.64.2", + "contributors": [ + "peccu", + "web-flow", + "engelgabriel" + ] + }, + { + "pr": "10678", + "title": "[FIX] Message box emoji icon was flickering when typing a text", + "userLogin": "gdelavald", + "milestone": "0.64.2", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10674", + "title": "Correct links in README file", + "userLogin": "winterstefan", + "milestone": "0.64.2", + "contributors": [ + "winterstefan" + ] + }, + { + "pr": "10665", + "title": "[FIX] Channel owner was being set as muted when creating a read-only channel", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.2", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10681", + "title": "[FIX] SAML wasn't working correctly when running multiple instances", + "userLogin": "Hudell", + "milestone": "0.64.2", + "contributors": [ + "Hudell", + "rodrigok", + "web-flow" + ] + } + ], + "0.65.0-rc.0": [ + { + "pr": "10822", + "title": "Apps: Command Previews, Message and Room Removal Events", + "userLogin": "graywolf336", + "milestone": "0.65.0", + "contributors": [ + "graywolf336", + "rodrigok", + "web-flow", + "sampaiodiego" + ] + }, + { + "pr": "9857", + "title": "[NEW] Implement a local password policy", + "userLogin": "graywolf336", + "milestone": "0.65.0", + "contributors": [ + "graywolf336", + "rodrigok" + ] + }, + { + "pr": "10663", + "title": "[FIX] Livechat managers were not being able to send messages in some cases", + "userLogin": "renatobecker", + "milestone": "0.65.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "10584", + "title": "[NEW] Options to enable/disable each Livechat registration form field", + "userLogin": "renatobecker", + "milestone": "0.65.0", + "contributors": [ + "renatobecker", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "10612", + "title": "[FIX] Livechat settings not appearing correctly", + "userLogin": "renatobecker", + "milestone": "0.65.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "10677", + "title": "[NEW] Return the result of the `/me` endpoint within the result of the `/login` endpoint", + "userLogin": "MarcosSpessatto", + "milestone": "0.65.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10815", + "title": "Develop sync", + "userLogin": "rodrigok", + "contributors": [ + "geekgonecrazy", + "web-flow", + "graywolf336", + "nsuchy", + "rodrigok", + "rafaelks", + "sampaiodiego" + ] + }, + { + "pr": "10608", + "title": "[NEW] Lazy load image attachments", + "userLogin": "ggazzo", + "milestone": "0.65.0", + "contributors": [ + "ggazzo", + "web-flow", + "karlprieb", + "rodrigok" + ] + }, + { + "pr": "10427", + "title": "[FIX] Enabling `Collapse Embedded Media by Default` was hiding replies and quotes", + "userLogin": "c0dzilla", + "milestone": "0.65.0", + "contributors": [ + "c0dzilla" + ] + }, + { + "pr": "10214", + "title": "[NEW] View pinned message's attachment", + "userLogin": "c0dzilla", + "milestone": "0.65.0", + "contributors": [ + "c0dzilla", + "karlprieb", + "web-flow", + "ggazzo" + ] + }, + { + "pr": "10704", + "title": "[FIX] Missing option to disable/enable System Messages", + "userLogin": "ggazzo", + "milestone": "0.65.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "10448", + "title": "[FIX] Remove outdated translations of Internal Hubot's description of Scripts to Load that were pointing to a non existent address", + "userLogin": "Hudell", + "milestone": "0.65.0", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10661", + "title": "Major dependencies update", + "userLogin": "engelgabriel", + "milestone": "0.65.0", + "contributors": [ + "engelgabriel", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "10702", + "title": "[NEW] Add REST API endpoint `users.getUsernameSuggestion` to get username suggestion", + "userLogin": "MarcosSpessatto", + "milestone": "0.65.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10488", + "title": "[NEW] REST API endpoint `settings` now allow set colors and trigger actions", + "userLogin": "ThomasRoehl", + "milestone": "0.65.0", + "contributors": [ + "ThomasRoehl", + "MarcosSpessatto" + ] + }, + { + "pr": "10778", + "title": "[NEW] Add REST endpoint `subscriptions.unread` to mark messages as unread", + "userLogin": "MarcosSpessatto", + "milestone": "0.65.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10662", + "title": "[NEW] REST API endpoint `/me` now returns all the settings, including the default values", + "userLogin": "MarcosSpessatto", + "milestone": "0.65.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10741", + "title": "[NEW] Now is possible to access files using header authorization (`x-user-id` and `x-auth-token`)", + "userLogin": "MarcosSpessatto", + "milestone": "0.65.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10564", + "title": "[FIX] UI was not disabling the actions when users has had no permissions to create channels or add users to rooms", + "userLogin": "chuckAtCataworx", + "milestone": "0.65.0", + "contributors": [ + "cfunkles", + "chuckAtCataworx", + "web-flow", + "ggazzo" + ] + }, + { + "pr": "9679", + "title": "[NEW] Add REST API endpoints `channels.counters`, `groups.counters and `im.counters`", + "userLogin": "xbolshe", + "milestone": "0.65.0", + "contributors": [ + "xbolshe", + "MarcosSpessatto" + ] + }, + { + "pr": "9733", + "title": "[NEW] Add REST API endpoints `channels.setCustomFields` and `groups.setCustomFields`", + "userLogin": "xbolshe", + "milestone": "0.65.0", + "contributors": [ + "xbolshe", + "engelgabriel", + "web-flow" + ] + }, + { + "pr": "10625", + "title": "[FIX] Private settings were not being cleared from client cache in some cases", + "userLogin": "Hudell", + "milestone": "0.65.0", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10811", + "title": "Prevent setup wizard redirects", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok", + "sampaiodiego" + ] + }, + { + "pr": "10798", + "title": "Prometheus: Add metric to track hooks time", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10802", + "title": "Regression: Autorun of wizard was not destroyed after completion", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10803", + "title": "Prometheus: Fix notification metric", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10804", + "title": "Regression: Fix wrong wizard field name", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10793", + "title": "[FIX] Not escaping special chars on mentions", + "userLogin": "erhan-", + "milestone": "0.64.2", + "contributors": [ + "erhan-", + "sampaiodiego" + ] + }, + { + "pr": "10789", + "title": "Prometheus: Improve metric names", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10788", + "title": "Improvement to push notifications on direct messages", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "10786", + "title": "Better metric for notifications", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10779", + "title": "Add badge back to push notifications", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "10776", + "title": "Wizard improvements", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10766", + "title": "Add setting and expose prometheus on port 9100", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "rodrigok", + "sampaiodiego" + ] + }, + { + "pr": "10760", + "title": "Regression: Fix notifications for direct messages", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "10736", + "title": "More improvements on send notifications logic", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "rodrigok", + "sampaiodiego" + ] + }, + { + "pr": "10720", + "title": "[FIX] Send a message when muted returns inconsistent result in chat.sendMessage", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.2", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10733", + "title": "[FIX] Regression: Empty content on announcement modal", + "userLogin": "gdelavald", + "milestone": "0.64.2", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10607", + "title": "[NEW] Add REST endpoints `channels.roles` & `groups.roles`", + "userLogin": "cardoso", + "milestone": "0.64.2", + "contributors": [ + "cardoso", + "web-flow", + "rafaelks" + ] + }, + { + "pr": "10724", + "title": "[NEW] Add more options for Wordpress OAuth configuration", + "userLogin": "Hudell", + "milestone": "0.64.2", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10523", + "title": "[NEW] Setup Wizard", + "userLogin": "karlprieb", + "milestone": "0.64.2", + "contributors": [ + "karlprieb", + "engelgabriel", + "web-flow" + ] + }, + { + "pr": "10691", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "milestone": "0.64.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10686", + "title": "[NEW] Improvements to notifications logic", + "userLogin": "sampaiodiego", + "milestone": "0.64.2", + "contributors": [ + "sampaiodiego", + "rodrigok", + "web-flow" + ] + }, + { + "pr": "10705", + "title": "[FIX] Missing attachment description when Rocket.Chat Apps were enabled", + "userLogin": "Hudell", + "milestone": "0.64.2", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10445", + "title": "[FIX] Improve desktop notification formatting", + "userLogin": "Sameesunkaria", + "milestone": "0.64.2", + "contributors": [ + "Sameesunkaria", + "engelgabriel", + "web-flow" + ] + }, + { + "pr": "10524", + "title": "Add `npm run postinstall` into example build script", + "userLogin": "peccu", + "milestone": "0.64.2", + "contributors": [ + "peccu", + "web-flow", + "engelgabriel" + ] + }, + { + "pr": "10678", + "title": "[FIX] Message box emoji icon was flickering when typing a text", + "userLogin": "gdelavald", + "milestone": "0.64.2", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10674", + "title": "Correct links in README file", + "userLogin": "winterstefan", + "milestone": "0.64.2", + "contributors": [ + "winterstefan" + ] + }, + { + "pr": "10665", + "title": "[FIX] Channel owner was being set as muted when creating a read-only channel", + "userLogin": "MarcosSpessatto", + "milestone": "0.64.2", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10681", + "title": "[FIX] SAML wasn't working correctly when running multiple instances", + "userLogin": "Hudell", + "milestone": "0.64.2", + "contributors": [ + "Hudell", + "rodrigok", + "web-flow" + ] + }, + { + "pr": "10812", + "title": "Release 0.64.2", + "userLogin": "rodrigok", + "milestone": "0.64.2", + "contributors": [ + "Hudell", + "rodrigok", + "web-flow", + "MarcosSpessatto", + "winterstefan", + "gdelavald", + "peccu", + "Sameesunkaria", + "sampaiodiego", + "engelgabriel", + "karlprieb", + "cardoso", + "erhan-" + ] + }, + { + "pr": "10660", + "title": "Release 0.64.1", + "userLogin": "rodrigok", + "milestone": "0.64.1", + "contributors": [ + "saplla", + "web-flow", + "engelgabriel", + "graywolf336", + "rodrigok", + "sampaiodiego" + ] + }, + { + "pr": "10613", + "title": "Release 0.64.0", + "userLogin": "rodrigok", + "milestone": "0.64.0", + "contributors": [ + "rodrigok", + "geekgonecrazy", + "web-flow", + "graywolf336", + "TwizzyDizzy", + "christianh814", + "tttt-conan", + "gdelavald", + "ggazzo" + ] + }, + { + "pr": "10504", + "title": "Release 0.63.3", + "userLogin": "graywolf336", + "contributors": [ + "rafaelks", + "graywolf336" + ] + }, + { + "pr": "10476", + "title": "Release 0.63.2", + "userLogin": "graywolf336", + "contributors": [ + "graywolf336", + "web-flow" + ] + }, + { + "pr": "10408", + "title": "add redhat dockerfile to master", + "userLogin": "geekgonecrazy", + "contributors": [ + "geekgonecrazy" + ] + } + ], + "0.65.0-rc.1": [ + { + "pr": "10837", + "title": "[FIX] Internal Error when requesting user data download", + "userLogin": "Hudell", + "milestone": "0.65.0", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "10835", + "title": "[FIX] Broadcast channels were showing reply button for deleted messages and generating wrong reply links some times", + "userLogin": "ggazzo", + "milestone": "0.65.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "10833", + "title": "Fix: Regression in REST API endpoint `/me` ", + "userLogin": "MarcosSpessatto", + "milestone": "0.65.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10734", + "title": "[FIX] User's preference `Unread on Top` wasn't working for LiveChat rooms", + "userLogin": "renatobecker", + "milestone": "0.65.0", + "contributors": [ + "renatobecker", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "10753", + "title": "[NEW] Add permission `view-broadcast-member-list`", + "userLogin": "cardoso", + "milestone": "0.65.0", + "contributors": [ + "cardoso", + "web-flow" + ] + }, + { + "pr": "10715", + "title": "[FIX] Cancel button wasn't working while uploading file", + "userLogin": "Mr-Gryphon", + "milestone": "0.65.0", + "contributors": [ + "Mr-Gryphon", + "web-flow", + "karlprieb" + ] + } + ], + "0.65.0-rc.2": [ + { + "pr": "10847", + "title": "Regression: Fix email notification preference not showing correct selected value", + "userLogin": "sampaiodiego", + "milestone": "0.65.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "10853", + "title": "Apps: Command previews are clickable & Apps Framework is controlled via a setting", + "userLogin": "graywolf336", + "milestone": "0.65.0", + "contributors": [ + "graywolf336" + ] + }, + { + "pr": "10840", + "title": "[FIX] Missing pagination fields in the response of REST /directory endpoint", + "userLogin": "MarcosSpessatto", + "milestone": "0.65.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "10846", + "title": "[FIX] Layout badge cutting on unread messages for long names", + "userLogin": "kos4live", + "milestone": "0.65.0", + "contributors": [ + "kos4live" + ] + }, + { + "pr": "10848", + "title": "Regression: Make settings `Site_Name` and `Language` public again", + "userLogin": "rodrigok", + "milestone": "0.65.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10520", + "title": "Fix: Clarify the wording of the release issue template", + "userLogin": "graywolf336", + "contributors": [ + "graywolf336", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "10836", + "title": "Fix: Regression on users avatar in admin pages", + "userLogin": "ggazzo", + "milestone": "0.65.0", + "contributors": [ + "ggazzo", + "rodrigok", + "web-flow" + ] + } + ], + "0.65.0-rc.3": [ + { + "pr": "10875", + "title": "[FIX] Slack-Bridge bug when migrating to 0.64.1", + "userLogin": "iliaal", + "milestone": "0.65.0", + "contributors": [ + null + ] + }, + { + "pr": "10882", + "title": "Fix: Manage apps layout was a bit confuse", + "userLogin": "gdelavald", + "milestone": "0.65.0", + "contributors": [ + "gdelavald", + "ggazzo", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "10886", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "milestone": "0.65.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "10887", + "title": "Fix: Regression Lazyload fix shuffle avatars", + "userLogin": "ggazzo", + "milestone": "0.65.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "10883", + "title": "[FIX] Horizontally align items in preview message", + "userLogin": "gdelavald", + "milestone": "0.65.0", + "contributors": [ + "gdelavald" + ] + }, + { + "pr": "10857", + "title": "Fix: typo on error message for push token API", + "userLogin": "rafaelks", + "milestone": "0.65.0", + "contributors": [ + "rafaelks", + "web-flow" + ] + }, + { + "pr": "10878", + "title": "[FIX] The first users was not set as admin some times", + "userLogin": "rodrigok", + "milestone": "0.65.0", + "contributors": [ + "rodrigok" + ] + } + ], + "0.65.0": [] +} \ No newline at end of file diff --git a/.github/issue-templates/release.md b/.github/issue-templates/release.md index 6918d52ab621..f5691b238f12 100644 --- a/.github/issue-templates/release.md +++ b/.github/issue-templates/release.md @@ -1,16 +1,16 @@ # Release {version} We are releasing a new version, this issue will keep track of the progress between the first release candidate (20th of each month) to the final release (27th of each month). -After the 20th of each month we start the release process that ends 7 days after, during that period we enter a Feature Freeze. While in the Feature Freeze, we will only be merging bug fixes and not new features. +Beginning on the 20th of each month, we will start the release process which ends 7 days later (the 27th). During this period of time, we will enter a "Feature Freeze". This Feature Freeze means that we will only be merging pull requests which fix bugs and not ones which add new features. -For any regression, open a new issue and link to this one. +When you find a bug that is a regression, please open a new issue and link it to this one. ## Before Release - Preparation - 1 business day before the day 20th - [x] Create the issue to track the release progress -- [ ] Define the highlights from release PRs as suggestion to be included on Blog Post -- [ ] Talk to the Marketing Team about the Blog Post release -- [ ] Talk to the Documentation Team about the Docs release +- [ ] Define the highlights from release PRs as suggestion to be included on Blog Post +- [ ] Talk to the Marketing Team about starting the release Blog Post +- [ ] Talk to the Documentation Team about ensuring the Docs are up to date and all pull requests are merged - [ ] Sync translations from [LingoHub](https://translate.lingohub.com/rocketchat/rocket-dot-chat/dashboard) ## Release Candidate 1 - On the 20th @@ -19,8 +19,8 @@ For any regression, open a new issue and link to this one. - [ ] On branch `release-candidate` run `npm run release` and follow the steps - [ ] Publish the branch and the generated tag - [ ] Edit the tag on GitHub and paste the generated History removing the version from the first line and mark the checkbox **This is a pre-release** -- [ ] Ensure the build is passing on CircleCI -- [ ] Ensure the build is passing on Docker Hub +- [ ] Ensure the build is passing on [CircleCI](https://circleci.com/gh/RocketChat/Rocket.Chat) +- [ ] Ensure the build is passing on [Docker Hub](https://hub.docker.com/r/rocketchat/rocket.chat/builds/) ## Final Release - On the 27th @@ -44,16 +44,18 @@ For any regression, open a new issue and link to this one. - [ ] Paste the history removing the version from the first line - [ ] Save as **draft** - [ ] Create a PR from the branch `release-{version}` with the same history from the tag/release -- [ ] Ensure the build is passing on CircleCI -- [ ] Ensure the build is passing on Docker Hub +- [ ] Ensure the build is passing on [CircleCI](https://circleci.com/gh/RocketChat/Rocket.Chat) +- [ ] Ensure the build is passing on [Docker Hub](https://hub.docker.com/r/rocketchat/rocket.chat/builds/) - [ ] When build is passing ask for approval - [ ] When approved merge it! - [ ] When merged edit the release/tag and publish it ## After Release - Conclusion - 1 business day after the 27th -- [ ] Check if related issues was closed -- [ ] Check if related issues was assigned to the correct milestone -- [ ] Check with the Marketing Team about the Blog Post release +- [ ] Ensure all of the related issues were closed +- [ ] Determine if all of the related issues were correctly assigned to the this version's milestone +- [ ] Get an update from Marketing Team about the release Blog Post - [ ] Check with the Documentation Team about the Docs release -- [ ] Create a Sync PR to merge back master to develop +- [ ] Create a Sync PR to merge `master` back into `develop` +- [ ] Ensure the build is passing on [CircleCI](https://circleci.com/gh/RocketChat/Rocket.Chat) +- [ ] When build has passed, ask for approval and wait - [ ] Merge Sync PR diff --git a/.meteor/packages b/.meteor/packages index 4e496bd5640a..f490350b0352 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -112,6 +112,7 @@ rocketchat:push-notifications rocketchat:reactions rocketchat:apps rocketchat:sandstorm +rocketchat:setup-wizard rocketchat:slackbridge rocketchat:slashcommands-archive rocketchat:slashcommands-asciiarts @@ -189,3 +190,4 @@ rocketchat:version-check rocketchat:search chatpal:search +rocketchat:lazy-load diff --git a/.meteor/versions b/.meteor/versions index e334e1c48979..c71a541b67d8 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -174,6 +174,7 @@ rocketchat:internal-hubot@0.0.1 rocketchat:irc@0.0.2 rocketchat:issuelinks@0.0.1 rocketchat:katex@0.0.1 +rocketchat:lazy-load@0.0.1 rocketchat:ldap@0.0.1 rocketchat:lib@0.0.1 rocketchat:livechat@0.0.1 @@ -202,6 +203,7 @@ rocketchat:push-notifications@0.0.1 rocketchat:reactions@0.0.1 rocketchat:sandstorm@0.0.1 rocketchat:search@0.0.1 +rocketchat:setup-wizard@0.0.1 rocketchat:slackbridge@0.0.1 rocketchat:slashcommands-archive@0.0.1 rocketchat:slashcommands-asciiarts@0.0.1 diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index b5e3e9786fe8..6fcf7cb38375 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -19,9 +19,9 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Rocket.Chat"), - appVersion = 62, # Increment this for every release. + appVersion = 70, # Increment this for every release. - appMarketingVersion = (defaultText = "0.64.0-develop"), + appMarketingVersion = (defaultText = "0.65.0"), # Human-readable representation of appVersion. Should match the way you # identify versions of your app in documentation and marketing. diff --git a/.scripts/set-version.js b/.scripts/set-version.js index cad1c3b602da..74e98540c618 100644 --- a/.scripts/set-version.js +++ b/.scripts/set-version.js @@ -4,7 +4,7 @@ const path = require('path'); const fs = require('fs'); const semver = require('semver'); const inquirer = require('inquirer'); -const execSync = require('child_process').execSync; +// const execSync = require('child_process').execSync; const git = require('simple-git/promise')(process.cwd()); let pkgJson = {}; @@ -92,7 +92,7 @@ git.status() })); }) .then(() => { - execSync('conventional-changelog --config .github/changelog.js -i HISTORY.md -s'); + // execSync('conventional-changelog --config .github/changelog.js -i HISTORY.md -s'); return inquirer.prompt([{ type: 'confirm', diff --git a/.travis/snap.sh b/.travis/snap.sh index c8a57fb46834..4e5f9ab88c65 100755 --- a/.travis/snap.sh +++ b/.travis/snap.sh @@ -17,7 +17,7 @@ elif [[ $TRAVIS_TAG ]]; then RC_VERSION=$TRAVIS_TAG else CHANNEL=edge - RC_VERSION=0.64.0-develop + RC_VERSION=0.65.0 fi echo "Preparing to trigger a snap release for $CHANNEL channel" diff --git a/.vscode/launch.json b/.vscode/launch.json index 2327e0f4b6ef..05ddc20b9795 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -38,10 +38,7 @@ "sourceMapPathOverrides": { "meteor://💻app/packages/rocketchat:*": "${workspaceFolder}/packages/rocketchat-*" }, - "protocol": "inspector", - "env": { - "USE_UNRELEASED_ROCKETAPPS_FRAMEWORK": "true" - } + "protocol": "inspector" }, { "type": "node", @@ -57,10 +54,7 @@ "sourceMapPathOverrides": { "meteor://💻app/packages/rocketchat:*": "${workspaceFolder}/packages/rocketchat-*" }, - "protocol": "inspector", - "env": { - "USE_UNRELEASED_ROCKETAPPS_FRAMEWORK": "true" - } + "protocol": "inspector" }, { "type": "node", diff --git a/HISTORY.md b/HISTORY.md index e4d09df6415b..33c9585dca53 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,6 +1,353 @@ - -# 0.64.0-develop (2018-04-07) +# 0.65.0 +`2018-05-27 · 17 🎉 · 24 🐛 · 35 🔍 · 17 👩‍💻👨‍💻` + +### 🎉 New features + +- Implement a local password policy ([#9857](https://github.com/RocketChat/Rocket.Chat/pull/9857)) +- Options to enable/disable each Livechat registration form field ([#10584](https://github.com/RocketChat/Rocket.Chat/pull/10584)) +- Return the result of the `/me` endpoint within the result of the `/login` endpoint ([#10677](https://github.com/RocketChat/Rocket.Chat/pull/10677)) +- Lazy load image attachments ([#10608](https://github.com/RocketChat/Rocket.Chat/pull/10608)) +- View pinned message's attachment ([#10214](https://github.com/RocketChat/Rocket.Chat/pull/10214) by [@c0dzilla](https://github.com/c0dzilla)) +- Add REST API endpoint `users.getUsernameSuggestion` to get username suggestion ([#10702](https://github.com/RocketChat/Rocket.Chat/pull/10702)) +- REST API endpoint `settings` now allow set colors and trigger actions ([#10488](https://github.com/RocketChat/Rocket.Chat/pull/10488) by [@ThomasRoehl](https://github.com/ThomasRoehl)) +- Add REST endpoint `subscriptions.unread` to mark messages as unread ([#10778](https://github.com/RocketChat/Rocket.Chat/pull/10778)) +- REST API endpoint `/me` now returns all the settings, including the default values ([#10662](https://github.com/RocketChat/Rocket.Chat/pull/10662)) +- Now is possible to access files using header authorization (`x-user-id` and `x-auth-token`) ([#10741](https://github.com/RocketChat/Rocket.Chat/pull/10741)) +- Add REST API endpoints `channels.counters`, `groups.counters and `im.counters` ([#9679](https://github.com/RocketChat/Rocket.Chat/pull/9679) by [@xbolshe](https://github.com/xbolshe)) +- Add REST API endpoints `channels.setCustomFields` and `groups.setCustomFields` ([#9733](https://github.com/RocketChat/Rocket.Chat/pull/9733) by [@xbolshe](https://github.com/xbolshe)) +- Add REST endpoints `channels.roles` & `groups.roles` ([#10607](https://github.com/RocketChat/Rocket.Chat/pull/10607) by [@cardoso](https://github.com/cardoso)) +- Add more options for Wordpress OAuth configuration ([#10724](https://github.com/RocketChat/Rocket.Chat/pull/10724)) +- Setup Wizard ([#10523](https://github.com/RocketChat/Rocket.Chat/pull/10523)) +- Improvements to notifications logic ([#10686](https://github.com/RocketChat/Rocket.Chat/pull/10686)) +- Add permission `view-broadcast-member-list` ([#10753](https://github.com/RocketChat/Rocket.Chat/pull/10753) by [@cardoso](https://github.com/cardoso)) + +### 🐛 Bug fixes + +- Livechat managers were not being able to send messages in some cases ([#10663](https://github.com/RocketChat/Rocket.Chat/pull/10663)) +- Livechat settings not appearing correctly ([#10612](https://github.com/RocketChat/Rocket.Chat/pull/10612)) +- Enabling `Collapse Embedded Media by Default` was hiding replies and quotes ([#10427](https://github.com/RocketChat/Rocket.Chat/pull/10427) by [@c0dzilla](https://github.com/c0dzilla)) +- Missing option to disable/enable System Messages ([#10704](https://github.com/RocketChat/Rocket.Chat/pull/10704)) +- Remove outdated translations of Internal Hubot's description of Scripts to Load that were pointing to a non existent address ([#10448](https://github.com/RocketChat/Rocket.Chat/pull/10448)) +- UI was not disabling the actions when users has had no permissions to create channels or add users to rooms ([#10564](https://github.com/RocketChat/Rocket.Chat/pull/10564) by [@cfunkles](https://github.com/cfunkles) & [@chuckAtCataworx](https://github.com/chuckAtCataworx)) +- Private settings were not being cleared from client cache in some cases ([#10625](https://github.com/RocketChat/Rocket.Chat/pull/10625)) +- Not escaping special chars on mentions ([#10793](https://github.com/RocketChat/Rocket.Chat/pull/10793) by [@erhan-](https://github.com/erhan-)) +- Send a message when muted returns inconsistent result in chat.sendMessage ([#10720](https://github.com/RocketChat/Rocket.Chat/pull/10720)) +- Regression: Empty content on announcement modal ([#10733](https://github.com/RocketChat/Rocket.Chat/pull/10733)) +- Missing attachment description when Rocket.Chat Apps were enabled ([#10705](https://github.com/RocketChat/Rocket.Chat/pull/10705)) +- Improve desktop notification formatting ([#10445](https://github.com/RocketChat/Rocket.Chat/pull/10445) by [@Sameesunkaria](https://github.com/Sameesunkaria)) +- Message box emoji icon was flickering when typing a text ([#10678](https://github.com/RocketChat/Rocket.Chat/pull/10678)) +- Channel owner was being set as muted when creating a read-only channel ([#10665](https://github.com/RocketChat/Rocket.Chat/pull/10665)) +- SAML wasn't working correctly when running multiple instances ([#10681](https://github.com/RocketChat/Rocket.Chat/pull/10681)) +- Internal Error when requesting user data download ([#10837](https://github.com/RocketChat/Rocket.Chat/pull/10837)) +- Broadcast channels were showing reply button for deleted messages and generating wrong reply links some times ([#10835](https://github.com/RocketChat/Rocket.Chat/pull/10835)) +- User's preference `Unread on Top` wasn't working for LiveChat rooms ([#10734](https://github.com/RocketChat/Rocket.Chat/pull/10734)) +- Cancel button wasn't working while uploading file ([#10715](https://github.com/RocketChat/Rocket.Chat/pull/10715) by [@Mr-Gryphon](https://github.com/Mr-Gryphon)) +- Missing pagination fields in the response of REST /directory endpoint ([#10840](https://github.com/RocketChat/Rocket.Chat/pull/10840)) +- Layout badge cutting on unread messages for long names ([#10846](https://github.com/RocketChat/Rocket.Chat/pull/10846) by [@kos4live](https://github.com/kos4live)) +- Slack-Bridge bug when migrating to 0.64.1 ([#10875](https://github.com/RocketChat/Rocket.Chat/pull/10875)) +- Horizontally align items in preview message ([#10883](https://github.com/RocketChat/Rocket.Chat/pull/10883)) +- The first users was not set as admin some times ([#10878](https://github.com/RocketChat/Rocket.Chat/pull/10878)) + +
+🔍 Minor changes + +- Apps: Command Previews, Message and Room Removal Events ([#10822](https://github.com/RocketChat/Rocket.Chat/pull/10822)) +- Develop sync ([#10815](https://github.com/RocketChat/Rocket.Chat/pull/10815) by [@nsuchy](https://github.com/nsuchy)) +- Major dependencies update ([#10661](https://github.com/RocketChat/Rocket.Chat/pull/10661)) +- Prevent setup wizard redirects ([#10811](https://github.com/RocketChat/Rocket.Chat/pull/10811)) +- Prometheus: Add metric to track hooks time ([#10798](https://github.com/RocketChat/Rocket.Chat/pull/10798)) +- Regression: Autorun of wizard was not destroyed after completion ([#10802](https://github.com/RocketChat/Rocket.Chat/pull/10802)) +- Prometheus: Fix notification metric ([#10803](https://github.com/RocketChat/Rocket.Chat/pull/10803)) +- Regression: Fix wrong wizard field name ([#10804](https://github.com/RocketChat/Rocket.Chat/pull/10804)) +- Prometheus: Improve metric names ([#10789](https://github.com/RocketChat/Rocket.Chat/pull/10789)) +- Improvement to push notifications on direct messages ([#10788](https://github.com/RocketChat/Rocket.Chat/pull/10788)) +- Better metric for notifications ([#10786](https://github.com/RocketChat/Rocket.Chat/pull/10786)) +- Add badge back to push notifications ([#10779](https://github.com/RocketChat/Rocket.Chat/pull/10779)) +- Wizard improvements ([#10776](https://github.com/RocketChat/Rocket.Chat/pull/10776)) +- Add setting and expose prometheus on port 9100 ([#10766](https://github.com/RocketChat/Rocket.Chat/pull/10766)) +- Regression: Fix notifications for direct messages ([#10760](https://github.com/RocketChat/Rocket.Chat/pull/10760)) +- More improvements on send notifications logic ([#10736](https://github.com/RocketChat/Rocket.Chat/pull/10736)) +- LingoHub based on develop ([#10691](https://github.com/RocketChat/Rocket.Chat/pull/10691)) +- Add `npm run postinstall` into example build script ([#10524](https://github.com/RocketChat/Rocket.Chat/pull/10524) by [@peccu](https://github.com/peccu)) +- Correct links in README file ([#10674](https://github.com/RocketChat/Rocket.Chat/pull/10674) by [@winterstefan](https://github.com/winterstefan)) +- Release 0.64.2 ([#10812](https://github.com/RocketChat/Rocket.Chat/pull/10812) by [@Sameesunkaria](https://github.com/Sameesunkaria) & [@cardoso](https://github.com/cardoso) & [@erhan-](https://github.com/erhan-) & [@peccu](https://github.com/peccu) & [@winterstefan](https://github.com/winterstefan)) +- Release 0.64.1 ([#10660](https://github.com/RocketChat/Rocket.Chat/pull/10660) by [@saplla](https://github.com/saplla)) +- Release 0.64.0 ([#10613](https://github.com/RocketChat/Rocket.Chat/pull/10613) by [@TwizzyDizzy](https://github.com/TwizzyDizzy) & [@christianh814](https://github.com/christianh814) & [@tttt-conan](https://github.com/tttt-conan)) +- Release 0.63.3 ([#10504](https://github.com/RocketChat/Rocket.Chat/pull/10504)) +- Release 0.63.2 ([#10476](https://github.com/RocketChat/Rocket.Chat/pull/10476)) +- add redhat dockerfile to master ([#10408](https://github.com/RocketChat/Rocket.Chat/pull/10408)) +- Fix: Regression in REST API endpoint `/me` ([#10833](https://github.com/RocketChat/Rocket.Chat/pull/10833)) +- Regression: Fix email notification preference not showing correct selected value ([#10847](https://github.com/RocketChat/Rocket.Chat/pull/10847)) +- Apps: Command previews are clickable & Apps Framework is controlled via a setting ([#10853](https://github.com/RocketChat/Rocket.Chat/pull/10853)) +- Regression: Make settings `Site_Name` and `Language` public again ([#10848](https://github.com/RocketChat/Rocket.Chat/pull/10848)) +- Fix: Clarify the wording of the release issue template ([#10520](https://github.com/RocketChat/Rocket.Chat/pull/10520)) +- Fix: Regression on users avatar in admin pages ([#10836](https://github.com/RocketChat/Rocket.Chat/pull/10836)) +- Fix: Manage apps layout was a bit confuse ([#10882](https://github.com/RocketChat/Rocket.Chat/pull/10882)) +- LingoHub based on develop ([#10886](https://github.com/RocketChat/Rocket.Chat/pull/10886)) +- Fix: Regression Lazyload fix shuffle avatars ([#10887](https://github.com/RocketChat/Rocket.Chat/pull/10887)) +- Fix: typo on error message for push token API ([#10857](https://github.com/RocketChat/Rocket.Chat/pull/10857)) + +
+ +### 👩‍💻👨‍💻 Contributors 😍 + +- [@Mr-Gryphon](https://github.com/Mr-Gryphon) +- [@Sameesunkaria](https://github.com/Sameesunkaria) +- [@ThomasRoehl](https://github.com/ThomasRoehl) +- [@TwizzyDizzy](https://github.com/TwizzyDizzy) +- [@c0dzilla](https://github.com/c0dzilla) +- [@cardoso](https://github.com/cardoso) +- [@cfunkles](https://github.com/cfunkles) +- [@christianh814](https://github.com/christianh814) +- [@chuckAtCataworx](https://github.com/chuckAtCataworx) +- [@erhan-](https://github.com/erhan-) +- [@kos4live](https://github.com/kos4live) +- [@nsuchy](https://github.com/nsuchy) +- [@peccu](https://github.com/peccu) +- [@saplla](https://github.com/saplla) +- [@tttt-conan](https://github.com/tttt-conan) +- [@winterstefan](https://github.com/winterstefan) +- [@xbolshe](https://github.com/xbolshe) + +# 0.64.2 +`2018-05-18 · 8 🎉 · 16 🐛 · 31 🔍 · 5 👩‍💻👨‍💻` + +### 🎉 New features + +- Add REST endpoints `channels.roles` & `groups.roles` ([#10607](https://github.com/RocketChat/Rocket.Chat/pull/10607) by [@cardoso](https://github.com/cardoso)) +- Add more options for Wordpress OAuth configuration ([#10724](https://github.com/RocketChat/Rocket.Chat/pull/10724)) +- Setup Wizard ([#10523](https://github.com/RocketChat/Rocket.Chat/pull/10523)) +- Improvements to notifications logic ([#10686](https://github.com/RocketChat/Rocket.Chat/pull/10686)) +- Add REST endpoints `channels.roles` & `groups.roles` ([#10607](https://github.com/RocketChat/Rocket.Chat/pull/10607) by [@cardoso](https://github.com/cardoso)) +- Add more options for Wordpress OAuth configuration ([#10724](https://github.com/RocketChat/Rocket.Chat/pull/10724)) +- Setup Wizard ([#10523](https://github.com/RocketChat/Rocket.Chat/pull/10523)) +- Improvements to notifications logic ([#10686](https://github.com/RocketChat/Rocket.Chat/pull/10686)) + +### 🐛 Bug fixes + +- Not escaping special chars on mentions ([#10793](https://github.com/RocketChat/Rocket.Chat/pull/10793) by [@erhan-](https://github.com/erhan-)) +- Send a message when muted returns inconsistent result in chat.sendMessage ([#10720](https://github.com/RocketChat/Rocket.Chat/pull/10720)) +- Regression: Empty content on announcement modal ([#10733](https://github.com/RocketChat/Rocket.Chat/pull/10733)) +- Missing attachment description when Rocket.Chat Apps were enabled ([#10705](https://github.com/RocketChat/Rocket.Chat/pull/10705)) +- Improve desktop notification formatting ([#10445](https://github.com/RocketChat/Rocket.Chat/pull/10445) by [@Sameesunkaria](https://github.com/Sameesunkaria)) +- Message box emoji icon was flickering when typing a text ([#10678](https://github.com/RocketChat/Rocket.Chat/pull/10678)) +- Channel owner was being set as muted when creating a read-only channel ([#10665](https://github.com/RocketChat/Rocket.Chat/pull/10665)) +- SAML wasn't working correctly when running multiple instances ([#10681](https://github.com/RocketChat/Rocket.Chat/pull/10681)) +- Send a message when muted returns inconsistent result in chat.sendMessage ([#10720](https://github.com/RocketChat/Rocket.Chat/pull/10720)) +- Regression: Empty content on announcement modal ([#10733](https://github.com/RocketChat/Rocket.Chat/pull/10733)) +- Missing attachment description when Rocket.Chat Apps were enabled ([#10705](https://github.com/RocketChat/Rocket.Chat/pull/10705)) +- Improve desktop notification formatting ([#10445](https://github.com/RocketChat/Rocket.Chat/pull/10445) by [@Sameesunkaria](https://github.com/Sameesunkaria)) +- Message box emoji icon was flickering when typing a text ([#10678](https://github.com/RocketChat/Rocket.Chat/pull/10678)) +- Channel owner was being set as muted when creating a read-only channel ([#10665](https://github.com/RocketChat/Rocket.Chat/pull/10665)) +- SAML wasn't working correctly when running multiple instances ([#10681](https://github.com/RocketChat/Rocket.Chat/pull/10681)) +- Not escaping special chars on mentions ([#10793](https://github.com/RocketChat/Rocket.Chat/pull/10793) by [@erhan-](https://github.com/erhan-)) + +
+🔍 Minor changes + +- Release 0.64.2 ([#10812](https://github.com/RocketChat/Rocket.Chat/pull/10812) by [@Sameesunkaria](https://github.com/Sameesunkaria) & [@cardoso](https://github.com/cardoso) & [@erhan-](https://github.com/erhan-) & [@peccu](https://github.com/peccu) & [@winterstefan](https://github.com/winterstefan)) +- Prometheus: Add metric to track hooks time ([#10798](https://github.com/RocketChat/Rocket.Chat/pull/10798)) +- Regression: Autorun of wizard was not destroyed after completion ([#10802](https://github.com/RocketChat/Rocket.Chat/pull/10802)) +- Prometheus: Fix notification metric ([#10803](https://github.com/RocketChat/Rocket.Chat/pull/10803)) +- Regression: Fix wrong wizard field name ([#10804](https://github.com/RocketChat/Rocket.Chat/pull/10804)) +- Prometheus: Improve metric names ([#10789](https://github.com/RocketChat/Rocket.Chat/pull/10789)) +- Improvement to push notifications on direct messages ([#10788](https://github.com/RocketChat/Rocket.Chat/pull/10788)) +- Better metric for notifications ([#10786](https://github.com/RocketChat/Rocket.Chat/pull/10786)) +- Add badge back to push notifications ([#10779](https://github.com/RocketChat/Rocket.Chat/pull/10779)) +- Wizard improvements ([#10776](https://github.com/RocketChat/Rocket.Chat/pull/10776)) +- Add setting and expose prometheus on port 9100 ([#10766](https://github.com/RocketChat/Rocket.Chat/pull/10766)) +- Regression: Fix notifications for direct messages ([#10760](https://github.com/RocketChat/Rocket.Chat/pull/10760)) +- More improvements on send notifications logic ([#10736](https://github.com/RocketChat/Rocket.Chat/pull/10736)) +- LingoHub based on develop ([#10691](https://github.com/RocketChat/Rocket.Chat/pull/10691)) +- Add `npm run postinstall` into example build script ([#10524](https://github.com/RocketChat/Rocket.Chat/pull/10524) by [@peccu](https://github.com/peccu)) +- Correct links in README file ([#10674](https://github.com/RocketChat/Rocket.Chat/pull/10674) by [@winterstefan](https://github.com/winterstefan)) +- More improvements on send notifications logic ([#10736](https://github.com/RocketChat/Rocket.Chat/pull/10736)) +- LingoHub based on develop ([#10691](https://github.com/RocketChat/Rocket.Chat/pull/10691)) +- Add `npm run postinstall` into example build script ([#10524](https://github.com/RocketChat/Rocket.Chat/pull/10524) by [@peccu](https://github.com/peccu)) +- Correct links in README file ([#10674](https://github.com/RocketChat/Rocket.Chat/pull/10674) by [@winterstefan](https://github.com/winterstefan)) +- Prometheus: Improve metric names ([#10789](https://github.com/RocketChat/Rocket.Chat/pull/10789)) +- Improvement to push notifications on direct messages ([#10788](https://github.com/RocketChat/Rocket.Chat/pull/10788)) +- Better metric for notifications ([#10786](https://github.com/RocketChat/Rocket.Chat/pull/10786)) +- Add badge back to push notifications ([#10779](https://github.com/RocketChat/Rocket.Chat/pull/10779)) +- Wizard improvements ([#10776](https://github.com/RocketChat/Rocket.Chat/pull/10776)) +- Add setting and expose prometheus on port 9100 ([#10766](https://github.com/RocketChat/Rocket.Chat/pull/10766)) +- Regression: Fix notifications for direct messages ([#10760](https://github.com/RocketChat/Rocket.Chat/pull/10760)) +- Prometheus: Add metric to track hooks time ([#10798](https://github.com/RocketChat/Rocket.Chat/pull/10798)) +- Regression: Autorun of wizard was not destroyed after completion ([#10802](https://github.com/RocketChat/Rocket.Chat/pull/10802)) +- Prometheus: Fix notification metric ([#10803](https://github.com/RocketChat/Rocket.Chat/pull/10803)) +- Regression: Fix wrong wizard field name ([#10804](https://github.com/RocketChat/Rocket.Chat/pull/10804)) + +
+ +### 👩‍💻👨‍💻 Contributors 😍 + +- [@Sameesunkaria](https://github.com/Sameesunkaria) +- [@cardoso](https://github.com/cardoso) +- [@erhan-](https://github.com/erhan-) +- [@peccu](https://github.com/peccu) +- [@winterstefan](https://github.com/winterstefan) + +# 0.64.1 +`2018-05-03 · 1 🎉 · 2 🐛 · 3 🔍 · 1 👩‍💻👨‍💻` + +### 🎉 New features + +- Store the last sent message to show bellow the room's name by default ([#10597](https://github.com/RocketChat/Rocket.Chat/pull/10597)) + +### 🐛 Bug fixes + +- E-mails were hidden some information ([#10615](https://github.com/RocketChat/Rocket.Chat/pull/10615)) +- Regression on 0.64.0 was freezing the application when posting some URLs ([#10627](https://github.com/RocketChat/Rocket.Chat/pull/10627)) + +
+🔍 Minor changes + +- Support passing extra connection options to the Mongo driver ([#10529](https://github.com/RocketChat/Rocket.Chat/pull/10529) by [@saplla](https://github.com/saplla)) +- Regression: Updating an App on multi-instance servers wasn't working ([#10611](https://github.com/RocketChat/Rocket.Chat/pull/10611)) +- Dependencies update ([#10648](https://github.com/RocketChat/Rocket.Chat/pull/10648)) + +
+ +### 👩‍💻👨‍💻 Contributors 😍 + +- [@saplla](https://github.com/saplla) + +# 0.64.0 +`2018-04-28 · 2 ️️️⚠️ · 18 🎉 · 44 🐛 · 33 🔍 · 18 👩‍💻👨‍💻` + +### ⚠️ BREAKING CHANGES + +- Validate incoming message schema ([#9922](https://github.com/RocketChat/Rocket.Chat/pull/9922)) +- The property "settings" is no longer available to regular users via rest api ([#10411](https://github.com/RocketChat/Rocket.Chat/pull/10411)) + +### 🎉 New features + +- Option to mute group mentions (@all and @here) ([#10502](https://github.com/RocketChat/Rocket.Chat/pull/10502)) +- GDPR - Right to access and Data Portability ([#9906](https://github.com/RocketChat/Rocket.Chat/pull/9906)) +- Broadcast Channels ([#9950](https://github.com/RocketChat/Rocket.Chat/pull/9950)) +- Option to ignore users on channels ([#10517](https://github.com/RocketChat/Rocket.Chat/pull/10517)) +- Search Provider Framework ([#10110](https://github.com/RocketChat/Rocket.Chat/pull/10110) by [@tkurz](https://github.com/tkurz)) +- REST API endpoint `/directory` ([#10442](https://github.com/RocketChat/Rocket.Chat/pull/10442)) +- Body of the payload on an incoming webhook is included on the request object ([#10259](https://github.com/RocketChat/Rocket.Chat/pull/10259)) +- REST endpoint to recover forgotten password ([#10371](https://github.com/RocketChat/Rocket.Chat/pull/10371)) +- REST endpoint to report messages ([#10354](https://github.com/RocketChat/Rocket.Chat/pull/10354)) +- Livechat setting to customize ended conversation message ([#10108](https://github.com/RocketChat/Rocket.Chat/pull/10108)) +- Twilio MMS support for LiveChat integration ([#7964](https://github.com/RocketChat/Rocket.Chat/pull/7964) by [@t3hchipmunk](https://github.com/t3hchipmunk)) +- REST API endpoint `rooms.favorite` to favorite and unfavorite rooms ([#10342](https://github.com/RocketChat/Rocket.Chat/pull/10342)) +- Add internal API to handle room announcements ([#10396](https://github.com/RocketChat/Rocket.Chat/pull/10396)) +- Add message preview when quoting another message ([#10437](https://github.com/RocketChat/Rocket.Chat/pull/10437)) +- Prevent the browser to autocomplete some setting fields ([#10439](https://github.com/RocketChat/Rocket.Chat/pull/10439)) +- Shows user's real name on autocomplete popup ([#10444](https://github.com/RocketChat/Rocket.Chat/pull/10444)) +- Automatically trigger Redhat registry build when tagging new release ([#10414](https://github.com/RocketChat/Rocket.Chat/pull/10414)) +- Add information regarding Zapier and Bots to the integrations page ([#10574](https://github.com/RocketChat/Rocket.Chat/pull/10574)) + +### 🐛 Bug fixes + +- Missing "Administration" menu for users with some administration permissions ([#10551](https://github.com/RocketChat/Rocket.Chat/pull/10551) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) +- Member list search with no results ([#10599](https://github.com/RocketChat/Rocket.Chat/pull/10599)) +- Integrations with room data not having the usernames filled in ([#10576](https://github.com/RocketChat/Rocket.Chat/pull/10576)) +- Add user object to responses in /*.files Rest endpoints ([#10480](https://github.com/RocketChat/Rocket.Chat/pull/10480)) +- Missing user data on files uploaded through the API ([#10473](https://github.com/RocketChat/Rocket.Chat/pull/10473)) +- Rename method to clean history of messages ([#10498](https://github.com/RocketChat/Rocket.Chat/pull/10498)) +- REST spotlight API wasn't allowing searches with # and @ ([#10410](https://github.com/RocketChat/Rocket.Chat/pull/10410)) +- Dropdown elements were using old styles ([#10482](https://github.com/RocketChat/Rocket.Chat/pull/10482) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) +- Directory sort and column sizes were wrong ([#10403](https://github.com/RocketChat/Rocket.Chat/pull/10403)) +- REST API OAuth services endpoint were missing fields and flag to indicate custom services ([#10299](https://github.com/RocketChat/Rocket.Chat/pull/10299)) +- Error messages weren't been displayed when email verification fails ([#10446](https://github.com/RocketChat/Rocket.Chat/pull/10446)) +- Wrong column positions in the directory search for users ([#10454](https://github.com/RocketChat/Rocket.Chat/pull/10454) by [@sumedh123](https://github.com/sumedh123)) +- Custom fields was misaligned in registration form ([#10463](https://github.com/RocketChat/Rocket.Chat/pull/10463) by [@dschuan](https://github.com/dschuan)) +- Unique identifier file not really being unique ([#10341](https://github.com/RocketChat/Rocket.Chat/pull/10341) by [@abernix](https://github.com/abernix)) +- Empty panel after changing a user's username ([#10404](https://github.com/RocketChat/Rocket.Chat/pull/10404)) +- Russian translation of "False" ([#10418](https://github.com/RocketChat/Rocket.Chat/pull/10418) by [@strangerintheq](https://github.com/strangerintheq)) +- Links being embedded inside of blockquotes ([#10496](https://github.com/RocketChat/Rocket.Chat/pull/10496)) +- The 'channel.messages' REST API Endpoint error ([#10485](https://github.com/RocketChat/Rocket.Chat/pull/10485)) +- Button on user info contextual bar scrolling with the content ([#10358](https://github.com/RocketChat/Rocket.Chat/pull/10358) by [@okaybroda](https://github.com/okaybroda)) +- "Idle Time Limit" using milliseconds instead of seconds ([#9824](https://github.com/RocketChat/Rocket.Chat/pull/9824) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) +- Missing i18n translation key for "Unread" ([#10387](https://github.com/RocketChat/Rocket.Chat/pull/10387)) +- Owner unable to delete channel or group from APIs ([#9729](https://github.com/RocketChat/Rocket.Chat/pull/9729) by [@c0dzilla](https://github.com/c0dzilla)) +- Livechat translation files being ignored ([#10369](https://github.com/RocketChat/Rocket.Chat/pull/10369)) +- Missing page "not found" ([#6673](https://github.com/RocketChat/Rocket.Chat/pull/6673) by [@Prakharsvnit](https://github.com/Prakharsvnit)) +- "Highlight Words" wasn't working with more than one word ([#10083](https://github.com/RocketChat/Rocket.Chat/pull/10083) by [@nemaniarjun](https://github.com/nemaniarjun)) +- Missing "Administration" menu for user with manage-emoji permission ([#10171](https://github.com/RocketChat/Rocket.Chat/pull/10171) by [@c0dzilla](https://github.com/c0dzilla)) +- Message view mode setting was missing at user's preferences ([#10395](https://github.com/RocketChat/Rocket.Chat/pull/10395) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) +- Profile image was not being shown in user's directory search ([#10399](https://github.com/RocketChat/Rocket.Chat/pull/10399) by [@sumedh123](https://github.com/sumedh123)) +- Wrong positioning of popover when using RTL languages ([#10428](https://github.com/RocketChat/Rocket.Chat/pull/10428)) +- Messages was grouping wrong some times when server is slow ([#10472](https://github.com/RocketChat/Rocket.Chat/pull/10472)) +- GitLab authentication scope was too open, reduced to read only access ([#10225](https://github.com/RocketChat/Rocket.Chat/pull/10225)) +- Renaming agent's username within Livechat's department ([#10344](https://github.com/RocketChat/Rocket.Chat/pull/10344)) +- Missing RocketApps input types ([#10394](https://github.com/RocketChat/Rocket.Chat/pull/10394)) +- Livechat desktop notifications not being displayed ([#10221](https://github.com/RocketChat/Rocket.Chat/pull/10221)) +- Autocomplete list when inviting a user was partial hidden ([#10409](https://github.com/RocketChat/Rocket.Chat/pull/10409)) +- Remove a user from the user's list when creating a new channel removes the wrong user ([#10423](https://github.com/RocketChat/Rocket.Chat/pull/10423)) +- Room's name was cutting instead of having ellipses on sidebar ([#10430](https://github.com/RocketChat/Rocket.Chat/pull/10430)) +- Button to delete rooms by the owners wasn't appearing ([#10438](https://github.com/RocketChat/Rocket.Chat/pull/10438)) +- Updated OpenShift Template to take an Image as a Param ([#9946](https://github.com/RocketChat/Rocket.Chat/pull/9946) by [@christianh814](https://github.com/christianh814)) +- Incoming integrations being able to trigger an empty message with a GET ([#9576](https://github.com/RocketChat/Rocket.Chat/pull/9576)) +- Snaps installations are breaking on avatar requests ([#10390](https://github.com/RocketChat/Rocket.Chat/pull/10390)) +- Wordpress oAuth authentication wasn't behaving correctly ([#10550](https://github.com/RocketChat/Rocket.Chat/pull/10550) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) +- Switch buttons were cutting in RTL mode ([#10558](https://github.com/RocketChat/Rocket.Chat/pull/10558)) +- Stop Firefox announcement overflowing viewport ([#10503](https://github.com/RocketChat/Rocket.Chat/pull/10503) by [@brendangadd](https://github.com/brendangadd)) + +
+🔍 Minor changes + +- Regression: Various search provider fixes ([#10591](https://github.com/RocketChat/Rocket.Chat/pull/10591) by [@tkurz](https://github.com/tkurz)) +- Regression: /api/v1/settings.oauth not sending needed info for SAML & CAS ([#10596](https://github.com/RocketChat/Rocket.Chat/pull/10596) by [@cardoso](https://github.com/cardoso)) +- Regression: Apps and Livechats not getting along well with each other ([#10598](https://github.com/RocketChat/Rocket.Chat/pull/10598)) +- Development: Add Visual Studio Code debugging configuration ([#10586](https://github.com/RocketChat/Rocket.Chat/pull/10586)) +- Included missing lib for migrations ([#10532](https://github.com/RocketChat/Rocket.Chat/pull/10532)) +- Develop sync ([#10505](https://github.com/RocketChat/Rocket.Chat/pull/10505) by [@nsuchy](https://github.com/nsuchy)) +- Fix: Remove "secret" from REST endpoint /settings.oauth response ([#10513](https://github.com/RocketChat/Rocket.Chat/pull/10513)) +- [OTHER] More Listeners for Apps & Utilize Promises inside Apps ([#10335](https://github.com/RocketChat/Rocket.Chat/pull/10335)) +- [OTHER] Develop sync ([#10487](https://github.com/RocketChat/Rocket.Chat/pull/10487)) +- Change Docker-Compose to use mmapv1 storage engine for mongo ([#10336](https://github.com/RocketChat/Rocket.Chat/pull/10336)) +- Add some missing translations ([#10435](https://github.com/RocketChat/Rocket.Chat/pull/10435)) +- [OTHER] Removed the developer warning on the rest api ([#10441](https://github.com/RocketChat/Rocket.Chat/pull/10441)) +- Fix and improve vietnamese translation ([#10397](https://github.com/RocketChat/Rocket.Chat/pull/10397) by [@TDiNguyen](https://github.com/TDiNguyen) & [@tttt-conan](https://github.com/tttt-conan)) +- Use Node 8.9 for CI build ([#10405](https://github.com/RocketChat/Rocket.Chat/pull/10405)) +- Update allowed labels for bot ([#10360](https://github.com/RocketChat/Rocket.Chat/pull/10360) by [@TwizzyDizzy](https://github.com/TwizzyDizzy)) +- Remove @core team mention from Pull Request template ([#10384](https://github.com/RocketChat/Rocket.Chat/pull/10384)) +- New issue template for *Release Process* ([#10234](https://github.com/RocketChat/Rocket.Chat/pull/10234)) +- Master into Develop Branch Sync ([#10376](https://github.com/RocketChat/Rocket.Chat/pull/10376)) +- Release 0.63.3 ([#10504](https://github.com/RocketChat/Rocket.Chat/pull/10504)) +- Release 0.63.2 ([#10476](https://github.com/RocketChat/Rocket.Chat/pull/10476)) +- add redhat dockerfile to master ([#10408](https://github.com/RocketChat/Rocket.Chat/pull/10408)) +- LingoHub based on develop ([#10545](https://github.com/RocketChat/Rocket.Chat/pull/10545)) +- Regression: Revert announcement structure ([#10544](https://github.com/RocketChat/Rocket.Chat/pull/10544)) +- Regression: Upload was not working ([#10543](https://github.com/RocketChat/Rocket.Chat/pull/10543)) +- Deps update ([#10549](https://github.com/RocketChat/Rocket.Chat/pull/10549)) +- Regression: /api/v1/settings.oauth not returning clientId for Twitter ([#10560](https://github.com/RocketChat/Rocket.Chat/pull/10560) by [@cardoso](https://github.com/cardoso)) +- Regression: Webhooks breaking due to restricted test ([#10555](https://github.com/RocketChat/Rocket.Chat/pull/10555)) +- Regression: Rooms and Apps weren't playing nice with each other ([#10559](https://github.com/RocketChat/Rocket.Chat/pull/10559)) +- Regression: Fix announcement bar being displayed without content ([#10554](https://github.com/RocketChat/Rocket.Chat/pull/10554)) +- Regression: Inconsistent response of settings.oauth endpoint ([#10553](https://github.com/RocketChat/Rocket.Chat/pull/10553)) +- Regression: Remove added mentions on quote/reply ([#10571](https://github.com/RocketChat/Rocket.Chat/pull/10571)) +- Regression: Attachments and fields incorrectly failing on validation ([#10573](https://github.com/RocketChat/Rocket.Chat/pull/10573)) +- Regression: Rocket.Chat App author link opens in same window ([#10575](https://github.com/RocketChat/Rocket.Chat/pull/10575) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) + +
+ +### 👩‍💻👨‍💻 Contributors 😍 + +- [@Prakharsvnit](https://github.com/Prakharsvnit) +- [@TDiNguyen](https://github.com/TDiNguyen) +- [@TwizzyDizzy](https://github.com/TwizzyDizzy) +- [@abernix](https://github.com/abernix) +- [@brendangadd](https://github.com/brendangadd) +- [@c0dzilla](https://github.com/c0dzilla) +- [@cardoso](https://github.com/cardoso) +- [@christianh814](https://github.com/christianh814) +- [@dschuan](https://github.com/dschuan) +- [@kaiiiiiiiii](https://github.com/kaiiiiiiiii) +- [@nemaniarjun](https://github.com/nemaniarjun) +- [@nsuchy](https://github.com/nsuchy) +- [@okaybroda](https://github.com/okaybroda) +- [@strangerintheq](https://github.com/strangerintheq) +- [@sumedh123](https://github.com/sumedh123) +- [@t3hchipmunk](https://github.com/t3hchipmunk) +- [@tkurz](https://github.com/tkurz) +- [@tttt-conan](https://github.com/tttt-conan) # 0.63.3 `2018-04-18 · 2 🐛 · 2 🔍 · 1 👩‍💻👨‍💻` @@ -1957,4 +2304,4 @@ - [@qge](https://github.com/qge) - [@sezinkarli](https://github.com/sezinkarli) - [@szluohua](https://github.com/szluohua) -- [@tgxn](https://github.com/tgxn) +- [@tgxn](https://github.com/tgxn) \ No newline at end of file diff --git a/README.md b/README.md index 7478c27dc04d..48e1e963b617 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,6 @@ * [Scalingo](#scalingo) * [Sloppy.io](#sloppyio) * [Docker](#docker) - * [FreeBSD](#freebsd) * [Ansible](#ansible) * [Raspberry Pi 2](#raspberry-pi-2) * [Koozali SME](#koozali-sme) @@ -81,10 +80,7 @@ Download the Native Cross-Platform Desktop Application at [Rocket.Chat.Electron] [![Rocket.Chat on Apple App Store](https://user-images.githubusercontent.com/551004/29770691-a2082ff4-8bc6-11e7-89a6-964cd405ea8e.png)](https://itunes.apple.com/us/app/rocket.chat/id1028869439?mt=8) [![Rocket.Chat on Google Play](https://user-images.githubusercontent.com/551004/29770692-a20975c6-8bc6-11e7-8ab0-1cde275496e0.png)](https://play.google.com/store/apps/details?id=com.konecty.rocket.chat) -*Now compatible with all Android devices as old as version 4.0.x - [download here](https://docs.rocket.chat/developer-guides/mobile-apps/), even on BlackBerry Passport!* - -### Also available as FirefoxOS app -[![Firefox OS app now available](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/firefoxos.png)](https://docs.rocket.chat/installation/mobile-and-desktop-apps/#native-firefox-os-app). +*Now compatible with all Android devices as old as version 4.0.x - [download here](https://rocket.chat/docs/developer-guides/mobile-apps/), even on BlackBerry Passport!* # Deployment @@ -103,7 +99,7 @@ Installing snaps is very quick. By running that command you have your full Rocke Our snap features a built-in reverse proxy that can request and maintain free Let's Encrypt SSL certificates. You can go from zero to a public-facing SSL-secured Rocket.Chat server in less than 5 minutes. -Find out more information about our snaps [here](https://docs.rocket.chat/installation/manual-installation/ubuntu/snaps/). +Find out more information about our snaps [here](https://rocket.chat/docs/installation/manual-installation/ubuntu/snaps/). ## RocketChatLauncher @@ -174,7 +170,7 @@ Host your docker container at [sloppy.io](http://sloppy.io). Get an account and ## Docker -[Deploy with docker compose](https://docs.rocket.chat/installation/docker-containers/docker-compose) +[Deploy with docker compose](https://rocket.chat/docs/installation/docker-containers/docker-compose/) [![Rocket.Chat logo](https://d207aa93qlcgug.cloudfront.net/1.95.5.qa/img/nav/docker-logo-loggedout.png)](https://hub.docker.com/r/rocketchat/rocket.chat/) @@ -195,21 +191,10 @@ OR our [official docker registry image](https://hub.docker.com/_/rocket.chat/), docker pull rocket.chat ``` -## FreeBSD -Run solid five-nines deployment on industry workhorse FreeBSD server. - -[![FreeBSD Daemon](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/freebsd.png)](https://docs.rocket.chat/installation/manual-installation/freebsd/) - -## Windows Server - -Deploy on your own enterprise server, or with Microsoft Azure. - -[![Windows 2012 or 2016 Server](https://github.com/Sing-Li/bbug/blob/master/images/windows.png)](https://docs.rocket.chat/installation/manual-installation/windows-server/) - ## Ansible Automated production-grade deployment in minutes, for RHEL / CentOS 7 or Ubuntu 14.04 LTS / 15.04. -[![Ansible deployment](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/ansible.png)](https://docs.rocket.chat/installation/automation-tools/ansible/) +[![Ansible deployment](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/ansible.png)](https://rocket.chat/docs/installation/automation-tools/ansible/) ## Raspberry Pi 2 Run Rocket.Chat on this world famous $30 quad core server. @@ -223,15 +208,15 @@ Add Rocket.Chat to this world famous time tested small enterprise server today. [![Koozali SME](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/koozali.png)](https://wiki.contribs.org/Rocket_Chat) ## Ubuntu VPS -Follow these [deployment instructions](https://docs.rocket.chat/installation/manual-installation/ubuntu/). +Follow these [deployment instructions](https://rocket.chat/docs/installation/manual-installation/ubuntu/). ## Hyper.sh -Follow their [deployment instructions](https://docs.rocket.chat/installation/paas-deployments/hyper-sh/) to install a per-second billed Rocket.Chat instance on [Hyper.sh](https://docs.rocket.chat/installation/paas-deployments/hyper-sh/). +Follow their [deployment instructions](https://rocket.chat/docs/installation/paas-deployments/hyper-sh/) to install a per-second billed Rocket.Chat instance on [Hyper.sh](https://rocket.chat/docs/installation/paas-deployments/hyper-sh/). ## WeDeploy Install Rocket.Chat on [WeDeploy](https://wedeploy.com): -[![Install](https://avatars3.githubusercontent.com/u/10002920?v=4&s=100)](https://docs.rocket.chat/installation/paas-deployments/wedeploy/) +[![Install](https://avatars3.githubusercontent.com/u/10002920?v=4&s=100)](https://rocket.chat/docs/installation/paas-deployments/wedeploy/) ## D2C.io Deploy Rocket.Chat stack to your server with [D2C](https://d2c.io/). Scale with a single click, check live logs and metrics: @@ -321,7 +306,6 @@ It is a great solution for communities and companies wanting to privately host t - Native Cross-Platform Desktop Application [Windows, macOS, or Linux](https://rocket.chat/) - Mobile app for iPhone, iPad, and iPod touch [Download on App Store](https://geo.itunes.apple.com/us/app/rocket-chat/id1148741252?mt=8) - Mobile app for Android phone, tablet, and TV stick [Available now on Google Play](https://play.google.com/store/apps/details?id=chat.rocket.android) -- Native Firefox OS Application (also for Desktop Firefox and Firefox for Android) - [Check the docs page for install instructions](https://docs.rocket.chat/installation/mobile-and-desktop-apps/#native-firefox-os-app) - Sandstorm.io instant Rocket.Chat server [Now on Sandstorm App Store](https://apps.sandstorm.io/app/vfnwptfn02ty21w715snyyczw0nqxkv3jvawcah10c6z7hj1hnu0) - Available on [Cloudron Store](https://cloudron.io/appstore.html#chat.rocket.cloudronapp) @@ -394,7 +378,7 @@ We are developing the APIs based on the competition, so stay tuned and you will ## Documentation -Checkout [Rocket.Chat documentation](https://docs.rocket.chat/). +Checkout [Rocket.Chat documentation](https://rocket.chat/docs/). ## License @@ -416,11 +400,11 @@ cd Rocket.Chat meteor npm start ``` -If you are not a developer and just want to run the server - see [deployment methods](https://docs.rocket.chat/installation/paas-deployments/). +If you are not a developer and just want to run the server - see [deployment methods](https://rocket.chat/docs/installation/paas-deployments/). ## Branching Model -See [Branches and Releases](https://docs.rocket.chat/developer-guides/branches-and-releases/). +See [Branches and Releases](https://rocket.chat/docs/developer-guides/branches-and-releases/). It is based on [Gitflow Workflow](http://nvie.com/posts/a-successful-git-branching-model/), reference section below is derived from Vincent Driessen at nvie. diff --git a/client/routes/router.js b/client/routes/router.js index c3cb3e545735..2f0ad84ee1f1 100644 --- a/client/routes/router.js +++ b/client/routes/router.js @@ -149,6 +149,22 @@ FlowRouter.route('/register/:hash', { } }); +FlowRouter.route('/setup-wizard', { + name: 'setup-wizard', + + action() { + BlazeLayout.render('setupWizard'); + } +}); + +FlowRouter.route('/setup-wizard/final', { + name: 'setup-wizard-final', + + action() { + BlazeLayout.render('setupWizardFinal'); + } +}); + FlowRouter.notFound = { action() { BlazeLayout.render('pageNotFound'); diff --git a/client/startup/userSetUtcOffset.js b/client/startup/userSetUtcOffset.js index d41f644fe67f..14542fede1c2 100644 --- a/client/startup/userSetUtcOffset.js +++ b/client/startup/userSetUtcOffset.js @@ -2,7 +2,7 @@ import moment from 'moment'; Meteor.startup(function() { Tracker.autorun(function() { - const user = Meteor.user(); + const user = RocketChat.models.Users.findOne({_id: Meteor.userId()}, {fields: {statusConnection: 1, utcOffset: 1}}); if (user && user.statusConnection === 'online') { const utcOffset = moment().utcOffset() / 60; if (user.utcOffset !== utcOffset) { diff --git a/example-build-run.sh b/example-build-run.sh index fc57c8632d6a..8e5f66f1c020 100755 --- a/example-build-run.sh +++ b/example-build-run.sh @@ -10,6 +10,7 @@ DEPLOY_DIR=/var/www/rocket.chat ### BUILD meteor npm install +meteor npm run postinstall # on the very first build, meteor build command should fail due to a bug on emojione package (related to phantomjs installation) # the command below forces the error to happen before build command (not needed on subsequent builds) diff --git a/package-lock.json b/package-lock.json index 7108c56f42d4..2a971ee02b58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,182 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.46.tgz", + "integrity": "sha512-7BKRkmYaPZm3Yff5HGZJKCz7RqZ5jUjknsXT6Gz5YKG23J3uq9hAj0epncCB0rlqmnZ8Q+UUpQB2tCR5mT37vw==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.46" + } + }, + "@babel/core": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.0.0-beta.46.tgz", + "integrity": "sha512-lCDbBSAhNAt+nL98xbgWmuhgrIxKvbvFHf73zlNCuXCHJkdlo7qzTofYK0ZWb+OVce8fQ17fC7DwTIhAwowzMw==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.46", + "@babel/generator": "7.0.0-beta.46", + "@babel/helpers": "7.0.0-beta.46", + "@babel/template": "7.0.0-beta.46", + "@babel/traverse": "7.0.0-beta.46", + "@babel/types": "7.0.0-beta.46", + "babylon": "7.0.0-beta.46", + "convert-source-map": "1.5.1", + "debug": "3.1.0", + "json5": "0.5.1", + "lodash": "4.17.5", + "micromatch": "2.3.11", + "resolve": "1.5.0", + "semver": "5.5.0", + "source-map": "0.5.7" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz", + "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.46.tgz", + "integrity": "sha512-5VfaEVkPG0gpNSTcf70jvV+MjbMoNn4g2iluwM7MhciedkolEtmG7PcdoUj5W1EmMfngz5cF65V7UMZXJO6y8Q==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.46", + "jsesc": "2.5.1", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.46.tgz", + "integrity": "sha512-zm4Kc5XB2njGs8PkmjV1zE/g1hBuphbh+VcDyFLaQsxkxSFSUtCbKwFL8AQpL/qPIcGbvX1MBt50a/3ZZH2CQA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.46", + "@babel/template": "7.0.0-beta.46", + "@babel/types": "7.0.0-beta.46" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.46.tgz", + "integrity": "sha512-dPrTb7QHVx44xJLjUl3LGAc13iS7hdXdO0fiOxdRN1suIS91yGGgeuwiQBlrw5SxbFchYtwenhlKbqHdVfGyVA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.46" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.46.tgz", + "integrity": "sha512-UT7acgV7wsnBPwnqslqcnUFvsPBP4TtVaYM82xPGA7+evAa8q8HXOmFk08qsMK/pX/yy4+51gJJwyw2zofnacA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.46" + } + }, + "@babel/helpers": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.0.0-beta.46.tgz", + "integrity": "sha512-mbpH9pM3pJzo/tBr75U+zva3pqpyivogt1aofgEoD7bWFAYSuqOudRuz+m4XP6VPxxLoxcA4SFPGkuLRt9+7nQ==", + "dev": true, + "requires": { + "@babel/template": "7.0.0-beta.46", + "@babel/traverse": "7.0.0-beta.46", + "@babel/types": "7.0.0-beta.46" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.46.tgz", + "integrity": "sha512-r4snW6Q8ICL3Y8hGzYJRvyG/+sc+kvkewXNedG9tQjoHmUFMwMSv/o45GWQUQswevGnWghiGkpRPivFfOuMsOA==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, "@babel/runtime": { "version": "7.0.0-beta.46", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0-beta.46.tgz", @@ -13,6 +189,86 @@ "regenerator-runtime": "0.11.1" } }, + "@babel/template": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.46.tgz", + "integrity": "sha512-3/qi4m0l6G/vZbEwtqfzJk73mYtuE7nvAO1zT3/ZrTAHy4sHf2vaF9Eh1w+Tau263Yrkh0bjVQPb9zw6G+GeMQ==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.46", + "@babel/types": "7.0.0-beta.46", + "babylon": "7.0.0-beta.46", + "lodash": "4.17.5" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz", + "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.46.tgz", + "integrity": "sha512-IU7MTGbcjpfhf5tyCu3sDB7sWYainZQcT+CqOBdVZXZfq5MMr130R7aiZBI2g5dJYUaW1PS81DVNpd0/Sq/Gzg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.46", + "@babel/generator": "7.0.0-beta.46", + "@babel/helper-function-name": "7.0.0-beta.46", + "@babel/helper-split-export-declaration": "7.0.0-beta.46", + "@babel/types": "7.0.0-beta.46", + "babylon": "7.0.0-beta.46", + "debug": "3.1.0", + "globals": "11.5.0", + "invariant": "2.2.2", + "lodash": "4.17.5" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz", + "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.46.tgz", + "integrity": "sha512-uA5aruF2KKsJxToWdDpftsrPOIQtoGrGno2hiaeO9JRvfT9xZdK11nPoC+/RF9emNzmNbWn4HCRdCY+McT5Nbw==", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, "@google-cloud/common": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.2.tgz", @@ -619,9 +875,9 @@ "dev": true }, "array-iterate": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.1.tgz", - "integrity": "sha1-hlv3+K851rCYLGCQKRSsdrwBCPY=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz", + "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==", "dev": true }, "array-union": { @@ -1869,9 +2125,9 @@ "integrity": "sha1-XphW2/E0gqKVw7CzBK+51M/FxXk=" }, "bail": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.2.tgz", - "integrity": "sha1-99bBcxYwqfnw1NNe0fli4gdKF2Q=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", + "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", "dev": true }, "balanced-match": { @@ -2536,9 +2792,9 @@ } }, "bson": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz", - "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-2.0.6.tgz", + "integrity": "sha512-DH9Xvo+zN7PnS6rmQauNWLZqICiwOXygoh0nppbJrcpGv6XUyon6S/rGSvUkR3SdyqHQ6YjSkxmSnmqOhUZNew==" }, "btoa-lite": { "version": "1.0.0", @@ -2786,12 +3042,6 @@ "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000830.tgz", "integrity": "sha1-bkUlWzRWSf0V/1kHLaHhK7PeLxM=" }, - "caniuse-lite": { - "version": "1.0.30000808", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000808.tgz", - "integrity": "sha512-vT0JLmHdvq1UVbYXioxCXHYdNw55tyvi+IUWyX0Zeh1OFQi2IllYtm38IJnSgHWCv/zUnX1hdhy3vMJvuTNSqw==", - "dev": true - }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", @@ -2810,9 +3060,9 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "ccount": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.2.tgz", - "integrity": "sha1-U7ai+BW7d7nChx97mnLDol8djok=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", + "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==", "dev": true }, "center-align": { @@ -2869,27 +3119,27 @@ } }, "character-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.1.tgz", - "integrity": "sha1-92hxvl72bdt/j440eOzDdMJ9bco=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", + "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==", "dev": true }, "character-entities-html4": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.1.tgz", - "integrity": "sha1-NZoqSg9+KdPcKsmb2+Ie45Q46lA=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", + "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==", "dev": true }, "character-entities-legacy": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz", - "integrity": "sha1-9Ad53xoQGHK7UQo9KV4fzPFHIC8=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", + "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==", "dev": true }, "character-reference-invalid": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz", - "integrity": "sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", + "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==", "dev": true }, "chardet": { @@ -3011,7 +3261,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -3044,7 +3294,7 @@ "mocha": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha1-fYbPvPNcuCnidUwy4XNV7AUzh5Q=", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", "dev": true, "requires": { "browser-stdout": "1.3.0", @@ -3062,13 +3312,13 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", "dev": true }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -3096,7 +3346,7 @@ "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha1-iD992rwWUUKyphQn8zUt7RldGj4=", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { "has-flag": "2.0.0" @@ -3202,9 +3452,9 @@ "dev": true }, "clipboard": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-1.7.1.tgz", - "integrity": "sha1-Ng1taUbpmnof7zleQrqStem1oWs=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz", + "integrity": "sha512-7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==", "requires": { "good-listener": "1.2.2", "select": "1.1.2", @@ -3222,13 +3472,13 @@ } }, "clone-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.0.tgz", - "integrity": "sha1-6uCiQT9VwJQvgYwin+/OhF1/Oxw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz", + "integrity": "sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==", "dev": true, "requires": { "is-regexp": "1.0.0", - "is-supported-regexp-flag": "1.0.0" + "is-supported-regexp-flag": "1.0.1" } }, "clone-response": { @@ -3260,9 +3510,9 @@ "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==" }, "collapse-white-space": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.3.tgz", - "integrity": "sha1-S5BvZw5aljqHt2sOFolkM0G2Ajw=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", + "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", "dev": true }, "collection-visit": { @@ -3327,7 +3577,8 @@ "commander": { "version": "2.14.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true }, "compare-func": { "version": "1.3.2", @@ -3376,7 +3627,7 @@ }, "compression": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/compression/-/compression-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz", "integrity": "sha1-sDuNhub4rSloPLqN+R3cb/x3s5U=", "requires": { "accepts": "1.2.13", @@ -3756,26 +4007,15 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-3.1.0.tgz", - "integrity": "sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", "dev": true, "requires": { "is-directory": "0.3.1", "js-yaml": "3.10.0", - "parse-json": "3.0.0", - "require-from-string": "2.0.1" - }, - "dependencies": { - "parse-json": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-3.0.0.tgz", - "integrity": "sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - } + "parse-json": "4.0.0", + "require-from-string": "2.0.2" } }, "crc": { @@ -3922,9 +4162,9 @@ } }, "csv-parse": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-1.3.3.tgz", - "integrity": "sha1-0c/YdDwvhJoKuy/VRNtWaV0ZpJA=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-2.2.0.tgz", + "integrity": "sha512-nNXh61kEIUbTXPWPZbrKlkkylh7BDxffDUWQPWIho+Rog4XWRV8bTR8ZVo8qngzAwbhlvtKFcsaf2hGDV1iF8Q==" }, "ctype": { "version": "0.5.3", @@ -4190,9 +4430,9 @@ "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" }, "deprecate": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-0.1.0.tgz", - "integrity": "sha1-xJBYYS3GyOUUXq/kg5uMLH0EHBQ=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.0.0.tgz", + "integrity": "sha1-ZhSQ7SQokWpsiIPYg05WRvTkpKg=" }, "destroy": { "version": "1.0.4", @@ -4443,7 +4683,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "optional": true, "requires": { "prr": "1.0.1" } @@ -4818,7 +5057,7 @@ "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", "dev": true, "requires": { - "clone-regexp": "1.0.0" + "clone-regexp": "1.0.1" } }, "exit": { @@ -6581,12 +6820,14 @@ "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true }, "generate-object-property": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, "requires": { "is-property": "1.0.2" } @@ -6774,7 +7015,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -8516,6 +8757,12 @@ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -8714,9 +8961,9 @@ } }, "is-alphabetical": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.1.tgz", - "integrity": "sha1-x3B5zJHU76x3W+EDS/LSQ/lebwg=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", + "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==", "dev": true }, "is-alphanumeric": { @@ -8726,13 +8973,13 @@ "dev": true }, "is-alphanumerical": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz", - "integrity": "sha1-37SqTRCF4zvbYcLe6cgOnGwZ9Ts=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", + "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", "dev": true, "requires": { - "is-alphabetical": "1.0.1", - "is-decimal": "1.0.1" + "is-alphabetical": "1.0.2", + "is-decimal": "1.0.2" } }, "is-arrayish": { @@ -8782,9 +9029,9 @@ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, "is-decimal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.1.tgz", - "integrity": "sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", + "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==", "dev": true }, "is-descriptor": { @@ -8869,20 +9116,22 @@ } }, "is-hexadecimal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz", - "integrity": "sha1-bghLvJIGH7sJcexYts5tQE4k2mk=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", + "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", "dev": true }, "is-my-ip-valid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==" + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true }, "is-my-json-valid": { "version": "2.17.2", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "dev": true, "requires": { "generate-function": "2.0.0", "generate-object-property": "1.2.0", @@ -8990,7 +9239,8 @@ "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true }, "is-regex": { "version": "1.0.4", @@ -9034,9 +9284,9 @@ "dev": true }, "is-supported-regexp-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz", - "integrity": "sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", + "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", "dev": true }, "is-symbol": { @@ -9065,9 +9315,9 @@ "dev": true }, "is-whitespace-character": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.1.tgz", - "integrity": "sha1-muAXbzKCtlRXoZks2whPil+DPjs=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", + "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==", "dev": true }, "is-windows": { @@ -9076,9 +9326,9 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-word-character": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.1.tgz", - "integrity": "sha1-WgP6HqkazopusMfNdw64bWXIvvs=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", + "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==", "dev": true }, "isarray": { @@ -9251,21 +9501,30 @@ "jsonpointer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true }, "jsonwebtoken": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-5.4.1.tgz", - "integrity": "sha1-IFXGORlf/lYxT6alHfAkaBhqlpU=", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz", + "integrity": "sha512-l8rUBr0fqYYwPc8/ZGrue7GiW7vWdZtZqelxo4Sd5lMvuEeCK8/wS54sEo6tJhdZ6hqfutsj6COgC0d1XdbHGw==", "requires": { "jws": "3.1.4", - "ms": "0.7.3" + "lodash.includes": "4.3.0", + "lodash.isboolean": "3.0.3", + "lodash.isinteger": "4.0.4", + "lodash.isnumber": "3.0.3", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.once": "4.1.1", + "ms": "2.1.1", + "xtend": "4.0.1" }, "dependencies": { "ms": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", - "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -9333,9 +9592,9 @@ } }, "known-css-properties": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.5.0.tgz", - "integrity": "sha512-LOS0CoS8zcZnB1EjLw4LLqDXw8nvt3AGH5dXLQP3D9O1nLLA+9GC5GnPl5mmF+JiQAtSX4VyZC7KvEtcA4kUtA==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.6.1.tgz", + "integrity": "sha512-nQRpMcHm1cQ6gmztdvLcIvxocznSMqH/y6XtERrWrHaymOYdDGroRqetJvJycxGEr1aakXiigDgn7JnzuXlk6A==", "dev": true }, "lazy-cache": { @@ -9565,6 +9824,31 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, "lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", @@ -9575,6 +9859,11 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "lodash.template": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", @@ -9605,27 +9894,27 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "2.3.1" + "chalk": "2.4.1" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.0", + "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "has-flag": { @@ -9635,9 +9924,9 @@ "dev": true }, "supports-color": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "3.0.0" @@ -9704,9 +9993,13 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } }, "mailparser": { "version": "2.2.0", @@ -9775,15 +10068,15 @@ } }, "markdown-escapes": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.1.tgz", - "integrity": "sha1-GZTfLTr0gR3lmmcUk0wrIpJzRRg=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", + "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==", "dev": true }, "markdown-table": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.1.tgz", - "integrity": "sha1-Sz3ToTPRUYuO8NvHCb8qG0gkvIw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", + "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==", "dev": true }, "marked": { @@ -9792,9 +10085,9 @@ "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==" }, "mathml-tag-names": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.0.1.tgz", - "integrity": "sha1-jUEmgWi/htEQK5gQnijlMeejRXg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.0.tgz", + "integrity": "sha512-3Zs9P/0zzwTob2pdgT0CHZuMbnSUSp8MB1bddfm+HDmnFWHGT4jvEZRf+2RuPoa+cjdn/z25SEt5gFTqdhvJAg==", "dev": true }, "mdast-util-compact": { @@ -9803,8 +10096,8 @@ "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=", "dev": true, "requires": { - "unist-util-modify-children": "1.1.1", - "unist-util-visit": "1.3.0" + "unist-util-modify-children": "1.1.2", + "unist-util-visit": "1.3.1" } }, "media-typer": { @@ -9974,7 +10267,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "1.1.11" } @@ -10298,8 +10591,7 @@ "natives": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz", - "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g==", - "optional": true + "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g==" }, "natural-compare": { "version": "1.4.0", @@ -10365,7 +10657,8 @@ "node-uuid": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true }, "noop-logger": { "version": "0.1.1", @@ -10728,17 +11021,17 @@ "dev": true }, "parse-entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.1.tgz", - "integrity": "sha1-gRLYhHExnyerrk1klksSL+ThuJA=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.2.tgz", + "integrity": "sha512-5N9lmQ7tmxfXf+hO3X6KRG6w7uYO/HL9fHalSySTdyn63C3WNvTM/1R8tn1u1larNcEbo3Slcy2bsVDQqvEpUg==", "dev": true, "requires": { - "character-entities": "1.2.1", - "character-entities-legacy": "1.1.1", - "character-reference-invalid": "1.1.1", - "is-alphanumerical": "1.0.1", - "is-decimal": "1.0.1", - "is-hexadecimal": "1.0.1" + "character-entities": "1.2.2", + "character-entities-legacy": "1.1.2", + "character-reference-invalid": "1.1.2", + "is-alphanumerical": "1.0.2", + "is-decimal": "1.0.2", + "is-hexadecimal": "1.0.2" } }, "parse-github-repo-url": { @@ -10816,7 +11109,7 @@ "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { "pify": "3.0.0" } @@ -11038,12 +11331,14 @@ "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, "requires": { "pinkie": "2.0.4" } @@ -11054,6 +11349,11 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "pop-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz", + "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M=" + }, "poplib": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/poplib/-/poplib-0.1.7.tgz", @@ -11086,13 +11386,13 @@ } }, "postcss-custom-properties": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-6.3.1.tgz", - "integrity": "sha512-zoiwn4sCiUFbr4KcgcNZLFkR6gVQom647L+z1p/KBVHZ1OYwT87apnS42atJtx6XlX2yI7N5fjXbFixShQO2QQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-7.0.0.tgz", + "integrity": "sha512-dl/CNaM6z2RBa0vZZqsV6Hunj4HD6Spu7FcAkiVp5B2tgm6xReKKYzI7x7QNx3wTMBNj5v+ylfVcQGMW4xdkHw==", "dev": true, "requires": { "balanced-match": "1.0.0", - "postcss": "6.0.21" + "postcss": "6.0.22" }, "dependencies": { "ansi-styles": { @@ -11105,9 +11405,9 @@ } }, "chalk": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", - "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "3.2.1", @@ -11122,12 +11422,12 @@ "dev": true }, "postcss": { - "version": "6.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", - "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "dev": true, "requires": { - "chalk": "2.4.0", + "chalk": "2.4.1", "source-map": "0.6.1", "supports-color": "5.4.0" } @@ -11150,16 +11450,25 @@ } }, "postcss-html": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.12.0.tgz", - "integrity": "sha512-KxKUpj7AY7nlCbLcTOYxdfJnGE7QFAfU2n95ADj1Q90RM/pOLdz8k3n4avOyRFs7MDQHcRzJQWM1dehCwJxisQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.18.0.tgz", + "integrity": "sha512-7llFZ5hlINmUu/8iUBIXCTZ4OMyGB+NBeb7jDadXrH9g+hpcUEBhZv3rjqesmOsHNC3bITqx1EkVz77RuHJygw==", "dev": true, "requires": { + "@babel/core": "7.0.0-beta.46", + "@babel/traverse": "7.0.0-beta.46", + "babylon": "7.0.0-beta.46", "htmlparser2": "3.9.2", - "remark": "8.0.0", - "unist-util-find-all-after": "1.0.1" + "remark": "9.0.0", + "unist-util-find-all-after": "1.0.2" }, "dependencies": { + "babylon": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz", + "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==", + "dev": true + }, "domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", @@ -11189,7 +11498,7 @@ "postcss-import": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", - "integrity": "sha1-Vck2LJGSmU7GiGXSJEGd8dspgfA=", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", "dev": true, "requires": { "postcss": "6.0.17", @@ -11238,7 +11547,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { @@ -11253,9 +11562,9 @@ } }, "postcss-less": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.3.tgz", - "integrity": "sha512-WS0wsQxRm+kmN8wEYAGZ3t4lnoNfoyx9EJZrhiPR1K0lMHR0UNWnz52Ya5QRXChHtY75Ef+kDc05FpnBujebgw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.5.tgz", + "integrity": "sha512-QQIiIqgEjNnquc0d4b6HDOSFZxbFQoy4MPpli2lSLpKhMyBkKwwca2HFqu4xzxlKID/F2fxSOowwtKpgczhF7A==", "dev": true, "requires": { "postcss": "5.2.18" @@ -11400,30 +11709,30 @@ "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", "dev": true, "requires": { - "chalk": "2.3.1", + "chalk": "2.4.1", "lodash": "4.17.5", "log-symbols": "2.2.0", - "postcss": "6.0.17" + "postcss": "6.0.22" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.0", + "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "has-flag": { @@ -11433,14 +11742,14 @@ "dev": true }, "postcss": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", - "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "dev": true, "requires": { - "chalk": "2.3.1", + "chalk": "2.4.1", "source-map": "0.6.1", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "source-map": { @@ -11450,9 +11759,9 @@ "dev": true }, "supports-color": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "3.0.0" @@ -11472,27 +11781,27 @@ "integrity": "sha1-t1Pv9sfArqXoN1++TN6L+QY/8UI=", "dev": true, "requires": { - "postcss": "6.0.17" + "postcss": "6.0.22" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.0", + "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "has-flag": { @@ -11502,14 +11811,14 @@ "dev": true }, "postcss": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", - "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "dev": true, "requires": { - "chalk": "2.3.1", + "chalk": "2.4.1", "source-map": "0.6.1", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "source-map": { @@ -11519,9 +11828,9 @@ "dev": true }, "supports-color": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "3.0.0" @@ -11530,33 +11839,33 @@ } }, "postcss-sass": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.2.0.tgz", - "integrity": "sha512-cUmYzkP747fPCQE6d+CH2l1L4VSyIlAzZsok3HPjb5Gzsq3jE+VjpAdGlPsnQ310WKWI42sw+ar0UNN59/f3hg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.1.tgz", + "integrity": "sha512-jyrOsP3MoLv57avdbi7GEITKrM23qeoFzZi8zmbXPjcPklRt83zzoxF/CEZ/cwRAJsHSkEwHc28Qhkm+8/OoUA==", "dev": true, "requires": { "gonzales-pe": "4.2.3", - "postcss": "6.0.17" + "postcss": "6.0.22" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.0", + "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "has-flag": { @@ -11566,14 +11875,14 @@ "dev": true }, "postcss": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", - "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "dev": true, "requires": { - "chalk": "2.3.1", + "chalk": "2.4.1", "source-map": "0.6.1", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "source-map": { @@ -11583,9 +11892,9 @@ "dev": true }, "supports-color": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "3.0.0" @@ -11594,32 +11903,32 @@ } }, "postcss-scss": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.3.tgz", - "integrity": "sha512-N2ZPDOV5PGEGVwdiB7b1QppxKkmkHodNWkemja7PV+/mHqbUlA6ZcYRreden5Ag5nwBBX8/aRE7lfg1xjdszyg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.5.tgz", + "integrity": "sha512-gJB1tKYMkBy0MU+COt6WXA4ZiRctAKoWLa6qD7a6bbEbBMqrpa/BhfQdN80eYMV+JkKddZVEpZlOggnGShpvyg==", "dev": true, "requires": { - "postcss": "6.0.17" + "postcss": "6.0.22" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.0", + "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "has-flag": { @@ -11629,14 +11938,14 @@ "dev": true }, "postcss": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", - "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "dev": true, "requires": { - "chalk": "2.3.1", + "chalk": "2.4.1", "source-map": "0.6.1", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "source-map": { @@ -11646,9 +11955,9 @@ "dev": true }, "supports-color": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "3.0.0" @@ -11984,9 +12293,9 @@ "dev": true }, "prom-client": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-10.2.3.tgz", - "integrity": "sha512-Xboq5+TdUwuQtSSDRZRNnb5NprINlgQN999VqUjZxnLKydUNLeIPx6Eiahg6oJua3XBg2TGnh5Cth1s4I6+r7g==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-11.0.0.tgz", + "integrity": "sha512-UM4uYDwmA7x9yTq+AZcL4lU/XF11RkbQWbIouFaVMLxdV4qBB5CEmEosQlR1lGvduBuS1IWonHFh1WBtFSoZ3A==", "requires": { "tdigest": "0.1.1" } @@ -12020,29 +12329,20 @@ } }, "proxyquire": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.8.0.tgz", - "integrity": "sha1-AtUUpb7ZhvBMuyCTrxZ0FTX3ntw=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.0.1.tgz", + "integrity": "sha512-fQr3VQrbdzHrdaDn3XuisVoJlJNDJizHAvUXw9IuXRR8BpV2x0N7LsCxrpJkeKfPbNjiNU/V5vc008cI0TmzzQ==", "dev": true, "requires": { "fill-keys": "1.0.2", "module-not-found-error": "1.0.1", - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "resolve": "1.5.0" } }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "optional": true + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, "pseudomap": { "version": "1.0.2", @@ -12447,58 +12747,58 @@ } }, "remark": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-8.0.0.tgz", - "integrity": "sha512-K0PTsaZvJlXTl9DN6qYlvjTkqSZBFELhROZMrblm2rB+085flN84nz4g/BscKRMqDvhzlK1oQ/xnWQumdeNZYw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-9.0.0.tgz", + "integrity": "sha512-amw8rGdD5lHbMEakiEsllmkdBP+/KpjW/PRK6NSGPZKCQowh0BT4IWXDAkRMyG3SB9dKPXWMviFjNusXzXNn3A==", "dev": true, "requires": { - "remark-parse": "4.0.0", - "remark-stringify": "4.0.0", - "unified": "6.1.6" + "remark-parse": "5.0.0", + "remark-stringify": "5.0.0", + "unified": "6.2.0" } }, "remark-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz", - "integrity": "sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", + "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", "dev": true, "requires": { - "collapse-white-space": "1.0.3", - "is-alphabetical": "1.0.1", - "is-decimal": "1.0.1", - "is-whitespace-character": "1.0.1", - "is-word-character": "1.0.1", - "markdown-escapes": "1.0.1", - "parse-entities": "1.1.1", + "collapse-white-space": "1.0.4", + "is-alphabetical": "1.0.2", + "is-decimal": "1.0.2", + "is-whitespace-character": "1.0.2", + "is-word-character": "1.0.2", + "markdown-escapes": "1.0.2", + "parse-entities": "1.1.2", "repeat-string": "1.6.1", - "state-toggle": "1.0.0", + "state-toggle": "1.0.1", "trim": "0.0.1", - "trim-trailing-lines": "1.1.0", - "unherit": "1.1.0", - "unist-util-remove-position": "1.1.1", + "trim-trailing-lines": "1.1.1", + "unherit": "1.1.1", + "unist-util-remove-position": "1.1.2", "vfile-location": "2.0.2", "xtend": "4.0.1" } }, "remark-stringify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-4.0.0.tgz", - "integrity": "sha512-xLuyKTnuQer3ke9hkU38SUYLiTmS078QOnoFavztmbt/pAJtNSkNtFgR0U//uCcmG0qnyxao+PDuatQav46F1w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-5.0.0.tgz", + "integrity": "sha512-Ws5MdA69ftqQ/yhRF9XhVV29mhxbfGhbz0Rx5bQH+oJcNhhSM6nCu1EpLod+DjrFGrU0BMPs+czVmJZU7xiS7w==", "dev": true, "requires": { - "ccount": "1.0.2", + "ccount": "1.0.3", "is-alphanumeric": "1.0.0", - "is-decimal": "1.0.1", - "is-whitespace-character": "1.0.1", + "is-decimal": "1.0.2", + "is-whitespace-character": "1.0.2", "longest-streak": "2.0.2", - "markdown-escapes": "1.0.1", - "markdown-table": "1.1.1", + "markdown-escapes": "1.0.2", + "markdown-table": "1.1.2", "mdast-util-compact": "1.0.1", - "parse-entities": "1.1.1", + "parse-entities": "1.1.2", "repeat-string": "1.6.1", - "state-toggle": "1.0.0", - "stringify-entities": "1.3.1", - "unherit": "1.1.0", + "state-toggle": "1.0.1", + "stringify-entities": "1.3.2", + "unherit": "1.1.1", "xtend": "4.0.1" } }, @@ -12581,9 +12881,9 @@ } }, "require-from-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.1.tgz", - "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "require-uncached": { @@ -12704,6 +13004,11 @@ "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, + "rootpath": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/rootpath/-/rootpath-0.1.2.tgz", + "integrity": "sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms=" + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -13586,9 +13891,9 @@ } }, "state-toggle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.0.tgz", - "integrity": "sha1-0g+aYWu08MO5i5GSLSW2QKorxCU=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", + "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==", "dev": true }, "static-extend": { @@ -13684,11 +13989,6 @@ "strip-ansi": "3.0.1" } }, - "string.prototype.startswith": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/string.prototype.startswith/-/string.prototype.startswith-0.2.0.tgz", - "integrity": "sha1-2miYLjU6TprEpDtFCiBF0cRFrns=" - }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", @@ -13708,15 +14008,15 @@ } }, "stringify-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.1.tgz", - "integrity": "sha1-sVDsLXKsTBtfMktR+2soyc3/BYw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", + "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", "dev": true, "requires": { - "character-entities-html4": "1.1.1", - "character-entities-legacy": "1.1.1", - "is-alphanumerical": "1.0.1", - "is-hexadecimal": "1.0.1" + "character-entities-html4": "1.1.2", + "character-entities-legacy": "1.1.2", + "is-alphanumerical": "1.0.2", + "is-hexadecimal": "1.0.2" } }, "stringstream": { @@ -13761,44 +14061,46 @@ "dev": true }, "stylelint": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-8.4.0.tgz", - "integrity": "sha512-56hPH5mTFnk8LzlEuTWq0epa34fHuS54UFYQidBOFt563RJBNi1nz1F2HK2MoT1X1waq47milvRsRahFCCJs/Q==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.2.0.tgz", + "integrity": "sha512-aBlnuLyTvyNfIVoc+reaqx88aW41Awc9Ccu7ZXrO2fnSvv0MVSQeyL3ci/nD1H1eYvH3X+MXTwMYC3Mf5+2Ckw==", "dev": true, "requires": { - "autoprefixer": "7.2.6", + "autoprefixer": "8.4.1", "balanced-match": "1.0.0", - "chalk": "2.3.1", - "cosmiconfig": "3.1.0", + "chalk": "2.4.1", + "cosmiconfig": "4.0.0", "debug": "3.1.0", "execall": "1.0.0", "file-entry-cache": "2.0.0", - "get-stdin": "5.0.1", - "globby": "7.1.1", + "get-stdin": "6.0.0", + "globby": "8.0.1", "globjoin": "0.1.4", "html-tags": "2.0.0", "ignore": "3.3.7", + "import-lazy": "3.1.0", "imurmurhash": "0.1.4", - "known-css-properties": "0.5.0", + "known-css-properties": "0.6.1", "lodash": "4.17.5", "log-symbols": "2.2.0", - "mathml-tag-names": "2.0.1", + "mathml-tag-names": "2.1.0", "meow": "4.0.0", "micromatch": "2.3.11", "normalize-selector": "0.2.0", "pify": "3.0.0", - "postcss": "6.0.17", - "postcss-html": "0.12.0", - "postcss-less": "1.1.3", + "postcss": "6.0.22", + "postcss-html": "0.18.0", + "postcss-less": "1.1.5", "postcss-media-query-parser": "0.2.3", "postcss-reporter": "5.0.0", "postcss-resolve-nested-selector": "0.1.1", "postcss-safe-parser": "3.0.1", - "postcss-sass": "0.2.0", - "postcss-scss": "1.0.3", + "postcss-sass": "0.3.1", + "postcss-scss": "1.0.5", "postcss-selector-parser": "3.1.1", "postcss-value-parser": "3.3.0", "resolve-from": "4.0.0", + "signal-exit": "3.0.2", "specificity": "0.3.2", "string-width": "2.1.1", "style-search": "0.1.0", @@ -13814,199 +14116,76 @@ "dev": true }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "1.9.1" } }, - "autoprefixer": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", - "integrity": "sha1-JWZy+G98c12oScTwfQCKuwVgZ9w=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "browserslist": "2.11.3", - "caniuse-lite": "1.0.30000808", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "6.0.17", - "postcss-value-parser": "3.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, - "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha1-/jYWeu0bvN5IJ+v+cTR6LMcLmbI=", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000808", - "electron-to-chromium": "1.3.33" + "ms": "2.0.0" } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", "dev": true, "requires": { - "camelcase": "4.1.0", - "map-obj": "2.0.0", - "quick-lru": "1.1.0" - } - }, - "chalk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "5.2.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.1", + "glob": "7.1.2", + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" } }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", - "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", - "dev": true, - "requires": { - "camelcase-keys": "4.2.0", - "decamelize-keys": "1.1.0", - "loud-rejection": "1.6.0", - "minimist": "1.2.0", - "minimist-options": "3.0.2", - "normalize-package-data": "2.4.0", - "read-pkg-up": "3.0.0", - "redent": "2.0.0", - "trim-newlines": "2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.1" - } - }, "postcss": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", - "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "dev": true, "requires": { - "chalk": "2.3.1", + "chalk": "2.4.1", "source-map": "0.6.1", - "supports-color": "5.2.0" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "3.2.0", - "strip-indent": "2.0.0" + "supports-color": "5.4.0" } }, "resolve-from": { @@ -14040,39 +14219,21 @@ "ansi-regex": "3.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, "supports-color": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "3.0.0" } - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true } } }, "stylelint-order": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-0.8.1.tgz", - "integrity": "sha1-Nfca86FZVBVODpnlZGuj1vvjT40=", + "integrity": "sha512-8mp1P2wnI9XShYXVXDsxVigE2eXnc0C2O4ktbwUvTBwjCP4xZskIbUVxp1evSG3OK4R7hXVNl/2BnJCZkrcc/w==", "dev": true, "requires": { "lodash": "4.17.5", @@ -14109,7 +14270,7 @@ "postcss": { "version": "6.0.19", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.19.tgz", - "integrity": "sha1-dqeDhvZwudlJSmVb8jrAEu/9FVU=", + "integrity": "sha512-f13HRz0HtVwVaEuW6J6cOUCBLFtymhgyLPV7t4QEk2UD3twRI9IluDcQNdzQdBpiixkXj2OmzejhhTbSbDxNTg==", "dev": true, "requires": { "chalk": "2.3.1", @@ -14120,7 +14281,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { @@ -14140,27 +14301,27 @@ "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==", "dev": true, "requires": { - "postcss": "6.0.17" + "postcss": "6.0.22" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.0", + "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "has-flag": { @@ -14170,14 +14331,14 @@ "dev": true }, "postcss": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", - "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "dev": true, "requires": { - "chalk": "2.3.1", + "chalk": "2.4.1", "source-map": "0.6.1", - "supports-color": "5.2.0" + "supports-color": "5.4.0" } }, "source-map": { @@ -14187,9 +14348,9 @@ "dev": true }, "supports-color": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "3.0.0" @@ -14572,15 +14733,15 @@ "dev": true }, "trim-trailing-lines": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz", - "integrity": "sha1-eu+7eAjfnWafbaLkOMrIxGradoQ=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", + "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==", "dev": true }, "trough": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.1.tgz", - "integrity": "sha1-qf2LA5Swro//guBjOgo2zK1bX4Y=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.2.tgz", + "integrity": "sha512-FHkoUZvG6Egrv9XZAyYGKEyb1JMsFphgPjoczkZC2y6W93U1jswcVURB8MUvtsahEPEVACyxD47JAL63vF4JsQ==", "dev": true }, "tsscmp": { @@ -14603,178 +14764,45 @@ "optional": true }, "twilio": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/twilio/-/twilio-2.11.1.tgz", - "integrity": "sha1-RRCZRnMTxWs3Z5lN8tGQYvEO+MQ=", - "requires": { - "deprecate": "0.1.0", - "jsonwebtoken": "5.4.1", - "q": "0.9.7", - "request": "2.74.0", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.16.0.tgz", + "integrity": "sha512-bOdhtIChk6AxM+80SM59zfGImnvMnelRu9oe52aglUp/l1a18ouJVZWieWU/70Twnc79SrBuSAGJ0mWMR+FBhQ==", + "requires": { + "deprecate": "1.0.0", + "jsonwebtoken": "8.2.1", + "lodash": "4.17.10", + "moment": "2.19.3", + "q": "2.0.3", + "request": "2.83.0", + "rootpath": "0.1.2", "scmp": "0.0.3", - "string.prototype.startswith": "0.2.0", - "underscore": "1.9.0" + "xmlbuilder": "9.0.1" }, "dependencies": { - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "requires": { - "readable-stream": "2.0.6" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.16.3" - } - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.10.1" - } - }, - "form-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", - "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", - "requires": { - "async": "2.6.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.17" - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "requires": { - "chalk": "1.1.3", - "commander": "2.14.1", - "is-my-json-valid": "2.17.2", - "pinkie-promise": "2.0.1" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "moment": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.3.tgz", + "integrity": "sha1-vbmdJw1tf9p4zA+6zoVeJ/59pp8=" }, "q": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", - "integrity": "sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=" - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=" - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.74.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", - "integrity": "sha1-dpPKdou7DqXIzgjAhKRe+gW4kqs=", - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "bl": "1.1.2", - "caseless": "0.11.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "1.0.1", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "node-uuid": "1.4.8", - "oauth-sign": "0.8.2", - "qs": "6.2.3", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.4.3" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz", + "integrity": "sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ=", "requires": { - "hoek": "2.16.3" + "asap": "2.0.6", + "pop-iterate": "1.0.1", + "weak-map": "1.0.5" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + "xmlbuilder": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.1.tgz", + "integrity": "sha1-kc1wiXdVNj66V8Et3uq0o0GmH2U=" } } }, @@ -14939,9 +14967,9 @@ } }, "unherit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.0.tgz", - "integrity": "sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", + "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", "dev": true, "requires": { "inherits": "2.0.3", @@ -14949,17 +14977,16 @@ } }, "unified": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.1.6.tgz", - "integrity": "sha512-pW2f82bCIo2ifuIGYcV12fL96kMMYgw7JKVEgh7ODlrM9rj6vXSY3BV+H6lCcv1ksxynFf582hwWLnA1qRFy4w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", + "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", "dev": true, "requires": { - "bail": "1.0.2", + "bail": "1.0.3", "extend": "3.0.1", "is-plain-obj": "1.1.0", - "trough": "1.0.1", + "trough": "1.0.2", "vfile": "2.3.0", - "x-is-function": "1.0.4", "x-is-string": "0.1.0" } }, @@ -15010,51 +15037,51 @@ } }, "unist-util-find-all-after": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.1.tgz", - "integrity": "sha1-TlUSq/734GFnga7Pex7XUcAK+Qg=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.2.tgz", + "integrity": "sha512-nDl79mKpffXojLpCimVXnxhlH/jjaTnDuScznU9J4jjsaUtBdDbxmlc109XtcqxY4SDO0SwzngsxxW8DIISt1w==", "dev": true, "requires": { - "unist-util-is": "2.1.1" + "unist-util-is": "2.1.2" } }, "unist-util-is": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.1.tgz", - "integrity": "sha1-DDEmKeP5YMZukx6BLT2A53AQlHs=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", + "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==", "dev": true }, "unist-util-modify-children": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.1.tgz", - "integrity": "sha1-ZtfmpEnm9nIguXarPLi166w55R0=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.2.tgz", + "integrity": "sha512-GRi04yhng1WqBf5RBzPkOtWAadcZS2gvuOgNn/cyJBYNxtTuyYqTKN0eg4rC1YJwGnzrqfRB3dSKm8cNCjNirg==", "dev": true, "requires": { - "array-iterate": "1.1.1" + "array-iterate": "1.1.2" } }, "unist-util-remove-position": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz", - "integrity": "sha1-WoXBVV/BugwQG4ZwfRXlD6TIcbs=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", + "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==", "dev": true, "requires": { - "unist-util-visit": "1.3.0" + "unist-util-visit": "1.3.1" } }, "unist-util-stringify-position": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz", - "integrity": "sha1-PMvcU2ee7W7PN3fdf14yKcG2qjw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", "dev": true }, "unist-util-visit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.0.tgz", - "integrity": "sha512-9ntYcxPFtl44gnwXrQKZ5bMqXMY0ZHzUpqMFiU4zcc8mmf/jzYm8GhYgezuUlX4cJIM1zIDYaO6fG/fI+L6iiQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.1.tgz", + "integrity": "sha512-0fdB9EQJU0tho5tK0VzOJzAQpPv2LyLZ030b10GxuzAWEfvd54mpY7BMjQ1L69k2YNvL+SvxRzH0yUIehOO8aA==", "dev": true, "requires": { - "unist-util-is": "2.1.1" + "unist-util-is": "2.1.2" } }, "universal-deep-strict-equal": { @@ -15280,7 +15307,7 @@ "requires": { "is-buffer": "1.1.6", "replace-ext": "1.0.0", - "unist-util-stringify-position": "1.1.1", + "unist-util-stringify-position": "1.1.2", "vfile-message": "1.0.0" } }, @@ -15296,7 +15323,7 @@ "integrity": "sha512-HPREhzTOB/sNDc9/Mxf8w0FmHnThg5CRSJdR9VRFkD2riqYWs+fuXlj5z8mIpv2LrD7uU41+oPWFOL4Mjlf+dw==", "dev": true, "requires": { - "unist-util-stringify-position": "1.1.1" + "unist-util-stringify-position": "1.1.2" } }, "vhost": { @@ -15339,6 +15366,11 @@ } } }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, "webdriverio": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.12.0.tgz", @@ -15502,12 +15534,6 @@ "safe-buffer": "5.1.1" } }, - "x-is-function": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/x-is-function/-/x-is-function-1.0.4.tgz", - "integrity": "sha1-XSlNw9Joy90GJYDgxd93o5HR+h4=", - "dev": true - }, "x-is-string": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", @@ -15552,19 +15578,9 @@ } }, "xmlbuilder": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-2.6.5.tgz", - "integrity": "sha1-b/etYPty0idk8AehZLd/K/FABSY=", - "requires": { - "lodash": "3.10.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - } - } + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.0.0.tgz", + "integrity": "sha512-7RWHlmF1yU/E++BZkRQTEv8ZFAhZ+YHINUAxiZ5LQTKRQq//igpiY8rh7dJqPzgb/IzeC5jH9P7OaCERfM9DwA==" }, "xmldom": { "version": "0.1.27", diff --git a/package.json b/package.json index 9cee9c8477c5..cf1c432927bf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Rocket.Chat", "description": "The Ultimate Open Source WebChat Platform", - "version": "0.64.0-develop", + "version": "0.65.0", "author": { "name": "Rocket.Chat", "url": "https://rocket.chat/" @@ -97,21 +97,21 @@ "eslint": "^4.19.1", "mocha": "^5.1.1", "mock-require": "^3.0.2", - "postcss-custom-properties": "^6.3.1", + "postcss-custom-properties": "^7.0.0", "postcss-import": "^11.1.0", "postcss-media-minmax": "^3.0.0", "postcss-nested": "^3.0.0", "postcss-selector-not": "^3.0.1", "progress": "^2.0.0", - "proxyquire": "^1.8.0", + "proxyquire": "^2.0.1", "simple-git": "^1.92.0", - "stylelint": "^8.4.0", + "stylelint": "^9.2.0", "stylelint-order": "^0.8.1", "supertest": "^3.0.0" }, "dependencies": { - "@babel/runtime": "^7.0.0-beta.44", - "@google-cloud/language": "^1.1.0", + "@babel/runtime": "^7.0.0-beta.46", + "@google-cloud/language": "^1.2.0", "@google-cloud/storage": "^1.6.0", "@google-cloud/vision": "^0.19.0", "@slack/client": "^4.2.0", @@ -122,24 +122,24 @@ "aws-sdk": "^2.231.1", "bad-words": "^1.6.1", "bcrypt": "^2.0.1", - "bson": "^1.0.4", - "bugsnag": "^2.1.3", + "bson": "^2.0.6", + "bugsnag": "^2.3.1", "bunyan": "^1.8.12", "busboy": "^0.2.14", "cas": "https://github.com/kcbanner/node-cas/tarball/fcd27dad333223b3b75a048bce27973fb3ca0f62", - "clipboard": "^1.7.1", - "codemirror": "^5.35.0", + "clipboard": "^2.0.1", + "codemirror": "^5.37.0", "coffeescript": "^1.12.7", "connect": "^2.7.10", - "core-js": "^2.5.3", - "csv-parse": "^1.3.3", + "core-js": "^2.5.5", + "csv-parse": "^2.2.0", "emailreplyparser": "^0.0.5", "file-type": "^7.7.1", - "filesize": "^3.6.0", + "filesize": "^3.6.1", "gridfs-stream": "^1.1.1", "he": "^1.1.1", "highlight.js": "^9.12.0", - "iconv-lite": "^0.4.19", + "iconv-lite": "^0.4.21", "image-size": "^0.6.2", "imap": "^0.8.19", "ip-range-check": "^0.0.2", @@ -148,21 +148,21 @@ "ldapjs": "^1.0.2", "less": "https://github.com/meteor/less.js/tarball/8130849eb3d7f0ecf0ca8d0af7c4207b0442e3f6", "less-plugin-autoprefix": "^1.5.1", - "localforage": "^1.5.6", + "localforage": "^1.7.1", "lokijs": "^1.5.3", - "lru-cache": "^2.6.5", + "lru-cache": "^4.1.2", "mailparser": "^2.2.0", - "marked": "^0.3.16", + "marked": "^0.3.19", "mime-db": "^1.33.0", "mime-type": "^3.0.5", "mkdirp": "^0.5.1", - "moment": "^2.20.1", - "moment-timezone": "^0.5.14", + "moment": "^2.22.1", + "moment-timezone": "^0.5.16", "node-dogstatsd": "^0.0.7", "object-path": "^0.11.4", "photoswipe": "^4.1.2", "poplib": "^0.1.7", - "prom-client": "^10.2.2", + "prom-client": "^11.0.0", "querystring": "^0.2.0", "redis": "^2.8.0", "semver": "^5.5.0", @@ -170,15 +170,15 @@ "speakeasy": "^2.0.0", "tar-stream": "^1.6.0", "toastr": "^2.1.4", - "twilio": "^2.9.1", + "twilio": "^3.16.0", "twit": "^2.2.9", "ua-parser-js": "^0.7.17", - "underscore": "^1.8.3", + "underscore": "^1.9.0", "underscore.string": "^3.3.4", "wolfy87-eventemitter": "^5.2.4", "xml-crypto": "^0.10.1", "xml2js": "^0.4.19", - "xmlbuilder": "^2.6.4", + "xmlbuilder": "^10.0.0", "xmldom": "^0.1.27", "yaqrcode": "^0.2.1" } diff --git a/packages/meteor-accounts-saml/saml_server.js b/packages/meteor-accounts-saml/saml_server.js index 067bbb765a7f..9ffc945bff32 100644 --- a/packages/meteor-accounts-saml/saml_server.js +++ b/packages/meteor-accounts-saml/saml_server.js @@ -170,17 +170,20 @@ Accounts.registerLoginHandler(function(loginRequest) { } }); -Accounts.saml._loginResultForCredentialToken = {}; - Accounts.saml.hasCredential = function(credentialToken) { - return _.has(Accounts.saml._loginResultForCredentialToken, credentialToken); + return RocketChat.models.CredentialTokens.findOneById(credentialToken) != null; }; Accounts.saml.retrieveCredential = function(credentialToken) { // The credentialToken in all these functions corresponds to SAMLs inResponseTo field and is mandatory to check. - const result = Accounts.saml._loginResultForCredentialToken[credentialToken]; - delete Accounts.saml._loginResultForCredentialToken[credentialToken]; - return result; + const data = RocketChat.models.CredentialTokens.findOneById(credentialToken); + if (data) { + return data.userInfo; + } +}; + +Accounts.saml.storeCredential = function(credentialToken, loginResult) { + RocketChat.models.CredentialTokens.create(credentialToken, loginResult); }; const closePopup = function(res, err) { @@ -334,21 +337,21 @@ const middleware = function(req, res, next) { } const credentialToken = (profile.inResponseToId && profile.inResponseToId.value) || profile.inResponseToId || profile.InResponseTo || samlObject.credentialToken; + const loginResult = { + profile + }; if (!credentialToken) { // No credentialToken in IdP-initiated SSO const saml_idp_credentialToken = Random.id(); - Accounts.saml._loginResultForCredentialToken[saml_idp_credentialToken] = { - profile - }; + Accounts.saml.storeCredential(saml_idp_credentialToken, loginResult); + const url = `${ Meteor.absoluteUrl('home') }?saml_idp_credentialToken=${ saml_idp_credentialToken }`; res.writeHead(302, { 'Location': url }); res.end(); } else { - Accounts.saml._loginResultForCredentialToken[credentialToken] = { - profile - }; + Accounts.saml.storeCredential(credentialToken, loginResult); closePopup(res); } }); diff --git a/packages/rocketchat-api/package.js b/packages/rocketchat-api/package.js index f97043855418..b842bb304da8 100644 --- a/packages/rocketchat-api/package.js +++ b/packages/rocketchat-api/package.js @@ -19,6 +19,7 @@ Package.onUse(function(api) { api.addFiles('server/helpers/requestParams.js', 'server'); api.addFiles('server/helpers/getPaginationItems.js', 'server'); api.addFiles('server/helpers/getUserFromParams.js', 'server'); + api.addFiles('server/helpers/getUserInfo.js', 'server'); api.addFiles('server/helpers/isUserFromParams.js', 'server'); api.addFiles('server/helpers/parseJsonQuery.js', 'server'); api.addFiles('server/helpers/deprecationWarning.js', 'server'); @@ -27,7 +28,6 @@ Package.onUse(function(api) { //Add default routes api.addFiles('server/default/info.js', 'server'); - api.addFiles('server/default/metrics.js', 'server'); //Add v1 routes api.addFiles('server/v1/channels.js', 'server'); diff --git a/packages/rocketchat-api/server/api.js b/packages/rocketchat-api/server/api.js index 29bd0c08c844..e32760255bd3 100644 --- a/packages/rocketchat-api/server/api.js +++ b/packages/rocketchat-api/server/api.js @@ -60,6 +60,10 @@ class API extends Restivus { return RocketChat.API.helperMethods; } + getHelperMethod(name) { + return RocketChat.API.helperMethods.get(name); + } + addAuthMethod(method) { this.authMethods.push(method); } @@ -135,6 +139,8 @@ class API extends Restivus { routes = [routes]; } + const version = this._config.version; + routes.forEach((route) => { //Note: This is required due to Restivus calling `addRoute` in the constructor of itself if (this.hasHelperMethods()) { @@ -146,16 +152,29 @@ class API extends Restivus { //Add a try/catch for each endpoint const originalAction = endpoints[method].action; endpoints[method].action = function _internalRouteActionHandler() { + const rocketchatRestApiEnd = RocketChat.metrics.rocketchatRestApi.startTimer({ + method, + version, + user_agent: this.request.headers['user-agent'], + entrypoint: route + }); + this.logger.debug(`${ this.request.method.toUpperCase() }: ${ this.request.url }`); let result; try { result = originalAction.apply(this); } catch (e) { this.logger.debug(`${ method } ${ route } threw an error:`, e.stack); - return RocketChat.API.v1.failure(e.message, e.error); + result = RocketChat.API.v1.failure(e.message, e.error); } - return result ? result : RocketChat.API.v1.success(); + result = result || RocketChat.API.v1.success(); + + rocketchatRestApiEnd({ + status: result.statusCode + }); + + return result; }; for (const [name, helperMethod] of this.getHelperMethods()) { @@ -224,6 +243,7 @@ class API extends Restivus { this.addRoute('login', {authRequired: false}, { post() { const args = loginCompatibility(this.bodyParams); + const getUserInfo = self.getHelperMethod('getUserInfo'); const invocation = new DDPCommon.MethodInvocation({ connection: { @@ -273,7 +293,8 @@ class API extends Restivus { status: 'success', data: { userId: this.userId, - authToken: auth.token + authToken: auth.token, + me: getUserInfo(this.user) } }; diff --git a/packages/rocketchat-api/server/default/metrics.js b/packages/rocketchat-api/server/default/metrics.js deleted file mode 100644 index 89b761c199a1..000000000000 --- a/packages/rocketchat-api/server/default/metrics.js +++ /dev/null @@ -1,8 +0,0 @@ -RocketChat.API.default.addRoute('metrics', { authRequired: false }, { - get() { - return { - headers: { 'Content-Type': 'text/plain' }, - body: RocketChat.promclient.register.metrics() - }; - } -}); diff --git a/packages/rocketchat-api/server/helpers/getUserInfo.js b/packages/rocketchat-api/server/helpers/getUserInfo.js new file mode 100644 index 000000000000..0ab30a33ab44 --- /dev/null +++ b/packages/rocketchat-api/server/helpers/getUserInfo.js @@ -0,0 +1,56 @@ +const getInfoFromUserObject = (user) => { + const { + _id, + name, + emails, + status, + statusConnection, + username, + utcOffset, + active, + language, + roles, + settings + } = user; + return { + _id, + name, + emails, + status, + statusConnection, + username, + utcOffset, + active, + language, + roles, + settings + }; +}; + + +RocketChat.API.helperMethods.set('getUserInfo', function _getUserInfo(user) { + const me = getInfoFromUserObject(user); + const isVerifiedEmail = () => { + if (me && me.emails && Array.isArray(me.emails)) { + return me.emails.find((email) => email.verified); + } + return false; + }; + const getUserPreferences = () => { + const defaultUserSettingPrefix = 'Accounts_Default_User_Preferences_'; + const allDefaultUserSettings = RocketChat.settings.get(new RegExp(`^${ defaultUserSettingPrefix }.*$`)); + + return allDefaultUserSettings.reduce((accumulator, setting) => { + const settingWithoutPrefix = setting.key.replace(defaultUserSettingPrefix, ' ').trim(); + accumulator[settingWithoutPrefix] = RocketChat.getUserPreference(user, settingWithoutPrefix); + return accumulator; + }, {}); + }; + const verifiedEmail = isVerifiedEmail(); + me.email = verifiedEmail ? verifiedEmail.address : undefined; + me.settings = { + preferences: getUserPreferences() + }; + + return me; +}); diff --git a/packages/rocketchat-api/server/v1/channels.js b/packages/rocketchat-api/server/v1/channels.js index eb76ca5a2038..55a870b526b6 100644 --- a/packages/rocketchat-api/server/v1/channels.js +++ b/packages/rocketchat-api/server/v1/channels.js @@ -140,6 +140,60 @@ RocketChat.API.v1.addRoute('channels.close', { authRequired: true }, { } }); +RocketChat.API.v1.addRoute('channels.counters', { authRequired: true }, { + get() { + const access = RocketChat.authz.hasPermission(this.userId, 'view-room-administration'); + const ruserId = this.requestParams().userId; + let user = this.userId; + let unreads = null; + let userMentions = null; + let unreadsFrom = null; + let joined = false; + let msgs = null; + let latest = null; + let members = null; + let lm = null; + + if (ruserId) { + if (!access) { + return RocketChat.API.v1.unauthorized(); + } + user = ruserId; + } + const room = findChannelByIdOrName({ + params: this.requestParams(), + returnUsernames: true + }); + const channel = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(room._id, user); + lm = channel._room.lm ? channel._room.lm : channel._room._updatedAt; + + if (typeof channel !== 'undefined' && channel.open) { + if (channel.ls) { + unreads = RocketChat.models.Messages.countVisibleByRoomIdBetweenTimestampsInclusive(channel.rid, channel.ls, lm); + unreadsFrom = channel.ls; + } + userMentions = channel.userMentions; + joined = true; + } + + if (access || joined) { + msgs = room.msgs; + latest = lm; + members = room.usernames.length; + } + + return RocketChat.API.v1.success({ + joined, + members, + unreads, + unreadsFrom, + msgs, + latest, + userMentions + }); + } +}); + // Channel -> create function createChannelValidator(params) { @@ -503,6 +557,10 @@ RocketChat.API.v1.addRoute('channels.members', { authRequired: true }, { returnUsernames: true }); + if (findResult.broadcast && !RocketChat.authz.hasPermission(this.userId, 'view-broadcast-member-list')) { + return RocketChat.API.v1.unauthorized(); + } + const { offset, count } = this.getPaginationItems(); const { sort } = this.parseJsonQuery(); @@ -671,6 +729,24 @@ RocketChat.API.v1.addRoute('channels.rename', { authRequired: true }, { } }); +RocketChat.API.v1.addRoute('channels.setCustomFields', { authRequired: true }, { + post() { + if (!this.bodyParams.customFields || !(typeof this.bodyParams.customFields === 'object')) { + return RocketChat.API.v1.failure('The bodyParam "customFields" is required with a type like object.'); + } + + const findResult = findChannelByIdOrName({ params: this.requestParams() }); + + Meteor.runAsUser(this.userId, () => { + Meteor.call('saveRoomSettings', findResult._id, 'roomCustomFields', this.bodyParams.customFields); + }); + + return RocketChat.API.v1.success({ + channel: RocketChat.models.Rooms.findOneById(findResult._id, { fields: RocketChat.API.v1.defaultFieldsToExclude }) + }); + } +}); + RocketChat.API.v1.addRoute('channels.setDescription', { authRequired: true }, { post() { if (!this.bodyParams.description || !this.bodyParams.description.trim()) { @@ -866,3 +942,14 @@ RocketChat.API.v1.addRoute('channels.getAllUserMentionsByChannel', { authRequire } }); +RocketChat.API.v1.addRoute('channels.roles', { authRequired: true }, { + get() { + const findResult = findChannelByIdOrName({ params: this.requestParams() }); + + const roles = Meteor.runAsUser(this.userId, () => Meteor.call('getRoomRoles', findResult._id)); + + return RocketChat.API.v1.success({ + roles + }); + } +}); diff --git a/packages/rocketchat-api/server/v1/commands.js b/packages/rocketchat-api/server/v1/commands.js index 0c3e26d8fe40..21717555cd0b 100644 --- a/packages/rocketchat-api/server/v1/commands.js +++ b/packages/rocketchat-api/server/v1/commands.js @@ -59,7 +59,7 @@ RocketChat.API.v1.addRoute('commands.run', { authRequired: true }, { } if (typeof body.roomId !== 'string') { - return RocketChat.API.v1.failure('The room\'s id where to execute this command must provided and be a string.'); + return RocketChat.API.v1.failure('The room\'s id where to execute this command must be provided and be a string.'); } const cmd = body.command.toLowerCase(); @@ -84,3 +84,81 @@ RocketChat.API.v1.addRoute('commands.run', { authRequired: true }, { return RocketChat.API.v1.success({ result }); } }); + +RocketChat.API.v1.addRoute('commands.preview', { authRequired: true }, { + // Expects these query params: command: 'giphy', params: 'mine', roomId: 'value' + get() { + const query = this.queryParams; + const user = this.getLoggedInUser(); + + if (typeof query.command !== 'string') { + return RocketChat.API.v1.failure('You must provide a command to get the previews from.'); + } + + if (query.params && typeof query.params !== 'string') { + return RocketChat.API.v1.failure('The parameters for the command must be a single string.'); + } + + if (typeof query.roomId !== 'string') { + return RocketChat.API.v1.failure('The room\'s id where the previews are being displayed must be provided and be a string.'); + } + + const cmd = query.command.toLowerCase(); + if (!RocketChat.slashCommands.commands[cmd]) { + return RocketChat.API.v1.failure('The command provided does not exist (or is disabled).'); + } + + // This will throw an error if they can't or the room is invalid + Meteor.call('canAccessRoom', query.roomId, user._id); + + const params = query.params ? query.params : ''; + + let preview; + Meteor.runAsUser(user._id, () => { + preview = Meteor.call('getSlashCommandPreviews', { cmd, params, msg: { rid: query.roomId } }); + }); + + return RocketChat.API.v1.success({ preview }); + }, + // Expects a body format of: { command: 'giphy', params: 'mine', roomId: 'value', previewItem: { id: 'sadf8' type: 'image', value: 'https://dev.null/gif } } + post() { + const body = this.bodyParams; + const user = this.getLoggedInUser(); + + if (typeof body.command !== 'string') { + return RocketChat.API.v1.failure('You must provide a command to run the preview item on.'); + } + + if (body.params && typeof body.params !== 'string') { + return RocketChat.API.v1.failure('The parameters for the command must be a single string.'); + } + + if (typeof body.roomId !== 'string') { + return RocketChat.API.v1.failure('The room\'s id where the preview is being executed in must be provided and be a string.'); + } + + if (typeof body.previewItem === 'undefined') { + return RocketChat.API.v1.failure('The preview item being executed must be provided.'); + } + + if (!body.previewItem.id || !body.previewItem.type || typeof body.previewItem.value === 'undefined') { + return RocketChat.API.v1.failure('The preview item being executed is in the wrong format.'); + } + + const cmd = body.command.toLowerCase(); + if (!RocketChat.slashCommands.commands[cmd]) { + return RocketChat.API.v1.failure('The command provided does not exist (or is disabled).'); + } + + // This will throw an error if they can't or the room is invalid + Meteor.call('canAccessRoom', body.roomId, user._id); + + const params = body.params ? body.params : ''; + + Meteor.runAsUser(user._id, () => { + Meteor.call('executeSlashCommandPreview', { cmd, params, msg: { rid: body.roomId } }, body.previewItem); + }); + + return RocketChat.API.v1.success(); + } +}); diff --git a/packages/rocketchat-api/server/v1/groups.js b/packages/rocketchat-api/server/v1/groups.js index 3826a38bca9d..73fa7d3cc113 100644 --- a/packages/rocketchat-api/server/v1/groups.js +++ b/packages/rocketchat-api/server/v1/groups.js @@ -107,6 +107,75 @@ RocketChat.API.v1.addRoute('groups.close', { authRequired: true }, { } }); +RocketChat.API.v1.addRoute('groups.counters', { authRequired: true }, { + get() { + const access = RocketChat.authz.hasPermission(this.userId, 'view-room-administration'); + const params = this.requestParams(); + let user = this.userId; + let room; + let unreads = null; + let userMentions = null; + let unreadsFrom = null; + let joined = false; + let msgs = null; + let latest = null; + let members = null; + let lm = null; + + if ((!params.roomId || !params.roomId.trim()) && (!params.roomName || !params.roomName.trim())) { + throw new Meteor.Error('error-room-param-not-provided', 'The parameter "roomId" or "roomName" is required'); + } + + if (params.roomId) { + room = RocketChat.models.Rooms.findOneById(params.roomId); + } else if (params.roomName) { + room = RocketChat.models.Rooms.findOneByName(params.roomName); + } + + if (!room || room.t !== 'p') { + throw new Meteor.Error('error-room-not-found', 'The required "roomId" or "roomName" param provided does not match any group'); + } + + if (room.archived) { + throw new Meteor.Error('error-room-archived', `The private group, ${ room.name }, is archived`); + } + + if (params.userId) { + if (!access) { + return RocketChat.API.v1.unauthorized(); + } + user = params.userId; + } + const group = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(room._id, user); + lm = group._room.lm ? group._room.lm : group._room._updatedAt; + + if (typeof group !== 'undefined' && group.open) { + if (group.ls) { + unreads = RocketChat.models.Messages.countVisibleByRoomIdBetweenTimestampsInclusive(group.rid, group.ls, lm); + unreadsFrom = group.ls; + } + userMentions = group.userMentions; + joined = true; + } + + if (access || joined) { + msgs = room.msgs; + latest = lm; + members = room.usernames.length; + } + + return RocketChat.API.v1.success({ + joined, + members, + unreads, + unreadsFrom, + msgs, + latest, + userMentions + }); + } +}); + //Create Private Group RocketChat.API.v1.addRoute('groups.create', { authRequired: true }, { post() { @@ -380,6 +449,11 @@ RocketChat.API.v1.addRoute('groups.listAll', { authRequired: true }, { RocketChat.API.v1.addRoute('groups.members', { authRequired: true }, { get() { const findResult = findPrivateGroupByIdOrName({ params: this.requestParams(), userId: this.userId }); + + if (findResult._room.broadcast && !RocketChat.authz.hasPermission(this.userId, 'view-broadcast-member-list')) { + return RocketChat.API.v1.unauthorized(); + } + const { offset, count } = this.getPaginationItems(); const { sort } = this.parseJsonQuery(); @@ -540,6 +614,24 @@ RocketChat.API.v1.addRoute('groups.rename', { authRequired: true }, { } }); +RocketChat.API.v1.addRoute('groups.setCustomFields', { authRequired: true }, { + post() { + if (!this.bodyParams.customFields || !(typeof this.bodyParams.customFields === 'object')) { + return RocketChat.API.v1.failure('The bodyParam "customFields" is required with a type like object.'); + } + + const findResult = findPrivateGroupByIdOrName({ params: this.requestParams(), userId: this.userId }); + + Meteor.runAsUser(this.userId, () => { + Meteor.call('saveRoomSettings', findResult.rid, 'roomCustomFields', this.bodyParams.customFields); + }); + + return RocketChat.API.v1.success({ + group: RocketChat.models.Rooms.findOneById(findResult.rid, { fields: RocketChat.API.v1.defaultFieldsToExclude }) + }); + } +}); + RocketChat.API.v1.addRoute('groups.setDescription', { authRequired: true }, { post() { if (!this.bodyParams.description || !this.bodyParams.description.trim()) { @@ -649,3 +741,15 @@ RocketChat.API.v1.addRoute('groups.unarchive', { authRequired: true }, { return RocketChat.API.v1.success(); } }); + +RocketChat.API.v1.addRoute('groups.roles', { authRequired: true }, { + get() { + const findResult = findPrivateGroupByIdOrName({ params: this.requestParams(), userId: this.userId }); + + const roles = Meteor.runAsUser(this.userId, () => Meteor.call('getRoomRoles', findResult.rid)); + + return RocketChat.API.v1.success({ + roles + }); + } +}); diff --git a/packages/rocketchat-api/server/v1/im.js b/packages/rocketchat-api/server/v1/im.js index 6d5905016705..c2ad7d8da8e0 100644 --- a/packages/rocketchat-api/server/v1/im.js +++ b/packages/rocketchat-api/server/v1/im.js @@ -49,6 +49,58 @@ RocketChat.API.v1.addRoute(['dm.close', 'im.close'], { authRequired: true }, { } }); +RocketChat.API.v1.addRoute(['dm.counters', 'im.counters'], { authRequired: true }, { + get() { + const access = RocketChat.authz.hasPermission(this.userId, 'view-room-administration'); + const ruserId = this.requestParams().userId; + let user = this.userId; + let unreads = null; + let userMentions = null; + let unreadsFrom = null; + let joined = false; + let msgs = null; + let latest = null; + let members = null; + let lm = null; + + if (ruserId) { + if (!access) { + return RocketChat.API.v1.unauthorized(); + } + user = ruserId; + } + const rs = findDirectMessageRoom(this.requestParams(), {'_id': user}); + const room = rs.room; + const dm = rs.subscription; + lm = room.lm ? room.lm : room._updatedAt; + + if (typeof dm !== 'undefined' && dm.open) { + if (dm.ls && room.msgs) { + unreads = dm.unread; + unreadsFrom = dm.ls; + } + userMentions = dm.userMentions; + joined = true; + } + + if (access || joined) { + msgs = room.msgs; + latest = lm; + members = room.usernames.length; + } + + return RocketChat.API.v1.success({ + joined, + members, + unreads, + unreadsFrom, + msgs, + latest, + userMentions + }); + } +}); + RocketChat.API.v1.addRoute(['dm.files', 'im.files'], { authRequired: true }, { get() { const findResult = findDirectMessageRoom(this.requestParams(), this.user); diff --git a/packages/rocketchat-api/server/v1/misc.js b/packages/rocketchat-api/server/v1/misc.js index 3937078483b5..1dc196e6bc2a 100644 --- a/packages/rocketchat-api/server/v1/misc.js +++ b/packages/rocketchat-api/server/v1/misc.js @@ -1,4 +1,3 @@ -import _ from 'underscore'; RocketChat.API.v1.addRoute('info', { authRequired: false }, { get() { @@ -20,29 +19,7 @@ RocketChat.API.v1.addRoute('info', { authRequired: false }, { RocketChat.API.v1.addRoute('me', { authRequired: true }, { get() { - const me = _.pick(this.user, [ - '_id', - 'name', - 'emails', - 'status', - 'statusConnection', - 'username', - 'utcOffset', - 'active', - 'language', - 'roles', - 'settings' - ]); - - const verifiedEmail = me.emails.find((email) => email.verified); - const userHasNotSetPreferencesYet = !me.settings || !me.settings.preferences; - - me.email = verifiedEmail ? verifiedEmail.address : undefined; - if (userHasNotSetPreferencesYet) { - me.settings = { preferences: {} }; - } - - return RocketChat.API.v1.success(me); + return RocketChat.API.v1.success(this.getUserInfo(RocketChat.models.Users.findOneById(this.userId))); } }); @@ -168,12 +145,17 @@ RocketChat.API.v1.addRoute('directory', { authRequired: true }, { const { sort, query } = this.parseJsonQuery(); const { text, type } = query; - const sortDirection = sort && sort === 1 ? 'asc' : 'desc'; + if (sort && Object.keys(sort).length > 1) { + return RocketChat.API.v1.failure('This method support only one "sort" parameter'); + } + const sortBy = sort ? Object.keys(sort)[0] : undefined; + const sortDirection = sort && Object.values(sort)[0] === 1 ? 'asc' : 'desc'; const result = Meteor.runAsUser(this.userId, () => Meteor.call('browseChannels', { text, type, - sort: sortDirection, + sortBy, + sortDirection, page: offset, limit: count })); @@ -181,6 +163,11 @@ RocketChat.API.v1.addRoute('directory', { authRequired: true }, { if (!result) { return RocketChat.API.v1.failure('Please verify the parameters'); } - return RocketChat.API.v1.success({ result }); + return RocketChat.API.v1.success({ + result: result.results, + count: result.results.length, + offset, + total: result.total + }); } }); diff --git a/packages/rocketchat-api/server/v1/push.js b/packages/rocketchat-api/server/v1/push.js index 4194a01ac633..31180997c8b7 100644 --- a/packages/rocketchat-api/server/v1/push.js +++ b/packages/rocketchat-api/server/v1/push.js @@ -16,7 +16,7 @@ RocketChat.API.v1.addRoute('push.token', { authRequired: true }, { } if (!value || typeof value !== 'string') { - throw new Meteor.Error('error-token-param-not-valid', 'The required "token" body param is missing or invalid.'); + throw new Meteor.Error('error-token-param-not-valid', 'The required "value" body param is missing or invalid.'); } if (!appName || typeof appName !== 'string') { diff --git a/packages/rocketchat-api/server/v1/settings.js b/packages/rocketchat-api/server/v1/settings.js index cbac450b8ee2..b4bd19ebf505 100644 --- a/packages/rocketchat-api/server/v1/settings.js +++ b/packages/rocketchat-api/server/v1/settings.js @@ -101,10 +101,23 @@ RocketChat.API.v1.addRoute('settings/:_id', { authRequired: true }, { return RocketChat.API.v1.unauthorized(); } + // allow special handling of particular setting types + const setting = RocketChat.models.Settings.findOneNotHiddenById(this.urlParams._id); + if (setting.type === 'action' && this.bodyParams && this.bodyParams.execute) { + //execute the configured method + Meteor.call(setting.value); + return RocketChat.API.v1.success(); + } + + if (setting.type === 'color' && this.bodyParams && this.bodyParams.editor && this.bodyParams.value) { + RocketChat.models.Settings.updateOptionsById(this.urlParams._id, { editor: this.bodyParams.editor }); + RocketChat.models.Settings.updateValueNotHiddenById(this.urlParams._id, this.bodyParams.value); + return RocketChat.API.v1.success(); + } + check(this.bodyParams, { value: Match.Any }); - if (RocketChat.models.Settings.updateValueNotHiddenById(this.urlParams._id, this.bodyParams.value)) { return RocketChat.API.v1.success(); } diff --git a/packages/rocketchat-api/server/v1/subscriptions.js b/packages/rocketchat-api/server/v1/subscriptions.js index 6b17cf66e820..e58fe4094a26 100644 --- a/packages/rocketchat-api/server/v1/subscriptions.js +++ b/packages/rocketchat-api/server/v1/subscriptions.js @@ -69,3 +69,19 @@ RocketChat.API.v1.addRoute('subscriptions.read', { authRequired: true }, { } }); +RocketChat.API.v1.addRoute('subscriptions.unread', { authRequired: true }, { + post() { + const { roomId, firstUnreadMessage } = this.bodyParams; + if (!roomId && (firstUnreadMessage && !firstUnreadMessage._id)) { + return RocketChat.API.v1.failure('At least one of "roomId" or "firstUnreadMessage._id" params is required'); + } + + Meteor.runAsUser(this.userId, () => + Meteor.call('unreadMessages', firstUnreadMessage, roomId) + ); + + return RocketChat.API.v1.success(); + } +}); + + diff --git a/packages/rocketchat-api/server/v1/users.js b/packages/rocketchat-api/server/v1/users.js index 12ae7a470b87..2d8e9b9003a7 100644 --- a/packages/rocketchat-api/server/v1/users.js +++ b/packages/rocketchat-api/server/v1/users.js @@ -363,6 +363,13 @@ RocketChat.API.v1.addRoute('users.setPreferences', { authRequired: true }, { preferences = _.extend({ _id: userId, settings: { preferences: this.bodyParams.data } }); } + // Keep compatibility with old values + if (preferences.emailNotificationMode === 'all') { + preferences.emailNotificationMode = 'mentions'; + } else if (preferences.emailNotificationMode === 'disabled') { + preferences.emailNotificationMode = 'nothing'; + } + Meteor.runAsUser(this.userId, () => RocketChat.saveUser(this.userId, preferences)); return RocketChat.API.v1.success({ user: RocketChat.models.Users.findOneById(this.bodyParams.userId, { fields: preferences }) }); @@ -409,3 +416,11 @@ RocketChat.API.v1.addRoute('users.forgotPassword', { authRequired: false }, { return RocketChat.API.v1.failure('User not found'); } }); + +RocketChat.API.v1.addRoute('users.getUsernameSuggestion', { authRequired: true }, { + get() { + const result = Meteor.runAsUser(this.userId, () => Meteor.call('getUsernameSuggestion')); + + return RocketChat.API.v1.success({ result }); + } +}); diff --git a/packages/rocketchat-apps/assets/stylesheets/apps.css b/packages/rocketchat-apps/assets/stylesheets/apps.css index b8800c68d5f6..87757e032ab6 100644 --- a/packages/rocketchat-apps/assets/stylesheets/apps.css +++ b/packages/rocketchat-apps/assets/stylesheets/apps.css @@ -18,3 +18,11 @@ div.apps-error { width: 100%; font-size: 45px; } + +.preferences-page--apps .rc-table-tr { + opacity: 0.5; +} + +.preferences-page--apps .rc-table-tr.active { + opacity: 1; +} diff --git a/packages/rocketchat-apps/client/admin/appInstall.js b/packages/rocketchat-apps/client/admin/appInstall.js index 0369f75254c4..e1e03a37991d 100644 --- a/packages/rocketchat-apps/client/admin/appInstall.js +++ b/packages/rocketchat-apps/client/admin/appInstall.js @@ -65,21 +65,26 @@ Template.appInstall.events({ if (url) { try { t.isInstalling.set(true); + const isUpdating = t.isUpdatingId.get(); let result; - if (t.isUpdatingId.get()) { + if (isUpdating) { result = await RocketChat.API.post(`apps/${ t.isUpdatingId.get() }`, { url }); } else { result = await RocketChat.API.post('apps', { url }); } - FlowRouter.go(`/admin/apps/${ result.app.id }`); + if (result.compilerErrors.length !== 0 || result.app.status === 'compiler_error') { + console.warn(`The App contains errors and could not be ${ isUpdating ? 'updated' : 'installed' }.`); + } else { + FlowRouter.go(`/admin/apps/${ result.app.id }`); + } } catch (err) { console.warn('err', err); - } finally { - t.isInstalling.set(false); } + t.isInstalling.set(false); + return; } @@ -103,19 +108,26 @@ Template.appInstall.events({ t.isInstalling.set(true); try { + const isUpdating = t.isUpdatingId.get(); let result; - if (t.isUpdatingId.get()) { + if (isUpdating) { result = await RocketChat.API.upload(`apps/${ t.isUpdatingId.get() }`, data); } else { result = await RocketChat.API.upload('apps', data); } - FlowRouter.go(`/admin/apps/${ result.app.id }`); + console.log('install result', result); + + if (result.compilerErrors.length !== 0 || result.app.status === 'compiler_error') { + console.warn(`The App contains errors and could not be ${ isUpdating ? 'updated' : 'installed' }.`); + } else { + FlowRouter.go(`/admin/apps/${ result.app.id }`); + } } catch (err) { console.warn('err', err); - } finally { - t.isInstalling.set(false); } + + t.isInstalling.set(false); } }); diff --git a/packages/rocketchat-apps/client/admin/appManage.html b/packages/rocketchat-apps/client/admin/appManage.html index ce53365fa337..a1859be07917 100644 --- a/packages/rocketchat-apps/client/admin/appManage.html +++ b/packages/rocketchat-apps/client/admin/appManage.html @@ -10,6 +10,9 @@ + + {{_ "Activate"}} + @@ -54,28 +57,27 @@ {{#each settings}}
{{#if $eq type 'string'}} -
- {{# if i18nDescription}} -
{{{parseDescription i18nDescription}}}
+ {{#if i18nDescription}} +
{{{parseDescription i18nDescription}}}
{{/if}} - {{# if i18nAlert}} -
-
- {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} + {{#if i18nAlert}} +
+
+ {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} +
+
{{_ "i18nAlert"}}
-
{{_ "i18nAlert"}}
-
{{/if}}
{{else if $eq type 'boolean'}} @@ -90,6 +92,14 @@ {{{parseDescription i18nDescription}}} + {{# if i18nAlert}} +
+
+ {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} +
+
{{_ "i18nAlert"}}
+
+ {{/if}}
{{else if $eq type 'int'}}
@@ -104,15 +114,15 @@
{{# if i18nDescription}} -
{{{parseDescription i18nDescription}}}
+
{{{parseDescription i18nDescription}}}
{{/if}} {{# if i18nAlert}} -
-
- {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} +
+
+ {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} +
+
{{_ "i18nAlert"}}
-
{{_ "i18nAlert"}}
-
{{/if}}
{{else if $eq type 'password'}} @@ -128,15 +138,15 @@
{{# if i18nDescription}} -
{{{parseDescription i18nDescription}}}
+
{{{parseDescription i18nDescription}}}
{{/if}} {{# if i18nAlert}} -
-
- {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} +
+
+ {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} +
+
{{_ "i18nAlert"}}
-
{{_ "i18nAlert"}}
-
{{/if}}
{{else if $eq type 'relativeUrl'}} @@ -150,15 +160,15 @@ {{# if i18nDescription}} -
{{{parseDescription i18nDescription}}}
+
{{{parseDescription i18nDescription}}}
{{/if}} {{# if i18nAlert}} -
-
- {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} +
+
+ {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} +
+
{{_ "i18nAlert"}}
-
{{_ "i18nAlert"}}
-
{{/if}}
{{else if $eq type 'font'}} @@ -174,15 +184,15 @@ {{# if i18nDescription}} -
{{{parseDescription i18nDescription}}}
+
{{{parseDescription i18nDescription}}}
{{/if}} {{# if i18nAlert}} -
-
- {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} +
+
+ {{> icon block="rc-input__error-icon" icon="warning" classes="rc-input__error-icon-svg"}} +
+
{{_ "i18nAlert"}}
-
{{_ "i18nAlert"}}
-
{{/if}}
{{else if $eq type 'code'}} @@ -220,8 +230,6 @@ {{else if $eq type 'select'}} - -
{{else if $eq type 'color'}} -
- - - + + +
diff --git a/packages/rocketchat-apps/client/admin/appManage.js b/packages/rocketchat-apps/client/admin/appManage.js index b39022f97e13..108f426357ad 100644 --- a/packages/rocketchat-apps/client/admin/appManage.js +++ b/packages/rocketchat-apps/client/admin/appManage.js @@ -295,11 +295,14 @@ Template.appManage.events({ } const setting = t.settings.get()[this.id]; - setting.value = value; - if (setting.oldValue !== setting.value) { - t.settings.get()[this.id].hasChanged = true; - t.settings.set(t.settings.get()); + if (setting) { + setting.value = value; + + if (setting.oldValue !== setting.value) { + t.settings.get()[this.id].hasChanged = true; + t.settings.set(t.settings.get()); + } } }, 500) }); diff --git a/packages/rocketchat-apps/client/admin/appWhatIsIt.html b/packages/rocketchat-apps/client/admin/appWhatIsIt.html new file mode 100644 index 000000000000..0f7e4c49786c --- /dev/null +++ b/packages/rocketchat-apps/client/admin/appWhatIsIt.html @@ -0,0 +1,26 @@ + diff --git a/packages/rocketchat-apps/client/admin/appWhatIsIt.js b/packages/rocketchat-apps/client/admin/appWhatIsIt.js new file mode 100644 index 000000000000..425bab96c822 --- /dev/null +++ b/packages/rocketchat-apps/client/admin/appWhatIsIt.js @@ -0,0 +1,39 @@ +Template.appWhatIsIt.onCreated(function() { + this.isLoading = new ReactiveVar(false); + this.hasError = new ReactiveVar(false); +}); + +Template.appWhatIsIt.helpers({ + isLoading() { + if (Template.instance().isLoading) { + return Template.instance().isLoading.get(); + } + + return false; + }, + hasError() { + if (Template.instance().hasError) { + return Template.instance().hasError.get(); + } + + return false; + } +}); + +Template.appWhatIsIt.events({ + 'click .js-enable'(e, t) { + t.isLoading.set(true); + + Meteor.call('apps/go-enable', function _appsMightHaveBeenEnabled(error) { + if (error) { + t.hasError.set(true); + t.isLoading.set(false); + return; + } + + window.Apps.load(true); + + FlowRouter.go('/admin/apps'); + }); + } +}); diff --git a/packages/rocketchat-apps/client/admin/apps.html b/packages/rocketchat-apps/client/admin/apps.html index 560d3685c2af..65de5a5f983b 100644 --- a/packages/rocketchat-apps/client/admin/apps.html +++ b/packages/rocketchat-apps/client/admin/apps.html @@ -2,7 +2,17 @@
{{#header sectionName="Manage_Apps" hideHelp=true fixedHeight=true}} - +
+ + +
{{/header}}
{{#requiresPermission 'manage-apps'}} @@ -17,7 +27,7 @@ {{#each apps}} - +
@@ -28,7 +38,7 @@ {{#if description}} {{description}} {{/if}} -
+
{{version}} @@ -42,11 +52,11 @@ {{else}} - - - {{_ "There_are_no_applications_installed"}} - - + + + {{_ "There_are_no_applications_installed"}} + + {{/each}} diff --git a/packages/rocketchat-apps/client/admin/apps.js b/packages/rocketchat-apps/client/admin/apps.js index ba009f1b2220..181c4d061f5b 100644 --- a/packages/rocketchat-apps/client/admin/apps.js +++ b/packages/rocketchat-apps/client/admin/apps.js @@ -1,9 +1,21 @@ import { AppEvents } from '../communication'; +const ENABLED_STATUS = ['auto_enabled', 'manually_enabled']; +const enabled = ({status}) => ENABLED_STATUS.includes(status); +const sortByStatus = (a, b) => { + if (enabled(a)) { + if (enabled(b)) { + return a.name > b.name; + } + return -1; + } + return 1; +}; Template.apps.onCreated(function() { const instance = this; this.ready = new ReactiveVar(false); this.apps = new ReactiveVar([]); + this.filter = new ReactiveVar(''); RocketChat.API.get('apps').then((result) => { instance.apps.set(result.apps); @@ -53,10 +65,15 @@ Template.apps.helpers({ return false; }, apps() { - return Template.instance().apps.get(); + const instance = Template.instance(); + const filter = instance.filter.get().toLowerCase(); + return instance.apps.get().filter(({name}) => name.toLowerCase().includes(filter)).sort(sortByStatus); }, parseStatus(status) { return t(`App_status_${ status }`); + }, + activeClass(status) { + return enabled({status}) ? 'active' : ''; } }); @@ -70,8 +87,10 @@ Template.apps.events({ // show an error ? I don't think this should ever happen } }, - 'click [data-button="install"]'() { FlowRouter.go('/admin/app/install'); + }, + 'keyup #app-filter'(e, t) { + t.filter.set(e.currentTarget.value); } }); diff --git a/packages/rocketchat-apps/client/orchestrator.js b/packages/rocketchat-apps/client/orchestrator.js index f9ddfe4391d4..5a7b331b86a2 100644 --- a/packages/rocketchat-apps/client/orchestrator.js +++ b/packages/rocketchat-apps/client/orchestrator.js @@ -2,17 +2,58 @@ import { AppWebsocketReceiver } from './communication'; class AppClientOrchestrator { constructor() { - this.ws = new AppWebsocketReceiver(this); + this._isLoaded = false; + this._isEnabled = false; + this._loadingResolve; + this._refreshLoading(); + } + + isLoaded() { + return this._isLoaded; + } + + isEnabled() { + return this._isEnabled; + } - this._addAdminMenuOption(); + getLoadingPromise() { + if (this._isLoaded) { + return Promise.resolve(this._isEnabled); + } - Meteor.defer(() => this._loadLanguages()); + return this._loadingPromise; + } + + load(isEnabled) { + console.log('Loading:', isEnabled); + this._isEnabled = isEnabled; + + // It was already loaded, so let's load it again + if (this._isLoaded) { + this._refreshLoading(); + } else { + this.ws = new AppWebsocketReceiver(this); + this._addAdminMenuOption(); + } + + Meteor.defer(() => { + this._loadLanguages().then(() => { + this._loadingResolve(this._isEnabled); + this._isLoaded = true; + }); + }); } getWsListener() { return this.ws; } + _refreshLoading() { + this._loadingPromise = new Promise((resolve) => { + this._loadingResolve = resolve; + }); + } + _addAdminMenuOption() { RocketChat.AdminBox.addOption({ icon: 'cube', @@ -25,7 +66,7 @@ class AppClientOrchestrator { } _loadLanguages() { - RocketChat.API.get('apps/languages').then((info) => { + return RocketChat.API.get('apps/languages').then((info) => { info.apps.forEach((rlInfo) => this.parseAndLoadLanguages(rlInfo.languages)); }); } @@ -42,34 +83,61 @@ class AppClientOrchestrator { } Meteor.startup(function _rlClientOrch() { - Meteor.call('apps/is-enabled', (error, e) => e ? window.Apps = new AppClientOrchestrator() : undefined); + window.Apps = new AppClientOrchestrator(); + + Meteor.call('apps/is-enabled', (error, isEnabled) => { + window.Apps.load(isEnabled); + }); }); +const appsRouteAction = function _theRealAction(whichCenter) { + Meteor.defer(() => window.Apps.getLoadingPromise().then((isEnabled) => { + if (isEnabled) { + BlazeLayout.render('main', { center: whichCenter }); + } else { + FlowRouter.go('app-what-is-it'); + } + })); +}; + // Bah, this has to be done *before* `Meteor.startup` FlowRouter.route('/admin/apps', { name: 'apps', action() { - BlazeLayout.render('main', { center: 'apps' }); + appsRouteAction('apps'); } }); FlowRouter.route('/admin/app/install', { name: 'app-install', action() { - BlazeLayout.render('main', { center: 'appInstall' }); + appsRouteAction('appInstall'); } }); FlowRouter.route('/admin/apps/:appId', { name: 'app-manage', action() { - BlazeLayout.render('main', { center: 'appManage' }); + appsRouteAction('appManage'); } }); FlowRouter.route('/admin/apps/:appId/logs', { name: 'app-logs', action() { - BlazeLayout.render('main', { center: 'appLogs' }); + appsRouteAction('appLogs'); + } +}); + +FlowRouter.route('/admin/app/what-is-it', { + name: 'app-what-is-it', + action() { + Meteor.defer(() => window.Apps.getLoadingPromise().then((isEnabled) => { + if (isEnabled) { + FlowRouter.go('apps'); + } else { + BlazeLayout.render('main', { center: 'appWhatIsIt' }); + } + })); } }); diff --git a/packages/rocketchat-apps/package.js b/packages/rocketchat-apps/package.js index d1f8b03fc37b..5a4deeffffe2 100644 --- a/packages/rocketchat-apps/package.js +++ b/packages/rocketchat-apps/package.js @@ -73,7 +73,9 @@ Package.onUse(function(api) { 'client/admin/appInstall.html', 'client/admin/appInstall.js', 'client/admin/appLogs.html', - 'client/admin/appLogs.js' + 'client/admin/appLogs.js', + 'client/admin/appWhatIsIt.html', + 'client/admin/appWhatIsIt.js' ], 'client'); api.addFiles('assets/stylesheets/apps.css', 'client'); @@ -87,6 +89,6 @@ Package.onUse(function(api) { Npm.depends({ 'busboy': '0.2.13', - '@rocket.chat/apps-engine': '0.5.11', - '@rocket.chat/apps-ts-definition': '0.9.8' + '@rocket.chat/apps-engine': '0.6.10', + '@rocket.chat/apps-ts-definition': '0.9.13' }); diff --git a/packages/rocketchat-apps/server/bridges/commands.js b/packages/rocketchat-apps/server/bridges/commands.js index adec9f715ca5..cdfffd0609da 100644 --- a/packages/rocketchat-apps/server/bridges/commands.js +++ b/packages/rocketchat-apps/server/bridges/commands.js @@ -73,13 +73,16 @@ export class AppCommandsBridge { item.params = command.paramsExample ? command.paramsExample : item.params; item.description = command.i18nDescription ? command.i18nDescription : item.params; item.callback = this._appCommandExecutor.bind(this); + item.providesPreview = command.providesPreview; + item.previewer = command.previewer ? this._appCommandPreviewer.bind(this) : item.previewer; + item.previewCallback = command.executePreviewItem ? this._appCommandPreviewExecutor.bind(this) : item.previewCallback; RocketChat.slashCommands.commands[cmd] = item; this.orch.getNotifier().commandUpdated(cmd); } registerCommand(command, appId) { - console.log(`The App ${ appId } is registering the command: "${ command.command }"`); + console.log(`The App ${ appId } is registerin the command: "${ command.command }"`); this._verifyCommand(command); @@ -87,7 +90,10 @@ export class AppCommandsBridge { command: command.command.toLowerCase(), params: command.paramsExample, description: command.i18nDescription, - callback: this._appCommandExecutor.bind(this) + callback: this._appCommandExecutor.bind(this), + providesPreview: command.providesPreview, + previewer: !command.previewer ? undefined : this._appCommandPreviewer.bind(this), + previewCallback: !command.executePreviewItem ? undefined : this._appCommandPreviewExecutor.bind(this) }; RocketChat.slashCommands.commands[command.command.toLowerCase()] = item; @@ -117,7 +123,7 @@ export class AppCommandsBridge { throw new Error('Invalid Slash Command parameter provided, it must be a valid ISlashCommand object.'); } - if (command.paramsExample && typeof command.paramsExample !== 'string') { + if (command.i18nParamsExample && typeof command.i18nParamsExample !== 'string') { throw new Error('Invalid Slash Command parameter provided, it must be a valid ISlashCommand object.'); } @@ -125,6 +131,10 @@ export class AppCommandsBridge { throw new Error('Invalid Slash Command parameter provided, it must be a valid ISlashCommand object.'); } + if (typeof command.providesPreview !== 'boolean') { + throw new Error('Invalid Slash Command parameter provided, it must be a valid ISlashCommand object.'); + } + if (typeof command.executor !== 'function') { throw new Error('Invalid Slash Command parameter provided, it must be a valid ISlashCommand object.'); } @@ -136,6 +146,24 @@ export class AppCommandsBridge { const params = parameters.length === 0 || parameters === ' ' ? [] : parameters.split(' '); const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params)); - this.orch.getManager().getCommandManager().executeCommand(command, context); + Promise.await(this.orch.getManager().getCommandManager().executeCommand(command, context)); + } + + _appCommandPreviewer(command, parameters, message) { + const user = this.orch.getConverters().get('users').convertById(Meteor.userId()); + const room = this.orch.getConverters().get('rooms').convertById(message.rid); + const params = parameters.length === 0 || parameters === ' ' ? [] : parameters.split(' '); + + const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params)); + return Promise.await(this.orch.getManager().getCommandManager().getPreviews(command, context)); + } + + _appCommandPreviewExecutor(command, parameters, message, preview) { + const user = this.orch.getConverters().get('users').convertById(Meteor.userId()); + const room = this.orch.getConverters().get('rooms').convertById(message.rid); + const params = parameters.length === 0 || parameters === ' ' ? [] : parameters.split(' '); + + const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params)); + Promise.await(this.orch.getManager().getCommandManager().executePreview(command, preview, context)); } } diff --git a/packages/rocketchat-apps/server/bridges/rooms.js b/packages/rocketchat-apps/server/bridges/rooms.js index 28782d432940..d0bece2d7e8e 100644 --- a/packages/rocketchat-apps/server/bridges/rooms.js +++ b/packages/rocketchat-apps/server/bridges/rooms.js @@ -43,6 +43,30 @@ export class AppRoomBridge { return this.orch.getConverters().get('rooms').convertByName(roomName); } + async getCreatorById(roomId, appId) { + console.log(`The App ${ appId } is getting the room's creator by id: "${ roomId }"`); + + const room = RocketChat.models.Rooms.findOneById(roomId); + + if (!room || !room.u || !room.u._id) { + return undefined; + } + + return this.orch.getConverters().get('users').convertById(room.u._id); + } + + async getCreatorByName(roomName, appId) { + console.log(`The App ${ appId } is getting the room's creator by name: "${ roomName }"`); + + const room = RocketChat.models.Rooms.findOneByName(roomName); + + if (!room || !room.u || !room.u._id) { + return undefined; + } + + return this.orch.getConverters().get('users').convertById(room.u._id); + } + async update(room, appId) { console.log(`The App ${ appId } is updating a room.`); diff --git a/packages/rocketchat-apps/server/communication/methods.js b/packages/rocketchat-apps/server/communication/methods.js index 5b21809e6ba6..7f3e65a02045 100644 --- a/packages/rocketchat-apps/server/communication/methods.js +++ b/packages/rocketchat-apps/server/communication/methods.js @@ -1,16 +1,40 @@ +const waitToLoad = function(orch) { + return new Promise((resolve) => { + let id = setInterval(() => { + if (orch.isEnabled() && orch.isLoaded()) { + clearInterval(id); + id = -1; + resolve(); + } + }, 100); + }); +}; + +const waitToUnload = function(orch) { + return new Promise((resolve) => { + let id = setInterval(() => { + if (!orch.isEnabled() && !orch.isLoaded()) { + clearInterval(id); + id = -1; + resolve(); + } + }, 100); + }); +}; + export class AppMethods { - constructor(manager) { - this._manager = manager; + constructor(orch) { + this._orch = orch; this._addMethods(); } isEnabled() { - return typeof this._manager !== 'undefined'; + return typeof this._orch !== 'undefined' && this._orch.isEnabled(); } isLoaded() { - return typeof this._manager !== 'undefined' && this.manager.areAppsLoaded(); + return typeof this._orch !== 'undefined' && this._orch.isEnabled() && this._orch.isLoaded(); } _addMethods() { @@ -23,6 +47,42 @@ export class AppMethods { 'apps/is-loaded'() { return instance.isLoaded(); + }, + + 'apps/go-enable'() { + if (!Meteor.userId()) { + throw new Meteor.Error('error-invalid-user', 'Invalid user', { + method: 'apps/go-enable' + }); + } + + if (!RocketChat.authz.hasPermission(Meteor.userId(), 'manage-apps')) { + throw new Meteor.Error('error-action-not-allowed', 'Not allowed', { + method: 'apps/go-enable' + }); + } + + RocketChat.settings.set('Apps_Framework_enabled', true); + + Promise.await(waitToLoad(instance._orch)); + }, + + 'apps/go-disable'() { + if (!Meteor.userId()) { + throw new Meteor.Error('error-invalid-user', 'Invalid user', { + method: 'apps/go-enable' + }); + } + + if (!RocketChat.authz.hasPermission(Meteor.userId(), 'manage-apps')) { + throw new Meteor.Error('error-action-not-allowed', 'Not allowed', { + method: 'apps/go-enable' + }); + } + + RocketChat.settings.set('Apps_Framework_enabled', false); + + Promise.await(waitToUnload(instance._orch)); } }); } diff --git a/packages/rocketchat-apps/server/communication/rest.js b/packages/rocketchat-apps/server/communication/rest.js index d5414b1676c2..2c4427447aa7 100644 --- a/packages/rocketchat-apps/server/communication/rest.js +++ b/packages/rocketchat-apps/server/communication/rest.js @@ -73,7 +73,13 @@ export class AppsRestApi { const aff = Promise.await(manager.add(buff.toString('base64'), false)); const info = aff.getAppInfo(); - info.status = aff.getApp().getStatus(); + + // If there are compiler errors, there won't be an App to get the status of + if (aff.getApp()) { + info.status = aff.getApp().getStatus(); + } else { + info.status = 'compiler_error'; + } return RocketChat.API.v1.success({ app: info, @@ -134,7 +140,13 @@ export class AppsRestApi { const aff = Promise.await(manager.update(buff.toString('base64'))); const info = aff.getAppInfo(); - info.status = aff.getApp().getStatus(); + + // Should the updated version have compiler errors, no App will be returned + if (aff.getApp()) { + info.status = aff.getApp().getStatus(); + } else { + info.status = 'compiler_error'; + } return RocketChat.API.v1.success({ app: info, diff --git a/packages/rocketchat-apps/server/converters/messages.js b/packages/rocketchat-apps/server/converters/messages.js index b762a16f9f19..d62fbccb377e 100644 --- a/packages/rocketchat-apps/server/converters/messages.js +++ b/packages/rocketchat-apps/server/converters/messages.js @@ -129,7 +129,9 @@ export class AppMessagesConverter { image_url: attachment.imageUrl, audio_url: attachment.audioUrl, video_url: attachment.videoUrl, - fields: attachment.fields + fields: attachment.fields, + type: attachment.type, + description: attachment.description }; }).map((a) => { Object.keys(a).forEach((k) => { @@ -178,7 +180,9 @@ export class AppMessagesConverter { imageUrl: attachment.image_url, audioUrl: attachment.audio_url, videoUrl: attachment.video_url, - fields: attachment.fields + fields: attachment.fields, + type: attachment.type, + description: attachment.description }; }); } diff --git a/packages/rocketchat-apps/server/orchestrator.js b/packages/rocketchat-apps/server/orchestrator.js index af1d09e676b1..f885b9c25925 100644 --- a/packages/rocketchat-apps/server/orchestrator.js +++ b/packages/rocketchat-apps/server/orchestrator.js @@ -28,7 +28,7 @@ class AppServerOrchestrator { this._manager = new AppManager(this._storage, this._logStorage, this._bridges); this._communicators = new Map(); - this._communicators.set('methods', new AppMethods(this._manager)); + this._communicators.set('methods', new AppMethods(this)); this._communicators.set('notifier', new AppServerNotifier(this)); this._communicators.set('restapi', new AppsRestApi(this, this._manager)); } @@ -66,25 +66,60 @@ class AppServerOrchestrator { } isEnabled() { - return true; + return RocketChat.settings.get('Apps_Framework_enabled'); } isLoaded() { return this.getManager().areAppsLoaded(); } + + load() { + // Don't try to load it again if it has + // already been loaded + if (this.isLoaded()) { + return; + } + + this._manager.load() + .then((affs) => console.log(`Loaded the Apps Framework and loaded a total of ${ affs.length } Apps!`)) + .catch((err) => console.warn('Failed to load the Apps Framework and Apps!', err)); + } + + unload() { + // Don't try to unload it if it's already been + // unlaoded or wasn't unloaded to start with + if (!this.isLoaded()) { + return; + } + + this._manager.unload() + .then(() => console.log('Unloaded the Apps Framework.')) + .catch((err) => console.warn('Failed to unload the Apps Framework!', err)); + } } -Meteor.startup(function _appServerOrchestrator() { - // Ensure that everything is setup - if (process.env[AppManager.ENV_VAR_NAME_FOR_ENABLING] !== 'true' && process.env[AppManager.SUPER_FUN_ENV_ENABLEMENT_NAME] !== 'true') { - global.Apps = new AppMethods(); +RocketChat.settings.add('Apps_Framework_enabled', false, { + type: 'boolean', + hidden: true +}); + +RocketChat.settings.get('Apps_Framework_enabled', (key, isEnabled) => { + // In case this gets called before `Meteor.startup` + if (!global.Apps) { return; } - console.log('Orchestrating the app piece...'); + if (isEnabled) { + global.Apps.load(); + } else { + global.Apps.unload(); + } +}); + +Meteor.startup(function _appServerOrchestrator() { global.Apps = new AppServerOrchestrator(); - global.Apps.getManager().load() - .then((affs) => console.log(`...done loading ${ affs.length }! ;)`)) - .catch((err) => console.warn('...failed!', err)); + if (global.Apps.isEnabled()) { + global.Apps.load(); + } }); diff --git a/packages/rocketchat-apps/server/storage/logs-storage.js b/packages/rocketchat-apps/server/storage/logs-storage.js index a184526883bc..d499b930cfcd 100644 --- a/packages/rocketchat-apps/server/storage/logs-storage.js +++ b/packages/rocketchat-apps/server/storage/logs-storage.js @@ -48,4 +48,16 @@ export class AppRealLogsStorage extends AppLogStorage { resolve(docs); }); } + + removeEntriesFor(appId) { + return new Promise((resolve, reject) => { + try { + this.db.remove({ appId }); + } catch (e) { + return reject(e); + } + + resolve(); + }); + } } diff --git a/packages/rocketchat-assets/server/assets.js b/packages/rocketchat-assets/server/assets.js index 69bce7af9e03..297efb79ea47 100644 --- a/packages/rocketchat-assets/server/assets.js +++ b/packages/rocketchat-assets/server/assets.js @@ -22,6 +22,10 @@ const assets = { extensions: ['svg', 'png', 'jpg', 'jpeg'], width: undefined, height: undefined + }, + wizard: { + step: 3, + order: 2 } }, favicon_ico: { @@ -296,7 +300,8 @@ function addAssetToSetting(key, value) { fileConstraints: value.constraints, i18nLabel: value.label, asset: key, - public: true + public: true, + wizard: value.wizard }); } diff --git a/packages/rocketchat-authorization/server/startup.js b/packages/rocketchat-authorization/server/startup.js index 142de2284a1c..85c2d02a3745 100644 --- a/packages/rocketchat-authorization/server/startup.js +++ b/packages/rocketchat-authorization/server/startup.js @@ -67,7 +67,8 @@ Meteor.startup(function() { { _id: 'view-statistics', roles : ['admin'] }, { _id: 'view-user-administration', roles : ['admin'] }, { _id: 'preview-c-room', roles : ['admin', 'user', 'anonymous'] }, - { _id: 'view-outside-room', roles : ['admin', 'owner', 'moderator', 'user'] } + { _id: 'view-outside-room', roles : ['admin', 'owner', 'moderator', 'user'] }, + { _id: 'view-broadcast-member-list', roles : ['admin', 'owner', 'moderator'] } ]; for (const permission of permissions) { diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.html b/packages/rocketchat-channel-settings/client/views/channelSettings.html index 4cd38d31a1ae..5ac205f7eda4 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.html +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.html @@ -65,7 +65,7 @@ {{#with settings.t}}
-
+
{{_ "Public"}}{{equal default value '*'}}
{{_ "Everyone_can_access_this_channel"}} @@ -79,7 +79,7 @@
-
+
{{_ "Private"}}
{{_ "Just_invited_people_can_access_this_channel"}} @@ -93,7 +93,7 @@ {{#with settings.ro}}