From f975b2cd0ae85cc4270b2ddb6335ff32bf6fbab2 Mon Sep 17 00:00:00 2001 From: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com> Date: Tue, 17 May 2022 18:38:44 -0300 Subject: [PATCH 01/50] Add support to map a LDAP group to multiple roles (#23849) Co-authored-by: Pierre Lehnen --- apps/meteor/ee/server/lib/ldap/Manager.ts | 16 ++++++++++------ .../packages/rocketchat-i18n/i18n/ar.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/ca.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/cs.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/da.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/de.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/en.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/es.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/fr.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/ja.i18n.json | 2 +- .../rocketchat-i18n/i18n/ka-GE.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/ko.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/nl.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/pl.i18n.json | 2 +- .../rocketchat-i18n/i18n/pt-BR.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/ru.i18n.json | 2 +- .../rocketchat-i18n/i18n/zh-TW.i18n.json | 2 +- .../packages/rocketchat-i18n/i18n/zh.i18n.json | 2 +- 18 files changed, 27 insertions(+), 23 deletions(-) diff --git a/apps/meteor/ee/server/lib/ldap/Manager.ts b/apps/meteor/ee/server/lib/ldap/Manager.ts index 12f9e18dd0d2..7edfcb9c199b 100644 --- a/apps/meteor/ee/server/lib/ldap/Manager.ts +++ b/apps/meteor/ee/server/lib/ldap/Manager.ts @@ -15,6 +15,7 @@ import { templateVarHandler } from '../../../../app/utils/lib/templateVarHandler import { addUserToRoom, removeUserFromRoom, createRoom } from '../../../../app/lib/server/functions'; import { syncUserRoles } from '../syncUserRoles'; import { Team } from '../../../../server/sdk'; +import { ensureArray } from '../../../../lib/utils/arrayUtils'; export class LDAPEEManager extends LDAPManager { public static async sync(): Promise { @@ -221,13 +222,16 @@ export class LDAPEEManager extends LDAPManager { continue; } - const userField = fieldMap[ldapField]; - const [roleId] = userField.split(/\.(.+)/); - allowedRoles.push(roleId); + const userFields = ensureArray(fieldMap[ldapField]); - if (await this.isUserInGroup(ldap, syncUserRolesBaseDN, syncUserRolesFilter, { dn, username }, ldapField)) { - roleList.push(roleId); - continue; + for await (const userField of userFields) { + const [roleId] = userField.split(/\.(.+)/); + allowedRoles.push(roleId); + + if (await this.isUserInGroup(ldap, syncUserRolesBaseDN, syncUserRolesFilter, { dn, username }, ldapField)) { + roleList.push(roleId); + continue; + } } } diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json index 4a577f49d380..a379787e6b6c 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json @@ -2615,7 +2615,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "عامل تصفية مجموعة المستخدمين", "LDAP_Sync_User_Data_Roles_Filter_Description": "يستخدم عامل تصفية بحث LDAP للتحقق مما إذا كان المستخدم في مجموعة.", "LDAP_Sync_User_Data_RolesMap": "خريطة مجموعة بيانات المستخدم", - "LDAP_Sync_User_Data_RolesMap_Description": "تعيين مجموعات LDAP إلى أدوار مستخدم Rocket.Chat
كمثال، \"{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}\" سيعين مجموعة LDAP لمسؤول rocket إلى دور \"مسؤول\" Rocket.", + "LDAP_Sync_User_Data_RolesMap_Description": "تعيين مجموعات LDAP إلى أدوار مستخدم Rocket.Chat
كمثال، \"{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}\" سيعين مجموعة LDAP لمسؤول rocket إلى دور \"مسؤول\" Rocket.", "LDAP_Teams_BaseDN": "الاسم المميز الأساسي لفِرَق LDAP", "LDAP_Teams_BaseDN_Description": "يُستخدم الاسم المميز الأساسي لـ LDAP للبحث عن فِرَق المستخدمين.", "LDAP_Teams_Name_Field": "سمة اسم فريق LDAP", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json index 6d5472a6716a..cc1906e848fd 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json @@ -2611,7 +2611,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "Filtre de grups d'usuaris", "LDAP_Sync_User_Data_Roles_Filter_Description": "El filtre de cerca LDAP que s'usa per verificar si un usuari està en un grup.", "LDAP_Sync_User_Data_RolesMap": "Mapa de grup de dades d'usuari", - "LDAP_Sync_User_Data_RolesMap_Description": "Mapeja els grups LDAP als rols d'usuari de Rocket.Chat
Com a exemple, `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}` mapejarà el grup LDAP de rocket- admin a el paper de \"admin\" de Rocket.", + "LDAP_Sync_User_Data_RolesMap_Description": "Mapeja els grups LDAP als rols d'usuari de Rocket.Chat
Com a exemple, `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}` mapejarà el grup LDAP de rocket- admin a el paper de \"admin\" de Rocket.", "LDAP_Teams_BaseDN": "Equips LDAP BaseDN", "LDAP_Teams_BaseDN_Description": "El LDAP BaseDN utilitza't per a cercar equips d'usuari.", "LDAP_Teams_Name_Field": "Atribut Nom de l'equip LDAP", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json index 9caa11212bad..ebd50e5eef3b 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json @@ -2204,7 +2204,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "Filtr skupiny uživatelů", "LDAP_Sync_User_Data_Roles_Filter_Description": "Vyhledávací filtr LDAP používaný ke kontrole, zda je uživatel ve skupině.", "LDAP_Sync_User_Data_RolesMap": "Mapa skupin uživatelských dat", - "LDAP_Sync_User_Data_RolesMap_Description": "Mapuje skupiny LDAP na Rocket.Chat uživatelské role
Jako příklad bude \"{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}\" mapovat skupinu LDAP Rocket-admin do role „admin“ v Rocket.Chat.", + "LDAP_Sync_User_Data_RolesMap_Description": "Mapuje skupiny LDAP na Rocket.Chat uživatelské role
Jako příklad bude \"{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}\" mapovat skupinu LDAP Rocket-admin do role „admin“ v Rocket.Chat.", "LDAP_Timeout": "Časový limit (ms)", "LDAP_Timeout_Description": "Kolik milisekund počkat na vyhledávání než bude vrácena chyba", "LDAP_Unique_Identifier_Field": "Jedinečný identifikátor", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json index 015231f2f658..3b9c8558d4f1 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json @@ -2215,7 +2215,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "Brugergruppefilter", "LDAP_Sync_User_Data_Roles_Filter_Description": "LDAP-søgefilteret der bruges til at kontrollere om en bruger er i en gruppe.", "LDAP_Sync_User_Data_RolesMap": "Brugerdata-gruppeoversigt", - "LDAP_Sync_User_Data_RolesMap_Description": "Relatér LDAP-grupper til Rocket.Chat-brugerroller
F.eks. vil '{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}' relatere rocket-admin-LDAP-gruppen til Rockets \"admin\" -rolle.", + "LDAP_Sync_User_Data_RolesMap_Description": "Relatér LDAP-grupper til Rocket.Chat-brugerroller
F.eks. vil '{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}' relatere rocket-admin-LDAP-gruppen til Rockets \"admin\" -rolle.", "LDAP_Timeout": "Timeout (ms)", "LDAP_Timeout_Description": "Hvor mange mileseconds venter på et søgeresultat, før du returnerer en fejl", "LDAP_Unique_Identifier_Field": "Unikt identifikationsfelt", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json index 763058e3c139..9f9e0a4378da 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json @@ -2606,7 +2606,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "LDAP-Benutzergruppen-Filter", "LDAP_Sync_User_Data_Roles_Filter_Description": "Der LDAP-Suchfilter, mit dem überprüft wird, ob sich ein Benutzer in einer Gruppe befindet.", "LDAP_Sync_User_Data_RolesMap": "Benutzerdatengruppenzuordnung", - "LDAP_Sync_User_Data_RolesMap_Description": "Ordnen Sie LDAP-Gruppen zu Rocket.Chat Benutzerrollen
Als Beispiel ordnet {\"rocket-admin\":\"admin\", \"tech-support\":\"support\"} die LDAP-Gruppe von rocket-admin als \"admin\" zu.", + "LDAP_Sync_User_Data_RolesMap_Description": "Ordnen Sie LDAP-Gruppen zu Rocket.Chat Benutzerrollen
Als Beispiel ordnet {\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]} die LDAP-Gruppe von rocket-admin als \"admin\" zu.", "LDAP_Teams_BaseDN": "LDAP-BaseDN von Teams", "LDAP_Teams_BaseDN_Description": "Mit der LDAP-BaseDN wurde nach Benutzer-Teams gesucht.", "LDAP_Teams_Name_Field": "LDAP-Attribut des Team-Namens", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json index abfd9ba8a941..2344fa632250 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json @@ -2644,7 +2644,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "User Group Filter", "LDAP_Sync_User_Data_Roles_Filter_Description": "The LDAP search filter used to check if a user is in a group.", "LDAP_Sync_User_Data_RolesMap": "User Data Group Map", - "LDAP_Sync_User_Data_RolesMap_Description": "Map LDAP groups to Rocket.Chat user roles
As an example, `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}` will map the rocket-admin LDAP group to Rocket's \"admin\" role.", + "LDAP_Sync_User_Data_RolesMap_Description": "Map LDAP groups to Rocket.Chat user roles
As an example, `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}` will map the rocket-admin LDAP group to Rocket's \"admin\" role.", "LDAP_Teams_BaseDN": "LDAP Teams BaseDN", "LDAP_Teams_BaseDN_Description": "The LDAP BaseDN used to lookup user teams.", "LDAP_Teams_Name_Field": "LDAP Team Name Attribute", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json index 1933387d2a49..ad54d45dcdd8 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json @@ -2606,7 +2606,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "Filtro de grupo de usuarios", "LDAP_Sync_User_Data_Roles_Filter_Description": "Filtro de búsqueda LDAP que se usa para verificar si un usuario está en un grupo.", "LDAP_Sync_User_Data_RolesMap": "Asignación de grupos de datos de usuario", - "LDAP_Sync_User_Data_RolesMap_Description": "Asigna grupos LDAP a roles de usuario de Rocket.Chat.
Por ejemplo, \"{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}\" asignará el grupo LDAP de rocket-admin al rol de \"admin\" de Rocket.", + "LDAP_Sync_User_Data_RolesMap_Description": "Asigna grupos LDAP a roles de usuario de Rocket.Chat.
Por ejemplo, \"{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}\" asignará el grupo LDAP de rocket-admin al rol de \"admin\" de Rocket.", "LDAP_Teams_BaseDN": "DN base de equipos de LDAP", "LDAP_Teams_BaseDN_Description": "DN base de LDAP usado para buscar equipos de usuarios.", "LDAP_Teams_Name_Field": "Atributo de nombre de equipo LDAP", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json index fcb10baf4919..e1cce48a6c20 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json @@ -2615,7 +2615,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "Filtre de groupe d'utilisateurs", "LDAP_Sync_User_Data_Roles_Filter_Description": "Filtre de recherche LDAP utilisé pour vérifier si un utilisateur fait partie d'un groupe.", "LDAP_Sync_User_Data_RolesMap": "Mappage de groupes de données utilisateur", - "LDAP_Sync_User_Data_RolesMap_Description": "Mappe les groupes LDAP aux rôles des utilisateurs Rocket.Chat
Par exemple, `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}` mappe le groupe LDAP \"rocket-admin\" au rôle Rocket \"admin\".", + "LDAP_Sync_User_Data_RolesMap_Description": "Mappe les groupes LDAP aux rôles des utilisateurs Rocket.Chat
Par exemple, `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}` mappe le groupe LDAP \"rocket-admin\" au rôle Rocket \"admin\".", "LDAP_Teams_BaseDN": "DN de base des équipes LDAP", "LDAP_Teams_BaseDN_Description": "DN de base LDAP utilisé pour rechercher des équipes d'utilisateurs.", "LDAP_Teams_Name_Field": "Attribut de nom d'équipe LDAP", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json index 61ed78a7e408..adb3268b10a3 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json @@ -2607,7 +2607,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "ユーザーグループフィルター", "LDAP_Sync_User_Data_Roles_Filter_Description": "ユーザーがグループに属しているかどうかを確認するためのLDAP検索フィルター。", "LDAP_Sync_User_Data_RolesMap": "ユーザーデータグループマップ", - "LDAP_Sync_User_Data_RolesMap_Description": "LDAPグループをRocket.Chatユーザーロールにマッピングします
例:「{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}」は、rocket-admin LDAPグループをRocketの「admin」ロールにマッピングします。", + "LDAP_Sync_User_Data_RolesMap_Description": "LDAPグループをRocket.Chatユーザーロールにマッピングします
例:「{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}」は、rocket-admin LDAPグループをRocketの「admin」ロールにマッピングします。", "LDAP_Teams_BaseDN": "LDAPチームのBaseDN", "LDAP_Teams_BaseDN_Description": "ユーザーチームの検索用のLDAP BaseDN。", "LDAP_Teams_Name_Field": "LDAPチーム名の属性", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json index a8bcff59f1e9..14c6787e6837 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json @@ -2091,7 +2091,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "მომხმარებელთა ჯგუფის ფილტრი", "LDAP_Sync_User_Data_Roles_Filter_Description": "LDAP საძიებო ფილტრი გამოიყენება იმის შესამოწმებლად, თუ მომხმარებელი ჯგუფშია.", "LDAP_Sync_User_Data_RolesMap": "მომხმარებელთა მონაცემთა ჯგუფის რუკა", - "LDAP_Sync_User_Data_RolesMap_Description": "LDAP ჯგუფების დატანა Rocket.Chat-ის მომხმარებელთა როლებზე
მაგალითად, {\"rocket-admin\":\"admin\", \"tech-support\":\"support\"} დაიტანს rocket-admin LDAP ჯგუფს Rocket's-ის ადმინის როლად", + "LDAP_Sync_User_Data_RolesMap_Description": "LDAP ჯგუფების დატანა Rocket.Chat-ის მომხმარებელთა როლებზე
მაგალითად, {\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]} დაიტანს rocket-admin LDAP ჯგუფს Rocket's-ის ადმინის როლად", "LDAP_Timeout": "ტაიმაუტი (მილიწამები)", "LDAP_Timeout_Description": "რამდენი მილიწამი დაელოდოს ძიების შედეგს სანამ შეცდომას დააბრუნებს", "LDAP_Unique_Identifier_Field": "უნიკალური საიდენტიფიკაციო ველი", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json index 81adc681be81..035805b47401 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json @@ -2262,7 +2262,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "사용자 그룹 필터", "LDAP_Sync_User_Data_Roles_Filter_Description": "사용자가 그룹에 존재하는지 확인하는 데 사용되는 LDAP 검색 필터입니다.", "LDAP_Sync_User_Data_RolesMap": "사용자 데이터 그룹 배치", - "LDAP_Sync_User_Data_RolesMap_Description": "LDAP 그룹을 Rocket에 매핑합니다. 채팅 사용자 역할
예를 들어, [{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}`은 rocket-admin LDAP 그룹을 Rocket의 \"admin\"역할에 매핑합니다.", + "LDAP_Sync_User_Data_RolesMap_Description": "LDAP 그룹을 Rocket에 매핑합니다. 채팅 사용자 역할
예를 들어, [{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}`은 rocket-admin LDAP 그룹을 Rocket의 \"admin\"역할에 매핑합니다.", "LDAP_Timeout": "제한 시간 (밀리 초)", "LDAP_Timeout_Description": "오류를 반환하기 전에 검색 결과를 기다리는 시간 (mileeconds)", "LDAP_Unique_Identifier_Field": "고유 식별자 필드", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json index 6e6680e93bfa..ef7f0a35bbb1 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json @@ -2615,7 +2615,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "Gebruikersgroepfilter", "LDAP_Sync_User_Data_Roles_Filter_Description": "Het LDAP-zoekfilter dat wordt gebruikt om te controleren of een gebruiker deel uitmaakt van een groep.", "LDAP_Sync_User_Data_RolesMap": "User Data Group Map", - "LDAP_Sync_User_Data_RolesMap_Description": "Wijs LDAP-groepen toe aan Rocket.Chat-gebruikersrollen
Als voorbeeld zal `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}` de rocket-admin LDAP-groep toewijzen aan Rocket's rol \"admin\".", + "LDAP_Sync_User_Data_RolesMap_Description": "Wijs LDAP-groepen toe aan Rocket.Chat-gebruikersrollen
Als voorbeeld zal `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}` de rocket-admin LDAP-groep toewijzen aan Rocket's rol \"admin\".", "LDAP_Teams_BaseDN": "LDAP-teams BaseDN", "LDAP_Teams_BaseDN_Description": "De LDAP BaseDN gebruikt om gebruikersteams op te zoeken.", "LDAP_Teams_Name_Field": "LDAP-teamnaam attribuut", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json index 5d47dfcbf167..b42cc33c5992 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json @@ -2604,7 +2604,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "Filtr grupy użytkowników", "LDAP_Sync_User_Data_Roles_Filter_Description": "Filtr wyszukiwania LDAP służy do sprawdzania, czy użytkownik znajduje się w grupie.", "LDAP_Sync_User_Data_RolesMap": "User Data Group Map", - "LDAP_Sync_User_Data_RolesMap_Description": "Mapuj grupy LDAP do ról użytkownika Rocket.Chat
Na przykład, `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}` zmapuje grupę LDAP \"rocket-admin\" do roli \"admin\" Rocketa.", + "LDAP_Sync_User_Data_RolesMap_Description": "Mapuj grupy LDAP do ról użytkownika Rocket.Chat
Na przykład, `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}` zmapuje grupę LDAP \"rocket-admin\" do roli \"admin\" Rocketa.", "LDAP_Teams_BaseDN": "BaseDN zespołów LDAP", "LDAP_Teams_BaseDN_Description": "LDAP BaseDN używany do wyszukiwania zespołów użytkowników.", "LDAP_Teams_Name_Field": "Atrybut nazwy zespołu LDAP", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json index 03cb8990ea73..9b357970aceb 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json @@ -2615,7 +2615,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "Filtro de grupo de usuário", "LDAP_Sync_User_Data_Roles_Filter_Description": "O filtro de busca LDAP usado para verificar se um usuário está em um grupo.", "LDAP_Sync_User_Data_RolesMap": "Mapeamento de grupo de dados de usuário", - "LDAP_Sync_User_Data_RolesMap_Description": "Mapeia grupos LDAP para funções de usuário do Rocket.Chat
Por exemplo, ` {\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}` mapeará o grupo LDAP rocket-admin para a função de \"admin\" do Rocket.Chat.", + "LDAP_Sync_User_Data_RolesMap_Description": "Mapeia grupos LDAP para funções de usuário do Rocket.Chat
Por exemplo, ` {\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}` mapeará o grupo LDAP rocket-admin para a função de \"admin\" do Rocket.Chat.", "LDAP_Teams_BaseDN": "BaseDN do LDAP de equipes", "LDAP_Teams_BaseDN_Description": "A BaseDN do LDAP usada para procurar equipes do usuário", "LDAP_Teams_Name_Field": "Atributo de nome da equipe do LDAP", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json index 43c0758ee028..aae9a05a0913 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json @@ -2615,7 +2615,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "Фильтр Группы Пользователей", "LDAP_Sync_User_Data_Roles_Filter_Description": "Фильтр поиска LDAP используется для проверки того, входит ли пользователь в группу.", "LDAP_Sync_User_Data_RolesMap": "Карта группы пользовательских данных", - "LDAP_Sync_User_Data_RolesMap_Description": "Сопоставьте группы LDAP с ролями пользователей Rocket.Chat
В качестве примера `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}` сопоставит группу LDAP rocket-admin с ролью \"admin\" в Rocket Chat.", + "LDAP_Sync_User_Data_RolesMap_Description": "Сопоставьте группы LDAP с ролями пользователей Rocket.Chat
В качестве примера `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}` сопоставит группу LDAP rocket-admin с ролью \"admin\" в Rocket Chat.", "LDAP_Teams_BaseDN": "BaseDN рабочих групп LDAP", "LDAP_Teams_BaseDN_Description": "BaseDN LDAP используется для поиска рабочих групп пользователей.", "LDAP_Teams_Name_Field": "Атрибут названия рабочей группы LDAP", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json index fbed9e7bc016..84d3170b7029 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json @@ -2553,7 +2553,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "使用者群組過濾", "LDAP_Sync_User_Data_Roles_Filter_Description": "LDAP 搜尋過濾已使用在假如使用者在群組時檢查。", "LDAP_Sync_User_Data_RolesMap": "使用者資料群組對應", - "LDAP_Sync_User_Data_RolesMap_Description": "將 LDAP 群組對應到 Rocket.Chat 使用者角色
例如,`{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}`將 rocket-admin LDAP 群組對應到Rocket 的 “admin” 角色。", + "LDAP_Sync_User_Data_RolesMap_Description": "將 LDAP 群組對應到 Rocket.Chat 使用者角色
例如,`{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}`將 rocket-admin LDAP 群組對應到Rocket 的 “admin” 角色。", "LDAP_Teams_BaseDN": "LDAP 團體 BaseDN", "LDAP_Teams_BaseDN_Description": "此 LDAP BaseDN 已使用去查詢使用者的團體。", "LDAP_Teams_Name_Field": "LDAP 團體名稱屬性", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json index e543989d65b4..59d698b5978c 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json @@ -2300,7 +2300,7 @@ "LDAP_Sync_User_Data_Roles_Filter": "用户组过滤器", "LDAP_Sync_User_Data_Roles_Filter_Description": "LDAP搜索过滤器,用于检查用户是否在组中。", "LDAP_Sync_User_Data_RolesMap": "用户数据群组对应", - "LDAP_Sync_User_Data_RolesMap_Description": "将LDAP组对应到Rocket.Chat用户角色
例如,`{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}`会将rocket-admin LDAP组对应到Rocket.Chat的“管理员”角色。", + "LDAP_Sync_User_Data_RolesMap_Description": "将LDAP组对应到Rocket.Chat用户角色
例如,`{\"rocket-admin\":\"admin\", \"tech-support\":\"support\", \"manager\":[\"leader\", \"moderator\"]}`会将rocket-admin LDAP组对应到Rocket.Chat的“管理员”角色。", "LDAP_Timeout": "超时(ms)", "LDAP_Timeout_Description": "在返回错误之前等待搜索结果多少英里", "LDAP_Unique_Identifier_Field": "唯一识别字段", From 3ab9d8a492014f3c6227ea87aa0fc16b24be34d5 Mon Sep 17 00:00:00 2001 From: Weslley Campos <30299972+weslley543@users.noreply.github.com> Date: Tue, 17 May 2022 21:34:38 -0300 Subject: [PATCH 02/50] Chore: migrate-to-pw-adjust-in-intermitences (#25542) --- .../tests/e2e/04-main-elements-render.spec.ts | 4 +--- .../tests/e2e/05-channel-creation.spec.ts | 8 +++---- apps/meteor/tests/e2e/07-emoji.spec.ts | 4 ++-- apps/meteor/tests/e2e/12-settings.spec.ts | 6 +++--- .../tests/e2e/utils/configs/teardown.ts | 2 +- .../tests/e2e/utils/mocks/subscriptionMock.ts | 21 +++++++++++++++++++ 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/apps/meteor/tests/e2e/04-main-elements-render.spec.ts b/apps/meteor/tests/e2e/04-main-elements-render.spec.ts index 3896ce0bea94..497e08c35c9a 100644 --- a/apps/meteor/tests/e2e/04-main-elements-render.spec.ts +++ b/apps/meteor/tests/e2e/04-main-elements-render.spec.ts @@ -128,8 +128,6 @@ test.describe('[Main Elements Render]', function () { await expect(mainContent.messageBoxActions()).toBeVisible(); }); - // issues with the new message box action button and the no animations on tests - test('expect show the audio recording button', async () => { await expect(mainContent.recordBtn()).toBeVisible(); }); @@ -185,7 +183,7 @@ test.describe('[Main Elements Render]', function () { }); }); - test.describe('[Members Tab]', () => { + test.describe.skip('[Members Tab]', () => { test.beforeAll(async () => { await flexTab.operateFlexTab('members', true); }); diff --git a/apps/meteor/tests/e2e/05-channel-creation.spec.ts b/apps/meteor/tests/e2e/05-channel-creation.spec.ts index e2dfc7199e2c..d75a06e288da 100644 --- a/apps/meteor/tests/e2e/05-channel-creation.spec.ts +++ b/apps/meteor/tests/e2e/05-channel-creation.spec.ts @@ -1,9 +1,9 @@ import { test } from '@playwright/test'; -import { v4 } from 'uuid'; +import { faker } from '@faker-js/faker'; import ChannelCreation from './utils/pageobjects/ChannelCreation'; import LoginPage from './utils/pageobjects/LoginPage'; -import { validUser, ROCKET_CAT } from './utils/mocks/userAndPasswordMock'; +import { validUserInserted, ROCKET_CAT } from './utils/mocks/userAndPasswordMock'; test.describe('[Channel]', async () => { let channelCreation: ChannelCreation; @@ -15,7 +15,7 @@ test.describe('[Channel]', async () => { const baseUrl = baseURL as string; loginPage = new LoginPage(page); await loginPage.goto(baseUrl); - await loginPage.login(validUser); + await loginPage.login(validUserInserted); channelCreation = new ChannelCreation(page); }); @@ -23,7 +23,7 @@ test.describe('[Channel]', async () => { test.describe('[Public and private channel creation]', () => { let channelName: string; test.beforeEach(async () => { - channelName = v4(); + channelName = faker.animal.type(); }); test('expect create privateChannel channel', async () => { diff --git a/apps/meteor/tests/e2e/07-emoji.spec.ts b/apps/meteor/tests/e2e/07-emoji.spec.ts index 496fe6668cba..847e5fa46347 100644 --- a/apps/meteor/tests/e2e/07-emoji.spec.ts +++ b/apps/meteor/tests/e2e/07-emoji.spec.ts @@ -99,12 +99,12 @@ test.describe('[Emoji]', function () { }); test('expect be that the value on the message input is the same as the emoji clicked', async () => { - await expect(mainContent.messageInput()).toHaveValue(':smiley: :grinning: '); + await expect(mainContent.messageInput()).toHaveValue(':grinning: '); }); test('expect send the emoji', async () => { await mainContent.addTextToInput(' '); - await mainContent.sendBtn().click(); + await mainContent.getPage().keyboard.press('Enter'); }); test('expect be that the value on the message is the same as the emoji clicked', async () => { diff --git a/apps/meteor/tests/e2e/12-settings.spec.ts b/apps/meteor/tests/e2e/12-settings.spec.ts index dadbf331af8c..5a328152ce96 100644 --- a/apps/meteor/tests/e2e/12-settings.spec.ts +++ b/apps/meteor/tests/e2e/12-settings.spec.ts @@ -11,7 +11,7 @@ import PreferencesMainContent from './utils/pageobjects/PreferencesMainContent'; const apiSessionHeaders = { 'X-Auth-Token': '', 'X-User-Id': '' }; -test.describe('[Settings]', async () => { +test.describe.skip('[Settings]', async () => { let page: Page; let loginPage: LoginPage; let mainContent: MainContent; @@ -362,7 +362,7 @@ test.describe('[Settings]', async () => { }); }); - test.describe.only('Avatar change', () => { + test.describe('Avatar change', () => { test('(API) expect disable avatar change', async ({ request }) => { const response = await request.post(`${BASE_API_URL}/settings/Accounts_AllowUserAvatarChange`, { headers: apiSessionHeaders, @@ -394,7 +394,7 @@ test.describe('[Settings]', async () => { }); }); -test.describe('[Settings (admin)]', async () => { +test.describe.skip('[Settings (admin)]', async () => { let page: Page; let loginPage: LoginPage; let mainContent: MainContent; diff --git a/apps/meteor/tests/e2e/utils/configs/teardown.ts b/apps/meteor/tests/e2e/utils/configs/teardown.ts index 544ee5f4845f..ef7457971992 100644 --- a/apps/meteor/tests/e2e/utils/configs/teardown.ts +++ b/apps/meteor/tests/e2e/utils/configs/teardown.ts @@ -17,7 +17,7 @@ const deleteUser = async (): Promise => { const deleteSubscribeUserInChannels = async (): Promise => { const subscribeCollections = await MongoHelper.getCollection('rocketchat_subscription'); await subscribeCollections.deleteMany({ - _id: { $in: ['zjHWmhH4go9NoGwTP', 'cKZP37FdE8soBpJmN', 'RD7gjmtqnQtnR6BTt', 'T3Skt3gxZoTrWwWZx'] }, + _id: { $in: ['zjHWmhH4go9NoGwTP', 'cKZP37FdE8soBpJmN', 'RD7gjmtqnQtnR6BTt', 'T3Skt3gxZoTrWwWZx', 'TjtKQyfaGtrn6PjSk'] }, }); }; diff --git a/apps/meteor/tests/e2e/utils/mocks/subscriptionMock.ts b/apps/meteor/tests/e2e/utils/mocks/subscriptionMock.ts index 5474fc3c3068..9189c690dbe8 100644 --- a/apps/meteor/tests/e2e/utils/mocks/subscriptionMock.ts +++ b/apps/meteor/tests/e2e/utils/mocks/subscriptionMock.ts @@ -84,4 +84,25 @@ export const subscriptionMock: ISubscription[] = [ _updatedAt: new Date(), ls: new Date(), }, + { + _id: 'TjtKQyfaGtrn6PjSk', + open: true, + alert: true, + unread: 0, + userMentions: 0, + groupMentions: 0, + ts: new Date(), + rid: 'fWJChTFjhQLXZrusq', + name: 'public channel', + fname: 'public channel', + ls: new Date(), + lr: new Date(), + t: 'c', + u: { + _id: 'rocketchat.internal.admin.test', + username: 'rocketchat.internal.admin.test', + name: 'RocketChat Internal Admin Test', + }, + _updatedAt: new Date(), + }, ]; From d170c48d3bcb1c2cfed772d28557356c18c92a25 Mon Sep 17 00:00:00 2001 From: Guilherme Jun Grillo <48109548+guijun13@users.noreply.github.com> Date: Wed, 18 May 2022 09:11:44 -0300 Subject: [PATCH 03/50] [FIX] Rooms' names turn lower case on CSV import (#24612) * feat: change channel name 'rule' when importing * feat: add maintainCase in limax * fix: update special characters rule * fix: regression of settings use for import rules --- apps/meteor/app/importer/server/classes/ImporterBase.js | 4 ---- apps/meteor/app/utils/lib/getValidRoomName.js | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/apps/meteor/app/importer/server/classes/ImporterBase.js b/apps/meteor/app/importer/server/classes/ImporterBase.js index 2024338dde56..fd4e7a9972c8 100644 --- a/apps/meteor/app/importer/server/classes/ImporterBase.js +++ b/apps/meteor/app/importer/server/classes/ImporterBase.js @@ -265,9 +265,6 @@ export class Base { this.oldSettings.FileUpload_MediaTypeBlackList = Settings.findOneById('FileUpload_MediaTypeBlackList').value; Settings.updateValueById('FileUpload_MediaTypeBlackList', ''); - - this.oldSettings.UI_Allow_room_names_with_special_chars = Settings.findOneById('UI_Allow_room_names_with_special_chars').value; - Settings.updateValueById('UI_Allow_room_names_with_special_chars', true); break; case ProgressStep.DONE: case ProgressStep.ERROR: @@ -277,7 +274,6 @@ export class Base { Settings.updateValueById('FileUpload_MaxFileSize', this.oldSettings.FileUpload_MaxFileSize); Settings.updateValueById('FileUpload_MediaTypeWhiteList', this.oldSettings.FileUpload_MediaTypeWhiteList); Settings.updateValueById('FileUpload_MediaTypeBlackList', this.oldSettings.FileUpload_MediaTypeBlackList); - Settings.updateValueById('UI_Allow_room_names_with_special_chars', this.oldSettings.UI_Allow_room_names_with_special_chars); break; } diff --git a/apps/meteor/app/utils/lib/getValidRoomName.js b/apps/meteor/app/utils/lib/getValidRoomName.js index 32c791c018f5..9085005fbe68 100644 --- a/apps/meteor/app/utils/lib/getValidRoomName.js +++ b/apps/meteor/app/utils/lib/getValidRoomName.js @@ -10,7 +10,7 @@ export const getValidRoomName = (displayName, rid = '', options = {}) => { let slugifiedName = displayName; if (settings.get('UI_Allow_room_names_with_special_chars')) { - const cleanName = limax(displayName); + const cleanName = limax(displayName, { maintainCase: true }); if (options.allowDuplicates !== true) { const room = Rooms.findOneByDisplayName(displayName); if (room && room._id !== rid) { From 45b46da27fc19641d336aadcb8ec9c0a27b0e0af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Albuquerque?= Date: Wed, 18 May 2022 09:42:43 -0300 Subject: [PATCH 04/50] Chore: User set UTC offset (#25381) Co-authored-by: Guilherme Gazzo --- apps/meteor/client/startup/userSetUtcOffset.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/meteor/client/startup/userSetUtcOffset.ts b/apps/meteor/client/startup/userSetUtcOffset.ts index 5a612260da2d..862352933160 100644 --- a/apps/meteor/client/startup/userSetUtcOffset.ts +++ b/apps/meteor/client/startup/userSetUtcOffset.ts @@ -19,6 +19,9 @@ Meteor.startup(() => { const utcOffset = moment().utcOffset() / 60; + if (!user) { + return; + } if (user.utcOffset !== utcOffset) { Meteor.call('userSetUtcOffset', utcOffset); } From bbd534afab3ba7382b8a19ddec821d3fec8d3218 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Wed, 18 May 2022 14:42:44 -0300 Subject: [PATCH 05/50] Regression: CI services build (#25555) --- .github/workflows/build_and_test.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 0f4f2afa06c0..af571a2c861a 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -864,6 +864,17 @@ jobs: uses: actions/setup-node@v3 with: node-version: '14.18.3' + - uses: c-hive/gha-yarn-cache@v2 + - name: Cache turbo + id: cache-turbo + uses: actions/cache@v2 + with: + path: | + ./node_modules/.turbo + key: ${{ runner.OS }}-turbo-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-turbo- + ${{ runner.os }}- - name: Login to DockerHub uses: docker/login-action@v1 From 71d57bdd2e8d28996229a00059e6e05e206f592c Mon Sep 17 00:00:00 2001 From: Martin Schoeler Date: Wed, 18 May 2022 17:45:58 -0300 Subject: [PATCH 06/50] [FIX] One of the triggers was not working correctly (#25409) * [FIX] One of the triggers was not working correctly * fix html iteration * eslint fix Co-authored-by: Tiago Evangelista Pinto --- packages/livechat/src/components/App/App.js | 1 + packages/livechat/src/lib/triggers.js | 25 ++++++++----------- .../src/routes/TriggerMessage/component.js | 4 +-- .../src/routes/TriggerMessage/container.js | 5 ++-- packages/livechat/tsconfig.json | 2 +- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/packages/livechat/src/components/App/App.js b/packages/livechat/src/components/App/App.js index f1893bee6c20..e2161042b07b 100644 --- a/packages/livechat/src/components/App/App.js +++ b/packages/livechat/src/components/App/App.js @@ -117,6 +117,7 @@ export class App extends Component { } else { dispatchRestore(); } + Triggers.callbacks.emit('chat-opened-by-visitor'); } handleOpenWindow = () => { diff --git a/packages/livechat/src/lib/triggers.js b/packages/livechat/src/lib/triggers.js index 0df433e6ba35..98c1bf9e65ab 100644 --- a/packages/livechat/src/lib/triggers.js +++ b/packages/livechat/src/lib/triggers.js @@ -1,3 +1,4 @@ +import mitt from 'mitt'; import { route } from 'preact-router'; import { Livechat } from '../api'; @@ -59,6 +60,7 @@ class Triggers { this._triggers = []; this._enabled = true; Triggers.instance = this; + this.callbacks = mitt(); } return Triggers.instance; @@ -89,8 +91,8 @@ class Triggers { } async fire(trigger) { - const { token, firedTriggers = [] } = store.state; - if (!this._enabled) { + const { token, firedTriggers = [], user } = store.state; + if (!this._enabled || user) { return; } const { actions } = trigger; @@ -121,7 +123,10 @@ class Triggers { parentCall('callback', ['assign-agent', normalizeAgent(agent)]); } - route('/trigger-messages'); + const foundCondition = trigger.conditions.find((c) => c.name === 'chat-opened-by-visitor'); + if (!foundCondition) { + route('/trigger-messages'); + } store.setState({ minimized: false }); }); } @@ -136,11 +141,6 @@ class Triggers { processRequest(request) { this._requests.push(request); - if (!this._started) { - return; - } - - this.processTriggers(); } processTriggers() { @@ -163,13 +163,10 @@ class Triggers { break; case 'chat-opened-by-visitor': const openFunc = () => { - const { user } = store.state; - if (user) { - store.off('change', openFunc); - this.fire(trigger); - } + this.fire(trigger); + this.callbacks.off('chat-opened-by-visitor', openFunc); }; - store.on('change', openFunc); + this.callbacks.on('chat-opened-by-visitor', openFunc); break; } }); diff --git a/packages/livechat/src/routes/TriggerMessage/component.js b/packages/livechat/src/routes/TriggerMessage/component.js index a9906bc8c8f7..41f18db445f3 100644 --- a/packages/livechat/src/routes/TriggerMessage/component.js +++ b/packages/livechat/src/routes/TriggerMessage/component.js @@ -18,9 +18,9 @@ class TriggerMessage extends Component { componentDidUpdate() { let height = 0; - this.ref.current.base.children.forEach((el) => { + for (const el of this.ref.current.base.children) { height += el.scrollHeight; - }); + } parentCall('resizeWidget', height); } diff --git a/packages/livechat/src/routes/TriggerMessage/container.js b/packages/livechat/src/routes/TriggerMessage/container.js index 40765f87cc1a..e46f7fd2fa89 100644 --- a/packages/livechat/src/routes/TriggerMessage/container.js +++ b/packages/livechat/src/routes/TriggerMessage/container.js @@ -8,15 +8,16 @@ import TriggerMessage from './component'; export class TriggerMessageContainer extends Component { - handleStart() { + handleStart(props) { parentCall('setFullScreenDocumentMobile'); parentCall('openWidget'); + props.onRestore(); route('/'); } render = (props) => { parentCall('resetDocumentStyle'); - return ; + return this.handleStart(props)} {...props} />; } } diff --git a/packages/livechat/tsconfig.json b/packages/livechat/tsconfig.json index 2d0a2cf459aa..286861613866 100644 --- a/packages/livechat/tsconfig.json +++ b/packages/livechat/tsconfig.json @@ -11,6 +11,6 @@ }, "exclude": [ "./node_modules", - "./build" + "./dist" ] } From e80d88f7a58b0134ba3888a558b43cd24faecaa1 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Wed, 18 May 2022 19:28:37 -0300 Subject: [PATCH 07/50] [FIX] Dynamic load matrix is enabled and handle failure (#25495) Co-authored-by: Aaron Ogle --- .../meteor/app/federation-v2/server/bridge.ts | 26 ++++++++++++++----- .../server/matrix-client/user.ts | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/apps/meteor/app/federation-v2/server/bridge.ts b/apps/meteor/app/federation-v2/server/bridge.ts index 21457fc56101..289f7e9033d4 100644 --- a/apps/meteor/app/federation-v2/server/bridge.ts +++ b/apps/meteor/app/federation-v2/server/bridge.ts @@ -1,10 +1,12 @@ -import { Bridge as MatrixBridge, AppServiceRegistration } from '@rocket.chat/forked-matrix-appservice-bridge'; +import type { Bridge as MatrixBridge } from '@rocket.chat/forked-matrix-appservice-bridge'; import { settings } from '../../settings/server'; -import { IMatrixEvent } from './definitions/IMatrixEvent'; -import { MatrixEventType } from './definitions/MatrixEventType'; +import { Settings } from '../../models/server/raw'; +import type { IMatrixEvent } from './definitions/IMatrixEvent'; +import type { MatrixEventType } from './definitions/MatrixEventType'; import { addToQueue } from './queue'; import { getRegistrationInfo } from './config'; +import { bridgeLogger } from './logger'; class Bridge { private bridgeInstance: MatrixBridge; @@ -14,12 +16,17 @@ class Bridge { public async start(): Promise { try { await this.stop(); - } finally { - this.createInstance(); + await this.createInstance(); + if (!this.isRunning) { await this.bridgeInstance.run(this.getBridgePort()); this.isRunning = true; } + } catch (e) { + bridgeLogger.error('Failed to initialize the matrix-appservice-bridge.', e); + + bridgeLogger.error('Disabling Matrix Bridge. Please resolve error and try again'); + Settings.updateValueById('Federation_Matrix_enabled', false); } } @@ -28,7 +35,7 @@ class Bridge { return; } // the http server can take some minutes to shutdown and this promise to be resolved - await this.bridgeInstance.close(); + await this.bridgeInstance?.close(); this.isRunning = false; } @@ -36,7 +43,12 @@ class Bridge { return this.bridgeInstance; } - private createInstance(): void { + private async createInstance(): Promise { + bridgeLogger.info('Performing Dynamic Import of matrix-appservice-bridge'); + + // Dynamic import to prevent Rocket.Chat from loading the module until needed and then handle if that fails + const { Bridge: MatrixBridge, AppServiceRegistration } = await import('@rocket.chat/forked-matrix-appservice-bridge'); + this.bridgeInstance = new MatrixBridge({ homeserverUrl: settings.get('Federation_Matrix_homeserver_url'), domain: settings.get('Federation_Matrix_homeserver_domain'), diff --git a/apps/meteor/app/federation-v2/server/matrix-client/user.ts b/apps/meteor/app/federation-v2/server/matrix-client/user.ts index 01a9174baba9..28a5d5a4a318 100644 --- a/apps/meteor/app/federation-v2/server/matrix-client/user.ts +++ b/apps/meteor/app/federation-v2/server/matrix-client/user.ts @@ -1,4 +1,4 @@ -import { MatrixProfileInfo } from '@rocket.chat/forked-matrix-bot-sdk'; +import type { MatrixProfileInfo } from '@rocket.chat/forked-matrix-bot-sdk'; import { IUser } from '@rocket.chat/core-typings'; import { matrixBridge } from '../bridge'; From 08308140435389ddc35cd7adc95e9c79c34e7e11 Mon Sep 17 00:00:00 2001 From: Filipe Marins Date: Wed, 18 May 2022 20:06:13 -0300 Subject: [PATCH 08/50] [FIX] Add open user card to user avatar (#25445) --- .../client/views/room/MessageList/components/Message.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/meteor/client/views/room/MessageList/components/Message.tsx b/apps/meteor/client/views/room/MessageList/components/Message.tsx index 18d3f2a50812..ed891518aa58 100644 --- a/apps/meteor/client/views/room/MessageList/components/Message.tsx +++ b/apps/meteor/client/views/room/MessageList/components/Message.tsx @@ -5,6 +5,7 @@ import { useToggle } from '@rocket.chat/fuselage-hooks'; import React, { FC, memo } from 'react'; import UserAvatar from '../../../../components/avatar/UserAvatar'; +import { useMessageActions } from '../../contexts/MessageContext'; import { useIsMessageHighlight } from '../contexts/MessageHighlightContext'; import { useIsSelecting, useToggleSelect, useIsSelectedMessage, useCountSelected } from '../contexts/SelectedMessagesContext'; import MessageContent from './MessageContent'; @@ -21,6 +22,9 @@ const Message: FC<{ message: IMessage; sequential: boolean; subscription?: ISubs }) => { const isMessageHighlight = useIsMessageHighlight(message._id); const [isMessageIgnored, toggleMessageIgnored] = useToggle(message.ignored); + const { + actions: { openUserCard }, + } = useMessageActions(); const isSelecting = useIsSelecting(); const toggleSelected = useToggleSelect(message._id); @@ -38,7 +42,9 @@ const Message: FC<{ message: IMessage; sequential: boolean; subscription?: ISubs data-qa-selected={isSelected} > - {!sequential && message.u.username && !isSelecting && } + {!sequential && message.u.username && !isSelecting && ( + + )} {isSelecting && } {sequential && } From e8512977d3b09cb53526120bf6925313d06ddab9 Mon Sep 17 00:00:00 2001 From: souzaramon Date: Thu, 19 May 2022 01:04:54 -0300 Subject: [PATCH 09/50] Test: Migrate 13-permissions from cypress to playwright (#25558) --- apps/meteor/tests/e2e/12-settings.spec.ts | 32 +++--- apps/meteor/tests/e2e/13-permissions.spec.ts | 97 +++++++++++++++++++ .../tests/e2e/utils/interfaces/Login.ts | 1 + .../e2e/utils/mocks/userAndPasswordMock.ts | 7 ++ .../e2e/utils/pageobjects/Administration.ts | 8 ++ .../tests/e2e/utils/pageobjects/FlexTab.ts | 7 +- .../e2e/utils/pageobjects/MainContent.ts | 2 +- .../tests/e2e/utils/pageobjects/SideNav.ts | 6 ++ .../tests/e2e/utils/pageobjects/index.ts | 9 ++ 9 files changed, 151 insertions(+), 18 deletions(-) create mode 100644 apps/meteor/tests/e2e/13-permissions.spec.ts create mode 100644 apps/meteor/tests/e2e/utils/pageobjects/index.ts diff --git a/apps/meteor/tests/e2e/12-settings.spec.ts b/apps/meteor/tests/e2e/12-settings.spec.ts index 5a328152ce96..d0893272dc61 100644 --- a/apps/meteor/tests/e2e/12-settings.spec.ts +++ b/apps/meteor/tests/e2e/12-settings.spec.ts @@ -58,7 +58,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(edit) not be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.sendMessage(`any_message_${uuid()}`); await mainContent.openMessageActionMenu(); @@ -77,7 +77,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(edit) be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.sendMessage(`any_message_${uuid()}`); await mainContent.openMessageActionMenu(); @@ -98,7 +98,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(delete) not be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.sendMessage(`any_message_${uuid()}`); await mainContent.openMessageActionMenu(); @@ -117,7 +117,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(delete) be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.sendMessage(`any_message_${uuid()}`); await mainContent.openMessageActionMenu(); @@ -138,7 +138,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(upload audio) not be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); expect(await mainContent.recordBtn().isVisible()).toBeFalsy(); }); @@ -155,7 +155,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(upload audio) be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); expect(await mainContent.recordBtn().isVisible()).toBeTruthy(); }); @@ -174,7 +174,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(upload video) not be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.openMoreActionMenu(); expect(await page.isVisible('.rc-popover__content [data-id="video-message"]')).toBeFalsy(); @@ -192,7 +192,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(upload video) be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.openMoreActionMenu(); expect(await page.isVisible('.rc-popover__content [data-id="video-message"]')).toBeTruthy(); @@ -225,7 +225,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect badword be censored', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.sendMessage(unauthorizedWord); await mainContent.waitForLastMessageEqualsText('*'.repeat(unauthorizedWord.length)); @@ -243,7 +243,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect badword not be censored', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.sendMessage(unauthorizedWord); await mainContent.waitForLastMessageEqualsText(unauthorizedWord); @@ -263,7 +263,7 @@ test.describe.skip('[Settings]', async () => { }); test.skip('(UI) expect option(star message) not be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.sendMessage(`any_message_${uuid()}`); await mainContent.openMessageActionMenu(); @@ -282,7 +282,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(star message) be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.sendMessage(`any_message_${uuid()}`); await mainContent.openMessageActionMenu(); @@ -303,7 +303,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(upload file) not be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.openMoreActionMenu(); expect(await page.isVisible('[data-qa-id="file-upload"]')).toBeFalsy(); @@ -321,7 +321,7 @@ test.describe.skip('[Settings]', async () => { }); test('(UI) expect option(upload file) be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.openMoreActionMenu(); expect(await page.isVisible('[data-qa-id="file-upload"]')).toBeTruthy(); @@ -436,7 +436,7 @@ test.describe.skip('[Settings (admin)]', async () => { }); test('(UI) expect option(pin message) not be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.sendMessage(`any_message_${uuid()}`); await mainContent.openMessageActionMenu(); @@ -455,7 +455,7 @@ test.describe.skip('[Settings (admin)]', async () => { }); test('(UI) expect option(pin message) be visible', async () => { - await mainContent.reload(); + await mainContent.doReload(); await mainContent.sendMessage(`any_message_${uuid()}`); await mainContent.openMessageActionMenu(); diff --git a/apps/meteor/tests/e2e/13-permissions.spec.ts b/apps/meteor/tests/e2e/13-permissions.spec.ts new file mode 100644 index 000000000000..0b4edda751b7 --- /dev/null +++ b/apps/meteor/tests/e2e/13-permissions.spec.ts @@ -0,0 +1,97 @@ +import { Page, test, expect } from '@playwright/test'; +import { v4 as uuid } from 'uuid'; + +import { LoginPage, FlexTab, Administration, MainContent, SideNav } from './utils/pageobjects'; +import { adminLogin, createRegisterUser } from './utils/mocks/userAndPasswordMock'; +import { BACKSPACE } from './utils/mocks/keyboardKeyMock'; + +test.describe('[Permissions]', () => { + let page: Page; + + let loginPage: LoginPage; + let admin: Administration; + let flexTab: FlexTab; + let sideNav: SideNav; + let mainContent: MainContent; + + const userToBeCreated = createRegisterUser(); + + test.beforeAll(async ({ browser }) => { + const context = await browser.newContext(); + page = await context.newPage(); + + loginPage = new LoginPage(page); + admin = new Administration(page); + flexTab = new FlexTab(page); + sideNav = new SideNav(page); + mainContent = new MainContent(page); + + await page.goto('/'); + await loginPage.login(adminLogin); + await sideNav.general().click(); + await page.goto('/admin/users'); + }); + + test('expect create a user via admin view', async () => { + await flexTab.usersAddUserTab().click(); + await flexTab.usersAddUserName().type(userToBeCreated.name); + await flexTab.usersAddUserUsername().type(userToBeCreated.username ?? ''); + await flexTab.usersAddUserEmail().type(userToBeCreated.email); + await flexTab.usersAddUserVerifiedCheckbox().click(); + await flexTab.usersAddUserPassword().type(userToBeCreated.password); + await flexTab.doAddRole('user'); + await flexTab.usersButtonSave().click(); + }); + + test('expect user be show on list', async () => { + await admin.usersFilter().type(userToBeCreated.email, { delay: 200 }); + expect(await admin.userInTable(userToBeCreated.email).isVisible()).toBeTruthy(); + }); + + test.describe('disable "userToBeCreated" permissions', () => { + test('expect open permissions table', async () => { + await admin.permissionsLink().click(); + }); + + test('expect remove "mention all" permission from user', async () => { + await admin.inputPermissionsSearch().type('all'); + + if (await admin.getCheckboxPermission('Mention All').locator('input').isChecked()) { + await admin.getCheckboxPermission('Mention All').click(); + } + }); + + test('expect remove "delete message" permission from user', async () => { + await admin.inputPermissionsSearch().click({ clickCount: 3 }); + await page.keyboard.press(BACKSPACE); + await admin.inputPermissionsSearch().type('delete'); + + if (await admin.getCheckboxPermission('Delete Own Message').locator('input').isChecked()) { + await admin.getCheckboxPermission('Delete Own Message').click(); + } + }); + }); + + test.describe('assert "userToBeCreated" permissions', () => { + test.beforeAll(async () => { + await sideNav.doLogout(); + await loginPage.goto('/'); + await loginPage.login(userToBeCreated); + await sideNav.general().click(); + }); + + test('expect not be abble to "mention all"', async () => { + await mainContent.sendMessage('@all any_message'); + + expect(mainContent.lastMessage()).toContainText('not allowed'); + }); + + test('expect not be abble to "delete own message"', async () => { + await mainContent.doReload(); + await mainContent.sendMessage(`any_message_${uuid()}`); + await mainContent.openMessageActionMenu(); + + expect(await page.isVisible('[data-qa-id="delete-message"]')).toBeFalsy(); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/utils/interfaces/Login.ts b/apps/meteor/tests/e2e/utils/interfaces/Login.ts index fdba700a1851..d49214aa628a 100644 --- a/apps/meteor/tests/e2e/utils/interfaces/Login.ts +++ b/apps/meteor/tests/e2e/utils/interfaces/Login.ts @@ -7,4 +7,5 @@ export interface IRegister { email: string; password: string; name: string; + username?: string; } diff --git a/apps/meteor/tests/e2e/utils/mocks/userAndPasswordMock.ts b/apps/meteor/tests/e2e/utils/mocks/userAndPasswordMock.ts index 251dd75ee87a..68aaadc80950 100644 --- a/apps/meteor/tests/e2e/utils/mocks/userAndPasswordMock.ts +++ b/apps/meteor/tests/e2e/utils/mocks/userAndPasswordMock.ts @@ -28,6 +28,13 @@ export const registerUser: IRegister = { name: faker.name.findName(), }; +export const createRegisterUser = (): IRegister => ({ + email: validEmail, + password: 'any_password', + name: faker.name.findName(), + username: faker.internet.userName(), +}); + export const validUser: ILogin = { email: validEmail, password: 'any_password', diff --git a/apps/meteor/tests/e2e/utils/pageobjects/Administration.ts b/apps/meteor/tests/e2e/utils/pageobjects/Administration.ts index 391bedcc9536..d61ba6c522b8 100644 --- a/apps/meteor/tests/e2e/utils/pageobjects/Administration.ts +++ b/apps/meteor/tests/e2e/utils/pageobjects/Administration.ts @@ -695,6 +695,14 @@ export default class Administration extends BasePage { await this.buttonSave().click(); } + public inputPermissionsSearch(): Locator { + return this.getPage().locator('.main-content input[placeholder="Search"]'); + } + + public getCheckboxPermission(label: string, column = 6): Locator { + return this.getPage().locator(`tr td:has-text("${label}") ~ td:nth-child(${column})`).locator('label').first(); + } + public userInfoActions(): Locator { return this.getPage().locator('[data-qa-id="UserInfoActions"]'); } diff --git a/apps/meteor/tests/e2e/utils/pageobjects/FlexTab.ts b/apps/meteor/tests/e2e/utils/pageobjects/FlexTab.ts index 038d0e00d794..ca31a404944d 100644 --- a/apps/meteor/tests/e2e/utils/pageobjects/FlexTab.ts +++ b/apps/meteor/tests/e2e/utils/pageobjects/FlexTab.ts @@ -316,7 +316,7 @@ class FlexTab extends BasePage { } public usersAddUserEmail(): Locator { - return this.getPage().locator('//label[text()="Email"]/following-sibling::span//input/following-sibling::span//i'); + return this.getPage().locator('//label[text()="Email"]/following-sibling::span//input').first(); } public usersAddUserRoleList(): Locator { @@ -548,6 +548,11 @@ class FlexTab extends BasePage { 'div.thread-list.js-scroll-thread ul.thread [data-qa-type="message"]:last-child div.message-body-wrapper [data-qa-type="message-body"]', ); } + + public async doAddRole(role: string): Promise { + await this.usersAddUserRoleList().click(); + await this.getPage().locator(`li[value=${role}]`).click(); + } } export default FlexTab; diff --git a/apps/meteor/tests/e2e/utils/pageobjects/MainContent.ts b/apps/meteor/tests/e2e/utils/pageobjects/MainContent.ts index 4ddfc5065821..5008609aaf8f 100644 --- a/apps/meteor/tests/e2e/utils/pageobjects/MainContent.ts +++ b/apps/meteor/tests/e2e/utils/pageobjects/MainContent.ts @@ -440,7 +440,7 @@ export default class MainContent extends BasePage { return this.getPage().locator('[data-qa="UserCard"] a'); } - public async reload(): Promise { + public async doReload(): Promise { await this.getPage().reload({ waitUntil: 'load' }); await this.getPage().waitForSelector('.messages-box'); } diff --git a/apps/meteor/tests/e2e/utils/pageobjects/SideNav.ts b/apps/meteor/tests/e2e/utils/pageobjects/SideNav.ts index fac4223bb61b..685417245dee 100644 --- a/apps/meteor/tests/e2e/utils/pageobjects/SideNav.ts +++ b/apps/meteor/tests/e2e/utils/pageobjects/SideNav.ts @@ -245,6 +245,12 @@ class SideNav extends BasePage { await this.searchInput().type(target, { delay: 300 }); await this.getPage().keyboard.press(ENTER); } + + public async doLogout(): Promise { + await this.getPage().goto('/home'); + await this.sidebarUserMenu().click(); + await this.logout().click(); + } } export default SideNav; diff --git a/apps/meteor/tests/e2e/utils/pageobjects/index.ts b/apps/meteor/tests/e2e/utils/pageobjects/index.ts new file mode 100644 index 000000000000..3a0e4236cff2 --- /dev/null +++ b/apps/meteor/tests/e2e/utils/pageobjects/index.ts @@ -0,0 +1,9 @@ +export { default as Administration } from './Administration'; +export { default as ChannelCreation } from './ChannelCreation'; +export { default as FlexTab } from './FlexTab'; +export { default as Global } from './Global'; +export { default as LoginPage } from './LoginPage'; +export { default as MainContent } from './MainContent'; +export { default as PreferencesMainContent } from './PreferencesMainContent'; +export { default as SetupWizard } from './SetupWizard'; +export { default as SideNav } from './SideNav'; From 59c52e31e4ba2b4b64491b1d37caa03cdbec78aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Felchar?= <11652381+cauefcr@users.noreply.github.com> Date: Thu, 19 May 2022 16:32:06 -0300 Subject: [PATCH 10/50] [FIX] User abandonment setting is working again (#25520) --- apps/meteor/ee/app/livechat-enterprise/server/startup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/meteor/ee/app/livechat-enterprise/server/startup.ts b/apps/meteor/ee/app/livechat-enterprise/server/startup.ts index 6a167d97ae7b..b7953c235d11 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/startup.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/startup.ts @@ -20,7 +20,7 @@ settings.change('Livechat_max_queue_wait_time', function () { }); Meteor.startup(async function () { - settings.change('Livechat_abandoned_rooms_action', function (value) { + settings.watch('Livechat_abandoned_rooms_action', function (value) { updatePredictedVisitorAbandonment(); if (!value || value === 'none') { return visitorActivityMonitor.stop(); From 42442d22becfdea4b2365c9019d7fc97b24eebaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Thu, 19 May 2022 18:42:27 -0300 Subject: [PATCH 11/50] Chore: Convert apps/meteor/client/views/admin/settings (#25565) --- .../settings/{GroupPageSkeleton.js => GroupPageSkeleton.tsx} | 4 ++-- .../{ResetSettingButton.js => ResetSettingButton.tsx} | 4 ++-- .../settings/{SectionSkeleton.js => SectionSkeleton.tsx} | 4 ++-- .../settings/{SettingSkeleton.js => SettingSkeleton.tsx} | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) rename apps/meteor/client/views/admin/settings/{GroupPageSkeleton.js => GroupPageSkeleton.tsx} (89%) rename apps/meteor/client/views/admin/settings/{ResetSettingButton.js => ResetSettingButton.tsx} (70%) rename apps/meteor/client/views/admin/settings/{SectionSkeleton.js => SectionSkeleton.tsx} (83%) rename apps/meteor/client/views/admin/settings/{SettingSkeleton.js => SettingSkeleton.tsx} (76%) diff --git a/apps/meteor/client/views/admin/settings/GroupPageSkeleton.js b/apps/meteor/client/views/admin/settings/GroupPageSkeleton.tsx similarity index 89% rename from apps/meteor/client/views/admin/settings/GroupPageSkeleton.js rename to apps/meteor/client/views/admin/settings/GroupPageSkeleton.tsx index f5407e8af044..9d275e06e0db 100644 --- a/apps/meteor/client/views/admin/settings/GroupPageSkeleton.js +++ b/apps/meteor/client/views/admin/settings/GroupPageSkeleton.tsx @@ -1,11 +1,11 @@ import { Accordion, Box, Button, ButtonGroup, Skeleton } from '@rocket.chat/fuselage'; import { useTranslation } from '@rocket.chat/ui-contexts'; -import React, { useMemo } from 'react'; +import React, { ReactElement, useMemo } from 'react'; import Page from '../../../components/Page'; import Section from './Section'; -function GroupPageSkeleton() { +function GroupPageSkeleton(): ReactElement { const t = useTranslation(); return ( diff --git a/apps/meteor/client/views/admin/settings/ResetSettingButton.js b/apps/meteor/client/views/admin/settings/ResetSettingButton.tsx similarity index 70% rename from apps/meteor/client/views/admin/settings/ResetSettingButton.js rename to apps/meteor/client/views/admin/settings/ResetSettingButton.tsx index 9cb8f8123c6c..3db4f7a17cd8 100644 --- a/apps/meteor/client/views/admin/settings/ResetSettingButton.js +++ b/apps/meteor/client/views/admin/settings/ResetSettingButton.tsx @@ -1,8 +1,8 @@ import { Button, Icon } from '@rocket.chat/fuselage'; import { useTranslation } from '@rocket.chat/ui-contexts'; -import React from 'react'; +import React, { ComponentProps, ReactElement } from 'react'; -function ResetSettingButton(props) { +function ResetSettingButton(props: ComponentProps): ReactElement { const t = useTranslation(); return ( diff --git a/apps/meteor/client/views/admin/settings/SectionSkeleton.js b/apps/meteor/client/views/admin/settings/SectionSkeleton.tsx similarity index 83% rename from apps/meteor/client/views/admin/settings/SectionSkeleton.js rename to apps/meteor/client/views/admin/settings/SectionSkeleton.tsx index 2524e5b8a5a6..3d76a5ac49fc 100644 --- a/apps/meteor/client/views/admin/settings/SectionSkeleton.js +++ b/apps/meteor/client/views/admin/settings/SectionSkeleton.tsx @@ -1,9 +1,9 @@ import { Accordion, Box, FieldGroup, Skeleton } from '@rocket.chat/fuselage'; -import React from 'react'; +import React, { ReactElement } from 'react'; import Setting from './Setting'; -function SectionSkeleton() { +function SectionSkeleton(): ReactElement { return ( }> diff --git a/apps/meteor/client/views/admin/settings/SettingSkeleton.js b/apps/meteor/client/views/admin/settings/SettingSkeleton.tsx similarity index 76% rename from apps/meteor/client/views/admin/settings/SettingSkeleton.js rename to apps/meteor/client/views/admin/settings/SettingSkeleton.tsx index 80c9c0cb7e63..ce26dfcce52c 100644 --- a/apps/meteor/client/views/admin/settings/SettingSkeleton.js +++ b/apps/meteor/client/views/admin/settings/SettingSkeleton.tsx @@ -1,7 +1,7 @@ import { Field, Flex, InputBox, Skeleton } from '@rocket.chat/fuselage'; -import React from 'react'; +import React, { ReactElement } from 'react'; -const SettingSkeleton = () => ( +const SettingSkeleton = (): ReactElement => ( From b893ffdc20123b7cd9d17ab6f9061df10f86f4f6 Mon Sep 17 00:00:00 2001 From: Leonardo Ostjen Couto Date: Thu, 19 May 2022 20:39:38 -0300 Subject: [PATCH 12/50] [NEW] New stats rewrite (#25078) Co-authored-by: matheusbsilva137 Co-authored-by: Diego Sampaio --- .../app/importer-csv/server/importer.js | 5 ++- .../server/importer.js | 2 + .../importer-slack-users/server/importer.js | 2 + .../app/importer-slack/server/importer.js | 3 +- .../lib/server/methods/sendInvitationEmail.js | 6 ++- apps/meteor/app/lib/server/startup/email.ts | 5 +++ .../meteor/app/lib/server/startup/settings.ts | 20 +++++++++ apps/meteor/app/models/server/models/Rooms.js | 1 + .../app/models/server/models/Settings.js | 4 +- apps/meteor/app/models/server/models/Users.js | 3 ++ apps/meteor/app/models/server/raw/Invites.ts | 8 ++++ apps/meteor/app/models/server/raw/Messages.js | 42 +++++++++++++++++ apps/meteor/app/models/server/raw/Rooms.js | 17 +++++++ apps/meteor/app/models/server/raw/Users.js | 16 +++++++ .../server/lib/getImporterStatistics.ts | 10 +++++ .../server/lib/getServicesStatistics.ts | 45 +++++++++++-------- .../app/statistics/server/lib/statistics.ts | 26 ++++++++++- .../admin/info/DeploymentCard.stories.tsx | 25 +++++------ .../admin/info/InformationPage.stories.tsx | 25 +++++------ .../views/admin/info/UsageCard.stories.tsx | 25 +++++------ .../client/views/admin/users/AddUser.js | 4 ++ apps/meteor/server/sdk/types/ITeamService.ts | 3 +- apps/meteor/server/services/team/service.ts | 44 +++--------------- packages/core-typings/src/IStats.ts | 19 ++++++++ packages/core-typings/src/ITeam.ts | 13 +----- 25 files changed, 255 insertions(+), 118 deletions(-) create mode 100644 apps/meteor/app/statistics/server/lib/getImporterStatistics.ts diff --git a/apps/meteor/app/importer-csv/server/importer.js b/apps/meteor/app/importer-csv/server/importer.js index ce92a08c235d..d4d3d014dbfa 100644 --- a/apps/meteor/app/importer-csv/server/importer.js +++ b/apps/meteor/app/importer-csv/server/importer.js @@ -1,7 +1,7 @@ import { Random } from 'meteor/random'; import { Base, ProgressStep, ImporterWebsocket } from '../../importer/server'; -import { Users } from '../../models/server'; +import { Users, Settings as SettingsRaw } from '../../models/server'; export class CsvImporter extends Base { constructor(info, importRecord) { @@ -119,7 +119,8 @@ export class CsvImporter extends Base { }); } - super.updateRecord({ 'count.users': parsedUsers.length }); + SettingsRaw.incrementValueById('CSV_Importer_Count', usersCount); + super.updateRecord({ 'count.users': usersCount }); return increaseProgressCount(); } diff --git a/apps/meteor/app/importer-hipchat-enterprise/server/importer.js b/apps/meteor/app/importer-hipchat-enterprise/server/importer.js index c2c05c34032f..0e1fed9db759 100644 --- a/apps/meteor/app/importer-hipchat-enterprise/server/importer.js +++ b/apps/meteor/app/importer-hipchat-enterprise/server/importer.js @@ -5,6 +5,7 @@ import fs from 'fs'; import { Meteor } from 'meteor/meteor'; import { Base, ProgressStep } from '../../importer/server'; +import { Settings as SettingsRaw } from '../../models/server'; export class HipChatEnterpriseImporter extends Base { constructor(info, importRecord) { @@ -52,6 +53,7 @@ export class HipChatEnterpriseImporter extends Base { this.converter.addUser(newUser); } + SettingsRaw.incrementValueById('Hipchat_Enterprise_Importer_Count', count); super.updateRecord({ 'count.users': count }); super.addCountToTotal(count); } diff --git a/apps/meteor/app/importer-slack-users/server/importer.js b/apps/meteor/app/importer-slack-users/server/importer.js index 08c2992c766c..5fcf3924499b 100644 --- a/apps/meteor/app/importer-slack-users/server/importer.js +++ b/apps/meteor/app/importer-slack-users/server/importer.js @@ -5,6 +5,7 @@ import { Random } from 'meteor/random'; import { RawImports, Base, ProgressStep, Selection, SelectionUser } from '../../importer/server'; import { RocketChatFile } from '../../file'; import { Users } from '../../models'; +import { Settings as SettingsRaw } from '../../models/server'; export class SlackUsersImporter extends Base { constructor(info, importRecord) { @@ -164,6 +165,7 @@ export class SlackUsersImporter extends Base { }); } + SettingsRaw.incrementValueById('Slack_Users_Importer_Count', this.users.users.length); super.updateProgress(ProgressStep.FINISHING); super.updateProgress(ProgressStep.DONE); } catch (e) { diff --git a/apps/meteor/app/importer-slack/server/importer.js b/apps/meteor/app/importer-slack/server/importer.js index e2270576fcc5..8a9caa1775fe 100644 --- a/apps/meteor/app/importer-slack/server/importer.js +++ b/apps/meteor/app/importer-slack/server/importer.js @@ -1,7 +1,7 @@ import _ from 'underscore'; import { Base, ProgressStep, ImporterWebsocket } from '../../importer/server'; -import { Messages, ImportData } from '../../models/server'; +import { Messages, ImportData, Settings as SettingsRaw } from '../../models/server'; import { settings } from '../../settings/server'; import { MentionsParser } from '../../mentions/lib/MentionsParser'; import { getUserAvatarURL } from '../../utils/lib/getUserAvatarURL'; @@ -155,6 +155,7 @@ export class SlackImporter extends Base { } this.converter.addUser(newUser); + SettingsRaw.incrementValueById('Slack_Importer_Count'); } } diff --git a/apps/meteor/app/lib/server/methods/sendInvitationEmail.js b/apps/meteor/app/lib/server/methods/sendInvitationEmail.js index f5927e8c5a0e..89cbdce9eb97 100644 --- a/apps/meteor/app/lib/server/methods/sendInvitationEmail.js +++ b/apps/meteor/app/lib/server/methods/sendInvitationEmail.js @@ -4,6 +4,7 @@ import { check } from 'meteor/check'; import * as Mailer from '../../../mailer'; import { hasPermission } from '../../../authorization'; import { settings } from '../../../settings'; +import { Settings as SettingsRaw } from '../../../models/server'; let html = ''; Meteor.startup(() => { @@ -37,7 +38,7 @@ Meteor.methods({ return validEmails.filter((email) => { try { - return Mailer.send({ + const mailerResult = Mailer.send({ to: email, from: settings.get('From_Email'), subject, @@ -46,6 +47,9 @@ Meteor.methods({ email, }, }); + + SettingsRaw.incrementValueById('Invitation_Email_Count'); + return mailerResult; } catch ({ message }) { throw new Meteor.Error('error-email-send-failed', `Error trying to send email: ${message}`, { method: 'sendInvitationEmail', diff --git a/apps/meteor/app/lib/server/startup/email.ts b/apps/meteor/app/lib/server/startup/email.ts index b5e1d2f938c0..470599a41d52 100644 --- a/apps/meteor/app/lib/server/startup/email.ts +++ b/apps/meteor/app/lib/server/startup/email.ts @@ -474,6 +474,11 @@ settingsRegistry.addGroup('Email', function () { ); }); + this.add('Invitation_Email_Count', 0, { + type: 'int', + hidden: true, + }); + this.section('Forgot_password_section', function () { this.add('Forgot_Password_Email_Subject', '{Forgot_Password_Email_Subject}', { type: 'string', diff --git a/apps/meteor/app/lib/server/startup/settings.ts b/apps/meteor/app/lib/server/startup/settings.ts index b81c4e52d237..8683597ef833 100644 --- a/apps/meteor/app/lib/server/startup/settings.ts +++ b/apps/meteor/app/lib/server/startup/settings.ts @@ -180,6 +180,26 @@ settingsRegistry.addGroup('Accounts', function () { type: 'string', hidden: true, }); + this.add('Manual_Entry_User_Count', 0, { + type: 'int', + hidden: true, + }); + this.add('CSV_Importer_Count', 0, { + type: 'int', + hidden: true, + }); + this.add('Hipchat_Enterprise_Importer_Count', 0, { + type: 'int', + hidden: true, + }); + this.add('Slack_Importer_Count', 0, { + type: 'int', + hidden: true, + }); + this.add('Slack_Users_Importer_Count', 0, { + type: 'int', + hidden: true, + }); this.add('Accounts_UseDefaultBlockedDomainsList', true, { type: 'boolean', }); diff --git a/apps/meteor/app/models/server/models/Rooms.js b/apps/meteor/app/models/server/models/Rooms.js index bc8932afe570..593fdab626da 100644 --- a/apps/meteor/app/models/server/models/Rooms.js +++ b/apps/meteor/app/models/server/models/Rooms.js @@ -26,6 +26,7 @@ export class Rooms extends Base { // field used for DMs only this.tryEnsureIndex({ uids: 1 }, { sparse: true }); this.tryEnsureIndex({ createdOTR: 1 }, { sparse: true }); + this.tryEnsureIndex({ encrypted: 1 }, { sparse: true }); // used on statistics this.tryEnsureIndex( { diff --git a/apps/meteor/app/models/server/models/Settings.js b/apps/meteor/app/models/server/models/Settings.js index 19d7059e76a7..c2ef98d35476 100644 --- a/apps/meteor/app/models/server/models/Settings.js +++ b/apps/meteor/app/models/server/models/Settings.js @@ -145,7 +145,7 @@ export class Settings extends Base { return this.update(query, update); } - incrementValueById(_id) { + incrementValueById(_id, value = 1) { const query = { blocked: { $ne: true }, _id, @@ -153,7 +153,7 @@ export class Settings extends Base { const update = { $inc: { - value: 1, + value, }, }; diff --git a/apps/meteor/app/models/server/models/Users.js b/apps/meteor/app/models/server/models/Users.js index 0a794af7e32f..3e8eb705d3d3 100644 --- a/apps/meteor/app/models/server/models/Users.js +++ b/apps/meteor/app/models/server/models/Users.js @@ -60,6 +60,9 @@ export class Users extends Base { this.tryEnsureIndex({ extension: 1 }, { sparse: true, unique: true }); this.tryEnsureIndex({ language: 1 }, { sparse: true }); + this.tryEnsureIndex({ 'active': 1, 'services.email2fa.enabled': 1 }, { sparse: true }); // used by statistics + this.tryEnsureIndex({ 'active': 1, 'services.totp.enabled': 1 }, { sparse: true }); // used by statistics + const collectionObj = this.model.rawCollection(); this.findAndModify = Meteor.wrapAsync(collectionObj.findAndModify, collectionObj); } diff --git a/apps/meteor/app/models/server/raw/Invites.ts b/apps/meteor/app/models/server/raw/Invites.ts index 2f3e9d835a92..ef55e009ca8e 100644 --- a/apps/meteor/app/models/server/raw/Invites.ts +++ b/apps/meteor/app/models/server/raw/Invites.ts @@ -27,4 +27,12 @@ export class InvitesRaw extends BaseRaw { }, ); } + + async countUses(): Promise { + const [result] = await this.col + .aggregate<{ totalUses: number } | undefined>([{ $group: { _id: null, totalUses: { $sum: '$uses' } } }]) + .toArray(); + + return result?.totalUses || 0; + } } diff --git a/apps/meteor/app/models/server/raw/Messages.js b/apps/meteor/app/models/server/raw/Messages.js index ce0343ded065..7f84cac25420 100644 --- a/apps/meteor/app/models/server/raw/Messages.js +++ b/apps/meteor/app/models/server/raw/Messages.js @@ -188,4 +188,46 @@ export class MessagesRaw extends BaseRaw { options, ); } + + async countRoomsWithStarredMessages(options) { + const [queryResult] = await this.col + .aggregate( + [{ $match: { 'starred._id': { $exists: true } } }, { $group: { _id: '$rid' } }, { $group: { _id: null, total: { $sum: 1 } } }], + options, + ) + .toArray(); + + return queryResult?.total || 0; + } + + async countRoomsWithPinnedMessages(options) { + const [queryResult] = await this.col + .aggregate([{ $match: { pinned: true } }, { $group: { _id: '$rid' } }, { $group: { _id: null, total: { $sum: 1 } } }], options) + .toArray(); + + return queryResult?.total || 0; + } + + async countE2EEMessages(options) { + return this.find({ t: 'e2e' }, options).count(); + } + + findPinned(options) { + const query = { + t: { $ne: 'rm' }, + _hidden: { $ne: true }, + pinned: true, + }; + + return this.find(query, options); + } + + findStarred(options) { + const query = { + '_hidden': { $ne: true }, + 'starred._id': { $exists: true }, + }; + + return this.find(query, options); + } } diff --git a/apps/meteor/app/models/server/raw/Rooms.js b/apps/meteor/app/models/server/raw/Rooms.js index a7e338db5f68..1f147c87966f 100644 --- a/apps/meteor/app/models/server/raw/Rooms.js +++ b/apps/meteor/app/models/server/raw/Rooms.js @@ -460,4 +460,21 @@ export class RoomsRaw extends BaseRaw { }, ]); } + + findByE2E(options) { + return this.find( + { + encrypted: true, + }, + options, + ); + } + + findRoomsInsideTeams(autoJoin = false) { + return this.find({ + teamId: { $exists: true }, + teamMain: { $exists: false }, + ...(autoJoin && { teamDefault: true }), + }); + } } diff --git a/apps/meteor/app/models/server/raw/Users.js b/apps/meteor/app/models/server/raw/Users.js index 29dfd1c3a49f..c6b4f0809d22 100644 --- a/apps/meteor/app/models/server/raw/Users.js +++ b/apps/meteor/app/models/server/raw/Users.js @@ -999,4 +999,20 @@ export class UsersRaw extends BaseRaw { return this.find(query, options); } + + findActiveUsersTOTPEnable(options) { + const query = { + 'active': true, + 'services.totp.enabled': true, + }; + return this.find(query, options); + } + + findActiveUsersEmail2faEnable(options) { + const query = { + 'active': true, + 'services.email2fa.enabled': true, + }; + return this.find(query, options); + } } diff --git a/apps/meteor/app/statistics/server/lib/getImporterStatistics.ts b/apps/meteor/app/statistics/server/lib/getImporterStatistics.ts new file mode 100644 index 000000000000..0f8fc5beccc5 --- /dev/null +++ b/apps/meteor/app/statistics/server/lib/getImporterStatistics.ts @@ -0,0 +1,10 @@ +import { settings } from '../../../settings/server'; + +export function getImporterStatistics(): Record { + return { + totalCSVImportedUsers: settings.get('CSV_Importer_Count'), + totalHipchatEnterpriseImportedUsers: settings.get('Hipchat_Enterprise_Importer_Count'), + totalSlackImportedUsers: settings.get('Slack_Importer_Count'), + totalSlackUsersImportedUsers: settings.get('Slack_Users_Importer_Count'), + }; +} diff --git a/apps/meteor/app/statistics/server/lib/getServicesStatistics.ts b/apps/meteor/app/statistics/server/lib/getServicesStatistics.ts index b41cbb2d8385..b0aec1438019 100644 --- a/apps/meteor/app/statistics/server/lib/getServicesStatistics.ts +++ b/apps/meteor/app/statistics/server/lib/getServicesStatistics.ts @@ -1,6 +1,11 @@ +import { MongoInternals } from 'meteor/mongo'; + +import { readSecondaryPreferred } from '../../../../server/database/readSecondaryPreferred'; import { settings } from '../../../settings/server'; import { Users } from '../../../models/server'; +const { db } = MongoInternals.defaultRemoteCollectionDriver().mongo; + function getCustomOAuthServices(): Record< string, { @@ -9,6 +14,8 @@ function getCustomOAuthServices(): Record< users: number; } > { + const readPreference = readSecondaryPreferred(db); + const customOauth = settings.getByRegexp(/Accounts_OAuth_Custom-[^-]+$/im); return Object.fromEntries( Object.entries(customOauth).map(([key, value]) => { @@ -18,7 +25,7 @@ function getCustomOAuthServices(): Record< { enabled: Boolean(value), mergeRoles: settings.get(`Accounts_OAuth_Custom-${name}-merge_roles`), - users: Users.countActiveUsersByService(name), + users: Users.countActiveUsersByService(name, { readPreference }), }, ]; }), @@ -26,9 +33,11 @@ function getCustomOAuthServices(): Record< } export function getServicesStatistics(): Record { + const readPreference = readSecondaryPreferred(db); + return { ldap: { - users: Users.countActiveUsersByService('ldap'), + users: Users.countActiveUsersByService('ldap', { readPreference }), enabled: settings.get('LDAP_Enable'), loginFallback: settings.get('LDAP_Login_Fallback'), encryption: settings.get('LDAP_Encryption'), @@ -53,7 +62,7 @@ export function getServicesStatistics(): Record { }, saml: { enabled: settings.get('SAML_Custom_Default'), - users: Users.countActiveUsersByService('saml'), + users: Users.countActiveUsersByService('saml', { readPreference }), signatureValidationType: settings.get('SAML_Custom_Default_signature_validation_type'), generateUsername: settings.get('SAML_Custom_Default_generate_username'), updateSubscriptionsOnLogin: settings.get('SAML_Custom_Default_channels_update'), @@ -61,66 +70,66 @@ export function getServicesStatistics(): Record { }, cas: { enabled: settings.get('CAS_enabled'), - users: Users.countActiveUsersByService('cas'), + users: Users.countActiveUsersByService('cas', { readPreference }), allowUserCreation: settings.get('CAS_Creation_User_Enabled'), alwaysSyncUserData: settings.get('CAS_Sync_User_Data_Enabled'), }, oauth: { apple: { enabled: settings.get('Accounts_OAuth_Apple'), - users: Users.countActiveUsersByService('apple'), + users: Users.countActiveUsersByService('apple', { readPreference }), }, dolphin: { enabled: settings.get('Accounts_OAuth_Dolphin'), - users: Users.countActiveUsersByService('dolphin'), + users: Users.countActiveUsersByService('dolphin', { readPreference }), }, drupal: { enabled: settings.get('Accounts_OAuth_Drupal'), - users: Users.countActiveUsersByService('drupal'), + users: Users.countActiveUsersByService('drupal', { readPreference }), }, facebook: { enabled: settings.get('Accounts_OAuth_Facebook'), - users: Users.countActiveUsersByService('facebook'), + users: Users.countActiveUsersByService('facebook', { readPreference }), }, github: { enabled: settings.get('Accounts_OAuth_Github'), - users: Users.countActiveUsersByService('github'), + users: Users.countActiveUsersByService('github', { readPreference }), }, githubEnterprise: { enabled: settings.get('Accounts_OAuth_GitHub_Enterprise'), - users: Users.countActiveUsersByService('github_enterprise'), + users: Users.countActiveUsersByService('github_enterprise', { readPreference }), }, gitlab: { enabled: settings.get('Accounts_OAuth_Gitlab'), - users: Users.countActiveUsersByService('gitlab'), + users: Users.countActiveUsersByService('gitlab', { readPreference }), }, google: { enabled: settings.get('Accounts_OAuth_Google'), - users: Users.countActiveUsersByService('google'), + users: Users.countActiveUsersByService('google', { readPreference }), }, linkedin: { enabled: settings.get('Accounts_OAuth_Linkedin'), - users: Users.countActiveUsersByService('linkedin'), + users: Users.countActiveUsersByService('linkedin', { readPreference }), }, meteor: { enabled: settings.get('Accounts_OAuth_Meteor'), - users: Users.countActiveUsersByService('meteor'), + users: Users.countActiveUsersByService('meteor', { readPreference }), }, nextcloud: { enabled: settings.get('Accounts_OAuth_Nextcloud'), - users: Users.countActiveUsersByService('nextcloud'), + users: Users.countActiveUsersByService('nextcloud', { readPreference }), }, tokenpass: { enabled: settings.get('Accounts_OAuth_Tokenpass'), - users: Users.countActiveUsersByService('tokenpass'), + users: Users.countActiveUsersByService('tokenpass', { readPreference }), }, twitter: { enabled: settings.get('Accounts_OAuth_Twitter'), - users: Users.countActiveUsersByService('twitter'), + users: Users.countActiveUsersByService('twitter', { readPreference }), }, wordpress: { enabled: settings.get('Accounts_OAuth_Wordpress'), - users: Users.countActiveUsersByService('wordpress'), + users: Users.countActiveUsersByService('wordpress', { readPreference }), }, custom: getCustomOAuthServices(), }, diff --git a/apps/meteor/app/statistics/server/lib/statistics.ts b/apps/meteor/app/statistics/server/lib/statistics.ts index 9471d1d1c1eb..051456c55ae7 100644 --- a/apps/meteor/app/statistics/server/lib/statistics.ts +++ b/apps/meteor/app/statistics/server/lib/statistics.ts @@ -18,6 +18,7 @@ import { Statistics, Sessions, Integrations, + Invites, Uploads, LivechatDepartment, EmailInbox, @@ -27,9 +28,10 @@ import { } from '../../../models/server/raw'; import { readSecondaryPreferred } from '../../../../server/database/readSecondaryPreferred'; import { getAppsStatistics } from './getAppsStatistics'; +import { getImporterStatistics } from './getImporterStatistics'; import { getServicesStatistics } from './getServicesStatistics'; import { getStatistics as getEnterpriseStatistics } from '../../../../ee/app/license/server'; -import { Analytics } from '../../../../server/sdk'; +import { Analytics, Team } from '../../../../server/sdk'; import { getSettingsStatistics } from '../../../../server/lib/statistics/getSettingsStatistics'; const wizardFields = ['Organization_Type', 'Industry', 'Size', 'Country', 'Language', 'Server_Type', 'Register_Server']; @@ -395,6 +397,7 @@ export const statistics = { statistics.apps = getAppsStatistics(); statistics.services = getServicesStatistics(); + statistics.importer = getImporterStatistics(); // If getSettingsStatistics() returns an error, save as empty object. statsPms.push( @@ -448,6 +451,12 @@ export const statistics = { }), ); + statsPms.push( + Team.getStatistics().then((result) => { + statistics.teams = result; + }), + ); + statsPms.push(Analytics.resetSeatRequestCount()); statistics.dashboardCount = settings.get('Engagement_Dashboard_Load_Count'); @@ -457,6 +466,21 @@ export const statistics = { statistics.slashCommandsJitsi = settings.get('Jitsi_Start_SlashCommands_Count'); statistics.totalOTRRooms = Rooms.findByCreatedOTR().count(); statistics.totalOTR = settings.get('OTR_Count'); + statistics.totalRoomsWithStarred = await MessagesRaw.countRoomsWithStarredMessages({ readPreference }); + statistics.totalRoomsWithPinned = await MessagesRaw.countRoomsWithPinnedMessages({ readPreference }); + statistics.totalUserTOTP = await UsersRaw.findActiveUsersTOTPEnable({ readPreference }).count(); + statistics.totalUserEmail2fa = await UsersRaw.findActiveUsersEmail2faEnable({ readPreference }).count(); + statistics.totalPinned = await MessagesRaw.findPinned({ readPreference }).count(); + statistics.totalStarred = await MessagesRaw.findStarred({ readPreference }).count(); + statistics.totalLinkInvitation = await Invites.find().count(); + statistics.totalLinkInvitationUses = await Invites.countUses(); + statistics.totalEmailInvitation = settings.get('Invitation_Email_Count'); + statistics.totalE2ERooms = await RoomsRaw.findByE2E({ readPreference }).count(); + statistics.logoChange = Object.keys(settings.get('Assets_logo')).includes('url'); + statistics.homeTitleChanged = settings.get('Layout_Home_Title') !== 'Home'; + statistics.showHomeButton = settings.get('Layout_Show_Home_Button'); + statistics.totalEncryptedMessages = await MessagesRaw.countE2EEMessages({ readPreference }); + statistics.totalManuallyAddedUsers = settings.get('Manual_Entry_User_Count'); await Promise.all(statsPms).catch(log); diff --git a/apps/meteor/client/views/admin/info/DeploymentCard.stories.tsx b/apps/meteor/client/views/admin/info/DeploymentCard.stories.tsx index 3e37793b83d8..aa8eb90a6b03 100644 --- a/apps/meteor/client/views/admin/info/DeploymentCard.stories.tsx +++ b/apps/meteor/client/views/admin/info/DeploymentCard.stories.tsx @@ -73,18 +73,8 @@ export default { userLanguages: {}, teams: { totalTeams: 0, - teamStats: [ - { - teamId: '', - mainRoom: '', - totalRooms: 0, - totalMessages: 0, - totalPublicRooms: 0, - totalPrivateRooms: 0, - totalDefaultRooms: 0, - totalMembers: 0, - }, - ], + totalRoomsInsideTeams: 0, + totalDefaultRoomsInsideTeams: 0, }, totalLivechatVisitors: 0, totalLivechatAgents: 0, @@ -179,6 +169,7 @@ export default { totalFailed: 0, }, services: {}, + importer: {}, settings: {}, integrations: { totalIntegrations: 0, @@ -199,8 +190,7 @@ export default { }, createdAt: new Date(), showHomeButton: false, - homeTitle: '', - homeBody: '', + homeTitleChanged: false, logoChange: false, customCSS: 0, customScript: 0, @@ -228,6 +218,13 @@ export default { messageAuditLoad: 0, dashboardCount: 0, joinJitsiButton: 0, + totalLinkInvitation: 0, + roomsWithPinnedMessages: 0, + roomsWithStarredMessages: 0, + roomsInsideTeams: 0, + totalEncryptedMessages: 0, + totalLinkInvitationUses: 0, + totalManuallyAddedUsers: 0, }, instances: [], }, diff --git a/apps/meteor/client/views/admin/info/InformationPage.stories.tsx b/apps/meteor/client/views/admin/info/InformationPage.stories.tsx index 4a018a36da80..b969929cab1d 100644 --- a/apps/meteor/client/views/admin/info/InformationPage.stories.tsx +++ b/apps/meteor/client/views/admin/info/InformationPage.stories.tsx @@ -103,18 +103,8 @@ export default { userLanguages: {}, teams: { totalTeams: 0, - teamStats: [ - { - teamId: '', - mainRoom: '', - totalRooms: 0, - totalMessages: 0, - totalPublicRooms: 0, - totalPrivateRooms: 0, - totalDefaultRooms: 0, - totalMembers: 0, - }, - ], + totalRoomsInsideTeams: 0, + totalDefaultRoomsInsideTeams: 0, }, totalLivechatVisitors: 0, totalLivechatAgents: 0, @@ -209,6 +199,7 @@ export default { totalFailed: 0, }, services: {}, + importer: {}, settings: {}, integrations: { totalIntegrations: 0, @@ -229,8 +220,7 @@ export default { }, createdAt: new Date(), showHomeButton: false, - homeTitle: '', - homeBody: '', + homeTitleChanged: false, logoChange: false, customCSS: 0, customScript: 0, @@ -258,6 +248,13 @@ export default { messageAuditLoad: 0, dashboardCount: 0, joinJitsiButton: 0, + totalLinkInvitation: 0, + roomsWithPinnedMessages: 0, + roomsWithStarredMessages: 0, + roomsInsideTeams: 0, + totalEncryptedMessages: 0, + totalLinkInvitationUses: 0, + totalManuallyAddedUsers: 0, }, instances: [], }, diff --git a/apps/meteor/client/views/admin/info/UsageCard.stories.tsx b/apps/meteor/client/views/admin/info/UsageCard.stories.tsx index 90fe35cc3570..5775962fd5f5 100644 --- a/apps/meteor/client/views/admin/info/UsageCard.stories.tsx +++ b/apps/meteor/client/views/admin/info/UsageCard.stories.tsx @@ -51,18 +51,8 @@ export default { userLanguages: {}, teams: { totalTeams: 0, - teamStats: [ - { - teamId: '', - mainRoom: '', - totalRooms: 0, - totalMessages: 0, - totalPublicRooms: 0, - totalPrivateRooms: 0, - totalDefaultRooms: 0, - totalMembers: 0, - }, - ], + totalRoomsInsideTeams: 0, + totalDefaultRoomsInsideTeams: 0, }, totalLivechatVisitors: 0, totalLivechatAgents: 0, @@ -157,6 +147,7 @@ export default { totalFailed: 0, }, services: {}, + importer: {}, settings: {}, integrations: { totalIntegrations: 0, @@ -177,8 +168,7 @@ export default { }, createdAt: new Date(), showHomeButton: false, - homeTitle: '', - homeBody: '', + homeTitleChanged: false, logoChange: false, customCSS: 0, customScript: 0, @@ -206,6 +196,13 @@ export default { messageAuditLoad: 0, dashboardCount: 0, joinJitsiButton: 0, + totalLinkInvitation: 0, + roomsWithPinnedMessages: 0, + roomsWithStarredMessages: 0, + roomsInsideTeams: 0, + totalEncryptedMessages: 0, + totalLinkInvitationUses: 0, + totalManuallyAddedUsers: 0, }, }, } as ComponentMeta; diff --git a/apps/meteor/client/views/admin/users/AddUser.js b/apps/meteor/client/views/admin/users/AddUser.js index 8c644b6a55ae..010d20659b81 100644 --- a/apps/meteor/client/views/admin/users/AddUser.js +++ b/apps/meteor/client/views/admin/users/AddUser.js @@ -78,6 +78,9 @@ export function AddUser({ roles, onReload, ...props }) { ); const saveAction = useEndpointAction('POST', 'users.create', values, t('User_created_successfully!')); + const eventStats = useEndpointAction('POST', 'statistics.telemetry', { + params: [{ eventName: 'updateCounter', settingsId: 'Manual_Entry_User_Count' }], + }); const handleSave = useMutableCallback(async () => { Object.entries(values).forEach(([key, value]) => { @@ -94,6 +97,7 @@ export function AddUser({ roles, onReload, ...props }) { const result = await saveAction(); if (result.success) { + eventStats(); goToUser(result.user._id); onReload(); } diff --git a/apps/meteor/server/sdk/types/ITeamService.ts b/apps/meteor/server/sdk/types/ITeamService.ts index f18437e7af1d..1564ae5c6cdd 100644 --- a/apps/meteor/server/sdk/types/ITeamService.ts +++ b/apps/meteor/server/sdk/types/ITeamService.ts @@ -1,5 +1,5 @@ +import { IPaginationOptions, IQueryOptions, IRecordsWithTotal, ITeam, ITeamMember, ITeamStats, TEAM_TYPE } from '@rocket.chat/core-typings'; import { FilterQuery, FindOneOptions, WithoutProjection } from 'mongodb'; -import { ITeam, IRecordsWithTotal, IPaginationOptions, IQueryOptions, ITeamMember, TEAM_TYPE } from '@rocket.chat/core-typings'; import type { IRoom, IUser, IRole } from '@rocket.chat/core-typings'; import { ICreateRoomParams } from './IRoomService'; @@ -111,4 +111,5 @@ export interface ITeamService { removeMemberFromTeams(userId: string, teamIds: Array): Promise; removeAllMembersFromTeam(teamId: string): Promise; removeRolesFromMember(teamId: string, userId: string, roles: Array): Promise; + getStatistics(): Promise; } diff --git a/apps/meteor/server/services/team/service.ts b/apps/meteor/server/services/team/service.ts index e17951c04731..7df0e05958e7 100644 --- a/apps/meteor/server/services/team/service.ts +++ b/apps/meteor/server/services/team/service.ts @@ -8,7 +8,6 @@ import { addUserToRoom } from '../../../app/lib/server/functions/addUserToRoom'; import { removeUserFromRoom } from '../../../app/lib/server/functions/removeUserFromRoom'; import { getSubscribedRoomsForUserWithDetails } from '../../../app/lib/server/functions/getRoomsWithSingleOwner'; import type { InsertionModel } from '../../../app/models/server/raw/BaseRaw'; -import { MessagesRaw } from '../../../app/models/server/raw/Messages'; import { RoomsRaw } from '../../../app/models/server/raw/Rooms'; import { SubscriptionsRaw } from '../../../app/models/server/raw/Subscriptions'; import { TeamRaw } from '../../../app/models/server/raw/Team'; @@ -43,8 +42,6 @@ export class TeamService extends ServiceClassInternal implements ITeamService { private TeamMembersModel: TeamMemberRaw; - private MessagesModel: MessagesRaw; - constructor(db: Db) { super(); @@ -55,7 +52,6 @@ export class TeamService extends ServiceClassInternal implements ITeamService { }); this.TeamModel = new TeamRaw(db.collection('rocketchat_team')); this.TeamMembersModel = new TeamMemberRaw(db.collection('rocketchat_team_member')); - this.MessagesModel = new MessagesRaw(db.collection('rocketchat_message')); } async create(uid: string, { team, room = { name: team.name, extraData: {} }, members, owner }: ITeamCreateParams): Promise { @@ -958,41 +954,11 @@ export class TeamService extends ServiceClassInternal implements ITeamService { } async getStatistics(): Promise { - const stats = {} as ITeamStats; - const teams = this.TeamModel.find({}); - const teamsArray = await teams.toArray(); - - stats.totalTeams = await teams.count(); - stats.teamStats = []; - - for await (const team of teamsArray) { - // exclude the main room from the stats - const teamRooms = await this.RoomsModel.find({ - teamId: team._id, - teamMain: { $exists: false }, - }).toArray(); - const roomIds = teamRooms.map((r) => r._id); - const [totalMessagesInTeam, defaultRooms, totalMembers] = await Promise.all([ - this.MessagesModel.find({ rid: { $in: roomIds } }).count(), - this.RoomsModel.findDefaultRoomsForTeam(team._id).count(), - this.TeamMembersModel.findByTeamId(team._id).count(), - ]); - - const teamData = { - teamId: team._id, - mainRoom: team.roomId, - totalRooms: teamRooms.length, - totalMessages: totalMessagesInTeam, - totalPublicRooms: teamRooms.filter((r) => r.t === 'c').length, - totalPrivateRooms: teamRooms.filter((r) => r.t !== 'c').length, - totalDefaultRooms: defaultRooms, - totalMembers, - }; - - stats.teamStats.push(teamData); - } - - return stats; + return { + totalTeams: await this.TeamModel.find({}).count(), + totalRoomsInsideTeams: await this.RoomsModel.findRoomsInsideTeams().count(), + totalDefaultRoomsInsideTeams: await this.RoomsModel.findRoomsInsideTeams(true).count(), + }; } async autocomplete(uid: string, name: string): Promise { diff --git a/packages/core-typings/src/IStats.ts b/packages/core-typings/src/IStats.ts index 01ce617c140c..fd13428438c8 100644 --- a/packages/core-typings/src/IStats.ts +++ b/packages/core-typings/src/IStats.ts @@ -119,6 +119,7 @@ export interface IStats { totalFailed: number | false; }; services: Record; + importer: Record; settings: ISettingStatisticsObject; integrations: { totalIntegrations: number; @@ -145,4 +146,22 @@ export interface IStats { messageAuditLoad: number; dashboardCount: number; joinJitsiButton: number; + totalRoomsWithStarred: number; + totalRoomsWithPinned: number; + totalUserEmail2fa: number; + totalUserTOTP: number; + totalStarred: number; + totalPinned: number; + totalLinkInvitation: number; + totalEmailInvitation: number; + roomsWithPinnedMessages: number; + roomsWithStarredMessages: number; + totalE2ERooms: number; + logoChange: boolean; + homeTitleChanged: boolean; + roomsInsideTeams: number; + showHomeButton: boolean; + totalEncryptedMessages: number; + totalLinkInvitationUses: number; + totalManuallyAddedUsers: number; } diff --git a/packages/core-typings/src/ITeam.ts b/packages/core-typings/src/ITeam.ts index 6616af53213d..a5e4c3de31b2 100644 --- a/packages/core-typings/src/ITeam.ts +++ b/packages/core-typings/src/ITeam.ts @@ -46,19 +46,10 @@ export interface IRecordsWithTotal { total: number; } -export interface ITeamStatData { - teamId: string; - mainRoom: string; - totalRooms: number; - totalMessages: number; - totalPublicRooms: number; - totalPrivateRooms: number; - totalDefaultRooms: number; - totalMembers: number; -} export interface ITeamStats { totalTeams: number; - teamStats: Array; + totalRoomsInsideTeams: number; + totalDefaultRoomsInsideTeams: number; } // TODO: move to service sdk package From 8a3c9284b0269d9cc426c6de90ef2373edb48736 Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Fri, 20 May 2022 08:35:44 -0500 Subject: [PATCH 13/50] [FIX] Initial User not added to default channel (#25544) --- apps/meteor/server/startup/initialData.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/meteor/server/startup/initialData.js b/apps/meteor/server/startup/initialData.js index d8ad68aee1f2..ab79c351adfe 100644 --- a/apps/meteor/server/startup/initialData.js +++ b/apps/meteor/server/startup/initialData.js @@ -135,6 +135,8 @@ Meteor.startup(async function () { console.log('Inserting initial user:'.green); console.log(JSON.stringify(initialUser, null, 2).green); Users.create(initialUser); + + await addUserToDefaultChannels(initialUser, true); } } catch (e) { console.log('Error processing environment variable INITIAL_USER'.red, e); From 45417eadcef7a451a6737b64bbf365495449a37d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Fri, 20 May 2022 14:17:58 -0300 Subject: [PATCH 14/50] Chore: Convert apps/meteor/client/components/UserAutoComplete (#25554) Co-authored-by: Guilherme Gazzo --- .../CreateDiscussion/CreateDiscussion.tsx | 2 +- .../Omnichannel/modals/ForwardChatModal.tsx | 3 +- .../components/RoomAutoComplete/Avatar.js | 10 ------ .../components/RoomAutoComplete/Avatar.tsx | 16 ++++++++++ ...omAutoComplete.js => RoomAutoComplete.tsx} | 31 ++++++++++++------- ...erAutoComplete.js => UserAutoComplete.tsx} | 30 +++++++++++++----- .../UsersInRole/UsersInRolePage.tsx | 10 ++++-- .../views/omnichannel/managers/AddManager.tsx | 9 +++++- packages/core-typings/src/IUser.ts | 1 + packages/rest-typings/src/v1/users.ts | 4 ++- 10 files changed, 79 insertions(+), 37 deletions(-) delete mode 100644 apps/meteor/client/components/RoomAutoComplete/Avatar.js create mode 100644 apps/meteor/client/components/RoomAutoComplete/Avatar.tsx rename apps/meteor/client/components/RoomAutoComplete/{RoomAutoComplete.js => RoomAutoComplete.tsx} (56%) rename apps/meteor/client/components/UserAutoComplete/{UserAutoComplete.js => UserAutoComplete.tsx} (52%) diff --git a/apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx b/apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx index 0b684b4d1488..685b9f29fbf4 100644 --- a/apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx +++ b/apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx @@ -94,7 +94,7 @@ const CreateDiscussion = ({ onClose, defaultParentRoom, parentMessageId, nameSug value={parentRoom} onChange={handleParentRoom} placeholder={t('Discussion_target_channel_description')} - disabled={defaultParentRoom} + disabled={Boolean(defaultParentRoom)} /> )} diff --git a/apps/meteor/client/components/Omnichannel/modals/ForwardChatModal.tsx b/apps/meteor/client/components/Omnichannel/modals/ForwardChatModal.tsx index 616895ddc771..853dd7c7d293 100644 --- a/apps/meteor/client/components/Omnichannel/modals/ForwardChatModal.tsx +++ b/apps/meteor/client/components/Omnichannel/modals/ForwardChatModal.tsx @@ -109,9 +109,8 @@ const ForwardChatModal = ({ { + onChange={(value: any): void => { setValue('username', value); }} value={getValues().username} diff --git a/apps/meteor/client/components/RoomAutoComplete/Avatar.js b/apps/meteor/client/components/RoomAutoComplete/Avatar.js deleted file mode 100644 index 859cafdc8bd9..000000000000 --- a/apps/meteor/client/components/RoomAutoComplete/Avatar.js +++ /dev/null @@ -1,10 +0,0 @@ -import { Options } from '@rocket.chat/fuselage'; -import React from 'react'; - -import RoomAvatar from '../avatar/RoomAvatar'; - -const Avatar = ({ value, type, avatarETag, ...props }) => ( - -); - -export default Avatar; diff --git a/apps/meteor/client/components/RoomAutoComplete/Avatar.tsx b/apps/meteor/client/components/RoomAutoComplete/Avatar.tsx new file mode 100644 index 000000000000..d90fa71772b4 --- /dev/null +++ b/apps/meteor/client/components/RoomAutoComplete/Avatar.tsx @@ -0,0 +1,16 @@ +import { Options } from '@rocket.chat/fuselage'; +import React, { ReactElement } from 'react'; + +import RoomAvatar from '../avatar/RoomAvatar'; + +type AvatarProps = { + value: string; + type: string; + avatarETag?: string | undefined; +}; + +const Avatar = ({ value, type, avatarETag, ...props }: AvatarProps): ReactElement => ( + +); + +export default Avatar; diff --git a/apps/meteor/client/components/RoomAutoComplete/RoomAutoComplete.js b/apps/meteor/client/components/RoomAutoComplete/RoomAutoComplete.tsx similarity index 56% rename from apps/meteor/client/components/RoomAutoComplete/RoomAutoComplete.js rename to apps/meteor/client/components/RoomAutoComplete/RoomAutoComplete.tsx index 79c6ade0ff0a..762bd2cc7ed1 100644 --- a/apps/meteor/client/components/RoomAutoComplete/RoomAutoComplete.js +++ b/apps/meteor/client/components/RoomAutoComplete/RoomAutoComplete.tsx @@ -1,13 +1,22 @@ import { AutoComplete, Option, Box } from '@rocket.chat/fuselage'; -import React, { memo, useMemo, useState } from 'react'; +import React, { ComponentProps, memo, ReactElement, useMemo, useState } from 'react'; import { useEndpointData } from '../../hooks/useEndpointData'; import RoomAvatar from '../avatar/RoomAvatar'; import Avatar from './Avatar'; -const query = (term = '') => ({ selector: JSON.stringify({ name: term }) }); +const query = ( + term = '', +): { + selector: string; +} => ({ selector: JSON.stringify({ name: term }) }); -const RoomAutoComplete = (props) => { +type RoomAutoCompleteProps = Omit, 'value' | 'filter'> & { + value: any; +}; + +/* @deprecated */ +const RoomAutoComplete = (props: RoomAutoCompleteProps): ReactElement => { const [filter, setFilter] = useState(''); const { value: data } = useEndpointData( 'rooms.autocomplete.channelAndPrivate', @@ -15,21 +24,19 @@ const RoomAutoComplete = (props) => { ); const options = useMemo( () => - (data && - data.items.map(({ name, _id, avatarETag, t }) => ({ - value: _id, - label: { name, avatarETag, type: t }, - }))) || - [], + data?.items.map(({ name, _id, avatarETag, t }) => ({ + value: _id, + label: { name, avatarETag, type: t }, + })) || [], [data], - ); + ) as unknown as { value: string; label: string }[]; return ( ( + renderSelected={({ value, label }): ReactElement => ( <> {' '} @@ -39,7 +46,7 @@ const RoomAutoComplete = (props) => { )} - renderItem={({ value, label, ...props }) => ( + renderItem={({ value, label, ...props }): ReactElement => ( ), - [avatarUrl, handleAvatar, t], + [avatar, handleAvatar, t], )} {useMemo( () => ( diff --git a/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhook.js b/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhook.js index 6f178b579b03..6f852be08a02 100644 --- a/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhook.js +++ b/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhook.js @@ -14,7 +14,7 @@ const getInitialValue = (data) => { username: data.username ?? '', name: data.name ?? '', alias: data.alias ?? '', - avatarUrl: data.avatarUrl ?? '', + avatar: data.avatar ?? '', emoji: data.emoji ?? '', scriptEnabled: data.scriptEnabled, script: data.script, diff --git a/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhook.js b/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhook.js index efa538c9ed7f..da41752c7969 100644 --- a/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhook.js +++ b/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhook.js @@ -21,7 +21,7 @@ const getInitialValue = (data) => { username: data.username ?? '', name: data.name ?? '', alias: data.alias ?? '', - avatarUrl: data.avatarUrl ?? '', + avatar: data.avatar ?? '', emoji: data.emoji ?? '', scriptEnabled: data.scriptEnabled ?? false, script: data.script ?? '', diff --git a/apps/meteor/client/views/admin/integrations/edit/HistoryItem.js b/apps/meteor/client/views/admin/integrations/edit/HistoryItem.js index d37d01f0e8fc..350a267d529e 100644 --- a/apps/meteor/client/views/admin/integrations/edit/HistoryItem.js +++ b/apps/meteor/client/views/admin/integrations/edit/HistoryItem.js @@ -3,7 +3,7 @@ import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; import { useMethod, useTranslation } from '@rocket.chat/ui-contexts'; import React from 'react'; -import { integrations as eventList } from '../../../../../app/integrations/lib/rocketchat'; +import { outgoingEvents } from '../../../../../app/integrations/lib/outgoingEvents'; import { useFormatDateAndTime } from '../../../../hooks/useFormatDateAndTime'; import { useHighlightedCode } from '../../../../hooks/useHighlightedCode'; @@ -92,7 +92,7 @@ function HistoryItem({ data, ...props }) { {t('Event_Trigger')} - {t(eventList.outgoingEvents[event].label)} + {t(outgoingEvents[event].label)} diff --git a/apps/meteor/client/views/admin/integrations/new/NewIncomingWebhook.js b/apps/meteor/client/views/admin/integrations/new/NewIncomingWebhook.js index 062fe3c4643b..3d2d9c2606a7 100644 --- a/apps/meteor/client/views/admin/integrations/new/NewIncomingWebhook.js +++ b/apps/meteor/client/views/admin/integrations/new/NewIncomingWebhook.js @@ -12,7 +12,7 @@ const initialState = { username: '', name: '', alias: '', - avatarUrl: '', + avatar: '', emoji: '', scriptEnabled: false, script: '', diff --git a/apps/meteor/definition/externals/meteor/babel-compiler.d.ts b/apps/meteor/definition/externals/meteor/babel-compiler.d.ts new file mode 100644 index 000000000000..ea6353d596c2 --- /dev/null +++ b/apps/meteor/definition/externals/meteor/babel-compiler.d.ts @@ -0,0 +1,6 @@ +declare module 'meteor/babel-compiler' { + namespace Babel { + function getDefaultOptions(options: Record): Record; + function compile(script: string, options: Record): { code: string }; + } +} diff --git a/apps/meteor/server/startup/migrations/index.ts b/apps/meteor/server/startup/migrations/index.ts index 3dfb6d3482a3..045c08a18f4e 100644 --- a/apps/meteor/server/startup/migrations/index.ts +++ b/apps/meteor/server/startup/migrations/index.ts @@ -88,4 +88,5 @@ import './v261'; import './v262'; import './v263'; import './v264'; +import './v265'; import './xrun'; diff --git a/apps/meteor/server/startup/migrations/v265.ts b/apps/meteor/server/startup/migrations/v265.ts new file mode 100644 index 000000000000..66635838c165 --- /dev/null +++ b/apps/meteor/server/startup/migrations/v265.ts @@ -0,0 +1,27 @@ +import { addMigration } from '../../lib/migrations'; +import { Integrations } from '../../../app/models/server/raw'; + +addMigration({ + version: 265, + async up() { + // Load all integrations that have an `avatarUrl` and don't have an `avatar` + const integrations = await Integrations.find<{ _id: string; avatarUrl: string }>( + { + avatarUrl: { + $exists: true, + $ne: '', + }, + $or: [{ avatar: { $exists: false } }, { avatar: '' }], + }, + { + projection: { + avatarUrl: 1, + }, + }, + ).toArray(); + + for (const { _id, avatarUrl } of integrations) { + Integrations.updateOne({ _id }, { $set: { avatar: avatarUrl }, $unset: { avatarUrl: 1 } }); + } + }, +}); diff --git a/apps/meteor/tests/end-to-end/api/06-outgoing-integrations.js b/apps/meteor/tests/end-to-end/api/06-outgoing-integrations.js index 8b29e121929e..ef111b4a4595 100644 --- a/apps/meteor/tests/end-to-end/api/06-outgoing-integrations.js +++ b/apps/meteor/tests/end-to-end/api/06-outgoing-integrations.js @@ -361,7 +361,7 @@ describe('[Outgoing Integrations]', function () { .expect(400) .expect((res) => { expect(res.body).to.have.property('success', false); - expect(res.body).to.have.property('error', 'The query parameter "integrationId" is required.'); + expect(res.body).to.have.property('error', `must have required property 'integrationId' [invalid-params]`); }) .end(done); }); @@ -454,6 +454,7 @@ describe('[Outgoing Integrations]', function () { .set(credentials) .send({ integrationId: integration._id, + type: 'webhook-outgoing', }) .expect('Content-Type', 'application/json') .expect(403) @@ -472,6 +473,7 @@ describe('[Outgoing Integrations]', function () { .set(credentials) .send({ integrationId: integration._id, + type: 'webhook-outgoing', }) .expect('Content-Type', 'application/json') .expect(403) @@ -496,7 +498,7 @@ describe('[Outgoing Integrations]', function () { .expect(400) .expect((res) => { expect(res.body).to.have.property('success', false); - expect(res.body).to.have.property('error', 'Invalid integration type.'); + expect(res.body).to.have.property('error').include(`must match exactly one schema in oneOf`); }) .end(done); }); diff --git a/apps/meteor/tests/end-to-end/api/07-incoming-integrations.js b/apps/meteor/tests/end-to-end/api/07-incoming-integrations.js index 67ebdca1edac..656280d042e1 100644 --- a/apps/meteor/tests/end-to-end/api/07-incoming-integrations.js +++ b/apps/meteor/tests/end-to-end/api/07-incoming-integrations.js @@ -284,7 +284,7 @@ describe('[Incoming Integrations]', function () { .expect(400) .expect((res) => { expect(res.body).to.have.property('success', false); - expect(res.body).to.have.property('error', 'The query parameter "integrationId" is required.'); + expect(res.body).to.have.property('error', `must have required property 'integrationId' [invalid-params]`); }) .end(done); }); @@ -421,6 +421,7 @@ describe('[Incoming Integrations]', function () { .set(credentials) .send({ integrationId: integration._id, + type: 'webhook-incoming', }) .expect('Content-Type', 'application/json') .expect(403) @@ -439,6 +440,7 @@ describe('[Incoming Integrations]', function () { .set(credentials) .send({ integrationId: integration._id, + type: 'webhook-incoming', }) .expect('Content-Type', 'application/json') .expect(403) @@ -463,7 +465,7 @@ describe('[Incoming Integrations]', function () { .expect(400) .expect((res) => { expect(res.body).to.have.property('success', false); - expect(res.body).to.have.property('error', 'Invalid integration type.'); + expect(res.body).to.have.property('error').include(`must match exactly one schema in oneOf`); }) .end(done); }); diff --git a/packages/core-typings/src/IIntegration.ts b/packages/core-typings/src/IIntegration.ts index 3807cfac1d3a..72c41e9dfae2 100644 --- a/packages/core-typings/src/IIntegration.ts +++ b/packages/core-typings/src/IIntegration.ts @@ -1,10 +1,98 @@ import type { IRocketChatRecord } from './IRocketChatRecord'; import type { IUser } from './IUser'; -export interface IIntegration extends IRocketChatRecord { - type: string; +export interface IIncomingIntegration extends IRocketChatRecord { + type: 'webhook-incoming'; + _createdBy: Pick; + _createdAt: Date; + userId: IUser['_id']; + username: string; + channel: string[]; + + token: string; + scriptEnabled: boolean; + script: string; + scriptCompiled?: string; + scriptError?: Pick; + + name: string; enabled: boolean; - channel: string; + + alias?: string; + avatar?: string; + emoji?: string; +} + +export type OutgoingIntegrationEvent = + | 'sendMessage' + | 'fileUploaded' + | 'roomArchived' + | 'roomCreated' + | 'roomJoined' + | 'roomLeft' + | 'userCreated'; + +export interface IOutgoingIntegration extends IRocketChatRecord { + type: 'webhook-outgoing'; + _createdBy: Pick; + _createdAt: Date; + userId: IUser['_id']; + username: string; + channel: string[]; + + event: OutgoingIntegrationEvent; + targetRoom?: string; + urls?: string[]; + triggerWords?: string[]; + triggerWordAnywhere?: boolean; + token: string; + scriptEnabled: boolean; - _createdBy: IUser; + script: string; + scriptCompiled?: string; + scriptError?: Pick; + runOnEdits?: boolean; + + retryFailedCalls?: boolean; + retryCount?: number; + retryDelay?: string; + impersonateUser?: boolean; + + name: string; + enabled: boolean; + + alias?: string; + avatar?: string; + emoji?: string; } + +export type IIntegration = IIncomingIntegration | IOutgoingIntegration; + +export type INewIncomingIntegration = Omit< + IIncomingIntegration, + 'channel' | 'scriptCompiled' | 'scriptError' | '_createdBy' | '_createdAt' | 'userId' | 'token' +> & { + channel: string; +}; + +export type INewOutgoingIntegration = Omit< + IOutgoingIntegration, + 'channel' | 'scriptCompiled' | 'scriptError' | '_createdAt' | '_createdBy' | 'userId' +> & { + channel?: string; + token?: string; +}; + +export type IUpdateIncomingIntegration = Omit< + IOutgoingIntegration, + 'type' | 'channel' | 'scriptCompiled' | 'scriptError' | '_createdBy' | '_createdAt' | 'userId' | 'token' | 'username' +> & { + channel?: string; +}; + +export type IUpdateOutgoingIntegration = Omit< + IOutgoingIntegration, + 'type' | 'channel' | 'scriptCompiled' | 'scriptError' | '_createdAt' | '_createdBy' | 'userId' +> & { + channel?: string | string[]; +}; diff --git a/packages/rest-typings/src/index.ts b/packages/rest-typings/src/index.ts index 9d1f61c2283a..fa38e480907c 100644 --- a/packages/rest-typings/src/index.ts +++ b/packages/rest-typings/src/index.ts @@ -16,6 +16,7 @@ import type { EmojiCustomEndpoints } from './v1/emojiCustom'; import type { GroupsEndpoints } from './v1/groups'; import type { ImEndpoints } from './v1/im'; import type { InstancesEndpoints } from './v1/instances'; +import type { IntegrationsEndpoints } from './v1/integrations'; import type { InvitesEndpoints } from './v1/invites'; import type { LDAPEndpoints } from './v1/ldap'; import type { LicensesEndpoints } from './v1/licenses'; @@ -61,6 +62,7 @@ export interface Endpoints MiscEndpoints, PermissionsEndpoints, InstancesEndpoints, + IntegrationsEndpoints, VoipEndpoints, VideoConferenceEndpoints, InvitesEndpoints, @@ -152,6 +154,7 @@ export * from './v1/channels/ChannelsModeratorsProps'; export * from './v1/channels/ChannelsConvertToTeamProps'; export * from './v1/channels/ChannelsSetReadOnlyProps'; export * from './v1/channels/ChannelsDeleteProps'; +export * from './v1/integrations'; export * from './v1/oauthapps'; export * from './helpers/PaginatedRequest'; export * from './helpers/PaginatedResult'; diff --git a/packages/rest-typings/src/v1/integrations/IntegrationsCreateProps.ts b/packages/rest-typings/src/v1/integrations/IntegrationsCreateProps.ts new file mode 100644 index 000000000000..bf652d66ad75 --- /dev/null +++ b/packages/rest-typings/src/v1/integrations/IntegrationsCreateProps.ts @@ -0,0 +1,201 @@ +import Ajv from 'ajv'; +import type { OutgoingIntegrationEvent } from '@rocket.chat/core-typings'; + +const ajv = new Ajv(); + +export type IntegrationsCreateProps = + | { + type: 'webhook-incoming'; + username: string; + channel: string; + scriptEnabled: boolean; + script?: string; + name: string; + enabled: boolean; + alias?: string; + avatar?: string; + emoji?: string; + } + | { + type: 'webhook-outgoing'; + username: string; + channel: string; + + event: OutgoingIntegrationEvent; + targetRoom?: string; + urls?: string[]; + triggerWords?: string[]; + triggerWordAnywhere?: boolean; + token?: string; + + scriptEnabled: boolean; + script?: string; + runOnEdits?: boolean; + + retryFailedCalls?: boolean; + retryCount?: number; + retryDelay?: string; + impersonateUser?: boolean; + + name: string; + enabled: boolean; + + alias?: string; + avatar?: string; + emoji?: string; + }; + +const integrationsCreateSchema = { + oneOf: [ + { + type: 'object', + properties: { + type: { + type: 'string', + pattern: 'webhook-incoming', + nullable: false, + }, + username: { + type: 'string', + nullable: false, + }, + channel: { + type: 'string', + nullable: false, + }, + scriptEnabled: { + type: 'boolean', + nullable: false, + }, + script: { + type: 'string', + nullable: true, + }, + name: { + type: 'string', + nullable: false, + }, + enabled: { + type: 'boolean', + nullable: false, + }, + alias: { + type: 'string', + nullable: true, + }, + avatar: { + type: 'string', + nullable: true, + }, + emoji: { + type: 'string', + nullable: true, + }, + }, + required: ['type', 'username', 'channel', 'scriptEnabled', 'name', 'enabled'], + additionalProperties: false, + }, + { + type: 'object', + properties: { + type: { + type: 'string', + pattern: 'webhook-outgoing', + nullable: false, + }, + username: { + type: 'string', + nullable: false, + }, + channel: { + type: 'string', + nullable: false, + }, + event: { + type: 'string', + nullable: false, + }, + targetRoom: { + type: 'string', + nullable: true, + }, + urls: { + type: 'array', + items: { + type: 'string', + minLength: 1, + }, + nullable: true, + }, + triggerWords: { + type: 'array', + items: { + type: 'string', + minLength: 1, + }, + nullable: true, + }, + triggerWordAnywhere: { + type: 'boolean', + nullable: true, + }, + token: { + type: 'string', + nullable: true, + }, + scriptEnabled: { + type: 'boolean', + nullable: false, + }, + script: { + type: 'string', + nullable: true, + }, + runOnEdits: { + type: 'boolean', + nullable: true, + }, + retryFailedCalls: { + type: 'boolean', + nullable: true, + }, + retryCount: { + type: 'number', + nullable: true, + }, + retryDelay: { + type: 'string', + nullable: true, + }, + impersonateUser: { + type: 'boolean', + nullable: true, + }, + name: { + type: 'string', + nullable: false, + }, + enabled: { + type: 'boolean', + nullable: false, + }, + alias: { + type: 'string', + nullable: true, + }, + avatar: { + type: 'string', + nullable: true, + }, + emoji: { + type: 'string', + nullable: true, + }, + }, + required: ['type', 'username', 'channel', 'event', 'scriptEnabled', 'name', 'enabled'], + additionalProperties: false, + }, + ], +}; + +export const isIntegrationsCreateProps = ajv.compile(integrationsCreateSchema); diff --git a/packages/rest-typings/src/v1/integrations/IntegrationsGetProps.ts b/packages/rest-typings/src/v1/integrations/IntegrationsGetProps.ts new file mode 100644 index 000000000000..2ab243db5820 --- /dev/null +++ b/packages/rest-typings/src/v1/integrations/IntegrationsGetProps.ts @@ -0,0 +1,22 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv(); + +export type IntegrationsGetProps = { integrationId: string; createdBy?: string }; + +const integrationsGetSchema = { + type: 'object', + properties: { + integrationId: { + type: 'string', + nullable: false, + }, + createdBy: { + type: 'string', + nullable: true, + }, + }, + required: ['integrationId'], +}; + +export const isIntegrationsGetProps = ajv.compile(integrationsGetSchema); diff --git a/packages/rest-typings/src/v1/integrations/IntegrationsHistoryProps.ts b/packages/rest-typings/src/v1/integrations/IntegrationsHistoryProps.ts new file mode 100644 index 000000000000..bac7d218fa99 --- /dev/null +++ b/packages/rest-typings/src/v1/integrations/IntegrationsHistoryProps.ts @@ -0,0 +1,22 @@ +import Ajv from 'ajv'; + +import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; + +const ajv = new Ajv(); + +export type IntegrationsHistoryProps = PaginatedRequest<{ id: string }>; + +const integrationsHistorySchema = { + type: 'object', + properties: { + id: { type: 'string', nullable: false, minLength: 1 }, + offset: { type: 'number', nullable: true }, + count: { type: 'number', nullable: true }, + sort: { type: 'string', nullable: true }, + query: { type: 'string', nullable: true }, + }, + required: ['id'], + additionalProperties: false, +}; + +export const isIntegrationsHistoryProps = ajv.compile(integrationsHistorySchema); diff --git a/packages/rest-typings/src/v1/integrations/IntegrationsRemoveProps.ts b/packages/rest-typings/src/v1/integrations/IntegrationsRemoveProps.ts new file mode 100644 index 000000000000..61725752f8fd --- /dev/null +++ b/packages/rest-typings/src/v1/integrations/IntegrationsRemoveProps.ts @@ -0,0 +1,60 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv(); + +export type IntegrationsRemoveProps = + | { type: 'webhook-incoming'; integrationId: string } + | { type: 'webhook-outgoing'; integrationId?: string; target_url?: string }; + +const integrationsRemoveSchema = { + oneOf: [ + { + type: 'object', + properties: { + type: { + type: 'string', + nullable: false, + pattern: 'webhook-incoming', + }, + integrationId: { + type: 'string', + nullable: false, + }, + }, + required: ['type', 'integrationId'], + }, + { + type: 'object', + properties: { + type: { + type: 'string', + nullable: false, + pattern: 'webhook-outgoing', + }, + // eslint-disable-next-line @typescript-eslint/camelcase + target_url: { + type: 'string', + nullable: false, + }, + }, + required: ['type', 'target_url'], + }, + { + type: 'object', + properties: { + type: { + type: 'string', + nullable: false, + pattern: 'webhook-outgoing', + }, + integrationId: { + type: 'string', + nullable: false, + }, + }, + required: ['type', 'integrationId'], + }, + ], +}; + +export const isIntegrationsRemoveProps = ajv.compile(integrationsRemoveSchema); diff --git a/packages/rest-typings/src/v1/integrations/IntegrationsUpdateProps.ts b/packages/rest-typings/src/v1/integrations/IntegrationsUpdateProps.ts new file mode 100644 index 000000000000..c0735b923041 --- /dev/null +++ b/packages/rest-typings/src/v1/integrations/IntegrationsUpdateProps.ts @@ -0,0 +1,212 @@ +import Ajv from 'ajv'; +import type { OutgoingIntegrationEvent } from '@rocket.chat/core-typings'; + +const ajv = new Ajv(); + +export type IntegrationsUpdateProps = + | { + type: 'webhook-incoming'; + integrationId: string; + channel: string; + scriptEnabled: boolean; + script?: string; + name: string; + enabled: boolean; + alias?: string; + avatar?: string; + emoji?: string; + } + | { + type: 'webhook-outgoing'; + integrationId?: string; + target_url?: string; + username: string; + channel: string; + + event: OutgoingIntegrationEvent; + targetRoom?: string; + urls?: string[]; + triggerWords?: string[]; + triggerWordAnywhere?: boolean; + token?: string; + + scriptEnabled: boolean; + script?: string; + runOnEdits?: boolean; + + retryFailedCalls?: boolean; + retryCount?: number; + retryDelay?: string; + impersonateUser?: boolean; + + name: string; + enabled: boolean; + + alias?: string; + avatar?: string; + emoji?: string; + }; + +const integrationsUpdateSchema = { + oneOf: [ + { + type: 'object', + properties: { + type: { + type: 'string', + pattern: 'webhook-incoming', + nullable: false, + }, + integrationId: { + type: 'string', + nullable: false, + }, + channel: { + type: 'string', + nullable: false, + }, + scriptEnabled: { + type: 'boolean', + nullable: false, + }, + script: { + type: 'string', + nullable: true, + }, + name: { + type: 'string', + nullable: false, + }, + enabled: { + type: 'boolean', + nullable: false, + }, + alias: { + type: 'string', + nullable: true, + }, + avatar: { + type: 'string', + nullable: true, + }, + emoji: { + type: 'string', + nullable: true, + }, + }, + required: ['integrationId', 'type', 'channel', 'scriptEnabled', 'name', 'enabled'], + additionalProperties: true, + }, + { + type: 'object', + properties: { + type: { + type: 'string', + pattern: 'webhook-outgoing', + nullable: false, + }, + integrationId: { + type: 'string', + nullable: true, + }, + // eslint-disable-next-line @typescript-eslint/camelcase + target_url: { + type: 'string', + nullable: true, + }, + username: { + type: 'string', + nullable: false, + }, + channel: { + type: 'string', + nullable: false, + }, + event: { + type: 'string', + nullable: false, + }, + targetRoom: { + type: 'string', + nullable: true, + }, + urls: { + type: 'array', + items: { + type: 'string', + minLength: 1, + }, + nullable: true, + }, + triggerWords: { + type: 'array', + items: { + type: 'string', + minLength: 1, + }, + nullable: true, + }, + triggerWordAnywhere: { + type: 'boolean', + nullable: true, + }, + token: { + type: 'string', + nullable: true, + }, + scriptEnabled: { + type: 'boolean', + nullable: false, + }, + script: { + type: 'string', + nullable: true, + }, + runOnEdits: { + type: 'boolean', + nullable: true, + }, + retryFailedCalls: { + type: 'boolean', + nullable: true, + }, + retryCount: { + type: 'number', + nullable: true, + }, + retryDelay: { + type: 'string', + nullable: true, + }, + impersonateUser: { + type: 'boolean', + nullable: true, + }, + name: { + type: 'string', + nullable: false, + }, + enabled: { + type: 'boolean', + nullable: false, + }, + alias: { + type: 'string', + nullable: true, + }, + avatar: { + type: 'string', + nullable: true, + }, + emoji: { + type: 'string', + nullable: true, + }, + }, + required: ['type', 'username', 'channel', 'event', 'scriptEnabled', 'name', 'enabled'], + additionalProperties: false, + }, + ], +}; + +export const isIntegrationsUpdateProps = ajv.compile(integrationsUpdateSchema); diff --git a/packages/rest-typings/src/v1/integrations/index.ts b/packages/rest-typings/src/v1/integrations/index.ts new file mode 100644 index 000000000000..6de1aaa0bd67 --- /dev/null +++ b/packages/rest-typings/src/v1/integrations/index.ts @@ -0,0 +1,7 @@ +export * from './integrations'; + +export * from './IntegrationsCreateProps'; +export * from './IntegrationsHistoryProps'; +export * from './IntegrationsRemoveProps'; +export * from './IntegrationsGetProps'; +export * from './IntegrationsUpdateProps'; diff --git a/packages/rest-typings/src/v1/integrations/integrations.ts b/packages/rest-typings/src/v1/integrations/integrations.ts new file mode 100644 index 000000000000..9c496b3446da --- /dev/null +++ b/packages/rest-typings/src/v1/integrations/integrations.ts @@ -0,0 +1,43 @@ +import type { IIntegration, IIntegrationHistory } from '@rocket.chat/core-typings'; + +import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; +import type { PaginatedResult } from '../../helpers/PaginatedResult'; +import type { IntegrationsCreateProps } from './IntegrationsCreateProps'; +import type { IntegrationsHistoryProps } from './IntegrationsHistoryProps'; +import type { IntegrationsRemoveProps } from './IntegrationsRemoveProps'; +import type { IntegrationsGetProps } from './IntegrationsGetProps'; +import type { IntegrationsUpdateProps } from './IntegrationsUpdateProps'; + +export type IntegrationsEndpoints = { + 'integrations.create': { + POST: (params: IntegrationsCreateProps) => { integration: IIntegration }; + }; + + 'integrations.history': { + GET: (params: IntegrationsHistoryProps) => PaginatedResult<{ + history: IIntegrationHistory[]; + items: number; + }>; + }; + + 'integrations.list': { + GET: (params: PaginatedRequest<{}>) => PaginatedResult<{ + integrations: IIntegration[]; + items: number; + }>; + }; + + 'integrations.remove': { + POST: (params: IntegrationsRemoveProps) => { + integration: IIntegration; + }; + }; + + 'integrations.get': { + GET: (params: IntegrationsGetProps) => { integration: IIntegration }; + }; + + 'integrations.update': { + PUT: (params: IntegrationsUpdateProps) => { integration: IIntegration | null }; + }; +}; From 603ade221c83b1fb31d8e300823782dca8949529 Mon Sep 17 00:00:00 2001 From: Rafael Tapia Date: Fri, 20 May 2022 13:47:17 -0400 Subject: [PATCH 18/50] [NEW] Add user events for apps (#25165) * Add user events for apps * Remove trycatch validation * Get the user entity after the update * Trigger events when the user updates his profile or deletes his account * Update Apps-Engine * Make update return doc after update * Find user after the update to trigger event with correct data * Change where clause to use userData instead of userId * Update apps-engine --- .../meteor/app/apps/server/bridges/listeners.js | 17 +++++++++++++++++ .../app/authentication/server/startup/index.js | 5 +++++ .../meteor/app/lib/server/functions/saveUser.js | 13 +++++++++++++ .../lib/server/methods/deleteUserOwnAccount.ts | 4 ++++ apps/meteor/server/methods/deleteUser.js | 4 ++++ apps/meteor/server/methods/saveUserProfile.js | 10 ++++++++++ yarn.lock | 6 +++--- 7 files changed, 56 insertions(+), 3 deletions(-) diff --git a/apps/meteor/app/apps/server/bridges/listeners.js b/apps/meteor/app/apps/server/bridges/listeners.js index 3528aeebe588..514ca2ff6c39 100644 --- a/apps/meteor/app/apps/server/bridges/listeners.js +++ b/apps/meteor/app/apps/server/bridges/listeners.js @@ -43,6 +43,10 @@ export class AppListenerBridge { case AppInterface.IPostLivechatGuestSaved: case AppInterface.IPostLivechatRoomSaved: return 'livechatEvent'; + case AppInterface.IPostUserCreated: + case AppInterface.IPostUserUpdated: + case AppInterface.IPostUserDeleted: + return 'userEvent'; default: return 'defaultEvent'; } @@ -134,4 +138,17 @@ export class AppListenerBridge { return this.orch.getManager().getListenerManager().executeListener(inte, room); } } + + async userEvent(inte, data) { + const context = { + user: this.orch.getConverters().get('users').convertToApp(data.user), + performedBy: this.orch.getConverters().get('users').convertToApp(data.performedBy), + }; + + if (inte === AppInterface.IPostUserUpdated) { + context.previousData = this.orch.getConverters().get('users').convertToApp(data.previousUser); + } + + return this.orch.getManager().getListenerManager().executeListener(inte, context); + } } diff --git a/apps/meteor/app/authentication/server/startup/index.js b/apps/meteor/app/authentication/server/startup/index.js index 557c6454fee0..b4d58c2fe572 100644 --- a/apps/meteor/app/authentication/server/startup/index.js +++ b/apps/meteor/app/authentication/server/startup/index.js @@ -17,6 +17,7 @@ import { isValidAttemptByUser, isValidLoginAttemptByIp } from '../lib/restrictLo import './settings'; import { getClientAddress } from '../../../../server/lib/getClientAddress'; import { getNewUserRoles } from '../../../../server/services/user/lib/getNewUserRoles'; +import { AppEvents, Apps } from '../../../apps/server/orchestrator'; Accounts.config({ forbidClientAccountCreation: true, @@ -210,6 +211,10 @@ Accounts.onCreateUser(function (options, user = {}) { } callbacks.run('onCreateUser', options, user); + + // App IPostUserCreated event hook + Promise.await(Apps.triggerEvent(AppEvents.IPostUserCreated, { user, performedBy: Meteor.user() })); + return user; }); diff --git a/apps/meteor/app/lib/server/functions/saveUser.js b/apps/meteor/app/lib/server/functions/saveUser.js index 787686ff72c3..40d96fcb4c06 100644 --- a/apps/meteor/app/lib/server/functions/saveUser.js +++ b/apps/meteor/app/lib/server/functions/saveUser.js @@ -14,6 +14,7 @@ import { saveUserIdentity } from './saveUserIdentity'; import { checkEmailAvailability, checkUsernameAvailability, setUserAvatar, setEmail, setStatusText } from '.'; import { Users } from '../../../models/server'; import { callbacks } from '../../../../lib/callbacks'; +import { AppEvents, Apps } from '../../../apps/server/orchestrator'; const MAX_BIO_LENGTH = 260; const MAX_NICKNAME_LENGTH = 120; @@ -346,6 +347,8 @@ export const saveUser = function (userId, userData) { validateUserEditing(userId, userData); + const oldUserData = Users.findOneById(userId); + // update user if (userData.hasOwnProperty('username') || userData.hasOwnProperty('name')) { if ( @@ -411,6 +414,16 @@ export const saveUser = function (userId, userData) { callbacks.run('afterSaveUser', userData); + // App IPostUserUpdated event hook + const userUpdated = Users.findOneById(userId); + Promise.await( + Apps.triggerEvent(AppEvents.IPostUserUpdated, { + user: userUpdated, + previousUser: oldUserData, + performedBy: Meteor.user(), + }), + ); + if (sendPassword) { _sendUserEmail(settings.get('Password_Changed_Email_Subject'), passwordChangedHtml, userData); } diff --git a/apps/meteor/app/lib/server/methods/deleteUserOwnAccount.ts b/apps/meteor/app/lib/server/methods/deleteUserOwnAccount.ts index cfdf804dbc39..6640f3cca105 100644 --- a/apps/meteor/app/lib/server/methods/deleteUserOwnAccount.ts +++ b/apps/meteor/app/lib/server/methods/deleteUserOwnAccount.ts @@ -7,6 +7,7 @@ import s from 'underscore.string'; import { settings } from '../../../settings/server'; import { Users } from '../../../models/server'; import { deleteUser } from '../functions'; +import { AppEvents, Apps } from '../../../apps/server/orchestrator'; Meteor.methods({ async deleteUserOwnAccount(password, confirmRelinquish) { @@ -51,6 +52,9 @@ Meteor.methods({ await deleteUser(uid, confirmRelinquish); + // App IPostUserDeleted event hook + Promise.await(Apps.triggerEvent(AppEvents.IPostUserDeleted, { user })); + return true; }, }); diff --git a/apps/meteor/server/methods/deleteUser.js b/apps/meteor/server/methods/deleteUser.js index e13dc83e6ca2..9e0b1f161439 100644 --- a/apps/meteor/server/methods/deleteUser.js +++ b/apps/meteor/server/methods/deleteUser.js @@ -5,6 +5,7 @@ import { Users } from '../../app/models'; import { hasPermission } from '../../app/authorization'; import { callbacks } from '../../lib/callbacks'; import { deleteUser } from '../../app/lib/server'; +import { AppEvents, Apps } from '../../app/apps/server/orchestrator'; Meteor.methods({ async deleteUser(userId, confirmRelinquish = false) { @@ -50,6 +51,9 @@ Meteor.methods({ callbacks.run('afterDeleteUser', user); + // App IPostUserDeleted event hook + Promise.await(Apps.triggerEvent(AppEvents.IPostUserDeleted, { user, performedBy: Meteor.user() })); + return true; }, }); diff --git a/apps/meteor/server/methods/saveUserProfile.js b/apps/meteor/server/methods/saveUserProfile.js index ac8ff588e0c0..6182688d3b74 100644 --- a/apps/meteor/server/methods/saveUserProfile.js +++ b/apps/meteor/server/methods/saveUserProfile.js @@ -10,6 +10,7 @@ import { twoFactorRequired } from '../../app/2fa/server/twoFactorRequired'; import { saveUserIdentity } from '../../app/lib/server/functions/saveUserIdentity'; import { compareUserPassword } from '../lib/compareUserPassword'; import { compareUserPasswordHistory } from '../lib/compareUserPasswordHistory'; +import { AppEvents, Apps } from '../../app/apps/server/orchestrator'; function saveUserProfile(settings, customFields) { if (!rcSettings.get('Accounts_AllowUserProfileChange')) { @@ -118,6 +119,15 @@ function saveUserProfile(settings, customFields) { saveCustomFields(this.userId, customFields); } + // App IPostUserUpdated event hook + const updatedUser = Users.findOneById(this.userId); + Promise.await( + Apps.triggerEvent(AppEvents.IPostUserUpdated, { + user: updatedUser, + previousUser: user, + }), + ); + return true; } diff --git a/yarn.lock b/yarn.lock index 9f2987fbf207..a69bc6cec69c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3601,8 +3601,8 @@ __metadata: linkType: hard "@rocket.chat/apps-engine@npm:alpha": - version: 1.31.0-alpha.6070 - resolution: "@rocket.chat/apps-engine@npm:1.31.0-alpha.6070" + version: 1.32.0-alpha.6099 + resolution: "@rocket.chat/apps-engine@npm:1.32.0-alpha.6099" dependencies: adm-zip: ^0.4.9 cryptiles: ^4.1.3 @@ -3610,7 +3610,7 @@ __metadata: semver: ^5.5.0 stack-trace: 0.0.10 uuid: ^3.2.1 - checksum: 98aad03f4b6758cc54923f59dc77df4aca2d70aae510b33d6a75d0db660329d4c9d926bcbc8768ce705479a797bf395d62789533f4289a1753c71bd393c8eb74 + checksum: 68ec386fc1a5daf80408c6a67f28bb19b7e5e4c6387b2e6c33aec9fc6dcc7f2412e738687f23b25af6f7864e648421568f372f76df7d3a06abb1b24d0c747c4b languageName: node linkType: hard From 4cbc777eda0c7f1fd9b4b93ed5942af0987f252d Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Fri, 20 May 2022 13:24:10 -0600 Subject: [PATCH 19/50] Chore: Rewrite autotranslate to ts (#25425) --- .../client/{index.js => index.ts} | 0 .../{autotranslate.js => autotranslate.ts} | 37 ++-- .../{autotranslate.js => autotranslate.ts} | 159 ++++++++++-------- .../{deeplTranslate.js => deeplTranslate.ts} | 46 +++-- ...{googleTranslate.js => googleTranslate.ts} | 41 +++-- .../server/{index.js => index.ts} | 8 +- .../server/{logger.js => logger.ts} | 0 ...UiMetadata.js => getProviderUiMetadata.ts} | 0 ...dLanguages.js => getSupportedLanguages.ts} | 11 +- .../{saveSettings.js => saveSettings.ts} | 11 +- ...ranslateMessage.js => translateMessage.ts} | 4 +- .../server/{msTranslate.js => msTranslate.ts} | 43 +++-- .../app/markdown/lib/parser/original/token.ts | 29 +--- packages/core-typings/src/IAutoTranslate.ts | 28 +++ .../core-typings/src/IMessage/IMessage.ts | 21 ++- .../MessageAttachmentBase.ts | 1 + .../MessageAttachmentDefault.ts | 4 + packages/core-typings/src/index.ts | 2 + .../ui-contexts/src/ServerContext/methods.ts | 4 +- 19 files changed, 285 insertions(+), 164 deletions(-) rename apps/meteor/app/autotranslate/client/{index.js => index.ts} (100%) rename apps/meteor/app/autotranslate/client/lib/{autotranslate.js => autotranslate.ts} (74%) rename apps/meteor/app/autotranslate/server/{autotranslate.js => autotranslate.ts} (66%) rename apps/meteor/app/autotranslate/server/{deeplTranslate.js => deeplTranslate.ts} (82%) rename apps/meteor/app/autotranslate/server/{googleTranslate.js => googleTranslate.ts} (82%) rename apps/meteor/app/autotranslate/server/{index.js => index.ts} (78%) rename apps/meteor/app/autotranslate/server/{logger.js => logger.ts} (100%) rename apps/meteor/app/autotranslate/server/methods/{getProviderUiMetadata.js => getProviderUiMetadata.ts} (100%) rename apps/meteor/app/autotranslate/server/methods/{getSupportedLanguages.js => getSupportedLanguages.ts} (68%) rename apps/meteor/app/autotranslate/server/methods/{saveSettings.js => saveSettings.ts} (85%) rename apps/meteor/app/autotranslate/server/methods/{translateMessage.js => translateMessage.ts} (77%) rename apps/meteor/app/autotranslate/server/{msTranslate.js => msTranslate.ts} (81%) create mode 100644 packages/core-typings/src/IAutoTranslate.ts diff --git a/apps/meteor/app/autotranslate/client/index.js b/apps/meteor/app/autotranslate/client/index.ts similarity index 100% rename from apps/meteor/app/autotranslate/client/index.js rename to apps/meteor/app/autotranslate/client/index.ts diff --git a/apps/meteor/app/autotranslate/client/lib/autotranslate.js b/apps/meteor/app/autotranslate/client/lib/autotranslate.ts similarity index 74% rename from apps/meteor/app/autotranslate/client/lib/autotranslate.js rename to apps/meteor/app/autotranslate/client/lib/autotranslate.ts index 44ef5ae7953b..d7f8338de98f 100644 --- a/apps/meteor/app/autotranslate/client/lib/autotranslate.js +++ b/apps/meteor/app/autotranslate/client/lib/autotranslate.ts @@ -2,9 +2,10 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; import _ from 'underscore'; import mem from 'mem'; +import { IRoom, ISubscription, ISupportedLanguage, ITranslatedMessage, IUser, MessageAttachmentDefault } from '@rocket.chat/core-typings'; -import { Subscriptions, Messages } from '../../../models'; -import { hasPermission } from '../../../authorization'; +import { Subscriptions, Messages } from '../../../models/client'; +import { hasPermission } from '../../../authorization/client'; import { callWithErrorHandling } from '../../../../client/lib/utils/callWithErrorHandling'; let userLanguage = 'en'; @@ -12,29 +13,29 @@ let username = ''; Meteor.startup(() => { Tracker.autorun(() => { - const user = Meteor.user(); + const user: Pick | null = Meteor.user(); if (!user) { return; } userLanguage = user.language || 'en'; - username = user.username; + username = user.username || ''; }); }); export const AutoTranslate = { initialized: false, providersMetadata: {}, - messageIdsToWait: {}, - supportedLanguages: [], + messageIdsToWait: {} as { [messageId: string]: string }, + supportedLanguages: [] as ISupportedLanguage[], findSubscriptionByRid: mem((rid) => Subscriptions.findOne({ rid })), - getLanguage(rid) { - let subscription = {}; + getLanguage(rid: IRoom['_id']): string { + let subscription: ISubscription | undefined; if (rid) { subscription = this.findSubscriptionByRid(rid); } - const language = (subscription && subscription.autoTranslateLanguage) || userLanguage || window.defaultUserLanguage(); + const language = (subscription?.autoTranslateLanguage || userLanguage || window.defaultUserLanguage?.()) as string; if (language.indexOf('-') !== -1) { if (!_.findWhere(this.supportedLanguages, { language })) { return language.substr(0, 2); @@ -43,7 +44,7 @@ export const AutoTranslate = { return language; }, - translateAttachments(attachments, language) { + translateAttachments(attachments: MessageAttachmentDefault[], language: string): MessageAttachmentDefault[] { for (const attachment of attachments) { if (attachment.author_name !== username) { if (attachment.text && attachment.translations && attachment.translations[language]) { @@ -54,7 +55,9 @@ export const AutoTranslate = { attachment.description = attachment.translations[language]; } + // @ts-expect-error - not sure what to do with this if (attachment.attachments && attachment.attachments.length > 0) { + // @ts-expect-error - not sure what to do with this attachment.attachments = this.translateAttachments(attachment.attachments, language); } } @@ -62,7 +65,7 @@ export const AutoTranslate = { return attachments; }, - init() { + init(): void { if (this.initialized) { return; } @@ -82,7 +85,7 @@ export const AutoTranslate = { }); Subscriptions.find().observeChanges({ - changed: (id, fields) => { + changed: (_id: string, fields: ISubscription) => { if (fields.hasOwnProperty('autoTranslate') || fields.hasOwnProperty('autoTranslateLanguage')) { mem.clear(this.findSubscriptionByRid); } @@ -93,17 +96,17 @@ export const AutoTranslate = { }, }; -export const createAutoTranslateMessageRenderer = () => { +export const createAutoTranslateMessageRenderer = (): ((message: ITranslatedMessage) => ITranslatedMessage) => { AutoTranslate.init(); - return (message) => { + return (message: ITranslatedMessage): ITranslatedMessage => { const subscription = AutoTranslate.findSubscriptionByRid(message.rid); const autoTranslateLanguage = AutoTranslate.getLanguage(message.rid); if (message.u && message.u._id !== Meteor.userId()) { if (!message.translations) { message.translations = {}; } - if (!!(subscription && subscription.autoTranslate) !== !!message.autoTranslateShowInverse) { + if (!!subscription?.autoTranslate !== !!message.autoTranslateShowInverse) { message.translations.original = message.html; if (message.translations[autoTranslateLanguage]) { message.html = message.translations[autoTranslateLanguage]; @@ -120,10 +123,10 @@ export const createAutoTranslateMessageRenderer = () => { }; }; -export const createAutoTranslateMessageStreamHandler = () => { +export const createAutoTranslateMessageStreamHandler = (): ((message: ITranslatedMessage) => void) => { AutoTranslate.init(); - return (message) => { + return (message: ITranslatedMessage): void => { if (message.u && message.u._id !== Meteor.userId()) { const subscription = AutoTranslate.findSubscriptionByRid(message.rid); const language = AutoTranslate.getLanguage(message.rid); diff --git a/apps/meteor/app/autotranslate/server/autotranslate.js b/apps/meteor/app/autotranslate/server/autotranslate.ts similarity index 66% rename from apps/meteor/app/autotranslate/server/autotranslate.js rename to apps/meteor/app/autotranslate/server/autotranslate.ts index a41837292af6..a5f550d777d6 100644 --- a/apps/meteor/app/autotranslate/server/autotranslate.js +++ b/apps/meteor/app/autotranslate/server/autotranslate.ts @@ -1,12 +1,23 @@ import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; import { escapeHTML } from '@rocket.chat/string-helpers'; +import { + IMessage, + IRoom, + MessageAttachment, + ISupportedLanguages, + IProviderMetadata, + ISupportedLanguage, + ITranslationResult, +} from '@rocket.chat/core-typings'; import { settings } from '../../settings/server'; import { callbacks } from '../../../lib/callbacks'; -import { Subscriptions, Messages } from '../../models'; +import { Subscriptions, Messages } from '../../models/server'; import { Markdown } from '../../markdown/server'; -import { Logger } from '../../logger'; +import { Logger } from '../../logger/server'; + +const translationLogger = new Logger('AutoTranslate'); const Providers = Symbol('Providers'); const Provider = Symbol('Provider'); @@ -16,44 +27,57 @@ const Provider = Symbol('Provider'); * register,load and also returns the active provider. */ export class TranslationProviderRegistry { - static [Providers] = {}; + static [Providers]: { [k: string]: AutoTranslate } = {}; static enabled = false; - static [Provider] = null; + static [Provider]: string | null = null; /** * Registers the translation provider into the registry. * @param {*} provider */ - static registerProvider(provider) { + static registerProvider(provider: AutoTranslate): void { // get provider information const metadata = provider._getProviderMetadata(); + if (!metadata) { + translationLogger.error('Provider metadata is not defined'); + return; + } + TranslationProviderRegistry[Providers][metadata.name] = provider; } /** * Return the active Translation provider */ - static getActiveProvider() { - return TranslationProviderRegistry.enabled ? TranslationProviderRegistry[Providers][TranslationProviderRegistry[Provider]] : undefined; + static getActiveProvider(): AutoTranslate | null { + if (!TranslationProviderRegistry.enabled) { + return null; + } + const provider = TranslationProviderRegistry[Provider]; + if (!provider) { + return null; + } + + return TranslationProviderRegistry[Providers][provider]; } - static getSupportedLanguages(...args) { - return TranslationProviderRegistry.enabled - ? TranslationProviderRegistry.getActiveProvider()?.getSupportedLanguages(...args) - : undefined; + static getSupportedLanguages(target: string): ISupportedLanguage[] | undefined { + return TranslationProviderRegistry.enabled ? TranslationProviderRegistry.getActiveProvider()?.getSupportedLanguages(target) : undefined; } - static translateMessage(...args) { - return TranslationProviderRegistry.enabled ? TranslationProviderRegistry.getActiveProvider()?.translateMessage(...args) : undefined; + static translateMessage(message: IMessage, room: IRoom, targetLanguage: string): IMessage | undefined { + return TranslationProviderRegistry.enabled + ? TranslationProviderRegistry.getActiveProvider()?.translateMessage(message, room, targetLanguage) + : undefined; } - static getProviders() { + static getProviders(): AutoTranslate[] { return Object.values(TranslationProviderRegistry[Providers]); } - static setCurrentProvider(provider) { + static setCurrentProvider(provider: string): void { if (provider === TranslationProviderRegistry[Provider]) { return; } @@ -63,13 +87,13 @@ export class TranslationProviderRegistry { TranslationProviderRegistry.registerCallbacks(); } - static setEnable(enabled) { + static setEnable(enabled: boolean): void { TranslationProviderRegistry.enabled = enabled; TranslationProviderRegistry.registerCallbacks(); } - static registerCallbacks() { + static registerCallbacks(): void { if (!TranslationProviderRegistry.enabled) { callbacks.remove('afterSaveMessage', 'autotranslate'); return; @@ -91,7 +115,13 @@ export class TranslationProviderRegistry { * @abstract * @class */ -export class AutoTranslate { +export abstract class AutoTranslate { + name: string; + + languages: string[]; + + supportedLanguages: ISupportedLanguages; + /** * Encapsulate the api key and provider settings. * @constructor @@ -107,7 +137,7 @@ export class AutoTranslate { * @param {object} message * @return {object} message */ - tokenize(message) { + tokenize(message: IMessage): IMessage { if (!message.tokens || !Array.isArray(message.tokens)) { message.tokens = []; } @@ -118,11 +148,11 @@ export class AutoTranslate { return message; } - tokenizeEmojis(message) { - let count = message.tokens.length; + tokenizeEmojis(message: IMessage): IMessage { + let count = message.tokens?.length || 0; message.msg = message.msg.replace(/:[+\w\d]+:/g, function (match) { const token = `{${count++}}`; - message.tokens.push({ + message.tokens?.push({ token, text: match, }); @@ -132,23 +162,23 @@ export class AutoTranslate { return message; } - tokenizeURLs(message) { - let count = message.tokens.length; + tokenizeURLs(message: IMessage): IMessage { + let count = message.tokens?.length || 0; - const schemes = settings.get('Markdown_SupportSchemesForLink').split(',').join('|'); + const schemes = settings.get('Markdown_SupportSchemesForLink')?.split(',').join('|'); // Support ![alt text](http://image url) and [text](http://link) message.msg = message.msg.replace( new RegExp(`(!?\\[)([^\\]]+)(\\]\\((?:${schemes}):\\/\\/[^\\)]+\\))`, 'gm'), - function (match, pre, text, post) { + function (_match, pre, text, post) { const pretoken = `{${count++}}`; - message.tokens.push({ + message.tokens?.push({ token: pretoken, text: pre, }); const posttoken = `{${count++}}`; - message.tokens.push({ + message.tokens?.push({ token: posttoken, text: post, }); @@ -160,15 +190,15 @@ export class AutoTranslate { // Support message.msg = message.msg.replace( new RegExp(`((?:<|<)(?:${schemes}):\\/\\/[^\\|]+\\|)(.+?)(?=>|>)((?:>|>))`, 'gm'), - function (match, pre, text, post) { + function (_match, pre, text, post) { const pretoken = `{${count++}}`; - message.tokens.push({ + message.tokens?.push({ token: pretoken, text: pre, }); const posttoken = `{${count++}}`; - message.tokens.push({ + message.tokens?.push({ token: posttoken, text: post, }); @@ -180,8 +210,8 @@ export class AutoTranslate { return message; } - tokenizeCode(message) { - let count = message.tokens.length; + tokenizeCode(message: IMessage): IMessage { + let count = message.tokens?.length || 0; message.html = message.msg; message = Markdown.parseMessageNotEscaped(message); @@ -189,28 +219,26 @@ export class AutoTranslate { const regexWrappedParagraph = new RegExp('^\\s*

|

\\s*$', 'gm'); message.msg = message.msg.replace(regexWrappedParagraph, ''); - for (const tokenIndex in message.tokens) { - if (message.tokens.hasOwnProperty(tokenIndex)) { - const { token } = message.tokens[tokenIndex]; - if (token.indexOf('notranslate') === -1) { - const newToken = `{${count++}}`; - message.msg = message.msg.replace(token, newToken); - message.tokens[tokenIndex].token = newToken; - } + for (const [tokenIndex, value] of message.tokens?.entries() ?? []) { + const { token } = value; + if (token.indexOf('notranslate') === -1) { + const newToken = `{${count++}}`; + message.msg = message.msg.replace(token, newToken); + message.tokens ? (message.tokens[tokenIndex].token = newToken) : undefined; } } return message; } - tokenizeMentions(message) { - let count = message.tokens.length; + tokenizeMentions(message: IMessage): IMessage { + let count = message.tokens?.length || 0; if (message.mentions && message.mentions.length > 0) { message.mentions.forEach((mention) => { message.msg = message.msg.replace(new RegExp(`(@${mention.username})`, 'gm'), (match) => { const token = `{${count++}}`; - message.tokens.push({ + message.tokens?.push({ token, text: match, }); @@ -223,7 +251,7 @@ export class AutoTranslate { message.channels.forEach((channel) => { message.msg = message.msg.replace(new RegExp(`(#${channel.name})`, 'gm'), (match) => { const token = `{${count++}}`; - message.tokens.push({ + message.tokens?.push({ token, text: match, }); @@ -235,8 +263,8 @@ export class AutoTranslate { return message; } - deTokenize(message) { - if (message.tokens && message.tokens.length > 0) { + deTokenize(message: IMessage): string { + if (message.tokens && message.tokens?.length > 0) { for (const { token, text, noHtml } of message.tokens) { message.msg = message.msg.replace(token, () => noHtml || text); } @@ -253,8 +281,8 @@ export class AutoTranslate { * @param {object} targetLanguage * @returns {object} unmodified message object. */ - translateMessage(message, room, targetLanguage) { - let targetLanguages; + translateMessage(message: IMessage, room: IRoom, targetLanguage: string): IMessage { + let targetLanguages: string[]; if (targetLanguage) { targetLanguages = [targetLanguage]; } else { @@ -275,14 +303,11 @@ export class AutoTranslate { if (message.attachments && message.attachments.length > 0) { Meteor.defer(() => { - for (const index in message.attachments) { - if (message.attachments.hasOwnProperty(index)) { - const attachment = message.attachments[index]; - if (attachment.description || attachment.text) { - const translations = this._translateAttachmentDescriptions(attachment, targetLanguages); - if (!_.isEmpty(translations)) { - Messages.addAttachmentTranslations(message._id, index, translations); - } + for (const [index, attachment] of message.attachments?.entries() ?? []) { + if (attachment.description || attachment.text) { + const translations = this._translateAttachmentDescriptions(attachment, targetLanguages); + if (!_.isEmpty(translations)) { + Messages.addAttachmentTranslations(message._id, index, translations); } } } @@ -299,9 +324,7 @@ export class AutoTranslate { * @returns { name, displayName, settings } }; */ - _getProviderMetadata() { - Logger.warn('must be implemented by subclass!', '_getProviderMetadata'); - } + abstract _getProviderMetadata(): IProviderMetadata; /** * Provides the possible languages _from_ which a message can be translated into a target language @@ -310,9 +333,7 @@ export class AutoTranslate { * @param {string} target - the language into which shall be translated * @returns [{ language, name }] */ - getSupportedLanguages(target) { - Logger.warn('must be implemented by subclass!', 'getSupportedLanguages', target); - } + abstract getSupportedLanguages(target: string): ISupportedLanguage[]; /** * Performs the actual translation of a message, @@ -323,9 +344,7 @@ export class AutoTranslate { * @param {object} targetLanguages * @return {object} */ - _translateMessage(message, targetLanguages) { - Logger.warn('must be implemented by subclass!', '_translateMessage', message, targetLanguages); - } + abstract _translateMessage(message: IMessage, targetLanguages: string[]): ITranslationResult; /** * Performs the actual translation of an attachment (precisely its description), @@ -335,9 +354,7 @@ export class AutoTranslate { * @param {object} targetLanguages * @returns {object} translated messages for each target language */ - _translateAttachmentDescriptions(attachment, targetLanguages) { - Logger.warn('must be implemented by subclass!', '_translateAttachmentDescriptions', attachment, targetLanguages); - } + abstract _translateAttachmentDescriptions(attachment: MessageAttachment, targetLanguages: string[]): ITranslationResult; } Meteor.startup(() => { @@ -345,12 +362,12 @@ Meteor.startup(() => { * So the registered provider will be invoked when a message is saved. * All the other inactive service provider must be deactivated. */ - settings.watch('AutoTranslate_ServiceProvider', (providerName) => { + settings.watch('AutoTranslate_ServiceProvider', (providerName) => { TranslationProviderRegistry.setCurrentProvider(providerName); }); // Get Auto Translate Active flag - settings.watch('AutoTranslate_Enabled', (value) => { + settings.watch('AutoTranslate_Enabled', (value) => { TranslationProviderRegistry.setEnable(value); }); }); diff --git a/apps/meteor/app/autotranslate/server/deeplTranslate.js b/apps/meteor/app/autotranslate/server/deeplTranslate.ts similarity index 82% rename from apps/meteor/app/autotranslate/server/deeplTranslate.js rename to apps/meteor/app/autotranslate/server/deeplTranslate.ts index dff3464298ce..4da7b27f8f37 100644 --- a/apps/meteor/app/autotranslate/server/deeplTranslate.js +++ b/apps/meteor/app/autotranslate/server/deeplTranslate.ts @@ -5,10 +5,18 @@ import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { HTTP } from 'meteor/http'; import _ from 'underscore'; +import { + IMessage, + IDeepLTranslation, + MessageAttachment, + IProviderMetadata, + ITranslationResult, + ISupportedLanguage, +} from '@rocket.chat/core-typings'; import { TranslationProviderRegistry, AutoTranslate } from './autotranslate'; import { SystemLogger } from '../../../server/lib/logger/system'; -import { settings } from '../../settings'; +import { settings } from '../../settings/server'; /** * DeepL translation service provider class representation. @@ -19,6 +27,10 @@ import { settings } from '../../settings'; * @augments AutoTranslate */ class DeeplAutoTranslate extends AutoTranslate { + apiKey: string; + + apiEndPointUrl: string; + /** * setup api reference to deepl translate to be used as message translation provider. * @constructor @@ -28,7 +40,7 @@ class DeeplAutoTranslate extends AutoTranslate { this.name = 'deepl-translate'; this.apiEndPointUrl = 'https://api.deepl.com/v2/translate'; // Get the service provide API key. - settings.watch('AutoTranslate_DeepLAPIKey', (value) => { + settings.watch('AutoTranslate_DeepLAPIKey', (value) => { this.apiKey = value; }); } @@ -38,7 +50,7 @@ class DeeplAutoTranslate extends AutoTranslate { * @private implements super abstract method. * @return {object} */ - _getProviderMetadata() { + _getProviderMetadata(): IProviderMetadata { return { name: this.name, displayName: TAPi18n.__('AutoTranslate_DeepL'), @@ -51,7 +63,7 @@ class DeeplAutoTranslate extends AutoTranslate { * @private implements super abstract method. * @return {object} */ - _getSettings() { + _getSettings(): IProviderMetadata['settings'] { return { apiKey: this.apiKey, apiEndPointUrl: this.apiEndPointUrl, @@ -66,9 +78,9 @@ class DeeplAutoTranslate extends AutoTranslate { * @param {string} target * @returns {object} code : value pair */ - getSupportedLanguages(target) { + getSupportedLanguages(target: string): ISupportedLanguage[] { if (!this.apiKey) { - return; + return []; } if (this.supportedLanguages[target]) { @@ -184,8 +196,8 @@ class DeeplAutoTranslate extends AutoTranslate { * @param {object} targetLanguages * @returns {object} translations: Translated messages for each language */ - _translateMessage(message, targetLanguages) { - const translations = {}; + _translateMessage(message: IMessage, targetLanguages: string[]): ITranslationResult { + const translations: { [k: string]: string } = {}; let msgs = message.msg.split('\n'); msgs = msgs.map((msg) => encodeURIComponent(msg)); const query = `text=${msgs.join('&text=')}`; @@ -197,7 +209,9 @@ class DeeplAutoTranslate extends AutoTranslate { try { const result = HTTP.get(this.apiEndPointUrl, { params: { + // eslint-disable-next-line @typescript-eslint/camelcase auth_key: this.apiKey, + // eslint-disable-next-line @typescript-eslint/camelcase target_lang: language, }, query, @@ -213,7 +227,9 @@ class DeeplAutoTranslate extends AutoTranslate { // store translation only when the source and target language are different. // multiple lines might contain different languages => Mix the text between source and detected target if neccessary const translatedText = result.data.translations - .map((translation, index) => (translation.detected_source_language !== language ? translation.text : msgs[index])) + .map((translation: IDeepLTranslation, index: number) => + translation.detected_source_language !== language ? translation.text : msgs[index], + ) .join('\n'); translations[language] = this.deTokenize(Object.assign({}, message, { msg: translatedText })); } @@ -231,9 +247,9 @@ class DeeplAutoTranslate extends AutoTranslate { * @param {object} targetLanguages * @returns {object} translated messages for each target language */ - _translateAttachmentDescriptions(attachment, targetLanguages) { - const translations = {}; - const query = `text=${encodeURIComponent(attachment.description || attachment.text)}`; + _translateAttachmentDescriptions(attachment: MessageAttachment, targetLanguages: string[]): ITranslationResult { + const translations: { [k: string]: string } = {}; + const query = `text=${encodeURIComponent(attachment.description || attachment.text || '')}`; const supportedLanguages = this.getSupportedLanguages('en'); targetLanguages.forEach((language) => { if (language.indexOf('-') !== -1 && !_.findWhere(supportedLanguages, { language })) { @@ -242,7 +258,9 @@ class DeeplAutoTranslate extends AutoTranslate { try { const result = HTTP.get(this.apiEndPointUrl, { params: { + // eslint-disable-next-line @typescript-eslint/camelcase auth_key: this.apiKey, + // eslint-disable-next-line @typescript-eslint/camelcase target_lang: language, }, query, @@ -254,8 +272,8 @@ class DeeplAutoTranslate extends AutoTranslate { Array.isArray(result.data.translations) && result.data.translations.length > 0 ) { - if (result.data.translations.map((translation) => translation.detected_source_language).join() !== language) { - translations[language] = result.data.translations.map((translation) => translation.text); + if (result.data.translations.map((translation: IDeepLTranslation) => translation.detected_source_language).join() !== language) { + translations[language] = result.data.translations.map((translation: IDeepLTranslation) => translation.text); } } } catch (e) { diff --git a/apps/meteor/app/autotranslate/server/googleTranslate.js b/apps/meteor/app/autotranslate/server/googleTranslate.ts similarity index 82% rename from apps/meteor/app/autotranslate/server/googleTranslate.js rename to apps/meteor/app/autotranslate/server/googleTranslate.ts index af351bcaba12..13a861532e38 100644 --- a/apps/meteor/app/autotranslate/server/googleTranslate.js +++ b/apps/meteor/app/autotranslate/server/googleTranslate.ts @@ -5,6 +5,14 @@ import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { HTTP } from 'meteor/http'; import _ from 'underscore'; +import { + IMessage, + IProviderMetadata, + ISupportedLanguage, + ITranslationResult, + IGoogleTranslation, + MessageAttachment, +} from '@rocket.chat/core-typings'; import { AutoTranslate, TranslationProviderRegistry } from './autotranslate'; import { SystemLogger } from '../../../server/lib/logger/system'; @@ -17,6 +25,10 @@ import { settings } from '../../settings/server'; */ class GoogleAutoTranslate extends AutoTranslate { + apiKey: string; + + apiEndPointUrl: string; + /** * setup api reference to Google translate to be used as message translation provider. * @constructor @@ -26,7 +38,7 @@ class GoogleAutoTranslate extends AutoTranslate { this.name = 'google-translate'; this.apiEndPointUrl = 'https://translation.googleapis.com/language/translate/v2'; // Get the service provide API key. - settings.watch('AutoTranslate_GoogleAPIKey', (value) => { + settings.watch('AutoTranslate_GoogleAPIKey', (value) => { this.apiKey = value; }); } @@ -36,7 +48,7 @@ class GoogleAutoTranslate extends AutoTranslate { * @private implements super abstract method. * @returns {object} */ - _getProviderMetadata() { + _getProviderMetadata(): IProviderMetadata { return { name: this.name, displayName: TAPi18n.__('AutoTranslate_Google'), @@ -49,7 +61,7 @@ class GoogleAutoTranslate extends AutoTranslate { * @private implements super abstract method. * @returns {object} */ - _getSettings() { + _getSettings(): IProviderMetadata['settings'] { return { apiKey: this.apiKey, apiEndPointUrl: this.apiEndPointUrl, @@ -63,7 +75,7 @@ class GoogleAutoTranslate extends AutoTranslate { * @param {string} target : user language setting or 'en' * @returns {object} code : value pair */ - getSupportedLanguages(target) { + getSupportedLanguages(target: string): ISupportedLanguage[] { if (!this.apiKey) { return []; } @@ -75,12 +87,9 @@ class GoogleAutoTranslate extends AutoTranslate { let result; const params = { key: this.apiKey, + ...(target && { target }), }; - if (target) { - params.target = target; - } - try { result = HTTP.get('https://translation.googleapis.com/language/translate/v2/languages', { params, @@ -119,8 +128,8 @@ class GoogleAutoTranslate extends AutoTranslate { * @param {object} targetLanguages * @returns {object} translations: Translated messages for each language */ - _translateMessage(message, targetLanguages) { - const translations = {}; + _translateMessage(message: IMessage, targetLanguages: string[]): ITranslationResult { + const translations: { [k: string]: string } = {}; let msgs = message.msg.split('\n'); msgs = msgs.map((msg) => encodeURIComponent(msg)); @@ -149,7 +158,7 @@ class GoogleAutoTranslate extends AutoTranslate { Array.isArray(result.data.data.translations) && result.data.data.translations.length > 0 ) { - const txt = result.data.data.translations.map((translation) => translation.translatedText).join('\n'); + const txt = result.data.data.translations.map((translation: IGoogleTranslation) => translation.translatedText).join('\n'); translations[language] = this.deTokenize(Object.assign({}, message, { msg: txt })); } } catch (e) { @@ -166,9 +175,9 @@ class GoogleAutoTranslate extends AutoTranslate { * @param {object} targetLanguages * @returns {object} translated attachment descriptions for each target language */ - _translateAttachmentDescriptions(attachment, targetLanguages) { - const translations = {}; - const query = `q=${encodeURIComponent(attachment.description || attachment.text)}`; + _translateAttachmentDescriptions(attachment: MessageAttachment, targetLanguages: string[]): ITranslationResult { + const translations: { [k: string]: string } = {}; + const query = `q=${encodeURIComponent(attachment.description || attachment.text || '')}`; const supportedLanguages = this.getSupportedLanguages('en'); targetLanguages.forEach((language) => { @@ -193,7 +202,9 @@ class GoogleAutoTranslate extends AutoTranslate { Array.isArray(result.data.data.translations) && result.data.data.translations.length > 0 ) { - translations[language] = result.data.data.translations.map((translation) => translation.translatedText).join('\n'); + translations[language] = result.data.data.translations + .map((translation: IGoogleTranslation) => translation.translatedText) + .join('\n'); } } catch (e) { SystemLogger.error('Error translating message', e); diff --git a/apps/meteor/app/autotranslate/server/index.js b/apps/meteor/app/autotranslate/server/index.ts similarity index 78% rename from apps/meteor/app/autotranslate/server/index.js rename to apps/meteor/app/autotranslate/server/index.ts index 8a84b619d582..ea971fe59ab1 100644 --- a/apps/meteor/app/autotranslate/server/index.js +++ b/apps/meteor/app/autotranslate/server/index.ts @@ -11,9 +11,9 @@ import './autotranslate'; import './methods/getSupportedLanguages'; import './methods/saveSettings'; import './methods/translateMessage'; -import './googleTranslate.js'; -import './deeplTranslate.js'; -import './msTranslate.js'; -import './methods/getProviderUiMetadata.js'; +import './googleTranslate'; +import './deeplTranslate'; +import './msTranslate'; +import './methods/getProviderUiMetadata'; export { AutoTranslate, TranslationProviderRegistry }; diff --git a/apps/meteor/app/autotranslate/server/logger.js b/apps/meteor/app/autotranslate/server/logger.ts similarity index 100% rename from apps/meteor/app/autotranslate/server/logger.js rename to apps/meteor/app/autotranslate/server/logger.ts diff --git a/apps/meteor/app/autotranslate/server/methods/getProviderUiMetadata.js b/apps/meteor/app/autotranslate/server/methods/getProviderUiMetadata.ts similarity index 100% rename from apps/meteor/app/autotranslate/server/methods/getProviderUiMetadata.js rename to apps/meteor/app/autotranslate/server/methods/getProviderUiMetadata.ts diff --git a/apps/meteor/app/autotranslate/server/methods/getSupportedLanguages.js b/apps/meteor/app/autotranslate/server/methods/getSupportedLanguages.ts similarity index 68% rename from apps/meteor/app/autotranslate/server/methods/getSupportedLanguages.js rename to apps/meteor/app/autotranslate/server/methods/getSupportedLanguages.ts index 64ba301efdfd..c74dea902a6e 100644 --- a/apps/meteor/app/autotranslate/server/methods/getSupportedLanguages.js +++ b/apps/meteor/app/autotranslate/server/methods/getSupportedLanguages.ts @@ -1,12 +1,19 @@ import { Meteor } from 'meteor/meteor'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; -import { hasPermission } from '../../../authorization'; +import { hasPermission } from '../../../authorization/server'; import { TranslationProviderRegistry } from '..'; Meteor.methods({ 'autoTranslate.getSupportedLanguages'(targetLanguage) { - if (!hasPermission(Meteor.userId(), 'auto-translate')) { + const userId = Meteor.userId(); + if (!userId) { + throw new Meteor.Error('error-invalid-user', 'Invalid user', { + method: 'getSupportedLanguages', + }); + } + + if (!hasPermission(userId, 'auto-translate')) { throw new Meteor.Error('error-action-not-allowed', 'Auto-Translate is not allowed', { method: 'autoTranslate.saveSettings', }); diff --git a/apps/meteor/app/autotranslate/server/methods/saveSettings.js b/apps/meteor/app/autotranslate/server/methods/saveSettings.ts similarity index 85% rename from apps/meteor/app/autotranslate/server/methods/saveSettings.js rename to apps/meteor/app/autotranslate/server/methods/saveSettings.ts index 9587e890e4ac..601a1273af82 100644 --- a/apps/meteor/app/autotranslate/server/methods/saveSettings.js +++ b/apps/meteor/app/autotranslate/server/methods/saveSettings.ts @@ -1,18 +1,19 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { hasPermission } from '../../../authorization'; -import { Subscriptions } from '../../../models'; +import { hasPermission } from '../../../authorization/server'; +import { Subscriptions } from '../../../models/server'; Meteor.methods({ 'autoTranslate.saveSettings'(rid, field, value, options) { - if (!Meteor.userId()) { + const userId = Meteor.userId(); + if (!userId) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'saveAutoTranslateSettings', }); } - if (!hasPermission(Meteor.userId(), 'auto-translate')) { + if (!hasPermission(userId, 'auto-translate')) { throw new Meteor.Error('error-action-not-allowed', 'Auto-Translate is not allowed', { method: 'autoTranslate.saveSettings', }); @@ -28,7 +29,7 @@ Meteor.methods({ }); } - const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, Meteor.userId()); + const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, userId); if (!subscription) { throw new Meteor.Error('error-invalid-subscription', 'Invalid subscription', { method: 'saveAutoTranslateSettings', diff --git a/apps/meteor/app/autotranslate/server/methods/translateMessage.js b/apps/meteor/app/autotranslate/server/methods/translateMessage.ts similarity index 77% rename from apps/meteor/app/autotranslate/server/methods/translateMessage.js rename to apps/meteor/app/autotranslate/server/methods/translateMessage.ts index bedf65518326..8e41604849bf 100644 --- a/apps/meteor/app/autotranslate/server/methods/translateMessage.js +++ b/apps/meteor/app/autotranslate/server/methods/translateMessage.ts @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Rooms } from '../../../models'; +import { Rooms } from '../../../models/server'; import { TranslationProviderRegistry } from '..'; Meteor.methods({ @@ -8,7 +8,7 @@ Meteor.methods({ if (!TranslationProviderRegistry.enabled) { return; } - const room = Rooms.findOneById(message && message.rid); + const room = Rooms.findOneById(message?.rid); if (message && room) { TranslationProviderRegistry.translateMessage(message, room, targetLanguage); } diff --git a/apps/meteor/app/autotranslate/server/msTranslate.js b/apps/meteor/app/autotranslate/server/msTranslate.ts similarity index 81% rename from apps/meteor/app/autotranslate/server/msTranslate.js rename to apps/meteor/app/autotranslate/server/msTranslate.ts index 4ee381cc938b..ccf34ddaca69 100644 --- a/apps/meteor/app/autotranslate/server/msTranslate.js +++ b/apps/meteor/app/autotranslate/server/msTranslate.ts @@ -5,6 +5,7 @@ import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { HTTP } from 'meteor/http'; import _ from 'underscore'; +import { IMessage, IProviderMetadata, ISupportedLanguage, ITranslationResult, MessageAttachment } from '@rocket.chat/core-typings'; import { TranslationProviderRegistry, AutoTranslate } from './autotranslate'; import { msLogger } from './logger'; @@ -19,6 +20,16 @@ import { settings } from '../../settings/server'; * @augments AutoTranslate */ class MsAutoTranslate extends AutoTranslate { + apiKey: string; + + apiEndPointUrl: string; + + apiDetectText: string; + + apiGetLanguages: string; + + breakSentence: string; + /** * setup api reference to Microsoft translate to be used as message translation provider. * @constructor @@ -31,7 +42,7 @@ class MsAutoTranslate extends AutoTranslate { this.apiGetLanguages = 'https://api.cognitive.microsofttranslator.com/languages?api-version=3.0'; this.breakSentence = 'https://api.cognitive.microsofttranslator.com/breaksentence?api-version=3.0'; // Get the service provide API key. - settings.watch('AutoTranslate_MicrosoftAPIKey', (value) => { + settings.watch('AutoTranslate_MicrosoftAPIKey', (value) => { this.apiKey = value; }); } @@ -41,7 +52,7 @@ class MsAutoTranslate extends AutoTranslate { * @private implements super abstract method. * @return {object} */ - _getProviderMetadata() { + _getProviderMetadata(): IProviderMetadata { return { name: this.name, displayName: TAPi18n.__('AutoTranslate_Microsoft'), @@ -54,7 +65,7 @@ class MsAutoTranslate extends AutoTranslate { * @private implements super abstract method. * @return {object} */ - _getSettings() { + _getSettings(): IProviderMetadata['settings'] { return { apiKey: this.apiKey, apiEndPointUrl: this.apiEndPointUrl, @@ -69,9 +80,9 @@ class MsAutoTranslate extends AutoTranslate { * @param {string} target * @returns {object} code : value pair */ - getSupportedLanguages(target) { + getSupportedLanguages(target: string): ISupportedLanguage[] { if (!this.apiKey) { - return; + return []; } if (this.supportedLanguages[target]) { return this.supportedLanguages[target]; @@ -92,8 +103,13 @@ class MsAutoTranslate extends AutoTranslate { * @throws Communication Errors * @returns {object} translations: Translated messages for each language */ - _translate(data, targetLanguages) { - let translations = {}; + _translate( + data: { + Text: string; + }[], + targetLanguages: string[], + ): ITranslationResult { + let translations: { [k: string]: string } = {}; const supportedLanguages = this.getSupportedLanguages('en'); targetLanguages = targetLanguages.map((language) => { if (language.indexOf('-') !== -1 && !_.findWhere(supportedLanguages, { language })) { @@ -115,7 +131,12 @@ class MsAutoTranslate extends AutoTranslate { translations = Object.assign( {}, ...targetLanguages.map((language) => ({ - [language]: result.data.map((line) => line.translations.find((translation) => translation.to === language).text).join('\n'), + [language]: result.data + .map( + (line: { translations: { to: string; text: string }[] }) => + line.translations.find((translation) => translation.to === language)?.text, + ) + .join('\n'), })), ); } @@ -130,7 +151,7 @@ class MsAutoTranslate extends AutoTranslate { * @param {object} targetLanguages * @returns {object} translations: Translated messages for each language */ - _translateMessage(message, targetLanguages) { + _translateMessage(message: IMessage, targetLanguages: string[]): ITranslationResult { // There are multi-sentence-messages where multiple sentences come from different languages // This is a problem for translation services since the language detection fails. // Thus, we'll split the message in sentences, get them translated, and join them again after translation @@ -150,12 +171,12 @@ class MsAutoTranslate extends AutoTranslate { * @param {object} targetLanguages * @returns {object} translated messages for each target language */ - _translateAttachmentDescriptions(attachment, targetLanguages) { + _translateAttachmentDescriptions(attachment: MessageAttachment, targetLanguages: string[]): ITranslationResult { try { return this._translate( [ { - Text: attachment.description || attachment.text, + Text: attachment.description || attachment.text || '', }, ], targetLanguages, diff --git a/apps/meteor/app/markdown/lib/parser/original/token.ts b/apps/meteor/app/markdown/lib/parser/original/token.ts index eccc700488a0..f251750ce0ed 100644 --- a/apps/meteor/app/markdown/lib/parser/original/token.ts +++ b/apps/meteor/app/markdown/lib/parser/original/token.ts @@ -3,22 +3,9 @@ * @param {String} msg - The message html */ import { Random } from 'meteor/random'; -import type { IMessage } from '@rocket.chat/core-typings'; +import type { IMessage, TokenType, TokenExtra } from '@rocket.chat/core-typings'; -type TokenType = 'code' | 'inlinecode' | 'bold' | 'italic' | 'strike' | 'link'; -type Token = { - token: string; - type: TokenType; - text: string; - noHtml?: string; -} & TokenExtra; - -type TokenExtra = { - highlight?: boolean; - noHtml?: string; -}; - -export const addAsToken = (message: IMessage & { tokens: Token[] }, html: string, type: TokenType, extra?: TokenExtra): string => { +export const addAsToken = (message: IMessage, html: string, type: TokenType, extra?: TokenExtra): string => { if (!message.tokens) { message.tokens = []; } @@ -35,14 +22,14 @@ export const addAsToken = (message: IMessage & { tokens: Token[] }, html: string export const isToken = (msg: string): boolean => /=!=[.a-z0-9]{17}=!=/gim.test(msg.trim()); -export const validateAllowedTokens = (message: IMessage & { tokens: Token[] }, id: string, desiredTokens: TokenType[]): boolean => { +export const validateAllowedTokens = (message: IMessage, id: string, desiredTokens: TokenType[]): boolean => { const tokens = id.match(/=!=[.a-z0-9]{17}=!=/gim) || []; - const tokensFound = message.tokens.filter(({ token }) => tokens.includes(token)); - return tokensFound.length === 0 || tokensFound.every((token) => desiredTokens.includes(token.type)); + const tokensFound = message.tokens?.filter(({ token }) => tokens.includes(token)) || []; + return tokensFound.length === 0 || tokensFound.every((token) => token.type && desiredTokens.includes(token.type)); }; -export const validateForbiddenTokens = (message: IMessage & { tokens: Token[] }, id: string, desiredTokens: TokenType[]): boolean => { +export const validateForbiddenTokens = (message: IMessage, id: string, desiredTokens: TokenType[]): boolean => { const tokens = id.match(/=!=[.a-z0-9]{17}=!=/gim) || []; - const tokensFound = message.tokens.filter(({ token }) => tokens.includes(token)); - return tokensFound.length === 0 || !tokensFound.some((token) => desiredTokens.includes(token.type)); + const tokensFound = message.tokens?.filter(({ token }) => tokens.includes(token)) || []; + return tokensFound.length === 0 || !tokensFound.some((token) => token.type && desiredTokens.includes(token.type)); }; diff --git a/packages/core-typings/src/IAutoTranslate.ts b/packages/core-typings/src/IAutoTranslate.ts new file mode 100644 index 000000000000..a3eb0d703509 --- /dev/null +++ b/packages/core-typings/src/IAutoTranslate.ts @@ -0,0 +1,28 @@ +export interface IProviderMetadata { + name: string; + displayName: string; + settings: { + apiKey: string; + apiEndPointUrl: string; + }; +} +export interface IDeepLTranslation { + detected_source_language: string; + text: string; +} + +export interface IGoogleTranslation { + translatedText: string; +} + +export interface ISupportedLanguage { + language: string; + name: string; +} +export interface ISupportedLanguages { + [language: string]: ISupportedLanguage[]; +} + +export interface ITranslationResult { + [language: string]: string; +} diff --git a/packages/core-typings/src/IMessage/IMessage.ts b/packages/core-typings/src/IMessage/IMessage.ts index 19fc3f51ed09..f473d4e093a1 100644 --- a/packages/core-typings/src/IMessage/IMessage.ts +++ b/packages/core-typings/src/IMessage/IMessage.ts @@ -75,6 +75,19 @@ export type MessageTypesValues = | OmnichannelTypesValues | OtrSystemMessages; +export type TokenType = 'code' | 'inlinecode' | 'bold' | 'italic' | 'strike' | 'link'; +export type Token = { + token: string; + text: string; + type?: TokenType; + noHtml?: string; +} & TokenExtra; + +export type TokenExtra = { + highlight?: boolean; + noHtml?: string; +}; + export interface IMessage extends IRocketChatRecord { rid: RoomID; msg: string; @@ -141,6 +154,10 @@ export interface IMessage extends IRocketChatRecord { avatar?: string; emoji?: string; + + // Tokenization fields + tokens?: Token[]; + html?: string; } export type MessageSystem = { @@ -155,7 +172,9 @@ export interface IEditedMessage extends IMessage { export const isEditedMessage = (message: IMessage): message is IEditedMessage => 'editedAt' in message && 'editedBy' in message; export interface ITranslatedMessage extends IMessage { - translations: { [key: string]: unknown }; + translations: { [key: string]: string } & { original?: string }; + autoTranslateShowInverse?: boolean; + autoTranslateFetching?: boolean; } export const isTranslatedMessage = (message: IMessage): message is ITranslatedMessage => 'translations' in message; diff --git a/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentBase.ts b/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentBase.ts index 3be06ebbadeb..dd9ec2be1bf3 100644 --- a/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentBase.ts +++ b/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentBase.ts @@ -4,6 +4,7 @@ export type MessageAttachmentBase = { ts?: Date; collapsed?: boolean; description?: string; + text?: string; title_link?: string; title_link_download?: boolean; diff --git a/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentDefault.ts b/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentDefault.ts index 35ec8f4e9844..5c69c7314129 100644 --- a/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentDefault.ts +++ b/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentDefault.ts @@ -24,4 +24,8 @@ export type MessageAttachmentDefault = { thumb_url?: string; color?: string; + + translations?: { + [language: string]: string; + }; } & MessageAttachmentBase; diff --git a/packages/core-typings/src/index.ts b/packages/core-typings/src/index.ts index 1c10dc427118..66fd24282b13 100644 --- a/packages/core-typings/src/index.ts +++ b/packages/core-typings/src/index.ts @@ -105,3 +105,5 @@ export * from './IVoipServerConfig'; export * from './IVoipServerConnectivityStatus'; export * from './IOmnichannelVoipServiceResult'; export * from './IInquiry'; + +export * from './IAutoTranslate'; diff --git a/packages/ui-contexts/src/ServerContext/methods.ts b/packages/ui-contexts/src/ServerContext/methods.ts index ff9d501f56a3..a7e33bb974fb 100644 --- a/packages/ui-contexts/src/ServerContext/methods.ts +++ b/packages/ui-contexts/src/ServerContext/methods.ts @@ -1,4 +1,4 @@ -import type { IRoom, ISetting, IUser } from '@rocket.chat/core-typings'; +import type { IRoom, ISetting, ISupportedLanguage, IUser } from '@rocket.chat/core-typings'; import type { DeleteWriteOpResultObject } from 'mongodb'; import type { AddWebdavAccountMethod } from './methods/addWebdavAccount'; @@ -123,6 +123,8 @@ export interface ServerMethods { 'getRoomById': (rid: IRoom['_id']) => IRoom; 'getReadReceipts': GetReadReceiptsMethod; 'checkRegistrationSecretURL': (hash: string) => boolean; + 'autoTranslate.getProviderUiMetadata': () => Record; + 'autoTranslate.getSupportedLanguages': (language: string) => ISupportedLanguage[]; } export type ServerMethodName = keyof ServerMethods; From 66c7f180b29d8ec270ffce423f8605f3c41e9e76 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Fri, 20 May 2022 17:35:54 -0300 Subject: [PATCH 20/50] Chore: Convert additionalForms (#25586) Co-authored-by: Martin --- .../views/omnichannel/additionalForms.js | 26 -------- .../views/omnichannel/additionalForms.tsx | 42 +++++++++++++ .../MaxChatsPerAgentDisplay.js | 16 +++-- .../omnichannel/additionalForms/register.js | 51 --------------- .../omnichannel/additionalForms/register.ts | 62 +++++++++++++++++++ 5 files changed, 111 insertions(+), 86 deletions(-) delete mode 100644 apps/meteor/client/views/omnichannel/additionalForms.js create mode 100644 apps/meteor/client/views/omnichannel/additionalForms.tsx delete mode 100644 apps/meteor/ee/client/omnichannel/additionalForms/register.js create mode 100644 apps/meteor/ee/client/omnichannel/additionalForms/register.ts diff --git a/apps/meteor/client/views/omnichannel/additionalForms.js b/apps/meteor/client/views/omnichannel/additionalForms.js deleted file mode 100644 index a3aaca93ba32..000000000000 --- a/apps/meteor/client/views/omnichannel/additionalForms.js +++ /dev/null @@ -1,26 +0,0 @@ -const createFormSubscription = () => { - let forms = {}; - let updateCb = () => {}; - - const formsSubscription = { - subscribe: (cb) => { - updateCb = cb; - return () => { - updateCb = () => {}; - }; - }, - getCurrentValue: () => forms, - }; - const registerForm = (newForm) => { - forms = { ...forms, ...newForm }; - updateCb(); - }; - const unregisterForm = (form) => { - delete forms[form]; - updateCb(); - }; - - return { registerForm, unregisterForm, formsSubscription }; -}; - -export const { registerForm, unregisterForm, formsSubscription } = createFormSubscription(); diff --git a/apps/meteor/client/views/omnichannel/additionalForms.tsx b/apps/meteor/client/views/omnichannel/additionalForms.tsx new file mode 100644 index 000000000000..a8fab3c41a2c --- /dev/null +++ b/apps/meteor/client/views/omnichannel/additionalForms.tsx @@ -0,0 +1,42 @@ +/* eslint-disable @typescript-eslint/no-empty-interface */ +import { ReactElement } from 'react'; +import { Unsubscribe, useSubscription, Subscription } from 'use-subscription'; + +// eslint-disable-next-line @typescript-eslint/interface-name-prefix +export interface EEFormHooks {} + +const createFormSubscription = (): { + registerForm: (form: EEFormHooks) => void; + unregisterForm: (form: keyof EEFormHooks) => void; + formsSubscription: Subscription; + getForm: (form: keyof EEFormHooks) => () => ReactElement; +} => { + let forms = {} as EEFormHooks; + let updateCb = (): void => undefined; + + const formsSubscription: Subscription = { + subscribe: (cb: () => void): Unsubscribe => { + updateCb = cb; + return (): void => { + updateCb = (): void => undefined; + }; + }, + getCurrentValue: (): EEFormHooks => forms, + }; + const registerForm = (newForm: EEFormHooks): void => { + forms = { ...forms, ...newForm }; + updateCb(); + }; + const unregisterForm = (form: keyof EEFormHooks): void => { + delete forms[form]; + updateCb(); + }; + + const getForm = (form: keyof EEFormHooks): (() => ReactElement) => (forms as any)[form] as any; + + return { registerForm, unregisterForm, formsSubscription, getForm }; +}; + +export const { registerForm, unregisterForm, formsSubscription, getForm } = createFormSubscription(); + +export const useFormsSubscription = (): EEFormHooks => useSubscription(formsSubscription); diff --git a/apps/meteor/ee/client/omnichannel/additionalForms/MaxChatsPerAgentDisplay.js b/apps/meteor/ee/client/omnichannel/additionalForms/MaxChatsPerAgentDisplay.js index c11a3c6727e7..9783e69985f9 100644 --- a/apps/meteor/ee/client/omnichannel/additionalForms/MaxChatsPerAgentDisplay.js +++ b/apps/meteor/ee/client/omnichannel/additionalForms/MaxChatsPerAgentDisplay.js @@ -3,16 +3,14 @@ import React from 'react'; import UserInfo from '../../../../client/views/room/contextualBar/UserInfo'; -const MaxChatsPerAgentDisplay = ({ data: { livechat: { maxNumberSimultaneousChat = '' } = {} } = {} }) => { +const MaxChatsPerAgentDisplay = ({ data: { livechat: { maxNumberSimultaneousChat = 0 } = {} } = {} }) => { const t = useTranslation(); - return ( - maxNumberSimultaneousChat && ( - <> - {t('Max_number_of_chats_per_agent')} - {maxNumberSimultaneousChat} - - ) - ); + return maxNumberSimultaneousChat ? ( + <> + {t('Max_number_of_chats_per_agent')} + {maxNumberSimultaneousChat} + + ) : null; }; export default MaxChatsPerAgentDisplay; diff --git a/apps/meteor/ee/client/omnichannel/additionalForms/register.js b/apps/meteor/ee/client/omnichannel/additionalForms/register.js deleted file mode 100644 index e7a5d93259f9..000000000000 --- a/apps/meteor/ee/client/omnichannel/additionalForms/register.js +++ /dev/null @@ -1,51 +0,0 @@ -import { useMemo, lazy } from 'react'; - -import { registerForm } from '../../../../client/views/omnichannel/additionalForms'; -import { hasLicense } from '../../../app/license/client'; - -hasLicense('livechat-enterprise').then((enabled) => { - if (!enabled) { - return; - } - - registerForm({ - useCustomFieldsAdditionalForm: () => useMemo(() => lazy(() => import('./CustomFieldsAdditionalFormContainer')), []), - }); - registerForm({ - useMaxChatsPerAgent: () => useMemo(() => lazy(() => import('./MaxChatsPerAgentContainer')), []), - }); - registerForm({ - useMaxChatsPerAgentDisplay: () => useMemo(() => lazy(() => import('./MaxChatsPerAgentDisplay')), []), - }); - registerForm({ - useEeNumberInput: () => useMemo(() => lazy(() => import('./EeNumberInput')), []), - }); - registerForm({ - useEeTextAreaInput: () => useMemo(() => lazy(() => import('./EeTextAreaInput')), []), - }); - registerForm({ useEeTextInput: () => useMemo(() => lazy(() => import('./EeTextInput')), []) }); - registerForm({ - useBusinessHoursMultiple: () => useMemo(() => lazy(() => import('./BusinessHoursMultipleContainer')), []), - }); - registerForm({ - useBusinessHoursTimeZone: () => useMemo(() => lazy(() => import('./BusinessHoursTimeZone')), []), - }); - registerForm({ - useContactManager: () => useMemo(() => lazy(() => import('./ContactManager')), []), - }); - registerForm({ - useCurrentChatTags: () => useMemo(() => lazy(() => import('../tags/CurrentChatTags')), []), - }); - registerForm({ - useDepartmentBusinessHours: () => useMemo(() => lazy(() => import('./DepartmentBusinessHours')), []), - }); - registerForm({ - useDepartmentForwarding: () => useMemo(() => lazy(() => import('./DepartmentForwarding')), []), - }); - registerForm({ - usePrioritiesSelect: () => useMemo(() => lazy(() => import('./PrioritiesSelect')), []), - }); - registerForm({ - useSelectForwardDepartment: () => useMemo(() => lazy(() => import('../../../../client/components/AutoCompleteDepartment')), []), - }); -}); diff --git a/apps/meteor/ee/client/omnichannel/additionalForms/register.ts b/apps/meteor/ee/client/omnichannel/additionalForms/register.ts new file mode 100644 index 000000000000..e4123f4a155b --- /dev/null +++ b/apps/meteor/ee/client/omnichannel/additionalForms/register.ts @@ -0,0 +1,62 @@ +import { useMemo, lazy } from 'react'; + +import type AutoCompleteDepartment from '../../../../client/components/AutoCompleteDepartment'; +import { registerForm } from '../../../../client/views/omnichannel/additionalForms'; +import { hasLicense } from '../../../app/license/client'; +import type CurrentChatTags from '../tags/CurrentChatTags'; +import type BusinessHoursMultipleContainer from './BusinessHoursMultipleContainer'; +import type BusinessHoursTimeZone from './BusinessHoursTimeZone'; +import type ContactManager from './ContactManager'; +import type CustomFieldsAdditionalFormContainer from './CustomFieldsAdditionalFormContainer'; +import type DepartmentBusinessHours from './DepartmentBusinessHours'; +import type DepartmentForwarding from './DepartmentForwarding'; +import type EeNumberInput from './EeNumberInput'; +import type EeTextAreaInput from './EeTextAreaInput'; +import type EeTextInput from './EeTextInput'; +import type MaxChatsPerAgentContainer from './MaxChatsPerAgentContainer'; +import type MaxChatsPerAgentDisplay from './MaxChatsPerAgentDisplay'; +import type PrioritiesSelect from './PrioritiesSelect'; + +declare module '../../../../client/views/omnichannel/additionalForms' { + // eslint-disable-next-line @typescript-eslint/interface-name-prefix + interface EEFormHooks { + useCustomFieldsAdditionalForm: () => React.LazyExoticComponent; + useMaxChatsPerAgent?: () => React.LazyExoticComponent; + useMaxChatsPerAgentDisplay?: () => React.LazyExoticComponent; + useEeNumberInput?: () => React.LazyExoticComponent; + useEeTextAreaInput?: () => React.LazyExoticComponent; + useBusinessHoursMultiple?: () => React.LazyExoticComponent; + useEeTextInput?: () => React.LazyExoticComponent; + useBusinessHoursTimeZone?: () => React.LazyExoticComponent; + useContactManager?: () => React.LazyExoticComponent; + + useCurrentChatTags?: () => React.LazyExoticComponent; + useDepartmentBusinessHours?: () => React.LazyExoticComponent; + useDepartmentForwarding?: () => React.LazyExoticComponent; + usePrioritiesSelect?: () => React.LazyExoticComponent; + useSelectForwardDepartment?: () => React.LazyExoticComponent; + } +} + +hasLicense('livechat-enterprise').then((enabled) => { + if (!enabled) { + return; + } + + registerForm({ + useCustomFieldsAdditionalForm: () => useMemo(() => lazy(() => import('./CustomFieldsAdditionalFormContainer')), []), + useMaxChatsPerAgent: () => useMemo(() => lazy(() => import('./MaxChatsPerAgentContainer')), []), + useMaxChatsPerAgentDisplay: () => useMemo(() => lazy(() => import('./MaxChatsPerAgentDisplay')), []), + useEeNumberInput: () => useMemo(() => lazy(() => import('./EeNumberInput')), []), + useEeTextAreaInput: () => useMemo(() => lazy(() => import('./EeTextAreaInput')), []), + useBusinessHoursMultiple: () => useMemo(() => lazy(() => import('./BusinessHoursMultipleContainer')), []), + useEeTextInput: () => useMemo(() => lazy(() => import('./EeTextInput')), []), + useBusinessHoursTimeZone: () => useMemo(() => lazy(() => import('./BusinessHoursTimeZone')), []), + useContactManager: () => useMemo(() => lazy(() => import('./ContactManager')), []), + useCurrentChatTags: () => useMemo(() => lazy(() => import('../tags/CurrentChatTags')), []), + useDepartmentBusinessHours: () => useMemo(() => lazy(() => import('./DepartmentBusinessHours')), []), + useDepartmentForwarding: () => useMemo(() => lazy(() => import('./DepartmentForwarding')), []), + usePrioritiesSelect: () => useMemo(() => lazy(() => import('./PrioritiesSelect')), []), + useSelectForwardDepartment: () => useMemo(() => lazy(() => import('../../../../client/components/AutoCompleteDepartment')), []), + }); +}); From bc972b40052f4c3fa4e572726f9dbad1c250fbac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Fri, 20 May 2022 18:27:58 -0300 Subject: [PATCH 21/50] Chore: Convert Create Channel (#25589) Co-authored-by: julia foresti --- .../{CreateChannel.js => CreateChannel.tsx} | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) rename apps/meteor/client/sidebar/header/{CreateChannel.js => CreateChannel.tsx} (85%) diff --git a/apps/meteor/client/sidebar/header/CreateChannel.js b/apps/meteor/client/sidebar/header/CreateChannel.tsx similarity index 85% rename from apps/meteor/client/sidebar/header/CreateChannel.js rename to apps/meteor/client/sidebar/header/CreateChannel.tsx index f5a2f25dec49..7f18bf7978f9 100644 --- a/apps/meteor/client/sidebar/header/CreateChannel.js +++ b/apps/meteor/client/sidebar/header/CreateChannel.tsx @@ -1,10 +1,34 @@ import { Box, Modal, ButtonGroup, Button, TextInput, Icon, Field, ToggleSwitch, FieldGroup } from '@rocket.chat/fuselage'; import { useDebouncedCallback } from '@rocket.chat/fuselage-hooks'; import { useSetting, useMethod, useTranslation } from '@rocket.chat/ui-contexts'; -import React, { useEffect, useMemo, useState } from 'react'; +import React, { ReactElement, useEffect, useMemo, useState } from 'react'; import UserAutoCompleteMultiple from '../../components/UserAutoCompleteMultiple'; +type CreateChannelProps = { + values: { + name: string; + type?: boolean; + readOnly?: boolean; + encrypted?: boolean; + broadcast?: boolean; + users?: string[]; + }; + handlers: { + handleName?: () => void; + handleDescription?: () => void; + handleEncrypted?: () => void; + handleReadOnly?: () => void; + }; + hasUnsavedChanges: boolean; + onChangeUsers: () => void; + onChangeType: () => void; + onChangeBroadcast: () => void; + canOnlyCreateOneType?: boolean; + e2eEnabledForPrivateByDefault?: boolean; + onCreate: () => void; + onClose: () => void; +}; const CreateChannel = ({ values, handlers, @@ -16,7 +40,7 @@ const CreateChannel = ({ e2eEnabledForPrivateByDefault, onCreate, onClose, -}) => { +}: CreateChannelProps): ReactElement => { const t = useTranslation(); const e2eEnabled = useSetting('E2E_Enable'); const namesValidation = useSetting('UTF8_Channel_Names_Validation'); @@ -25,11 +49,11 @@ const CreateChannel = ({ const channelNameRegex = useMemo(() => new RegExp(`^${namesValidation}$`), [namesValidation]); - const [nameError, setNameError] = useState(); + const [nameError, setNameError] = useState(); const checkName = useDebouncedCallback( - async (name) => { - setNameError(false); + async (name: string) => { + setNameError(undefined); if (hasUnsavedChanges) { return; } @@ -98,7 +122,7 @@ const CreateChannel = ({ {values.type ? t('Only_invited_users_can_acess_this_channel') : t('Everyone_can_access_this_channel')}
- + From 1e86788fc6a0bbbb639b13ebaf3d32fb3c873f6e Mon Sep 17 00:00:00 2001 From: eduardofcabrera <64327259+eduardofcabrera@users.noreply.github.com> Date: Sat, 21 May 2022 00:02:28 -0300 Subject: [PATCH 22/50] Chore: Convert to typescript the slash commands help files (#24307) Co-authored-by: Pierre Lehnen Co-authored-by: Pierre Lehnen <55164754+pierre-lehnen-rc@users.noreply.github.com> --- .../slashcommands-help/{index.js => index.ts} | 0 .../server/{index.js => index.ts} | 0 .../app/slashcommands-help/server/server.js | 58 -------------- .../app/slashcommands-help/server/server.ts | 79 +++++++++++++++++++ 4 files changed, 79 insertions(+), 58 deletions(-) rename apps/meteor/app/slashcommands-help/{index.js => index.ts} (100%) rename apps/meteor/app/slashcommands-help/server/{index.js => index.ts} (100%) delete mode 100644 apps/meteor/app/slashcommands-help/server/server.js create mode 100644 apps/meteor/app/slashcommands-help/server/server.ts diff --git a/apps/meteor/app/slashcommands-help/index.js b/apps/meteor/app/slashcommands-help/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-help/index.js rename to apps/meteor/app/slashcommands-help/index.ts diff --git a/apps/meteor/app/slashcommands-help/server/index.js b/apps/meteor/app/slashcommands-help/server/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-help/server/index.js rename to apps/meteor/app/slashcommands-help/server/index.ts diff --git a/apps/meteor/app/slashcommands-help/server/server.js b/apps/meteor/app/slashcommands-help/server/server.js deleted file mode 100644 index d0785f5f78d3..000000000000 --- a/apps/meteor/app/slashcommands-help/server/server.js +++ /dev/null @@ -1,58 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; - -import { slashCommands } from '../../utils'; -import { api } from '../../../server/sdk/api'; - -/* - * Help is a named function that will replace /join commands - * @param {Object} message - The message object - */ - -slashCommands.add( - 'help', - function Help(command, params, item) { - const user = Meteor.users.findOne(Meteor.userId()); - const keys = [ - { - Open_channel_user_search: 'Command (or Ctrl) + p OR Command (or Ctrl) + k', - }, - { - Mark_all_as_read: 'Shift (or Ctrl) + ESC', - }, - { - Edit_previous_message: 'Up Arrow', - }, - { - Move_beginning_message: 'Command (or Alt) + Left Arrow', - }, - { - Move_beginning_message: 'Command (or Alt) + Up Arrow', - }, - { - Move_end_message: 'Command (or Alt) + Right Arrow', - }, - { - Move_end_message: 'Command (or Alt) + Down Arrow', - }, - { - New_line_message_compose_input: 'Shift + Enter', - }, - ]; - keys.forEach((key) => { - api.broadcast('notify.ephemeralMessage', Meteor.userId(), item.rid, { - msg: TAPi18n.__( - Object.keys(key)[0], - { - postProcess: 'sprintf', - sprintf: [key[Object.keys(key)[0]]], - }, - user.language, - ), - }); - }); - }, - { - description: 'Show_the_keyboard_shortcut_list', - }, -); diff --git a/apps/meteor/app/slashcommands-help/server/server.ts b/apps/meteor/app/slashcommands-help/server/server.ts new file mode 100644 index 000000000000..e71387d08c73 --- /dev/null +++ b/apps/meteor/app/slashcommands-help/server/server.ts @@ -0,0 +1,79 @@ +import { Meteor } from 'meteor/meteor'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import type { IMessage } from '@rocket.chat/core-typings'; + +import { settings } from '../../settings/server'; +import { slashCommands } from '../../utils/lib/slashCommand'; +import { api } from '../../../server/sdk/api'; +import { Users } from '../../models/server'; + +/* + * Help is a named function that will replace /help commands + * @param {Object} message - The message object + */ + +interface IHelpCommand { + key: string; + command: string; +} + +function Help(_command: 'help', _params: string, item: IMessage): void { + const userId = Meteor.userId() as string; + const user = Users.findOneById(userId); + + const keys: IHelpCommand[] = [ + { + key: 'Open_channel_user_search', + command: 'Command (or Ctrl) + p OR Command (or Ctrl) + k', + }, + { + key: 'Mark_all_as_read', + command: 'Shift (or Ctrl) + ESC', + }, + { + key: 'Edit_previous_message', + command: 'Up Arrow', + }, + { + key: 'Move_beginning_message', + command: 'Command (or Alt) + Left Arrow', + }, + { + key: 'Move_beginning_message', + command: 'Command (or Alt) + Up Arrow', + }, + { + key: 'Move_end_message', + command: 'Command (or Alt) + Right Arrow', + }, + { + key: 'Move_end_message', + command: 'Command (or Alt) + Down Arrow', + }, + { + key: 'New_line_message_compose_input', + command: 'Shift + Enter', + }, + ]; + keys.forEach((key) => { + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__(key.key, { + postProcess: 'sprintf', + sprintf: [key.command], + lng: user?.language || settings.get('Language') || 'en', + }), + }); + }); +} + +slashCommands.add( + 'help', + Help, + { + description: 'Show_the_keyboard_shortcut_list', + }, + undefined, + false, + undefined, + undefined, +); From 4b1114991f12c0a365dde6c29093591227c17b39 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Fri, 20 May 2022 21:18:28 -0600 Subject: [PATCH 23/50] Chore: Migrate retention-policy to ts (#25582) --- .../retention-policy/{index.js => index.ts} | 0 ...nPruneMessages.js => cronPruneMessages.ts} | 37 +++++++++++-------- .../server/{index.js => index.ts} | 0 packages/core-typings/src/IRoom.ts | 9 +++++ 4 files changed, 30 insertions(+), 16 deletions(-) rename apps/meteor/app/retention-policy/{index.js => index.ts} (100%) rename apps/meteor/app/retention-policy/server/{cronPruneMessages.js => cronPruneMessages.ts} (71%) rename apps/meteor/app/retention-policy/server/{index.js => index.ts} (100%) diff --git a/apps/meteor/app/retention-policy/index.js b/apps/meteor/app/retention-policy/index.ts similarity index 100% rename from apps/meteor/app/retention-policy/index.js rename to apps/meteor/app/retention-policy/index.ts diff --git a/apps/meteor/app/retention-policy/server/cronPruneMessages.js b/apps/meteor/app/retention-policy/server/cronPruneMessages.ts similarity index 71% rename from apps/meteor/app/retention-policy/server/cronPruneMessages.js rename to apps/meteor/app/retention-policy/server/cronPruneMessages.ts index 2a26df45df56..1d4ce3169bff 100644 --- a/apps/meteor/app/retention-policy/server/cronPruneMessages.js +++ b/apps/meteor/app/retention-policy/server/cronPruneMessages.ts @@ -1,12 +1,13 @@ import { SyncedCron } from 'meteor/littledata:synced-cron'; +import { IRoomWithRetentionPolicy } from '@rocket.chat/core-typings'; import { settings } from '../../settings/server'; import { Rooms } from '../../models/server'; -import { cleanRoomHistory } from '../../lib'; +import { cleanRoomHistory } from '../../lib/server'; -let types = []; - -const oldest = new Date('0001-01-01T00:00:00Z'); +interface IParser { + cron(val: string): string; +} const maxTimes = { c: 0, @@ -14,14 +15,18 @@ const maxTimes = { d: 0, }; -const toDays = (d) => d * 1000 * 60 * 60 * 24; +let types: (keyof typeof maxTimes)[] = []; + +const oldest = new Date('0001-01-01T00:00:00Z'); + +const toDays = (d: number): number => d * 1000 * 60 * 60 * 24; -function job() { +function job(): void { const now = new Date(); - const filesOnly = settings.get('RetentionPolicy_FilesOnly'); - const excludePinned = settings.get('RetentionPolicy_DoNotPrunePinned'); - const ignoreDiscussion = settings.get('RetentionPolicy_DoNotPruneDiscussion'); - const ignoreThreads = settings.get('RetentionPolicy_DoNotPruneThreads'); + const filesOnly = settings.get('RetentionPolicy_FilesOnly'); + const excludePinned = settings.get('RetentionPolicy_DoNotPrunePinned'); + const ignoreDiscussion = settings.get('RetentionPolicy_DoNotPruneDiscussion'); + const ignoreThreads = settings.get('RetentionPolicy_DoNotPruneThreads'); // get all rooms with default values types.forEach((type) => { @@ -35,7 +40,7 @@ function job() { 'retention.overrideGlobal': { $ne: true }, }, { fields: { _id: 1 } }, - ).forEach(({ _id: rid }) => { + ).forEach(({ _id: rid }: IRoomWithRetentionPolicy) => { cleanRoomHistory({ rid, latest, @@ -52,7 +57,7 @@ function job() { 'retention.enabled': { $eq: true }, 'retention.overrideGlobal': { $eq: true }, 'retention.maxAge': { $gte: 0 }, - }).forEach((room) => { + }).forEach((room: IRoomWithRetentionPolicy) => { const { maxAge = 30, filesOnly, excludePinned, ignoreThreads } = room.retention; const latest = new Date(now.getTime() - toDays(maxAge)); cleanRoomHistory({ @@ -67,7 +72,7 @@ function job() { }); } -function getSchedule(precision) { +function getSchedule(precision: '0' | '1' | '2' | '3'): string { switch (precision) { case '0': return '*/30 * * * *'; // 30 minutes @@ -82,8 +87,8 @@ function getSchedule(precision) { const pruneCronName = 'Prune old messages by retention policy'; -function deployCron(precision) { - const schedule = (parser) => parser.cron(precision); +function deployCron(precision: string): void { + const schedule = (parser: IParser): string => parser.cron(precision); SyncedCron.remove(pruneCronName); SyncedCron.add({ @@ -129,7 +134,7 @@ settings.watchMultiple( maxTimes.d = settings.get('RetentionPolicy_MaxAge_DMs'); const precision = - (settings.get('RetentionPolicy_Advanced_Precision') && settings.get('RetentionPolicy_Advanced_Precision_Cron')) || + (settings.get('RetentionPolicy_Advanced_Precision') && settings.get('RetentionPolicy_Advanced_Precision_Cron')) || getSchedule(settings.get('RetentionPolicy_Precision')); return deployCron(precision); diff --git a/apps/meteor/app/retention-policy/server/index.js b/apps/meteor/app/retention-policy/server/index.ts similarity index 100% rename from apps/meteor/app/retention-policy/server/index.js rename to apps/meteor/app/retention-policy/server/index.ts diff --git a/packages/core-typings/src/IRoom.ts b/packages/core-typings/src/IRoom.ts index 14b3f9a0ba1a..4765d1b55cf8 100644 --- a/packages/core-typings/src/IRoom.ts +++ b/packages/core-typings/src/IRoom.ts @@ -262,3 +262,12 @@ export type RoomAdminFieldsType = | 'broadcast' | 'uids' | 'avatarETag'; + +export interface IRoomWithRetentionPolicy extends IRoom { + retention: { + maxAge: number; + filesOnly: boolean; + excludePinned: boolean; + ignoreThreads: boolean; + }; +} From 1e8ad0b798f06335ce6d5890b4db610a7d1a0afa Mon Sep 17 00:00:00 2001 From: Pedro Berleze Rorato <41977327+PedroRorato@users.noreply.github.com> Date: Sat, 21 May 2022 00:19:20 -0300 Subject: [PATCH 24/50] Chore: Convert AutoTranslate (#25591) --- .../{AutoTranslate.js => AutoTranslate.tsx} | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) rename apps/meteor/client/views/room/contextualBar/AutoTranslate/{AutoTranslate.js => AutoTranslate.tsx} (76%) diff --git a/apps/meteor/client/views/room/contextualBar/AutoTranslate/AutoTranslate.js b/apps/meteor/client/views/room/contextualBar/AutoTranslate/AutoTranslate.tsx similarity index 76% rename from apps/meteor/client/views/room/contextualBar/AutoTranslate/AutoTranslate.js rename to apps/meteor/client/views/room/contextualBar/AutoTranslate/AutoTranslate.tsx index 98acd98ed4dd..30b815fbb098 100644 --- a/apps/meteor/client/views/room/contextualBar/AutoTranslate/AutoTranslate.js +++ b/apps/meteor/client/views/room/contextualBar/AutoTranslate/AutoTranslate.tsx @@ -1,10 +1,20 @@ import { FieldGroup, Field, ToggleSwitch, Select } from '@rocket.chat/fuselage'; +import type { SelectOption } from '@rocket.chat/fuselage'; import { useTranslation } from '@rocket.chat/ui-contexts'; import React from 'react'; import VerticalBar from '../../../../components/VerticalBar'; -const AutoTranslate = ({ language, languages, handleSwitch, translateEnable, handleChangeLanguage, handleClose }) => { +type AutoTranslateProps = { + language: string; + languages: SelectOption[]; + handleSwitch: (event?: any) => void; + translateEnable: boolean | undefined; + handleChangeLanguage: (value: string) => void; + handleClose?: () => void; +}; + +const AutoTranslate = ({ language, languages, handleSwitch, translateEnable, handleChangeLanguage, handleClose }: AutoTranslateProps) => { const t = useTranslation(); return ( From 0042d2071e76af2a30b199bfba064a66bf6031fc Mon Sep 17 00:00:00 2001 From: Rafael Tapia Date: Sun, 22 May 2022 17:40:47 -0400 Subject: [PATCH 25/50] [NEW] Add new app events for pin, react and follow message (#25337) * Add event on message reaction * Add new event for message follow and unfollow * Add new event for message pin and unpin * Change boolean props to avoid double negative * Change event to trigger after the action happens * Refactor post message reaction call * Update Apps-Engine --- .../app/apps/server/bridges/listeners.js | 37 ++++++++++++++++++- .../app/message-pin/server/pinMessage.js | 7 ++++ .../app/reactions/server/setReaction.js | 11 ++++++ .../threads/server/methods/followMessage.js | 10 ++++- .../threads/server/methods/unfollowMessage.js | 10 ++++- yarn.lock | 6 +-- 6 files changed, 72 insertions(+), 9 deletions(-) diff --git a/apps/meteor/app/apps/server/bridges/listeners.js b/apps/meteor/app/apps/server/bridges/listeners.js index 514ca2ff6c39..1e19513f5504 100644 --- a/apps/meteor/app/apps/server/bridges/listeners.js +++ b/apps/meteor/app/apps/server/bridges/listeners.js @@ -19,6 +19,9 @@ export class AppListenerBridge { case AppInterface.IPreMessageUpdatedExtend: case AppInterface.IPreMessageUpdatedModify: case AppInterface.IPostMessageUpdated: + case AppInterface.IPostMessageReacted: + case AppInterface.IPostMessageFollowed: + case AppInterface.IPostMessagePinned: return 'messageEvent'; case AppInterface.IPreRoomCreatePrevent: case AppInterface.IPreRoomCreateExtend: @@ -59,9 +62,39 @@ export class AppListenerBridge { return this.orch.getManager().getListenerManager().executeListener(inte, payload); } - async messageEvent(inte, message) { + async messageEvent(inte, message, ...payload) { const msg = this.orch.getConverters().get('messages').convertMessage(message); - const result = await this.orch.getManager().getListenerManager().executeListener(inte, msg); + + const params = (() => { + switch (inte) { + case AppInterface.IPostMessageReacted: + const [userReacted, reaction, isReacted] = payload; + return { + message: msg, + user: this.orch.getConverters().get('users').convertToApp(userReacted), + reaction, + isReacted, + }; + case AppInterface.IPostMessageFollowed: + const [userFollowed, isFollowed] = payload; + return { + message: msg, + user: this.orch.getConverters().get('users').convertToApp(userFollowed), + isFollowed, + }; + case AppInterface.IPostMessagePinned: + const [userPinned, isPinned] = payload; + return { + message: msg, + user: this.orch.getConverters().get('users').convertToApp(userPinned), + isPinned, + }; + default: + return msg; + } + })(); + + const result = await this.orch.getManager().getListenerManager().executeListener(inte, params); if (typeof result === 'boolean') { return result; diff --git a/apps/meteor/app/message-pin/server/pinMessage.js b/apps/meteor/app/message-pin/server/pinMessage.js index 07aa7885c7cb..6f9c11d51589 100644 --- a/apps/meteor/app/message-pin/server/pinMessage.js +++ b/apps/meteor/app/message-pin/server/pinMessage.js @@ -7,6 +7,7 @@ import { isTheLastMessage } from '../../lib/server'; import { getUserAvatarURL } from '../../utils/lib/getUserAvatarURL'; import { canAccessRoom, hasPermission, roomAccessAttributes } from '../../authorization/server'; import { Subscriptions, Messages, Users, Rooms } from '../../models'; +import { Apps, AppEvents } from '../../apps/server/orchestrator'; const recursiveRemove = (msg, deep = 1) => { if (!msg) { @@ -101,6 +102,9 @@ Meteor.methods({ }); } + // App IPostMessagePinned event hook + Promise.await(Apps.triggerEvent(AppEvents.IPostMessagePinned, originalMessage, Meteor.user(), originalMessage.pinned)); + return Messages.createWithTypeRoomIdMessageAndUser('message_pinned', originalMessage.rid, '', me, { attachments: [ { @@ -173,6 +177,9 @@ Meteor.methods({ Rooms.setLastMessagePinned(room._id, originalMessage.pinnedBy, originalMessage.pinned); } + // App IPostMessagePinned event hook + Promise.await(Apps.triggerEvent(AppEvents.IPostMessagePinned, originalMessage, Meteor.user(), originalMessage.pinned)); + return Messages.setPinnedByIdAndUserId(originalMessage._id, originalMessage.pinnedBy, originalMessage.pinned); }, }); diff --git a/apps/meteor/app/reactions/server/setReaction.js b/apps/meteor/app/reactions/server/setReaction.js index 0770d14bb118..a1916bb2beef 100644 --- a/apps/meteor/app/reactions/server/setReaction.js +++ b/apps/meteor/app/reactions/server/setReaction.js @@ -9,12 +9,14 @@ import { emoji } from '../../emoji/server'; import { isTheLastMessage, msgStream } from '../../lib/server'; import { canAccessRoom, hasPermission } from '../../authorization/server'; import { api } from '../../../server/sdk/api'; +import { AppEvents, Apps } from '../../apps/server/orchestrator'; const removeUserReaction = (message, reaction, username) => { message.reactions[reaction].usernames.splice(message.reactions[reaction].usernames.indexOf(username), 1); if (message.reactions[reaction].usernames.length === 0) { delete message.reactions[reaction]; } + return message; }; @@ -52,6 +54,9 @@ async function setReaction(room, user, message, reaction, shouldReact) { if (userAlreadyReacted === shouldReact) { return; } + + let isReacted; + if (userAlreadyReacted) { removeUserReaction(message, reaction, user.username); if (_.isEmpty(message.reactions)) { @@ -68,6 +73,8 @@ async function setReaction(room, user, message, reaction, shouldReact) { } callbacks.run('unsetReaction', message._id, reaction); callbacks.run('afterUnsetReaction', message, { user, reaction, shouldReact }); + + isReacted = false; } else { if (!message.reactions) { message.reactions = {}; @@ -84,8 +91,12 @@ async function setReaction(room, user, message, reaction, shouldReact) { } callbacks.run('setReaction', message._id, reaction); callbacks.run('afterSetReaction', message, { user, reaction, shouldReact }); + + isReacted = true; } + Promise.await(Apps.triggerEvent(AppEvents.IPostMessageReacted, message, Meteor.user(), reaction, isReacted)); + msgStream.emit(message.rid, message); } diff --git a/apps/meteor/app/threads/server/methods/followMessage.js b/apps/meteor/app/threads/server/methods/followMessage.js index b591a68f3a1b..99df51f65462 100644 --- a/apps/meteor/app/threads/server/methods/followMessage.js +++ b/apps/meteor/app/threads/server/methods/followMessage.js @@ -6,6 +6,7 @@ import { RateLimiter } from '../../../lib/server'; import { settings } from '../../../settings/server'; import { canAccessRoomId } from '../../../authorization/server'; import { follow } from '../functions'; +import { Apps, AppEvents } from '../../../apps/server/orchestrator'; Meteor.methods({ followMessage({ mid }) { @@ -20,7 +21,7 @@ Meteor.methods({ throw new Meteor.Error('error-not-allowed', 'not-allowed', { method: 'followMessage' }); } - const message = Messages.findOneById(mid, { fields: { rid: 1, tmid: 1 } }); + const message = Messages.findOneById(mid); if (!message) { throw new Meteor.Error('error-invalid-message', 'Invalid message', { method: 'followMessage', @@ -31,7 +32,12 @@ Meteor.methods({ throw new Meteor.Error('error-not-allowed', 'not-allowed', { method: 'followMessage' }); } - return follow({ tmid: message.tmid || message._id, uid }); + const followResult = follow({ tmid: message.tmid || message._id, uid }); + + const isFollowed = true; + Promise.await(Apps.triggerEvent(AppEvents.IPostMessageFollowed, message, Meteor.user(), isFollowed)); + + return followResult; }, }); diff --git a/apps/meteor/app/threads/server/methods/unfollowMessage.js b/apps/meteor/app/threads/server/methods/unfollowMessage.js index e0f9189b386c..5381fd925d38 100644 --- a/apps/meteor/app/threads/server/methods/unfollowMessage.js +++ b/apps/meteor/app/threads/server/methods/unfollowMessage.js @@ -6,6 +6,7 @@ import { RateLimiter } from '../../../lib/server'; import { settings } from '../../../settings/server'; import { canAccessRoomId } from '../../../authorization/server'; import { unfollow } from '../functions'; +import { Apps, AppEvents } from '../../../apps/server/orchestrator'; Meteor.methods({ unfollowMessage({ mid }) { @@ -20,7 +21,7 @@ Meteor.methods({ throw new Meteor.Error('error-not-allowed', 'not-allowed', { method: 'unfollowMessage' }); } - const message = Messages.findOneById(mid, { fields: { rid: 1, tmid: 1 } }); + const message = Messages.findOneById(mid); if (!message) { throw new Meteor.Error('error-invalid-message', 'Invalid message', { method: 'unfollowMessage', @@ -31,7 +32,12 @@ Meteor.methods({ throw new Meteor.Error('error-not-allowed', 'not-allowed', { method: 'unfollowMessage' }); } - return unfollow({ rid: message.rid, tmid: message.tmid || message._id, uid }); + const unfollowResult = unfollow({ rid: message.rid, tmid: message.tmid || message._id, uid }); + + const isFollowed = false; + Promise.await(Apps.triggerEvent(AppEvents.IPostMessageFollowed, message, Meteor.user(), isFollowed)); + + return unfollowResult; }, }); diff --git a/yarn.lock b/yarn.lock index a69bc6cec69c..f962a97e5a81 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3601,8 +3601,8 @@ __metadata: linkType: hard "@rocket.chat/apps-engine@npm:alpha": - version: 1.32.0-alpha.6099 - resolution: "@rocket.chat/apps-engine@npm:1.32.0-alpha.6099" + version: 1.32.0-alpha.6167 + resolution: "@rocket.chat/apps-engine@npm:1.32.0-alpha.6167" dependencies: adm-zip: ^0.4.9 cryptiles: ^4.1.3 @@ -3610,7 +3610,7 @@ __metadata: semver: ^5.5.0 stack-trace: 0.0.10 uuid: ^3.2.1 - checksum: 68ec386fc1a5daf80408c6a67f28bb19b7e5e4c6387b2e6c33aec9fc6dcc7f2412e738687f23b25af6f7864e648421568f372f76df7d3a06abb1b24d0c747c4b + checksum: 4ee16f9df9b61c4550a496b549dcba07dc8fd214c8ad829fc90fecfb9baee343a24859074fe287e4e12c89372b855284dc80200e6e3206f1aaf11c3a2f14a136 languageName: node linkType: hard From 75a1b884da0d155209968651fd5d3a3e11890b99 Mon Sep 17 00:00:00 2001 From: Rafael Tapia Date: Sun, 22 May 2022 17:41:40 -0400 Subject: [PATCH 26/50] [NEW] Add new events after user login, logout and change his status (#25234) * Add user events for apps * Add login, logout and status change events * Remove trycatch validation * Remove trycatch validation * Get the user entity after the update * Change status file to Typescript * Trigger events when the user updates his profile or deletes his account * Update Apps-Engine * Make update return doc after update * Trigger the event when the user also uses third-party apps to log in * Revert user update change --- .../app/apps/server/bridges/listeners.js | 38 ++++++++++++++----- apps/meteor/app/apps/server/index.js | 1 + apps/meteor/app/apps/server/status.ts | 16 ++++++++ .../authentication/server/startup/index.js | 9 +++++ .../app/lib/server/functions/saveUser.js | 2 +- .../meteor/konecty-user-presence.d.ts | 1 + apps/meteor/server/methods/logoutCleanUp.js | 4 ++ 7 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 apps/meteor/app/apps/server/status.ts diff --git a/apps/meteor/app/apps/server/bridges/listeners.js b/apps/meteor/app/apps/server/bridges/listeners.js index 1e19513f5504..ee128ce27db9 100644 --- a/apps/meteor/app/apps/server/bridges/listeners.js +++ b/apps/meteor/app/apps/server/bridges/listeners.js @@ -49,6 +49,9 @@ export class AppListenerBridge { case AppInterface.IPostUserCreated: case AppInterface.IPostUserUpdated: case AppInterface.IPostUserDeleted: + case AppInterface.IPostUserLogin: + case AppInterface.IPostUserLogout: + case AppInterface.IPostUserStatusChanged: return 'userEvent'; default: return 'defaultEvent'; @@ -173,15 +176,32 @@ export class AppListenerBridge { } async userEvent(inte, data) { - const context = { - user: this.orch.getConverters().get('users').convertToApp(data.user), - performedBy: this.orch.getConverters().get('users').convertToApp(data.performedBy), - }; - - if (inte === AppInterface.IPostUserUpdated) { - context.previousData = this.orch.getConverters().get('users').convertToApp(data.previousUser); + let context; + switch (inte) { + case AppInterface.IPostUserLoggedIn: + case AppInterface.IPostUserLogout: + context = this.orch.getConverters().get('users').convertToApp(data.user); + return this.orch.getManager().getListenerManager().executeListener(inte, context); + case AppInterface.IPostUserStatusChanged: + const { currentStatus, previousStatus } = data; + context = { + user: this.orch.getConverters().get('users').convertToApp(data.user), + currentStatus, + previousStatus, + }; + + return this.orch.getManager().getListenerManager().executeListener(inte, context); + case AppInterface.IPostUserCreated: + case AppInterface.IPostUserUpdated: + case AppInterface.IPostUserDeleted: + context = { + user: this.orch.getConverters().get('users').convertToApp(data.user), + performedBy: this.orch.getConverters().get('users').convertToApp(data.performedBy), + }; + if (inte === AppInterface.IPostUserUpdated) { + context.previousData = this.orch.getConverters().get('users').convertToApp(data.previousUser); + } + return this.orch.getManager().getListenerManager().executeListener(inte, context); } - - return this.orch.getManager().getListenerManager().executeListener(inte, context); } } diff --git a/apps/meteor/app/apps/server/index.js b/apps/meteor/app/apps/server/index.js index ad3096af3158..753a21c4fbab 100644 --- a/apps/meteor/app/apps/server/index.js +++ b/apps/meteor/app/apps/server/index.js @@ -1,3 +1,4 @@ import './cron'; +import './status.ts'; export { Apps, AppEvents } from './orchestrator'; diff --git a/apps/meteor/app/apps/server/status.ts b/apps/meteor/app/apps/server/status.ts new file mode 100644 index 000000000000..3dd020df92ef --- /dev/null +++ b/apps/meteor/app/apps/server/status.ts @@ -0,0 +1,16 @@ +import { UserPresenceMonitor } from 'meteor/konecty:user-presence'; + +import { AppEvents, Apps } from './orchestrator'; + +UserPresenceMonitor.onSetUserStatus((...args: any) => { + const [user, status] = args; + + // App IPostUserStatusChanged event hook + Promise.await( + Apps.triggerEvent(AppEvents.IPostUserStatusChanged, { + user, + currentStatus: status, + previousStatus: user.status, + }), + ); +}); diff --git a/apps/meteor/app/authentication/server/startup/index.js b/apps/meteor/app/authentication/server/startup/index.js index b4d58c2fe572..d5c8f2e97efd 100644 --- a/apps/meteor/app/authentication/server/startup/index.js +++ b/apps/meteor/app/authentication/server/startup/index.js @@ -358,6 +358,15 @@ Accounts.validateLoginAttempt(function (login) { return callbacks.run('afterValidateLogin', login); }); + /** + * Trigger the event only when the + * user does login in Rocket.chat + */ + if (login.type !== 'resume') { + // App IPostUserLoggedIn event hook + Promise.await(Apps.triggerEvent(AppEvents.IPostUserLoggedIn, login.user)); + } + return true; }); diff --git a/apps/meteor/app/lib/server/functions/saveUser.js b/apps/meteor/app/lib/server/functions/saveUser.js index 40d96fcb4c06..5b5b1853060d 100644 --- a/apps/meteor/app/lib/server/functions/saveUser.js +++ b/apps/meteor/app/lib/server/functions/saveUser.js @@ -347,7 +347,7 @@ export const saveUser = function (userId, userData) { validateUserEditing(userId, userData); - const oldUserData = Users.findOneById(userId); + const oldUserData = Users.findOneById(userData._id); // update user if (userData.hasOwnProperty('username') || userData.hasOwnProperty('name')) { diff --git a/apps/meteor/definition/externals/meteor/konecty-user-presence.d.ts b/apps/meteor/definition/externals/meteor/konecty-user-presence.d.ts index 108c8b49b58d..3d4ea23d8b1a 100644 --- a/apps/meteor/definition/externals/meteor/konecty-user-presence.d.ts +++ b/apps/meteor/definition/externals/meteor/konecty-user-presence.d.ts @@ -1,6 +1,7 @@ declare module 'meteor/konecty:user-presence' { namespace UserPresenceMonitor { function processUserSession(userSession: any, event: string): void; + function onSetUserStatus(callback: any): void; } namespace UserPresence { diff --git a/apps/meteor/server/methods/logoutCleanUp.js b/apps/meteor/server/methods/logoutCleanUp.js index 0f9bcec59714..4eef0f03d40d 100644 --- a/apps/meteor/server/methods/logoutCleanUp.js +++ b/apps/meteor/server/methods/logoutCleanUp.js @@ -2,6 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { callbacks } from '../../lib/callbacks'; +import { AppEvents, Apps } from '../../app/apps/server/orchestrator'; Meteor.methods({ logoutCleanUp(user) { @@ -10,5 +11,8 @@ Meteor.methods({ Meteor.defer(function () { callbacks.run('afterLogoutCleanUp', user); }); + + // App IPostUserLogout event hook + Promise.await(Apps.triggerEvent(AppEvents.IPostUserLoggedOut, user)); }, }); From be7b5ff8d1fbc614203b5d651ee90217163d0b7c Mon Sep 17 00:00:00 2001 From: Rafael Tapia Date: Sun, 22 May 2022 19:19:41 -0400 Subject: [PATCH 27/50] [NEW] Star message, report and delete message events (#25383) * Add event on message reaction * Add new event for message follow and unfollow * Add new event for message pin and unpin * Add new event for when a message is starred or unstarred * Add new event for when a message is reported * Add user in PostMessageDeleted event context * Add the reason the message was reported --- .../app/apps/server/bridges/listeners.js | 34 +++++++++++++++---- .../app/lib/server/functions/deleteMessage.ts | 2 +- .../app/message-star/server/starMessage.js | 3 ++ .../app/reactions/server/setReaction.js | 1 - apps/meteor/server/methods/reportMessage.js | 3 ++ 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/apps/meteor/app/apps/server/bridges/listeners.js b/apps/meteor/app/apps/server/bridges/listeners.js index ee128ce27db9..57e0a9b63bba 100644 --- a/apps/meteor/app/apps/server/bridges/listeners.js +++ b/apps/meteor/app/apps/server/bridges/listeners.js @@ -22,6 +22,8 @@ export class AppListenerBridge { case AppInterface.IPostMessageReacted: case AppInterface.IPostMessageFollowed: case AppInterface.IPostMessagePinned: + case AppInterface.IPostMessageStarred: + case AppInterface.IPostMessageReported: return 'messageEvent'; case AppInterface.IPreRoomCreatePrevent: case AppInterface.IPreRoomCreateExtend: @@ -70,27 +72,47 @@ export class AppListenerBridge { const params = (() => { switch (inte) { + case AppInterface.IPostMessageDeleted: + const [userDeleted] = payload; + return { + message: msg, + user: this.orch.getConverters().get('users').convertToApp(userDeleted), + }; case AppInterface.IPostMessageReacted: - const [userReacted, reaction, isReacted] = payload; + const [userReacted, reaction, isRemoved] = payload; return { message: msg, user: this.orch.getConverters().get('users').convertToApp(userReacted), reaction, - isReacted, + isRemoved, }; case AppInterface.IPostMessageFollowed: - const [userFollowed, isFollowed] = payload; + const [userFollowed, isUnfollow] = payload; return { message: msg, user: this.orch.getConverters().get('users').convertToApp(userFollowed), - isFollowed, + isUnfollow, }; case AppInterface.IPostMessagePinned: - const [userPinned, isPinned] = payload; + const [userPinned, isUnpinned] = payload; return { message: msg, user: this.orch.getConverters().get('users').convertToApp(userPinned), - isPinned, + isUnpinned, + }; + case AppInterface.IPostMessageStarred: + const [userStarred, isStarred] = payload; + return { + message: msg, + user: this.orch.getConverters().get('users').convertToApp(userStarred), + isStarred, + }; + case AppInterface.IPostMessageReported: + const [userReported, reason] = payload; + return { + message: msg, + user: this.orch.getConverters().get('users').convertToApp(userReported), + reason, }; default: return msg; diff --git a/apps/meteor/app/lib/server/functions/deleteMessage.ts b/apps/meteor/app/lib/server/functions/deleteMessage.ts index f7f3271228e8..dfb7f473a0ae 100644 --- a/apps/meteor/app/lib/server/functions/deleteMessage.ts +++ b/apps/meteor/app/lib/server/functions/deleteMessage.ts @@ -69,6 +69,6 @@ export const deleteMessage = async function (message: IMessage, user: IUser): Pr } if (bridges) { - bridges.getListenerBridge().messageEvent('IPostMessageDeleted', deletedMsg); + bridges.getListenerBridge().messageEvent('IPostMessageDeleted', deletedMsg, user); } }; diff --git a/apps/meteor/app/message-star/server/starMessage.js b/apps/meteor/app/message-star/server/starMessage.js index 66c908524a15..8e4292170750 100644 --- a/apps/meteor/app/message-star/server/starMessage.js +++ b/apps/meteor/app/message-star/server/starMessage.js @@ -4,6 +4,7 @@ import { settings } from '../../settings/server'; import { isTheLastMessage } from '../../lib/server'; import { canAccessRoom, roomAccessAttributes } from '../../authorization/server'; import { Subscriptions, Rooms, Messages } from '../../models/server'; +import { Apps, AppEvents } from '../../apps/server/orchestrator'; Meteor.methods({ starMessage(message) { @@ -40,6 +41,8 @@ Meteor.methods({ Rooms.updateLastMessageStar(room._id, Meteor.userId(), message.starred); } + Promise.await(Apps.triggerEvent(AppEvents.IPostMessageStarred, message, Meteor.user(), message.starred)); + return Messages.updateUserStarById(message._id, Meteor.userId(), message.starred); }, }); diff --git a/apps/meteor/app/reactions/server/setReaction.js b/apps/meteor/app/reactions/server/setReaction.js index a1916bb2beef..336747f1af4a 100644 --- a/apps/meteor/app/reactions/server/setReaction.js +++ b/apps/meteor/app/reactions/server/setReaction.js @@ -16,7 +16,6 @@ const removeUserReaction = (message, reaction, username) => { if (message.reactions[reaction].usernames.length === 0) { delete message.reactions[reaction]; } - return message; }; diff --git a/apps/meteor/server/methods/reportMessage.js b/apps/meteor/server/methods/reportMessage.js index 8efb7fc5e61c..852187acbb1e 100644 --- a/apps/meteor/server/methods/reportMessage.js +++ b/apps/meteor/server/methods/reportMessage.js @@ -4,6 +4,7 @@ import { check } from 'meteor/check'; import { Messages } from '../../app/models/server'; import { Reports, Rooms } from '../../app/models/server/raw'; import { canAccessRoomAsync } from '../../app/authorization/server/functions/canAccessRoom'; +import { AppEvents, Apps } from '../../app/apps/server'; Meteor.methods({ async reportMessage(messageId, description) { @@ -41,6 +42,8 @@ Meteor.methods({ await Reports.createWithMessageDescriptionAndUserId(message, description, uid); + Promise.await(Apps.triggerEvent(AppEvents.IPostMessageReported, message, Meteor.user(), description)); + return true; }, }); From a8590822dec103866e7bd677ebe1ccdd86a4a090 Mon Sep 17 00:00:00 2001 From: Murtaza Patrawala <34130764+murtaza98@users.noreply.github.com> Date: Mon, 23 May 2022 04:50:32 +0530 Subject: [PATCH 28/50] [NEW] Get user's preferred language via apps (#25514) * getting started.... * Apply suggestions from review: - Follow same structure for settings property on IUser as on core * Update Apps-Engine --- apps/meteor/app/apps/server/converters/users.js | 5 +++++ yarn.lock | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/meteor/app/apps/server/converters/users.js b/apps/meteor/app/apps/server/converters/users.js index cadd96fbde7b..e8891b9dd720 100644 --- a/apps/meteor/app/apps/server/converters/users.js +++ b/apps/meteor/app/apps/server/converters/users.js @@ -43,6 +43,11 @@ export class AppUsersConverter { lastLoginAt: user.lastLogin, appId: user.appId, customFields: user.customFields, + settings: { + preferences: { + ...(user?.settings?.preferences?.language && { language: user.settings.preferences.language }), + }, + }, }; } diff --git a/yarn.lock b/yarn.lock index f962a97e5a81..ec991b387c9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3601,8 +3601,8 @@ __metadata: linkType: hard "@rocket.chat/apps-engine@npm:alpha": - version: 1.32.0-alpha.6167 - resolution: "@rocket.chat/apps-engine@npm:1.32.0-alpha.6167" + version: 1.32.0-alpha.6176 + resolution: "@rocket.chat/apps-engine@npm:1.32.0-alpha.6176" dependencies: adm-zip: ^0.4.9 cryptiles: ^4.1.3 @@ -3610,7 +3610,7 @@ __metadata: semver: ^5.5.0 stack-trace: 0.0.10 uuid: ^3.2.1 - checksum: 4ee16f9df9b61c4550a496b549dcba07dc8fd214c8ad829fc90fecfb9baee343a24859074fe287e4e12c89372b855284dc80200e6e3206f1aaf11c3a2f14a136 + checksum: 8364ce867facb246d14fa570fe3f063132cff2f2685d40e8eb93cf7008fa6a3a156fea5404a0608ce20d39aaf82a5662dee6a67efb15e535c4e9d86ddbe35cc9 languageName: node linkType: hard From 2ec6982560ceab16db5f30192e653bfd563d3c2d Mon Sep 17 00:00:00 2001 From: Pierre Lehnen <55164754+pierre-lehnen-rc@users.noreply.github.com> Date: Sun, 22 May 2022 22:38:46 -0300 Subject: [PATCH 29/50] Chore: Convert slashCommands to typescript (#25592) Co-authored-by: Eduardo Cabrera Co-authored-by: Leonardo Ostjen Couto Co-authored-by: eduardofcabrera <64327259+eduardofcabrera@users.noreply.github.com> Co-authored-by: Guilherme Gazzo --- .../app/apps/server/bridges/commands.ts | 18 ++- .../server/slackbridge_import.server.js | 1 - .../client/{index.js => index.ts} | 0 .../app/slashcommand-asciiarts/lib/gimme.js | 20 --- .../app/slashcommand-asciiarts/lib/gimme.ts | 19 +++ .../app/slashcommand-asciiarts/lib/lenny.js | 20 --- .../app/slashcommand-asciiarts/lib/lenny.ts | 19 +++ .../app/slashcommand-asciiarts/lib/shrug.js | 20 --- .../app/slashcommand-asciiarts/lib/shrug.ts | 19 +++ .../slashcommand-asciiarts/lib/tableflip.js | 20 --- .../slashcommand-asciiarts/lib/tableflip.ts | 19 +++ .../app/slashcommand-asciiarts/lib/unflip.js | 20 --- .../app/slashcommand-asciiarts/lib/unflip.ts | 19 +++ .../server/{index.js => index.ts} | 0 .../server/server.ts | 23 +-- .../app/slashcommands-bridge/server/index.ts | 19 +-- .../app/slashcommands-create/server/server.ts | 21 +-- apps/meteor/app/slashcommands-help/index.ts | 1 - .../app/slashcommands-help/server/server.ts | 14 +- .../client/{hide.js => hide.ts} | 2 +- .../client/{index.js => index.ts} | 0 .../app/slashcommands-hide/server/hide.js | 70 --------- .../app/slashcommands-hide/server/hide.ts | 74 +++++++++ .../server/{index.js => index.ts} | 0 .../app/slashcommands-invite/server/server.ts | 21 +-- .../client/{client.js => client.ts} | 2 +- .../client/{index.js => index.ts} | 0 .../server/{index.js => index.ts} | 0 .../server/{server.js => server.ts} | 77 +++++----- .../app/slashcommands-join/client/client.ts | 5 +- .../app/slashcommands-join/server/server.ts | 21 +-- .../client/{client.js => client.ts} | 4 +- .../client/{index.js => index.ts} | 0 .../server/{index.js => index.ts} | 0 .../app/slashcommands-kick/server/server.js | 57 ------- .../app/slashcommands-kick/server/server.ts | 54 +++++++ apps/meteor/app/slashcommands-leave/index.js | 1 - .../server/{index.js => index.ts} | 0 .../server/{leave.js => leave.ts} | 20 ++- apps/meteor/app/slashcommands-me/index.ts | 1 - apps/meteor/app/slashcommands-me/server/me.ts | 7 +- apps/meteor/app/slashcommands-msg/index.js | 1 - .../server/{index.js => index.ts} | 0 .../server/{server.js => server.ts} | 35 ++--- apps/meteor/app/slashcommands-mute/index.ts | 1 - .../app/slashcommands-mute/server/mute.ts | 21 +-- .../app/slashcommands-mute/server/unmute.ts | 21 +-- .../client/{client.js => client.ts} | 28 ++-- .../client/{index.js => index.ts} | 0 .../slashcommands-open/{index.js => index.ts} | 0 .../app/slashcommands-status/client/index.js | 1 - .../app/slashcommands-status/client/index.ts | 1 + .../app/slashcommands-status/client/status.ts | 26 ++++ apps/meteor/app/slashcommands-status/index.js | 8 - .../app/slashcommands-status/lib/status.js | 37 ----- .../app/slashcommands-status/server/index.js | 1 - .../app/slashcommands-status/server/index.ts | 1 + .../app/slashcommands-status/server/status.ts | 36 +++++ .../app/slashcommands-topic/client/index.js | 1 - .../app/slashcommands-topic/client/index.ts | 1 + .../app/slashcommands-topic/client/topic.ts | 31 ++++ .../app/slashcommands-topic/lib/topic.js | 35 ----- .../app/slashcommands-topic/server/index.js | 1 - .../app/slashcommands-topic/server/index.ts | 1 + .../app/slashcommands-topic/server/topic.ts | 21 +++ .../server/server.ts | 26 ++-- apps/meteor/app/utils/lib/slashCommand.d.ts | 15 -- apps/meteor/app/utils/lib/slashCommand.js | 79 ---------- apps/meteor/app/utils/lib/slashCommand.ts | 140 ++++++++++++++++++ apps/meteor/client/startup/slashCommands.ts | 2 +- apps/meteor/server/importPackages.ts | 12 +- 71 files changed, 648 insertions(+), 643 deletions(-) rename apps/meteor/app/slashcommand-asciiarts/client/{index.js => index.ts} (100%) delete mode 100644 apps/meteor/app/slashcommand-asciiarts/lib/gimme.js create mode 100644 apps/meteor/app/slashcommand-asciiarts/lib/gimme.ts delete mode 100644 apps/meteor/app/slashcommand-asciiarts/lib/lenny.js create mode 100644 apps/meteor/app/slashcommand-asciiarts/lib/lenny.ts delete mode 100644 apps/meteor/app/slashcommand-asciiarts/lib/shrug.js create mode 100644 apps/meteor/app/slashcommand-asciiarts/lib/shrug.ts delete mode 100644 apps/meteor/app/slashcommand-asciiarts/lib/tableflip.js create mode 100644 apps/meteor/app/slashcommand-asciiarts/lib/tableflip.ts delete mode 100644 apps/meteor/app/slashcommand-asciiarts/lib/unflip.js create mode 100644 apps/meteor/app/slashcommand-asciiarts/lib/unflip.ts rename apps/meteor/app/slashcommand-asciiarts/server/{index.js => index.ts} (100%) delete mode 100644 apps/meteor/app/slashcommands-help/index.ts rename apps/meteor/app/slashcommands-hide/client/{hide.js => hide.ts} (58%) rename apps/meteor/app/slashcommands-hide/client/{index.js => index.ts} (100%) delete mode 100644 apps/meteor/app/slashcommands-hide/server/hide.js create mode 100644 apps/meteor/app/slashcommands-hide/server/hide.ts rename apps/meteor/app/slashcommands-hide/server/{index.js => index.ts} (100%) rename apps/meteor/app/slashcommands-inviteall/client/{client.js => client.ts} (86%) rename apps/meteor/app/slashcommands-inviteall/client/{index.js => index.ts} (100%) rename apps/meteor/app/slashcommands-inviteall/server/{index.js => index.ts} (100%) rename apps/meteor/app/slashcommands-inviteall/server/{server.js => server.ts} (57%) rename apps/meteor/app/slashcommands-kick/client/{client.js => client.ts} (69%) rename apps/meteor/app/slashcommands-kick/client/{index.js => index.ts} (100%) rename apps/meteor/app/slashcommands-kick/server/{index.js => index.ts} (100%) delete mode 100644 apps/meteor/app/slashcommands-kick/server/server.js create mode 100644 apps/meteor/app/slashcommands-kick/server/server.ts delete mode 100644 apps/meteor/app/slashcommands-leave/index.js rename apps/meteor/app/slashcommands-leave/server/{index.js => index.ts} (100%) rename apps/meteor/app/slashcommands-leave/server/{leave.js => leave.ts} (50%) delete mode 100644 apps/meteor/app/slashcommands-me/index.ts delete mode 100644 apps/meteor/app/slashcommands-msg/index.js rename apps/meteor/app/slashcommands-msg/server/{index.js => index.ts} (100%) rename apps/meteor/app/slashcommands-msg/server/{server.js => server.ts} (55%) delete mode 100644 apps/meteor/app/slashcommands-mute/index.ts rename apps/meteor/app/slashcommands-open/client/{client.js => client.ts} (63%) rename apps/meteor/app/slashcommands-open/client/{index.js => index.ts} (100%) rename apps/meteor/app/slashcommands-open/{index.js => index.ts} (100%) delete mode 100644 apps/meteor/app/slashcommands-status/client/index.js create mode 100644 apps/meteor/app/slashcommands-status/client/index.ts create mode 100644 apps/meteor/app/slashcommands-status/client/status.ts delete mode 100644 apps/meteor/app/slashcommands-status/index.js delete mode 100644 apps/meteor/app/slashcommands-status/lib/status.js delete mode 100644 apps/meteor/app/slashcommands-status/server/index.js create mode 100644 apps/meteor/app/slashcommands-status/server/index.ts create mode 100644 apps/meteor/app/slashcommands-status/server/status.ts delete mode 100644 apps/meteor/app/slashcommands-topic/client/index.js create mode 100644 apps/meteor/app/slashcommands-topic/client/index.ts create mode 100644 apps/meteor/app/slashcommands-topic/client/topic.ts delete mode 100644 apps/meteor/app/slashcommands-topic/lib/topic.js delete mode 100644 apps/meteor/app/slashcommands-topic/server/index.js create mode 100644 apps/meteor/app/slashcommands-topic/server/index.ts create mode 100644 apps/meteor/app/slashcommands-topic/server/topic.ts delete mode 100644 apps/meteor/app/utils/lib/slashCommand.d.ts delete mode 100644 apps/meteor/app/utils/lib/slashCommand.js create mode 100644 apps/meteor/app/utils/lib/slashCommand.ts diff --git a/apps/meteor/app/apps/server/bridges/commands.ts b/apps/meteor/app/apps/server/bridges/commands.ts index f771f4014f5b..8a6726e3925a 100644 --- a/apps/meteor/app/apps/server/bridges/commands.ts +++ b/apps/meteor/app/apps/server/bridges/commands.ts @@ -8,7 +8,7 @@ import { Utilities } from '../../lib/misc/Utilities'; import { AppServerOrchestrator } from '../orchestrator'; export class AppCommandsBridge extends CommandBridge { - disabledCommands: Map; + disabledCommands: Map; // eslint-disable-next-line no-empty-function constructor(private readonly orch: AppServerOrchestrator) { @@ -40,7 +40,7 @@ export class AppCommandsBridge extends CommandBridge { throw new Error(`The command is not currently disabled: "${cmd}"`); } - slashCommands.commands[cmd] = this.disabledCommands.get(cmd); + slashCommands.commands[cmd] = this.disabledCommands.get(cmd) as typeof slashCommands.commands[string]; this.disabledCommands.delete(cmd); this.orch.getNotifier().commandUpdated(cmd); @@ -59,11 +59,13 @@ export class AppCommandsBridge extends CommandBridge { return; } - if (typeof slashCommands.commands[cmd] === 'undefined') { + const commandObj = slashCommands.commands[cmd]; + + if (typeof commandObj === 'undefined') { throw new Error(`Command does not exist in the system currently: "${cmd}"`); } - this.disabledCommands.set(cmd, slashCommands.commands[cmd]); + this.disabledCommands.set(cmd, commandObj); delete slashCommands.commands[cmd]; this.orch.getNotifier().commandDisabled(cmd); @@ -87,7 +89,9 @@ export class AppCommandsBridge extends CommandBridge { 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; + item.previewCallback = ( + command.executePreviewItem ? this._appCommandPreviewExecutor.bind(this) : item.previewCallback + ) as typeof slashCommands.commands[string]['previewCallback']; slashCommands.commands[cmd] = item; this.orch.getNotifier().commandUpdated(cmd); @@ -107,7 +111,9 @@ export class AppCommandsBridge extends CommandBridge { callback: this._appCommandExecutor.bind(this), providesPreview: command.providesPreview, previewer: !command.previewer ? undefined : this._appCommandPreviewer.bind(this), - previewCallback: !command.executePreviewItem ? undefined : this._appCommandPreviewExecutor.bind(this), + previewCallback: (!command.executePreviewItem ? undefined : this._appCommandPreviewExecutor.bind(this)) as + | typeof slashCommands.commands[string]['previewCallback'] + | undefined, }; slashCommands.commands[command.command.toLowerCase()] = item; diff --git a/apps/meteor/app/slackbridge/server/slackbridge_import.server.js b/apps/meteor/app/slackbridge/server/slackbridge_import.server.js index 937eef85c121..e41cb15255cf 100644 --- a/apps/meteor/app/slackbridge/server/slackbridge_import.server.js +++ b/apps/meteor/app/slackbridge/server/slackbridge_import.server.js @@ -85,7 +85,6 @@ function SlackBridgeImport(command, params, item) { }); throw error; } - return SlackBridgeImport; } slashCommands.add('slackbridge-import', SlackBridgeImport); diff --git a/apps/meteor/app/slashcommand-asciiarts/client/index.js b/apps/meteor/app/slashcommand-asciiarts/client/index.ts similarity index 100% rename from apps/meteor/app/slashcommand-asciiarts/client/index.js rename to apps/meteor/app/slashcommand-asciiarts/client/index.ts diff --git a/apps/meteor/app/slashcommand-asciiarts/lib/gimme.js b/apps/meteor/app/slashcommand-asciiarts/lib/gimme.js deleted file mode 100644 index 752597ad5c78..000000000000 --- a/apps/meteor/app/slashcommand-asciiarts/lib/gimme.js +++ /dev/null @@ -1,20 +0,0 @@ -import { Meteor } from 'meteor/meteor'; - -import { slashCommands } from '../../utils'; -/* - * Gimme is a named function that will replace /gimme commands - * @param {Object} message - The message object - */ - -function Gimme(command, params, item) { - if (command === 'gimme') { - const msg = item; - msg.msg = `༼ つ ◕_◕ ༽つ ${params}`; - Meteor.call('sendMessage', msg); - } -} - -slashCommands.add('gimme', Gimme, { - description: 'Slash_Gimme_Description', - params: 'your_message_optional', -}); diff --git a/apps/meteor/app/slashcommand-asciiarts/lib/gimme.ts b/apps/meteor/app/slashcommand-asciiarts/lib/gimme.ts new file mode 100644 index 000000000000..a057a5faa542 --- /dev/null +++ b/apps/meteor/app/slashcommand-asciiarts/lib/gimme.ts @@ -0,0 +1,19 @@ +import { Meteor } from 'meteor/meteor'; +import type { IMessage } from '@rocket.chat/core-typings'; + +import { slashCommands } from '../../utils/lib/slashCommand'; +/* + * Gimme is a named function that will replace /gimme commands + * @param {Object} message - The message object + */ + +function Gimme(_command: 'gimme', params: string, item: IMessage): void { + const msg = item; + msg.msg = `༼ つ ◕_◕ ༽つ ${params}`; + Meteor.call('sendMessage', msg); +} + +slashCommands.add('gimme', Gimme, { + description: 'Slash_Gimme_Description', + params: 'your_message_optional', +}); diff --git a/apps/meteor/app/slashcommand-asciiarts/lib/lenny.js b/apps/meteor/app/slashcommand-asciiarts/lib/lenny.js deleted file mode 100644 index 95afdc242459..000000000000 --- a/apps/meteor/app/slashcommand-asciiarts/lib/lenny.js +++ /dev/null @@ -1,20 +0,0 @@ -import { Meteor } from 'meteor/meteor'; - -import { slashCommands } from '../../utils'; -/* - * Lenny is a named function that will replace /lenny commands - * @param {Object} message - The message object - */ - -function LennyFace(command, params, item) { - if (command === 'lennyface') { - const msg = item; - msg.msg = `${params} ( ͡° ͜ʖ ͡°)`; - Meteor.call('sendMessage', msg); - } -} - -slashCommands.add('lennyface', LennyFace, { - description: 'Slash_LennyFace_Description', - params: 'your_message_optional', -}); diff --git a/apps/meteor/app/slashcommand-asciiarts/lib/lenny.ts b/apps/meteor/app/slashcommand-asciiarts/lib/lenny.ts new file mode 100644 index 000000000000..135090952227 --- /dev/null +++ b/apps/meteor/app/slashcommand-asciiarts/lib/lenny.ts @@ -0,0 +1,19 @@ +import type { IMessage } from '@rocket.chat/core-typings'; +import { Meteor } from 'meteor/meteor'; + +import { slashCommands } from '../../utils/lib/slashCommand'; +/* + * Lenny is a named function that will replace /lenny commands + * @param {Object} message - The message object + */ + +function LennyFace(_command: 'lennyface', params: string, item: IMessage): void { + const msg = item; + msg.msg = `${params} ( ͡° ͜ʖ ͡°)`; + Meteor.call('sendMessage', msg); +} + +slashCommands.add('lennyface', LennyFace, { + description: 'Slash_LennyFace_Description', + params: 'your_message_optional', +}); diff --git a/apps/meteor/app/slashcommand-asciiarts/lib/shrug.js b/apps/meteor/app/slashcommand-asciiarts/lib/shrug.js deleted file mode 100644 index 05d76fdb8db1..000000000000 --- a/apps/meteor/app/slashcommand-asciiarts/lib/shrug.js +++ /dev/null @@ -1,20 +0,0 @@ -import { Meteor } from 'meteor/meteor'; - -import { slashCommands } from '../../utils'; -/* - * Shrug is a named function that will replace /shrug commands - * @param {Object} message - The message object - */ - -function Shrug(command, params, item) { - if (command === 'shrug') { - const msg = item; - msg.msg = `${params} ¯\\_(ツ)_/¯`; - Meteor.call('sendMessage', msg); - } -} - -slashCommands.add('shrug', Shrug, { - description: 'Slash_Shrug_Description', - params: 'your_message_optional', -}); diff --git a/apps/meteor/app/slashcommand-asciiarts/lib/shrug.ts b/apps/meteor/app/slashcommand-asciiarts/lib/shrug.ts new file mode 100644 index 000000000000..b18e1fd1b039 --- /dev/null +++ b/apps/meteor/app/slashcommand-asciiarts/lib/shrug.ts @@ -0,0 +1,19 @@ +import type { IMessage } from '@rocket.chat/core-typings'; +import { Meteor } from 'meteor/meteor'; + +import { slashCommands } from '../../utils/lib/slashCommand'; +/* + * Shrug is a named function that will replace /shrug commands + * @param {Object} message - The message object + */ + +function Shrug(_command: 'shrug', params: string, item: IMessage): void { + const msg = item; + msg.msg = `${params} ¯\\_(ツ)_/¯`; + Meteor.call('sendMessage', msg); +} + +slashCommands.add('shrug', Shrug, { + description: 'Slash_Shrug_Description', + params: 'your_message_optional', +}); diff --git a/apps/meteor/app/slashcommand-asciiarts/lib/tableflip.js b/apps/meteor/app/slashcommand-asciiarts/lib/tableflip.js deleted file mode 100644 index 5454586d4ec3..000000000000 --- a/apps/meteor/app/slashcommand-asciiarts/lib/tableflip.js +++ /dev/null @@ -1,20 +0,0 @@ -import { Meteor } from 'meteor/meteor'; - -import { slashCommands } from '../../utils'; -/* - * Tableflip is a named function that will replace /Tableflip commands - * @param {Object} message - The message object - */ - -function Tableflip(command, params, item) { - if (command === 'tableflip') { - const msg = item; - msg.msg = `${params} (╯°□°)╯︵ ┻━┻`; - Meteor.call('sendMessage', msg); - } -} - -slashCommands.add('tableflip', Tableflip, { - description: 'Slash_Tableflip_Description', - params: 'your_message_optional', -}); diff --git a/apps/meteor/app/slashcommand-asciiarts/lib/tableflip.ts b/apps/meteor/app/slashcommand-asciiarts/lib/tableflip.ts new file mode 100644 index 000000000000..c2663ec487b3 --- /dev/null +++ b/apps/meteor/app/slashcommand-asciiarts/lib/tableflip.ts @@ -0,0 +1,19 @@ +import type { IMessage } from '@rocket.chat/core-typings'; +import { Meteor } from 'meteor/meteor'; + +import { slashCommands } from '../../utils/lib/slashCommand'; +/* + * Tableflip is a named function that will replace /Tableflip commands + * @param {Object} message - The message object + */ + +function Tableflip(_command: 'tableflip', params: string, item: IMessage): void { + const msg = item; + msg.msg = `${params} (╯°□°)╯︵ ┻━┻`; + Meteor.call('sendMessage', msg); +} + +slashCommands.add('tableflip', Tableflip, { + description: 'Slash_Tableflip_Description', + params: 'your_message_optional', +}); diff --git a/apps/meteor/app/slashcommand-asciiarts/lib/unflip.js b/apps/meteor/app/slashcommand-asciiarts/lib/unflip.js deleted file mode 100644 index d5728d60ad62..000000000000 --- a/apps/meteor/app/slashcommand-asciiarts/lib/unflip.js +++ /dev/null @@ -1,20 +0,0 @@ -import { Meteor } from 'meteor/meteor'; - -import { slashCommands } from '../../utils'; -/* - * Unflip is a named function that will replace /unflip commands - * @param {Object} message - The message object - */ - -function Unflip(command, params, item) { - if (command === 'unflip') { - const msg = item; - msg.msg = `${params} ┬─┬ ノ( ゜-゜ノ)`; - Meteor.call('sendMessage', msg); - } -} - -slashCommands.add('unflip', Unflip, { - description: 'Slash_TableUnflip_Description', - params: 'your_message_optional', -}); diff --git a/apps/meteor/app/slashcommand-asciiarts/lib/unflip.ts b/apps/meteor/app/slashcommand-asciiarts/lib/unflip.ts new file mode 100644 index 000000000000..5f66b2c8c85c --- /dev/null +++ b/apps/meteor/app/slashcommand-asciiarts/lib/unflip.ts @@ -0,0 +1,19 @@ +import type { IMessage } from '@rocket.chat/core-typings'; +import { Meteor } from 'meteor/meteor'; + +import { slashCommands } from '../../utils/lib/slashCommand'; +/* + * Unflip is a named function that will replace /unflip commands + * @param {Object} message - The message object + */ + +function Unflip(_command: 'unflip', params: string, item: IMessage): void { + const msg = item; + msg.msg = `${params} ┬─┬ ノ( ゜-゜ノ)`; + Meteor.call('sendMessage', msg); +} + +slashCommands.add('unflip', Unflip, { + description: 'Slash_TableUnflip_Description', + params: 'your_message_optional', +}); diff --git a/apps/meteor/app/slashcommand-asciiarts/server/index.js b/apps/meteor/app/slashcommand-asciiarts/server/index.ts similarity index 100% rename from apps/meteor/app/slashcommand-asciiarts/server/index.js rename to apps/meteor/app/slashcommand-asciiarts/server/index.ts diff --git a/apps/meteor/app/slashcommands-archiveroom/server/server.ts b/apps/meteor/app/slashcommands-archiveroom/server/server.ts index d7349278c10c..ae5f12ac8506 100644 --- a/apps/meteor/app/slashcommands-archiveroom/server/server.ts +++ b/apps/meteor/app/slashcommands-archiveroom/server/server.ts @@ -1,12 +1,13 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { IMessage } from '@rocket.chat/core-typings'; import { Rooms, Messages } from '../../models/server'; import { slashCommands } from '../../utils/lib/slashCommand'; import { api } from '../../../server/sdk/api'; import { settings } from '../../settings/server'; -function Archive(_command: 'archive', params: string, item: Record): void | Function { +function Archive(_command: 'archive', params: string, item: IMessage): void { let channel = params.trim(); let room; @@ -61,20 +62,10 @@ function Archive(_command: 'archive', params: string, item: Record): void { +function Bridge(_command: 'bridge', stringParams: string, item: IMessage): void { if (_command !== 'bridge' || !Match.test(stringParams, String)) { return; } @@ -29,15 +30,7 @@ function Bridge(_command: 'bridge', stringParams: string, item: Record): void { +function Create(_command: 'create', params: string, item: IMessage): void { function getParams(str: string): string[] { const regex = /(--(\w+))+/g; const result = []; @@ -53,16 +54,8 @@ function Create(_command: 'create', params: string, item: Record Meteor.call('createChannel', channelStr, []); } -slashCommands.add( - 'create', - Create, - { - description: 'Create_A_New_Channel', - params: '#channel', - permission: ['create-c', 'create-p'], - }, - undefined, - false, - undefined, - undefined, -); +slashCommands.add('create', Create, { + description: 'Create_A_New_Channel', + params: '#channel', + permission: ['create-c', 'create-p'], +}); diff --git a/apps/meteor/app/slashcommands-help/index.ts b/apps/meteor/app/slashcommands-help/index.ts deleted file mode 100644 index ca39cd0df4b1..000000000000 --- a/apps/meteor/app/slashcommands-help/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './server/index'; diff --git a/apps/meteor/app/slashcommands-help/server/server.ts b/apps/meteor/app/slashcommands-help/server/server.ts index e71387d08c73..b1d6fea68969 100644 --- a/apps/meteor/app/slashcommands-help/server/server.ts +++ b/apps/meteor/app/slashcommands-help/server/server.ts @@ -66,14 +66,6 @@ function Help(_command: 'help', _params: string, item: IMessage): void { }); } -slashCommands.add( - 'help', - Help, - { - description: 'Show_the_keyboard_shortcut_list', - }, - undefined, - false, - undefined, - undefined, -); +slashCommands.add('help', Help, { + description: 'Show_the_keyboard_shortcut_list', +}); diff --git a/apps/meteor/app/slashcommands-hide/client/hide.js b/apps/meteor/app/slashcommands-hide/client/hide.ts similarity index 58% rename from apps/meteor/app/slashcommands-hide/client/hide.js rename to apps/meteor/app/slashcommands-hide/client/hide.ts index a28f9a25c199..61612bf1ff8e 100644 --- a/apps/meteor/app/slashcommands-hide/client/hide.js +++ b/apps/meteor/app/slashcommands-hide/client/hide.ts @@ -1,4 +1,4 @@ -import { slashCommands } from '../../utils'; +import { slashCommands } from '../../utils/lib/slashCommand'; slashCommands.add('hide', undefined, { description: 'Hide_room', diff --git a/apps/meteor/app/slashcommands-hide/client/index.js b/apps/meteor/app/slashcommands-hide/client/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-hide/client/index.js rename to apps/meteor/app/slashcommands-hide/client/index.ts diff --git a/apps/meteor/app/slashcommands-hide/server/hide.js b/apps/meteor/app/slashcommands-hide/server/hide.js deleted file mode 100644 index 39dd5ed7dd50..000000000000 --- a/apps/meteor/app/slashcommands-hide/server/hide.js +++ /dev/null @@ -1,70 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Match } from 'meteor/check'; -import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; - -import { Rooms, Subscriptions } from '../../models'; -import { slashCommands } from '../../utils'; -import { api } from '../../../server/sdk/api'; - -/* - * Hide is a named function that will replace /hide commands - * @param {Object} message - The message object - */ -function Hide(command, param, item) { - if (command !== 'hide' || !Match.test(param, String)) { - return; - } - const room = param.trim(); - const user = Meteor.user(); - // if there is not a param, hide the current room - let { rid } = item; - if (room !== '') { - const [strippedRoom] = room.replace(/#|@/, '').split(' '); - const [type] = room; - - const roomObject = - type === '#' - ? Rooms.findOneByName(strippedRoom) - : Rooms.findOne({ - t: 'd', - usernames: { $all: [user.username, strippedRoom] }, - }); - - if (!roomObject) { - api.broadcast('notify.ephemeralMessage', user._id, item.rid, { - msg: TAPi18n.__( - 'Channel_doesnt_exist', - { - postProcess: 'sprintf', - sprintf: [room], - }, - user.language, - ), - }); - } - - if (!Subscriptions.findOneByRoomIdAndUserId(room._id, user._id, { fields: { _id: 1 } })) { - return api.broadcast('notify.ephemeralMessage', user._id, item.rid, { - msg: TAPi18n.__( - 'error-logged-user-not-in-room', - { - postProcess: 'sprintf', - sprintf: [room], - }, - user.language, - ), - }); - } - rid = roomObject._id; - } - - Meteor.call('hideRoom', rid, (error) => { - if (error) { - return api.broadcast('notify.ephemeralMessage', user._id, item.rid, { - msg: TAPi18n.__(error, null, user.language), - }); - } - }); -} - -slashCommands.add('hide', Hide, { description: 'Hide_room', params: '#room' }); diff --git a/apps/meteor/app/slashcommands-hide/server/hide.ts b/apps/meteor/app/slashcommands-hide/server/hide.ts new file mode 100644 index 000000000000..203f304c050d --- /dev/null +++ b/apps/meteor/app/slashcommands-hide/server/hide.ts @@ -0,0 +1,74 @@ +import { Meteor } from 'meteor/meteor'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import type { IMessage } from '@rocket.chat/core-typings'; + +import { settings } from '../../settings/server'; +import { Rooms, Subscriptions, Users } from '../../models/server'; +import { slashCommands } from '../../utils/server'; +import { api } from '../../../server/sdk/api'; + +/* + * Hide is a named function that will replace /hide commands + * @param {Object} message - The message object + */ + +function Hide(_command: 'hide', param: string, item: IMessage): void { + const room = param.trim(); + const userId = Meteor.userId(); + if (!userId) { + return; + } + + const user = Users.findOneById(userId); + + if (!user) { + return; + } + + const lng = user.language || settings.get('Language') || 'en'; + + // if there is not a param, hide the current room + let { rid } = item; + if (room !== '') { + const [strippedRoom] = room.replace(/#|@/, '').split(' '); + + const [type] = room; + + const roomObject = + type === '#' + ? Rooms.findOneByName(strippedRoom) + : Rooms.findOne({ + t: 'd', + usernames: { $all: [user.username, strippedRoom] }, + }); + if (!roomObject) { + api.broadcast('notify.ephemeralMessage', user._id, item.rid, { + msg: TAPi18n.__('Channel_doesnt_exist', { + postProcess: 'sprintf', + sprintf: [room], + lng, + }), + }); + } + if (!Subscriptions.findOneByRoomIdAndUserId(roomObject._id, user._id, { fields: { _id: 1 } })) { + api.broadcast('notify.ephemeralMessage', user._id, item.rid, { + msg: TAPi18n.__('error-logged-user-not-in-room', { + postProcess: 'sprintf', + sprintf: [room], + lng, + }), + }); + return; + } + rid = roomObject._id; + } + Meteor.call('hideRoom', rid, (error: string) => { + if (error) { + return api.broadcast('notify.ephemeralMessage', user._id, item.rid, { + msg: TAPi18n.__(error, { lng }), + }); + } + }); +} + +slashCommands.add('hide', Hide, { description: 'Hide_room', params: '#room' }); diff --git a/apps/meteor/app/slashcommands-hide/server/index.js b/apps/meteor/app/slashcommands-hide/server/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-hide/server/index.js rename to apps/meteor/app/slashcommands-hide/server/index.ts diff --git a/apps/meteor/app/slashcommands-invite/server/server.ts b/apps/meteor/app/slashcommands-invite/server/server.ts index afe867553602..d54b319646a8 100644 --- a/apps/meteor/app/slashcommands-invite/server/server.ts +++ b/apps/meteor/app/slashcommands-invite/server/server.ts @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { IMessage } from '@rocket.chat/core-typings'; import { settings } from '../../settings/server'; import { slashCommands } from '../../utils/lib/slashCommand'; @@ -11,7 +12,7 @@ import { api } from '../../../server/sdk/api'; * @param {Object} message - The message object */ -function Invite(_command: 'invite', params: string, item: Record): void { +function Invite(_command: 'invite', params: string, item: IMessage): void { const usernames = params .split(/[\s,]/) .map((username) => username.replace(/(^@)|( @)/, '')) @@ -76,16 +77,8 @@ function Invite(_command: 'invite', params: string, item: Record }); } -slashCommands.add( - 'invite', - Invite, - { - description: 'Invite_user_to_join_channel', - params: '@username', - permission: 'add-user-to-joined-room', - }, - undefined, - false, - undefined, - undefined, -); +slashCommands.add('invite', Invite, { + description: 'Invite_user_to_join_channel', + params: '@username', + permission: 'add-user-to-joined-room', +}); diff --git a/apps/meteor/app/slashcommands-inviteall/client/client.js b/apps/meteor/app/slashcommands-inviteall/client/client.ts similarity index 86% rename from apps/meteor/app/slashcommands-inviteall/client/client.js rename to apps/meteor/app/slashcommands-inviteall/client/client.ts index 9805a2e36b20..d09c9d9e908d 100644 --- a/apps/meteor/app/slashcommands-inviteall/client/client.js +++ b/apps/meteor/app/slashcommands-inviteall/client/client.ts @@ -1,4 +1,4 @@ -import { slashCommands } from '../../utils'; +import { slashCommands } from '../../utils/lib/slashCommand'; slashCommands.add('invite-all-to', undefined, { description: 'Invite_user_to_join_channel_all_to', diff --git a/apps/meteor/app/slashcommands-inviteall/client/index.js b/apps/meteor/app/slashcommands-inviteall/client/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-inviteall/client/index.js rename to apps/meteor/app/slashcommands-inviteall/client/index.ts diff --git a/apps/meteor/app/slashcommands-inviteall/server/index.js b/apps/meteor/app/slashcommands-inviteall/server/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-inviteall/server/index.js rename to apps/meteor/app/slashcommands-inviteall/server/index.ts diff --git a/apps/meteor/app/slashcommands-inviteall/server/server.js b/apps/meteor/app/slashcommands-inviteall/server/server.ts similarity index 57% rename from apps/meteor/app/slashcommands-inviteall/server/server.js rename to apps/meteor/app/slashcommands-inviteall/server/server.ts index 5087b63988a9..a56b2c83c769 100644 --- a/apps/meteor/app/slashcommands-inviteall/server/server.js +++ b/apps/meteor/app/slashcommands-inviteall/server/server.ts @@ -2,67 +2,77 @@ * Invite is a named function that will replace /invite commands * @param {Object} message - The message object */ + import { Meteor } from 'meteor/meteor'; -import { Match } from 'meteor/check'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import type { IMessage, ISubscription } from '@rocket.chat/core-typings'; -import { Rooms, Subscriptions } from '../../models'; -import { slashCommands } from '../../utils'; -import { settings } from '../../settings'; +import { Rooms, Subscriptions, Users } from '../../models/server'; +import { slashCommands } from '../../utils/lib/slashCommand'; +import { settings } from '../../settings/server'; import { api } from '../../../server/sdk/api'; -function inviteAll(type) { - return function inviteAll(command, params, item) { - if (!/invite\-all-(to|from)/.test(command) || !Match.test(params, String)) { +function inviteAll(type: string): typeof slashCommands.commands[string]['callback'] { + return function inviteAll(command: string, params: string, item: IMessage): void { + if (!/invite\-all-(to|from)/.test(command)) { return; } - const regexp = /#?([^\s,.:;"']+)(?=[\s,.:;"']|$)/g; - const [, channel] = regexp.exec(params.trim()); + let channel = params.trim(); + if (channel === '') { + return; + } + + channel = channel.replace('#', ''); if (!channel) { return; } const userId = Meteor.userId(); - const currentUser = Meteor.users.findOne(userId); + if (!userId) { + return; + } + + const user = Users.findOneById(userId); + const lng = user?.language || settings.get('Language') || 'en'; + const baseChannel = type === 'to' ? Rooms.findOneById(item.rid) : Rooms.findOneByName(channel); const targetChannel = type === 'from' ? Rooms.findOneById(item.rid) : Rooms.findOneByName(channel); if (!baseChannel) { - return api.broadcast('notify.ephemeralMessage', userId, item.rid, { - msg: TAPi18n.__( - 'Channel_doesnt_exist', - { - postProcess: 'sprintf', - sprintf: [channel], - }, - currentUser.language, - ), + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__('Channel_doesnt_exist', { + postProcess: 'sprintf', + sprintf: [channel], + lng, + }), }); + return; } const cursor = Subscriptions.findByRoomIdWhenUsernameExists(baseChannel._id, { fields: { 'u.username': 1 }, }); try { - if (cursor.count() > settings.get('API_User_Limit')) { + const APIsettings = settings.get('API_User_Limit'); + if (!APIsettings) { + return; + } + if (cursor.count() > APIsettings) { throw new Meteor.Error('error-user-limit-exceeded', 'User Limit Exceeded', { method: 'addAllToRoom', }); } - const users = cursor.fetch().map((s) => s.u.username); + const users = cursor.fetch().map((s: ISubscription) => s.u.username); if (!targetChannel && ['c', 'p'].indexOf(baseChannel.t) > -1) { Meteor.call(baseChannel.t === 'c' ? 'createChannel' : 'createPrivateGroup', channel, users); api.broadcast('notify.ephemeralMessage', userId, item.rid, { - msg: TAPi18n.__( - 'Channel_created', - { - postProcess: 'sprintf', - sprintf: [channel], - }, - currentUser.language, - ), + msg: TAPi18n.__('Channel_created', { + postProcess: 'sprintf', + sprintf: [channel], + lng, + }), }); } else { Meteor.call('addUsersToRoom', { @@ -70,13 +80,14 @@ function inviteAll(type) { users, }); } - return api.broadcast('notify.ephemeralMessage', userId, item.rid, { - msg: TAPi18n.__('Users_added', null, currentUser.language), + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__('Users_added', { lng }), }); - } catch (e) { + return; + } catch (e: any) { const msg = e.error === 'cant-invite-for-direct-room' ? 'Cannot_invite_users_to_direct_rooms' : e.error; api.broadcast('notify.ephemeralMessage', userId, item.rid, { - msg: TAPi18n.__(msg, null, currentUser.language), + msg: TAPi18n.__(msg, { lng }), }); } }; diff --git a/apps/meteor/app/slashcommands-join/client/client.ts b/apps/meteor/app/slashcommands-join/client/client.ts index d18ce2106d5c..3fb1ac1c949d 100644 --- a/apps/meteor/app/slashcommands-join/client/client.ts +++ b/apps/meteor/app/slashcommands-join/client/client.ts @@ -10,14 +10,11 @@ slashCommands.add( params: '#channel', permission: 'view-c-room', }, - undefined, - false, - undefined, function (err: Meteor.Error, _result: unknown, params: Record) { if (err.error === 'error-user-already-in-room') { params.cmd = 'open'; params.msg.msg = params.msg.msg.replace('join', 'open'); - return slashCommands.run('open', params.params, params.msg, undefined); + return slashCommands.run('open', params.params, params.msg, ''); } }, ); diff --git a/apps/meteor/app/slashcommands-join/server/server.ts b/apps/meteor/app/slashcommands-join/server/server.ts index cb47d4bba271..25737a969dd4 100644 --- a/apps/meteor/app/slashcommands-join/server/server.ts +++ b/apps/meteor/app/slashcommands-join/server/server.ts @@ -1,12 +1,13 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { IMessage } from '@rocket.chat/core-typings'; import { Rooms, Subscriptions } from '../../models/server'; import { settings } from '../../settings/server'; import { slashCommands } from '../../utils/lib/slashCommand'; import { api } from '../../../server/sdk/api'; -function Join(_command: 'join', params: string, item: Record): void { +function Join(_command: 'join', params: string, item: IMessage): void { let channel = params.trim(); if (channel === '') { return; @@ -45,16 +46,8 @@ function Join(_command: 'join', params: string, item: Record): v Meteor.call('joinRoom', room._id); } -slashCommands.add( - 'join', - Join, - { - description: 'Join_the_given_channel', - params: '#channel', - permission: 'view-c-room', - }, - undefined, - false, - undefined, - undefined, -); +slashCommands.add('join', Join, { + description: 'Join_the_given_channel', + params: '#channel', + permission: 'view-c-room', +}); diff --git a/apps/meteor/app/slashcommands-kick/client/client.js b/apps/meteor/app/slashcommands-kick/client/client.ts similarity index 69% rename from apps/meteor/app/slashcommands-kick/client/client.js rename to apps/meteor/app/slashcommands-kick/client/client.ts index becd5a5bd9a5..f3a2b50410aa 100644 --- a/apps/meteor/app/slashcommands-kick/client/client.js +++ b/apps/meteor/app/slashcommands-kick/client/client.ts @@ -1,8 +1,8 @@ -import { slashCommands } from '../../utils'; +import { slashCommands } from '../../utils/lib/slashCommand'; slashCommands.add( 'kick', - function (command, params) { + function (_command: 'kick', params: string) { const username = params.trim(); if (username === '') { return; diff --git a/apps/meteor/app/slashcommands-kick/client/index.js b/apps/meteor/app/slashcommands-kick/client/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-kick/client/index.js rename to apps/meteor/app/slashcommands-kick/client/index.ts diff --git a/apps/meteor/app/slashcommands-kick/server/index.js b/apps/meteor/app/slashcommands-kick/server/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-kick/server/index.js rename to apps/meteor/app/slashcommands-kick/server/index.ts diff --git a/apps/meteor/app/slashcommands-kick/server/server.js b/apps/meteor/app/slashcommands-kick/server/server.js deleted file mode 100644 index 9336e43e67f4..000000000000 --- a/apps/meteor/app/slashcommands-kick/server/server.js +++ /dev/null @@ -1,57 +0,0 @@ -// Kick is a named function that will replace /kick commands -import { Meteor } from 'meteor/meteor'; -import { Match } from 'meteor/check'; -import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; - -import { Users, Subscriptions } from '../../models'; -import { slashCommands } from '../../utils'; -import { api } from '../../../server/sdk/api'; - -const Kick = function (command, params, { rid }) { - if (command !== 'kick' || !Match.test(params, String)) { - return; - } - const username = params.trim().replace('@', ''); - if (username === '') { - return; - } - const userId = Meteor.userId(); - const user = Meteor.users.findOne(userId); - const kickedUser = Users.findOneByUsernameIgnoringCase(username); - - if (kickedUser == null) { - return api.broadcast('notify.ephemeralMessage', userId, rid, { - msg: TAPi18n.__( - 'Username_doesnt_exist', - { - postProcess: 'sprintf', - sprintf: [username], - }, - user.language, - ), - }); - } - - const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, user._id, { - fields: { _id: 1 }, - }); - if (!subscription) { - return api.broadcast('notify.ephemeralMessage', userId, rid, { - msg: TAPi18n.__( - 'Username_is_not_in_this_room', - { - postProcess: 'sprintf', - sprintf: [username], - }, - user.language, - ), - }); - } - Meteor.call('removeUserFromRoom', { rid, username }); -}; - -slashCommands.add('kick', Kick, { - description: 'Remove_someone_from_room', - params: '@username', - permission: 'remove-user', -}); diff --git a/apps/meteor/app/slashcommands-kick/server/server.ts b/apps/meteor/app/slashcommands-kick/server/server.ts new file mode 100644 index 000000000000..5a08e53fbacd --- /dev/null +++ b/apps/meteor/app/slashcommands-kick/server/server.ts @@ -0,0 +1,54 @@ +// Kick is a named function that will replace /kick commands +import { Meteor } from 'meteor/meteor'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import type { IMessage } from '@rocket.chat/core-typings'; + +import { Users, Subscriptions } from '../../models/server'; +import { settings } from '../../settings/server'; +import { slashCommands } from '../../utils/lib/slashCommand'; +import { api } from '../../../server/sdk/api'; + +const Kick = function (_command: 'kick', params: string, item: IMessage): void { + const username = params.trim().replace('@', ''); + if (username === '') { + return; + } + const userId = Meteor.userId() as string; + const user = Users.findOneById(userId); + const lng = user?.language || settings.get('Language') || 'en'; + + const kickedUser = Users.findOneByUsernameIgnoringCase(username); + + if (kickedUser == null) { + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__('Username_doesnt_exist', { + postProcess: 'sprintf', + sprintf: [username], + lng, + }), + }); + return; + } + + const subscription = Subscriptions.findOneByRoomIdAndUserId(item.rid, userId, { + fields: { _id: 1 }, + }); + if (!subscription) { + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__('Username_is_not_in_this_room', { + postProcess: 'sprintf', + sprintf: [username], + lng, + }), + }); + return; + } + const { rid } = item; + Meteor.call('removeUserFromRoom', { rid, username }); +}; + +slashCommands.add('kick', Kick, { + description: 'Remove_someone_from_room', + params: '@username', + permission: 'remove-user', +}); diff --git a/apps/meteor/app/slashcommands-leave/index.js b/apps/meteor/app/slashcommands-leave/index.js deleted file mode 100644 index ca39cd0df4b1..000000000000 --- a/apps/meteor/app/slashcommands-leave/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from './server/index'; diff --git a/apps/meteor/app/slashcommands-leave/server/index.js b/apps/meteor/app/slashcommands-leave/server/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-leave/server/index.js rename to apps/meteor/app/slashcommands-leave/server/index.ts diff --git a/apps/meteor/app/slashcommands-leave/server/leave.js b/apps/meteor/app/slashcommands-leave/server/leave.ts similarity index 50% rename from apps/meteor/app/slashcommands-leave/server/leave.js rename to apps/meteor/app/slashcommands-leave/server/leave.ts index dec54de5d54e..21aed9574caf 100644 --- a/apps/meteor/app/slashcommands-leave/server/leave.js +++ b/apps/meteor/app/slashcommands-leave/server/leave.ts @@ -1,23 +1,27 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import type { IMessage } from '@rocket.chat/core-typings'; -import { slashCommands } from '../../utils'; +import { slashCommands } from '../../utils/lib/slashCommand'; +import { settings } from '../../settings/server'; import { api } from '../../../server/sdk/api'; +import { Users } from '../../models/server'; /* * Leave is a named function that will replace /leave commands * @param {Object} message - The message object */ -function Leave(command, params, item) { - if (command !== 'leave' && command !== 'part') { - return; - } - +function Leave(_command: string, _params: string, item: IMessage): void { try { Meteor.call('leaveRoom', item.rid); } catch ({ error }) { - api.broadcast('notify.ephemeralMessage', Meteor.userId(), item.rid, { - msg: TAPi18n.__(error, null, Meteor.user().language), + const userId = Meteor.userId() as string; + if (typeof error !== 'string') { + return; + } + const user = Users.findOneById(userId); + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__(error, { lng: user?.language || settings.get('Language') || 'en' }), }); } } diff --git a/apps/meteor/app/slashcommands-me/index.ts b/apps/meteor/app/slashcommands-me/index.ts deleted file mode 100644 index ca39cd0df4b1..000000000000 --- a/apps/meteor/app/slashcommands-me/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './server/index'; diff --git a/apps/meteor/app/slashcommands-me/server/me.ts b/apps/meteor/app/slashcommands-me/server/me.ts index ff536c475460..300be2ad353a 100644 --- a/apps/meteor/app/slashcommands-me/server/me.ts +++ b/apps/meteor/app/slashcommands-me/server/me.ts @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import s from 'underscore.string'; +import { IMessage } from '@rocket.chat/core-typings'; import { slashCommands } from '../../utils/lib/slashCommand'; @@ -9,7 +10,7 @@ import { slashCommands } from '../../utils/lib/slashCommand'; */ slashCommands.add( 'me', - function Me(_command: 'me', params: string, item: Record): void { + function Me(_command: 'me', params: string, item: IMessage): void { if (s.trim(params)) { const msg = item; msg.msg = `_${params}_`; @@ -20,8 +21,4 @@ slashCommands.add( description: 'Displays_action_text', params: 'your_message', }, - undefined, - false, - undefined, - undefined, ); diff --git a/apps/meteor/app/slashcommands-msg/index.js b/apps/meteor/app/slashcommands-msg/index.js deleted file mode 100644 index ca39cd0df4b1..000000000000 --- a/apps/meteor/app/slashcommands-msg/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from './server/index'; diff --git a/apps/meteor/app/slashcommands-msg/server/index.js b/apps/meteor/app/slashcommands-msg/server/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-msg/server/index.js rename to apps/meteor/app/slashcommands-msg/server/index.ts diff --git a/apps/meteor/app/slashcommands-msg/server/server.js b/apps/meteor/app/slashcommands-msg/server/server.ts similarity index 55% rename from apps/meteor/app/slashcommands-msg/server/server.js rename to apps/meteor/app/slashcommands-msg/server/server.ts index ca49ff170a6f..bea98e24e2ca 100644 --- a/apps/meteor/app/slashcommands-msg/server/server.js +++ b/apps/meteor/app/slashcommands-msg/server/server.ts @@ -1,42 +1,39 @@ import { Meteor } from 'meteor/meteor'; -import { Match } from 'meteor/check'; import { Random } from 'meteor/random'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import type { IMessage } from '@rocket.chat/core-typings'; -import { slashCommands } from '../../utils'; -import { Users } from '../../models'; +import { slashCommands } from '../../utils/lib/slashCommand'; +import { settings } from '../../settings/server'; +import { Users } from '../../models/server'; import { api } from '../../../server/sdk/api'; /* * Msg is a named function that will replace /msg commands */ -function Msg(command, params, item) { - if (command !== 'msg' || !Match.test(params, String)) { - return; - } +function Msg(_command: 'msg', params: string, item: IMessage): void { const trimmedParams = params.trim(); const separator = trimmedParams.indexOf(' '); - const user = Meteor.users.findOne(Meteor.userId()); + const userId = Meteor.userId() as string; if (separator === -1) { - return api.broadcast('notify.ephemeralMessage', Meteor.userId(), item.rid, { - msg: TAPi18n.__('Username_and_message_must_not_be_empty', null, user.language), + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__('Username_and_message_must_not_be_empty', { lng: settings.get('Language') || 'en' }), }); + return; } const message = trimmedParams.slice(separator + 1); const targetUsernameOrig = trimmedParams.slice(0, separator); const targetUsername = targetUsernameOrig.replace('@', ''); const targetUser = Users.findOneByUsernameIgnoringCase(targetUsername); if (targetUser == null) { - api.broadcast('notify.ephemeralMessage', Meteor.userId(), item.rid, { - msg: TAPi18n.__( - 'Username_doesnt_exist', - { - postProcess: 'sprintf', - sprintf: [targetUsernameOrig], - }, - user.language, - ), + const user = Users.findOneById(userId, { fields: { language: 1 } }); + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__('Username_doesnt_exist', { + postProcess: 'sprintf', + sprintf: [targetUsernameOrig], + lng: user?.language || settings.get('Language') || 'en', + }), }); return; } diff --git a/apps/meteor/app/slashcommands-mute/index.ts b/apps/meteor/app/slashcommands-mute/index.ts deleted file mode 100644 index ca39cd0df4b1..000000000000 --- a/apps/meteor/app/slashcommands-mute/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './server/index'; diff --git a/apps/meteor/app/slashcommands-mute/server/mute.ts b/apps/meteor/app/slashcommands-mute/server/mute.ts index ee000c5667f3..ed4fd5312893 100644 --- a/apps/meteor/app/slashcommands-mute/server/mute.ts +++ b/apps/meteor/app/slashcommands-mute/server/mute.ts @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { IMessage } from '@rocket.chat/core-typings'; import { slashCommands } from '../../utils/lib/slashCommand'; import { settings } from '../../settings/server'; @@ -10,7 +11,7 @@ import { api } from '../../../server/sdk/api'; * Mute is a named function that will replace /mute commands */ -function Mute(_command: 'mute', params: string, item: Record): void { +function Mute(_command: 'mute', params: string, item: IMessage): void { const username = params.trim().replace('@', ''); if (username === '') { return; @@ -46,16 +47,8 @@ function Mute(_command: 'mute', params: string, item: Record): v }); } -slashCommands.add( - 'mute', - Mute, - { - description: 'Mute_someone_in_room', - params: '@username', - permission: 'mute-user', - }, - undefined, - false, - undefined, - undefined, -); +slashCommands.add('mute', Mute, { + description: 'Mute_someone_in_room', + params: '@username', + permission: 'mute-user', +}); diff --git a/apps/meteor/app/slashcommands-mute/server/unmute.ts b/apps/meteor/app/slashcommands-mute/server/unmute.ts index bcc43f1b1f10..38e9229b95d0 100644 --- a/apps/meteor/app/slashcommands-mute/server/unmute.ts +++ b/apps/meteor/app/slashcommands-mute/server/unmute.ts @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { IMessage } from '@rocket.chat/core-typings'; import { slashCommands } from '../../utils/lib/slashCommand'; import { Users, Subscriptions } from '../../models/server'; @@ -10,7 +11,7 @@ import { api } from '../../../server/sdk/api'; * Unmute is a named function that will replace /unmute commands */ -function Unmute(_command: 'unmute', params: string, item: Record): void | Promise { +function Unmute(_command: 'unmute', params: string, item: IMessage): void | Promise { const username = params.trim().replace('@', ''); if (username === '') { return; @@ -45,16 +46,8 @@ function Unmute(_command: 'unmute', params: string, item: Record }); } -slashCommands.add( - 'unmute', - Unmute, - { - description: 'Unmute_someone_in_room', - params: '@username', - permission: 'mute-user', - }, - undefined, - false, - undefined, - undefined, -); +slashCommands.add('unmute', Unmute, { + description: 'Unmute_someone_in_room', + params: '@username', + permission: 'mute-user', +}); diff --git a/apps/meteor/app/slashcommands-open/client/client.js b/apps/meteor/app/slashcommands-open/client/client.ts similarity index 63% rename from apps/meteor/app/slashcommands-open/client/client.js rename to apps/meteor/app/slashcommands-open/client/client.ts index 9d630bddc83a..ce0342b20c6b 100644 --- a/apps/meteor/app/slashcommands-open/client/client.js +++ b/apps/meteor/app/slashcommands-open/client/client.ts @@ -1,35 +1,25 @@ import { Meteor } from 'meteor/meteor'; -import { Match } from 'meteor/check'; import { FlowRouter } from 'meteor/kadira:flow-router'; +import type { IMessage } from '@rocket.chat/core-typings'; -import { slashCommands } from '../../utils'; import { roomCoordinator } from '../../../client/lib/rooms/roomCoordinator'; -import { ChatSubscription, Subscriptions } from '../../models'; +import { slashCommands } from '../../utils/lib/slashCommand'; +import { Subscriptions, ChatSubscription } from '../../models/client'; -function Open(command, params /* , item*/) { - const dict = { +function Open(_command: 'open', params: string, _item: IMessage): void { + const dict: Record = { '#': ['c', 'p'], '@': ['d'], }; - if (command !== 'open' || !Match.test(params, String)) { - return; - } - - let room = params.trim(); - const type = dict[room[0]]; - room = room.replace(/#|@/, ''); + const room = params.trim().replace(/#|@/, ''); + const type = dict[params.trim()[0]] || []; const query = { name: room, + ...(type && { t: { $in: type } }), }; - if (type) { - query.t = { - $in: type, - }; - } - const subscription = ChatSubscription.findOne(query); if (subscription) { @@ -39,7 +29,7 @@ function Open(command, params /* , item*/) { if (type && type.indexOf('d') === -1) { return; } - return Meteor.call('createDirectMessage', room, function (err) { + return Meteor.call('createDirectMessage', room, function (err: Meteor.Error) { if (err) { return; } diff --git a/apps/meteor/app/slashcommands-open/client/index.js b/apps/meteor/app/slashcommands-open/client/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-open/client/index.js rename to apps/meteor/app/slashcommands-open/client/index.ts diff --git a/apps/meteor/app/slashcommands-open/index.js b/apps/meteor/app/slashcommands-open/index.ts similarity index 100% rename from apps/meteor/app/slashcommands-open/index.js rename to apps/meteor/app/slashcommands-open/index.ts diff --git a/apps/meteor/app/slashcommands-status/client/index.js b/apps/meteor/app/slashcommands-status/client/index.js deleted file mode 100644 index 11e5ad1b8640..000000000000 --- a/apps/meteor/app/slashcommands-status/client/index.js +++ /dev/null @@ -1 +0,0 @@ -import '../lib/status'; diff --git a/apps/meteor/app/slashcommands-status/client/index.ts b/apps/meteor/app/slashcommands-status/client/index.ts new file mode 100644 index 000000000000..57ce4c92d8f8 --- /dev/null +++ b/apps/meteor/app/slashcommands-status/client/index.ts @@ -0,0 +1 @@ +import './status'; diff --git a/apps/meteor/app/slashcommands-status/client/status.ts b/apps/meteor/app/slashcommands-status/client/status.ts new file mode 100644 index 000000000000..69b1dd11241e --- /dev/null +++ b/apps/meteor/app/slashcommands-status/client/status.ts @@ -0,0 +1,26 @@ +import { Meteor } from 'meteor/meteor'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import type { IMessage } from '@rocket.chat/core-typings'; + +import { slashCommands } from '../../utils/lib/slashCommand'; +import { settings } from '../../settings/server'; +import { api } from '../../../server/sdk/api'; +import { handleError } from '../../../client/lib/utils/handleError'; + +function Status(_command: 'status', params: string, item: IMessage): void { + const userId = Meteor.userId() as string; + + Meteor.call('setUserStatus', null, params, (err: Meteor.Error) => { + if (err) { + return handleError(err); + } + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__('StatusMessage_Changed_Successfully', { lng: settings.get('Language') || 'en' }), + }); + }); +} + +slashCommands.add('status', Status, { + description: 'Slash_Status_Description', + params: 'Slash_Status_Params', +}); diff --git a/apps/meteor/app/slashcommands-status/index.js b/apps/meteor/app/slashcommands-status/index.js deleted file mode 100644 index a67eca871efb..000000000000 --- a/apps/meteor/app/slashcommands-status/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import { Meteor } from 'meteor/meteor'; - -if (Meteor.isClient) { - module.exports = require('./client/index.js'); -} -if (Meteor.isServer) { - module.exports = require('./server/index.js'); -} diff --git a/apps/meteor/app/slashcommands-status/lib/status.js b/apps/meteor/app/slashcommands-status/lib/status.js deleted file mode 100644 index 359068a0cda5..000000000000 --- a/apps/meteor/app/slashcommands-status/lib/status.js +++ /dev/null @@ -1,37 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; - -import { slashCommands } from '../../utils'; -import { api } from '../../../server/sdk/api'; - -function Status(command, params, item) { - if (command === 'status') { - const user = Meteor.users.findOne(Meteor.userId()); - - Meteor.call('setUserStatus', null, params, (err) => { - if (err) { - if (Meteor.isClient) { - const { handleError } = require('../../../client/lib/utils/handleError'); - return handleError(err); - } - - if (err.error === 'error-not-allowed') { - api.broadcast('notify.ephemeralMessage', Meteor.userId(), item.rid, { - msg: TAPi18n.__('StatusMessage_Change_Disabled', null, user.language), - }); - } - - throw err; - } else { - api.broadcast('notify.ephemeralMessage', Meteor.userId(), item.rid, { - msg: TAPi18n.__('StatusMessage_Changed_Successfully', null, user.language), - }); - } - }); - } -} - -slashCommands.add('status', Status, { - description: 'Slash_Status_Description', - params: 'Slash_Status_Params', -}); diff --git a/apps/meteor/app/slashcommands-status/server/index.js b/apps/meteor/app/slashcommands-status/server/index.js deleted file mode 100644 index 11e5ad1b8640..000000000000 --- a/apps/meteor/app/slashcommands-status/server/index.js +++ /dev/null @@ -1 +0,0 @@ -import '../lib/status'; diff --git a/apps/meteor/app/slashcommands-status/server/index.ts b/apps/meteor/app/slashcommands-status/server/index.ts new file mode 100644 index 000000000000..57ce4c92d8f8 --- /dev/null +++ b/apps/meteor/app/slashcommands-status/server/index.ts @@ -0,0 +1 @@ +import './status'; diff --git a/apps/meteor/app/slashcommands-status/server/status.ts b/apps/meteor/app/slashcommands-status/server/status.ts new file mode 100644 index 000000000000..5bbee67baf8c --- /dev/null +++ b/apps/meteor/app/slashcommands-status/server/status.ts @@ -0,0 +1,36 @@ +import { Meteor } from 'meteor/meteor'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import type { IMessage } from '@rocket.chat/core-typings'; + +import { slashCommands } from '../../utils/lib/slashCommand'; +import { settings } from '../../settings/server'; +import { api } from '../../../server/sdk/api'; +import { Users } from '../../models/server'; + +function Status(_command: 'status', params: string, item: IMessage): void { + const userId = Meteor.userId() as string; + + Meteor.call('setUserStatus', null, params, (err: Meteor.Error) => { + const user = userId && Users.findOneById(userId, { fields: { language: 1 } }); + const lng = user?.language || settings.get('Language') || 'en'; + + if (err) { + if (err.error === 'error-not-allowed') { + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__('StatusMessage_Change_Disabled', { lng }), + }); + } + + throw err; + } else { + api.broadcast('notify.ephemeralMessage', userId, item.rid, { + msg: TAPi18n.__('StatusMessage_Changed_Successfully', { lng }), + }); + } + }); +} + +slashCommands.add('status', Status, { + description: 'Slash_Status_Description', + params: 'Slash_Status_Params', +}); diff --git a/apps/meteor/app/slashcommands-topic/client/index.js b/apps/meteor/app/slashcommands-topic/client/index.js deleted file mode 100644 index 9ea49d4c9e63..000000000000 --- a/apps/meteor/app/slashcommands-topic/client/index.js +++ /dev/null @@ -1 +0,0 @@ -import '../lib/topic'; diff --git a/apps/meteor/app/slashcommands-topic/client/index.ts b/apps/meteor/app/slashcommands-topic/client/index.ts new file mode 100644 index 000000000000..2ad19c172e54 --- /dev/null +++ b/apps/meteor/app/slashcommands-topic/client/index.ts @@ -0,0 +1 @@ +import './topic'; diff --git a/apps/meteor/app/slashcommands-topic/client/topic.ts b/apps/meteor/app/slashcommands-topic/client/topic.ts new file mode 100644 index 000000000000..8b0e121ee013 --- /dev/null +++ b/apps/meteor/app/slashcommands-topic/client/topic.ts @@ -0,0 +1,31 @@ +import { Meteor } from 'meteor/meteor'; +import type { IMessage } from '@rocket.chat/core-typings'; + +import { slashCommands } from '../../utils/lib/slashCommand'; +import { ChatRoom } from '../../models/client/models/ChatRoom'; +import { callbacks } from '../../../lib/callbacks'; +import { hasPermission } from '../../authorization/client'; +import { handleError } from '../../../client/lib/utils/handleError'; + +function Topic(_command: 'topic', params: string, item: IMessage): void { + if (Meteor.isClient && hasPermission('edit-room', item.rid)) { + Meteor.call('saveRoomSettings', item.rid, 'roomTopic', params, (err: Meteor.Error) => { + if (err) { + if (Meteor.isClient) { + handleError(err); + } + throw err; + } + + if (Meteor.isClient) { + callbacks.run('roomTopicChanged', ChatRoom.findOne(item.rid)); + } + }); + } +} + +slashCommands.add('topic', Topic, { + description: 'Slash_Topic_Description', + params: 'Slash_Topic_Params', + permission: 'edit-room', +}); diff --git a/apps/meteor/app/slashcommands-topic/lib/topic.js b/apps/meteor/app/slashcommands-topic/lib/topic.js deleted file mode 100644 index 24685fc4d309..000000000000 --- a/apps/meteor/app/slashcommands-topic/lib/topic.js +++ /dev/null @@ -1,35 +0,0 @@ -import { Meteor } from 'meteor/meteor'; - -import { slashCommands } from '../../utils'; -import { ChatRoom } from '../../models'; -import { callbacks } from '../../../lib/callbacks'; -import { hasPermission } from '../../authorization'; - -function Topic(command, params, item) { - if (command === 'topic') { - if ( - (Meteor.isClient && hasPermission('edit-room', item.rid)) || - (Meteor.isServer && hasPermission(Meteor.userId(), 'edit-room', item.rid)) - ) { - Meteor.call('saveRoomSettings', item.rid, 'roomTopic', params, (err) => { - if (err) { - if (Meteor.isClient) { - const { handleError } = require('../../../client/lib/utils/handleError'); - return handleError(err); - } - throw err; - } - - if (Meteor.isClient) { - callbacks.run('roomTopicChanged', ChatRoom.findOne(item.rid)); - } - }); - } - } -} - -slashCommands.add('topic', Topic, { - description: 'Slash_Topic_Description', - params: 'Slash_Topic_Params', - permission: 'edit-room', -}); diff --git a/apps/meteor/app/slashcommands-topic/server/index.js b/apps/meteor/app/slashcommands-topic/server/index.js deleted file mode 100644 index 9ea49d4c9e63..000000000000 --- a/apps/meteor/app/slashcommands-topic/server/index.js +++ /dev/null @@ -1 +0,0 @@ -import '../lib/topic'; diff --git a/apps/meteor/app/slashcommands-topic/server/index.ts b/apps/meteor/app/slashcommands-topic/server/index.ts new file mode 100644 index 000000000000..2ad19c172e54 --- /dev/null +++ b/apps/meteor/app/slashcommands-topic/server/index.ts @@ -0,0 +1 @@ +import './topic'; diff --git a/apps/meteor/app/slashcommands-topic/server/topic.ts b/apps/meteor/app/slashcommands-topic/server/topic.ts new file mode 100644 index 000000000000..763861d2d20b --- /dev/null +++ b/apps/meteor/app/slashcommands-topic/server/topic.ts @@ -0,0 +1,21 @@ +import { Meteor } from 'meteor/meteor'; +import type { IMessage } from '@rocket.chat/core-typings'; + +import { slashCommands } from '../../utils/lib/slashCommand'; +import { hasPermission } from '../../authorization/server/functions/hasPermission'; + +function Topic(_command: 'topic', params: string, item: IMessage): void { + if (Meteor.isServer && hasPermission(Meteor.userId() as string, 'edit-room', item.rid)) { + Meteor.call('saveRoomSettings', item.rid, 'roomTopic', params, (err: Meteor.Error) => { + if (err) { + throw err; + } + }); + } +} + +slashCommands.add('topic', Topic, { + description: 'Slash_Topic_Description', + params: 'Slash_Topic_Params', + permission: 'edit-room', +}); diff --git a/apps/meteor/app/slashcommands-unarchiveroom/server/server.ts b/apps/meteor/app/slashcommands-unarchiveroom/server/server.ts index c89efd2ad8d5..ad3c999f7b38 100644 --- a/apps/meteor/app/slashcommands-unarchiveroom/server/server.ts +++ b/apps/meteor/app/slashcommands-unarchiveroom/server/server.ts @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { IMessage } from '@rocket.chat/core-typings'; import { Rooms, Messages } from '../../models/server'; import { slashCommands } from '../../utils/lib/slashCommand'; @@ -8,7 +9,7 @@ import { api } from '../../../server/sdk/api'; import { roomCoordinator } from '../../../server/lib/rooms/roomCoordinator'; import { RoomMemberActions } from '../../../definition/IRoomTypeConfig'; -function Unarchive(_command: 'unarchive', params: string, item: Record): void | Promise | Function { +function Unarchive(_command: 'unarchive', params: string, item: IMessage): void { let channel = params.trim(); let room; @@ -23,13 +24,14 @@ function Unarchive(_command: 'unarchive', params: string, item: Record= 10) { - previewInfo.items = previewInfo.items.slice(0, 10); - } - - return previewInfo; - } - }, - executePreview: function _executeSlashCommandPreview(command, params, message, preview, triggerId) { - if (slashCommands.commands[command] && typeof slashCommands.commands[command].previewCallback === 'function') { - if (!message || !message.rid) { - throw new Meteor.Error('invalid-command-usage', 'Executing a command requires at least a message with a room id.'); - } - - // { id, type, value } - if (!preview.id || !preview.type || !preview.value) { - throw new Meteor.Error('error-invalid-preview', 'Preview Item must have an id, type, and value.'); - } - - return slashCommands.commands[command].previewCallback(command, params, message, preview, triggerId); - } - }, -}; - -Meteor.methods({ - slashCommand(command) { - if (!Meteor.userId()) { - throw new Meteor.Error('error-invalid-user', 'Invalid user', { - method: 'slashCommand', - }); - } - - if (!command || !command.cmd || !slashCommands.commands[command.cmd]) { - throw new Meteor.Error('error-invalid-command', 'Invalid Command Provided', { - method: 'executeSlashCommandPreview', - }); - } - return slashCommands.run(command.cmd, command.params, command.msg, command.triggerId); - }, -}); diff --git a/apps/meteor/app/utils/lib/slashCommand.ts b/apps/meteor/app/utils/lib/slashCommand.ts new file mode 100644 index 000000000000..ef8175d9c5d0 --- /dev/null +++ b/apps/meteor/app/utils/lib/slashCommand.ts @@ -0,0 +1,140 @@ +import { Meteor } from 'meteor/meteor'; +import type { IMessage } from '@rocket.chat/core-typings'; + +type SlashCommandCallback = (command: T, params: string, message: IMessage, triggerId: string) => void; + +type SlashCommandPreviewItem = { + id: string; + type: 'image' | 'video' | 'audio' | 'text' | 'other'; + value: string; +}; + +type SlashCommandPreviews = { + i18nTitle: string; + items: SlashCommandPreviewItem[]; +}; + +type SlashCommandPreviewer = (command: string, params: string, message: IMessage) => SlashCommandPreviews | undefined; + +type SlashCommandPreviewCallback = ( + command: string, + params: string, + message: IMessage, + preview: SlashCommandPreviewItem, + triggerId: string, +) => void; + +type SlashCommandOptions = { + params?: string; + description?: string; + permission?: string | string[]; + clientOnly?: boolean; +}; + +type SlashCommand = { + command: T; + callback?: SlashCommandCallback; + params: SlashCommandOptions['params']; + description: SlashCommandOptions['description']; + permission: SlashCommandOptions['permission']; + clientOnly?: SlashCommandOptions['clientOnly']; + result?: (err: Meteor.Error, result: never, data: { cmd: T; params: string; msg: IMessage }) => void; + providesPreview: boolean; + previewer?: SlashCommandPreviewer; + previewCallback?: SlashCommandPreviewCallback; +}; + +export const slashCommands = { + commands: {} as Record>, + add( + command: T, + callback?: SlashCommand['callback'], + options: SlashCommandOptions = {}, + result?: SlashCommand['result'], + providesPreview = false, + previewer?: SlashCommand['previewer'], + previewCallback?: SlashCommand['previewCallback'], + ): void { + this.commands[command] = { + command, + callback, + params: options.params, + description: options.description, + permission: options.permission, + clientOnly: options.clientOnly || false, + result, + providesPreview, + previewer, + previewCallback, + } as SlashCommand; + }, + run(command: string, params: string, message: IMessage, triggerId: string): void { + const cmd = this.commands[command]; + if (typeof cmd?.callback !== 'function') { + return; + } + + if (!message || !message.rid) { + throw new Meteor.Error('invalid-command-usage', 'Executing a command requires at least a message with a room id.'); + } + + return cmd.callback(command, params, message, triggerId); + }, + getPreviews(command: string, params: string, message: IMessage): SlashCommandPreviews | undefined { + const cmd = this.commands[command]; + if (typeof cmd?.previewer !== 'function') { + return; + } + + if (!message || !message.rid) { + throw new Meteor.Error('invalid-command-usage', 'Executing a command requires at least a message with a room id.'); + } + + const previewInfo = cmd.previewer(command, params, message); + + if (!previewInfo?.items?.length) { + return; + } + + // A limit of ten results, to save time and bandwidth + if (previewInfo.items.length >= 10) { + previewInfo.items = previewInfo.items.slice(0, 10); + } + + return previewInfo; + }, + executePreview(command: string, params: string, message: IMessage, preview: SlashCommandPreviewItem, triggerId: string): void { + const cmd = this.commands[command]; + if (typeof cmd?.previewCallback !== 'function') { + return; + } + + if (!message || !message.rid) { + throw new Meteor.Error('invalid-command-usage', 'Executing a command requires at least a message with a room id.'); + } + + // { id, type, value } + if (!preview.id || !preview.type || !preview.value) { + throw new Meteor.Error('error-invalid-preview', 'Preview Item must have an id, type, and value.'); + } + + return cmd.previewCallback(command, params, message, preview, triggerId); + }, +}; + +Meteor.methods({ + slashCommand(command) { + if (!Meteor.userId()) { + throw new Meteor.Error('error-invalid-user', 'Invalid user', { + method: 'slashCommand', + }); + } + + if (!command || !command.cmd || !slashCommands.commands[command.cmd]) { + throw new Meteor.Error('error-invalid-command', 'Invalid Command Provided', { + method: 'executeSlashCommandPreview', + }); + } + return slashCommands.run(command.cmd, command.params, command.msg, command.triggerId); + }, +}); diff --git a/apps/meteor/client/startup/slashCommands.ts b/apps/meteor/client/startup/slashCommands.ts index c2ab5fc4d9cd..40c291174568 100644 --- a/apps/meteor/client/startup/slashCommands.ts +++ b/apps/meteor/client/startup/slashCommands.ts @@ -10,7 +10,7 @@ Tracker.autorun(() => { const newUserId = Meteor.userId(); if (oldUserId === null && newUserId) { APIClient.v1.get('commands.list').then((result) => { - result.commands.forEach((command: { command: string }) => { + result.commands.forEach((command: typeof slashCommands.commands[string]) => { slashCommands.commands[command.command] = command; }); }); diff --git a/apps/meteor/server/importPackages.ts b/apps/meteor/server/importPackages.ts index ee0796b90ba2..ab98b032ac0b 100644 --- a/apps/meteor/server/importPackages.ts +++ b/apps/meteor/server/importPackages.ts @@ -65,17 +65,17 @@ import '../app/slashcommands-archiveroom/server'; import '../app/slashcommand-asciiarts/server'; import '../app/slashcommands-bridge/server'; import '../app/slashcommands-create/server'; -import '../app/slashcommands-help'; +import '../app/slashcommands-help/server'; import '../app/slashcommands-hide/server'; import '../app/slashcommands-invite/server'; import '../app/slashcommands-inviteall/server'; import '../app/slashcommands-join/server'; import '../app/slashcommands-kick/server'; -import '../app/slashcommands-leave'; -import '../app/slashcommands-me'; -import '../app/slashcommands-msg'; -import '../app/slashcommands-mute'; -import '../app/slashcommands-status'; +import '../app/slashcommands-leave/server'; +import '../app/slashcommands-me/server'; +import '../app/slashcommands-msg/server'; +import '../app/slashcommands-mute/server'; +import '../app/slashcommands-status/server'; import '../app/slashcommands-topic/server'; import '../app/slashcommands-unarchiveroom/server'; import '../app/smarsh-connector'; From 4986d3919abc961e1d9fc6a52ccfc4cc73b752e8 Mon Sep 17 00:00:00 2001 From: gabriellsh <40830821+gabriellsh@users.noreply.github.com> Date: Mon, 23 May 2022 09:55:09 -0300 Subject: [PATCH 30/50] [FIX] Ordered and unordered list styles, Line breaks. (#25494) * use new list component * Fix Message lists and line breaks * Remove unecessary check from plaintext * skip empty text * remove parser from server * Fix components order * disable playwright * update * Fix parser version and wrong import * Match versions * Move actual `dependencies` from `devDependencies` * revert playwright * revert * Remove a few components * change version to next Co-authored-by: Tasso Evangelista * update fuselage Co-authored-by: Tasso Evangelista --- .../theme/client/imports/general/base_old.css | 2 +- apps/meteor/app/ui/client/views/app/room.html | 2 +- .../Message/MessageBodyRender/OrderedList.tsx | 6 +- .../Message/MessageBodyRender/PlainText.tsx | 6 -- .../MessageBodyRender/UnorderedList.tsx | 4 +- .../Message/MessageBodyRender/index.tsx | 4 + .../components/EncryptedMessageRender.tsx | 32 ------ .../MessageList/components/MessageContent.tsx | 23 ++-- .../components/MessageContentBody.tsx | 28 +++++ .../MessageList/components/MessageRender.tsx | 37 ------- .../components/ThreadMessagePreview.tsx | 4 +- .../components/UrlPreview/PreviewList.tsx | 7 +- .../MessageList/hooks/useParsedMessage.ts | 15 +++ .../client/templates/audit/audit.html | 2 +- apps/meteor/ee/server/services/package.json | 2 +- apps/meteor/package.json | 4 +- packages/core-typings/package.json | 12 ++- packages/rest-typings/package.json | 8 +- yarn.lock | 101 +++++++++++++++--- 19 files changed, 177 insertions(+), 122 deletions(-) delete mode 100644 apps/meteor/client/views/room/MessageList/components/EncryptedMessageRender.tsx create mode 100644 apps/meteor/client/views/room/MessageList/components/MessageContentBody.tsx delete mode 100644 apps/meteor/client/views/room/MessageList/components/MessageRender.tsx create mode 100644 apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.ts diff --git a/apps/meteor/app/theme/client/imports/general/base_old.css b/apps/meteor/app/theme/client/imports/general/base_old.css index fcaa51a66be0..5e198fed7f87 100644 --- a/apps/meteor/app/theme/client/imports/general/base_old.css +++ b/apps/meteor/app/theme/client/imports/general/base_old.css @@ -1661,7 +1661,7 @@ padding-bottom: 24px; } - & ul { + & ul.messages-list { padding: 21px 0 10px; } diff --git a/apps/meteor/app/ui/client/views/app/room.html b/apps/meteor/app/ui/client/views/app/room.html index cfd07e7c846c..ee5c2c3a951d 100644 --- a/apps/meteor/app/ui/client/views/app/room.html +++ b/apps/meteor/app/ui/client/views/app/room.html @@ -77,7 +77,7 @@ {{/with}}
-
    +
      {{#if canPreview}} {{#if hasMore}}
    • diff --git a/apps/meteor/client/components/Message/MessageBodyRender/OrderedList.tsx b/apps/meteor/client/components/Message/MessageBodyRender/OrderedList.tsx index 20c37a1aa66f..742abd1dca9d 100644 --- a/apps/meteor/client/components/Message/MessageBodyRender/OrderedList.tsx +++ b/apps/meteor/client/components/Message/MessageBodyRender/OrderedList.tsx @@ -5,9 +5,9 @@ import Inline from './Inline'; const OrderedList: FC<{ value: ASTOrderedList['value'] }> = ({ value }) => (
        - {value.map((item, index) => ( -
      1. - + {value.map(({ value, number }, index) => ( +
      2. +
      3. ))}
      diff --git a/apps/meteor/client/components/Message/MessageBodyRender/PlainText.tsx b/apps/meteor/client/components/Message/MessageBodyRender/PlainText.tsx index 5b1c3ff7172d..5c0cd2c4011e 100644 --- a/apps/meteor/client/components/Message/MessageBodyRender/PlainText.tsx +++ b/apps/meteor/client/components/Message/MessageBodyRender/PlainText.tsx @@ -12,12 +12,6 @@ const PlainText: FC = ({ value: text }) => { const highlights = useMessageListHighlights(); const katex = useMessageListKatex(); - // TODO ENG DAY: - // Add style for empty paragraphs in fuselage - if (!text.trim()) { - return
      ; - } - if (highlights || katex) { return ; } diff --git a/apps/meteor/client/components/Message/MessageBodyRender/UnorderedList.tsx b/apps/meteor/client/components/Message/MessageBodyRender/UnorderedList.tsx index 137b2bf78768..e2a3076fa057 100644 --- a/apps/meteor/client/components/Message/MessageBodyRender/UnorderedList.tsx +++ b/apps/meteor/client/components/Message/MessageBodyRender/UnorderedList.tsx @@ -5,8 +5,8 @@ import Inline from './Inline'; const UnorderedList: FC<{ value: ASTUnorderedList['value'] }> = ({ value }) => (
        - {value.map((item) => ( -
      • + {value.map((item, index) => ( +
      • ))} diff --git a/apps/meteor/client/components/Message/MessageBodyRender/index.tsx b/apps/meteor/client/components/Message/MessageBodyRender/index.tsx index 07b1785b45d9..96e78d4daf2c 100644 --- a/apps/meteor/client/components/Message/MessageBodyRender/index.tsx +++ b/apps/meteor/client/components/Message/MessageBodyRender/index.tsx @@ -66,6 +66,10 @@ const MessageBodyRender: FC = ({ return ; } + if (block.type === 'LINE_BREAK') { + return
        ; + } + return null; })} diff --git a/apps/meteor/client/views/room/MessageList/components/EncryptedMessageRender.tsx b/apps/meteor/client/views/room/MessageList/components/EncryptedMessageRender.tsx deleted file mode 100644 index ac0812536021..000000000000 --- a/apps/meteor/client/views/room/MessageList/components/EncryptedMessageRender.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { IMessage } from '@rocket.chat/core-typings'; -import { parser } from '@rocket.chat/message-parser'; -import { useTranslation } from '@rocket.chat/ui-contexts'; -import React, { ReactElement, useMemo } from 'react'; - -import MessageBodyRender from '../../../../components/Message/MessageBodyRender'; -import { useMessageActions } from '../../contexts/MessageContext'; - -const EncryptedMessageRender = ({ message }: { message: IMessage }): ReactElement => { - const tokens = useMemo(() => parser(message.msg), [message.msg]); - const t = useTranslation(); - - const { - actions: { openUserCard, openRoom }, - } = useMessageActions(); - - if (message.e2e === 'pending') { - return <>{t('E2E_message_encrypted_placeholder')}; - } - - return ( - - ); -}; - -export default EncryptedMessageRender; diff --git a/apps/meteor/client/views/room/MessageList/components/MessageContent.tsx b/apps/meteor/client/views/room/MessageList/components/MessageContent.tsx index 7b483e540e7f..839ed704150d 100644 --- a/apps/meteor/client/views/room/MessageList/components/MessageContent.tsx +++ b/apps/meteor/client/views/room/MessageList/components/MessageContent.tsx @@ -1,9 +1,10 @@ /* eslint-disable complexity */ import { IMessage, isDiscussionMessage, isThreadMainMessage, ISubscription } from '@rocket.chat/core-typings'; import { MessageBody } from '@rocket.chat/fuselage'; -import { useUserId, TranslationKey } from '@rocket.chat/ui-contexts'; +import { useTranslation, useUserId, TranslationKey } from '@rocket.chat/ui-contexts'; import React, { FC, memo } from 'react'; +import { isE2EEMessage } from '../../../../../lib/isE2EEMessage'; import Attachments from '../../../../components/Message/Attachments'; import MessageActions from '../../../../components/Message/MessageActions'; import BroadcastMetric from '../../../../components/Message/Metrics/Broadcast'; @@ -16,9 +17,9 @@ import MessageLocation from '../../../location/MessageLocation'; import { useMessageActions, useMessageOembedIsEnabled, useMessageRunActionLink } from '../../contexts/MessageContext'; import { useMessageListShowReadReceipt } from '../contexts/MessageListContext'; import { isOwnUserMessage } from '../lib/isOwnUserMessage'; +import MessageContentBody from './MessageContentBody'; import ReactionsList from './MessageReactionsList'; import ReadReceipt from './MessageReadReceipt'; -import MessageRender from './MessageRender'; import PreviewList from './UrlPreview'; const MessageContent: FC<{ message: IMessage; sequential: boolean; subscription?: ISubscription; id: IMessage['_id'] }> = ({ @@ -30,6 +31,8 @@ const MessageContent: FC<{ message: IMessage; sequential: boolean; subscription? actions: { openRoom, openThread, replyBroadcast }, } = useMessageActions(); + const t = useTranslation(); + const runActionLink = useMessageRunActionLink(); const oembedIsEnabled = useMessageOembedIsEnabled(); @@ -40,14 +43,22 @@ const MessageContent: FC<{ message: IMessage; sequential: boolean; subscription? const mineUid = useUserId(); + const isEncryptedMessage = isE2EEMessage(message); + return ( <> - - - + {!message.blocks && ( + + {!isEncryptedMessage && } + {isEncryptedMessage && message.e2e === 'done' && } + {isEncryptedMessage && message.e2e === 'pending' && t('E2E_message_encrypted_placeholder')} + + )} {message.blocks && } {message.attachments && } + {oembedIsEnabled && !!message.urls?.length && } + {message.actionLinks?.length && ( replyBroadcast(message)} mid={message._id} username={user.username} /> )} - {oembedIsEnabled && message.urls && } - {shouldShowReadReceipt && } ); diff --git a/apps/meteor/client/views/room/MessageList/components/MessageContentBody.tsx b/apps/meteor/client/views/room/MessageList/components/MessageContentBody.tsx new file mode 100644 index 000000000000..bace0b3af3e8 --- /dev/null +++ b/apps/meteor/client/views/room/MessageList/components/MessageContentBody.tsx @@ -0,0 +1,28 @@ +/* eslint-disable complexity */ +import { IMessage } from '@rocket.chat/core-typings'; +import React, { FC, memo } from 'react'; + +import MessageBodyRender from '../../../../components/Message/MessageBodyRender'; +import { useMessageActions } from '../../contexts/MessageContext'; +import { useParsedMessage } from '../hooks/useParsedMessage'; + +const MessageContentBody: FC<{ message: IMessage; isThreadPreview?: boolean }> = ({ message, isThreadPreview }) => { + const { + actions: { openRoom, openUserCard }, + } = useMessageActions(); + + const tokens = useParsedMessage(message); + + return ( + + ); +}; + +export default memo(MessageContentBody); diff --git a/apps/meteor/client/views/room/MessageList/components/MessageRender.tsx b/apps/meteor/client/views/room/MessageList/components/MessageRender.tsx deleted file mode 100644 index 4fec23f0a600..000000000000 --- a/apps/meteor/client/views/room/MessageList/components/MessageRender.tsx +++ /dev/null @@ -1,37 +0,0 @@ -/* eslint-disable complexity */ -import { IMessage } from '@rocket.chat/core-typings'; -import React, { FC, memo } from 'react'; - -import { isE2EEMessage } from '../../../../../lib/isE2EEMessage'; -import MessageBodyRender from '../../../../components/Message/MessageBodyRender'; -import { useMessageActions } from '../../contexts/MessageContext'; -import EncryptedMessageRender from './EncryptedMessageRender'; - -const MessageRender: FC<{ message: IMessage; isThreadPreview?: boolean }> = ({ message, isThreadPreview }) => { - const { - actions: { openRoom, openUserCard }, - } = useMessageActions(); - - const isEncryptedMessage = isE2EEMessage(message); - - return ( - <> - {!isEncryptedMessage && !message.blocks && message.md && ( - - )} - - {!isEncryptedMessage && !message.blocks && !message.md && message.msg} - - {isEncryptedMessage && } - - ); -}; - -export default memo(MessageRender); diff --git a/apps/meteor/client/views/room/MessageList/components/ThreadMessagePreview.tsx b/apps/meteor/client/views/room/MessageList/components/ThreadMessagePreview.tsx index 9f08422d02f4..72808129e822 100644 --- a/apps/meteor/client/views/room/MessageList/components/ThreadMessagePreview.tsx +++ b/apps/meteor/client/views/room/MessageList/components/ThreadMessagePreview.tsx @@ -20,7 +20,7 @@ import { useMessageActions } from '../../contexts/MessageContext'; import { useIsSelecting, useToggleSelect, useIsSelectedMessage, useCountSelected } from '../contexts/SelectedMessagesContext'; import { useMessageBody } from '../hooks/useMessageBody'; import { useParentMessage } from '../hooks/useParentMessage'; -import MessageRender from './MessageRender'; +import MessageContentBody from './MessageContentBody'; export const ThreadMessagePreview: FC<{ message: IThreadMessage; sequential: boolean }> = ({ message, sequential, ...props }) => { const { @@ -60,7 +60,7 @@ export const ThreadMessagePreview: FC<{ message: IThreadMessage; sequential: boo - {message.ignored ? t('Message_Ignored') : } + {message.ignored ? t('Message_Ignored') : } diff --git a/apps/meteor/client/views/room/MessageList/components/UrlPreview/PreviewList.tsx b/apps/meteor/client/views/room/MessageList/components/UrlPreview/PreviewList.tsx index af46385aee27..d412957ecdc7 100644 --- a/apps/meteor/client/views/room/MessageList/components/UrlPreview/PreviewList.tsx +++ b/apps/meteor/client/views/room/MessageList/components/UrlPreview/PreviewList.tsx @@ -1,7 +1,7 @@ import { Box } from '@rocket.chat/fuselage'; import React, { ReactElement } from 'react'; -import { useMessageOembedIsEnabled, useMessageOembedMaxWidth } from '../../../contexts/MessageContext'; +import { useMessageOembedMaxWidth } from '../../../contexts/MessageContext'; import OEmbedResolver from './OEmbedResolver'; import UrlPreview from './UrlPreview'; @@ -108,11 +108,10 @@ const isPreviewData = (data: PreviewData | false): data is PreviewData => !!data const isMetaPreview = (_data: PreviewData['data'], type: PreviewTypes): _data is PreviewMetadata => type === 'oembed'; const PreviewList = ({ urls }: PreviewListProps): ReactElement | null => { - const oembedIsEnabled = useMessageOembedIsEnabled(); const oembedWidth = useMessageOembedMaxWidth(); - if (!oembedIsEnabled || !urls) { - return null; + if (!urls) { + throw new Error('urls is undefined - PreviewList'); } const metaAndHeaders = urls.map(processMetaAndHeaders).filter(isPreviewData); diff --git a/apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.ts b/apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.ts new file mode 100644 index 000000000000..2d6fa52ba639 --- /dev/null +++ b/apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.ts @@ -0,0 +1,15 @@ +import { IMessage } from '@rocket.chat/core-typings'; +import { MarkdownAST, parser } from '@rocket.chat/message-parser'; +import { useMemo } from 'react'; + +export function useParsedMessage(message: IMessage): MarkdownAST { + return useMemo(() => { + if (message.md) { + return message.md; + } + if (!message.msg) { + return []; + } + return parser(message.msg); + }, [message]); +} diff --git a/apps/meteor/ee/app/auditing/client/templates/audit/audit.html b/apps/meteor/ee/app/auditing/client/templates/audit/audit.html index 4e147a15858b..24c8d609151b 100644 --- a/apps/meteor/ee/app/auditing/client/templates/audit/audit.html +++ b/apps/meteor/ee/app/auditing/client/templates/audit/audit.html @@ -3,7 +3,7 @@ {{> loading class="loading-animation--primary"}} {{else}} {{#if hasResults}} -
          +
            {{#with messageContext}} {{#each msg in messages}} {{> nrr nrrargs 'message' shouldCollapseReplies=true msg=msg room=room subscription=subscription settings=settings u=u}} diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index c7ae743a6379..88db280dd2b4 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -26,7 +26,7 @@ "@rocket.chat/apps-engine": "^1.31.0", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "~0.31.9", - "@rocket.chat/message-parser": "~0.31.9", + "@rocket.chat/message-parser": "next", "@rocket.chat/rest-typings": "workspace:^", "@rocket.chat/string-helpers": "~0.31.9", "@rocket.chat/ui-kit": "~0.31.9", diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 6a4efbe1b288..8905b83636c0 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -195,7 +195,7 @@ "@rocket.chat/emitter": "~0.31.11", "@rocket.chat/forked-matrix-appservice-bridge": "^4.0.1", "@rocket.chat/forked-matrix-bot-sdk": "^0.6.0-beta.2", - "@rocket.chat/fuselage": "~0.31.11", + "@rocket.chat/fuselage": "0.32.0-dev.40", "@rocket.chat/fuselage-hooks": "~0.31.11", "@rocket.chat/fuselage-polyfills": "~0.31.11", "@rocket.chat/fuselage-tokens": "~0.31.11", @@ -203,7 +203,7 @@ "@rocket.chat/icons": "~0.31.11", "@rocket.chat/logo": "~0.31.11", "@rocket.chat/memo": "~0.31.11", - "@rocket.chat/message-parser": "~0.31.11", + "@rocket.chat/message-parser": "0.31.12-dev.10", "@rocket.chat/mp3-encoder": "^0.24.0", "@rocket.chat/onboarding-ui": "~0.31.11", "@rocket.chat/rest-typings": "workspace:^", diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 839bbad9e6d3..3b88e8877be8 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -3,11 +3,7 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@rocket.chat/apps-engine": "^1.31.0", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/icons": "^0.31.9", - "@rocket.chat/message-parser": "^0.31.6", - "@rocket.chat/ui-kit": "^0.31.6", "@types/mongodb": "^3.6.10", "eslint": "^8.12.0", "prettier": "^2.6.2", @@ -23,5 +19,11 @@ "typings": "./dist/index.d.ts", "files": [ "/dist" - ] + ], + "dependencies": { + "@rocket.chat/apps-engine": "^1.31.0", + "@rocket.chat/icons": "^0.31.9", + "@rocket.chat/message-parser": "next", + "@rocket.chat/ui-kit": "^0.31.6" + } } diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index f45b551a7d2a..97085663bfbe 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -3,11 +3,7 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@rocket.chat/apps-engine": "^1.31.0", - "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/message-parser": "^0.31.6", - "@rocket.chat/ui-kit": "^0.31.6", "@types/jest": "^27.4.1", "@types/mongodb": "^3.6.10", "eslint": "^8.12.0", @@ -27,6 +23,10 @@ "/dist" ], "dependencies": { + "@rocket.chat/apps-engine": "^1.31.0", + "@rocket.chat/core-typings": "workspace:^", + "@rocket.chat/message-parser": "next", + "@rocket.chat/ui-kit": "^0.31.6", "ajv": "^8.11.0" } } diff --git a/yarn.lock b/yarn.lock index ec991b387c9b..9220a4fdeda2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3621,7 +3621,7 @@ __metadata: "@rocket.chat/apps-engine": ^1.31.0 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/icons": ^0.31.9 - "@rocket.chat/message-parser": ^0.31.6 + "@rocket.chat/message-parser": next "@rocket.chat/ui-kit": ^0.31.6 "@types/mongodb": ^3.6.10 eslint: ^8.12.0 @@ -3643,6 +3643,19 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/css-in-js@npm:~0.31.12-dev.15": + version: 0.31.12-dev.15 + resolution: "@rocket.chat/css-in-js@npm:0.31.12-dev.15" + dependencies: + "@emotion/hash": ^0.8.0 + "@rocket.chat/css-supports": ~0.31.12-dev.15 + "@rocket.chat/memo": ~0.31.12-dev.15 + "@rocket.chat/stylis-logical-props-middleware": ~0.31.12-dev.15 + stylis: ~4.0.13 + checksum: c770ac1fa5141501c7719bd42eb656c3e6149963f2214dbf07ba15fb6b58f4521fac8d8de01b1faea854c8b46c54b9f7f8f77a4b165ed7fcdf2bb90cc45d092c + languageName: node + linkType: hard + "@rocket.chat/css-supports@npm:^0.31.11": version: 0.31.11 resolution: "@rocket.chat/css-supports@npm:0.31.11" @@ -3652,6 +3665,15 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/css-supports@npm:~0.31.12-dev.15": + version: 0.31.12-dev.15 + resolution: "@rocket.chat/css-supports@npm:0.31.12-dev.15" + dependencies: + "@rocket.chat/memo": ~0.31.12-dev.15 + checksum: e3a9c01d4a6953992d46c23b87e617ab66ff7eb7d71ef0103a6e3a0af7503bee8d20a1188be0ef6cfb71b65320857229302e5cb00a417762bbe5033b983d43b7 + languageName: node + linkType: hard + "@rocket.chat/ddp-streamer@workspace:ee/apps/ddp-streamer": version: 0.0.0-use.local resolution: "@rocket.chat/ddp-streamer@workspace:ee/apps/ddp-streamer" @@ -3818,6 +3840,13 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/fuselage-tokens@npm:~0.31.12-dev.15": + version: 0.31.12-dev.15 + resolution: "@rocket.chat/fuselage-tokens@npm:0.31.12-dev.15" + checksum: 3d2c8dca1a52da36460606f42a31a3e1c5765acae9e96bf3591dd7972bdf58ac10dda0dd5f37962592c126ab2d1c113485ecaddfc7320d505081d125f067c31b + languageName: node + linkType: hard + "@rocket.chat/fuselage-ui-kit@npm:~0.31.11": version: 0.31.11 resolution: "@rocket.chat/fuselage-ui-kit@npm:0.31.11" @@ -3836,7 +3865,29 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage@npm:^0.31.11, @rocket.chat/fuselage@npm:~0.31.11": +"@rocket.chat/fuselage@npm:0.32.0-dev.40": + version: 0.32.0-dev.40 + resolution: "@rocket.chat/fuselage@npm:0.32.0-dev.40" + dependencies: + "@rocket.chat/css-in-js": ~0.31.12-dev.15 + "@rocket.chat/css-supports": ~0.31.12-dev.15 + "@rocket.chat/fuselage-tokens": ~0.31.12-dev.15 + "@rocket.chat/memo": ~0.31.12-dev.15 + "@rocket.chat/styled": ~0.31.12-dev.15 + invariant: ^2.2.4 + react-keyed-flatten-children: ^1.3.0 + peerDependencies: + "@rocket.chat/fuselage-hooks": "*" + "@rocket.chat/fuselage-polyfills": "*" + "@rocket.chat/icons": "*" + react: ^17.0.2 + react-dom: ^17.0.2 + react-virtuoso: 1.2.4 + checksum: 3bf1406c4353e70dcbb4f5acc5ad5347f6a5cfa18cda83494306ff3f764abb24f574b28262163e9fd32c36a3a71a5297aad02d7d650b58a0d7900a122dba5b76 + languageName: node + linkType: hard + +"@rocket.chat/fuselage@npm:^0.31.11": version: 0.31.11 resolution: "@rocket.chat/fuselage@npm:0.31.11" dependencies: @@ -3974,17 +4025,17 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/message-parser@npm:^0.31.6, @rocket.chat/message-parser@npm:~0.31.9": - version: 0.31.9 - resolution: "@rocket.chat/message-parser@npm:0.31.9" - checksum: 1ffe8f5d2a93d7d532e14e3ab466ecc713e6d6420b48494404e69415147d0e42d55c2bd80f03bbb7bd711c73b7c3aed96c2e11dc89abc383cbd381ef70ece41c +"@rocket.chat/memo@npm:~0.31.12-dev.15": + version: 0.31.12-dev.15 + resolution: "@rocket.chat/memo@npm:0.31.12-dev.15" + checksum: 38b532a89f35c5418d4f2bc0f6c87ee30151711505b5da82e43294eb3780b99740dfc3c2a713a7667956cd8e0313b009c9b370cd60e8d2e9cc8f2d4ea53d2f34 languageName: node linkType: hard -"@rocket.chat/message-parser@npm:~0.31.11": - version: 0.31.11 - resolution: "@rocket.chat/message-parser@npm:0.31.11" - checksum: 551ec5bcc68b125acaea92f22327ec3af11552d2e7dc9f88b9428b8d99cf4c39c9f87e0e4f622493c5086e7b5b418c4a724ade23d6072edd9bed4fdc0c9332e1 +"@rocket.chat/message-parser@npm:0.31.12-dev.10, @rocket.chat/message-parser@npm:next": + version: 0.31.12-dev.10 + resolution: "@rocket.chat/message-parser@npm:0.31.12-dev.10" + checksum: 5d302792ab2988750b3b4c7ce4cf0aa42ec18bded9eb1179ec3ab8d9aa26d0ed0a1817cf2d60990dc61941b0ba39ba53396daa1fc36b1323e43110910ca40a62 languageName: node linkType: hard @@ -4016,7 +4067,7 @@ __metadata: "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/forked-matrix-appservice-bridge": ^4.0.1 "@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.2 - "@rocket.chat/fuselage": ~0.31.11 + "@rocket.chat/fuselage": 0.32.0-dev.40 "@rocket.chat/fuselage-hooks": ~0.31.11 "@rocket.chat/fuselage-polyfills": ~0.31.11 "@rocket.chat/fuselage-tokens": ~0.31.11 @@ -4025,7 +4076,7 @@ __metadata: "@rocket.chat/livechat": "workspace:^" "@rocket.chat/logo": ~0.31.11 "@rocket.chat/memo": ~0.31.11 - "@rocket.chat/message-parser": ~0.31.11 + "@rocket.chat/message-parser": 0.31.12-dev.10 "@rocket.chat/mp3-encoder": ^0.24.0 "@rocket.chat/onboarding-ui": ~0.31.11 "@rocket.chat/rest-typings": "workspace:^" @@ -4322,7 +4373,7 @@ __metadata: "@rocket.chat/apps-engine": ^1.31.0 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/message-parser": ^0.31.6 + "@rocket.chat/message-parser": next "@rocket.chat/ui-kit": ^0.31.6 "@types/jest": ^27.4.1 "@types/mongodb": ^3.6.10 @@ -4375,6 +4426,16 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/styled@npm:~0.31.12-dev.15": + version: 0.31.12-dev.15 + resolution: "@rocket.chat/styled@npm:0.31.12-dev.15" + dependencies: + "@rocket.chat/css-in-js": ~0.31.12-dev.15 + tslib: ^2.3.1 + checksum: 74a9a147bab652ba4ddebad5d89da369d41a2b7305790f5e2e3b771d8199361162ff1ce623eaffab45487e4328fd27c1ffb270e12ad66ff5eb5dda5ddf109a48 + languageName: node + linkType: hard + "@rocket.chat/stylis-logical-props-middleware@npm:^0.31.11": version: 0.31.11 resolution: "@rocket.chat/stylis-logical-props-middleware@npm:0.31.11" @@ -4387,6 +4448,18 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/stylis-logical-props-middleware@npm:~0.31.12-dev.15": + version: 0.31.12-dev.15 + resolution: "@rocket.chat/stylis-logical-props-middleware@npm:0.31.12-dev.15" + dependencies: + "@rocket.chat/css-supports": ~0.31.12-dev.15 + tslib: ^2.3.1 + peerDependencies: + stylis: 4.0.10 + checksum: 5f91ea19904c6fefd352b412681a0c6f68d5824874c300584c64b83cbcc1cc90ed10b0a11d0ad5ccfcf32f7662ff2d1a68c5502277425aa92c271a8faf0d1092 + languageName: node + linkType: hard + "@rocket.chat/ui-contexts@workspace:^, @rocket.chat/ui-contexts@workspace:packages/ui-contexts": version: 0.0.0-use.local resolution: "@rocket.chat/ui-contexts@workspace:packages/ui-contexts" @@ -28995,7 +29068,7 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": ~0.31.9 "@rocket.chat/icons": ^0.31.0 - "@rocket.chat/message-parser": ~0.31.9 + "@rocket.chat/message-parser": next "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": ~0.31.9 "@rocket.chat/ui-kit": ~0.31.9 From f7da2ad2b2869c255dcb7410ecc439348651f473 Mon Sep 17 00:00:00 2001 From: amolghode1981 <86001342+amolghode1981@users.noreply.github.com> Date: Mon, 23 May 2022 18:58:26 +0530 Subject: [PATCH 31/50] [FIX] Fixing Network connectivity issues with SIP client. (#25391) * Clickup Task: https://app.clickup.com/t/245c0d8 Description: The previous PR did not handle the issues completely. This PR is expected to handle 1. Clearing call related UI when the network is disconnected or switched. 2. Do clean connectivity. There were few issues discovered in earlier implementation. e.g endpoint would randomly get disconnected after a while. This was due to the fact that the earlier socket disconnection caused the removal of contact on asterisk. This should be fixed in this PR. 3. This PR contains a lot of logs. This will be removed before the final merge. * Clickup Task: https://app.clickup.com/t/245c0d8 Description: Fixing error. * Clickup Task: https://app.clickup.com/t/245c0d8 Description: Removed log statents. Changed the call disconnection logic. The call now gets disconnected when the network disconnects. Earlier it would get disconnected when the network was restored back. * Clickup Task: https://app.clickup.com/t/245c0d8 Description: Cleaning VoIPUser.ts. * Clickup Task: https://app.clickup.com/t/245c0d8 Description: Handling review comments * Clickup Task: https://app.clickup.com/t/245c0d8 Description: Correctly handling the registration flag when network is restored. * Clickup Task: https://app.clickup.com/t/245c0d8 Description: Fixing review comments. --- .../meteor/app/lib/server/startup/settings.ts | 9 ++ apps/meteor/client/lib/voip/SimpleVoipUser.ts | 2 + apps/meteor/client/lib/voip/VoIPUser.ts | 134 +++++++++++++++--- .../providers/CallProvider/CallProvider.tsx | 55 ++++++- .../CallProvider/hooks/useVoipClient.ts | 14 +- .../rocketchat-i18n/i18n/en.i18n.json | 2 + .../src/voip/VoIPUserConfiguration.ts | 7 +- 7 files changed, 203 insertions(+), 20 deletions(-) diff --git a/apps/meteor/app/lib/server/startup/settings.ts b/apps/meteor/app/lib/server/startup/settings.ts index 8683597ef833..112241a71f69 100644 --- a/apps/meteor/app/lib/server/startup/settings.ts +++ b/apps/meteor/app/lib/server/startup/settings.ts @@ -3242,6 +3242,15 @@ settingsRegistry.addGroup('Call_Center', function () { value: true, }, }); + this.add('VoIP_Enable_Keep_Alive_For_Unstable_Networks', true, { + type: 'boolean', + public: true, + i18nDescription: 'VoIP_Enable_Keep_Alive_For_Unstable_Networks_Description', + enableQuery: { + _id: 'Livechat_enabled', + value: true, + }, + }); }); this.section('Management_Server', function () { diff --git a/apps/meteor/client/lib/voip/SimpleVoipUser.ts b/apps/meteor/client/lib/voip/SimpleVoipUser.ts index 818255b14dab..4e4bc374b2ce 100644 --- a/apps/meteor/client/lib/voip/SimpleVoipUser.ts +++ b/apps/meteor/client/lib/voip/SimpleVoipUser.ts @@ -10,6 +10,7 @@ export class SimpleVoipUser { webSocketPath: string, iceServers: Array, voipRetryCount: number, + enableKeepAliveForUnstableNetworks: boolean, callType?: 'audio' | 'video', mediaStreamRendered?: IMediaStreamRenderer, ): Promise { @@ -21,6 +22,7 @@ export class SimpleVoipUser { enableVideo: callType === 'video', iceServers, connectionRetryCount: voipRetryCount, + enableKeepAliveUsingOptionsForUnstableNetworks: enableKeepAliveForUnstableNetworks, }; return VoIPUser.create(config, mediaStreamRendered); diff --git a/apps/meteor/client/lib/voip/VoIPUser.ts b/apps/meteor/client/lib/voip/VoIPUser.ts index e72293dca16c..e8628b4efbd8 100644 --- a/apps/meteor/client/lib/voip/VoIPUser.ts +++ b/apps/meteor/client/lib/voip/VoIPUser.ts @@ -34,7 +34,7 @@ import { SessionInviteOptions, RequestPendingError, } from 'sip.js'; -import { OutgoingByeRequest, URI } from 'sip.js/lib/core'; +import { OutgoingByeRequest, OutgoingRequestDelegate, URI } from 'sip.js/lib/core'; import { SessionDescriptionHandler, SessionDescriptionHandlerOptions } from 'sip.js/lib/platform/web'; import { toggleMediaStreamTracks } from './Helper'; @@ -83,6 +83,14 @@ export class VoIPUser extends Emitter { private onlineNetworkHandler: () => void; + private optionsKeepaliveInterval = 5; + + private optionsKeepAliveDebounceTimeInSec = 5; + + private optionsKeepAliveDebounceCount = 3; + + private attemptRegistration = false; + constructor(private readonly config: VoIPUserConfiguration, mediaRenderer?: IMediaStreamRenderer) { super(); this.mediaStreamRendered = mediaRenderer; @@ -136,12 +144,16 @@ export class VoIPUser extends Emitter { this.userAgent.transport.isConnected(); this._opInProgress = Operation.OP_CONNECT; try { - this.registerer = new Registerer(this.userAgent); + this.registerer = new Registerer(this.userAgent /* , { expires: 60 }*/); + this.userAgent.transport.onConnect = this.onConnected.bind(this); this.userAgent.transport.onDisconnect = this.onDisconnected.bind(this); window.addEventListener('online', this.onlineNetworkHandler); window.addEventListener('offline', this.offlineNetworkHandler); await this.userAgent.start(); + if (this.config.enableKeepAliveUsingOptionsForUnstableNetworks) { + this.startOptionsPingForUnstableNetworks(); + } } catch (error) { this._connectionState = 'ERROR'; throw error; @@ -156,10 +168,10 @@ export class VoIPUser extends Emitter { /** * Re-registration post network recovery should be attempted * if it was previously registered or incall/onhold - * */ + */ if (this.registerer && this.callState !== 'INITIAL') { - this.attemptRegistrationPostRecovery(); + this.attemptRegistration = true; } } @@ -176,8 +188,9 @@ export class VoIPUser extends Emitter { * In case of remote side disconnection, if config.connectionRetryCount is -1, * attemptReconnection attempts continuously. Else stops after |config.connectionRetryCount| * - * */ - this.attemptReconnection(); + */ + // this.attemptReconnection(); + this.attemptReconnection(0, false); } } @@ -193,7 +206,10 @@ export class VoIPUser extends Emitter { * the code will check if the endpoint was previously registered before the disconnection. * If such is the case, it will first unregister and then reregister. * */ - this.attemptReconnection(1, true); + this.attemptReconnection(); + if (this.registerer && this.callState !== 'INITIAL') { + this.attemptRegistration = true; + } } } @@ -528,11 +544,11 @@ export class VoIPUser extends Emitter { * there is a UA using this socket. This is implemented below */ - sendOptions(): void { + sendOptions(outgoingRequestDelegate?: OutgoingRequestDelegate): void { const uri = new URI('sip', this.config.authUserName, this.config.sipRegistrarHostnameOrIP); const outgoingMessage = this.userAgent?.userAgentCore.makeOutgoingRequestMessage('OPTIONS', uri, uri, uri, {}); if (outgoingMessage) { - this.userAgent?.userAgentCore.request(outgoingMessage); + this.userAgent?.userAgentCore.request(outgoingMessage, outgoingRequestDelegate); } } /** @@ -804,7 +820,8 @@ export class VoIPUser extends Emitter { * In case of computer waking from sleep or asterisk getting restored, connect and disconnect events are generated. * In this case, re-registration should be triggered (by calling) only when onConnected gets called and not otherwise. */ - attemptReconnection(reconnectionAttempt = 0, checkRegistration = false): void { + + async attemptReconnection(reconnectionAttempt = 0, checkRegistration = false): Promise { const reconnectionAttempts = this.connectionRetryCount; this._connectionState = 'SERVER_RECONNECTING'; if (!this.userAgent) { @@ -820,6 +837,7 @@ export class VoIPUser extends Emitter { } const reconnectionDelay = Math.pow(2, reconnectionAttempt % 4); + console.error(`Attempting to reconnect with backoff due to network loss. Backoff time [${reconnectionDelay}]`); setTimeout(() => { if (this.stop) { @@ -832,10 +850,6 @@ export class VoIPUser extends Emitter { ?.reconnect() .then(() => { this._connectionState = 'SERVER_CONNECTED'; - if (!checkRegistration || !this.registerer || this.callState === 'INITIAL') { - return; - } - this.attemptRegistrationPostRecovery(); }) .catch(() => { this.attemptReconnection(++reconnectionAttempt, checkRegistration); @@ -843,7 +857,7 @@ export class VoIPUser extends Emitter { }, reconnectionDelay * 1000); } - async attemptRegistrationPostRecovery(): Promise { + async attemptPostRecoveryRoutine(): Promise { /** * It might happen that the whole network loss can happen * while there is ongoing call. In that case, we want to maintain @@ -851,7 +865,91 @@ export class VoIPUser extends Emitter { * * So after re-registration, it should remain in the same state. * */ + this.sendOptions({ + onAccept: (): void => { + this.attemptPostRecoveryRegistrationRoutine(); + }, + onReject: (error: unknown): void => { + console.error(`[${error}] Failed to do options in attemptPostRecoveryRoutine()`); + }, + }); + } + async sendKeepAliveAndWaitForResponse(withDebounce = false): Promise { + const promise = new Promise((resolve) => { + let keepAliveAccepted = false; + let responseWaitTime = this.optionsKeepaliveInterval / 2; + if (withDebounce) { + responseWaitTime += this.optionsKeepAliveDebounceTimeInSec; + } + + this.sendOptions({ + onAccept: (): void => { + keepAliveAccepted = true; + }, + onReject: (_error: unknown): void => { + console.error('Failed to do options.'); + }, + }); + setTimeout(async () => { + if (!keepAliveAccepted) { + resolve(false); + } else { + if (this.attemptRegistration) { + this.attemptPostRecoveryRoutine(); + this.attemptRegistration = false; + } + resolve(true); + } + }, responseWaitTime * 1000); + }); + return promise; + } + + async startOptionsPingForUnstableNetworks(): Promise { + setTimeout(async () => { + if (!this.userAgent || this.stop) { + return; + } + if (this._connectionState !== 'SERVER_RECONNECTING') { + let keepAliveResponse = await this.sendKeepAliveAndWaitForResponse(); + if (!keepAliveResponse) { + const connectivityArray = []; + for (let i = 0; i < this.optionsKeepAliveDebounceCount; i++) { + connectivityArray.push(this.sendKeepAliveAndWaitForResponse(true)); + } + const values = await Promise.all(connectivityArray); + for (const i in values) { + if (values[i]) { + keepAliveResponse = values[i]; + break; + } + } + if (!keepAliveResponse) { + this.networkEmitter.emit('disconnected'); + } + } + /** + * Either we got connected and managed to send keep-alive + * or while attempting keepAlive with debounce, we got connected at moment, + * |keepAliveResponse| will be turned on. + */ + if (keepAliveResponse) { + this.networkEmitter.emit('connected'); + } + } + this.startOptionsPingForUnstableNetworks(); + }, this.optionsKeepaliveInterval * 1000); + } + + async attemptPostRecoveryRegistrationRoutine(): Promise { + /** + * It might happen that the whole network loss can happen + * while there is ongoing call. In that case, we want to maintain + * the call. + * + * So after re-registration, it should remain in the same state. + * */ const promise = new Promise((_resolve, _reject) => { this.registerer?.unregister({ all: true, @@ -867,7 +965,11 @@ export class VoIPUser extends Emitter { }, }); }); - await promise; + try { + await promise; + } catch (error) { + console.error(`[${error}] While waiting for unregister promise`); + } this.registerer?.register({ requestDelegate: { onReject: (error): void => { diff --git a/apps/meteor/client/providers/CallProvider/CallProvider.tsx b/apps/meteor/client/providers/CallProvider/CallProvider.tsx index 3b9825908bc0..7ea848a6cb90 100644 --- a/apps/meteor/client/providers/CallProvider/CallProvider.tsx +++ b/apps/meteor/client/providers/CallProvider/CallProvider.tsx @@ -1,5 +1,6 @@ import type { IVoipRoom, IUser } from '@rocket.chat/core-typings'; import { ICallerInfo } from '@rocket.chat/core-typings'; +import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; import { useSetModal, useRoute, useUser, useSetting, useEndpoint, useStream } from '@rocket.chat/ui-contexts'; import { Random } from 'meteor/random'; import React, { useMemo, FC, useRef, useCallback, useEffect, useState } from 'react'; @@ -27,12 +28,12 @@ const stopRingback = (): void => { CustomSounds.remove('telephone'); }; +type NetworkState = 'online' | 'offline'; export const CallProvider: FC = ({ children }) => { const voipEnabled = useSetting('VoIP_Enabled'); const subscribeToNotifyUser = useStream('notify-user'); const result = useVoipClient(); - const user = useUser(); const homeRoute = useRoute('home'); @@ -49,6 +50,8 @@ export const CallProvider: FC = ({ children }) => { const [queueAggregator, setQueueAggregator] = useState(); + const [networkStatus, setNetworkStatus] = useState('online'); + useEffect(() => { if (!result?.voipClient) { return; @@ -205,6 +208,56 @@ export const CallProvider: FC = ({ children }) => { remoteAudioMediaRef.current && result.voipClient.switchMediaRenderer({ remoteMediaElement: remoteAudioMediaRef.current }); }, [result.voipClient]); + const onNetworkConnected = useMutableCallback((): void => { + if (!result.voipClient) { + return; + } + if (networkStatus === 'offline') { + setNetworkStatus('online'); + } + }); + + const onNetworkDisconnected = useMutableCallback((): void => { + if (!result.voipClient) { + return; + } + // Transitioning from online -> offline + // If there is ongoing call, terminate it or if we are processing an incoming/outgoing call + // reject it. + if (networkStatus === 'online') { + setNetworkStatus('offline'); + switch (result.voipClient.callerInfo.state) { + case 'IN_CALL': + case 'ON_HOLD': + result.voipClient?.endCall(); + break; + case 'OFFER_RECEIVED': + case 'ANSWER_SENT': + result.voipClient?.rejectCall(); + break; + } + } + }); + + useEffect(() => { + if (!result.voipClient) { + return; + } + result.voipClient.onNetworkEvent('connected', onNetworkConnected); + result.voipClient.onNetworkEvent('disconnected', onNetworkDisconnected); + result.voipClient.onNetworkEvent('connectionerror', onNetworkDisconnected); + result.voipClient.onNetworkEvent('localnetworkonline', onNetworkConnected); + result.voipClient.onNetworkEvent('localnetworkoffline', onNetworkDisconnected); + + return (): void => { + result.voipClient?.offNetworkEvent('connected', onNetworkConnected); + result.voipClient?.offNetworkEvent('disconnected', onNetworkDisconnected); + result.voipClient?.offNetworkEvent('connectionerror', onNetworkDisconnected); + result.voipClient?.offNetworkEvent('localnetworkonline', onNetworkConnected); + result.voipClient?.offNetworkEvent('localnetworkoffline', onNetworkDisconnected); + }; + }, [onNetworkConnected, onNetworkDisconnected, result.voipClient]); + const visitorEndpoint = useEndpoint('POST', 'livechat/visitor'); const voipEndpoint = useEndpoint('GET', 'voip/room'); const voipCloseRoomEndpoint = useEndpoint('POST', 'voip/room.close'); diff --git a/apps/meteor/client/providers/CallProvider/hooks/useVoipClient.ts b/apps/meteor/client/providers/CallProvider/hooks/useVoipClient.ts index 689fb1b0fd0d..bc154ac17cac 100644 --- a/apps/meteor/client/providers/CallProvider/hooks/useVoipClient.ts +++ b/apps/meteor/client/providers/CallProvider/hooks/useVoipClient.ts @@ -21,6 +21,7 @@ const isSignedResponse = (data: any): data is { result: string } => typeof data? export const useVoipClient = (): UseVoipClientResult => { const [voipEnabled, setVoipEnabled] = useSafely(useState(useSetting('VoIP_Enabled'))); const voipRetryCount = useSetting('VoIP_Retry_Count'); + const enableKeepAlive = useSetting('VoIP_Enable_Keep_Alive_For_Unstable_Networks'); const registrationInfo = useEndpoint('GET', 'connector.extension.getRegistrationInfoByUserId'); const membership = useEndpoint('GET', 'voip/queues.getMembershipSubscription'); const user = useUser(); @@ -63,7 +64,16 @@ export const useVoipClient = (): UseVoipClientResult => { (async (): Promise => { try { const subscription = await membership({ extension }); - client = await SimpleVoipUser.create(extension, password, host, websocketPath, iceServers, Number(voipRetryCount), 'video'); + client = await SimpleVoipUser.create( + extension, + password, + host, + websocketPath, + iceServers, + Number(voipRetryCount), + Boolean(enableKeepAlive), + 'video', + ); // Today we are hardcoding workflow mode. // In future, this should be ready from configuration client.setWorkflowMode(WorkflowTypes.CONTACT_CENTER_USER); @@ -83,7 +93,7 @@ export const useVoipClient = (): UseVoipClientResult => { client.clear(); } }; - }, [iceServers, registrationInfo, setResult, membership, voipEnabled, user?._id, user?.extension, voipRetryCount]); + }, [iceServers, registrationInfo, setResult, membership, voipEnabled, user?._id, user?.extension, voipRetryCount, enableKeepAlive]); return result; }; diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json index 2344fa632250..23343234f595 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json @@ -4791,6 +4791,8 @@ "Visitor_page_URL": "Visitor page URL", "Visitor_time_on_site": "Visitor time on site", "Voice_Call": "Voice Call", + "VoIP_Enable_Keep_Alive_For_Unstable_Networks": "Enable Keep-Alive using SIP-OPTIONS for unstable networks", + "VoIP_Enable_Keep_Alive_For_Unstable_Networks_Description": "Enables or Disables Keep-Alive using SIP-OPTIONS based on network quality", "VoIP_Enabled": "VoIP Enabled", "VoIP_Extension": "VoIP Extension", "Voip_Server_Configuration": "Server Configuration", diff --git a/packages/core-typings/src/voip/VoIPUserConfiguration.ts b/packages/core-typings/src/voip/VoIPUserConfiguration.ts index 9ca379b4546d..48f9d55cc6f2 100644 --- a/packages/core-typings/src/voip/VoIPUserConfiguration.ts +++ b/packages/core-typings/src/voip/VoIPUserConfiguration.ts @@ -36,10 +36,15 @@ export interface VoIPUserConfiguration { */ iceServers: Array; /** - * Voip Retru count + * Voip Retry count * @defaultValue undefined */ connectionRetryCount: number; + /** + * Voip Retry count + * @defaultValue undefined + */ + enableKeepAliveUsingOptionsForUnstableNetworks: boolean; } export interface IMediaStreamRenderer { From e0eb54fe3d5d65b3a20ced3c4b9eea5c1e176c54 Mon Sep 17 00:00:00 2001 From: Marcelo Schmidt Date: Mon, 23 May 2022 12:46:31 -0300 Subject: [PATCH 32/50] [NEW] Add option to show mentions badge when show counter is disabled (#25329) Co-authored-by: Guilherme Gazzo --- .../app/models/server/models/Subscriptions.js | 21 +++++++++++++++++++ .../methods/saveNotificationSettings.js | 3 +++ .../RoomList/SideBarItemTemplateWithData.js | 4 +++- .../NotificationPreferences.js | 8 +++++++ .../NotificationPreferences.stories.tsx | 2 ++ .../NotificationPreferencesWithData.js | 2 ++ .../rocketchat-i18n/i18n/en.i18n.json | 6 ++++-- .../server/modules/watchers/publishFields.ts | 1 + packages/core-typings/src/IRoom.ts | 1 + packages/core-typings/src/ISubscription.ts | 1 + 10 files changed, 46 insertions(+), 3 deletions(-) diff --git a/apps/meteor/app/models/server/models/Subscriptions.js b/apps/meteor/app/models/server/models/Subscriptions.js index 5286c2bab955..2f68de208262 100644 --- a/apps/meteor/app/models/server/models/Subscriptions.js +++ b/apps/meteor/app/models/server/models/Subscriptions.js @@ -227,6 +227,27 @@ export class Subscriptions extends Base { return this.update(query, update); } + updateHideMentionStatusById(_id, hideMentionStatus) { + const query = { + _id, + }; + + const update = + hideMentionStatus === true + ? { + $set: { + hideMentionStatus, + }, + } + : { + $unset: { + hideMentionStatus: 1, + }, + }; + + return this.update(query, update); + } + updateMuteGroupMentions(_id, muteGroupMentions) { const query = { _id, diff --git a/apps/meteor/app/push-notifications/server/methods/saveNotificationSettings.js b/apps/meteor/app/push-notifications/server/methods/saveNotificationSettings.js index 13311a498bc6..4d009c2a8db0 100644 --- a/apps/meteor/app/push-notifications/server/methods/saveNotificationSettings.js +++ b/apps/meteor/app/push-notifications/server/methods/saveNotificationSettings.js @@ -63,6 +63,9 @@ Meteor.methods({ hideUnreadStatus: { updateMethod: (subscription, value) => Subscriptions.updateHideUnreadStatusById(subscription._id, value === '1'), }, + hideMentionStatus: { + updateMethod: (subscription, value) => Subscriptions.updateHideMentionStatusById(subscription._id, value === '1'), + }, muteGroupMentions: { updateMethod: (subscription, value) => Subscriptions.updateMuteGroupMentions(subscription._id, value === '1'), }, diff --git a/apps/meteor/client/sidebar/RoomList/SideBarItemTemplateWithData.js b/apps/meteor/client/sidebar/RoomList/SideBarItemTemplateWithData.js index 4cccb6cd177d..2f40b37473c7 100644 --- a/apps/meteor/client/sidebar/RoomList/SideBarItemTemplateWithData.js +++ b/apps/meteor/client/sidebar/RoomList/SideBarItemTemplateWithData.js @@ -43,6 +43,7 @@ function SideBarItemTemplateWithData({ const { lastMessage, hideUnreadStatus, + hideMentionStatus, unread = 0, alert, userMentions, @@ -70,8 +71,9 @@ function SideBarItemTemplateWithData({ const variant = ((userMentions || tunreadUser.length) && 'danger') || (threadUnread && 'primary') || (groupMentions && 'warning') || 'ghost'; const isUnread = unread > 0 || threadUnread; + const showBadge = !hideUnreadStatus || (!hideMentionStatus && userMentions); const badges = - !hideUnreadStatus && isUnread ? ( + showBadge && isUnread ? ( {unread + tunread?.length} diff --git a/apps/meteor/client/views/room/contextualBar/NotificationPreferences/NotificationPreferences.js b/apps/meteor/client/views/room/contextualBar/NotificationPreferences/NotificationPreferences.js index a4dfb0a09481..6b30b8ee0b72 100644 --- a/apps/meteor/client/views/room/contextualBar/NotificationPreferences/NotificationPreferences.js +++ b/apps/meteor/client/views/room/contextualBar/NotificationPreferences/NotificationPreferences.js @@ -43,6 +43,14 @@ const NotificationPreferences = ({ onChange={formHandlers?.handleShowCounter} defaultChecked={formValues?.showCounter} /> + {!formValues?.showCounter && ( + + )} { turnOn: !subscription?.disableNotifications, muteGroupMentions: subscription?.muteGroupMentions, showCounter: !subscription?.hideUnreadStatus, + showMentions: !subscription?.hideMentionStatus, desktopAlert: (subscription?.desktopPrefOrigin === 'subscription' && subscription.desktopNotifications) || 'default', desktopSound: subscription?.audioNotificationValue || 'default', mobileAlert: (subscription?.mobilePrefOrigin === 'subscription' && subscription.mobilePushNotifications) || 'default', @@ -49,6 +50,7 @@ const NotificationPreferencesWithData = ({ rid }) => { notifications.disableNotifications = values.turnOn ? '0' : '1'; notifications.muteGroupMentions = values.muteGroupMentions ? '1' : '0'; notifications.hideUnreadStatus = values.showCounter ? '0' : '1'; + notifications.hideMentionStatus = values.showMentions ? '0' : '1'; notifications.desktopNotifications = values.desktopAlert; notifications.audioNotificationValue = values.desktopSound; notifications.mobilePushNotifications = values.mobileAlert; diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json index 23343234f595..5969ae896b9e 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json @@ -1495,9 +1495,10 @@ "Display_avatars": "Display Avatars", "Display_Avatars_Sidebar": "Display Avatars in Sidebar", "Display_chat_permissions": "Display chat permissions", + "Display_mentions_counter": "Display badge for direct mentions only", "Display_offline_form": "Display Offline Form", "Display_setting_permissions": "Display permissions to change settings", - "Display_unread_counter": "Display number of unread messages", + "Display_unread_counter": "Display room as unread when there are unread messages", "Displays_action_text": "Displays action text", "Do_It_Later": "Do It Later", "Do_not_display_unread_counter": "Do not display any counter of this channel", @@ -4012,8 +4013,9 @@ "Show_agent_info": "Show agent information", "Show_all": "Show All", "Show_Avatars": "Show Avatars", - "Show_counter": "Show counter", + "Show_counter": "Mark as unread", "Show_email_field": "Show email field", + "Show_mentions": "Show badge for mentions", "Show_Message_In_Main_Thread": "Show thread messages in the main thread", "Show_more": "Show more", "Show_name_field": "Show name field", diff --git a/apps/meteor/server/modules/watchers/publishFields.ts b/apps/meteor/server/modules/watchers/publishFields.ts index 4b877955bb62..bede67ffd03f 100644 --- a/apps/meteor/server/modules/watchers/publishFields.ts +++ b/apps/meteor/server/modules/watchers/publishFields.ts @@ -29,6 +29,7 @@ export const subscriptionFields = { autoTranslateLanguage: 1, disableNotifications: 1, hideUnreadStatus: 1, + hideMentionStatus: 1, muteGroupMentions: 1, ignored: 1, E2EKey: 1, diff --git a/packages/core-typings/src/IRoom.ts b/packages/core-typings/src/IRoom.ts index 4765d1b55cf8..83f0c832439d 100644 --- a/packages/core-typings/src/IRoom.ts +++ b/packages/core-typings/src/IRoom.ts @@ -69,6 +69,7 @@ export interface IRoom extends IRocketChatRecord { unread?: number; alert?: boolean; hideUnreadStatus?: boolean; + hideMentionStatus?: boolean; muted?: string[]; unmuted?: string[]; diff --git a/packages/core-typings/src/ISubscription.ts b/packages/core-typings/src/ISubscription.ts index c12afb9aea15..b105402605d9 100644 --- a/packages/core-typings/src/ISubscription.ts +++ b/packages/core-typings/src/ISubscription.ts @@ -21,6 +21,7 @@ export interface ISubscription extends IRocketChatRecord { f?: true; lr: Date; hideUnreadStatus?: true; + hideMentionStatus?: true; teamMain?: boolean; teamId?: string; From 75a49237f3d31eee918fc292f76fed068d927261 Mon Sep 17 00:00:00 2001 From: eduardofcabrera <64327259+eduardofcabrera@users.noreply.github.com> Date: Mon, 23 May 2022 12:50:12 -0300 Subject: [PATCH 33/50] Chore: Convert to typescript some functions from app/lib/server/functions (#24519) Co-authored-by: Pierre Lehnen --- .../app/lib/server/functions/addUserToDefaultChannels.ts | 2 +- apps/meteor/app/lib/server/functions/getStatusText.ts | 4 ++-- apps/meteor/app/lib/server/functions/setRealName.ts | 8 ++++++-- apps/meteor/app/lib/server/functions/setRoomAvatar.ts | 2 +- apps/meteor/app/lib/server/functions/setStatusText.ts | 3 ++- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/apps/meteor/app/lib/server/functions/addUserToDefaultChannels.ts b/apps/meteor/app/lib/server/functions/addUserToDefaultChannels.ts index c7a47067ce62..62906fa893c1 100644 --- a/apps/meteor/app/lib/server/functions/addUserToDefaultChannels.ts +++ b/apps/meteor/app/lib/server/functions/addUserToDefaultChannels.ts @@ -3,7 +3,7 @@ import type { IRoom, IUser } from '@rocket.chat/core-typings'; import { Rooms, Subscriptions, Messages } from '../../../models/server'; import { callbacks } from '../../../../lib/callbacks'; -export const addUserToDefaultChannels = function (user: IUser, silenced: boolean): void { +export const addUserToDefaultChannels = function (user: IUser, silenced?: boolean): void { callbacks.run('beforeJoinDefaultChannels', user); const defaultRooms = Rooms.findByDefaultAndTypes(true, ['c', 'p'], { fields: { usernames: 0 }, diff --git a/apps/meteor/app/lib/server/functions/getStatusText.ts b/apps/meteor/app/lib/server/functions/getStatusText.ts index af154b24d3fe..ad5ffcd84b4f 100644 --- a/apps/meteor/app/lib/server/functions/getStatusText.ts +++ b/apps/meteor/app/lib/server/functions/getStatusText.ts @@ -1,8 +1,8 @@ import { Users } from '../../../models/server'; -export const getStatusText = function (userId: string): unknown { +export const getStatusText = function (userId: string): string | undefined { if (!userId) { - return undefined; + return; } const fields = { diff --git a/apps/meteor/app/lib/server/functions/setRealName.ts b/apps/meteor/app/lib/server/functions/setRealName.ts index 21c1c9b7362e..493b211aab02 100644 --- a/apps/meteor/app/lib/server/functions/setRealName.ts +++ b/apps/meteor/app/lib/server/functions/setRealName.ts @@ -8,15 +8,19 @@ import { hasPermission } from '../../../authorization/server'; import { RateLimiter } from '../lib'; import { api } from '../../../../server/sdk/api'; -export const _setRealName = function (userId: string, name: string, fullUser: IUser): unknown { +export const _setRealName = function (userId: string, name: string, fullUser: IUser): IUser | undefined { name = s.trim(name); if (!userId || (settings.get('Accounts_RequireNameForSignUp') && !name)) { - return false; + return; } const user = fullUser || Users.findOneById(userId); + if (!user) { + return; + } + // User already has desired name, return if (user.name && s.trim(user.name) === name) { return user; diff --git a/apps/meteor/app/lib/server/functions/setRoomAvatar.ts b/apps/meteor/app/lib/server/functions/setRoomAvatar.ts index 2873443e1fd3..1cd2a2442b75 100644 --- a/apps/meteor/app/lib/server/functions/setRoomAvatar.ts +++ b/apps/meteor/app/lib/server/functions/setRoomAvatar.ts @@ -7,7 +7,7 @@ import { Rooms, Messages } from '../../../models/server'; import { Avatars } from '../../../models/server/raw'; import { api } from '../../../../server/sdk/api'; -export const setRoomAvatar = async function (rid: string, dataURI: string, user: IUser): Promise { +export const setRoomAvatar = async function (rid: string, dataURI: string, user: IUser): Promise { const fileStore = FileUpload.getStore('Avatars'); const current = await Avatars.findOneByRoomId(rid); diff --git a/apps/meteor/app/lib/server/functions/setStatusText.ts b/apps/meteor/app/lib/server/functions/setStatusText.ts index ee8e533a81a4..23bda1463602 100644 --- a/apps/meteor/app/lib/server/functions/setStatusText.ts +++ b/apps/meteor/app/lib/server/functions/setStatusText.ts @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import s from 'underscore.string'; +import type { IUser } from '@rocket.chat/core-typings'; import { Users } from '../../../models/server'; import { Users as UsersRaw } from '../../../models/server/raw'; @@ -34,7 +35,7 @@ export const _setStatusTextPromise = async function (userId: string, statusText: return true; }; -export const _setStatusText = function (userId: any, statusText: string): unknown { +export const _setStatusText = function (userId: any, statusText: string): IUser | boolean { statusText = s.trim(statusText); if (statusText.length > 120) { statusText = statusText.substr(0, 120); From b4f22e3da7912ba62683b54e9217f7f1343958cd Mon Sep 17 00:00:00 2001 From: Alan Sikora Date: Mon, 23 May 2022 13:04:43 -0300 Subject: [PATCH 34/50] [NEW] Federation (Alpha Stabilization) (#25457) * adding settings file back * added js-yaml types * [IMPROVE] Stabilization on federated rooms (#25571) * chore: (wip) fixing proxy events handlers * chore: fix lint * fix: remove race condition + remove inline method * improve: general improvements for the mvp Co-authored-by: Marcos Defendi Co-authored-by: Aaron Ogle --- .../meteor/app/federation-v2/server/bridge.ts | 4 + .../IMatrixEventContentAddMemberToRoom.ts | 1 + .../IMatrixEventContentCreateRoom.ts | 1 + .../federation-v2/server/events/createRoom.ts | 195 +++++++++++++++--- .../server/events/roomMembership.ts | 110 +++------- .../server/events/sendMessage.ts | 22 +- .../server/events/setRoomJoinRules.ts | 23 ++- .../server/events/setRoomName.ts | 13 +- .../server/matrix-client/room.ts | 36 +++- .../server/matrix-client/user.ts | 56 ++--- .../app/federation-v2/server/settings.ts | 70 +++++++ .../integrations/server/lib/triggerHandler.js | 2 +- apps/meteor/app/models/server/raw/Rooms.js | 4 + .../rocketchat-i18n/i18n/en.i18n.json | 1 + package.json | 1 + yarn.lock | 8 + 16 files changed, 388 insertions(+), 159 deletions(-) diff --git a/apps/meteor/app/federation-v2/server/bridge.ts b/apps/meteor/app/federation-v2/server/bridge.ts index 289f7e9033d4..895e472de021 100644 --- a/apps/meteor/app/federation-v2/server/bridge.ts +++ b/apps/meteor/app/federation-v2/server/bridge.ts @@ -39,6 +39,10 @@ class Bridge { this.isRunning = false; } + public async getRoomStateByRoomId(userId: string, roomId: string): Promise[]> { + return Array.from(((await this.getInstance().getIntent(userId).roomState(roomId)) as IMatrixEvent[]) || []); + } + public getInstance(): MatrixBridge { return this.bridgeInstance; } diff --git a/apps/meteor/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts b/apps/meteor/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts index 2accfbffbc8b..9282c3778639 100644 --- a/apps/meteor/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts +++ b/apps/meteor/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts @@ -7,4 +7,5 @@ export enum AddMemberToRoomMembership { export interface IMatrixEventContentAddMemberToRoom { displayname: string; membership: AddMemberToRoomMembership; + is_direct?: boolean; } diff --git a/apps/meteor/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts b/apps/meteor/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts index b374135c9309..6180c0356200 100644 --- a/apps/meteor/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts +++ b/apps/meteor/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts @@ -1,4 +1,5 @@ export interface IMatrixEventContentCreateRoom { creator: string; room_version: string; + was_programatically_created?: boolean; } diff --git a/apps/meteor/app/federation-v2/server/events/createRoom.ts b/apps/meteor/app/federation-v2/server/events/createRoom.ts index 746f1f95c999..5cca3032c455 100644 --- a/apps/meteor/app/federation-v2/server/events/createRoom.ts +++ b/apps/meteor/app/federation-v2/server/events/createRoom.ts @@ -1,44 +1,187 @@ +import { IRoom, RoomType } from '@rocket.chat/apps-engine/definition/rooms'; +import { ICreatedRoom } from '@rocket.chat/core-typings'; +import { IUser } from '@rocket.chat/apps-engine/definition/users'; + import { MatrixBridgedRoom, MatrixBridgedUser, Users } from '../../../models/server'; +import { Rooms } from '../../../models/server/raw'; import { createRoom } from '../../../lib/server'; import { IMatrixEvent } from '../definitions/IMatrixEvent'; import { MatrixEventType } from '../definitions/MatrixEventType'; import { checkBridgedRoomExists } from '../methods/checkBridgedRoomExists'; import { matrixClient } from '../matrix-client'; +import { SetRoomJoinRules } from '../definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules'; +import { matrixBridge } from '../bridge'; +import { setRoomJoinRules } from './setRoomJoinRules'; +import { setRoomName } from './setRoomName'; +import { handleRoomMembership } from './roomMembership'; -export const handleCreateRoom = async (event: IMatrixEvent): Promise => { - const { room_id: matrixRoomId, sender } = event; +const removeUselessCharacterFromMatrixRoomId = (matrixRoomId: string): string => { + const prefixedRoomIdOnly = matrixRoomId.split(':')[0]; + const prefix = '!'; - return new Promise((resolve) => { - setTimeout(async () => { - // Check if the room already exists and if so, ignore - const roomExists = await checkBridgedRoomExists(matrixRoomId); + return prefixedRoomIdOnly?.replace(prefix, ''); +}; - if (roomExists) { - return resolve(); - } +const generateRoomNameForLocalServer = (matrixRoomId: string, matrixRoomName?: string): string => { + return matrixRoomName || `Federation-${removeUselessCharacterFromMatrixRoomId(matrixRoomId)}`; +}; + +const createLocalRoomAsync = async (roomType: RoomType, roomName: string, creator: IUser, members: IUser[] = []): Promise => { + return new Promise((resolve) => resolve(createRoom(roomType, roomName, creator.username, members as any[]) as ICreatedRoom)); +}; + +const createBridgedRecordRoom = async (roomId: IRoom['id'], matrixRoomId: string): Promise => + new Promise((resolve) => resolve(MatrixBridgedRoom.insert({ rid: roomId, mri: matrixRoomId }))); + +const createLocalUserIfNecessary = async (matrixUserId: string): Promise => { + const { uid } = await matrixClient.user.createLocal(matrixUserId); - // Find the bridged user id - const bridgedUserId = await MatrixBridgedUser.getId(sender); - let user; + return uid; +}; + +const applyRoomStateIfNecessary = async (matrixRoomId: string, roomState?: IMatrixEvent[]): Promise => { + // TODO: this should be better + /* eslint-disable no-await-in-loop */ + for (const state of roomState || []) { + switch (state.type) { + case 'm.room.create': + continue; + case 'm.room.join_rules': { + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/camelcase + await setRoomJoinRules({ room_id: matrixRoomId, ...state }); - // Create the user if necessary - if (!bridgedUserId) { - const { uid } = await matrixClient.user.createLocal(sender); + break; + } + case 'm.room.name': { + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/camelcase + await setRoomName({ room_id: matrixRoomId, ...state }); + + break; + } + case 'm.room.member': { + // @ts-ignore + if (state.content.membership === 'join') { + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/camelcase,@typescript-eslint/no-use-before-define + await handleRoomMembership({ room_id: matrixRoomId, ...state }); + } - user = Users.findOneById(uid); - } else { - user = await Users.findOneById(bridgedUserId); + break; } + } + } + /* eslint-enable no-await-in-loop */ +}; + +const mapLocalAndExternal = async (roomId: string, matrixRoomId: string): Promise => { + await createBridgedRecordRoom(roomId, matrixRoomId); + await Rooms.setAsBridged(roomId); +}; + +const tryToGetDataFromExternalRoom = async ( + senderMatrixUserId: string, + matrixRoomId: string, + roomState: IMatrixEvent[] = [], +): Promise> => { + const finalRoomState = + roomState && roomState?.length > 0 ? roomState : await matrixBridge.getRoomStateByRoomId(senderMatrixUserId, matrixRoomId); + const externalRoomName = finalRoomState.find((stateEvent: Record) => stateEvent.type === MatrixEventType.SET_ROOM_NAME) + ?.content?.name; + const externalRoomJoinRule = finalRoomState.find( + (stateEvent: Record) => stateEvent.type === MatrixEventType.SET_ROOM_JOIN_RULES, + )?.content?.join_rule; - // Create temp room name - const roomName = `Federation-${matrixRoomId.split(':')[0].replace('!', '')}`; + return { + externalRoomName, + externalRoomJoinRule, + }; +}; + +export const createLocalDirectMessageRoom = async (matrixRoomId: string, creator: IUser, affectedUser: IUser): Promise => { + const { _id: roomId } = await createLocalRoomAsync(RoomType.DIRECT_MESSAGE, generateRoomNameForLocalServer(matrixRoomId), creator, [ + creator, + affectedUser, + ]); + await mapLocalAndExternal(roomId, matrixRoomId); + + return roomId; +}; + +export const getLocalRoomType = (matrixJoinRule = '', matrixRoomIsDirect = false): RoomType => { + const mapping: Record = { + [SetRoomJoinRules.JOIN]: RoomType.CHANNEL, + [SetRoomJoinRules.INVITE]: RoomType.PRIVATE_GROUP, + }; + const roomType = mapping[matrixJoinRule] || RoomType.CHANNEL; + + return roomType === RoomType.PRIVATE_GROUP && matrixRoomIsDirect ? RoomType.DIRECT_MESSAGE : roomType; +}; + +export const createLocalChannelsRoom = async ( + matrixRoomId: string, + senderMatrixUserId: string, + creator: IUser, + roomState?: IMatrixEvent[], +): Promise => { + let roomName = ''; + let joinRule; + + try { + const { externalRoomName, externalRoomJoinRule } = await tryToGetDataFromExternalRoom(senderMatrixUserId, matrixRoomId, roomState); + roomName = externalRoomName; + joinRule = externalRoomJoinRule; + } catch (err) { + // no-op + } + const { rid: roomId } = await createLocalRoomAsync( + getLocalRoomType(joinRule), + generateRoomNameForLocalServer(matrixRoomId, roomName), + creator, + ); + await mapLocalAndExternal(roomId, matrixRoomId); + + return roomId; +}; + +export const processFirstAccessFromExternalServer = async ( + matrixRoomId: string, + senderMatrixUserId: string, + affectedMatrixUserId: string, + senderUser: IUser, + affectedUser: IUser, + isDirect = false, + roomState: IMatrixEvent[], +): Promise => { + let roomId; + if (isDirect) { + roomId = await createLocalDirectMessageRoom(matrixRoomId, senderUser, affectedUser); + } else { + roomId = await createLocalChannelsRoom(matrixRoomId, senderMatrixUserId, senderUser, roomState); + } + + await applyRoomStateIfNecessary(matrixRoomId, roomState); + await matrixBridge.getInstance().getIntent(affectedMatrixUserId).join(matrixRoomId); + + return roomId; +}; + +export const handleCreateRoom = async (event: IMatrixEvent): Promise => { + const { + room_id: matrixRoomId, + sender, + content: { was_programatically_created: wasProgramaticallyCreated = false }, + } = event; - // @ts-ignore TODO: typing of legacy functions - const { rid: roomId } = createRoom('c', roomName, user.username); + // Check if the room already exists and if so, ignore + const roomExists = await checkBridgedRoomExists(matrixRoomId); + if (roomExists || wasProgramaticallyCreated) { + return; + } - MatrixBridgedRoom.insert({ rid: roomId, mri: matrixRoomId }); + const bridgedUserId = await MatrixBridgedUser.getId(sender); + const creator = await Users.findOneById(bridgedUserId || (await createLocalUserIfNecessary(sender))); - resolve(); - }, 500); - }); + await createLocalChannelsRoom(matrixRoomId, sender, creator); }; diff --git a/apps/meteor/app/federation-v2/server/events/roomMembership.ts b/apps/meteor/app/federation-v2/server/events/roomMembership.ts index 66479a4265cd..d51233c1f14e 100644 --- a/apps/meteor/app/federation-v2/server/events/roomMembership.ts +++ b/apps/meteor/app/federation-v2/server/events/roomMembership.ts @@ -1,68 +1,17 @@ -import { MatrixBridgedUser, MatrixBridgedRoom, Users, Rooms } from '../../../models/server'; -import { addUserToRoom, createRoom, removeUserFromRoom } from '../../../lib/server'; +import { IUser } from '@rocket.chat/apps-engine/definition/users'; + +import { MatrixBridgedUser, MatrixBridgedRoom, Users } from '../../../models/server'; +import { addUserToRoom, removeUserFromRoom } from '../../../lib/server'; import { IMatrixEvent } from '../definitions/IMatrixEvent'; import { MatrixEventType } from '../definitions/MatrixEventType'; import { AddMemberToRoomMembership } from '../definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom'; -import { setRoomJoinRules } from './setRoomJoinRules'; -import { setRoomName } from './setRoomName'; -import { addToQueue } from '../queue'; import { matrixClient } from '../matrix-client'; +import { processFirstAccessFromExternalServer } from './createRoom'; -const ensureRoom = async ( - matrixRoomId: string, - roomId: string, - username: string, - roomState?: IMatrixEvent[], -): Promise => { - const room = await Rooms.findOneById(roomId); - // If the room does not exist, create it - if (!room) { - // Create temp room name - const roomName = `Federation-${matrixRoomId.split(':')[0].replace('!', '')}`; - - // @ts-ignore TODO: typing of legacy functions - const { rid: createdRoomId } = createRoom('c', roomName, username); - - roomId = createdRoomId; - - MatrixBridgedRoom.insert({ rid: roomId, mri: matrixRoomId }); - - // TODO: this should be better - /* eslint-disable no-await-in-loop */ - for (const state of roomState || []) { - switch (state.type) { - case 'm.room.create': - continue; - case 'm.room.join_rules': { - // @ts-ignore - // eslint-disable-next-line @typescript-eslint/camelcase - await setRoomJoinRules({ room_id: roomId, ...state }); +const extractServerNameFromMatrixUserId = (matrixRoomId = ''): string => matrixRoomId.split(':')[1]; - break; - } - case 'm.room.name': { - // @ts-ignore - // eslint-disable-next-line @typescript-eslint/camelcase - await setRoomName({ room_id: roomId, ...state }); - - break; - } - case 'm.room.member': { - // @ts-ignore - if (state.content.membership === 'join') { - // @ts-ignore - // eslint-disable-next-line @typescript-eslint/camelcase,@typescript-eslint/no-use-before-define - await handleRoomMembership({ room_id: roomId, ...state }); - } - - break; - } - } - } - /* eslint-enable no-await-in-loop */ - } - - return roomId; +const addUserToRoomAsync = async (roomId: string, affectedUser: IUser, senderUser?: IUser): Promise => { + new Promise((resolve) => resolve(addUserToRoom(roomId, affectedUser as any, senderUser as any))); }; export const handleRoomMembership = async (event: IMatrixEvent): Promise => { @@ -70,15 +19,17 @@ export const handleRoomMembership = async (event: IMatrixEvent[], + ); + } + + if (!roomId) { + return; + } + switch (membership) { case AddMemberToRoomMembership.JOIN: - roomId = await ensureRoom(matrixRoomId, roomId, senderUser.username, roomState); - - addUserToRoom(roomId, affectedUser); + await addUserToRoomAsync(roomId, affectedUser); break; case AddMemberToRoomMembership.INVITE: - // Re-run the state first - if (!roomId) { - for (const state of roomState || []) { - // eslint-disable-next-line @typescript-eslint/camelcase,no-await-in-loop - addToQueue({ ...state, room_id: matrixRoomId }); - } - - addToQueue(event); - - return; - } - - // If the room exists, then just add the user // TODO: this should be a local invite - addUserToRoom(roomId, affectedUser, senderUser); + await addUserToRoomAsync(roomId, affectedUser, senderUser); break; case AddMemberToRoomMembership.LEAVE: - removeUserFromRoom(roomId, affectedUser, { + await removeUserFromRoom(roomId, affectedUser, { byUser: senderUser, }); break; diff --git a/apps/meteor/app/federation-v2/server/events/sendMessage.ts b/apps/meteor/app/federation-v2/server/events/sendMessage.ts index d2d35ac992df..c70577d1e2af 100644 --- a/apps/meteor/app/federation-v2/server/events/sendMessage.ts +++ b/apps/meteor/app/federation-v2/server/events/sendMessage.ts @@ -1,22 +1,28 @@ -// @ts-ignore -import { MatrixBridgedRoom, MatrixBridgedUser, Messages, Users } from '../../../models'; +import { MatrixBridgedRoom, MatrixBridgedUser, Users } from '../../../models/server'; import { IMatrixEvent } from '../definitions/IMatrixEvent'; import { MatrixEventType } from '../definitions/MatrixEventType'; +import { sendMessage } from '../../../lib/server'; +import { Rooms } from '../../../models/server/raw'; + +export const sendMessageAsync = async (user: any, msg: any, room: any): Promise => + new Promise((resolve) => resolve(sendMessage(user, msg, room))); export const handleSendMessage = async (event: IMatrixEvent): Promise => { const { room_id: matrixRoomId, sender } = event; + // Find the bridged room id + const roomId = await MatrixBridgedRoom.getId(matrixRoomId); + if (!roomId) { + return; + } + // Find the bridged user id const userId = await MatrixBridgedUser.getId(sender); // Find the user const user = await Users.findOneById(userId); - // Find the bridged room id - const roomId = await MatrixBridgedRoom.getId(matrixRoomId); + const room = await Rooms.findOneById(roomId); - Messages.createWithTypeRoomIdMessageAndUser('m', roomId, event.content.body, { - _id: user._id, - username: user.username, - }); + await sendMessageAsync(user, { msg: event.content.body }, room); }; diff --git a/apps/meteor/app/federation-v2/server/events/setRoomJoinRules.ts b/apps/meteor/app/federation-v2/server/events/setRoomJoinRules.ts index 534e0b3043e6..e95bf691bf43 100644 --- a/apps/meteor/app/federation-v2/server/events/setRoomJoinRules.ts +++ b/apps/meteor/app/federation-v2/server/events/setRoomJoinRules.ts @@ -1,4 +1,7 @@ -import { MatrixBridgedRoom, Rooms, Subscriptions } from '../../../models/server'; +import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; + +import { Rooms, Subscriptions } from '../../../models/server/raw'; +import { MatrixBridgedRoom } from '../../../models/server'; import { IMatrixEvent } from '../definitions/IMatrixEvent'; import { MatrixEventType } from '../definitions/MatrixEventType'; import { SetRoomJoinRules } from '../definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules'; @@ -11,19 +14,28 @@ export const setRoomJoinRules = async (event: IMatrixEvent => { +const parametersForDirectMessagesIfNecessary = (room: IRoom, invitedUserId: string): Record => { + return room.t === RoomType.DIRECT_MESSAGE + ? { + // eslint-disable-next-line @typescript-eslint/camelcase + is_direct: true, + invite: [invitedUserId], + } + : {}; +}; + +export const create = async (inviterUser: IUser, room: IRoom, invitedUserId: string): Promise => { // Check if this room already exists (created by another method) // and if so, ignore the callback const roomMatrixId = MatrixBridgedRoom.getMatrixId(room._id); @@ -17,30 +29,38 @@ export const create = async (user: IUser, room: IRoom): Promise => { diff --git a/apps/meteor/app/federation-v2/server/settings.ts b/apps/meteor/app/federation-v2/server/settings.ts index 8e14bc68ca76..3be8a336af90 100644 --- a/apps/meteor/app/federation-v2/server/settings.ts +++ b/apps/meteor/app/federation-v2/server/settings.ts @@ -1,5 +1,8 @@ +import yaml from 'js-yaml'; import { SHA256 } from 'meteor/sha'; +import { getRegistrationInfo } from './config'; +import { Settings } from '../../models/server/raw'; import { settings, settingsRegistry } from '../../settings/server'; settingsRegistry.addGroup('Federation', function () { @@ -60,5 +63,72 @@ settingsRegistry.addGroup('Federation', function () { i18nLabel: 'Federation_Matrix_bridge_localpart', i18nDescription: 'Federation_Matrix_bridge_localpart_desc', }); + + this.add('Federation_Matrix_registration_file', '', { + readonly: true, + type: 'code', + i18nLabel: 'Federation_Matrix_registration_file', + i18nDescription: 'Federation_Matrix_registration_file_desc', + }); }); }); + +let registrationFile = {}; + +const updateRegistrationFile = async function (): Promise { + const registrationInfo = getRegistrationInfo(); + + // eslint-disable-next-line @typescript-eslint/camelcase + const { id, hs_token, as_token, sender_localpart } = registrationInfo; + let { url } = registrationInfo; + + if (!url || !url.includes(':')) { + url = `${url}:3300`; + } + + /* eslint-disable @typescript-eslint/camelcase */ + registrationFile = { + id, + hs_token, + as_token, + url, + sender_localpart, + namespaces: { + users: [ + { + exclusive: false, + regex: '.*', + }, + ], + rooms: [ + { + exclusive: false, + regex: '.*', + }, + ], + aliases: [ + { + exclusive: false, + regex: '.*', + }, + ], + }, + }; + /* eslint-enable @typescript-eslint/camelcase */ + + // Update the registration file + await Settings.updateValueById('Federation_Matrix_registration_file', yaml.dump(registrationFile)); +}; + +settings.watchMultiple( + [ + 'Federation_Matrix_id', + 'Federation_Matrix_hs_token', + 'Federation_Matrix_as_token', + 'Federation_Matrix_homeserver_url', + 'Federation_Matrix_homeserver_domain', + 'Federation_Matrix_bridge_url', + 'Federation_Matrix_bridge_localpart', + ], + updateRegistrationFile, +); diff --git a/apps/meteor/app/integrations/server/lib/triggerHandler.js b/apps/meteor/app/integrations/server/lib/triggerHandler.js index 1576734295dd..576c63071413 100644 --- a/apps/meteor/app/integrations/server/lib/triggerHandler.js +++ b/apps/meteor/app/integrations/server/lib/triggerHandler.js @@ -564,7 +564,7 @@ export class RocketChatIntegrationHandler { }); room.usernames - .filter((username) => username !== message.u.username && this.triggers[`@${username}`]) + .filter((username) => username !== message?.u?.username && this.triggers[`@${username}`]) .forEach((username) => { for (const trigger of Object.values(this.triggers[`@${username}`])) { triggersToExecute.add(trigger); diff --git a/apps/meteor/app/models/server/raw/Rooms.js b/apps/meteor/app/models/server/raw/Rooms.js index 1f147c87966f..0d86223b42a8 100644 --- a/apps/meteor/app/models/server/raw/Rooms.js +++ b/apps/meteor/app/models/server/raw/Rooms.js @@ -461,6 +461,10 @@ export class RoomsRaw extends BaseRaw { ]); } + setAsBridged(roomId) { + return this.updateOne({ _id: roomId }, { $set: { bridged: true } }); + } + findByE2E(options) { return this.find( { diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json index 5969ae896b9e..75051448f5d0 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json @@ -1971,6 +1971,7 @@ "Federation_Matrix_homeserver_domain": "Homeserver Domain", "Federation_Matrix_bridge_url": "Bridge URL", "Federation_Matrix_bridge_localpart": "AppService User Localpart", + "Federation_Matrix_registration_file": "Registration File", "Field": "Field", "Field_removed": "Field removed", "Field_required": "Field required", diff --git a/package.json b/package.json index 093056e61171..c11de417cabe 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "storybook": "yarn workspace @rocket.chat/meteor run storybook" }, "devDependencies": { + "@types/js-yaml": "^4.0.5", "husky": "^7.0.4", "turbo": "1.2.5" }, diff --git a/yarn.lock b/yarn.lock index 9220a4fdeda2..b5d7657a7a9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6563,6 +6563,13 @@ __metadata: languageName: node linkType: hard +"@types/js-yaml@npm:^4.0.5": + version: 4.0.5 + resolution: "@types/js-yaml@npm:4.0.5" + checksum: 7dcac8c50fec31643cc9d6444b5503239a861414cdfaa7ae9a38bc22597c4d850c4b8cec3d82d73b3fbca408348ce223b0408d598b32e094470dfffc6d486b4d + languageName: node + linkType: hard + "@types/jsdom-global@npm:^3.0.2": version: 3.0.2 resolution: "@types/jsdom-global@npm:3.0.2" @@ -29055,6 +29062,7 @@ __metadata: version: 0.0.0-use.local resolution: "rocket.chat@workspace:." dependencies: + "@types/js-yaml": ^4.0.5 husky: ^7.0.4 turbo: 1.2.5 languageName: unknown From 763e312b33308a3dd6794983b932daacc7638eef Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Mon, 23 May 2022 13:37:27 -0300 Subject: [PATCH 35/50] Chore: bump fuselage (#25605) --- apps/meteor/package.json | 28 ++--- yarn.lock | 255 ++++++++++++++++++++++----------------- 2 files changed, 155 insertions(+), 128 deletions(-) diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 8905b83636c0..f12ff05fc1e3 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -191,25 +191,25 @@ "@nivo/pie": "0.73.0", "@rocket.chat/apps-engine": "alpha", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/css-in-js": "~0.31.11", - "@rocket.chat/emitter": "~0.31.11", + "@rocket.chat/css-in-js": "~0.31.12", + "@rocket.chat/emitter": "~0.31.12", "@rocket.chat/forked-matrix-appservice-bridge": "^4.0.1", "@rocket.chat/forked-matrix-bot-sdk": "^0.6.0-beta.2", - "@rocket.chat/fuselage": "0.32.0-dev.40", - "@rocket.chat/fuselage-hooks": "~0.31.11", - "@rocket.chat/fuselage-polyfills": "~0.31.11", - "@rocket.chat/fuselage-tokens": "~0.31.11", - "@rocket.chat/fuselage-ui-kit": "~0.31.11", - "@rocket.chat/icons": "~0.31.11", - "@rocket.chat/logo": "~0.31.11", - "@rocket.chat/memo": "~0.31.11", - "@rocket.chat/message-parser": "0.31.12-dev.10", + "@rocket.chat/fuselage": "~0.31.12", + "@rocket.chat/fuselage-hooks": "~0.31.12", + "@rocket.chat/fuselage-polyfills": "~0.31.12", + "@rocket.chat/fuselage-tokens": "~0.31.12", + "@rocket.chat/fuselage-ui-kit": "~0.31.12", + "@rocket.chat/icons": "~0.31.12", + "@rocket.chat/logo": "~0.31.12", + "@rocket.chat/memo": "~0.31.12", + "@rocket.chat/message-parser": "~0.31.12", "@rocket.chat/mp3-encoder": "^0.24.0", - "@rocket.chat/onboarding-ui": "~0.31.11", + "@rocket.chat/onboarding-ui": "~0.31.12", "@rocket.chat/rest-typings": "workspace:^", - "@rocket.chat/string-helpers": "~0.31.11", + "@rocket.chat/string-helpers": "~0.31.12", "@rocket.chat/ui-contexts": "workspace:^", - "@rocket.chat/ui-kit": "~0.31.11", + "@rocket.chat/ui-kit": "~0.31.12", "@slack/client": "^4.12.0", "@types/cookie": "^0.4.1", "@types/lodash": "^4.14.177", diff --git a/yarn.lock b/yarn.lock index b5d7657a7a9d..daf267a8b4ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3630,7 +3630,7 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/css-in-js@npm:^0.31.11, @rocket.chat/css-in-js@npm:~0.31.11": +"@rocket.chat/css-in-js@npm:^0.31.11": version: 0.31.11 resolution: "@rocket.chat/css-in-js@npm:0.31.11" dependencies: @@ -3643,16 +3643,16 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/css-in-js@npm:~0.31.12-dev.15": - version: 0.31.12-dev.15 - resolution: "@rocket.chat/css-in-js@npm:0.31.12-dev.15" +"@rocket.chat/css-in-js@npm:^0.31.12, @rocket.chat/css-in-js@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/css-in-js@npm:0.31.12" dependencies: "@emotion/hash": ^0.8.0 - "@rocket.chat/css-supports": ~0.31.12-dev.15 - "@rocket.chat/memo": ~0.31.12-dev.15 - "@rocket.chat/stylis-logical-props-middleware": ~0.31.12-dev.15 + "@rocket.chat/css-supports": ^0.31.12 + "@rocket.chat/memo": ^0.31.12 + "@rocket.chat/stylis-logical-props-middleware": ^0.31.12 stylis: ~4.0.13 - checksum: c770ac1fa5141501c7719bd42eb656c3e6149963f2214dbf07ba15fb6b58f4521fac8d8de01b1faea854c8b46c54b9f7f8f77a4b165ed7fcdf2bb90cc45d092c + checksum: 42c22c976e8fdabf50d45c39fba357d25cd7b21ed5f3b16b1c75efe70f09ac658b5e47124a862445e21266dab38352d88902e739bdc9f866c3a43fcd498765c7 languageName: node linkType: hard @@ -3665,12 +3665,12 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/css-supports@npm:~0.31.12-dev.15": - version: 0.31.12-dev.15 - resolution: "@rocket.chat/css-supports@npm:0.31.12-dev.15" +"@rocket.chat/css-supports@npm:^0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/css-supports@npm:0.31.12" dependencies: - "@rocket.chat/memo": ~0.31.12-dev.15 - checksum: e3a9c01d4a6953992d46c23b87e617ab66ff7eb7d71ef0103a6e3a0af7503bee8d20a1188be0ef6cfb71b65320857229302e5cb00a417762bbe5033b983d43b7 + "@rocket.chat/memo": ^0.31.12 + checksum: 0f6716b707e6b861589b51e8fdac48fd3fa2512e83e213bbb09379cb93d30f8712cc2e517ba0acf593ec835c2fd57eb54d060030221bb6146fada5b41c228314 languageName: node linkType: hard @@ -3709,13 +3709,20 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/emitter@npm:^0.31.11, @rocket.chat/emitter@npm:~0.31.11, @rocket.chat/emitter@npm:~0.31.9": +"@rocket.chat/emitter@npm:^0.31.11, @rocket.chat/emitter@npm:~0.31.9": version: 0.31.11 resolution: "@rocket.chat/emitter@npm:0.31.11" checksum: 12b008c350c11276a66901efbd2015be1c135e7604f20c261504207f2a5de5b6a83d91a11191cdc896d14f6147711b189f229a82fadceeeed419cfea200550bb languageName: node linkType: hard +"@rocket.chat/emitter@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/emitter@npm:0.31.12" + checksum: d66636ebc05f60526b18056c211793176702e915788254b603bb45ea209f740b5247a2c95f27ccb66963866001bf5dcb4e9b46c2ded450749ca5381c6439833b + languageName: node + linkType: hard + "@rocket.chat/eslint-config@npm:^0.4.0": version: 0.4.0 resolution: "@rocket.chat/eslint-config@npm:0.4.0" @@ -3806,7 +3813,7 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage-hooks@npm:^0.31.11, @rocket.chat/fuselage-hooks@npm:~0.31.11": +"@rocket.chat/fuselage-hooks@npm:^0.31.11": version: 0.31.11 resolution: "@rocket.chat/fuselage-hooks@npm:0.31.11" dependencies: @@ -3819,9 +3826,22 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage-polyfills@npm:~0.31.11": - version: 0.31.11 - resolution: "@rocket.chat/fuselage-polyfills@npm:0.31.11" +"@rocket.chat/fuselage-hooks@npm:^0.31.12, @rocket.chat/fuselage-hooks@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/fuselage-hooks@npm:0.31.12" + dependencies: + "@testing-library/user-event": ^13.5.0 + peerDependencies: + "@rocket.chat/fuselage-tokens": "*" + react: ^17.0.2 + use-subscription: ^1.5.1 + checksum: 4ebb49de7ee49e8f9a76f5b98ad0e11010090f889f965b826207e231502e00e265d8bf15c5c3af193724ce976bd43a9f5a63015a3741cd692c6ed2171db3c491 + languageName: node + linkType: hard + +"@rocket.chat/fuselage-polyfills@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/fuselage-polyfills@npm:0.31.12" dependencies: "@juggle/resize-observer": ^3.3.1 clipboard-polyfill: ^3.0.3 @@ -3829,72 +3849,51 @@ __metadata: focus-visible: ^5.2.0 focus-within-polyfill: ^5.2.1 new-event-polyfill: ^1.0.1 - checksum: 0a7932ce9374576adf2247560c70b2aea3167527f44ec2e3848ba0e8e64512fb4aa9c0a2d693c12621b8664a80dff6e6be5f31086837ab7f7ccec80c5e8974bf - languageName: node - linkType: hard - -"@rocket.chat/fuselage-tokens@npm:^0.31.11, @rocket.chat/fuselage-tokens@npm:~0.31.11": - version: 0.31.11 - resolution: "@rocket.chat/fuselage-tokens@npm:0.31.11" - checksum: 084ae967f460018002bdf6b0a790c03be520ee76eb7df280bd8efa15d53570f9958692d38edf9e3cc8361d196f2aed66b21ab521737b3008fae7b9d267e3eec7 + checksum: 997db51a38a5b65aecc7d59959e4155697e15ac0992b22934b1cb932b6f8a9c1d65770dfd9f01c079c5c87818f51cc37ceaf22dd16b7d37a0b9278ce4daa9aef languageName: node linkType: hard -"@rocket.chat/fuselage-tokens@npm:~0.31.12-dev.15": - version: 0.31.12-dev.15 - resolution: "@rocket.chat/fuselage-tokens@npm:0.31.12-dev.15" - checksum: 3d2c8dca1a52da36460606f42a31a3e1c5765acae9e96bf3591dd7972bdf58ac10dda0dd5f37962592c126ab2d1c113485ecaddfc7320d505081d125f067c31b +"@rocket.chat/fuselage-tokens@npm:^0.31.12, @rocket.chat/fuselage-tokens@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/fuselage-tokens@npm:0.31.12" + checksum: ba2ccb37311ff192290f7a8e49d370aff62b6a8cb8ac2ff425860f9721a1bfe724778468e22364154df2b9c3effaea09e4de8bcd520d28952faf3646fd81cc4a languageName: node linkType: hard -"@rocket.chat/fuselage-ui-kit@npm:~0.31.11": +"@rocket.chat/fuselage-tokens@npm:~0.31.11": version: 0.31.11 - resolution: "@rocket.chat/fuselage-ui-kit@npm:0.31.11" - dependencies: - "@rocket.chat/fuselage": ^0.31.11 - "@rocket.chat/fuselage-hooks": ^0.31.11 - "@rocket.chat/styled": ^0.31.11 - "@rocket.chat/ui-kit": ^0.31.11 - tslib: ^2.3.1 - peerDependencies: - "@rocket.chat/fuselage-polyfills": "*" - "@rocket.chat/icons": "*" - react: ^17.0.2 - react-dom: ^17.0.2 - checksum: 5843857eff90cd58c800b8ed30f29aeb99def5d3b8ad7d6f16eefd1c929eb2fa8e051823d9be74839e0fd6dbdc7a66f4d4c72d12dc5be23d61e386261d85c722 + resolution: "@rocket.chat/fuselage-tokens@npm:0.31.11" + checksum: 084ae967f460018002bdf6b0a790c03be520ee76eb7df280bd8efa15d53570f9958692d38edf9e3cc8361d196f2aed66b21ab521737b3008fae7b9d267e3eec7 languageName: node linkType: hard -"@rocket.chat/fuselage@npm:0.32.0-dev.40": - version: 0.32.0-dev.40 - resolution: "@rocket.chat/fuselage@npm:0.32.0-dev.40" +"@rocket.chat/fuselage-ui-kit@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/fuselage-ui-kit@npm:0.31.12" dependencies: - "@rocket.chat/css-in-js": ~0.31.12-dev.15 - "@rocket.chat/css-supports": ~0.31.12-dev.15 - "@rocket.chat/fuselage-tokens": ~0.31.12-dev.15 - "@rocket.chat/memo": ~0.31.12-dev.15 - "@rocket.chat/styled": ~0.31.12-dev.15 - invariant: ^2.2.4 - react-keyed-flatten-children: ^1.3.0 + "@rocket.chat/fuselage": ^0.31.12 + "@rocket.chat/fuselage-hooks": ^0.31.12 + "@rocket.chat/styled": ^0.31.12 + "@rocket.chat/ui-kit": ^0.31.12 + tslib: ^2.3.1 peerDependencies: - "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/fuselage-polyfills": "*" "@rocket.chat/icons": "*" react: ^17.0.2 react-dom: ^17.0.2 - react-virtuoso: 1.2.4 - checksum: 3bf1406c4353e70dcbb4f5acc5ad5347f6a5cfa18cda83494306ff3f764abb24f574b28262163e9fd32c36a3a71a5297aad02d7d650b58a0d7900a122dba5b76 + checksum: ae14aca1c93cf6aad70c9455ae72db6980b2157f89678ea8412cea953a437e0138f3a086b86812863b77757af4bc4f844e6ab64ff7eab520b33802011cff3863 languageName: node linkType: hard -"@rocket.chat/fuselage@npm:^0.31.11": - version: 0.31.11 - resolution: "@rocket.chat/fuselage@npm:0.31.11" +"@rocket.chat/fuselage@npm:^0.31.12, @rocket.chat/fuselage@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/fuselage@npm:0.31.12" dependencies: - "@rocket.chat/css-in-js": ^0.31.11 - "@rocket.chat/css-supports": ^0.31.11 - "@rocket.chat/fuselage-tokens": ^0.31.11 - "@rocket.chat/memo": ^0.31.11 + "@rocket.chat/css-in-js": ^0.31.12 + "@rocket.chat/css-supports": ^0.31.12 + "@rocket.chat/fuselage-tokens": ^0.31.12 + "@rocket.chat/memo": ^0.31.12 + "@rocket.chat/styled": ^0.31.12 invariant: ^2.2.4 react-keyed-flatten-children: ^1.3.0 peerDependencies: @@ -3904,7 +3903,7 @@ __metadata: react: ^17.0.2 react-dom: ^17.0.2 react-virtuoso: 1.2.4 - checksum: 1c996b3253d33909882182472a74ebd980421d7d4b0aefbb0f307f5e0048f7be6ee37da8818cee8b924a17382cc4d9ac6f50b97aad704390abc219e99bde051f + checksum: 451dadcf2584e9eb1765b2fbbfa825d518a60cde6f185596ede138096c31a40e33b3e1b14ef84f5aaee1f271789eda01c18c9782e74c7d2998114c61e7bf0aac languageName: node linkType: hard @@ -3915,10 +3914,10 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/icons@npm:^0.31.11, @rocket.chat/icons@npm:~0.31.11": - version: 0.31.11 - resolution: "@rocket.chat/icons@npm:0.31.11" - checksum: efb022b0854a4f987c81742988d255ed585903dac0fdaa68695c541917f39d520891355916df44513d97c01e089558fe6463bd81c9d142297e28358ea0e00e90 +"@rocket.chat/icons@npm:^0.31.12, @rocket.chat/icons@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/icons@npm:0.31.12" + checksum: 101f9147f8eca1e83469c9c76ad9665682382507fe52af4bbebf08715e1f4968dcadabfc5e2d715bfdef4b2c38b3562d8495ab49dd38b9c204bee7fec0caf9ca languageName: node linkType: hard @@ -4004,7 +4003,7 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/logo@npm:^0.31.11, @rocket.chat/logo@npm:~0.31.11": +"@rocket.chat/logo@npm:^0.31.11": version: 0.31.11 resolution: "@rocket.chat/logo@npm:0.31.11" dependencies: @@ -4018,27 +4017,48 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/memo@npm:^0.31.11, @rocket.chat/memo@npm:~0.31.11": +"@rocket.chat/logo@npm:^0.31.12, @rocket.chat/logo@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/logo@npm:0.31.12" + dependencies: + "@rocket.chat/fuselage-hooks": ^0.31.12 + "@rocket.chat/styled": ^0.31.12 + tslib: ^2.3.1 + peerDependencies: + react: 17.0.2 + react-dom: 17.0.2 + checksum: d69e82f403606471a64a31825f5ab46f73a09c35121b2f9fc6db47c918dc9959eef8784e7197beca583ef6b56de26f85839e5630488ec22ed1ab91f00bf1a671 + languageName: node + linkType: hard + +"@rocket.chat/memo@npm:^0.31.11": version: 0.31.11 resolution: "@rocket.chat/memo@npm:0.31.11" checksum: b486505242092adfad7bd5aeefe079556ea2f231ffdb5254ad7c2d24235c5881a3b6751985722cd74997c6663b13823f55ca3946eae83bfe990eabac009f8918 languageName: node linkType: hard -"@rocket.chat/memo@npm:~0.31.12-dev.15": - version: 0.31.12-dev.15 - resolution: "@rocket.chat/memo@npm:0.31.12-dev.15" - checksum: 38b532a89f35c5418d4f2bc0f6c87ee30151711505b5da82e43294eb3780b99740dfc3c2a713a7667956cd8e0313b009c9b370cd60e8d2e9cc8f2d4ea53d2f34 +"@rocket.chat/memo@npm:^0.31.12, @rocket.chat/memo@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/memo@npm:0.31.12" + checksum: ad500775c6ab7a77e147a20a5ee478c42403286a2229d04a787341020d37ae0fefec62ae8f027b7f2113b123e7ea743380e30b715de5459f4a67c45983440da5 languageName: node linkType: hard -"@rocket.chat/message-parser@npm:0.31.12-dev.10, @rocket.chat/message-parser@npm:next": +"@rocket.chat/message-parser@npm:next": version: 0.31.12-dev.10 resolution: "@rocket.chat/message-parser@npm:0.31.12-dev.10" checksum: 5d302792ab2988750b3b4c7ce4cf0aa42ec18bded9eb1179ec3ab8d9aa26d0ed0a1817cf2d60990dc61941b0ba39ba53396daa1fc36b1323e43110910ca40a62 languageName: node linkType: hard +"@rocket.chat/message-parser@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/message-parser@npm:0.31.12" + checksum: cd7ba4aca924ea291135d087207212431160ae6a8d265b4551c0295ed0e922930b7623ae027b80bf760982057f521aaf9dee1bd42f37c7ac3141f69c66ad344c + languageName: node + linkType: hard + "@rocket.chat/meteor@workspace:apps/meteor": version: 0.0.0-use.local resolution: "@rocket.chat/meteor@workspace:apps/meteor" @@ -4062,27 +4082,27 @@ __metadata: "@playwright/test": ^1.21.0 "@rocket.chat/apps-engine": alpha "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/css-in-js": ~0.31.11 - "@rocket.chat/emitter": ~0.31.11 + "@rocket.chat/css-in-js": ~0.31.12 + "@rocket.chat/emitter": ~0.31.12 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/forked-matrix-appservice-bridge": ^4.0.1 "@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.2 - "@rocket.chat/fuselage": 0.32.0-dev.40 - "@rocket.chat/fuselage-hooks": ~0.31.11 - "@rocket.chat/fuselage-polyfills": ~0.31.11 - "@rocket.chat/fuselage-tokens": ~0.31.11 - "@rocket.chat/fuselage-ui-kit": ~0.31.11 - "@rocket.chat/icons": ~0.31.11 + "@rocket.chat/fuselage": ~0.31.12 + "@rocket.chat/fuselage-hooks": ~0.31.12 + "@rocket.chat/fuselage-polyfills": ~0.31.12 + "@rocket.chat/fuselage-tokens": ~0.31.12 + "@rocket.chat/fuselage-ui-kit": ~0.31.12 + "@rocket.chat/icons": ~0.31.12 "@rocket.chat/livechat": "workspace:^" - "@rocket.chat/logo": ~0.31.11 - "@rocket.chat/memo": ~0.31.11 - "@rocket.chat/message-parser": 0.31.12-dev.10 + "@rocket.chat/logo": ~0.31.12 + "@rocket.chat/memo": ~0.31.12 + "@rocket.chat/message-parser": ~0.31.12 "@rocket.chat/mp3-encoder": ^0.24.0 - "@rocket.chat/onboarding-ui": ~0.31.11 + "@rocket.chat/onboarding-ui": ~0.31.12 "@rocket.chat/rest-typings": "workspace:^" - "@rocket.chat/string-helpers": ~0.31.11 + "@rocket.chat/string-helpers": ~0.31.12 "@rocket.chat/ui-contexts": "workspace:^" - "@rocket.chat/ui-kit": ~0.31.11 + "@rocket.chat/ui-kit": ~0.31.12 "@settlin/spacebars-loader": ^1.0.9 "@slack/client": ^4.12.0 "@storybook/addon-essentials": ~6.4.19 @@ -4345,15 +4365,15 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/onboarding-ui@npm:~0.31.11": - version: 0.31.11 - resolution: "@rocket.chat/onboarding-ui@npm:0.31.11" +"@rocket.chat/onboarding-ui@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/onboarding-ui@npm:0.31.12" dependencies: - "@rocket.chat/fuselage": ^0.31.11 - "@rocket.chat/fuselage-hooks": ^0.31.11 - "@rocket.chat/icons": ^0.31.11 - "@rocket.chat/logo": ^0.31.11 - "@rocket.chat/styled": ^0.31.11 + "@rocket.chat/fuselage": ^0.31.12 + "@rocket.chat/fuselage-hooks": ^0.31.12 + "@rocket.chat/icons": ^0.31.12 + "@rocket.chat/logo": ^0.31.12 + "@rocket.chat/styled": ^0.31.12 i18next: ~21.6.11 react-hook-form: ~7.27.0 tslib: ~2.3.1 @@ -4362,7 +4382,7 @@ __metadata: react: 17.0.2 react-dom: 17.0.2 react-i18next: ~11.15.4 - checksum: abb6ed1d3bb1dd885f580dd63b728652771bc74746dcfe33dfb2710203ab19c3fde201f63550b28f1c0cf7b60f7874f73b48468d34f8f34bf99d9c06f652f978 + checksum: dc39a01e3dd32e00427b15a2aeae0e3772b6963e3504e1bce971e29170ffccc91483f11ddc6956c6f075418f95715832ef03debdf6cc4d9221548dd6be4f1848 languageName: node linkType: hard @@ -4398,12 +4418,12 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/string-helpers@npm:~0.31.11": - version: 0.31.11 - resolution: "@rocket.chat/string-helpers@npm:0.31.11" +"@rocket.chat/string-helpers@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/string-helpers@npm:0.31.12" dependencies: tslib: ^2.3.1 - checksum: 3b449b651e9386fdbf3aa966c762bb8cf97deb2adea6f65b177d17a6a3b4d25609cd3626f5b4961508b9a9db182371d71bdf585a2cad1749f08f35aacd5fd0ef + checksum: b252ed3ad266ac6542fc4c0f3d57ee3af5cd236f48b4a32eb2980e8257c5723f240b60d185a6844c540777d21be953a6eb9ae5054ad2e24416881bb81ec41db5 languageName: node linkType: hard @@ -4426,13 +4446,13 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/styled@npm:~0.31.12-dev.15": - version: 0.31.12-dev.15 - resolution: "@rocket.chat/styled@npm:0.31.12-dev.15" +"@rocket.chat/styled@npm:^0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/styled@npm:0.31.12" dependencies: - "@rocket.chat/css-in-js": ~0.31.12-dev.15 + "@rocket.chat/css-in-js": ^0.31.12 tslib: ^2.3.1 - checksum: 74a9a147bab652ba4ddebad5d89da369d41a2b7305790f5e2e3b771d8199361162ff1ce623eaffab45487e4328fd27c1ffb270e12ad66ff5eb5dda5ddf109a48 + checksum: 53b65682914872a34a58980a1df0aecea7c5b94e0075ea5a01c2340e6f89d2d0f745a36f301f5ea4a0f36294cbf9461b42a4ee856d2f96a599d04d84d60e5ec5 languageName: node linkType: hard @@ -4448,15 +4468,15 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/stylis-logical-props-middleware@npm:~0.31.12-dev.15": - version: 0.31.12-dev.15 - resolution: "@rocket.chat/stylis-logical-props-middleware@npm:0.31.12-dev.15" +"@rocket.chat/stylis-logical-props-middleware@npm:^0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/stylis-logical-props-middleware@npm:0.31.12" dependencies: - "@rocket.chat/css-supports": ~0.31.12-dev.15 + "@rocket.chat/css-supports": ^0.31.12 tslib: ^2.3.1 peerDependencies: stylis: 4.0.10 - checksum: 5f91ea19904c6fefd352b412681a0c6f68d5824874c300584c64b83cbcc1cc90ed10b0a11d0ad5ccfcf32f7662ff2d1a68c5502277425aa92c271a8faf0d1092 + checksum: 378b8cbfd5e9ebb21f05450afc67e692270b7527895ef70b63c5f72c03aeba7df4fe79d7306f8fa070bf803bc9b09f04424af1a0e67f7c40f3fefc1d5112989c languageName: node linkType: hard @@ -4495,7 +4515,14 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/ui-kit@npm:^0.31.11, @rocket.chat/ui-kit@npm:^0.31.6, @rocket.chat/ui-kit@npm:~0.31.11, @rocket.chat/ui-kit@npm:~0.31.9": +"@rocket.chat/ui-kit@npm:^0.31.12, @rocket.chat/ui-kit@npm:~0.31.12": + version: 0.31.12 + resolution: "@rocket.chat/ui-kit@npm:0.31.12" + checksum: 923a562a42e454d177ecbaaf3c4ca3b341da9d9e1fa573fcd7659d2788ad47f7d094ffe5faca2448c4488685d720859b7b7cff3501fcee2a47d5d7505871c8fa + languageName: node + linkType: hard + +"@rocket.chat/ui-kit@npm:^0.31.6, @rocket.chat/ui-kit@npm:~0.31.9": version: 0.31.11 resolution: "@rocket.chat/ui-kit@npm:0.31.11" checksum: 976ed0a00ec3b886667a1bc59429c9d4867e62cb04c4e762bd41320f602ae35560393b4d36b2460e0ea621f73fb71b4cc869fa17ad4c78da9c862df70b84d0e1 From 529295773a9db3fa72cae6f70a987a3dba0062c8 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Mon, 23 May 2022 14:28:35 -0300 Subject: [PATCH 36/50] Chore: Dependencies upgrade (#25290) --- .vscode/settings.json | 3 +- _templates/package/new/package.json.ejs.t | 2 +- apps/meteor/.meteor/packages | 1 - .../app/slackbridge/server/SlackAdapter.js | 2 +- .../ui/client/views/app/photoswipeContent.ts | 24 +- .../views/room/lib/Toolbox/ToolboxContext.tsx | 1 + apps/meteor/ee/server/services/package.json | 16 +- apps/meteor/package.json | 134 +- .../.npm/package/.gitignore | 1 - .../.npm/package/README | 7 - .../client/index.js | 23 - .../package.js | 12 - .../server/index.js | 46 - .../server/settings.ts | 20 - apps/meteor/server/lib/logger/showBox.ts | 8 +- apps/meteor/server/sdk/types/IMediaService.ts | 2 +- apps/meteor/server/services/image/service.ts | 6 +- apps/meteor/tests/mocks/client/blobUrls.ts | 4 +- packages/core-typings/package.json | 4 +- packages/rest-typings/package.json | 4 +- yarn.lock | 3816 +++++++++-------- 21 files changed, 2192 insertions(+), 1944 deletions(-) delete mode 100644 apps/meteor/packages/rocketchat-google-natural-language/.npm/package/.gitignore delete mode 100644 apps/meteor/packages/rocketchat-google-natural-language/.npm/package/README delete mode 100644 apps/meteor/packages/rocketchat-google-natural-language/client/index.js delete mode 100644 apps/meteor/packages/rocketchat-google-natural-language/package.js delete mode 100644 apps/meteor/packages/rocketchat-google-natural-language/server/index.js delete mode 100644 apps/meteor/packages/rocketchat-google-natural-language/server/settings.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 2778300e470e..3d13987bf7ec 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,5 +9,6 @@ "changeProcessCWD": true } ], - "typescript.tsdk": "./node_modules/typescript/lib" + "typescript.tsdk": "./node_modules/typescript/lib", + "cSpell.words": ["photoswipe"] } diff --git a/_templates/package/new/package.json.ejs.t b/_templates/package/new/package.json.ejs.t index 51f678564c51..827f44a01ad6 100644 --- a/_templates/package/new/package.json.ejs.t +++ b/_templates/package/new/package.json.ejs.t @@ -11,7 +11,7 @@ to: packages/<%= name %>/package.json "eslint": "^8.12.0", "jest": "^27.5.1", "ts-jest": "^27.1.4", - "typescript": "~4.3.5" + "typescript": "~4.3.4" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/apps/meteor/.meteor/packages b/apps/meteor/.meteor/packages index a19b1d6cfec3..daa663bcce20 100644 --- a/apps/meteor/.meteor/packages +++ b/apps/meteor/.meteor/packages @@ -38,7 +38,6 @@ spacebars standard-minifier-js@2.8.0 tracker@1.2.0 -#rocketchat:google-natural-language rocketchat:livechat rocketchat:streamer rocketchat:version diff --git a/apps/meteor/app/slackbridge/server/SlackAdapter.js b/apps/meteor/app/slackbridge/server/SlackAdapter.js index d17d5b64cbed..4e597f43f1ef 100644 --- a/apps/meteor/app/slackbridge/server/SlackAdapter.js +++ b/apps/meteor/app/slackbridge/server/SlackAdapter.js @@ -2,7 +2,7 @@ import url from 'url'; import http from 'http'; import https from 'https'; -import { RTMClient } from '@slack/client'; +import { RTMClient } from '@slack/rtm-api'; import { Meteor } from 'meteor/meteor'; import { slackLogger } from './logger'; diff --git a/apps/meteor/app/ui/client/views/app/photoswipeContent.ts b/apps/meteor/app/ui/client/views/app/photoswipeContent.ts index 16359e2b2f82..bc2af32b53dc 100644 --- a/apps/meteor/app/ui/client/views/app/photoswipeContent.ts +++ b/apps/meteor/app/ui/client/views/app/photoswipeContent.ts @@ -3,7 +3,7 @@ import { Blaze } from 'meteor/blaze'; import { Template } from 'meteor/templating'; import { escapeHTML } from '@rocket.chat/string-helpers'; import type PhotoSwipe from 'photoswipe'; -import type PhotoSwipeUiDefault from 'photoswipe/dist/photoswipe-ui-default'; +import PhotoSwipeUIDefault from 'photoswipe/dist/photoswipe-ui-default'; const parseLength = (x: unknown): number | undefined => { const length = typeof x === 'string' ? parseInt(x, 10) : undefined; @@ -25,7 +25,7 @@ const getImageSize = (src: string): Promise<[w: number, h: number]> => img.src = src; }); -type Slide = PhotoSwipeUiDefault.Item & { description?: string }; +type Slide = PhotoSwipe.Item & { description?: string; title?: string }; const fromElementToSlide = async (element: Element): Promise => { if (!(element instanceof HTMLElement)) { @@ -70,15 +70,11 @@ const fromElementToSlide = async (element: Element): Promise => { return null; }; -let currentGallery: PhotoSwipe | null = null; +let currentGallery: PhotoSwipe | null = null; -const initGallery = async (items: Slide[], options: PhotoSwipeUiDefault.Options): Promise => { - const [ - { default: PhotoSwipe }, - { default: PhotoSwipeUiDefault }, // eslint-disable-line @typescript-eslint/camelcase - ] = await Promise.all([ +const initGallery = async (items: Slide[], options: PhotoSwipe.Options): Promise => { + const [{ default: PhotoSwipe }] = await Promise.all([ import('photoswipe'), - import('photoswipe/dist/photoswipe-ui-default'), // @ts-ignore import('photoswipe/dist/photoswipe.css'), // @ts-ignore @@ -94,7 +90,7 @@ const initGallery = async (items: Slide[], options: PhotoSwipeUiDefault.Options) throw new Error('Photoswipe container element not found'); } - currentGallery = new PhotoSwipe(container, PhotoSwipeUiDefault, items, options); + currentGallery = new PhotoSwipe(container, PhotoSwipeUIDefault, items, options); currentGallery.listen('destroy', () => { currentGallery = null; @@ -104,13 +100,11 @@ const initGallery = async (items: Slide[], options: PhotoSwipeUiDefault.Options) } }; -const defaultGalleryOptions: PhotoSwipeUiDefault.Options = { +const defaultGalleryOptions = { bgOpacity: 0.7, - showHideOpacity: true, - counterEl: false, - shareEl: false, - clickToCloseNonZoomable: false, index: 0, + wheelToZoom: true, + padding: { top: 20, bottom: 40, left: 100, right: 100 }, addCaptionHTMLFn(item: Slide, captionEl: HTMLElement): boolean { captionEl.children[0].innerHTML = ` ${escapeHTML(item.title ?? '')}
            diff --git a/apps/meteor/client/views/room/lib/Toolbox/ToolboxContext.tsx b/apps/meteor/client/views/room/lib/Toolbox/ToolboxContext.tsx index 3b8105d7a31e..acb851c4fc27 100644 --- a/apps/meteor/client/views/room/lib/Toolbox/ToolboxContext.tsx +++ b/apps/meteor/client/views/room/lib/Toolbox/ToolboxContext.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react/no-multi-comp */ import { IRoom } from '@rocket.chat/core-typings'; import { EventHandlerOf } from '@rocket.chat/emitter'; import { createContext, useContext } from 'react'; diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 88db280dd2b4..f04e17ba5f6a 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -30,10 +30,10 @@ "@rocket.chat/rest-typings": "workspace:^", "@rocket.chat/string-helpers": "~0.31.9", "@rocket.chat/ui-kit": "~0.31.9", - "ajv": "^8.7.1", + "ajv": "^8.11.0", "bcrypt": "^5.0.1", "body-parser": "^1.20.0", - "colorette": "^1.4.0", + "colorette": "^2.0.16", "cookie": "^0.5.0", "cookie-parser": "^1.4.6", "ejson": "^2.2.2", @@ -44,29 +44,29 @@ "mem": "^8.1.1", "moleculer": "^0.14.20", "mongodb": "^3.6.10", - "nats": "^2.4.0", + "nats": "^2.6.1", "pino": "^7.10.0", "sodium-native": "^3.3.0", "sodium-plus": "^0.9.0", "underscore.string": "^3.3.6", - "uuid": "^7.0.3", + "uuid": "^8.3.2", "ws": "^8.5.0" }, "devDependencies": { "@rocket.chat/icons": "^0.31.0", "@types/agenda": "^2.0.9", - "@types/cookie": "^0.4.1", + "@types/cookie": "^0.5.1", "@types/cookie-parser": "^1.4.2", - "@types/ejson": "^2.1.3", + "@types/ejson": "^2.2.0", "@types/express": "^4.17.13", "@types/fibers": "^3.1.1", "@types/mongodb": "^3.6.20", - "@types/node": "^14.18.12", + "@types/node": "^14.18.15", "@types/ws": "^8.5.3", "pino-pretty": "^7.6.1", "pm2": "^5.2.0", "ts-node": "^10.7.0", - "typescript": "~4.3.5" + "typescript": "~4.3.4" }, "volta": { "extends": "../../package.json" diff --git a/apps/meteor/package.json b/apps/meteor/package.json index f12ff05fc1e3..85b533e7895f 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -64,24 +64,24 @@ "email": "support@rocket.chat" }, "devDependencies": { - "@babel/core": "^7.14.6", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/preset-env": "^7.14.7", - "@babel/preset-react": "^7.14.5", - "@babel/register": "^7.14.5", + "@babel/core": "^7.17.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/preset-env": "^7.16.11", + "@babel/preset-react": "^7.16.7", + "@babel/register": "^7.17.7", "@faker-js/faker": "^6.3.1", - "@playwright/test": "^1.21.0", + "@playwright/test": "^1.21.1", "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/livechat": "workspace:^", "@settlin/spacebars-loader": "^1.0.9", - "@storybook/addon-essentials": "~6.4.19", - "@storybook/addon-interactions": "~6.4.19", + "@storybook/addon-essentials": "~6.4.22", + "@storybook/addon-interactions": "~6.4.22", "@storybook/addon-postcss": "^2.0.0", - "@storybook/addons": "~6.4.19", - "@storybook/react": "~6.4.19", - "@storybook/testing-library": "0.0.9", - "@testing-library/react": "~12.1.4", + "@storybook/addons": "~6.4.22", + "@storybook/react": "~6.4.22", + "@storybook/testing-library": "0.0.11", + "@testing-library/react": "~12.1.5", "@testing-library/user-event": "^13.5.0", "@types/adm-zip": "^0.4.34", "@types/agenda": "^2.0.9", @@ -90,12 +90,12 @@ "@types/body-parser": "^1.19.0", "@types/chai": "^4.2.22", "@types/chai-datetime": "0.0.37", - "@types/chai-dom": "0.0.11", + "@types/chai-dom": "0.0.12", "@types/chai-spies": "^1.0.3", "@types/clipboard": "^2.0.7", "@types/cookie-parser": "^1.4.2", "@types/dompurify": "^2.2.2", - "@types/ejson": "^2.1.3", + "@types/ejson": "^2.2.0", "@types/express": "^4.17.12", "@types/fibers": "^3.1.1", "@types/google-libphonenumber": "^7.4.21", @@ -108,13 +108,13 @@ "@types/lodash.get": "^4.4.6", "@types/mailparser": "^3.4.0", "@types/marked": "^1.2.2", - "@types/meteor": "1.4.81", - "@types/mkdirp": "^1.0.1", + "@types/meteor": "2.0.4", + "@types/mkdirp": "^1.0.2", "@types/mocha": "^8.2.3", "@types/mock-require": "^2.0.1", "@types/moment-timezone": "^0.5.30", "@types/mongodb": "^3.6.10", - "@types/node": "^14.18.12", + "@types/node": "^14.18.15", "@types/node-rsa": "^1.1.1", "@types/nodemailer": "^6.4.4", "@types/parseurl": "^1.3.1", @@ -123,22 +123,22 @@ "@types/react": "~17.0.42", "@types/react-dom": "~17.0.14", "@types/rewire": "^2.5.28", - "@types/semver": "^7.3.6", - "@types/sharp": "^0.29.4", + "@types/semver": "^7.3.9", + "@types/sharp": "^0.30.2", "@types/string-strip-html": "^5.0.0", "@types/supertest": "^2.0.11", "@types/toastr": "^2.1.39", "@types/ua-parser-js": "^0.7.36", "@types/underscore.string": "0.0.38", "@types/use-subscription": "^1.0.0", - "@types/uuid": "^8.3.1", + "@types/uuid": "^8.3.4", "@types/xml-crypto": "^1.4.1", "@types/xmldom": "^0.1.30", "@typescript-eslint/eslint-plugin": "^2.34.0", "@typescript-eslint/parser": "^3.0.0", - "autoprefixer": "^9", + "autoprefixer": "^9.8.8", "babel-eslint": "^10.1.0", - "babel-loader": "^8.2.2", + "babel-loader": "^8.2.5", "babel-plugin-array-includes": "^2.0.3", "chai": "^4.3.6", "chai-datetime": "^1.8.0", @@ -148,42 +148,41 @@ "cypress": "^7.7.0", "emojione-assets": "^4.5.0", "eslint": "^6.8.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-import": "^2.24.2", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", "eslint-plugin-prettier": "^3.4.1", - "eslint-plugin-react": "^7.24.0", - "eslint-plugin-react-hooks": "^4.2.0", - "eslint-plugin-testing-library": "^5.0.0", + "eslint-plugin-react": "^7.29.4", + "eslint-plugin-react-hooks": "^4.4.0", + "eslint-plugin-testing-library": "^5.3.1", "fast-glob": "^3.2.11", - "i18next": "^20.3.2", + "i18next": "^20.6.1", "jsdom-global": "^3.0.2", - "mocha": "^9.1.3", + "mocha": "^9.2.2", "mock-require": "^3.0.3", "outdent": "~0.8.0", "pino-pretty": "^7.6.1", "postcss": "~8.4.12", "postcss-custom-properties": "^11.0.0", "postcss-easy-import": "^3.0.0", - "postcss-load-config": "^3.1.0", + "postcss-load-config": "^3.1.4", "postcss-media-minmax": "^5.0.0", "postcss-nested": "^5.0.6", "postcss-url": "^10.1.3", "prettier": "2.6.2", - "rewire": "^5.0.0", - "source-map": "^0.5.7", + "rewire": "^6.0.0", + "source-map": "^0.7.3", "stylelint": "^13.13.1", "stylelint-order": "^4.1.0", - "supertest": "^6.1.6", + "supertest": "^6.2.2", "template-file": "^6.0.1", - "ts-node": "^10.0.0", + "ts-node": "^10.7.0", "typescript": "~4.3.4", - "webpack": "^4.44.1" + "webpack": "^4.46.0" }, "dependencies": { - "@babel/runtime": "^7.15.4", - "@bugsnag/js": "^7.11.0", - "@google-cloud/language": "^3.8.0", - "@google-cloud/storage": "^2.5.0", + "@babel/runtime": "^7.17.9", + "@bugsnag/js": "^7.16.2", + "@google-cloud/storage": "^5.19.3", "@nivo/bar": "0.73.1", "@nivo/core": "0.73.0", "@nivo/heatmap": "0.73.0", @@ -211,20 +210,21 @@ "@rocket.chat/ui-contexts": "workspace:^", "@rocket.chat/ui-kit": "~0.31.12", "@slack/client": "^4.12.0", - "@types/cookie": "^0.4.1", - "@types/lodash": "^4.14.177", + "@slack/rtm-api": "^6.0.0", + "@types/cookie": "^0.5.1", + "@types/lodash": "^4.14.182", "@types/lodash.debounce": "^4.0.6", "@types/proxy-from-env": "^1.0.1", "@types/speakeasy": "^2.0.7", "adm-zip": "0.5.9", "agenda": "https://github.com/RocketChat/agenda#c2cfcc532b8409561104dca980e6adbbcbdf5442", - "ajv": "^8.7.1", + "ajv": "^8.11.0", "apn": "2.2.0", "archiver": "^3.1.1", "asterisk-manager": "^0.2.0", "atlassian-crowd-patched": "^0.5.1", - "autolinker": "^3.14.3", - "aws-sdk": "^2.1119.0", + "autolinker": "^3.15.0", + "aws-sdk": "^2.1121.0", "bad-words": "^3.0.4", "bcrypt": "^5.0.1", "blockstack": "19.3.0", @@ -234,16 +234,16 @@ "bytebuffer": "5.0.1", "cas": "https://github.com/kcbanner/node-cas/tarball/fcd27dad333223b3b75a048bce27973fb3ca0f62", "change-case": "^4.1.2", - "chart.js": "^2.9.4", + "chart.js": "^3.7.1", "clipboard": "^2.0.10", "codemirror": "^5.65.3", - "colorette": "^1.4.0", + "colorette": "^2.0.16", "connect": "^3.7.0", - "cookie": "^0.4.2", + "cookie": "^0.5.0", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "css-vars-ponyfill": "^2.4.7", - "csv-parse": "^4.16.3", + "csv-parse": "^5.0.4", "cypress-real-events": "^1.7.0", "cypress-wait-until": "^1.7.2", "date-fns": "^2.28.0", @@ -259,7 +259,7 @@ "fastq": "^1.13.0", "fflate": "^0.7.3", "fibers": "^5.0.1", - "file-type": "^10.11.0", + "file-type": "^16.5.3", "filenamify": "^4.3.0", "filesize": "^3.6.1", "google-libphonenumber": "^3.2.27", @@ -278,7 +278,7 @@ "jquery": "^3.6.0", "jschardet": "^3.0.0", "jsdom": "^16.7.0", - "jsrsasign": "^10.5.18", + "jsrsasign": "^10.5.19", "juice": "^8.0.0", "katex": "^0.11.1", "ldap-escape": "^2.0.6", @@ -293,29 +293,29 @@ "mailparser": "^3.4.0", "marked": "^0.7.0", "mem": "^8.1.1", - "meteor-node-stubs": "^1.1.0", - "mime-db": "^1.48.0", - "mime-type": "^3.1.0", - "mkdirp": "^0.5.6", + "meteor-node-stubs": "^1.2.1", + "mime-db": "^1.52.0", + "mime-type": "^4.0.0", + "mkdirp": "^1.0.4", "moleculer": "^0.14.20", "moment": "^2.29.1", "moment-timezone": "^0.5.34", "mongodb": "^3.6.10", "mongodb-memory-server": "^7.6.3", - "nats": "^2.4.0", + "nats": "^2.6.1", "node-dogstatsd": "^0.0.7", - "node-gcm": "1.0.0", + "node-gcm": "1.0.5", "node-rsa": "^1.1.1", "nodemailer": "^6.7.3", "object-path": "^0.11.8", "path": "^0.12.7", "path-to-regexp": "^6.2.0", - "pdfjs-dist": "^2.8.335", + "pdfjs-dist": "^2.13.216", "photoswipe": "^4.1.3", "pino": "^7.10.0", "poplib": "^0.1.7", "postis": "^2.2.0", - "prom-client": "^12.0.0", + "prom-client": "^14.0.1", "prometheus-gc-stats": "^0.6.3", "proxy-from-env": "^1.1.0", "psl": "^1.8.0", @@ -328,9 +328,9 @@ "react-keyed-flatten-children": "^1.3.0", "react-query": "^3.38.0", "react-virtuoso": "^1.11.1", - "redis": "^2.8.0", - "semver": "^5.7.1", - "sharp": "^0.29.3", + "redis": "^4.0.6", + "semver": "^7.3.7", + "sharp": "^0.30.4", "sip.js": "^0.20.0", "sodium-native": "^3.3.0", "sodium-plus": "^0.9.0", @@ -340,19 +340,19 @@ "tar-stream": "^1.6.2", "tinykeys": "^1.4.0", "toastr": "^2.1.4", - "turndown": "^5.0.3", + "turndown": "^7.1.1", "twilio": "^3.76.1", "twit": "^2.2.11", "ua-parser-js": "^1.0.2", - "underscore": "^1.13.2", + "underscore": "^1.13.3", "underscore.string": "^3.3.6", "universal-perf-hooks": "^1.0.1", "url-polyfill": "^1.1.12", "use-subscription": "~1.6.0", - "uuid": "^3.4.0", - "webdav": "^2.10.2", + "uuid": "^8.3.2", + "webdav": "^4.9.0", "xml-crypto": "^2.1.3", - "xml-encryption": "0.11.2", + "xml-encryption": "2.0.0", "xml2js": "0.4.23", "xmldom": "^0.6.0", "yaqrcode": "^0.2.1" diff --git a/apps/meteor/packages/rocketchat-google-natural-language/.npm/package/.gitignore b/apps/meteor/packages/rocketchat-google-natural-language/.npm/package/.gitignore deleted file mode 100644 index 3c3629e647f5..000000000000 --- a/apps/meteor/packages/rocketchat-google-natural-language/.npm/package/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/apps/meteor/packages/rocketchat-google-natural-language/.npm/package/README b/apps/meteor/packages/rocketchat-google-natural-language/.npm/package/README deleted file mode 100644 index 3d492553a438..000000000000 --- a/apps/meteor/packages/rocketchat-google-natural-language/.npm/package/README +++ /dev/null @@ -1,7 +0,0 @@ -This directory and the files immediately inside it are automatically generated -when you change this package's NPM dependencies. Commit the files in this -directory (npm-shrinkwrap.json, .gitignore, and this README) to source control -so that others run the same versions of sub-dependencies. - -You should NOT check in the node_modules directory that Meteor automatically -creates; if you are using git, the .gitignore file tells git to ignore it. diff --git a/apps/meteor/packages/rocketchat-google-natural-language/client/index.js b/apps/meteor/packages/rocketchat-google-natural-language/client/index.js deleted file mode 100644 index 65dca41b4fcf..000000000000 --- a/apps/meteor/packages/rocketchat-google-natural-language/client/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Template } from 'meteor/templating'; -import { settings } from 'meteor/rocketchat:settings'; -import { ChatRoom } from 'meteor/rocketchat:models'; - -Template.room.helpers({ - sentimentSmile() { - if (!settings.get('GoogleNaturalLanguage_Enabled')) { - return; - } - - const room = ChatRoom.findOne(this._id, { fields: { sentiment: 1 } }); - - if (room.sentiment >= 0.3) { - return ':)'; - } - if (room.sentiment >= -0.3) { - return ':|'; - } - if (room.sentiment < -0.3) { - return ':('; - } - }, -}); diff --git a/apps/meteor/packages/rocketchat-google-natural-language/package.js b/apps/meteor/packages/rocketchat-google-natural-language/package.js deleted file mode 100644 index 543c9da91988..000000000000 --- a/apps/meteor/packages/rocketchat-google-natural-language/package.js +++ /dev/null @@ -1,12 +0,0 @@ -Package.describe({ - name: 'rocketchat:google-natural-language', - version: '0.0.1', - summary: 'Rocket.Chat Google Natural Language integration', - git: '', -}); - -Package.onUse(function (api) { - api.use(['ecmascript', 'http', 'rocketchat:settings', 'rocketchat:callbacks', 'rocketchat:models', 'templating']); - api.mainModule('client/index.js', 'client'); - api.mainModule('server/index.js', 'server'); -}); diff --git a/apps/meteor/packages/rocketchat-google-natural-language/server/index.js b/apps/meteor/packages/rocketchat-google-natural-language/server/index.js deleted file mode 100644 index e97d225140ff..000000000000 --- a/apps/meteor/packages/rocketchat-google-natural-language/server/index.js +++ /dev/null @@ -1,46 +0,0 @@ -import { Rooms } from 'meteor/rocketchat:models'; -import { Meteor } from 'meteor/meteor'; -import googleLanguage from '@google-cloud/language'; -import { callbacks } from 'meteor/rocketchat:callbacks'; - -import { settings } from '../../../app/settings/server'; - -let languageClient; - -settings.watch('GoogleNaturalLanguage_ServiceAccount', (value) => { - if (value) { - try { - languageClient = googleLanguage({ - credentials: JSON.parse(value), - }); - } catch (e) { - languageClient = null; - console.error('Error parsing Google Natural Language credential.', e); - } - } -}); - -const setRoomSentiment = function (message) { - if (!languageClient) { - return message; - } - - languageClient.detectSentiment( - message.msg, - Meteor.bindEnvironment((error, result) => { - if (!error) { - Rooms.setSentiment(message.rid, result); - } - }), - ); - - return message; -}; - -settings.watch('GoogleNaturalLanguage_Enabled', (value) => { - if (value) { - callbacks.add('afterSaveMessage', setRoomSentiment, callbacks.priority.MEDIUM, 'GoogleNaturalLanguage'); - } else { - callbacks.remove('afterSaveMessage', 'GoogleNaturalLanguage'); - } -}); diff --git a/apps/meteor/packages/rocketchat-google-natural-language/server/settings.ts b/apps/meteor/packages/rocketchat-google-natural-language/server/settings.ts deleted file mode 100644 index a7fd00635601..000000000000 --- a/apps/meteor/packages/rocketchat-google-natural-language/server/settings.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { settingsRegistry } from '../../../app/settings/server'; - -settingsRegistry.add('GoogleNaturalLanguage_Enabled', false, { - type: 'boolean', - group: 'Message', - section: 'Google Natural Language', - public: true, - i18nLabel: 'Enabled', -}); -settingsRegistry.add('GoogleNaturalLanguage_ServiceAccount', '', { - type: 'string', - group: 'Message', - section: 'Google Natural Language', - multiline: true, - enableQuery: { - _id: 'GoogleNaturalLanguage_Enabled', - value: true, - }, - i18nLabel: 'Service_account_key', -}); diff --git a/apps/meteor/server/lib/logger/showBox.ts b/apps/meteor/server/lib/logger/showBox.ts index 22a85e07d185..ae23fbb613cf 100644 --- a/apps/meteor/server/lib/logger/showBox.ts +++ b/apps/meteor/server/lib/logger/showBox.ts @@ -1,10 +1,10 @@ import s from 'underscore.string'; -import * as colors from 'colorette'; +import { createColors } from 'colorette'; // force enable colors on dev env -if (process.env.NODE_ENV !== 'production') { - colors.options.enabled = true; -} +const colors = createColors({ + useColor: process.env.NODE_ENV !== 'production', +}); type LogColors = 'white' | 'blue' | 'green' | 'magenta' | 'red'; diff --git a/apps/meteor/server/sdk/types/IMediaService.ts b/apps/meteor/server/sdk/types/IMediaService.ts index 4b1902d11080..6caadba88126 100644 --- a/apps/meteor/server/sdk/types/IMediaService.ts +++ b/apps/meteor/server/sdk/types/IMediaService.ts @@ -27,7 +27,7 @@ export interface IMediaService { enlarge: boolean, fit?: keyof sharp.FitEnum | undefined, ): Promise; - isImage(buff: Buffer): boolean; + isImage(buff: Buffer): Promise; stripExifFromImageStream(stream: Stream): Readable; stripExifFromBuffer(buffer: Buffer): Promise; } diff --git a/apps/meteor/server/services/image/service.ts b/apps/meteor/server/services/image/service.ts index a55eda2241aa..910742b0fb95 100644 --- a/apps/meteor/server/services/image/service.ts +++ b/apps/meteor/server/services/image/service.ts @@ -1,6 +1,6 @@ import stream, { Readable } from 'stream'; -import fileType from 'file-type'; +import ft from 'file-type'; import sharp from 'sharp'; import isSvg from 'is-svg'; @@ -81,8 +81,8 @@ export class MediaService extends ServiceClassInternal implements IMediaService }; } - isImage(buff: Buffer): boolean { - const data = fileType(buff); + async isImage(buff: Buffer): Promise { + const data = await ft.fromBuffer(buff); if (!data?.ext) { return false || this.isSvgImage(buff); } diff --git a/apps/meteor/tests/mocks/client/blobUrls.ts b/apps/meteor/tests/mocks/client/blobUrls.ts index c501c9616738..d56164c027ff 100644 --- a/apps/meteor/tests/mocks/client/blobUrls.ts +++ b/apps/meteor/tests/mocks/client/blobUrls.ts @@ -1,11 +1,11 @@ -import uuid from 'uuid'; +import { v4 } from 'uuid'; export const enableBlobUrlsMock = (): void => { const urlByBlob = new WeakMap(); const blobByUrl = new Map(); window.URL.createObjectURL = (blob: Blob): string => { - const url = urlByBlob.get(blob) ?? `blob://${uuid.v4()}`; + const url = urlByBlob.get(blob) ?? `blob://${v4()}`; urlByBlob.set(blob, url); blobByUrl.set(url, blob); return url; diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 3b88e8877be8..335efb7de7b3 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -5,9 +5,9 @@ "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "@types/mongodb": "^3.6.10", - "eslint": "^8.12.0", + "eslint": "^8.14.0", "prettier": "^2.6.2", - "typescript": "~4.3.5" + "typescript": "~4.3.4" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index 97085663bfbe..ba74b1139fdf 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -6,10 +6,10 @@ "@rocket.chat/eslint-config": "workspace:^", "@types/jest": "^27.4.1", "@types/mongodb": "^3.6.10", - "eslint": "^8.12.0", + "eslint": "^8.14.0", "jest": "^27.5.1", "ts-jest": "^27.1.4", - "typescript": "~4.3.5" + "typescript": "~4.3.4" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/yarn.lock b/yarn.lock index daf267a8b4ca..1d2ceaa68085 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,7 +30,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:7.16.7, @babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.5.5, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.5.5, @babel/code-frame@npm:^7.8.3": version: 7.16.7 resolution: "@babel/code-frame@npm:7.16.7" dependencies: @@ -46,6 +46,13 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.17.10": + version: 7.17.10 + resolution: "@babel/compat-data@npm:7.17.10" + checksum: e85051087cd4690de5061909a2dd2d7f8b6434a3c2e30be6c119758db2027ae1845bcd75a81127423dd568b706ac6994a1a3d7d701069a23bf5cfe900728290b + languageName: node + linkType: hard + "@babel/core@npm:7.12.9": version: 7.12.9 resolution: "@babel/core@npm:7.12.9" @@ -70,30 +77,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:7.16.12": - version: 7.16.12 - resolution: "@babel/core@npm:7.16.12" - dependencies: - "@babel/code-frame": ^7.16.7 - "@babel/generator": ^7.16.8 - "@babel/helper-compilation-targets": ^7.16.7 - "@babel/helper-module-transforms": ^7.16.7 - "@babel/helpers": ^7.16.7 - "@babel/parser": ^7.16.12 - "@babel/template": ^7.16.7 - "@babel/traverse": ^7.16.10 - "@babel/types": ^7.16.8 - convert-source-map: ^1.7.0 - debug: ^4.1.0 - gensync: ^1.0.0-beta.2 - json5: ^2.1.2 - semver: ^6.3.0 - source-map: ^0.5.0 - checksum: 29b56f3cb7c329fc038a2efaccf64ac3025835676b3d90f57f2265b6acd477a970114d09021b38d019ac8f20b2bb1596a9e79ce1f820d6b8cf0e4a802891817c - languageName: node - linkType: hard - -"@babel/core@npm:>=7.9.0, @babel/core@npm:^7.1.0, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.14.6, @babel/core@npm:^7.5.5, @babel/core@npm:^7.7.2, @babel/core@npm:^7.7.5, @babel/core@npm:^7.8.0": +"@babel/core@npm:>=7.9.0, @babel/core@npm:^7.1.0, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.5.5, @babel/core@npm:^7.7.2, @babel/core@npm:^7.7.5, @babel/core@npm:^7.8.0": version: 7.17.9 resolution: "@babel/core@npm:7.17.9" dependencies: @@ -116,7 +100,30 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.12.5, @babel/generator@npm:^7.16.8, @babel/generator@npm:^7.17.9, @babel/generator@npm:^7.7.2": +"@babel/core@npm:^7.17.9": + version: 7.18.0 + resolution: "@babel/core@npm:7.18.0" + dependencies: + "@ampproject/remapping": ^2.1.0 + "@babel/code-frame": ^7.16.7 + "@babel/generator": ^7.18.0 + "@babel/helper-compilation-targets": ^7.17.10 + "@babel/helper-module-transforms": ^7.18.0 + "@babel/helpers": ^7.18.0 + "@babel/parser": ^7.18.0 + "@babel/template": ^7.16.7 + "@babel/traverse": ^7.18.0 + "@babel/types": ^7.18.0 + convert-source-map: ^1.7.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.1 + semver: ^6.3.0 + checksum: 350b7724a48c80b76f8af11e3cac1ad8ec9021325389f5ae20c713b10d4359c5e60aa7e71a309a3e1893826c46e72eef5df4978eb63eaabc403e8cc4ce5e94fc + languageName: node + linkType: hard + +"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.12.5, @babel/generator@npm:^7.17.9, @babel/generator@npm:^7.7.2": version: 7.17.9 resolution: "@babel/generator@npm:7.17.9" dependencies: @@ -127,6 +134,17 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/generator@npm:7.18.0" + dependencies: + "@babel/types": ^7.18.0 + "@jridgewell/gen-mapping": ^0.3.0 + jsesc: ^2.5.1 + checksum: 0854b21d94f99e3ac68249a9bbaa0c3a914a600c69c12fffa4a01377d89282174a67e619654e401be4c791414a1d5e825671f089f1c2407694a494dcfab8b06c + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-annotate-as-pure@npm:7.16.7" @@ -160,6 +178,20 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.17.10": + version: 7.17.10 + resolution: "@babel/helper-compilation-targets@npm:7.17.10" + dependencies: + "@babel/compat-data": ^7.17.10 + "@babel/helper-validator-option": ^7.16.7 + browserslist: ^4.20.2 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 5f547c7ebd372e90fa72c2aaea867e7193166e9f469dec5acde4f0e18a78b80bdca8e02a0f641f3e998be984fb5b802c729a9034faaee8b1a9ef6670cb76f120 + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.16.10, @babel/helper-create-class-features-plugin@npm:^7.16.7, @babel/helper-create-class-features-plugin@npm:^7.17.6": version: 7.17.6 resolution: "@babel/helper-create-class-features-plugin@npm:7.17.6" @@ -177,6 +209,23 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.17.12, @babel/helper-create-class-features-plugin@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/helper-create-class-features-plugin@npm:7.18.0" + dependencies: + "@babel/helper-annotate-as-pure": ^7.16.7 + "@babel/helper-environment-visitor": ^7.16.7 + "@babel/helper-function-name": ^7.17.9 + "@babel/helper-member-expression-to-functions": ^7.17.7 + "@babel/helper-optimise-call-expression": ^7.16.7 + "@babel/helper-replace-supers": ^7.16.7 + "@babel/helper-split-export-declaration": ^7.16.7 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 9a6ef175350f1cf87abe7a738e8c9b603da7fcdb153c74e49af509183f8705278020baddb62a12c7f9ca059487fef97d75a4adea6a1446598ad9901d010e4296 + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.16.7": version: 7.17.0 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.17.0" @@ -189,6 +238,18 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-regexp-features-plugin@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.17.12" + dependencies: + "@babel/helper-annotate-as-pure": ^7.16.7 + regexpu-core: ^5.0.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: fe49d26b0f6c58d4c1748a4d0e98b343882b428e6db43c4ba5e0aa7ff2296b3a557f0a88de9f000599bb95640a6c47c0b0c9a952b58c11f61aabb06bcc304329 + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.1.5": version: 0.1.5 resolution: "@babel/helper-define-polyfill-provider@npm:0.1.5" @@ -262,7 +323,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.16.7": +"@babel/helper-member-expression-to-functions@npm:^7.16.7, @babel/helper-member-expression-to-functions@npm:^7.17.7": version: 7.17.7 resolution: "@babel/helper-member-expression-to-functions@npm:7.17.7" dependencies: @@ -296,6 +357,22 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/helper-module-transforms@npm:7.18.0" + dependencies: + "@babel/helper-environment-visitor": ^7.16.7 + "@babel/helper-module-imports": ^7.16.7 + "@babel/helper-simple-access": ^7.17.7 + "@babel/helper-split-export-declaration": ^7.16.7 + "@babel/helper-validator-identifier": ^7.16.7 + "@babel/template": ^7.16.7 + "@babel/traverse": ^7.18.0 + "@babel/types": ^7.18.0 + checksum: 824c3967c08d75bb36adc18c31dcafebcd495b75b723e2e17c6185e88daf5c6db62a6a75d9f791b5f38618a349e7cb32503e715a1b9a4e8bad4d0f43e3e6b523 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-optimise-call-expression@npm:7.16.7" @@ -312,13 +389,20 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:7.16.7, @babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.13.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.13.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.16.7 resolution: "@babel/helper-plugin-utils@npm:7.16.7" checksum: d08dd86554a186c2538547cd537552e4029f704994a9201d41d82015c10ed7f58f9036e8d1527c3760f042409163269d308b0b3706589039c5f1884619c6d4ce languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/helper-plugin-utils@npm:7.17.12" + checksum: 4813cf0ddb0f143de032cb88d4207024a2334951db330f8216d6fa253ea320c02c9b2667429ef1a34b5e95d4cfbd085f6cb72d418999751c31d0baf2422cc61d + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.16.8": version: 7.16.8 resolution: "@babel/helper-remap-async-to-generator@npm:7.16.8" @@ -343,7 +427,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.16.7, @babel/helper-simple-access@npm:^7.17.7": +"@babel/helper-simple-access@npm:^7.17.7": version: 7.17.7 resolution: "@babel/helper-simple-access@npm:7.17.7" dependencies: @@ -396,7 +480,7 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.16.7, @babel/helpers@npm:^7.17.9": +"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.17.9": version: 7.17.9 resolution: "@babel/helpers@npm:7.17.9" dependencies: @@ -407,6 +491,17 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/helpers@npm:7.18.0" + dependencies: + "@babel/template": ^7.16.7 + "@babel/traverse": ^7.18.0 + "@babel/types": ^7.18.0 + checksum: 3f41631c0797b052cc22337ee56290700fe7db7bc06b847fcdf2c0043cddc35861855a1acc4c948397838675d2dc694f4fb1b102d1c7eb484ea01e9029916b55 + languageName: node + linkType: hard + "@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.16.7": version: 7.17.9 resolution: "@babel/highlight@npm:7.17.9" @@ -418,7 +513,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.11, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.12, @babel/parser@npm:^7.16.7, @babel/parser@npm:^7.17.9, @babel/parser@npm:^7.7.0": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.11, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.7, @babel/parser@npm:^7.17.9, @babel/parser@npm:^7.7.0": version: 7.17.9 resolution: "@babel/parser@npm:7.17.9" bin: @@ -427,6 +522,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/parser@npm:7.18.0" + bin: + parser: ./bin/babel-parser.js + checksum: 253b5828bf4a0b443301baedc5993d6f7f35aa0d81cf8f2f2f53940904b7067eab7bd2380aee4b3be1d8efd5ae1008eb0fad19bde28f5fbc213c0fdf9a414466 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.16.7" @@ -438,6 +542,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 6ef739b3a2b0ac0b22b60ff472c118163ceb8d414dd08c8186cc563fddc2be62ad4d8681e02074a1c7f0056a72e7146493a85d12ded02e50904b0009ed85d8bf + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.16.7" @@ -451,6 +566,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/helper-skip-transparent-expression-wrappers": ^7.16.0 + "@babel/plugin-proposal-optional-chaining": ^7.17.12 + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 68520a8f26e56bc8d90c22133537a9819e82598e3c82007f30bdaf8898b0e12a7bfa0cd3044aca35a7f362fd6bc04e4cd8052a571fc2eb40ad8f1cf24e0fc45f + languageName: node + linkType: hard + "@babel/plugin-proposal-async-generator-functions@npm:^7.16.8": version: 7.16.8 resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.16.8" @@ -464,7 +592,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-class-properties@npm:7.16.7, @babel/plugin-proposal-class-properties@npm:^7.12.1, @babel/plugin-proposal-class-properties@npm:^7.16.7": +"@babel/plugin-proposal-async-generator-functions@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/helper-remap-async-to-generator": ^7.16.8 + "@babel/plugin-syntax-async-generators": ^7.8.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 16a3c7f68a27031b4973b7c64ca009873c91b91afd7b3a4694ec7f1c6d8e91a6ee142eafd950113810fae122faa1031de71140333b2b1bd03d5367b1a05b1d91 + languageName: node + linkType: hard + +"@babel/plugin-proposal-class-properties@npm:^7.12.1, @babel/plugin-proposal-class-properties@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-proposal-class-properties@npm:7.16.7" dependencies: @@ -476,6 +617,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-class-properties@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-proposal-class-properties@npm:7.17.12" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.17.12 + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 884df6a4617a18cdc2a630096b2a10954bcc94757c893bb01abd6702fdc73343ca5c611f4884c4634e0608f5e86c3093ea6b973ce00bf21b248ba54de92c837d + languageName: node + linkType: hard + "@babel/plugin-proposal-class-static-block@npm:^7.16.7": version: 7.17.6 resolution: "@babel/plugin-proposal-class-static-block@npm:7.17.6" @@ -489,6 +642,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-class-static-block@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/plugin-proposal-class-static-block@npm:7.18.0" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.18.0 + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/plugin-syntax-class-static-block": ^7.14.5 + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 70fd622fd7c62cca2aa99c70532766340a5c30105e35cb3f1187b450580d43adc78b3fcb1142ed339bcfccf84be95ea03407adf467331b318ce6874432736c89 + languageName: node + linkType: hard + "@babel/plugin-proposal-decorators@npm:^7.12.12": version: 7.17.8 resolution: "@babel/plugin-proposal-decorators@npm:7.17.8" @@ -504,7 +670,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-dynamic-import@npm:7.16.7, @babel/plugin-proposal-dynamic-import@npm:^7.16.7": +"@babel/plugin-proposal-dynamic-import@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-proposal-dynamic-import@npm:7.16.7" dependencies: @@ -528,7 +694,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-export-namespace-from@npm:7.16.7, @babel/plugin-proposal-export-namespace-from@npm:^7.16.7": +"@babel/plugin-proposal-export-namespace-from@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-proposal-export-namespace-from@npm:7.16.7" dependencies: @@ -540,6 +706,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-export-namespace-from@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-proposal-export-namespace-from@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/plugin-syntax-export-namespace-from": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 41c9cd4c0a5629b65725d2554867c15b199f534cea5538bd1ae379c0d13e7206d8590e23b23cb05a8b243e33e6eb88c1de3fd03a55cdbc6d4cf8634a6bebe43d + languageName: node + linkType: hard + "@babel/plugin-proposal-json-strings@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-proposal-json-strings@npm:7.16.7" @@ -552,7 +730,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-logical-assignment-operators@npm:7.16.7, @babel/plugin-proposal-logical-assignment-operators@npm:^7.16.7": +"@babel/plugin-proposal-json-strings@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-proposal-json-strings@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/plugin-syntax-json-strings": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8ed4ee3fbc28e44fac17c48bd95b5b8c3ffc852053a9fffd36ab498ec0b0ba069b8b2f5658edc18332748948433b9d3e1e376f564a1d65cb54592ba9943be09b + languageName: node + linkType: hard + +"@babel/plugin-proposal-logical-assignment-operators@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.16.7" dependencies: @@ -564,7 +754,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-nullish-coalescing-operator@npm:7.16.7, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.12.1, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.14.5, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.16.7": +"@babel/plugin-proposal-logical-assignment-operators@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0d48451836219b7beeca4be22a8aeb4a177a4944be4727afb94a4a11f201dde8b0b186dd2ad65b537d61e9af3fa1afda734f7096bec8602debd76d07aa342e21 + languageName: node + linkType: hard + +"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.12.1, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.16.7" dependencies: @@ -576,7 +778,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-numeric-separator@npm:7.16.7, @babel/plugin-proposal-numeric-separator@npm:^7.16.7": +"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7881d8005d0d4e17a94f3bfbfa4a0d8af016d2f62ed90912fabb8c5f8f0cc0a15fd412f09c230984c40b5c893086987d403c73198ef388ffcb3726ff72efc009 + languageName: node + linkType: hard + +"@babel/plugin-proposal-numeric-separator@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-proposal-numeric-separator@npm:7.16.7" dependencies: @@ -616,6 +830,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-object-rest-spread@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.18.0" + dependencies: + "@babel/compat-data": ^7.17.10 + "@babel/helper-compilation-targets": ^7.17.10 + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-transform-parameters": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2b49bcf9a6b11fd8b6a1d4962a64f3c846a63f8340eca9824c907f75bfcff7422ca35b135607fc3ef2d4e7e77ce6b6d955b772dc3c1c39f7ed24a0d8a560ec78 + languageName: node + linkType: hard + "@babel/plugin-proposal-optional-catch-binding@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-proposal-optional-catch-binding@npm:7.16.7" @@ -628,7 +857,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-optional-chaining@npm:7.16.7, @babel/plugin-proposal-optional-chaining@npm:^7.12.7, @babel/plugin-proposal-optional-chaining@npm:^7.14.5, @babel/plugin-proposal-optional-chaining@npm:^7.16.7": +"@babel/plugin-proposal-optional-chaining@npm:^7.12.7, @babel/plugin-proposal-optional-chaining@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-proposal-optional-chaining@npm:7.16.7" dependencies: @@ -641,7 +870,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-private-methods@npm:7.16.11, @babel/plugin-proposal-private-methods@npm:^7.12.1, @babel/plugin-proposal-private-methods@npm:^7.16.11": +"@babel/plugin-proposal-optional-chaining@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-proposal-optional-chaining@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/helper-skip-transparent-expression-wrappers": ^7.16.0 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a27b220573441a0ad3eecf8ddcb249556a64de45add236791d76cfa164a8fd34181857528fa7d21d03d6b004e7c043bd929cce068e611ee1ac72aaf4d397aa12 + languageName: node + linkType: hard + +"@babel/plugin-proposal-private-methods@npm:^7.12.1, @babel/plugin-proposal-private-methods@npm:^7.16.11": version: 7.16.11 resolution: "@babel/plugin-proposal-private-methods@npm:7.16.11" dependencies: @@ -653,7 +895,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:7.16.7, @babel/plugin-proposal-private-property-in-object@npm:^7.16.7": +"@babel/plugin-proposal-private-methods@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-proposal-private-methods@npm:7.17.12" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.17.12 + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a1e5bd6a0a541af55d133d7bcf51ff8eb4ac7417a30f518c2f38107d7d033a3d5b7128ea5b3a910b458d7ceb296179b6ff9d972be60d1c686113d25fede8bed3 + languageName: node + linkType: hard + +"@babel/plugin-proposal-private-property-in-object@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.16.7" dependencies: @@ -667,6 +921,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-private-property-in-object@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.17.12" + dependencies: + "@babel/helper-annotate-as-pure": ^7.16.7 + "@babel/helper-create-class-features-plugin": ^7.17.12 + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 056cb77994b2ee367301cdf8c5b7ed71faf26d60859bbba1368b342977481b0884712a1b97fbd9b091750162923d0265bf901119d46002775aa66e4a9f30f411 + languageName: node + linkType: hard + "@babel/plugin-proposal-unicode-property-regex@npm:^7.16.7, @babel/plugin-proposal-unicode-property-regex@npm:^7.4.4": version: 7.16.7 resolution: "@babel/plugin-proposal-unicode-property-regex@npm:7.16.7" @@ -679,7 +947,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-async-generators@npm:7.8.4, @babel/plugin-syntax-async-generators@npm:^7.8.4": +"@babel/plugin-proposal-unicode-property-regex@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-proposal-unicode-property-regex@npm:7.17.12" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.17.12 + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0e4194510415ed11849f1617fcb32d996df746ba93cd05ebbabecb63cfc02c0e97b585c97da3dcf68acdd3c8b71cfae964abe5d5baba6bd3977a475d9225ad9e + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": version: 7.8.4 resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" dependencies: @@ -778,6 +1058,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fef25c3247d18dc7b8e432ed07f4afb92d70113fcfc3db0ca52388f8083b4bd60f88fe9ec0085e8a5a6daf18a619042376e76e2b4bd9470cddb7362cd268bea5 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-meta@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" @@ -789,7 +1080,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-json-strings@npm:7.8.3, @babel/plugin-syntax-json-strings@npm:^7.8.3": +"@babel/plugin-syntax-json-strings@npm:^7.8.3": version: 7.8.3 resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" dependencies: @@ -822,6 +1113,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-syntax-jsx@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6acd0bbca8c3e0100ad61f3b7d0b0111cd241a0710b120b298c4aa0e07be02eccbcca61ede1e7678ade1783a0979f20305b62263df6767fa3fbf658670d82af5 + languageName: node + linkType: hard + "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" @@ -866,7 +1168,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-optional-catch-binding@npm:7.8.3, @babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": version: 7.8.3 resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" dependencies: @@ -932,6 +1234,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-arrow-functions@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 48f99e74f523641696d5d9fb3f5f02497eca2e97bc0e9b8230a47f388e37dc5fd84b8b29e9f5a0c82d63403f7ba5f085a28e26939678f6e917d5c01afd884b50 + languageName: node + linkType: hard + "@babel/plugin-transform-async-to-generator@npm:^7.16.8": version: 7.16.8 resolution: "@babel/plugin-transform-async-to-generator@npm:7.16.8" @@ -945,6 +1258,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-to-generator@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.17.12" + dependencies: + "@babel/helper-module-imports": ^7.16.7 + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/helper-remap-async-to-generator": ^7.16.8 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 052dd56eb3b10bc31f5aaced0f75fc7307713f74049ccfb91cd087bebfc890a6d462b59445c5299faaca9030814172cac290c941c76b731a38dcb267377c9187 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.16.7" @@ -967,6 +1293,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-block-scoping@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ea3d4d88e38367d62a1029d204c5cc0ac410b00779179c8507448001c64784bf8e34c6fa57f23d8b95a835541a2fc67d1076650b1efc99c78f699de354472e49 + languageName: node + linkType: hard + "@babel/plugin-transform-classes@npm:^7.12.1, @babel/plugin-transform-classes@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-classes@npm:7.16.7" @@ -985,6 +1322,24 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-classes@npm:7.17.12" + dependencies: + "@babel/helper-annotate-as-pure": ^7.16.7 + "@babel/helper-environment-visitor": ^7.16.7 + "@babel/helper-function-name": ^7.17.9 + "@babel/helper-optimise-call-expression": ^7.16.7 + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/helper-replace-supers": ^7.16.7 + "@babel/helper-split-export-declaration": ^7.16.7 + globals: ^11.1.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0127b1cc432373965edf28cbfd9e85df5bc77e974ceb80ba32691e050e8fb6792f207d1941529c81d1b9e7a6e82da26ecc445f6f547f0ad5076cd2b27adc18ac + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-computed-properties@npm:7.16.7" @@ -996,6 +1351,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-computed-properties@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-computed-properties@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 5d05418617e0967bec4818556b7febb6f8c40813e32035f0bd6b7dbd7b9d63e9ab7c7c8fd7bd05bab2a599dad58e7b69957d9559b41079d112c219bbc3649aa1 + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.12.1, @babel/plugin-transform-destructuring@npm:^7.16.7, @babel/plugin-transform-destructuring@npm:^7.5.0": version: 7.17.7 resolution: "@babel/plugin-transform-destructuring@npm:7.17.7" @@ -1007,6 +1373,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/plugin-transform-destructuring@npm:7.18.0" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d85d60737c3b05c4db71bc94270e952122d360bd6ebf91b5f98cf16fb8564558b615d115354fe0ef41e2aae9c4540e6e16144284d881ecaef687693736cd2a79 + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.16.7, @babel/plugin-transform-dotall-regex@npm:^7.4.4": version: 7.16.7 resolution: "@babel/plugin-transform-dotall-regex@npm:7.16.7" @@ -1030,6 +1407,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fb6ad550538830b0dc5b1b547734359f2d782209570e9d61fe9b84a6929af570fcc38ab579a67ee7cd6a832147db91a527f4cceb1248974f006fe815980816bb + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.16.7" @@ -1065,6 +1453,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.17.12": + version: 7.18.1 + resolution: "@babel/plugin-transform-for-of@npm:7.18.1" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: cdc6e1f1170218cc6ac5b26b4b8f011ec5c36666101e00e0061aaa5772969b093bad5b2af8ce908c184126d5bb0c26b89dd4debb96b2375aba2e20e427a623a8 + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-function-name@npm:7.16.7" @@ -1089,6 +1488,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-literals@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 09280fc1ed23b81deafd4fcd7a35d6c0944668de2317f14c1b8b78c5c201f71a063bb8d174d2fc97d86df480ff23104c8919d3aacf19f33c2b5ada584203bf1c + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.16.7" @@ -1113,17 +1523,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:7.16.8": - version: 7.16.8 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.16.8" +"@babel/plugin-transform-modules-amd@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/plugin-transform-modules-amd@npm:7.18.0" dependencies: - "@babel/helper-module-transforms": ^7.16.7 - "@babel/helper-plugin-utils": ^7.16.7 - "@babel/helper-simple-access": ^7.16.7 + "@babel/helper-module-transforms": ^7.18.0 + "@babel/helper-plugin-utils": ^7.17.12 babel-plugin-dynamic-import-node: ^2.3.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c0ac00f5457e12cac7825b14725b6fc787bef78945181469ff79f07ef0fd7df021cb00fe1d3a9f35fc9bc92ae59e6e3fc9075a70b627dfe10e00d0907892aace + checksum: bed3ff5cd81f236981360fc4a6fd2262685c1202772c657ce3ab95b7930437f8fa22361021b481c977b6f47988dfcc07c7782a1c91b90d3a5552c91401f4631a languageName: node linkType: hard @@ -1141,6 +1550,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.18.0" + dependencies: + "@babel/helper-module-transforms": ^7.18.0 + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/helper-simple-access": ^7.17.7 + babel-plugin-dynamic-import-node: ^2.3.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: debb8c952b689def0d3f02d2944b8d031650adcad042277f91c4d137d96c4de1796576d2791fc55217c19004947a37f031c9870d830861075d33d279fe02dda8 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-systemjs@npm:^7.16.7": version: 7.17.8 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.17.8" @@ -1156,6 +1579,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-systemjs@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.18.0" + dependencies: + "@babel/helper-hoist-variables": ^7.16.7 + "@babel/helper-module-transforms": ^7.18.0 + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/helper-validator-identifier": ^7.16.7 + babel-plugin-dynamic-import-node: ^2.3.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 80fccfc546aab76238d3f4aeb454f61ed885670578f1ab6dc063bba5b5d4cbdf821439ac6ca8bc24449eed752359600b47be717196103d2eabba06de1bf3f732 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-umd@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-modules-umd@npm:7.16.7" @@ -1168,6 +1606,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/plugin-transform-modules-umd@npm:7.18.0" + dependencies: + "@babel/helper-module-transforms": ^7.18.0 + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4081a79cfd4c6fda785c2137f9f2721e35c06a9d2f23c304172838d12e9317a24d3cb5b652a9db61e58319b370c57b1b44991429efe709679f98e114d98597fb + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.16.8": version: 7.16.8 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.16.8" @@ -1179,6 +1629,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.17.12" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.17.12 + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: cff9d91d0abd87871da6574583e79093ed75d5faecea45b6a13350ba243b1a595d349a6e7d906f5dfdf6c69c643cba9df662c3d01eaa187c5b1a01cb5838e848 + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-new-target@npm:7.16.7" @@ -1190,6 +1652,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-new-target@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bec26350fa49c9a9431d23b4ff234f8eb60554b8cdffca432a94038406aae5701014f343568c0e0cc8afae6f95d492f6bae0d0e2c101c1a484fb20eec75b2c07 + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-object-super@npm:7.16.7" @@ -1213,6 +1686,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-parameters@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d9ed5ec61dc460835bade8fa710b42ec9f207bd448ead7e8abd46b87db0afedbb3f51284700fd2a6892fdf6544ec9b949c505c6542c5ba0a41ca4e8749af00f0 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-property-literals@npm:7.16.7" @@ -1261,6 +1745,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-react-jsx@npm:7.17.12" + dependencies: + "@babel/helper-annotate-as-pure": ^7.16.7 + "@babel/helper-module-imports": ^7.16.7 + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/plugin-syntax-jsx": ^7.17.12 + "@babel/types": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 02e9974d14821173bb8e84db4bdfccd546bfdbf445d91d6345f953591f16306cf5741861d72e0d0910f3ffa7d4084fafed99cedf736e7ba8bed0cf64320c2ea6 + languageName: node + linkType: hard + "@babel/plugin-transform-react-pure-annotations@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.16.7" @@ -1284,6 +1783,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/plugin-transform-regenerator@npm:7.18.0" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + regenerator-transform: ^0.15.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ebacf2bbe9e2fb6f2bd7996e19b41bfc9848628950ae06a1a832802a0b8e32a32003c6b89318da6ca521f79045c91324dcb4c97247ed56f86fa58d7401a7316f + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-reserved-words@npm:7.16.7" @@ -1295,6 +1806,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-reserved-words@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-reserved-words@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d8a617cb79ca5852ac2736a9f81c15a3b0760919720c3b9069a864e2288006ebcaab557dbb36a3eba936defd6699f82e3bf894915925aa9185f5d9bcbf3b29fd + languageName: node + linkType: hard + "@babel/plugin-transform-shorthand-properties@npm:^7.12.1, @babel/plugin-transform-shorthand-properties@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.16.7" @@ -1318,6 +1840,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-spread@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/helper-skip-transparent-expression-wrappers": ^7.16.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3a95e4f163d598c0efc9d983e5ce3e8716998dd2af62af8102b11cb8d6383c71b74c7106adbce73cda6e48d3d3e927627847d36d76c2eb688cd0e2e07f67fb51 + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-sticky-regex@npm:7.16.7" @@ -1340,6 +1874,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-template-literals@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fec220cea6e7bcd7720c65245e628cdf8e8276379e8ee041e49217b5ebb426911cb738d5b66afa5b1c7d17fc8dbe76d8041dbbce442925d83f08fb510f90507e + languageName: node + linkType: hard + "@babel/plugin-transform-typeof-symbol@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.16.7" @@ -1351,6 +1896,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typeof-symbol@npm:^7.17.12": + version: 7.17.12 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e30bd03c8abc1b095f8b2a10289df6850e3bc3cd0aea1cbc29050aa3b421cbb77d0428b0cd012333632a7a930dc8301cd888e762b2dd601e7dc5dac50f4140c9 + languageName: node + linkType: hard + "@babel/plugin-transform-typescript@npm:^7.16.7": version: 7.16.8 resolution: "@babel/plugin-transform-typescript@npm:7.16.8" @@ -1387,7 +1943,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.11.5, @babel/preset-env@npm:^7.12.11, @babel/preset-env@npm:^7.14.7": +"@babel/preset-env@npm:^7.11.5, @babel/preset-env@npm:^7.12.11": version: 7.16.11 resolution: "@babel/preset-env@npm:7.16.11" dependencies: @@ -1471,6 +2027,91 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.16.11": + version: 7.18.0 + resolution: "@babel/preset-env@npm:7.18.0" + dependencies: + "@babel/compat-data": ^7.17.10 + "@babel/helper-compilation-targets": ^7.17.10 + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/helper-validator-option": ^7.16.7 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.17.12 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.17.12 + "@babel/plugin-proposal-async-generator-functions": ^7.17.12 + "@babel/plugin-proposal-class-properties": ^7.17.12 + "@babel/plugin-proposal-class-static-block": ^7.18.0 + "@babel/plugin-proposal-dynamic-import": ^7.16.7 + "@babel/plugin-proposal-export-namespace-from": ^7.17.12 + "@babel/plugin-proposal-json-strings": ^7.17.12 + "@babel/plugin-proposal-logical-assignment-operators": ^7.17.12 + "@babel/plugin-proposal-nullish-coalescing-operator": ^7.17.12 + "@babel/plugin-proposal-numeric-separator": ^7.16.7 + "@babel/plugin-proposal-object-rest-spread": ^7.18.0 + "@babel/plugin-proposal-optional-catch-binding": ^7.16.7 + "@babel/plugin-proposal-optional-chaining": ^7.17.12 + "@babel/plugin-proposal-private-methods": ^7.17.12 + "@babel/plugin-proposal-private-property-in-object": ^7.17.12 + "@babel/plugin-proposal-unicode-property-regex": ^7.17.12 + "@babel/plugin-syntax-async-generators": ^7.8.4 + "@babel/plugin-syntax-class-properties": ^7.12.13 + "@babel/plugin-syntax-class-static-block": ^7.14.5 + "@babel/plugin-syntax-dynamic-import": ^7.8.3 + "@babel/plugin-syntax-export-namespace-from": ^7.8.3 + "@babel/plugin-syntax-import-assertions": ^7.17.12 + "@babel/plugin-syntax-json-strings": ^7.8.3 + "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + "@babel/plugin-syntax-numeric-separator": ^7.10.4 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + "@babel/plugin-syntax-top-level-await": ^7.14.5 + "@babel/plugin-transform-arrow-functions": ^7.17.12 + "@babel/plugin-transform-async-to-generator": ^7.17.12 + "@babel/plugin-transform-block-scoped-functions": ^7.16.7 + "@babel/plugin-transform-block-scoping": ^7.17.12 + "@babel/plugin-transform-classes": ^7.17.12 + "@babel/plugin-transform-computed-properties": ^7.17.12 + "@babel/plugin-transform-destructuring": ^7.18.0 + "@babel/plugin-transform-dotall-regex": ^7.16.7 + "@babel/plugin-transform-duplicate-keys": ^7.17.12 + "@babel/plugin-transform-exponentiation-operator": ^7.16.7 + "@babel/plugin-transform-for-of": ^7.17.12 + "@babel/plugin-transform-function-name": ^7.16.7 + "@babel/plugin-transform-literals": ^7.17.12 + "@babel/plugin-transform-member-expression-literals": ^7.16.7 + "@babel/plugin-transform-modules-amd": ^7.18.0 + "@babel/plugin-transform-modules-commonjs": ^7.18.0 + "@babel/plugin-transform-modules-systemjs": ^7.18.0 + "@babel/plugin-transform-modules-umd": ^7.18.0 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.17.12 + "@babel/plugin-transform-new-target": ^7.17.12 + "@babel/plugin-transform-object-super": ^7.16.7 + "@babel/plugin-transform-parameters": ^7.17.12 + "@babel/plugin-transform-property-literals": ^7.16.7 + "@babel/plugin-transform-regenerator": ^7.18.0 + "@babel/plugin-transform-reserved-words": ^7.17.12 + "@babel/plugin-transform-shorthand-properties": ^7.16.7 + "@babel/plugin-transform-spread": ^7.17.12 + "@babel/plugin-transform-sticky-regex": ^7.16.7 + "@babel/plugin-transform-template-literals": ^7.17.12 + "@babel/plugin-transform-typeof-symbol": ^7.17.12 + "@babel/plugin-transform-unicode-escapes": ^7.16.7 + "@babel/plugin-transform-unicode-regex": ^7.16.7 + "@babel/preset-modules": ^0.1.5 + "@babel/types": ^7.18.0 + babel-plugin-polyfill-corejs2: ^0.3.0 + babel-plugin-polyfill-corejs3: ^0.5.0 + babel-plugin-polyfill-regenerator: ^0.3.0 + core-js-compat: ^3.22.1 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f2d4f6305c0e1a4f49d89c076f67f93e20d9fce73cde1c74447c2c3cc519b3568a2359815221eb386cac0050fdaf8a032f4f85746aa4c1f4d0b7808dcebf2966 + languageName: node + linkType: hard + "@babel/preset-flow@npm:^7.12.1": version: 7.16.7 resolution: "@babel/preset-flow@npm:7.16.7" @@ -1499,7 +2140,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.12.10, @babel/preset-react@npm:^7.14.5": +"@babel/preset-react@npm:^7.12.10": version: 7.16.7 resolution: "@babel/preset-react@npm:7.16.7" dependencies: @@ -1515,7 +2156,23 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:7.16.7, @babel/preset-typescript@npm:^7.12.7": +"@babel/preset-react@npm:^7.16.7": + version: 7.17.12 + resolution: "@babel/preset-react@npm:7.17.12" + dependencies: + "@babel/helper-plugin-utils": ^7.17.12 + "@babel/helper-validator-option": ^7.16.7 + "@babel/plugin-transform-react-display-name": ^7.16.7 + "@babel/plugin-transform-react-jsx": ^7.17.12 + "@babel/plugin-transform-react-jsx-development": ^7.16.7 + "@babel/plugin-transform-react-pure-annotations": ^7.16.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 369712150d6a152720069db8d024320f3d9d2a6611e9b0be4aa03dcab8502fa0e9efc0693c93ba2d818d5243c9d03b015163d76efe65df600f15b9b0a206f674 + languageName: node + linkType: hard + +"@babel/preset-typescript@npm:^7.12.7": version: 7.16.7 resolution: "@babel/preset-typescript@npm:7.16.7" dependencies: @@ -1528,7 +2185,7 @@ __metadata: languageName: node linkType: hard -"@babel/register@npm:^7.12.1, @babel/register@npm:^7.14.5": +"@babel/register@npm:^7.12.1, @babel/register@npm:^7.17.7": version: 7.17.7 resolution: "@babel/register@npm:7.17.7" dependencies: @@ -1543,7 +2200,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.14.5, @babel/runtime@npm:^7.14.8, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.14.5, @babel/runtime@npm:^7.14.8, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": version: 7.17.9 resolution: "@babel/runtime@npm:7.17.9" dependencies: @@ -1552,6 +2209,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.17.9": + version: 7.18.0 + resolution: "@babel/runtime@npm:7.18.0" + dependencies: + regenerator-runtime: ^0.13.4 + checksum: 9d0caa5fe690623fb6c5df6fb3b3581d227b55ef9f7c35eba0da83d10aa756669a81fe521ac4dbc007e5790716bac40ebe71ff098e2d1a9599dd696a282a3e95 + languageName: node + linkType: hard + "@babel/template@npm:^7.12.7, @babel/template@npm:^7.16.7, @babel/template@npm:^7.3.3": version: 7.16.7 resolution: "@babel/template@npm:7.16.7" @@ -1563,7 +2229,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.12.11, @babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.16.10, @babel/traverse@npm:^7.16.7, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.17.9, @babel/traverse@npm:^7.7.0, @babel/traverse@npm:^7.7.2": +"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.12.11, @babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.16.7, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.17.9, @babel/traverse@npm:^7.7.0, @babel/traverse@npm:^7.7.2": version: 7.17.9 resolution: "@babel/traverse@npm:7.17.9" dependencies: @@ -1581,6 +2247,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/traverse@npm:7.18.0" + dependencies: + "@babel/code-frame": ^7.16.7 + "@babel/generator": ^7.18.0 + "@babel/helper-environment-visitor": ^7.16.7 + "@babel/helper-function-name": ^7.17.9 + "@babel/helper-hoist-variables": ^7.16.7 + "@babel/helper-split-export-declaration": ^7.16.7 + "@babel/parser": ^7.18.0 + "@babel/types": ^7.18.0 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: b80b49ba5cead42c4b09bdfbe926d94179f884d35319a0a3ab5a798c85f16102a7342799fac928b3041337ea2c3f5194f17c4a08f611a474de6eea719b640dd4 + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.7, @babel/types@npm:^7.16.0, @babel/types@npm:^7.16.7, @babel/types@npm:^7.16.8, @babel/types@npm:^7.17.0, @babel/types@npm:^7.2.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.7.0, @babel/types@npm:^7.8.3": version: 7.17.0 resolution: "@babel/types@npm:7.17.0" @@ -1591,6 +2275,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.17.12, @babel/types@npm:^7.18.0": + version: 7.18.0 + resolution: "@babel/types@npm:7.18.0" + dependencies: + "@babel/helper-validator-identifier": ^7.16.7 + to-fast-properties: ^2.0.0 + checksum: 151485f94c929171fd6539430c0ae519e8bb67fbc0d856b285328f5e6ecbaf4237b52d7a581b413f5e7b6268d31a4db6ca9bc01372b284b2966aa473fc902f27 + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -1622,12 +2316,12 @@ __metadata: languageName: node linkType: hard -"@bugsnag/browser@npm:^7.16.2": - version: 7.16.2 - resolution: "@bugsnag/browser@npm:7.16.2" +"@bugsnag/browser@npm:^7.16.5": + version: 7.16.5 + resolution: "@bugsnag/browser@npm:7.16.5" dependencies: "@bugsnag/core": ^7.16.1 - checksum: 824572eea20fafa863da944d68c82148187f1de937dbc7612f8acdbf15bfca79f14fc0c4f8ddebb52f3fc11d6ca1a4c960bcf2ad8afd5df9d669fd66cd697ad0 + checksum: 4434c857376a45b92b549a79be97d3a2c8144c4220d0ee6b5866393ecb03d2bc6509ce44df7b53ebfe7397273a41abc6e5d03d96cd18527cface88f11b180dfe languageName: node linkType: hard @@ -1651,13 +2345,13 @@ __metadata: languageName: node linkType: hard -"@bugsnag/js@npm:^7.11.0": - version: 7.16.2 - resolution: "@bugsnag/js@npm:7.16.2" +"@bugsnag/js@npm:^7.16.2": + version: 7.16.5 + resolution: "@bugsnag/js@npm:7.16.5" dependencies: - "@bugsnag/browser": ^7.16.2 + "@bugsnag/browser": ^7.16.5 "@bugsnag/node": ^7.16.2 - checksum: 17f6c3cc7d82d90462423035b1936c84da283b4f7d3828264a5a60e537e446aa2c8ea56702b9042b37ec76b3b7bf36904a9e2fbd3644a8d500db86b585e80eb6 + checksum: 2d8cc5b2e757ada851b2139a3087500b386305d9c3dbdb02d3165b73ce7fe4e8208b471c1a31086441dce28a007169eeb699ccb38e9817a0fbbe32430415640f languageName: node linkType: hard @@ -1943,6 +2637,23 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^1.3.0": + version: 1.3.0 + resolution: "@eslint/eslintrc@npm:1.3.0" + dependencies: + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^9.3.2 + globals: ^13.15.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: a1e734ad31a8b5328dce9f479f185fd4fc83dd7f06c538e1fa457fd8226b89602a55cc6458cd52b29573b01cdfaf42331be8cfc1fec732570086b591f4ed6515 + languageName: node + linkType: hard + "@faker-js/faker@npm:^6.3.1": version: 6.3.1 resolution: "@faker-js/faker@npm:6.3.1" @@ -1957,105 +2668,58 @@ __metadata: languageName: node linkType: hard -"@google-cloud/common@npm:^0.32.0": - version: 0.32.1 - resolution: "@google-cloud/common@npm:0.32.1" +"@google-cloud/paginator@npm:^3.0.7": + version: 3.0.7 + resolution: "@google-cloud/paginator@npm:3.0.7" dependencies: - "@google-cloud/projectify": ^0.3.3 - "@google-cloud/promisify": ^0.4.0 - "@types/request": ^2.48.1 arrify: ^2.0.0 - duplexify: ^3.6.0 - ent: ^2.2.0 extend: ^3.0.2 - google-auth-library: ^3.1.1 - pify: ^4.0.1 - retry-request: ^4.0.0 - teeny-request: ^3.11.3 - checksum: 3e869101b999067c331e980734600dea19f16b691dfafa7de0b94893a8e363e02038510be12a2ab641be6012b19923c8626efebc4a0d062bcd5f833ba7c6e3a4 + checksum: bdecce8a894a0c7f47f13d0e42b2fa142098e1dd34ce571b7216ad624057214baf9066ecf091501b3770da9d7be20b983eda30185c8c6596192cb748f8a0090c languageName: node linkType: hard -"@google-cloud/language@npm:^3.8.0": - version: 3.8.0 - resolution: "@google-cloud/language@npm:3.8.0" - dependencies: - google-gax: ^1.9.0 - checksum: f1fe4911c92e9d6fd224b8a5d6a3c2c0589305b476652a1d04542845953cfe0c2d7aedd7cf9e5429e289259657bb77013d5f2fde0d07346f9f19257cd5386d80 - languageName: node - linkType: hard - -"@google-cloud/paginator@npm:^0.2.0": - version: 0.2.0 - resolution: "@google-cloud/paginator@npm:0.2.0" - dependencies: - arrify: ^1.0.1 - extend: ^3.0.1 - split-array-stream: ^2.0.0 - stream-events: ^1.0.4 - checksum: 83330115111b3a8e8f35f7cd5408e26a0cca7b342651cd9e7d91297ea95b41cd20f55c368520de330f302c26beed7fe82f3e271021c774e7d87e13b14fddfda6 - languageName: node - linkType: hard - -"@google-cloud/projectify@npm:^0.3.3": - version: 0.3.3 - resolution: "@google-cloud/projectify@npm:0.3.3" - checksum: 842c1bb6cfb55e19830d58f68a5b47fa6387c2618dfd0d5b7337e4fa9b492920db16e80c5755a61a841db4cf92615f00d32a234fe7f87c2eabeeab78775af3ec +"@google-cloud/projectify@npm:^2.0.0": + version: 2.1.1 + resolution: "@google-cloud/projectify@npm:2.1.1" + checksum: 4e773269b773068e86df9b4f9119948d9bda770a1be33eeda77a9034d795d8e07718c1f6ee048e1f2329f40f8d2eee7149d7a4692436cfbd3fbea4363fdac05b languageName: node linkType: hard -"@google-cloud/promisify@npm:^0.4.0": - version: 0.4.0 - resolution: "@google-cloud/promisify@npm:0.4.0" - checksum: a140e1b78fe6cf49489023007b6a6cf43e3a6c1422566f6384824d1a93338ecc708a3bd0cb735ac8914e37673fe7a17c69552329b5132c6ebdc36b3552a0c4b5 +"@google-cloud/promisify@npm:^2.0.0": + version: 2.0.4 + resolution: "@google-cloud/promisify@npm:2.0.4" + checksum: 51a9fb6c43e5342d995435b3660afe8d7a498ed65e6f5fef6492cc2ac2b494c1ec89e8f220b8a8e23f1c90334b7db5169c292f0a317e971d57366426a2420247 languageName: node linkType: hard -"@google-cloud/storage@npm:^2.5.0": - version: 2.5.0 - resolution: "@google-cloud/storage@npm:2.5.0" +"@google-cloud/storage@npm:^5.19.3": + version: 5.20.5 + resolution: "@google-cloud/storage@npm:5.20.5" dependencies: - "@google-cloud/common": ^0.32.0 - "@google-cloud/paginator": ^0.2.0 - "@google-cloud/promisify": ^0.4.0 - arrify: ^1.0.0 - async: ^2.0.1 + "@google-cloud/paginator": ^3.0.7 + "@google-cloud/projectify": ^2.0.0 + "@google-cloud/promisify": ^2.0.0 + abort-controller: ^3.0.0 + arrify: ^2.0.0 + async-retry: ^1.3.3 compressible: ^2.0.12 - concat-stream: ^2.0.0 - date-and-time: ^0.6.3 - duplexify: ^3.5.0 - extend: ^3.0.0 - gcs-resumable-upload: ^1.0.0 - hash-stream-validation: ^0.2.1 - mime: ^2.2.0 + configstore: ^5.0.0 + duplexify: ^4.0.0 + ent: ^2.2.0 + extend: ^3.0.2 + gaxios: ^4.0.0 + google-auth-library: ^7.14.1 + hash-stream-validation: ^0.2.2 + mime: ^3.0.0 mime-types: ^2.0.8 - onetime: ^5.1.0 - pumpify: ^1.5.1 - snakeize: ^0.1.0 - stream-events: ^1.0.1 - teeny-request: ^3.11.3 - through2: ^3.0.0 - xdg-basedir: ^3.0.0 - checksum: 2be3d9146913eb57a4523197698d91d519426e5545f2dff27f2894c90b9817ea408d58d8a95728779faf072590ef25e954cb08b1c208963060ca82e450ed681b - languageName: node - linkType: hard - -"@grpc/grpc-js@npm:~1.3.6": - version: 1.3.8 - resolution: "@grpc/grpc-js@npm:1.3.8" - dependencies: - "@types/node": ">=12.12.47" - checksum: 12df94227d99ce410dd146f31a27dc34b5dbcbbea6190fd9604ace8d902ce5614272054cead9ddf0ed6db4562ea5bdccf593d71905a23ab1125686d2125d4cd5 - languageName: node - linkType: hard - -"@grpc/proto-loader@npm:^0.5.1": - version: 0.5.6 - resolution: "@grpc/proto-loader@npm:0.5.6" - dependencies: - lodash.camelcase: ^4.3.0 - protobufjs: ^6.8.6 - checksum: 13fe76d84ab1a516f3dc47d06df4dd682f6f1515a7a4aa3f8cddcc8f8256f33cbf529bd0b6729946f548f7459acfcd9b5b026c10572e21d40213a358115658b5 + p-limit: ^3.0.1 + pumpify: ^2.0.0 + retry-request: ^4.2.2 + stream-events: ^1.0.4 + teeny-request: ^7.1.3 + uuid: ^8.0.0 + xdg-basedir: ^4.0.0 + checksum: 9c990134014ad83903df4b6bd30d75933cd65b5c9e64aa3535d339f99f159b147264e5423bd2054bb4d9ead55f9a2d7e011fac8c144d47e633a6001a1e480f61 languageName: node linkType: hard @@ -2374,7 +3038,7 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^27.2.5, @jest/types@npm:^27.5.1": +"@jest/types@npm:^27.5.1": version: 27.5.1 resolution: "@jest/types@npm:27.5.1" dependencies: @@ -2387,6 +3051,17 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.0": + version: 0.3.1 + resolution: "@jridgewell/gen-mapping@npm:0.3.1" + dependencies: + "@jridgewell/set-array": ^1.0.0 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: e9e7bb3335dea9e60872089761d4e8e089597360cdb1af90370e9d53b7d67232c1e0a3ab65fbfef4fc785745193fbc56bff9f3a6cab6c6ce3f15e12b4191f86b + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:^3.0.3": version: 3.0.5 resolution: "@jridgewell/resolve-uri@npm:3.0.5" @@ -2394,6 +3069,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/set-array@npm:^1.0.0": + version: 1.1.1 + resolution: "@jridgewell/set-array@npm:1.1.1" + checksum: cc5d91e0381c347e3edee4ca90b3c292df9e6e55f29acbe0dd97de8651b4730e9ab761406fd572effa79972a0edc55647b627f8c72315e276d959508853d9bf2 + languageName: node + linkType: hard + "@jridgewell/sourcemap-codec@npm:^1.4.10": version: 1.4.11 resolution: "@jridgewell/sourcemap-codec@npm:1.4.11" @@ -2411,6 +3093,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.13 + resolution: "@jridgewell/trace-mapping@npm:0.3.13" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: e38254e830472248ca10a6ed1ae75af5e8514f0680245a5e7b53bc3c030fd8691d4d3115d80595b45d3badead68269769ed47ecbbdd67db1343a11f05700e75a + languageName: node + linkType: hard + "@juggle/resize-observer@npm:^3.3.1": version: 3.3.1 resolution: "@juggle/resize-observer@npm:3.3.1" @@ -3296,47 +3988,15 @@ __metadata: languageName: node linkType: hard -"@playwright/test@npm:^1.21.0": - version: 1.21.0 - resolution: "@playwright/test@npm:1.21.0" - dependencies: - "@babel/code-frame": 7.16.7 - "@babel/core": 7.16.12 - "@babel/helper-plugin-utils": 7.16.7 - "@babel/plugin-proposal-class-properties": 7.16.7 - "@babel/plugin-proposal-dynamic-import": 7.16.7 - "@babel/plugin-proposal-export-namespace-from": 7.16.7 - "@babel/plugin-proposal-logical-assignment-operators": 7.16.7 - "@babel/plugin-proposal-nullish-coalescing-operator": 7.16.7 - "@babel/plugin-proposal-numeric-separator": 7.16.7 - "@babel/plugin-proposal-optional-chaining": 7.16.7 - "@babel/plugin-proposal-private-methods": 7.16.11 - "@babel/plugin-proposal-private-property-in-object": 7.16.7 - "@babel/plugin-syntax-async-generators": 7.8.4 - "@babel/plugin-syntax-json-strings": 7.8.3 - "@babel/plugin-syntax-object-rest-spread": 7.8.3 - "@babel/plugin-syntax-optional-catch-binding": 7.8.3 - "@babel/plugin-transform-modules-commonjs": 7.16.8 - "@babel/preset-typescript": 7.16.7 - colors: 1.4.0 - commander: 8.3.0 - debug: 4.3.3 - expect: 27.2.5 - jest-matcher-utils: 27.2.5 - json5: 2.2.1 - mime: 3.0.0 - minimatch: 3.0.4 - ms: 2.1.3 - open: 8.4.0 - pirates: 4.0.4 - playwright-core: 1.21.0 - rimraf: 3.0.2 - source-map-support: 0.4.18 - stack-utils: 2.0.5 - yazl: 2.5.1 +"@playwright/test@npm:^1.21.1": + version: 1.22.2 + resolution: "@playwright/test@npm:1.22.2" + dependencies: + "@types/node": "*" + playwright-core: 1.22.2 bin: playwright: cli.js - checksum: 76287961599fb53760960e19fc02392f61fdb137e7fa755661d2f560e4c2940c688206401ee42f2bf711eb68e71b1e03b85bb2e3181046487e3ef37f9ce33f69 + checksum: 55392a97d920b77374926415e16e649320a9d8243f4ddca09c61827580674ad6f50057c09d5d194212d4ce60abc2cdf5f939ddd87f3670e073e9dd6c418480d5 languageName: node linkType: hard @@ -3447,79 +4107,6 @@ __metadata: languageName: node linkType: hard -"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": - version: 1.1.2 - resolution: "@protobufjs/aspromise@npm:1.1.2" - checksum: 011fe7ef0826b0fd1a95935a033a3c0fd08483903e1aa8f8b4e0704e3233406abb9ee25350ec0c20bbecb2aad8da0dcea58b392bbd77d6690736f02c143865d2 - languageName: node - linkType: hard - -"@protobufjs/base64@npm:^1.1.2": - version: 1.1.2 - resolution: "@protobufjs/base64@npm:1.1.2" - checksum: 67173ac34de1e242c55da52c2f5bdc65505d82453893f9b51dc74af9fe4c065cf4a657a4538e91b0d4a1a1e0a0642215e31894c31650ff6e3831471061e1ee9e - languageName: node - linkType: hard - -"@protobufjs/codegen@npm:^2.0.4": - version: 2.0.4 - resolution: "@protobufjs/codegen@npm:2.0.4" - checksum: 59240c850b1d3d0b56d8f8098dd04787dcaec5c5bd8de186fa548de86b86076e1c50e80144b90335e705a044edf5bc8b0998548474c2a10a98c7e004a1547e4b - languageName: node - linkType: hard - -"@protobufjs/eventemitter@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/eventemitter@npm:1.1.0" - checksum: 0369163a3d226851682f855f81413cbf166cd98f131edb94a0f67f79e75342d86e89df9d7a1df08ac28be2bc77e0a7f0200526bb6c2a407abbfee1f0262d5fd7 - languageName: node - linkType: hard - -"@protobufjs/fetch@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/fetch@npm:1.1.0" - dependencies: - "@protobufjs/aspromise": ^1.1.1 - "@protobufjs/inquire": ^1.1.0 - checksum: 3fce7e09eb3f1171dd55a192066450f65324fd5f7cc01a431df01bb00d0a895e6bfb5b0c5561ce157ee1d886349c90703d10a4e11a1a256418ff591b969b3477 - languageName: node - linkType: hard - -"@protobufjs/float@npm:^1.0.2": - version: 1.0.2 - resolution: "@protobufjs/float@npm:1.0.2" - checksum: 5781e1241270b8bd1591d324ca9e3a3128d2f768077a446187a049e36505e91bc4156ed5ac3159c3ce3d2ba3743dbc757b051b2d723eea9cd367bfd54ab29b2f - languageName: node - linkType: hard - -"@protobufjs/inquire@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/inquire@npm:1.1.0" - checksum: ca06f02eaf65ca36fb7498fc3492b7fc087bfcc85c702bac5b86fad34b692bdce4990e0ef444c1e2aea8c034227bd1f0484be02810d5d7e931c55445555646f4 - languageName: node - linkType: hard - -"@protobufjs/path@npm:^1.1.2": - version: 1.1.2 - resolution: "@protobufjs/path@npm:1.1.2" - checksum: 856eeb532b16a7aac071cacde5c5620df800db4c80cee6dbc56380524736205aae21e5ae47739114bf669ab5e8ba0e767a282ad894f3b5e124197cb9224445ee - languageName: node - linkType: hard - -"@protobufjs/pool@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/pool@npm:1.1.0" - checksum: d6a34fbbd24f729e2a10ee915b74e1d77d52214de626b921b2d77288bd8f2386808da2315080f2905761527cceffe7ec34c7647bd21a5ae41a25e8212ff79451 - languageName: node - linkType: hard - -"@protobufjs/utf8@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/utf8@npm:1.1.0" - checksum: f9bf3163d13aaa3b6f5e6fbf37a116e094ea021c0e1f2a7ccd0e12a29e2ce08dafba4e8b36e13f8ed7397e1591610ce880ed1289af4d66cf4ace8a36a9557278 - languageName: node - linkType: hard - "@react-spring/animated@npm:~9.2.0, @react-spring/animated@npm:~9.2.6-beta.0": version: 9.2.6 resolution: "@react-spring/animated@npm:9.2.6" @@ -3586,6 +4173,62 @@ __metadata: languageName: node linkType: hard +"@redis/bloom@npm:1.0.2": + version: 1.0.2 + resolution: "@redis/bloom@npm:1.0.2" + peerDependencies: + "@redis/client": ^1.0.0 + checksum: 4872e7e5e4ff03d63349ca88d3164d487f62805651ada91924de2592995993401c98a01cb93bff8d71e9a2e54985b2485b6cb0e084a7e8b1283e2ebb8bc4b833 + languageName: node + linkType: hard + +"@redis/client@npm:1.1.0": + version: 1.1.0 + resolution: "@redis/client@npm:1.1.0" + dependencies: + cluster-key-slot: 1.1.0 + generic-pool: 3.8.2 + yallist: 4.0.0 + checksum: 4f1f4a079eeb49e29e381f00be7da6ca606e8b744878e9b2e90a5800b902cdba6a631b10a7be4ed6a740d6fa4282f055c0d6d89e44eea5cbcaa8e2da10b397fc + languageName: node + linkType: hard + +"@redis/graph@npm:1.0.1": + version: 1.0.1 + resolution: "@redis/graph@npm:1.0.1" + peerDependencies: + "@redis/client": ^1.0.0 + checksum: 72e485efa416bdff10420f6e13c9cb4e1e5c70752e5172717adf62fc1d4d9ba12e708229fd87876f3a93270ff74c4bcd4d916987438dc36a94f7f12c9785fa44 + languageName: node + linkType: hard + +"@redis/json@npm:1.0.3": + version: 1.0.3 + resolution: "@redis/json@npm:1.0.3" + peerDependencies: + "@redis/client": ^1.0.0 + checksum: 26a7003c2fbacfa5998671e3a301cb2285432bf90f237adedcf76c0be0d379528e6710d469a8ea93c04bbd22951f9c2f41d460dbd79e85856f199248c4a250d5 + languageName: node + linkType: hard + +"@redis/search@npm:1.0.6": + version: 1.0.6 + resolution: "@redis/search@npm:1.0.6" + peerDependencies: + "@redis/client": ^1.0.0 + checksum: 5c776143520b11ae2e49a05e7fe3df514a01460f2be90759b15e4f097bf4a985784c48c2184ac2c275ced3ec5a0c77b208a4d46a50161d1ad6025e3ab2990aa7 + languageName: node + linkType: hard + +"@redis/time-series@npm:1.0.3": + version: 1.0.3 + resolution: "@redis/time-series@npm:1.0.3" + peerDependencies: + "@redis/client": ^1.0.0 + checksum: 4d11518185dd15f31c5b4a433902e53a3ebc24614a0221080ab12abf4f6fc60b3db00a71a83de7b4b10f11077de611dc1c273274573646d63481d40ca246f82d + languageName: node + linkType: hard + "@rocket.chat/apps-engine@npm:^1.31.0": version: 1.31.0 resolution: "@rocket.chat/apps-engine@npm:1.31.0" @@ -3624,9 +4267,9 @@ __metadata: "@rocket.chat/message-parser": next "@rocket.chat/ui-kit": ^0.31.6 "@types/mongodb": ^3.6.10 - eslint: ^8.12.0 + eslint: ^8.14.0 prettier: ^2.6.2 - typescript: ~4.3.5 + typescript: ~4.3.4 languageName: unknown linkType: soft @@ -4063,23 +4706,22 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/meteor@workspace:apps/meteor" dependencies: - "@babel/core": ^7.14.6 - "@babel/plugin-proposal-nullish-coalescing-operator": ^7.14.5 - "@babel/plugin-proposal-optional-chaining": ^7.14.5 - "@babel/preset-env": ^7.14.7 - "@babel/preset-react": ^7.14.5 - "@babel/register": ^7.14.5 - "@babel/runtime": ^7.15.4 - "@bugsnag/js": ^7.11.0 + "@babel/core": ^7.17.9 + "@babel/plugin-proposal-nullish-coalescing-operator": ^7.16.7 + "@babel/plugin-proposal-optional-chaining": ^7.16.7 + "@babel/preset-env": ^7.16.11 + "@babel/preset-react": ^7.16.7 + "@babel/register": ^7.17.7 + "@babel/runtime": ^7.17.9 + "@bugsnag/js": ^7.16.2 "@faker-js/faker": ^6.3.1 - "@google-cloud/language": ^3.8.0 - "@google-cloud/storage": ^2.5.0 + "@google-cloud/storage": ^5.19.3 "@nivo/bar": 0.73.1 "@nivo/core": 0.73.0 "@nivo/heatmap": 0.73.0 "@nivo/line": 0.62.0 "@nivo/pie": 0.73.0 - "@playwright/test": ^1.21.0 + "@playwright/test": ^1.21.1 "@rocket.chat/apps-engine": alpha "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/css-in-js": ~0.31.12 @@ -4105,13 +4747,14 @@ __metadata: "@rocket.chat/ui-kit": ~0.31.12 "@settlin/spacebars-loader": ^1.0.9 "@slack/client": ^4.12.0 - "@storybook/addon-essentials": ~6.4.19 - "@storybook/addon-interactions": ~6.4.19 + "@slack/rtm-api": ^6.0.0 + "@storybook/addon-essentials": ~6.4.22 + "@storybook/addon-interactions": ~6.4.22 "@storybook/addon-postcss": ^2.0.0 - "@storybook/addons": ~6.4.19 - "@storybook/react": ~6.4.19 - "@storybook/testing-library": 0.0.9 - "@testing-library/react": ~12.1.4 + "@storybook/addons": ~6.4.22 + "@storybook/react": ~6.4.22 + "@storybook/testing-library": 0.0.11 + "@testing-library/react": ~12.1.5 "@testing-library/user-event": ^13.5.0 "@types/adm-zip": ^0.4.34 "@types/agenda": ^2.0.9 @@ -4120,13 +4763,13 @@ __metadata: "@types/body-parser": ^1.19.0 "@types/chai": ^4.2.22 "@types/chai-datetime": 0.0.37 - "@types/chai-dom": 0.0.11 + "@types/chai-dom": 0.0.12 "@types/chai-spies": ^1.0.3 "@types/clipboard": ^2.0.7 - "@types/cookie": ^0.4.1 + "@types/cookie": ^0.5.1 "@types/cookie-parser": ^1.4.2 "@types/dompurify": ^2.2.2 - "@types/ejson": ^2.1.3 + "@types/ejson": ^2.2.0 "@types/express": ^4.17.12 "@types/fibers": ^3.1.1 "@types/google-libphonenumber": ^7.4.21 @@ -4136,18 +4779,18 @@ __metadata: "@types/jsrsasign": ^9.0.3 "@types/ldapjs": ^2.2.1 "@types/less": ^3.0.2 - "@types/lodash": ^4.14.177 + "@types/lodash": ^4.14.182 "@types/lodash.debounce": ^4.0.6 "@types/lodash.get": ^4.4.6 "@types/mailparser": ^3.4.0 "@types/marked": ^1.2.2 - "@types/meteor": 1.4.81 - "@types/mkdirp": ^1.0.1 + "@types/meteor": 2.0.4 + "@types/mkdirp": ^1.0.2 "@types/mocha": ^8.2.3 "@types/mock-require": ^2.0.1 "@types/moment-timezone": ^0.5.30 "@types/mongodb": ^3.6.10 - "@types/node": ^14.18.12 + "@types/node": ^14.18.15 "@types/node-rsa": ^1.1.1 "@types/nodemailer": ^6.4.4 "@types/parseurl": ^1.3.1 @@ -4157,8 +4800,8 @@ __metadata: "@types/react": ~17.0.42 "@types/react-dom": ~17.0.14 "@types/rewire": ^2.5.28 - "@types/semver": ^7.3.6 - "@types/sharp": ^0.29.4 + "@types/semver": ^7.3.9 + "@types/sharp": ^0.30.2 "@types/speakeasy": ^2.0.7 "@types/string-strip-html": ^5.0.0 "@types/supertest": ^2.0.11 @@ -4166,23 +4809,23 @@ __metadata: "@types/ua-parser-js": ^0.7.36 "@types/underscore.string": 0.0.38 "@types/use-subscription": ^1.0.0 - "@types/uuid": ^8.3.1 + "@types/uuid": ^8.3.4 "@types/xml-crypto": ^1.4.1 "@types/xmldom": ^0.1.30 "@typescript-eslint/eslint-plugin": ^2.34.0 "@typescript-eslint/parser": ^3.0.0 adm-zip: 0.5.9 agenda: "https://github.com/RocketChat/agenda#c2cfcc532b8409561104dca980e6adbbcbdf5442" - ajv: ^8.7.1 + ajv: ^8.11.0 apn: 2.2.0 archiver: ^3.1.1 asterisk-manager: ^0.2.0 atlassian-crowd-patched: ^0.5.1 - autolinker: ^3.14.3 - autoprefixer: ^9 - aws-sdk: ^2.1119.0 + autolinker: ^3.15.0 + autoprefixer: ^9.8.8 + aws-sdk: ^2.1121.0 babel-eslint: ^10.1.0 - babel-loader: ^8.2.2 + babel-loader: ^8.2.5 babel-plugin-array-includes: ^2.0.3 bad-words: ^3.0.4 bcrypt: ^5.0.1 @@ -4197,17 +4840,17 @@ __metadata: chai-dom: ^1.11.0 chai-spies: ^1.0.0 change-case: ^4.1.2 - chart.js: ^2.9.4 + chart.js: ^3.7.1 clipboard: ^2.0.10 codemirror: ^5.65.3 - colorette: ^1.4.0 + colorette: ^2.0.16 connect: ^3.7.0 - cookie: ^0.4.2 + cookie: ^0.5.0 cookie-parser: ^1.4.6 cors: ^2.8.5 cross-env: ^7.0.3 css-vars-ponyfill: ^2.4.7 - csv-parse: ^4.16.3 + csv-parse: ^5.0.4 cypress: ^7.7.0 cypress-real-events: ^1.7.0 cypress-wait-until: ^1.7.2 @@ -4218,13 +4861,13 @@ __metadata: emojione: ^4.5.0 emojione-assets: ^4.5.0 eslint: ^6.8.0 - eslint-config-prettier: ^8.3.0 + eslint-config-prettier: ^8.5.0 eslint-plugin-anti-trojan-source: ^1.1.0 - eslint-plugin-import: ^2.24.2 + eslint-plugin-import: ^2.26.0 eslint-plugin-prettier: ^3.4.1 - eslint-plugin-react: ^7.24.0 - eslint-plugin-react-hooks: ^4.2.0 - eslint-plugin-testing-library: ^5.0.0 + eslint-plugin-react: ^7.29.4 + eslint-plugin-react-hooks: ^4.4.0 + eslint-plugin-testing-library: ^5.3.1 eventemitter3: ^4.0.7 exif-be-gone: ^1.2.2 express: ^4.17.3 @@ -4233,7 +4876,7 @@ __metadata: fastq: ^1.13.0 fflate: ^0.7.3 fibers: ^5.0.1 - file-type: ^10.11.0 + file-type: ^16.5.3 filenamify: ^4.3.0 filesize: ^3.6.1 google-libphonenumber: ^3.2.27 @@ -4243,7 +4886,7 @@ __metadata: he: ^1.2.0 highlight.js: ^9.18.5 http-proxy-agent: ^5.0.0 - i18next: ^20.3.2 + i18next: ^20.6.1 i18next-http-backend: ^1.4.0 iconv-lite: ^0.6.3 image-size: ^1.0.1 @@ -4254,7 +4897,7 @@ __metadata: jschardet: ^3.0.0 jsdom: ^16.7.0 jsdom-global: ^3.0.2 - jsrsasign: ^10.5.18 + jsrsasign: ^10.5.19 juice: ^8.0.0 katex: ^0.11.1 ldap-escape: ^2.0.6 @@ -4269,27 +4912,27 @@ __metadata: mailparser: ^3.4.0 marked: ^0.7.0 mem: ^8.1.1 - meteor-node-stubs: ^1.1.0 - mime-db: ^1.48.0 - mime-type: ^3.1.0 - mkdirp: ^0.5.6 - mocha: ^9.1.3 + meteor-node-stubs: ^1.2.1 + mime-db: ^1.52.0 + mime-type: ^4.0.0 + mkdirp: ^1.0.4 + mocha: ^9.2.2 mock-require: ^3.0.3 moleculer: ^0.14.20 moment: ^2.29.1 moment-timezone: ^0.5.34 mongodb: ^3.6.10 mongodb-memory-server: ^7.6.3 - nats: ^2.4.0 + nats: ^2.6.1 node-dogstatsd: ^0.0.7 - node-gcm: 1.0.0 + node-gcm: 1.0.5 node-rsa: ^1.1.1 nodemailer: ^6.7.3 object-path: ^0.11.8 outdent: ~0.8.0 path: ^0.12.7 path-to-regexp: ^6.2.0 - pdfjs-dist: ^2.8.335 + pdfjs-dist: ^2.13.216 photoswipe: ^4.1.3 pino: ^7.10.0 pino-pretty: ^7.6.1 @@ -4297,13 +4940,13 @@ __metadata: postcss: ~8.4.12 postcss-custom-properties: ^11.0.0 postcss-easy-import: ^3.0.0 - postcss-load-config: ^3.1.0 + postcss-load-config: ^3.1.4 postcss-media-minmax: ^5.0.0 postcss-nested: ^5.0.6 postcss-url: ^10.1.3 postis: ^2.2.0 prettier: 2.6.2 - prom-client: ^12.0.0 + prom-client: ^14.0.1 prometheus-gc-stats: ^0.6.3 proxy-from-env: ^1.1.0 psl: ^1.8.0 @@ -4316,40 +4959,40 @@ __metadata: react-keyed-flatten-children: ^1.3.0 react-query: ^3.38.0 react-virtuoso: ^1.11.1 - redis: ^2.8.0 - rewire: ^5.0.0 - semver: ^5.7.1 - sharp: ^0.29.3 + redis: ^4.0.6 + rewire: ^6.0.0 + semver: ^7.3.7 + sharp: ^0.30.4 sip.js: ^0.20.0 sodium-native: ^3.3.0 sodium-plus: ^0.9.0 - source-map: ^0.5.7 + source-map: ^0.7.3 speakeasy: ^2.0.0 stream-buffers: ^3.0.2 string-strip-html: ^7.0.3 stylelint: ^13.13.1 stylelint-order: ^4.1.0 - supertest: ^6.1.6 + supertest: ^6.2.2 tar-stream: ^1.6.2 template-file: ^6.0.1 tinykeys: ^1.4.0 toastr: ^2.1.4 - ts-node: ^10.0.0 - turndown: ^5.0.3 + ts-node: ^10.7.0 + turndown: ^7.1.1 twilio: ^3.76.1 twit: ^2.2.11 typescript: ~4.3.4 ua-parser-js: ^1.0.2 - underscore: ^1.13.2 + underscore: ^1.13.3 underscore.string: ^3.3.6 universal-perf-hooks: ^1.0.1 url-polyfill: ^1.1.12 use-subscription: ~1.6.0 - uuid: ^3.4.0 - webdav: ^2.10.2 - webpack: ^4.44.1 + uuid: ^8.3.2 + webdav: ^4.9.0 + webpack: ^4.46.0 xml-crypto: ^2.1.3 - xml-encryption: 0.11.2 + xml-encryption: 2.0.0 xml2js: 0.4.23 xmldom: ^0.6.0 yaqrcode: ^0.2.1 @@ -4398,10 +5041,10 @@ __metadata: "@types/jest": ^27.4.1 "@types/mongodb": ^3.6.10 ajv: ^8.11.0 - eslint: ^8.12.0 + eslint: ^8.14.0 jest: ^27.5.1 ts-jest: ^27.1.4 - typescript: ~4.3.5 + typescript: ~4.3.4 languageName: unknown linkType: soft @@ -4608,6 +5251,58 @@ __metadata: languageName: node linkType: hard +"@slack/logger@npm:>=1.0.0 <3.0.0": + version: 2.0.0 + resolution: "@slack/logger@npm:2.0.0" + dependencies: + "@types/node": ">=8.9.0" + checksum: 283be1c5db9c2c32f0dcf001ade7c1ab1c0880e4edd13e017527cccb79683cb4ed79a8b5cdd792a5a342cdf63b03a61ca0901d22b141b11235da2b340adbc338 + languageName: node + linkType: hard + +"@slack/rtm-api@npm:^6.0.0": + version: 6.0.0 + resolution: "@slack/rtm-api@npm:6.0.0" + dependencies: + "@slack/logger": ">=1.0.0 <3.0.0" + "@slack/web-api": ^5.3.0 + "@types/node": ">=12.0.0" + "@types/p-queue": ^2.3.2 + "@types/ws": ^7.2.5 + eventemitter3: ^3.1.0 + finity: ^0.5.4 + p-cancelable: ^1.1.0 + p-queue: ^2.4.2 + ws: ^5.2.0 + checksum: c12ec88286b5609961cf27af159bde7570e914b793c405922658e8855310655c86790235897302e0099b916939b4121035ba69f708e414c88422f974e216674d + languageName: node + linkType: hard + +"@slack/types@npm:^1.7.0": + version: 1.10.0 + resolution: "@slack/types@npm:1.10.0" + checksum: 9dcf254ad4882146de7ed2db948e7ee56614c3aca47a1df7cbbf4faebe6f2672a704239c0c259b4825be140bd8bb97d994241f35dc432b9ca722333828dac666 + languageName: node + linkType: hard + +"@slack/web-api@npm:^5.3.0": + version: 5.15.0 + resolution: "@slack/web-api@npm:5.15.0" + dependencies: + "@slack/logger": ">=1.0.0 <3.0.0" + "@slack/types": ^1.7.0 + "@types/is-stream": ^1.1.0 + "@types/node": ">=8.9.0" + axios: ^0.21.1 + eventemitter3: ^3.1.0 + form-data: ^2.5.0 + is-stream: ^1.1.0 + p-queue: ^6.6.1 + p-retry: ^4.0.0 + checksum: c0500b88f9acd3c0581b1e7c51bc4edf013db93ec81f0fc7bed878be1a2710722ac9ccc35a4198e0d86ec64f4b733de0a622d759cfe7e1de493c46dcc41985b5 + languageName: node + linkType: hard + "@storybook/addon-actions@npm:6.4.22, @storybook/addon-actions@npm:^6.0.12": version: 6.4.22 resolution: "@storybook/addon-actions@npm:6.4.22" @@ -4797,7 +5492,7 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-essentials@npm:^6.0.16, @storybook/addon-essentials@npm:~6.4.19": +"@storybook/addon-essentials@npm:^6.0.16, @storybook/addon-essentials@npm:~6.4.22": version: 6.4.22 resolution: "@storybook/addon-essentials@npm:6.4.22" dependencies: @@ -4841,18 +5536,18 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-interactions@npm:~6.4.19": - version: 6.4.20 - resolution: "@storybook/addon-interactions@npm:6.4.20" +"@storybook/addon-interactions@npm:~6.4.22": + version: 6.4.22 + resolution: "@storybook/addon-interactions@npm:6.4.22" dependencies: - "@storybook/addons": 6.4.20 - "@storybook/api": 6.4.20 - "@storybook/components": 6.4.20 - "@storybook/core-common": 6.4.20 - "@storybook/core-events": 6.4.20 + "@storybook/addons": 6.4.22 + "@storybook/api": 6.4.22 + "@storybook/components": 6.4.22 + "@storybook/core-common": 6.4.22 + "@storybook/core-events": 6.4.22 "@storybook/csf": 0.0.2--canary.87bc651.0 - "@storybook/instrumenter": 6.4.20 - "@storybook/theming": 6.4.20 + "@storybook/instrumenter": 6.4.22 + "@storybook/theming": 6.4.22 global: ^4.4.0 jest-mock: ^27.0.6 polished: ^4.0.5 @@ -4865,7 +5560,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 4b716cf42b2d959991bd3cf7e387cd9deb5e73f8df883aa9aba5588e3469d4a37b4db812539f0743ad5c5e0fe39f5228b1124184229ca284b69649589852f7fb + checksum: 560fd9932f111efeb25c0c76d82e477e07c96530b51d47898a1572e002f1c0143ec0da1c1136ed46d7770b6f9df2b0305df80d0ab272f323cfecd67078c779b6 languageName: node linkType: hard @@ -5035,7 +5730,7 @@ __metadata: languageName: node linkType: hard -"@storybook/addons@npm:6.4.22, @storybook/addons@npm:~6.4.19": +"@storybook/addons@npm:6.4.22, @storybook/addons@npm:~6.4.22": version: 6.4.22 resolution: "@storybook/addons@npm:6.4.22" dependencies: @@ -5297,41 +5992,6 @@ __metadata: languageName: node linkType: hard -"@storybook/components@npm:6.4.20": - version: 6.4.20 - resolution: "@storybook/components@npm:6.4.20" - dependencies: - "@popperjs/core": ^2.6.0 - "@storybook/client-logger": 6.4.20 - "@storybook/csf": 0.0.2--canary.87bc651.0 - "@storybook/theming": 6.4.20 - "@types/color-convert": ^2.0.0 - "@types/overlayscrollbars": ^1.12.0 - "@types/react-syntax-highlighter": 11.0.5 - color-convert: ^2.0.1 - core-js: ^3.8.2 - fast-deep-equal: ^3.1.3 - global: ^4.4.0 - lodash: ^4.17.21 - markdown-to-jsx: ^7.1.3 - memoizerific: ^1.11.3 - overlayscrollbars: ^1.13.1 - polished: ^4.0.5 - prop-types: ^15.7.2 - react-colorful: ^5.1.2 - react-popper-tooltip: ^3.1.1 - react-syntax-highlighter: ^13.5.3 - react-textarea-autosize: ^8.3.0 - regenerator-runtime: ^0.13.7 - ts-dedent: ^2.0.0 - util-deprecate: ^1.0.2 - peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - checksum: 954a79364060cfe3d008ee44ff6a8c903eea98259f21bb3bb2395aa6e7d0da459e233ea660cbe2644309220a9946b8f132d33554cfd54952e1e677f423d83a99 - languageName: node - linkType: hard - "@storybook/components@npm:6.4.22": version: 6.4.22 resolution: "@storybook/components@npm:6.4.22" @@ -5402,69 +6062,6 @@ __metadata: languageName: node linkType: hard -"@storybook/core-common@npm:6.4.20": - version: 6.4.20 - resolution: "@storybook/core-common@npm:6.4.20" - dependencies: - "@babel/core": ^7.12.10 - "@babel/plugin-proposal-class-properties": ^7.12.1 - "@babel/plugin-proposal-decorators": ^7.12.12 - "@babel/plugin-proposal-export-default-from": ^7.12.1 - "@babel/plugin-proposal-nullish-coalescing-operator": ^7.12.1 - "@babel/plugin-proposal-object-rest-spread": ^7.12.1 - "@babel/plugin-proposal-optional-chaining": ^7.12.7 - "@babel/plugin-proposal-private-methods": ^7.12.1 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - "@babel/plugin-transform-arrow-functions": ^7.12.1 - "@babel/plugin-transform-block-scoping": ^7.12.12 - "@babel/plugin-transform-classes": ^7.12.1 - "@babel/plugin-transform-destructuring": ^7.12.1 - "@babel/plugin-transform-for-of": ^7.12.1 - "@babel/plugin-transform-parameters": ^7.12.1 - "@babel/plugin-transform-shorthand-properties": ^7.12.1 - "@babel/plugin-transform-spread": ^7.12.1 - "@babel/preset-env": ^7.12.11 - "@babel/preset-react": ^7.12.10 - "@babel/preset-typescript": ^7.12.7 - "@babel/register": ^7.12.1 - "@storybook/node-logger": 6.4.20 - "@storybook/semver": ^7.3.2 - "@types/node": ^14.0.10 - "@types/pretty-hrtime": ^1.0.0 - babel-loader: ^8.0.0 - babel-plugin-macros: ^3.0.1 - babel-plugin-polyfill-corejs3: ^0.1.0 - chalk: ^4.1.0 - core-js: ^3.8.2 - express: ^4.17.1 - file-system-cache: ^1.0.5 - find-up: ^5.0.0 - fork-ts-checker-webpack-plugin: ^6.0.4 - fs-extra: ^9.0.1 - glob: ^7.1.6 - handlebars: ^4.7.7 - interpret: ^2.2.0 - json5: ^2.1.3 - lazy-universal-dotenv: ^3.0.1 - picomatch: ^2.3.0 - pkg-dir: ^5.0.0 - pretty-hrtime: ^1.0.3 - resolve-from: ^5.0.0 - slash: ^3.0.0 - telejson: ^5.3.2 - ts-dedent: ^2.0.0 - util-deprecate: ^1.0.2 - webpack: 4 - peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: e15bdbc46b766bd8d554e3a942e6fa0b685e8a83936d60d31b0700b473f0927563101549b849aacc9c2fa0dfee4c4648b7532a57711833e2569c539e58036d12 - languageName: node - linkType: hard - "@storybook/core-common@npm:6.4.22": version: 6.4.22 resolution: "@storybook/core-common@npm:6.4.22" @@ -5662,7 +6259,19 @@ __metadata: languageName: node linkType: hard -"@storybook/instrumenter@npm:6.4.20, @storybook/instrumenter@npm:^6.4.0 || >=6.5.0-0": +"@storybook/instrumenter@npm:6.4.22": + version: 6.4.22 + resolution: "@storybook/instrumenter@npm:6.4.22" + dependencies: + "@storybook/addons": 6.4.22 + "@storybook/client-logger": 6.4.22 + "@storybook/core-events": 6.4.22 + global: ^4.4.0 + checksum: 27b613ea7d575c2af18bb4e40cffeadfa2dfa8988e0437053a7078e985cc5a906d690ab3cc56c57c8546db287ad8b2b52d84bccf479116ae445564564a475743 + languageName: node + linkType: hard + +"@storybook/instrumenter@npm:^6.4.0 || >=6.5.0-0": version: 6.4.20 resolution: "@storybook/instrumenter@npm:6.4.20" dependencies: @@ -5724,19 +6333,6 @@ __metadata: languageName: node linkType: hard -"@storybook/node-logger@npm:6.4.20": - version: 6.4.20 - resolution: "@storybook/node-logger@npm:6.4.20" - dependencies: - "@types/npmlog": ^4.1.2 - chalk: ^4.1.0 - core-js: ^3.8.2 - npmlog: ^5.0.1 - pretty-hrtime: ^1.0.3 - checksum: 06c79cfa718363617ab96435a264ec935ce7764af472a99191673be50bc03a1d70e938b9370742ef6e0d6a26a1ed674224fcf8261889182bd098c13fb1f02487 - languageName: node - linkType: hard - "@storybook/node-logger@npm:6.4.22, @storybook/node-logger@npm:^6.1.14": version: 6.4.22 resolution: "@storybook/node-logger@npm:6.4.22" @@ -5804,7 +6400,7 @@ __metadata: languageName: node linkType: hard -"@storybook/react@npm:^6.0.12, @storybook/react@npm:~6.4.19": +"@storybook/react@npm:^6.0.12, @storybook/react@npm:~6.4.22": version: 6.4.22 resolution: "@storybook/react@npm:6.4.22" dependencies: @@ -5968,16 +6564,16 @@ __metadata: languageName: node linkType: hard -"@storybook/testing-library@npm:0.0.9": - version: 0.0.9 - resolution: "@storybook/testing-library@npm:0.0.9" +"@storybook/testing-library@npm:0.0.11": + version: 0.0.11 + resolution: "@storybook/testing-library@npm:0.0.11" dependencies: "@storybook/client-logger": ^6.4.0 || >=6.5.0-0 "@storybook/instrumenter": ^6.4.0 || >=6.5.0-0 "@testing-library/dom": ^8.3.0 "@testing-library/user-event": ^13.2.1 ts-dedent: ^2.2.0 - checksum: 070a545bb9d97bcf2c4aebc6f698af55b3735d463200d4864650b4aff17334f5ed6ece0cebed5dd370d4015999e8875fe8aa08a01a067a1c827573cea457a9ff + checksum: 9d5204e1330cde81811ecacd6fade3246892db45b469a4ac31d906b0d1f330f2a039fa281801f3eb83cf01e67ea429e21d86a92a68ffd2bd0c228d1436affbaa languageName: node linkType: hard @@ -6107,17 +6703,17 @@ __metadata: languageName: node linkType: hard -"@testing-library/react@npm:~12.1.4": - version: 12.1.4 - resolution: "@testing-library/react@npm:12.1.4" +"@testing-library/react@npm:~12.1.5": + version: 12.1.5 + resolution: "@testing-library/react@npm:12.1.5" dependencies: "@babel/runtime": ^7.12.5 "@testing-library/dom": ^8.0.0 - "@types/react-dom": "*" + "@types/react-dom": <18.0.0 peerDependencies: - react: "*" - react-dom: "*" - checksum: 944c5f8d4abb22c0650c25c7ae499651828c37c0e741ff67a4635d4cd99b307d486dabec05b372aba638bd359d29cd2af97393b5055ea294a201d80b4bc384b8 + react: <18.0.0 + react-dom: <18.0.0 + checksum: 4abd0490405e709a7df584a0db604e508a4612398bb1326e8fa32dd9393b15badc826dcf6d2f7525437886d507871f719f127b9860ed69ddd204d1fa834f576a languageName: node linkType: hard @@ -6132,6 +6728,13 @@ __metadata: languageName: node linkType: hard +"@tokenizer/token@npm:^0.3.0": + version: 0.3.0 + resolution: "@tokenizer/token@npm:0.3.0" + checksum: 1d575d02d2a9f0c5a4ca5180635ebd2ad59e0f18b42a65f3d04844148b49b3db35cf00b6012a1af2d59c2ab3caca59451c5689f747ba8667ee586ad717ee58e1 + languageName: node + linkType: hard + "@tootallnate/once@npm:1": version: 1.1.2 resolution: "@tootallnate/once@npm:1.1.2" @@ -6294,13 +6897,6 @@ __metadata: languageName: node linkType: hard -"@types/caseless@npm:*": - version: 0.12.2 - resolution: "@types/caseless@npm:0.12.2" - checksum: 430d15911184ad11e0a8aa21d1ec15fcc93b90b63570c37bf16ebd34457482bfc8de3f5eb6771e0ef986ce183270d4297823b0f492c346255967e78f7292388b - languageName: node - linkType: hard - "@types/chai-datetime@npm:0.0.37": version: 0.0.37 resolution: "@types/chai-datetime@npm:0.0.37" @@ -6310,12 +6906,12 @@ __metadata: languageName: node linkType: hard -"@types/chai-dom@npm:0.0.11": - version: 0.0.11 - resolution: "@types/chai-dom@npm:0.0.11" +"@types/chai-dom@npm:0.0.12": + version: 0.0.12 + resolution: "@types/chai-dom@npm:0.0.12" dependencies: "@types/chai": "*" - checksum: 8be51e358904b087277c9955f10df506c9fb5c8ed8f0e23d25d34b1df411e5943864e9d3f623c99f772abcee7878d2cccdf0c004f8b652c611f3206d67741dd4 + checksum: 60bc19ca03bfc49026690c2d5d8d3153ea50d909b757301da1a81733d8a4e6171b2af3eeaef5208efe4b8804de314f4660ea6f992f636e12c8aae02a87074b44 languageName: node linkType: hard @@ -6378,10 +6974,10 @@ __metadata: languageName: node linkType: hard -"@types/cookie@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/cookie@npm:0.4.1" - checksum: 3275534ed69a76c68eb1a77d547d75f99fedc80befb75a3d1d03662fb08d697e6f8b1274e12af1a74c6896071b11510631ba891f64d30c78528d0ec45a9c1a18 +"@types/cookie@npm:^0.5.1": + version: 0.5.1 + resolution: "@types/cookie@npm:0.5.1" + checksum: 9a8d60fc84797122bc399d6bd330fe5780dc7aab032321de705049ea925339f74658bfa418de483a625d51858770efef58df633ff2e20f1bdf7fbd74a52847e2 languageName: node linkType: hard @@ -6408,6 +7004,13 @@ __metadata: languageName: node linkType: hard +"@types/ejson@npm:^2.2.0": + version: 2.2.0 + resolution: "@types/ejson@npm:2.2.0" + checksum: 0cbc610c58a60847822353782d133f7a3cf362223d58f6a2b6ce0ae6e1f22885dc8f2a6ca7676df2556ed631e74c5a4880575704b964fdef89d216dc69ac0ad6 + languageName: node + linkType: hard + "@types/elliptic@npm:^6.4.9": version: 6.4.14 resolution: "@types/elliptic@npm:6.4.14" @@ -6470,15 +7073,6 @@ __metadata: languageName: node linkType: hard -"@types/fs-extra@npm:^8.0.1": - version: 8.1.2 - resolution: "@types/fs-extra@npm:8.1.2" - dependencies: - "@types/node": "*" - checksum: 7277198ded9caea5750c82e569ba1e6fbac28cdb4a95e5d52d24e7c4c2ac90bf45fbe89e08fc21de8f9d3c9b302e30680566eb04e460c30ceac66ad24c161b37 - languageName: node - linkType: hard - "@types/glob@npm:*, @types/glob@npm:^7.1.1": version: 7.2.0 resolution: "@types/glob@npm:7.2.0" @@ -6681,17 +7275,17 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:*, @types/lodash@npm:^4.14.177": +"@types/lodash@npm:*": version: 4.14.181 resolution: "@types/lodash@npm:4.14.181" checksum: 0d1863d8383fd2f8bb42e9e3fc1d6255bb88ff034d6df848941063698944313dae944fc1270315613e3d303fae7c7a9a86085ad3235ed6204c56c4b0b3699aa9 languageName: node linkType: hard -"@types/long@npm:^4.0.0, @types/long@npm:^4.0.1": - version: 4.0.1 - resolution: "@types/long@npm:4.0.1" - checksum: ff9653c33f5000d0f131fd98a950a0343e2e33107dd067a97ac4a3b9678e1a2e39ea44772ad920f54ef6e8f107f76bc92c2584ba905a0dc4253282a4101166d0 +"@types/lodash@npm:^4.14.182": + version: 4.14.182 + resolution: "@types/lodash@npm:4.14.182" + checksum: 7dd137aa9dbabd632408bd37009d984655164fa1ecc3f2b6eb94afe35bf0a5852cbab6183148d883e9c73a958b7fec9a9bcf7c8e45d41195add6a18c34958209 languageName: node linkType: hard @@ -6734,6 +7328,19 @@ __metadata: languageName: node linkType: hard +"@types/meteor@npm:2.0.4": + version: 2.0.4 + resolution: "@types/meteor@npm:2.0.4" + dependencies: + "@types/connect": "*" + "@types/jquery": "*" + "@types/mongodb": ^3.6.20 + "@types/react": "*" + "@types/underscore": "*" + checksum: 24f3adc0b7c0518779e9f6c408cf8895108205797b63b61539adf14946026fb8807c23a9797dbc367e437704301e397e1a158c34f55a1a10092b42f23d60ec8c + languageName: node + linkType: hard + "@types/mime@npm:^1": version: 1.3.2 resolution: "@types/mime@npm:1.3.2" @@ -6755,7 +7362,7 @@ __metadata: languageName: node linkType: hard -"@types/mkdirp@npm:^1.0.1": +"@types/mkdirp@npm:^1.0.2": version: 1.0.2 resolution: "@types/mkdirp@npm:1.0.2" dependencies: @@ -6827,7 +7434,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:>=6.0.0": +"@types/node@npm:*, @types/node@npm:>=6.0.0": version: 17.0.23 resolution: "@types/node@npm:17.0.23" checksum: a3517554737cbb042e76c30d0e5482192ac4d9bea0eeb086e2622d9cabf460a0eb52a696b99fcd18e7fcc93c96db6cc7ae507f6608f256ef0b5c1d8c87a5a470 @@ -6848,6 +7455,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:>=12.0.0, @types/node@npm:>=8.9.0": + version: 17.0.35 + resolution: "@types/node@npm:17.0.35" + checksum: 7a24946ae7fd20267ed92466384f594e448bfb151081158d565cc635d406ecb29ea8fb85fcd2a1f71efccf26fb5bd3c6f509bde56077eb8b832b847a6664bc62 + languageName: node + linkType: hard + "@types/node@npm:^14.0.10, @types/node@npm:^14.0.26, @types/node@npm:^14.14.31, @types/node@npm:^14.14.37, @types/node@npm:^14.18.12": version: 14.18.12 resolution: "@types/node@npm:14.18.12" @@ -6855,6 +7469,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^14.18.15": + version: 14.18.18 + resolution: "@types/node@npm:14.18.18" + checksum: a165225cd2603f6e62af8407449e4a4407305e03b41c1adf6b186fdf546e1a03c8214217659b5b36c556947c0c06234993ac880d4db6378136a7a810d47e0742 + languageName: node + linkType: hard + "@types/nodemailer@npm:^6.4.4": version: 6.4.4 resolution: "@types/nodemailer@npm:6.4.4" @@ -7005,7 +7626,16 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:*, @types/react-dom@npm:^18": +"@types/react-dom@npm:<18.0.0": + version: 17.0.17 + resolution: "@types/react-dom@npm:17.0.17" + dependencies: + "@types/react": ^17 + checksum: 23caf98aa03e968811560f92a2c8f451694253ebe16b670929b24eaf0e7fa62ba549abe9db0ac028a9d8a9086acd6ab9c6c773f163fa21224845edbc00ba6232 + languageName: node + linkType: hard + +"@types/react-dom@npm:^18": version: 18.0.2 resolution: "@types/react-dom@npm:18.0.2" dependencies: @@ -7054,18 +7684,6 @@ __metadata: languageName: node linkType: hard -"@types/request@npm:^2.48.1": - version: 2.48.8 - resolution: "@types/request@npm:2.48.8" - dependencies: - "@types/caseless": "*" - "@types/node": "*" - "@types/tough-cookie": "*" - form-data: ^2.5.0 - checksum: 0b7754941e08205dce51635d894ec524df276d2b83ca13b9aab723f9281acecf1108841e9554494cb1cb60f6d6ddbb47ebea97392bcf2bf607f035b3a9b4af45 - languageName: node - linkType: hard - "@types/responselike@npm:^1.0.0": version: 1.0.0 resolution: "@types/responselike@npm:1.0.0" @@ -7075,6 +7693,13 @@ __metadata: languageName: node linkType: hard +"@types/retry@npm:0.12.0": + version: 0.12.0 + resolution: "@types/retry@npm:0.12.0" + checksum: 61a072c7639f6e8126588bf1eb1ce8835f2cb9c2aba795c4491cf6310e013267b0c8488039857c261c387e9728c1b43205099223f160bb6a76b4374f741b5603 + languageName: node + linkType: hard + "@types/retry@npm:^0.12.0, @types/retry@npm:^0.12.1": version: 0.12.1 resolution: "@types/retry@npm:0.12.1" @@ -7096,7 +7721,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.6": +"@types/semver@npm:^7.3.9": version: 7.3.9 resolution: "@types/semver@npm:7.3.9" checksum: 60bfcfdfa7f937be2c6f4b37ddb6714fb0f27b05fe4cbdfdd596a97d35ed95d13ee410efdd88e72a66449d0384220bf20055ab7d6b5df10de4990fbd20e5cbe0 @@ -7113,15 +7738,6 @@ __metadata: languageName: node linkType: hard -"@types/sharp@npm:^0.29.4": - version: 0.29.5 - resolution: "@types/sharp@npm:0.29.5" - dependencies: - "@types/node": "*" - checksum: 085cd5237acb06e67701e1f550d3ed4ad80ae82570a64d5fa84c941c38b14ac3ccb7db79b32def182cdbac8ca72ba9a2f5d9904222e4daeab0c4706576df9ef0 - languageName: node - linkType: hard - "@types/sharp@npm:^0.30.2": version: 0.30.2 resolution: "@types/sharp@npm:0.30.2" @@ -7288,7 +7904,7 @@ __metadata: languageName: node linkType: hard -"@types/uuid@npm:^8.3.1, @types/uuid@npm:^8.3.4": +"@types/uuid@npm:^8.3.4": version: 8.3.4 resolution: "@types/uuid@npm:8.3.4" checksum: 6f11f3ff70f30210edaa8071422d405e9c1d4e53abbe50fdce365150d3c698fe7bbff65c1e71ae080cbfb8fded860dbb5e174da96fdbbdfcaa3fb3daa474d20f @@ -7354,6 +7970,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^7.2.5": + version: 7.4.7 + resolution: "@types/ws@npm:7.4.7" + dependencies: + "@types/node": "*" + checksum: b4c9b8ad209620c9b21e78314ce4ff07515c0cadab9af101c1651e7bfb992d7fd933bd8b9c99d110738fd6db523ed15f82f29f50b45510288da72e964dedb1a3 + languageName: node + linkType: hard + "@types/ws@npm:^8.5.3": version: 8.5.3 resolution: "@types/ws@npm:8.5.3" @@ -7834,7 +8459,7 @@ __metadata: languageName: node linkType: hard -"abab@npm:^2.0.0, abab@npm:^2.0.3, abab@npm:^2.0.5": +"abab@npm:^2.0.3, abab@npm:^2.0.5": version: 2.0.5 resolution: "abab@npm:2.0.5" checksum: 0ec951b46d5418c2c2f923021ec193eaebdb4e802ffd5506286781b454be722a13a8430f98085cd3e204918401d9130ec6cc8f5ae19be315b3a0e857d83196e1 @@ -7848,15 +8473,6 @@ __metadata: languageName: node linkType: hard -"abort-controller@npm:^2.0.2": - version: 2.0.3 - resolution: "abort-controller@npm:2.0.3" - dependencies: - event-target-shim: ^5.0.0 - checksum: 3a5366a478b80872029553b8771f7027c70ea16178dfb7346feca1af584962c47d11ff69eca5cabf08fd7cbb7c6e2f86839a36957b333dc1804dcc44a01727c9 - languageName: node - linkType: hard - "abort-controller@npm:^3.0.0": version: 3.0.0 resolution: "abort-controller@npm:3.0.0" @@ -7883,16 +8499,6 @@ __metadata: languageName: node linkType: hard -"acorn-globals@npm:^4.1.0": - version: 4.3.4 - resolution: "acorn-globals@npm:4.3.4" - dependencies: - acorn: ^6.0.1 - acorn-walk: ^6.0.1 - checksum: c31bfde102d8a104835e9591c31dd037ec771449f9c86a6b1d2ac3c7c336694f828cfabba7687525b094f896a854affbf1afe6e1b12c0d998be6bab5d49c9663 - languageName: node - linkType: hard - "acorn-globals@npm:^6.0.0": version: 6.0.0 resolution: "acorn-globals@npm:6.0.0" @@ -7903,7 +8509,7 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.2.0, acorn-jsx@npm:^5.3.1": +"acorn-jsx@npm:^5.2.0, acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" peerDependencies: @@ -7912,13 +8518,6 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^6.0.1": - version: 6.2.0 - resolution: "acorn-walk@npm:6.2.0" - checksum: ea241a5d96338f1e8030aafae72a91ff0ec4360e2775e44a2fdb2eb618b07fc309e000a5126056631ac7f00fe8bd9bbd23fcb6d018eee4ba11086eb36c1b2e61 - languageName: node - linkType: hard - "acorn-walk@npm:^7.1.1, acorn-walk@npm:^7.2.0": version: 7.2.0 resolution: "acorn-walk@npm:7.2.0" @@ -7933,16 +8532,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^5.5.3": - version: 5.7.4 - resolution: "acorn@npm:5.7.4" - bin: - acorn: bin/acorn - checksum: f51392a4d25c7705fadb890f784c59cde4ac1c5452ccd569fa59bd2191b7951b4a6398348ab7ea08a54f0bc0a56c13776710f4e1bae9de441e4d33e2015ad1e0 - languageName: node - linkType: hard - -"acorn@npm:^6.0.1, acorn@npm:^6.4.1": +"acorn@npm:^6.4.1": version: 6.4.2 resolution: "acorn@npm:6.4.2" bin: @@ -7969,6 +8559,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.7.1": + version: 8.7.1 + resolution: "acorn@npm:8.7.1" + bin: + acorn: bin/acorn + checksum: aca0aabf98826717920ac2583fdcad0a6fbe4e583fdb6e843af2594e907455aeafe30b1e14f1757cd83ce1776773cf8296ffc3a4acf13f0bd3dfebcf1db6ae80 + languageName: node + linkType: hard + "add-px-to-style@npm:1.0.0": version: 1.0.0 resolution: "add-px-to-style@npm:1.0.0" @@ -8115,18 +8714,6 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^5.1.0": - version: 5.5.2 - resolution: "ajv@npm:5.5.2" - dependencies: - co: ^4.6.0 - fast-deep-equal: ^1.0.0 - fast-json-stable-stringify: ^2.0.0 - json-schema-traverse: ^0.3.0 - checksum: a69645c843e1676b0ae1c5192786e546427f808f386d26127c6585479378066c64341ceec0b127b6789d79628e71d2a732d402f575b98f9262db230d7b715a94 - languageName: node - linkType: hard - "ajv@npm:^6.1.0, ajv@npm:^6.10.0, ajv@npm:^6.10.2, ajv@npm:^6.12.2, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -8139,7 +8726,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.1, ajv@npm:^8.11.0, ajv@npm:^8.7.1": +"ajv@npm:^8.0.1, ajv@npm:^8.11.0": version: 8.11.0 resolution: "ajv@npm:8.11.0" dependencies: @@ -8555,13 +9142,6 @@ __metadata: languageName: node linkType: hard -"array-equal@npm:^1.0.0": - version: 1.0.0 - resolution: "array-equal@npm:1.0.0" - checksum: 3f68045806357db9b2fa1ad583e42a659de030633118a0cd35ee4975cb20db3b9a3d36bbec9b5afe70011cf989eefd215c12fe0ce08c498f770859ca6e70688a - languageName: node - linkType: hard - "array-find-index@npm:^1.0.1": version: 1.0.2 resolution: "array-find-index@npm:1.0.2" @@ -8596,6 +9176,19 @@ __metadata: languageName: node linkType: hard +"array-includes@npm:^3.1.5": + version: 3.1.5 + resolution: "array-includes@npm:3.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.19.5 + get-intrinsic: ^1.1.1 + is-string: ^1.0.7 + checksum: f6f24d834179604656b7bec3e047251d5cc87e9e87fab7c175c61af48e80e75acd296017abcde21fb52292ab6a2a449ab2ee37213ee48c8709f004d75983f9c5 + languageName: node + linkType: hard + "array-parallel@npm:~0.1.3": version: 0.1.3 resolution: "array-parallel@npm:0.1.3" @@ -8669,6 +9262,18 @@ __metadata: languageName: node linkType: hard +"array.prototype.flatmap@npm:^1.3.0": + version: 1.3.0 + resolution: "array.prototype.flatmap@npm:1.3.0" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.2 + es-shim-unscopables: ^1.0.0 + checksum: 818538f39409c4045d874be85df0dbd195e1446b14d22f95bdcfefea44ae77db44e42dcd89a559254ec5a7c8b338cfc986cc6d641e3472f9a5326b21eb2976a2 + languageName: node + linkType: hard + "array.prototype.map@npm:^1.0.4": version: 1.0.4 resolution: "array.prototype.map@npm:1.0.4" @@ -8682,7 +9287,7 @@ __metadata: languageName: node linkType: hard -"arrify@npm:^1.0.0, arrify@npm:^1.0.1": +"arrify@npm:^1.0.1": version: 1.0.1 resolution: "arrify@npm:1.0.1" checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 @@ -8738,17 +9343,7 @@ __metadata: languageName: node linkType: hard -"assert@npm:^1.1.1": - version: 1.5.0 - resolution: "assert@npm:1.5.0" - dependencies: - object-assign: ^4.1.1 - util: 0.10.3 - checksum: 9be48435f726029ae7020c5888a3566bf4d617687aab280827f2e4029644b6515a9519ea10d018b342147c02faf73d9e9419e780e8937b3786ee4945a0ca71e5 - languageName: node - linkType: hard - -"assert@npm:^2.0.0": +"assert@npm:*": version: 2.0.0 resolution: "assert@npm:2.0.0" dependencies: @@ -8760,6 +9355,16 @@ __metadata: languageName: node linkType: hard +"assert@npm:^1.1.1": + version: 1.5.0 + resolution: "assert@npm:1.5.0" + dependencies: + object-assign: ^4.1.1 + util: 0.10.3 + checksum: 9be48435f726029ae7020c5888a3566bf4d617687aab280827f2e4029644b6515a9519ea10d018b342147c02faf73d9e9419e780e8937b3786ee4945a0ca71e5 + languageName: node + linkType: hard + "assertion-error@npm:^1.1.0": version: 1.1.0 resolution: "assertion-error@npm:1.1.0" @@ -8846,6 +9451,15 @@ __metadata: languageName: node linkType: hard +"async-retry@npm:^1.3.3": + version: 1.3.3 + resolution: "async-retry@npm:1.3.3" + dependencies: + retry: 0.13.1 + checksum: 38a7152ff7265a9321ea214b9c69e8224ab1febbdec98efbbde6e562f17ff68405569b796b1c5271f354aef8783665d29953f051f68c1fc45306e61aec82fdc4 + languageName: node + linkType: hard + "async@npm:0.2.10": version: 0.2.10 resolution: "async@npm:0.2.10" @@ -8869,7 +9483,7 @@ __metadata: languageName: node linkType: hard -"async@npm:^2.0.1, async@npm:^2.1.5, async@npm:^2.6.2, async@npm:^2.6.3, async@npm:~2.6.1, async@npm:~2.6.3": +"async@npm:^2.6.2, async@npm:^2.6.3, async@npm:~2.6.1, async@npm:~2.6.3": version: 2.6.4 resolution: "async@npm:2.6.4" dependencies: @@ -8929,7 +9543,7 @@ __metadata: languageName: node linkType: hard -"autolinker@npm:^3.14.3": +"autolinker@npm:^3.15.0": version: 3.15.0 resolution: "autolinker@npm:3.15.0" dependencies: @@ -8938,7 +9552,7 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^9, autoprefixer@npm:^9.5.1, autoprefixer@npm:^9.8.6": +"autoprefixer@npm:^9.5.1, autoprefixer@npm:^9.8.6, autoprefixer@npm:^9.8.8": version: 9.8.8 resolution: "autoprefixer@npm:9.8.8" dependencies: @@ -8962,7 +9576,24 @@ __metadata: languageName: node linkType: hard -"aws-sdk@npm:^2.1119.0, aws-sdk@npm:^2.588.0": +"aws-sdk@npm:^2.1121.0": + version: 2.1140.0 + resolution: "aws-sdk@npm:2.1140.0" + dependencies: + buffer: 4.9.2 + events: 1.1.1 + ieee754: 1.1.13 + jmespath: 0.16.0 + querystring: 0.2.0 + sax: 1.2.1 + url: 0.10.3 + uuid: 3.3.2 + xml2js: 0.4.19 + checksum: 5c81ff6486e818b21b56b117bc3aede6b74f2844c9485a25963b0b960e998bf5348a48f0dfc2ed0ad1d9479c8e3ca793a1eb5a30e360944ce3cfec47a5631ee5 + languageName: node + linkType: hard + +"aws-sdk@npm:^2.588.0": version: 2.1120.0 resolution: "aws-sdk@npm:2.1120.0" dependencies: @@ -8986,7 +9617,7 @@ __metadata: languageName: node linkType: hard -"aws4@npm:^1.6.0, aws4@npm:^1.8.0": +"aws4@npm:^1.8.0": version: 1.11.0 resolution: "aws4@npm:1.11.0" checksum: 5a00d045fd0385926d20ebebcfba5ec79d4482fe706f63c27b324d489a04c68edb0db99ed991e19eda09cb8c97dc2452059a34d97545cebf591d7a2b5a10999f @@ -9003,16 +9634,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.19.0": - version: 0.19.2 - resolution: "axios@npm:0.19.2" - dependencies: - follow-redirects: 1.5.10 - checksum: dcace11a0a25fdf9b3b97fc9d011d23dd9c67cc13d91778080482ddddbbfe731f7410a090b11aa0bbbdf83686c5911ccb4289fd3683b7488c1b0c4d3c882380c - languageName: node - linkType: hard - -"axios@npm:^0.21.0": +"axios@npm:^0.21.0, axios@npm:^0.21.1": version: 0.21.4 resolution: "axios@npm:0.21.4" dependencies: @@ -9039,6 +9661,16 @@ __metadata: languageName: node linkType: hard +"axios@npm:^0.27.2": + version: 0.27.2 + resolution: "axios@npm:0.27.2" + dependencies: + follow-redirects: ^1.14.9 + form-data: ^4.0.0 + checksum: 38cb7540465fe8c4102850c4368053c21683af85c5fdf0ea619f9628abbcb59415d1e22ebc8a6390d2bbc9b58a9806c874f139767389c862ec9b772235f06854 + languageName: node + linkType: hard + "babel-eslint@npm:^10.1.0": version: 10.1.0 resolution: "babel-eslint@npm:10.1.0" @@ -9073,7 +9705,7 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:^8.0.0, babel-loader@npm:^8.1.0, babel-loader@npm:^8.2.2": +"babel-loader@npm:^8.0.0, babel-loader@npm:^8.1.0, babel-loader@npm:^8.2.5": version: 8.2.5 resolution: "babel-loader@npm:8.2.5" dependencies: @@ -9382,10 +10014,10 @@ __metadata: languageName: node linkType: hard -"base-64@npm:^0.1.0": - version: 0.1.0 - resolution: "base-64@npm:0.1.0" - checksum: 5a42938f82372ab5392cbacc85a5a78115cbbd9dbef9f7540fa47d78763a3a8bd7d598475f0d92341f66285afd377509851a9bb5c67bbecb89686e9255d5b3eb +"base-64@npm:^1.0.0": + version: 1.0.0 + resolution: "base-64@npm:1.0.0" + checksum: d10b64a1fc9b2c5a5f39f1ce1e6c9d1c5b249222bbfa3a0604c592d90623caf74419983feadd8a170f27dc0c3389704f72faafa3e645aeb56bfc030c93ff074a languageName: node linkType: hard @@ -9859,24 +10491,6 @@ __metadata: languageName: node linkType: hard -"boom@npm:4.x.x": - version: 4.3.1 - resolution: "boom@npm:4.3.1" - dependencies: - hoek: 4.x.x - checksum: 1545c6727e5cf45f91c2d6ac8e0756dd98179320a51c4abe618baa0c21c6e0d8a27ce1350c4007c42710e4645fa68a145830e19e1cf53305770603af336711df - languageName: node - linkType: hard - -"boom@npm:5.x.x": - version: 5.2.0 - resolution: "boom@npm:5.2.0" - dependencies: - hoek: 4.x.x - checksum: d8fe7953080796c1ff2553389b14de6a36e5e55c4093327a8135bb2c1a301e46ace9d44085eb053ff99fb292b667bafe148155dbe5ec2f9ae05ee24eb5bf8d19 - languageName: node - linkType: hard - "boom@npm:7.x.x": version: 7.3.0 resolution: "boom@npm:7.3.0" @@ -9927,6 +10541,15 @@ __metadata: languageName: node linkType: hard +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + "braces@npm:^2.3.1, braces@npm:^2.3.2": version: 2.3.2 resolution: "braces@npm:2.3.2" @@ -10062,7 +10685,7 @@ __metadata: languageName: node linkType: hard -"browserify-zlib@npm:^0.2.0": +"browserify-zlib@npm:*, browserify-zlib@npm:^0.2.0": version: 0.2.0 resolution: "browserify-zlib@npm:0.2.0" dependencies: @@ -10071,7 +10694,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.12.0, browserslist@npm:^4.17.5, browserslist@npm:^4.19.1": +"browserslist@npm:^4.0.0, browserslist@npm:^4.12.0, browserslist@npm:^4.17.5, browserslist@npm:^4.19.1, browserslist@npm:^4.20.2, browserslist@npm:^4.20.3": version: 4.20.3 resolution: "browserslist@npm:4.20.3" dependencies: @@ -10199,6 +10822,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:*": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + "buffer@npm:4.9.2, buffer@npm:^4.3.0": version: 4.9.2 resolution: "buffer@npm:4.9.2" @@ -10220,16 +10853,6 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.2.1 - checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 - languageName: node - linkType: hard - "bufrw@npm:^1.3.0": version: 1.3.0 resolution: "bufrw@npm:1.3.0" @@ -10272,6 +10895,13 @@ __metadata: languageName: node linkType: hard +"byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "byte-length@npm:1.0.2" + checksum: 69e2b00a14a81f675ea9946135c42ee1a1d9f689d5ba1327eb6700fcde2ccacbd09b42f7e514de1d2b763960251d8c790b3d7304a5a1a27b1457e34c129be8c7 + languageName: node + linkType: hard + "bytebuffer@npm:5.0.1": version: 5.0.1 resolution: "bytebuffer@npm:5.0.1" @@ -10832,6 +11462,13 @@ __metadata: languageName: node linkType: hard +"charenc@npm:0.0.2": + version: 0.0.2 + resolution: "charenc@npm:0.0.2" + checksum: 81dcadbe57e861d527faf6dd3855dc857395a1c4d6781f4847288ab23cffb7b3ee80d57c15bba7252ffe3e5e8019db767757ee7975663ad2ca0939bb8fcaf2e5 + languageName: node + linkType: hard + "charm@npm:~0.1.1": version: 0.1.2 resolution: "charm@npm:0.1.2" @@ -10839,32 +11476,10 @@ __metadata: languageName: node linkType: hard -"chart.js@npm:^2.9.4": - version: 2.9.4 - resolution: "chart.js@npm:2.9.4" - dependencies: - chartjs-color: ^2.1.0 - moment: ^2.10.2 - checksum: cbdc7abe2fa65e4838848e68b035ae6048ebcc512b9057d7cdb6d361e728400d39e3fde75e0b4da815ab43f7890c31787d8f80d4e6ab75a3e80fc75b47cd173c - languageName: node - linkType: hard - -"chartjs-color-string@npm:^0.6.0": - version: 0.6.0 - resolution: "chartjs-color-string@npm:0.6.0" - dependencies: - color-name: ^1.0.0 - checksum: 2355bc8e9514b779d0dc057c5ee6707e8166f270531c27287a399d6bfeb0d891b00a6f6c20e764453a062de0de8b298b11d3850fc94c323df66efb4720ece4c7 - languageName: node - linkType: hard - -"chartjs-color@npm:^2.1.0": - version: 2.4.1 - resolution: "chartjs-color@npm:2.4.1" - dependencies: - chartjs-color-string: ^0.6.0 - color-convert: ^1.9.3 - checksum: 254d7b2f103980417703331c49fba18877ac797fd9056d79f0d566dc4fd8d41f91b7f63d4b19602462b91110bee2fe0c9fd57266ce871e498ac1c25742fffb11 +"chart.js@npm:^3.7.1": + version: 3.7.1 + resolution: "chart.js@npm:3.7.1" + checksum: f9d118d3b7dd3c36b6da7a8d71ac9e5d9673b81095cc66c3f61ff91674e20020c6700f8c9c6f93713fa8474eb471ded106114346ccc6afa88b4a7d0eb73dcea4 languageName: node linkType: hard @@ -11288,6 +11903,13 @@ __metadata: languageName: node linkType: hard +"cluster-key-slot@npm:1.1.0": + version: 1.1.0 + resolution: "cluster-key-slot@npm:1.1.0" + checksum: fc953c75209b1ef9088081bab4e40a0b2586491c974ab93460569c014515ca5a2e31c043f185285e177007162fc353d07836d98f570c171dbe055775430e495b + languageName: node + linkType: hard + "co@npm:^4.6.0": version: 4.6.0 resolution: "co@npm:4.6.0" @@ -11419,7 +12041,7 @@ __metadata: languageName: node linkType: hard -"color@npm:^4.0.1, color@npm:^4.2.3": +"color@npm:^4.2.3": version: 4.2.3 resolution: "color@npm:4.2.3" dependencies: @@ -11429,7 +12051,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^1.3.0, colorette@npm:^1.4.0": +"colorette@npm:^1.3.0": version: 1.4.0 resolution: "colorette@npm:1.4.0" checksum: 01c3c16058b182a4ab4c126a65a75faa4d38a20fa7c845090b25453acec6c371bb2c5dceb0a2338511f17902b9d1a9af0cadd8509c9403894b79311032c256c3 @@ -11460,7 +12082,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.5, combined-stream@npm:~1.0.6": +"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -11490,13 +12112,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:8.3.0": - version: 8.3.0 - resolution: "commander@npm:8.3.0" - checksum: 0f82321821fc27b83bd409510bb9deeebcfa799ff0bf5d102128b500b7af22872c0c92cb6a0ebc5a4cf19c6b550fba9cedfa7329d18c6442a625f851377bacf0 - languageName: node - linkType: hard - "commander@npm:^2.17.1, commander@npm:^2.19.0, commander@npm:^2.20.0, commander@npm:^2.8.1": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -11637,18 +12252,6 @@ __metadata: languageName: node linkType: hard -"concat-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "concat-stream@npm:2.0.0" - dependencies: - buffer-from: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^3.0.2 - typedarray: ^0.0.6 - checksum: d7f75d48f0ecd356c1545d87e22f57b488172811b1181d96021c7c4b14ab8855f5313280263dca44bb06e5222f274d047da3e290a38841ef87b59719bde967c7 - languageName: node - linkType: hard - "config-chain@npm:^1.1.11": version: 1.1.13 resolution: "config-chain@npm:1.1.13" @@ -11673,17 +12276,17 @@ __metadata: languageName: node linkType: hard -"configstore@npm:^4.0.0": - version: 4.0.0 - resolution: "configstore@npm:4.0.0" +"configstore@npm:^5.0.0": + version: 5.0.1 + resolution: "configstore@npm:5.0.1" dependencies: - dot-prop: ^4.1.0 + dot-prop: ^5.2.0 graceful-fs: ^4.1.2 - make-dir: ^1.0.0 - unique-string: ^1.0.0 - write-file-atomic: ^2.0.0 - xdg-basedir: ^3.0.0 - checksum: 1abf0ea2d1a135c55351c39085627dd6a50dc395f6a93888ae49449b6a9935771c419ed28f7854c2f087519d94cdab87ea7e0b0a842c271084a9704f40ca4fcb + make-dir: ^3.0.0 + unique-string: ^2.0.0 + write-file-atomic: ^3.0.0 + xdg-basedir: ^4.0.0 + checksum: 60ef65d493b63f96e14b11ba7ec072fdbf3d40110a94fb7199d1c287761bdea5c5244e76b2596325f30c1b652213aa75de96ea20afd4a5f82065e61ea090988e languageName: node linkType: hard @@ -11706,7 +12309,7 @@ __metadata: languageName: node linkType: hard -"console-browserify@npm:^1.1.0, console-browserify@npm:^1.2.0": +"console-browserify@npm:*, console-browserify@npm:^1.1.0": version: 1.2.0 resolution: "console-browserify@npm:1.2.0" checksum: 226591eeff8ed68e451dffb924c1fb750c654d54b9059b3b261d360f369d1f8f70650adecf2c7136656236a4bfeb55c39281b5d8a55d792ebbb99efd3d848d52 @@ -11738,7 +12341,7 @@ __metadata: languageName: node linkType: hard -"constants-browserify@npm:^1.0.0": +"constants-browserify@npm:*, constants-browserify@npm:^1.0.0": version: 1.0.0 resolution: "constants-browserify@npm:1.0.0" checksum: f7ac8c6d0b6e4e0c77340a1d47a3574e25abd580bfd99ad707b26ff7618596cf1a5e5ce9caf44715e9e01d4a5d12cb3b4edaf1176f34c19adb2874815a56e64f @@ -11811,7 +12414,7 @@ __metadata: languageName: node linkType: hard -"cookie@npm:0.4.2, cookie@npm:^0.4.2": +"cookie@npm:0.4.2": version: 0.4.2 resolution: "cookie@npm:0.4.2" checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b @@ -11872,6 +12475,16 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.22.1": + version: 3.22.6 + resolution: "core-js-compat@npm:3.22.6" + dependencies: + browserslist: ^4.20.3 + semver: 7.0.0 + checksum: 6b83b87abeb04c08b54bdc6a6756ad6d1503aeadebc598a162bfe1044a31183864bb3016f16c839d40235545c009dc8aea6421ada0d2e18b5fdf93c6059eb380 + languageName: node + linkType: hard + "core-js-pure@npm:^3.8.1, core-js-pure@npm:^3.8.2": version: 3.21.1 resolution: "core-js-pure@npm:3.21.1" @@ -12155,12 +12768,10 @@ __metadata: languageName: node linkType: hard -"cryptiles@npm:3.x.x": - version: 3.1.4 - resolution: "cryptiles@npm:3.1.4" - dependencies: - boom: 5.x.x - checksum: 19076cde50ff2bacb0261e36991db1f7fcf40f63cb027ec7212910993fb5867c7253d771fdca92c9ceedf794f496146cb44f88065d78f0e12de6942b4746bb62 +"crypt@npm:0.0.2": + version: 0.0.2 + resolution: "crypt@npm:0.0.2" + checksum: baf4c7bbe05df656ec230018af8cf7dbe8c14b36b98726939cef008d473f6fe7a4fad906cfea4062c93af516f1550a3f43ceb4d6615329612c6511378ed9fe34 languageName: node linkType: hard @@ -12173,7 +12784,7 @@ __metadata: languageName: node linkType: hard -"crypto-browserify@npm:^3.11.0, crypto-browserify@npm:^3.12.0": +"crypto-browserify@npm:*, crypto-browserify@npm:^3.11.0": version: 3.12.0 resolution: "crypto-browserify@npm:3.12.0" dependencies: @@ -12206,6 +12817,13 @@ __metadata: languageName: node linkType: hard +"crypto-random-string@npm:^2.0.0": + version: 2.0.0 + resolution: "crypto-random-string@npm:2.0.0" + checksum: 0283879f55e7c16fdceacc181f87a0a65c53bc16ffe1d58b9d19a6277adcd71900d02bb2c4843dd55e78c51e30e89b0fec618a7f170ebcc95b33182c28f05fd6 + languageName: node + linkType: hard + "css-color-names@npm:0.0.4, css-color-names@npm:^0.0.4": version: 0.0.4 resolution: "css-color-names@npm:0.0.4" @@ -12489,13 +13107,6 @@ __metadata: languageName: node linkType: hard -"cssom@npm:0.3.x, cssom@npm:>= 0.3.2 < 0.4.0, cssom@npm:~0.3.6": - version: 0.3.8 - resolution: "cssom@npm:0.3.8" - checksum: 24beb3087c76c0d52dd458be9ee1fbc80ac771478a9baef35dd258cdeb527c68eb43204dd439692bb2b1ae5272fa5f2946d10946edab0d04f1078f85e06bc7f6 - languageName: node - linkType: hard - "cssom@npm:^0.4.4": version: 0.4.4 resolution: "cssom@npm:0.4.4" @@ -12503,12 +13114,10 @@ __metadata: languageName: node linkType: hard -"cssstyle@npm:^1.0.0": - version: 1.4.0 - resolution: "cssstyle@npm:1.4.0" - dependencies: - cssom: 0.3.x - checksum: 7efb9731d68dd042f32e0e3bbc7c1096653ba521f21ab1c5b158862321e4fcbfb51070641b834fadc8dd070a634dd43f328177e00d1b8481b5143a3e09f3d3f6 +"cssom@npm:~0.3.6": + version: 0.3.8 + resolution: "cssom@npm:0.3.8" + checksum: 24beb3087c76c0d52dd458be9ee1fbc80ac771478a9baef35dd258cdeb527c68eb43204dd439692bb2b1ae5272fa5f2946d10946edab0d04f1078f85e06bc7f6 languageName: node linkType: hard @@ -12535,10 +13144,10 @@ __metadata: languageName: node linkType: hard -"csv-parse@npm:^4.16.3": - version: 4.16.3 - resolution: "csv-parse@npm:4.16.3" - checksum: 5ad7790fc31c32ca1623bad1a54906134ba44fa109e8dd2dfda440bf7e9fd93610d9076a78f45c872701bfafdf7f93c9b75500c09d7efd6611d863f1d45ec69f +"csv-parse@npm:^5.0.4": + version: 5.0.4 + resolution: "csv-parse@npm:5.0.4" + checksum: e38b4fb8dec7a64b891d78ab3cf7f59b721e4027e3c773a2b0311dc538a82681f4f01aaa03c209ac47eb37e26c00a1134bf3844ade1685bf53ce85ffb17a63e3 languageName: node linkType: hard @@ -12822,17 +13431,6 @@ __metadata: languageName: node linkType: hard -"data-urls@npm:^1.0.0": - version: 1.1.0 - resolution: "data-urls@npm:1.1.0" - dependencies: - abab: ^2.0.0 - whatwg-mimetype: ^2.2.0 - whatwg-url: ^7.0.0 - checksum: dc4bd9621df0dff336d7c4c0517c792488ef3cf11cd37e72ab80f3a7f0a0aa14bad677ac97cf22c87c6eb9518e58b98590e1c8c756b56240940f0e470c81612e - languageName: node - linkType: hard - "data-urls@npm:^2.0.0": version: 2.0.0 resolution: "data-urls@npm:2.0.0" @@ -12844,13 +13442,6 @@ __metadata: languageName: node linkType: hard -"date-and-time@npm:^0.6.3": - version: 0.6.3 - resolution: "date-and-time@npm:0.6.3" - checksum: dd98d76a5b71879bd6b2f4b46d1d40ab06784a0f71bb66bc352d397a7fc1a19a77a1540c3d86cb475a0fd468d87c42748af8a918ec5a32cfbbedced8993fdf57 - languageName: node - linkType: hard - "date-fns@npm:^2.15.0, date-fns@npm:^2.28.0": version: 2.28.0 resolution: "date-fns@npm:2.28.0" @@ -12906,7 +13497,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.2.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:~4.3.1": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.2.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:~4.3.1": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -13151,13 +13742,6 @@ __metadata: languageName: node linkType: hard -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 - languageName: node - linkType: hard - "define-properties@npm:^1.1.2, define-properties@npm:^1.1.3": version: 1.1.3 resolution: "define-properties@npm:1.1.3" @@ -13167,6 +13751,16 @@ __metadata: languageName: node linkType: hard +"define-properties@npm:^1.1.4": + version: 1.1.4 + resolution: "define-properties@npm:1.1.4" + dependencies: + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b + languageName: node + linkType: hard + "define-property@npm:^0.2.5": version: 0.2.5 resolution: "define-property@npm:0.2.5" @@ -13563,6 +14157,13 @@ __metadata: languageName: node linkType: hard +"domain-browser@npm:*": + version: 4.22.0 + resolution: "domain-browser@npm:4.22.0" + checksum: e7ce1c19073e17dec35cfde050a3ddaac437d3ba8b870adabf9d5682e665eab3084df05de432dedf25b34303f0a2c71ac30f1cdba61b1aea018047b10de3d988 + languageName: node + linkType: hard + "domain-browser@npm:^1.1.1": version: 1.2.0 resolution: "domain-browser@npm:1.2.0" @@ -13570,13 +14171,6 @@ __metadata: languageName: node linkType: hard -"domain-browser@npm:^4.19.0": - version: 4.22.0 - resolution: "domain-browser@npm:4.22.0" - checksum: e7ce1c19073e17dec35cfde050a3ddaac437d3ba8b870adabf9d5682e665eab3084df05de432dedf25b34303f0a2c71ac30f1cdba61b1aea018047b10de3d988 - languageName: node - linkType: hard - "domelementtype@npm:1, domelementtype@npm:^1.3.0, domelementtype@npm:^1.3.1": version: 1.3.1 resolution: "domelementtype@npm:1.3.1" @@ -13591,15 +14185,6 @@ __metadata: languageName: node linkType: hard -"domexception@npm:^1.0.1": - version: 1.0.1 - resolution: "domexception@npm:1.0.1" - dependencies: - webidl-conversions: ^4.0.2 - checksum: f564a9c0915dcb83ceefea49df14aaed106b1468fbe505119e8bcb0b77e242534f3aba861978537c0fc9dc6f35b176d0ffc77b3e342820fb27a8f215e7ae4d52 - languageName: node - linkType: hard - "domexception@npm:^2.0.1": version: 2.0.1 resolution: "domexception@npm:2.0.1" @@ -13645,6 +14230,20 @@ __metadata: languageName: node linkType: hard +"domino@npm:^2.1.6": + version: 2.1.6 + resolution: "domino@npm:2.1.6" + checksum: 9b1b6d2661efd8bf942b70d5e11ac0de6a63f17e49b7eb227d9a612fa7b7c12b7775520d64f498988a8ee334ea9c59a463c84ea510b0af17dd3e13fdce120410 + languageName: node + linkType: hard + +"dommatrix@npm:^1.0.1": + version: 1.0.3 + resolution: "dommatrix@npm:1.0.3" + checksum: 8ac727c1a14cf8de30a5b49a3bd6b2622a661b391fe1ac54e855eaa14a857ed86d63492150b5f70f912acc24fa3acc31d750259c47e9b5801de237624b0a319f + languageName: node + linkType: hard + "dompurify@npm:^2.3.6": version: 2.3.6 resolution: "dompurify@npm:2.3.6" @@ -13702,7 +14301,7 @@ __metadata: languageName: node linkType: hard -"dot-prop@npm:^4.1.0, dot-prop@npm:^4.2.1": +"dot-prop@npm:^4.2.1": version: 4.2.1 resolution: "dot-prop@npm:4.2.1" dependencies: @@ -13734,13 +14333,6 @@ __metadata: languageName: node linkType: hard -"double-ended-queue@npm:^2.1.0-0": - version: 2.1.0-0 - resolution: "double-ended-queue@npm:2.1.0-0" - checksum: 3030cf9dcf6f8e7d8cb6ae5b7304890445d7c32233a614e400ba7b378086ad76f5822d0e501afd5ffe0af1de4bcb842fa23d4c79174d54f6566399435fafc271 - languageName: node - linkType: hard - "download@npm:^6.2.2": version: 6.2.5 resolution: "download@npm:6.2.5" @@ -13818,7 +14410,7 @@ __metadata: languageName: node linkType: hard -"duplexify@npm:^3.4.2, duplexify@npm:^3.5.0, duplexify@npm:^3.6.0": +"duplexify@npm:^3.4.2, duplexify@npm:^3.6.0": version: 3.7.1 resolution: "duplexify@npm:3.7.1" dependencies: @@ -13830,7 +14422,7 @@ __metadata: languageName: node linkType: hard -"duplexify@npm:^4.1.2": +"duplexify@npm:^4.0.0, duplexify@npm:^4.1.1, duplexify@npm:^4.1.2": version: 4.1.2 resolution: "duplexify@npm:4.1.2" dependencies: @@ -13868,13 +14460,6 @@ __metadata: languageName: node linkType: hard -"ejs@npm:^2.5.6": - version: 2.7.4 - resolution: "ejs@npm:2.7.4" - checksum: a1d2bfc7d1f0b39e99ae19b20c9469a25aeddba1ffc225db098110b18d566f73772fcdcc740b108cfda7452276f67d7b64eb359f90285414c942f4ae70713371 - languageName: node - linkType: hard - "ejson@npm:^2.2.2": version: 2.2.2 resolution: "ejson@npm:2.2.2" @@ -14206,6 +14791,37 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5": + version: 1.20.1 + resolution: "es-abstract@npm:1.20.1" + dependencies: + call-bind: ^1.0.2 + es-to-primitive: ^1.2.1 + function-bind: ^1.1.1 + function.prototype.name: ^1.1.5 + get-intrinsic: ^1.1.1 + get-symbol-description: ^1.0.0 + has: ^1.0.3 + has-property-descriptors: ^1.0.0 + has-symbols: ^1.0.3 + internal-slot: ^1.0.3 + is-callable: ^1.2.4 + is-negative-zero: ^2.0.2 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + is-string: ^1.0.7 + is-weakref: ^1.0.2 + object-inspect: ^1.12.0 + object-keys: ^1.1.1 + object.assign: ^4.1.2 + regexp.prototype.flags: ^1.4.3 + string.prototype.trimend: ^1.0.5 + string.prototype.trimstart: ^1.0.5 + unbox-primitive: ^1.0.2 + checksum: 28da27ae0ed9c76df7ee8ef5c278df79dcfdb554415faf7068bb7c58f8ba8e2a16bfb59e586844be6429ab4c302ca7748979d48442224cb1140b051866d74b7f + languageName: node + linkType: hard + "es-array-method-boxes-properly@npm:^1.0.0": version: 1.0.0 resolution: "es-array-method-boxes-properly@npm:1.0.0" @@ -14229,6 +14845,15 @@ __metadata: languageName: node linkType: hard +"es-shim-unscopables@npm:^1.0.0": + version: 1.0.0 + resolution: "es-shim-unscopables@npm:1.0.0" + dependencies: + has: ^1.0.3 + checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + languageName: node + linkType: hard + "es-to-primitive@npm:^1.2.1": version: 1.2.1 resolution: "es-to-primitive@npm:1.2.1" @@ -14319,7 +14944,7 @@ __metadata: languageName: node linkType: hard -"escodegen@npm:^1.8.1, escodegen@npm:^1.9.1": +"escodegen@npm:^1.8.1": version: 1.14.3 resolution: "escodegen@npm:1.14.3" dependencies: @@ -14357,7 +14982,7 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:^8.3.0": +"eslint-config-prettier@npm:^8.3.0, eslint-config-prettier@npm:^8.5.0": version: 8.5.0 resolution: "eslint-config-prettier@npm:8.5.0" peerDependencies: @@ -14397,7 +15022,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.17.2, eslint-plugin-import@npm:^2.22.0, eslint-plugin-import@npm:^2.24.2": +"eslint-plugin-import@npm:^2.17.2, eslint-plugin-import@npm:^2.22.0, eslint-plugin-import@npm:^2.24.2, eslint-plugin-import@npm:^2.26.0": version: 2.26.0 resolution: "eslint-plugin-import@npm:2.26.0" dependencies: @@ -14452,7 +15077,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-hooks@npm:^4.1.0, eslint-plugin-react-hooks@npm:^4.2.0": +"eslint-plugin-react-hooks@npm:^4.1.0": version: 4.4.0 resolution: "eslint-plugin-react-hooks@npm:4.4.0" peerDependencies: @@ -14461,7 +15086,16 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react@npm:^7.20.5, eslint-plugin-react@npm:^7.24.0": +"eslint-plugin-react-hooks@npm:^4.4.0": + version: 4.5.0 + resolution: "eslint-plugin-react-hooks@npm:4.5.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + checksum: 0389377de635dd9b769f6f52e2c9e6ab857a0cdfecc3734c95ce81676a752e781bb5c44fd180e01953a03a77278323d90729776438815557b069ceb988ab1f9f + languageName: node + linkType: hard + +"eslint-plugin-react@npm:^7.20.5": version: 7.29.4 resolution: "eslint-plugin-react@npm:7.29.4" dependencies: @@ -14485,14 +15119,38 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-testing-library@npm:^5.0.0": - version: 5.2.1 - resolution: "eslint-plugin-testing-library@npm:5.2.1" +"eslint-plugin-react@npm:^7.29.4": + version: 7.30.0 + resolution: "eslint-plugin-react@npm:7.30.0" + dependencies: + array-includes: ^3.1.5 + array.prototype.flatmap: ^1.3.0 + doctrine: ^2.1.0 + estraverse: ^5.3.0 + jsx-ast-utils: ^2.4.1 || ^3.0.0 + minimatch: ^3.1.2 + object.entries: ^1.1.5 + object.fromentries: ^2.0.5 + object.hasown: ^1.1.1 + object.values: ^1.1.5 + prop-types: ^15.8.1 + resolve: ^2.0.0-next.3 + semver: ^6.3.0 + string.prototype.matchall: ^4.0.7 + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: 729b7682a0fe6eab068171c159503ac57120ecc7b20067e76300b08879745c16a687e2033378ab45d9a3182da8844d06197a89081be83e1eb21fcceb76e79214 + languageName: node + linkType: hard + +"eslint-plugin-testing-library@npm:^5.3.1": + version: 5.5.0 + resolution: "eslint-plugin-testing-library@npm:5.5.0" dependencies: "@typescript-eslint/utils": ^5.13.0 peerDependencies: eslint: ^7.5.0 || ^8.0.0 - checksum: dc433a0e0033572463a859bdfb8e375885e81757b16c0d2b77a5f2cb231651962cfcaba0e1076edb4af95689aaf9fa029454c9dde3e28b6d46a4234561305b9c + checksum: 7f42e2af84a0b5d1bba86fe9838abdbfa1c4f5dae66db215f592a216f82a2164a23181841228872d7116f38398bbc671e60a1e3b9840f0a8da1972c7aac8bdcd languageName: node linkType: hard @@ -14623,7 +15281,7 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^7.5.0": +"eslint@npm:^7.32.0, eslint@npm:^7.5.0": version: 7.32.0 resolution: "eslint@npm:7.32.0" dependencies: @@ -14718,6 +15376,51 @@ __metadata: languageName: node linkType: hard +"eslint@npm:^8.14.0": + version: 8.16.0 + resolution: "eslint@npm:8.16.0" + dependencies: + "@eslint/eslintrc": ^1.3.0 + "@humanwhocodes/config-array": ^0.9.2 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.1.1 + eslint-utils: ^3.0.0 + eslint-visitor-keys: ^3.3.0 + espree: ^9.3.2 + esquery: ^1.4.0 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + functional-red-black-tree: ^1.0.1 + glob-parent: ^6.0.1 + globals: ^13.15.0 + ignore: ^5.2.0 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.1 + regexpp: ^3.2.0 + strip-ansi: ^6.0.1 + strip-json-comments: ^3.1.0 + text-table: ^0.2.0 + v8-compile-cache: ^2.0.3 + bin: + eslint: bin/eslint.js + checksum: 654a0200b49dc07280673fee13cdfb04326466790e031dfa9660b69fba3b1cf766a51504328f9de56bd18e6b5eb7578985cf29dc7f016c5ec851220ff9db95eb + languageName: node + linkType: hard + "espree@npm:^6.1.2": version: 6.2.1 resolution: "espree@npm:6.2.1" @@ -14751,6 +15454,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^9.3.2": + version: 9.3.2 + resolution: "espree@npm:9.3.2" + dependencies: + acorn: ^8.7.1 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.3.0 + checksum: 9a790d6779847051e87f70d720a0f6981899a722419e80c92ab6dee01e1ab83b8ce52d11b4dc96c2c490182efb5a4c138b8b0d569205bfe1cd4629e658e58c30 + languageName: node + linkType: hard + "esprima@npm:^4.0.0, esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" @@ -14875,6 +15589,13 @@ __metadata: languageName: node linkType: hard +"events@npm:*, events@npm:^3.0.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + "events@npm:1.1.1": version: 1.1.1 resolution: "events@npm:1.1.1" @@ -14882,13 +15603,6 @@ __metadata: languageName: node linkType: hard -"events@npm:^3.0.0, events@npm:^3.3.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 - languageName: node - linkType: hard - "eventsource@npm:^1.1.0": version: 1.1.0 resolution: "eventsource@npm:1.1.0" @@ -15105,20 +15819,6 @@ __metadata: languageName: node linkType: hard -"expect@npm:27.2.5": - version: 27.2.5 - resolution: "expect@npm:27.2.5" - dependencies: - "@jest/types": ^27.2.5 - ansi-styles: ^5.0.0 - jest-get-type: ^27.0.6 - jest-matcher-utils: ^27.2.5 - jest-message-util: ^27.2.5 - jest-regex-util: ^27.0.6 - checksum: c9be6ec30d19f69c6b838c379e102c156b3ce231e0e3bfc7928eb7a239e5d2a8ed3a43ded4856ad6b3f2f83944561455ad3cf4dfc5322e7d962f2eddc67941c7 - languageName: node - linkType: hard - "expect@npm:^27.5.1": version: 27.5.1 resolution: "expect@npm:27.5.1" @@ -15223,7 +15923,7 @@ __metadata: languageName: node linkType: hard -"extend@npm:^3.0.0, extend@npm:^3.0.1, extend@npm:^3.0.2, extend@npm:~3.0.1, extend@npm:~3.0.2": +"extend@npm:^3.0.0, extend@npm:^3.0.1, extend@npm:^3.0.2, extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 @@ -15288,13 +15988,6 @@ __metadata: languageName: node linkType: hard -"fast-deep-equal@npm:^1.0.0": - version: 1.1.0 - resolution: "fast-deep-equal@npm:1.1.0" - checksum: 69b4c9534d9805f13a341aa72f69641d0b9ae3cc8beb25c64e68a257241c7bb34370266db27ae4fc3c4da0518448c01a5f587a096a211471c86a38facd9a1486 - languageName: node - linkType: hard - "fast-deep-equal@npm:^2.0.1": version: 2.0.1 resolution: "fast-deep-equal@npm:2.0.1" @@ -15608,7 +16301,7 @@ __metadata: languageName: node linkType: hard -"file-type@npm:^10.11.0, file-type@npm:^10.4.0": +"file-type@npm:^10.4.0": version: 10.11.0 resolution: "file-type@npm:10.11.0" checksum: cadd8cd187692dcde637a3ff53bb51c5d935633fc8085e7d25bfb3b4bf995e14a43f2baf71bdcb9d7235b3e725bd158b75d25911fa2f73e5812955382228c511 @@ -15622,6 +16315,17 @@ __metadata: languageName: node linkType: hard +"file-type@npm:^16.5.3": + version: 16.5.3 + resolution: "file-type@npm:16.5.3" + dependencies: + readable-web-to-node-stream: ^3.0.0 + strtok3: ^6.2.4 + token-types: ^4.1.1 + checksum: 38a4443d0f7b9b3de8a44a1d75d441f9ddb544a1adbf22ec7bc07d135452c3464000c64daa51220ffec6a38ceec7565a1290337bd81aab2e6273c79db5ed9ef3 + languageName: node + linkType: hard + "file-type@npm:^3.8.0": version: 3.9.0 resolution: "file-type@npm:3.9.0" @@ -15958,6 +16662,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.14.9": + version: 1.15.0 + resolution: "follow-redirects@npm:1.15.0" + peerDependenciesMeta: + debug: + optional: true + checksum: eaec81c3e0ae57aae2422e38ad3539d0e7279b3a63f9681eeea319bb683dea67502c4e097136b8ce9721542b4e236e092b6b49e34e326cdd7733c274f0a3f378 + languageName: node + linkType: hard + "for-in@npm:^1.0.2": version: 1.0.2 resolution: "for-in@npm:1.0.2" @@ -16068,7 +16782,7 @@ __metadata: languageName: node linkType: hard -"form-data@npm:~2.3.1, form-data@npm:~2.3.2": +"form-data@npm:~2.3.2": version: 2.3.3 resolution: "form-data@npm:2.3.3" dependencies: @@ -16282,7 +16996,7 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.0": +"function.prototype.name@npm:^1.1.0, function.prototype.name@npm:^1.1.5": version: 1.1.5 resolution: "function.prototype.name@npm:1.1.5" dependencies: @@ -16364,7 +17078,7 @@ __metadata: languageName: node linkType: hard -"gaxios@npm:^1.0.2, gaxios@npm:^1.0.4, gaxios@npm:^1.2.1, gaxios@npm:^1.5.0": +"gaxios@npm:^1.0.4": version: 1.8.4 resolution: "gaxios@npm:1.8.4" dependencies: @@ -16376,16 +17090,16 @@ __metadata: languageName: node linkType: hard -"gaxios@npm:^2.1.0": - version: 2.3.4 - resolution: "gaxios@npm:2.3.4" +"gaxios@npm:^4.0.0": + version: 4.3.3 + resolution: "gaxios@npm:4.3.3" dependencies: abort-controller: ^3.0.0 extend: ^3.0.2 https-proxy-agent: ^5.0.0 is-stream: ^2.0.0 - node-fetch: ^2.3.0 - checksum: 82d22eda17d09af5410d69d86dbf27568ee71ef2b4f6224905073500103262a2bec678da6d79e31cb9bafd8bfac5b324d62b61fbf0250b88fb14d3dae7474297 + node-fetch: ^2.6.7 + checksum: 0b72a00875404e2c3d7aca9f32535e931d7b0ebb850dc92fafc1685b99a109b04205c63e4637a2d0d9a261ac50adf83f7d33435f73e256dcca32564ef9358fee languageName: node linkType: hard @@ -16410,39 +17124,13 @@ __metadata: languageName: node linkType: hard -"gcp-metadata@npm:^1.0.0": - version: 1.0.0 - resolution: "gcp-metadata@npm:1.0.0" - dependencies: - gaxios: ^1.0.2 - json-bigint: ^0.3.0 - checksum: 604a196838a379285bef240e759d16fa74c7180274ccb5731d8936353871ea435da8bddc754b0adf4d8edb394899d12a5d8a64c9ce6d4a1e601cf6f6e7112d97 - languageName: node - linkType: hard - -"gcp-metadata@npm:^3.4.0": - version: 3.5.0 - resolution: "gcp-metadata@npm:3.5.0" - dependencies: - gaxios: ^2.1.0 - json-bigint: ^0.3.0 - checksum: 6257fe9172918459eaa3e0de809403cd73f52f03f0b41afc079a9b3a3c0b5a2da04ef8f8b521f623231a64c4971fddc168bda8f3a0c3ef17de7bdcf6c0621cb5 - languageName: node - linkType: hard - -"gcs-resumable-upload@npm:^1.0.0": - version: 1.1.0 - resolution: "gcs-resumable-upload@npm:1.1.0" +"gcp-metadata@npm:^4.2.0": + version: 4.3.1 + resolution: "gcp-metadata@npm:4.3.1" dependencies: - abort-controller: ^2.0.2 - configstore: ^4.0.0 - gaxios: ^1.5.0 - google-auth-library: ^3.0.0 - pumpify: ^1.5.1 - stream-events: ^1.0.4 - bin: - gcs-upload: build/src/cli.js - checksum: 916dbb1b0102aa167856d634b73536baadfc20a110c5a534756ef98ecee2004018ad1a320e696ea49fbbbb2a4d327ef81089e528d092c700569d69adee3d5807 + gaxios: ^4.0.0 + json-bigint: ^1.0.0 + checksum: b0b1b85ea2efee1d640a1d4ead0937fdcceffd43ab4cacfdd66fd086fcfe5c3d09ad850ee14f43f2dc73244b2617b166adfa09a2a85e0652a8c56bed194f01fe languageName: node linkType: hard @@ -16464,6 +17152,13 @@ __metadata: languageName: node linkType: hard +"generic-pool@npm:3.8.2": + version: 3.8.2 + resolution: "generic-pool@npm:3.8.2" + checksum: f549077d90265e5e4d32a2410205b357ec61cf73d17861f1013637984390e09fe7bf537129a2c6ed30ae57662a57c8d54194f80046408d3349836330f422dbde + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.1, gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -16919,6 +17614,15 @@ __metadata: languageName: node linkType: hard +"globals@npm:^13.15.0": + version: 13.15.0 + resolution: "globals@npm:13.15.0" + dependencies: + type-fest: ^0.20.2 + checksum: 383ade0873b2ab29ce6d143466c203ed960491575bc97406395e5c8434026fb02472ab2dfff5bc16689b8460269b18fda1047975295cd0183904385c51258bae + languageName: node + linkType: hard + "globals@npm:^13.6.0, globals@npm:^13.9.0": version: 13.13.0 resolution: "globals@npm:13.13.0" @@ -17064,62 +17768,20 @@ __metadata: languageName: node linkType: hard -"google-auth-library@npm:^3.0.0, google-auth-library@npm:^3.1.1": - version: 3.1.2 - resolution: "google-auth-library@npm:3.1.2" - dependencies: - base64-js: ^1.3.0 - fast-text-encoding: ^1.0.0 - gaxios: ^1.2.1 - gcp-metadata: ^1.0.0 - gtoken: ^2.3.2 - https-proxy-agent: ^2.2.1 - jws: ^3.1.5 - lru-cache: ^5.0.0 - semver: ^5.5.0 - checksum: 2d973160311c4a348e60ddb5826f65724d565ae931ce399ae0d35773d5265e1e675dcff0d811f12aab74748b431ee10d1becaf57eb2f0991b83a50ac6f6430fc - languageName: node - linkType: hard - -"google-auth-library@npm:^5.0.0": - version: 5.10.1 - resolution: "google-auth-library@npm:5.10.1" +"google-auth-library@npm:^7.14.1": + version: 7.14.1 + resolution: "google-auth-library@npm:7.14.1" dependencies: arrify: ^2.0.0 base64-js: ^1.3.0 ecdsa-sig-formatter: ^1.0.11 fast-text-encoding: ^1.0.0 - gaxios: ^2.1.0 - gcp-metadata: ^3.4.0 - gtoken: ^4.1.0 + gaxios: ^4.0.0 + gcp-metadata: ^4.2.0 + gtoken: ^5.0.4 jws: ^4.0.0 - lru-cache: ^5.0.0 - checksum: 4c469fc70aa1b36855746a2fb4702d5182f61bb0bd905945ef209913c27cde1a8144daaa4584b8fbb90d253a63b12d8d186b4bbabb5a1b12e3a4527fa3351d33 - languageName: node - linkType: hard - -"google-gax@npm:^1.9.0": - version: 1.15.4 - resolution: "google-gax@npm:1.15.4" - dependencies: - "@grpc/grpc-js": ~1.3.6 - "@grpc/proto-loader": ^0.5.1 - "@types/fs-extra": ^8.0.1 - "@types/long": ^4.0.0 - abort-controller: ^3.0.0 - duplexify: ^3.6.0 - google-auth-library: ^5.0.0 - is-stream-ended: ^0.1.4 - lodash.at: ^4.6.0 - lodash.has: ^4.5.2 - node-fetch: ^2.6.0 - protobufjs: ^6.8.9 - retry-request: ^4.0.0 - semver: ^6.0.0 - walkdir: ^0.4.0 - bin: - compileProtos: build/tools/compileProtos.js - checksum: 46e2c399cc87be43bc68d115a9f2478794563790be8fc968d502e675094ee62263c538c63cef768e5f724a2086174c728340c4218693fbf06cc56de995be646e + lru-cache: ^6.0.0 + checksum: 78376eb2d424151dea7e3e162e20e06c11f0133451dd5ee3ea759dcb514d946acf2e0238ff08f002bdb3bf9d43c619793939feff9bc1d92025206ee836a641cf languageName: node linkType: hard @@ -17142,14 +17804,14 @@ __metadata: languageName: node linkType: hard -"google-p12-pem@npm:^2.0.0": - version: 2.0.5 - resolution: "google-p12-pem@npm:2.0.5" +"google-p12-pem@npm:^3.1.3": + version: 3.1.4 + resolution: "google-p12-pem@npm:3.1.4" dependencies: - node-forge: ^0.10.0 + node-forge: ^1.3.1 bin: gp12-pem: build/src/bin/gp12-pem.js - checksum: 35a4f56b5fa6f0ae3df5502613fa9d2773aa1588978ebea76856137b293d03d443e78b3e1bb84814eaa203a043ed6657632add51a54080e4d1fc1a4fbe6e392d + checksum: 72ce13b9536c69f21584cb7477ed4c34674325639a5dac42e8d774b78d367cb196ae7d37a52bba868235205760df353ac678a5e1756a4f4ded82e16d29d6cbb1 languageName: node linkType: hard @@ -17271,7 +17933,7 @@ __metadata: languageName: node linkType: hard -"gtoken@npm:^2.3.0, gtoken@npm:^2.3.2": +"gtoken@npm:^2.3.0": version: 2.3.3 resolution: "gtoken@npm:2.3.3" dependencies: @@ -17284,15 +17946,14 @@ __metadata: languageName: node linkType: hard -"gtoken@npm:^4.1.0": - version: 4.1.4 - resolution: "gtoken@npm:4.1.4" +"gtoken@npm:^5.0.4": + version: 5.3.2 + resolution: "gtoken@npm:5.3.2" dependencies: - gaxios: ^2.1.0 - google-p12-pem: ^2.0.0 + gaxios: ^4.0.0 + google-p12-pem: ^3.1.3 jws: ^4.0.0 - mime: ^2.2.0 - checksum: c1bd5640711e684859f2a51fdfd730b81325a00723835e1cca3b3afc84856bcdad83e3b1e331580abb3fb468e15509ebc1c5b2a10ca7eefbb7c32b6d6af47360 + checksum: 1fd640e98afcb3d5c77026fd4ff0671dce724acad11169e5b63701a853e1f5a03f4c76fe6eb95500db80f8444753ce212701d396186ef006088d08be4174f2d7 languageName: node linkType: hard @@ -17328,16 +17989,6 @@ __metadata: languageName: node linkType: hard -"har-validator@npm:~5.0.3": - version: 5.0.3 - resolution: "har-validator@npm:5.0.3" - dependencies: - ajv: ^5.1.0 - har-schema: ^2.0.0 - checksum: 48109cd27cfb6eb54ba013e2b1c3a6e53087b41c54e08c96ad2f3d40e93e04d2459d5c2a095fc58d06622149a633017e21c27a5c785e09b80a8d723bebcef75f - languageName: node - linkType: hard - "har-validator@npm:~5.1.3": version: 5.1.5 resolution: "har-validator@npm:5.1.5" @@ -17371,6 +18022,13 @@ __metadata: languageName: node linkType: hard +"has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + languageName: node + linkType: hard + "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -17394,6 +18052,15 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: ^1.1.1 + checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + languageName: node + linkType: hard + "has-symbol-support-x@npm:^1.4.1": version: 1.4.2 resolution: "has-symbol-support-x@npm:1.4.2" @@ -17492,7 +18159,7 @@ __metadata: languageName: node linkType: hard -"hash-stream-validation@npm:^0.2.1": +"hash-stream-validation@npm:^0.2.2": version: 0.2.4 resolution: "hash-stream-validation@npm:0.2.4" checksum: a5633e6ece2f729729d7061274900b10b035d6b011bfffc9503440c4279cacb53eb461ad96c8c90bb6b5368d896833a06b924a7a1abdbad46a8a5434e0c17a64 @@ -17589,18 +18256,6 @@ __metadata: languageName: node linkType: hard -"hawk@npm:~6.0.2": - version: 6.0.2 - resolution: "hawk@npm:6.0.2" - dependencies: - boom: 4.x.x - cryptiles: 3.x.x - hoek: 4.x.x - sntp: 2.x.x - checksum: 26c0d30481554133463eb2e9f39633c1f261808b29911f142047027b3bfa7b034537b407ec7f8d5ce3beb66dd8aca1957ccc6822bed07a7a5d3844b1260f4d90 - languageName: node - linkType: hard - "he@npm:1.2.0, he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -17700,13 +18355,6 @@ __metadata: languageName: node linkType: hard -"hoek@npm:4.x.x": - version: 4.2.1 - resolution: "hoek@npm:4.2.1" - checksum: 3f28857c9d4c29e0d4c0bfb0d73973529fdd700266e963f9964c59ad92a4bc08943b94c4ada97c105a20c78d4dec98e4fc2c08025660743722558e6da793fd0f - languageName: node - linkType: hard - "hoek@npm:6.x.x": version: 6.1.3 resolution: "hoek@npm:6.1.3" @@ -17788,15 +18436,6 @@ __metadata: languageName: node linkType: hard -"html-encoding-sniffer@npm:^1.0.2": - version: 1.0.2 - resolution: "html-encoding-sniffer@npm:1.0.2" - dependencies: - whatwg-encoding: ^1.0.1 - checksum: b874df6750451b7642fbe8e998c6bdd2911b0f42ad2927814b717bf1f4b082b0904b6178a1bfbc40117bf5799777993b0825e7713ca0fca49844e5aec03aa0e2 - languageName: node - linkType: hard - "html-encoding-sniffer@npm:^2.0.1": version: 2.0.1 resolution: "html-encoding-sniffer@npm:2.0.1" @@ -18116,14 +18755,14 @@ __metadata: languageName: node linkType: hard -"https-browserify@npm:^1.0.0": +"https-browserify@npm:*, https-browserify@npm:^1.0.0": version: 1.0.0 resolution: "https-browserify@npm:1.0.0" checksum: 09b35353e42069fde2435760d13f8a3fb7dd9105e358270e2e225b8a94f811b461edd17cb57594e5f36ec1218f121c160ddceeec6e8be2d55e01dcbbbed8cbae languageName: node linkType: hard -"https-proxy-agent@npm:5, https-proxy-agent@npm:5.0.0, https-proxy-agent@npm:^5.0.0": +"https-proxy-agent@npm:5, https-proxy-agent@npm:^5.0.0": version: 5.0.0 resolution: "https-proxy-agent@npm:5.0.0" dependencies: @@ -18222,7 +18861,7 @@ __metadata: languageName: node linkType: hard -"i18next@npm:^20.3.2": +"i18next@npm:^20.6.1": version: 20.6.1 resolution: "i18next@npm:20.6.1" dependencies: @@ -19019,7 +19658,7 @@ __metadata: languageName: node linkType: hard -"is-buffer@npm:^1.1.5": +"is-buffer@npm:^1.1.5, is-buffer@npm:~1.1.6": version: 1.1.6 resolution: "is-buffer@npm:1.1.6" checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 @@ -19168,7 +19807,7 @@ __metadata: languageName: node linkType: hard -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": +"is-docker@npm:^2.0.0": version: 2.2.1 resolution: "is-docker@npm:2.2.1" bin: @@ -19597,13 +20236,6 @@ __metadata: languageName: node linkType: hard -"is-stream-ended@npm:^0.1.4": - version: 0.1.4 - resolution: "is-stream-ended@npm:0.1.4" - checksum: 56cbc9cfa0a77877777a3df9e186abb5b0ca73dcbcaf0fd87ed573fb8f8e61283abec0fc072c9e3412336edc04449439b8a128d2bcc6c2797158de5465cfaf85 - languageName: node - linkType: hard - "is-stream@npm:^1.0.0, is-stream@npm:^1.0.1, is-stream@npm:^1.1.0": version: 1.1.0 resolution: "is-stream@npm:1.1.0" @@ -20015,7 +20647,7 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^27.2.5, jest-diff@npm:^27.5.1": +"jest-diff@npm:^27.5.1": version: 27.5.1 resolution: "jest-diff@npm:27.5.1" dependencies: @@ -20078,7 +20710,7 @@ __metadata: languageName: node linkType: hard -"jest-get-type@npm:^27.0.6, jest-get-type@npm:^27.5.1": +"jest-get-type@npm:^27.5.1": version: 27.5.1 resolution: "jest-get-type@npm:27.5.1" checksum: 63064ab70195c21007d897c1157bf88ff94a790824a10f8c890392e7d17eda9c3900513cb291ca1c8d5722cad79169764e9a1279f7c8a9c4cd6e9109ff04bbc0 @@ -20169,19 +20801,7 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:27.2.5": - version: 27.2.5 - resolution: "jest-matcher-utils@npm:27.2.5" - dependencies: - chalk: ^4.0.0 - jest-diff: ^27.2.5 - jest-get-type: ^27.0.6 - pretty-format: ^27.2.5 - checksum: 92f285c8e2a50f2b6761a1d81db98858416b6ccb6559c9ce954ef9cad6b76729ac18b8c1e98e2e81e1a55fca4dc9d8571d5dfbc2161583ed5716119e35b2a089 - languageName: node - linkType: hard - -"jest-matcher-utils@npm:^27.0.0, jest-matcher-utils@npm:^27.2.5, jest-matcher-utils@npm:^27.5.1": +"jest-matcher-utils@npm:^27.0.0, jest-matcher-utils@npm:^27.5.1": version: 27.5.1 resolution: "jest-matcher-utils@npm:27.5.1" dependencies: @@ -20193,7 +20813,7 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:^27.2.5, jest-message-util@npm:^27.5.1": +"jest-message-util@npm:^27.5.1": version: 27.5.1 resolution: "jest-message-util@npm:27.5.1" dependencies: @@ -20239,7 +20859,7 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^27.0.6, jest-regex-util@npm:^27.5.1": +"jest-regex-util@npm:^27.5.1": version: 27.5.1 resolution: "jest-regex-util@npm:27.5.1" checksum: d45ca7a9543616a34f7f3079337439cf07566e677a096472baa2810e274b9808b76767c97b0a4029b8a5b82b9d256dee28ef9ad4138b2b9e5933f6fac106c418 @@ -20495,13 +21115,6 @@ __metadata: languageName: node linkType: hard -"jpeg-js@npm:0.4.3": - version: 0.4.3 - resolution: "jpeg-js@npm:0.4.3" - checksum: 9e5bacc9135efa7da340b62e81fa56fab0c8516ef617228758132af5b7d31b516cc6e1500cdffb82d3161629be341be980099f2b37eb76b81e26db6e3e848c77 - languageName: node - linkType: hard - "jquery@npm:>=1.12.0, jquery@npm:^3.6.0": version: 3.6.0 resolution: "jquery@npm:3.6.0" @@ -20602,40 +21215,6 @@ __metadata: languageName: node linkType: hard -"jsdom@npm:^11.9.0": - version: 11.12.0 - resolution: "jsdom@npm:11.12.0" - dependencies: - abab: ^2.0.0 - acorn: ^5.5.3 - acorn-globals: ^4.1.0 - array-equal: ^1.0.0 - cssom: ">= 0.3.2 < 0.4.0" - cssstyle: ^1.0.0 - data-urls: ^1.0.0 - domexception: ^1.0.1 - escodegen: ^1.9.1 - html-encoding-sniffer: ^1.0.2 - left-pad: ^1.3.0 - nwsapi: ^2.0.7 - parse5: 4.0.0 - pn: ^1.1.0 - request: ^2.87.0 - request-promise-native: ^1.0.5 - sax: ^1.2.4 - symbol-tree: ^3.2.2 - tough-cookie: ^2.3.4 - w3c-hr-time: ^1.0.1 - webidl-conversions: ^4.0.2 - whatwg-encoding: ^1.0.3 - whatwg-mimetype: ^2.1.0 - whatwg-url: ^6.4.1 - ws: ^5.2.0 - xml-name-validator: ^3.0.0 - checksum: 1dab757e92ce857df648ebec3dbe487954f886652faf9d97953c3b502958b1e4487e147baef5494718294e8625ae238e68354db710456fa73c394fb93dbfc68b - languageName: node - linkType: hard - "jsdom@npm:^16.6.0, jsdom@npm:^16.7.0": version: 16.7.0 resolution: "jsdom@npm:16.7.0" @@ -20694,12 +21273,12 @@ __metadata: languageName: node linkType: hard -"json-bigint@npm:^0.3.0": - version: 0.3.1 - resolution: "json-bigint@npm:0.3.1" +"json-bigint@npm:^1.0.0": + version: 1.0.0 + resolution: "json-bigint@npm:1.0.0" dependencies: bignumber.js: ^9.0.0 - checksum: f8d4cd55e18594187bdaec728ea7bb8aeda29fb6eef0978fbfa53a6aaca8c49d519afa01a97acdf223711cbbd2841a0ffb03e69e79b3c168e970b47499e6d204 + checksum: c67bb93ccb3c291e60eb4b62931403e378906aab113ec1c2a8dd0f9a7f065ad6fd9713d627b732abefae2e244ac9ce1721c7a3142b2979532f12b258634ce6f6 languageName: node linkType: hard @@ -20724,13 +21303,6 @@ __metadata: languageName: node linkType: hard -"json-schema-traverse@npm:^0.3.0": - version: 0.3.1 - resolution: "json-schema-traverse@npm:0.3.1" - checksum: a685c36222023471c25c86cddcff506306ecb8f8941922fd356008419889c41c38e1c16d661d5499d0a561b34f417693e9bb9212ba2b2b2f8f8a345a49e4ec1a - languageName: node - linkType: hard - "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -20775,7 +21347,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:2.2.1, json5@npm:2.x, json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.1": +"json5@npm:2.x, json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.1": version: 2.2.1 resolution: "json5@npm:2.2.1" bin: @@ -20911,10 +21483,10 @@ __metadata: languageName: node linkType: hard -"jsrsasign@npm:^10.5.18": - version: 10.5.18 - resolution: "jsrsasign@npm:10.5.18" - checksum: 0d63ef73cd79c5b4e2dbe82df10c680c7f29cad7db19437224a555db1cf3838faf8ebdbfedb287d3a3b3cc017c370761d44c910d02e9807b4b1ad9f3b7614295 +"jsrsasign@npm:^10.5.19": + version: 10.5.20 + resolution: "jsrsasign@npm:10.5.20" + checksum: 3279132c205d5ca8f0df6476981c41d619dfe9a750d0737e76ae020e572557d1eaae7c2af7c7a683434373b876f0d7fa96df497a414164d5f6ec03c02ab78572 languageName: node linkType: hard @@ -21135,6 +21707,13 @@ __metadata: languageName: node linkType: hard +"layerr@npm:^0.1.2": + version: 0.1.2 + resolution: "layerr@npm:0.1.2" + checksum: db34bae003a8f289c858a7657c260104e40c4fdb6df8d35badbc42dc3ffe7d361c6dbf54f0c91cdaf6f364788b8af432131448dd9a240b82b8b2502b917fa052 + languageName: node + linkType: hard + "lazy-ass@npm:^1.6.0": version: 1.6.0 resolution: "lazy-ass@npm:1.6.0" @@ -21212,13 +21791,6 @@ __metadata: languageName: node linkType: hard -"left-pad@npm:^1.3.0": - version: 1.3.0 - resolution: "left-pad@npm:1.3.0" - checksum: 13fa96e17b70a54836490de22d4bab706e2ed508338bbabecfac72ecce445a74139c5b009a8112252cab8fc4ab7ac4ebd870e5b35bd236b443b12be96f8745ac - languageName: node - linkType: hard - "less-plugin-autoprefixer@npm:^2.1.0": version: 2.1.0 resolution: "less-plugin-autoprefixer@npm:2.1.0" @@ -21552,13 +22124,6 @@ __metadata: languageName: node linkType: hard -"lodash.at@npm:^4.6.0": - version: 4.6.0 - resolution: "lodash.at@npm:4.6.0" - checksum: a6cc4e71539b303d3713d799f337a5c5820cd77bbf86a33fbd383f9275ca1cf09c18341321d2cfcd3f2e4650be06a1b9aff8da5d1b71f5a745777c0adac5da5d - languageName: node - linkType: hard - "lodash.bind@npm:^4.1.4": version: 4.2.1 resolution: "lodash.bind@npm:4.2.1" @@ -21566,13 +22131,6 @@ __metadata: languageName: node linkType: hard -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: cb9227612f71b83e42de93eccf1232feeb25e705bdb19ba26c04f91e885bfd3dd5c517c4a97137658190581d3493ea3973072ca010aab7e301046d90740393d1 - languageName: node - linkType: hard - "lodash.clonedeep@npm:^4.5.0": version: 4.5.0 resolution: "lodash.clonedeep@npm:4.5.0" @@ -21629,13 +22187,6 @@ __metadata: languageName: node linkType: hard -"lodash.has@npm:^4.5.2": - version: 4.5.2 - resolution: "lodash.has@npm:4.5.2" - checksum: b3ec829a86852331d48b3730ff06088a283d128a3965aa521ffd942bcf5c82e06bed3164ff7a7751d11e768d88f0d7bab316192091489caf20f452d42f7055d5 - languageName: node - linkType: hard - "lodash.includes@npm:^4.3.0": version: 4.3.0 resolution: "lodash.includes@npm:4.3.0" @@ -21741,13 +22292,6 @@ __metadata: languageName: node linkType: hard -"lodash.sortby@npm:^4.7.0": - version: 4.7.0 - resolution: "lodash.sortby@npm:4.7.0" - checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c - languageName: node - linkType: hard - "lodash.throttle@npm:^4.1.1": version: 4.1.1 resolution: "lodash.throttle@npm:4.1.1" @@ -21790,7 +22334,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4, lodash@npm:^4.14.0, lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.12, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.3, lodash@npm:^4.17.4, lodash@npm:^4.7.0": +"lodash@npm:4, lodash@npm:^4.14.0, lodash@npm:^4.17.11, lodash@npm:^4.17.12, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.3, lodash@npm:^4.17.4, lodash@npm:^4.7.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -21899,13 +22443,6 @@ __metadata: languageName: node linkType: hard -"long@npm:^4.0.0": - version: 4.0.0 - resolution: "long@npm:4.0.0" - checksum: 16afbe8f749c7c849db1f4de4e2e6a31ac6e617cead3bdc4f9605cb703cd20e1e9fc1a7baba674ffcca57d660a6e5b53a9e236d7b25a295d3855cca79cc06744 - languageName: node - linkType: hard - "long@npm:~3": version: 3.2.0 resolution: "long@npm:3.2.0" @@ -22051,7 +22588,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^5.0.0, lru-cache@npm:^5.1.1": +"lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" dependencies: @@ -22349,6 +22886,17 @@ __metadata: languageName: node linkType: hard +"md5@npm:^2.3.0": + version: 2.3.0 + resolution: "md5@npm:2.3.0" + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: ~1.1.6 + checksum: a63cacf4018dc9dee08c36e6f924a64ced735b37826116c905717c41cebeb41a522f7a526ba6ad578f9c80f02cb365033ccd67fe186ffbcc1a1faeb75daa9b6e + languageName: node + linkType: hard + "mdast-squeeze-paragraphs@npm:^4.0.0": version: 4.0.0 resolution: "mdast-squeeze-paragraphs@npm:4.0.0" @@ -22670,35 +23218,35 @@ __metadata: languageName: node linkType: hard -"meteor-node-stubs@npm:^1.1.0": - version: 1.2.1 - resolution: "meteor-node-stubs@npm:1.2.1" - dependencies: - assert: ^2.0.0 - browserify-zlib: ^0.2.0 - buffer: ^6.0.3 - console-browserify: ^1.2.0 - constants-browserify: ^1.0.0 - crypto-browserify: ^3.12.0 - domain-browser: ^4.19.0 +"meteor-node-stubs@npm:^1.2.1": + version: 1.2.3 + resolution: "meteor-node-stubs@npm:1.2.3" + dependencies: + assert: "*" + browserify-zlib: "*" + buffer: "*" + console-browserify: "*" + constants-browserify: "*" + crypto-browserify: "*" + domain-browser: "*" elliptic: ^6.5.4 - events: ^3.3.0 - https-browserify: ^1.0.0 - os-browserify: ^0.3.0 - path-browserify: ^1.0.0 - process: ^0.11.10 - punycode: ^2.1.1 - querystring-es3: ^0.2.1 - readable-stream: ^3.6.0 - stream-browserify: ^3.0.0 - stream-http: ^3.2.0 - string_decoder: ^1.3.0 - timers-browserify: ^2.0.12 - tty-browserify: 0.0.1 - url: ^0.11.0 - util: ^0.12.4 - vm-browserify: ^1.1.2 - checksum: 9cbf2edad989c648dee761a120cb90be27218f64d4e82a55232b9cb19ee86b4548054b99aec43d0152389de9e64c59b767ea5f915587730204ce227234143a07 + events: "*" + https-browserify: "*" + os-browserify: "*" + path-browserify: "*" + process: "*" + punycode: "*" + querystring-es3: "*" + readable-stream: "*" + stream-browserify: "*" + stream-http: "*" + string_decoder: "*" + timers-browserify: "*" + tty-browserify: "*" + url: "*" + util: "*" + vm-browserify: "*" + checksum: 519b4aa975353312287aaede5fa6166503087f23406371e33cc0633f457e1649ace2d4de53856d109bd2df90b8af0aacf26631e12954955d71047c08556ae4a9 languageName: node linkType: hard @@ -22787,7 +23335,7 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.28.0, mime-db@npm:^1.48.0": +"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.28.0, mime-db@npm:^1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f @@ -22801,14 +23349,14 @@ __metadata: languageName: node linkType: hard -"mime-type@npm:^3.1.0": - version: 3.1.0 - resolution: "mime-type@npm:3.1.0" +"mime-type@npm:^4.0.0": + version: 4.0.0 + resolution: "mime-type@npm:4.0.0" dependencies: - minimatch: ^3.0.4 + micromatch: ^4.0.2 path.js: ^1.0.7 util-ex: ^0.3.15 - checksum: 05c574b552b024d80d69b2385da46b7785028cf5ffef43219bd32c5cca4cd73e06636831596dd530018cbb4264b3446b337cc174ae692dd93923b65086e1c87c + checksum: ba61f381f9f7a4502909397d1ecf7e5f63323daf3dc385a73e311fd67571f30d573e21aa4bc79b626c7d016daadd99f7d09a6ebd01121759031ac0688a8c78c9 languageName: node linkType: hard @@ -22839,21 +23387,21 @@ __metadata: languageName: node linkType: hard -"mime@npm:3.0.0": - version: 3.0.0 - resolution: "mime@npm:3.0.0" +"mime@npm:^2.2.0, mime@npm:^2.4.4, mime@npm:^2.4.6, mime@npm:^2.5.0": + version: 2.6.0 + resolution: "mime@npm:2.6.0" bin: mime: cli.js - checksum: f43f9b7bfa64534e6b05bd6062961681aeb406a5b53673b53b683f27fcc4e739989941836a355eef831f4478923651ecc739f4a5f6e20a76487b432bfd4db928 + checksum: 1497ba7b9f6960694268a557eae24b743fd2923da46ec392b042469f4b901721ba0adcf8b0d3c2677839d0e243b209d76e5edcbd09cfdeffa2dfb6bb4df4b862 languageName: node linkType: hard -"mime@npm:^2.2.0, mime@npm:^2.4.4, mime@npm:^2.4.6, mime@npm:^2.5.0": - version: 2.6.0 - resolution: "mime@npm:2.6.0" +"mime@npm:^3.0.0": + version: 3.0.0 + resolution: "mime@npm:3.0.0" bin: mime: cli.js - checksum: 1497ba7b9f6960694268a557eae24b743fd2923da46ec392b042469f4b901721ba0adcf8b0d3c2677839d0e243b209d76e5edcbd09cfdeffa2dfb6bb4df4b862 + checksum: f43f9b7bfa64534e6b05bd6062961681aeb406a5b53673b53b683f27fcc4e739989941836a355eef831f4478923651ecc739f4a5f6e20a76487b432bfd4db928 languageName: node linkType: hard @@ -22972,6 +23520,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^5.0.1": + version: 5.1.0 + resolution: "minimatch@npm:5.1.0" + dependencies: + brace-expansion: ^2.0.1 + checksum: 15ce53d31a06361e8b7a629501b5c75491bc2b59712d53e802b1987121d91b433d73fcc5be92974fde66b2b51d8fb28d75a9ae900d249feb792bb1ba2a4f0a90 + languageName: node + linkType: hard + "minimatch@npm:~3.0.4": version: 3.0.8 resolution: "minimatch@npm:3.0.8" @@ -23146,7 +23703,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.3, mkdirp@npm:^0.5.5, mkdirp@npm:^0.5.6, mkdirp@npm:~0.5.1": +"mkdirp@npm:^0.5.0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.3, mkdirp@npm:^0.5.5, mkdirp@npm:~0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -23157,7 +23714,7 @@ __metadata: languageName: node linkType: hard -"mocha@npm:^9.1.3": +"mocha@npm:^9.2.2": version: 9.2.2 resolution: "mocha@npm:9.2.2" dependencies: @@ -23306,7 +23863,7 @@ __metadata: languageName: node linkType: hard -"moment@npm:>= 2.9.0, moment@npm:^2.10.2, moment@npm:^2.29.1": +"moment@npm:>= 2.9.0, moment@npm:^2.29.1": version: 2.29.2 resolution: "moment@npm:2.29.2" checksum: ee850b5776485e2af0775ceb3cfebaa7d7638f0a750fe0678fcae24c310749f96c1938808384bd422a55e5703834a71fcb09c8a1d36d9cf847f6ed0205d7a3e5 @@ -23624,6 +24181,15 @@ __metadata: languageName: node linkType: hard +"nats@npm:^2.6.1": + version: 2.7.0 + resolution: "nats@npm:2.7.0" + dependencies: + nkeys.js: ^1.0.0-9 + checksum: cf9a68cbcbc8566094a3f891eebc10127ab1e71c4615184647355e129d1b3730364267b27c23c5b356f2c0dc3e71c2a33ddc30f6dfb4b9f51b259a7a5711b2c1 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -23708,6 +24274,13 @@ __metadata: languageName: node linkType: hard +"nested-property@npm:^4.0.0": + version: 4.0.0 + resolution: "nested-property@npm:4.0.0" + checksum: 9c86f2c722429e167876d5becf276139a6aa4b8732b6d9e32de9aa44dfd017702b60614cc87aec961dea47ae50dae0951d5b5f66fc30288f18bf581c16e42ca2 + languageName: node + linkType: hard + "netmask@npm:^2.0.1": version: 2.0.2 resolution: "netmask@npm:2.0.2" @@ -23777,7 +24350,7 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^4.2.0, node-addon-api@npm:^4.3.0": +"node-addon-api@npm:^4.3.0": version: 4.3.0 resolution: "node-addon-api@npm:4.3.0" dependencies: @@ -23809,7 +24382,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:2.6.7, node-fetch@npm:^2.2.0, node-fetch@npm:^2.3.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": +"node-fetch@npm:2.6.7, node-fetch@npm:^2.3.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" dependencies: @@ -23840,21 +24413,28 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^0.7.0, node-forge@npm:^0.7.1": +"node-forge@npm:^0.7.1": version: 0.7.6 resolution: "node-forge@npm:0.7.6" checksum: 661d420847da736d82f3aad0e8ad2b5fceddc4bd5f4065b923c566e9fd68e568509677374f101c1f4321c541dcbef0864516a2a55ff03a9236d0895195dfa7aa languageName: node linkType: hard -"node-gcm@npm:1.0.0": - version: 1.0.0 - resolution: "node-gcm@npm:1.0.0" +"node-forge@npm:^1.3.1": + version: 1.3.1 + resolution: "node-forge@npm:1.3.1" + checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9 + languageName: node + linkType: hard + +"node-gcm@npm:1.0.5": + version: 1.0.5 + resolution: "node-gcm@npm:1.0.5" dependencies: debug: ^3.1.0 - lodash: ^4.17.10 - request: 2.85.0 - checksum: 7e85ab8a58b31d199e200b6023f322b05eb3e5a171bed81702d94501bec83650fefeea4eb00c4bab9fbabc398e1055f543ff70251064f1ed1767589cd9268d07 + lodash: ^4.17.21 + request: ^2.88.0 + checksum: 6d964935cea1fe761f9fdef067eabde32b6d5aa7d97bd26b34862f608bb8d986082cc551745961dda35c2c585927e0b6873f6ec49be76a57f0b596d776fc414f languageName: node linkType: hard @@ -24260,20 +24840,13 @@ __metadata: languageName: node linkType: hard -"nwsapi@npm:^2.0.7, nwsapi@npm:^2.2.0": +"nwsapi@npm:^2.2.0": version: 2.2.0 resolution: "nwsapi@npm:2.2.0" checksum: 5ef4a9bc0c1a5b7f2e014aa6a4b359a257503b796618ed1ef0eb852098f77e772305bb0e92856e4bbfa3e6c75da48c0113505c76f144555ff38867229c2400a7 languageName: node linkType: hard -"oauth-sign@npm:~0.8.2": - version: 0.8.2 - resolution: "oauth-sign@npm:0.8.2" - checksum: dcf2a5d810c1e75e2a4bcd5be6f809444ddc3b7076e9bfc9d489094f708d45b544308ef0c37c8e8479ad51d2e2e2052fc5fc6b6ebf95570468d0046e08d53599 - languageName: node - linkType: hard - "oauth-sign@npm:~0.9.0": version: 0.9.0 resolution: "oauth-sign@npm:0.9.0" @@ -24401,6 +24974,16 @@ __metadata: languageName: node linkType: hard +"object.hasown@npm:^1.1.1": + version: 1.1.1 + resolution: "object.hasown@npm:1.1.1" + dependencies: + define-properties: ^1.1.4 + es-abstract: ^1.19.5 + checksum: d8ed4907ce57f48b93e3b53c418fd6787bf226a51e8d698c91e39b78e80fe5b124cb6282f6a9d5be21cf9e2c7829ab10206dcc6112b7748860eefe641880c793 + languageName: node + linkType: hard + "object.pick@npm:^1.3.0": version: 1.3.0 resolution: "object.pick@npm:1.3.0" @@ -24510,17 +25093,6 @@ __metadata: languageName: node linkType: hard -"open@npm:8.4.0": - version: 8.4.0 - resolution: "open@npm:8.4.0" - dependencies: - define-lazy-prop: ^2.0.0 - is-docker: ^2.1.1 - is-wsl: ^2.2.0 - checksum: e9545bec64cdbf30a0c35c1bdc310344adf8428a117f7d8df3c0af0a0a24c513b304916a6d9b11db0190ff7225c2d578885080b761ed46a3d5f6f1eebb98b63c - languageName: node - linkType: hard - "open@npm:^7.0.3": version: 7.4.2 resolution: "open@npm:7.4.2" @@ -24632,7 +25204,7 @@ __metadata: languageName: node linkType: hard -"os-browserify@npm:^0.3.0": +"os-browserify@npm:*, os-browserify@npm:^0.3.0": version: 0.3.0 resolution: "os-browserify@npm:0.3.0" checksum: 16e37ba3c0e6a4c63443c7b55799ce4066d59104143cb637ecb9fce586d5da319cdca786ba1c867abbe3890d2cbf37953f2d51eea85e20dd6c4570d6c54bfebf @@ -24758,6 +25330,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^1.1.0": + version: 1.1.0 + resolution: "p-cancelable@npm:1.1.0" + checksum: 2db3814fef6d9025787f30afaee4496a8857a28be3c5706432cbad76c688a6db1874308f48e364a42f5317f5e41e8e7b4f2ff5c8ff2256dbb6264bc361704ece + languageName: node + linkType: hard + "p-cancelable@npm:~1.0.0": version: 1.0.0 resolution: "p-cancelable@npm:1.0.0" @@ -24847,7 +25426,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": +"p-limit@npm:^3.0.1, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -24949,7 +25528,7 @@ __metadata: languageName: node linkType: hard -"p-queue@npm:^6.6.2": +"p-queue@npm:^6.6.1, p-queue@npm:^6.6.2": version: 6.6.2 resolution: "p-queue@npm:6.6.2" dependencies: @@ -24985,6 +25564,16 @@ __metadata: languageName: node linkType: hard +"p-retry@npm:^4.0.0": + version: 4.6.2 + resolution: "p-retry@npm:4.6.2" + dependencies: + "@types/retry": 0.12.0 + retry: ^0.13.1 + checksum: 45c270bfddaffb4a895cea16cb760dcc72bdecb6cb45fef1971fa6ea2e91ddeafddefe01e444ac73e33b1b3d5d29fb0dd18a7effb294262437221ddc03ce0f2e + languageName: node + linkType: hard + "p-retry@npm:^4.5.0": version: 4.6.1 resolution: "p-retry@npm:4.6.1" @@ -25241,13 +25830,6 @@ __metadata: languageName: node linkType: hard -"parse5@npm:4.0.0": - version: 4.0.0 - resolution: "parse5@npm:4.0.0" - checksum: 2123cec690689fed44e6c76aa8a08215d2dadece7eff7b35156dda7485e6a232c9b737313688ee715eb0678b6a87a31026927dd74690154f8a0811059845ba46 - languageName: node - linkType: hard - "parse5@npm:6.0.1, parse5@npm:^6.0.0, parse5@npm:^6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" @@ -25289,6 +25871,13 @@ __metadata: languageName: node linkType: hard +"path-browserify@npm:*": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: c6d7fa376423fe35b95b2d67990060c3ee304fc815ff0a2dc1c6c3cfaff2bd0d572ee67e18f19d0ea3bbe32e8add2a05021132ac40509416459fffee35200699 + languageName: node + linkType: hard + "path-browserify@npm:0.0.1": version: 0.0.1 resolution: "path-browserify@npm:0.0.1" @@ -25296,13 +25885,6 @@ __metadata: languageName: node linkType: hard -"path-browserify@npm:^1.0.0": - version: 1.0.1 - resolution: "path-browserify@npm:1.0.1" - checksum: c6d7fa376423fe35b95b2d67990060c3ee304fc815ff0a2dc1c6c3cfaff2bd0d572ee67e18f19d0ea3bbe32e8add2a05021132ac40509416459fffee35200699 - languageName: node - linkType: hard - "path-case@npm:^3.0.4": version: 3.0.4 resolution: "path-case@npm:3.0.4" @@ -25490,17 +26072,25 @@ __metadata: languageName: node linkType: hard -"pdfjs-dist@npm:^2.8.335": - version: 2.13.216 - resolution: "pdfjs-dist@npm:2.13.216" +"pdfjs-dist@npm:^2.13.216": + version: 2.14.305 + resolution: "pdfjs-dist@npm:2.14.305" dependencies: - web-streams-polyfill: ^3.2.0 + dommatrix: ^1.0.1 + web-streams-polyfill: ^3.2.1 peerDependencies: worker-loader: ^3.0.8 peerDependenciesMeta: worker-loader: optional: true - checksum: b7b6a04e6d6ef0048140a10776dd6cc42d18248268d539ca416852a0dc386f3c410afbd399b30d7a4b68f7d29be84afb207789d7a9372fb0524c5e18f3b22177 + checksum: b75443f81e500856e3a7b61303d1f621f81e82b19fc6216f74d33a70d1ef392bb8b2ca4cfa39f11e7c0a877e6d6d74b474768988dcf3299d5d8a1d996d48f856 + languageName: node + linkType: hard + +"peek-readable@npm:^4.1.0": + version: 4.1.0 + resolution: "peek-readable@npm:4.1.0" + checksum: 02c673f9bc816f8e4e74a054c097225ad38d457d745b775e2b96faf404a54473b2f62f5bcd496f5ebc28696708bcc5e95bed409856f4bef5ed62eae9b4ac0dab languageName: node linkType: hard @@ -25678,13 +26268,6 @@ __metadata: languageName: node linkType: hard -"pirates@npm:4.0.4": - version: 4.0.4 - resolution: "pirates@npm:4.0.4" - checksum: 6b7187d526fd025a2b91e8fd289c78d88c4adc3ea947b9facbe9cb300a896b0ec00f3e77b36a043001695312a8debbf714453495283bd8a4eaad3bc0c38df425 - languageName: node - linkType: hard - "pirates@npm:^4.0.1, pirates@npm:^4.0.4, pirates@npm:^4.0.5": version: 4.0.5 resolution: "pirates@npm:4.0.5" @@ -25692,17 +26275,6 @@ __metadata: languageName: node linkType: hard -"pixelmatch@npm:5.2.1": - version: 5.2.1 - resolution: "pixelmatch@npm:5.2.1" - dependencies: - pngjs: ^4.0.1 - bin: - pixelmatch: bin/pixelmatch - checksum: 0ec7a87168e51b80812d1c39fe1a278e2266dc1e9c426418c2a9d7f0c6465de3c03c51dbf7e6b97c5ba72a043ec3fb576571cdde1f88b12ef0851bf9bfd16da0 - languageName: node - linkType: hard - "pkg-dir@npm:^3.0.0": version: 3.0.0 resolution: "pkg-dir@npm:3.0.0" @@ -25730,31 +26302,12 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.21.0": - version: 1.21.0 - resolution: "playwright-core@npm:1.21.0" - dependencies: - colors: 1.4.0 - commander: 8.3.0 - debug: 4.3.3 - extract-zip: 2.0.1 - https-proxy-agent: 5.0.0 - jpeg-js: 0.4.3 - mime: 3.0.0 - pixelmatch: 5.2.1 - pngjs: 6.0.0 - progress: 2.0.3 - proper-lockfile: 4.1.2 - proxy-from-env: 1.1.0 - rimraf: 3.0.2 - socks-proxy-agent: 6.1.1 - stack-utils: 2.0.5 - ws: 8.4.2 - yauzl: 2.10.0 - yazl: 2.5.1 +"playwright-core@npm:1.22.2": + version: 1.22.2 + resolution: "playwright-core@npm:1.22.2" bin: playwright: cli.js - checksum: 9221b65a4a10d9df93f59ff9ac788382f6e8b25e7a68bd2f46ad9178b6d94055704f6ad9aa5885a1648dec0ff01f6611d1eced519a0a834615c6924944058fdf + checksum: 7381c35359b4338282f73dc902c1c1311e8e7cbf852f445dd6b430ebcb7eafc842b8e512d238fdc0b70d1da2b14046f297b19dac027c6a0a62ff217e70f6a07c languageName: node linkType: hard @@ -25866,20 +26419,6 @@ __metadata: languageName: node linkType: hard -"pn@npm:^1.1.0": - version: 1.1.0 - resolution: "pn@npm:1.1.0" - checksum: e4654186dc92a187c8c7fe4ccda902f4d39dd9c10f98d1c5a08ce5fad5507ef1e33ddb091240c3950bee81bd201b4c55098604c433a33b5e8bdd97f38b732fa0 - languageName: node - linkType: hard - -"pngjs@npm:6.0.0": - version: 6.0.0 - resolution: "pngjs@npm:6.0.0" - checksum: ab6c285086060087097eab9fe6b5a528a24f9e79c03dea2b4fd6264ed4fdb5beff4a3257eeeaf2a9dc18249b539609c2a4e4013c567164a1f6b5ba2c974d5ecb - languageName: node - linkType: hard - "pngjs@npm:^3.3.3": version: 3.4.0 resolution: "pngjs@npm:3.4.0" @@ -25887,13 +26426,6 @@ __metadata: languageName: node linkType: hard -"pngjs@npm:^4.0.1": - version: 4.0.1 - resolution: "pngjs@npm:4.0.1" - checksum: 9497e08a6c2d850630ba7c8d3738fd36c9db1af7ee8b8c2d4b664e450807a280936dfa1489deb60e6943b968bedd58c9aa93def25a765579d745ea44467fc47f - languageName: node - linkType: hard - "pngquant-bin@npm:^5.0.0": version: 5.0.2 resolution: "pngquant-bin@npm:5.0.2" @@ -26150,7 +26682,7 @@ __metadata: languageName: node linkType: hard -"postcss-load-config@npm:^3.1.0": +"postcss-load-config@npm:^3.1.4": version: 3.1.4 resolution: "postcss-load-config@npm:3.1.4" dependencies: @@ -26693,29 +27225,6 @@ __metadata: languageName: node linkType: hard -"prebuild-install@npm:^7.0.0": - version: 7.0.1 - resolution: "prebuild-install@npm:7.0.1" - dependencies: - detect-libc: ^2.0.0 - expand-template: ^2.0.3 - github-from-package: 0.0.0 - minimist: ^1.2.3 - mkdirp-classic: ^0.5.3 - napi-build-utils: ^1.0.1 - node-abi: ^3.3.0 - npmlog: ^4.0.1 - pump: ^3.0.0 - rc: ^1.2.7 - simple-get: ^4.0.0 - tar-fs: ^2.0.0 - tunnel-agent: ^0.6.0 - bin: - prebuild-install: bin.js - checksum: 117c8966f221242633bbf245755fb469dabc7085909f5e3db83359d6281a88dedbdada7e839315805a192c74b7cce3ed1a86c1382a8d950c1ea60a9d5d8e7bf0 - languageName: node - linkType: hard - "prebuild-install@npm:^7.0.1": version: 7.1.0 resolution: "prebuild-install@npm:7.1.0" @@ -26825,7 +27334,7 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^27.0.0, pretty-format@npm:^27.0.2, pretty-format@npm:^27.2.5, pretty-format@npm:^27.5.1": +"pretty-format@npm:^27.0.0, pretty-format@npm:^27.0.2, pretty-format@npm:^27.5.1": version: 27.5.1 resolution: "pretty-format@npm:27.5.1" dependencies: @@ -26871,6 +27380,13 @@ __metadata: languageName: node linkType: hard +"process@npm:*, process@npm:^0.11.1, process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + languageName: node + linkType: hard + "process@npm:^0.10.0": version: 0.10.1 resolution: "process@npm:0.10.1" @@ -26878,13 +27394,6 @@ __metadata: languageName: node linkType: hard -"process@npm:^0.11.1, process@npm:^0.11.10": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 - languageName: node - linkType: hard - "progress-stream@npm:^2.0.0": version: 2.0.0 resolution: "progress-stream@npm:2.0.0" @@ -26895,7 +27404,7 @@ __metadata: languageName: node linkType: hard -"progress@npm:2.0.3, progress@npm:^2.0.0": +"progress@npm:^2.0.0": version: 2.0.3 resolution: "progress@npm:2.0.3" checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 @@ -26909,16 +27418,7 @@ __metadata: languageName: node linkType: hard -"prom-client@npm:^12.0.0": - version: 12.0.0 - resolution: "prom-client@npm:12.0.0" - dependencies: - tdigest: ^0.1.1 - checksum: 22e0bff493b8cfe9da3bc02b662aedbee09dcf779d58c920e77d8b9214a092fdbc0352d9d1091940347030477db64b5cd666ac59f11deae6533064999b25ff32 - languageName: node - linkType: hard - -"prom-client@npm:^14.0.0": +"prom-client@npm:^14.0.0, prom-client@npm:^14.0.1": version: 14.0.1 resolution: "prom-client@npm:14.0.1" dependencies: @@ -27032,17 +27532,6 @@ __metadata: languageName: node linkType: hard -"proper-lockfile@npm:4.1.2": - version: 4.1.2 - resolution: "proper-lockfile@npm:4.1.2" - dependencies: - graceful-fs: ^4.2.4 - retry: ^0.12.0 - signal-exit: ^3.0.2 - checksum: 00078ee6a61c216a56a6140c7d2a98c6c733b3678503002dc073ab8beca5d50ca271de4c85fca13b9b8ee2ff546c36674d1850509b84a04a5d0363bcb8638939 - languageName: node - linkType: hard - "property-information@npm:^5.0.0, property-information@npm:^5.3.0": version: 5.6.0 resolution: "property-information@npm:5.6.0" @@ -27059,30 +27548,6 @@ __metadata: languageName: node linkType: hard -"protobufjs@npm:^6.8.6, protobufjs@npm:^6.8.9": - version: 6.11.2 - resolution: "protobufjs@npm:6.11.2" - dependencies: - "@protobufjs/aspromise": ^1.1.2 - "@protobufjs/base64": ^1.1.2 - "@protobufjs/codegen": ^2.0.4 - "@protobufjs/eventemitter": ^1.1.0 - "@protobufjs/fetch": ^1.1.0 - "@protobufjs/float": ^1.0.2 - "@protobufjs/inquire": ^1.1.0 - "@protobufjs/path": ^1.1.2 - "@protobufjs/pool": ^1.1.0 - "@protobufjs/utf8": ^1.1.0 - "@types/long": ^4.0.1 - "@types/node": ">=13.7.0" - long: ^4.0.0 - bin: - pbjs: bin/pbjs - pbts: bin/pbts - checksum: 80e9d9610c3eb66f9eae4e44a1ae30381cedb721b7d5f635d781fe4c507e2c77bb7c879addcd1dda79733d3ae589d9e66fd18d42baf99b35df7382a0f9920795 - languageName: node - linkType: hard - "protocols@npm:^1.1.0, protocols@npm:^1.4.0": version: 1.4.8 resolution: "protocols@npm:1.4.8" @@ -27116,7 +27581,7 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:1.1.0, proxy-from-env@npm:^1.0.0, proxy-from-env@npm:^1.1.0": +"proxy-from-env@npm:^1.0.0, proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 @@ -27189,7 +27654,7 @@ __metadata: languageName: node linkType: hard -"pumpify@npm:^1.3.3, pumpify@npm:^1.5.1": +"pumpify@npm:^1.3.3": version: 1.5.1 resolution: "pumpify@npm:1.5.1" dependencies: @@ -27200,6 +27665,24 @@ __metadata: languageName: node linkType: hard +"pumpify@npm:^2.0.0": + version: 2.0.1 + resolution: "pumpify@npm:2.0.1" + dependencies: + duplexify: ^4.1.1 + inherits: ^2.0.3 + pump: ^3.0.0 + checksum: cfc96f5307ee828ef8e6eca9fe9e1ae1de0a23ca55688bfe71ea376bc126418073dab870f02b433617f421c4545726b39e31295fce9a99b78bda5f0e527a7c11 + languageName: node + linkType: hard + +"punycode@npm:*, punycode@npm:^2.1.0, punycode@npm:^2.1.1": + version: 2.1.1 + resolution: "punycode@npm:2.1.1" + checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 + languageName: node + linkType: hard + "punycode@npm:1.3.2": version: 1.3.2 resolution: "punycode@npm:1.3.2" @@ -27207,20 +27690,13 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^1.2.4, punycode@npm:^1.3.2, punycode@npm:^1.4.1": +"punycode@npm:^1.2.4, punycode@npm:^1.3.2": version: 1.4.1 resolution: "punycode@npm:1.4.1" checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518 languageName: node linkType: hard -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.1.1 - resolution: "punycode@npm:2.1.1" - checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 - languageName: node - linkType: hard - "pushdata-bitcoin@npm:^1.0.1": version: 1.0.1 resolution: "pushdata-bitcoin@npm:1.0.1" @@ -27248,7 +27724,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.10.3, qs@npm:^6.10.0, qs@npm:^6.10.1, qs@npm:^6.5.1, qs@npm:^6.9.4, qs@npm:^6.9.6": +"qs@npm:6.10.3, qs@npm:^6.10.0, qs@npm:^6.10.3, qs@npm:^6.5.1, qs@npm:^6.9.4, qs@npm:^6.9.6": version: 6.10.3 resolution: "qs@npm:6.10.3" dependencies: @@ -27271,7 +27747,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:~6.5.1, qs@npm:~6.5.2": +"qs@npm:~6.5.2": version: 6.5.3 resolution: "qs@npm:6.5.3" checksum: 6f20bf08cabd90c458e50855559539a28d00b2f2e7dddcb66082b16a43188418cb3cb77cbd09268bcef6022935650f0534357b8af9eeb29bf0f27ccb17655692 @@ -27311,7 +27787,7 @@ __metadata: languageName: node linkType: hard -"querystring-es3@npm:^0.2.0, querystring-es3@npm:^0.2.1": +"querystring-es3@npm:*, querystring-es3@npm:^0.2.0": version: 0.2.1 resolution: "querystring-es3@npm:0.2.1" checksum: 691e8d6b8b157e7cd49ae8e83fcf86de39ab3ba948c25abaa94fba84c0986c641aa2f597770848c64abce290ed17a39c9df6df737dfa7e87c3b63acc7d225d61 @@ -28130,6 +28606,17 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:*, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": + version: 3.6.0 + resolution: "readable-stream@npm:3.6.0" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 + languageName: node + linkType: hard + "readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.0.5, readable-stream@npm:^2.0.6, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.0, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.5, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": version: 2.3.7 resolution: "readable-stream@npm:2.3.7" @@ -28157,17 +28644,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:^3.0.2, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": - version: 3.6.0 - resolution: "readable-stream@npm:3.6.0" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 - languageName: node - linkType: hard - "readable-stream@npm:>=1.0.33-1 <1.1.0-0": version: 1.0.34 resolution: "readable-stream@npm:1.0.34" @@ -28194,6 +28670,15 @@ __metadata: languageName: node linkType: hard +"readable-web-to-node-stream@npm:^3.0.0": + version: 3.0.2 + resolution: "readable-web-to-node-stream@npm:3.0.2" + dependencies: + readable-stream: ^3.6.0 + checksum: 8c56cc62c68513425ddfa721954875b382768f83fa20e6b31e365ee00cbe7a3d6296f66f7f1107b16cd3416d33aa9f1680475376400d62a081a88f81f0ea7f9c + languageName: node + linkType: hard + "readdirp@npm:^2.2.1": version: 2.2.1 resolution: "readdirp@npm:2.2.1" @@ -28287,28 +28772,17 @@ __metadata: languageName: node linkType: hard -"redis-commands@npm:^1.2.0": - version: 1.7.0 - resolution: "redis-commands@npm:1.7.0" - checksum: d1ff7fbcb5e54768c77f731f1d49679d2a62c3899522c28addb4e2e5813aea8bcac3f22519d71d330224c3f2937f935dfc3d8dc65e90db0f5fe22dc2c1515aa7 - languageName: node - linkType: hard - -"redis-parser@npm:^2.6.0": - version: 2.6.0 - resolution: "redis-parser@npm:2.6.0" - checksum: 8d4936875e39d56a951e0bbb6653b4da1f7fdd727552c89561c3c78e7ffeb9c3e8820a78454e939b74d1ba20996d62ac179b4fc39d07340d10f8d52740399422 - languageName: node - linkType: hard - -"redis@npm:^2.8.0": - version: 2.8.0 - resolution: "redis@npm:2.8.0" +"redis@npm:^4.0.6": + version: 4.1.0 + resolution: "redis@npm:4.1.0" dependencies: - double-ended-queue: ^2.1.0-0 - redis-commands: ^1.2.0 - redis-parser: ^2.6.0 - checksum: e44dc50a9a92ede2c95b3166482a4b04373853fdbb72ab138e834b868a3cd446798742fc0f85de2d5e442f9c86f58e1250637ea71af3ad5527478d05ef430079 + "@redis/bloom": 1.0.2 + "@redis/client": 1.1.0 + "@redis/graph": 1.0.1 + "@redis/json": 1.0.3 + "@redis/search": 1.0.6 + "@redis/time-series": 1.0.3 + checksum: e3cc90a05a3ea9ada3d771145a0865cd85340a9b54cbeda768f127d86df13beb56ec505b978c464a092ad33ff39b1850101c102842d51b84a1ff6b1f9790901b languageName: node linkType: hard @@ -28369,6 +28843,15 @@ __metadata: languageName: node linkType: hard +"regenerator-transform@npm:^0.15.0": + version: 0.15.0 + resolution: "regenerator-transform@npm:0.15.0" + dependencies: + "@babel/runtime": ^7.8.4 + checksum: 86e54849ab1167618d28bb56d214c52a983daf29b0d115c976d79840511420049b6b42c9ebdf187defa8e7129bdd74b6dd266420d0d3868c9fa7f793b5d15d49 + languageName: node + linkType: hard + "regex-not@npm:^1.0.0, regex-not@npm:^1.0.2": version: 1.0.2 resolution: "regex-not@npm:1.0.2" @@ -28379,7 +28862,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.2.0, regexp.prototype.flags@npm:^1.4.1": +"regexp.prototype.flags@npm:^1.2.0, regexp.prototype.flags@npm:^1.4.1, regexp.prototype.flags@npm:^1.4.3": version: 1.4.3 resolution: "regexp.prototype.flags@npm:1.4.3" dependencies: @@ -28665,19 +29148,6 @@ __metadata: languageName: node linkType: hard -"request-promise-native@npm:^1.0.5": - version: 1.0.9 - resolution: "request-promise-native@npm:1.0.9" - dependencies: - request-promise-core: 1.1.4 - stealthy-require: ^1.1.1 - tough-cookie: ^2.3.3 - peerDependencies: - request: ^2.34 - checksum: 3e2c694eefac88cb20beef8911ad57a275ab3ccbae0c4ca6c679fffb09d5fd502458aab08791f0814ca914b157adab2d4e472597c97a73be702918e41725ed69 - languageName: node - linkType: hard - "request-promise@npm:^4.2.6": version: 4.2.6 resolution: "request-promise@npm:4.2.6" @@ -28692,37 +29162,7 @@ __metadata: languageName: node linkType: hard -"request@npm:2.85.0": - version: 2.85.0 - resolution: "request@npm:2.85.0" - dependencies: - aws-sign2: ~0.7.0 - aws4: ^1.6.0 - caseless: ~0.12.0 - combined-stream: ~1.0.5 - extend: ~3.0.1 - forever-agent: ~0.6.1 - form-data: ~2.3.1 - har-validator: ~5.0.3 - hawk: ~6.0.2 - http-signature: ~1.2.0 - is-typedarray: ~1.0.0 - isstream: ~0.1.2 - json-stringify-safe: ~5.0.1 - mime-types: ~2.1.17 - oauth-sign: ~0.8.2 - performance-now: ^2.1.0 - qs: ~6.5.1 - safe-buffer: ^5.1.1 - stringstream: ~0.0.5 - tough-cookie: ~2.3.3 - tunnel-agent: ^0.6.0 - uuid: ^3.1.0 - checksum: fefe3d6fadba81f7b105052bc941231673046fc2723dd9f3dd0559875dfecb4ee21eef9a95828b2604411a25b72aa89c831de0c997988eb367b49ab8617954e5 - languageName: node - linkType: hard - -"request@npm:^2.51.0, request@npm:^2.68.0, request@npm:^2.82.0, request@npm:^2.85.0, request@npm:^2.87.0, request@npm:^2.88.0, request@npm:^2.88.2": +"request@npm:^2.51.0, request@npm:^2.68.0, request@npm:^2.82.0, request@npm:^2.85.0, request@npm:^2.88.0, request@npm:^2.88.2": version: 2.88.2 resolution: "request@npm:2.88.2" dependencies: @@ -28981,7 +29421,7 @@ __metadata: languageName: node linkType: hard -"retry-request@npm:^4.0.0": +"retry-request@npm:^4.2.2": version: 4.2.2 resolution: "retry-request@npm:4.2.2" dependencies: @@ -28991,6 +29431,13 @@ __metadata: languageName: node linkType: hard +"retry@npm:0.13.1, retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -28998,13 +29445,6 @@ __metadata: languageName: node linkType: hard -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b - languageName: node - linkType: hard - "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -29012,12 +29452,12 @@ __metadata: languageName: node linkType: hard -"rewire@npm:^5.0.0": - version: 5.0.0 - resolution: "rewire@npm:5.0.0" +"rewire@npm:^6.0.0": + version: 6.0.0 + resolution: "rewire@npm:6.0.0" dependencies: - eslint: ^6.8.0 - checksum: 8b479700a3f93e2b4263adecc723e8eda629166ccc17d8d3c1b26da14ba7dce4e8b175f06da34e6800dcad6117d767acecb2bccae4a0481552c47ff6cf885ea4 + eslint: ^7.32.0 + checksum: b5cc2184263c4c1b091f9f7fe4a6f63b03b3b297a93afe33a2fb723cbec4e4415b504a815a96626b596fd2c44257f0b49fc993c380ef017a9ca2a28318d4c608 languageName: node linkType: hard @@ -29108,18 +29548,18 @@ __metadata: "@rocket.chat/string-helpers": ~0.31.9 "@rocket.chat/ui-kit": ~0.31.9 "@types/agenda": ^2.0.9 - "@types/cookie": ^0.4.1 + "@types/cookie": ^0.5.1 "@types/cookie-parser": ^1.4.2 - "@types/ejson": ^2.1.3 + "@types/ejson": ^2.2.0 "@types/express": ^4.17.13 "@types/fibers": ^3.1.1 "@types/mongodb": ^3.6.20 - "@types/node": ^14.18.12 + "@types/node": ^14.18.15 "@types/ws": ^8.5.3 - ajv: ^8.7.1 + ajv: ^8.11.0 bcrypt: ^5.0.1 body-parser: ^1.20.0 - colorette: ^1.4.0 + colorette: ^2.0.16 cookie: ^0.5.0 cookie-parser: ^1.4.6 ejson: ^2.2.2 @@ -29130,16 +29570,16 @@ __metadata: mem: ^8.1.1 moleculer: ^0.14.20 mongodb: ^3.6.10 - nats: ^2.4.0 + nats: ^2.6.1 pino: ^7.10.0 pino-pretty: ^7.6.1 pm2: ^5.2.0 sodium-native: ^3.3.0 sodium-plus: ^0.9.0 ts-node: ^10.7.0 - typescript: ~4.3.5 + typescript: ~4.3.4 underscore.string: ^3.3.6 - uuid: ^7.0.3 + uuid: ^8.3.2 ws: ^8.5.0 languageName: unknown linkType: soft @@ -29541,7 +29981,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.0.3, semver@npm:^5.1.0, semver@npm:^5.3.0, semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.6.0, semver@npm:^5.7.1": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.0.3, semver@npm:^5.1.0, semver@npm:^5.3.0, semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.6.0": version: 5.7.1 resolution: "semver@npm:5.7.1" bin: @@ -29799,23 +30239,6 @@ __metadata: languageName: node linkType: hard -"sharp@npm:^0.29.3": - version: 0.29.3 - resolution: "sharp@npm:0.29.3" - dependencies: - color: ^4.0.1 - detect-libc: ^1.0.3 - node-addon-api: ^4.2.0 - node-gyp: latest - prebuild-install: ^7.0.0 - semver: ^7.3.5 - simple-get: ^4.0.0 - tar-fs: ^2.1.1 - tunnel-agent: ^0.6.0 - checksum: d496cdd546c9abe743aebcee013731295f735687819a18c2bdcbba6f31a6b259f3da95af5c11260a8fedc9d4ab95697f5f8c4f3cd65232792b5cfb876bea7c9a - languageName: node - linkType: hard - "sharp@npm:^0.30.4": version: 0.30.4 resolution: "sharp@npm:0.30.4" @@ -30038,13 +30461,6 @@ __metadata: languageName: node linkType: hard -"snakeize@npm:^0.1.0": - version: 0.1.0 - resolution: "snakeize@npm:0.1.0" - checksum: cd74625e7da62298be601bfe371b06d99b34cac980a437085461f9d95becc31ac78955536d5aa064f509e6b1f380c12006bc28ba86d1483173d4e44ecb180afb - languageName: node - linkType: hard - "snapdragon-node@npm:^2.0.1": version: 2.1.1 resolution: "snapdragon-node@npm:2.1.1" @@ -30081,15 +30497,6 @@ __metadata: languageName: node linkType: hard -"sntp@npm:2.x.x": - version: 2.1.0 - resolution: "sntp@npm:2.1.0" - dependencies: - hoek: 4.x.x - checksum: 577d7e1449acc3a19a05cc3c229bfc8101762c0aa67f3aafe2d313439dde770a874f30b5205504d471428e300df04ec7d5ff23c887c00dc0b6c457f0f06b8970 - languageName: node - linkType: hard - "sockjs-client@npm:^1.5.0": version: 1.6.0 resolution: "sockjs-client@npm:1.6.0" @@ -30125,7 +30532,7 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:6.1.1, socks-proxy-agent@npm:^6.1.1": +"socks-proxy-agent@npm:^6.1.1": version: 6.1.1 resolution: "socks-proxy-agent@npm:6.1.1" dependencies: @@ -30234,15 +30641,6 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:0.4.18": - version: 0.4.18 - resolution: "source-map-support@npm:0.4.18" - dependencies: - source-map: ^0.5.6 - checksum: 669aa7e992fec586fac0ba9a8dea8ce81b7328f92806335f018ffac5709afb2920e3870b4e56c68164282607229f04b8bbcf5d0e5c845eb1b5119b092e7585c0 - languageName: node - linkType: hard - "source-map-support@npm:0.5.19": version: 0.5.19 resolution: "source-map-support@npm:0.5.19" @@ -30409,15 +30807,6 @@ __metadata: languageName: node linkType: hard -"split-array-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "split-array-stream@npm:2.0.0" - dependencies: - is-stream-ended: ^0.1.4 - checksum: 2d869c4d00c4eaa6594871fec4e776897c69d842dc5baaa85d65512f79dba1376f986dc912f09bbd3be936e79609fdbbb67db0be2269addd1250acdcba2af3de - languageName: node - linkType: hard - "split-on-first@npm:^1.0.0": version: 1.1.0 resolution: "split-on-first@npm:1.1.0" @@ -30546,7 +30935,7 @@ __metadata: languageName: node linkType: hard -"stack-utils@npm:2.0.5, stack-utils@npm:^2.0.3": +"stack-utils@npm:^2.0.3": version: 2.0.5 resolution: "stack-utils@npm:2.0.5" dependencies: @@ -30616,6 +31005,16 @@ __metadata: languageName: node linkType: hard +"stream-browserify@npm:*": + version: 3.0.0 + resolution: "stream-browserify@npm:3.0.0" + dependencies: + inherits: ~2.0.4 + readable-stream: ^3.5.0 + checksum: 4c47ef64d6f03815a9ca3874e2319805e8e8a85f3550776c47ce523b6f4c6cd57f40e46ec6a9ab8ad260fde61863c2718f250d3bedb3fe9052444eb9abfd9921 + languageName: node + linkType: hard + "stream-browserify@npm:^2.0.1": version: 2.0.2 resolution: "stream-browserify@npm:2.0.2" @@ -30626,16 +31025,6 @@ __metadata: languageName: node linkType: hard -"stream-browserify@npm:^3.0.0": - version: 3.0.0 - resolution: "stream-browserify@npm:3.0.0" - dependencies: - inherits: ~2.0.4 - readable-stream: ^3.5.0 - checksum: 4c47ef64d6f03815a9ca3874e2319805e8e8a85f3550776c47ce523b6f4c6cd57f40e46ec6a9ab8ad260fde61863c2718f250d3bedb3fe9052444eb9abfd9921 - languageName: node - linkType: hard - "stream-buffers@npm:^3.0.2": version: 3.0.2 resolution: "stream-buffers@npm:3.0.2" @@ -30662,7 +31051,7 @@ __metadata: languageName: node linkType: hard -"stream-events@npm:^1.0.1, stream-events@npm:^1.0.4": +"stream-events@npm:^1.0.4, stream-events@npm:^1.0.5": version: 1.0.5 resolution: "stream-events@npm:1.0.5" dependencies: @@ -30671,6 +31060,18 @@ __metadata: languageName: node linkType: hard +"stream-http@npm:*": + version: 3.2.0 + resolution: "stream-http@npm:3.2.0" + dependencies: + builtin-status-codes: ^3.0.0 + inherits: ^2.0.4 + readable-stream: ^3.6.0 + xtend: ^4.0.2 + checksum: c9b78453aeb0c84fcc59555518ac62bacab9fa98e323e7b7666e5f9f58af8f3155e34481078509b02929bd1268427f664d186604cdccee95abc446099b339f83 + languageName: node + linkType: hard + "stream-http@npm:^2.7.2": version: 2.8.3 resolution: "stream-http@npm:2.8.3" @@ -30684,18 +31085,6 @@ __metadata: languageName: node linkType: hard -"stream-http@npm:^3.2.0": - version: 3.2.0 - resolution: "stream-http@npm:3.2.0" - dependencies: - builtin-status-codes: ^3.0.0 - inherits: ^2.0.4 - readable-stream: ^3.6.0 - xtend: ^4.0.2 - checksum: c9b78453aeb0c84fcc59555518ac62bacab9fa98e323e7b7666e5f9f58af8f3155e34481078509b02929bd1268427f664d186604cdccee95abc446099b339f83 - languageName: node - linkType: hard - "stream-shift@npm:^1.0.0": version: 1.0.1 resolution: "stream-shift@npm:1.0.1" @@ -30879,7 +31268,7 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.0 || ^3.0.1, string.prototype.matchall@npm:^4.0.6": +"string.prototype.matchall@npm:^4.0.0 || ^3.0.1, string.prototype.matchall@npm:^4.0.6, string.prototype.matchall@npm:^4.0.7": version: 4.0.7 resolution: "string.prototype.matchall@npm:4.0.7" dependencies: @@ -30927,6 +31316,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimend@npm:^1.0.5": + version: 1.0.5 + resolution: "string.prototype.trimend@npm:1.0.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.19.5 + checksum: d44f543833112f57224e79182debadc9f4f3bf9d48a0414d6f0cbd2a86f2b3e8c0ca1f95c3f8e5b32ae83e91554d79d932fc746b411895f03f93d89ed3dfb6bc + languageName: node + linkType: hard + "string.prototype.trimstart@npm:^1.0.4": version: 1.0.4 resolution: "string.prototype.trimstart@npm:1.0.4" @@ -30937,7 +31337,18 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": +"string.prototype.trimstart@npm:^1.0.5": + version: 1.0.5 + resolution: "string.prototype.trimstart@npm:1.0.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.19.5 + checksum: a4857c5399ad709d159a77371eeaa8f9cc284469a0b5e1bfe405de16f1fd4166a8ea6f4180e55032f348d1b679b1599fd4301fbc7a8b72bdb3e795e43f7b1048 + languageName: node + linkType: hard + +"string_decoder@npm:*, string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -30962,13 +31373,6 @@ __metadata: languageName: node linkType: hard -"stringstream@npm:~0.0.5": - version: 0.0.6 - resolution: "stringstream@npm:0.0.6" - checksum: 17f7708bbb93b73e48c844e1f890ad031111543da295f11bfd0cd5910481d101e2dc62b2fa2099c5b46471c3c0b9a7ee5d97d674eb213b51612a42e24a5cc4f6 - languageName: node - linkType: hard - "strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": version: 3.0.1 resolution: "strip-ansi@npm:3.0.1" @@ -31110,6 +31514,16 @@ __metadata: languageName: node linkType: hard +"strtok3@npm:^6.2.4": + version: 6.3.0 + resolution: "strtok3@npm:6.3.0" + dependencies: + "@tokenizer/token": ^0.3.0 + peek-readable: ^4.1.0 + checksum: 90732cff3f325aef7c47c511f609b593e0873ec77b5081810071cde941344e6a0ee3ccb0cae1a9f5b4e12c81a2546fd6b322fabcdfbd1dd08362c2ce5291334a + languageName: node + linkType: hard + "stubs@npm:^3.0.0": version: 3.0.0 resolution: "stubs@npm:3.0.0" @@ -31243,32 +31657,32 @@ __metadata: languageName: node linkType: hard -"superagent@npm:^7.1.0": - version: 7.1.2 - resolution: "superagent@npm:7.1.2" +"superagent@npm:^7.1.3": + version: 7.1.3 + resolution: "superagent@npm:7.1.3" dependencies: component-emitter: ^1.3.0 cookiejar: ^2.1.3 - debug: ^4.3.3 + debug: ^4.3.4 fast-safe-stringify: ^2.1.1 form-data: ^4.0.0 formidable: ^2.0.1 methods: ^1.1.2 mime: ^2.5.0 - qs: ^6.10.1 + qs: ^6.10.3 readable-stream: ^3.6.0 - semver: ^7.3.5 - checksum: cb807cad54008f992fc10ae83a006ede32a35e414c52b2e582d321b3c43861337b2f93ec8acd6203197b6cfc883e7f0ed7558b5f4e946ea649aba181d836a8d2 + semver: ^7.3.7 + checksum: 436045d555d35c282de7bcba85102b1421470bdc80781c9a0b7ab7c639675b4eca026a71301974935f3de0d33782a0392274e24f3915335b81a78a04b48eeee5 languageName: node linkType: hard -"supertest@npm:^6.1.6": - version: 6.2.2 - resolution: "supertest@npm:6.2.2" +"supertest@npm:^6.2.2": + version: 6.2.3 + resolution: "supertest@npm:6.2.3" dependencies: methods: ^1.1.2 - superagent: ^7.1.0 - checksum: 3c1956d57e32db1dfc17b4e4eb3eb3c80a29f9ed1b5209e0425b796df0eda7fce8a5c6485a6e666c6d3019c44e238c0494d6851c18e11a2c8bec01ff32dc06e3 + superagent: ^7.1.3 + checksum: c1bed86c31723a4bc461153a58176fd80d675deb7d23ab7bd170213040673b35c38e3cbeab9a4eb8a325cf736176c08c6f6522e42f0293314f183e192a6681fa languageName: node linkType: hard @@ -31376,7 +31790,7 @@ __metadata: languageName: node linkType: hard -"symbol-tree@npm:^3.2.2, symbol-tree@npm:^3.2.4": +"symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" checksum: 6e8fc7e1486b8b54bea91199d9535bb72f10842e40c79e882fc94fb7b14b89866adf2fd79efa5ebb5b658bc07fb459ccce5ac0e99ef3d72f474e74aaf284029d @@ -31521,14 +31935,16 @@ __metadata: languageName: node linkType: hard -"teeny-request@npm:^3.11.3": - version: 3.11.3 - resolution: "teeny-request@npm:3.11.3" +"teeny-request@npm:^7.1.3": + version: 7.2.0 + resolution: "teeny-request@npm:7.2.0" dependencies: - https-proxy-agent: ^2.2.1 - node-fetch: ^2.2.0 - uuid: ^3.3.2 - checksum: b531a66669f5010e74ac7d02bc25ad6f45d46120cd647e351a43edee22997da6fd3ebfc0d5bd785a55b3806a29023afce2e200dbb825e9631eae6d1a76ffead1 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + node-fetch: ^2.6.1 + stream-events: ^1.0.5 + uuid: ^8.0.0 + checksum: 26d096799eac7ef98b2777db277f5d5b2e9739eaaed8f4cd333d3ce7281f1396e172c1fd17404af702d2c372fe104e5f4cc430618c80eae8ac8b4b036e527d88 languageName: node linkType: hard @@ -31752,16 +32168,6 @@ __metadata: languageName: node linkType: hard -"through2@npm:^3.0.0": - version: 3.0.2 - resolution: "through2@npm:3.0.2" - dependencies: - inherits: ^2.0.4 - readable-stream: 2 || 3 - checksum: 47c9586c735e7d9cbbc1029f3ff422108212f7cc42e06d5cc9fff7901e659c948143c790e0d0d41b1b5f89f1d1200bdd200c7b72ad34f42f9edbeb32ea49e8b7 - languageName: node - linkType: hard - "through2@npm:~0.6.3": version: 0.6.5 resolution: "through2@npm:0.6.5" @@ -31793,7 +32199,7 @@ __metadata: languageName: node linkType: hard -"timers-browserify@npm:^2.0.12, timers-browserify@npm:^2.0.4": +"timers-browserify@npm:*, timers-browserify@npm:^2.0.4": version: 2.0.12 resolution: "timers-browserify@npm:2.0.12" dependencies: @@ -31994,7 +32400,17 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^2.3.3, tough-cookie@npm:^2.3.4, tough-cookie@npm:~2.5.0": +"token-types@npm:^4.1.1": + version: 4.2.0 + resolution: "token-types@npm:4.2.0" + dependencies: + "@tokenizer/token": ^0.3.0 + ieee754: ^1.2.1 + checksum: 7163e3bfaba79d251a47851881bf17db59ea59d8982c7fdbd48986bad2eda6e668aa838c25ae69750e17b8d6a20b85d51657eac8f130d7cb68d3e6c7a283fe9a + languageName: node + linkType: hard + +"tough-cookie@npm:^2.3.3, tough-cookie@npm:~2.5.0": version: 2.5.0 resolution: "tough-cookie@npm:2.5.0" dependencies: @@ -32015,24 +32431,6 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:~2.3.3": - version: 2.3.4 - resolution: "tough-cookie@npm:2.3.4" - dependencies: - punycode: ^1.4.1 - checksum: cbdf41cba6799c0e58c1832247045669ea82157786b22536f59216d06a7f342fab7f17aea65662729afb32cd5f10a843246bd87a0efb30594bbd85a9d9fd9687 - languageName: node - linkType: hard - -"tr46@npm:^1.0.1": - version: 1.0.1 - resolution: "tr46@npm:1.0.1" - dependencies: - punycode: ^2.1.0 - checksum: 96d4ed46bc161db75dbf9247a236ea0bfcaf5758baae6749e92afab0bc5a09cb59af21788ede7e55080f2bf02dce3e4a8f2a484cc45164e29f4b5e68f7cbcc1a - languageName: node - linkType: hard - "tr46@npm:^2.1.0": version: 2.1.0 resolution: "tr46@npm:2.1.0" @@ -32198,7 +32596,7 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:^10.0.0, ts-node@npm:^10.7.0": +"ts-node@npm:^10.7.0": version: 10.7.0 resolution: "ts-node@npm:10.7.0" dependencies: @@ -32297,6 +32695,13 @@ __metadata: languageName: node linkType: hard +"tty-browserify@npm:*": + version: 0.0.1 + resolution: "tty-browserify@npm:0.0.1" + checksum: 93b745d43fa5a7d2b948fa23be8d313576d1d884b48acd957c07710bac1c0d8ac34c0556ad4c57c73d36e11741763ef66b3fb4fb97b06b7e4d525315a3cd45f5 + languageName: node + linkType: hard + "tty-browserify@npm:0.0.0": version: 0.0.0 resolution: "tty-browserify@npm:0.0.0" @@ -32304,13 +32709,6 @@ __metadata: languageName: node linkType: hard -"tty-browserify@npm:0.0.1": - version: 0.0.1 - resolution: "tty-browserify@npm:0.0.1" - checksum: 93b745d43fa5a7d2b948fa23be8d313576d1d884b48acd957c07710bac1c0d8ac34c0556ad4c57c73d36e11741763ef66b3fb4fb97b06b7e4d525315a3cd45f5 - languageName: node - linkType: hard - "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -32451,12 +32849,12 @@ __metadata: languageName: node linkType: hard -"turndown@npm:^5.0.3": - version: 5.0.3 - resolution: "turndown@npm:5.0.3" +"turndown@npm:^7.1.1": + version: 7.1.1 + resolution: "turndown@npm:7.1.1" dependencies: - jsdom: ^11.9.0 - checksum: c1ddac03deafca9b62af68ac2e9ef9a5bcb4061a2e2c1315a4af67fb3eebec5bdb1199fc62335b4fc16e11d0d2e6c693823c3c1de77c71adb3468d3f9371dec2 + domino: ^2.1.6 + checksum: f2d77632bd69bc93298b619f051dc0c050fabee15188afe874eab713f8ffdcaea89106a536c19db0962a677b5f7177f5aa84b45ef38e06d6e489a49f11abd80d languageName: node linkType: hard @@ -32723,6 +33121,18 @@ __metadata: languageName: node linkType: hard +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 + which-boxed-primitive: ^1.0.2 + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + languageName: node + linkType: hard + "unbzip2-stream@npm:^1.0.9": version: 1.4.3 resolution: "unbzip2-stream@npm:1.4.3" @@ -32743,10 +33153,10 @@ __metadata: languageName: node linkType: hard -"underscore@npm:^1.13.2": - version: 1.13.2 - resolution: "underscore@npm:1.13.2" - checksum: 6ab156c845ccc757fd01d8b9eb28be18ba89ac68993370dd7397a66a95b124f2ba26947fd53e687c084d334429914fc3dd1620d5123b6e0a7cf112cdcf4e859f +"underscore@npm:^1.13.3": + version: 1.13.3 + resolution: "underscore@npm:1.13.3" + checksum: 1ea0b333ee20fdb3dcf20883d505817bf9de3dc67f0a674c1c49428cec5e480178ce5f6b7c9f72c3a8fe05a1e344dcec5c918a7f89aa1661632aa378612a2264 languageName: node linkType: hard @@ -32893,6 +33303,15 @@ __metadata: languageName: node linkType: hard +"unique-string@npm:^2.0.0": + version: 2.0.0 + resolution: "unique-string@npm:2.0.0" + dependencies: + crypto-random-string: ^2.0.0 + checksum: ef68f639136bcfe040cf7e3cd7a8dff076a665288122855148a6f7134092e6ed33bf83a7f3a9185e46c98dddc445a0da6ac25612afa1a7c38b8b654d6c02498e + languageName: node + linkType: hard + "unist-builder@npm:2.0.3, unist-builder@npm:^2.0.0": version: 2.0.3 resolution: "unist-builder@npm:2.0.3" @@ -33169,7 +33588,7 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.4.3, url-parse@npm:^1.4.7, url-parse@npm:^1.5.10, url-parse@npm:^1.5.9": +"url-parse@npm:^1.4.3, url-parse@npm:^1.5.10, url-parse@npm:^1.5.9": version: 1.5.10 resolution: "url-parse@npm:1.5.10" dependencies: @@ -33193,23 +33612,23 @@ __metadata: languageName: node linkType: hard -"url@npm:0.10.3": - version: 0.10.3 - resolution: "url@npm:0.10.3" +"url@npm:*, url@npm:^0.11.0": + version: 0.11.0 + resolution: "url@npm:0.11.0" dependencies: punycode: 1.3.2 querystring: 0.2.0 - checksum: 7b83ddb106c27bf9bde8629ccbe8d26e9db789c8cda5aa7db72ca2c6f9b8a88a5adf206f3e10db78e6e2d042b327c45db34c7010c1bf0d9908936a17a2b57d05 + checksum: 50d100d3dd2d98b9fe3ada48cadb0b08aa6be6d3ac64112b867b56b19be4bfcba03c2a9a0d7922bfd7ac17d4834e88537749fe182430dfd9b68e520175900d90 languageName: node linkType: hard -"url@npm:^0.11.0": - version: 0.11.0 - resolution: "url@npm:0.11.0" +"url@npm:0.10.3": + version: 0.10.3 + resolution: "url@npm:0.10.3" dependencies: punycode: 1.3.2 querystring: 0.2.0 - checksum: 50d100d3dd2d98b9fe3ada48cadb0b08aa6be6d3ac64112b867b56b19be4bfcba03c2a9a0d7922bfd7ac17d4834e88537749fe182430dfd9b68e520175900d90 + checksum: 7b83ddb106c27bf9bde8629ccbe8d26e9db789c8cda5aa7db72ca2c6f9b8a88a5adf206f3e10db78e6e2d042b327c45db34c7010c1bf0d9908936a17a2b57d05 languageName: node linkType: hard @@ -33326,6 +33745,20 @@ __metadata: languageName: node linkType: hard +"util@npm:*, util@npm:^0.12.0": + version: 0.12.4 + resolution: "util@npm:0.12.4" + dependencies: + inherits: ^2.0.3 + is-arguments: ^1.0.4 + is-generator-function: ^1.0.7 + is-typed-array: ^1.1.3 + safe-buffer: ^5.1.2 + which-typed-array: ^1.1.2 + checksum: 8eac7a6e6b341c0f1b3eb73bbe5dfcae31a7e9699c8fc3266789f3e95f7637946a7700dcf1904dbd3749a58a36760ebf7acf4bb5b717f7468532a8a79f44eff0 + languageName: node + linkType: hard + "util@npm:0.10.3": version: 0.10.3 resolution: "util@npm:0.10.3" @@ -33353,20 +33786,6 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.0, util@npm:^0.12.4": - version: 0.12.4 - resolution: "util@npm:0.12.4" - dependencies: - inherits: ^2.0.3 - is-arguments: ^1.0.4 - is-generator-function: ^1.0.7 - is-typed-array: ^1.1.3 - safe-buffer: ^5.1.2 - which-typed-array: ^1.1.2 - checksum: 8eac7a6e6b341c0f1b3eb73bbe5dfcae31a7e9699c8fc3266789f3e95f7637946a7700dcf1904dbd3749a58a36760ebf7acf4bb5b717f7468532a8a79f44eff0 - languageName: node - linkType: hard - "utila@npm:~0.4": version: 0.4.0 resolution: "utila@npm:0.4.0" @@ -33397,7 +33816,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^3.0.1, uuid@npm:^3.1.0, uuid@npm:^3.2.1, uuid@npm:^3.3.2, uuid@npm:^3.4.0": +"uuid@npm:^3.0.1, uuid@npm:^3.1.0, uuid@npm:^3.2.1, uuid@npm:^3.3.2": version: 3.4.0 resolution: "uuid@npm:3.4.0" bin: @@ -33415,7 +33834,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.1, uuid@npm:^8.3.2": +"uuid@npm:^8.0.0, uuid@npm:^8.3.1, uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" bin: @@ -33561,7 +33980,7 @@ __metadata: languageName: node linkType: hard -"vm-browserify@npm:^1.0.1, vm-browserify@npm:^1.1.2": +"vm-browserify@npm:*, vm-browserify@npm:^1.0.1": version: 1.1.2 resolution: "vm-browserify@npm:1.1.2" checksum: 10a1c50aab54ff8b4c9042c15fc64aefccce8d2fb90c0640403242db0ee7fb269f9b102bdb69cfb435d7ef3180d61fd4fb004a043a12709abaf9056cfd7e039d @@ -33587,7 +34006,7 @@ __metadata: languageName: node linkType: hard -"w3c-hr-time@npm:^1.0.1, w3c-hr-time@npm:^1.0.2": +"w3c-hr-time@npm:^1.0.2": version: 1.0.2 resolution: "w3c-hr-time@npm:1.0.2" dependencies: @@ -33620,13 +34039,6 @@ __metadata: languageName: node linkType: hard -"walkdir@npm:^0.4.0": - version: 0.4.1 - resolution: "walkdir@npm:0.4.1" - checksum: 71045c21dc19aae3321f897b6e9e507cf8039202665c35a0b908eecccaf25636aab769b31cbd61ef8267237fe22fc316923a691ecc2d9d38840a15c59c0f2594 - languageName: node - linkType: hard - "walker@npm:^1.0.7, walker@npm:~1.0.5": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -33718,26 +34130,31 @@ __metadata: languageName: node linkType: hard -"web-streams-polyfill@npm:^3.2.0": - version: 3.2.0 - resolution: "web-streams-polyfill@npm:3.2.0" - checksum: e23ad0649392fa0159dbfc6bb27474c308c3f332d9078cfef3c06c154165bef18732c5814126147c6c712f604216ddc950c171c854e3821f020e0d2d721a5958 +"web-streams-polyfill@npm:^3.2.1": + version: 3.2.1 + resolution: "web-streams-polyfill@npm:3.2.1" + checksum: b119c78574b6d65935e35098c2afdcd752b84268e18746606af149e3c424e15621b6f1ff0b42b2676dc012fc4f0d313f964b41a4b5031e525faa03997457da02 languageName: node linkType: hard -"webdav@npm:^2.10.2": - version: 2.10.2 - resolution: "webdav@npm:2.10.2" +"webdav@npm:^4.9.0": + version: 4.10.0 + resolution: "webdav@npm:4.10.0" dependencies: - axios: ^0.19.0 - base-64: ^0.1.0 + axios: ^0.27.2 + base-64: ^1.0.0 + byte-length: ^1.0.2 + fast-xml-parser: ^3.19.0 + he: ^1.2.0 hot-patcher: ^0.5.0 - minimatch: ^3.0.4 + layerr: ^0.1.2 + md5: ^2.3.0 + minimatch: ^5.0.1 + nested-property: ^4.0.0 path-posix: ^1.0.0 url-join: ^4.0.1 - url-parse: ^1.4.7 - xml2js: ^0.4.19 - checksum: e26beb2fc17cbb7c23d71bf4f689e9ca1fd62a73c6cd8232015ea840a6d46639c61eb0edd304243e0eb583f12c6938a2713d538da4d287834a0a69d2294ca47e + url-parse: ^1.5.10 + checksum: 0cfea9c233cfb8c490b6f6be01cb789f20fd01dbfe0ebc8f89057000390117a7cdbd55501c5fc248f54f2393d529cc60a058bf982d96e7e2507a7c99528444ab languageName: node linkType: hard @@ -33748,13 +34165,6 @@ __metadata: languageName: node linkType: hard -"webidl-conversions@npm:^4.0.2": - version: 4.0.2 - resolution: "webidl-conversions@npm:4.0.2" - checksum: c93d8dfe908a0140a4ae9c0ebc87a33805b416a33ee638a605b551523eec94a9632165e54632f6d57a39c5f948c4bab10e0e066525e9a4b87a79f0d04fbca374 - languageName: node - linkType: hard - "webidl-conversions@npm:^5.0.0": version: 5.0.0 resolution: "webidl-conversions@npm:5.0.0" @@ -33912,7 +34322,7 @@ __metadata: languageName: node linkType: hard -"webpack@npm:4, webpack@npm:^4.44.1": +"webpack@npm:4, webpack@npm:^4.44.1, webpack@npm:^4.46.0": version: 4.46.0 resolution: "webpack@npm:4.46.0" dependencies: @@ -33968,7 +34378,7 @@ __metadata: languageName: node linkType: hard -"whatwg-encoding@npm:^1.0.1, whatwg-encoding@npm:^1.0.3, whatwg-encoding@npm:^1.0.5": +"whatwg-encoding@npm:^1.0.5": version: 1.0.5 resolution: "whatwg-encoding@npm:1.0.5" dependencies: @@ -33991,7 +34401,7 @@ __metadata: languageName: node linkType: hard -"whatwg-mimetype@npm:^2.1.0, whatwg-mimetype@npm:^2.2.0, whatwg-mimetype@npm:^2.3.0": +"whatwg-mimetype@npm:^2.3.0": version: 2.3.0 resolution: "whatwg-mimetype@npm:2.3.0" checksum: 23eb885940bcbcca4ff841c40a78e9cbb893ec42743993a42bf7aed16085b048b44b06f3402018931687153550f9a32d259dfa524e4f03577ab898b6965e5383 @@ -34018,28 +34428,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^6.4.1": - version: 6.5.0 - resolution: "whatwg-url@npm:6.5.0" - dependencies: - lodash.sortby: ^4.7.0 - tr46: ^1.0.1 - webidl-conversions: ^4.0.2 - checksum: a10bd5e29f4382cd19789c2a7bbce25416e606b6fefc241c7fe34a2449de5bc5709c165bd13634eda433942d917ca7386a52841780b82dc37afa8141c31a8ebd - languageName: node - linkType: hard - -"whatwg-url@npm:^7.0.0": - version: 7.1.0 - resolution: "whatwg-url@npm:7.1.0" - dependencies: - lodash.sortby: ^4.7.0 - tr46: ^1.0.1 - webidl-conversions: ^4.0.2 - checksum: fecb07c87290b47d2ec2fb6d6ca26daad3c9e211e0e531dd7566e7ff95b5b3525a57d4f32640ad4adf057717e0c215731db842ad761e61d947e81010e05cf5fd - languageName: node - linkType: hard - "whatwg-url@npm:^8.0.0, whatwg-url@npm:^8.5.0": version: 8.7.0 resolution: "whatwg-url@npm:8.7.0" @@ -34328,21 +34716,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.4.2": - version: 8.4.2 - resolution: "ws@npm:8.4.2" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 4369caaac8d1092a73871f5cf1d87fcbb995dc4183a1bc48e4f451bc2d02d0a8bf7c17edf1da18e2be3c773b09262275356b256d1c55bc7ca096154293ba2a8c - languageName: node - linkType: hard - "ws@npm:^3.3.3": version: 3.3.3 resolution: "ws@npm:3.3.3" @@ -34424,6 +34797,13 @@ __metadata: languageName: node linkType: hard +"xdg-basedir@npm:^4.0.0": + version: 4.0.0 + resolution: "xdg-basedir@npm:4.0.0" + checksum: 0073d5b59a37224ed3a5ac0dd2ec1d36f09c49f0afd769008a6e9cd3cd666bd6317bd1c7ce2eab47e1de285a286bad11a9b038196413cd753b79770361855f3c + languageName: node + linkType: hard + "xml-crypto@npm:^2.1.3": version: 2.1.3 resolution: "xml-crypto@npm:2.1.3" @@ -34434,16 +34814,14 @@ __metadata: languageName: node linkType: hard -"xml-encryption@npm:0.11.2": - version: 0.11.2 - resolution: "xml-encryption@npm:0.11.2" +"xml-encryption@npm:2.0.0": + version: 2.0.0 + resolution: "xml-encryption@npm:2.0.0" dependencies: - async: ^2.1.5 - ejs: ^2.5.6 - node-forge: ^0.7.0 - xmldom: ~0.1.15 - xpath: 0.0.27 - checksum: ba0a1273517cf982f8fbf41ff0e63088da561f0b53da6c1c52b4ed8e1f008d0adca52cc6648d6283e623dea7c83d585f9bdb8b00964a336fb900606ec0040077 + "@xmldom/xmldom": ^0.7.0 + escape-html: ^1.0.3 + xpath: 0.0.32 + checksum: a454445704c5e3aa3f992128c413c02f3c00c346cb0d63b01beae4b6a341cfc0a52a0219ccec47dcce250e336ba7b09d95909913b1f199ca43604961a00a1995 languageName: node linkType: hard @@ -34464,7 +34842,7 @@ __metadata: languageName: node linkType: hard -"xml2js@npm:0.4.23, xml2js@npm:^0.4.19": +"xml2js@npm:0.4.23": version: 0.4.23 resolution: "xml2js@npm:0.4.23" dependencies: @@ -34509,13 +34887,6 @@ __metadata: languageName: node linkType: hard -"xmldom@npm:~0.1.15": - version: 0.1.31 - resolution: "xmldom@npm:0.1.31" - checksum: 3073ca4a096892f86991ad0fce9aa1e874f16a974aa2c0911b1a218922d80fe3762b56aa3a2d9fe4a46d61416193c6dc0839776748b24e0cfb56197babf77a94 - languageName: node - linkType: hard - "xorshift@npm:^1.1.1": version: 1.2.0 resolution: "xorshift@npm:1.2.0" @@ -34581,6 +34952,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:4.0.0, yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + "yallist@npm:^2.1.2": version: 2.1.2 resolution: "yallist@npm:2.1.2" @@ -34595,13 +34973,6 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - "yaml@npm:^1.10.0, yaml@npm:^1.10.2, yaml@npm:^1.7.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" @@ -34766,7 +35137,7 @@ __metadata: languageName: node linkType: hard -"yauzl@npm:2.10.0, yauzl@npm:^2.10.0, yauzl@npm:^2.4.2": +"yauzl@npm:^2.10.0, yauzl@npm:^2.4.2": version: 2.10.0 resolution: "yauzl@npm:2.10.0" dependencies: @@ -34776,15 +35147,6 @@ __metadata: languageName: node linkType: hard -"yazl@npm:2.5.1": - version: 2.5.1 - resolution: "yazl@npm:2.5.1" - dependencies: - buffer-crc32: ~0.2.3 - checksum: daec5154b5485d8621bfea359e905ddca0b2f068430a4aa0a802bf5d67391157a383e0c2767acccbf5964264851da643bc740155a9458e2d8dce55b94c1cc2ed - languageName: node - linkType: hard - "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" From 8c753454c4d88a8d9b7921a26034ae9e09355c40 Mon Sep 17 00:00:00 2001 From: Hugo Costa Date: Mon, 23 May 2022 14:28:49 -0300 Subject: [PATCH 37/50] [FIX] Pinned Message display cutting off information (#25535) * fix(MessageAttachment): Pinned Message display * fix: fixing yarn lock file * fix: adding white space style to Pinned Messages * fix: sending yarn.lock * review Co-authored-by: gabriellsh --- .../Attachments/Attachment/Attachment.tsx | 17 ++++++++++++++++- .../Message/Attachments/DefaultAttachment.tsx | 9 ++++++--- .../Message/Attachments/QuoteAttachment.tsx | 2 +- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/apps/meteor/client/components/Message/Attachments/Attachment/Attachment.tsx b/apps/meteor/client/components/Message/Attachments/Attachment/Attachment.tsx index f7d5bcdce81d..d79ecac8e56c 100644 --- a/apps/meteor/client/components/Message/Attachments/Attachment/Attachment.tsx +++ b/apps/meteor/client/components/Message/Attachments/Attachment/Attachment.tsx @@ -1,11 +1,26 @@ +import { css } from '@rocket.chat/css-in-js'; import { Box } from '@rocket.chat/fuselage'; import { useAttachmentDimensions } from '@rocket.chat/ui-contexts'; import React, { ComponentProps, FC } from 'react'; +const className = css` + white-space: normal; +`; + const Attachment: FC> = (props) => { const { width } = useAttachmentDimensions(); return ( - + ); }; diff --git a/apps/meteor/client/components/Message/Attachments/DefaultAttachment.tsx b/apps/meteor/client/components/Message/Attachments/DefaultAttachment.tsx index db2ae9426679..f526356fceed 100644 --- a/apps/meteor/client/components/Message/Attachments/DefaultAttachment.tsx +++ b/apps/meteor/client/components/Message/Attachments/DefaultAttachment.tsx @@ -1,5 +1,5 @@ import { isActionAttachment, MarkdownFields, MessageAttachmentDefault } from '@rocket.chat/core-typings'; -import React, { FC, ReactNode } from 'react'; +import React, { FC, ReactNode, ComponentProps } from 'react'; import MarkdownText from '../../MarkdownText'; import { ActionAttachment } from './ActionAttachtment'; @@ -11,7 +11,8 @@ const applyMarkdownIfRequires = ( list: MessageAttachmentDefault['mrkdwn_in'] = ['text', 'pretext'], key: MarkdownFields, text: string, -): ReactNode => (list?.includes(key) ? : text); + variant: ComponentProps['variant'] = 'inline', +): ReactNode => (list?.includes(key) ? : text); const DefaultAttachment: FC = (attachment) => { const [collapsed, collapse] = useCollapse(!!attachment.collapsed); @@ -58,7 +59,9 @@ const DefaultAttachment: FC = (attachment) => { )} {!collapsed && ( <> - {attachment.text && {applyMarkdownIfRequires(attachment.mrkdwn_in, 'text', attachment.text)}} + {attachment.text && ( + {applyMarkdownIfRequires(attachment.mrkdwn_in, 'text', attachment.text, 'document')} + )} {/* {attachment.fields && ({ ...rest, value: })) : attachment.fields} />} */} {attachment.fields && ( = ({ )} - + {attachments && ( From 67a75fedbc8785e1f1a17980fb1ad2b12acc1937 Mon Sep 17 00:00:00 2001 From: Martin Schoeler Date: Mon, 23 May 2022 15:22:06 -0300 Subject: [PATCH 38/50] [FIX] useCurrentChatTags is not a function (#25604) * [FIX] useCurrentChatTags is not a function * add comment --- apps/meteor/client/components/Omnichannel/Tags.tsx | 4 +++- .../client/views/omnichannel/currentChats/FilterByText.tsx | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/meteor/client/components/Omnichannel/Tags.tsx b/apps/meteor/client/components/Omnichannel/Tags.tsx index eb4ca95ecd78..3ab4b9e7630d 100644 --- a/apps/meteor/client/components/Omnichannel/Tags.tsx +++ b/apps/meteor/client/components/Omnichannel/Tags.tsx @@ -25,8 +25,10 @@ const Tags = ({ const { value: tagsResult, phase: stateTags } = useEndpointData('livechat/tags.list'); + // TODO: Refactor the formsSubscription to use components instead of hooks (since the only thing the hook does is return a component) const { useCurrentChatTags } = forms; - const EETagsComponent = useCurrentChatTags(); + // Conditional hook was required since the whole formSubscription uses hooks in an incorrect manner + const EETagsComponent = useCurrentChatTags?.(); const dispatchToastMessage = useToastMessageDispatch(); diff --git a/apps/meteor/client/views/omnichannel/currentChats/FilterByText.tsx b/apps/meteor/client/views/omnichannel/currentChats/FilterByText.tsx index f93ba7e235b1..8608a5f6754e 100644 --- a/apps/meteor/client/views/omnichannel/currentChats/FilterByText.tsx +++ b/apps/meteor/client/views/omnichannel/currentChats/FilterByText.tsx @@ -66,6 +66,8 @@ const FilterByText: FilterByTextType = ({ setFilter, reload, ...props }) => { const forms = useSubscription(formsSubscription); + // TODO: Refactor the formsSubscription to use components instead of hooks (since the only thing the hook does is return a component) + // Conditional hook was required since the whole formSubscription uses hooks in an incorrect manner const { useCurrentChatTags = (): void => undefined } = forms; const EETagsComponent = useCurrentChatTags(); From b56cafcc5eca3ca9ed4905d94d0008a5978425cf Mon Sep 17 00:00:00 2001 From: Martin Schoeler Date: Mon, 23 May 2022 15:34:48 -0300 Subject: [PATCH 39/50] Chore: Code Improvements for #25391 (#25606) --- apps/meteor/client/lib/voip/VoIPUser.ts | 46 ++++++++----------- .../src/voip/VoIPUserConfiguration.ts | 2 +- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/apps/meteor/client/lib/voip/VoIPUser.ts b/apps/meteor/client/lib/voip/VoIPUser.ts index e8628b4efbd8..692a6dd4a6ca 100644 --- a/apps/meteor/client/lib/voip/VoIPUser.ts +++ b/apps/meteor/client/lib/voip/VoIPUser.ts @@ -4,7 +4,7 @@ * This class encapsulates all the details of sip.js and exposes * a very simple functions and callback handlers to the outside world. * This class thus abstracts user from Browser specific media details as well as - * SIP specific protol details. + * SIP specific protocol details. */ import { CallStates, @@ -144,7 +144,7 @@ export class VoIPUser extends Emitter { this.userAgent.transport.isConnected(); this._opInProgress = Operation.OP_CONNECT; try { - this.registerer = new Registerer(this.userAgent /* , { expires: 60 }*/); + this.registerer = new Registerer(this.userAgent); this.userAgent.transport.onConnect = this.onConnected.bind(this); this.userAgent.transport.onDisconnect = this.onDisconnected.bind(this); @@ -204,7 +204,7 @@ export class VoIPUser extends Emitter { * because after the network recovery and after reconnecting to the server, * the transport layer of SIPUA does not call onConnected. So by passing |checkRegistration = true | * the code will check if the endpoint was previously registered before the disconnection. - * If such is the case, it will first unregister and then reregister. + * If such is the case, it will first unregister and then re-register. * */ this.attemptReconnection(); if (this.registerer && this.callState !== 'INITIAL') { @@ -386,7 +386,7 @@ export class VoIPUser extends Emitter { const remoteStream = sdh.remoteMediaStream; if (!remoteStream) { - throw new Error('Remote media stream undefiend.'); + throw new Error('Remote media stream is undefined.'); } this.remoteStream = new Stream(remoteStream); @@ -593,7 +593,7 @@ export class VoIPUser extends Emitter { // Call state must be in offer_received. if (this._callState === 'OFFER_RECEIVED' && this._opInProgress === Operation.OP_PROCESS_INVITE) { this._callState = 'ANSWER_SENT'; - // Somethingis wrong, this session is not an instance of INVITE + // Something is wrong, this session is not an instance of INVITE if (!(this.session instanceof Invitation)) { throw new Error('Session not instance of Invitation.'); } @@ -631,7 +631,7 @@ export class VoIPUser extends Emitter { return this.session.accept(invitationAcceptOptions); } - throw new Error('Something went wront'); + throw new Error('Something went wrong'); } /** @@ -787,19 +787,19 @@ export class VoIPUser extends Emitter { /** * Connection is lost in 3 ways - * 1. When local network is lost (Router is disconeected, switching networks, devtools->network->offline) + * 1. When local network is lost (Router is disconnected, switching networks, devtools->network->offline) * In this case, the SIP.js's transport layer does not detect the disconnection. Hence, it does not * call |onDisconnect|. To detect this kind of disconnection, window event listeners have been added. * These event listeners would be get called when the browser detects that network is offline or online. * When the network is restored, the code tries to reconnect. The useragent.transport "does not" generate the * onconnected event in this case as well. so onlineNetworkHandler calls attemptReconnection. - * Which calls attemptRegistrationPostRecovery based on correct state. attemptRegistrationPostRecovery firts tries to - * unregister and then reregister. + * Which calls attemptRegistrationPostRecovery based on correct state. attemptRegistrationPostRecovery first tries to + * unregister and then re-register. * Important note : We use the event listeners using bind function object offlineNetworkHandler and onlineNetworkHandler * It is done so because the same event handlers need to be used for removeEventListener, which becomes impossible * if done inline. * - * 2. Computer goes to sleep. In this case onDisconnect is triggerred. The code tries to reconnect but cant go ahead + * 2. Computer goes to sleep. In this case onDisconnect is triggered. The code tries to reconnect but cant go ahead * as it goes to sleep. On waking up, The attemptReconnection gets executed, connection is completed. * In this case, it generates onConnected event. In this onConnected event it calls attemptRegistrationPostRecovery * @@ -808,7 +808,7 @@ export class VoIPUser extends Emitter { * * Retry count : * connectionRetryCount is the parameter called |Retry Count| in - * Adminstration -> Call Center -> Server configuration -> Retry count. + * Administration -> Call Center -> Server configuration -> Retry count. * The retry is implemented with backoff, maxbackoff = 8 seconds. * For continuous retries (In case Asterisk restart happens) Set this parameter to -1. * @@ -876,7 +876,7 @@ export class VoIPUser extends Emitter { } async sendKeepAliveAndWaitForResponse(withDebounce = false): Promise { - const promise = new Promise((resolve) => { + const promise = new Promise((resolve, reject) => { let keepAliveAccepted = false; let responseWaitTime = this.optionsKeepaliveInterval / 2; if (withDebounce) { @@ -893,7 +893,7 @@ export class VoIPUser extends Emitter { }); setTimeout(async () => { if (!keepAliveAccepted) { - resolve(false); + reject(false); } else { if (this.attemptRegistration) { this.attemptPostRecoveryRoutine(); @@ -912,22 +912,14 @@ export class VoIPUser extends Emitter { return; } if (this._connectionState !== 'SERVER_RECONNECTING') { - let keepAliveResponse = await this.sendKeepAliveAndWaitForResponse(); + const keepAliveResponse = await this.sendKeepAliveAndWaitForResponse(); if (!keepAliveResponse) { - const connectivityArray = []; - for (let i = 0; i < this.optionsKeepAliveDebounceCount; i++) { - connectivityArray.push(this.sendKeepAliveAndWaitForResponse(true)); - } - const values = await Promise.all(connectivityArray); - for (const i in values) { - if (values[i]) { - keepAliveResponse = values[i]; - break; + const connectivityArray = new Array(this.optionsKeepAliveDebounceCount).fill(this.sendKeepAliveAndWaitForResponse(true)); + await Promise.race(connectivityArray).then((response): void => { + if (!response) { + this.networkEmitter.emit('disconnected'); } - } - if (!keepAliveResponse) { - this.networkEmitter.emit('disconnected'); - } + }); } /** * Either we got connected and managed to send keep-alive diff --git a/packages/core-typings/src/voip/VoIPUserConfiguration.ts b/packages/core-typings/src/voip/VoIPUserConfiguration.ts index 48f9d55cc6f2..ff2b60e7a543 100644 --- a/packages/core-typings/src/voip/VoIPUserConfiguration.ts +++ b/packages/core-typings/src/voip/VoIPUserConfiguration.ts @@ -41,7 +41,7 @@ export interface VoIPUserConfiguration { */ connectionRetryCount: number; /** - * Voip Retry count + * Enable Keep Alive for unstable networks * @defaultValue undefined */ enableKeepAliveUsingOptionsForUnstableNetworks: boolean; From 54f2ce811bf3c318151ccb4e1eac5683832d2059 Mon Sep 17 00:00:00 2001 From: Murtaza Patrawala <34130764+murtaza98@users.noreply.github.com> Date: Tue, 24 May 2022 00:15:42 +0530 Subject: [PATCH 40/50] [NEW] Ability for RC server to check the business hour for a specific department (#25436) --- packages/livechat/src/lib/hooks.js | 13 +++++++++---- packages/livechat/src/lib/main.js | 2 ++ .../src/routes/SwitchDepartment/connector.js | 6 ++++-- .../src/routes/SwitchDepartment/container.js | 4 ++-- packages/livechat/widget-demo.html | 2 +- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/livechat/src/lib/hooks.js b/packages/livechat/src/lib/hooks.js index 4560d7446742..584a29f27fc3 100644 --- a/packages/livechat/src/lib/hooks.js +++ b/packages/livechat/src/lib/hooks.js @@ -6,6 +6,7 @@ import CustomFields from './customFields'; import { loadConfig, updateBusinessUnit } from './main'; import { parentCall } from './parentCall'; import { createToken } from './random'; +import { loadMessages } from './room'; import Triggers from './triggers'; const createOrUpdateGuest = async (guest) => { @@ -60,13 +61,17 @@ const api = { }); }, - setDepartment(value) { - const { config: { departments = [] } } = store.state; + async setDepartment(value) { + const { config: { departments = [] }, user: { department: existingDepartment } = {} } = store.state; - const dept = departments.find((dep) => dep._id === value || dep.name === value); - const department = (dept && dept._id) || ''; + const department = departments.find((dep) => dep._id === value || dep.name === value)?._id || ''; updateIframeGuestData({ department }); + + if (department !== existingDepartment) { + await loadConfig(); + await loadMessages(); + } }, async setBusinessUnit(newBusinessUnit) { diff --git a/packages/livechat/src/lib/main.js b/packages/livechat/src/lib/main.js index 34d065a048d2..c099743a5233 100644 --- a/packages/livechat/src/lib/main.js +++ b/packages/livechat/src/lib/main.js @@ -42,6 +42,7 @@ export const loadConfig = async () => { const { token, businessUnit = null, + iframe: { guest: { department } = {} } = {}, } = store.state; Livechat.credentials.token = token; @@ -56,6 +57,7 @@ export const loadConfig = async () => { } = await Livechat.config({ token, ...businessUnit && { businessUnit }, + ...department && { department }, }); await store.setState({ diff --git a/packages/livechat/src/routes/SwitchDepartment/connector.js b/packages/livechat/src/routes/SwitchDepartment/connector.js index 6ae9b48af131..42d5a54980d4 100644 --- a/packages/livechat/src/routes/SwitchDepartment/connector.js +++ b/packages/livechat/src/routes/SwitchDepartment/connector.js @@ -16,10 +16,11 @@ const SwitchDepartmentConnector = ({ ref, ...props }) => ( fontColor: customFontColor, iconColor: customIconColor, } = {}, + guest, } = {}, + iframe, room, loading = false, - department, dispatch, alerts, token, @@ -33,7 +34,8 @@ const SwitchDepartmentConnector = ({ ref, ...props }) => ( iconColor: customIconColor, }} loading={loading} - departments={departments.filter((dept) => dept.showOnRegistration && dept._id !== department)} + iframe={iframe} + departments={departments.filter((dept) => dept.showOnRegistration && dept._id !== guest?.department)} dispatch={dispatch} room={room} alerts={alerts} diff --git a/packages/livechat/src/routes/SwitchDepartment/container.js b/packages/livechat/src/routes/SwitchDepartment/container.js index 7d38047eaff4..035a235c2b97 100644 --- a/packages/livechat/src/routes/SwitchDepartment/container.js +++ b/packages/livechat/src/routes/SwitchDepartment/container.js @@ -19,7 +19,7 @@ class SwitchDepartmentContainer extends Component { } handleSubmit = async (fields) => { - const { alerts, dispatch, room, token, t } = this.props; + const { alerts, dispatch, room, token, t, guest, iframe } = this.props; const { department } = fields; const confirm = await this.confirmChangeDepartment(); @@ -42,7 +42,7 @@ class SwitchDepartmentContainer extends Component { throw t('no_available_agents_to_transfer'); } - await dispatch({ department, loading: false }); + await dispatch({ iframe: { ...iframe, guest: { ...guest, department } }, loading: false }); await loadConfig(); await ModalManager.alert({ diff --git a/packages/livechat/widget-demo.html b/packages/livechat/widget-demo.html index 9634f6981e65..050f20918a3b 100644 --- a/packages/livechat/widget-demo.html +++ b/packages/livechat/widget-demo.html @@ -48,7 +48,7 @@ var h = d.getElementsByTagName(s)[0], j = d.createElement(s); j.async = true; - j.src = 'build/rocketchat-livechat.min.js?_=' + Math.random(); + j.src = 'dist/rocketchat-livechat.min.js?_=' + Math.random(); h.parentNode.insertBefore(j, h); })(window, document, 'script', 'http://localhost:8080'); RocketChat(function() { From 47c5498187c495e1944919c16237d3a84c092999 Mon Sep 17 00:00:00 2001 From: Guilherme Jun Grillo <48109548+guijun13@users.noreply.github.com> Date: Mon, 23 May 2022 15:50:08 -0300 Subject: [PATCH 41/50] [FIX] Upgrade tab loader in incorrect position (#25398) * feat: position correctly the loader with CSS * fix: hide iframe when loading * Remove extra curly brackets Co-authored-by: Tasso Evangelista --- .../admin/upgrade/UpgradePage/UpgradePage.tsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/meteor/client/views/admin/upgrade/UpgradePage/UpgradePage.tsx b/apps/meteor/client/views/admin/upgrade/UpgradePage/UpgradePage.tsx index 9b01d50302bd..62b71ef6a6c1 100644 --- a/apps/meteor/client/views/admin/upgrade/UpgradePage/UpgradePage.tsx +++ b/apps/meteor/client/views/admin/upgrade/UpgradePage/UpgradePage.tsx @@ -7,8 +7,6 @@ import Page from '../../../../components/Page'; import PageHeader from '../../../../components/Page/PageHeader'; import UpgradePageError from '../UpgradePageError'; -const iframeStyle = { width: '100%', height: '100%' }; - const urlMap: Record = { 'go-fully-featured': 'https://go.rocket.chat/i/upgrade-ce-1-unregistered', 'go-fully-featured-registered': 'https://go.rocket.chat/i/upgrade-ce-1-registered', @@ -92,11 +90,21 @@ const UpgradePage = (): ReactElement => { {isMobile && } {!hasConnection && } {hasConnection && isLoading && ( - + )} - {hasConnection &&