From 6d6d8be98050496bcd0a071dee545cbd49a9ef63 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Sun, 27 May 2018 22:32:01 -0300 Subject: [PATCH] Release 0.65.0 (#10893) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * changed saml integration to store data on mongo instead of memory * Update saml_server.js * [FIX] Fix create channel, when created a readonly channel (#10665) [FIX] Channel owner was being set as muted when creating a read-only channel * Correct links to Rocket.Chat documentation (#10674) Correct links in README file * Fix flickering on message-box emoji icon (#10678) [FIX] Message box emoji icon was flickering when typing a text * add `npm run postinstall` into build script (#10524) Add `npm run postinstall` into example build script * [FIX] Improve desktop notification formatting (#10445) * Improved notification formatting * Fixed lint issues * Changed body format * Fixed the problem of missing descriptions on message attachments (#10705) * [BREAK] Improvements to notifications logic (#10686) [NEW] Improvements to notifications logic * LingoHub Update :rocket: (#10691) Manual push by LingoHub User: Rodrigo Nascimento. Project: Rocket.Chat Made with :heart: by https://lingohub.com * [NEW] Setup Wizard (#10523) * welcome * . * stylelint * new ilustration * new layout * . * implements dicts * added all setup wizard settings to wizard * fix some setup wizard css * fix setup wizard js linter errors * remove old setup wizard templaates * setup wizard has just one main tag now * setup wizard registration fields filter is more readable * add register server page to setup wizard * fix setup wizard progress bar on RTL * setup wizard is registering users * Add setup wizard tests, routes and fix batch * fix setup wizard tests * add api test back * comment rocketchat:google-natural-language package and remove logs * add some translation keys for setup wizard * remove old setup wizard template * fix sort code on setup wizard * fix getWizardSetting method * new migration for setupwizard * setup wizard setting migration * fix setupwizard migration * Update versions * fix some setup wizard code logic * fix setup wizard registerServer setting * rever package-lock.json * rever google-natural-language .npm folder * rever meteor packages file and add setup wizard * remove some default values from setup wizard settings * add advocacy option on setup wizard industry setting * change key name to setting to make the filter more readable on setup wizard * change key name to setting to make the filter more readable on setup wizard * add findWizardSettings on models Settings and handle errors of getWizardSettings method * change setting to key to make the filter more readable on setup wizard * fix setup wizard settings filter map * remove serverHasAdminUser method on setup wizard * fix setup wizard tests * fix setup wizard final step workspace link * fix setup wizard tests * [FIX] Improve wordpress OAuth settings (#10724) [NEW] Add more options for Wordpress OAuth configuration * [NEW] Add /api/v1/channels.roles & /api/v1/groups.roles (#10607) [NEW] Add REST endpoints `channels.roles` & `groups.roles` * Changes source of text for announcement modal content (#10733) [FIX] Regression: Empty content on announcement modal * [FIX] Send a message when muted returns inconsistent result in chat.sendMessage (#10720) * Change the message that returns, when a muted or blocked user tries to send a message using that endpoint * Remove origin provide to sendMessage method, simply throwing an error when the user is muted or blocked * More improvements on send notifications logic (#10736) * Denormalize the User’s Highlights * Find subscriptions for each type of notification * Change email preference values * General improvements * Use just one query to get all subscriptions to notify * Get hightlights from subscriptions on method notifyUsersOnMessage * Keep compatibility of emailNotifications preference in subscription save * Prevent group mentions on large rooms * Fix notifications for direct messages (#10760) * Add setting and expose prometheus on port 9100 (#10766) * Add setting and expose prometheus on port 9100 * Prometheus: Add number of connected users * Send statistics to prometheus * Prometheus: Add methods, subscriptions and callbacks data * Prometheus: Add metrics of REST API calls * Prometheus: Record subscriptions time * Add metrics to notifications * Wizard improvements (#10776) * Change wizard state from boolean to `pending`, `in_progress` or `completed` * Add migration to change the wizard setting to new values and fix the old migration * Make the wizard responsive for small screens * Do not publish wizard settings to the client * Do not show wizard for unlogged users after admin was created * Add badge back to push notifications (#10779) * Better metric for notifications (#10786) * Improvement to push notifications on direct messages (#10788) * Prometheus: Improve metric names (#10789) * [FIX] Not escaping special chars on mentions (#10793) * Regression: Fix wrong wizard field name (#10804) * Prometheus: Fix notification metric (#10803) * Regression: Autorun of wizard was not destroyed after completion (#10802) * Prometheus: Add metric to track hooks time (#10798) * Prevent setup wizard redirects (#10811) * Prevent setup wizard redirects * Fix setup wizard layout * Prometheus: Track user agent * Stop caching private settings (#10625) * [NEW] Add REST API endpoints `channels.setCustomFields` and `groups.setCustomFields` (#9733) * Add channels.setCustomFields and groups.setCustomFields Signed-off-by: Eugene Bolshakov * Delete unused `user` parameter Signed-off-by: Eugene Bolshakov * Add tests for channels.setCustomFields and groups.setCustomFields Signed-off-by: Eugene Bolshakov * Fix lint Signed-off-by: Eugene Bolshakov * Fix lint Signed-off-by: Eugene Bolshakov * Propogate setCustomFields to Subscriptions Signed-off-by: Eugene Bolshakov * Fix semicolon Signed-off-by: Eugene Bolshakov * [NEW] Add REST API endpoints `channels.counters`, `groups.counters and `im.counters` (#9679) * Add countVisibleByRoomIdBetweenTimestampsInclusive Signed-off-by: Eugene Bolshakov * Add channels.counters, groups.counters, im.counters Signed-off-by: Eugene Bolshakov * Fix spaces Signed-off-by: Eugene Bolshakov * Fixes Signed-off-by: Eugene Bolshakov * Small fix Signed-off-by: Eugene Bolshakov * Small fix #2 Signed-off-by: Eugene Bolshakov * Small fix #3 Signed-off-by: Eugene Bolshakov * Add channels.couters and groups.couters tests Signed-off-by: Eugene Bolshakov * Fix tests, last message and unread message times Signed-off-by: Eugene Bolshakov * Fix last message and unread message times for IM Signed-off-by: Eugene Bolshakov * Add im.counters test Signed-off-by: Eugene Bolshakov * Fix for msgs=0 Signed-off-by: Eugene Bolshakov * [FIX] UI was not disabling the actions when users has had no permissions to create channels or add users to rooms (#10564) * hide plus icon when user doesn't have both permission for create-c and create-p * add helper to checkout two permissions set initial value for the room type * hide the plus icon in directory if user doesn't have both create-c and creat-p permissions * get permissions for create channels and groups * check if user can add channel hide and groups, hide button based upon correct state * prevent add user button from being hidden when user has permission add user to joined room * removed the if statement and use short hand if else syntax * better code for disabling checkbox in create room feature if user doesn't have permission * add missing simicolon * put canShowAddUsersButton into seperate function call function in events and helpers * move the canShowAddUsersButton function to define before it's called * fix bug that prevents the viewing of the keyboard shortcuts button in groups and direct messages * fix permissions * Add verification to authorize get images with X-user-id and X-auth-token (#10741) * [FIX] Fix rest /me endpoint (#10662) [NEW] REST API endpoint `/me` now returns all the settings, including the default values * Add REST endpoint to mark messages as unread (#10778) [NEW] Add REST endpoint `subscriptions.unread` to mark messages as unread * [NEW] REST API endpoint `settings` now allow set colors and trigger actions (#10488) * edited settings-api to execute button event * FIx identation and defer await * removing the defer and waiting for the method to execute * Add Rest endpoint to get username suggestion (#10702) * major dependencies update (#10661) * Remove old translations (#10448) * [FIX] disable/enable System Messages (#10704) [FIX] Missing option to disable/enable System Messages * [NEW] View pinned message's attachment (#10214) * displays pinned file's attachments * handles pin for replies and quotes * fix review * [FIX] Enabling "Collapse Embedded Media by Default" hides replies, quotes (#10427) [FIX] Enabling `Collapse Embedded Media by Default` was hiding replies and quotes * [NEW] lazy load image attachments (#10608) [NEW] Lazy load image attachments * Develop sync (#10815) * add redhat dockerfile to master (#10408) * add redhat dockerfile to master * Add redhat dockerfile to set-version helper script * Release 0.63.2 (#10476) * [FIX] Even TypeErrors with SAML (#10475) * Bump version to 0.63.2 * Added one2mail.info to default blocked domain list (#10218) * [FIX] The 'channel.messages' REST API Endpoint error (#10485) * Bump version to 0.63.3 * Add the history of v0.63.3 * Bump version to 0.64.0-rc.0 * Bump version to 0.64.0-rc.1 * Bump version to 0.64.0-rc.2 * Bump version to 0.64.0-rc.3 * Bump version to 0.64.0-rc.4 * Bump version to 0.64.0 * Bump version to 0.64.1 * Bump version to 0.65.0-develop * [NEW] Return the result of the `/me` endpoint within the result of the `/login` endpoint (#10677) * Add response of the /me endpoint to /login endpoint * change underscore use to ES6 object destructuring * The Livechat settings of the 'color' types were not appearing correctly in the administrative area. (#10612) * [NEW] Enable/disable Livechat registration form fields (#10584) [NEW] Options to enable/disable each Livechat registration form field * When a manager tried to send a message in a live room, an error was being displayed because there is no subscription for the manager. (#10663) [FIX] Livechat managers were not being able to send messages in some cases * [NEW] Implement a local password policy (#9857) * Implement a local password policy * Improve ValidatePasswordPolicy and create tests * Validate user’s password on method saveUserProfile * Fix typo PasswordPoliceClass * Apps: Command Previews, Message and Room Removal Events (#10822) * Add message and room removal events for Apps, fix a few other issues * First very rough draft of the slash command preview * Add the command preview rest api and make the previews selectable via the keyboard * Add loading i18n * Remove duplicated toLowerCase() * Bump version to 0.65.0-rc.0 * Update room.html (#10715) Fix working of cancel button in progress bar, while uploading file. * [NEW] Add view-broadcast-member-list permission (#10753) [NEW] Add permission `view-broadcast-member-list` * [FIX] Livechat sidebar using "Unread on Top" user preference (#10734) [FIX] User's preference `Unread on Top` wasn't working for LiveChat rooms * Fix REST /me regression (#10833) Fix: Regression in REST API endpoint `/me` * [FIX] Broadcast/ Read only issues (#10835) [FIX] Broadcast channels were showing reply button for deleted messages and generating wrong reply links some times * Create temp folder if it doesn't exist (#10837) * Fix: Regression on users avatar in admin pages (#10836) * fix avatar admin lists * Update messagePopup.js * Bump version to 0.65.0-rc.1 * Fix: Clarify the wording of the release issue template (#10520) * Clarify the wording of the release issue template * Update release.md * Regression: Make settings `Site_Name` and `Language` public again (#10848) * Fix layout badge cutting on unread messages for long names (#10846) [FIX] Layout badge cutting on unread messages for long names * [FIX] Missing pagination fields in the response of REST /directory endpoint (#10840) * Add missing pagination fields in the response of REST /directory endpoint * Add support to choose sort field in REST directory * Allow click on command previews and add setting to control apps enablement (#10853) * Regression: Fix email notification preference not showing correct selected value (#10847) * Fix email notification preference not showing correct selected value Closes #10844 * Save email notification preferences correctly Closes #10787 * Create room with user notification preferences * Add back the uploaded file message on push notifications * Bump version to 0.65.0-rc.2 * [FIX] The first users was not set as admin some times (#10878) * Fixed a typo on error message for push token API (#10857) Fix: typo on error message for push token API * Adds flex-box to preview commands (#10883) * Fix: Regression Lazyload fix shuffle avatars (#10887) * fix avatar admin lists * test to fix shuffle avatars * LingoHub Update :rocket: (#10886) Manual push by LingoHub User: Rodrigo Nascimento. Project: Rocket.Chat Made with :heart: by https://lingohub.com * [FIX] Manage apps layout (#10882) Fix: Manage apps layout was a bit confuse * Fixed slackbridge (#10875) * Bump version to 0.65.0-rc.3 * Bump version to 0.65.0 --- .docker/Dockerfile | 2 +- .docker/Dockerfile.rhel | 2 +- .github/history.json | 1125 +++++++- .github/issue-templates/release.md | 32 +- .meteor/packages | 1 + .meteor/versions | 1 + .sandstorm/sandstorm-pkgdef.capnp | 4 +- .travis/snap.sh | 2 +- .vscode/launch.json | 10 +- HISTORY.md | 148 +- package-lock.json | 1516 +++++----- package.json | 46 +- packages/rocketchat-api/package.js | 1 + packages/rocketchat-api/server/api.js | 8 +- .../server/helpers/getUserInfo.js | 56 + packages/rocketchat-api/server/v1/channels.js | 76 + packages/rocketchat-api/server/v1/commands.js | 80 +- packages/rocketchat-api/server/v1/groups.js | 92 + packages/rocketchat-api/server/v1/im.js | 52 + packages/rocketchat-api/server/v1/misc.js | 41 +- packages/rocketchat-api/server/v1/push.js | 2 +- packages/rocketchat-api/server/v1/settings.js | 15 +- .../rocketchat-api/server/v1/subscriptions.js | 16 + packages/rocketchat-api/server/v1/users.js | 8 + .../assets/stylesheets/apps.css | 8 + .../client/admin/appInstall.js | 28 +- .../client/admin/appManage.html | 89 +- .../rocketchat-apps/client/admin/appManage.js | 11 +- .../client/admin/appWhatIsIt.html | 26 + .../client/admin/appWhatIsIt.js | 39 + .../rocketchat-apps/client/admin/apps.html | 26 +- packages/rocketchat-apps/client/admin/apps.js | 23 +- .../rocketchat-apps/client/orchestrator.js | 86 +- packages/rocketchat-apps/package.js | 8 +- .../server/bridges/commands.js | 36 +- .../rocketchat-apps/server/bridges/rooms.js | 24 + .../server/communication/methods.js | 68 +- .../server/communication/rest.js | 16 +- .../rocketchat-apps/server/orchestrator.js | 55 +- .../server/storage/logs-storage.js | 12 + .../server/startup.js | 3 +- .../client/views/channelSettings.html | 27 +- .../client/views/channelSettings.js | 27 + .../rocketchat-channel-settings/package.js | 1 + .../server/functions/saveRoomCustomFields.js | 18 + .../server/methods/saveRoomSettings.js | 7 +- .../server/lib/FileUpload.js | 12 +- packages/rocketchat-i18n/i18n/af.i18n.json | 7 + packages/rocketchat-i18n/i18n/ar.i18n.json | 7 + packages/rocketchat-i18n/i18n/az.i18n.json | 7 + packages/rocketchat-i18n/i18n/be-BY.i18n.json | 322 +++ packages/rocketchat-i18n/i18n/bg.i18n.json | 7 + packages/rocketchat-i18n/i18n/ca.i18n.json | 7 + packages/rocketchat-i18n/i18n/cs.i18n.json | 335 ++- packages/rocketchat-i18n/i18n/da.i18n.json | 7 + packages/rocketchat-i18n/i18n/de-AT.i18n.json | 13 +- packages/rocketchat-i18n/i18n/de.i18n.json | 17 +- packages/rocketchat-i18n/i18n/el.i18n.json | 7 + packages/rocketchat-i18n/i18n/en.i18n.json | 163 +- packages/rocketchat-i18n/i18n/eo.i18n.json | 7 + packages/rocketchat-i18n/i18n/es.i18n.json | 7 + packages/rocketchat-i18n/i18n/fa.i18n.json | 7 + packages/rocketchat-i18n/i18n/fi.i18n.json | 7 + packages/rocketchat-i18n/i18n/fr.i18n.json | 329 ++- packages/rocketchat-i18n/i18n/he.i18n.json | 6 + packages/rocketchat-i18n/i18n/hr.i18n.json | 7 + packages/rocketchat-i18n/i18n/hu.i18n.json | 7 + packages/rocketchat-i18n/i18n/id.i18n.json | 7 + packages/rocketchat-i18n/i18n/it.i18n.json | 7 + packages/rocketchat-i18n/i18n/ja.i18n.json | 7 + packages/rocketchat-i18n/i18n/km.i18n.json | 7 + packages/rocketchat-i18n/i18n/ko.i18n.json | 7 + packages/rocketchat-i18n/i18n/ku.i18n.json | 7 + packages/rocketchat-i18n/i18n/lo.i18n.json | 7 + packages/rocketchat-i18n/i18n/lt.i18n.json | 7 + packages/rocketchat-i18n/i18n/lv.i18n.json | 2489 ++++++++++------- packages/rocketchat-i18n/i18n/mn.i18n.json | 7 + packages/rocketchat-i18n/i18n/ms-MY.i18n.json | 7 + packages/rocketchat-i18n/i18n/nl.i18n.json | 7 + packages/rocketchat-i18n/i18n/no.i18n.json | 7 + packages/rocketchat-i18n/i18n/pl.i18n.json | 7 + packages/rocketchat-i18n/i18n/pt-BR.i18n.json | 11 +- packages/rocketchat-i18n/i18n/pt.i18n.json | 9 +- packages/rocketchat-i18n/i18n/ro.i18n.json | 7 + packages/rocketchat-i18n/i18n/ru.i18n.json | 339 ++- packages/rocketchat-i18n/i18n/sk-SK.i18n.json | 151 +- packages/rocketchat-i18n/i18n/sl-SI.i18n.json | 7 + packages/rocketchat-i18n/i18n/sq.i18n.json | 7 + packages/rocketchat-i18n/i18n/sr.i18n.json | 7 + packages/rocketchat-i18n/i18n/sv.i18n.json | 7 + packages/rocketchat-i18n/i18n/ta-IN.i18n.json | 7 + packages/rocketchat-i18n/i18n/th-TH.i18n.json | 7 + packages/rocketchat-i18n/i18n/tr.i18n.json | 7 + packages/rocketchat-i18n/i18n/ug.i18n.json | 6 + packages/rocketchat-i18n/i18n/uk.i18n.json | 7 + packages/rocketchat-i18n/i18n/vi-VN.i18n.json | 305 +- packages/rocketchat-i18n/i18n/zh-HK.i18n.json | 7 + packages/rocketchat-i18n/i18n/zh-TW.i18n.json | 7 + packages/rocketchat-i18n/i18n/zh.i18n.json | 7 + packages/rocketchat-lazy-load/client/index.js | 59 + .../client/lazyloadImage.html | 4 + .../client/lazyloadImage.js | 20 + packages/rocketchat-lazy-load/package.js | 16 + .../rocketchat-lib/client/MessageAction.js | 37 +- .../rocketchat-lib/client/defaultTabBars.js | 4 +- packages/rocketchat-lib/lib/RoomTypeConfig.js | 3 +- .../lib/getDefaultSubscriptionPref.js | 31 + .../rocketchat-lib/lib/roomTypes/direct.js | 1 + .../rocketchat-lib/lib/roomTypes/private.js | 1 + .../rocketchat-lib/lib/roomTypes/public.js | 1 + packages/rocketchat-lib/lib/slashCommand.js | 60 +- packages/rocketchat-lib/package.js | 4 + packages/rocketchat-lib/rocketchat.info | 2 +- .../server/functions/deleteMessage.js | 16 +- .../server/functions/notifications/index.js | 4 +- .../server/functions/saveUser.js | 2 +- .../server/lib/PasswordPolicyClass.js | 91 + .../server/lib/passwordPolicy.js | 13 + .../server/lib/sendNotificationsOnMessage.js | 2 +- .../methods/executeSlashCommandPreview.js | 30 + .../server/methods/getSlashCommandPreviews.js | 24 + .../rocketchat-lib/server/models/Messages.js | 15 + .../rocketchat-lib/server/models/Rooms.js | 12 + .../server/models/Subscriptions.js | 46 +- .../rocketchat-lib/server/startup/settings.js | 53 + packages/rocketchat-lib/tests/server.tests.js | 206 ++ .../.app/client/lib/_livechat.js | 14 + .../.app/client/lib/commands.js | 2 +- .../.app/client/views/livechatWindow.js | 10 +- .../.app/client/views/register.html | 9 +- .../.app/client/views/register.js | 43 +- .../.app/i18n/be-BY.i18n.json | 47 + .../.app/i18n/lv.i18n.json | 18 +- .../.app/i18n/pt-BR.i18n.json | 2 +- .../rocketchat-livechat/.app/package.json | 2 +- .../client/views/app/livechatAppearance.html | 35 + .../client/views/app/livechatAppearance.js | 59 +- .../client/views/sideNav/livechat.js | 4 +- packages/rocketchat-livechat/config.js | 32 +- .../server/lib/Livechat.js | 5 +- .../server/methods/getInitialData.js | 6 +- .../server/methods/saveAppearance.js | 5 +- .../server/publications/livechatAppearance.js | 5 +- .../client/messageAttachment.html | 10 +- .../client/messageAttachment.js | 31 +- .../rocketchat-message-attachments/package.js | 3 +- .../client/actionButton.js | 4 +- .../server/pinMessage.js | 65 +- .../client/actionButton.js | 4 +- .../methods/saveNotificationSettings.js | 6 - .../server/slackbridge.js | 37 +- .../components/sidebar/sidebar-item.css | 4 + .../client/imports/components/userInfo.css | 8 +- .../client/imports/general/base_old.css | 14 +- .../client/accountPreferences.html | 2 +- .../client/avatar/avatar.html | 6 +- .../client/avatar/avatar.js | 4 +- packages/rocketchat-ui-account/package.js | 3 +- packages/rocketchat-ui-admin/client/admin.js | 3 +- .../rocketchat-ui-admin/client/adminFlex.js | 3 +- .../client/flexTabBar.html | 2 +- .../client/flexTabBar.js | 81 +- .../rocketchat-ui-message/client/message.js | 2 +- .../client/messageBox.html | 2 + .../client/popup/messagePopup.js | 5 + .../messagePopupSlashCommandPreview.html | 51 + .../popup/messagePopupSlashCommandPreview.js | 316 +++ packages/rocketchat-ui-message/package.js | 2 + .../rocketchat-ui-sidenav/client/sideNav.js | 5 +- .../client/sidebarItem.html | 2 +- packages/rocketchat-ui-sidenav/package.js | 3 +- .../rocketchat-ui/client/lib/chatMessages.js | 20 +- .../client/views/app/createChannel.html | 6 +- .../client/views/app/createChannel.js | 8 +- .../client/views/app/directory.html | 4 +- .../client/views/app/directory.js | 7 +- .../rocketchat-ui/client/views/app/room.html | 2 +- .../rocketchat-ui/client/views/app/room.js | 10 + packages/rocketchat-ui/package.js | 3 +- server/methods/browseChannels.js | 52 +- server/methods/createDirectMessage.js | 10 +- server/methods/eraseRoom.js | 15 +- server/methods/getUsersOfRoom.js | 4 + server/methods/registerUser.js | 2 + server/methods/requestDataDownload.js | 4 + server/methods/saveUserProfile.js | 2 + server/methods/setUserPassword.js | 2 + server/publications/room.js | 1 + server/startup/initialData.js | 20 +- server/startup/migrations/v120.js | 41 + server/startup/migrations/v121.js | 56 + tests/end-to-end/api/00-miscellaneous.js | 75 +- tests/end-to-end/api/01-users.js | 50 + tests/end-to-end/api/02-channels.js | 204 +- tests/end-to-end/api/03-groups.js | 205 +- tests/end-to-end/api/04-direct-message.js | 21 + tests/end-to-end/api/10-subscriptions.js | 70 + .../end-to-end/ui/04-main-elements-render.js | 33 + tests/pageobjects/flex-tab.page.js | 8 +- 199 files changed, 8944 insertions(+), 2471 deletions(-) create mode 100644 packages/rocketchat-api/server/helpers/getUserInfo.js create mode 100644 packages/rocketchat-apps/client/admin/appWhatIsIt.html create mode 100644 packages/rocketchat-apps/client/admin/appWhatIsIt.js create mode 100644 packages/rocketchat-channel-settings/server/functions/saveRoomCustomFields.js create mode 100644 packages/rocketchat-i18n/i18n/be-BY.i18n.json create mode 100644 packages/rocketchat-lazy-load/client/index.js create mode 100644 packages/rocketchat-lazy-load/client/lazyloadImage.html create mode 100644 packages/rocketchat-lazy-load/client/lazyloadImage.js create mode 100644 packages/rocketchat-lazy-load/package.js create mode 100644 packages/rocketchat-lib/lib/getDefaultSubscriptionPref.js create mode 100644 packages/rocketchat-lib/server/lib/PasswordPolicyClass.js create mode 100644 packages/rocketchat-lib/server/lib/passwordPolicy.js create mode 100644 packages/rocketchat-lib/server/methods/executeSlashCommandPreview.js create mode 100644 packages/rocketchat-lib/server/methods/getSlashCommandPreviews.js create mode 100644 packages/rocketchat-lib/tests/server.tests.js create mode 100644 packages/rocketchat-livechat/.app/i18n/be-BY.i18n.json create mode 100644 packages/rocketchat-ui-message/client/popup/messagePopupSlashCommandPreview.html create mode 100644 packages/rocketchat-ui-message/client/popup/messagePopupSlashCommandPreview.js create mode 100644 server/startup/migrations/v120.js create mode 100644 server/startup/migrations/v121.js diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 5e5f60c8458..6f23d27c3e2 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,6 +1,6 @@ FROM rocketchat/base:8 -ENV RC_VERSION 0.64.2 +ENV RC_VERSION 0.65.0 MAINTAINER buildmaster@rocket.chat diff --git a/.docker/Dockerfile.rhel b/.docker/Dockerfile.rhel index 4fa9f3db97b..44bd00d0034 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.2 +ENV RC_VERSION 0.65.0 MAINTAINER buildmaster@rocket.chat diff --git a/.github/history.json b/.github/history.json index 27fc85959ff..5bd5c9d2e76 100644 --- a/.github/history.json +++ b/.github/history.json @@ -13396,7 +13396,7 @@ "pr": "10445", "title": "[FIX] Improve desktop notification formatting", "userLogin": "Sameesunkaria", - "milestone": "0.65.0", + "milestone": "0.64.2", "contributors": [ "Sameesunkaria", "engelgabriel", @@ -13569,14 +13569,1133 @@ ], "0.64.2": [ { - "pr": "10811", - "title": "Prevent setup wizard redirects", + "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": [ + { + "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" + ] } ] } \ No newline at end of file diff --git a/.github/issue-templates/release.md b/.github/issue-templates/release.md index 6918d52ab62..f5691b238f1 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 0cbb854a201..f490350b035 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -190,3 +190,4 @@ rocketchat:version-check rocketchat:search chatpal:search +rocketchat:lazy-load diff --git a/.meteor/versions b/.meteor/versions index d51b6678e43..c71a541b67d 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 diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 2c3076404a8..6fcf7cb3837 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -19,9 +19,9 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Rocket.Chat"), - appVersion = 68, # Increment this for every release. + appVersion = 70, # Increment this for every release. - appMarketingVersion = (defaultText = "0.64.2"), + 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/.travis/snap.sh b/.travis/snap.sh index b4f52e64fc4..4e5f9ab88c6 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.2 + 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 2327e0f4b6e..05ddc20b979 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 4d90d583441..2f3d4c5772c 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,9 +1,130 @@ +# 0.65.0 +`2018-05-27 · 17 🎉 · 24 🐛 · 41 🔍 · 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 + +- 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)) +- 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 · 4 🎉 · 8 🐛 · 16 🔍 · 5 👩‍💻👨‍💻` +`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)) @@ -11,6 +132,14 @@ ### 🐛 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)) @@ -23,7 +152,22 @@
🔍 Minor changes -- Prevent setup wizard redirects ([#10811](https://github.com/RocketChat/Rocket.Chat/pull/10811)) +- 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)) diff --git a/package-lock.json b/package-lock.json index 7108c56f42d..2a971ee02b5 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 e67fb7efb36..cf1c432927b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Rocket.Chat", "description": "The Ultimate Open Source WebChat Platform", - "version": "0.64.2", + "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/rocketchat-api/package.js b/packages/rocketchat-api/package.js index 46d6194bdbd..b842bb304da 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'); diff --git a/packages/rocketchat-api/server/api.js b/packages/rocketchat-api/server/api.js index 6d56354ccd4..e32760255bd 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); } @@ -239,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: { @@ -288,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/helpers/getUserInfo.js b/packages/rocketchat-api/server/helpers/getUserInfo.js new file mode 100644 index 00000000000..0ab30a33ab4 --- /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 d1aa55331c2..55a870b526b 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()) { diff --git a/packages/rocketchat-api/server/v1/commands.js b/packages/rocketchat-api/server/v1/commands.js index 0c3e26d8fe4..21717555cd0 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 562d7bb4da6..73fa7d3cc11 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()) { diff --git a/packages/rocketchat-api/server/v1/im.js b/packages/rocketchat-api/server/v1/im.js index 6d590501670..c2ad7d8da8e 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 3937078483b..1dc196e6bc2 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 4194a01ac63..31180997c8b 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 cbac450b8ee..b4bd19ebf50 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 6b17cf66e82..e58fe4094a2 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 b871381b81b..2d8e9b9003a 100644 --- a/packages/rocketchat-api/server/v1/users.js +++ b/packages/rocketchat-api/server/v1/users.js @@ -416,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 b8800c68d5f..87757e032ab 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 0369f75254c..e1e03a37991 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 ce53365fa33..a1859be0791 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 b39022f97e1..108f426357a 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 00000000000..0f7e4c49786 --- /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 00000000000..425bab96c82 --- /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 560d3685c2a..65de5a5f983 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 ba009f1b222..181c4d061f5 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 f9ddfe4391d..5a7b331b86a 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 d1f8b03fc37..5a4deeffffe 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 adec9f715ca..cdfffd0609d 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 28782d43294..d0bece2d7e8 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 5b21809e6ba..7f3e65a0204 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 d5414b1676c..2c4427447aa 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/orchestrator.js b/packages/rocketchat-apps/server/orchestrator.js index af1d09e676b..f885b9c2592 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 a184526883b..d499b930cfc 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-authorization/server/startup.js b/packages/rocketchat-authorization/server/startup.js index 142de2284a1..85c2d02a374 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 4cd38d31a1a..5ac205f7eda 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}}